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 |
} |