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

流媒体/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 <math.h>
  22. #include "sndfile.h"
  23. #include "config.h"
  24. #include "sfendian.h"
  25. #include "common.h"
  26. #include "wav.h"
  27. typedef struct
  28. { unsigned int channels, blocksize, samplesperblock, blocks, dataremaining ; 
  29. int blockcount, samplecount ;
  30. unsigned char *block ;
  31. short *samples ;
  32. unsigned char dummydata [4] ; /* Dummy size */
  33. } MSADPCM_PRIVATE ;
  34. /*============================================================================================
  35. ** MS ADPCM static data and functions.
  36. */
  37. static int AdaptationTable []    = 
  38. { 230, 230, 230, 230, 307, 409, 512, 614,
  39. 768, 614, 512, 409, 307, 230, 230, 230 
  40. } ;
  41. /* TODO : The first 7 coef's are are always hardcode and must
  42.    appear in the actual WAVE file.  They should be read in
  43.    in case a sound program added extras to the list. */
  44. static int AdaptCoeff1 [] = 
  45. { 256, 512, 0, 192, 240, 460, 392 
  46. } ;
  47. static int AdaptCoeff2 [] = 
  48. { 0, -256, 0, 64, 0, -208, -232
  49. } ;
  50. /*============================================================================================
  51. ** MS ADPCM Block Layout.
  52. ** ======================
  53. ** Block is usually 256, 512 or 1024 bytes depending on sample rate.
  54. ** For a mono file, the block is laid out as follows:
  55. ** byte purpose
  56. ** 0 block predictor [0..6]
  57. ** 1,2 initial idelta (positive)
  58. ** 3,4 sample 1
  59. ** 5,6 sample 0
  60. ** 7..n packed bytecodes
  61. **
  62. ** For a stereo file, the block is laid out as follows:
  63. ** byte purpose
  64. ** 0 block predictor [0..6] for left channel
  65. ** 1 block predictor [0..6] for right channel
  66. ** 2,3 initial idelta (positive) for left channel
  67. ** 4,5 initial idelta (positive) for right channel
  68. ** 6,7 sample 1 for left channel
  69. ** 8,9 sample 1 for right channel
  70. ** 10,11 sample 0 for left channel
  71. ** 12,13 sample 0 for right channel
  72. ** 14..n packed bytecodes
  73. */
  74. /*============================================================================================
  75. ** Static functions.
  76. */
  77. static int msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
  78. static int msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
  79. static int msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
  80. static int msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
  81. static unsigned int srate2blocksize (unsigned int srate) ;
  82. static void choose_predictor (unsigned int channels, short *data, int *bpred, int *idelta) ;
  83. /*============================================================================================
  84. ** MS ADPCM Read Functions.
  85. */
  86. int msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
  87. { MSADPCM_PRIVATE *pms ;
  88. unsigned int pmssize ;
  89. int count ;
  90. pmssize = sizeof (MSADPCM_PRIVATE) + fmt->msadpcm.blockalign + 3 * fmt->msadpcm.channels * fmt->msadpcm.samplesperblock ;
  91. if (! (psf->fdata = malloc (pmssize)))
  92. return SFE_MALLOC_FAILED ;
  93. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  94. memset (pms, 0, pmssize) ;
  95. pms->block   = (unsigned char*) pms->dummydata ;
  96. pms->samples = (short*) (pms->dummydata + fmt->msadpcm.blockalign) ;
  97. pms->channels        = fmt->msadpcm.channels ;
  98. pms->blocksize       = fmt->msadpcm.blockalign ;
  99. pms->samplesperblock = fmt->msadpcm.samplesperblock ;
  100. pms->dataremaining  = psf->datalength ;
  101. if (psf->datalength % pms->blocksize)
  102. pms->blocks = psf->datalength / pms->blocksize  + 1 ;
  103. else
  104. pms->blocks = psf->datalength / pms->blocksize ;
  105. count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ;
  106. if (pms->samplesperblock != count)
  107. psf_sprintf (psf, "*** Warning : samplesperblock shoud be %d.n", count) ;
  108. psf->sf.samples = (psf->datalength / pms->blocksize) * pms->samplesperblock ;
  109. psf_sprintf (psf, " bpred   ideltan") ;
  110. msadpcm_read_block (psf, pms) ;
  111. return 0 ;
  112. } /* msadpcm_reader_init */
  113. static
  114. int msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
  115. { int chan, k, blockindex, sampleindex ;
  116. short bytecode, bpred [2], chan_idelta [2] ;
  117.     int predict ;
  118.     int current ;
  119.     int idelta ;
  120. pms->blockcount ++ ;
  121. pms->samplecount = 0 ;
  122. if (pms->blockcount > pms->blocks)
  123. { memset (pms->samples, 0, pms->samplesperblock * pms->channels) ;
  124. return 1 ;
  125. } ;
  126. if ((k = fread (pms->block, 1, pms->blocksize, psf->file)) != pms->blocksize)
  127. psf_sprintf (psf, "*** Warning : short read (%d != %d).n", k, pms->blocksize) ;
  128. /* Read and check the block header. */
  129. if (pms->channels == 1)
  130. { bpred [0] = pms->block [0] ;
  131. if (bpred [0] >= 7)
  132. psf_sprintf (psf, "MS ADPCM synchronisation error (%d).n", bpred [0]) ;
  133. chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ;
  134. chan_idelta [1] = 0 ;
  135. psf_sprintf (psf, "(%d) (%d)n", bpred [0], chan_idelta [0]) ;
  136. pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ;
  137. pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ;
  138. blockindex = 7 ;
  139. }
  140. else
  141. { bpred [0] = pms->block [0] ;
  142. bpred [1] = pms->block [1] ;
  143. if (bpred [0] >= 7 || bpred [1] >= 7)
  144. psf_sprintf (psf, "MS ADPCM synchronisation error (%d %d).n", bpred [0], bpred [1]) ;
  145. chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ;
  146. chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ;
  147. psf_sprintf (psf, "(%d, %d) (%d, %d)n", bpred [0], bpred [1], chan_idelta [0], chan_idelta [1]) ;
  148. pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ;
  149. pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ;
  150. pms->samples [0] = pms->block [10] | (pms->block [11] << 8) ;
  151. pms->samples [1] = pms->block [12] | (pms->block [13] << 8) ;
  152. blockindex = 14 ;
  153. } ;
  154.     if (chan_idelta [0] & 0x8000) 
  155. chan_idelta [0] -= 0x10000 ;
  156.     if (chan_idelta [1] & 0x8000) 
  157. chan_idelta [1] -= 0x10000 ;
  158. /* Pull apart the packed 4 bit samples and store them in their
  159. ** correct sample positions.
  160. */
  161. sampleindex = 2 * pms->channels ;
  162. while (blockindex <  pms->blocksize)
  163. { bytecode = pms->block [blockindex++] ;
  164.    pms->samples [sampleindex++] = (bytecode >> 4) & 0x0F ;
  165. pms->samples [sampleindex++] = bytecode & 0x0F ;
  166. } ;
  167. /* Decode the encoded 4 bit samples. */
  168. for (k = 2 * pms->channels ; k < (pms->samplesperblock * pms->channels) ; k ++)
  169. { chan = (pms->channels > 1) ? (k % 2) : 0 ;
  170. bytecode = pms->samples [k] & 0xF ;
  171.     /** Compute next Adaptive Scale Factor (ASF) **/
  172.     idelta = chan_idelta [chan] ;
  173.     chan_idelta [chan] = (AdaptationTable [bytecode] * idelta) >> 8 ; /* => / 256 => FIXED_POINT_ADAPTATION_BASE == 256 */
  174.     if (chan_idelta [chan] < 16) 
  175. chan_idelta [chan] = 16 ;
  176.     if (bytecode & 0x8) 
  177. bytecode -= 0x10 ;
  178.      predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]]) 
  179. + (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */
  180.      current = (bytecode * idelta) + predict;
  181.     
  182.     if (current > 32767) 
  183. current = 32767 ;
  184.     else if (current < -32768) 
  185. current = -32768 ;
  186.     
  187. pms->samples [k] = current ;
  188. } ;
  189. return 1 ;
  190. } /* msadpcm_read_block */
  191. static
  192. int msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
  193. { int count, total = 0, index = 0 ;
  194. while (index < len)
  195. { if (pms->blockcount >= pms->blocks && pms->samplecount >= pms->samplesperblock)
  196. { memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
  197. return total ;
  198. } ;
  199. if (pms->samplecount >= pms->samplesperblock)
  200. msadpcm_read_block (psf, pms) ;
  201. count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
  202. count = (len - index > count) ? count : len - index ;
  203. memcpy (&(ptr[index]), &(pms->samples [pms->samplecount * pms->channels]), count * sizeof (short)) ;
  204. index += count ;
  205. pms->samplecount += count / pms->channels ;
  206. total = index ;
  207. } ;
  208. return total ;
  209. } /* msadpcm_read */
  210. int msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len)
  211. { MSADPCM_PRIVATE  *pms ; 
  212. int total ;
  213. if (! psf->fdata)
  214. return 0 ;
  215. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  216. total = msadpcm_read (psf, pms, ptr, len) ;
  217. return total ;
  218. } /* msadpcm_read_s */
  219. int msadpcm_read_i  (SF_PRIVATE *psf, int *ptr, int len)
  220. { MSADPCM_PRIVATE *pms ; 
  221. short *sptr ;
  222. int k, bufferlen, readcount = 0, count ;
  223. int index = 0, total = 0 ;
  224. if (! psf->fdata)
  225. return 0 ;
  226. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  227. sptr = (short*) psf->buffer ;
  228. bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
  229. while (len > 0)
  230. { readcount = (len >= bufferlen) ? bufferlen : len ;
  231. count = msadpcm_read (psf, pms, sptr, readcount) ;
  232. for (k = 0 ; k < readcount ; k++)
  233. ptr [index+k] = (int) (sptr [k]) ;
  234. index += readcount ;
  235. total += count ;
  236. len -= readcount ;
  237. } ;
  238. return total ;
  239. } /* msadpcm_read_i */
  240. int msadpcm_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  241. { MSADPCM_PRIVATE *pms ; 
  242. short *sptr ;
  243. int k, bufferlen, readcount = 0, count ;
  244. int index = 0, total = 0 ;
  245. double  normfact ;
  246. normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
  247. if (! psf->fdata)
  248. return 0 ;
  249. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  250. sptr = (short*) psf->buffer ;
  251. bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
  252. while (len > 0)
  253. { readcount = (len >= bufferlen) ? bufferlen : len ;
  254. count = msadpcm_read (psf, pms, sptr, readcount) ;
  255. for (k = 0 ; k < readcount ; k++)
  256. ptr [index+k] = normfact * (double) (sptr [k]) ;
  257. index += readcount ;
  258. total += count ;
  259. len -= readcount ;
  260. } ;
  261. return total ;
  262. } /* msadpcm_read_d */
  263. off_t    msadpcm_seek   (SF_PRIVATE *psf, off_t offset, int whence)
  264. { MSADPCM_PRIVATE *pms ; 
  265. int newblock, newsample ;
  266. if (! psf->fdata)
  267. return 0 ;
  268. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  269. if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
  270. { psf->error = SFE_BAD_SEEK ;
  271. return ((off_t) -1) ;
  272. } ;
  273. switch (whence)
  274. { case SEEK_SET :
  275. if (offset < 0 || offset > pms->blocks * pms->samplesperblock)
  276. { psf->error = SFE_BAD_SEEK ;
  277. return ((off_t) -1) ;
  278. } ;
  279. newblock  = offset / pms->samplesperblock ;
  280. newsample = offset % pms->samplesperblock ;
  281. break ;
  282. case SEEK_CUR :
  283. if (psf->current + offset < 0 || psf->current + offset > pms->blocks * pms->samplesperblock)
  284. { psf->error = SFE_BAD_SEEK ;
  285. return ((off_t) -1) ;
  286. } ;
  287. newblock  = (psf->current + offset) / pms->samplesperblock ;
  288. newsample = (psf->current + offset) % pms->samplesperblock ;
  289. break ;
  290. case SEEK_END :
  291. if (offset > 0 || pms->samplesperblock * pms->blocks + offset < 0)
  292. { psf->error = SFE_BAD_SEEK ;
  293. return ((off_t) -1) ;
  294. } ;
  295. newblock  = (pms->samplesperblock * pms->blocks + offset) / pms->samplesperblock ;
  296. newsample = (pms->samplesperblock * pms->blocks + offset) % pms->samplesperblock ;
  297. break ;
  298. default : 
  299. psf->error = SFE_BAD_SEEK ;
  300. return ((off_t) -1) ;
  301. } ;
  302. if (psf->mode == SF_MODE_READ)
  303. { fseek (psf->file, (int) (psf->dataoffset + newblock * pms->blocksize), SEEK_SET) ;
  304. pms->blockcount  = newblock ;
  305. msadpcm_read_block (psf, pms) ;
  306. pms->samplecount = newsample ;
  307. }
  308. else
  309. { /* What to do about write??? */ 
  310. psf->error = SFE_BAD_SEEK ;
  311. return ((off_t) -1) ;
  312. } ;
  313. psf->current = newblock * pms->samplesperblock + newsample ;
  314. return psf->current ;
  315. } /* msadpcm_seek */
  316. /*==========================================================================================
  317. ** MS ADPCM Write Functions.
  318. */
  319. int msadpcm_writer_init (SF_PRIVATE *psf, WAV_FMT *fmt)
  320. { MSADPCM_PRIVATE *pms ;
  321. unsigned int  k, pmssize ;
  322. if (fmt->format != 0x0002)
  323. psf_sprintf (psf, "*** Warning : format tag != WAVE_FORMAT_MS_ADPCM.n") ;
  324. fmt->msadpcm.blockalign      = srate2blocksize (fmt->msadpcm.samplerate) ;
  325. fmt->msadpcm.bitwidth        = 4 ;
  326. fmt->msadpcm.extrabytes      = 32 ;
  327. fmt->msadpcm.samplesperblock = 2 + 2 * (fmt->msadpcm.blockalign - 7 * fmt->msadpcm.channels) / fmt->msadpcm.channels ;
  328. fmt->msadpcm.bytespersec     = (fmt->msadpcm.samplerate * fmt->msadpcm.blockalign) / fmt->msadpcm.samplesperblock ;
  329. fmt->msadpcm.numcoeffs = 7 ;
  330. for (k = 0 ; k < 7 ; k++)
  331. { fmt->msadpcm.coeffs[k].coeff1 = AdaptCoeff1 [k] ;
  332. fmt->msadpcm.coeffs[k].coeff2 = AdaptCoeff2 [k] ;
  333. } ;
  334. pmssize = sizeof (MSADPCM_PRIVATE) + fmt->msadpcm.blockalign + 3 * fmt->msadpcm.channels * fmt->msadpcm.samplesperblock ;
  335. if (! (psf->fdata = malloc (pmssize)))
  336. return SFE_MALLOC_FAILED ;
  337. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  338. memset (pms, 0, pmssize) ;
  339. pms->channels        = fmt->msadpcm.channels ;
  340. pms->blocksize       = fmt->msadpcm.blockalign ;
  341. pms->samplesperblock = fmt->msadpcm.samplesperblock ;
  342. pms->block   = (unsigned char*) pms->dummydata ;
  343. pms->samples = (short*) (pms->dummydata + fmt->msadpcm.blockalign) ;
  344. pms->samplecount = 0 ;
  345. return 0 ;
  346. } /* msadpcm_writer_init */
  347. /*==========================================================================================
  348. */
  349. static
  350. int msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
  351. { unsigned int blockindex ;
  352. unsigned char byte ;
  353. int chan, k, predict, bpred [2], idelta [2], errordelta, newsamp ;
  354. choose_predictor (pms->channels, pms->samples, bpred, idelta) ;
  355. /* Write the block header. */
  356. if (pms->channels == 1)
  357. { pms->block [0] = bpred [0] ;
  358. pms->block [1] = idelta [0] & 0xFF ;
  359. pms->block [2] = idelta [0] >> 8 ;
  360. pms->block [3] = pms->samples [1] & 0xFF ;
  361. pms->block [4] = pms->samples [1] >> 8 ;
  362. pms->block [5] = pms->samples [0] & 0xFF ;
  363. pms->block [6] = pms->samples [0] >> 8 ;
  364. blockindex = 7 ;
  365. byte = 0 ;
  366. /* Encode the samples as 4 bit. */
  367. for (k = 2 ; k < pms->samplesperblock ; k++)
  368. { predict = (pms->samples [k-1] * AdaptCoeff1 [bpred [0]] + pms->samples [k-2] * AdaptCoeff2 [bpred [0]]) >> 8 ;
  369. errordelta = (pms->samples [k] - predict) / idelta [0] ;
  370. if (errordelta < -8)
  371. errordelta = -8 ;
  372. else if (errordelta > 7)
  373. errordelta = 7 ;
  374. newsamp = predict + (idelta [0] * errordelta) ;
  375. if (newsamp > 32767)
  376. newsamp = 32767 ;
  377. else if (newsamp < -32768)
  378. newsamp = -32768 ;
  379. if (errordelta < 0)
  380. errordelta += 0x10 ;
  381. byte = (byte << 4) | (errordelta & 0xF) ;
  382. if (k % 2)
  383. { pms->block [blockindex++] = byte ;
  384. byte = 0 ;
  385. } ;
  386. idelta [0] = (idelta [0] * AdaptationTable [errordelta]) >> 8 ;
  387. if (idelta [0] < 16)
  388. idelta [0] = 16 ;
  389. pms->samples [k] = newsamp ;
  390. } ;
  391. }
  392. else
  393. { /* Stereo file. */
  394. pms->block [0] = bpred [0] ;
  395. pms->block [1] = bpred [1] ;
  396. pms->block [2] = idelta [0] & 0xFF ;
  397. pms->block [3] = idelta [0] >> 8 ;
  398. pms->block [4] = idelta [1] & 0xFF ;
  399. pms->block [5] = idelta [1] >> 8 ;
  400. pms->block [6] = pms->samples [2] & 0xFF ;
  401. pms->block [7] = pms->samples [2] >> 8 ;
  402. pms->block [8] = pms->samples [3] & 0xFF ;
  403. pms->block [9] = pms->samples [3] >> 8 ;
  404. pms->block [10] = pms->samples [0] & 0xFF ;
  405. pms->block [11] = pms->samples [0] >> 8 ;
  406. pms->block [12] = pms->samples [1] & 0xFF ;
  407. pms->block [13] = pms->samples [1] >> 8 ;
  408. blockindex = 14 ;
  409. byte = 0 ;
  410. chan = 1 ;
  411. for (k = 4 ; k < pms->samplesperblock ; k+=2)
  412. { chan = chan ? 0 : 1 ;
  413. predict = (pms->samples [k-2] * AdaptCoeff1 [bpred [chan]] + pms->samples [k-4] * AdaptCoeff2 [bpred [chan]]) >> 8 ;
  414. errordelta = (pms->samples [k] - predict) / idelta [chan] ;
  415. if (errordelta < -8)
  416. errordelta = -8 ;
  417. else if (errordelta > 7)
  418. errordelta = 7 ;
  419. newsamp = predict + (idelta [chan] * errordelta) ;
  420. if (newsamp > 32767)
  421. newsamp = 32767 ;
  422. else if (newsamp < -32768)
  423. newsamp = -32768 ;
  424. if (errordelta < 0)
  425. errordelta += 0x10 ;
  426. byte = (byte << 4) | (errordelta & 0xF) ;
  427. if (k % 2)
  428. { pms->block [blockindex++] = byte ;
  429. byte = 0 ;
  430. } ;
  431. idelta [chan] = (idelta [chan] * AdaptationTable [errordelta]) >> 8 ;
  432. if (idelta [chan] < 16)
  433. idelta [chan] = 16 ;
  434. pms->samples [k-2] = newsamp ;
  435. } ;
  436. } ;
  437. /* Write the block to disk. */
  438. if ((k = fwrite (pms->block, 1, pms->blocksize, psf->file)) != pms->blocksize)
  439. psf_sprintf (psf, "*** Warning : short write (%d != %d).n", k, pms->blocksize) ;
  440. memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ;
  441. pms->blockcount ++ ;
  442. pms->samplecount = 0 ;
  443. return 1 ;
  444. } /* msadpcm_write_block */
  445. static
  446. int msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
  447. { int count, total = 0, index = 0 ;
  448. while (index < len)
  449. { count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
  450. if (count > len - index)
  451. count = len - index ;
  452. memcpy (&(pms->samples [pms->samplecount * pms->channels]), &(ptr [index]), count * sizeof (short)) ;
  453. index += count ;
  454. pms->samplecount += count / pms->channels ;
  455. total = index ;
  456. if (pms->samplecount >= pms->samplesperblock)
  457. msadpcm_write_block (psf, pms) ;
  458. } ;
  459. return total ;
  460. } /* msadpcm_write */
  461. int msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len)
  462. { MSADPCM_PRIVATE *pms ; 
  463. int total ;
  464. if (! psf->fdata)
  465. return 0 ;
  466. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  467. total = msadpcm_write (psf, pms, ptr, len) ;
  468. return total ;
  469. } /* msadpcm_write_s */
  470. int msadpcm_write_i  (SF_PRIVATE *psf, int *ptr, int len)
  471. { MSADPCM_PRIVATE *pms ; 
  472. short *sptr ;
  473. int k, bufferlen, writecount = 0, count ;
  474. int index = 0, total = 0 ;
  475. if (! psf->fdata)
  476. return 0 ;
  477. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  478. sptr = (short*) psf->buffer ;
  479. bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
  480. while (len > 0)
  481. { writecount = (len >= bufferlen) ? bufferlen : len ;
  482. for (k = 0 ; k < writecount ; k++)
  483. sptr [k] = (short) ptr [index+k] ;
  484. count = msadpcm_write (psf, pms, sptr, writecount) ;
  485. index += writecount ;
  486. total += count ;
  487. len -= writecount ;
  488. } ;
  489. return total ;
  490. } /* msadpcm_write_i */
  491. int msadpcm_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  492. { MSADPCM_PRIVATE *pms ; 
  493. short *sptr ;
  494. int k, bufferlen, writecount = 0, count ;
  495. int index = 0, total = 0 ;
  496. double  normfact ;
  497. normfact = (normalize ? ((double) 0x8000) : 1.0) ;
  498. if (! psf->fdata)
  499. return 0 ;
  500. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  501. sptr = (short*) psf->buffer ;
  502. bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
  503. while (len > 0)
  504. { writecount = (len >= bufferlen) ? bufferlen : len ;
  505. for (k = 0 ; k < writecount ; k++)
  506. sptr [k] = (short) (normfact * ptr [index+k]) ;
  507. count = msadpcm_write (psf, pms, sptr, writecount) ;
  508. index += writecount ;
  509. total += count ;
  510. len -= writecount ;
  511. } ;
  512. return total ;
  513. } /* msadpcm_write_d */
  514. /*========================================================================================
  515. */
  516. int msadpcm_close (SF_PRIVATE  *psf)
  517. { MSADPCM_PRIVATE *pms ; 
  518. unsigned int dword ;
  519. if (! psf->fdata)
  520. return wav_close (psf) ;
  521. pms = (MSADPCM_PRIVATE*) psf->fdata ;
  522. if (psf->mode == SF_MODE_WRITE)
  523. { /*  Now we know for certain the length of the file we can
  524. **  re-write correct values for the RIFF and data chunks.
  525. */
  526.  
  527. if (pms->samplecount && pms->samplecount < pms->samplesperblock)
  528. msadpcm_write_block (psf, pms) ;
  529. fseek (psf->file, 0, SEEK_END) ;
  530. psf->filelength = ftell (psf->file) ;
  531. /* Fix RIFF size. */
  532. dword = H2LE_INT (psf->filelength - 2 * sizeof (dword)) ;
  533. fseek (psf->file, sizeof (dword), SEEK_SET) ;
  534. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  535. psf->datalength = psf->filelength - psf->dataoffset ;
  536. fseek (psf->file, (int) (psf->dataoffset - sizeof (dword)), SEEK_SET) ;
  537. dword = H2LE_INT (psf->datalength) ;
  538. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  539. } ;
  540. if (psf->fdata)
  541. free (psf->fdata) ;
  542. psf->fdata = NULL ;
  543. return 0 ;
  544. } /* msadpcm_close */
  545. /*========================================================================================
  546. ** Static functions.
  547. */
  548. static
  549. unsigned int srate2blocksize (unsigned int srate)
  550. { if (srate < 12000)
  551. return 256 ;
  552. if (srate < 23000)
  553. return 512 ;
  554. return 1024 ;
  555. } /* srate2blocksize */
  556. /*----------------------------------------------------------------------------------------
  557. ** Choosing the block predictor.
  558. ** Each block requires a predictor and an idelta for each channel. 
  559. ** The predictor is in the range [0..6] which is an index into the two AdaptCoeff tables. 
  560. ** The predictor is chosen by trying all of the possible predictors on a small set of
  561. ** samples at the beginning of the block. The predictor with the smallest average
  562. ** abs (idelta) is chosen as the best predictor for this block. 
  563. ** The value of idelta is chosen to to give a 4 bit code value of +/- 4 (approx. half the 
  564. ** max. code value). If the average abs (idelta) is zero, the sixth predictor is chosen.
  565. ** If the value of idelta is less then 16 it is set to 16.
  566. **
  567. ** Microsoft uses an IDELTA_COUNT (number of sample pairs used to choose best predictor)
  568. ** value of 3. The best possible results would be obtained by using all the samples to
  569. ** choose the predictor.
  570. */
  571. #define IDELTA_COUNT 3
  572. static
  573. void choose_predictor (unsigned int channels, short *data, int *block_pred, int *idelta)
  574. { unsigned int chan, k, bpred, idelta_sum, best_bpred, best_idelta ;
  575. for (chan = 0 ; chan < channels; chan++)
  576. { best_bpred = best_idelta = 0 ;
  577. for (bpred = 0 ; bpred < 7 ; bpred++)
  578. { idelta_sum = 0 ;
  579. for (k = 2 ; k < 2 + IDELTA_COUNT ; k++)
  580. idelta_sum += abs (data [k*channels] - ((data [(k-1)*channels] * AdaptCoeff1 [bpred] + data [(k-2)*channels] * AdaptCoeff2 [bpred]) >> 8)) ;
  581. idelta_sum /= (4 * IDELTA_COUNT) ;
  582. if (bpred == 0 || idelta_sum < best_idelta)
  583. { best_bpred = bpred ;
  584. best_idelta = idelta_sum ;
  585. } ;
  586. if (! idelta_sum)
  587. { best_bpred = bpred ;
  588. best_idelta = 16 ;
  589. break ;
  590. } ;
  591. } ; /* for bpred ... */
  592. if (best_idelta < 16)
  593. best_idelta = 16 ;
  594. block_pred [chan] = best_bpred ;
  595. idelta [chan]     = best_idelta ;
  596. } ;
  597. return ;
  598. } /* choose_predictor */