wav_w64.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:24k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 1999-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  3. ** Copyright (C) 2004-2005 David Viens <davidv@plogue.com>
  4. **
  5. ** This program is free software; you can redistribute it and/or modify
  6. ** it under the terms of the GNU Lesser General Public License as published by
  7. ** the Free Software Foundation; either version 2.1 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ** GNU Lesser General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU Lesser General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19. #include "sfconfig.h"
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <time.h>
  24. #include "sndfile.h"
  25. #include "sfendian.h"
  26. #include "common.h"
  27. #include "wav_w64.h"
  28. /*  Known WAVEFORMATEXTENSIBLE GUIDS.  */
  29. static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM =
  30. { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
  31. } ;
  32. static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM =
  33. { 0x00000002, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
  34. } ;
  35. static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT =
  36. { 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
  37. } ;
  38. static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW =
  39. { 0x00000006, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
  40. } ;
  41. static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW =
  42. { 0x00000007, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
  43. } ;
  44. /*
  45. ** the next two are from
  46. ** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html
  47. */
  48. static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM =
  49. { 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xc8, 0xc1, 0xca, 0x00, 0x00, 0x00 }
  50. } ;
  51. static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT =
  52. { 0x00000003, 0x0721, 0x11d3, { 0x86, 0x44, 0xc8, 0xc1, 0xca, 0x00, 0x00, 0x00 }
  53. } ;
  54. #if 0
  55. /* maybe interesting one day to read the following through sf_read_raw */
  56. /* http://www.bath.ac.uk/~masrwd/pvocex/pvocex.html */
  57. static const EXT_SUBFORMAT MSGUID_SUBTYPE_PVOCEX =
  58. { 0x8312b9c2, 0x2e6e, 0x11d4, { 0xa8, 0x24, 0xde, 0x5b, 0x96, 0xc3, 0xab, 0x21 }
  59. } ;
  60. #endif
  61. /* This stores which bit in dwChannelMask maps to which channel */
  62. static const struct chanmap_s
  63. { int id ;
  64. const char * name ;
  65. } channel_mask_bits [] =
  66. { /* WAVEFORMATEXTENSIBLE doesn't distuingish FRONT_LEFT from LEFT */
  67. { SF_CHANNEL_MAP_LEFT, "L" },
  68. { SF_CHANNEL_MAP_RIGHT, "R" },
  69. { SF_CHANNEL_MAP_CENTER, "C" },
  70. { SF_CHANNEL_MAP_LFE, "LFE" },
  71. { SF_CHANNEL_MAP_REAR_LEFT, "Ls" },
  72. { SF_CHANNEL_MAP_REAR_RIGHT, "Rs" },
  73. { SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, "Lc" },
  74. { SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, "Rc" },
  75. { SF_CHANNEL_MAP_REAR_CENTER, "Cs" },
  76. { SF_CHANNEL_MAP_SIDE_LEFT, "Sl" },
  77. { SF_CHANNEL_MAP_SIDE_RIGHT, "Sr" },
  78. { SF_CHANNEL_MAP_TOP_CENTER, "Tc" },
  79. { SF_CHANNEL_MAP_TOP_FRONT_LEFT, "Tfl" },
  80. { SF_CHANNEL_MAP_TOP_FRONT_CENTER, "Tfc" },
  81. { SF_CHANNEL_MAP_TOP_FRONT_RIGHT, "Tfr" },
  82. { SF_CHANNEL_MAP_TOP_REAR_LEFT, "Trl" },
  83. { SF_CHANNEL_MAP_TOP_REAR_CENTER, "Trc" },
  84. { SF_CHANNEL_MAP_TOP_REAR_RIGHT, "Trr" },
  85. } ;
  86. /*------------------------------------------------------------------------------
  87.  * Private static functions.
  88.  */
  89. static int
  90. wavex_guid_equal (const EXT_SUBFORMAT * first, const EXT_SUBFORMAT * second)
  91. { return !memcmp (first, second, sizeof (EXT_SUBFORMAT)) ;
  92. } /* wavex_guid_equal */
  93. int
  94. wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
  95. { WAV_PRIVATE * wpriv ;
  96. WAV_FMT *wav_fmt ;
  97. int bytesread, k, bytespersec = 0 ;
  98. if ((wpriv = psf->container_data) == NULL)
  99. return SFE_INTERNAL ;
  100. wav_fmt = &wpriv->wav_fmt ;
  101. memset (wav_fmt, 0, sizeof (WAV_FMT)) ;
  102. if (fmtsize < 16)
  103. return SFE_WAV_FMT_SHORT ;
  104. /* assume psf->rwf_endian is already properly set */
  105. /* Read the minimal WAV file header here. */
  106. bytesread = psf_binheader_readf (psf, "224422",
  107. &(wav_fmt->format), &(wav_fmt->min.channels),
  108. &(wav_fmt->min.samplerate), &(wav_fmt->min.bytespersec),
  109. &(wav_fmt->min.blockalign), &(wav_fmt->min.bitwidth)) ;
  110. psf_log_printf (psf, "  Format        : 0x%X => %sn", wav_fmt->format, wav_w64_format_str (wav_fmt->format)) ;
  111. psf_log_printf (psf, "  Channels      : %dn", wav_fmt->min.channels) ;
  112. psf_log_printf (psf, "  Sample Rate   : %dn", wav_fmt->min.samplerate) ;
  113. psf_log_printf (psf, "  Block Align   : %dn", wav_fmt->min.blockalign) ;
  114. if (wav_fmt->min.blockalign == 0)
  115. { psf_log_printf (psf, "*** Error : wav_fmt->min.blockalign should not be zero.n") ;
  116. return SFE_INTERNAL ;
  117. } ;
  118. if (wav_fmt->format == WAVE_FORMAT_PCM && wav_fmt->min.bitwidth == 24 &&
  119. wav_fmt->min.blockalign == 4 * wav_fmt->min.channels)
  120. { psf_log_printf (psf, "  Bit Width     : 24n") ;
  121. psf_log_printf (psf, "n"
  122. "  Ambiguous information in 'fmt ' chunk. Possibile file types:n"
  123. "    0) Invalid IEEE float file generated by Syntrillium's Cooledit!n"
  124. "    1) File generated by ALSA's arecord containing 24 bit samples in 32 bit containers.n"
  125. "    2) 24 bit file with incorrect Block Align value.n"
  126. "n") ;
  127. wpriv->fmt_is_broken = 1 ;
  128. }
  129. else if (wav_fmt->min.bitwidth == 0)
  130. { switch (wav_fmt->format)
  131. { case WAVE_FORMAT_GSM610 :
  132. case WAVE_FORMAT_IPP_ITU_G_723_1 :
  133. psf_log_printf (psf, "  Bit Width     : %dn", wav_fmt->min.bitwidth) ;
  134. break ;
  135. default :
  136. psf_log_printf (psf, "  Bit Width     : %d (should not be 0)n", wav_fmt->min.bitwidth) ;
  137. }
  138. }
  139. else
  140. { switch (wav_fmt->format)
  141. { case WAVE_FORMAT_GSM610 :
  142. case WAVE_FORMAT_IPP_ITU_G_723_1 :
  143. psf_log_printf (psf, "  Bit Width     : %d (should be 0)n", wav_fmt->min.bitwidth) ;
  144. break ;
  145. default :
  146. psf_log_printf (psf, "  Bit Width     : %dn", wav_fmt->min.bitwidth) ;
  147. }
  148. } ;
  149. psf->sf.samplerate = wav_fmt->min.samplerate ;
  150. psf->sf.frames  = 0 ; /* Correct this when reading data chunk. */
  151. psf->sf.channels = wav_fmt->min.channels ;
  152. switch (wav_fmt->format)
  153. { case WAVE_FORMAT_PCM :
  154. case WAVE_FORMAT_IEEE_FLOAT :
  155. bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ;
  156. if (wav_fmt->min.bytespersec != (unsigned) bytespersec)
  157. psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->min.bytespersec, bytespersec) ;
  158. else
  159. psf_log_printf (psf, "  Bytes/sec     : %dn", wav_fmt->min.bytespersec) ;
  160. psf->bytewidth = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ;
  161. break ;
  162. case WAVE_FORMAT_ALAW :
  163. case WAVE_FORMAT_MULAW :
  164. if (wav_fmt->min.bytespersec / wav_fmt->min.blockalign != wav_fmt->min.samplerate)
  165. psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ;
  166. else
  167. psf_log_printf (psf, "  Bytes/sec     : %dn", wav_fmt->min.bytespersec) ;
  168. psf->bytewidth = 1 ;
  169. if (fmtsize >= 18)
  170. { bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->size20.extrabytes)) ;
  171. psf_log_printf (psf, "  Extra Bytes   : %dn", wav_fmt->size20.extrabytes) ;
  172. } ;
  173. break ;
  174. case WAVE_FORMAT_IMA_ADPCM :
  175. if (wav_fmt->min.bitwidth != 4)
  176. return SFE_WAV_ADPCM_NOT4BIT ;
  177. if (wav_fmt->min.channels < 1 || wav_fmt->min.channels > 2)
  178. return SFE_WAV_ADPCM_CHANNELS ;
  179. bytesread +=
  180. psf_binheader_readf (psf, "22", &(wav_fmt->ima.extrabytes), &(wav_fmt->ima.samplesperblock)) ;
  181. bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ;
  182. if (wav_fmt->ima.bytespersec != (unsigned) bytespersec)
  183. psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->ima.bytespersec, bytespersec) ;
  184. else
  185. psf_log_printf (psf, "  Bytes/sec     : %dn", wav_fmt->ima.bytespersec) ;
  186. psf->bytewidth = 2 ;
  187. psf_log_printf (psf, "  Extra Bytes   : %dn", wav_fmt->ima.extrabytes) ;
  188. psf_log_printf (psf, "  Samples/Block : %dn", wav_fmt->ima.samplesperblock) ;
  189. break ;
  190. case WAVE_FORMAT_MS_ADPCM :
  191. if (wav_fmt->msadpcm.bitwidth != 4)
  192. return SFE_WAV_ADPCM_NOT4BIT ;
  193. if (wav_fmt->msadpcm.channels < 1 || wav_fmt->msadpcm.channels > 2)
  194. return SFE_WAV_ADPCM_CHANNELS ;
  195. bytesread +=
  196. psf_binheader_readf (psf, "222", &(wav_fmt->msadpcm.extrabytes),
  197. &(wav_fmt->msadpcm.samplesperblock), &(wav_fmt->msadpcm.numcoeffs)) ;
  198. bytespersec = (wav_fmt->min.samplerate * wav_fmt->min.blockalign) / wav_fmt->msadpcm.samplesperblock ;
  199. if (wav_fmt->min.bytespersec == (unsigned) bytespersec)
  200. psf_log_printf (psf, "  Bytes/sec     : %dn", wav_fmt->min.bytespersec) ;
  201. else if (wav_fmt->min.bytespersec == (wav_fmt->min.samplerate / wav_fmt->msadpcm.samplesperblock) * wav_fmt->min.blockalign)
  202. psf_log_printf (psf, "  Bytes/sec     : %d (should be %d (MS BUG!))n", wav_fmt->min.bytespersec, bytespersec) ;
  203. else
  204. psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->min.bytespersec, bytespersec) ;
  205. psf->bytewidth = 2 ;
  206. psf_log_printf (psf, "  Extra Bytes   : %dn", wav_fmt->msadpcm.extrabytes) ;
  207. psf_log_printf (psf, "  Samples/Block : %dn", wav_fmt->msadpcm.samplesperblock) ;
  208. if (wav_fmt->msadpcm.numcoeffs > ARRAY_LEN (wav_fmt->msadpcm.coeffs))
  209. { psf_log_printf (psf, "  No. of Coeffs : %d (should be <= %d)n", wav_fmt->msadpcm.numcoeffs, ARRAY_LEN (wav_fmt->msadpcm.coeffs)) ;
  210. wav_fmt->msadpcm.numcoeffs = ARRAY_LEN (wav_fmt->msadpcm.coeffs) ;
  211. }
  212. else
  213. psf_log_printf (psf, "  No. of Coeffs : %dn", wav_fmt->msadpcm.numcoeffs) ;
  214. psf_log_printf (psf, "    Index   Coeffs1   Coeffs2n") ;
  215. for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++)
  216. { bytesread +=
  217. psf_binheader_readf (psf, "22", &(wav_fmt->msadpcm.coeffs [k].coeff1), &(wav_fmt->msadpcm.coeffs [k].coeff2)) ;
  218. snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "     %2d     %7d   %7dn", k, wav_fmt->msadpcm.coeffs [k].coeff1, wav_fmt->msadpcm.coeffs [k].coeff2) ;
  219. psf_log_printf (psf, psf->u.cbuf) ;
  220. } ;
  221. break ;
  222. case WAVE_FORMAT_GSM610 :
  223. if (wav_fmt->gsm610.channels != 1 || wav_fmt->gsm610.blockalign != 65)
  224. return SFE_WAV_GSM610_FORMAT ;
  225. bytesread +=
  226. psf_binheader_readf (psf, "22", &(wav_fmt->gsm610.extrabytes), &(wav_fmt->gsm610.samplesperblock)) ;
  227. if (wav_fmt->gsm610.samplesperblock != 320)
  228. return SFE_WAV_GSM610_FORMAT ;
  229. bytespersec = (wav_fmt->gsm610.samplerate * wav_fmt->gsm610.blockalign) / wav_fmt->gsm610.samplesperblock ;
  230. if (wav_fmt->gsm610.bytespersec != (unsigned) bytespersec)
  231. psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->gsm610.bytespersec, bytespersec) ;
  232. else
  233. psf_log_printf (psf, "  Bytes/sec     : %dn", wav_fmt->gsm610.bytespersec) ;
  234. psf->bytewidth = 2 ;
  235. psf_log_printf (psf, "  Extra Bytes   : %dn", wav_fmt->gsm610.extrabytes) ;
  236. psf_log_printf (psf, "  Samples/Block : %dn", wav_fmt->gsm610.samplesperblock) ;
  237. break ;
  238. case WAVE_FORMAT_EXTENSIBLE :
  239. if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
  240. psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ;
  241. else
  242. psf_log_printf (psf, "  Bytes/sec     : %dn", wav_fmt->ext.bytespersec) ;
  243. bytesread +=
  244. psf_binheader_readf (psf, "224", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits),
  245. &(wav_fmt->ext.channelmask)) ;
  246. psf_log_printf (psf, "  Valid Bits    : %dn", wav_fmt->ext.validbits) ;
  247. if (wav_fmt->ext.channelmask == 0)
  248. psf_log_printf (psf, "  Channel Mask  : 0x0 (should not be zero)n") ;
  249. else
  250. { unsigned bit ;
  251. wpriv->wavex_channelmask = wav_fmt->ext.channelmask ;
  252. /* It's probably wise to ignore the channel mask if it is all zero */
  253. free (psf->channel_map) ;
  254. if ((psf->channel_map = calloc (psf->sf.channels, sizeof (psf->channel_map [0]))) == NULL)
  255. return SFE_MALLOC_FAILED ;
  256. /* Terminate the buffer we're going to append_snprintf into. */
  257. psf->u.cbuf [0] = 0 ;
  258. for (bit = k = 0 ; bit < ARRAY_LEN (channel_mask_bits) ; bit++)
  259. {
  260. if (wav_fmt->ext.channelmask & (1 << bit))
  261. { if (k > psf->sf.channels)
  262. { psf_log_printf (psf, "*** More channel map bits than there are channels.n") ;
  263. break ;
  264. } ;
  265. psf->channel_map [k++] = channel_mask_bits [bit].id ;
  266. append_snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%s, ", channel_mask_bits [bit].name) ;
  267. } ;
  268. } ;
  269. /* Remove trailing ", ". */
  270. bit = strlen (psf->u.cbuf) ;
  271. psf->u.cbuf [--bit] = 0 ;
  272. psf->u.cbuf [--bit] = 0 ;
  273. if (k != psf->sf.channels)
  274. { psf_log_printf (psf, "  Channel Mask  : 0x%Xn", wav_fmt->ext.channelmask) ;
  275. psf_log_printf (psf, "*** Less channel map bits than there are channels.n") ;
  276. }
  277. else
  278. psf_log_printf (psf, "  Channel Mask  : 0x%X (%s)n", wav_fmt->ext.channelmask, psf->u.cbuf) ;
  279. } ;
  280. bytesread += psf_binheader_readf (psf, "422", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2), &(wav_fmt->ext.esf.esf_field3)) ;
  281. /* compare the esf_fields with each known GUID? and print? */
  282. psf_log_printf (psf, "  Subformatn") ;
  283. psf_log_printf (psf, "    esf_field1 : 0x%Xn", wav_fmt->ext.esf.esf_field1) ;
  284. psf_log_printf (psf, "    esf_field2 : 0x%Xn", wav_fmt->ext.esf.esf_field2) ;
  285. psf_log_printf (psf, "    esf_field3 : 0x%Xn", wav_fmt->ext.esf.esf_field3) ;
  286. psf_log_printf (psf, "    esf_field4 : ") ;
  287. for (k = 0 ; k < 8 ; k++)
  288. { bytesread += psf_binheader_readf (psf, "1", &(wav_fmt->ext.esf.esf_field4 [k])) ;
  289. psf_log_printf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ;
  290. } ;
  291. psf_log_printf (psf, "n") ;
  292. psf->bytewidth = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ;
  293. /* Compare GUIDs for known ones. */
  294. if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_PCM))
  295. { psf->sf.format = SF_FORMAT_WAVEX | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
  296. psf_log_printf (psf, "    format : pcmn") ;
  297. }
  298. else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_MS_ADPCM))
  299. { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM) ;
  300. psf_log_printf (psf, "    format : ms adpcmn") ;
  301. }
  302. else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_IEEE_FLOAT))
  303. { psf->sf.format = SF_FORMAT_WAVEX | ((psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT) ;
  304. psf_log_printf (psf, "    format : IEEE floatn") ;
  305. }
  306. else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_ALAW))
  307. { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_ALAW) ;
  308. psf_log_printf (psf, "    format : A-lawn") ;
  309. }
  310. else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_MULAW))
  311. { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_ULAW) ;
  312. psf_log_printf (psf, "    format : u-lawn") ;
  313. }
  314. else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM))
  315. { psf->sf.format = SF_FORMAT_WAVEX | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
  316. psf_log_printf (psf, "    format : pcm (Ambisonic B)n") ;
  317. wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ;
  318. }
  319. else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT))
  320. { psf->sf.format = SF_FORMAT_WAVEX | ((psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT) ;
  321. psf_log_printf (psf, "    format : IEEE float (Ambisonic B)n") ;
  322. wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ;
  323. }
  324. else
  325. return SFE_UNIMPLEMENTED ;
  326. break ;
  327. case WAVE_FORMAT_G721_ADPCM :
  328. psf_log_printf (psf, "  Bytes/sec     : %dn", wav_fmt->g72x.bytespersec) ;
  329. if (fmtsize >= 20)
  330. { bytesread += psf_binheader_readf (psf, "22", &(wav_fmt->g72x.extrabytes), &(wav_fmt->g72x.auxblocksize)) ;
  331. if (wav_fmt->g72x.extrabytes == 0)
  332. psf_log_printf (psf, "  Extra Bytes   : %d (should be 2)n", wav_fmt->g72x.extrabytes) ;
  333. else
  334. psf_log_printf (psf, "  Extra Bytes   : %dn", wav_fmt->g72x.extrabytes) ;
  335. psf_log_printf (psf, "  Aux Blk Size  : %dn", wav_fmt->g72x.auxblocksize) ;
  336. }
  337. else if (fmtsize == 18)
  338. { bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->g72x.extrabytes)) ;
  339. psf_log_printf (psf, "  Extra Bytes   : %d%sn", wav_fmt->g72x.extrabytes, wav_fmt->g72x.extrabytes != 0 ? " (should be 0)" : "") ;
  340. }
  341. else
  342. psf_log_printf (psf, "*** 'fmt ' chunk should be bigger than this!n") ;
  343. break ;
  344. default :
  345. psf_log_printf (psf, "*** No 'fmt ' chunk dumper for this format!n") ;
  346. return SFE_WAV_BAD_FMT ;
  347. } ;
  348. if (bytesread > fmtsize)
  349. { psf_log_printf (psf, "*** wav_w64_read_fmt_chunk (bytesread > fmtsize)n") ;
  350. return SFE_WAV_BAD_FMT ;
  351. }
  352. else
  353. psf_binheader_readf (psf, "j", fmtsize - bytesread) ;
  354. psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ;
  355. return 0 ;
  356. } /* wav_w64_read_fmt_chunk */
  357. void
  358. wavex_write_guid (SF_PRIVATE *psf, const EXT_SUBFORMAT * subformat)
  359. {
  360. psf_binheader_writef (psf, "422b", subformat->esf_field1,
  361. subformat->esf_field2, subformat->esf_field3,
  362. subformat->esf_field4, make_size_t (8)) ;
  363. } /* wavex_write_guid */
  364. int
  365. wavex_gen_channel_mask (const int *chan_map, int channels)
  366. { int chan, mask = 0, bit = -1, last_bit = -1 ;
  367. if (chan_map == NULL)
  368. return 0 ;
  369. for (chan = 0 ; chan < channels ; chan ++)
  370. { int k ;
  371. for (k = bit + 1 ; k < ARRAY_LEN (channel_mask_bits) ; k++)
  372. if (chan_map [chan] == channel_mask_bits [k].id)
  373. { bit = k ;
  374. break ;
  375. } ;
  376. /* Check for bad sequence. */
  377. if (bit <= last_bit)
  378. return 0 ;
  379. mask += 1 << bit ;
  380. last_bit = bit ;
  381. } ;
  382. return mask ;
  383. } /* wavex_gen_channel_mask */
  384. void
  385. wav_w64_analyze (SF_PRIVATE *psf)
  386. { AUDIO_DETECT ad ;
  387. int format = 0 ;
  388. if (psf->is_pipe)
  389. { psf_log_printf (psf, "*** Error : Reading from a pipe. Can't analyze data section to figure out real data format.nn") ;
  390. return ;
  391. } ;
  392. psf_log_printf (psf, "---------------------------------------------------n"
  393. "Format is known to be broken. Using detection code.n") ;
  394. /* Code goes here. */
  395. ad.endianness = SF_ENDIAN_LITTLE ;
  396. ad.channels = psf->sf.channels ;
  397. psf_fseek (psf, 3 * 4 * 50, SEEK_SET) ;
  398. while (psf_fread (psf->u.ucbuf, 1, 4096, psf) == 4096)
  399. { format = audio_detect (psf, &ad, psf->u.ucbuf, 4096) ;
  400. if (format != 0)
  401. break ;
  402. } ;
  403. /* Seek to start of DATA section. */
  404. psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
  405. if (format == 0)
  406. { psf_log_printf (psf, "wav_w64_analyze : detection failed.n") ;
  407. return ;
  408. } ;
  409. switch (format)
  410. { case SF_FORMAT_PCM_32 :
  411. case SF_FORMAT_FLOAT :
  412. psf_log_printf (psf, "wav_w64_analyze : found format : 0x%Xn", format) ;
  413. psf->sf.format = (psf->sf.format & ~SF_FORMAT_SUBMASK) + format ;
  414. psf->bytewidth = 4 ;
  415. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  416. break ;
  417. case SF_FORMAT_PCM_24 :
  418. psf_log_printf (psf, "wav_w64_analyze : found format : 0x%Xn", format) ;
  419. psf->sf.format = (psf->sf.format & ~SF_FORMAT_SUBMASK) + format ;
  420. psf->bytewidth = 3 ;
  421. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  422. break ;
  423. default :
  424. psf_log_printf (psf, "wav_w64_analyze : unhandled format : 0x%Xn", format) ;
  425. break ;
  426. } ;
  427. return ;
  428. } /* wav_w64_analyze */
  429. /*==============================================================================
  430. */
  431. typedef struct
  432. { int ID ;
  433. const char *name ;
  434. } WAV_FORMAT_DESC ;
  435. #define STR(x) #x
  436. #define FORMAT_TYPE(x) { x, STR (x) }
  437. static WAV_FORMAT_DESC wave_descs [] =
  438. { FORMAT_TYPE (WAVE_FORMAT_PCM),
  439. FORMAT_TYPE (WAVE_FORMAT_MS_ADPCM),
  440. FORMAT_TYPE (WAVE_FORMAT_IEEE_FLOAT),
  441. FORMAT_TYPE (WAVE_FORMAT_VSELP),
  442. FORMAT_TYPE (WAVE_FORMAT_IBM_CVSD),
  443. FORMAT_TYPE (WAVE_FORMAT_ALAW),
  444. FORMAT_TYPE (WAVE_FORMAT_MULAW),
  445. FORMAT_TYPE (WAVE_FORMAT_OKI_ADPCM),
  446. FORMAT_TYPE (WAVE_FORMAT_IMA_ADPCM),
  447. FORMAT_TYPE (WAVE_FORMAT_MEDIASPACE_ADPCM),
  448. FORMAT_TYPE (WAVE_FORMAT_SIERRA_ADPCM),
  449. FORMAT_TYPE (WAVE_FORMAT_G723_ADPCM),
  450. FORMAT_TYPE (WAVE_FORMAT_DIGISTD),
  451. FORMAT_TYPE (WAVE_FORMAT_DIGIFIX),
  452. FORMAT_TYPE (WAVE_FORMAT_DIALOGIC_OKI_ADPCM),
  453. FORMAT_TYPE (WAVE_FORMAT_MEDIAVISION_ADPCM),
  454. FORMAT_TYPE (WAVE_FORMAT_CU_CODEC),
  455. FORMAT_TYPE (WAVE_FORMAT_YAMAHA_ADPCM),
  456. FORMAT_TYPE (WAVE_FORMAT_SONARC),
  457. FORMAT_TYPE (WAVE_FORMAT_DSPGROUP_TRUESPEECH),
  458. FORMAT_TYPE (WAVE_FORMAT_ECHOSC1),
  459. FORMAT_TYPE (WAVE_FORMAT_AUDIOFILE_AF36),
  460. FORMAT_TYPE (WAVE_FORMAT_APTX),
  461. FORMAT_TYPE (WAVE_FORMAT_AUDIOFILE_AF10),
  462. FORMAT_TYPE (WAVE_FORMAT_PROSODY_1612),
  463. FORMAT_TYPE (WAVE_FORMAT_LRC),
  464. FORMAT_TYPE (WAVE_FORMAT_DOLBY_AC2),
  465. FORMAT_TYPE (WAVE_FORMAT_GSM610),
  466. FORMAT_TYPE (WAVE_FORMAT_MSNAUDIO),
  467. FORMAT_TYPE (WAVE_FORMAT_ANTEX_ADPCME),
  468. FORMAT_TYPE (WAVE_FORMAT_CONTROL_RES_VQLPC),
  469. FORMAT_TYPE (WAVE_FORMAT_DIGIREAL),
  470. FORMAT_TYPE (WAVE_FORMAT_DIGIADPCM),
  471. FORMAT_TYPE (WAVE_FORMAT_CONTROL_RES_CR10),
  472. FORMAT_TYPE (WAVE_FORMAT_NMS_VBXADPCM),
  473. FORMAT_TYPE (WAVE_FORMAT_ROLAND_RDAC),
  474. FORMAT_TYPE (WAVE_FORMAT_ECHOSC3),
  475. FORMAT_TYPE (WAVE_FORMAT_ROCKWELL_ADPCM),
  476. FORMAT_TYPE (WAVE_FORMAT_ROCKWELL_DIGITALK),
  477. FORMAT_TYPE (WAVE_FORMAT_XEBEC),
  478. FORMAT_TYPE (WAVE_FORMAT_G721_ADPCM),
  479. FORMAT_TYPE (WAVE_FORMAT_G728_CELP),
  480. FORMAT_TYPE (WAVE_FORMAT_MSG723),
  481. FORMAT_TYPE (WAVE_FORMAT_MPEG),
  482. FORMAT_TYPE (WAVE_FORMAT_RT24),
  483. FORMAT_TYPE (WAVE_FORMAT_PAC),
  484. FORMAT_TYPE (WAVE_FORMAT_MPEGLAYER3),
  485. FORMAT_TYPE (WAVE_FORMAT_LUCENT_G723),
  486. FORMAT_TYPE (WAVE_FORMAT_CIRRUS),
  487. FORMAT_TYPE (WAVE_FORMAT_ESPCM),
  488. FORMAT_TYPE (WAVE_FORMAT_VOXWARE),
  489. FORMAT_TYPE (WAVE_FORMAT_CANOPUS_ATRAC),
  490. FORMAT_TYPE (WAVE_FORMAT_G726_ADPCM),
  491. FORMAT_TYPE (WAVE_FORMAT_G722_ADPCM),
  492. FORMAT_TYPE (WAVE_FORMAT_DSAT),
  493. FORMAT_TYPE (WAVE_FORMAT_DSAT_DISPLAY),
  494. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_BYTE_ALIGNED),
  495. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC8),
  496. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC10),
  497. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC16),
  498. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC20),
  499. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT24),
  500. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT29),
  501. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT29HW),
  502. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_VR12),
  503. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_VR18),
  504. FORMAT_TYPE (WAVE_FORMAT_VOXWARE_TQ40),
  505. FORMAT_TYPE (WAVE_FORMAT_SOFTSOUND),
  506. FORMAT_TYPE (WAVE_FORMAT_VOXARE_TQ60),
  507. FORMAT_TYPE (WAVE_FORMAT_MSRT24),
  508. FORMAT_TYPE (WAVE_FORMAT_G729A),
  509. FORMAT_TYPE (WAVE_FORMAT_MVI_MV12),
  510. FORMAT_TYPE (WAVE_FORMAT_DF_G726),
  511. FORMAT_TYPE (WAVE_FORMAT_DF_GSM610),
  512. FORMAT_TYPE (WAVE_FORMAT_ONLIVE),
  513. FORMAT_TYPE (WAVE_FORMAT_SBC24),
  514. FORMAT_TYPE (WAVE_FORMAT_DOLBY_AC3_SPDIF),
  515. FORMAT_TYPE (WAVE_FORMAT_ZYXEL_ADPCM),
  516. FORMAT_TYPE (WAVE_FORMAT_PHILIPS_LPCBB),
  517. FORMAT_TYPE (WAVE_FORMAT_PACKED),
  518. FORMAT_TYPE (WAVE_FORMAT_RHETOREX_ADPCM),
  519. FORMAT_TYPE (IBM_FORMAT_MULAW),
  520. FORMAT_TYPE (IBM_FORMAT_ALAW),
  521. FORMAT_TYPE (IBM_FORMAT_ADPCM),
  522. FORMAT_TYPE (WAVE_FORMAT_VIVO_G723),
  523. FORMAT_TYPE (WAVE_FORMAT_VIVO_SIREN),
  524. FORMAT_TYPE (WAVE_FORMAT_DIGITAL_G723),
  525. FORMAT_TYPE (WAVE_FORMAT_CREATIVE_ADPCM),
  526. FORMAT_TYPE (WAVE_FORMAT_CREATIVE_FASTSPEECH8),
  527. FORMAT_TYPE (WAVE_FORMAT_CREATIVE_FASTSPEECH10),
  528. FORMAT_TYPE (WAVE_FORMAT_QUARTERDECK),
  529. FORMAT_TYPE (WAVE_FORMAT_FM_TOWNS_SND),
  530. FORMAT_TYPE (WAVE_FORMAT_BZV_DIGITAL),
  531. FORMAT_TYPE (WAVE_FORMAT_VME_VMPCM),
  532. FORMAT_TYPE (WAVE_FORMAT_OLIGSM),
  533. FORMAT_TYPE (WAVE_FORMAT_OLIADPCM),
  534. FORMAT_TYPE (WAVE_FORMAT_OLICELP),
  535. FORMAT_TYPE (WAVE_FORMAT_OLISBC),
  536. FORMAT_TYPE (WAVE_FORMAT_OLIOPR),
  537. FORMAT_TYPE (WAVE_FORMAT_LH_CODEC),
  538. FORMAT_TYPE (WAVE_FORMAT_NORRIS),
  539. FORMAT_TYPE (WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS),
  540. FORMAT_TYPE (WAVE_FORMAT_DVM),
  541. FORMAT_TYPE (WAVE_FORMAT_INTERWAV_VSC112),
  542. FORMAT_TYPE (WAVE_FORMAT_IPP_ITU_G_723_1),
  543. FORMAT_TYPE (WAVE_FORMAT_EXTENSIBLE),
  544. } ;
  545. char const*
  546. wav_w64_format_str (int k)
  547. { int lower, upper, mid ;
  548. lower = -1 ;
  549. upper = sizeof (wave_descs) / sizeof (WAV_FORMAT_DESC) ;
  550. /* binary search */
  551. if ((wave_descs [0].ID <= k) && (k <= wave_descs [upper - 1].ID))
  552. {
  553. while (lower + 1 < upper)
  554. { mid = (upper + lower) / 2 ;
  555. if (k == wave_descs [mid].ID)
  556. return wave_descs [mid].name ;
  557. if (k < wave_descs [mid].ID)
  558. upper = mid ;
  559. else
  560. lower = mid ;
  561. } ;
  562. } ;
  563. return "Unknown format" ;
  564. } /* wav_w64_format_str */
  565. int
  566. wav_w64_srate2blocksize (int srate_chan_product)
  567. { if (srate_chan_product < 12000)
  568. return 256 ;
  569. if (srate_chan_product < 23000)
  570. return 512 ;
  571. if (srate_chan_product < 44000)
  572. return 1024 ;
  573. return 2048 ;
  574. } /* srate2blocksize */