This is sndscale.c in view mode; [Download] [Up]
/* * sndscale.c * Apply scale factor to a sound */ #import <stdio.h> #import <math.h> /* pow() */ #import <sound/sound.h> static int trace = 1; /* for debugging */ static void fails(char *s, char *s2) { printf("sndscale: "); /* error message */ printf(s,s2); printf("\n\n"); exit(1); /* error exit */ } void main (int argc, char *argv[]) { int err, nchans, sampleCount, chanSamples; SNDSoundStruct *sndin; FILE *outstream; short *data; double scaleFactor; int scaleTo = 0; if (argc > 1 && *argv[1] == '-') { scaleTo = 1; argv++; argc--; } if (argc != 4) { fprintf(stderr,"%s - apply scale factor to a sound\n",argv[0]); fprintf(stderr, "Usage: sndscale [-to] scalefactor in.snd out.snd\n"); exit(1); } /* * Scale factor */ sscanf(argv[1],"%lf",&scaleFactor); printf("Scaling %s %s %f . . .\n",argv[2],(scaleTo?"to":"by"),scaleFactor); /* * Input sound file */ err = SNDReadSoundfile(argv[2], &sndin); if (err) { fprintf(stderr, "Cannot read soundfile: %s\n", argv[2]); 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 */ chanSamples = sampleCount / nchans; /* channel dependent */ data = (short *) ((char *)sndin + sndin->dataLocation); SNDSwapSoundToHost(data, data, chanSamples, nchans, sndin->dataFormat); { register short *sp; register int temp; register int scl; register int i; if (scaleTo) { short amp,maxamp; for (i = 0, sp=data, maxamp=0; i < sampleCount; i++) { amp = abs(*sp++); if (amp>maxamp) maxamp = amp; } scaleFactor = 32767.0 * scaleFactor / maxamp; } scl = scaleFactor * pow(2,16); for (i = 0, sp=data; i < sampleCount; i++) { temp = *sp; temp *= scl; *sp++ = (temp >> 16); } } /* * Output sound file */ if (NULL == (outstream = fopen(argv[3],"w"))) fails("could not open output file '%s'",argv[3]); if (SNDWriteHeader(fileno(outstream),sndin)) fails("could not write output file '%s'",argv[3]); SNDSwapHostToSound(data, data, chanSamples, nchans, sndin->dataFormat); fwrite(data, sizeof(short), sampleCount, outstream); if (trace) printf("Wrote output file: %s\n",argv[3]); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.