audio flinger: clear possible stale audio patch on inputs and outputs
In PatchPanel::createAudioPatch() verify that when creating a patch with
an output or input mixer as source or sink, no patch with the
same output or input mixer remains in the patch list.
This will prevent a call to releaseAudioPatch(() received
later with a stale patch handle due to delayed request to clear current
output or input routing.
Test: play music and insert USB headset.
Change-Id: I9417bf061f5ef1d93cf3871a9ed51ee2b6ae62ef
diff --git a/services/audioflinger/PatchPanel.cpp b/services/audioflinger/PatchPanel.cpp
index 538a0eb..63a9ec4 100644
--- a/services/audioflinger/PatchPanel.cpp
+++ b/services/audioflinger/PatchPanel.cpp
@@ -322,6 +322,13 @@
}
}
status = thread->sendCreateAudioPatchConfigEvent(patch, &halHandle);
+ // remove stale audio patch with same input as sink if any
+ for (auto& iter : mPatches) {
+ if (iter.second.mAudioPatch.sinks[0].ext.mix.handle == thread->id()) {
+ mPatches.erase(iter.first);
+ break;
+ }
+ }
} else {
sp<DeviceHalInterface> hwDevice = audioHwDevice->hwDevice();
status = hwDevice->createAudioPatch(patch->num_sources,
@@ -376,6 +383,14 @@
}
status = thread->sendCreateAudioPatchConfigEvent(patch, &halHandle);
+
+ // remove stale audio patch with same output as source if any
+ for (auto& iter : mPatches) {
+ if (iter.second.mAudioPatch.sources[0].ext.mix.handle == thread->id()) {
+ mPatches.erase(iter.first);
+ break;
+ }
+ }
} break;
default:
status = BAD_VALUE;