Commit 49c88b85 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

[ALSA] ca0106 - Add master volume controls



Added master volume and switch controls for ca0106 using vmaster.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 1c82ed1b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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.
+51 −0
Original line number Diff line number Diff line
@@ -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;
}