ftp.nice.ch/pub/next/unix/audio/sndutil.1.3.s.tar.gz#/sndutil-1.3/sndtools/sndedh.c

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.