From 41b3188fd40b09bcb45e44d730e809c920234db7 Mon Sep 17 00:00:00 2001 From: Alexandre Ratchov Date: Tue, 4 Sep 2012 12:48:45 +0200 Subject: [PATCH] move data outside dsp states, generate silence with enc_sil_do --- sndiod/dev.c | 40 +++++++++++++++++++++------------------- sndiod/dev.h | 10 ++++++---- sndiod/dsp.h | 2 -- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/sndiod/dev.c b/sndiod/dev.c index 2d412fa..bb3d521 100644 --- a/sndiod/dev.c +++ b/sndiod/dev.c @@ -444,7 +444,7 @@ dev_midi_omsg(void *arg, unsigned char *msg, int len) fps = 30; break; default: - /* XXX: should dev_mmcstop() here */ + dev_mmcstop(d); return; } dev_mmcloc(d, @@ -509,8 +509,10 @@ slot_sub_sil(struct slot *s) log_puts(": inserted a rec block of silence\n"); } #endif - /* XXX: this is not silence for all encodings */ - memset(data, 0, s->round * s->sub.buf.bpf); + if (s->sub.encbuf) + enc_sil_do(&s->sub.enc, data, s->round); + else + memset(data, 0, s->round * s->sub.buf.bpf); abuf_wcommit(&s->sub.buf, s->round); s->sub.silence--; } @@ -531,10 +533,10 @@ play_filt_resamp(struct slot *s, void *res_in, void *out, int todo) int i, offs, vol, nch; void *in; - if (s->mix.resamp.data) { + if (s->mix.resampbuf) { todo = resamp_do(&s->mix.resamp, - res_in, s->mix.resamp.data, todo); - in = s->mix.resamp.data; + res_in, s->mix.resampbuf, todo); + in = s->mix.resampbuf; } else in = res_in; @@ -564,7 +566,7 @@ play_filt_dec(struct slot *s, void *in, void *out, int todo) { void *tmp; - tmp = s->mix.dec.data; + tmp = s->mix.decbuf; if (tmp) dec_do(&s->mix.dec, in, tmp, todo); return play_filt_resamp(s, tmp ? tmp : in, out, todo); @@ -735,7 +737,7 @@ rec_filt_resamp(struct slot *s, void *in, void *res_out, int todo) int i, vol, offs, nch; void *out = res_out; - out = (s->sub.resamp.data) ? s->sub.resamp.data : res_out; + out = (s->sub.resampbuf) ? s->sub.resampbuf : res_out; nch = s->sub.slot_cmax - s->sub.slot_cmin + 1; vol = ADATA_UNIT / s->sub.join; @@ -751,9 +753,9 @@ rec_filt_resamp(struct slot *s, void *in, void *res_out, int todo) offs += nch; cmap_copy(&s->sub.cmap, in, (adata_t *)out + offs, vol, todo); } - if (s->sub.resamp.data) { + if (s->sub.resampbuf) { todo = resamp_do(&s->sub.resamp, - s->sub.resamp.data, res_out, todo); + s->sub.resampbuf, res_out, todo); } return todo; } @@ -763,7 +765,7 @@ rec_filt_enc(struct slot *s, void *in, void *out, int todo) { void *tmp; - tmp = s->sub.enc.data; + tmp = s->sub.encbuf; todo = rec_filt_resamp(s, in, tmp ? tmp : out, todo); if (tmp) enc_do(&s->sub.enc, tmp, out, todo); @@ -1641,8 +1643,8 @@ slot_attach(struct slot *s) round = dev_roundof(d, s->rate); slot_nch = s->mix.slot_cmax - s->mix.slot_cmin + 1; dev_nch = s->mix.dev_cmax - s->mix.dev_cmin + 1; - s->mix.dec.data = NULL; - s->mix.resamp.data = NULL; + s->mix.decbuf = NULL; + s->mix.resampbuf = NULL; s->mix.join = 1; s->mix.expand = 1; if (s->dup) { @@ -1658,12 +1660,12 @@ slot_attach(struct slot *s) s->mix.dev_cmin, s->mix.dev_cmax); if (!aparams_native(&s->par)) { dec_init(&s->mix.dec, &s->par, slot_nch); - s->mix.dec.data = + s->mix.decbuf = xmalloc(d->round * slot_nch * sizeof(adata_t)); } if (s->rate != d->rate) { resamp_init(&s->mix.resamp, s->round, d->round, slot_nch); - s->mix.resamp.data = + s->mix.resampbuf = xmalloc(d->round * slot_nch * sizeof(adata_t)); } #ifdef DEBUG @@ -1696,8 +1698,8 @@ slot_attach(struct slot *s) nblk = (d->bufsz / d->round + 3) / 4; slot_nch = s->sub.slot_cmax - s->sub.slot_cmin + 1; dev_nch = s->sub.dev_cmax - s->sub.dev_cmin + 1; - s->sub.enc.data = NULL; - s->sub.resamp.data = NULL; + s->sub.encbuf = NULL; + s->sub.resampbuf = NULL; s->sub.join = 1; s->sub.expand = 1; if (s->dup) { @@ -1714,12 +1716,12 @@ slot_attach(struct slot *s) if (s->rate != d->rate) { resamp_init(&s->sub.resamp, d->round, s->round, slot_nch); - s->sub.resamp.data = + s->sub.resampbuf = xmalloc(d->round * slot_nch * sizeof(adata_t)); } if (!aparams_native(&s->par)) { enc_init(&s->sub.enc, &s->par, slot_nch); - s->sub.enc.data = + s->sub.encbuf = xmalloc(d->round * slot_nch * sizeof(adata_t)); } diff --git a/sndiod/dev.h b/sndiod/dev.h index a9b2e4d..99cd6a1 100644 --- a/sndiod/dev.h +++ b/sndiod/dev.h @@ -56,8 +56,9 @@ struct slot { struct cmap cmap; /* channel mapper state */ struct resamp resamp; /* resampler state */ struct conv dec; /* format decoder params */ - int join; /* remix count */ - int expand; /* remix count */ + int join; /* channel join factor */ + int expand; /* channel expand factor */ + void *resampbuf, *decbuf; /* tmp buffers */ } mix; struct { int silence; /* to add on next write */ @@ -67,8 +68,9 @@ struct slot { struct cmap cmap; /* channel mapper state */ struct resamp resamp; /* buffer for resampling */ struct conv enc; /* buffer for encoding */ - int join; /* remix count */ - int expand; /* remix count */ + int join; /* channel join factor */ + int expand; /* channel expand factor */ + void *resampbuf, *encbuf; /* tmp buffers */ } sub; int xrun; /* underrun policy */ int dup; /* mono-to-stereo and alike */ diff --git a/sndiod/dsp.h b/sndiod/dsp.h index 49cc122..9f81f84 100644 --- a/sndiod/dsp.h +++ b/sndiod/dsp.h @@ -111,7 +111,6 @@ struct aparams { }; struct resamp { - void *data; #define RESAMP_NCTX 2 unsigned int ctx_start; adata_t ctx[NCHAN_MAX * RESAMP_NCTX]; @@ -122,7 +121,6 @@ struct resamp { }; struct conv { - void *data; int bfirst; /* bytes to skip at startup */ unsigned int bps; /* bytes per sample */ unsigned int shift; /* shift to get 32bit MSB */