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);
+                }
             }
         }