From 7feb854e9ff78e8ca64e012af874503569905924 Mon Sep 17 00:00:00 2001 From: Francois Gaffie Date: Mon, 6 Apr 2020 17:39:47 +0200 Subject: [PATCH] AudioPolicy: managerdefault: fix onAudioDeviceUpdate callback Scenario: startAudioSource (SW bridge) started, then stopped. AF patch is released, so PlaybackThread has empty patch. Next playback using the same sink will not recreate any patch on AF as same device (and output desc has still valid patch handle) Hence, ioconfichanged will get PORT NONE as sink device, no onAudioDeviceUpdate cb can be fired. This CL fixes this issue by reset of patch handle on the output Bug: 136121584 Test: startAudioSource / stopAudioSource then playback on the same sink. Ensure onAudioDeviceUpdate is fired Test: atest RoutingTest Signed-off-by: Francois Gaffie Change-Id: Ia9c2570f687166f38335ed7efae28920f7acc474 --- .../managerdefault/AudioPolicyManager.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp index 5aa62716c7..3d1697744d 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp @@ -3756,6 +3756,22 @@ status_t AudioPolicyManager::releaseAudioPatchInternal(audio_patch_handle_t hand removeAudioPatch(patchDesc->getHandle()); nextAudioPortGeneration(); mpClientInterface->onAudioPatchListUpdate(); + // SW Bridge + if (patch->num_sources > 1 && patch->sources[1].type == AUDIO_PORT_TYPE_MIX) { + sp outputDesc = + mOutputs.getOutputFromId(patch->sources[1].id); + if (outputDesc == NULL) { + ALOGE("%s output not found for id %d", __func__, patch->sources[0].id); + return BAD_VALUE; + } + // Reset handle so that setOutputDevice will force new AF patch to reach the sink + outputDesc->setPatchHandle(AUDIO_PATCH_HANDLE_NONE); + setOutputDevices(outputDesc, + getNewOutputDevices(outputDesc, true /*fromCache*/), + true, /*force*/ + 0, + NULL); + } } else { return BAD_VALUE; }