diff --git a/libsndio/sioctl_sun.c b/libsndio/sioctl_sun.c index 119aec8..a050067 100644 --- a/libsndio/sioctl_sun.c +++ b/libsndio/sioctl_sun.c @@ -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; diff --git a/sndiod/dev_sioctl.c b/sndiod/dev_sioctl.c index b4d1e65..af61c9c 100644 --- a/sndiod/dev_sioctl.c +++ b/sndiod/dev_sioctl.c @@ -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,