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

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 1999-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  3. **
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU Lesser General Public License as published by
  6. ** the Free Software Foundation; either version 2.1 of the License, or
  7. ** (at your option) any later version.
  8. **
  9. ** This program is distributed in the hope that it will be useful,
  10. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ** GNU Lesser General Public License for more details.
  13. **
  14. ** You should have received a copy of the GNU Lesser General Public License
  15. ** along with this program; if not, write to the Free Software
  16. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. #include "sfconfig.h"
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <limits.h>
  23. #include <math.h>
  24. #include "sndfile.h"
  25. #include "sfendian.h"
  26. #include "common.h"
  27. #if CPU_IS_LITTLE_ENDIAN
  28. #define FLOAT32_READ float32_le_read
  29. #define FLOAT32_WRITE float32_le_write
  30. #elif CPU_IS_BIG_ENDIAN
  31. #define FLOAT32_READ float32_be_read
  32. #define FLOAT32_WRITE float32_be_write
  33. #endif
  34. /*--------------------------------------------------------------------------------------------
  35. ** Processor floating point capabilities. float32_get_capability () returns one of the
  36. ** latter four values.
  37. */
  38. enum
  39. { FLOAT_UNKNOWN = 0x00,
  40. FLOAT_CAN_RW_LE = 0x12,
  41. FLOAT_CAN_RW_BE = 0x23,
  42. FLOAT_BROKEN_LE = 0x34,
  43. FLOAT_BROKEN_BE = 0x45
  44. } ;
  45. /*--------------------------------------------------------------------------------------------
  46. ** Prototypes for private functions.
  47. */
  48. static sf_count_t host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
  49. static sf_count_t host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
  50. static sf_count_t host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
  51. static sf_count_t host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
  52. static sf_count_t host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
  53. static sf_count_t host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
  54. static sf_count_t host_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
  55. static sf_count_t host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
  56. static void float32_peak_update (SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx) ;
  57. static sf_count_t replace_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
  58. static sf_count_t replace_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
  59. static sf_count_t replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
  60. static sf_count_t replace_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
  61. static sf_count_t replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
  62. static sf_count_t replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
  63. static sf_count_t replace_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
  64. static sf_count_t replace_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
  65. static void bf2f_array (float *buffer, int count) ;
  66. static void f2bf_array (float *buffer, int count) ;
  67. static int float32_get_capability (SF_PRIVATE *psf) ;
  68. /*--------------------------------------------------------------------------------------------
  69. ** Exported functions.
  70. */
  71. int
  72. float32_init (SF_PRIVATE *psf)
  73. { static int float_caps ;
  74. float_caps = float32_get_capability (psf) ;
  75. psf->blockwidth = sizeof (float) * psf->sf.channels ;
  76. if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
  77. { switch (psf->endian + float_caps)
  78. { case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) :
  79. psf->data_endswap = SF_FALSE ;
  80. psf->read_short = host_read_f2s ;
  81. psf->read_int = host_read_f2i ;
  82. psf->read_float = host_read_f ;
  83. psf->read_double = host_read_f2d ;
  84. break ;
  85. case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) :
  86. psf->data_endswap = SF_FALSE ;
  87. psf->read_short = host_read_f2s ;
  88. psf->read_int = host_read_f2i ;
  89. psf->read_float = host_read_f ;
  90. psf->read_double = host_read_f2d ;
  91. break ;
  92. case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) :
  93. psf->data_endswap = SF_TRUE ;
  94. psf->read_short = host_read_f2s ;
  95. psf->read_int = host_read_f2i ;
  96. psf->read_float = host_read_f ;
  97. psf->read_double = host_read_f2d ;
  98. break ;
  99. case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) :
  100. psf->data_endswap = SF_TRUE ;
  101. psf->read_short = host_read_f2s ;
  102. psf->read_int = host_read_f2i ;
  103. psf->read_float = host_read_f ;
  104. psf->read_double = host_read_f2d ;
  105. break ;
  106. /* When the CPU is not IEEE compatible. */
  107. case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) :
  108. psf->data_endswap = SF_TRUE ;
  109. psf->read_short = replace_read_f2s ;
  110. psf->read_int = replace_read_f2i ;
  111. psf->read_float = replace_read_f ;
  112. psf->read_double = replace_read_f2d ;
  113. break ;
  114. case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) :
  115. psf->data_endswap = SF_FALSE ;
  116. psf->read_short = replace_read_f2s ;
  117. psf->read_int = replace_read_f2i ;
  118. psf->read_float = replace_read_f ;
  119. psf->read_double = replace_read_f2d ;
  120. break ;
  121. case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) :
  122. psf->data_endswap = SF_FALSE ;
  123. psf->read_short = replace_read_f2s ;
  124. psf->read_int = replace_read_f2i ;
  125. psf->read_float = replace_read_f ;
  126. psf->read_double = replace_read_f2d ;
  127. break ;
  128. case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) :
  129. psf->data_endswap = SF_TRUE ;
  130. psf->read_short = replace_read_f2s ;
  131. psf->read_int = replace_read_f2i ;
  132. psf->read_float = replace_read_f ;
  133. psf->read_double = replace_read_f2d ;
  134. break ;
  135. default : break ;
  136. } ;
  137. } ;
  138. if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
  139. { switch (psf->endian + float_caps)
  140. { case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) :
  141. psf->data_endswap = SF_FALSE ;
  142. psf->write_short = host_write_s2f ;
  143. psf->write_int = host_write_i2f ;
  144. psf->write_float = host_write_f ;
  145. psf->write_double = host_write_d2f ;
  146. break ;
  147. case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) :
  148. psf->data_endswap = SF_FALSE ;
  149. psf->write_short = host_write_s2f ;
  150. psf->write_int = host_write_i2f ;
  151. psf->write_float = host_write_f ;
  152. psf->write_double = host_write_d2f ;
  153. break ;
  154. case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) :
  155. psf->data_endswap = SF_TRUE ;
  156. psf->write_short = host_write_s2f ;
  157. psf->write_int = host_write_i2f ;
  158. psf->write_float = host_write_f ;
  159. psf->write_double = host_write_d2f ;
  160. break ;
  161. case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) :
  162. psf->data_endswap = SF_TRUE ;
  163. psf->write_short = host_write_s2f ;
  164. psf->write_int = host_write_i2f ;
  165. psf->write_float = host_write_f ;
  166. psf->write_double = host_write_d2f ;
  167. break ;
  168. /* When the CPU is not IEEE compatible. */
  169. case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) :
  170. psf->data_endswap = SF_TRUE ;
  171. psf->write_short = replace_write_s2f ;
  172. psf->write_int = replace_write_i2f ;
  173. psf->write_float = replace_write_f ;
  174. psf->write_double = replace_write_d2f ;
  175. break ;
  176. case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) :
  177. psf->data_endswap = SF_FALSE ;
  178. psf->write_short = replace_write_s2f ;
  179. psf->write_int = replace_write_i2f ;
  180. psf->write_float = replace_write_f ;
  181. psf->write_double = replace_write_d2f ;
  182. break ;
  183. case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) :
  184. psf->data_endswap = SF_FALSE ;
  185. psf->write_short = replace_write_s2f ;
  186. psf->write_int = replace_write_i2f ;
  187. psf->write_float = replace_write_f ;
  188. psf->write_double = replace_write_d2f ;
  189. break ;
  190. case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) :
  191. psf->data_endswap = SF_TRUE ;
  192. psf->write_short = replace_write_s2f ;
  193. psf->write_int = replace_write_i2f ;
  194. psf->write_float = replace_write_f ;
  195. psf->write_double = replace_write_d2f ;
  196. break ;
  197. default : break ;
  198. } ;
  199. } ;
  200. if (psf->filelength > psf->dataoffset)
  201. { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset :
  202. psf->filelength - psf->dataoffset ;
  203. }
  204. else
  205. psf->datalength = 0 ;
  206. psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ;
  207. return 0 ;
  208. } /* float32_init */
  209. float
  210. float32_be_read (unsigned char *cptr)
  211. { int exponent, mantissa, negative ;
  212. float fvalue ;
  213. negative = cptr [0] & 0x80 ;
  214. exponent = ((cptr [0] & 0x7F) << 1) | ((cptr [1] & 0x80) ? 1 : 0) ;
  215. mantissa = ((cptr [1] & 0x7F) << 16) | (cptr [2] << 8) | (cptr [3]) ;
  216. if (! (exponent || mantissa))
  217. return 0.0 ;
  218. mantissa |= 0x800000 ;
  219. exponent = exponent ? exponent - 127 : 0 ;
  220. fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ;
  221. if (negative)
  222. fvalue *= -1 ;
  223. if (exponent > 0)
  224. fvalue *= pow (2.0, exponent) ;
  225. else if (exponent < 0)
  226. fvalue /= pow (2.0, abs (exponent)) ;
  227. return fvalue ;
  228. } /* float32_be_read */
  229. float
  230. float32_le_read (unsigned char *cptr)
  231. { int exponent, mantissa, negative ;
  232. float fvalue ;
  233. negative = cptr [3] & 0x80 ;
  234. exponent = ((cptr [3] & 0x7F) << 1) | ((cptr [2] & 0x80) ? 1 : 0) ;
  235. mantissa = ((cptr [2] & 0x7F) << 16) | (cptr [1] << 8) | (cptr [0]) ;
  236. if (! (exponent || mantissa))
  237. return 0.0 ;
  238. mantissa |= 0x800000 ;
  239. exponent = exponent ? exponent - 127 : 0 ;
  240. fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ;
  241. if (negative)
  242. fvalue *= -1 ;
  243. if (exponent > 0)
  244. fvalue *= pow (2.0, exponent) ;
  245. else if (exponent < 0)
  246. fvalue /= pow (2.0, abs (exponent)) ;
  247. return fvalue ;
  248. } /* float32_le_read */
  249. void
  250. float32_le_write (float in, unsigned char *out)
  251. { int exponent, mantissa, negative = 0 ;
  252. memset (out, 0, sizeof (int)) ;
  253. if (fabs (in) < 1e-30)
  254. return ;
  255. if (in < 0.0)
  256. { in *= -1.0 ;
  257. negative = 1 ;
  258. } ;
  259. in = frexp (in, &exponent) ;
  260. exponent += 126 ;
  261. in *= (float) 0x1000000 ;
  262. mantissa = (((int) in) & 0x7FFFFF) ;
  263. if (negative)
  264. out [3] |= 0x80 ;
  265. if (exponent & 0x01)
  266. out [2] |= 0x80 ;
  267. out [0] = mantissa & 0xFF ;
  268. out [1] = (mantissa >> 8) & 0xFF ;
  269. out [2] |= (mantissa >> 16) & 0x7F ;
  270. out [3] |= (exponent >> 1) & 0x7F ;
  271. return ;
  272. } /* float32_le_write */
  273. void
  274. float32_be_write (float in, unsigned char *out)
  275. { int exponent, mantissa, negative = 0 ;
  276. memset (out, 0, sizeof (int)) ;
  277. if (fabs (in) < 1e-30)
  278. return ;
  279. if (in < 0.0)
  280. { in *= -1.0 ;
  281. negative = 1 ;
  282. } ;
  283. in = frexp (in, &exponent) ;
  284. exponent += 126 ;
  285. in *= (float) 0x1000000 ;
  286. mantissa = (((int) in) & 0x7FFFFF) ;
  287. if (negative)
  288. out [0] |= 0x80 ;
  289. if (exponent & 0x01)
  290. out [1] |= 0x80 ;
  291. out [3] = mantissa & 0xFF ;
  292. out [2] = (mantissa >> 8) & 0xFF ;
  293. out [1] |= (mantissa >> 16) & 0x7F ;
  294. out [0] |= (exponent >> 1) & 0x7F ;
  295. return ;
  296. } /* float32_be_write */
  297. /*==============================================================================================
  298. ** Private functions.
  299. */
  300. static void
  301. float32_peak_update (SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx)
  302. { int  chan ;
  303. int k, position ;
  304. float fmaxval ;
  305. for (chan = 0 ; chan < psf->sf.channels ; chan++)
  306. { fmaxval = fabs (buffer [chan]) ;
  307. position = 0 ;
  308. for (k = chan ; k < count ; k += psf->sf.channels)
  309. if (fmaxval < fabs (buffer [k]))
  310. { fmaxval = fabs (buffer [k]) ;
  311. position = k ;
  312. } ;
  313. if (fmaxval > psf->peak_info->peaks [chan].value)
  314. { psf->peak_info->peaks [chan].value = fmaxval ;
  315. psf->peak_info->peaks [chan].position = psf->write_current + indx + (position / psf->sf.channels) ;
  316. } ;
  317. } ;
  318. return ;
  319. } /* float32_peak_update */
  320. static int
  321. float32_get_capability (SF_PRIVATE *psf)
  322. { union
  323. { float f ;
  324. int i ;
  325. unsigned char c [4] ;
  326. } data ;
  327. data.f = (float) 1.23456789 ; /* Some abitrary value. */
  328. if (! psf->ieee_replace)
  329. { /* If this test is true ints and floats are compatible and little endian. */
  330. if (data.c [0] == 0x52 && data.c [1] == 0x06 && data.c [2] == 0x9e && data.c [3] == 0x3f)
  331. return FLOAT_CAN_RW_LE ;
  332. /* If this test is true ints and floats are compatible and big endian. */
  333. if (data.c [3] == 0x52 && data.c [2] == 0x06 && data.c [1] == 0x9e && data.c [0] == 0x3f)
  334. return FLOAT_CAN_RW_BE ;
  335. } ;
  336. /* Floats are broken. Don't expect reading or writing to be fast. */
  337. psf_log_printf (psf, "Using IEEE replacement code for float.n") ;
  338. return (CPU_IS_LITTLE_ENDIAN) ? FLOAT_BROKEN_LE : FLOAT_BROKEN_BE ;
  339. } /* float32_get_capability */
  340. /*=======================================================================================
  341. */
  342. static void
  343. f2s_array (const float *src, int count, short *dest, float scale)
  344. {
  345. while (--count >= 0)
  346. { dest [count] = lrintf (scale * src [count]) ;
  347. } ;
  348. } /* f2s_array */
  349. static void
  350. f2s_clip_array (const float *src, int count, short *dest, float scale)
  351. { while (--count >= 0)
  352. { float tmp = scale * src [count] ;
  353. if (CPU_CLIPS_POSITIVE == 0 && tmp > 32767.0)
  354. dest [count] = SHRT_MAX ;
  355. else if (CPU_CLIPS_NEGATIVE == 0 && tmp < -32768.0)
  356. dest [count] = SHRT_MIN ;
  357. else
  358. dest [count] = lrintf (tmp) ;
  359. } ;
  360. } /* f2s_clip_array */
  361. static inline void
  362. f2i_array (const float *src, int count, int *dest, float scale)
  363. { while (--count >= 0)
  364. { dest [count] = lrintf (scale * src [count]) ;
  365. } ;
  366. } /* f2i_array */
  367. static inline void
  368. f2i_clip_array (const float *src, int count, int *dest, float scale)
  369. { while (--count >= 0)
  370. { float tmp = scale * src [count] ;
  371. if (CPU_CLIPS_POSITIVE == 0 && tmp > (1.0 * INT_MAX))
  372. dest [count] = INT_MAX ;
  373. else if (CPU_CLIPS_NEGATIVE == 0 && tmp < (-1.0 * INT_MAX))
  374. dest [count] = INT_MIN ;
  375. else
  376. dest [count] = lrintf (tmp) ;
  377. } ;
  378. } /* f2i_clip_array */
  379. static inline void
  380. f2d_array (const float *src, int count, double *dest)
  381. { while (--count >= 0)
  382. { dest [count] = src [count] ;
  383. } ;
  384. } /* f2d_array */
  385. static inline void
  386. s2f_array (const short *src, float *dest, int count, float scale)
  387. { while (--count >= 0)
  388. { dest [count] = scale * src [count] ;
  389. } ;
  390. } /* s2f_array */
  391. static inline void
  392. i2f_array (const int *src, float *dest, int count, float scale)
  393. { while (--count >= 0)
  394. { dest [count] = scale * src [count] ;
  395. } ;
  396. } /* i2f_array */
  397. static inline void
  398. d2f_array (const double *src, float *dest, int count)
  399. { while (--count >= 0)
  400. { dest [count] = src [count] ;
  401. } ;
  402. } /* d2f_array */
  403. /*----------------------------------------------------------------------------------------------
  404. */
  405. static sf_count_t
  406. host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
  407. { void (*convert) (const float *, int, short *, float) ;
  408. int bufferlen, readcount ;
  409. sf_count_t total = 0 ;
  410. float scale ;
  411. convert = (psf->add_clipping) ? f2s_clip_array : f2s_array ;
  412. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  413. scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
  414. while (len > 0)
  415. { if (len < bufferlen)
  416. bufferlen = (int) len ;
  417. readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  418. /* Fix me : Need lef2s_array */
  419. if (psf->data_endswap == SF_TRUE)
  420. endswap_int_array (psf->u.ibuf, bufferlen) ;
  421. convert (psf->u.fbuf, readcount, ptr + total, scale) ;
  422. total += readcount ;
  423. if (readcount < bufferlen)
  424. break ;
  425. len -= readcount ;
  426. } ;
  427. return total ;
  428. } /* host_read_f2s */
  429. static sf_count_t
  430. host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
  431. { void (*convert) (const float *, int, int *, float) ;
  432. int bufferlen, readcount ;
  433. sf_count_t total = 0 ;
  434. float scale ;
  435. convert = (psf->add_clipping) ? f2i_clip_array : f2i_array ;
  436. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  437. scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ;
  438. while (len > 0)
  439. { if (len < bufferlen)
  440. bufferlen = (int) len ;
  441. readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  442. if (psf->data_endswap == SF_TRUE)
  443. endswap_int_array (psf->u.ibuf, bufferlen) ;
  444. convert (psf->u.fbuf, readcount, ptr + total, scale) ;
  445. total += readcount ;
  446. if (readcount < bufferlen)
  447. break ;
  448. len -= readcount ;
  449. } ;
  450. return total ;
  451. } /* host_read_f2i */
  452. static sf_count_t
  453. host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
  454. { int bufferlen, readcount ;
  455. sf_count_t total = 0 ;
  456. if (psf->data_endswap != SF_TRUE)
  457. return psf_fread (ptr, sizeof (float), len, psf) ;
  458. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  459. while (len > 0)
  460. { if (len < bufferlen)
  461. bufferlen = (int) len ;
  462. readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  463. endswap_int_copy ((int*) (ptr + total), psf->u.ibuf, readcount) ;
  464. total += readcount ;
  465. if (readcount < bufferlen)
  466. break ;
  467. len -= readcount ;
  468. } ;
  469. return total ;
  470. } /* host_read_f */
  471. static sf_count_t
  472. host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
  473. { int bufferlen, readcount ;
  474. sf_count_t total = 0 ;
  475. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  476. while (len > 0)
  477. { if (len < bufferlen)
  478. bufferlen = (int) len ;
  479. readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  480. if (psf->data_endswap == SF_TRUE)
  481. endswap_int_array (psf->u.ibuf, bufferlen) ;
  482. /* Fix me : Need lef2d_array */
  483. f2d_array (psf->u.fbuf, readcount, ptr + total) ;
  484. total += readcount ;
  485. if (readcount < bufferlen)
  486. break ;
  487. len -= readcount ;
  488. } ;
  489. return total ;
  490. } /* host_read_f2d */
  491. static sf_count_t
  492. host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
  493. { int bufferlen, writecount ;
  494. sf_count_t total = 0 ;
  495. float scale ;
  496. /* Erik */
  497. scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
  498. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  499. while (len > 0)
  500. { if (len < bufferlen)
  501. bufferlen = (int) len ;
  502. s2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
  503. if (psf->peak_info)
  504. float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
  505. if (psf->data_endswap == SF_TRUE)
  506. endswap_int_array (psf->u.ibuf, bufferlen) ;
  507. writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  508. total += writecount ;
  509. if (writecount < bufferlen)
  510. break ;
  511. len -= writecount ;
  512. } ;
  513. return total ;
  514. } /* host_write_s2f */
  515. static sf_count_t
  516. host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
  517. { int bufferlen, writecount ;
  518. sf_count_t total = 0 ;
  519. float scale ;
  520. scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
  521. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  522. while (len > 0)
  523. { if (len < bufferlen)
  524. bufferlen = (int) len ;
  525. i2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
  526. if (psf->peak_info)
  527. float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
  528. if (psf->data_endswap == SF_TRUE)
  529. endswap_int_array (psf->u.ibuf, bufferlen) ;
  530. writecount = psf_fwrite (psf->u.fbuf, sizeof (float) , bufferlen, psf) ;
  531. total += writecount ;
  532. if (writecount < bufferlen)
  533. break ;
  534. len -= writecount ;
  535. } ;
  536. return total ;
  537. } /* host_write_i2f */
  538. static sf_count_t
  539. host_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
  540. { int bufferlen, writecount ;
  541. sf_count_t total = 0 ;
  542. if (psf->peak_info)
  543. float32_peak_update (psf, ptr, len, 0) ;
  544. if (psf->data_endswap != SF_TRUE)
  545. return psf_fwrite (ptr, sizeof (float), len, psf) ;
  546. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  547. while (len > 0)
  548. { if (len < bufferlen)
  549. bufferlen = (int) len ;
  550. endswap_int_copy (psf->u.ibuf, (const int*) (ptr + total), bufferlen) ;
  551. writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  552. total += writecount ;
  553. if (writecount < bufferlen)
  554. break ;
  555. len -= writecount ;
  556. } ;
  557. return total ;
  558. } /* host_write_f */
  559. static sf_count_t
  560. host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
  561. { int bufferlen, writecount ;
  562. sf_count_t total = 0 ;
  563. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  564. while (len > 0)
  565. { if (len < bufferlen)
  566. bufferlen = (int) len ;
  567. d2f_array (ptr + total, psf->u.fbuf, bufferlen) ;
  568. if (psf->peak_info)
  569. float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
  570. if (psf->data_endswap == SF_TRUE)
  571. endswap_int_array (psf->u.ibuf, bufferlen) ;
  572. writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  573. total += writecount ;
  574. if (writecount < bufferlen)
  575. break ;
  576. len -= writecount ;
  577. } ;
  578. return total ;
  579. } /* host_write_d2f */
  580. /*=======================================================================================
  581. */
  582. static sf_count_t
  583. replace_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
  584. { int bufferlen, readcount ;
  585. sf_count_t total = 0 ;
  586. float scale ;
  587. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  588. scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
  589. while (len > 0)
  590. { if (len < bufferlen)
  591. bufferlen = (int) len ;
  592. readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  593. if (psf->data_endswap == SF_TRUE)
  594. endswap_int_array (psf->u.ibuf, bufferlen) ;
  595. bf2f_array (psf->u.fbuf, bufferlen) ;
  596. f2s_array (psf->u.fbuf, readcount, ptr + total, scale) ;
  597. total += readcount ;
  598. if (readcount < bufferlen)
  599. break ;
  600. len -= readcount ;
  601. } ;
  602. return total ;
  603. } /* replace_read_f2s */
  604. static sf_count_t
  605. replace_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
  606. { int bufferlen, readcount ;
  607. sf_count_t total = 0 ;
  608. float scale ;
  609. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  610. scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
  611. while (len > 0)
  612. { if (len < bufferlen)
  613. bufferlen = (int) len ;
  614. readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  615. if (psf->data_endswap == SF_TRUE)
  616. endswap_int_array (psf->u.ibuf, bufferlen) ;
  617. bf2f_array (psf->u.fbuf, bufferlen) ;
  618. f2i_array (psf->u.fbuf, readcount, ptr + total, scale) ;
  619. total += readcount ;
  620. if (readcount < bufferlen)
  621. break ;
  622. len -= readcount ;
  623. } ;
  624. return total ;
  625. } /* replace_read_f2i */
  626. static sf_count_t
  627. replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
  628. { int bufferlen, readcount ;
  629. sf_count_t total = 0 ;
  630. /* FIX THIS */
  631. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  632. while (len > 0)
  633. { if (len < bufferlen)
  634. bufferlen = (int) len ;
  635. readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  636. if (psf->data_endswap == SF_TRUE)
  637. endswap_int_array (psf->u.ibuf, bufferlen) ;
  638. bf2f_array (psf->u.fbuf, bufferlen) ;
  639. memcpy (ptr + total, psf->u.fbuf, bufferlen * sizeof (float)) ;
  640. total += readcount ;
  641. if (readcount < bufferlen)
  642. break ;
  643. len -= readcount ;
  644. } ;
  645. return total ;
  646. } /* replace_read_f */
  647. static sf_count_t
  648. replace_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
  649. { int bufferlen, readcount ;
  650. sf_count_t total = 0 ;
  651. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  652. while (len > 0)
  653. { if (len < bufferlen)
  654. bufferlen = (int) len ;
  655. readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  656. if (psf->data_endswap == SF_TRUE)
  657. endswap_int_array (psf->u.ibuf, bufferlen) ;
  658. bf2f_array (psf->u.fbuf, bufferlen) ;
  659. f2d_array (psf->u.fbuf, readcount, ptr + total) ;
  660. total += readcount ;
  661. if (readcount < bufferlen)
  662. break ;
  663. len -= readcount ;
  664. } ;
  665. return total ;
  666. } /* replace_read_f2d */
  667. static sf_count_t
  668. replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
  669. { int bufferlen, writecount ;
  670. sf_count_t total = 0 ;
  671. float scale ;
  672. scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
  673. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  674. while (len > 0)
  675. { if (len < bufferlen)
  676. bufferlen = (int) len ;
  677. s2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
  678. if (psf->peak_info)
  679. float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
  680. f2bf_array (psf->u.fbuf, bufferlen) ;
  681. if (psf->data_endswap == SF_TRUE)
  682. endswap_int_array (psf->u.ibuf, bufferlen) ;
  683. writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  684. total += writecount ;
  685. if (writecount < bufferlen)
  686. break ;
  687. len -= writecount ;
  688. } ;
  689. return total ;
  690. } /* replace_write_s2f */
  691. static sf_count_t
  692. replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
  693. { int bufferlen, writecount ;
  694. sf_count_t total = 0 ;
  695. float scale ;
  696. scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
  697. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  698. while (len > 0)
  699. { if (len < bufferlen)
  700. bufferlen = (int) len ;
  701. i2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
  702. if (psf->peak_info)
  703. float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
  704. f2bf_array (psf->u.fbuf, bufferlen) ;
  705. if (psf->data_endswap == SF_TRUE)
  706. endswap_int_array (psf->u.ibuf, bufferlen) ;
  707. writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  708. total += writecount ;
  709. if (writecount < bufferlen)
  710. break ;
  711. len -= writecount ;
  712. } ;
  713. return total ;
  714. } /* replace_write_i2f */
  715. static sf_count_t
  716. replace_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
  717. { int bufferlen, writecount ;
  718. sf_count_t total = 0 ;
  719. /* FIX THIS */
  720. if (psf->peak_info)
  721. float32_peak_update (psf, ptr, len, 0) ;
  722. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  723. while (len > 0)
  724. { if (len < bufferlen)
  725. bufferlen = (int) len ;
  726. memcpy (psf->u.fbuf, ptr + total, bufferlen * sizeof (float)) ;
  727. f2bf_array (psf->u.fbuf, bufferlen) ;
  728. if (psf->data_endswap == SF_TRUE)
  729. endswap_int_array (psf->u.ibuf, bufferlen) ;
  730. writecount = psf_fwrite (psf->u.fbuf, sizeof (float) , bufferlen, psf) ;
  731. total += writecount ;
  732. if (writecount < bufferlen)
  733. break ;
  734. len -= writecount ;
  735. } ;
  736. return total ;
  737. } /* replace_write_f */
  738. static sf_count_t
  739. replace_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
  740. { int bufferlen, writecount ;
  741. sf_count_t total = 0 ;
  742. bufferlen = ARRAY_LEN (psf->u.fbuf) ;
  743. while (len > 0)
  744. { if (len < bufferlen)
  745. bufferlen = (int) len ;
  746. d2f_array (ptr + total, psf->u.fbuf, bufferlen) ;
  747. if (psf->peak_info)
  748. float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
  749. f2bf_array (psf->u.fbuf, bufferlen) ;
  750. if (psf->data_endswap == SF_TRUE)
  751. endswap_int_array (psf->u.ibuf, bufferlen) ;
  752. writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
  753. total += writecount ;
  754. if (writecount < bufferlen)
  755. break ;
  756. len -= writecount ;
  757. } ;
  758. return total ;
  759. } /* replace_write_d2f */
  760. /*----------------------------------------------------------------------------------------------
  761. */
  762. static void
  763. bf2f_array (float *buffer, int count)
  764. { while (--count >= 0)
  765. { buffer [count] = FLOAT32_READ ((unsigned char *) (buffer + count)) ;
  766. } ;
  767. } /* bf2f_array */
  768. static void
  769. f2bf_array (float *buffer, int count)
  770. { while (--count >= 0)
  771. { FLOAT32_WRITE (buffer [count], (unsigned char*) (buffer + count)) ;
  772. } ;
  773. } /* f2bf_array */