version 1.69, 2020/04/16 12:23:53 |
version 1.70, 2020/04/16 12:26:55 |
|
|
void |
void |
dev_midi_master(struct dev *d) |
dev_midi_master(struct dev *d) |
{ |
{ |
|
struct ctl *c; |
|
unsigned int master, v; |
struct sysex x; |
struct sysex x; |
|
|
|
if (d->master_enabled) |
|
master = d->master; |
|
else { |
|
master = 0; |
|
for (c = d->ctl_list; c != NULL; c = c->next) { |
|
if (c->type != CTL_NUM || |
|
strcmp(c->group, "") != 0 || |
|
strcmp(c->node0.name, "output") != 0 || |
|
strcmp(c->func, "level") != 0) |
|
continue; |
|
v = (c->curval * 127 + c->maxval / 2) / c->maxval; |
|
if (master < v) |
|
master = v; |
|
} |
|
} |
|
|
memset(&x, 0, sizeof(struct sysex)); |
memset(&x, 0, sizeof(struct sysex)); |
x.start = SYSEX_START; |
x.start = SYSEX_START; |
x.type = SYSEX_TYPE_RT; |
x.type = SYSEX_TYPE_RT; |
|
|
x.id0 = SYSEX_CONTROL; |
x.id0 = SYSEX_CONTROL; |
x.id1 = SYSEX_MASTER; |
x.id1 = SYSEX_MASTER; |
x.u.master.fine = 0; |
x.u.master.fine = 0; |
x.u.master.coarse = d->master; |
x.u.master.coarse = master; |
x.u.master.end = SYSEX_END; |
x.u.master.end = SYSEX_END; |
midi_send(d->midi, (unsigned char *)&x, SYSEX_SIZE(master)); |
midi_send(d->midi, (unsigned char *)&x, SYSEX_SIZE(master)); |
} |
} |
|
|
if (x->id0 == SYSEX_CONTROL && x->id1 == SYSEX_MASTER) { |
if (x->id0 == SYSEX_CONTROL && x->id1 == SYSEX_MASTER) { |
if (len == SYSEX_SIZE(master)) { |
if (len == SYSEX_SIZE(master)) { |
dev_master(d, x->u.master.coarse); |
dev_master(d, x->u.master.coarse); |
dev_onval(d, CTLADDR_MASTER, |
if (d->master_enabled) { |
x->u.master.coarse); |
dev_onval(d, CTLADDR_MASTER, |
|
x->u.master.coarse); |
|
} |
} |
} |
return; |
return; |
} |
} |
|
|
} |
} |
if (weight > i->opt->maxweight) |
if (weight > i->opt->maxweight) |
weight = i->opt->maxweight; |
weight = i->opt->maxweight; |
i->mix.weight = ADATA_MUL(weight, MIDI_TO_ADATA(d->master)); |
i->mix.weight = d->master_enabled ? |
|
ADATA_MUL(weight, MIDI_TO_ADATA(d->master)) : weight; |
#ifdef DEBUG |
#ifdef DEBUG |
if (log_level >= 3) { |
if (log_level >= 3) { |
slot_log(i); |
slot_log(i); |
|
|
void |
void |
dev_master(struct dev *d, unsigned int master) |
dev_master(struct dev *d, unsigned int master) |
{ |
{ |
|
struct ctl *c; |
|
unsigned int v; |
|
|
if (log_level >= 2) { |
if (log_level >= 2) { |
dev_log(d); |
dev_log(d); |
log_puts(": master volume set to "); |
log_puts(": master volume set to "); |
log_putu(master); |
log_putu(master); |
log_puts("\n"); |
log_puts("\n"); |
} |
} |
d->master = master; |
if (d->master_enabled) { |
if (d->mode & MODE_PLAY) |
d->master = master; |
dev_mix_adjvol(d); |
if (d->mode & MODE_PLAY) |
|
dev_mix_adjvol(d); |
|
} else { |
|
for (c = d->ctl_list; c != NULL; c = c->next) { |
|
if (c->type != CTL_NUM || |
|
strcmp(c->group, "") != 0 || |
|
strcmp(c->node0.name, "output") != 0 || |
|
strcmp(c->func, "level") != 0) |
|
continue; |
|
v = (master * c->maxval + 64) / 127; |
|
dev_setctl(d, c->addr, v); |
|
} |
|
} |
} |
} |
|
|
/* |
/* |
|
|
int i; |
int i; |
char name[CTL_NAMEMAX]; |
char name[CTL_NAMEMAX]; |
|
|
|
d->master_enabled = 0; |
d->mode = d->reqmode; |
d->mode = d->reqmode; |
d->round = d->reqround; |
d->round = d->reqround; |
d->bufsz = d->reqbufsz; |
d->bufsz = d->reqbufsz; |
|
|
name, -1, "level", |
name, -1, "level", |
NULL, -1, 127, d->slot[i].vol); |
NULL, -1, 127, d->slot[i].vol); |
} |
} |
dev_addctl(d, "", CTL_NUM, |
|
CTLADDR_MASTER, "output", -1, "level", NULL, -1, 127, d->master); |
|
|
|
d->pstate = DEV_INIT; |
d->pstate = DEV_INIT; |
return 1; |
return 1; |
|
|
void |
void |
dev_ctlsync(struct dev *d) |
dev_ctlsync(struct dev *d) |
{ |
{ |
|
struct ctl *c; |
struct ctlslot *s; |
struct ctlslot *s; |
int i; |
int found, i; |
|
|
|
found = 0; |
|
for (c = d->ctl_list; c != NULL; c = c->next) { |
|
if (c->addr != CTLADDR_MASTER && |
|
c->type == CTL_NUM && |
|
strcmp(c->group, "") == 0 && |
|
strcmp(c->node0.name, "output") == 0 && |
|
strcmp(c->func, "level") == 0) |
|
found = 1; |
|
} |
|
|
|
if (d->master_enabled && found) { |
|
if (log_level >= 2) { |
|
dev_log(d); |
|
log_puts(": software master level control disabled\n"); |
|
} |
|
d->master_enabled = 0; |
|
dev_rmctl(d, CTLADDR_MASTER); |
|
} else if (!d->master_enabled && !found) { |
|
if (log_level >= 2) { |
|
dev_log(d); |
|
log_puts(": software master level control enabled\n"); |
|
} |
|
d->master_enabled = 1; |
|
dev_addctl(d, "", CTL_NUM, CTLADDR_MASTER, |
|
"output", -1, "level", NULL, -1, 127, d->master); |
|
} |
|
|
for (s = d->ctlslot, i = DEV_NCTLSLOT; i > 0; i--, s++) { |
for (s = d->ctlslot, i = DEV_NCTLSLOT; i > 0; i--, s++) { |
if (s->ops) |
if (s->ops) |
s->ops->sync(s->arg); |
s->ops->sync(s->arg); |
|
|
dev_ref(d); |
dev_ref(d); |
} else { |
} else { |
if (addr == CTLADDR_MASTER) { |
if (addr == CTLADDR_MASTER) { |
dev_master(d, val); |
if (d->master_enabled) { |
dev_midi_master(d); |
dev_master(d, val); |
|
dev_midi_master(d); |
|
} |
} else { |
} else { |
num = addr - CTLADDR_SLOT_LEVEL(0); |
num = addr - CTLADDR_SLOT_LEVEL(0); |
slot_setvol(d->slot + num, val); |
slot_setvol(d->slot + num, val); |