version 1.88, 2021/01/29 11:36:44 |
version 1.89, 2021/01/29 11:38:23 |
|
|
slot_array[i].unit = i; |
slot_array[i].unit = i; |
slot_array[i].ops = NULL; |
slot_array[i].ops = NULL; |
slot_array[i].vol = MIDI_MAXCTL; |
slot_array[i].vol = MIDI_MAXCTL; |
slot_array[i].dev = NULL; |
slot_array[i].opt = NULL; |
slot_array[i].serial = slot_serial++; |
slot_array[i].serial = slot_serial++; |
memset(slot_array[i].name, 0, SLOT_NAMEMAX); |
memset(slot_array[i].name, 0, SLOT_NAMEMAX); |
} |
} |
|
|
x.dev = SYSEX_DEV_ANY; |
x.dev = SYSEX_DEV_ANY; |
x.id0 = SYSEX_AUCAT; |
x.id0 = SYSEX_AUCAT; |
x.id1 = SYSEX_AUCAT_SLOTDESC; |
x.id1 = SYSEX_AUCAT_SLOTDESC; |
if (*s->name != '\0') |
if (s->opt != NULL && s->opt->dev == d) |
slot_ctlname(s, (char *)x.u.slotdesc.name, SYSEX_NAMELEN); |
slot_ctlname(s, (char *)x.u.slotdesc.name, SYSEX_NAMELEN); |
x.u.slotdesc.chan = (s - slot_array); |
x.u.slotdesc.chan = (s - slot_array); |
x.u.slotdesc.end = SYSEX_END; |
x.u.slotdesc.end = SYSEX_END; |
|
|
|
|
dev_midi_master(d); |
dev_midi_master(d); |
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
if (s->dev != d) |
if (s->opt != NULL && s->opt->dev != d) |
continue; |
continue; |
dev_midi_slotdesc(d, s); |
dev_midi_slotdesc(d, s); |
dev_midi_vol(d, s); |
dev_midi_vol(d, s); |
|
|
chan = msg[0] & MIDI_CHANMASK; |
chan = msg[0] & MIDI_CHANMASK; |
if (chan >= DEV_NSLOT) |
if (chan >= DEV_NSLOT) |
return; |
return; |
if (slot_array[chan].dev != d) |
if (slot_array[chan].opt == NULL || |
|
slot_array[chan].opt->dev != d) |
return; |
return; |
slot_setvol(slot_array + chan, msg[2]); |
slot_setvol(slot_array + chan, msg[2]); |
dev_onval(d, CTLADDR_SLOT_LEVEL(chan), msg[2]); |
dev_onval(d, CTLADDR_SLOT_LEVEL(chan), msg[2]); |
|
|
return 0; |
return 0; |
|
|
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
if (s->dev != d || s->name[0] == 0) |
if (s->opt == NULL || s->opt->dev != d || s->name[0] == 0) |
continue; |
continue; |
slot_ctlname(s, name, CTL_NAMEMAX); |
slot_ctlname(s, name, CTL_NAMEMAX); |
dev_addctl(d, "app", CTL_NUM, |
dev_addctl(d, "app", CTL_NUM, |
|
|
struct ctlslot *c; |
struct ctlslot *c; |
|
|
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
if (s->dev != d) |
if (s->opt == NULL || s->opt->dev != d) |
continue; |
continue; |
if (s->ops) |
if (s->ops) { |
s->ops->exit(s->arg); |
s->ops->exit(s->arg); |
s->ops = NULL; |
s->ops = NULL; |
|
} |
} |
} |
d->slot_list = NULL; |
d->slot_list = NULL; |
|
|
for (c = ctlslot_array, i = DEV_NCTLSLOT; i > 0; i--, c++) { |
for (c = ctlslot_array, i = DEV_NCTLSLOT; i > 0; i--, c++) { |
if (c->opt->dev != d) |
if (c->opt->dev != d) |
continue; |
continue; |
if (c->ops) |
if (c->ops) { |
c->ops->exit(c->arg); |
c->ops->exit(c->arg); |
c->ops = NULL; |
c->ops = NULL; |
|
} |
} |
} |
|
|
midi_abort(d->midi); |
midi_abort(d->midi); |
|
|
} |
} |
|
|
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
if (s->dev != d || !s->ops || !s->opt->mmc) |
if (s->opt == NULL || s->opt->dev != d || !s->ops || !s->opt->mmc) |
continue; |
continue; |
if (s->pstate != SLOT_READY) { |
if (s->pstate != SLOT_READY) { |
#ifdef DEBUG |
#ifdef DEBUG |
|
|
return; |
return; |
|
|
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
for (i = 0, s = slot_array; i < DEV_NSLOT; i++, s++) { |
if (s->dev != d || !s->ops || !s->opt->mmc) |
if (s->opt == NULL || s->opt->dev != d || !s->ops || !s->opt->mmc) |
continue; |
continue; |
slot_attach(s); |
slot_attach(s); |
s->pstate = SLOT_RUN; |
s->pstate = SLOT_RUN; |
|
|
slot_initconv(struct slot *s) |
slot_initconv(struct slot *s) |
{ |
{ |
unsigned int dev_nch; |
unsigned int dev_nch; |
struct dev *d = s->dev; |
struct dev *d = s->opt->dev; |
|
|
if (s->mode & MODE_PLAY) { |
if (s->mode & MODE_PLAY) { |
cmap_init(&s->mix.cmap, |
cmap_init(&s->mix.cmap, |
|
|
void |
void |
slot_allocbufs(struct slot *s) |
slot_allocbufs(struct slot *s) |
{ |
{ |
struct dev *d = s->dev; |
struct dev *d = s->opt->dev; |
|
|
if (s->mode & MODE_PLAY) { |
if (s->mode & MODE_PLAY) { |
s->mix.bpf = s->par.bps * s->mix.nch; |
s->mix.bpf = s->par.bps * s->mix.nch; |
|
|
* allocate a new slot and register the given call-backs |
* allocate a new slot and register the given call-backs |
*/ |
*/ |
struct slot * |
struct slot * |
slot_new(struct dev *d, struct opt *opt, unsigned int id, char *who, |
slot_new(struct opt *opt, unsigned int id, char *who, |
struct slotops *ops, void *arg, int mode) |
struct slotops *ops, void *arg, int mode) |
{ |
{ |
char *p; |
char *p; |
|
|
slot_log(s); |
slot_log(s); |
log_puts(": requested mode not allowed\n"); |
log_puts(": requested mode not allowed\n"); |
} |
} |
return 0; |
return NULL; |
} |
} |
if (!dev_ref(d)) |
if (!dev_ref(opt->dev)) |
return NULL; |
return NULL; |
dev_label(d, s - slot_array); |
if ((mode & opt->dev->mode) != mode) { |
if ((mode & d->mode) != mode) { |
|
if (log_level >= 1) { |
if (log_level >= 1) { |
slot_log(s); |
slot_log(s); |
log_puts(": requested mode not supported\n"); |
log_puts(": requested mode not supported\n"); |
} |
} |
dev_unref(d); |
dev_unref(opt->dev); |
return NULL; |
return NULL; |
} |
} |
s->dev = d; |
|
s->opt = opt; |
s->opt = opt; |
s->ops = ops; |
s->ops = ops; |
s->arg = arg; |
s->arg = arg; |
|
|
if (s->mode & MODE_RECMASK) |
if (s->mode & MODE_RECMASK) |
s->sub.nch = s->opt->rmax - s->opt->rmin + 1; |
s->sub.nch = s->opt->rmax - s->opt->rmin + 1; |
s->xrun = s->opt->mmc ? XRUN_SYNC : XRUN_IGNORE; |
s->xrun = s->opt->mmc ? XRUN_SYNC : XRUN_IGNORE; |
s->appbufsz = d->bufsz; |
s->appbufsz = s->opt->dev->bufsz; |
s->round = d->round; |
s->round = s->opt->dev->round; |
s->rate = d->rate; |
s->rate = s->opt->dev->rate; |
dev_midi_slotdesc(d, s); |
dev_label(s->opt->dev, s - slot_array); |
dev_midi_vol(d, s); |
dev_midi_slotdesc(s->opt->dev, s); |
|
dev_midi_vol(s->opt->dev, s); |
#ifdef DEBUG |
#ifdef DEBUG |
if (log_level >= 3) { |
if (log_level >= 3) { |
slot_log(s); |
slot_log(s); |
log_puts(": using "); |
log_puts(": using "); |
dev_log(d); |
dev_log(s->opt->dev); |
log_puts("."); |
log_puts("."); |
log_puts(opt->name); |
log_puts(s->opt->name); |
log_puts(", mode = "); |
log_puts(", mode = "); |
log_putx(mode); |
log_putx(mode); |
log_puts("\n"); |
log_puts("\n"); |
|
|
slot_stop(s, 0); |
slot_stop(s, 0); |
break; |
break; |
} |
} |
dev_unref(s->dev); |
dev_unref(s->opt->dev); |
s->dev = NULL; |
|
} |
} |
|
|
/* |
/* |
|
|
void |
void |
slot_attach(struct slot *s) |
slot_attach(struct slot *s) |
{ |
{ |
struct dev *d = s->dev; |
struct dev *d = s->opt->dev; |
long long pos; |
long long pos; |
|
|
/* |
/* |
|
|
* device may be disconnected, and if so we're called from |
* device may be disconnected, and if so we're called from |
* slot->ops->exit() on a closed device |
* slot->ops->exit() on a closed device |
*/ |
*/ |
if (s->dev->pstate == DEV_CFG) |
if (s->opt->dev->pstate == DEV_CFG) |
return; |
return; |
if (!s->opt->mmc) { |
if (!s->opt->mmc) { |
slot_attach(s); |
slot_attach(s); |
s->pstate = SLOT_RUN; |
s->pstate = SLOT_RUN; |
} else |
} else |
dev_sync_attach(s->dev); |
dev_sync_attach(s->opt->dev); |
} |
} |
|
|
/* |
/* |
|
|
void |
void |
slot_start(struct slot *s) |
slot_start(struct slot *s) |
{ |
{ |
struct dev *d = s->dev; |
struct dev *d = s->opt->dev; |
#ifdef DEBUG |
#ifdef DEBUG |
if (s->pstate != SLOT_INIT) { |
if (s->pstate != SLOT_INIT) { |
slot_log(s); |
slot_log(s); |
|
|
slot_detach(struct slot *s) |
slot_detach(struct slot *s) |
{ |
{ |
struct slot **ps; |
struct slot **ps; |
struct dev *d = s->dev; |
struct dev *d = s->opt->dev; |
long long pos; |
long long pos; |
|
|
for (ps = &d->slot_list; *ps != s; ps = &(*ps)->next) { |
for (ps = &d->slot_list; *ps != s; ps = &(*ps)->next) { |
|
|
} else { |
} else { |
num = addr - CTLADDR_SLOT_LEVEL(0); |
num = addr - CTLADDR_SLOT_LEVEL(0); |
s = slot_array + num; |
s = slot_array + num; |
if (s->dev != d) |
if (s->opt->dev != d) |
return 1; |
return 1; |
slot_setvol(s, val); |
slot_setvol(s, val); |
dev_midi_vol(d, s); |
dev_midi_vol(d, s); |