version 1.61, 2011/11/15 08:05:22 |
version 1.62, 2011/11/20 22:54:51 |
|
|
}; |
}; |
static char *rstates[] = { "rdat", "rmsg", "rret" }; |
static char *rstates[] = { "rdat", "rmsg", "rret" }; |
static char *wstates[] = { "widl", "wmsg", "wdat" }; |
static char *wstates[] = { "widl", "wmsg", "wdat" }; |
struct aproc *midi; |
|
|
|
midi = f->dev ? f->dev->midi : NULL; |
if (f->slot >= 0) { |
if (f->slot >= 0 && APROC_OK(midi)) { |
dbg_puts(f->dev->slot[f->slot].name); |
dbg_puts(midi->u.ctl.slot[f->slot].name); |
dbg_putu(f->dev->slot[f->slot].unit); |
dbg_putu(midi->u.ctl.slot[f->slot].unit); |
|
} else |
} else |
dbg_puts(f->pipe.file.name); |
dbg_puts(f->pipe.file.name); |
dbg_puts("/"); |
dbg_puts("/"); |
|
|
f->pipe.file.rproc = NULL; |
f->pipe.file.rproc = NULL; |
if (f->pipe.file.wproc) { |
if (f->pipe.file.wproc) { |
if (f->slot >= 0) |
if (f->slot >= 0) |
ctl_slotdel(f->dev->midi, f->slot); |
dev_slotdel(f->dev, f->slot); |
aproc_del(f->pipe.file.wproc); |
aproc_del(f->pipe.file.wproc); |
file_del(&f->pipe.file); |
file_del(&f->pipe.file); |
} |
} |
|
|
f->pipe.file.wproc = NULL; |
f->pipe.file.wproc = NULL; |
if (f->pipe.file.rproc) { |
if (f->pipe.file.rproc) { |
if (f->slot >= 0) |
if (f->slot >= 0) |
ctl_slotdel(f->dev->midi, f->slot); |
dev_slotdel(f->dev, f->slot); |
aproc_del(f->pipe.file.rproc); |
aproc_del(f->pipe.file.rproc); |
file_del(&f->pipe.file); |
file_del(&f->pipe.file); |
} |
} |
|
|
wbuf = LIST_FIRST(&f->pipe.file.wproc->ins); |
wbuf = LIST_FIRST(&f->pipe.file.wproc->ins); |
rbuf = LIST_FIRST(&f->pipe.file.rproc->outs); |
rbuf = LIST_FIRST(&f->pipe.file.rproc->outs); |
if (rbuf || wbuf) |
if (rbuf || wbuf) |
ctl_slotstop(f->dev->midi, f->slot); |
dev_slotstop(f->dev, f->slot); |
if (rbuf) |
if (rbuf) |
abuf_eof(rbuf); |
abuf_eof(rbuf); |
if (wbuf) |
if (wbuf) |
|
|
f->pstate = SOCK_START; |
f->pstate = SOCK_START; |
} else { |
} else { |
f->pstate = SOCK_READY; |
f->pstate = SOCK_READY; |
if (ctl_slotstart(f->dev->midi, f->slot)) |
if (dev_slotstart(f->dev, f->slot)) |
(void)sock_attach(f, 0); |
(void)sock_attach(f, 0); |
} |
} |
} |
} |
|
|
switch (f->pstate) { |
switch (f->pstate) { |
case SOCK_START: |
case SOCK_START: |
case SOCK_READY: |
case SOCK_READY: |
if (ctl_slotstart(f->dev->midi, f->slot)) { |
if (dev_slotstart(f->dev, f->slot)) { |
(void)sock_attach(f, 1); |
(void)sock_attach(f, 1); |
f->pstate = SOCK_RUN; |
f->pstate = SOCK_RUN; |
} |
} |
|
|
} |
} |
#ifdef DEBUG |
#ifdef DEBUG |
if (debug_level >= 2) { |
if (debug_level >= 2) { |
if (APROC_OK(f->dev->midi)) { |
dbg_puts(f->dev->slot[f->slot].name); |
dbg_puts(f->dev->midi->u.ctl.slot[f->slot].name); |
dbg_putu(f->dev->slot[f->slot].unit); |
dbg_putu(f->dev->midi->u.ctl.slot[f->slot].unit); |
|
} else |
|
dbg_puts(f->pipe.file.name); |
|
dbg_puts(": buffer size = "); |
dbg_puts(": buffer size = "); |
dbg_putu(f->bufsz); |
dbg_putu(f->bufsz); |
if (f->mode & MODE_PLAY) { |
if (f->mode & MODE_PLAY) { |
|
|
f->xrun = (f->opt->mmc) ? XRUN_SYNC : XRUN_IGNORE; |
f->xrun = (f->opt->mmc) ? XRUN_SYNC : XRUN_IGNORE; |
f->bufsz = f->dev->bufsz; |
f->bufsz = f->dev->bufsz; |
f->round = f->dev->round; |
f->round = f->dev->round; |
f->slot = ctl_slotnew(f->dev->midi, p->who, |
f->slot = dev_slotnew(f->dev, p->who, &ctl_sockops, f, f->opt->mmc); |
&ctl_sockops, f, |
|
f->opt->mmc); |
|
if (f->slot < 0) |
if (f->slot < 0) |
return 0; |
return 0; |
f->pstate = SOCK_INIT; |
f->pstate = SOCK_INIT; |
|
|
* see how this is fixed in wav.c |
* see how this is fixed in wav.c |
*/ |
*/ |
if ((f->pstate == SOCK_START || f->pstate == SOCK_READY) && |
if ((f->pstate == SOCK_START || f->pstate == SOCK_READY) && |
ctl_slotstart(f->dev->midi, f->slot)) |
dev_slotstart(f->dev, f->slot)) |
(void)sock_attach(f, 1); |
(void)sock_attach(f, 1); |
if (f->wstate != SOCK_WDATA || f->wtodo == 0) |
if (f->wstate != SOCK_WDATA || f->wtodo == 0) |
sock_freebuf(f); |
sock_freebuf(f); |
|
|
} |
} |
sock_setvol(f, ctl); |
sock_setvol(f, ctl); |
if (f->slot >= 0) |
if (f->slot >= 0) |
ctl_slotvol(f->dev->midi, f->slot, ctl); |
dev_slotvol(f->dev, f->slot, ctl); |
f->rtodo = sizeof(struct amsg); |
f->rtodo = sizeof(struct amsg); |
f->rstate = SOCK_RMSG; |
f->rstate = SOCK_RMSG; |
break; |
break; |
|
|
} |
} |
/* |
/* |
* XXX: sock_attach() may not start if there's not enough |
* XXX: sock_attach() may not start if there's not enough |
* samples queued, if so ctl_slotstart() will trigger |
* samples queued, if so dev_slotstart() will trigger |
* other streams, but this one won't start. |
* other streams, but this one won't start. |
*/ |
*/ |
if (f->pstate == SOCK_READY && ctl_slotstart(f->dev->midi, f->slot)) |
if (f->pstate == SOCK_READY && dev_slotstart(f->dev, f->slot)) |
(void)sock_attach(f, 0); |
(void)sock_attach(f, 0); |
break; |
break; |
case SOCK_RRET: |
case SOCK_RRET: |