When the audio device is closed, mark it as closed before

dropping connections otherwise clients may try to drain their
buffer and would attempt to reopen the device
This commit is contained in:
Alexandre Ratchov 2012-11-30 21:49:52 +01:00
parent 2834345924
commit ccdecf59c4
1 changed files with 23 additions and 6 deletions

View File

@ -78,13 +78,24 @@ unsigned int dev_sndnum = 0;
void void
dev_log(struct dev *d) dev_log(struct dev *d)
{ {
#ifdef DEBUG
static char *pstates[] = {
"cfg", "ini", "run"
};
#endif
log_puts("snd"); log_puts("snd");
log_putu(d->num); log_putu(d->num);
#ifdef DEBUG
if (log_level >= 3) {
log_puts(" pst=");
log_puts(pstates[d->pstate]);
}
#endif
} }
void void
slot_log(struct slot *s) slot_log(struct slot *s)
{ {
#ifdef DEBUG #ifdef DEBUG
static char *pstates[] = { static char *pstates[] = {
"ini", "sta", "rdy", "run", "stp", "mid" "ini", "sta", "rdy", "run", "stp", "mid"
@ -1122,7 +1133,8 @@ dev_open(struct dev *d)
void void
dev_close(struct dev *d) dev_close(struct dev *d)
{ {
struct slot *s, *snext; int i;
struct slot *s;
#ifdef DEBUG #ifdef DEBUG
if (log_level >= 3) { if (log_level >= 3) {
@ -1130,13 +1142,13 @@ dev_close(struct dev *d)
log_puts(": closing\n"); log_puts(": closing\n");
} }
#endif #endif
while ((s = d->slot_list) != NULL) { d->pstate = DEV_CFG;
snext = s->next; for (s = d->slot, i = DEV_NSLOT; i > 0; i--, s++) {
if (s->ops) if (s->ops)
s->ops->exit(s->arg); s->ops->exit(s->arg);
s->ops = NULL; s->ops = NULL;
d->slot_list = snext;
} }
d->slot_list = NULL;
dev_sio_close(d); dev_sio_close(d);
if (d->mode & MODE_PLAY) { if (d->mode & MODE_PLAY) {
if (d->encbuf != NULL) if (d->encbuf != NULL)
@ -1149,7 +1161,6 @@ dev_close(struct dev *d)
xfree(d->rbuf); xfree(d->rbuf);
} }
dev_clear(d); dev_clear(d);
d->pstate = DEV_CFG;
} }
int int
@ -1735,6 +1746,12 @@ slot_attach(struct slot *s)
void void
slot_ready(struct slot *s) slot_ready(struct slot *s)
{ {
/*
* device may be disconnected, and if so we're called from
* slot->ops->exit() on a closed device
*/
if (s->dev->pstate == DEV_CFG)
return;
if (s->tstate == MMC_OFF) if (s->tstate == MMC_OFF)
slot_attach(s); slot_attach(s);
else { else {