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

Commit 991d4bd3 authored by Jiabin Huang's avatar Jiabin Huang Committed by Automerger Merge Worker
Browse files

Merge "Keep extra reference of shared memory for AudioTrack data callback."...

Merge "Keep extra reference of shared memory for AudioTrack data callback." into udc-dev am: 7a9eb8e3 am: 58186d69

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/22237853



Change-Id: I0c047f97125240efbf45ff6ed161f409fcab6bb6
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 4a505ca4 58186d69
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -2185,7 +2185,6 @@ status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, const struct timespec *re
        // obtainBuffer() is called with mutex unlocked, so keep extra references to these fields to
        // keep them from going away if another thread re-creates the track during obtainBuffer()
        sp<AudioTrackClientProxy> proxy;
        sp<IMemory> iMem;

        {   // start of lock scope
            AutoMutex lock(mLock);
@@ -2211,8 +2210,9 @@ status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, const struct timespec *re
            }

            // Keep the extra references
            mProxyObtainBufferRef = mProxy;
            proxy = mProxy;
            iMem = mCblkMemory;
            mCblkMemoryObtainBufferRef = mCblkMemory;

            if (mState == STATE_STOPPING) {
                status = -EINTR;
@@ -2260,6 +2260,8 @@ void AudioTrack::releaseBuffer(const Buffer* audioBuffer)
    buffer.mFrameCount = stepCount;
    buffer.mRaw = audioBuffer->raw;

    sp<IMemory> tempMemory;
    sp<AudioTrackClientProxy> tempProxy;
    AutoMutex lock(mLock);
    if (audioBuffer->sequence != mSequence) {
        // This Buffer came from a different IAudioTrack instance, so ignore the releaseBuffer
@@ -2269,7 +2271,12 @@ void AudioTrack::releaseBuffer(const Buffer* audioBuffer)
    }
    mReleased += stepCount;
    mInUnderrun = false;
    mProxy->releaseBuffer(&buffer);
    mProxyObtainBufferRef->releaseBuffer(&buffer);
    // The extra reference of shared memory and proxy from `obtainBuffer` is not used after
    // calling `releaseBuffer`. Move the extra reference to a temp strong pointer so that it
    // will be cleared outside `releaseBuffer`.
    tempMemory = std::move(mCblkMemoryObtainBufferRef);
    tempProxy = std::move(mProxyObtainBufferRef);

    // restart track if it was disabled by audioflinger due to previous underrun
    restartIfDisabled();
+5 −0
Original line number Diff line number Diff line
@@ -1262,6 +1262,11 @@ public:
    audio_track_cblk_t*     mCblk;                  // re-load after mLock.unlock()
    audio_io_handle_t       mOutput = AUDIO_IO_HANDLE_NONE; // from AudioSystem::getOutputForAttr()

    // A copy of shared memory and proxy between obtainBuffer and releaseBuffer to keep the
    // shared memory valid when processing data.
    sp<IMemory>               mCblkMemoryObtainBufferRef GUARDED_BY(mLock);
    sp<AudioTrackClientProxy> mProxyObtainBufferRef GUARDED_BY(mLock);

    sp<AudioTrackThread>    mAudioTrackThread;
    bool                    mThreadCanCallJava;