wav.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:38k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2. ** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
  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. #include <stdio.h>
  19. #include <unistd.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include "sndfile.h"
  23. #include "config.h"
  24. #include "sfendian.h"
  25. #include "common.h"
  26. #include "pcm.h"
  27. #include "ulaw.h"
  28. #include "alaw.h"
  29. #include "wav.h"
  30. /*------------------------------------------------------------------------------
  31. ** List of known WAV format tags
  32. */
  33. enum
  34. {
  35. WAVE_FORMAT_UNKNOWN = 0x0000, /* Microsoft Corporation */
  36. WAVE_FORMAT_PCM          = 0x0001,  /* Microsoft PCM format */
  37. WAVE_FORMAT_MS_ADPCM = 0x0002, /* Microsoft ADPCM */
  38. WAVE_FORMAT_IEEE_FLOAT = 0x0003, /* Micrososft 32 bit float format */
  39. WAVE_FORMAT_IBM_CVSD = 0x0005, /* IBM Corporation */
  40. WAVE_FORMAT_ALAW = 0x0006, /* Microsoft Corporation */
  41. WAVE_FORMAT_MULAW = 0x0007, /* Microsoft Corporation */
  42. WAVE_FORMAT_OKI_ADPCM = 0x0010, /* OKI */
  43. WAVE_FORMAT_IMA_ADPCM = 0x0011, /* Intel Corporation */
  44. WAVE_FORMAT_MEDIASPACE_ADPCM = 0x0012, /* Videologic */
  45. WAVE_FORMAT_SIERRA_ADPCM = 0x0013, /* Sierra Semiconductor Corp */
  46. WAVE_FORMAT_G723_ADPCM = 0x0014, /* Antex Electronics Corporation */
  47. WAVE_FORMAT_DIGISTD = 0x0015, /* DSP Solutions, Inc. */
  48. WAVE_FORMAT_DIGIFIX = 0x0016, /* DSP Solutions, Inc. */
  49. WAVE_FORMAT_DIALOGIC_OKI_ADPCM = 0x0017, /*  Dialogic Corporation  */
  50. WAVE_FORMAT_MEDIAVISION_ADPCM = 0x0018, /*  Media Vision, Inc. */
  51. WAVE_FORMAT_YAMAHA_ADPCM = 0x0020, /* Yamaha Corporation of America */
  52. WAVE_FORMAT_SONARC = 0x0021, /* Speech Compression */
  53. WAVE_FORMAT_DSPGROUP_TRUESPEECH = 0x0022, /* DSP Group, Inc */
  54. WAVE_FORMAT_ECHOSC1 = 0x0023, /* Echo Speech Corporation */
  55. WAVE_FORMAT_AUDIOFILE_AF18   = 0x0024, /* Audiofile, Inc. */
  56. WAVE_FORMAT_APTX = 0x0025, /* Audio Processing Technology */
  57. WAVE_FORMAT_AUDIOFILE_AF10   = 0x0026, /* Audiofile, Inc. */
  58. WAVE_FORMAT_DOLBY_AC2 = 0x0030, /* Dolby Laboratories */
  59. WAVE_FORMAT_GSM610 = 0x0031, /* Microsoft Corporation */
  60. WAVE_FORMAT_MSNAUDIO = 0x0032, /* Microsoft Corporation */
  61. WAVE_FORMAT_ANTEX_ADPCME = 0x0033,  /* Antex Electronics Corporation */
  62. WAVE_FORMAT_CONTROL_RES_VQLPC = 0x0034, /* Control Resources Limited */
  63. WAVE_FORMAT_DIGIREAL = 0x0035, /* DSP Solutions, Inc. */
  64. WAVE_FORMAT_DIGIADPCM = 0x0036, /* DSP Solutions, Inc. */
  65. WAVE_FORMAT_CONTROL_RES_CR10 = 0x0037, /* Control Resources Limited */
  66. WAVE_FORMAT_NMS_VBXADPCM = 0x0038, /* Natural MicroSystems */
  67. WAVE_FORMAT_ROCKWELL_ADPCM = 0x003B, /* Rockwell International */
  68. WAVE_FORMAT_ROCKWELL_DIGITALK = 0x003C,  /* Rockwell International */
  69. WAVE_FORMAT_G721_ADPCM = 0x0040, /* Antex Electronics Corporation */
  70. WAVE_FORMAT_MPEG = 0x0050, /* Microsoft Corporation */
  71. WAVE_FORMAT_MPEGLAYER3 = 0x0055, /* MPEG 3 Layer 1 */
  72. IBM_FORMAT_MULAW = 0x0101, /* IBM mu-law format */
  73. IBM_FORMAT_ALAW = 0x0102, /* IBM a-law format */
  74. IBM_FORMAT_ADPCM = 0x0103, /* IBM AVC Adaptive Differential PCM format */
  75. WAVE_FORMAT_CREATIVE_ADPCM = 0x0200, /* Creative Labs, Inc */
  76. WAVE_FORMAT_FM_TOWNS_SND = 0x0300, /* Fujitsu Corp. */
  77. WAVE_FORMAT_OLIGSM = 0x1000, /* Ing C. Olivetti & C., S.p.A. */
  78. WAVE_FORMAT_OLIADPCM = 0x1001, /* Ing C. Olivetti & C., S.p.A. */
  79. WAVE_FORMAT_OLICELP = 0x1002, /* Ing C. Olivetti & C., S.p.A. */
  80. WAVE_FORMAT_OLISBC = 0x1003, /* Ing C. Olivetti & C., S.p.A. */
  81. WAVE_FORMAT_OLIOPR = 0x1004, /* Ing C. Olivetti & C., S.p.A. */
  82. WAVE_FORMAT_EXTENSIBLE = 0xFFFE
  83. } ;
  84. /*------------------------------------------------------------------------------
  85.  * Macros to handle big/little endian issues.
  86.  */
  87. #if (CPU_IS_LITTLE_ENDIAN == 1)
  88. # define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
  89. #elif (CPU_IS_BIG_ENDIAN == 1)
  90. # define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
  91. #else
  92. # error "Cannot determine endian-ness of processor."
  93. #endif
  94. #define RIFF_MARKER (MAKE_MARKER ('R', 'I', 'F', 'F')) 
  95. #define WAVE_MARKER (MAKE_MARKER ('W', 'A', 'V', 'E')) 
  96. #define fmt_MARKER (MAKE_MARKER ('f', 'm', 't', ' ')) 
  97. #define data_MARKER (MAKE_MARKER ('d', 'a', 't', 'a')) 
  98. #define cue_MARKER (MAKE_MARKER ('c', 'u', 'e', ' ')) 
  99. #define LIST_MARKER (MAKE_MARKER ('L', 'I', 'S', 'T')) 
  100. #define slnt_MARKER (MAKE_MARKER ('s', 'l', 'n', 't')) 
  101. #define wavl_MARKER (MAKE_MARKER ('w', 'a', 'v', 'l')) 
  102. #define INFO_MARKER (MAKE_MARKER ('I', 'N', 'F', 'O')) 
  103. #define plst_MARKER (MAKE_MARKER ('p', 'l', 's', 't')) 
  104. #define adtl_MARKER (MAKE_MARKER ('a', 'd', 't', 'l')) 
  105. #define labl_MARKER (MAKE_MARKER ('l', 'a', 'b', 'l')) 
  106. #define note_MARKER (MAKE_MARKER ('n', 'o', 't', 'e')) 
  107. #define fact_MARKER (MAKE_MARKER ('f', 'a', 'c', 't')) 
  108. #define smpl_MARKER (MAKE_MARKER ('s', 'm', 'p', 'l')) 
  109. #define bext_MARKER (MAKE_MARKER ('b', 'e', 'x', 't')) 
  110. #define MEXT_MARKER (MAKE_MARKER ('M', 'E', 'X', 'T')) 
  111. #define DISP_MARKER (MAKE_MARKER ('D', 'I', 'S', 'P')) 
  112. /*------------------------------------------------------------------------------
  113.  * Private static functions.
  114.  */
  115. static int read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt) ;
  116. static int write_header (SF_PRIVATE *psf, WAV_FMT *wav_fmt, unsigned int size, int do_fact) ;
  117. static const  char* wav_format_str (int k) ;
  118. static void le2h_wav_fmt (WAV_FMT *fmt) ;
  119. static void h2le_wav_fmt (WAV_FMT *fmt) ;
  120. /*------------------------------------------------------------------------------
  121.  * Public functions.
  122.  */
  123. int  wav_open_read (SF_PRIVATE *psf)
  124. { WAV_FMT wav_fmt ;
  125. FACT_CHUNK fact_chunk ;
  126. unsigned int dword, marker, RIFFsize ;
  127. int parsestage = 0, error, format = 0 ;
  128. /*or*/
  129. int force_open; 
  130. force_open = ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORCE_OPEN)?1:0;
  131. /*end or*/
  132. psf->sf.seekable = SF_TRUE ;
  133. while (1)
  134. { fread (&marker, sizeof (marker), 1, psf->file) ;
  135. switch (marker)
  136. { case RIFF_MARKER :
  137. if (parsestage != 0)
  138. return SFE_WAV_NO_RIFF ;
  139. fread (&dword, sizeof (dword), 1, psf->file) ;
  140. RIFFsize = LE2H_INT (dword) ;
  141. if (psf->filelength  < RIFFsize + 2 * sizeof (dword))
  142. { dword = psf->filelength - 2 * sizeof (dword);
  143. psf_sprintf (psf, "RIFF : %d (should be %d)n", RIFFsize, dword) ;
  144. RIFFsize = dword ;
  145. }
  146. else
  147. psf_sprintf (psf, "RIFF : %dn", RIFFsize) ;
  148. parsestage = 1 ;
  149. break ;
  150. case WAVE_MARKER :
  151. if (parsestage != 1)
  152. return SFE_WAV_NO_WAVE ;
  153. psf_sprintf (psf, "WAVEn") ;
  154. parsestage = 2 ;
  155. break ;
  156. case fmt_MARKER :
  157. if (parsestage != 2)
  158. return SFE_WAV_NO_FMT ;
  159. if ((error = read_fmt_chunk (psf, &wav_fmt)))
  160. return error ;
  161. format     = wav_fmt.format ;
  162. parsestage = 3 ;
  163. break ;
  164. case data_MARKER :
  165. if (parsestage < 3)
  166. return SFE_WAV_NO_DATA ;
  167. fread (&dword, sizeof (dword), 1, psf->file) ;
  168. psf->datalength = LE2H_INT (dword) ;
  169. psf->dataoffset = ftell (psf->file) ;
  170. if (psf->filelength < psf->dataoffset + psf->datalength)
  171. { psf_sprintf (psf, "data : %d (should be %d)n", psf->datalength, psf->filelength - psf->dataoffset) ;
  172. psf->datalength = psf->filelength - psf->dataoffset ;
  173. }
  174. else
  175. psf_sprintf (psf, "data : %dn", psf->datalength) ;
  176. if (format == WAVE_FORMAT_MS_ADPCM && psf->datalength % 2)
  177. { psf->datalength ++ ;
  178. psf_sprintf (psf, "*** Data length odd. Increasing it by 1.n") ;
  179. } ;
  180. fseek (psf->file, psf->datalength, SEEK_CUR) ;
  181. dword = ftell (psf->file) ;
  182. if (dword != (off_t) (psf->dataoffset + psf->datalength))
  183. psf_sprintf (psf, "*** fseek past end error ***n", dword, psf->dataoffset + psf->datalength) ;
  184. break ;
  185. case fact_MARKER :
  186. fread (&dword, sizeof (dword), 1, psf->file) ;
  187. dword = LE2H_INT (dword) ;
  188. fread (&fact_chunk, sizeof (fact_chunk), 1, psf->file) ;
  189. if (dword > sizeof (fact_chunk))
  190. fseek (psf->file, (int) (dword - sizeof (fact_chunk)), SEEK_CUR) ;
  191. fact_chunk.samples = LE2H_INT (fact_chunk.samples) ;
  192. psf_sprintf (psf, "%D : %dn", marker, dword) ;
  193. psf_sprintf (psf, "  samples : %dn", fact_chunk.samples) ;
  194. break ;
  195. case cue_MARKER :
  196. case LIST_MARKER :
  197. case INFO_MARKER :
  198. case smpl_MARKER :
  199. case bext_MARKER :
  200. case MEXT_MARKER :
  201. case DISP_MARKER :
  202. fread (&dword, sizeof (dword), 1, psf->file) ;
  203. dword = LE2H_INT (dword) ;
  204. psf_sprintf (psf, "%D : %dn", marker, dword) ;
  205. fseek (psf->file, (int) dword, SEEK_CUR) ;
  206. break ;
  207. default : 
  208. if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
  209. && isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
  210. { fread (&dword, sizeof (dword), 1, psf->file) ;
  211. psf_sprintf (psf, "%D : %d (unknown marker)n", marker, dword) ;
  212. fseek (psf->file, (int) dword, SEEK_CUR) ;
  213. break ;
  214. } ;
  215. if ((dword = ftell (psf->file)) & 0x03)
  216. { psf_sprintf (psf, "  Unknown chunk marker at position %d. Resynching.n", dword - 4) ;
  217. fseek (psf->file, -3, SEEK_CUR) ;
  218. break ;
  219. } ;
  220. psf_sprintf (psf, "*** Unknown chunk marker : %X. Exiting parser.n", marker) ;
  221. break ;
  222. } ; /* switch (dword) */
  223. if (ferror (psf->file))
  224. { psf_sprintf (psf, "*** Error on file handle. ***n", marker) ;
  225. clearerr (psf->file) ;
  226. break ;
  227. } ;
  228. if (ftell (psf->file) >= (int) (psf->filelength - (2 * sizeof (dword))))
  229. break ;
  230. } ; /* while (1) */
  231. if (! psf->dataoffset)
  232. return SFE_WAV_NO_DATA ;
  233. psf->current     = 0 ;
  234. psf->endian      = SF_ENDIAN_LITTLE ; /* All WAV files are little endian. */
  235. psf->sf.sections = 1 ;
  236. fseek (psf->file, psf->dataoffset, SEEK_SET) ;
  237. psf->close = (func_close) wav_close ;
  238. //or
  239. if(force_open)
  240. {
  241.     psf->sf.format_tag = format;
  242.     psf->sf.bytewidth = psf->bytewidth;
  243.     psf->sf.avg_bytes_per_sec=wav_fmt.min.bytespersec;
  244.     psf->sf.format = SF_FORMAT_WAV | SF_FORCE_OPEN ;
  245. }    
  246. //end or
  247. if (psf->blockwidth)
  248. { if (psf->filelength - psf->dataoffset < psf->datalength)
  249. psf->sf.samples = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
  250. else
  251. psf->sf.samples = psf->datalength / psf->blockwidth ;
  252. } ;
  253. switch (format)
  254. { case  WAVE_FORMAT_PCM :
  255. case WAVE_FORMAT_EXTENSIBLE :
  256. break ;
  257. case WAVE_FORMAT_MULAW :
  258. if(!force_open) //or
  259.          psf->sf.format   = (SF_FORMAT_WAV | SF_FORMAT_ULAW) ;
  260. psf->read_short  = (func_short)  ulaw_read_ulaw2s ;
  261. psf->read_int    = (func_int)    ulaw_read_ulaw2i ;
  262. psf->read_double = (func_double) ulaw_read_ulaw2d ;
  263. return 0 ;
  264. case WAVE_FORMAT_ALAW :
  265. if(!force_open) //or
  266.     psf->sf.format   = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ;
  267. psf->read_short  = (func_short)  alaw_read_alaw2s ;
  268. psf->read_int    = (func_int)    alaw_read_alaw2i ;
  269. psf->read_double = (func_double) alaw_read_alaw2d ;
  270. return 0 ;
  271. case WAVE_FORMAT_MS_ADPCM : 
  272. if(!force_open) //or
  273.     psf->sf.format   = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ;
  274. if ((error = msadpcm_reader_init (psf, &wav_fmt)))
  275. return error ;
  276. psf->read_short  = (func_short)  msadpcm_read_s ;
  277. psf->read_int    = (func_int)    msadpcm_read_i ;
  278. psf->read_double = (func_double) msadpcm_read_d ;
  279. psf->seek_func   = (func_seek)   msadpcm_seek ;
  280. return 0 ;
  281. case WAVE_FORMAT_IMA_ADPCM :
  282. if(!force_open) //or
  283.     psf->sf.format   = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ;
  284. if ((error = wav_ima_reader_init (psf, &wav_fmt)))
  285. return error ;
  286. psf->read_short  = (func_short)  ima_read_s ;
  287. psf->read_int    = (func_int)    ima_read_i ;
  288. psf->read_double = (func_double) ima_read_d ;
  289. psf->seek_func   = (func_seek)   ima_seek ;
  290. return 0 ;
  291. case WAVE_FORMAT_GSM610 :
  292. if(!force_open) //or
  293.     psf->sf.format   = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ;
  294. if ((error = wav_gsm610_reader_init (psf, &wav_fmt)))
  295. return error ;
  296. psf->read_short  = (func_short)  wav_gsm610_read_s ;
  297. psf->read_int    = (func_int)    wav_gsm610_read_i ;
  298. psf->read_double = (func_double) wav_gsm610_read_d ;
  299. psf->seek_func   = NULL ;  /* Not seekable */
  300. return 0 ;
  301. case WAVE_FORMAT_IEEE_FLOAT :
  302. if(!force_open) //or
  303.     psf->sf.format   = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
  304. if (CAN_READ_WRITE_x86_IEEE)
  305. { psf->read_short  = (func_short)  pcm_read_f2s ;
  306. psf->read_int    = (func_int)    pcm_read_f2i ;
  307. psf->read_double = (func_double) pcm_read_f2d ;
  308. }
  309. else 
  310. { psf->read_short  = (func_short)  wav_read_x86f2s ;
  311. psf->read_int    = (func_int)    wav_read_x86f2i ;
  312. psf->read_double = (func_double) wav_read_x86f2d ;
  313. } ;
  314. return 0 ;
  315. default :
  316. {
  317.     //or
  318.     if(force_open)
  319. return 0;
  320.     else
  321.     // end or
  322. return SFE_UNIMPLEMENTED ;
  323. }
  324. } ;
  325. if(!force_open) //or
  326.     psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ;
  327. switch (psf->bytewidth)
  328. { case  1 :
  329. psf->read_short  = (func_short)  pcm_read_uc2s ;
  330. psf->read_int    = (func_int)    pcm_read_uc2i ;
  331. psf->read_double = (func_double) pcm_read_uc2d ;
  332. break ;
  333. case  2 :
  334. psf->read_short  = (func_short)  pcm_read_les2s ;
  335. psf->read_int    = (func_int)    pcm_read_les2i ;
  336. psf->read_double = (func_double) pcm_read_les2d ;
  337. break ;
  338. case  3 :
  339. psf->read_short  = (func_short)  pcm_read_let2s ;
  340. psf->read_int    = (func_int)    pcm_read_let2i ;
  341. psf->read_double = (func_double) pcm_read_let2d ;
  342. break ;
  343. case  4 :
  344. psf->read_short  = (func_short)  pcm_read_lei2s ;
  345. psf->read_int    = (func_int)    pcm_read_lei2i ;
  346. psf->read_double = (func_double) pcm_read_lei2d ;
  347. break ;
  348. default : return SFE_UNIMPLEMENTED ;
  349. } ;
  350. return 0 ;
  351. } /* wav_open_read */
  352. /*------------------------------------------------------------------------------
  353.  */
  354. int  wav_open_write (SF_PRIVATE *psf)
  355. { WAV_FMT wav_fmt ;
  356. unsigned int dword, subformat ;
  357. int error ;
  358. if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_WAV)
  359. return SFE_BAD_OPEN_FORMAT ;
  360. psf->endian      = SF_ENDIAN_LITTLE ; /* All WAV files are little endian. */
  361. psf->sf.seekable = SF_TRUE ;
  362. psf->error       = 0 ;
  363. subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
  364. if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
  365. psf->bytewidth = 1 ;
  366. else
  367. //or
  368.     if(subformat == SF_FORCE_OPEN)
  369. psf->bytewidth = psf->sf.bytewidth;
  370.     else
  371. //end or    
  372. psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  373. psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
  374. wav_fmt.min.channels    = psf->sf.channels ;
  375. wav_fmt.min.samplerate  = psf->sf.samplerate ;
  376. //or
  377. if(subformat == SF_FORCE_OPEN)
  378.     wav_fmt.min.bytespersec = psf->sf.avg_bytes_per_sec;
  379. else
  380. //end or
  381.          wav_fmt.min.bytespersec = psf->sf.samplerate * psf->bytewidth * psf->sf.channels ;
  382. wav_fmt.min.blockalign  = psf->bytewidth * psf->sf.channels ;
  383. //or
  384. if(subformat == SF_FORCE_OPEN)
  385. {
  386.     switch(psf->sf.format_tag)
  387.     {
  388.     case 6: //alaw
  389.     case 7: //ulaw 
  390. wav_fmt.min.bitwidth = 8 ;
  391. break;
  392.     default:
  393. wav_fmt.min.bitwidth    = psf->sf.pcmbitwidth ;
  394.     }
  395. }
  396. else
  397. //end or
  398.     wav_fmt.min.bitwidth    = psf->sf.pcmbitwidth ;
  399. switch (psf->sf.format & SF_FORMAT_SUBMASK)
  400. { case SF_FORMAT_PCM : 
  401. wav_fmt.format = WAVE_FORMAT_PCM ;
  402. psf->dataoffset  = 7 * sizeof (dword) + sizeof (MIN_WAV_FMT) ;
  403. psf->datalength  = psf->blockwidth * psf->sf.samples ;
  404. psf->filelength  = psf->datalength + psf->dataoffset ;
  405. write_header (psf, &wav_fmt, sizeof (MIN_WAV_FMT), 0) ;
  406. break ;
  407. case SF_FORMAT_FLOAT : 
  408. wav_fmt.format = WAVE_FORMAT_IEEE_FLOAT ;
  409. psf->dataoffset  = 9 * sizeof (dword) + sizeof (MIN_WAV_FMT) + sizeof (FACT_CHUNK) ;
  410. psf->datalength  = psf->blockwidth * psf->sf.samples ;
  411. psf->filelength  = psf->datalength + psf->dataoffset ;
  412. write_header (psf, &wav_fmt, sizeof (MIN_WAV_FMT), 1) ;
  413. break ;
  414. case SF_FORMAT_ULAW : 
  415. wav_fmt.format = WAVE_FORMAT_MULAW ;
  416. wav_fmt.size20.bitwidth = 8 ;
  417. wav_fmt.size20.extrabytes = 0 ;
  418. wav_fmt.size20.dummy = 0 ;
  419. psf->dataoffset  = 9 * sizeof (dword) + sizeof (WAV_FMT_SIZE20) - 2 + sizeof (FACT_CHUNK) ;
  420. psf->datalength  = psf->blockwidth * psf->sf.samples ;
  421. psf->filelength  = psf->datalength + psf->dataoffset ;
  422. write_header (psf, &wav_fmt, sizeof (WAV_FMT_SIZE20), 1) ;
  423. break ;
  424. case SF_FORMAT_ALAW :
  425. wav_fmt.format = WAVE_FORMAT_ALAW ;
  426. wav_fmt.size20.bitwidth = 8 ;
  427. wav_fmt.size20.extrabytes = 0 ;
  428. wav_fmt.size20.dummy = 0 ;
  429. psf->dataoffset  = 9 * sizeof (dword) + sizeof (WAV_FMT_SIZE20) + sizeof (FACT_CHUNK) ;
  430. psf->datalength  = psf->blockwidth * psf->sf.samples ;
  431. psf->filelength  = psf->datalength + psf->dataoffset ;
  432. write_header (psf, &wav_fmt, sizeof (WAV_FMT_SIZE20), 1) ;
  433. break ;
  434. case SF_FORMAT_IMA_ADPCM : 
  435. wav_fmt.format = WAVE_FORMAT_IMA_ADPCM ;
  436. if ((error = wav_ima_writer_init (psf, &wav_fmt)))
  437. return error ;
  438. psf->dataoffset  = 9 * sizeof (dword) + sizeof (IMA_ADPCM_WAV_FMT) + sizeof (FACT_CHUNK) ;
  439. if (psf->sf.samples % wav_fmt.ima.samplesperblock)
  440. psf->datalength  = ((psf->sf.samples / wav_fmt.ima.samplesperblock) + 1) * wav_fmt.ima.samplesperblock ;
  441. else
  442. psf->datalength  = psf->sf.samples ;
  443. psf->filelength  = psf->datalength + psf->dataoffset ;
  444. write_header (psf, &wav_fmt, sizeof (IMA_ADPCM_WAV_FMT), 1) ;
  445. break ;
  446. case SF_FORMAT_MS_ADPCM : 
  447. wav_fmt.format = WAVE_FORMAT_MS_ADPCM ;
  448. msadpcm_writer_init (psf, &wav_fmt) ;
  449. psf->dataoffset  = 9 * sizeof (dword) + sizeof (MS_ADPCM_WAV_FMT) + sizeof (FACT_CHUNK) ;
  450. if (psf->sf.samples % wav_fmt.msadpcm.samplesperblock)
  451. psf->datalength  = ((psf->sf.samples / wav_fmt.msadpcm.samplesperblock) + 1) * wav_fmt.msadpcm.samplesperblock ;
  452. else
  453. psf->datalength  = psf->sf.samples ;
  454. psf->filelength  = psf->datalength + psf->dataoffset ;
  455. write_header (psf, &wav_fmt, sizeof (MS_ADPCM_WAV_FMT), 1) ;
  456. break ;
  457. case SF_FORMAT_GSM610 : 
  458. wav_fmt.format = WAVE_FORMAT_GSM610 ;
  459. wav_gsm610_writer_init (psf, &wav_fmt) ;
  460. psf->dataoffset  = 9 * sizeof (dword) + sizeof (GSM610_WAV_FMT) + sizeof (FACT_CHUNK) ;
  461. if (psf->sf.samples % wav_fmt.gsm610.samplesperblock)
  462. psf->datalength  = ((psf->sf.samples / wav_fmt.gsm610.samplesperblock) + 1) * wav_fmt.gsm610.samplesperblock ;
  463. else
  464. psf->datalength  = psf->sf.samples ;
  465. psf->filelength  = psf->datalength + psf->dataoffset ;
  466. write_header (psf, &wav_fmt, sizeof (GSM610_WAV_FMT), 1) ;
  467. break ;
  468. default :
  469.     //or
  470.     if(subformat==SF_FORCE_OPEN)
  471.     {
  472. wav_fmt.format = psf->sf.format_tag;
  473. wav_fmt.wavfmtex.extrabytes = 0 ;
  474. psf->dataoffset  = 9 * sizeof (dword) + sizeof (WAV_FMT_EX) + sizeof (FACT_CHUNK) ;
  475. psf->datalength  = psf->blockwidth * psf->sf.samples ;
  476. psf->filelength  = psf->datalength + psf->dataoffset ;
  477. write_header (psf, &wav_fmt, sizeof (WAV_FMT_EX), 1) ;
  478.     }
  479.     else
  480.     //end or
  481.     return SFE_UNIMPLEMENTED ;
  482. }
  483. } ;
  484. dword = data_MARKER ;
  485. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  486. dword = H2LE_INT (psf->datalength) ;
  487. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  488. psf->close = (func_close) wav_close ;
  489. if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_FLOAT)
  490. { psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
  491. if (CAN_READ_WRITE_x86_IEEE)
  492. { psf->write_short  = (func_short)  pcm_write_s2f ;
  493. psf->write_int    = (func_int)    pcm_write_i2f ;
  494. psf->write_double = (func_double) pcm_write_d2f ;
  495. }
  496. else 
  497. { psf->write_short  = (func_short)  wav_write_s2x86f ;
  498. psf->write_int    = (func_int)    wav_write_i2x86f ;
  499. psf->write_double = (func_double) wav_write_d2x86f ;
  500. } ;
  501. return  0 ;
  502. } ;
  503. if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_IMA_ADPCM)
  504. { psf->sf.format    = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ;
  505. psf->write_short  = (func_short)  ima_write_s ;
  506. psf->write_int    = (func_int)    ima_write_i ;
  507. psf->write_double = (func_double) ima_write_d ;
  508. psf->seek_func    = (func_seek)   ima_seek ;
  509. psf->close        = (func_close)  wav_ima_close ;
  510. return 0 ;
  511. } ;
  512. if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_MS_ADPCM)
  513. { psf->sf.format    = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ;
  514. psf->write_short  = (func_short)  msadpcm_write_s ;
  515. psf->write_int    = (func_int)    msadpcm_write_i ;
  516. psf->write_double = (func_double) msadpcm_write_d ;
  517. psf->seek_func    = (func_seek)   msadpcm_seek ;
  518. psf->close        = (func_close)  msadpcm_close ;
  519. return 0 ;
  520. } ;
  521. if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_GSM610)
  522. { psf->sf.format    = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ;
  523. psf->write_short  = (func_short)  wav_gsm610_write_s ;
  524. psf->write_int    = (func_int)    wav_gsm610_write_i ;
  525. psf->write_double = (func_double) wav_gsm610_write_d ;
  526. psf->seek_func    = NULL ; /* Not seekable */
  527. psf->close        = (func_close)  wav_gsm610_close ;
  528. return 0 ;
  529. } ;
  530. if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_ULAW)
  531. { psf->sf.format    = (SF_FORMAT_WAV | SF_FORMAT_ULAW) ;
  532. psf->write_short  = (func_short)  ulaw_write_s2ulaw ;
  533. psf->write_int    = (func_int)    ulaw_write_i2ulaw ;
  534. psf->write_double = (func_double) ulaw_write_d2ulaw ;
  535. return 0 ;
  536. } ;
  537. if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_ALAW)
  538. { psf->sf.format    = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ;
  539. psf->write_short  = (func_short)  alaw_write_s2alaw ;
  540. psf->write_int    = (func_int)    alaw_write_i2alaw ;
  541. psf->write_double = (func_double) alaw_write_d2alaw ;
  542. return 0 ;
  543. } ;
  544. if ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORMAT_PCM) //
  545. //or
  546. // return SFE_UNIMPLEMENTED ;
  547. {
  548. switch (psf->bytewidth)
  549. { case  1 :
  550. psf->write_short  = (func_short)  pcm_write_s2uc ;
  551. psf->write_int    = (func_int)    pcm_write_i2uc ;
  552. psf->write_double = (func_double) pcm_write_d2uc ;
  553. break ;
  554. case  2 :
  555. psf->write_short  = (func_short)  pcm_write_s2les ;
  556. psf->write_int    = (func_int)    pcm_write_i2les ;
  557. psf->write_double = (func_double) pcm_write_d2les ;
  558. break ;
  559. case  3 :
  560. psf->write_short  = (func_short)  pcm_write_s2let ;
  561. psf->write_int    = (func_int)    pcm_write_i2let ;
  562. psf->write_double = (func_double) pcm_write_d2let ;
  563. break ;
  564. case  4 :
  565. psf->write_short  = (func_short)  pcm_write_s2lei ;
  566. psf->write_int    = (func_int)    pcm_write_i2lei ;
  567. psf->write_double = (func_double) pcm_write_d2lei ;
  568. break ;
  569. default : return SFE_UNIMPLEMENTED ;
  570. } ;
  571. }
  572. //or
  573. else
  574. {
  575. }
  576. //end or
  577. return 0 ;
  578. } /* wav_open_write */
  579. /*------------------------------------------------------------------------------
  580.  */
  581. int wav_close (SF_PRIVATE  *psf)
  582. { unsigned int dword ;
  583. if (psf->mode == SF_MODE_WRITE)
  584. { /*  Now we know for certain the length of the file we can
  585.  *  re-write correct values for the RIFF and data chunks.
  586.  */
  587. fseek (psf->file, 0, SEEK_END) ;
  588. psf->filelength = ftell (psf->file) ;
  589. /* Fix RIFF size. */
  590. dword = H2LE_INT (psf->filelength - 2 * sizeof (dword)) ;
  591. fseek (psf->file, sizeof (dword), SEEK_SET) ;
  592. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  593. psf->datalength = psf->filelength - psf->dataoffset ;
  594. psf->sf.samples = psf->datalength / (psf->sf.channels * psf->bytewidth) ;
  595. fseek (psf->file, (int) (psf->dataoffset - sizeof (dword)), SEEK_SET) ;
  596. dword = H2LE_INT (psf->datalength) ;
  597. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  598. } ;
  599. if (psf->fdata)
  600. free (psf->fdata) ;
  601. psf->fdata = NULL ;
  602. return 0 ;
  603. } /* wav_close */
  604. /*=========================================================================
  605.  * Private functions.
  606.  */
  607. static
  608. int read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt)
  609. { unsigned int dword, bytesread, k, structsize, bytespersec = 0  ;
  610. memset (wav_fmt, 0, sizeof (WAV_FMT)) ;
  611. bytesread = 0 ;
  612. fread (&dword, sizeof (dword), 1, psf->file) ;
  613. structsize = LE2H_INT (dword) ;
  614. psf_sprintf (psf, "fmt  : %dn", structsize) ;
  615. if (structsize < 16)
  616. return SFE_WAV_FMT_SHORT ;
  617. if (structsize > sizeof (WAV_FMT))
  618. return SFE_WAV_FMT_TOO_BIG ;
  619. fread (wav_fmt, structsize, 1, psf->file) ;
  620. bytesread += structsize ;
  621. if (CPU_IS_BIG_ENDIAN)
  622. le2h_wav_fmt (wav_fmt) ;
  623. psf_sprintf (psf, "  Format        : 0x%X => %sn", wav_fmt->format, wav_format_str (wav_fmt->format)) ;
  624. psf_sprintf (psf, "  Channels      : %dn", wav_fmt->min.channels) ;
  625. psf_sprintf (psf, "  Sample Rate   : %dn", wav_fmt->min.samplerate) ;
  626. psf_sprintf (psf, "  Block Align   : %dn", wav_fmt->min.blockalign) ;
  627. psf_sprintf (psf, "  Bit Width     : %dn", wav_fmt->min.bitwidth) ;
  628. psf->sf.samplerate = wav_fmt->min.samplerate ;
  629. psf->sf.samples  = 0 ; /* Correct this when reading data chunk. */
  630. psf->sf.channels = wav_fmt->min.channels ;
  631. switch (wav_fmt->format)
  632. { case WAVE_FORMAT_PCM :
  633. case WAVE_FORMAT_IEEE_FLOAT :
  634. bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ;
  635. if (wav_fmt->min.bytespersec != bytespersec)
  636. psf_sprintf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->min.bytespersec, bytespersec) ;
  637. else
  638. psf_sprintf (psf, "  Bytes/sec     : %dn", wav_fmt->min.bytespersec) ;
  639. psf->sf.pcmbitwidth = wav_fmt->min.bitwidth ;
  640. psf->bytewidth      = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ;
  641. break ;
  642. case WAVE_FORMAT_ALAW :
  643. case WAVE_FORMAT_MULAW :
  644. if (wav_fmt->min.bytespersec / wav_fmt->min.blockalign != wav_fmt->min.samplerate)
  645. psf_sprintf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ;
  646. else
  647. psf_sprintf (psf, "  Bytes/sec     : %dn", wav_fmt->min.bytespersec) ;
  648. psf->sf.pcmbitwidth = 16 ;
  649. psf->bytewidth      = 1 ;
  650. if (structsize >= 18)
  651. psf_sprintf (psf, "  Extra Bytes   : %dn", wav_fmt->size20.extrabytes) ;
  652. break ;
  653. case WAVE_FORMAT_MS_ADPCM :
  654. if (wav_fmt->msadpcm.bitwidth != 4)
  655. return SFE_WAV_ADPCM_NOT4BIT ;
  656. if (wav_fmt->msadpcm.channels < 1 || wav_fmt->msadpcm.channels > 2)
  657. return SFE_WAV_ADPCM_CHANNELS ;
  658. bytespersec = (wav_fmt->msadpcm.samplerate * wav_fmt->msadpcm.blockalign) / wav_fmt->msadpcm.samplesperblock ;
  659. if (wav_fmt->min.bytespersec == bytespersec)
  660. psf_sprintf (psf, "  Bytes/sec     : %dn", wav_fmt->min.bytespersec) ;
  661. else if (wav_fmt->min.bytespersec == (wav_fmt->msadpcm.samplerate / wav_fmt->msadpcm.samplesperblock) * wav_fmt->msadpcm.blockalign) 
  662. psf_sprintf (psf, "  Bytes/sec     : %d (should be %d (MS BUG!))n", wav_fmt->min.bytespersec, bytespersec) ;
  663. else
  664. psf_sprintf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->min.bytespersec, bytespersec) ;
  665. psf->sf.pcmbitwidth = 16 ;
  666. psf->bytewidth      = 2 ;
  667. psf_sprintf (psf, "  Extra Bytes   : %dn", wav_fmt->msadpcm.extrabytes) ;
  668. psf_sprintf (psf, "  Samples/Block : %dn", wav_fmt->msadpcm.samplesperblock) ;
  669. if (wav_fmt->msadpcm.numcoeffs > sizeof (MS_ADPCM_WAV_FMT) / sizeof (int))
  670. { psf_sprintf (psf, "  No. of Coeffs : %d ****n", wav_fmt->msadpcm.numcoeffs) ;
  671. wav_fmt->msadpcm.numcoeffs = sizeof (MS_ADPCM_WAV_FMT) / sizeof (int) ;
  672. }
  673. else
  674. psf_sprintf (psf, "  No. of Coeffs : %dn", wav_fmt->msadpcm.numcoeffs) ;
  675. psf_sprintf (psf, "    Coeff 1 : ") ;
  676. for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++)
  677. psf_sprintf (psf, "%d ", wav_fmt->msadpcm.coeffs [k].coeff1) ;
  678. psf_sprintf (psf, "n    Coeff 2 : ") ;
  679. for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++)
  680. psf_sprintf (psf, "%d ", wav_fmt->msadpcm.coeffs [k].coeff2) ;
  681. psf_sprintf (psf, "n") ;
  682. break ;
  683. case WAVE_FORMAT_IMA_ADPCM :
  684. if (wav_fmt->ima.bitwidth != 4)
  685. return SFE_WAV_ADPCM_NOT4BIT ;
  686. if (wav_fmt->ima.channels < 1 || wav_fmt->ima.channels > 2)
  687. return SFE_WAV_ADPCM_CHANNELS ;
  688. bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ;
  689. if (wav_fmt->ima.bytespersec != bytespersec)
  690. psf_sprintf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->ima.bytespersec, bytespersec) ;
  691. else
  692. psf_sprintf (psf, "  Bytes/sec     : %dn", wav_fmt->ima.bytespersec) ;
  693. psf->sf.pcmbitwidth = 16 ;
  694. psf->bytewidth      = 2 ;
  695. psf_sprintf (psf, "  Extra Bytes   : %dn", wav_fmt->ima.extrabytes) ;
  696. psf_sprintf (psf, "  Samples/Block : %dn", wav_fmt->ima.samplesperblock) ;
  697. break ;
  698. case WAVE_FORMAT_EXTENSIBLE :
  699. if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
  700. psf_sprintf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ;
  701. else
  702. psf_sprintf (psf, "  Bytes/sec     : %dn", wav_fmt->ext.bytespersec) ;
  703. psf_sprintf (psf, "  Valid Bits    : %dn", wav_fmt->ext.validbits) ;
  704. psf_sprintf (psf, "  Channel Mask  : 0x%Xn", wav_fmt->ext.channelmask) ;
  705. psf_sprintf (psf, "  Subformatn") ;
  706. psf_sprintf (psf, "    esf_field1 : 0x%Xn", wav_fmt->ext.esf.esf_field1) ;
  707. psf_sprintf (psf, "    esf_field2 : 0x%Xn", wav_fmt->ext.esf.esf_field2) ;
  708. psf_sprintf (psf, "    esf_field3 : 0x%Xn", wav_fmt->ext.esf.esf_field3) ;
  709. psf_sprintf (psf, "    esf_field4 : ") ;
  710. for (k = 0 ; k < 8 ; k++)
  711. psf_sprintf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ;
  712. psf_sprintf (psf, "n") ;
  713. psf->sf.pcmbitwidth = wav_fmt->ext.bitwidth ;
  714. psf->bytewidth      = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ;
  715. break ;
  716. case WAVE_FORMAT_GSM610 :
  717. if (wav_fmt->gsm610.channels != 1 || wav_fmt->gsm610.blockalign != 65)
  718. return SFE_WAV_GSM610_FORMAT ;
  719. if (wav_fmt->gsm610.samplesperblock != 320)
  720. return SFE_WAV_GSM610_FORMAT ;
  721. bytespersec = (wav_fmt->gsm610.samplerate * wav_fmt->gsm610.blockalign) / wav_fmt->gsm610.samplesperblock ;
  722. if (wav_fmt->gsm610.bytespersec != bytespersec)
  723. psf_sprintf (psf, "  Bytes/sec     : %d (should be %d)n", wav_fmt->gsm610.bytespersec, bytespersec) ;
  724. else
  725. psf_sprintf (psf, "  Bytes/sec     : %dn", wav_fmt->gsm610.bytespersec) ;
  726. psf->sf.pcmbitwidth = 16 ;
  727. psf->bytewidth      = 2 ;
  728. psf_sprintf (psf, "  Extra Bytes   : %dn", wav_fmt->gsm610.extrabytes) ;
  729. psf_sprintf (psf, "  Samples/Block : %dn", wav_fmt->gsm610.samplesperblock) ;
  730. break ;
  731. default : 
  732. //or
  733. psf->sf.pcmbitwidth = wav_fmt->min.bitwidth ;
  734. psf->bytewidth      = wav_fmt->min.blockalign/wav_fmt->min.channels ;
  735. //end or
  736. break ;
  737. } ;
  738. psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ;
  739. return 0 ;
  740. } /* read_fmt_chunk */
  741. static
  742. int write_header (SF_PRIVATE *psf, WAV_FMT *wav_fmt, unsigned int size, int do_fact)
  743. { FACT_CHUNK fact_chunk ;
  744. unsigned int dword, RIFFsize ;
  745. RIFFsize   = psf->filelength - 2 * sizeof (dword) ;
  746. dword = RIFF_MARKER ;
  747. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  748. dword = H2LE_INT (RIFFsize) ;
  749. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  750. dword = WAVE_MARKER ;
  751. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  752. dword = fmt_MARKER ;
  753. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  754. dword = H2LE_INT (size) ;
  755. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  756. if (CPU_IS_BIG_ENDIAN)
  757. h2le_wav_fmt (wav_fmt) ;
  758. fwrite (wav_fmt, size, 1, psf->file) ;
  759. if (do_fact)
  760. { dword = fact_MARKER ;
  761. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  762. dword = H2LE_INT (sizeof (FACT_CHUNK)) ;
  763. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  764. fact_chunk.samples = H2LE_INT (psf->sf.samples) ;
  765. fwrite (&fact_chunk, sizeof (fact_chunk), 1, psf->file) ;
  766. } ;
  767. return 0 ;
  768. } /* write_header */
  769. static 
  770. void le2h_wav_fmt (WAV_FMT *fmt)
  771. { int k ;
  772. fmt->min.format      = ENDSWAP_SHORT (fmt->min.format) ;
  773. fmt->min.channels    = ENDSWAP_SHORT (fmt->min.channels) ;
  774. fmt->min.samplerate  = ENDSWAP_INT   (fmt->min.samplerate) ;
  775. fmt->min.bytespersec = ENDSWAP_INT   (fmt->min.bytespersec) ;
  776. fmt->min.blockalign  = ENDSWAP_SHORT (fmt->min.blockalign) ;
  777. fmt->min.bitwidth    = ENDSWAP_SHORT (fmt->min.bitwidth) ;
  778. switch (fmt->format)
  779. { case WAVE_FORMAT_MS_ADPCM :
  780. fmt->msadpcm.extrabytes      = ENDSWAP_SHORT (fmt->msadpcm.extrabytes) ;
  781. fmt->msadpcm.samplesperblock = ENDSWAP_SHORT (fmt->msadpcm.samplesperblock) ;
  782. fmt->msadpcm.numcoeffs       = ENDSWAP_SHORT (fmt->msadpcm.numcoeffs) ;
  783. for (k = 0 ; k < fmt->msadpcm.numcoeffs  ; k++)
  784. { fmt->msadpcm.coeffs [k].coeff1 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff1) ;
  785. fmt->msadpcm.coeffs [k].coeff2 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff2) ;
  786. } ;
  787. break ;
  788. case WAVE_FORMAT_IMA_ADPCM :
  789. fmt->ima.extrabytes      = ENDSWAP_SHORT (fmt->ima.extrabytes) ;
  790. fmt->ima.samplesperblock = ENDSWAP_SHORT (fmt->ima.samplesperblock) ;
  791. break ;
  792. case WAVE_FORMAT_ALAW :
  793. case WAVE_FORMAT_MULAW :
  794. fmt->size20.extrabytes = ENDSWAP_SHORT (fmt->size20.extrabytes) ;
  795. fmt->size20.dummy      = ENDSWAP_SHORT (fmt->size20.dummy) ;
  796. break ;
  797. case WAVE_FORMAT_GSM610 :
  798. fmt->gsm610.extrabytes      = ENDSWAP_SHORT (fmt->gsm610.extrabytes) ;
  799. fmt->gsm610.samplesperblock = ENDSWAP_SHORT (fmt->gsm610.samplesperblock) ;
  800. break ;
  801. default : break ;
  802. } ;
  803. } /* le2h_wav_fmt */
  804. static 
  805. void h2le_wav_fmt (WAV_FMT *fmt)
  806. { int k ;
  807. switch (fmt->format)
  808. { case WAVE_FORMAT_MS_ADPCM :
  809. for (k = 0 ; k < fmt->msadpcm.numcoeffs  ; k++)
  810. { fmt->msadpcm.coeffs [k].coeff1 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff1) ;
  811. fmt->msadpcm.coeffs [k].coeff2 = ENDSWAP_SHORT (fmt->msadpcm.coeffs [k].coeff2) ;
  812. } ;
  813. fmt->msadpcm.numcoeffs       = ENDSWAP_SHORT (fmt->msadpcm.numcoeffs) ;
  814. fmt->msadpcm.extrabytes      = ENDSWAP_SHORT (fmt->msadpcm.extrabytes) ;
  815. fmt->msadpcm.samplesperblock = ENDSWAP_SHORT (fmt->msadpcm.samplesperblock) ;
  816. break ;
  817. case WAVE_FORMAT_IMA_ADPCM :
  818. fmt->ima.extrabytes      = ENDSWAP_SHORT (fmt->ima.extrabytes) ;
  819. fmt->ima.samplesperblock = ENDSWAP_SHORT (fmt->ima.samplesperblock) ;
  820. break ;
  821. case WAVE_FORMAT_ALAW :
  822. case WAVE_FORMAT_MULAW :
  823. fmt->size20.extrabytes = ENDSWAP_SHORT (fmt->size20.extrabytes) ;
  824. fmt->size20.dummy      = ENDSWAP_SHORT (fmt->size20.dummy) ;
  825. break ;
  826. case WAVE_FORMAT_GSM610 :
  827. fmt->gsm610.extrabytes      = ENDSWAP_SHORT (fmt->gsm610.extrabytes) ;
  828. fmt->gsm610.samplesperblock = ENDSWAP_SHORT (fmt->gsm610.samplesperblock) ;
  829. break ;
  830. default : break ;
  831. } ;
  832. fmt->min.format      = ENDSWAP_SHORT (fmt->min.format) ;
  833. fmt->min.channels    = ENDSWAP_SHORT (fmt->min.channels) ;
  834. fmt->min.samplerate  = ENDSWAP_INT   (fmt->min.samplerate) ;
  835. fmt->min.bytespersec = ENDSWAP_INT   (fmt->min.bytespersec) ;
  836. fmt->min.blockalign  = ENDSWAP_SHORT (fmt->min.blockalign) ;
  837. fmt->min.bitwidth    = ENDSWAP_SHORT (fmt->min.bitwidth) ;
  838. } /* h2le_wav_fmt */
  839. static
  840. const char* wav_format_str (int k)
  841. { switch (k)
  842. { case WAVE_FORMAT_UNKNOWN :
  843. return "WAVE_FORMAT_UNKNOWN" ;
  844. case WAVE_FORMAT_PCM          :
  845. return "WAVE_FORMAT_PCM         " ;
  846. case WAVE_FORMAT_MS_ADPCM :
  847. return "WAVE_FORMAT_MS_ADPCM" ;
  848. case WAVE_FORMAT_IEEE_FLOAT :
  849. return "WAVE_FORMAT_IEEE_FLOAT" ;
  850. case WAVE_FORMAT_IBM_CVSD :
  851. return "WAVE_FORMAT_IBM_CVSD" ;
  852. case WAVE_FORMAT_ALAW :
  853. return "WAVE_FORMAT_ALAW" ;
  854. case WAVE_FORMAT_MULAW :
  855. return "WAVE_FORMAT_MULAW" ;
  856. case WAVE_FORMAT_OKI_ADPCM :
  857. return "WAVE_FORMAT_OKI_ADPCM" ;
  858. case WAVE_FORMAT_IMA_ADPCM :
  859. return "WAVE_FORMAT_IMA_ADPCM" ;
  860. case WAVE_FORMAT_MEDIASPACE_ADPCM :
  861. return "WAVE_FORMAT_MEDIASPACE_ADPCM" ;
  862. case WAVE_FORMAT_SIERRA_ADPCM :
  863. return "WAVE_FORMAT_SIERRA_ADPCM" ;
  864. case WAVE_FORMAT_G723_ADPCM :
  865. return "WAVE_FORMAT_G723_ADPCM" ;
  866. case WAVE_FORMAT_DIGISTD :
  867. return "WAVE_FORMAT_DIGISTD" ;
  868. case WAVE_FORMAT_DIGIFIX :
  869. return "WAVE_FORMAT_DIGIFIX" ;
  870. case WAVE_FORMAT_DIALOGIC_OKI_ADPCM :
  871. return "WAVE_FORMAT_DIALOGIC_OKI_ADPCM" ;
  872. case WAVE_FORMAT_MEDIAVISION_ADPCM :
  873. return "WAVE_FORMAT_MEDIAVISION_ADPCM" ;
  874. case WAVE_FORMAT_YAMAHA_ADPCM :
  875. return "WAVE_FORMAT_YAMAHA_ADPCM" ;
  876. case WAVE_FORMAT_SONARC :
  877. return "WAVE_FORMAT_SONARC" ;
  878. case WAVE_FORMAT_DSPGROUP_TRUESPEECH  :
  879. return "WAVE_FORMAT_DSPGROUP_TRUESPEECH " ;
  880. case WAVE_FORMAT_ECHOSC1 :
  881. return "WAVE_FORMAT_ECHOSC1" ;
  882. case WAVE_FORMAT_AUDIOFILE_AF18   :
  883. return "WAVE_FORMAT_AUDIOFILE_AF18  " ;
  884. case WAVE_FORMAT_APTX :
  885. return "WAVE_FORMAT_APTX" ;
  886. case WAVE_FORMAT_AUDIOFILE_AF10   :
  887. return "WAVE_FORMAT_AUDIOFILE_AF10  " ;
  888. case WAVE_FORMAT_DOLBY_AC2 :
  889. return "WAVE_FORMAT_DOLBY_AC2" ;
  890. case WAVE_FORMAT_GSM610 :
  891. return "WAVE_FORMAT_GSM610" ;
  892. case WAVE_FORMAT_MSNAUDIO :
  893. return "WAVE_FORMAT_MSNAUDIO" ;
  894. case WAVE_FORMAT_ANTEX_ADPCME :
  895. return "WAVE_FORMAT_ANTEX_ADPCME" ;
  896. case WAVE_FORMAT_CONTROL_RES_VQLPC :
  897. return "WAVE_FORMAT_CONTROL_RES_VQLPC" ;
  898. case WAVE_FORMAT_DIGIREAL :
  899. return "WAVE_FORMAT_DIGIREAL" ;
  900. case WAVE_FORMAT_DIGIADPCM :
  901. return "WAVE_FORMAT_DIGIADPCM" ;
  902. case WAVE_FORMAT_CONTROL_RES_CR10 :
  903. return "WAVE_FORMAT_CONTROL_RES_CR10" ;
  904. case WAVE_FORMAT_NMS_VBXADPCM :
  905. return "WAVE_FORMAT_NMS_VBXADPCM" ;
  906. case WAVE_FORMAT_ROCKWELL_ADPCM :
  907. return "WAVE_FORMAT_ROCKWELL_ADPCM" ;
  908. case WAVE_FORMAT_ROCKWELL_DIGITALK :
  909. return "WAVE_FORMAT_ROCKWELL_DIGITALK" ;
  910. case WAVE_FORMAT_G721_ADPCM :
  911. return "WAVE_FORMAT_G721_ADPCM" ;
  912. case WAVE_FORMAT_MPEG :
  913. return "WAVE_FORMAT_MPEG" ;
  914. case WAVE_FORMAT_MPEGLAYER3 :
  915. return "WAVE_FORMAT_MPEGLAYER3" ;
  916. case IBM_FORMAT_MULAW :
  917. return "IBM_FORMAT_MULAW" ;
  918. case IBM_FORMAT_ALAW :
  919. return "IBM_FORMAT_ALAW" ;
  920. case IBM_FORMAT_ADPCM :
  921. return "IBM_FORMAT_ADPCM" ;
  922. case WAVE_FORMAT_CREATIVE_ADPCM :
  923. return "WAVE_FORMAT_CREATIVE_ADPCM" ;
  924. case WAVE_FORMAT_FM_TOWNS_SND :
  925. return "WAVE_FORMAT_FM_TOWNS_SND" ;
  926. case WAVE_FORMAT_OLIGSM :
  927. return "WAVE_FORMAT_OLIGSM" ;
  928. case WAVE_FORMAT_OLIADPCM :
  929. return "WAVE_FORMAT_OLIADPCM" ;
  930. case WAVE_FORMAT_OLICELP :
  931. return "WAVE_FORMAT_OLICELP" ;
  932. case WAVE_FORMAT_OLISBC :
  933. return "WAVE_FORMAT_OLISBC" ;
  934. case WAVE_FORMAT_OLIOPR :
  935. return "WAVE_FORMAT_OLIOPR" ;
  936. case WAVE_FORMAT_EXTENSIBLE :
  937. return "WAVE_FORMAT_EXTENSIBLE" ;
  938. break ;
  939. } ;
  940. return "Unknown format" ;
  941. } /* wav_format_str */