[alsa-devel] [PATCH] snd-sbxfi: implement Master volume control

William Pitcock nenolod at sacredspiral.co.uk
Mon Oct 20 01:08:15 CEST 2008


Unfortunately, the X-Fi does not have a hardware master volume control, so we have
to create a virtual master and bind all playback controls to it.

This patch depends on the patch that renames Master to PCM.

Signed-off-by: William Pitcock <nenolod at sacredspiral.co.uk>
---
 sound/pci/sbxfi/sbxfi.c |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/sound/pci/sbxfi/sbxfi.c b/sound/pci/sbxfi/sbxfi.c
index 3e99a97..d8b32aa 100644
--- a/sound/pci/sbxfi/sbxfi.c
+++ b/sound/pci/sbxfi/sbxfi.c
@@ -1685,15 +1685,45 @@ static struct snd_kcontrol_new mixers[] __devinitdata = {
 	},
 };
 
+/* list of controls to attach to the master volume control. */
+static const char *slave_vols[] __devinitdata = {
+	"PCM Playback Volume",
+};
+
 static int __devinit sbxfi_create_mixer(struct sbxfi *chip)
 {
 	int i, err;
+	struct snd_kcontrol *vmaster;
 
 	for (i = 0; i < ARRAY_SIZE(mixers); i++) {
 		err = snd_ctl_add(chip->card, snd_ctl_new1(&mixers[i], chip));
 		if (err < 0)
 			return err;
 	}
+
+	/*
+	 * Unfortunately, it seems that there is no master control, unlike
+	 * on the emu10k1 series, so we create a virtual master, and bind
+	 * our playback controls to it.
+	 */
+	vmaster = snd_ctl_make_virtual_master("Master Playback Volume", NULL);
+	if (vmaster == NULL)
+		return -ENOMEM;
+
+	/* attach the master to the card, and attach all slaves to it. */
+	snd_ctl_add(chip->card, vmaster);
+	for (i = 0; i < ARRAY_SIZE(slave_vols); i++) {
+		struct snd_kcontrol *slave;
+		struct snd_ctl_elem_id sid;
+
+		memset(&sid, 0, sizeof(sid));
+		strlcpy(sid.name, slave_vols[i], 44);	/* XXX this should be a constant defined somewhere */
+		sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+
+		if ((slave = snd_ctl_find_id(chip->card, &sid)) != NULL)
+			snd_ctl_add_slave(vmaster, slave);
+	}
+
 	return 0;
 }
 
-- 
1.5.5.4



More information about the Alsa-devel mailing list