AudioFinger: Release buffers in AudioMixer when track becomes inactive
Test: Regression check, some instrumented test
Bug: 77813646
Change-Id: Ia0ab75d4af1ae2c865256a02e956cf40f56628f5
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 160aa45..adeef31 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -4793,6 +4793,18 @@
track->reset();
}
+ // Track destruction may occur outside of threadLoop once it is removed from active tracks.
+ // Ensure the AudioMixer doesn't have a raw "buffer provider" pointer to the track if
+ // it ceases to be active, to allow safe removal from the AudioMixer at the start
+ // of prepareTracks_l(); this releases any outstanding buffer back to the track.
+ // See also the implementation of destroyTrack_l().
+ for (const auto &track : *tracksToRemove) {
+ const int name = track->name();
+ if (mAudioMixer->exists(name)) { // Normal tracks here, fast tracks in FastMixer.
+ mAudioMixer->setBufferProvider(name, nullptr /* bufferProvider */);
+ }
+ }
+
// remove all the tracks that need to be...
removeTracks_l(*tracksToRemove);