1 /* 2 ** Copyright (C) 1999-2016 Erik de Castro Lopo <erikd@mega-nerd.com> 3 ** 4 ** This program is free software; you can redistribute it and/or modify 5 ** it under the terms of the GNU Lesser General Public License as published by 6 ** the Free Software Foundation; either version 2.1 of the License, or 7 ** (at your option) any later version. 8 ** 9 ** This program is distributed in the hope that it will be useful, 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 ** GNU Lesser General Public License for more details. 13 ** 14 ** You should have received a copy of the GNU Lesser General Public License 15 ** along with this program; if not, write to the Free Software 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 */ 18 19 /* This file contains definitions commong to WAV and W64 files. */ 20 21 22 #ifndef WAVLIKE_H_INCLUDED 23 #define WAVLIKE_H_INCLUDED 24 25 /*------------------------------------------------------------------------------ 26 ** Chunk markers. 27 */ 28 29 #define adtl_MARKER MAKE_MARKER ('a', 'd', 't', 'l') 30 #define bext_MARKER MAKE_MARKER ('b', 'e', 'x', 't') 31 #define cart_MARKER MAKE_MARKER ('c', 'a', 'r', 't') 32 #define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a') 33 #define labl_MARKER MAKE_MARKER ('l', 'a', 'b', 'l') 34 #define ltxt_MARKER MAKE_MARKER ('l', 't', 'x', 't') 35 #define note_MARKER MAKE_MARKER ('n', 'o', 't', 'e') 36 #define DISP_MARKER MAKE_MARKER ('D', 'I', 'S', 'P') 37 #define INFO_MARKER MAKE_MARKER ('I', 'N', 'F', 'O') 38 #define LIST_MARKER MAKE_MARKER ('L', 'I', 'S', 'T') 39 #define PAD_MARKER MAKE_MARKER ('P', 'A', 'D', ' ') 40 #define PEAK_MARKER MAKE_MARKER ('P', 'E', 'A', 'K') 41 42 #define ISFT_MARKER MAKE_MARKER ('I', 'S', 'F', 'T') 43 #define ICRD_MARKER MAKE_MARKER ('I', 'C', 'R', 'D') 44 #define ICOP_MARKER MAKE_MARKER ('I', 'C', 'O', 'P') 45 #define IARL_MARKER MAKE_MARKER ('I', 'A', 'R', 'L') 46 #define IART_MARKER MAKE_MARKER ('I', 'A', 'R', 'T') 47 #define INAM_MARKER MAKE_MARKER ('I', 'N', 'A', 'M') 48 #define IENG_MARKER MAKE_MARKER ('I', 'E', 'N', 'G') 49 #define IGNR_MARKER MAKE_MARKER ('I', 'G', 'N', 'R') 50 #define ICOP_MARKER MAKE_MARKER ('I', 'C', 'O', 'P') 51 #define IPRD_MARKER MAKE_MARKER ('I', 'P', 'R', 'D') 52 #define ISRC_MARKER MAKE_MARKER ('I', 'S', 'R', 'C') 53 #define ISBJ_MARKER MAKE_MARKER ('I', 'S', 'B', 'J') 54 #define ICMT_MARKER MAKE_MARKER ('I', 'C', 'M', 'T') 55 #define IAUT_MARKER MAKE_MARKER ('I', 'A', 'U', 'T') 56 #define ITRK_MARKER MAKE_MARKER ('I', 'T', 'R', 'K') 57 58 #define exif_MARKER MAKE_MARKER ('e', 'x', 'i', 'f') 59 #define ever_MARKER MAKE_MARKER ('e', 'v', 'e', 'r') 60 #define etim_MARKER MAKE_MARKER ('e', 't', 'i', 'm') 61 #define ecor_MARKER MAKE_MARKER ('e', 'c', 'o', 'r') 62 #define emdl_MARKER MAKE_MARKER ('e', 'm', 'd', 'l') 63 #define emnt_MARKER MAKE_MARKER ('e', 'm', 'n', 't') 64 #define erel_MARKER MAKE_MARKER ('e', 'r', 'e', 'l') 65 #define eucm_MARKER MAKE_MARKER ('e', 'u', 'c', 'm') 66 #define olym_MARKER MAKE_MARKER ('o', 'l', 'y', 'm') 67 68 /*------------------------------------------------------------------------------ 69 ** List of known WAV format tags 70 */ 71 72 enum 73 { 74 /* keep sorted for wavlike_format_str() */ 75 WAVE_FORMAT_UNKNOWN = 0x0000, /* Microsoft Corporation */ 76 WAVE_FORMAT_PCM = 0x0001, /* Microsoft PCM format */ 77 WAVE_FORMAT_MS_ADPCM = 0x0002, /* Microsoft ADPCM */ 78 WAVE_FORMAT_IEEE_FLOAT = 0x0003, /* Micrososft 32 bit float format */ 79 WAVE_FORMAT_VSELP = 0x0004, /* Compaq Computer Corporation */ 80 WAVE_FORMAT_IBM_CVSD = 0x0005, /* IBM Corporation */ 81 WAVE_FORMAT_ALAW = 0x0006, /* Microsoft Corporation */ 82 WAVE_FORMAT_MULAW = 0x0007, /* Microsoft Corporation */ 83 WAVE_FORMAT_OKI_ADPCM = 0x0010, /* OKI */ 84 WAVE_FORMAT_IMA_ADPCM = 0x0011, /* Intel Corporation */ 85 WAVE_FORMAT_MEDIASPACE_ADPCM = 0x0012, /* Videologic */ 86 WAVE_FORMAT_SIERRA_ADPCM = 0x0013, /* Sierra Semiconductor Corp */ 87 WAVE_FORMAT_G723_ADPCM = 0x0014, /* Antex Electronics Corporation */ 88 WAVE_FORMAT_DIGISTD = 0x0015, /* DSP Solutions, Inc. */ 89 WAVE_FORMAT_DIGIFIX = 0x0016, /* DSP Solutions, Inc. */ 90 WAVE_FORMAT_DIALOGIC_OKI_ADPCM = 0x0017, /* Dialogic Corporation */ 91 WAVE_FORMAT_MEDIAVISION_ADPCM = 0x0018, /* Media Vision, Inc. */ 92 WAVE_FORMAT_CU_CODEC = 0x0019, /* Hewlett-Packard Company */ 93 WAVE_FORMAT_YAMAHA_ADPCM = 0x0020, /* Yamaha Corporation of America */ 94 WAVE_FORMAT_SONARC = 0x0021, /* Speech Compression */ 95 WAVE_FORMAT_DSPGROUP_TRUESPEECH = 0x0022, /* DSP Group, Inc */ 96 WAVE_FORMAT_ECHOSC1 = 0x0023, /* Echo Speech Corporation */ 97 WAVE_FORMAT_AUDIOFILE_AF36 = 0x0024, /* Audiofile, Inc. */ 98 WAVE_FORMAT_APTX = 0x0025, /* Audio Processing Technology */ 99 WAVE_FORMAT_AUDIOFILE_AF10 = 0x0026, /* Audiofile, Inc. */ 100 WAVE_FORMAT_PROSODY_1612 = 0x0027, /* Aculab plc */ 101 WAVE_FORMAT_LRC = 0x0028, /* Merging Technologies S.A. */ 102 WAVE_FORMAT_DOLBY_AC2 = 0x0030, /* Dolby Laboratories */ 103 WAVE_FORMAT_GSM610 = 0x0031, /* Microsoft Corporation */ 104 WAVE_FORMAT_MSNAUDIO = 0x0032, /* Microsoft Corporation */ 105 WAVE_FORMAT_ANTEX_ADPCME = 0x0033, /* Antex Electronics Corporation */ 106 WAVE_FORMAT_CONTROL_RES_VQLPC = 0x0034, /* Control Resources Limited */ 107 WAVE_FORMAT_DIGIREAL = 0x0035, /* DSP Solutions, Inc. */ 108 WAVE_FORMAT_DIGIADPCM = 0x0036, /* DSP Solutions, Inc. */ 109 WAVE_FORMAT_CONTROL_RES_CR10 = 0x0037, /* Control Resources Limited */ 110 WAVE_FORMAT_NMS_VBXADPCM = 0x0038, /* Natural MicroSystems */ 111 WAVE_FORMAT_ROLAND_RDAC = 0x0039, /* Roland */ 112 WAVE_FORMAT_ECHOSC3 = 0x003A, /* Echo Speech Corporation */ 113 WAVE_FORMAT_ROCKWELL_ADPCM = 0x003B, /* Rockwell International */ 114 WAVE_FORMAT_ROCKWELL_DIGITALK = 0x003C, /* Rockwell International */ 115 WAVE_FORMAT_XEBEC = 0x003D, /* Xebec Multimedia Solutions Limited */ 116 WAVE_FORMAT_G721_ADPCM = 0x0040, /* Antex Electronics Corporation */ 117 WAVE_FORMAT_G728_CELP = 0x0041, /* Antex Electronics Corporation */ 118 WAVE_FORMAT_MSG723 = 0x0042, /* Microsoft Corporation */ 119 WAVE_FORMAT_MPEG = 0x0050, /* Microsoft Corporation */ 120 WAVE_FORMAT_RT24 = 0x0052, /* InSoft Inc. */ 121 WAVE_FORMAT_PAC = 0x0053, /* InSoft Inc. */ 122 WAVE_FORMAT_MPEGLAYER3 = 0x0055, /* MPEG 3 Layer 1 */ 123 WAVE_FORMAT_LUCENT_G723 = 0x0059, /* Lucent Technologies */ 124 WAVE_FORMAT_CIRRUS = 0x0060, /* Cirrus Logic */ 125 WAVE_FORMAT_ESPCM = 0x0061, /* ESS Technology */ 126 WAVE_FORMAT_VOXWARE = 0x0062, /* Voxware Inc */ 127 WAVE_FORMAT_CANOPUS_ATRAC = 0x0063, /* Canopus, Co., Ltd. */ 128 WAVE_FORMAT_G726_ADPCM = 0x0064, /* APICOM */ 129 WAVE_FORMAT_G722_ADPCM = 0x0065, /* APICOM */ 130 WAVE_FORMAT_DSAT = 0x0066, /* Microsoft Corporation */ 131 WAVE_FORMAT_DSAT_DISPLAY = 0x0067, /* Microsoft Corporation */ 132 WAVE_FORMAT_VOXWARE_BYTE_ALIGNED = 0x0069, /* Voxware Inc. */ 133 WAVE_FORMAT_VOXWARE_AC8 = 0x0070, /* Voxware Inc. */ 134 WAVE_FORMAT_VOXWARE_AC10 = 0x0071, /* Voxware Inc. */ 135 WAVE_FORMAT_VOXWARE_AC16 = 0x0072, /* Voxware Inc. */ 136 WAVE_FORMAT_VOXWARE_AC20 = 0x0073, /* Voxware Inc. */ 137 WAVE_FORMAT_VOXWARE_RT24 = 0x0074, /* Voxware Inc. */ 138 WAVE_FORMAT_VOXWARE_RT29 = 0x0075, /* Voxware Inc. */ 139 WAVE_FORMAT_VOXWARE_RT29HW = 0x0076, /* Voxware Inc. */ 140 WAVE_FORMAT_VOXWARE_VR12 = 0x0077, /* Voxware Inc. */ 141 WAVE_FORMAT_VOXWARE_VR18 = 0x0078, /* Voxware Inc. */ 142 WAVE_FORMAT_VOXWARE_TQ40 = 0x0079, /* Voxware Inc. */ 143 WAVE_FORMAT_SOFTSOUND = 0x0080, /* Softsound, Ltd. */ 144 WAVE_FORMAT_VOXARE_TQ60 = 0x0081, /* Voxware Inc. */ 145 WAVE_FORMAT_MSRT24 = 0x0082, /* Microsoft Corporation */ 146 WAVE_FORMAT_G729A = 0x0083, /* AT&T Laboratories */ 147 WAVE_FORMAT_MVI_MV12 = 0x0084, /* Motion Pixels */ 148 WAVE_FORMAT_DF_G726 = 0x0085, /* DataFusion Systems (Pty) (Ltd) */ 149 WAVE_FORMAT_DF_GSM610 = 0x0086, /* DataFusion Systems (Pty) (Ltd) */ 150 /* removed because duplicate */ 151 /* WAVE_FORMAT_ISIAUDIO = 0x0088, */ /* Iterated Systems, Inc. */ 152 WAVE_FORMAT_ONLIVE = 0x0089, /* OnLive! Technologies, Inc. */ 153 WAVE_FORMAT_SBC24 = 0x0091, /* Siemens Business Communications Systems */ 154 WAVE_FORMAT_DOLBY_AC3_SPDIF = 0x0092, /* Sonic Foundry */ 155 WAVE_FORMAT_ZYXEL_ADPCM = 0x0097, /* ZyXEL Communications, Inc. */ 156 WAVE_FORMAT_PHILIPS_LPCBB = 0x0098, /* Philips Speech Processing */ 157 WAVE_FORMAT_PACKED = 0x0099, /* Studer Professional Audio AG */ 158 WAVE_FORMAT_RHETOREX_ADPCM = 0x0100, /* Rhetorex, Inc. */ 159 160 /* removed because of the following */ 161 /* WAVE_FORMAT_IRAT = 0x0101,*/ /* BeCubed Software Inc. */ 162 163 /* these three are unofficial */ 164 IBM_FORMAT_MULAW = 0x0101, /* IBM mu-law format */ 165 IBM_FORMAT_ALAW = 0x0102, /* IBM a-law format */ 166 IBM_FORMAT_ADPCM = 0x0103, /* IBM AVC Adaptive Differential PCM format */ 167 168 WAVE_FORMAT_VIVO_G723 = 0x0111, /* Vivo Software */ 169 WAVE_FORMAT_VIVO_SIREN = 0x0112, /* Vivo Software */ 170 WAVE_FORMAT_DIGITAL_G723 = 0x0123, /* Digital Equipment Corporation */ 171 WAVE_FORMAT_CREATIVE_ADPCM = 0x0200, /* Creative Labs, Inc */ 172 WAVE_FORMAT_CREATIVE_FASTSPEECH8 = 0x0202, /* Creative Labs, Inc */ 173 WAVE_FORMAT_CREATIVE_FASTSPEECH10 = 0x0203, /* Creative Labs, Inc */ 174 WAVE_FORMAT_QUARTERDECK = 0x0220, /* Quarterdeck Corporation */ 175 WAVE_FORMAT_FM_TOWNS_SND = 0x0300, /* Fujitsu Corporation */ 176 WAVE_FORMAT_BZV_DIGITAL = 0x0400, /* Brooktree Corporation */ 177 WAVE_FORMAT_VME_VMPCM = 0x0680, /* AT&T Labs, Inc. */ 178 WAVE_FORMAT_OLIGSM = 0x1000, /* Ing C. Olivetti & C., S.p.A. */ 179 WAVE_FORMAT_OLIADPCM = 0x1001, /* Ing C. Olivetti & C., S.p.A. */ 180 WAVE_FORMAT_OLICELP = 0x1002, /* Ing C. Olivetti & C., S.p.A. */ 181 WAVE_FORMAT_OLISBC = 0x1003, /* Ing C. Olivetti & C., S.p.A. */ 182 WAVE_FORMAT_OLIOPR = 0x1004, /* Ing C. Olivetti & C., S.p.A. */ 183 WAVE_FORMAT_LH_CODEC = 0x1100, /* Lernout & Hauspie */ 184 WAVE_FORMAT_NORRIS = 0x1400, /* Norris Communications, Inc. */ 185 /* removed because duplicate */ 186 /* WAVE_FORMAT_ISIAUDIO = 0x1401, */ /* AT&T Labs, Inc. */ 187 WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS = 0x1500, /* AT&T Labs, Inc. */ 188 WAVE_FORMAT_DVM = 0x2000, /* FAST Multimedia AG */ 189 WAVE_FORMAT_INTERWAV_VSC112 = 0x7150, /* ????? */ 190 191 WAVE_FORMAT_IPP_ITU_G_723_1 = 0x7230, /* Intel Performance Primitives g723 codec. */ 192 193 WAVE_FORMAT_EXTENSIBLE = 0xFFFE 194 } ; 195 196 typedef struct 197 { unsigned short format ; 198 unsigned short channels ; 199 unsigned int samplerate ; 200 unsigned int bytespersec ; 201 unsigned short blockalign ; 202 unsigned short bitwidth ; 203 } MIN_WAV_FMT ; 204 205 typedef struct 206 { unsigned short format ; 207 unsigned short channels ; 208 unsigned int samplerate ; 209 unsigned int bytespersec ; 210 unsigned short blockalign ; 211 unsigned short bitwidth ; 212 unsigned short extrabytes ; 213 unsigned short dummy ; 214 } WAV_FMT_SIZE20 ; 215 216 typedef struct 217 { unsigned short format ; 218 unsigned short channels ; 219 unsigned int samplerate ; 220 unsigned int bytespersec ; 221 unsigned short blockalign ; 222 unsigned short bitwidth ; 223 unsigned short extrabytes ; 224 unsigned short samplesperblock ; 225 unsigned short numcoeffs ; 226 struct 227 { short coeff1 ; 228 short coeff2 ; 229 } coeffs [7] ; 230 } MS_ADPCM_WAV_FMT ; 231 232 typedef struct 233 { unsigned short format ; 234 unsigned short channels ; 235 unsigned int samplerate ; 236 unsigned int bytespersec ; 237 unsigned short blockalign ; 238 unsigned short bitwidth ; 239 unsigned short extrabytes ; 240 unsigned short samplesperblock ; 241 } IMA_ADPCM_WAV_FMT ; 242 243 typedef struct 244 { unsigned short format ; 245 unsigned short channels ; 246 unsigned int samplerate ; 247 unsigned int bytespersec ; 248 unsigned short blockalign ; 249 unsigned short bitwidth ; 250 unsigned short extrabytes ; 251 unsigned short auxblocksize ; 252 } G72x_ADPCM_WAV_FMT ; 253 254 255 typedef struct 256 { unsigned short format ; 257 unsigned short channels ; 258 unsigned int samplerate ; 259 unsigned int bytespersec ; 260 unsigned short blockalign ; 261 unsigned short bitwidth ; 262 unsigned short extrabytes ; 263 unsigned short samplesperblock ; 264 } GSM610_WAV_FMT ; 265 266 typedef struct 267 { unsigned short format ; 268 unsigned short channels ; 269 unsigned int samplerate ; 270 unsigned int bytespersec ; 271 unsigned short blockalign ; 272 unsigned short bitwidth ; 273 unsigned short extrabytes ; 274 unsigned short id ; 275 unsigned int flags ; 276 unsigned short blocksize ; 277 unsigned short samplesperblock ; 278 unsigned short codecdelay ; 279 } MPEGLAYER3_WAV_FMT ; 280 281 typedef struct 282 { unsigned int esf_field1 ; 283 unsigned short esf_field2 ; 284 unsigned short esf_field3 ; 285 unsigned char esf_field4 [8] ; 286 } EXT_SUBFORMAT ; 287 288 typedef struct 289 { unsigned short format ; 290 unsigned short channels ; 291 unsigned int samplerate ; 292 unsigned int bytespersec ; 293 unsigned short blockalign ; 294 unsigned short bitwidth ; 295 unsigned short extrabytes ; 296 unsigned short validbits ; 297 unsigned int channelmask ; 298 EXT_SUBFORMAT esf ; 299 } EXTENSIBLE_WAV_FMT ; 300 301 typedef union 302 { unsigned short format ; 303 MIN_WAV_FMT min ; 304 IMA_ADPCM_WAV_FMT ima ; 305 MS_ADPCM_WAV_FMT msadpcm ; 306 G72x_ADPCM_WAV_FMT g72x ; 307 EXTENSIBLE_WAV_FMT ext ; 308 GSM610_WAV_FMT gsm610 ; 309 MPEGLAYER3_WAV_FMT mpeg3 ; 310 WAV_FMT_SIZE20 size20 ; 311 char padding [512] ; 312 } WAV_FMT ; 313 314 typedef struct 315 { int frames ; 316 } FACT_CHUNK ; 317 318 typedef struct 319 { /* For ambisonic commands */ 320 int wavex_ambisonic ; 321 unsigned wavex_channelmask ; 322 323 /* Set to true when 'fmt ' chunk is ambiguous.*/ 324 int fmt_is_broken ; 325 WAV_FMT wav_fmt ; 326 327 /* 328 ** Set to true when RF64 should be converted back to RIFF when writing the 329 ** header. 330 */ 331 int rf64_downgrade ; 332 } WAVLIKE_PRIVATE ; 333 334 #define WAVLIKE_GSM610_BLOCKSIZE 65 335 #define WAVLIKE_GSM610_SAMPLES 320 336 337 #define WAVLIKE_PEAK_CHUNK_SIZE(ch) (2 * sizeof (int) + ch * (sizeof (float) + sizeof (int))) 338 339 /*------------------------------------------------------------------------------------ 340 ** Functions defined in wav_ms_adpcm.c 341 */ 342 343 #define WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT 7 344 345 void wavlike_msadpcm_write_adapt_coeffs (SF_PRIVATE *psf) ; 346 347 /*------------------------------------------------------------------------------------ 348 ** Functions defined in wavlike.c 349 */ 350 351 char const* wavlike_format_str (int k) ; 352 353 int wavlike_srate2blocksize (int srate_chan_product) ; 354 int wavlike_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize) ; 355 void wavlike_write_guid (SF_PRIVATE *psf, const EXT_SUBFORMAT * subformat) ; 356 void wavlike_analyze (SF_PRIVATE *psf) ; 357 int wavlike_gen_channel_mask (const int *chan_map, int channels) ; 358 359 int wavlike_read_bext_chunk (SF_PRIVATE *psf, uint32_t chunksize) ; 360 int wavlike_write_bext_chunk (SF_PRIVATE *psf) ; 361 362 int wavlike_read_cart_chunk (SF_PRIVATE *psf, uint32_t chunksize) ; 363 int wavlike_write_cart_chunk (SF_PRIVATE *psf) ; 364 365 int wavlike_subchunk_parse (SF_PRIVATE *psf, int chunk, uint32_t length) ; 366 void wavlike_write_strings (SF_PRIVATE *psf, int location) ; 367 368 int wavlike_read_peak_chunk (SF_PRIVATE * psf, size_t chunk_size) ; 369 void wavlike_write_peak_chunk (SF_PRIVATE * psf) ; 370 371 void wavlike_write_custom_chunks (SF_PRIVATE * psf) ; 372 373 #endif 374 375