This is sndtomono.c in view mode; [Download] [Up]
/*
* sndtomono.c
* Convert stereo to mono by averaging channels
* or by extracting left or right channel.
*/
#import <stdio.h>
#import <sound/sound.h>
void main (int argc, char *argv[])
{
int err, nchans, sampleCount;
SNDSoundStruct *sndin;
short *data;
int startsamp=0;
int chan = 3;
char **argindex = argv;
while (--argc && **(++argindex) == '-') {
switch (*(++(argindex[0]))) {
case 'l': /* -left */
chan = 2;
fprintf(stderr,"Taking left channel\n");
break;
case 'r': /* -right */
chan = 1;
fprintf(stderr,"Taking right channel\n");
break;
case 's': /* -sum */
chan = 3;
fprintf(stderr,"Averaging left and right channels\n");
break;
default:
fprintf(stderr,"%s: Unknown switch -%s\n", argv[0], *argindex);
exit(1);
}
}
if (argc < 2) {
fprintf(stderr,
"%s - convert stereo to mono by averaging channels\n"
"\tor by extracting left or right channel\n",argv[0]);
fprintf(stderr, "Usage: %s [-l] [-r] stereosoundfile monosoundfile\n",
argv[0]);
exit(1);
}
/*
* Input sound file
*/
err = SNDReadSoundfile(argindex[0], &sndin);
if (err) {
fprintf(stderr, "%s: Can\'t read soundfile: %s\n", argv[0], argindex[0]);
exit(1);
}
nchans = sndin->channelCount;
if (sndin->dataFormat != SND_FORMAT_LINEAR_16) {
fprintf(stderr, "Soundfile must be 16 bit linear\n");
exit(1);
}
if (sndin->channelCount != 2) {
fprintf(stderr, "Soundfile must be stereo!\n");
exit(1);
}
sampleCount = sndin->dataSize / (2*sizeof(short)); /* per channel */
data = (short *) ((char *)sndin + sndin->dataLocation);
SNDSwapSoundToHost(data, data, sampleCount, sndin->channelCount,
sndin->dataFormat);
switch (chan) {
case 1:
for (startsamp = 0; startsamp < sampleCount; startsamp++)
data[startsamp] = data[2*startsamp+1];
break;
case 2:
for (startsamp = 0; startsamp < sampleCount; startsamp++)
data[startsamp] = data[2*startsamp];
break;
case 3: /* Average left and right channels */
for (startsamp = 0; startsamp < sampleCount; startsamp++)
data[startsamp] = (data[2*startsamp] + data[2*startsamp+1])>>1;
break;
}
sndin->channelCount = 1;
sndin->dataSize /= 2;
SNDSwapHostToSound(data, data, sampleCount, sndin->channelCount,
sndin->dataFormat);
if (SNDWriteSoundfile(argindex[1], sndin)) {
fprintf(stderr, "%s: could not write output file '%s'\n", argv[0],
argindex[1]);
exit(1); /* error exit */
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.