Use "hw" group for hw controls to get stable control names.

To ensure chained sndiod controls get unique names, we prefix
groups sndiod creates with "dev".
This commit is contained in:
Alexandre Ratchov 2020-01-21 06:39:00 +01:00
parent 5f82859275
commit 0031ec4a72
2 changed files with 14 additions and 4 deletions

View File

@ -224,6 +224,7 @@ scanvol(struct sioctl_sun_hdl *hdl, struct wskbd_vol *vol)
int i, val;
memset(&desc, 0, sizeof(struct sioctl_desc));
strlcpy(desc.group, "hw", SIOCTL_NAMEMAX);
if (vol->level_idx >= 0) {
ctrl.dev = vol->level_idx;
ctrl.type = AUDIO_MIXER_VALUE;

View File

@ -53,7 +53,7 @@ dev_sioctl_ondesc(void *arg, struct sioctl_desc *desc, int val)
{
#define GROUP_PREFIX "dev"
#define GROUP_PREFIX_LEN (sizeof(GROUP_PREFIX))
char group[CTL_NAMEMAX];
char group_buf[CTL_NAMEMAX], *group;
struct dev *d = arg;
size_t len;
int addr;
@ -62,13 +62,22 @@ dev_sioctl_ondesc(void *arg, struct sioctl_desc *desc, int val)
return;
addr = CTLADDR_END + desc->addr;
dev_rmctl(d, addr);
if (desc->group[0] != 0) {
len = snprintf(group, CTL_NAMEMAX,
/*
* prefix group names we use (top-level and "app") with "dev."
* to ensure that all controls have unique names when multiple
* sndiod's are chained
*/
if (desc->group[0] == 0)
group = GROUP_PREFIX;
else if (strcmp(desc->group, "app") == 0) {
group = group_buf;
len = snprintf(group_buf, CTL_NAMEMAX,
GROUP_PREFIX ".%s", desc->group);
if (len >= CTL_NAMEMAX)
return;
} else
strlcpy(group, GROUP_PREFIX, CTL_NAMEMAX);
group = desc->group;
dev_addctl(d, group, desc->type, addr,
desc->chan0.str, desc->chan0.unit, desc->func,