This is sndrms.c in view mode; [Download] [Up]
/*
* sndrms.c
* Measure rms level of a sound
*/
#import <stdio.h>
#import <math.h> /* pow() */
#import <sound/sound.h>
#import <architecture/byte_order.h>
void main (int argc, char *argv[])
{
int err, nchans, sampleCount;
SNDSoundStruct *sndin;
short *data;
double mean,meansq,var,rms;
double sum=0.0, sumsq=0.0;
double max,min;
if (argc != 2) {
fprintf(stderr,"%s - measure rms level of a sound\n",argv[0]);
fprintf(stderr, "Usage: sndrms in.snd\n");
exit(1);
}
/*
* Input sound file
*/
err = SNDReadSoundfile(argv[1], &sndin);
if (err) {
fprintf(stderr, "Cannot read soundfile: %s\n", argv[1]);
exit(1);
}
nchans = sndin->channelCount;
if (sndin->dataFormat != SND_FORMAT_LINEAR_16) {
fprintf(stderr, "Soundfile must be 16 bit linear\n");
exit(1);
}
sampleCount = sndin->dataSize / sizeof(short); /* channel independent */
data = (short *) ((char *)sndin + sndin->dataLocation);
{
register short *sp = data;
register int temp;
register int i;
double scl = pow(2,-15);
max = min = (signed short) NXSwapBigShortToHost(*sp);
for (i = 0; i < sampleCount; i++) {
temp = (signed short) NXSwapBigShortToHost(*sp++);
sum += temp;
sumsq += temp*temp;
if (max < temp)
max = temp;
else if (min > temp)
min = temp;
}
mean = sum / ((double) sampleCount);
meansq = sumsq / ((double) sampleCount);
var = meansq - mean*mean;
rms = sqrt(var);
printf("RMS = %.20g (%.20g)\n",rms,rms*scl);
printf("Mean = %.20g (%.20g)\n",mean,mean*scl);
printf("Max = %d (limit = 32767) (%.20g) (limit = 1.0)\n",
(int)max,max*scl);
printf("Min = %d (limit = -32768) (%.20g) (limit = -1.0)\n",
(int)min,min*scl);
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.