=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sndiod/midi.c,v retrieving revision 1.4 retrieving revision 1.5 diff -c -r1.4 -r1.5 *** src/usr.bin/sndiod/midi.c 2012/11/30 21:04:35 1.4 --- src/usr.bin/sndiod/midi.c 2012/11/30 22:26:34 1.5 *************** *** 1,4 **** ! /* $OpenBSD: midi.c,v 1.4 2012/11/30 21:04:35 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * --- 1,4 ---- ! /* $OpenBSD: midi.c,v 1.5 2012/11/30 22:26:34 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * *************** *** 518,524 **** for (rxmask = 0, i = 0; i < MIDI_NEP; i++) rxmask |= midi_ep[i].txmask; if ((rxmask & c->midi->self) == 0 && c->state == PORT_INIT && !c->hold) ! port_close(c); } struct port * --- 518,524 ---- for (rxmask = 0, i = 0; i < MIDI_NEP; i++) rxmask |= midi_ep[i].txmask; if ((rxmask & c->midi->self) == 0 && c->state == PORT_INIT && !c->hold) ! port_drain(c); } struct port * *************** *** 571,576 **** --- 571,594 ---- return 1; } + void + port_drain(struct port *c) + { + struct midi *ep = c->midi; + + if (!(ep->mode & MODE_MIDIOUT) || ep->obuf.used == 0) + port_close(c); + else { + c->state = PORT_DRAIN; + #ifdef DEBUG + if (log_level >= 3) { + port_log(c); + log_puts(": draining\n"); + } + #endif + } + } + int port_init(struct port *c) { *************** *** 582,588 **** void port_done(struct port *c) { ! /* XXX: drain? */ ! if (c->state != PORT_CFG) ! port_close(c); } --- 600,605 ---- void port_done(struct port *c) { ! if (c->state == PORT_INIT) ! port_drain(c); }