Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 466dc8ed authored by Paul McLean's avatar Paul McLean
Browse files

Explicit routing in AudioRecord

Change-Id: I9cc5d54883a3e5c75d553fabb619fc8e49f4f9e5
parent dae24729
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -374,6 +374,16 @@ public:
            status_t    obtainBuffer(Buffer* audioBuffer, int32_t waitCount,
                                size_t *nonContig = NULL);

            // Explicit Routing
    /**
     * TODO Document this method.
     */
            status_t setInputDevice(audio_port_handle_t deviceId);

    /**
     * TODO Document this method.
     */
            audio_port_handle_t getInputDevice();
private:
    /* If nonContig is non-NULL, it is an output parameter that will be set to the number of
     * additional non-contiguous frames that are predicted to be available immediately,
@@ -560,6 +570,10 @@ private:
    sp<DeathNotifier>       mDeathNotifier;
    uint32_t                mSequence;              // incremented for each new IAudioRecord attempt
    audio_attributes_t      mAttributes;

    // For Device Selection API
    //  a value of AUDIO_PORT_HANDLE_NONE indicated default (AudioPolicyManager) routing.
    audio_port_handle_t    mSelectedDeviceId;
};

}; // namespace android
+2 −1
Original line number Diff line number Diff line
@@ -248,7 +248,8 @@ public:
                                    uint32_t samplingRate,
                                    audio_format_t format,
                                    audio_channel_mask_t channelMask,
                                    audio_input_flags_t flags);
                                    audio_input_flags_t flags,
                                    audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE);

    static status_t startInput(audio_io_handle_t input,
                               audio_session_t session);
+1 −1
Original line number Diff line number Diff line
@@ -859,7 +859,7 @@ protected:

    // For Device Selection API
    //  a value of AUDIO_PORT_HANDLE_NONE indicated default (AudioPolicyManager) routing.
    int                     mSelectedDeviceId;
    audio_port_handle_t     mSelectedDeviceId;

private:
    class DeathNotifier : public IBinder::DeathRecipient {
+7 −6
Original line number Diff line number Diff line
@@ -83,7 +83,8 @@ public:
                              uint32_t samplingRate,
                              audio_format_t format,
                              audio_channel_mask_t channelMask,
                                      audio_input_flags_t flags) = 0;
                              audio_input_flags_t flags,
                              audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE) = 0;
    virtual status_t startInput(audio_io_handle_t input,
                                audio_session_t session) = 0;
    virtual status_t stopInput(audio_io_handle_t input,
+21 −3
Original line number Diff line number Diff line
@@ -67,7 +67,8 @@ status_t AudioRecord::getMinFrameCount(

AudioRecord::AudioRecord()
    : mStatus(NO_INIT), mSessionId(AUDIO_SESSION_ALLOCATE),
      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT)
      mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT),
      mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE)
{
}

@@ -87,7 +88,8 @@ AudioRecord::AudioRecord(
    : mStatus(NO_INIT), mSessionId(AUDIO_SESSION_ALLOCATE),
      mPreviousPriority(ANDROID_PRIORITY_NORMAL),
      mPreviousSchedulingGroup(SP_DEFAULT),
      mProxy(NULL)
      mProxy(NULL),
      mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE)
{
    mStatus = set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user,
            notificationFrames, false /*threadCanCallJava*/, sessionId, transferType, flags,
@@ -415,6 +417,21 @@ uint32_t AudioRecord::getInputFramesLost() const
    return AudioSystem::getInputFramesLost(getInputPrivate());
}

// ---- Explicit Routing ---------------------------------------------------
status_t AudioRecord::setInputDevice(audio_port_handle_t deviceId) {
    AutoMutex lock(mLock);
    if (mSelectedDeviceId != deviceId) {
        mSelectedDeviceId = deviceId;
        android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
    }
    return NO_ERROR;
}

audio_port_handle_t AudioRecord::getInputDevice() {
    AutoMutex lock(mLock);
    return mSelectedDeviceId;
}

// -------------------------------------------------------------------------

// must be called with mLock held
@@ -461,7 +478,8 @@ status_t AudioRecord::openRecord_l(size_t epoch)
    audio_io_handle_t input;
    status_t status = AudioSystem::getInputForAttr(&mAttributes, &input,
                                        (audio_session_t)mSessionId,
                                        mSampleRate, mFormat, mChannelMask, mFlags);
                                        mSampleRate, mFormat, mChannelMask,
                                        mFlags, mSelectedDeviceId);

    if (status != NO_ERROR) {
        ALOGE("Could not get audio input for record source %d, sample rate %u, format %#x, "
Loading