hal: fix bt sco and a2dp concurrency issues
When sco mic device is already active and
SND_DEVICE_OUT_BT_A2DP is enabled, then route
is switched to A2dp, but sco mic can still
keep active which means the BE is already
active, causing the slimbus configuration of
feedback path for A2dp to be ignored.
To fix this, tear down the input stream to
disable bt sco mic before enabling a2dp path.
Change-Id: I42e37e7b192d374401406cfa6dff4b97dca36697
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index ff0558e..afa6dca 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1511,6 +1511,20 @@
}
if (SND_DEVICE_OUT_BT_A2DP == snd_device) {
+
+ struct audio_usecase *usecase;
+ struct listnode *node;
+ /* Disable SCO Devices and enable handset mic for active input stream */
+ list_for_each(node, &adev->usecase_list) {
+ usecase = node_to_item(node, struct audio_usecase, list);
+ if (usecase->stream.in && (usecase->type == PCM_CAPTURE) &&
+ is_sco_in_device_type(&usecase->stream.in->device_list)) {
+ ALOGD("a2dp resumed, switch bt sco mic to handset mic");
+ reassign_device_list(&usecase->stream.in->device_list,
+ AUDIO_DEVICE_IN_BUILTIN_MIC, "");
+ select_devices(adev, usecase->id);
+ }
+ }
if (audio_extn_a2dp_start_playback() < 0) {
ALOGE(" fail to configure A2dp Source control path ");
goto err;
@@ -8904,25 +8918,6 @@
}
}
- ret = str_parms_get_str(parms, "A2dpSuspended", value, sizeof(value));
- if (ret >= 0) {
- if (!strncmp(value, "false", 5) &&
- audio_extn_a2dp_source_is_suspended()) {
- struct audio_usecase *usecase;
- struct listnode *node;
- list_for_each(node, &adev->usecase_list) {
- usecase = node_to_item(node, struct audio_usecase, list);
- if (usecase->stream.in && (usecase->type == PCM_CAPTURE) &&
- is_sco_in_device_type(&usecase->stream.in->device_list)) {
- ALOGD("a2dp resumed, switch bt sco mic to handset mic");
- reassign_device_list(&usecase->stream.in->device_list,
- AUDIO_DEVICE_IN_BUILTIN_MIC, "");
- select_devices(adev, usecase->id);
- }
- }
- }
- }
-
status = voice_set_parameters(adev, parms);
if (status != 0)
goto done;