From 426a9064fa68c634cfe1545669e1af7698c2ebd8 Mon Sep 17 00:00:00 2001 From: Alexandre Ratchov Date: Mon, 11 Jun 2018 19:53:02 +0200 Subject: [PATCH] sndiod: Initialize slot with parameters from the opt struct. --- sndiod/dev.c | 38 +++++++++++++++++++++++++++----------- sndiod/dev.h | 3 ++- sndiod/sock.c | 31 +------------------------------ 3 files changed, 30 insertions(+), 42 deletions(-) diff --git a/sndiod/dev.c b/sndiod/dev.c index 0af1089..ba90580 100644 --- a/sndiod/dev.c +++ b/sndiod/dev.c @@ -74,7 +74,6 @@ void dev_mmcstop(struct dev *); void dev_mmcloc(struct dev *, unsigned int); void slot_log(struct slot *); -struct slot *slot_new(struct dev *, char *, struct slotops *, void *, int); void slot_del(struct slot *); void slot_setvol(struct slot *, unsigned int); void slot_attach(struct slot *); @@ -1547,7 +1546,8 @@ slot_freebufs(struct slot *s) * allocate a new slot and register the given call-backs */ struct slot * -slot_new(struct dev *d, char *who, struct slotops *ops, void *arg, int mode) +slot_new(struct dev *d, struct opt *opt, char *who, + struct slotops *ops, void *arg, int mode) { char *p; char name[SLOT_NAMEMAX]; @@ -1642,6 +1642,17 @@ slot_new(struct dev *d, char *who, struct slotops *ops, void *arg, int mode) #endif found: + if ((mode & MODE_REC) && (opt->mode & MODE_MON)) { + mode |= MODE_MON; + mode &= ~MODE_REC; + } + if ((mode & opt->mode) != mode) { + if (log_level >= 1) { + slot_log(s); + log_puts(": requested mode not allowed\n"); + } + return 0; + } if (!dev_ref(d)) return NULL; if ((mode & d->mode) != mode) { @@ -1653,27 +1664,32 @@ found: return 0; } s->dev = d; + s->opt = opt; s->ops = ops; s->arg = arg; s->pstate = SLOT_INIT; - s->tstate = MMC_OFF; s->mode = mode; aparams_init(&s->par); if (s->mode & MODE_PLAY) { - s->mix.slot_cmin = s->mix.dev_cmin = 0; - s->mix.slot_cmax = s->mix.dev_cmax = d->pchan - 1; + s->mix.slot_cmin = s->mix.dev_cmin = s->opt->pmin; + s->mix.slot_cmax = s->mix.dev_cmax = s->opt->pmax; } if (s->mode & MODE_RECMASK) { - s->sub.slot_cmin = s->sub.dev_cmin = 0; - s->sub.slot_cmax = s->sub.dev_cmax = - ((s->mode & MODE_MON) ? d->pchan : d->rchan) - 1; + s->sub.slot_cmin = s->sub.dev_cmin = s->opt->rmin; + s->sub.slot_cmax = s->sub.dev_cmax = s->opt->rmax; } - s->xrun = XRUN_IGNORE; - s->dup = 0; + if (s->opt->mmc) { + s->xrun = XRUN_SYNC; + s->tstate = MMC_STOP; + } else { + s->xrun = XRUN_IGNORE; + s->tstate = MMC_OFF; + } + s->mix.maxweight = s->opt->maxweight; + s->dup = s->opt->dup; s->appbufsz = d->bufsz; s->round = d->round; s->rate = d->rate; - s->mix.maxweight = ADATA_UNIT; dev_midi_slotdesc(d, s); dev_midi_vol(d, s); return s; diff --git a/sndiod/dev.h b/sndiod/dev.h index 103180c..24296ea 100644 --- a/sndiod/dev.h +++ b/sndiod/dev.h @@ -237,7 +237,8 @@ void dev_midi_vol(struct dev *, struct slot *); * sio_open(3) like interface for clients */ void slot_log(struct slot *); -struct slot *slot_new(struct dev *, char *, struct slotops *, void *, int); +struct slot *slot_new(struct dev *, struct opt *, char *, + struct slotops *, void *, int); void slot_del(struct slot *); void slot_setvol(struct slot *, unsigned int); void slot_start(struct slot *); diff --git a/sndiod/sock.c b/sndiod/sock.c index bba2692..3074f08 100644 --- a/sndiod/sock.c +++ b/sndiod/sock.c @@ -861,39 +861,10 @@ sock_hello(struct sock *f) log_puts("\n"); } #endif - if ((mode & MODE_REC) && (opt->mode & MODE_MON)) { - mode |= MODE_MON; - mode &= ~MODE_REC; - } - if ((mode & opt->mode) != mode) { - if (log_level >= 1) { - sock_log(f); - log_puts(": requested mode not allowed\n"); - } - return 0; - } - s = slot_new(d, p->who, &sock_slotops, f, mode); + s = slot_new(d, opt, p->who, &sock_slotops, f, mode); if (s == NULL) return 0; - s->opt = opt; f->midi = NULL; - if (s->mode & MODE_PLAY) { - s->mix.slot_cmin = s->mix.dev_cmin = s->opt->pmin; - s->mix.slot_cmax = s->mix.dev_cmax = s->opt->pmax; - } - if (s->mode & MODE_RECMASK) { - s->sub.slot_cmin = s->sub.dev_cmin = s->opt->rmin; - s->sub.slot_cmax = s->sub.dev_cmax = s->opt->rmax; - } - if (s->opt->mmc) { - s->xrun = XRUN_SYNC; - s->tstate = MMC_STOP; - } else { - s->xrun = XRUN_IGNORE; - s->tstate = MMC_OFF; - } - s->mix.maxweight = s->opt->maxweight; - s->dup = s->opt->dup; f->slot = s; return 1; }