audio: Avoid mixer path dependency conflicts
authorChristopher N. Hesse <raymanfx@gmail.com>
Fri, 2 Feb 2018 22:19:42 +0000 (23:19 +0100)
committerSimon Shields <simon@lineageos.org>
Thu, 8 Feb 2018 23:02:17 +0000 (23:02 +0000)
On some devices, certain input and output mixer controls share the same
endpoint, which means that if an input stream is disabled (and the mixer
is updated), that shared endpoint may be disabled as well.

This would result in no audio, because no one is aware that the output
stream in fact does still need the shared endpoint to be enabled.

We prevent this by enabling the output mixers after disabling input mixers,
if any.

Change-Id: I4d80fcd0648a11099f27177da3cd29095b6a8c34

audio/audio_hw.c

index e23a1f1e54e88b57522cb7d41b530d9a7f33040a..bd156343162eb52870bf6822798ebd66708f7a91 100644 (file)
@@ -985,7 +985,9 @@ int disable_snd_device(struct audio_device *adev,
 {
     struct mixer_card *mixer_card;
     struct listnode *node;
+    struct audio_usecase *out_uc_info = get_usecase_from_type(adev, PCM_PLAYBACK);
     const char *snd_device_name = get_snd_device_name(snd_device);
+    const char *out_snd_device_name = NULL;
 
     if (snd_device_name == NULL)
         return -EINVAL;
@@ -1011,6 +1013,15 @@ int disable_snd_device(struct audio_device *adev,
             update_mixer = true;
 #endif /* DSP_POWEROFF_DELAY */
             audio_route_reset_path(mixer_card->audio_route, snd_device_name);
+            if (out_uc_info != NULL) {
+                /*
+                 * Cycle the rx device to eliminate routing conflicts.
+                 * This prevents issues when an input route shares mixer controls with an output
+                 * route.
+                 */
+                out_snd_device_name = get_snd_device_name(out_uc_info->out_snd_device);
+                audio_route_apply_path(mixer_card->audio_route, out_snd_device_name);
+            }
             if (update_mixer) {
                 audio_route_update_mixer(mixer_card->audio_route);
             }