This is snddiff.c in view mode; [Download] [Up]
/*
* This program reads in a soundfile, applies a first-order difference
* operator 1 - z^(-1) and writes a new soundfile.
* Currently supports only SND_FORMAT_LINEAR_16, mono or stereo.
*
* Usage: snddiff <inputSoundFile> <outputSoundFile>
*
* The algorithm:
* y(n) = x(n) - x(n-1)
*/
#import <stdio.h>
#import <sound/sound.h>
static void fail(char *s, char *s2)
{
printf("*** %s%s\n\n",s,s2);
exit(1); /* Exit, indicating error */
}
int processSound(int inCount, short *inPtr, short *outPtr, int nChans,
double adaption_time)
{
int i,c;
double xm1,x,y;
if (nChans == 1) {
x = (double) inPtr[0];
for (i=1; i<inCount; i++) {
xm1 = x;
x = (double) inPtr[i];
y = x - xm1; /* Zero at DC */
outPtr[i] = (short) y;
}
} else {
for (c=0; c<nChans; c++) {
x = (double) inPtr[c];
for (i=1; i<inCount; i++) {
xm1 = x;
x = (double) inPtr[2*i+c];
y = x - xm1; /* Zero at DC */
outPtr[nChans*i+c] = (short) y;
}
}
}
return inCount;
}
void main(int argc,char **argv) {
SNDSoundStruct *sndin, *sndout;
short *inPtr, *outPtr;
FILE *outstream;
int inCount, outCount, width, nChans;
double adaption_time = 250;
if (argc != 3) {
fprintf(stderr,
"%s - output signal y(n) = x(n) - x(n-1), where x = input signal.\n",
argv[0]);
printf("Usage: %s in.snd out.snd\n", argv[0]);
printf("SEE ALSO: sndsub for subtracting one signal from another.\n");
exit(1);
}
while (*argv[1] == '-') {
if (*(argv[1]+1) == 't') {
argv++;
sscanf(argv[1],"%lf",&adaption_time);
printf("DC filter adaption time set to %f\n",adaption_time);
}
argv++;
argc -= 2;
}
if (SNDReadSoundfile(*++argv,&sndin))
fail("could not open input file ",*argv);
else
SNDGetDataPointer(sndin, (char **)(&inPtr), &inCount, &width);
if (width != 2)
fail("Can only handle 16-bit soundfiles","");
nChans = sndin->channelCount;
inCount /= nChans; /* to get sample frames */
SNDSwapSoundToHost(inPtr, inPtr, inCount, nChans, sndin->dataFormat);
SNDAlloc(&sndout,
sndin->dataSize,
SND_FORMAT_LINEAR_16,
sndin->samplingRate,
nChans,4);
SNDGetDataPointer(sndout, (char **)(&outPtr), &outCount, &width);
outCount /= nChans; /* to get sample frames */
if (NULL == (outstream = fopen(*++argv,"w")))
fail("could not open output file ",*argv);
if (SNDWriteHeader(fileno(outstream),sndout))
fail("could not write output file ",*argv);
outCount = processSound(inCount, inPtr, outPtr, nChans, adaption_time);
SNDSwapHostToSound(outPtr, outPtr, outCount, nChans, sndout->dataFormat);
fwrite(outPtr, 2 * nChans, outCount, outstream);
SNDFree(sndin);
fclose(outstream);
SNDFree(sndout);
exit(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.