This is convs2m.c in view mode; [Download] [Up]
//
// convs2m A stereo to monaural sound converter
//
// 1991/3/18
// HiroshiMomose
// Zoology, UCD, Davis, CA 95616 hmomose@ucdavis.edu
//
// To compile this program, type : cc -O -g -o convs2m convs2m.c -lsys_s
//
#define title ("convs2m.c - converts a stereo 16 bit linear .snd file to monaural")
#import <sound/sound.h>
#import <stdio.h>
#define MONO 1
#define STEREO 2
check_error(int err)
{
if (err) {
fprintf(stderr, "Error : %s\n",SNDSoundError(err));
exit(1);
}
return err;
}
main (int argc, char *argv[])
{
int i, size, width, temp, nsamples;
int datasize, dataformat, samplingrate, channelcount, info;
char channel = 'L';
short int ldata, rdata;
char *p;
short int *ip;
SNDSoundStruct *infile; // for input, we use NeXT SND routines
FILE *outfile; // for output, we don't.
// ========== Check command line flag
if ( argc == 4 )
channel = toupper( argv[1][0] );
if ( ( channel != 'L') && ( channel != 'R' ) ) {
fprintf( stderr, "Error(convs2m) : wrong channel %c (must be L or R)\n", channel );
exit( -1 );
}
if( argc < 4 ) {
fprintf( stderr, "%s\n\n", title );
fprintf( stderr, "Usage : convs2m channel infile outfile\n\t" );
fprintf( stderr, "channel must be either L or R (case does not matter)\n\t" );
fprintf( stderr, "infile must be a 16bit linear stereo .snd file\n\t" );
fprintf( stderr, "outfile will be a 16bit linear monaural .snd file\n\t" );
fprintf( stderr, "Doesn't check if outfile already exists. So be careful.\n\n" );
fprintf( stderr, "Sample operation : convs2m L stereo.snd mono.snd\n" );
exit( -1 );
}
// ========== Open input file
check_error( SNDReadSoundfile( argv[2], &infile ));
check_error( SNDGetDataPointer( infile, &p, &size, &width ));
// probablly width is 2(bytes=16bit)
ip = (short int *)p;
// ========== Read input file header
dataformat = infile->dataFormat;
datasize = infile->dataSize;
samplingrate = infile->samplingRate;
channelcount = infile->channelCount;
nsamples = datasize / channelcount / width; // no. of data samples
// ========== Check file format
if( channelcount != STEREO ) {
fprintf( stderr, "Error(convs2m) : Input file %s is not stereo\n", argv[1] );
exit( -1 );
}
if( dataformat != SND_FORMAT_LINEAR_16 ) {
fprintf( stderr, "Error(convs2m) : Input file %s is not 16bit linear\n", argv[1] );
exit( -1 );
}
// ========== open output file
if (( outfile = fopen ( argv[3], "wb" )) == 0 ) {
fprintf( stderr, "Error(convs2m) : Can't open input file : %s\n", argv[1] );
exit( -1 );
}
datasize /= 2; // Size of the data will be half
// ========== Write output file header
temp = SND_MAGIC; fwrite( &temp, 4, 1, outfile );
temp = 28; fwrite( &temp, 4, 1, outfile ); // start point of sound data
temp = datasize; fwrite( &temp, 4, 1, outfile ); // no. of bytes in sound data
temp = dataformat; fwrite( &temp, 4, 1, outfile );
temp = samplingrate; fwrite( &temp, 4, 1, outfile );
temp = MONO; fwrite( &temp, 4, 1, outfile ); // channel count
temp = 0x00000000; fwrite( &temp, 4, 1, outfile ); // info. string
// ========== Write output sound data
if ( channel == 'L' ) {
for ( i = 0; i < nsamples; i++ ) {
ldata = ( *(ip++) );
rdata = ( *(ip++) );
fwrite ( &ldata, 2, 1, outfile );
}
} else {
for ( i = 0; i < nsamples; i++ ) {
ldata = ( *(ip++) );
rdata = ( *(ip++) );
fwrite ( &rdata, 2, 1, outfile );
}
}
fclose( outfile );
exit( 0 );
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.