This is atcenv.c in view mode; [Download] [Up]
/*
* atcenv.c
* Write out amplitude envelope of an ATC-compressed soundfile.
*/
#import <libc.h>
#import <stdio.h>
#import <math.h>
#import <sound/sound.h>
static void fails(char *s, char *s2)
{
fprintf(stderr, "atcenv: "); /* error message */
if (s2)
fprintf(stderr,s,s2);
else
fprintf(stderr,s);
fprintf(stderr,"\n\n");
exit(1); /* error exit */
}
void main (int argc, char *argv[])
{
int j;
int err, nchans, inDataBytes;
SNDSoundStruct *sndin;
SNDCompressionSubheader *subheader = NULL;
SNDSoundStruct *envsoundout;
unsigned char *sp,*data;
short *ep,*edata;
int nsamps,nsampsPH;
int frame_size;
short amp,frame_exp;
int frameNumber;
if (argc != 3 && argc != 2) {
fprintf(stderr,
"%s - write out amplitude envelope of an ATC-compressed soundfile\n",
argv[0]);
fprintf(stderr, "Usage: %s atc_format_in.snd [envelope_out.snd]\n\n",argv[0]);
exit(1);
}
/*
* Input sound file
*/
err = SNDReadSoundfile(argv[1], &sndin);
if (err)
fails("Cannot read soundfile: %s", argv[1]);
nchans = sndin->channelCount;
if (sndin->dataFormat != SND_FORMAT_COMPRESSED)
fails("Input soundfile must be ATC format",NULL);
if (sndin->dataSize <= sizeof(SNDCompressionSubheader))
fails("Compressed soundfile is bad",NULL);
subheader = (SNDCompressionSubheader *)
((char *)sndin + sndin->dataLocation);
if(subheader->method != SND_CFORMAT_ATC)
fails("Input soundfile must be ATC format",NULL);
nsamps = subheader->originalSize / sizeof(short);
nsampsPH = nsamps + sndin->dataLocation;
data = (unsigned char *)subheader + sizeof(SNDCompressionSubheader);
inDataBytes = sndin->dataSize - sizeof(SNDCompressionSubheader);
/* This is probably a no-op in all current cases but provides some
* hope of working on future architectures.
*/
SNDSwapSoundToHost(data, data, inDataBytes / sizeof(short) * nchans,
nchans, sndin->dataFormat);
envsoundout = (SNDSoundStruct *)malloc(subheader->originalSize
+ sndin->dataLocation);
sndin->dataSize = subheader->originalSize;
sndin->dataFormat = SND_FORMAT_LINEAR_16;
sp = data;
ep = edata = (short *)envsoundout; /* zeroed header was compressed */
frameNumber = 0;
while (++frameNumber) {
if ( (sp - data) >= inDataBytes)
break;
frame_size = *sp;
frame_exp = *(sp+1);
sp += frame_size;
amp = (32767 >> frame_exp);
fprintf(stderr,"Frame %d amp = %d,\tlength = %d\n",
1 + (frameNumber-1)/nchans, amp, frame_size);
if ((ep + ATC_FRAME_SIZE -edata) > nsampsPH) {
fprintf(stderr,"Soundout overflow at sp-data = %d "
"and inDataBytes = %d\n",
(int)(sp-data),inDataBytes);
fprintf(stderr,"Have ep-envsoundout = %d and nsampsPH = %d\n",
(int)(ep - edata),nsampsPH);
break;
}
for (j=0; j<ATC_FRAME_SIZE; j++)
*ep++ = amp;
if ((ep - edata) >= nsampsPH)
break;
}
/* copy header and info, overwriting compressed zeroed header */
bcopy((char *) sndin, (char *) envsoundout, sndin->dataLocation);
/*
* Output sound file
*/
if (argc == 3) {
printf("Writing output file %s\n", argv[2]);
ep = (short *) ((char *) envsoundout + envsoundout->dataLocation);
nsamps = envsoundout->dataSize /
(sizeof(short) * envsoundout->channelCount);
SNDSwapHostToSound(ep, ep, nsamps, nchans, envsoundout->dataFormat);
if (SNDWriteSoundfile(argv[2], envsoundout))
fails("could not write output file '%s'",argv[2]);
}
exit(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.