When using alsactl to save or restore the card settings, it currently skips over controls that don't have the appropriate read/write permissions. It should also skip over inactive controls, otherwise it will get an error when it tries to access that control, and will fail to save the card state (or fully restore it.) --- I noticed this while adding surround support to SiS7019. I think the problem affects other cards, as I am following the pattern used by trident, rme*, cmipci, emu10k1 and others.
This is only for discussion, since I've not tested this (nor even compiled it) but I think it will fix the issue.
diff -r d3ba62cd2776 alsactl/state.c --- a/alsactl/state.c Fri Dec 14 15:29:51 2007 +0100 +++ b/alsactl/state.c Sat Dec 15 14:06:35 2007 -0500 @@ -250,7 +250,8 @@ static int get_control(snd_ctl_t *handle return err; }
- if (!snd_ctl_elem_info_is_readable(info)) + if (snd_ctl_elem_info_is_inactive(info) || + !snd_ctl_elem_info_is_readable(info)) return 0; snd_ctl_elem_value_set_id(ctl, id); err = snd_ctl_elem_read(handle, ctl); @@ -1306,7 +1307,8 @@ static int set_control(snd_ctl_t *handle } }
- if (!snd_ctl_elem_info_is_writable(info)) + if (snd_ctl_elem_info_is_inactive(info) || + !snd_ctl_elem_info_is_writable(info)) return 0; snd_ctl_elem_value_set_numid(ctl, numid1);