[alsa-devel] [PATCH] snd-sbxfi: implement Master volume control
Takashi Iwai
tiwai at suse.de
Mon Oct 20 07:59:32 CEST 2008
At Sun, 19 Oct 2008 18:08:15 -0500,
William Pitcock wrote:
>
> 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>
I don't like this patch because the virtual master implementation is
already found in sbxfi.c No reason to use yet another vmaster
framework in addition.
So, no I don't apply both patches. A simpler fix is just to add PCM
volume like Master volume. Both can use the same callbacks, so the
addition would be pretty small.
thanks,
Takashi
> ---
> 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