ALSA: hda - Initialize output paths with current active states
authorTakashi Iwai <tiwai@suse.de>
Thu, 3 Jan 2013 15:33:02 +0000 (16:33 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 12 Jan 2013 07:43:28 +0000 (08:43 +0100)
Set path->active flag at the path creation time and let the paths
initialized according to the current path->active state in
set_output_and_unmute().  This allows to modify the active flag of
some output paths dynamically, e.g. switching the front output route
with or without aamix like patch_via.c.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_generic.c

index 9228175f0806d6f366359bf30e808f95ca737263..3507448c8b0d88061202c4e8c6cd0d72426eeead 100644 (file)
@@ -873,8 +873,10 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
                }
                if (!path)
                        dac = dacs[i] = 0;
-               else
+               else {
                        print_nid_path("output", path);
+                       path->active = true;
+               }
                if (dac)
                        badness += assign_out_path_ctls(codec, pin, dac);
        }
@@ -1045,6 +1047,7 @@ static bool map_singles(struct hda_codec *codec, int outs,
                        dacs[i] = dac;
                        found = true;
                        print_nid_path("output", path);
+                       path->active = true;
                }
        }
        return found;
@@ -2418,6 +2421,7 @@ static void parse_digital(struct hda_codec *codec)
                if (!path)
                        continue;
                print_nid_path("digout", path);
+               path->active = true;
                if (!nums) {
                        spec->multiout.dig_out_nid = dig_nid;
                        spec->dig_out_type = spec->autocfg.dig_out_type[0];
@@ -3556,10 +3560,8 @@ static void set_output_and_unmute(struct hda_codec *codec, hda_nid_t pin,
        path = snd_hda_get_nid_path(codec, dac, pin);
        if (!path)
                return;
-       if (path->active)
-               return;
-       snd_hda_activate_path(codec, path, true, true);
-       set_pin_eapd(codec, pin, true);
+       snd_hda_activate_path(codec, path, path->active, true);
+       set_pin_eapd(codec, pin, path->active);
 }
 
 /* initialize primary output paths */