diff options
author | jiabin <jiabin@google.com> | 2023-03-23 22:01:16 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-31 17:10:56 +0000 |
commit | ed61bec157c32e990c23c5250e51f4e64ebb628d (patch) | |
tree | 7a9b5126d42384fde74f6ac8fb102a84bacf57f9 | |
parent | 227bd18d97c25d37c2c163a86497532d2c68691b (diff) |
Keep extra reference of shared memory for AudioTrack data callback.
Keep extra reference of shared memory for AudioTrack data callback so
that the shared memory will remain valid when the native track is
restored.
Bug: 274815060
Test: manual
Test: atest AudioTrackTest
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d42567cfabc94bf2ba0e2fe35c5183883bc563c8)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:89eb175a4d42b1cdf09ade820c8c72e0712a834f)
Merged-In: I76ce5b7b14732eb6921791c7ab8f283b447710eb
Change-Id: I76ce5b7b14732eb6921791c7ab8f283b447710eb
-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 b8999512bf..7cc8a34735 100644 --- a/media/libaudioclient/AudioTrack.cpp +++ b/media/libaudioclient/AudioTrack.cpp @@ -2275,7 +2275,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); @@ -2301,8 +2300,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; @@ -2350,6 +2350,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 @@ -2359,7 +2361,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 ee81ef82e8..ec2f2a2f03 100644 --- a/media/libaudioclient/include/media/AudioTrack.h +++ b/media/libaudioclient/include/media/AudioTrack.h @@ -1313,6 +1313,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; |