diff options
-rw-r--r-- | usr.bin/aucat/aproc.h | 4 | ||||
-rw-r--r-- | usr.bin/aucat/aucat.c | 8 | ||||
-rw-r--r-- | usr.bin/aucat/dev.c | 50 | ||||
-rw-r--r-- | usr.bin/aucat/midi.c | 10 |
4 files changed, 32 insertions, 40 deletions
diff --git a/usr.bin/aucat/aproc.h b/usr.bin/aucat/aproc.h index fd448b69cb6..299192514af 100644 --- a/usr.bin/aucat/aproc.h +++ b/usr.bin/aucat/aproc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: aproc.h,v 1.24 2009/10/06 18:06:55 ratchov Exp $ */ +/* $OpenBSD: aproc.h,v 1.25 2009/10/10 12:43:09 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -166,6 +166,8 @@ struct aproc { struct { struct abuf *owner; /* current input stream */ struct timo timo; /* timout for throtteling */ +#define THRU_AUTOQUIT 1 + unsigned flags; /* bit mask of above */ } thru; struct { #define CTL_NSLOT 8 diff --git a/usr.bin/aucat/aucat.c b/usr.bin/aucat/aucat.c index 80975cdc04e..792684ad3c2 100644 --- a/usr.bin/aucat/aucat.c +++ b/usr.bin/aucat/aucat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aucat.c,v 1.70 2009/10/10 11:58:41 ratchov Exp $ */ +/* $OpenBSD: aucat.c,v 1.71 2009/10/10 12:43:09 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -707,6 +707,8 @@ midicat_main(int argc, char **argv) filelist_init(); dev_thruinit(); + if (!l_flag) + dev_midi->u.thru.flags |= THRU_AUTOQUIT; if ((!SLIST_EMPTY(&ifiles) || !SLIST_EMPTY(&ofiles)) && SLIST_EMPTY(&dfiles)) { farg_add(&dfiles, &aparams_none, &aparams_none, @@ -774,8 +776,6 @@ midicat_main(int argc, char **argv) if (quit_flag) { break; } - if (!l_flag && LIST_EMPTY(&dev_midi->ibuflist)) - break; if (!file_poll()) break; } @@ -784,7 +784,7 @@ midicat_main(int argc, char **argv) if (rmdir(base) < 0) warn("rmdir(\"%s\")", base); } - dev_thrudone(); + dev_done(); filelist_done(); unsetsig(); return 0; diff --git a/usr.bin/aucat/dev.c b/usr.bin/aucat/dev.c index f03a3474be9..0e21398b0c0 100644 --- a/usr.bin/aucat/dev.c +++ b/usr.bin/aucat/dev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dev.c,v 1.33 2009/10/10 11:58:41 ratchov Exp $ */ +/* $OpenBSD: dev.c,v 1.34 2009/10/10 12:43:09 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -43,32 +43,6 @@ dev_thruinit(void) } /* - * Terminate the MIDI thru box - */ -void -dev_thrudone(void) -{ - struct file *f; - - restart: - LIST_FOREACH(f, &file_list, entry) { - if (f->rproc && aproc_depend(dev_midi, f->rproc)) { - file_eof(f); - goto restart; - } - } - while (!LIST_EMPTY(&dev_midi->ibuflist)) { - if (!file_poll()) - break; - } - dev_midi->refs--; - aproc_del(dev_midi); - dev_midi = NULL; - while (file_poll()) - ; /* nothing */ -} - -/* * Attach a bi-directional MIDI stream to the MIDI device */ void @@ -264,13 +238,15 @@ dev_done(void) struct file *f; if (dev_midi) { - /* - * We don't have the necessary bits to drain - * control MIDI device, so just kill it - */ - dev_midi->refs--; - aproc_del(dev_midi); - dev_midi = NULL; + dev_midi->u.mix.flags |= THRU_AUTOQUIT; + restart_midi: + LIST_FOREACH(f, &file_list, entry) { + if (f->rproc && + aproc_depend(dev_midi, f->rproc)) { + file_eof(f); + goto restart_midi; + } + } } if (dev_mix) { /* @@ -331,6 +307,12 @@ dev_done(void) aproc_del(dev_rec); dev_rec = NULL; } + if (dev_midi) { + dev_midi->refs--; + if (dev_midi->zomb) + aproc_del(dev_midi); + dev_midi = NULL; + } for (;;) { if (!file_poll()) break; diff --git a/usr.bin/aucat/midi.c b/usr.bin/aucat/midi.c index 0e794305a36..2a2f9c8c813 100644 --- a/usr.bin/aucat/midi.c +++ b/usr.bin/aucat/midi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: midi.c,v 1.10 2009/10/09 16:49:48 ratchov Exp $ */ +/* $OpenBSD: midi.c,v 1.11 2009/10/10 12:43:09 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -225,11 +225,19 @@ thru_out(struct aproc *p, struct abuf *obuf) void thru_eof(struct aproc *p, struct abuf *ibuf) { + if (!(p->u.thru.flags & THRU_AUTOQUIT)) + return; + if (LIST_EMPTY(&p->obuflist) || LIST_EMPTY(&p->ibuflist)) + aproc_del(p); } void thru_hup(struct aproc *p, struct abuf *obuf) { + if (!(p->u.thru.flags & THRU_AUTOQUIT)) + return; + if (LIST_EMPTY(&p->obuflist) || LIST_EMPTY(&p->ibuflist)) + aproc_del(p); } void |