summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiabin <jiabin@google.com>2023-03-23 22:01:16 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-07-31 17:10:56 +0000
commited61bec157c32e990c23c5250e51f4e64ebb628d (patch)
tree7a9b5126d42384fde74f6ac8fb102a84bacf57f9
parent227bd18d97c25d37c2c163a86497532d2c68691b (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.cpp13
-rw-r--r--media/libaudioclient/include/media/AudioTrack.h5
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;