/* * July 5, 1991 * Copyright 1991 Lance Norskog And Sundry Contributors * This source code is freely redistributable and may be used for * any purpose. This copyright notice must be maintained. * Lance Norskog And Sundry Contributors are not responsible for * the consequences of using this software. */ /* * Sound Tools stereo/quad -> mono mixdown effect file. * * Does not mix up to more channels. * * What's in a center channel? */ #include "st.h" /* * Process options */ avg_getopts(effp, n, argv) eff_t effp; int n; char **argv; { if (n) fail("Averaging effect takes no options."); } /* * Start processing */ void avg_start(effp) eff_t effp; { switch (effp->outinfo.channels) { case 1: switch (effp->ininfo.channels) { case 2: case 4: return; } case 2: switch (effp->ininfo.channels) { case 4: return; } } fail("Can't average %d channels into %d channels", effp->ininfo.channels, effp->outinfo.channels); } /* * Process either isamp or osamp samples, whichever is smaller. */ avg_flow(effp, ibuf, obuf, isamp, osamp) eff_t effp; long *ibuf, *obuf; int *isamp, *osamp; { int len, done; switch (effp->outinfo.channels) { case 1: switch (effp->ininfo.channels) { case 2: len = ((*isamp/2 > *osamp) ? *osamp : *isamp/2); for(done = 0; done < len; done++) { *obuf++ = ibuf[0]/2 + ibuf[1]/2; ibuf += 2; } *isamp = len * 2; *osamp = len; break; case 4: len = ((*isamp/4 > *osamp) ? *osamp : *isamp/4); for(done = 0; done < len; done++) { *obuf++ = ibuf[0]/4 + ibuf[1]/4 + ibuf[2]/4 + ibuf[3]/4; ibuf += 4; } *isamp = len * 4; *osamp = len; break; } break; case 2: switch (effp->ininfo.channels) { /* * After careful inspection of CSOUND source code, * I'm mildly sure the order is: * front-left, front-right, rear-left, rear-right */ case 4: len = ((*isamp/2 > *osamp) ? *osamp : *isamp/2); len &= ~1; for(done = 0; done < len; done++) { obuf[0] = ibuf[0]/2 + ibuf[2]/2; obuf[1] = ibuf[1]/2 + ibuf[3]/2; ibuf += 4; obuf += 2; } *isamp = len * 2; *osamp = len; break; } } } /* * Do anything required when you stop reading samples. * Don't close input file! * * Should have statistics on right, left, and output amplitudes. */ avg_stop(effp) eff_t effp; { /* nothing to do */ }