| 1 |
root |
1.1 |
/* sndinfo describes sounds */ |
| 2 |
|
|
|
| 3 |
|
|
#if defined(HAVE_CONFIG_H) |
| 4 |
|
|
#include "config.h" |
| 5 |
|
|
#endif |
| 6 |
|
|
|
| 7 |
|
|
#include <math.h> |
| 8 |
|
|
#include <stdio.h> |
| 9 |
|
|
#include <stdlib.h> |
| 10 |
|
|
#if (defined(NEXT) || (defined(HAVE_LIBC_H) && (!defined(HAVE_UNISTD_H)))) |
| 11 |
|
|
#include <libc.h> |
| 12 |
|
|
#else |
| 13 |
|
|
#if (!(defined(_MSC_VER))) && (!(defined(MPW_C))) |
| 14 |
|
|
#include <unistd.h> |
| 15 |
|
|
#endif |
| 16 |
|
|
#include <string.h> |
| 17 |
|
|
#endif |
| 18 |
|
|
#include <errno.h> |
| 19 |
|
|
|
| 20 |
|
|
#include "sndlib.h" |
| 21 |
|
|
|
| 22 |
|
|
#include <time.h> |
| 23 |
|
|
|
| 24 |
|
|
#if MACOS |
| 25 |
|
|
#include <console.h> |
| 26 |
|
|
#endif |
| 27 |
|
|
|
| 28 |
|
|
/* try to give some info on data formats that aren't supported by sndlib */ |
| 29 |
|
|
static char *decode_format(int format, int type) |
| 30 |
|
|
{ |
| 31 |
|
|
char *f4; |
| 32 |
|
|
switch (type) |
| 33 |
|
|
{ |
| 34 |
|
|
case NeXT_sound_file: |
| 35 |
|
|
switch (format) |
| 36 |
|
|
{ |
| 37 |
|
|
case 0: return("unspecified"); break; case 8: return("indirect"); break; case 9: return("nested"); break; |
| 38 |
|
|
case 10: return("dsp_core"); break; case 11: return("dsp_data_8"); break; case 12: return("dsp_data_16"); break; |
| 39 |
|
|
case 13: return("dsp_data_24"); break; case 14: return("dsp_data_32"); break; case 16: return("display"); break; |
| 40 |
|
|
case 17: return("mulaw_squelch"); break; case 18: return("emphasized"); break; case 19: return("compressed"); break; |
| 41 |
|
|
case 20: return("compressed_emphasized"); break; case 21: return("dsp_commands"); break; case 22: return("dsp_commands_samples"); break; |
| 42 |
|
|
case 23: return("adpcm_g721"); break; case 24: return("adpcm_g722"); break; case 25: return("adpcm_g723"); break; |
| 43 |
|
|
case 26: return("adpcm_g723_5"); break; case 28: return("aes"); break; case 29: return("delat_mulaw_8"); break; |
| 44 |
|
|
} |
| 45 |
|
|
break; |
| 46 |
|
|
case AIFC_sound_file: |
| 47 |
|
|
if (format) |
| 48 |
|
|
{ |
| 49 |
|
|
f4 = (char *)calloc(5,sizeof(char)); |
| 50 |
|
|
#ifdef SNDLIB_LITTLE_ENDIAN |
| 51 |
|
|
sprintf(f4,"%c%c%c%c",format&0xff,(format>>8)&0xff,(format>>16)&0xff,(format>>24)&0xff); |
| 52 |
|
|
#else |
| 53 |
|
|
sprintf(f4,"%c%c%c%c",(format>>24)&0xff,(format>>16)&0xff,(format>>8)&0xff,format&0xff); |
| 54 |
|
|
#endif |
| 55 |
|
|
return(f4); |
| 56 |
|
|
} |
| 57 |
|
|
break; |
| 58 |
|
|
case RIFF_sound_file: |
| 59 |
|
|
switch (format) |
| 60 |
|
|
{ |
| 61 |
|
|
case 2: return("ADPCM"); break; case 4: return("VSELP"); break; case 5: return("IBM_CVSD"); break; |
| 62 |
|
|
case 0x10: return("OKI_ADPCM"); break; case 0x11: return("DVI_ADPCM"); break; case 0x12: return("MediaSpace_ADPCM"); break; |
| 63 |
|
|
case 0x13: return("Sierra_ADPCM"); break; case 0x14: return("G723_ADPCM"); break; case 0x15: return("DIGISTD"); break; |
| 64 |
|
|
case 0x16: return("DIGIFIX"); break; case 0x17: return("Dialogic ADPCM"); break; case 0x18: return("Mediavision ADPCM"); break; |
| 65 |
|
|
case 0x19: return("HP cu codec"); break; case 0x20: return("Yamaha_ADPCM"); break; case 0x21: return("SONARC"); break; |
| 66 |
|
|
case 0x22: return("DSPGroup_TrueSpeech"); break; case 0x23: return("EchoSC1"); break; case 0x24: return("AudioFile_AF36"); break; |
| 67 |
|
|
case 0x25: return("APTX"); break; case 0x26: return("AudioFile_AF10"); break; case 0x27: return("prosody 1612"); break; |
| 68 |
|
|
case 0x28: return("lrc"); break; case 0x30: return("Dolby_Ac2"); break; case 0x31: return("GSM610"); break; |
| 69 |
|
|
case 0x32: return("MSN audio codec"); break; case 0x33: return("Antext_ADPCM"); break; case 0x34: return("Control_res_vqlpc"); break; |
| 70 |
|
|
case 0x35: return("DIGIREAL"); break; case 0x36: return("DIGIADPCM"); break; case 0x37: return("Control_res_cr10"); break; |
| 71 |
|
|
case 0x38: return("NMS_VBXADPCM"); break; case 0x39: return("oland rdac"); break; case 0x3a: return("echo sc3"); break; |
| 72 |
|
|
case 0x3b: return("Rockwell adpcm"); break; case 0x3c: return("Rockwell digitalk codec"); break; case 0x3d: return("Xebec"); break; |
| 73 |
|
|
case 0x40: return("G721_ADPCM"); break; case 0x41: return("G728 CELP"); break; case 0x42: return("MS G723"); break; |
| 74 |
|
|
case 0x50: return("MPEG"); break; case 0x52: return("RT24"); break; case 0x53: return("PAC"); break; |
| 75 |
|
|
case 0x55: return("Mpeg layer 3"); break; case 0x59: return("Lucent G723"); break; case 0x60: return("Cirrus"); break; |
| 76 |
|
|
case 0x61: return("ESS Tech pcm"); break; case 0x62: return("voxware "); break; case 0x63: return("canopus atrac"); break; |
| 77 |
|
|
case 0x64: return("G726"); break; case 0x65: return("G722"); break; case 0x66: return("DSAT"); break; |
| 78 |
|
|
case 0x67: return("DSAT display"); break; case 0x69: return("voxware "); break; case 0x70: return("voxware ac8 "); break; |
| 79 |
|
|
case 0x71: return("voxware ac10 "); break; case 0x72: return("voxware ac16"); break; case 0x73: return("voxware ac20"); break; |
| 80 |
|
|
case 0x74: return("voxware rt24"); break; case 0x75: return("voxware rt29"); break; case 0x76: return("voxware rt29hw"); break; |
| 81 |
|
|
case 0x77: return("voxware vr12 "); break; case 0x78: return("voxware vr18"); break; case 0x79: return("voxware tq40"); break; |
| 82 |
|
|
case 0x80: return("softsound"); break; case 0x81: return("voxware tq60 "); break; case 0x82: return("MS RT24"); break; |
| 83 |
|
|
case 0x83: return("G729A"); break; case 0x84: return("MVI_MVI2"); break; case 0x85: return("DF G726"); break; |
| 84 |
|
|
case 0x86: return("DF GSM610"); break; case 0x88: return("isaudio"); break; case 0x89: return("onlive"); break; |
| 85 |
|
|
case 0x91: return("sbc24"); break; case 0x92: return("dolby ac3 spdif"); break; case 0x97: return("zyxel adpcm"); break; |
| 86 |
|
|
case 0x98: return("philips lpcbb"); break; case 0x99: return("packed"); break; case 0x100: return("rhetorex adpcm"); break; |
| 87 |
|
|
case 0x101: return("Irat"); break; case 0x102: return("IBM_alaw?"); break; case 0x103: return("IBM_ADPCM?"); break; |
| 88 |
|
|
case 0x111: return("vivo G723"); break; case 0x112: return("vivo siren"); break; case 0x123: return("digital g273"); break; |
| 89 |
|
|
case 0x200: return("Creative_ADPCM"); break; case 0x202: return("Creative fastspeech 8"); break; |
| 90 |
|
|
case 0x203: return("Creative fastspeech 10"); break; |
| 91 |
|
|
case 0x220: return("quarterdeck"); break; case 0x300: return("FM_TOWNS_SND"); break; case 0x400: return("BTV digital"); break; |
| 92 |
|
|
case 0x680: return("VME vmpcm"); break; case 0x1000: return("OLIGSM"); break; case 0x1001: return("OLIADPCM"); break; |
| 93 |
|
|
case 0x1002: return("OLICELP"); break; case 0x1003: return("OLISBC"); break; case 0x1004: return("OLIOPR"); break; |
| 94 |
|
|
case 0x1100: return("LH codec"); break; case 0x1400: return("Norris"); break; case 0x1401: return("isaudio"); break; |
| 95 |
|
|
case 0x1500: return("Soundspace musicompression"); break; case 0x2000: return("DVM"); break; |
| 96 |
|
|
} |
| 97 |
|
|
break; |
| 98 |
|
|
} |
| 99 |
|
|
return(NULL); |
| 100 |
|
|
} |
| 101 |
|
|
|
| 102 |
|
|
int main(int argc, char *argv[]) |
| 103 |
|
|
{ |
| 104 |
|
|
int chans,srate,samples,format,type; |
| 105 |
|
|
float length; |
| 106 |
|
|
time_t date; |
| 107 |
|
|
char *comment,*header_name; |
| 108 |
|
|
char *format_info,*format_name; |
| 109 |
|
|
char timestr[64]; |
| 110 |
|
|
#if MACOS |
| 111 |
|
|
argc = ccommand(&argv); |
| 112 |
|
|
#endif |
| 113 |
|
|
if (argc == 1) {printf("usage: sndinfo file\n"); exit(0);} |
| 114 |
|
|
initialize_sndlib(); |
| 115 |
|
|
if (mus_probe_file(argv[1])) /* see if it exists */ |
| 116 |
|
|
{ |
| 117 |
|
|
date = sound_write_date(argv[1]); |
| 118 |
|
|
srate = sound_srate(argv[1]); |
| 119 |
|
|
chans = sound_chans(argv[1]); |
| 120 |
|
|
samples = sound_samples(argv[1]); |
| 121 |
|
|
comment = sound_comment(argv[1]); |
| 122 |
|
|
length = (float)samples / (float)(chans * srate); |
| 123 |
|
|
type = sound_header_type(argv[1]); |
| 124 |
|
|
header_name = sound_type_name(type); |
| 125 |
|
|
format = sound_data_format(argv[1]); |
| 126 |
|
|
if (format != SNDLIB_UNSUPPORTED) |
| 127 |
|
|
format_info = sound_format_name(format); |
| 128 |
|
|
else |
| 129 |
|
|
{ |
| 130 |
|
|
format_info = (char *)calloc(64,sizeof(char)); |
| 131 |
|
|
format = sound_original_format(argv[1]); |
| 132 |
|
|
format_name = decode_format(format,type); |
| 133 |
|
|
if (format_name) |
| 134 |
|
|
sprintf(format_info,"%d (%s)",format,format_name); |
| 135 |
|
|
else sprintf(format_info,"%d",format); |
| 136 |
|
|
} |
| 137 |
|
|
#if (!defined(HAVE_CONFIG_H)) || defined(HAVE_STRFTIME) |
| 138 |
|
|
strftime(timestr,64,"%a %d-%b-%Y %H:%M %Z",localtime(&date)); |
| 139 |
|
|
#else |
| 140 |
|
|
sprintf(timestr,"who knows?"); |
| 141 |
|
|
#endif |
| 142 |
|
|
fprintf(stdout,"%s:\n srate: %d\n chans: %d\n length: %f\n", |
| 143 |
|
|
argv[1],srate,chans,length); |
| 144 |
|
|
fprintf(stdout," type: %s\n format: %s\n written: %s\n comment: %s\n", |
| 145 |
|
|
header_name, |
| 146 |
|
|
format_info, |
| 147 |
|
|
timestr,(comment) ? comment : ""); |
| 148 |
|
|
} |
| 149 |
|
|
else |
| 150 |
|
|
fprintf(stderr,"%s: %s\n",argv[1],strerror(errno)); |
| 151 |
|
|
return(0); |
| 152 |
|
|
} |