home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 3
/
AACD03.BIN
/
AACD
/
Sound
/
SoX
/
Source
/
split.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-07-18
|
3KB
|
131 lines
/*
* 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.
*/
/*
* "split" effect by Lauren Weinstein (lauren@vortex.com); 2/94
* Splits 1 channel file to 2 channels (stereo), or 4 channels (quad);
* or splits a 2 channel file to 4 channels.
*/
#include <math.h>
#include "st.h"
/* Private data for split */
typedef struct splitstuff {
int rest; /* bytes remaining in current block */
} *split_t;
/*
* Process options
*/
void
split_getopts(effp, n, argv)
eff_t effp;
int n;
char **argv;
{
if (n)
fail("Split effect takes no options.");
}
/*
* Prepare processing.
*/
void
split_start(effp)
eff_t effp;
{
switch (effp->ininfo.channels) {
case 1: /* 1 channel must split to 2 or 4 */
switch(effp->outinfo.channels) {
case 2:
case 4:
return;
}
break;
case 2: /* 2 channels must split to 4 */
switch(effp->outinfo.channels) {
case 4:
return;
}
break;
}
fail("Can't split %d channels into %d channels",
effp->ininfo.channels, effp->outinfo.channels);
}
/*
* Process signed long samples from ibuf to obuf,
* isamp or osamp samples, whichever is smaller,
* while splitting into appropriate channels.
*/
void split_flow(effp, ibuf, obuf, isamp, osamp)
eff_t effp;
LONG *ibuf, *obuf;
int *isamp, *osamp;
{
int len, done;
switch(effp->ininfo.channels) {
case 1: /* 1 input channel */
switch(effp->outinfo.channels) {
case 2: /* split to 2 channels */
len = ((*isamp > *osamp/2)
? *osamp/2 : *isamp);
for(done = 0; done < len; done++) {
obuf[0] = obuf[1] = *ibuf++;
obuf += 2;
}
*isamp = len;
*osamp = len * 2;
break;
case 4: /* split to 4 channels */
len = ((*isamp > *osamp/4)
? *osamp/4 : *isamp);
for(done = 0; done < len; done++) {
obuf[0] = obuf[1] = obuf[2]
= obuf[3] = *ibuf++;
obuf += 4;
}
*isamp = len;
*osamp = len * 4;
break;
}
break;
case 2: /* 2 input channels; split to 4 channels */
/* We're using the same channel ordering */
/* as in "avg.c"--sure hope it's correct! */
len = ((*isamp/2 > *osamp/4)
? *osamp/4 : *isamp/2);
for(done = 0; done < len; done++) {
obuf[0] = obuf[2] = ibuf[0];
obuf[1] = obuf[3] = ibuf[1];
ibuf += 2;
obuf += 4;
}
*isamp = len;
*osamp = len * 2;
break;
}
}
/*
* Do anything required when you stop reading samples.
* Don't close input file!
*/
void split_stop(effp)
eff_t effp;
{
/* nothing to do */
}