Chris@0
|
1 /*
|
Chris@0
|
2 ** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
|
Chris@0
|
3 **
|
Chris@0
|
4 ** This program is free software; you can redistribute it and/or modify
|
Chris@0
|
5 ** it under the terms of the GNU Lesser General Public License as published by
|
Chris@0
|
6 ** the Free Software Foundation; either version 2.1 of the License, or
|
Chris@0
|
7 ** (at your option) any later version.
|
Chris@0
|
8 **
|
Chris@0
|
9 ** This program is distributed in the hope that it will be useful,
|
Chris@0
|
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
12 ** GNU Lesser General Public License for more details.
|
Chris@0
|
13 **
|
Chris@0
|
14 ** You should have received a copy of the GNU Lesser General Public License
|
Chris@0
|
15 ** along with this program; if not, write to the Free Software
|
Chris@0
|
16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
Chris@0
|
17 */
|
Chris@0
|
18
|
Chris@0
|
19 #include "sfconfig.h"
|
Chris@0
|
20
|
Chris@0
|
21 #include <stdio.h>
|
Chris@0
|
22 #include <stdlib.h>
|
Chris@0
|
23 #include <fcntl.h>
|
Chris@0
|
24 #include <string.h>
|
Chris@0
|
25 #include <ctype.h>
|
Chris@0
|
26 #include <math.h>
|
Chris@0
|
27
|
Chris@0
|
28 #include "sndfile.h"
|
Chris@0
|
29 #include "sfendian.h"
|
Chris@0
|
30 #include "common.h"
|
Chris@0
|
31
|
Chris@0
|
32 #define MAX_XI_SAMPLES 16
|
Chris@0
|
33
|
Chris@0
|
34 /*------------------------------------------------------------------------------
|
Chris@0
|
35 ** Private static functions and tyepdefs.
|
Chris@0
|
36 */
|
Chris@0
|
37
|
Chris@0
|
38 typedef struct
|
Chris@0
|
39 { /* Warning, this filename is NOT nul terminated. */
|
Chris@0
|
40 char filename [22] ;
|
Chris@0
|
41 char software [20] ;
|
Chris@0
|
42 char sample_name [22] ;
|
Chris@0
|
43
|
Chris@0
|
44 int loop_begin, loop_end ;
|
Chris@0
|
45 int sample_flags ;
|
Chris@0
|
46
|
Chris@0
|
47 /* Data for encoder and decoder. */
|
Chris@0
|
48 short last_16 ;
|
Chris@0
|
49 } XI_PRIVATE ;
|
Chris@0
|
50
|
Chris@0
|
51 static int xi_close (SF_PRIVATE *psf) ;
|
Chris@0
|
52 static int xi_write_header (SF_PRIVATE *psf, int calc_length) ;
|
Chris@0
|
53 static int xi_read_header (SF_PRIVATE *psf) ;
|
Chris@0
|
54 static int dpcm_init (SF_PRIVATE *psf) ;
|
Chris@0
|
55
|
Chris@0
|
56
|
Chris@0
|
57 static sf_count_t dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
|
Chris@0
|
58
|
Chris@0
|
59 /*------------------------------------------------------------------------------
|
Chris@0
|
60 ** Public function.
|
Chris@0
|
61 */
|
Chris@0
|
62
|
Chris@0
|
63 int
|
Chris@0
|
64 xi_open (SF_PRIVATE *psf)
|
Chris@0
|
65 { XI_PRIVATE *pxi ;
|
Chris@0
|
66 int subformat, error = 0 ;
|
Chris@0
|
67
|
Chris@0
|
68 if (psf->is_pipe)
|
Chris@0
|
69 return SFE_XI_NO_PIPE ;
|
Chris@0
|
70
|
Chris@0
|
71 if (psf->codec_data)
|
Chris@0
|
72 pxi = psf->codec_data ;
|
Chris@0
|
73 else if ((pxi = calloc (1, sizeof (XI_PRIVATE))) == NULL)
|
Chris@0
|
74 return SFE_MALLOC_FAILED ;
|
Chris@0
|
75
|
Chris@0
|
76 psf->codec_data = pxi ;
|
Chris@0
|
77
|
Chris@0
|
78 if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
|
Chris@0
|
79 { if ((error = xi_read_header (psf)))
|
Chris@0
|
80 return error ;
|
Chris@0
|
81 } ;
|
Chris@0
|
82
|
Chris@0
|
83 subformat = SF_CODEC (psf->sf.format) ;
|
Chris@0
|
84
|
Chris@0
|
85 if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
|
Chris@0
|
86 { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_XI)
|
Chris@0
|
87 return SFE_BAD_OPEN_FORMAT ;
|
Chris@0
|
88
|
Chris@0
|
89 psf->endian = SF_ENDIAN_LITTLE ;
|
Chris@0
|
90 psf->sf.channels = 1 ; /* Always mono */
|
Chris@0
|
91 psf->sf.samplerate = 44100 ; /* Always */
|
Chris@0
|
92
|
Chris@0
|
93 /* Set up default instrument and software name. */
|
Chris@0
|
94 memcpy (pxi->filename, "Default Name ", sizeof (pxi->filename)) ;
|
Chris@0
|
95 memcpy (pxi->software, PACKAGE "-" VERSION " ", sizeof (pxi->software)) ;
|
Chris@0
|
96
|
Chris@0
|
97 memset (pxi->sample_name, 0, sizeof (pxi->sample_name)) ;
|
Chris@0
|
98 snprintf (pxi->sample_name, sizeof (pxi->sample_name), "%s", "Sample #1") ;
|
Chris@0
|
99
|
Chris@0
|
100 pxi->sample_flags = (subformat == SF_FORMAT_DPCM_16) ? 16 : 0 ;
|
Chris@0
|
101
|
Chris@0
|
102 if (xi_write_header (psf, SF_FALSE))
|
Chris@0
|
103 return psf->error ;
|
Chris@0
|
104
|
Chris@0
|
105 psf->write_header = xi_write_header ;
|
Chris@0
|
106 } ;
|
Chris@0
|
107
|
Chris@0
|
108 psf->container_close = xi_close ;
|
Chris@0
|
109 psf->seek = dpcm_seek ;
|
Chris@0
|
110
|
Chris@0
|
111 psf->sf.seekable = SF_FALSE ;
|
Chris@0
|
112
|
Chris@0
|
113 psf->blockwidth = psf->bytewidth * psf->sf.channels ;
|
Chris@0
|
114
|
Chris@0
|
115 switch (subformat)
|
Chris@0
|
116 { case SF_FORMAT_DPCM_8 : /* 8-bit differential PCM. */
|
Chris@0
|
117 case SF_FORMAT_DPCM_16 : /* 16-bit differential PCM. */
|
Chris@0
|
118 error = dpcm_init (psf) ;
|
Chris@0
|
119 break ;
|
Chris@0
|
120
|
Chris@0
|
121 default : break ;
|
Chris@0
|
122 } ;
|
Chris@0
|
123
|
Chris@0
|
124 return error ;
|
Chris@0
|
125 } /* xi_open */
|
Chris@0
|
126
|
Chris@0
|
127 /*------------------------------------------------------------------------------
|
Chris@0
|
128 */
|
Chris@0
|
129
|
Chris@0
|
130 static int
|
Chris@0
|
131 xi_close (SF_PRIVATE * UNUSED (psf))
|
Chris@0
|
132 {
|
Chris@0
|
133 return 0 ;
|
Chris@0
|
134 } /* xi_close */
|
Chris@0
|
135
|
Chris@0
|
136 /*==============================================================================
|
Chris@0
|
137 */
|
Chris@0
|
138
|
Chris@0
|
139 static sf_count_t dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
Chris@0
|
140 static sf_count_t dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
Chris@0
|
141 static sf_count_t dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
Chris@0
|
142 static sf_count_t dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
Chris@0
|
143
|
Chris@0
|
144 static sf_count_t dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
Chris@0
|
145 static sf_count_t dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
Chris@0
|
146 static sf_count_t dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
Chris@0
|
147 static sf_count_t dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
Chris@0
|
148
|
Chris@0
|
149 static sf_count_t dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
Chris@0
|
150 static sf_count_t dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
Chris@0
|
151 static sf_count_t dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
Chris@0
|
152 static sf_count_t dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
Chris@0
|
153
|
Chris@0
|
154 static sf_count_t dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
Chris@0
|
155 static sf_count_t dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
Chris@0
|
156 static sf_count_t dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
Chris@0
|
157 static sf_count_t dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
Chris@0
|
158
|
Chris@0
|
159 static int
|
Chris@0
|
160 dpcm_init (SF_PRIVATE *psf)
|
Chris@0
|
161 { if (psf->bytewidth == 0 || psf->sf.channels == 0)
|
Chris@0
|
162 return SFE_INTERNAL ;
|
Chris@0
|
163
|
Chris@0
|
164 psf->blockwidth = psf->bytewidth * psf->sf.channels ;
|
Chris@0
|
165
|
Chris@0
|
166 if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
|
Chris@0
|
167 { switch (psf->bytewidth)
|
Chris@0
|
168 { case 1 :
|
Chris@0
|
169 psf->read_short = dpcm_read_dsc2s ;
|
Chris@0
|
170 psf->read_int = dpcm_read_dsc2i ;
|
Chris@0
|
171 psf->read_float = dpcm_read_dsc2f ;
|
Chris@0
|
172 psf->read_double = dpcm_read_dsc2d ;
|
Chris@0
|
173 break ;
|
Chris@0
|
174 case 2 :
|
Chris@0
|
175 psf->read_short = dpcm_read_dles2s ;
|
Chris@0
|
176 psf->read_int = dpcm_read_dles2i ;
|
Chris@0
|
177 psf->read_float = dpcm_read_dles2f ;
|
Chris@0
|
178 psf->read_double = dpcm_read_dles2d ;
|
Chris@0
|
179 break ;
|
Chris@0
|
180 default :
|
Chris@0
|
181 psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ;
|
Chris@0
|
182 return SFE_UNIMPLEMENTED ;
|
Chris@0
|
183 } ;
|
Chris@0
|
184 } ;
|
Chris@0
|
185
|
Chris@0
|
186 if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
|
Chris@0
|
187 { switch (psf->bytewidth)
|
Chris@0
|
188 { case 1 :
|
Chris@0
|
189 psf->write_short = dpcm_write_s2dsc ;
|
Chris@0
|
190 psf->write_int = dpcm_write_i2dsc ;
|
Chris@0
|
191 psf->write_float = dpcm_write_f2dsc ;
|
Chris@0
|
192 psf->write_double = dpcm_write_d2dsc ;
|
Chris@0
|
193 break ;
|
Chris@0
|
194 case 2 :
|
Chris@0
|
195 psf->write_short = dpcm_write_s2dles ;
|
Chris@0
|
196 psf->write_int = dpcm_write_i2dles ;
|
Chris@0
|
197 psf->write_float = dpcm_write_f2dles ;
|
Chris@0
|
198 psf->write_double = dpcm_write_d2dles ;
|
Chris@0
|
199 break ;
|
Chris@0
|
200 default :
|
Chris@0
|
201 psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ;
|
Chris@0
|
202 return SFE_UNIMPLEMENTED ;
|
Chris@0
|
203 } ;
|
Chris@0
|
204 } ;
|
Chris@0
|
205
|
Chris@0
|
206 psf->filelength = psf_get_filelen (psf) ;
|
Chris@0
|
207 psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset :
|
Chris@0
|
208 psf->filelength - psf->dataoffset ;
|
Chris@0
|
209 psf->sf.frames = psf->datalength / psf->blockwidth ;
|
Chris@0
|
210
|
Chris@0
|
211 return 0 ;
|
Chris@0
|
212 } /* dpcm_init */
|
Chris@0
|
213
|
Chris@0
|
214 /*==============================================================================
|
Chris@0
|
215 */
|
Chris@0
|
216
|
Chris@0
|
217 static sf_count_t
|
Chris@0
|
218 dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
|
Chris@0
|
219 { XI_PRIVATE *pxi ;
|
Chris@0
|
220 int total, bufferlen, len ;
|
Chris@0
|
221
|
Chris@0
|
222 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
223 return SFE_INTERNAL ;
|
Chris@0
|
224
|
Chris@0
|
225 if (psf->datalength < 0 || psf->dataoffset < 0)
|
Chris@0
|
226 { psf->error = SFE_BAD_SEEK ;
|
Chris@0
|
227 return PSF_SEEK_ERROR ;
|
Chris@0
|
228 } ;
|
Chris@0
|
229
|
Chris@0
|
230 if (offset == 0)
|
Chris@0
|
231 { psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
|
Chris@0
|
232 pxi->last_16 = 0 ;
|
Chris@0
|
233 return 0 ;
|
Chris@0
|
234 } ;
|
Chris@0
|
235
|
Chris@0
|
236 if (offset < 0 || offset > psf->sf.frames)
|
Chris@0
|
237 { psf->error = SFE_BAD_SEEK ;
|
Chris@0
|
238 return PSF_SEEK_ERROR ;
|
Chris@0
|
239 } ;
|
Chris@0
|
240
|
Chris@0
|
241 if (mode != SFM_READ)
|
Chris@0
|
242 { /* What to do about write??? */
|
Chris@0
|
243 psf->error = SFE_BAD_SEEK ;
|
Chris@0
|
244 return PSF_SEEK_ERROR ;
|
Chris@0
|
245 } ;
|
Chris@0
|
246
|
Chris@0
|
247 psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
|
Chris@0
|
248
|
Chris@0
|
249 if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DPCM_16)
|
Chris@0
|
250 { total = offset ;
|
Chris@0
|
251 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
252 while (total > 0)
|
Chris@0
|
253 { len = (total > bufferlen) ? bufferlen : total ;
|
Chris@0
|
254 total -= dpcm_read_dles2s (psf, psf->u.sbuf, len) ;
|
Chris@0
|
255 } ;
|
Chris@0
|
256 }
|
Chris@0
|
257 else
|
Chris@0
|
258 { total = offset ;
|
Chris@0
|
259 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
260 while (total > 0)
|
Chris@0
|
261 { len = (total > bufferlen) ? bufferlen : total ;
|
Chris@0
|
262 total -= dpcm_read_dsc2s (psf, psf->u.sbuf, len) ;
|
Chris@0
|
263 } ;
|
Chris@0
|
264 } ;
|
Chris@0
|
265
|
Chris@0
|
266 return offset ;
|
Chris@0
|
267 } /* dpcm_seek */
|
Chris@0
|
268
|
Chris@0
|
269
|
Chris@0
|
270 static int
|
Chris@0
|
271 xi_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
|
Chris@0
|
272 { XI_PRIVATE *pxi ;
|
Chris@0
|
273 sf_count_t current ;
|
Chris@0
|
274 const char *string ;
|
Chris@0
|
275
|
Chris@0
|
276 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
277 return SFE_INTERNAL ;
|
Chris@0
|
278
|
Chris@0
|
279 current = psf_ftell (psf) ;
|
Chris@0
|
280
|
Chris@0
|
281 /* Reset the current header length to zero. */
|
Chris@0
|
282 psf->header [0] = 0 ;
|
Chris@0
|
283 psf->headindex = 0 ;
|
Chris@0
|
284 psf_fseek (psf, 0, SEEK_SET) ;
|
Chris@0
|
285
|
Chris@0
|
286 string = "Extended Instrument: " ;
|
Chris@0
|
287 psf_binheader_writef (psf, "b", string, strlen (string)) ;
|
Chris@0
|
288 psf_binheader_writef (psf, "b1", pxi->filename, sizeof (pxi->filename), 0x1A) ;
|
Chris@0
|
289
|
Chris@0
|
290 /* Write software version and two byte XI version. */
|
Chris@0
|
291 psf_binheader_writef (psf, "eb2", pxi->software, sizeof (pxi->software), (1 << 8) + 2) ;
|
Chris@0
|
292
|
Chris@0
|
293 /*
|
Chris@0
|
294 ** Jump note numbers (96), volume envelope (48), pan envelope (48),
|
Chris@0
|
295 ** volume points (1), pan points (1)
|
Chris@0
|
296 */
|
Chris@0
|
297 psf_binheader_writef (psf, "z", (size_t) (96 + 48 + 48 + 1 + 1)) ;
|
Chris@0
|
298
|
Chris@0
|
299 /* Jump volume loop (3 bytes), pan loop (3), envelope flags (3), vibrato (3)
|
Chris@0
|
300 ** fade out (2), 22 unknown bytes, and then write sample_count (2 bytes).
|
Chris@0
|
301 */
|
Chris@0
|
302 psf_binheader_writef (psf, "ez2z2", (size_t) (4 * 3), 0x1234, make_size_t (22), 1) ;
|
Chris@0
|
303
|
Chris@0
|
304 pxi->loop_begin = 0 ;
|
Chris@0
|
305 pxi->loop_end = 0 ;
|
Chris@0
|
306
|
Chris@0
|
307 psf_binheader_writef (psf, "et844", psf->sf.frames, pxi->loop_begin, pxi->loop_end) ;
|
Chris@0
|
308
|
Chris@0
|
309 /* volume, fine tune, flags, pan, note, namelen */
|
Chris@0
|
310 psf_binheader_writef (psf, "111111", 128, 0, pxi->sample_flags, 128, 0, strlen (pxi->sample_name)) ;
|
Chris@0
|
311
|
Chris@0
|
312 psf_binheader_writef (psf, "b", pxi->sample_name, sizeof (pxi->sample_name)) ;
|
Chris@0
|
313
|
Chris@0
|
314
|
Chris@0
|
315
|
Chris@0
|
316
|
Chris@0
|
317
|
Chris@0
|
318 /* Header construction complete so write it out. */
|
Chris@0
|
319 psf_fwrite (psf->header, psf->headindex, 1, psf) ;
|
Chris@0
|
320
|
Chris@0
|
321 if (psf->error)
|
Chris@0
|
322 return psf->error ;
|
Chris@0
|
323
|
Chris@0
|
324 psf->dataoffset = psf->headindex ;
|
Chris@0
|
325
|
Chris@0
|
326 if (current > 0)
|
Chris@0
|
327 psf_fseek (psf, current, SEEK_SET) ;
|
Chris@0
|
328
|
Chris@0
|
329 return psf->error ;
|
Chris@0
|
330 } /* xi_write_header */
|
Chris@0
|
331
|
Chris@0
|
332 static int
|
Chris@0
|
333 xi_read_header (SF_PRIVATE *psf)
|
Chris@0
|
334 { char buffer [64], name [32] ;
|
Chris@0
|
335 short version, fade_out, sample_count ;
|
Chris@0
|
336 int k, loop_begin, loop_end ;
|
Chris@0
|
337 int sample_sizes [MAX_XI_SAMPLES] ;
|
Chris@0
|
338
|
Chris@0
|
339 psf_binheader_readf (psf, "pb", 0, buffer, 21) ;
|
Chris@0
|
340
|
Chris@0
|
341 memset (sample_sizes, 0, sizeof (sample_sizes)) ;
|
Chris@0
|
342
|
Chris@0
|
343 buffer [20] = 0 ;
|
Chris@0
|
344 if (strcmp (buffer, "Extended Instrument:") != 0)
|
Chris@0
|
345 return SFE_XI_BAD_HEADER ;
|
Chris@0
|
346
|
Chris@0
|
347 memset (buffer, 0, sizeof (buffer)) ;
|
Chris@0
|
348 psf_binheader_readf (psf, "b", buffer, 23) ;
|
Chris@0
|
349
|
Chris@0
|
350 if (buffer [22] != 0x1A)
|
Chris@0
|
351 return SFE_XI_BAD_HEADER ;
|
Chris@0
|
352
|
Chris@0
|
353 buffer [22] = 0 ;
|
Chris@0
|
354 psf_log_printf (psf, "Extended Instrument : %s\n", buffer) ;
|
Chris@0
|
355
|
Chris@0
|
356 psf_binheader_readf (psf, "be2", buffer, 20, &version) ;
|
Chris@0
|
357 buffer [19] = 0 ;
|
Chris@0
|
358 psf_log_printf (psf, "Software : %s\nVersion : %d.%02d\n", buffer, version / 256, version % 256) ;
|
Chris@0
|
359
|
Chris@0
|
360 /* Jump note numbers (96), volume envelope (48), pan envelope (48),
|
Chris@0
|
361 ** volume points (1), pan points (1)
|
Chris@0
|
362 */
|
Chris@0
|
363 psf_binheader_readf (psf, "j", 96 + 48 + 48 + 1 + 1) ;
|
Chris@0
|
364
|
Chris@0
|
365 psf_binheader_readf (psf, "b", buffer, 12) ;
|
Chris@0
|
366 psf_log_printf (psf, "Volume Loop\n sustain : %u\n begin : %u\n end : %u\n",
|
Chris@0
|
367 buffer [0], buffer [1], buffer [2]) ;
|
Chris@0
|
368 psf_log_printf (psf, "Pan Loop\n sustain : %u\n begin : %u\n end : %u\n",
|
Chris@0
|
369 buffer [3], buffer [4], buffer [5]) ;
|
Chris@0
|
370 psf_log_printf (psf, "Envelope Flags\n volume : 0x%X\n pan : 0x%X\n",
|
Chris@0
|
371 buffer [6] & 0xFF, buffer [7] & 0xFF) ;
|
Chris@0
|
372
|
Chris@0
|
373 psf_log_printf (psf, "Vibrato\n type : %u\n sweep : %u\n depth : %u\n rate : %u\n",
|
Chris@0
|
374 buffer [8], buffer [9], buffer [10], buffer [11]) ;
|
Chris@0
|
375
|
Chris@0
|
376 /*
|
Chris@0
|
377 ** Read fade_out then jump reserved (2 bytes) and ???? (20 bytes) and
|
Chris@0
|
378 ** sample_count.
|
Chris@0
|
379 */
|
Chris@0
|
380 psf_binheader_readf (psf, "e2j2", &fade_out, 2 + 20, &sample_count) ;
|
Chris@0
|
381 psf_log_printf (psf, "Fade out : %d\n", fade_out) ;
|
Chris@0
|
382
|
Chris@0
|
383 /* XI file can contain up to 16 samples. */
|
Chris@0
|
384 if (sample_count > MAX_XI_SAMPLES)
|
Chris@0
|
385 return SFE_XI_EXCESS_SAMPLES ;
|
Chris@0
|
386
|
Chris@0
|
387 if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
|
Chris@0
|
388 return SFE_MALLOC_FAILED ;
|
Chris@0
|
389
|
Chris@0
|
390 /* Log all data for each sample. */
|
Chris@0
|
391 for (k = 0 ; k < sample_count ; k++)
|
Chris@0
|
392 { psf_binheader_readf (psf, "e444", &(sample_sizes [k]), &loop_begin, &loop_end) ;
|
Chris@0
|
393
|
Chris@0
|
394 /* Read 5 know bytes, 1 unknown byte and 22 name bytes. */
|
Chris@0
|
395 psf_binheader_readf (psf, "bb", buffer, 6, name, 22) ;
|
Chris@0
|
396 name [21] = 0 ;
|
Chris@0
|
397
|
Chris@0
|
398 psf_log_printf (psf, "Sample #%d\n name : %s\n", k + 1, name) ;
|
Chris@0
|
399
|
Chris@0
|
400 psf_log_printf (psf, " size : %d\n", sample_sizes [k]) ;
|
Chris@0
|
401
|
Chris@0
|
402
|
Chris@0
|
403
|
Chris@0
|
404 psf_log_printf (psf, " loop\n begin : %d\n end : %d\n", loop_begin, loop_end) ;
|
Chris@0
|
405
|
Chris@0
|
406 psf_log_printf (psf, " volume : %u\n f. tune : %d\n flags : 0x%02X ",
|
Chris@0
|
407 buffer [0] & 0xFF, buffer [1] & 0xFF, buffer [2] & 0xFF) ;
|
Chris@0
|
408
|
Chris@0
|
409 psf_log_printf (psf, " (") ;
|
Chris@0
|
410 if (buffer [2] & 1)
|
Chris@0
|
411 psf_log_printf (psf, " Loop") ;
|
Chris@0
|
412 if (buffer [2] & 2)
|
Chris@0
|
413 psf_log_printf (psf, " PingPong") ;
|
Chris@0
|
414 psf_log_printf (psf, (buffer [2] & 16) ? " 16bit" : " 8bit") ;
|
Chris@0
|
415 psf_log_printf (psf, " )\n") ;
|
Chris@0
|
416
|
Chris@0
|
417 psf_log_printf (psf, " pan : %u\n note : %d\n namelen : %d\n",
|
Chris@0
|
418 buffer [3] & 0xFF, buffer [4], buffer [5]) ;
|
Chris@0
|
419
|
Chris@0
|
420 if (k != 0)
|
Chris@0
|
421 continue ;
|
Chris@0
|
422
|
Chris@0
|
423 if (buffer [2] & 16)
|
Chris@0
|
424 { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_16 ;
|
Chris@0
|
425 psf->bytewidth = 2 ;
|
Chris@0
|
426 }
|
Chris@0
|
427 else
|
Chris@0
|
428 { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_8 ;
|
Chris@0
|
429 psf->bytewidth = 1 ;
|
Chris@0
|
430 } ;
|
Chris@0
|
431 } ;
|
Chris@0
|
432
|
Chris@0
|
433 while (sample_count > 1 && sample_sizes [sample_count - 1] == 0)
|
Chris@0
|
434 sample_count -- ;
|
Chris@0
|
435
|
Chris@0
|
436 /* Currently, we can only handle 1 sample per file. */
|
Chris@0
|
437
|
Chris@0
|
438 if (sample_count > 2)
|
Chris@0
|
439 { psf_log_printf (psf, "*** Sample count is less than 16 but more than 1.\n") ;
|
Chris@0
|
440 psf_log_printf (psf, " sample count : %d sample_sizes [%d] : %d\n",
|
Chris@0
|
441 sample_count, sample_count - 1, sample_sizes [sample_count - 1]) ;
|
Chris@0
|
442 return SFE_XI_EXCESS_SAMPLES ;
|
Chris@0
|
443 } ;
|
Chris@0
|
444
|
Chris@0
|
445 psf->datalength = sample_sizes [0] ;
|
Chris@0
|
446
|
Chris@0
|
447 psf->dataoffset = psf_ftell (psf) ;
|
Chris@0
|
448 if (psf->dataoffset < 0)
|
Chris@0
|
449 { psf_log_printf (psf, "*** Bad Data Offset : %D\n", psf->dataoffset) ;
|
Chris@0
|
450 return SFE_BAD_OFFSET ;
|
Chris@0
|
451 } ;
|
Chris@0
|
452 psf_log_printf (psf, "Data Offset : %D\n", psf->dataoffset) ;
|
Chris@0
|
453
|
Chris@0
|
454 if (psf->dataoffset + psf->datalength > psf->filelength)
|
Chris@0
|
455 { psf_log_printf (psf, "*** File seems to be truncated. Should be at least %D bytes long.\n",
|
Chris@0
|
456 psf->dataoffset + sample_sizes [0]) ;
|
Chris@0
|
457 psf->datalength = psf->filelength - psf->dataoffset ;
|
Chris@0
|
458 } ;
|
Chris@0
|
459
|
Chris@0
|
460 if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset)
|
Chris@0
|
461 return SFE_BAD_SEEK ;
|
Chris@0
|
462
|
Chris@0
|
463 psf->endian = SF_ENDIAN_LITTLE ;
|
Chris@0
|
464 psf->sf.channels = 1 ; /* Always mono */
|
Chris@0
|
465 psf->sf.samplerate = 44100 ; /* Always */
|
Chris@0
|
466
|
Chris@0
|
467 psf->blockwidth = psf->sf.channels * psf->bytewidth ;
|
Chris@0
|
468
|
Chris@0
|
469 if (! psf->sf.frames && psf->blockwidth)
|
Chris@0
|
470 psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
|
Chris@0
|
471
|
Chris@0
|
472 psf->instrument->basenote = 0 ;
|
Chris@0
|
473 psf->instrument->gain = 1 ;
|
Chris@0
|
474 psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ;
|
Chris@0
|
475 psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ;
|
Chris@0
|
476
|
Chris@0
|
477 return 0 ;
|
Chris@0
|
478 } /* xi_read_header */
|
Chris@0
|
479
|
Chris@0
|
480 /*==============================================================================
|
Chris@0
|
481 */
|
Chris@0
|
482
|
Chris@0
|
483 static void dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest) ;
|
Chris@0
|
484 static void dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest) ;
|
Chris@0
|
485 static void dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact) ;
|
Chris@0
|
486 static void dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact) ;
|
Chris@0
|
487
|
Chris@0
|
488 static void dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest) ;
|
Chris@0
|
489 static void dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest) ;
|
Chris@0
|
490 static void dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact) ;
|
Chris@0
|
491 static void dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact) ;
|
Chris@0
|
492
|
Chris@0
|
493 static sf_count_t
|
Chris@0
|
494 dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
Chris@0
|
495 { XI_PRIVATE *pxi ;
|
Chris@0
|
496 int bufferlen, readcount ;
|
Chris@0
|
497 sf_count_t total = 0 ;
|
Chris@0
|
498
|
Chris@0
|
499 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
500 return 0 ;
|
Chris@0
|
501
|
Chris@0
|
502 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
Chris@0
|
503
|
Chris@0
|
504 while (len > 0)
|
Chris@0
|
505 { if (len < bufferlen)
|
Chris@0
|
506 bufferlen = (int) len ;
|
Chris@0
|
507 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
Chris@0
|
508 dsc2s_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
|
Chris@0
|
509 total += readcount ;
|
Chris@0
|
510 if (readcount < bufferlen)
|
Chris@0
|
511 break ;
|
Chris@0
|
512 len -= readcount ;
|
Chris@0
|
513 } ;
|
Chris@0
|
514
|
Chris@0
|
515 return total ;
|
Chris@0
|
516 } /* dpcm_read_dsc2s */
|
Chris@0
|
517
|
Chris@0
|
518 static sf_count_t
|
Chris@0
|
519 dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
Chris@0
|
520 { XI_PRIVATE *pxi ;
|
Chris@0
|
521 int bufferlen, readcount ;
|
Chris@0
|
522 sf_count_t total = 0 ;
|
Chris@0
|
523
|
Chris@0
|
524 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
525 return 0 ;
|
Chris@0
|
526
|
Chris@0
|
527 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
Chris@0
|
528
|
Chris@0
|
529 while (len > 0)
|
Chris@0
|
530 { if (len < bufferlen)
|
Chris@0
|
531 bufferlen = (int) len ;
|
Chris@0
|
532 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
Chris@0
|
533 dsc2i_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
|
Chris@0
|
534 total += readcount ;
|
Chris@0
|
535 if (readcount < bufferlen)
|
Chris@0
|
536 break ;
|
Chris@0
|
537 len -= readcount ;
|
Chris@0
|
538 } ;
|
Chris@0
|
539
|
Chris@0
|
540 return total ;
|
Chris@0
|
541 } /* dpcm_read_dsc2i */
|
Chris@0
|
542
|
Chris@0
|
543 static sf_count_t
|
Chris@0
|
544 dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
Chris@0
|
545 { XI_PRIVATE *pxi ;
|
Chris@0
|
546 int bufferlen, readcount ;
|
Chris@0
|
547 sf_count_t total = 0 ;
|
Chris@0
|
548 float normfact ;
|
Chris@0
|
549
|
Chris@0
|
550 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
551 return 0 ;
|
Chris@0
|
552
|
Chris@0
|
553 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
|
Chris@0
|
554
|
Chris@0
|
555 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
Chris@0
|
556
|
Chris@0
|
557 while (len > 0)
|
Chris@0
|
558 { if (len < bufferlen)
|
Chris@0
|
559 bufferlen = (int) len ;
|
Chris@0
|
560 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
Chris@0
|
561 dsc2f_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
|
Chris@0
|
562 total += readcount ;
|
Chris@0
|
563 if (readcount < bufferlen)
|
Chris@0
|
564 break ;
|
Chris@0
|
565 len -= readcount ;
|
Chris@0
|
566 } ;
|
Chris@0
|
567
|
Chris@0
|
568 return total ;
|
Chris@0
|
569 } /* dpcm_read_dsc2f */
|
Chris@0
|
570
|
Chris@0
|
571 static sf_count_t
|
Chris@0
|
572 dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
Chris@0
|
573 { XI_PRIVATE *pxi ;
|
Chris@0
|
574 int bufferlen, readcount ;
|
Chris@0
|
575 sf_count_t total = 0 ;
|
Chris@0
|
576 double normfact ;
|
Chris@0
|
577
|
Chris@0
|
578 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
579 return 0 ;
|
Chris@0
|
580
|
Chris@0
|
581 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
|
Chris@0
|
582
|
Chris@0
|
583 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
Chris@0
|
584
|
Chris@0
|
585 while (len > 0)
|
Chris@0
|
586 { if (len < bufferlen)
|
Chris@0
|
587 bufferlen = (int) len ;
|
Chris@0
|
588 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
Chris@0
|
589 dsc2d_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
|
Chris@0
|
590 total += readcount ;
|
Chris@0
|
591 if (readcount < bufferlen)
|
Chris@0
|
592 break ;
|
Chris@0
|
593 len -= readcount ;
|
Chris@0
|
594 } ;
|
Chris@0
|
595
|
Chris@0
|
596 return total ;
|
Chris@0
|
597 } /* dpcm_read_dsc2d */
|
Chris@0
|
598
|
Chris@0
|
599 /*------------------------------------------------------------------------------
|
Chris@0
|
600 */
|
Chris@0
|
601
|
Chris@0
|
602 static sf_count_t
|
Chris@0
|
603 dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
Chris@0
|
604 { XI_PRIVATE *pxi ;
|
Chris@0
|
605 int bufferlen, readcount ;
|
Chris@0
|
606 sf_count_t total = 0 ;
|
Chris@0
|
607
|
Chris@0
|
608 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
609 return 0 ;
|
Chris@0
|
610
|
Chris@0
|
611 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
612
|
Chris@0
|
613 while (len > 0)
|
Chris@0
|
614 { if (len < bufferlen)
|
Chris@0
|
615 bufferlen = (int) len ;
|
Chris@0
|
616 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
Chris@0
|
617 dles2s_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
|
Chris@0
|
618 total += readcount ;
|
Chris@0
|
619 if (readcount < bufferlen)
|
Chris@0
|
620 break ;
|
Chris@0
|
621 len -= readcount ;
|
Chris@0
|
622 } ;
|
Chris@0
|
623
|
Chris@0
|
624 return total ;
|
Chris@0
|
625 } /* dpcm_read_dles2s */
|
Chris@0
|
626
|
Chris@0
|
627 static sf_count_t
|
Chris@0
|
628 dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
Chris@0
|
629 { XI_PRIVATE *pxi ;
|
Chris@0
|
630 int bufferlen, readcount ;
|
Chris@0
|
631 sf_count_t total = 0 ;
|
Chris@0
|
632
|
Chris@0
|
633 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
634 return 0 ;
|
Chris@0
|
635
|
Chris@0
|
636 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
637
|
Chris@0
|
638 while (len > 0)
|
Chris@0
|
639 { if (len < bufferlen)
|
Chris@0
|
640 bufferlen = (int) len ;
|
Chris@0
|
641 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
Chris@0
|
642 dles2i_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
|
Chris@0
|
643 total += readcount ;
|
Chris@0
|
644 if (readcount < bufferlen)
|
Chris@0
|
645 break ;
|
Chris@0
|
646 len -= readcount ;
|
Chris@0
|
647 } ;
|
Chris@0
|
648
|
Chris@0
|
649 return total ;
|
Chris@0
|
650 } /* dpcm_read_dles2i */
|
Chris@0
|
651
|
Chris@0
|
652 static sf_count_t
|
Chris@0
|
653 dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
Chris@0
|
654 { XI_PRIVATE *pxi ;
|
Chris@0
|
655 int bufferlen, readcount ;
|
Chris@0
|
656 sf_count_t total = 0 ;
|
Chris@0
|
657 float normfact ;
|
Chris@0
|
658
|
Chris@0
|
659 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
660 return 0 ;
|
Chris@0
|
661
|
Chris@0
|
662 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
|
Chris@0
|
663
|
Chris@0
|
664 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
665
|
Chris@0
|
666 while (len > 0)
|
Chris@0
|
667 { if (len < bufferlen)
|
Chris@0
|
668 bufferlen = (int) len ;
|
Chris@0
|
669 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
Chris@0
|
670 dles2f_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
|
Chris@0
|
671 total += readcount ;
|
Chris@0
|
672 if (readcount < bufferlen)
|
Chris@0
|
673 break ;
|
Chris@0
|
674 len -= readcount ;
|
Chris@0
|
675 } ;
|
Chris@0
|
676
|
Chris@0
|
677 return total ;
|
Chris@0
|
678 } /* dpcm_read_dles2f */
|
Chris@0
|
679
|
Chris@0
|
680 static sf_count_t
|
Chris@0
|
681 dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
Chris@0
|
682 { XI_PRIVATE *pxi ;
|
Chris@0
|
683 int bufferlen, readcount ;
|
Chris@0
|
684 sf_count_t total = 0 ;
|
Chris@0
|
685 double normfact ;
|
Chris@0
|
686
|
Chris@0
|
687 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
688 return 0 ;
|
Chris@0
|
689
|
Chris@0
|
690 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
|
Chris@0
|
691
|
Chris@0
|
692 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
693
|
Chris@0
|
694 while (len > 0)
|
Chris@0
|
695 { if (len < bufferlen)
|
Chris@0
|
696 bufferlen = (int) len ;
|
Chris@0
|
697 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
Chris@0
|
698 dles2d_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
|
Chris@0
|
699 total += readcount ;
|
Chris@0
|
700 if (readcount < bufferlen)
|
Chris@0
|
701 break ;
|
Chris@0
|
702 len -= readcount ;
|
Chris@0
|
703 } ;
|
Chris@0
|
704
|
Chris@0
|
705 return total ;
|
Chris@0
|
706 } /* dpcm_read_dles2d */
|
Chris@0
|
707
|
Chris@0
|
708 /*==============================================================================
|
Chris@0
|
709 */
|
Chris@0
|
710
|
Chris@0
|
711 static void s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count) ;
|
Chris@0
|
712 static void i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count) ;
|
Chris@0
|
713 static void f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact) ;
|
Chris@0
|
714 static void d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact) ;
|
Chris@0
|
715
|
Chris@0
|
716 static void s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count) ;
|
Chris@0
|
717 static void i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count) ;
|
Chris@0
|
718 static void f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact) ;
|
Chris@0
|
719 static void d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact) ;
|
Chris@0
|
720
|
Chris@0
|
721
|
Chris@0
|
722 static sf_count_t
|
Chris@0
|
723 dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
Chris@0
|
724 { XI_PRIVATE *pxi ;
|
Chris@0
|
725 int bufferlen, writecount ;
|
Chris@0
|
726 sf_count_t total = 0 ;
|
Chris@0
|
727
|
Chris@0
|
728 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
729 return 0 ;
|
Chris@0
|
730
|
Chris@0
|
731 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
Chris@0
|
732
|
Chris@0
|
733 while (len > 0)
|
Chris@0
|
734 { if (len < bufferlen)
|
Chris@0
|
735 bufferlen = (int) len ;
|
Chris@0
|
736 s2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
|
Chris@0
|
737 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
Chris@0
|
738 total += writecount ;
|
Chris@0
|
739 if (writecount < bufferlen)
|
Chris@0
|
740 break ;
|
Chris@0
|
741 len -= writecount ;
|
Chris@0
|
742 } ;
|
Chris@0
|
743
|
Chris@0
|
744 return total ;
|
Chris@0
|
745 } /* dpcm_write_s2dsc */
|
Chris@0
|
746
|
Chris@0
|
747 static sf_count_t
|
Chris@0
|
748 dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
Chris@0
|
749 { XI_PRIVATE *pxi ;
|
Chris@0
|
750 int bufferlen, writecount ;
|
Chris@0
|
751 sf_count_t total = 0 ;
|
Chris@0
|
752
|
Chris@0
|
753 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
754 return 0 ;
|
Chris@0
|
755
|
Chris@0
|
756 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
Chris@0
|
757
|
Chris@0
|
758 while (len > 0)
|
Chris@0
|
759 { if (len < bufferlen)
|
Chris@0
|
760 bufferlen = (int) len ;
|
Chris@0
|
761 i2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
|
Chris@0
|
762 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
Chris@0
|
763 total += writecount ;
|
Chris@0
|
764 if (writecount < bufferlen)
|
Chris@0
|
765 break ;
|
Chris@0
|
766 len -= writecount ;
|
Chris@0
|
767 } ;
|
Chris@0
|
768
|
Chris@0
|
769 return total ;
|
Chris@0
|
770 } /* dpcm_write_i2dsc */
|
Chris@0
|
771
|
Chris@0
|
772 static sf_count_t
|
Chris@0
|
773 dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
Chris@0
|
774 { XI_PRIVATE *pxi ;
|
Chris@0
|
775 int bufferlen, writecount ;
|
Chris@0
|
776 sf_count_t total = 0 ;
|
Chris@0
|
777 float normfact ;
|
Chris@0
|
778
|
Chris@0
|
779 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
780 return 0 ;
|
Chris@0
|
781
|
Chris@0
|
782 normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
|
Chris@0
|
783
|
Chris@0
|
784 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
Chris@0
|
785
|
Chris@0
|
786 while (len > 0)
|
Chris@0
|
787 { if (len < bufferlen)
|
Chris@0
|
788 bufferlen = (int) len ;
|
Chris@0
|
789 f2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
|
Chris@0
|
790 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
Chris@0
|
791 total += writecount ;
|
Chris@0
|
792 if (writecount < bufferlen)
|
Chris@0
|
793 break ;
|
Chris@0
|
794 len -= writecount ;
|
Chris@0
|
795 } ;
|
Chris@0
|
796
|
Chris@0
|
797 return total ;
|
Chris@0
|
798 } /* dpcm_write_f2dsc */
|
Chris@0
|
799
|
Chris@0
|
800 static sf_count_t
|
Chris@0
|
801 dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
Chris@0
|
802 { XI_PRIVATE *pxi ;
|
Chris@0
|
803 int bufferlen, writecount ;
|
Chris@0
|
804 sf_count_t total = 0 ;
|
Chris@0
|
805 double normfact ;
|
Chris@0
|
806
|
Chris@0
|
807 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
808 return 0 ;
|
Chris@0
|
809
|
Chris@0
|
810 normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
|
Chris@0
|
811
|
Chris@0
|
812 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
Chris@0
|
813
|
Chris@0
|
814 while (len > 0)
|
Chris@0
|
815 { if (len < bufferlen)
|
Chris@0
|
816 bufferlen = (int) len ;
|
Chris@0
|
817 d2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
|
Chris@0
|
818 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
Chris@0
|
819 total += writecount ;
|
Chris@0
|
820 if (writecount < bufferlen)
|
Chris@0
|
821 break ;
|
Chris@0
|
822 len -= writecount ;
|
Chris@0
|
823 } ;
|
Chris@0
|
824
|
Chris@0
|
825 return total ;
|
Chris@0
|
826 } /* dpcm_write_d2dsc */
|
Chris@0
|
827
|
Chris@0
|
828
|
Chris@0
|
829 static sf_count_t
|
Chris@0
|
830 dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
Chris@0
|
831 { XI_PRIVATE *pxi ;
|
Chris@0
|
832 int bufferlen, writecount ;
|
Chris@0
|
833 sf_count_t total = 0 ;
|
Chris@0
|
834
|
Chris@0
|
835 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
836 return 0 ;
|
Chris@0
|
837
|
Chris@0
|
838 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
839
|
Chris@0
|
840 while (len > 0)
|
Chris@0
|
841 { if (len < bufferlen)
|
Chris@0
|
842 bufferlen = (int) len ;
|
Chris@0
|
843 s2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
|
Chris@0
|
844 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
Chris@0
|
845 total += writecount ;
|
Chris@0
|
846 if (writecount < bufferlen)
|
Chris@0
|
847 break ;
|
Chris@0
|
848 len -= writecount ;
|
Chris@0
|
849 } ;
|
Chris@0
|
850
|
Chris@0
|
851 return total ;
|
Chris@0
|
852 } /* dpcm_write_s2dles */
|
Chris@0
|
853
|
Chris@0
|
854 static sf_count_t
|
Chris@0
|
855 dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
Chris@0
|
856 { XI_PRIVATE *pxi ;
|
Chris@0
|
857 int bufferlen, writecount ;
|
Chris@0
|
858 sf_count_t total = 0 ;
|
Chris@0
|
859
|
Chris@0
|
860 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
861 return 0 ;
|
Chris@0
|
862
|
Chris@0
|
863 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
864
|
Chris@0
|
865 while (len > 0)
|
Chris@0
|
866 { if (len < bufferlen)
|
Chris@0
|
867 bufferlen = (int) len ;
|
Chris@0
|
868 i2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
|
Chris@0
|
869 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
Chris@0
|
870 total += writecount ;
|
Chris@0
|
871 if (writecount < bufferlen)
|
Chris@0
|
872 break ;
|
Chris@0
|
873 len -= writecount ;
|
Chris@0
|
874 } ;
|
Chris@0
|
875
|
Chris@0
|
876 return total ;
|
Chris@0
|
877 } /* dpcm_write_i2dles */
|
Chris@0
|
878
|
Chris@0
|
879 static sf_count_t
|
Chris@0
|
880 dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
Chris@0
|
881 { XI_PRIVATE *pxi ;
|
Chris@0
|
882 int bufferlen, writecount ;
|
Chris@0
|
883 sf_count_t total = 0 ;
|
Chris@0
|
884 float normfact ;
|
Chris@0
|
885
|
Chris@0
|
886 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
887 return 0 ;
|
Chris@0
|
888
|
Chris@0
|
889 normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
|
Chris@0
|
890
|
Chris@0
|
891 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
892
|
Chris@0
|
893 while (len > 0)
|
Chris@0
|
894 { if (len < bufferlen)
|
Chris@0
|
895 bufferlen = (int) len ;
|
Chris@0
|
896 f2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
|
Chris@0
|
897 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
Chris@0
|
898 total += writecount ;
|
Chris@0
|
899 if (writecount < bufferlen)
|
Chris@0
|
900 break ;
|
Chris@0
|
901 len -= writecount ;
|
Chris@0
|
902 } ;
|
Chris@0
|
903
|
Chris@0
|
904 return total ;
|
Chris@0
|
905 } /* dpcm_write_f2dles */
|
Chris@0
|
906
|
Chris@0
|
907 static sf_count_t
|
Chris@0
|
908 dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
Chris@0
|
909 { XI_PRIVATE *pxi ;
|
Chris@0
|
910 int bufferlen, writecount ;
|
Chris@0
|
911 sf_count_t total = 0 ;
|
Chris@0
|
912 double normfact ;
|
Chris@0
|
913
|
Chris@0
|
914 if ((pxi = psf->codec_data) == NULL)
|
Chris@0
|
915 return 0 ;
|
Chris@0
|
916
|
Chris@0
|
917 normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
|
Chris@0
|
918
|
Chris@0
|
919 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
Chris@0
|
920
|
Chris@0
|
921 while (len > 0)
|
Chris@0
|
922 { if (len < bufferlen)
|
Chris@0
|
923 bufferlen = (int) len ;
|
Chris@0
|
924 d2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
|
Chris@0
|
925 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
Chris@0
|
926 total += writecount ;
|
Chris@0
|
927 if (writecount < bufferlen)
|
Chris@0
|
928 break ;
|
Chris@0
|
929 len -= writecount ;
|
Chris@0
|
930 } ;
|
Chris@0
|
931
|
Chris@0
|
932 return total ;
|
Chris@0
|
933 } /* dpcm_write_d2dles */
|
Chris@0
|
934
|
Chris@0
|
935
|
Chris@0
|
936 /*==============================================================================
|
Chris@0
|
937 */
|
Chris@0
|
938
|
Chris@0
|
939 static void
|
Chris@0
|
940 dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest)
|
Chris@0
|
941 { signed char last_val ;
|
Chris@0
|
942 int k ;
|
Chris@0
|
943
|
Chris@0
|
944 last_val = pxi->last_16 >> 8 ;
|
Chris@0
|
945
|
Chris@0
|
946 for (k = 0 ; k < count ; k++)
|
Chris@0
|
947 { last_val += src [k] ;
|
Chris@0
|
948 dest [k] = last_val << 8 ;
|
Chris@0
|
949 } ;
|
Chris@0
|
950
|
Chris@0
|
951 pxi->last_16 = last_val << 8 ;
|
Chris@0
|
952 } /* dsc2s_array */
|
Chris@0
|
953
|
Chris@0
|
954 static void
|
Chris@0
|
955 dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest)
|
Chris@0
|
956 { signed char last_val ;
|
Chris@0
|
957 int k ;
|
Chris@0
|
958
|
Chris@0
|
959 last_val = pxi->last_16 >> 8 ;
|
Chris@0
|
960
|
Chris@0
|
961 for (k = 0 ; k < count ; k++)
|
Chris@0
|
962 { last_val += src [k] ;
|
Chris@0
|
963 dest [k] = last_val << 24 ;
|
Chris@0
|
964 } ;
|
Chris@0
|
965
|
Chris@0
|
966 pxi->last_16 = last_val << 8 ;
|
Chris@0
|
967 } /* dsc2i_array */
|
Chris@0
|
968
|
Chris@0
|
969 static void
|
Chris@0
|
970 dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact)
|
Chris@0
|
971 { signed char last_val ;
|
Chris@0
|
972 int k ;
|
Chris@0
|
973
|
Chris@0
|
974 last_val = pxi->last_16 >> 8 ;
|
Chris@0
|
975
|
Chris@0
|
976 for (k = 0 ; k < count ; k++)
|
Chris@0
|
977 { last_val += src [k] ;
|
Chris@0
|
978 dest [k] = last_val * normfact ;
|
Chris@0
|
979 } ;
|
Chris@0
|
980
|
Chris@0
|
981 pxi->last_16 = last_val << 8 ;
|
Chris@0
|
982 } /* dsc2f_array */
|
Chris@0
|
983
|
Chris@0
|
984 static void
|
Chris@0
|
985 dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact)
|
Chris@0
|
986 { signed char last_val ;
|
Chris@0
|
987 int k ;
|
Chris@0
|
988
|
Chris@0
|
989 last_val = pxi->last_16 >> 8 ;
|
Chris@0
|
990
|
Chris@0
|
991 for (k = 0 ; k < count ; k++)
|
Chris@0
|
992 { last_val += src [k] ;
|
Chris@0
|
993 dest [k] = last_val * normfact ;
|
Chris@0
|
994 } ;
|
Chris@0
|
995
|
Chris@0
|
996 pxi->last_16 = last_val << 8 ;
|
Chris@0
|
997 } /* dsc2d_array */
|
Chris@0
|
998
|
Chris@0
|
999 /*------------------------------------------------------------------------------
|
Chris@0
|
1000 */
|
Chris@0
|
1001
|
Chris@0
|
1002 static void
|
Chris@0
|
1003 s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count)
|
Chris@0
|
1004 { signed char last_val, current ;
|
Chris@0
|
1005 int k ;
|
Chris@0
|
1006
|
Chris@0
|
1007 last_val = pxi->last_16 >> 8 ;
|
Chris@0
|
1008
|
Chris@0
|
1009 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1010 { current = src [k] >> 8 ;
|
Chris@0
|
1011 dest [k] = current - last_val ;
|
Chris@0
|
1012 last_val = current ;
|
Chris@0
|
1013 } ;
|
Chris@0
|
1014
|
Chris@0
|
1015 pxi->last_16 = last_val << 8 ;
|
Chris@0
|
1016 } /* s2dsc_array */
|
Chris@0
|
1017
|
Chris@0
|
1018 static void
|
Chris@0
|
1019 i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count)
|
Chris@0
|
1020 { signed char last_val, current ;
|
Chris@0
|
1021 int k ;
|
Chris@0
|
1022
|
Chris@0
|
1023 last_val = pxi->last_16 >> 8 ;
|
Chris@0
|
1024
|
Chris@0
|
1025 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1026 { current = src [k] >> 24 ;
|
Chris@0
|
1027 dest [k] = current - last_val ;
|
Chris@0
|
1028 last_val = current ;
|
Chris@0
|
1029 } ;
|
Chris@0
|
1030
|
Chris@0
|
1031 pxi->last_16 = last_val << 8 ;
|
Chris@0
|
1032 } /* i2dsc_array */
|
Chris@0
|
1033
|
Chris@0
|
1034 static void
|
Chris@0
|
1035 f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact)
|
Chris@0
|
1036 { signed char last_val, current ;
|
Chris@0
|
1037 int k ;
|
Chris@0
|
1038
|
Chris@0
|
1039 last_val = pxi->last_16 >> 8 ;
|
Chris@0
|
1040
|
Chris@0
|
1041 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1042 { current = lrintf (src [k] * normfact) ;
|
Chris@0
|
1043 dest [k] = current - last_val ;
|
Chris@0
|
1044 last_val = current ;
|
Chris@0
|
1045 } ;
|
Chris@0
|
1046
|
Chris@0
|
1047 pxi->last_16 = last_val << 8 ;
|
Chris@0
|
1048 } /* f2dsc_array */
|
Chris@0
|
1049
|
Chris@0
|
1050 static void
|
Chris@0
|
1051 d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact)
|
Chris@0
|
1052 { signed char last_val, current ;
|
Chris@0
|
1053 int k ;
|
Chris@0
|
1054
|
Chris@0
|
1055 last_val = pxi->last_16 >> 8 ;
|
Chris@0
|
1056
|
Chris@0
|
1057 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1058 { current = lrint (src [k] * normfact) ;
|
Chris@0
|
1059 dest [k] = current - last_val ;
|
Chris@0
|
1060 last_val = current ;
|
Chris@0
|
1061 } ;
|
Chris@0
|
1062
|
Chris@0
|
1063 pxi->last_16 = last_val << 8 ;
|
Chris@0
|
1064 } /* d2dsc_array */
|
Chris@0
|
1065
|
Chris@0
|
1066 /*==============================================================================
|
Chris@0
|
1067 */
|
Chris@0
|
1068
|
Chris@0
|
1069 static void
|
Chris@0
|
1070 dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest)
|
Chris@0
|
1071 { short last_val ;
|
Chris@0
|
1072 int k ;
|
Chris@0
|
1073
|
Chris@0
|
1074 last_val = pxi->last_16 ;
|
Chris@0
|
1075
|
Chris@0
|
1076 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1077 { last_val += LES2H_SHORT (src [k]) ;
|
Chris@0
|
1078 dest [k] = last_val ;
|
Chris@0
|
1079 } ;
|
Chris@0
|
1080
|
Chris@0
|
1081 pxi->last_16 = last_val ;
|
Chris@0
|
1082 } /* dles2s_array */
|
Chris@0
|
1083
|
Chris@0
|
1084 static void
|
Chris@0
|
1085 dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest)
|
Chris@0
|
1086 { short last_val ;
|
Chris@0
|
1087 int k ;
|
Chris@0
|
1088
|
Chris@0
|
1089 last_val = pxi->last_16 ;
|
Chris@0
|
1090
|
Chris@0
|
1091 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1092 { last_val += LES2H_SHORT (src [k]) ;
|
Chris@0
|
1093 dest [k] = last_val << 16 ;
|
Chris@0
|
1094 } ;
|
Chris@0
|
1095
|
Chris@0
|
1096 pxi->last_16 = last_val ;
|
Chris@0
|
1097 } /* dles2i_array */
|
Chris@0
|
1098
|
Chris@0
|
1099 static void
|
Chris@0
|
1100 dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact)
|
Chris@0
|
1101 { short last_val ;
|
Chris@0
|
1102 int k ;
|
Chris@0
|
1103
|
Chris@0
|
1104 last_val = pxi->last_16 ;
|
Chris@0
|
1105
|
Chris@0
|
1106 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1107 { last_val += LES2H_SHORT (src [k]) ;
|
Chris@0
|
1108 dest [k] = last_val * normfact ;
|
Chris@0
|
1109 } ;
|
Chris@0
|
1110
|
Chris@0
|
1111 pxi->last_16 = last_val ;
|
Chris@0
|
1112 } /* dles2f_array */
|
Chris@0
|
1113
|
Chris@0
|
1114 static void
|
Chris@0
|
1115 dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact)
|
Chris@0
|
1116 { short last_val ;
|
Chris@0
|
1117 int k ;
|
Chris@0
|
1118
|
Chris@0
|
1119 last_val = pxi->last_16 ;
|
Chris@0
|
1120
|
Chris@0
|
1121 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1122 { last_val += LES2H_SHORT (src [k]) ;
|
Chris@0
|
1123 dest [k] = last_val * normfact ;
|
Chris@0
|
1124 } ;
|
Chris@0
|
1125
|
Chris@0
|
1126 pxi->last_16 = last_val ;
|
Chris@0
|
1127 } /* dles2d_array */
|
Chris@0
|
1128
|
Chris@0
|
1129 /*------------------------------------------------------------------------------
|
Chris@0
|
1130 */
|
Chris@0
|
1131
|
Chris@0
|
1132 static void
|
Chris@0
|
1133 s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count)
|
Chris@0
|
1134 { short diff, last_val ;
|
Chris@0
|
1135 int k ;
|
Chris@0
|
1136
|
Chris@0
|
1137 last_val = pxi->last_16 ;
|
Chris@0
|
1138
|
Chris@0
|
1139 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1140 { diff = src [k] - last_val ;
|
Chris@0
|
1141 dest [k] = LES2H_SHORT (diff) ;
|
Chris@0
|
1142 last_val = src [k] ;
|
Chris@0
|
1143 } ;
|
Chris@0
|
1144
|
Chris@0
|
1145 pxi->last_16 = last_val ;
|
Chris@0
|
1146 } /* s2dles_array */
|
Chris@0
|
1147
|
Chris@0
|
1148 static void
|
Chris@0
|
1149 i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count)
|
Chris@0
|
1150 { short diff, last_val ;
|
Chris@0
|
1151 int k ;
|
Chris@0
|
1152
|
Chris@0
|
1153 last_val = pxi->last_16 ;
|
Chris@0
|
1154
|
Chris@0
|
1155 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1156 { diff = (src [k] >> 16) - last_val ;
|
Chris@0
|
1157 dest [k] = LES2H_SHORT (diff) ;
|
Chris@0
|
1158 last_val = src [k] >> 16 ;
|
Chris@0
|
1159 } ;
|
Chris@0
|
1160
|
Chris@0
|
1161 pxi->last_16 = last_val ;
|
Chris@0
|
1162 } /* i2dles_array */
|
Chris@0
|
1163
|
Chris@0
|
1164 static void
|
Chris@0
|
1165 f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact)
|
Chris@0
|
1166 { short diff, last_val, current ;
|
Chris@0
|
1167 int k ;
|
Chris@0
|
1168
|
Chris@0
|
1169 last_val = pxi->last_16 ;
|
Chris@0
|
1170
|
Chris@0
|
1171 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1172 { current = lrintf (src [k] * normfact) ;
|
Chris@0
|
1173 diff = current - last_val ;
|
Chris@0
|
1174 dest [k] = LES2H_SHORT (diff) ;
|
Chris@0
|
1175 last_val = current ;
|
Chris@0
|
1176 } ;
|
Chris@0
|
1177
|
Chris@0
|
1178 pxi->last_16 = last_val ;
|
Chris@0
|
1179 } /* f2dles_array */
|
Chris@0
|
1180
|
Chris@0
|
1181 static void
|
Chris@0
|
1182 d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact)
|
Chris@0
|
1183 { short diff, last_val, current ;
|
Chris@0
|
1184 int k ;
|
Chris@0
|
1185
|
Chris@0
|
1186 last_val = pxi->last_16 ;
|
Chris@0
|
1187
|
Chris@0
|
1188 for (k = 0 ; k < count ; k++)
|
Chris@0
|
1189 { current = lrint (src [k] * normfact) ;
|
Chris@0
|
1190 diff = current - last_val ;
|
Chris@0
|
1191 dest [k] = LES2H_SHORT (diff) ;
|
Chris@0
|
1192 last_val = current ;
|
Chris@0
|
1193 } ;
|
Chris@0
|
1194
|
Chris@0
|
1195 pxi->last_16 = last_val ;
|
Chris@0
|
1196 } /* d2dles_array */
|
Chris@0
|
1197
|