diff options
author | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2021-04-28 05:05:06 +0000 |
---|---|---|
committer | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2021-04-28 05:05:06 +0000 |
commit | ed3240c00855b0d258829ec7e174a0babe2c76a9 (patch) | |
tree | 4037a93589209c8e45677db2e31aad226c1f00da /usr.bin/sndiod | |
parent | aa23995bbd62e2d01b6d548caeaeb201bfefd269 (diff) |
sndiod: Allocate (free) conversion buffers in slot_attach (slot_detach)
Besides being better coding style, this allows a client to be detached
and then attached to a device with different parameters.
Diffstat (limited to 'usr.bin/sndiod')
-rw-r--r-- | usr.bin/sndiod/dev.c | 75 |
1 files changed, 40 insertions, 35 deletions
diff --git a/usr.bin/sndiod/dev.c b/usr.bin/sndiod/dev.c index 4135f3c1d06..14c0e9ea0ad 100644 --- a/usr.bin/sndiod/dev.c +++ b/usr.bin/sndiod/dev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dev.c,v 1.99 2021/03/10 08:22:25 ratchov Exp $ */ +/* $OpenBSD: dev.c,v 1.100 2021/04/28 05:05:05 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov <alex@caoua.org> * @@ -1560,12 +1560,18 @@ slot_initconv(struct slot *s) s->opt->pmin, s->opt->pmin + s->mix.nch - 1, 0, d->pchan - 1, s->opt->pmin, s->opt->pmax); + s->mix.decbuf = NULL; + s->mix.resampbuf = NULL; if (!aparams_native(&s->par)) { dec_init(&s->mix.dec, &s->par, s->mix.nch); + s->mix.decbuf = + xmalloc(s->round * s->mix.nch * sizeof(adata_t)); } if (s->rate != d->rate) { resamp_init(&s->mix.resamp, s->round, d->round, s->mix.nch); + s->mix.resampbuf = + xmalloc(d->round * s->mix.nch * sizeof(adata_t)); } s->mix.join = 1; s->mix.expand = 1; @@ -1584,6 +1590,8 @@ slot_initconv(struct slot *s) unsigned int outchan = (s->mode & MODE_MON) ? d->pchan : d->rchan; + s->sub.encbuf = NULL; + s->sub.resampbuf = NULL; cmap_init(&s->sub.cmap, 0, outchan - 1, s->opt->rmin, s->opt->rmax, @@ -1592,9 +1600,13 @@ slot_initconv(struct slot *s) if (s->rate != d->rate) { resamp_init(&s->sub.resamp, d->round, s->round, s->sub.nch); + s->sub.resampbuf = + xmalloc(d->round * s->sub.nch * sizeof(adata_t)); } if (!aparams_native(&s->par)) { enc_init(&s->sub.enc, &s->par, s->sub.nch); + s->sub.encbuf = + xmalloc(s->round * s->sub.nch * sizeof(adata_t)); } s->sub.join = 1; s->sub.expand = 1; @@ -1633,42 +1645,16 @@ slot_initconv(struct slot *s) void slot_allocbufs(struct slot *s) { - struct dev *d = s->opt->dev; - if (s->mode & MODE_PLAY) { s->mix.bpf = s->par.bps * s->mix.nch; abuf_init(&s->mix.buf, s->appbufsz * s->mix.bpf); - - s->mix.decbuf = NULL; - s->mix.resampbuf = NULL; - if (!aparams_native(&s->par)) { - s->mix.decbuf = - xmalloc(s->round * s->mix.nch * sizeof(adata_t)); - } - if (s->rate != d->rate) { - s->mix.resampbuf = - xmalloc(d->round * s->mix.nch * sizeof(adata_t)); - } } if (s->mode & MODE_RECMASK) { s->sub.bpf = s->par.bps * s->sub.nch; abuf_init(&s->sub.buf, s->appbufsz * s->sub.bpf); - - s->sub.encbuf = NULL; - s->sub.resampbuf = NULL; - if (s->rate != d->rate) { - s->sub.resampbuf = - xmalloc(d->round * s->sub.nch * sizeof(adata_t)); - } - if (!aparams_native(&s->par)) { - s->sub.encbuf = - xmalloc(s->round * s->sub.nch * sizeof(adata_t)); - } } - slot_initconv(s); - #ifdef DEBUG if (log_level >= 3) { slot_log(s); @@ -1689,18 +1675,10 @@ slot_freebufs(struct slot *s) { if (s->mode & MODE_RECMASK) { abuf_done(&s->sub.buf); - if (s->sub.encbuf) - xfree(s->sub.encbuf); - if (s->sub.resampbuf) - xfree(s->sub.resampbuf); } if (s->mode & MODE_PLAY) { abuf_done(&s->mix.buf); - if (s->mix.decbuf) - xfree(s->mix.decbuf); - if (s->mix.resampbuf) - xfree(s->mix.resampbuf); } } @@ -1903,6 +1881,11 @@ slot_attach(struct slot *s) long long pos; /* + * setup converions layer + */ + slot_initconv(s); + + /* * start the device if not started */ dev_wakeup(d); @@ -2076,6 +2059,28 @@ slot_detach(struct slot *s) #endif if (s->mode & MODE_PLAY) dev_mix_adjvol(d); + + if (s->mode & MODE_RECMASK) { + if (s->sub.encbuf) { + xfree(s->sub.encbuf); + s->sub.encbuf = NULL; + } + if (s->sub.resampbuf) { + xfree(s->sub.resampbuf); + s->sub.resampbuf = NULL; + } + } + + if (s->mode & MODE_PLAY) { + if (s->mix.decbuf) { + xfree(s->mix.decbuf); + s->mix.decbuf = NULL; + } + if (s->mix.resampbuf) { + xfree(s->mix.resampbuf); + s->mix.resampbuf = NULL; + } + } } /* |