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

Commit 230c5bde authored by Glenn Kasten's avatar Glenn Kasten Committed by Android (Google) Code Review
Browse files

Merge "AudioRecord notification frames"

parents 33f3177c 7cd9cf70
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -448,7 +448,10 @@ private:
    void*                   mUserData;

    // for notification APIs
    uint32_t                mNotificationFrames; // frames between each notification callback
    uint32_t                mNotificationFramesReq; // requested number of frames between each
                                                    // notification callback
    uint32_t                mNotificationFramesAct; // actual number of frames between each
                                                    // notification callback
    bool                    mRefreshRemaining;  // processAudioBuffer() should refresh next 2

    // These are private to processAudioBuffer(), and are not protected by a lock
+27 −4
Original line number Diff line number Diff line
@@ -267,7 +267,8 @@ status_t AudioRecord::set(

    mActive = false;
    mCbf = cbf;
    mNotificationFrames = notificationFrames;
    mNotificationFramesReq = notificationFrames;
    mNotificationFramesAct = 0;
    mRefreshRemaining = true;
    mUserData = user;
    // TODO: add audio hardware input latency here
@@ -455,7 +456,8 @@ status_t AudioRecord::openRecord_l(
        if ((mTransfer != TRANSFER_CALLBACK) || (mAudioRecordThread == 0)) {
            ALOGW("AUDIO_INPUT_FLAG_FAST denied by client");
            // once denied, do not request again if IAudioRecord is re-created
            mFlags = (audio_input_flags_t) (flags & ~AUDIO_INPUT_FLAG_FAST);
            flags = (audio_input_flags_t) (flags & ~AUDIO_INPUT_FLAG_FAST);
            mFlags = flags;
        } else {
            trackFlags |= IAudioFlinger::TRACK_FAST;
            tid = mAudioRecordThread->getTid();
@@ -491,6 +493,27 @@ status_t AudioRecord::openRecord_l(
    mCblkMemory = iMem;
    audio_track_cblk_t* cblk = static_cast<audio_track_cblk_t*>(iMem->pointer());
    mCblk = cblk;
    // FIXME missing fast track frameCount logic
    mAwaitBoost = false;
    mNotificationFramesAct = mNotificationFramesReq;
    if (flags & AUDIO_INPUT_FLAG_FAST) {
        if (trackFlags & IAudioFlinger::TRACK_FAST) {
            ALOGV("AUDIO_INPUT_FLAG_FAST successful; frameCount %u", frameCount);
            mAwaitBoost = true;
            // double-buffering is not required for fast tracks, due to tighter scheduling
            if (mNotificationFramesAct == 0 || mNotificationFramesAct > frameCount) {
                mNotificationFramesAct = frameCount;
            }
        } else {
            ALOGV("AUDIO_INPUT_FLAG_FAST denied by server; frameCount %u", frameCount);
            // once denied, do not request again if IAudioRecord is re-created
            flags = (audio_input_flags_t) (flags & ~AUDIO_INPUT_FLAG_FAST);
            mFlags = flags;
            if (mNotificationFramesAct == 0 || mNotificationFramesAct > frameCount/2) {
                mNotificationFramesAct = frameCount/2;
            }
        }
    }

    // starting address of buffers in shared memory
    void *buffers = (char*)cblk + sizeof(audio_track_cblk_t);
@@ -498,7 +521,7 @@ status_t AudioRecord::openRecord_l(
    // update proxy
    mProxy = new AudioRecordClientProxy(cblk, buffers, frameCount, mFrameSize);
    mProxy->setEpoch(epoch);
    mProxy->setMinimum(mNotificationFrames);
    mProxy->setMinimum(mNotificationFramesAct);

    mDeathNotifier = new DeathNotifier(this);
    mAudioRecord->asBinder()->linkToDeath(mDeathNotifier, this);
@@ -745,7 +768,7 @@ nsecs_t AudioRecord::processAudioBuffer(const sp<AudioRecordThread>& thread)
    }

    // Cache other fields that will be needed soon
    size_t notificationFrames = mNotificationFrames;
    size_t notificationFrames = mNotificationFramesAct;
    if (mRefreshRemaining) {
        mRefreshRemaining = false;
        mRemainingFrames = notificationFrames;