mirror of https://github.com/ericonr/sndio.git
Disconnect MIDI clients controlling disconnected audio device
This commit is contained in:
parent
ea692625ea
commit
2cd5b8e0ab
|
@ -1275,6 +1275,8 @@ dev_abort(struct dev *d)
|
|||
c->ops = NULL;
|
||||
}
|
||||
|
||||
midi_abort(d->midi);
|
||||
|
||||
if (d->pstate != DEV_CFG)
|
||||
dev_close(d);
|
||||
}
|
||||
|
|
|
@ -418,6 +418,22 @@ midi_out(struct midi *oep, unsigned char *idata, int icount)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* disconnect clients attached to this end-point
|
||||
*/
|
||||
void
|
||||
midi_abort(struct midi *p)
|
||||
{
|
||||
int i;
|
||||
struct midi *ep;
|
||||
|
||||
for (i = 0; i < MIDI_NEP; i++) {
|
||||
ep = midi_ep + i;
|
||||
if ((ep->txmask & p->self) || (p->txmask & ep->self))
|
||||
ep->ops->exit(ep->arg);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
port_log(struct port *p)
|
||||
{
|
||||
|
@ -563,23 +579,6 @@ port_open(struct port *c)
|
|||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
port_abort(struct port *c)
|
||||
{
|
||||
int i;
|
||||
struct midi *ep;
|
||||
|
||||
for (i = 0; i < MIDI_NEP; i++) {
|
||||
ep = midi_ep + i;
|
||||
if ((ep->txmask & c->midi->self) ||
|
||||
(c->midi->txmask & ep->self))
|
||||
ep->ops->exit(ep->arg);
|
||||
}
|
||||
|
||||
if (c->state != PORT_CFG)
|
||||
port_close(c);
|
||||
}
|
||||
|
||||
int
|
||||
port_close(struct port *c)
|
||||
{
|
||||
|
|
|
@ -112,6 +112,7 @@ void midi_fill(struct midi *);
|
|||
void midi_tag(struct midi *, unsigned int);
|
||||
unsigned int midi_tags(struct midi *);
|
||||
void midi_link(struct midi *, struct midi *);
|
||||
void midi_abort(struct midi *);
|
||||
|
||||
void port_log(struct port *);
|
||||
struct port *port_new(char *, unsigned int, int);
|
||||
|
@ -124,6 +125,5 @@ void port_done(struct port *);
|
|||
void port_drain(struct port *);
|
||||
int port_close(struct port *);
|
||||
int port_reopen(struct port *);
|
||||
void port_abort(struct port *);
|
||||
|
||||
#endif /* !defined(MIDI_H) */
|
||||
|
|
|
@ -186,6 +186,9 @@ port_mio_hup(void *arg)
|
|||
{
|
||||
struct port *p = arg;
|
||||
|
||||
if (!port_reopen(p))
|
||||
port_abort(p);
|
||||
if (!port_reopen(p)) {
|
||||
midi_abort(p->midi);
|
||||
if (p->state != PORT_CFG)
|
||||
port_close(p);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue