Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 526aa572 authored by Eric Laurent's avatar Eric Laurent
Browse files

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
parent 26f23259
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -322,6 +322,13 @@ status_t AudioFlinger::PatchPanel::createAudioPatch(const struct audio_patch *pa
                        }
                    }
                    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_t AudioFlinger::PatchPanel::createAudioPatch(const struct audio_patch *pa
            }

            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;