hal: Use derived playback snd device during re-routing
- Playback is heard on both usb headset and speaker once
ringtone is stopped.
- Playback is routed to usb headset and speaker while ringtone
is active. This is because all active usecases are routed to
snd device that will be used by new usecase.
- Re-route existing usecases to derived snd device for playback
instead of routing all usecases to same device.
Change-Id: I8ef192dfa1796acb68a7a7774bfd98b1842a475c
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 1b0e1f1..b61c12d 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1023,6 +1023,8 @@
struct listnode *node;
struct audio_usecase *usecase;
bool switch_device[AUDIO_USECASE_MAX];
+ snd_device_t uc_derive_snd_device;
+ snd_device_t derive_snd_device[AUDIO_USECASE_MAX];
int i, num_uc_to_switch = 0;
int status = 0;
bool force_restart_session = false;
@@ -1070,11 +1072,11 @@
platform_get_snd_device_name(snd_device),
platform_get_snd_device_name(usecase->out_snd_device),
platform_check_backends_match(snd_device, usecase->out_snd_device));
+ uc_derive_snd_device = derive_playback_snd_device(adev->platform,
+ usecase, uc_info, snd_device);
if (usecase->type != PCM_CAPTURE &&
usecase != uc_info &&
- (derive_playback_snd_device(adev->platform,
- usecase, uc_info,
- snd_device) != usecase->out_snd_device || force_routing) &&
+ ((uc_derive_snd_device != usecase->out_snd_device) || force_routing) &&
((usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) ||
(usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) ||
(usecase->devices & AUDIO_DEVICE_OUT_USB_DEVICE) ||
@@ -1088,6 +1090,8 @@
platform_get_snd_device_name(usecase->out_snd_device));
disable_audio_route(adev, usecase);
switch_device[usecase->id] = true;
+ /* Enable existing usecase on derived playback device */
+ derive_snd_device[usecase->id] = uc_derive_snd_device;
num_uc_to_switch++;
}
}
@@ -1110,7 +1114,7 @@
list_for_each(node, &adev->usecase_list) {
usecase = node_to_item(node, struct audio_usecase, list);
if (switch_device[usecase->id]) {
- enable_snd_device(adev, snd_device);
+ enable_snd_device(adev, derive_snd_device[usecase->id]);
}
}
@@ -1120,7 +1124,7 @@
usecase = node_to_item(node, struct audio_usecase, list);
/* Update the out_snd_device only before enabling the audio route */
if (switch_device[usecase->id]) {
- usecase->out_snd_device = snd_device;
+ usecase->out_snd_device = derive_snd_device[usecase->id];
if (usecase->type != VOICE_CALL) {
ALOGD("%s:becf: enabling usecase (%s) on (%s)", __func__,
use_case_table[usecase->id],