audioflinger: fix mmap interface callback lock
Do not hold the MmapThread mutex when calling methods on
MmapStreamCallback as AAudioService will synchronously call
methods on MmapStreamInterface that will in turn acquire the mutex.
Bug: 78118584
Test: 'adb shell write_sine_callback -m3 -pl -s100 -x' and Plug headphones in and out.
Test: AAudio CTS tests
Change-Id: I5953bb449e67735271203a2e1dbef0a2b451f5d3
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 1517d11..1fa9e37 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -8381,7 +8381,9 @@
sendIoConfigEvent_l(AUDIO_OUTPUT_CONFIG_CHANGED);
sp<MmapStreamCallback> callback = mCallback.promote();
if (mDeviceId != deviceId && callback != 0) {
+ mLock.unlock();
callback->onRoutingChanged(deviceId);
+ mLock.lock();
}
mDeviceId = deviceId;
}
@@ -8390,7 +8392,9 @@
sendIoConfigEvent_l(AUDIO_INPUT_CONFIG_CHANGED);
sp<MmapStreamCallback> callback = mCallback.promote();
if (mDeviceId != deviceId && callback != 0) {
+ mLock.unlock();
callback->onRoutingChanged(deviceId);
+ mLock.lock();
}
mDeviceId = deviceId;
}
@@ -8556,7 +8560,9 @@
if (track->isInvalid()) {
sp<MmapStreamCallback> callback = mCallback.promote();
if (callback != 0) {
+ mLock.unlock();
callback->onTearDown(track->portId());
+ mLock.lock();
} else if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
ALOGW("Could not notify MMAP stream tear down: no onTearDown callback!");
mNoCallbackWarningCount++;
@@ -8751,9 +8757,11 @@
for (int i = 0; i < channelCount; i++) {
values.add(volume);
}
- callback->onVolumeChanged(mChannelMask, values);
mHalVolFloat = volume; // SW volume control worked, so update value.
mNoCallbackWarningCount = 0;
+ mLock.unlock();
+ callback->onVolumeChanged(mChannelMask, values);
+ mLock.lock();
} else {
if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
ALOGW("Could not set MMAP stream volume: no volume callback!");