This is sndedh.c in view mode; [Download] [Up]
/*
* sndedh.c
* Edit soundfile header
* J.O. Smith, 1991
*/
#import <libc.h>
#import <stdio.h>
#import <math.h> /* pow() */
#import <sound/sound.h>
static void fails(char *s, char *s2)
{
printf("sndedh: "); /* error message */
if (s2)
printf(s,s2);
else
printf(s);
printf("\n\n");
exit(1); /* error exit */
}
static unsigned int wordRound(unsigned int n) {
return (n+3)&(~3);
}
void main (int argc, char *argv[])
{
int err, nchans, sampleCount, i;
SNDSoundStruct *sndin;
short *data;
int newSamplingRate = 0;
int newFormat = -1;
char *cp,*newInfoString = NULL;
#define MAXLINELEN 8192
char linebuf[MAXLINELEN];
int newHeaderSize = 0;
int newChans = 0;
char *inName,*outName;
if (argc < 4) {
fprintf(stderr,"%s - edit soundfile header\n",argv[0]);
fprintf(stderr, "Usage: %s [-f format] "
"[-s samplingRate] [-c channels] "
"[-l lengthHeader] [-i \"infoString\"] "
"in.snd out.snd\n",
argv[0]);
exit(1);
}
while (--argc && **(++argv) == '-') {
switch (*(++(argv[0]))) {
case 's': /* -samplingRate */
sscanf(*(++argv),"%d",&newSamplingRate);
fprintf(stderr,"Sampling rate set to %d \n", newSamplingRate);
break;
case 'f': /* -format */
sscanf(*(++argv),"%d",&newFormat);
fprintf(stderr,"Format set to %d \n", newFormat);
break;
case 'c': /* -chans */
sscanf(*(++argv),"%d",&newChans);
fprintf(stderr,"Chans set to %d \n", newChans);
break;
case 'l': /* -lengthHeader */
sscanf(*(++argv),"%d",&newHeaderSize);
fprintf(stderr,"Header length set to %d \n", newHeaderSize);
break;
case 'i': /* -info */
for(i=0,argv++,argc--,cp=*argv; i<MAXLINELEN && *cp; i++)
linebuf[i] = *cp++;
if (i>=MAXLINELEN) i--;
linebuf[i]='\0';
newInfoString = linebuf;
fprintf(stderr,"Info string set to '%s'\n", newInfoString);
break;
default:
fprintf(stderr,"Unknown switch -%s\n",*argv);
exit(1);
}
}
if (argc <= 1)
fails("No filenames",NULL);
inName = *argv++; argc--;
if (argc == 1)
fails("No output filename",NULL);
outName = *argv++;argc--;
if (argc != 1)
fprintf(stderr,"*** Ignored args after output filename = %s\n",outName);
err = SNDReadSoundfile(inName, &sndin);
if (err) {
fprintf(stderr, "Cannot read soundfile: %s\n", inName);
exit(1);
}
nchans = sndin->channelCount;
sampleCount = sndin->dataSize / sizeof(short); /* channel independent */
data = (short *) ((char *)sndin + sndin->dataLocation);
if (newSamplingRate != 0.0)
sndin->samplingRate = newSamplingRate;
if (newFormat != -1)
sndin->dataFormat = newFormat;
if (newChans != 0)
sndin->channelCount = newChans;
if (newInfoString) {
if (strlen(sndin->info) >= strlen(newInfoString))
strcpy(sndin->info,newInfoString);
else {
printf("New info string is too large. Enlarging header . . . ");
newHeaderSize = wordRound(strlen(newInfoString)+1)
+ sizeof(SNDSoundStruct) - 4;
}
}
if (newHeaderSize) {
int infoStringLength;
SNDSoundStruct *sout;
if (newInfoString)
infoStringLength = wordRound(strlen(newInfoString)+1);
else
infoStringLength = newHeaderSize - sizeof(SNDSoundStruct) + 4;
SNDAlloc(&sout,
sndin->dataSize,
sndin->dataFormat,
sndin->samplingRate,
sndin->channelCount,
infoStringLength);
if (newInfoString)
strcpy(sout->info,newInfoString);
bcopy((char *)sndin+sndin->dataLocation,
(char *)sout+sout->dataLocation,
sndin->dataSize); /* sound samples */
SNDFree(sndin);
sndin = sout;
}
if (SNDWriteSoundfile(outName,sndin))
fails("could not write output file '%s'",outName);
else
printf("File %s written.\n",outName);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.