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

This is sndinfo.c in view mode; [Download] [Up]

/*
 *	sndinfo.c -- display information in the header of the soundfile
 *	Written by Lee Boynton
 *	Copyright 1988 NeXT, Inc.
 *
 *	Modification History:
 *	03/21/90/mtm	Added SND_FORMAT_COMPRESSED and SND_FORMAT_DSP_COMMANDS.
 *	04/09/90/mtm	Added SND_FORMAT_EMPHASIZED, SND_FORMAT_COMPRESSED_EMPHASIZED,
 *			and SND_FORMAT_DSP_COMMANDS_SAMPLES.
 *	08/02/90/mtm	Map in whole soundfile to get compression info.
 *	02/09/92/jos	Added compression method and ratio printing.
 *	07/10/92/jos	Added header size printout
 */

#import <stdio.h>
#import <stdlib.h>
#import <sys/types.h>
#import <sys/stat.h>
#import <sys/file.h>
#import <sound/sound.h>
#import <string.h>

#ifndef SND_CFORMAT_ATC
/*
 * Compression types
 */
#define	SND_CFORMAT_BITS_DROPPED	(0)
#define	SND_CFORMAT_BIT_FAITHFUL	(1)
#define	SND_CFORMAT_ATC  	        (2) /* Audio Transform Compression*/
#endif  SND_CFORMAT_ATC

typedef struct {
    int	originalSize;
    int method;
    int numDropped;
    int encodeLength;
    int reserved;
} compressionSubHeader;

extern int open();

void crash(s1,s2)
    char *s1,*s2;
{
    fprintf(stderr,"sndinfo : %s %s \n",s1,s2);
    exit(1);
}

void main (argc,argv)
    int argc;
    char *argv[];
{
    SNDSoundStruct *s;
    compressionSubHeader *subheader;
    float ratio;
    int origsize;
    int i,j, fd;
    int sample_count;
    char filename[1024], format[128];
    float rate;
    
    if (argc < 2) {
	fprintf(stderr, "sndinfo - display information in the soundfile header\n");
	fprintf(stderr, "usage : sndinfo sndfile1 sndfile2 ...\n");
	exit(1);
    }
    for (i=1; i<argc; i++) {
	
	if (!argv[i])
	    crash("Bad filename","");
	strcpy(filename,argv[i]);
	if ((fd = open(argv[i],O_RDONLY)) < 0) {
	    j = strlen(filename);
	    if ((j<5) || strcmp(&filename[j-4],".snd")) {
		strcat(filename,".snd");
		if ((fd = open(filename,O_RDONLY)) < 0)
		    crash("Cannot open",argv[i]);
	    } else
		crash("Cannot open",argv[i]);
	}
	if (SNDRead(fd,&s))
	    crash("Cannot read",filename);

	sample_count = 0;
	switch (s->dataFormat) {
	    case SND_FORMAT_UNSPECIFIED:
		strcpy(format,"Unspecified");
		break;
	    case SND_FORMAT_DSP_CORE:
		strcpy(format,"DSP Code");
		break;
	    case SND_FORMAT_LINEAR_16:
		strcpy(format,"16 bit linear");
		break;
	    case SND_FORMAT_EMPHASIZED:
		strcpy(format,"16 bit linear, emphasized");
		break;
	    case SND_FORMAT_DSP_DATA_16:
		strcpy(format,"16 bit dsp data");
		break;
	    case SND_FORMAT_LINEAR_32:
		strcpy(format,"32 bit linear");
		break;
	    case SND_FORMAT_LINEAR_8:
		strcpy(format,"8 bit linear");
		break;
	    case SND_FORMAT_MULAW_8:
		strcpy(format,"8 bit muLaw");
		break;
	    case SND_FORMAT_FLOAT:
		strcpy(format,"Single precision floating point");
		break;
	    case SND_FORMAT_DOUBLE:
		strcpy(format,"Double precision floating point");
		break;
	    case SND_FORMAT_MULAW_SQUELCH:
		strcpy(format,"8 bit muLaw, squelch run-length encoded");
		break;
	    case SND_FORMAT_COMPRESSED:
		subheader=(compressionSubHeader *)((char *)s+s->dataLocation);
		origsize = subheader->originalSize;
		ratio = ((float)origsize)/((float)s->dataSize);
		switch (subheader->method) {
		case SND_CFORMAT_BITS_DROPPED:
		    sprintf(format,"Compressed 16 bit linear, "
			    "original size = %d = %5.2fx",origsize,ratio);
		    break;
		case SND_CFORMAT_BIT_FAITHFUL:
		    sprintf(format,"Compressed 16 bit linear, bit faithful, "
			    "original size = %d = %5.2fx",origsize,ratio);
		    break;
		case SND_CFORMAT_ATC:
		    sprintf(format,"ATC compressed 16 bit linear, "
			    "original size = %d = %5.2fx",origsize,ratio);
		    break;
		default:
		    sprintf(format,"Undefined compressed format %d, "
			    "original size = %d", 
			    subheader->method, origsize);
		    break;
		}
		break;
	    case SND_FORMAT_COMPRESSED_EMPHASIZED:
		strcpy(format,"Compressed 16 bit linear, emphasized");
		break;
	    case SND_FORMAT_DSP_COMMANDS:
		strcpy(format,"DSP Commands");
		break;
	    case SND_FORMAT_DSP_COMMANDS_SAMPLES:
		strcpy(format,"DSP Commands with samples");
		break;
	    default:
		sprintf(format,"%d (undefined format)", s->dataFormat);
		break;
	}
	sample_count = SNDSampleCount( s );
	if (s->samplingRate == (int)SND_RATE_CODEC)
	    rate = (float)SND_RATE_CODEC;
	else
	    rate = (float)s->samplingRate;

	printf("\nFilename: %s\n",filename);
	printf("Size: %d bytes",s->dataSize);
	if (sample_count) {
	    printf(", %d samples",sample_count);
	    if (sample_count && rate)
		printf(", %5.3f seconds",
	    			(float)sample_count/(float)s->samplingRate);
	}
	printf("\n");
	printf("Format: %s\n", format);
	printf("SamplingRate: %5.3f Hz\n",rate);
	printf("Channels: %d\n",s->channelCount);
	printf("HeaderSize: %d bytes\n",s->dataLocation);
	printf("InfoSize: %d chars\n",(int)strlen(s->info));
	printf("%s\n",s->info);
    }
    exit(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.