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