Lines Matching +full:in +full:- +full:band
2 * by Daniel Pouzzner <douzzer@mega.nu> 2002-Oct-8
19 * in-dB1,out-dB1[,in-dB2,out-dB2...]
20 * [ gain [ initial-volume [ delay ] ] ]
25 * The input is divided into bands using 4th order Linkwitz-Riley IIRs.
26 * This is akin to the crossover of a loudspeaker, and results in flat
35 * that the predictive mode of the limiter needs some TLC - in fact, a
36 * rewrite - since what's really useful is to assure that a waveform won't
37 * be clipped, by slewing the volume in advance so that the peak is at
38 * limit (or below, if there's a higher subsequent peak visible in the
64 size_t delay_size; /* lookahead for this band (in samples) - function of delay, above */
66 size_t delay_buf_cnt; /* No. of active entries in delay_buf */
73 size_t delay_buf_size;/* Size of delay_buf in samples */
83 * The 'info' fields are not yet filled in.
103 l->attackRate = lsx_malloc(sizeof(double) * rates); in sox_mcompand_getopts_1()
104 l->decayRate = lsx_malloc(sizeof(double) * rates); in sox_mcompand_getopts_1()
105 l->volume = lsx_malloc(sizeof(double) * rates); in sox_mcompand_getopts_1()
106 l->expectedChannels = rates; in sox_mcompand_getopts_1()
107 l->delay_buf = NULL; in sox_mcompand_getopts_1()
110 them in seconds at the moment: we don't know the sample rate yet. */ in sox_mcompand_getopts_1()
114 l->attackRate[i] = atof(s); s = strtok(NULL, ","); in sox_mcompand_getopts_1()
115 l->decayRate[i] = atof(s); s = strtok(NULL, ","); in sox_mcompand_getopts_1()
119 if (!lsx_compandt_parse(&l->transfer_fn, argv[1], n>2 ? argv[2] : 0)) in sox_mcompand_getopts_1()
125 for (i = 0; i < l->expectedChannels; ++i) { in sox_mcompand_getopts_1()
127 l->volume[i] = v; in sox_mcompand_getopts_1()
130 if (n >= 5) l->delay = atof(argv[4]); in sox_mcompand_getopts_1()
131 else l->delay = 0.0; in sox_mcompand_getopts_1()
157 …"\tattack1,decay1{,attack2,decay2} [soft-knee-dB:]in-dB1[,out-dB1]{,in-dB2,out-dB2} [gain [initial… in parse_subarg()
159 "\tdB values are floating point or -inf'; times are in seconds."); in parse_subarg()
170 priv_t * c = (priv_t *) effp->priv; in getopts()
171 --argc, ++argv; in getopts()
173 c->band_buf1 = c->band_buf2 = c->band_buf3 = 0; in getopts()
174 c->band_buf_len = 0; in getopts()
182 c->nBands = (argc+1)>>1; in getopts()
184 c->bands = lsx_calloc(c->nBands, sizeof(comp_band_t)); in getopts()
186 for (i=0;i<c->nBands;++i) { in getopts()
187 c->arg = lsx_strdup(argv[i<<1]); in getopts()
188 if (parse_subarg(c->arg,subargv,&subargc) != SOX_SUCCESS) in getopts()
190 if (sox_mcompand_getopts_1(&c->bands[i], subargc, &subargv[0]) != SOX_SUCCESS) in getopts()
192 free(c->arg); in getopts()
193 c->arg = NULL; in getopts()
194 if (i == (c->nBands-1)) in getopts()
195 c->bands[i].topfreq = 0; in getopts()
197 c->bands[i].topfreq = lsx_parse_frequency(argv[(i<<1)+1],&cp); in getopts()
199 lsx_fail("bad frequency in args to mcompand"); in getopts()
202 if ((i>0) && (c->bands[i].topfreq < c->bands[i-1].topfreq)) { in getopts()
203 lsx_fail("mcompand crossover frequencies must be in ascending order."); in getopts()
218 priv_t * c = (priv_t *) effp->priv; in start()
221 size_t band; in start() local
223 for (band=0;band<c->nBands;++band) { in start()
224 l = &c->bands[band]; in start()
225 l->delay_size = c->bands[band].delay * effp->out_signal.rate * effp->out_signal.channels; in start()
226 if (l->delay_size > c->delay_buf_size) in start()
227 c->delay_buf_size = l->delay_size; in start()
230 for (band=0;band<c->nBands;++band) { in start()
231 l = &c->bands[band]; in start()
234 for (i = 0; i < l->expectedChannels; ++i) { in start()
235 if (l->attackRate[i] > 1.0/effp->out_signal.rate) in start()
236 l->attackRate[i] = 1.0 - in start()
237 exp(-1.0/(effp->out_signal.rate * l->attackRate[i])); in start()
239 l->attackRate[i] = 1.0; in start()
240 if (l->decayRate[i] > 1.0/effp->out_signal.rate) in start()
241 l->decayRate[i] = 1.0 - in start()
242 exp(-1.0/(effp->out_signal.rate * l->decayRate[i])); in start()
244 l->decayRate[i] = 1.0; in start()
248 if (c->delay_buf_size > 0) in start()
249 l->delay_buf = lsx_calloc(sizeof(long), c->delay_buf_size); in start()
250 l->delay_buf_ptr = 0; in start()
251 l->delay_buf_cnt = 0; in start()
253 if (l->topfreq != 0) in start()
254 crossover_setup(effp, &l->filter, l->topfreq); in start()
267 double delta = s - *v; in doVolume()
270 *v += delta * l->attackRate[chan]; in doVolume()
272 *v += delta * l->decayRate[chan]; in doVolume()
284 if (l->expectedChannels == 1 && filechans > 1) { in sox_mcompand_flow_1()
292 doVolume(&l->volume[0], maxsamp, l, (size_t) 0); in sox_mcompand_flow_1()
295 doVolume(&l->volume[chan], fabs((double)ibuf[chan]), l, chan); in sox_mcompand_flow_1()
300 int ch = l->expectedChannels > 1 ? chan : 0; in sox_mcompand_flow_1()
301 double level_in_lin = l->volume[ch]; in sox_mcompand_flow_1()
302 double level_out_lin = lsx_compandt(&l->transfer_fn, level_in_lin); in sox_mcompand_flow_1()
305 if (c->delay_buf_size <= 0) { in sox_mcompand_flow_1()
307 SOX_SAMPLE_CLIP_COUNT(checkbuf, effp->clips); in sox_mcompand_flow_1()
315 /* because volume application delays differ band to band, but in sox_mcompand_flow_1()
316 total delay doesn't, the volume is applied in an iteration in sox_mcompand_flow_1()
317 preceding that in which the sample goes to obuf, except in in sox_mcompand_flow_1()
318 the band(s) with the longest vol app delay. in sox_mcompand_flow_1()
322 band's delay and the longest delay of all the bands. */ in sox_mcompand_flow_1()
324 if (l->delay_buf_cnt >= l->delay_size) { in sox_mcompand_flow_1()
325 …checkbuf = l->delay_buf[(l->delay_buf_ptr + c->delay_buf_size - l->delay_size)%c->delay_buf_size] … in sox_mcompand_flow_1()
326 SOX_SAMPLE_CLIP_COUNT(checkbuf, effp->clips); in sox_mcompand_flow_1()
327 … l->delay_buf[(l->delay_buf_ptr + c->delay_buf_size - l->delay_size)%c->delay_buf_size] = checkbuf; in sox_mcompand_flow_1()
329 if (l->delay_buf_cnt >= c->delay_buf_size) { in sox_mcompand_flow_1()
330 obuf[odone] = l->delay_buf[l->delay_buf_ptr]; in sox_mcompand_flow_1()
334 l->delay_buf_cnt++; in sox_mcompand_flow_1()
337 l->delay_buf[l->delay_buf_ptr++] = ibuf[chan]; in sox_mcompand_flow_1()
338 l->delay_buf_ptr %= c->delay_buf_size; in sox_mcompand_flow_1()
344 /* Emergency brake - will lead to memory corruption otherwise since we in sox_mcompand_flow_1()
347 sub-compander delays. */ in sox_mcompand_flow_1()
362 priv_t * c = (priv_t *) effp->priv; in flow()
365 size_t band, i; in flow() local
369 if (c->band_buf_len < len) { in flow()
370 c->band_buf1 = lsx_realloc(c->band_buf1,len*sizeof(sox_sample_t)); in flow()
371 c->band_buf2 = lsx_realloc(c->band_buf2,len*sizeof(sox_sample_t)); in flow()
372 c->band_buf3 = lsx_realloc(c->band_buf3,len*sizeof(sox_sample_t)); in flow()
373 c->band_buf_len = len; in flow()
376 len -= len % effp->out_signal.channels; in flow()
381 …/* split ibuf into bands using filters, pipe each band through sox_mcompand_flow_1, then add back … in flow()
384 for (band=0,abuf=ibuf_copy,bbuf=c->band_buf2,cbuf=c->band_buf1;band<c->nBands;++band) { in flow()
385 l = &c->bands[band]; in flow()
387 if (l->topfreq) in flow()
388 crossover_flow(effp, &l->filter, abuf, bbuf, cbuf, len); in flow()
394 abuf = c->band_buf3; in flow()
395 (void)sox_mcompand_flow_1(effp, c,l,bbuf,abuf,len, (size_t)effp->out_signal.channels); in flow()
399 SOX_SAMPLE_CLIP_COUNT(out, effp->clips); in flow()
422 for (done = 0; done < maxdrain && l->delay_buf_cnt > 0; done++) { in sox_mcompand_drain_1()
423 out = obuf[done] + l->delay_buf[l->delay_buf_ptr++]; in sox_mcompand_drain_1()
424 SOX_SAMPLE_CLIP_COUNT(out, effp->clips); in sox_mcompand_drain_1()
426 l->delay_buf_ptr %= c->delay_buf_size; in sox_mcompand_drain_1()
427 l->delay_buf_cnt--; in sox_mcompand_drain_1()
440 size_t band, drained, mostdrained = 0; in drain() local
441 priv_t * c = (priv_t *)effp->priv; in drain()
444 *osamp -= *osamp % effp->out_signal.channels; in drain()
447 for (band=0;band<c->nBands;++band) { in drain()
448 l = &c->bands[band]; in drain()
467 priv_t * c = (priv_t *) effp->priv; in stop()
469 size_t band; in stop() local
471 free(c->band_buf1); in stop()
472 c->band_buf1 = NULL; in stop()
473 free(c->band_buf2); in stop()
474 c->band_buf2 = NULL; in stop()
475 free(c->band_buf3); in stop()
476 c->band_buf3 = NULL; in stop()
478 for (band = 0; band < c->nBands; band++) { in stop()
479 l = &c->bands[band]; in stop()
480 free(l->delay_buf); in stop()
481 if (l->topfreq != 0) in stop()
482 free(l->filter.previous); in stop()
490 priv_t * c = (priv_t *) effp->priv; in lsx_kill()
492 size_t band; in lsx_kill() local
494 for (band = 0; band < c->nBands; band++) { in lsx_kill()
495 l = &c->bands[band]; in lsx_kill()
496 lsx_compandt_kill(&l->transfer_fn); in lsx_kill()
497 free(l->decayRate); in lsx_kill()
498 free(l->attackRate); in lsx_kill()
499 free(l->volume); in lsx_kill()
501 free(c->arg); in lsx_kill()
502 free(c->bands); in lsx_kill()
503 c->bands = NULL; in lsx_kill()
517 " in-dB1,out-dB1[,in-dB2,out-dB2...]\n" in lsx_mcompand_effect_fn()
518 " [ gain [ initial-volume [ delay ] ] ]", in lsx_mcompand_effect_fn()