diff --git a/sndiod/dev.c b/sndiod/dev.c index d28e40b..a2aaf86 100644 --- a/sndiod/dev.c +++ b/sndiod/dev.c @@ -1283,6 +1283,7 @@ dev_reopen(struct dev *d) pc = &d->ctl_list; while ((c = *pc) != NULL) { if (c->addr >= CTLADDR_END) { + c->refs_mask &= ~CTL_DEVMASK; if (c->refs_mask == 0) { *pc = c->next; xfree(c); @@ -2274,6 +2275,7 @@ dev_addctl(struct dev *d, char *gstr, int type, int addr, c->dirty = 0; c->refs_mask = 0; for (i = 0; i < DEV_NCTLSLOT; i++) { + c->refs_mask |= CTL_DEVMASK; if (d->ctlslot[i].ops != NULL) c->refs_mask |= 1 << i; } @@ -2317,6 +2319,7 @@ dev_rmctl(struct dev *d, int addr) log_puts("\n"); } #endif + c->refs_mask &= ~CTL_DEVMASK; if (c->refs_mask != 0) return; *pc = c->next; diff --git a/sndiod/dev.h b/sndiod/dev.h index 23a79f2..7ddf456 100644 --- a/sndiod/dev.h +++ b/sndiod/dev.h @@ -134,6 +134,8 @@ struct ctl { char str[CTL_NAMEMAX]; /* stream name */ int unit; } chan0, chan1; /* affected channels */ +#define CTL_DEVMASK (1 << 31) +#define CTL_SLOTMASK(i) (1 << (i)) unsigned int val_mask; unsigned int desc_mask; unsigned int refs_mask;