Merge "hal: Prevent superfluous device tear down on routing change"
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 904b369..3e3f72f 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1330,7 +1330,8 @@
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;
+ snd_device_t split_snd_devices[SND_DEVICE_OUT_END];
+ int i, num_uc_to_switch = 0, num_devices = 0;
int status = 0;
bool force_restart_session = false;
/*
@@ -1412,7 +1413,20 @@
list_for_each(node, &adev->usecase_list) {
usecase = node_to_item(node, struct audio_usecase, list);
if (switch_device[usecase->id]) {
- disable_snd_device(adev, usecase->out_snd_device);
+ /* Check if sound device to be switched can be split and if any
+ of the split devices match with derived sound device */
+ platform_split_snd_device(adev->platform, usecase->out_snd_device,
+ &num_devices, split_snd_devices);
+ if (num_devices > 1) {
+ for (i = 0; i < num_devices; i++) {
+ /* Disable devices that do not match with derived sound device */
+ if (split_snd_devices[i] != derive_snd_device[usecase->id]) {
+ disable_snd_device(adev, split_snd_devices[i]);
+ }
+ }
+ } else {
+ disable_snd_device(adev, usecase->out_snd_device);
+ }
}
}