mirror of https://github.com/ericonr/sndio.git
make midi_in handle input in a single shot
This commit is contained in:
parent
b45b76b8e0
commit
a00c38b091
|
@ -249,46 +249,12 @@ midi_fill(struct midi *oep)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
midi_in(struct midi *iep)
|
midi_parse(struct midi *iep, unsigned char *idata, int icount)
|
||||||
{
|
{
|
||||||
unsigned char c, *idata;
|
int i;
|
||||||
int i, icount, maxavail, avail;
|
unsigned char c;
|
||||||
struct midi *oep;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* calculate the max message size we can process
|
|
||||||
*/
|
|
||||||
maxavail = MIDI_BUFSZ;
|
|
||||||
for (i = 0; i < MIDI_NEP ; i++) {
|
|
||||||
if ((iep->txmask & (1 << i)) == 0)
|
|
||||||
continue;
|
|
||||||
oep = midi_ep + i;
|
|
||||||
avail = oep->obuf.len - oep->obuf.used;
|
|
||||||
if (maxavail > avail)
|
|
||||||
maxavail = avail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* in the works case output message is twice the
|
|
||||||
* input message (2-byte messages with running status)
|
|
||||||
*/
|
|
||||||
maxavail /= 2;
|
|
||||||
|
|
||||||
idata = abuf_rgetblk(&iep->ibuf, &icount);
|
|
||||||
if (icount > maxavail)
|
|
||||||
icount = maxavail;
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (log_level >= 4) {
|
|
||||||
midi_log(iep);
|
|
||||||
log_puts(": in:");
|
|
||||||
for (i = 0; i < icount; i++) {
|
|
||||||
log_puts(" ");
|
|
||||||
log_putx(idata[i]);
|
|
||||||
}
|
|
||||||
log_puts("\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
for (i = 0; i < icount; i++) {
|
for (i = 0; i < icount; i++) {
|
||||||
c = *idata++;
|
c = *idata++;
|
||||||
if (c >= 0xf8) {
|
if (c >= 0xf8) {
|
||||||
|
@ -327,8 +293,57 @@ midi_in(struct midi *iep)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
midi_in(struct midi *iep)
|
||||||
|
{
|
||||||
|
unsigned char *idata;
|
||||||
|
int i, icount, maxavail, avail, idone;
|
||||||
|
struct midi *oep;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* calculate the max message size we can process
|
||||||
|
*/
|
||||||
|
maxavail = MIDI_BUFSZ;
|
||||||
|
for (i = 0; i < MIDI_NEP ; i++) {
|
||||||
|
if ((iep->txmask & (1 << i)) == 0)
|
||||||
|
continue;
|
||||||
|
oep = midi_ep + i;
|
||||||
|
avail = oep->obuf.len - oep->obuf.used;
|
||||||
|
if (maxavail > avail)
|
||||||
|
maxavail = avail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* in the works case output message is twice the
|
||||||
|
* input message (2-byte messages with running status)
|
||||||
|
*/
|
||||||
|
maxavail /= 2;
|
||||||
|
idone = 0;
|
||||||
|
for (;;) {
|
||||||
|
idata = abuf_rgetblk(&iep->ibuf, &icount);
|
||||||
|
if (icount > maxavail)
|
||||||
|
icount = maxavail;
|
||||||
|
if (icount == 0)
|
||||||
|
break;
|
||||||
|
maxavail -= icount;
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (log_level >= 4) {
|
||||||
|
midi_log(iep);
|
||||||
|
log_puts(": in:");
|
||||||
|
for (i = 0; i < icount; i++) {
|
||||||
|
log_puts(" ");
|
||||||
|
log_putx(idata[i]);
|
||||||
|
}
|
||||||
|
log_puts("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
midi_parse(iep, idata, icount);
|
||||||
abuf_rdiscard(&iep->ibuf, icount);
|
abuf_rdiscard(&iep->ibuf, icount);
|
||||||
return icount;
|
idone += icount;
|
||||||
|
}
|
||||||
|
return idone;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -99,8 +99,7 @@ port_mio_in(void *arg)
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
break;
|
break;
|
||||||
abuf_wcommit(&ep->ibuf, n);
|
abuf_wcommit(&ep->ibuf, n);
|
||||||
while (midi_in(ep))
|
midi_in(ep);
|
||||||
; /* nothing */
|
|
||||||
if (n < count)
|
if (n < count)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -565,13 +565,8 @@ sock_rdata(struct sock *f)
|
||||||
#endif
|
#endif
|
||||||
if (f->slot)
|
if (f->slot)
|
||||||
slot_write(f->slot);
|
slot_write(f->slot);
|
||||||
if (f->midi) {
|
if (f->midi)
|
||||||
count = f->midi->ibuf.used;
|
f->fillpending += midi_in(f->midi);
|
||||||
while (midi_in(f->midi))
|
|
||||||
; /* nothing */
|
|
||||||
count -= f->midi->ibuf.used;
|
|
||||||
f->fillpending += count;
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue