Disconnect MIDI clients controlling disconnected audio device

This commit is contained in:
Alexandre Ratchov 2021-01-16 11:56:41 +01:00
parent ea692625ea
commit 2cd5b8e0ab
4 changed files with 24 additions and 20 deletions

View File

@ -1275,6 +1275,8 @@ dev_abort(struct dev *d)
c->ops = NULL;
}
midi_abort(d->midi);
if (d->pstate != DEV_CFG)
dev_close(d);
}

View File

@ -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)
{

View File

@ -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) */

View File

@ -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);
}
}