mirror of https://github.com/ericonr/sndio.git
Fix midi output "ownership". Check if clockticks are out of bounds to
detect bogus libsndio backends. Use a midithru for device control.
This commit is contained in:
parent
0127efd381
commit
832cb8bbe7
|
@ -634,6 +634,7 @@ dev_mix_cycle(struct dev *d)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
s->delay -= s->round;
|
||||||
if (log_level >= 4) {
|
if (log_level >= 4) {
|
||||||
slot_log(s);
|
slot_log(s);
|
||||||
log_puts(": mixing, drop = ");
|
log_puts(": mixing, drop = ");
|
||||||
|
@ -875,6 +876,9 @@ dev_onmove(struct dev *d, int delta)
|
||||||
pos = (long long)delta * s->round + s->delta_rem;
|
pos = (long long)delta * s->round + s->delta_rem;
|
||||||
s->delta_rem = pos % d->round;
|
s->delta_rem = pos % d->round;
|
||||||
s->delta += pos / (int)d->round;
|
s->delta += pos / (int)d->round;
|
||||||
|
#ifdef DEBUG
|
||||||
|
s->delay += pos / (int)d->round;
|
||||||
|
#endif
|
||||||
if (s->delta >= 0)
|
if (s->delta >= 0)
|
||||||
s->ops->onmove(s->arg, delta);
|
s->ops->onmove(s->arg, delta);
|
||||||
}
|
}
|
||||||
|
@ -960,6 +964,7 @@ dev_new(char *path, struct aparams *par,
|
||||||
d = xmalloc(sizeof(struct dev));
|
d = xmalloc(sizeof(struct dev));
|
||||||
d->num = dev_sndnum++;
|
d->num = dev_sndnum++;
|
||||||
d->midi = midi_new(&dev_midiops, d, MODE_MIDIIN | MODE_MIDIOUT);
|
d->midi = midi_new(&dev_midiops, d, MODE_MIDIIN | MODE_MIDIOUT);
|
||||||
|
midi_tag(d->midi, d->num);
|
||||||
d->path = path;
|
d->path = path;
|
||||||
d->reqpar = *par;
|
d->reqpar = *par;
|
||||||
d->reqmode = mode;
|
d->reqmode = mode;
|
||||||
|
@ -1613,6 +1618,7 @@ slot_attach(struct slot *s)
|
||||||
s->delta_rem = 0;
|
s->delta_rem = 0;
|
||||||
s->pstate = SLOT_RUN;
|
s->pstate = SLOT_RUN;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
s->delay = 0;
|
||||||
if (log_level >= 3) {
|
if (log_level >= 3) {
|
||||||
slot_log(s);
|
slot_log(s);
|
||||||
log_puts(": attached at ");
|
log_puts(": attached at ");
|
||||||
|
|
|
@ -45,6 +45,9 @@ struct slot {
|
||||||
struct dev *dev; /* device this belongs to */
|
struct dev *dev; /* device this belongs to */
|
||||||
void *arg; /* user data for callbacks */
|
void *arg; /* user data for callbacks */
|
||||||
struct aparams par; /* socket side params */
|
struct aparams par; /* socket side params */
|
||||||
|
#ifdef DEBUG
|
||||||
|
int delay;
|
||||||
|
#endif
|
||||||
struct {
|
struct {
|
||||||
int weight; /* dynamic range */
|
int weight; /* dynamic range */
|
||||||
int maxweight; /* max dynamic range allowed */
|
int maxweight; /* max dynamic range allowed */
|
||||||
|
|
|
@ -60,7 +60,7 @@ unsigned int midi_portnum = 0;
|
||||||
|
|
||||||
struct midithru {
|
struct midithru {
|
||||||
unsigned txmask;
|
unsigned txmask;
|
||||||
#define MIDITHRU_NMAX 16
|
#define MIDITHRU_NMAX 32
|
||||||
} midithru[MIDITHRU_NMAX];
|
} midithru[MIDITHRU_NMAX];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -214,10 +214,14 @@ midi_send(struct midi *iep, unsigned char *msg, int size)
|
||||||
if ((iep->txmask & (1 << i)) == 0)
|
if ((iep->txmask & (1 << i)) == 0)
|
||||||
continue;
|
continue;
|
||||||
oep = midi_ep + i;
|
oep = midi_ep + i;
|
||||||
if (msg[0] == SYSEX_START)
|
if (msg[0] <= 0x7f) {
|
||||||
oep->owner = iep;
|
/* data (sysex continuation) */
|
||||||
else if (oep->owner != iep)
|
if (oep->owner != iep)
|
||||||
continue;
|
continue;
|
||||||
|
} else if (msg[0] <= 0xf7) {
|
||||||
|
/* new running status */
|
||||||
|
oep->owner = iep;
|
||||||
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (log_level >= 4) {
|
if (log_level >= 4) {
|
||||||
midi_log(iep);
|
midi_log(iep);
|
||||||
|
|
|
@ -38,6 +38,7 @@ struct siofile {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
long long wtime, utime;
|
long long wtime, utime;
|
||||||
long long sum_wtime, sum_utime;
|
long long sum_wtime, sum_utime;
|
||||||
|
int delay;
|
||||||
#endif
|
#endif
|
||||||
struct dev *dev;
|
struct dev *dev;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
|
@ -97,6 +98,16 @@ siofile_onmove(void *arg, int delta)
|
||||||
f->sum_wtime += file_wtime - f->wtime;
|
f->sum_wtime += file_wtime - f->wtime;
|
||||||
f->wtime = file_wtime;
|
f->wtime = file_wtime;
|
||||||
f->utime = file_utime;
|
f->utime = file_utime;
|
||||||
|
f->delay += delta;
|
||||||
|
if (f->delay > 0) {
|
||||||
|
siofile_log(f);
|
||||||
|
log_puts(": clock ahead of buffer: delay = ");
|
||||||
|
log_puti(f->delay);
|
||||||
|
log_puts(", bufsz = \n");
|
||||||
|
log_puti(f->dev->bufsz);
|
||||||
|
log_puts("\n");
|
||||||
|
panic();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
dev_onmove(f->dev, delta);
|
dev_onmove(f->dev, delta);
|
||||||
}
|
}
|
||||||
|
@ -165,7 +176,7 @@ siofile_play(struct siofile *f)
|
||||||
if (n == 0 && data == base && !sio_eof(f->hdl)) {
|
if (n == 0 && data == base && !sio_eof(f->hdl)) {
|
||||||
siofile_log(f);
|
siofile_log(f);
|
||||||
log_puts(": write blocked at cycle start, sync error\n");
|
log_puts(": write blocked at cycle start, sync error\n");
|
||||||
panic();
|
/* don't panic since playback might be ahead of recording */
|
||||||
}
|
}
|
||||||
if (log_level >= 4) {
|
if (log_level >= 4) {
|
||||||
siofile_log(f);
|
siofile_log(f);
|
||||||
|
@ -295,6 +306,7 @@ siofile_start(struct siofile *f)
|
||||||
f->todo = d->round * d->rchan * d->par.bps;
|
f->todo = d->round * d->rchan * d->par.bps;
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
f->delay = 0;
|
||||||
f->sum_utime = 0;
|
f->sum_utime = 0;
|
||||||
f->sum_wtime = 0;
|
f->sum_wtime = 0;
|
||||||
f->wtime = file_wtime;
|
f->wtime = file_wtime;
|
||||||
|
@ -368,6 +380,9 @@ siofile_run(void *arg)
|
||||||
f->state = STATE_CYCLE;
|
f->state = STATE_CYCLE;
|
||||||
break;
|
break;
|
||||||
case STATE_CYCLE:
|
case STATE_CYCLE:
|
||||||
|
#ifdef DEBUG
|
||||||
|
f->delay -= d->round;
|
||||||
|
#endif
|
||||||
dev_cycle(d);
|
dev_cycle(d);
|
||||||
if (d->mode & MODE_PLAY) {
|
if (d->mode & MODE_PLAY) {
|
||||||
f->state = STATE_PLAY;
|
f->state = STATE_PLAY;
|
||||||
|
|
|
@ -81,7 +81,7 @@
|
||||||
#define DEFAULT_DEV "rsnd/0"
|
#define DEFAULT_DEV "rsnd/0"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned int log_level = 1;
|
unsigned int log_level = 0;
|
||||||
volatile sig_atomic_t quit_flag = 0;
|
volatile sig_atomic_t quit_flag = 0;
|
||||||
|
|
||||||
char usagestr[] = "usage: sndiod [-d] [-a flag] [-b nframes] "
|
char usagestr[] = "usage: sndiod [-d] [-a flag] [-b nframes] "
|
||||||
|
|
|
@ -877,12 +877,9 @@ sock_hello(struct sock *f)
|
||||||
d = dev_bynum(p->devnum);
|
d = dev_bynum(p->devnum);
|
||||||
if (d == NULL)
|
if (d == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
if (mode & MODE_MIDIOUT)
|
midi_tag(f->midi, p->devnum);
|
||||||
f->midi->txmask = d->midi->rxmask;
|
|
||||||
if (mode & MODE_MIDIIN)
|
|
||||||
d->midi->txmask |= f->midi->rxmask;
|
|
||||||
} else if (p->devnum < 32) {
|
} else if (p->devnum < 32) {
|
||||||
midi_tag(f->midi, p->devnum - 16);
|
midi_tag(f->midi, p->devnum);
|
||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue