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

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 2003-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 <fcntl.h>
  22. #include <string.h>
  23. #include <ctype.h>
  24. #include <math.h>
  25. #include "sndfile.h"
  26. #include "sfendian.h"
  27. #include "common.h"
  28. #define MAX_XI_SAMPLES 16
  29. /*------------------------------------------------------------------------------
  30. ** Private static functions and tyepdefs.
  31. */
  32. typedef struct
  33. { /* Warning, this filename is NOT nul terminated. */
  34. char filename [22] ;
  35. char software [20] ;
  36. char sample_name [22] ;
  37. int loop_begin, loop_end ;
  38. int sample_flags ;
  39. /* Data for encoder and decoder. */
  40. short last_16 ;
  41. } XI_PRIVATE ;
  42. static int xi_close (SF_PRIVATE *psf) ;
  43. static int xi_write_header (SF_PRIVATE *psf, int calc_length) ;
  44. static int xi_read_header (SF_PRIVATE *psf) ;
  45. static int dpcm_init  (SF_PRIVATE *psf) ;
  46. static sf_count_t dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
  47. /*------------------------------------------------------------------------------
  48. ** Public function.
  49. */
  50. int
  51. xi_open (SF_PRIVATE *psf)
  52. { XI_PRIVATE *pxi ;
  53. int subformat, error = 0 ;
  54. if (psf->is_pipe)
  55. return SFE_XI_NO_PIPE ;
  56. if (psf->codec_data)
  57. pxi = psf->codec_data ;
  58. else if ((pxi = calloc (1, sizeof (XI_PRIVATE))) == NULL)
  59. return SFE_MALLOC_FAILED ;
  60. psf->codec_data = pxi ;
  61. if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
  62. { if ((error = xi_read_header (psf)))
  63. return error ;
  64. } ;
  65. subformat = SF_CODEC (psf->sf.format) ;
  66. if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
  67. { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_XI)
  68. return SFE_BAD_OPEN_FORMAT ;
  69. psf->endian = SF_ENDIAN_LITTLE ;
  70. psf->sf.channels = 1 ; /* Always mono */
  71. psf->sf.samplerate = 44100 ; /* Always */
  72. /* Set up default instrument and software name. */
  73. memcpy (pxi->filename, "Default Name            ", sizeof (pxi->filename)) ;
  74. memcpy (pxi->software, PACKAGE "-" VERSION "               ", sizeof (pxi->software)) ;
  75. memset (pxi->sample_name, 0, sizeof (pxi->sample_name)) ;
  76. snprintf (pxi->sample_name, sizeof (pxi->sample_name), "%s", "Sample #1") ;
  77. pxi->sample_flags = (subformat == SF_FORMAT_DPCM_16) ? 16 : 0 ;
  78. if (xi_write_header (psf, SF_FALSE))
  79. return psf->error ;
  80. psf->write_header = xi_write_header ;
  81. } ;
  82. psf->container_close = xi_close ;
  83. psf->seek = dpcm_seek ;
  84. psf->sf.seekable = SF_FALSE ;
  85. psf->blockwidth = psf->bytewidth * psf->sf.channels ;
  86. switch (subformat)
  87. { case SF_FORMAT_DPCM_8 : /* 8-bit differential PCM. */
  88. case SF_FORMAT_DPCM_16 : /* 16-bit differential PCM. */
  89. error = dpcm_init (psf) ;
  90. break ;
  91. default : break ;
  92. } ;
  93. return error ;
  94. } /* xi_open */
  95. /*------------------------------------------------------------------------------
  96. */
  97. static int
  98. xi_close (SF_PRIVATE * UNUSED (psf))
  99. {
  100. return 0 ;
  101. } /* xi_close */
  102. /*==============================================================================
  103. */
  104. static sf_count_t dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
  105. static sf_count_t dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
  106. static sf_count_t dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
  107. static sf_count_t dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
  108. static sf_count_t dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
  109. static sf_count_t dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
  110. static sf_count_t dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
  111. static sf_count_t dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
  112. static sf_count_t dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
  113. static sf_count_t dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
  114. static sf_count_t dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
  115. static sf_count_t dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
  116. static sf_count_t dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
  117. static sf_count_t dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
  118. static sf_count_t dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
  119. static sf_count_t dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
  120. static int
  121. dpcm_init (SF_PRIVATE *psf)
  122. { if (psf->bytewidth == 0 || psf->sf.channels == 0)
  123. return SFE_INTERNAL ;
  124. psf->blockwidth = psf->bytewidth * psf->sf.channels ;
  125. if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
  126. { switch (psf->bytewidth)
  127. { case 1 :
  128. psf->read_short = dpcm_read_dsc2s ;
  129. psf->read_int = dpcm_read_dsc2i ;
  130. psf->read_float = dpcm_read_dsc2f ;
  131. psf->read_double = dpcm_read_dsc2d ;
  132. break ;
  133. case 2 :
  134. psf->read_short = dpcm_read_dles2s ;
  135. psf->read_int = dpcm_read_dles2i ;
  136. psf->read_float = dpcm_read_dles2f ;
  137. psf->read_double = dpcm_read_dles2d ;
  138. break ;
  139. default :
  140. psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTEDn") ;
  141. return SFE_UNIMPLEMENTED ;
  142. } ;
  143. } ;
  144. if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
  145. { switch (psf->bytewidth)
  146. { case 1 :
  147. psf->write_short = dpcm_write_s2dsc ;
  148. psf->write_int = dpcm_write_i2dsc ;
  149. psf->write_float = dpcm_write_f2dsc ;
  150. psf->write_double = dpcm_write_d2dsc ;
  151. break ;
  152. case 2 :
  153. psf->write_short = dpcm_write_s2dles ;
  154. psf->write_int = dpcm_write_i2dles ;
  155. psf->write_float = dpcm_write_f2dles ;
  156. psf->write_double = dpcm_write_d2dles ;
  157. break ;
  158. default :
  159. psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTEDn") ;
  160. return SFE_UNIMPLEMENTED ;
  161. } ;
  162. } ;
  163. psf->filelength = psf_get_filelen (psf) ;
  164. psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset :
  165. psf->filelength - psf->dataoffset ;
  166. psf->sf.frames = psf->datalength / psf->blockwidth ;
  167. return 0 ;
  168. } /* dpcm_init */
  169. /*==============================================================================
  170. */
  171. static sf_count_t
  172. dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
  173. { XI_PRIVATE *pxi ;
  174. int total, bufferlen, len ;
  175. if ((pxi = psf->codec_data) == NULL)
  176. return SFE_INTERNAL ;
  177. if (psf->datalength < 0 || psf->dataoffset < 0)
  178. { psf->error = SFE_BAD_SEEK ;
  179. return PSF_SEEK_ERROR ;
  180. } ;
  181. if (offset == 0)
  182. { psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
  183. pxi->last_16 = 0 ;
  184. return 0 ;
  185. } ;
  186. if (offset < 0 || offset > psf->sf.frames)
  187. { psf->error = SFE_BAD_SEEK ;
  188. return PSF_SEEK_ERROR ;
  189. } ;
  190. if (mode != SFM_READ)
  191. { /* What to do about write??? */
  192. psf->error = SFE_BAD_SEEK ;
  193. return PSF_SEEK_ERROR ;
  194. } ;
  195. psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
  196. if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DPCM_16)
  197. { total = offset ;
  198. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  199. while (total > 0)
  200. { len = (total > bufferlen) ? bufferlen : total ;
  201. total -= dpcm_read_dles2s (psf, psf->u.sbuf, len) ;
  202. } ;
  203. }
  204. else
  205. { total = offset ;
  206. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  207. while (total > 0)
  208. { len = (total > bufferlen) ? bufferlen : total ;
  209. total -= dpcm_read_dsc2s (psf, psf->u.sbuf, len) ;
  210. } ;
  211. } ;
  212. return offset ;
  213. } /* dpcm_seek */
  214. static int
  215. xi_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
  216. { XI_PRIVATE *pxi ;
  217. sf_count_t current ;
  218. const char *string ;
  219. if ((pxi = psf->codec_data) == NULL)
  220. return SFE_INTERNAL ;
  221. current = psf_ftell (psf) ;
  222. /* Reset the current header length to zero. */
  223. psf->header [0] = 0 ;
  224. psf->headindex = 0 ;
  225. psf_fseek (psf, 0, SEEK_SET) ;
  226. string = "Extended Instrument: " ;
  227. psf_binheader_writef (psf, "b", string, strlen (string)) ;
  228. psf_binheader_writef (psf, "b1", pxi->filename, sizeof (pxi->filename), 0x1A) ;
  229. /* Write software version and two byte XI version. */
  230. psf_binheader_writef (psf, "eb2", pxi->software, sizeof (pxi->software), (1 << 8) + 2) ;
  231. /*
  232. ** Jump note numbers (96), volume envelope (48), pan envelope (48),
  233. ** volume points (1), pan points (1)
  234. */
  235. psf_binheader_writef (psf, "z", (size_t) (96 + 48 + 48 + 1 + 1)) ;
  236. /* Jump volume loop (3 bytes), pan loop (3), envelope flags (3), vibrato (3)
  237. ** fade out (2), 22 unknown bytes, and then write sample_count (2 bytes).
  238. */
  239. psf_binheader_writef (psf, "ez2z2", (size_t) (4 * 3), 0x1234, make_size_t (22), 1) ;
  240. pxi->loop_begin = 0 ;
  241. pxi->loop_end = 0 ;
  242. psf_binheader_writef (psf, "et844", psf->sf.frames, pxi->loop_begin, pxi->loop_end) ;
  243. /* volume, fine tune, flags, pan, note, namelen */
  244. psf_binheader_writef (psf, "111111", 128, 0, pxi->sample_flags, 128, 0, strlen (pxi->sample_name)) ;
  245. psf_binheader_writef (psf, "b", pxi->sample_name, sizeof (pxi->sample_name)) ;
  246. /* Header construction complete so write it out. */
  247. psf_fwrite (psf->header, psf->headindex, 1, psf) ;
  248. if (psf->error)
  249. return psf->error ;
  250. psf->dataoffset = psf->headindex ;
  251. if (current > 0)
  252. psf_fseek (psf, current, SEEK_SET) ;
  253. return psf->error ;
  254. } /* xi_write_header */
  255. static int
  256. xi_read_header (SF_PRIVATE *psf)
  257. { char buffer [64], name [32] ;
  258. short version, fade_out, sample_count ;
  259. int k, loop_begin, loop_end ;
  260. int  sample_sizes [MAX_XI_SAMPLES] ;
  261. psf_binheader_readf (psf, "pb", 0, buffer, 21) ;
  262. memset (sample_sizes, 0, sizeof (sample_sizes)) ;
  263. buffer [20] = 0 ;
  264. if (strcmp (buffer, "Extended Instrument:") != 0)
  265. return SFE_XI_BAD_HEADER ;
  266. memset (buffer, 0, sizeof (buffer)) ;
  267. psf_binheader_readf (psf, "b", buffer, 23) ;
  268. if (buffer [22] != 0x1A)
  269. return SFE_XI_BAD_HEADER ;
  270. buffer [22] = 0 ;
  271. psf_log_printf (psf, "Extended Instrument : %sn", buffer) ;
  272. psf_binheader_readf (psf, "be2", buffer, 20, &version) ;
  273. buffer [19] = 0 ;
  274. psf_log_printf (psf, "Software : %snVersion  : %d.%02dn", buffer, version / 256, version % 256) ;
  275. /* Jump note numbers (96), volume envelope (48), pan envelope (48),
  276. ** volume points (1), pan points (1)
  277. */
  278. psf_binheader_readf (psf, "j", 96 + 48 + 48 + 1 + 1) ;
  279. psf_binheader_readf (psf, "b", buffer, 12) ;
  280. psf_log_printf (psf, "Volume Loopn  sustain : %un  begin   : %un  end     : %un",
  281. buffer [0], buffer [1], buffer [2]) ;
  282. psf_log_printf (psf, "Pan Loopn  sustain : %un  begin   : %un  end     : %un",
  283. buffer [3], buffer [4], buffer [5]) ;
  284. psf_log_printf (psf, "Envelope Flagsn  volume  : 0x%Xn  pan     : 0x%Xn",
  285. buffer [6] & 0xFF, buffer [7] & 0xFF) ;
  286. psf_log_printf (psf, "Vibraton  type    : %un  sweep   : %un  depth   : %un  rate    : %un",
  287. buffer [8], buffer [9], buffer [10], buffer [11]) ;
  288. /*
  289. ** Read fade_out then jump reserved (2 bytes) and ???? (20 bytes) and
  290. ** sample_count.
  291. */
  292. psf_binheader_readf (psf, "e2j2", &fade_out, 2 + 20, &sample_count) ;
  293. psf_log_printf (psf, "Fade out  : %dn", fade_out) ;
  294. /* XI file can contain up to 16 samples. */
  295. if (sample_count > MAX_XI_SAMPLES)
  296. return SFE_XI_EXCESS_SAMPLES ;
  297. if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
  298. return SFE_MALLOC_FAILED ;
  299. /* Log all data for each sample. */
  300. for (k = 0 ; k < sample_count ; k++)
  301. { psf_binheader_readf (psf, "e444", &(sample_sizes [k]), &loop_begin, &loop_end) ;
  302. /* Read 5 know bytes, 1 unknown byte and 22 name bytes. */
  303. psf_binheader_readf (psf, "bb", buffer, 6, name, 22) ;
  304. name [21] = 0 ;
  305. psf_log_printf (psf, "Sample #%dn  name    : %sn", k + 1, name) ;
  306. psf_log_printf (psf, "  size    : %dn", sample_sizes [k]) ;
  307. psf_log_printf (psf, "  loopn    begin : %dn    end   : %dn", loop_begin, loop_end) ;
  308. psf_log_printf (psf, "  volume  : %un  f. tune : %dn  flags   : 0x%02X ",
  309. buffer [0] & 0xFF, buffer [1] & 0xFF, buffer [2] & 0xFF) ;
  310. psf_log_printf (psf, " (") ;
  311. if (buffer [2] & 1)
  312. psf_log_printf (psf, " Loop") ;
  313. if (buffer [2] & 2)
  314. psf_log_printf (psf, " PingPong") ;
  315. psf_log_printf (psf, (buffer [2] & 16) ? " 16bit" : " 8bit") ;
  316. psf_log_printf (psf, " )n") ;
  317. psf_log_printf (psf, "  pan     : %un  note    : %dn  namelen : %dn",
  318. buffer [3] & 0xFF, buffer [4], buffer [5]) ;
  319. if (k != 0)
  320. continue ;
  321. if (buffer [2] & 16)
  322. { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_16 ;
  323. psf->bytewidth = 2 ;
  324. }
  325. else
  326. { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_8 ;
  327. psf->bytewidth = 1 ;
  328. } ;
  329. } ;
  330. while (sample_count > 1 && sample_sizes [sample_count - 1] == 0)
  331. sample_count -- ;
  332. /* Currently, we can only handle 1 sample per file. */
  333. if (sample_count > 2)
  334. { psf_log_printf (psf, "*** Sample count is less than 16 but more than 1.n") ;
  335. psf_log_printf (psf, "  sample count : %d    sample_sizes [%d] : %dn",
  336. sample_count, sample_count - 1, sample_sizes [sample_count - 1]) ;
  337. return SFE_XI_EXCESS_SAMPLES ;
  338. } ;
  339. psf->datalength = sample_sizes [0] ;
  340. psf->dataoffset = psf_ftell (psf) ;
  341. if (psf->dataoffset < 0)
  342. { psf_log_printf (psf, "*** Bad Data Offset : %Dn", psf->dataoffset) ;
  343. return SFE_BAD_OFFSET ;
  344. } ;
  345. psf_log_printf (psf, "Data Offset : %Dn", psf->dataoffset) ;
  346. if (psf->dataoffset + psf->datalength > psf->filelength)
  347. { psf_log_printf (psf, "*** File seems to be truncated. Should be at least %D bytes long.n",
  348. psf->dataoffset + sample_sizes [0]) ;
  349. psf->datalength = psf->filelength - psf->dataoffset ;
  350. } ;
  351. if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset)
  352. return SFE_BAD_SEEK ;
  353. psf->endian = SF_ENDIAN_LITTLE ;
  354. psf->sf.channels = 1 ; /* Always mono */
  355. psf->sf.samplerate = 44100 ; /* Always */
  356. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  357. if (! psf->sf.frames && psf->blockwidth)
  358. psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
  359. psf->instrument->basenote = 0 ;
  360. psf->instrument->gain = 1 ;
  361. psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ;
  362. psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ;
  363. return 0 ;
  364. } /* xi_read_header */
  365. /*==============================================================================
  366. */
  367. static void dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest) ;
  368. static void dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest) ;
  369. static void dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact) ;
  370. static void dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact) ;
  371. static void dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest) ;
  372. static void dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest) ;
  373. static void dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact) ;
  374. static void dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact) ;
  375. static sf_count_t
  376. dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
  377. { XI_PRIVATE *pxi ;
  378. int bufferlen, readcount ;
  379. sf_count_t total = 0 ;
  380. if ((pxi = psf->codec_data) == NULL)
  381. return 0 ;
  382. bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
  383. while (len > 0)
  384. { if (len < bufferlen)
  385. bufferlen = (int) len ;
  386. readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
  387. dsc2s_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
  388. total += readcount ;
  389. if (readcount < bufferlen)
  390. break ;
  391. len -= readcount ;
  392. } ;
  393. return total ;
  394. } /* dpcm_read_dsc2s */
  395. static sf_count_t
  396. dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
  397. { XI_PRIVATE *pxi ;
  398. int bufferlen, readcount ;
  399. sf_count_t total = 0 ;
  400. if ((pxi = psf->codec_data) == NULL)
  401. return 0 ;
  402. bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
  403. while (len > 0)
  404. { if (len < bufferlen)
  405. bufferlen = (int) len ;
  406. readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
  407. dsc2i_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
  408. total += readcount ;
  409. if (readcount < bufferlen)
  410. break ;
  411. len -= readcount ;
  412. } ;
  413. return total ;
  414. } /* dpcm_read_dsc2i */
  415. static sf_count_t
  416. dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
  417. { XI_PRIVATE *pxi ;
  418. int bufferlen, readcount ;
  419. sf_count_t total = 0 ;
  420. float normfact ;
  421. if ((pxi = psf->codec_data) == NULL)
  422. return 0 ;
  423. normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
  424. bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
  425. while (len > 0)
  426. { if (len < bufferlen)
  427. bufferlen = (int) len ;
  428. readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
  429. dsc2f_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
  430. total += readcount ;
  431. if (readcount < bufferlen)
  432. break ;
  433. len -= readcount ;
  434. } ;
  435. return total ;
  436. } /* dpcm_read_dsc2f */
  437. static sf_count_t
  438. dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
  439. { XI_PRIVATE *pxi ;
  440. int bufferlen, readcount ;
  441. sf_count_t total = 0 ;
  442. double normfact ;
  443. if ((pxi = psf->codec_data) == NULL)
  444. return 0 ;
  445. normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
  446. bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
  447. while (len > 0)
  448. { if (len < bufferlen)
  449. bufferlen = (int) len ;
  450. readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
  451. dsc2d_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
  452. total += readcount ;
  453. if (readcount < bufferlen)
  454. break ;
  455. len -= readcount ;
  456. } ;
  457. return total ;
  458. } /* dpcm_read_dsc2d */
  459. /*------------------------------------------------------------------------------
  460. */
  461. static sf_count_t
  462. dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
  463. { XI_PRIVATE *pxi ;
  464. int bufferlen, readcount ;
  465. sf_count_t total = 0 ;
  466. if ((pxi = psf->codec_data) == NULL)
  467. return 0 ;
  468. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  469. while (len > 0)
  470. { if (len < bufferlen)
  471. bufferlen = (int) len ;
  472. readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
  473. dles2s_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
  474. total += readcount ;
  475. if (readcount < bufferlen)
  476. break ;
  477. len -= readcount ;
  478. } ;
  479. return total ;
  480. } /* dpcm_read_dles2s */
  481. static sf_count_t
  482. dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
  483. { XI_PRIVATE *pxi ;
  484. int bufferlen, readcount ;
  485. sf_count_t total = 0 ;
  486. if ((pxi = psf->codec_data) == NULL)
  487. return 0 ;
  488. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  489. while (len > 0)
  490. { if (len < bufferlen)
  491. bufferlen = (int) len ;
  492. readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
  493. dles2i_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
  494. total += readcount ;
  495. if (readcount < bufferlen)
  496. break ;
  497. len -= readcount ;
  498. } ;
  499. return total ;
  500. } /* dpcm_read_dles2i */
  501. static sf_count_t
  502. dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
  503. { XI_PRIVATE *pxi ;
  504. int bufferlen, readcount ;
  505. sf_count_t total = 0 ;
  506. float normfact ;
  507. if ((pxi = psf->codec_data) == NULL)
  508. return 0 ;
  509. normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
  510. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  511. while (len > 0)
  512. { if (len < bufferlen)
  513. bufferlen = (int) len ;
  514. readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
  515. dles2f_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
  516. total += readcount ;
  517. if (readcount < bufferlen)
  518. break ;
  519. len -= readcount ;
  520. } ;
  521. return total ;
  522. } /* dpcm_read_dles2f */
  523. static sf_count_t
  524. dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
  525. { XI_PRIVATE *pxi ;
  526. int bufferlen, readcount ;
  527. sf_count_t total = 0 ;
  528. double normfact ;
  529. if ((pxi = psf->codec_data) == NULL)
  530. return 0 ;
  531. normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
  532. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  533. while (len > 0)
  534. { if (len < bufferlen)
  535. bufferlen = (int) len ;
  536. readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
  537. dles2d_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
  538. total += readcount ;
  539. if (readcount < bufferlen)
  540. break ;
  541. len -= readcount ;
  542. } ;
  543. return total ;
  544. } /* dpcm_read_dles2d */
  545. /*==============================================================================
  546. */
  547. static void s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count) ;
  548. static void i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count) ;
  549. static void f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact) ;
  550. static void d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact) ;
  551. static void s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count) ;
  552. static void i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count) ;
  553. static void f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact) ;
  554. static void d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact) ;
  555. static sf_count_t
  556. dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
  557. { XI_PRIVATE *pxi ;
  558. int bufferlen, writecount ;
  559. sf_count_t total = 0 ;
  560. if ((pxi = psf->codec_data) == NULL)
  561. return 0 ;
  562. bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
  563. while (len > 0)
  564. { if (len < bufferlen)
  565. bufferlen = (int) len ;
  566. s2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
  567. writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
  568. total += writecount ;
  569. if (writecount < bufferlen)
  570. break ;
  571. len -= writecount ;
  572. } ;
  573. return total ;
  574. } /* dpcm_write_s2dsc */
  575. static sf_count_t
  576. dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
  577. { XI_PRIVATE *pxi ;
  578. int bufferlen, writecount ;
  579. sf_count_t total = 0 ;
  580. if ((pxi = psf->codec_data) == NULL)
  581. return 0 ;
  582. bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
  583. while (len > 0)
  584. { if (len < bufferlen)
  585. bufferlen = (int) len ;
  586. i2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
  587. writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
  588. total += writecount ;
  589. if (writecount < bufferlen)
  590. break ;
  591. len -= writecount ;
  592. } ;
  593. return total ;
  594. } /* dpcm_write_i2dsc */
  595. static sf_count_t
  596. dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
  597. { XI_PRIVATE *pxi ;
  598. int bufferlen, writecount ;
  599. sf_count_t total = 0 ;
  600. float normfact ;
  601. if ((pxi = psf->codec_data) == NULL)
  602. return 0 ;
  603. normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
  604. bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
  605. while (len > 0)
  606. { if (len < bufferlen)
  607. bufferlen = (int) len ;
  608. f2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
  609. writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
  610. total += writecount ;
  611. if (writecount < bufferlen)
  612. break ;
  613. len -= writecount ;
  614. } ;
  615. return total ;
  616. } /* dpcm_write_f2dsc */
  617. static sf_count_t
  618. dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
  619. { XI_PRIVATE *pxi ;
  620. int bufferlen, writecount ;
  621. sf_count_t total = 0 ;
  622. double normfact ;
  623. if ((pxi = psf->codec_data) == NULL)
  624. return 0 ;
  625. normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
  626. bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
  627. while (len > 0)
  628. { if (len < bufferlen)
  629. bufferlen = (int) len ;
  630. d2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
  631. writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
  632. total += writecount ;
  633. if (writecount < bufferlen)
  634. break ;
  635. len -= writecount ;
  636. } ;
  637. return total ;
  638. } /* dpcm_write_d2dsc */
  639. static sf_count_t
  640. dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
  641. { XI_PRIVATE *pxi ;
  642. int bufferlen, writecount ;
  643. sf_count_t total = 0 ;
  644. if ((pxi = psf->codec_data) == NULL)
  645. return 0 ;
  646. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  647. while (len > 0)
  648. { if (len < bufferlen)
  649. bufferlen = (int) len ;
  650. s2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
  651. writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
  652. total += writecount ;
  653. if (writecount < bufferlen)
  654. break ;
  655. len -= writecount ;
  656. } ;
  657. return total ;
  658. } /* dpcm_write_s2dles */
  659. static sf_count_t
  660. dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
  661. { XI_PRIVATE *pxi ;
  662. int bufferlen, writecount ;
  663. sf_count_t total = 0 ;
  664. if ((pxi = psf->codec_data) == NULL)
  665. return 0 ;
  666. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  667. while (len > 0)
  668. { if (len < bufferlen)
  669. bufferlen = (int) len ;
  670. i2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
  671. writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
  672. total += writecount ;
  673. if (writecount < bufferlen)
  674. break ;
  675. len -= writecount ;
  676. } ;
  677. return total ;
  678. } /* dpcm_write_i2dles */
  679. static sf_count_t
  680. dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
  681. { XI_PRIVATE *pxi ;
  682. int bufferlen, writecount ;
  683. sf_count_t total = 0 ;
  684. float normfact ;
  685. if ((pxi = psf->codec_data) == NULL)
  686. return 0 ;
  687. normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
  688. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  689. while (len > 0)
  690. { if (len < bufferlen)
  691. bufferlen = (int) len ;
  692. f2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
  693. writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
  694. total += writecount ;
  695. if (writecount < bufferlen)
  696. break ;
  697. len -= writecount ;
  698. } ;
  699. return total ;
  700. } /* dpcm_write_f2dles */
  701. static sf_count_t
  702. dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
  703. { XI_PRIVATE *pxi ;
  704. int bufferlen, writecount ;
  705. sf_count_t total = 0 ;
  706. double normfact ;
  707. if ((pxi = psf->codec_data) == NULL)
  708. return 0 ;
  709. normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
  710. bufferlen = ARRAY_LEN (psf->u.sbuf) ;
  711. while (len > 0)
  712. { if (len < bufferlen)
  713. bufferlen = (int) len ;
  714. d2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
  715. writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
  716. total += writecount ;
  717. if (writecount < bufferlen)
  718. break ;
  719. len -= writecount ;
  720. } ;
  721. return total ;
  722. } /* dpcm_write_d2dles */
  723. /*==============================================================================
  724. */
  725. static void
  726. dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest)
  727. { signed char last_val ;
  728. int k ;
  729. last_val = pxi->last_16 >> 8 ;
  730. for (k = 0 ; k < count ; k++)
  731. { last_val += src [k] ;
  732. dest [k] = last_val << 8 ;
  733. } ;
  734. pxi->last_16 = last_val << 8 ;
  735. } /* dsc2s_array */
  736. static void
  737. dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest)
  738. { signed char last_val ;
  739. int k ;
  740. last_val = pxi->last_16 >> 8 ;
  741. for (k = 0 ; k < count ; k++)
  742. { last_val += src [k] ;
  743. dest [k] = last_val << 24 ;
  744. } ;
  745. pxi->last_16 = last_val << 8 ;
  746. } /* dsc2i_array */
  747. static void
  748. dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact)
  749. { signed char last_val ;
  750. int k ;
  751. last_val = pxi->last_16 >> 8 ;
  752. for (k = 0 ; k < count ; k++)
  753. { last_val += src [k] ;
  754. dest [k] = last_val * normfact ;
  755. } ;
  756. pxi->last_16 = last_val << 8 ;
  757. } /* dsc2f_array */
  758. static void
  759. dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact)
  760. { signed char last_val ;
  761. int k ;
  762. last_val = pxi->last_16 >> 8 ;
  763. for (k = 0 ; k < count ; k++)
  764. { last_val += src [k] ;
  765. dest [k] = last_val * normfact ;
  766. } ;
  767. pxi->last_16 = last_val << 8 ;
  768. } /* dsc2d_array */
  769. /*------------------------------------------------------------------------------
  770. */
  771. static void
  772. s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count)
  773. { signed char last_val, current ;
  774. int k ;
  775. last_val = pxi->last_16 >> 8 ;
  776. for (k = 0 ; k < count ; k++)
  777. { current = src [k] >> 8 ;
  778. dest [k] = current - last_val ;
  779. last_val = current ;
  780. } ;
  781. pxi->last_16 = last_val << 8 ;
  782. } /* s2dsc_array */
  783. static void
  784. i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count)
  785. { signed char last_val, current ;
  786. int k ;
  787. last_val = pxi->last_16 >> 8 ;
  788. for (k = 0 ; k < count ; k++)
  789. { current = src [k] >> 24 ;
  790. dest [k] = current - last_val ;
  791. last_val = current ;
  792. } ;
  793. pxi->last_16 = last_val << 8 ;
  794. } /* i2dsc_array */
  795. static void
  796. f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact)
  797. { signed char last_val, current ;
  798. int k ;
  799. last_val = pxi->last_16 >> 8 ;
  800. for (k = 0 ; k < count ; k++)
  801. { current = lrintf (src [k] * normfact) ;
  802. dest [k] = current - last_val ;
  803. last_val = current ;
  804. } ;
  805. pxi->last_16 = last_val << 8 ;
  806. } /* f2dsc_array */
  807. static void
  808. d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact)
  809. { signed char last_val, current ;
  810. int k ;
  811. last_val = pxi->last_16 >> 8 ;
  812. for (k = 0 ; k < count ; k++)
  813. { current = lrint (src [k] * normfact) ;
  814. dest [k] = current - last_val ;
  815. last_val = current ;
  816. } ;
  817. pxi->last_16 = last_val << 8 ;
  818. } /* d2dsc_array */
  819. /*==============================================================================
  820. */
  821. static void
  822. dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest)
  823. { short last_val ;
  824. int k ;
  825. last_val = pxi->last_16 ;
  826. for (k = 0 ; k < count ; k++)
  827. { last_val += LES2H_SHORT (src [k]) ;
  828. dest [k] = last_val ;
  829. } ;
  830. pxi->last_16 = last_val ;
  831. } /* dles2s_array */
  832. static void
  833. dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest)
  834. { short last_val ;
  835. int k ;
  836. last_val = pxi->last_16 ;
  837. for (k = 0 ; k < count ; k++)
  838. { last_val += LES2H_SHORT (src [k]) ;
  839. dest [k] = last_val << 16 ;
  840. } ;
  841. pxi->last_16 = last_val ;
  842. } /* dles2i_array */
  843. static void
  844. dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact)
  845. { short last_val ;
  846. int k ;
  847. last_val = pxi->last_16 ;
  848. for (k = 0 ; k < count ; k++)
  849. { last_val += LES2H_SHORT (src [k]) ;
  850. dest [k] = last_val * normfact ;
  851. } ;
  852. pxi->last_16 = last_val ;
  853. } /* dles2f_array */
  854. static void
  855. dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact)
  856. { short last_val ;
  857. int k ;
  858. last_val = pxi->last_16 ;
  859. for (k = 0 ; k < count ; k++)
  860. { last_val += LES2H_SHORT (src [k]) ;
  861. dest [k] = last_val * normfact ;
  862. } ;
  863. pxi->last_16 = last_val ;
  864. } /* dles2d_array */
  865. /*------------------------------------------------------------------------------
  866. */
  867. static void
  868. s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count)
  869. { short diff, last_val ;
  870. int k ;
  871. last_val = pxi->last_16 ;
  872. for (k = 0 ; k < count ; k++)
  873. { diff = src [k] - last_val ;
  874. dest [k] = LES2H_SHORT (diff) ;
  875. last_val = src [k] ;
  876. } ;
  877. pxi->last_16 = last_val ;
  878. } /* s2dles_array */
  879. static void
  880. i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count)
  881. { short diff, last_val ;
  882. int k ;
  883. last_val = pxi->last_16 ;
  884. for (k = 0 ; k < count ; k++)
  885. { diff = (src [k] >> 16) - last_val ;
  886. dest [k] = LES2H_SHORT (diff) ;
  887. last_val = src [k] >> 16 ;
  888. } ;
  889. pxi->last_16 = last_val ;
  890. } /* i2dles_array */
  891. static void
  892. f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact)
  893. { short diff, last_val, current ;
  894. int k ;
  895. last_val = pxi->last_16 ;
  896. for (k = 0 ; k < count ; k++)
  897. { current = lrintf (src [k] * normfact) ;
  898. diff = current - last_val ;
  899. dest [k] = LES2H_SHORT (diff) ;
  900. last_val = current ;
  901. } ;
  902. pxi->last_16 = last_val ;
  903. } /* f2dles_array */
  904. static void
  905. d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact)
  906. { short diff, last_val, current ;
  907. int k ;
  908. last_val = pxi->last_16 ;
  909. for (k = 0 ; k < count ; k++)
  910. { current = lrint (src [k] * normfact) ;
  911. diff = current - last_val ;
  912. dest [k] = LES2H_SHORT (diff) ;
  913. last_val = current ;
  914. } ;
  915. pxi->last_16 = last_val ;
  916. } /* d2dles_array */