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; }