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

流媒体/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 <unistd.h>
  19. #include "config.h"
  20. #include "sndfile.h"
  21. #include "common.h"
  22. #include "sfendian.h"
  23. #include "pcm.h"
  24. /* Important!!! Do not assume that sizeof (tribyte) == 3. Some compilers 
  25. ** (Metrowerks CodeWarrior for Mac is one) pad the struct with an extra byte.
  26. */
  27. typedef struct
  28. { char bytes [3] ;
  29. } tribyte ;
  30. static void sc2s_array (signed char *buffer, unsigned int count, short *ptr, int index) ;
  31. static void uc2s_array (unsigned char *buffer, unsigned int count, short *ptr, int index) ;
  32. static void bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;
  33. static void let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;
  34. static void bei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;
  35. static void lei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;
  36. static void f2s_array  (float *buffer, unsigned int count, short *ptr, int index) ;
  37. static void sc2i_array (signed char *buffer, unsigned int count, int *ptr, int index) ;
  38. static void uc2i_array (unsigned char *buffer, unsigned int count, int *ptr, int index) ;
  39. static void bes2i_array (short *buffer, unsigned int count, int *ptr, int index) ;
  40. static void les2i_array (short *buffer, unsigned int count, int *ptr, int index) ;
  41. static void bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;
  42. static void let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;
  43. static void f2i_array  (float *buffer, unsigned int count, int *ptr, int index) ;
  44. static void sc2d_array (signed char *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  45. static void uc2d_array (unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  46. static void bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  47. static void les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  48. static void bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  49. static void let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  50. static void bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  51. static void lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  52. static void f2d_array  (float *buffer, unsigned int count, double *ptr, int index, double normfact) ;
  53. static void s2sc_array (short *ptr, int index, signed char *buffer, unsigned int count) ;
  54. static void s2uc_array (short *ptr, int index, unsigned char *buffer, unsigned int count) ;
  55. static void s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;
  56. static void s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;
  57. static void s2bei_array (short *ptr, int index, int *buffer, unsigned int count) ;
  58. static void s2lei_array (short *ptr, int index, int *buffer, unsigned int count) ;
  59. static  void s2f_array  (short *ptr, int index, float *buffer, unsigned int count) ;
  60. static void i2sc_array (int *ptr, int index, signed char *buffer, unsigned int count) ;
  61. static void i2uc_array (int *ptr, int index, unsigned char *buffer, unsigned int count) ;
  62. static void i2bes_array (int *ptr, int index, short *buffer, unsigned int count) ;
  63. static void i2les_array (int *ptr, int index, short *buffer, unsigned int count) ;
  64. static void i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;
  65. static void i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;
  66. static  void i2f_array  (int *ptr, int index, float *buffer, unsigned int count) ;
  67. static void d2sc_array (double *ptr, int index, signed char *buffer, unsigned int count, double normfact) ;
  68. static void d2uc_array (double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact) ;
  69. static void d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;
  70. static void d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;
  71. static void d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;
  72. static void d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;
  73. static  void d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;
  74. static  void d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;
  75. static  void d2f_array  (double *ptr, int index, float *buffer, unsigned int count, double normfact) ;
  76. /*-----------------------------------------------------------------------------------------------
  77.  */
  78. int pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len)
  79. { unsigned int readcount, thisread ;
  80. int bytecount, bufferlen ;
  81. int index = 0, total = 0 ;
  82. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  83. bytecount = len * psf->bytewidth ;
  84. while (bytecount > 0)
  85. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  86. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  87. sc2s_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  88. total += thisread ;
  89. if (thisread < readcount)
  90. break ;
  91. index += thisread / psf->bytewidth ;
  92. bytecount -= thisread ;
  93. } ;
  94. total /= psf->bytewidth ;
  95. if (total < len)
  96. psf->error = SFE_SHORT_READ ;
  97. return total ;
  98. } /* pcm_read_sc2s */
  99. int pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len)
  100. { unsigned int readcount, thisread ;
  101. int bytecount, bufferlen ;
  102. int index = 0, total = 0 ;
  103. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  104. bytecount = len * psf->bytewidth ;
  105. while (bytecount > 0)
  106. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  107. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  108. uc2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  109. total += thisread ;
  110. if (thisread < readcount)
  111. break ;
  112. index += thisread / psf->bytewidth ;
  113. bytecount -= thisread ;
  114. } ;
  115. total /= psf->bytewidth ;
  116. if (total < len)
  117. psf->error = SFE_SHORT_READ ;
  118. return total ;
  119. } /* pcm_read_uc2s */
  120. int pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len)
  121. { int total ;
  122. total = fread (ptr, 1, len * sizeof (short), psf->file) ;
  123. if (CPU_IS_LITTLE_ENDIAN)
  124. endswap_short_array (ptr, len) ;
  125. total /= psf->bytewidth ;
  126. if (total < len)
  127. psf->error = SFE_SHORT_READ ;
  128. return total ;
  129. } /* pcm_read_bes2s */
  130. int pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len)
  131. { int total ;
  132. total = fread (ptr, 1, len * sizeof (short), psf->file) ;
  133. if (CPU_IS_BIG_ENDIAN)
  134. endswap_short_array (ptr, len) ;
  135. total /= psf->bytewidth ;
  136. if (total < len)
  137. psf->error = SFE_SHORT_READ ;
  138. return total ;
  139. } /* pcm_read_les2s */
  140. int pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len)
  141. { unsigned int readcount, thisread ;
  142. int bytecount, bufferlen ;
  143. int index = 0, total = 0 ;
  144. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  145. bytecount = len * psf->bytewidth ;
  146. while (bytecount > 0)
  147. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  148. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  149. bet2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  150. total += thisread ;
  151. if (thisread < readcount)
  152. break ;
  153. index += thisread / psf->bytewidth ;
  154. bytecount -= thisread ;
  155. } ;
  156. total /= psf->bytewidth ;
  157. if (total < len)
  158. psf->error = SFE_SHORT_READ ;
  159. return total ;
  160. } /* pcm_read_bet2s */
  161. int pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len)
  162. { unsigned int readcount, thisread ;
  163. int bytecount, bufferlen ;
  164. int index = 0, total = 0 ;
  165. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  166. bytecount = len * psf->bytewidth ;
  167. while (bytecount > 0)
  168. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  169. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  170. let2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  171. total += thisread ;
  172. if (thisread < readcount)
  173. break ;
  174. index += thisread / psf->bytewidth ;
  175. bytecount -= thisread ;
  176. } ;
  177. total /= psf->bytewidth ;
  178. if (total < len)
  179. psf->error = SFE_SHORT_READ ;
  180. return total ;
  181. } /* pcm_read_let2s */
  182. int pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len)
  183. { unsigned int readcount, thisread ;
  184. int bytecount, bufferlen ;
  185. int index = 0, total = 0 ;
  186. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  187. bytecount = len * psf->bytewidth ;
  188. while (bytecount > 0)
  189. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  190. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  191. bei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  192. total += thisread ;
  193. if (thisread < readcount)
  194. break ;
  195. index += thisread / psf->bytewidth ;
  196. bytecount -= thisread ;
  197. } ;
  198. total /= psf->bytewidth ;
  199. if (total < len)
  200. psf->error = SFE_SHORT_READ ;
  201. return total ;
  202. } /* pcm_read_bei2s */
  203. int pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len)
  204. { unsigned int readcount, thisread ;
  205. int bytecount, bufferlen ;
  206. int index = 0, total = 0 ;
  207. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  208. bytecount = len * psf->bytewidth ;
  209. while (bytecount > 0)
  210. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  211. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  212. lei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  213. total += thisread ;
  214. if (thisread < readcount)
  215. break ;
  216. index += thisread / psf->bytewidth ;
  217. bytecount -= thisread ;
  218. } ;
  219. total /= psf->bytewidth ;
  220. if (total < len)
  221. psf->error = SFE_SHORT_READ ;
  222. return total ;
  223. } /* pcm_read_lei2s */
  224. int pcm_read_f2s (SF_PRIVATE *psf, short *ptr, int len)
  225. { unsigned int readcount, thisread ;
  226. int bytecount, bufferlen ;
  227. int index = 0, total = 0 ;
  228. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  229. bytecount = len * psf->bytewidth ;
  230. while (bytecount > 0)
  231. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  232. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  233. f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  234. total += thisread ;
  235. if (thisread < readcount)
  236. break ;
  237. index += thisread / psf->bytewidth ;
  238. bytecount -= thisread ;
  239. } ;
  240. total /= psf->bytewidth ;
  241. if (total < len)
  242. psf->error = SFE_SHORT_READ ;
  243. return total ;
  244. } /* pcm_read_f2s */
  245. /*-----------------------------------------------------------------------------------------------
  246.  */
  247. int pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, int len)
  248. { unsigned int readcount, thisread ;
  249. int bytecount, bufferlen ;
  250. int index = 0, total = 0 ;
  251. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  252. bytecount = len * psf->bytewidth ;
  253. while (bytecount > 0)
  254. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  255. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  256. sc2i_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  257. total += thisread ;
  258. if (thisread < readcount)
  259. break ;
  260. index += thisread / psf->bytewidth ;
  261. bytecount -= thisread ;
  262. } ;
  263. total /= psf->bytewidth ;
  264. if (total < len)
  265. psf->error = SFE_SHORT_READ ;
  266. return total ;
  267. } /* pcm_read_sc2i */
  268. int pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, int len)
  269. { unsigned int readcount, thisread ;
  270. int bytecount, bufferlen ;
  271. int index = 0, total = 0 ;
  272. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  273. bytecount = len * psf->bytewidth ;
  274. while (bytecount > 0)
  275. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  276. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  277. uc2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  278. total += thisread ;
  279. if (thisread < readcount)
  280. break ;
  281. index += thisread / psf->bytewidth ;
  282. bytecount -= thisread ;
  283. } ;
  284. total /= psf->bytewidth ;
  285. if (total < len)
  286. psf->error = SFE_SHORT_READ ;
  287. return total ;
  288. } /* pcm_read_uc2i */
  289. int pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len)
  290. { unsigned int readcount, thisread ;
  291. int bytecount, bufferlen ;
  292. int index = 0, total = 0 ;
  293. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  294. bytecount = len * psf->bytewidth ;
  295. while (bytecount > 0)
  296. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  297. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  298. bes2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  299. total += thisread ;
  300. if (thisread < readcount)
  301. break ;
  302. index += thisread / psf->bytewidth ;
  303. bytecount -= thisread ;
  304. } ;
  305. total /= psf->bytewidth ;
  306. if (total < len)
  307. psf->error = SFE_SHORT_READ ;
  308. return total ;
  309. } /* pcm_read_bes2i */
  310. int pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len)
  311. { unsigned int readcount, thisread ;
  312. int bytecount, bufferlen ;
  313. int index = 0, total = 0 ;
  314. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  315. bytecount = len * psf->bytewidth ;
  316. while (bytecount > 0)
  317. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  318. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  319. les2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  320. total += thisread ;
  321. if (thisread < readcount)
  322. break ;
  323. index += thisread / psf->bytewidth ;
  324. bytecount -= thisread ;
  325. } ;
  326. total /= psf->bytewidth ;
  327. if (total < len)
  328. psf->error = SFE_SHORT_READ ;
  329. return total ;
  330. } /* pcm_read_les2i */
  331. int pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len)
  332. { unsigned int readcount, thisread ;
  333. int bytecount, bufferlen ;
  334. int index = 0, total = 0 ;
  335. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  336. bytecount = len * psf->bytewidth ;
  337. while (bytecount > 0)
  338. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  339. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  340. bet2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  341. total += thisread ;
  342. if (thisread < readcount)
  343. break ;
  344. index += thisread / psf->bytewidth ;
  345. bytecount -= thisread ;
  346. } ;
  347. total /= psf->bytewidth ;
  348. if (total < len)
  349. psf->error = SFE_SHORT_READ ;
  350. return total ;
  351. } /* pcm_read_bet2i */
  352. int pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len)
  353. { unsigned int readcount, thisread ;
  354. int bytecount, bufferlen ;
  355. int index = 0, total = 0 ;
  356. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  357. bytecount = len * psf->bytewidth ;
  358. while (bytecount > 0)
  359. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  360. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  361. let2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  362. total += thisread ;
  363. if (thisread < readcount)
  364. break ;
  365. index += thisread / psf->bytewidth ;
  366. bytecount -= thisread ;
  367. } ;
  368. total /= psf->bytewidth ;
  369. if (total < len)
  370. psf->error = SFE_SHORT_READ ;
  371. return total ;
  372. } /* pcm_read_let2i */
  373. int pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len)
  374. { int total ;
  375. total = fread (ptr, 1, len * sizeof (int), psf->file) ;
  376. if (CPU_IS_LITTLE_ENDIAN)
  377. endswap_int_array (ptr, len) ;
  378. total /= psf->bytewidth ;
  379. if (total < len)
  380. psf->error = SFE_SHORT_READ ;
  381. return total ;
  382. } /* pcm_read_bei2i */
  383. int pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len)
  384. { int total ;
  385. total = fread (ptr, 1, len * sizeof (int), psf->file) ;
  386. if (CPU_IS_BIG_ENDIAN)
  387. endswap_int_array (ptr, len) ;
  388. total /= psf->bytewidth ;
  389. if (total < len)
  390. psf->error = SFE_SHORT_READ ;
  391. return total ;
  392. } /* pcm_read_lei2i */
  393. int pcm_read_f2i (SF_PRIVATE *psf, int *ptr, int len)
  394. { unsigned int readcount, thisread ;
  395. int bytecount, bufferlen ;
  396. int index = 0, total = 0 ;
  397. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  398. bytecount = len * psf->bytewidth ;
  399. while (bytecount > 0)
  400. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  401. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  402. f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
  403. total += thisread ;
  404. if (thisread < readcount)
  405. break ;
  406. index += thisread / psf->bytewidth ;
  407. bytecount -= thisread ;
  408. } ;
  409. total /= psf->bytewidth ;
  410. if (total < len)
  411. psf->error = SFE_SHORT_READ ;
  412. return total ;
  413. } /* pcm_read_f2i */
  414. /*-----------------------------------------------------------------------------------------------
  415.  */
  416. int pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  417. { unsigned int readcount, thisread ;
  418. int bytecount, bufferlen ;
  419. int index = 0, total = 0 ;
  420. double normfact ;
  421. normfact = (normalize ? 1.0 / ((double) 0x80) : 1.0) ;
  422. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  423. bytecount = len * psf->bytewidth ;
  424. while (bytecount > 0)
  425. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  426. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  427. sc2d_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  428. total += thisread ;
  429. if (thisread < readcount)
  430. break ;
  431. index += thisread / psf->bytewidth ;
  432. bytecount -= thisread ;
  433. } ;
  434. total /= psf->bytewidth ;
  435. if (total < len)
  436. psf->error = SFE_SHORT_READ ;
  437. return total ;
  438. } /* pcm_read_sc2d */
  439. int pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  440. { unsigned int readcount, thisread ;
  441. int bytecount, bufferlen ;
  442. int index = 0, total = 0 ;
  443. double normfact ;
  444. normfact = (normalize ? 1.0 / ((double) 0x80) : 1.0) ;
  445. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  446. bytecount = len * psf->bytewidth ;
  447. while (bytecount > 0)
  448. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  449. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  450. uc2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  451. total += thisread ;
  452. if (thisread < readcount)
  453. break ;
  454. index += thisread / psf->bytewidth ;
  455. bytecount -= thisread ;
  456. } ;
  457. total /= psf->bytewidth ;
  458. if (total < len)
  459. psf->error = SFE_SHORT_READ ;
  460. return total ;
  461. } /* pcm_read_uc2d */
  462. int pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  463. { unsigned int readcount, thisread ;
  464. int bytecount, bufferlen ;
  465. int index = 0, total = 0 ;
  466. double normfact ;
  467. normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
  468. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  469. bytecount = len * psf->bytewidth ;
  470. while (bytecount > 0)
  471. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  472. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  473. bes2d_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  474. total += thisread ;
  475. if (thisread < readcount)
  476. break ;
  477. index += thisread / psf->bytewidth ;
  478. bytecount -= thisread ;
  479. } ;
  480. total /= psf->bytewidth ;
  481. if (total < len)
  482. psf->error = SFE_SHORT_READ ;
  483. return total ;
  484. } /* pcm_read_bes2d */
  485. int pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  486. { unsigned int readcount, thisread ;
  487. int bytecount, bufferlen ;
  488. int index = 0, total = 0 ;
  489. double normfact ;
  490. normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
  491. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  492. bytecount = len * psf->bytewidth ;
  493. while (bytecount > 0)
  494. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  495. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  496. les2d_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  497. total += thisread ;
  498. if (thisread < readcount)
  499. break ;
  500. index += thisread / psf->bytewidth ;
  501. bytecount -= thisread ;
  502. } ;
  503. total /= psf->bytewidth ;
  504. if (total < len)
  505. psf->error = SFE_SHORT_READ ;
  506. return total ;
  507. } /* pcm_read_les2d */
  508. int pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  509. { unsigned int readcount, thisread ;
  510. int bytecount, bufferlen ;
  511. int index = 0, total = 0 ;
  512. double normfact ;
  513. normfact = (normalize ? 1.0 / ((double) 0x800000) : 1.0) ;
  514. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  515. bytecount = len * psf->bytewidth ;
  516. while (bytecount > 0)
  517. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  518. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  519. bet2d_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  520. total += thisread ;
  521. if (thisread < readcount)
  522. break ;
  523. index += thisread / psf->bytewidth ;
  524. bytecount -= thisread ;
  525. } ;
  526. total /= psf->bytewidth ;
  527. if (total < len)
  528. psf->error = SFE_SHORT_READ ;
  529. return total ;
  530. } /* pcm_read_bet2d */
  531. int pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  532. { unsigned int readcount, thisread ;
  533. int bytecount, bufferlen ;
  534. int index = 0, total = 0 ;
  535. double normfact ;
  536. normfact = (normalize ? 1.0 / ((double) 0x800000) : 1.0) ;
  537. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  538. bytecount = len * psf->bytewidth ;
  539. while (bytecount > 0)
  540. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  541. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  542. let2d_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  543. total += thisread ;
  544. if (thisread < readcount)
  545. break ;
  546. index += thisread / psf->bytewidth ;
  547. bytecount -= thisread ;
  548. } ;
  549. total /= psf->bytewidth ;
  550. if (total < len)
  551. psf->error = SFE_SHORT_READ ;
  552. return total ;
  553. } /* pcm_read_let2d */
  554. int pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  555. { unsigned int readcount, thisread ;
  556. int bytecount, bufferlen ;
  557. int index = 0, total = 0 ;
  558. double normfact ;
  559. normfact = (normalize ? 1.0 / ((double) 0x80000000) : 1.0) ;
  560. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  561. bytecount = len * psf->bytewidth ;
  562. while (bytecount > 0)
  563. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  564. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  565. bei2d_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  566. total += thisread ;
  567. if (thisread < readcount)
  568. break ;
  569. index += thisread / psf->bytewidth ;
  570. bytecount -= thisread ;
  571. } ;
  572. total /= psf->bytewidth ;
  573. if (total < len)
  574. psf->error = SFE_SHORT_READ ;
  575. return total ;
  576. } /* pcm_read_bei2d */
  577. int pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  578. { unsigned int readcount, thisread ;
  579. int bytecount, bufferlen ;
  580. int index = 0, total = 0 ;
  581. double normfact ;
  582. normfact = (normalize ? 1.0 / ((double) 0x80000000) : 1.0) ;
  583. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  584. bytecount = len * psf->bytewidth ;
  585. while (bytecount > 0)
  586. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  587. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  588. lei2d_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  589. total += thisread ;
  590. if (thisread < readcount)
  591. break ;
  592. index += thisread / psf->bytewidth ;
  593. bytecount -= thisread ;
  594. } ;
  595. total /= psf->bytewidth ;
  596. if (total < len)
  597. psf->error = SFE_SHORT_READ ;
  598. return total ;
  599. } /* pcm_read_lei2d */
  600. int pcm_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  601. { unsigned int readcount, thisread ;
  602. int bytecount, bufferlen ;
  603. int index = 0, total = 0 ;
  604. double normfact ;
  605. normfact = normalize ? 1.0 : 1.0 ;
  606. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  607. bytecount = len * psf->bytewidth ;
  608. while (bytecount > 0)
  609. { readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  610. thisread = fread (psf->buffer, 1, readcount, psf->file) ;
  611. f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
  612. total += thisread ;
  613. if (thisread < readcount)
  614. break ;
  615. index += thisread / psf->bytewidth ;
  616. bytecount -= thisread ;
  617. } ;
  618. total /= psf->bytewidth ;
  619. if (total < len)
  620. psf->error = SFE_SHORT_READ ;
  621. return total ;
  622. } /* pcm_read_f2d */
  623. /*===============================================================================================
  624.  *-----------------------------------------------------------------------------------------------
  625.  *===============================================================================================
  626.  */
  627. int pcm_write_s2sc (SF_PRIVATE *psf, short *ptr, int len)
  628. { unsigned int writecount, thiswrite ;
  629. int bytecount, bufferlen ;
  630. int index = 0, total = 0 ;
  631. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  632. bytecount = len * psf->bytewidth ;
  633. while (bytecount > 0)
  634. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  635. s2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth) ;
  636. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  637. total += thiswrite ;
  638. if (thiswrite < writecount)
  639. break ;
  640. index += thiswrite / psf->bytewidth ;
  641. bytecount -= thiswrite ;
  642. } ;
  643. total /= psf->bytewidth ;
  644. if (total < len)
  645. psf->error = SFE_SHORT_WRITE ;
  646. return total ;
  647. } /* pcm_write_s2sc */
  648. int pcm_write_s2uc (SF_PRIVATE *psf, short *ptr, int len)
  649. { unsigned int writecount, thiswrite ;
  650. int bytecount, bufferlen ;
  651. int index = 0, total = 0 ;
  652. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  653. bytecount = len * psf->bytewidth ;
  654. while (bytecount > 0)
  655. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  656. s2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
  657. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  658. total += thiswrite ;
  659. if (thiswrite < writecount)
  660. break ;
  661. index += thiswrite / psf->bytewidth ;
  662. bytecount -= thiswrite ;
  663. } ;
  664. total /= psf->bytewidth ;
  665. if (total < len)
  666. psf->error = SFE_SHORT_WRITE ;
  667. return total ;
  668. } /* pcm_write_s2uc */
  669. int pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, int len)
  670. { int total ;
  671. if (CPU_IS_LITTLE_ENDIAN)
  672. endswap_short_array (ptr, len) ;
  673. total = fwrite (ptr, 1, len * sizeof (short), psf->file) ;
  674. if (CPU_IS_LITTLE_ENDIAN)
  675. endswap_short_array (ptr, len) ;
  676. total /= psf->bytewidth ;
  677. if (total < len)
  678. psf->error = SFE_SHORT_WRITE ;
  679. return total ;
  680. } /* pcm_write_s2bes */
  681. int pcm_write_s2les (SF_PRIVATE *psf, short *ptr, int len)
  682. { int total ;
  683. if (CPU_IS_BIG_ENDIAN)
  684. endswap_short_array (ptr, len) ;
  685. total = fwrite (ptr, 1, len * sizeof (short), psf->file) ;
  686. if (CPU_IS_BIG_ENDIAN)
  687. endswap_short_array (ptr, len) ;
  688. total /= psf->bytewidth ;
  689. if (total < len)
  690. psf->error = SFE_SHORT_WRITE ;
  691. return total ;
  692. } /* pcm_write_s2les */
  693. int pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, int len)
  694. { unsigned int writecount, thiswrite ;
  695. int bytecount, bufferlen ;
  696. int index = 0, total = 0 ;
  697. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  698. bytecount = len * psf->bytewidth ;
  699. while (bytecount > 0)
  700. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  701. s2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
  702. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  703. total += thiswrite ;
  704. if (thiswrite < writecount)
  705. break ;
  706. index += thiswrite / psf->bytewidth ;
  707. bytecount -= thiswrite ;
  708. } ;
  709. total /= psf->bytewidth ;
  710. if (total < len)
  711. psf->error = SFE_SHORT_WRITE ;
  712. return total ;
  713. } /* pcm_write_s2bet */
  714. int pcm_write_s2let (SF_PRIVATE *psf, short *ptr, int len)
  715. { unsigned int writecount, thiswrite ;
  716. int bytecount, bufferlen ;
  717. int index = 0, total = 0 ;
  718. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  719. bytecount = len * psf->bytewidth ;
  720. while (bytecount > 0)
  721. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  722. s2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
  723. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  724. total += thiswrite ;
  725. if (thiswrite < writecount)
  726. break ;
  727. index += thiswrite / psf->bytewidth ;
  728. bytecount -= thiswrite ;
  729. } ;
  730. total /= psf->bytewidth ;
  731. if (total < len)
  732. psf->error = SFE_SHORT_WRITE ;
  733. return total ;
  734. } /* pcm_write_s2let */
  735. int  pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, int len)
  736. { unsigned int writecount, thiswrite ;
  737. int bytecount, bufferlen ;
  738. int index = 0, total = 0 ;
  739. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  740. bytecount = len * psf->bytewidth ;
  741. while (bytecount > 0)
  742. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  743. s2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth) ;
  744. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  745. total += thiswrite ;
  746. if (thiswrite < writecount)
  747. break ;
  748. index += thiswrite / psf->bytewidth ;
  749. bytecount -= thiswrite ;
  750. } ;
  751. total /= psf->bytewidth ;
  752. if (total < len)
  753. psf->error = SFE_SHORT_WRITE ;
  754. return total ;
  755. } /* pcm_write_s2bei */
  756. int  pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, int len)
  757. { unsigned int writecount, thiswrite ;
  758. int bytecount, bufferlen ;
  759. int index = 0, total = 0 ;
  760. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  761. bytecount = len * psf->bytewidth ;
  762. while (bytecount > 0)
  763. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  764. s2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth) ;
  765. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  766. total += thiswrite ;
  767. if (thiswrite < writecount)
  768. break ;
  769. index += thiswrite / psf->bytewidth ;
  770. bytecount -= thiswrite ;
  771. } ;
  772. total /= psf->bytewidth ;
  773. if (total < len)
  774. psf->error = SFE_SHORT_WRITE ;
  775. return total ;
  776. } /* pcm_write_s2lei */
  777. int pcm_write_s2f (SF_PRIVATE *psf, short *ptr, int len)
  778. { unsigned int writecount, thiswrite ;
  779. int bytecount, bufferlen ;
  780. int index = 0, total = 0 ;
  781. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  782. bytecount = len * psf->bytewidth ;
  783. while (bytecount > 0)
  784. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  785. s2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
  786. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  787. total += thiswrite ;
  788. if (thiswrite < writecount)
  789. break ;
  790. index += thiswrite / psf->bytewidth ;
  791. bytecount -= thiswrite ;
  792. } ;
  793. total /= psf->bytewidth ;
  794. if (total < len)
  795. psf->error = SFE_SHORT_WRITE ;
  796. return total ;
  797. } /* pcm_write_s2f */
  798. /*-----------------------------------------------------------------------------------------------
  799.  */
  800. int pcm_write_i2sc (SF_PRIVATE *psf, int *ptr, int len)
  801. { unsigned int writecount, thiswrite ;
  802. int bytecount, bufferlen ;
  803. int index = 0, total = 0 ;
  804. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  805. bytecount = len * psf->bytewidth ;
  806. while (bytecount > 0)
  807. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  808. i2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth) ;
  809. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  810. total += thiswrite ;
  811. if (thiswrite < writecount)
  812. break ;
  813. index += thiswrite / psf->bytewidth ;
  814. bytecount -= thiswrite ;
  815. } ;
  816. total /= psf->bytewidth ;
  817. if (total < len)
  818. psf->error = SFE_SHORT_WRITE ;
  819. return total ;
  820. } /* pcm_write_i2sc */
  821. int pcm_write_i2uc (SF_PRIVATE *psf, int *ptr, int len)
  822. { unsigned int writecount, thiswrite ;
  823. int bytecount, bufferlen ;
  824. int index = 0, total = 0 ;
  825. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  826. bytecount = len * psf->bytewidth ;
  827. while (bytecount > 0)
  828. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  829. i2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
  830. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  831. total += thiswrite ;
  832. if (thiswrite < writecount)
  833. break ;
  834. index += thiswrite / psf->bytewidth ;
  835. bytecount -= thiswrite ;
  836. } ;
  837. total /= psf->bytewidth ;
  838. if (total < len)
  839. psf->error = SFE_SHORT_WRITE ;
  840. return total ;
  841. } /* pcm_write_i2uc */
  842. int pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, int len)
  843. { unsigned int writecount, thiswrite ;
  844. int bytecount, bufferlen ;
  845. int index = 0, total = 0 ;
  846. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  847. bytecount = len * psf->bytewidth ;
  848. while (bytecount > 0)
  849. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  850. i2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth) ;
  851. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  852. total += thiswrite ;
  853. if (thiswrite < writecount)
  854. break ;
  855. index += thiswrite / psf->bytewidth ;
  856. bytecount -= thiswrite ;
  857. } ;
  858. total /= psf->bytewidth ;
  859. if (total < len)
  860. psf->error = SFE_SHORT_WRITE ;
  861. return total ;
  862. } /* pcm_write_i2bes */
  863. int pcm_write_i2les (SF_PRIVATE *psf, int *ptr, int len)
  864. { unsigned int writecount, thiswrite ;
  865. int bytecount, bufferlen ;
  866. int index = 0, total = 0 ;
  867. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  868. bytecount = len * psf->bytewidth ;
  869. while (bytecount > 0)
  870. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  871. i2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth) ;
  872. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  873. total += thiswrite ;
  874. if (thiswrite < writecount)
  875. break ;
  876. index += thiswrite / psf->bytewidth ;
  877. bytecount -= thiswrite ;
  878. } ;
  879. total /= psf->bytewidth ;
  880. if (total < len)
  881. psf->error = SFE_SHORT_WRITE ;
  882. return total ;
  883. } /* pcm_write_i2les */
  884. int pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, int len)
  885. { unsigned int writecount, thiswrite ;
  886. int bytecount, bufferlen ;
  887. int index = 0, total = 0 ;
  888. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  889. bytecount = len * psf->bytewidth ;
  890. while (bytecount > 0)
  891. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  892. i2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
  893. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  894. total += thiswrite ;
  895. if (thiswrite < writecount)
  896. break ;
  897. index += thiswrite / psf->bytewidth ;
  898. bytecount -= thiswrite ;
  899. } ;
  900. total /= psf->bytewidth ;
  901. if (total < len)
  902. psf->error = SFE_SHORT_WRITE ;
  903. return total ;
  904. } /* pcm_write_i2bet */
  905. int pcm_write_i2let (SF_PRIVATE *psf, int *ptr, int len)
  906. { unsigned int writecount, thiswrite ;
  907. int bytecount, bufferlen ;
  908. int index = 0, total = 0 ;
  909. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  910. bytecount = len * psf->bytewidth ;
  911. while (bytecount > 0)
  912. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  913. i2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
  914. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  915. total += thiswrite ;
  916. if (thiswrite < writecount)
  917. break ;
  918. index += thiswrite / psf->bytewidth ;
  919. bytecount -= thiswrite ;
  920. } ;
  921. total /= psf->bytewidth ;
  922. if (total < len)
  923. psf->error = SFE_SHORT_WRITE ;
  924. return total ;
  925. } /* pcm_write_i2les */
  926. int  pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, int len)
  927. { int total ;
  928. if (CPU_IS_LITTLE_ENDIAN)
  929. endswap_int_array (ptr, len) ;
  930. total = fwrite (ptr, 1, len * sizeof (int), psf->file) ;
  931. if (CPU_IS_LITTLE_ENDIAN)
  932. endswap_int_array (ptr, len) ;
  933. total /= psf->bytewidth ;
  934. if (total < len)
  935. psf->error = SFE_SHORT_WRITE ;
  936. return total ;
  937. } /* pcm_write_i2bei */
  938. int  pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, int len)
  939. { int total ;
  940. if (CPU_IS_BIG_ENDIAN)
  941. endswap_int_array (ptr, len) ;
  942. total = fwrite (ptr, 1, len * sizeof (int), psf->file) ;
  943. if (CPU_IS_BIG_ENDIAN)
  944. endswap_int_array (ptr, len) ;
  945. total /= psf->bytewidth ;
  946. if (total < len)
  947. psf->error = SFE_SHORT_WRITE ;
  948. return total ;
  949. } /* pcm_write_i2lei */
  950. int pcm_write_i2f (SF_PRIVATE *psf, int *ptr, int len)
  951. { unsigned int writecount, thiswrite ;
  952. int bytecount, bufferlen ;
  953. int index = 0, total = 0 ;
  954. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  955. bytecount = len * psf->bytewidth ;
  956. while (bytecount > 0)
  957. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  958. i2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
  959. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  960. total += thiswrite ;
  961. if (thiswrite < writecount)
  962. break ;
  963. index += thiswrite / psf->bytewidth ;
  964. bytecount -= thiswrite ;
  965. } ;
  966. total /= psf->bytewidth ;
  967. if (total < len)
  968. psf->error = SFE_SHORT_WRITE ;
  969. return total ;
  970. } /* pcm_write_i2f */
  971. /*-----------------------------------------------------------------------------------------------
  972.  */
  973. int pcm_write_d2sc (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  974. { unsigned int writecount, thiswrite ;
  975. int bytecount, bufferlen ;
  976. int index = 0, total = 0 ;
  977. double normfact ;
  978. normfact = (normalize ? ((double) 0x80) : 1.0) ;
  979. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  980. bytecount = len * psf->bytewidth ;
  981. while (bytecount > 0)
  982. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  983. d2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  984. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  985. total += thiswrite ;
  986. if (thiswrite < writecount)
  987. break ;
  988. index += thiswrite / psf->bytewidth ;
  989. bytecount -= thiswrite ;
  990. } ;
  991. total /= psf->bytewidth ;
  992. if (total < len)
  993. psf->error = SFE_SHORT_WRITE ;
  994. return total ;
  995. } /* pcm_write_d2sc */
  996. int pcm_write_d2uc (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  997. { unsigned int writecount, thiswrite ;
  998. int bytecount, bufferlen ;
  999. int index = 0, total = 0 ;
  1000. double normfact ;
  1001. normfact = (normalize ? ((double) 0x80) : 1.0) ;
  1002. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  1003. bytecount = len * psf->bytewidth ;
  1004. while (bytecount > 0)
  1005. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  1006. d2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  1007. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  1008. total += thiswrite ;
  1009. if (thiswrite < writecount)
  1010. break ;
  1011. index += thiswrite / psf->bytewidth ;
  1012. bytecount -= thiswrite ;
  1013. } ;
  1014. total /= psf->bytewidth ;
  1015. if (total < len)
  1016. psf->error = SFE_SHORT_WRITE ;
  1017. return total ;
  1018. } /* pcm_write_d2uc */
  1019. int pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  1020. { unsigned int writecount, thiswrite ;
  1021. int bytecount, bufferlen ;
  1022. int index = 0, total = 0 ;
  1023. double normfact ;
  1024. normfact = (normalize ? ((double) 0x8000) : 1.0) ;
  1025. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  1026. bytecount = len * psf->bytewidth ;
  1027. while (bytecount > 0)
  1028. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  1029. d2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  1030. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  1031. total += thiswrite ;
  1032. if (thiswrite < writecount)
  1033. break ;
  1034. index += thiswrite / psf->bytewidth ;
  1035. bytecount -= thiswrite ;
  1036. } ;
  1037. total /= psf->bytewidth ;
  1038. if (total < len)
  1039. psf->error = SFE_SHORT_WRITE ;
  1040. return total ;
  1041. } /* pcm_write_d2bes */
  1042. int pcm_write_d2les (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  1043. { unsigned int writecount, thiswrite ;
  1044. int bytecount, bufferlen ;
  1045. int index = 0, total = 0 ;
  1046. double normfact ;
  1047. normfact = (normalize ? ((double) 0x8000) : 1.0) ;
  1048. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  1049. bytecount = len * psf->bytewidth ;
  1050. while (bytecount > 0)
  1051. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  1052. d2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  1053. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  1054. total += thiswrite ;
  1055. if (thiswrite < writecount)
  1056. break ;
  1057. index += thiswrite / psf->bytewidth ;
  1058. bytecount -= thiswrite ;
  1059. } ;
  1060. total /= psf->bytewidth ;
  1061. if (total < len)
  1062. psf->error = SFE_SHORT_WRITE ;
  1063. return total ;
  1064. } /* pcm_write_d2les */
  1065. int pcm_write_d2let (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  1066. { unsigned int writecount, thiswrite ;
  1067. int bytecount, bufferlen ;
  1068. int index = 0, total = 0 ;
  1069. double normfact ;
  1070. normfact = (normalize ? ((double) 0x800000) : 1.0) ;
  1071. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  1072. bytecount = len * psf->bytewidth ;
  1073. while (bytecount > 0)
  1074. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  1075. d2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  1076. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  1077. total += thiswrite ;
  1078. if (thiswrite < writecount)
  1079. break ;
  1080. index += thiswrite / psf->bytewidth ;
  1081. bytecount -= thiswrite ;
  1082. } ;
  1083. total /= psf->bytewidth ;
  1084. if (total < len)
  1085. psf->error = SFE_SHORT_WRITE ;
  1086. return total ;
  1087. } /* pcm_write_d2les */
  1088. int pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  1089. { unsigned int writecount, thiswrite ;
  1090. int bytecount, bufferlen ;
  1091. int index = 0, total = 0 ;
  1092. double normfact ;
  1093. normfact = (normalize ? ((double) 0x800000) : 1.0) ;
  1094. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  1095. bytecount = len * psf->bytewidth ;
  1096. while (bytecount > 0)
  1097. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  1098. d2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  1099. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  1100. total += thiswrite ;
  1101. if (thiswrite < writecount)
  1102. break ;
  1103. index += thiswrite / psf->bytewidth ;
  1104. bytecount -= thiswrite ;
  1105. } ;
  1106. total /= psf->bytewidth ;
  1107. if (total < len)
  1108. psf->error = SFE_SHORT_WRITE ;
  1109. return total ;
  1110. } /* pcm_write_d2bes */
  1111. int  pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  1112. { unsigned int writecount, thiswrite ;
  1113. int bytecount, bufferlen ;
  1114. int index = 0, total = 0 ;
  1115. double normfact ;
  1116. normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
  1117. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  1118. bytecount = len * psf->bytewidth ;
  1119. while (bytecount > 0)
  1120. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  1121. d2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  1122. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  1123. total += thiswrite ;
  1124. if (thiswrite < writecount)
  1125. break ;
  1126. index += thiswrite / psf->bytewidth ;
  1127. bytecount -= thiswrite ;
  1128. } ;
  1129. total /= psf->bytewidth ;
  1130. if (total < len)
  1131. psf->error = SFE_SHORT_WRITE ;
  1132. return total ;
  1133. } /* pcm_write_d2bei */
  1134. int  pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  1135. { unsigned int writecount, thiswrite ;
  1136. int bytecount, bufferlen ;
  1137. int index = 0, total = 0 ;
  1138. double normfact ;
  1139. normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
  1140. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  1141. bytecount = len * psf->bytewidth ;
  1142. while (bytecount > 0)
  1143. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  1144. d2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  1145. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  1146. total += thiswrite ;
  1147. if (thiswrite < writecount)
  1148. break ;
  1149. index += thiswrite / psf->bytewidth ;
  1150. bytecount -= thiswrite ;
  1151. } ;
  1152. total /= psf->bytewidth ;
  1153. if (total < len)
  1154. psf->error = SFE_SHORT_WRITE ;
  1155. return total ;
  1156. } /* pcm_write_d2lei */
  1157. int pcm_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  1158. { unsigned int writecount, thiswrite ;
  1159. int bytecount, bufferlen ;
  1160. int index = 0, total = 0 ;
  1161. double normfact ;
  1162. normfact = (normalize) ? 1.0 : 1.0 ;
  1163. bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
  1164. bytecount = len * psf->bytewidth ;
  1165. while (bytecount > 0)
  1166. { writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
  1167. d2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
  1168. thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
  1169. total += thiswrite ;
  1170. if (thiswrite < writecount)
  1171. break ;
  1172. index += thiswrite / psf->bytewidth ;
  1173. bytecount -= thiswrite ;
  1174. } ;
  1175. total /= psf->bytewidth ;
  1176. if (total < len)
  1177. psf->error = SFE_SHORT_WRITE ;
  1178. return total ;
  1179. } /* pcm_write_d2f */
  1180. /*-----------------------------------------------------------------------------------------------
  1181.  */
  1182. static
  1183. void sc2s_array (signed char *buffer, unsigned int count, short *ptr, int index)
  1184. { int k ;
  1185. for (k = 0 ; k < count ; k++)
  1186. { ptr [index] = ((short) buffer [k]) ;
  1187. index ++ ;
  1188. } ;
  1189. } /* sc2s_array */
  1190. static
  1191. void uc2s_array (unsigned char *buffer, unsigned int count, short *ptr, int index)
  1192. { int k ;
  1193. for (k = 0 ; k < count ; k++)
  1194. { ptr [index] = ((((short) buffer [k]) - 128) % 256) ;
  1195. index ++ ;
  1196. } ;
  1197. } /* uc2s_array */
  1198. static
  1199. void bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
  1200. { unsigned char *cptr ;
  1201. int k ;
  1202. int  value;
  1203. cptr = (unsigned char*) buffer ;
  1204. for (k = 0 ; k < count ; k++)
  1205. { value = (cptr [0] << 24) | (cptr [1] << 16) | (cptr [2] << 8) ;
  1206. value = BE2H_INT (value) ;
  1207. ptr [index] = (short) (value >> 16) ;
  1208. index ++ ;
  1209. cptr += 3 ;
  1210. } ;
  1211. } /* bet2s_array */
  1212. static
  1213. void let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
  1214. { unsigned char *cptr ;
  1215. int k ;
  1216. int  value;
  1217. cptr = (unsigned char*) buffer ;
  1218. for (k = 0 ; k < count ; k++)
  1219. { value = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
  1220. value = LE2H_INT (value) ;
  1221. ptr [index] = (short) (value >> 16) ;
  1222. index ++ ;
  1223. cptr += 3 ;
  1224. } ;
  1225. } /* let2s_array */
  1226. static
  1227. void bei2s_array (int *buffer, unsigned int count, short *ptr, int index)
  1228. { int k ;
  1229. int value ;
  1230. for (k = 0 ; k < count ; k++)
  1231. { value = BE2H_INT (buffer [k]) ;
  1232. ptr [index] = (short) (value >> 16) ;
  1233. index ++ ;
  1234. } ;
  1235. } /* bei2s_array */
  1236. static
  1237. void lei2s_array (int *buffer, unsigned int count, short *ptr, int index)
  1238. { int k ;
  1239. int value ;
  1240. for (k = 0 ; k < count ; k++)
  1241. { value = LE2H_INT (buffer [k]) ;
  1242. ptr [index] = (short) (value >> 16) ;
  1243. index ++ ;
  1244. } ;
  1245. } /* lei2s_array */
  1246. static
  1247. void f2s_array (float *buffer, unsigned int count, short *ptr, int index)
  1248. { int k ;
  1249. for (k = 0 ; k < count ; k++)
  1250. { ptr [index] = ((double) buffer [k]) ;
  1251. index ++ ;
  1252. } ;
  1253. } /* f2s_array */
  1254. /*-----------------------------------------------------------------------------------------------
  1255.  */
  1256. static
  1257. void sc2i_array (signed char *buffer, unsigned int count, int *ptr, int index)
  1258. { int k ;
  1259. for (k = 0 ; k < count ; k++)
  1260. { ptr [index] = ((int) buffer [k]) ;
  1261. index ++ ;
  1262. } ;
  1263. } /* sc2i_array */
  1264. static
  1265. void uc2i_array (unsigned char *buffer, unsigned int count, int *ptr, int index)
  1266. { int k ;
  1267. for (k = 0 ; k < count ; k++)
  1268. { ptr [index] = ((((int) buffer [k]) - 128) % 256) ;
  1269. index ++ ;
  1270. } ;
  1271. } /* uc2i_array */
  1272. static
  1273. void bes2i_array (short *buffer, unsigned int count, int *ptr, int index)
  1274. { int k ;
  1275. short value ;
  1276. for (k = 0 ; k < count ; k++)
  1277. { value = BE2H_SHORT (buffer [k]) ;
  1278. ptr [index] = ((int) value) ;
  1279. index ++ ;
  1280. } ;
  1281. } /* bes2i_array */
  1282. static
  1283. void les2i_array (short *buffer, unsigned int count, int *ptr, int index)
  1284. { int k ;
  1285. short value ;
  1286. for (k = 0 ; k < count ; k++)
  1287. { value = LE2H_SHORT (buffer [k]) ;
  1288. ptr [index] = ((int) value) ;
  1289. index ++ ;
  1290. } ;
  1291. } /* les2i_array */
  1292. static
  1293. void bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
  1294. { unsigned char *cptr ;
  1295. int k ;
  1296. int  value;
  1297. cptr = (unsigned char*) buffer ;
  1298. for (k = 0 ; k < count ; k++)
  1299. { value = (cptr [0] << 24) | (cptr [1] << 16) | (cptr [2] << 8) ;
  1300. ptr [index] = value / 256 ;
  1301. index ++ ;
  1302. cptr += 3 ;
  1303. } ;
  1304. } /* bet2i_array */
  1305. static
  1306. void let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
  1307. { unsigned char *cptr ;
  1308. int k ;
  1309. int  value;
  1310. cptr = (unsigned char*) buffer ;
  1311. for (k = 0 ; k < count ; k++)
  1312. { value = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
  1313. ptr [index] = value / 256 ;
  1314. index ++ ;
  1315. cptr += 3 ;
  1316. } ;
  1317. } /* let2i_array */
  1318. static
  1319. void f2i_array (float *buffer, unsigned int count, int *ptr, int index)
  1320. { int k ;
  1321. for (k = 0 ; k < count ; k++)
  1322. { ptr [index] = (int) ((double) buffer [k]) ;
  1323. index ++ ;
  1324. } ;
  1325. } /* f2i_array */
  1326. /*-----------------------------------------------------------------------------------------------
  1327.  */
  1328. static
  1329. void sc2d_array (signed char *buffer, unsigned int count, double *ptr, int index, double normfact)
  1330. { int k ;
  1331. for (k = 0 ; k < count ; k++)
  1332. { ptr [index] = ((double) buffer [k]) * normfact ;
  1333. index ++ ;
  1334. } ;
  1335. } /* sc2d_array */
  1336. static
  1337. void uc2d_array (unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact)
  1338. { int k ;
  1339. for (k = 0 ; k < count ; k++)
  1340. { ptr [index] = ((((int) buffer [k]) - 128) % 256) * normfact ;
  1341. index ++ ;
  1342. } ;
  1343. } /* uc2d_array */
  1344. static
  1345. void bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
  1346. { int k ;
  1347. short value ;
  1348. for (k = 0 ; k < count ; k++)
  1349. { value = BE2H_SHORT (buffer [k]) ;
  1350. ptr [index] = ((double) value) * normfact ;
  1351. index ++ ;
  1352. } ;
  1353. } /* bes2d_array */
  1354. static
  1355. void les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
  1356. { int k ;
  1357. short value ;
  1358. for (k = 0 ; k < count ; k++)
  1359. { value = LE2H_SHORT (buffer [k]) ;
  1360. ptr [index] = ((double) value) * normfact ;
  1361. index ++ ;
  1362. } ;
  1363. } /* les2d_array */
  1364. static
  1365. void bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
  1366. { unsigned char *cptr ;
  1367. int k ;
  1368. int  value;
  1369. cptr = (unsigned char*) buffer ;
  1370. for (k = 0 ; k < count ; k++)
  1371. { value = (cptr [0] << 24) | (cptr [1] << 16) | (cptr [2] << 8) ;
  1372. ptr [index] = ((double) (value / 256)) * normfact ;
  1373. index ++ ;
  1374. cptr += 3 ;
  1375. } ;
  1376. } /* bet2d_array */
  1377. static
  1378. void let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
  1379. { unsigned char *cptr ;
  1380. int k ;
  1381. int  value;
  1382. cptr = (unsigned char*) buffer ;
  1383. for (k = 0 ; k < count ; k++)
  1384. { value = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
  1385. ptr [index] = ((double) (value / 256)) * normfact ;
  1386. index ++ ;
  1387. cptr += 3 ; 
  1388. } ;
  1389. } /* let2d_array */
  1390. static
  1391. void bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
  1392. { int k ;
  1393. int value ;
  1394. for (k = 0 ; k < count ; k++)
  1395. { value = BE2H_INT (buffer [k]) ;
  1396. ptr [index] = ((double) value) * normfact ;
  1397. index ++ ;
  1398. } ;
  1399. } /* bei2d_array */
  1400. static
  1401. void lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
  1402. { int k ;
  1403. int value ;
  1404. for (k = 0 ; k < count ; k++)
  1405. { value = LE2H_INT (buffer [k]) ;
  1406. ptr [index] = ((double) value) * normfact ;
  1407. index ++ ;
  1408. } ;
  1409. } /* lei2d_array */
  1410. static
  1411. void f2d_array (float *buffer, unsigned int count, double *ptr, int index, double normfact)
  1412. { int k ;
  1413. for (k = 0 ; k < count ; k++)
  1414. { ptr [index] = ((double) buffer [k]) * normfact ;
  1415. index ++ ;
  1416. } ;
  1417. } /* f2d_array */
  1418. /*-----------------------------------------------------------------------------------------------
  1419.  */
  1420. static
  1421. void s2sc_array (short *ptr, int index, signed char *buffer, unsigned int count)
  1422. { int k ;
  1423. for (k = 0 ; k < count ; k++)
  1424. { buffer [k] = (signed char) (ptr [index]) ;
  1425. index ++ ;
  1426. } ;
  1427. } /* s2sc_array */
  1428. static
  1429. void s2uc_array (short *ptr, int index, unsigned char *buffer, unsigned int count)
  1430. { int k ;
  1431. for (k = 0 ; k < count ; k++)
  1432. { buffer [k] = (unsigned char) (ptr [index] + 128) ;
  1433. index ++ ;
  1434. } ;
  1435. } /* s2uc_array */
  1436. static 
  1437. void s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count)
  1438. { unsigned char *cptr ;
  1439. int k, value ;
  1440. cptr = (unsigned char*) buffer ;
  1441. for (k = 0 ; k < count ; k++)
  1442. { value = ptr [index] << 8 ;
  1443. cptr [2] = (unsigned char) (value & 0xFF) ;
  1444. cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
  1445. cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
  1446. index ++ ;
  1447. cptr += 3 ;
  1448. } ;
  1449. } /* s2bet_array */
  1450. static 
  1451. void s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count)
  1452. { unsigned char *cptr ;
  1453. int k, value ;
  1454. cptr = (unsigned char*) buffer ;
  1455. for (k = 0 ; k < count ; k++)
  1456. { value = ptr [index] << 8 ;
  1457. cptr [0] = (unsigned char) (value & 0xFF) ;
  1458. cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
  1459. cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
  1460. index ++ ;
  1461. cptr += 3 ;
  1462. } ;
  1463. } /* s2let_array */
  1464. static 
  1465. void s2bei_array (short *ptr, int index, int *buffer, unsigned int count)
  1466. { int k ;
  1467. for (k = 0 ; k < count ; k++)
  1468. { buffer [k] = H2BE_INT (ptr [index] << 16) ;
  1469. index ++ ;
  1470. } ;
  1471. } /* s2lei_array */
  1472. static 
  1473. void s2lei_array (short *ptr, int index, int *buffer, unsigned int count)
  1474. { int k ;
  1475. for (k = 0 ; k < count ; k++)
  1476. { buffer [k] = H2LE_INT (ptr [index] << 16) ;
  1477. index ++ ;
  1478. } ;
  1479. } /* s2lei_array */
  1480. static 
  1481. void s2f_array (short *ptr, int index, float *buffer, unsigned int count)
  1482. { int k ;
  1483. for (k = 0 ; k < count ; k++)
  1484. { buffer [k] = (float) (ptr [index]) ;
  1485. index ++ ;
  1486. } ;
  1487. } /* s2f_array */
  1488. /*-----------------------------------------------------------------------------------------------
  1489.  */
  1490. static
  1491. void i2sc_array (int *ptr, int index, signed char *buffer, unsigned int count)
  1492. { int k ;
  1493. for (k = 0 ; k < count ; k++)
  1494. { buffer [k] = (signed char) (ptr [index]) ;
  1495. index ++ ;
  1496. } ;
  1497. } /* i2sc_array */
  1498. static
  1499. void i2uc_array (int *ptr, int index, unsigned char *buffer, unsigned int count)
  1500. { int k ;
  1501. for (k = 0 ; k < count ; k++)
  1502. { buffer [k] = (unsigned char) (ptr [index] + 128) ;
  1503. index ++ ;
  1504. } ;
  1505. } /* i2uc_array */
  1506. static 
  1507. void i2bes_array (int *ptr, int index, short *buffer, unsigned int count)
  1508. { int k ;
  1509. for (k = 0 ; k < count ; k++)
  1510. { buffer [k] = H2BE_SHORT (ptr [index]) ;
  1511. index ++ ;
  1512. } ;
  1513. } /* i2bes_array */
  1514. static 
  1515. void i2les_array (int *ptr, int index, short *buffer, unsigned int count)
  1516. { int k ;
  1517. for (k = 0 ; k < count ; k++)
  1518. { buffer [k] = H2LE_SHORT (ptr [index]) ;
  1519. index ++ ;
  1520. } ;
  1521. } /* i2les_array */
  1522. static 
  1523. void i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count)
  1524. { unsigned char *cptr ;
  1525. int k, value ;
  1526. cptr = (unsigned char*) buffer ;
  1527. for (k = 0 ; k < count ; k++)
  1528. { value = ptr [index] ;
  1529. cptr [0] = (unsigned char) ((value & 0xFF0000) >> 16) ;
  1530. cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
  1531. cptr [2] = (unsigned char) (value & 0xFF) ;
  1532. index ++ ;
  1533. cptr += 3 ;
  1534. } ;
  1535. } /* i2bet_array */
  1536. static 
  1537. void i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count)
  1538. { unsigned char *cptr ;
  1539. int k, value ;
  1540. cptr = (unsigned char*) buffer ;
  1541. for (k = 0 ; k < count ; k++)
  1542. { value = ptr [index] ;
  1543. cptr [0] = (unsigned char) (value & 0xFF) ;
  1544. cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
  1545. cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
  1546. index ++ ;
  1547. cptr += 3 ;
  1548. } ;
  1549. } /* i2let_array */
  1550. static 
  1551. void i2f_array (int *ptr, int index, float *buffer, unsigned int count)
  1552. { int k ;
  1553. for (k = 0 ; k < count ; k++)
  1554. { buffer [k] = (float) (ptr [index]) ;
  1555. index ++ ;
  1556. } ;
  1557. } /* i2f_array */
  1558. /*-----------------------------------------------------------------------------------------------
  1559.  */
  1560. static
  1561. void d2sc_array (double *ptr, int index, signed char *buffer, unsigned int count, double normfact)
  1562. { int k ;
  1563. for (k = 0 ; k < count ; k++)
  1564. { buffer [k] = (signed char) (ptr [index] * normfact) ;
  1565. index ++ ;
  1566. } ;
  1567. } /* d2sc_array */
  1568. static
  1569. void d2uc_array (double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact)
  1570. { int k ;
  1571. for (k = 0 ; k < count ; k++)
  1572. { buffer [k] = (unsigned char) ((ptr [index] * normfact) + 128) ;
  1573. index ++ ;
  1574. } ;
  1575. } /* d2uc_array */
  1576. static 
  1577. void d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
  1578. { int k ;
  1579. for (k = 0 ; k < count ; k++)
  1580. { buffer [k] = H2BE_SHORT ((int) (ptr [index] * normfact)) ;
  1581. index ++ ;
  1582. } ;
  1583. } /* d2bes_array */
  1584. static 
  1585. void d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
  1586. { int k ;
  1587. for (k = 0 ; k < count ; k++)
  1588. { buffer [k] = H2LE_SHORT ((int) (ptr [index] * normfact)) ;
  1589. index ++ ;
  1590. } ;
  1591. } /* d2les_array */
  1592. static 
  1593. void d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
  1594. { unsigned char *cptr ;
  1595. int k, value ;
  1596. cptr = (unsigned char*) buffer ;
  1597. for (k = 0 ; k < count ; k++)
  1598. { value = (int) (ptr [index] * normfact) ;
  1599. cptr [2] = (unsigned char) (value & 0xFF) ;
  1600. cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
  1601. cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
  1602. index ++ ;
  1603. cptr += 3 ;
  1604. } ;
  1605. } /* d2bet_array */
  1606. static 
  1607. void d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
  1608. { unsigned char *cptr ;
  1609. int k, value ;
  1610. cptr = (unsigned char*) buffer ;
  1611. for (k = 0 ; k < count ; k++)
  1612. { value = (int) (ptr [index] * normfact) ;
  1613. cptr [0] = (unsigned char) (value & 0xFF) ;
  1614. cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
  1615. cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
  1616. index ++ ;
  1617. cptr += 3 ;
  1618. } ;
  1619. } /* d2let_array */
  1620. static 
  1621. void d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
  1622. { int k ;
  1623. for (k = 0 ; k < count ; k++)
  1624. { buffer [k] = H2BE_INT ((int) (ptr [index] * normfact)) ;
  1625. index ++ ;
  1626. } ;
  1627. } /* d2bei_array */
  1628. static 
  1629. void d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
  1630. { int k ;
  1631. for (k = 0 ; k < count ; k++)
  1632. { buffer [k] = H2LE_INT ((int) (ptr [index] * normfact)) ;
  1633. index ++ ;
  1634. } ;
  1635. } /* d2lei_array */
  1636. static 
  1637. void d2f_array (double *ptr, int index, float *buffer, unsigned int count, double normfact)
  1638. { int k ;
  1639. for (k = 0 ; k < count ; k++)
  1640. { buffer [k] = (float) (ptr [index] * normfact) ;
  1641. index ++ ;
  1642. } ;
  1643. } /* d2f_array */