[alsa-devel] why would an scontrol think that it should have 2 items instead of just 1?

John L. Utz III john.utz at dmx.com
Thu Aug 9 00:28:56 CEST 2007


Hello

The VT1618 codec has a register value that turns on the Surround Side
Output (it's off by default)

I have implemented the control, but I am getting a really weird result,
i have a bogus 'Item1' that shouldnt exist:

jutz-gntdv alsa-driver # amixer sset Side On
Simple mixer control 'Side',0
  Capabilities: pvolume pswitch enum
  Items: 'On' 'Off'
  Item0: 'On'
  Item1: 'On'
jutz-gntdv alsa-driver # amixer sset Side Off
Simple mixer control 'Side',0
  Capabilities: pvolume pswitch enum
  Items: 'On' 'Off'
  Item0: 'Off'
  Item1: 'On'

This wasnt always there, it just showed up during development. Is the
number of items cached in a temp file somewhere that i just need to
remove?

Here's the mixer element:

	{
		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
		.name  = "Side",
		.info  = snd_ac97_vt1618_surside_info,
		.get   = snd_ac97_vt1618_surside_get,
		.put   = snd_ac97_vt1618_surside_put
	},

Here's the function impls:

/* surround side power up or down */

static int snd_ac97_vt1618_surside_info(struct snd_kcontrol *kcontrol,
				     struct snd_ctl_elem_info *uinfo)
{
	static const char* texts[] = {"On", "Off"};
	return ac97_enum_text_info(kcontrol, uinfo, texts, 2);
}

static int snd_ac97_vt1618_surside_get(struct snd_kcontrol *kcontrol,
				       struct snd_ctl_elem_value
*ucontrol) {
	struct snd_ac97 *pac97 = snd_kcontrol_chip(kcontrol);
  
	ucontrol->value.enumerated.item[0] = 
		(snd_ac97_read(pac97, 0x5c) & 0x0008) >> 3;

	return 0;
}

static int snd_ac97_vt1618_surside_put(struct snd_kcontrol *kcontrol,
				       struct snd_ctl_elem_value
*ucontrol) {
  //0x5c,  3, 1,
	struct snd_ac97 *pac97 = snd_kcontrol_chip(kcontrol);

	snd_ac97_update_bits(pac97, 0x5c, 0x0008,
			     ucontrol->value.enumerated.item[0] << 3);
	return 0;
}



More information about the Alsa-devel mailing list