diff options
author | Matt Lee <matthewhlee@google.com> | 2023-08-23 10:19:33 -0700 |
---|---|---|
committer | Matt Lee <matthewhlee@google.com> | 2023-08-23 10:20:02 -0700 |
commit | 4677bba22bb764185e90df53a35fc1c59376d619 (patch) | |
tree | 97409eeea3a879ef5032690ea0bb909b1ca55ce3 | |
parent | e0878b6e8d615950686db6d9816b0f58b3a234b3 (diff) | |
parent | 4acb97ce0a6f474dff529d20cf62c83c77fc109a (diff) |
Merge TPM1.230623.006
Change-Id: Ie841ee7d171b08b287601b6fc7f8d265b6f09ddb
-rw-r--r-- | media/libaudioclient/AudioTrack.cpp | 13 | ||||
-rw-r--r-- | media/libaudioclient/include/media/AudioTrack.h | 5 |
2 files changed, 15 insertions, 3 deletions
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp index 41a86a69db..23065d3cde 100644 --- a/media/libaudioclient/AudioTrack.cpp +++ b/media/libaudioclient/AudioTrack.cpp @@ -2373,7 +2373,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); @@ -2399,8 +2398,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; @@ -2448,6 +2448,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 @@ -2457,7 +2459,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(); diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h index b52d1d577b..64b817da61 100644 --- a/media/libaudioclient/include/media/AudioTrack.h +++ b/media/libaudioclient/include/media/AudioTrack.h @@ -1316,6 +1316,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; |