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.