ftp.nice.ch/pub/next/unix/audio/sndutil.1.3.s.tar.gz#/sndutil-1.3/sndtools/sndtostereo.c

This is sndtostereo.c in view mode; [Download] [Up]

/*
 * sndtostereo.c
 *	Convert mono to stereo
 */
#import <libc.h>
#import <sound/sound.h>

static void fails(char *s, char *s2)
{
    printf("sndtostereo: ");	/* error message  */
    printf(s,s2);
    printf("\n\n");
    exit(1);			/* error exit */
}

void check_sndin_errors(int err, SNDSoundStruct *sndin, char *name) 
{
    int nchans;
    if (err) {
	fprintf(stderr, "Cannot read soundfile: %s\n", name);
	exit(1);
    }
    nchans = sndin->channelCount;
    if (sndin->dataFormat != SND_FORMAT_LINEAR_16) {
	fprintf(stderr, "Soundfile %s must be 16 bit linear\n",name);
	exit(1);
    }
    if (sndin->channelCount != 1) {
	fprintf(stderr, "Soundfile %s must be mono!\n", name);
	exit(1);
    }
}

void main (int argc, char *argv[])
{
    int err, sampleCount, width, sampleCount2, width2;
    SNDSoundStruct *sndin;
    SNDSoundStruct *sndin2;
    SNDSoundStruct *sndout;
    short *indata, *indata2, *outdata;
    int startsamp=0;
    int inchans = 1;
    char *outname;

    if (argc < 3) {
	fprintf(stderr,"%s - convert mono to stereo\n",argv[0]);
	fprintf(stderr, "Usage: sndtostereo monosoundfile [rightchannelsoundfile] stereosoundfile\n");
	exit(1);
    }

/*
 * Input sound file(s)
 */
    err = SNDReadSoundfile(argv[1], &sndin);
    check_sndin_errors(err,sndin,argv[1]);

    if (argc > 3) {
	inchans = 2;
	err = SNDReadSoundfile(argv[2], &sndin2);
	check_sndin_errors(err,sndin2,argv[2]);
	outname = argv[3];
    } else
	outname = argv[2];

    SNDGetDataPointer(sndin, (char **)(&indata), &sampleCount, &width);
    if (inchans == 2) {
	SNDGetDataPointer(sndin2, (char **)(&indata2), &sampleCount2, &width2);

	if (width != width2) {
	    fprintf(stderr, "Input soundfiles must be the same format!\n");
	    exit(1);
	}

	if (sampleCount != sampleCount2) {
	    fprintf(stderr, 
		    "Warning: Input soundfiles are different lengths\n");
	    sampleCount = MIN(sampleCount,sampleCount2);
	}
    }

    SNDAlloc(&sndout, 
	     sampleCount * sizeof(short) * 2 /* for stereo */,
	     sndin->dataFormat,
	     sndin->samplingRate, 
	     2,
	     strlen(sndin->info) + 1);

    strcpy(sndout->info,sndin->info);

    SNDGetDataPointer(sndout, (char **)(&outdata), &sampleCount2, &width2);

    if (inchans == 2) {
	for (startsamp = 0; startsamp < sampleCount; startsamp++) {
	    *outdata++ = *indata++;
	    *outdata++ = *indata2++;
	}
    } else {
	for (startsamp = 0; startsamp < sampleCount; startsamp++) {
	    *outdata++ = *indata;
	    *outdata++ = *indata++;
	}
    }

    if (SNDWriteSoundfile(outname, sndout))
      fails("could not write output file '%s'",argv[2]);
}



These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.