[ALSA] ca0106 - Add master volume controls
authorTakashi Iwai <tiwai@suse.de>
Mon, 18 Feb 2008 12:06:49 +0000 (13:06 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 24 Apr 2008 10:00:12 +0000 (12:00 +0200)
Added master volume and switch controls for ca0106 using vmaster.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/Kconfig
sound/pci/ca0106/ca0106_mixer.c

index 48296d9..b05435c 100644 (file)
@@ -162,6 +162,7 @@ config SND_CA0106
        depends on SND
        select SND_AC97_CODEC
        select SND_RAWMIDI
+       select SND_VMASTER
        help
          Say Y here to include support for the Sound Blaster Audigy LS
          and Live 24bit.
index af73686..94618ec 100644 (file)
@@ -658,11 +658,47 @@ static int __devinit rename_ctl(struct snd_card *card, const char *src, const ch
                }                                                       \
        } while (0)
 
+static __devinitdata
+DECLARE_TLV_DB_SCALE(snd_ca0106_master_db_scale, -6375, 50, 1);
+
+static char *slave_vols[] __devinitdata = {
+       "Analog Front Playback Volume",
+        "Analog Rear Playback Volume",
+       "Analog Center/LFE Playback Volume",
+        "Analog Side Playback Volume",
+        "IEC958 Front Playback Volume",
+       "IEC958 Rear Playback Volume",
+       "IEC958 Center/LFE Playback Volume",
+       "IEC958 Unknown Playback Volume",
+        "CAPTURE feedback Playback Volume",
+       NULL
+};
+
+static char *slave_sws[] __devinitdata = {
+       "Analog Front Playback Switch",
+       "Analog Rear Playback Switch",
+       "Analog Center/LFE Playback Switch",
+       "Analog Side Playback Switch",
+       "IEC958 Playback Switch",
+       NULL
+};
+
+static void __devinit add_slaves(struct snd_card *card,
+                                struct snd_kcontrol *master, char **list)
+{
+       for (; *list; list++) {
+               struct snd_kcontrol *slave = ctl_find(card, *list);
+               if (slave)
+                       snd_ctl_add_slave(master, slave);
+       }
+}
+
 int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
 {
        int err;
         struct snd_card *card = emu->card;
        char **c;
+       struct snd_kcontrol *vmaster;
        static char *ca0106_remove_ctls[] = {
                "Master Mono Playback Switch",
                "Master Mono Playback Volume",
@@ -719,6 +755,21 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
        }
        if (emu->details->spi_dac == 1)
                ADD_CTLS(emu, snd_ca0106_volume_spi_dac_ctls);
+
+       /* Create virtual master controls */
+       vmaster = snd_ctl_make_virtual_master("Master Playback Volume",
+                                             snd_ca0106_master_db_scale);
+       if (!vmaster)
+               return -ENOMEM;
+       add_slaves(card, vmaster, slave_vols);
+
+       if (emu->details->spi_dac == 1) {
+               vmaster = snd_ctl_make_virtual_master("Master Playback Switch",
+                                                     NULL);
+               if (!vmaster)
+                       return -ENOMEM;
+               add_slaves(card, vmaster, slave_sws);
+       }
         return 0;
 }