/* * Processed signed long samples from ibuf to obuf. * Return number of samples processed. */ int st_fade_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf, st_size_t *isamp, st_size_t *osamp) { fade_t fade = (fade_t) effp->priv; /* len is total samples, chcnt counts channels */ int len = 0, chcnt = 0, t_output = 1, more_output = 1; st_sample_t t_ibuf; len = ((*isamp > *osamp) ? *osamp : *isamp); *osamp = 0; *isamp = 0; for(; len && more_output; len--) { t_ibuf = (fade->samplesdone < 0 ? 0 : *ibuf); if ((fade->samplesdone >= fade->in_start) && (!fade->do_out || fade->samplesdone < fade->out_stop)) { /* something to generate output */ if (fade->samplesdone < fade->in_stop) { /* fade-in phase, increase gain */ *obuf = t_ibuf * fade_gain(fade->samplesdone - fade->in_start, fade->in_stop - fade->in_start, fade->in_fadetype); } /* endif fade-in */ else if (!fade->do_out || fade->samplesdone < fade->out_start) { /* steady gain phase */ *obuf = t_ibuf; } /* endif steady phase */ else { /* fade-out phase, decrease gain */ *obuf = t_ibuf * fade_gain(fade->out_stop - fade->samplesdone, fade->out_stop - fade->out_start, fade->out_fadetype); } /* endif fade-out */ if (!(!fade->do_out || fade->samplesdone < fade->out_stop)) more_output = 0; t_output = 1; } else { /* No output generated */ t_output = 0; } /* endif something to output */ /* samplesdone < 0 means we are inventing samples right now * and so not consuming (happens when in_start < 0). */ if (fade->samplesdone >= 0 ) { /* Something to input */ *isamp += 1; ibuf++; } /* endif something accepted as input */ if (t_output) { /* Output generated, update pointers and counters */ obuf++; *osamp += 1; } /* endif t_output */ /* Process next channel */ chcnt++; if (chcnt >= effp->ininfo.channels) { /* all channels of this sample processed */ chcnt = 0; fade->samplesdone += 1; } /* endif all channels */ } /* endfor */ /* If not more samples will be returned, let application know * this. */ if (fade->do_out && fade->samplesdone >= fade->out_stop) return ST_EOF; else return ST_SUCCESS; }
/* * Processed signed long samples from ibuf to obuf. * Return number of samples processed. */ static int sox_fade_flow(sox_effect_t * effp, const sox_sample_t *ibuf, sox_sample_t *obuf, size_t *isamp, size_t *osamp) { priv_t * fade = (priv_t *) effp->priv; /* len is total samples, chcnt counts channels */ int len = 0, t_output = 1, more_output = 1; sox_sample_t t_ibuf; size_t chcnt = 0; len = ((*isamp > *osamp) ? *osamp : *isamp); *osamp = 0; *isamp = 0; for(; len && more_output; len--) { t_ibuf = *ibuf; if ((fade->samplesdone >= fade->in_start) && (!fade->do_out || fade->samplesdone < fade->out_stop)) { /* something to generate output */ if (fade->samplesdone < fade->in_stop) { /* fade-in phase, increase gain */ *obuf = t_ibuf * fade_gain(fade->samplesdone - fade->in_start, fade->in_stop - fade->in_start, fade->in_fadetype); } /* endif fade-in */ else if (!fade->do_out || fade->samplesdone < fade->out_start) { /* steady gain phase */ *obuf = t_ibuf; } /* endif steady phase */ else { /* fade-out phase, decrease gain */ *obuf = t_ibuf * fade_gain(fade->out_stop - fade->samplesdone, fade->out_stop - fade->out_start, fade->out_fadetype); } /* endif fade-out */ if (!(!fade->do_out || fade->samplesdone < fade->out_stop)) more_output = 0; t_output = 1; } else { /* No output generated */ t_output = 0; } /* endif something to output */ *isamp += 1; ibuf++; if (t_output) { /* Output generated, update pointers and counters */ obuf++; *osamp += 1; } /* endif t_output */ /* Process next channel */ chcnt++; if (chcnt >= effp->in_signal.channels) { /* all channels of this sample processed */ chcnt = 0; fade->samplesdone += 1; } /* endif all channels */ } /* endfor */ /* If not more samples will be returned, let application know * this. */ if (fade->do_out && fade->samplesdone >= fade->out_stop) return SOX_EOF; else return SOX_SUCCESS; }