Re: [PATCH] snd-sbxfi: implement Master volume control

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxxxxx>

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
> 
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux