summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/audio_hw.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/audio/audio_hw.c b/audio/audio_hw.c
index c050dd5..1ede8e1 100644
--- a/audio/audio_hw.c
+++ b/audio/audio_hw.c
@@ -980,7 +980,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;
@@ -1006,6 +1008,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);
}