cannam@85
|
1 /*
|
cannam@85
|
2 ** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
|
cannam@85
|
3 **
|
cannam@85
|
4 ** This program is free software; you can redistribute it and/or modify
|
cannam@85
|
5 ** it under the terms of the GNU Lesser General Public License as published by
|
cannam@85
|
6 ** the Free Software Foundation; either version 2.1 of the License, or
|
cannam@85
|
7 ** (at your option) any later version.
|
cannam@85
|
8 **
|
cannam@85
|
9 ** This program is distributed in the hope that it will be useful,
|
cannam@85
|
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
cannam@85
|
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
cannam@85
|
12 ** GNU Lesser General Public License for more details.
|
cannam@85
|
13 **
|
cannam@85
|
14 ** You should have received a copy of the GNU Lesser General Public License
|
cannam@85
|
15 ** along with this program; if not, write to the Free Software
|
cannam@85
|
16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
cannam@85
|
17 */
|
cannam@85
|
18
|
cannam@85
|
19 #include "sfconfig.h"
|
cannam@85
|
20
|
cannam@85
|
21 #include <math.h>
|
cannam@85
|
22
|
cannam@85
|
23 #include "sndfile.h"
|
cannam@85
|
24 #include "sfendian.h"
|
cannam@85
|
25 #include "common.h"
|
cannam@85
|
26
|
cannam@85
|
27 /* Need to be able to handle 3 byte (24 bit) integers. So defined a
|
cannam@85
|
28 ** type and use SIZEOF_TRIBYTE instead of (tribyte).
|
cannam@85
|
29 */
|
cannam@85
|
30
|
cannam@85
|
31 typedef void tribyte ;
|
cannam@85
|
32
|
cannam@85
|
33 #define SIZEOF_TRIBYTE 3
|
cannam@85
|
34
|
cannam@85
|
35 static sf_count_t pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
cannam@85
|
36 static sf_count_t pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
cannam@85
|
37 static sf_count_t pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
cannam@85
|
38 static sf_count_t pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
cannam@85
|
39 static sf_count_t pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
cannam@85
|
40 static sf_count_t pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
cannam@85
|
41 static sf_count_t pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
cannam@85
|
42 static sf_count_t pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
|
cannam@85
|
43
|
cannam@85
|
44 static sf_count_t pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
cannam@85
|
45 static sf_count_t pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
cannam@85
|
46 static sf_count_t pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
cannam@85
|
47 static sf_count_t pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
cannam@85
|
48 static sf_count_t pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
cannam@85
|
49 static sf_count_t pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
cannam@85
|
50 static sf_count_t pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
cannam@85
|
51 static sf_count_t pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
|
cannam@85
|
52
|
cannam@85
|
53 static sf_count_t pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
cannam@85
|
54 static sf_count_t pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
cannam@85
|
55 static sf_count_t pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
cannam@85
|
56 static sf_count_t pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
cannam@85
|
57 static sf_count_t pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
cannam@85
|
58 static sf_count_t pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
cannam@85
|
59 static sf_count_t pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
cannam@85
|
60 static sf_count_t pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
|
cannam@85
|
61
|
cannam@85
|
62 static sf_count_t pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
cannam@85
|
63 static sf_count_t pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
cannam@85
|
64 static sf_count_t pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
cannam@85
|
65 static sf_count_t pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
cannam@85
|
66 static sf_count_t pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
cannam@85
|
67 static sf_count_t pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
cannam@85
|
68 static sf_count_t pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
cannam@85
|
69 static sf_count_t pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
|
cannam@85
|
70
|
cannam@85
|
71 static sf_count_t pcm_write_s2sc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
cannam@85
|
72 static sf_count_t pcm_write_s2uc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
cannam@85
|
73 static sf_count_t pcm_write_s2bes (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
cannam@85
|
74 static sf_count_t pcm_write_s2les (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
cannam@85
|
75 static sf_count_t pcm_write_s2bet (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
cannam@85
|
76 static sf_count_t pcm_write_s2let (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
cannam@85
|
77 static sf_count_t pcm_write_s2bei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
cannam@85
|
78 static sf_count_t pcm_write_s2lei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
|
cannam@85
|
79
|
cannam@85
|
80 static sf_count_t pcm_write_i2sc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
cannam@85
|
81 static sf_count_t pcm_write_i2uc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
cannam@85
|
82 static sf_count_t pcm_write_i2bes (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
cannam@85
|
83 static sf_count_t pcm_write_i2les (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
cannam@85
|
84 static sf_count_t pcm_write_i2bet (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
cannam@85
|
85 static sf_count_t pcm_write_i2let (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
cannam@85
|
86 static sf_count_t pcm_write_i2bei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
cannam@85
|
87 static sf_count_t pcm_write_i2lei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
|
cannam@85
|
88
|
cannam@85
|
89 static sf_count_t pcm_write_f2sc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
cannam@85
|
90 static sf_count_t pcm_write_f2uc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
cannam@85
|
91 static sf_count_t pcm_write_f2bes (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
cannam@85
|
92 static sf_count_t pcm_write_f2les (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
cannam@85
|
93 static sf_count_t pcm_write_f2bet (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
cannam@85
|
94 static sf_count_t pcm_write_f2let (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
cannam@85
|
95 static sf_count_t pcm_write_f2bei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
cannam@85
|
96 static sf_count_t pcm_write_f2lei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
|
cannam@85
|
97
|
cannam@85
|
98 static sf_count_t pcm_write_d2sc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
cannam@85
|
99 static sf_count_t pcm_write_d2uc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
cannam@85
|
100 static sf_count_t pcm_write_d2bes (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
cannam@85
|
101 static sf_count_t pcm_write_d2les (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
cannam@85
|
102 static sf_count_t pcm_write_d2bet (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
cannam@85
|
103 static sf_count_t pcm_write_d2let (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
cannam@85
|
104 static sf_count_t pcm_write_d2bei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
cannam@85
|
105 static sf_count_t pcm_write_d2lei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
|
cannam@85
|
106
|
cannam@85
|
107 /*-----------------------------------------------------------------------------------------------
|
cannam@85
|
108 */
|
cannam@85
|
109
|
cannam@85
|
110 enum
|
cannam@85
|
111 { /* Char type for 8 bit files. */
|
cannam@85
|
112 SF_CHARS_SIGNED = 200,
|
cannam@85
|
113 SF_CHARS_UNSIGNED = 201
|
cannam@85
|
114 } ;
|
cannam@85
|
115
|
cannam@85
|
116 /*-----------------------------------------------------------------------------------------------
|
cannam@85
|
117 */
|
cannam@85
|
118
|
cannam@85
|
119 int
|
cannam@85
|
120 pcm_init (SF_PRIVATE *psf)
|
cannam@85
|
121 { int chars = 0 ;
|
cannam@85
|
122
|
cannam@85
|
123 if (psf->bytewidth == 0 || psf->sf.channels == 0)
|
cannam@85
|
124 { psf_log_printf (psf, "pcm_init : internal error : bytewitdh = %d, channels = %d\n", psf->bytewidth, psf->sf.channels) ;
|
cannam@85
|
125 return SFE_INTERNAL ;
|
cannam@85
|
126 } ;
|
cannam@85
|
127
|
cannam@85
|
128 psf->blockwidth = psf->bytewidth * psf->sf.channels ;
|
cannam@85
|
129
|
cannam@85
|
130 if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_S8)
|
cannam@85
|
131 chars = SF_CHARS_SIGNED ;
|
cannam@85
|
132 else if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_U8)
|
cannam@85
|
133 chars = SF_CHARS_UNSIGNED ;
|
cannam@85
|
134
|
cannam@85
|
135 if (CPU_IS_BIG_ENDIAN)
|
cannam@85
|
136 psf->data_endswap = (psf->endian == SF_ENDIAN_BIG) ? SF_FALSE : SF_TRUE ;
|
cannam@85
|
137 else
|
cannam@85
|
138 psf->data_endswap = (psf->endian == SF_ENDIAN_LITTLE) ? SF_FALSE : SF_TRUE ;
|
cannam@85
|
139
|
cannam@85
|
140 if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
|
cannam@85
|
141 { switch (psf->bytewidth * 0x10000 + psf->endian + chars)
|
cannam@85
|
142 { case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) :
|
cannam@85
|
143 case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) :
|
cannam@85
|
144 psf->read_short = pcm_read_sc2s ;
|
cannam@85
|
145 psf->read_int = pcm_read_sc2i ;
|
cannam@85
|
146 psf->read_float = pcm_read_sc2f ;
|
cannam@85
|
147 psf->read_double = pcm_read_sc2d ;
|
cannam@85
|
148 break ;
|
cannam@85
|
149 case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) :
|
cannam@85
|
150 case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) :
|
cannam@85
|
151 psf->read_short = pcm_read_uc2s ;
|
cannam@85
|
152 psf->read_int = pcm_read_uc2i ;
|
cannam@85
|
153 psf->read_float = pcm_read_uc2f ;
|
cannam@85
|
154 psf->read_double = pcm_read_uc2d ;
|
cannam@85
|
155 break ;
|
cannam@85
|
156
|
cannam@85
|
157 case (2 * 0x10000 + SF_ENDIAN_BIG) :
|
cannam@85
|
158 psf->read_short = pcm_read_bes2s ;
|
cannam@85
|
159 psf->read_int = pcm_read_bes2i ;
|
cannam@85
|
160 psf->read_float = pcm_read_bes2f ;
|
cannam@85
|
161 psf->read_double = pcm_read_bes2d ;
|
cannam@85
|
162 break ;
|
cannam@85
|
163 case (3 * 0x10000 + SF_ENDIAN_BIG) :
|
cannam@85
|
164 psf->read_short = pcm_read_bet2s ;
|
cannam@85
|
165 psf->read_int = pcm_read_bet2i ;
|
cannam@85
|
166 psf->read_float = pcm_read_bet2f ;
|
cannam@85
|
167 psf->read_double = pcm_read_bet2d ;
|
cannam@85
|
168 break ;
|
cannam@85
|
169 case (4 * 0x10000 + SF_ENDIAN_BIG) :
|
cannam@85
|
170
|
cannam@85
|
171 psf->read_short = pcm_read_bei2s ;
|
cannam@85
|
172 psf->read_int = pcm_read_bei2i ;
|
cannam@85
|
173 psf->read_float = pcm_read_bei2f ;
|
cannam@85
|
174 psf->read_double = pcm_read_bei2d ;
|
cannam@85
|
175 break ;
|
cannam@85
|
176
|
cannam@85
|
177 case (2 * 0x10000 + SF_ENDIAN_LITTLE) :
|
cannam@85
|
178 psf->read_short = pcm_read_les2s ;
|
cannam@85
|
179 psf->read_int = pcm_read_les2i ;
|
cannam@85
|
180 psf->read_float = pcm_read_les2f ;
|
cannam@85
|
181 psf->read_double = pcm_read_les2d ;
|
cannam@85
|
182 break ;
|
cannam@85
|
183 case (3 * 0x10000 + SF_ENDIAN_LITTLE) :
|
cannam@85
|
184 psf->read_short = pcm_read_let2s ;
|
cannam@85
|
185 psf->read_int = pcm_read_let2i ;
|
cannam@85
|
186 psf->read_float = pcm_read_let2f ;
|
cannam@85
|
187 psf->read_double = pcm_read_let2d ;
|
cannam@85
|
188 break ;
|
cannam@85
|
189 case (4 * 0x10000 + SF_ENDIAN_LITTLE) :
|
cannam@85
|
190 psf->read_short = pcm_read_lei2s ;
|
cannam@85
|
191 psf->read_int = pcm_read_lei2i ;
|
cannam@85
|
192 psf->read_float = pcm_read_lei2f ;
|
cannam@85
|
193 psf->read_double = pcm_read_lei2d ;
|
cannam@85
|
194 break ;
|
cannam@85
|
195 default :
|
cannam@85
|
196 psf_log_printf (psf, "pcm.c returning SFE_UNIMPLEMENTED\nbytewidth %d endian %d\n", psf->bytewidth, psf->endian) ;
|
cannam@85
|
197 return SFE_UNIMPLEMENTED ;
|
cannam@85
|
198 } ;
|
cannam@85
|
199 } ;
|
cannam@85
|
200
|
cannam@85
|
201 if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
|
cannam@85
|
202 { switch (psf->bytewidth * 0x10000 + psf->endian + chars)
|
cannam@85
|
203 { case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) :
|
cannam@85
|
204 case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) :
|
cannam@85
|
205 psf->write_short = pcm_write_s2sc ;
|
cannam@85
|
206 psf->write_int = pcm_write_i2sc ;
|
cannam@85
|
207 psf->write_float = pcm_write_f2sc ;
|
cannam@85
|
208 psf->write_double = pcm_write_d2sc ;
|
cannam@85
|
209 break ;
|
cannam@85
|
210 case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) :
|
cannam@85
|
211 case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) :
|
cannam@85
|
212 psf->write_short = pcm_write_s2uc ;
|
cannam@85
|
213 psf->write_int = pcm_write_i2uc ;
|
cannam@85
|
214 psf->write_float = pcm_write_f2uc ;
|
cannam@85
|
215 psf->write_double = pcm_write_d2uc ;
|
cannam@85
|
216 break ;
|
cannam@85
|
217
|
cannam@85
|
218 case (2 * 0x10000 + SF_ENDIAN_BIG) :
|
cannam@85
|
219 psf->write_short = pcm_write_s2bes ;
|
cannam@85
|
220 psf->write_int = pcm_write_i2bes ;
|
cannam@85
|
221 psf->write_float = pcm_write_f2bes ;
|
cannam@85
|
222 psf->write_double = pcm_write_d2bes ;
|
cannam@85
|
223 break ;
|
cannam@85
|
224
|
cannam@85
|
225 case (3 * 0x10000 + SF_ENDIAN_BIG) :
|
cannam@85
|
226 psf->write_short = pcm_write_s2bet ;
|
cannam@85
|
227 psf->write_int = pcm_write_i2bet ;
|
cannam@85
|
228 psf->write_float = pcm_write_f2bet ;
|
cannam@85
|
229 psf->write_double = pcm_write_d2bet ;
|
cannam@85
|
230 break ;
|
cannam@85
|
231
|
cannam@85
|
232 case (4 * 0x10000 + SF_ENDIAN_BIG) :
|
cannam@85
|
233 psf->write_short = pcm_write_s2bei ;
|
cannam@85
|
234 psf->write_int = pcm_write_i2bei ;
|
cannam@85
|
235 psf->write_float = pcm_write_f2bei ;
|
cannam@85
|
236 psf->write_double = pcm_write_d2bei ;
|
cannam@85
|
237 break ;
|
cannam@85
|
238
|
cannam@85
|
239 case (2 * 0x10000 + SF_ENDIAN_LITTLE) :
|
cannam@85
|
240 psf->write_short = pcm_write_s2les ;
|
cannam@85
|
241 psf->write_int = pcm_write_i2les ;
|
cannam@85
|
242 psf->write_float = pcm_write_f2les ;
|
cannam@85
|
243 psf->write_double = pcm_write_d2les ;
|
cannam@85
|
244 break ;
|
cannam@85
|
245
|
cannam@85
|
246 case (3 * 0x10000 + SF_ENDIAN_LITTLE) :
|
cannam@85
|
247 psf->write_short = pcm_write_s2let ;
|
cannam@85
|
248 psf->write_int = pcm_write_i2let ;
|
cannam@85
|
249 psf->write_float = pcm_write_f2let ;
|
cannam@85
|
250 psf->write_double = pcm_write_d2let ;
|
cannam@85
|
251 break ;
|
cannam@85
|
252
|
cannam@85
|
253 case (4 * 0x10000 + SF_ENDIAN_LITTLE) :
|
cannam@85
|
254 psf->write_short = pcm_write_s2lei ;
|
cannam@85
|
255 psf->write_int = pcm_write_i2lei ;
|
cannam@85
|
256 psf->write_float = pcm_write_f2lei ;
|
cannam@85
|
257 psf->write_double = pcm_write_d2lei ;
|
cannam@85
|
258 break ;
|
cannam@85
|
259
|
cannam@85
|
260 default :
|
cannam@85
|
261 psf_log_printf (psf, "pcm.c returning SFE_UNIMPLEMENTED\nbytewidth %s endian %d\n", psf->bytewidth, psf->endian) ;
|
cannam@85
|
262 return SFE_UNIMPLEMENTED ;
|
cannam@85
|
263 } ;
|
cannam@85
|
264
|
cannam@85
|
265 } ;
|
cannam@85
|
266
|
cannam@85
|
267 if (psf->filelength > psf->dataoffset)
|
cannam@85
|
268 { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset :
|
cannam@85
|
269 psf->filelength - psf->dataoffset ;
|
cannam@85
|
270 }
|
cannam@85
|
271 else
|
cannam@85
|
272 psf->datalength = 0 ;
|
cannam@85
|
273
|
cannam@85
|
274 psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ;
|
cannam@85
|
275
|
cannam@85
|
276 return 0 ;
|
cannam@85
|
277 } /* pcm_init */
|
cannam@85
|
278
|
cannam@85
|
279 /*==============================================================================
|
cannam@85
|
280 */
|
cannam@85
|
281
|
cannam@85
|
282 static inline void
|
cannam@85
|
283 sc2s_array (signed char *src, int count, short *dest)
|
cannam@85
|
284 { while (--count >= 0)
|
cannam@85
|
285 { dest [count] = src [count] << 8 ;
|
cannam@85
|
286 } ;
|
cannam@85
|
287 } /* sc2s_array */
|
cannam@85
|
288
|
cannam@85
|
289 static inline void
|
cannam@85
|
290 uc2s_array (unsigned char *src, int count, short *dest)
|
cannam@85
|
291 { while (--count >= 0)
|
cannam@85
|
292 { dest [count] = (((short) src [count]) - 0x80) << 8 ;
|
cannam@85
|
293 } ;
|
cannam@85
|
294 } /* uc2s_array */
|
cannam@85
|
295
|
cannam@85
|
296 static inline void
|
cannam@85
|
297 let2s_array (tribyte *src, int count, short *dest)
|
cannam@85
|
298 { unsigned char *ucptr ;
|
cannam@85
|
299
|
cannam@85
|
300 ucptr = ((unsigned char*) src) + 3 * count ;
|
cannam@85
|
301 while (--count >= 0)
|
cannam@85
|
302 { ucptr -= 3 ;
|
cannam@85
|
303 dest [count] = LET2H_SHORT_PTR (ucptr) ;
|
cannam@85
|
304 } ;
|
cannam@85
|
305 } /* let2s_array */
|
cannam@85
|
306
|
cannam@85
|
307 static inline void
|
cannam@85
|
308 bet2s_array (tribyte *src, int count, short *dest)
|
cannam@85
|
309 { unsigned char *ucptr ;
|
cannam@85
|
310
|
cannam@85
|
311 ucptr = ((unsigned char*) src) + 3 * count ;
|
cannam@85
|
312 while (--count >= 0)
|
cannam@85
|
313 { ucptr -= 3 ;
|
cannam@85
|
314 dest [count] = BET2H_SHORT_PTR (ucptr) ;
|
cannam@85
|
315 } ;
|
cannam@85
|
316 } /* bet2s_array */
|
cannam@85
|
317
|
cannam@85
|
318 static inline void
|
cannam@85
|
319 lei2s_array (int *src, int count, short *dest)
|
cannam@85
|
320 { int value ;
|
cannam@85
|
321
|
cannam@85
|
322 while (--count >= 0)
|
cannam@85
|
323 { value = LEI2H_INT (src [count]) ;
|
cannam@85
|
324 dest [count] = value >> 16 ;
|
cannam@85
|
325 } ;
|
cannam@85
|
326 } /* lei2s_array */
|
cannam@85
|
327
|
cannam@85
|
328 static inline void
|
cannam@85
|
329 bei2s_array (int *src, int count, short *dest)
|
cannam@85
|
330 { int value ;
|
cannam@85
|
331
|
cannam@85
|
332 while (--count >= 0)
|
cannam@85
|
333 { value = BEI2H_INT (src [count]) ;
|
cannam@85
|
334 dest [count] = value >> 16 ;
|
cannam@85
|
335 } ;
|
cannam@85
|
336 } /* bei2s_array */
|
cannam@85
|
337
|
cannam@85
|
338 /*--------------------------------------------------------------------------
|
cannam@85
|
339 */
|
cannam@85
|
340
|
cannam@85
|
341 static inline void
|
cannam@85
|
342 sc2i_array (signed char *src, int count, int *dest)
|
cannam@85
|
343 { while (--count >= 0)
|
cannam@85
|
344 { dest [count] = ((int) src [count]) << 24 ;
|
cannam@85
|
345 } ;
|
cannam@85
|
346 } /* sc2i_array */
|
cannam@85
|
347
|
cannam@85
|
348 static inline void
|
cannam@85
|
349 uc2i_array (unsigned char *src, int count, int *dest)
|
cannam@85
|
350 { while (--count >= 0)
|
cannam@85
|
351 { dest [count] = (((int) src [count]) - 128) << 24 ;
|
cannam@85
|
352 } ;
|
cannam@85
|
353 } /* uc2i_array */
|
cannam@85
|
354
|
cannam@85
|
355 static inline void
|
cannam@85
|
356 bes2i_array (short *src, int count, int *dest)
|
cannam@85
|
357 { short value ;
|
cannam@85
|
358
|
cannam@85
|
359 while (--count >= 0)
|
cannam@85
|
360 { value = BES2H_SHORT (src [count]) ;
|
cannam@85
|
361 dest [count] = value << 16 ;
|
cannam@85
|
362 } ;
|
cannam@85
|
363 } /* bes2i_array */
|
cannam@85
|
364
|
cannam@85
|
365 static inline void
|
cannam@85
|
366 les2i_array (short *src, int count, int *dest)
|
cannam@85
|
367 { short value ;
|
cannam@85
|
368
|
cannam@85
|
369 while (--count >= 0)
|
cannam@85
|
370 { value = LES2H_SHORT (src [count]) ;
|
cannam@85
|
371 dest [count] = value << 16 ;
|
cannam@85
|
372 } ;
|
cannam@85
|
373 } /* les2i_array */
|
cannam@85
|
374
|
cannam@85
|
375 static inline void
|
cannam@85
|
376 bet2i_array (tribyte *src, int count, int *dest)
|
cannam@85
|
377 { unsigned char *ucptr ;
|
cannam@85
|
378
|
cannam@85
|
379 ucptr = ((unsigned char*) src) + 3 * count ;
|
cannam@85
|
380 while (--count >= 0)
|
cannam@85
|
381 { ucptr -= 3 ;
|
cannam@85
|
382 dest [count] = BET2H_INT_PTR (ucptr) ;
|
cannam@85
|
383 } ;
|
cannam@85
|
384 } /* bet2i_array */
|
cannam@85
|
385
|
cannam@85
|
386 static inline void
|
cannam@85
|
387 let2i_array (tribyte *src, int count, int *dest)
|
cannam@85
|
388 { unsigned char *ucptr ;
|
cannam@85
|
389
|
cannam@85
|
390 ucptr = ((unsigned char*) src) + 3 * count ;
|
cannam@85
|
391 while (--count >= 0)
|
cannam@85
|
392 { ucptr -= 3 ;
|
cannam@85
|
393 dest [count] = LET2H_INT_PTR (ucptr) ;
|
cannam@85
|
394 } ;
|
cannam@85
|
395 } /* let2i_array */
|
cannam@85
|
396
|
cannam@85
|
397 /*--------------------------------------------------------------------------
|
cannam@85
|
398 */
|
cannam@85
|
399
|
cannam@85
|
400 static inline void
|
cannam@85
|
401 sc2f_array (signed char *src, int count, float *dest, float normfact)
|
cannam@85
|
402 { while (--count >= 0)
|
cannam@85
|
403 dest [count] = ((float) src [count]) * normfact ;
|
cannam@85
|
404 } /* sc2f_array */
|
cannam@85
|
405
|
cannam@85
|
406 static inline void
|
cannam@85
|
407 uc2f_array (unsigned char *src, int count, float *dest, float normfact)
|
cannam@85
|
408 { while (--count >= 0)
|
cannam@85
|
409 dest [count] = (((int) src [count]) - 128) * normfact ;
|
cannam@85
|
410 } /* uc2f_array */
|
cannam@85
|
411
|
cannam@85
|
412 static inline void
|
cannam@85
|
413 les2f_array (short *src, int count, float *dest, float normfact)
|
cannam@85
|
414 { short value ;
|
cannam@85
|
415
|
cannam@85
|
416 while (--count >= 0)
|
cannam@85
|
417 { value = src [count] ;
|
cannam@85
|
418 value = LES2H_SHORT (value) ;
|
cannam@85
|
419 dest [count] = ((float) value) * normfact ;
|
cannam@85
|
420 } ;
|
cannam@85
|
421 } /* les2f_array */
|
cannam@85
|
422
|
cannam@85
|
423 static inline void
|
cannam@85
|
424 bes2f_array (short *src, int count, float *dest, float normfact)
|
cannam@85
|
425 { short value ;
|
cannam@85
|
426
|
cannam@85
|
427 while (--count >= 0)
|
cannam@85
|
428 { value = src [count] ;
|
cannam@85
|
429 value = BES2H_SHORT (value) ;
|
cannam@85
|
430 dest [count] = ((float) value) * normfact ;
|
cannam@85
|
431 } ;
|
cannam@85
|
432 } /* bes2f_array */
|
cannam@85
|
433
|
cannam@85
|
434 static inline void
|
cannam@85
|
435 let2f_array (tribyte *src, int count, float *dest, float normfact)
|
cannam@85
|
436 { unsigned char *ucptr ;
|
cannam@85
|
437 int value ;
|
cannam@85
|
438
|
cannam@85
|
439 ucptr = ((unsigned char*) src) + 3 * count ;
|
cannam@85
|
440 while (--count >= 0)
|
cannam@85
|
441 { ucptr -= 3 ;
|
cannam@85
|
442 value = LET2H_INT_PTR (ucptr) ;
|
cannam@85
|
443 dest [count] = ((float) value) * normfact ;
|
cannam@85
|
444 } ;
|
cannam@85
|
445 } /* let2f_array */
|
cannam@85
|
446
|
cannam@85
|
447 static inline void
|
cannam@85
|
448 bet2f_array (tribyte *src, int count, float *dest, float normfact)
|
cannam@85
|
449 { unsigned char *ucptr ;
|
cannam@85
|
450 int value ;
|
cannam@85
|
451
|
cannam@85
|
452 ucptr = ((unsigned char*) src) + 3 * count ;
|
cannam@85
|
453 while (--count >= 0)
|
cannam@85
|
454 { ucptr -= 3 ;
|
cannam@85
|
455 value = BET2H_INT_PTR (ucptr) ;
|
cannam@85
|
456 dest [count] = ((float) value) * normfact ;
|
cannam@85
|
457 } ;
|
cannam@85
|
458 } /* bet2f_array */
|
cannam@85
|
459
|
cannam@85
|
460 static inline void
|
cannam@85
|
461 lei2f_array (int *src, int count, float *dest, float normfact)
|
cannam@85
|
462 { int value ;
|
cannam@85
|
463
|
cannam@85
|
464 while (--count >= 0)
|
cannam@85
|
465 { value = src [count] ;
|
cannam@85
|
466 value = LEI2H_INT (value) ;
|
cannam@85
|
467 dest [count] = ((float) value) * normfact ;
|
cannam@85
|
468 } ;
|
cannam@85
|
469 } /* lei2f_array */
|
cannam@85
|
470
|
cannam@85
|
471 static inline void
|
cannam@85
|
472 bei2f_array (int *src, int count, float *dest, float normfact)
|
cannam@85
|
473 { int value ;
|
cannam@85
|
474
|
cannam@85
|
475 while (--count >= 0)
|
cannam@85
|
476 { value = src [count] ;
|
cannam@85
|
477 value = BEI2H_INT (value) ;
|
cannam@85
|
478 dest [count] = ((float) value) * normfact ;
|
cannam@85
|
479 } ;
|
cannam@85
|
480 } /* bei2f_array */
|
cannam@85
|
481
|
cannam@85
|
482 /*--------------------------------------------------------------------------
|
cannam@85
|
483 */
|
cannam@85
|
484
|
cannam@85
|
485 static inline void
|
cannam@85
|
486 sc2d_array (signed char *src, int count, double *dest, double normfact)
|
cannam@85
|
487 { while (--count >= 0)
|
cannam@85
|
488 dest [count] = ((double) src [count]) * normfact ;
|
cannam@85
|
489 } /* sc2d_array */
|
cannam@85
|
490
|
cannam@85
|
491 static inline void
|
cannam@85
|
492 uc2d_array (unsigned char *src, int count, double *dest, double normfact)
|
cannam@85
|
493 { while (--count >= 0)
|
cannam@85
|
494 dest [count] = (((int) src [count]) - 128) * normfact ;
|
cannam@85
|
495 } /* uc2d_array */
|
cannam@85
|
496
|
cannam@85
|
497 static inline void
|
cannam@85
|
498 les2d_array (short *src, int count, double *dest, double normfact)
|
cannam@85
|
499 { short value ;
|
cannam@85
|
500
|
cannam@85
|
501 while (--count >= 0)
|
cannam@85
|
502 { value = src [count] ;
|
cannam@85
|
503 value = LES2H_SHORT (value) ;
|
cannam@85
|
504 dest [count] = ((double) value) * normfact ;
|
cannam@85
|
505 } ;
|
cannam@85
|
506 } /* les2d_array */
|
cannam@85
|
507
|
cannam@85
|
508 static inline void
|
cannam@85
|
509 bes2d_array (short *src, int count, double *dest, double normfact)
|
cannam@85
|
510 { short value ;
|
cannam@85
|
511
|
cannam@85
|
512 while (--count >= 0)
|
cannam@85
|
513 { value = src [count] ;
|
cannam@85
|
514 value = BES2H_SHORT (value) ;
|
cannam@85
|
515 dest [count] = ((double) value) * normfact ;
|
cannam@85
|
516 } ;
|
cannam@85
|
517 } /* bes2d_array */
|
cannam@85
|
518
|
cannam@85
|
519 static inline void
|
cannam@85
|
520 let2d_array (tribyte *src, int count, double *dest, double normfact)
|
cannam@85
|
521 { unsigned char *ucptr ;
|
cannam@85
|
522 int value ;
|
cannam@85
|
523
|
cannam@85
|
524 ucptr = ((unsigned char*) src) + 3 * count ;
|
cannam@85
|
525 while (--count >= 0)
|
cannam@85
|
526 { ucptr -= 3 ;
|
cannam@85
|
527 value = LET2H_INT_PTR (ucptr) ;
|
cannam@85
|
528 dest [count] = ((double) value) * normfact ;
|
cannam@85
|
529 } ;
|
cannam@85
|
530 } /* let2d_array */
|
cannam@85
|
531
|
cannam@85
|
532 static inline void
|
cannam@85
|
533 bet2d_array (tribyte *src, int count, double *dest, double normfact)
|
cannam@85
|
534 { unsigned char *ucptr ;
|
cannam@85
|
535 int value ;
|
cannam@85
|
536
|
cannam@85
|
537 ucptr = ((unsigned char*) src) + 3 * count ;
|
cannam@85
|
538 while (--count >= 0)
|
cannam@85
|
539 { ucptr -= 3 ;
|
cannam@85
|
540 value = (ucptr [0] << 24) | (ucptr [1] << 16) | (ucptr [2] << 8) ;
|
cannam@85
|
541 dest [count] = ((double) value) * normfact ;
|
cannam@85
|
542 } ;
|
cannam@85
|
543 } /* bet2d_array */
|
cannam@85
|
544
|
cannam@85
|
545 static inline void
|
cannam@85
|
546 lei2d_array (int *src, int count, double *dest, double normfact)
|
cannam@85
|
547 { int value ;
|
cannam@85
|
548
|
cannam@85
|
549 while (--count >= 0)
|
cannam@85
|
550 { value = src [count] ;
|
cannam@85
|
551 value = LEI2H_INT (value) ;
|
cannam@85
|
552 dest [count] = ((double) value) * normfact ;
|
cannam@85
|
553 } ;
|
cannam@85
|
554 } /* lei2d_array */
|
cannam@85
|
555
|
cannam@85
|
556 static inline void
|
cannam@85
|
557 bei2d_array (int *src, int count, double *dest, double normfact)
|
cannam@85
|
558 { int value ;
|
cannam@85
|
559
|
cannam@85
|
560 while (--count >= 0)
|
cannam@85
|
561 { value = src [count] ;
|
cannam@85
|
562 value = BEI2H_INT (value) ;
|
cannam@85
|
563 dest [count] = ((double) value) * normfact ;
|
cannam@85
|
564 } ;
|
cannam@85
|
565 } /* bei2d_array */
|
cannam@85
|
566
|
cannam@85
|
567 /*--------------------------------------------------------------------------
|
cannam@85
|
568 */
|
cannam@85
|
569
|
cannam@85
|
570 static inline void
|
cannam@85
|
571 s2sc_array (const short *src, signed char *dest, int count)
|
cannam@85
|
572 { while (--count >= 0)
|
cannam@85
|
573 dest [count] = src [count] >> 8 ;
|
cannam@85
|
574 } /* s2sc_array */
|
cannam@85
|
575
|
cannam@85
|
576 static inline void
|
cannam@85
|
577 s2uc_array (const short *src, unsigned char *dest, int count)
|
cannam@85
|
578 { while (--count >= 0)
|
cannam@85
|
579 dest [count] = (src [count] >> 8) + 0x80 ;
|
cannam@85
|
580 } /* s2uc_array */
|
cannam@85
|
581
|
cannam@85
|
582 static inline void
|
cannam@85
|
583 s2let_array (const short *src, tribyte *dest, int count)
|
cannam@85
|
584 { unsigned char *ucptr ;
|
cannam@85
|
585
|
cannam@85
|
586 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
587 while (--count >= 0)
|
cannam@85
|
588 { ucptr -= 3 ;
|
cannam@85
|
589 ucptr [0] = 0 ;
|
cannam@85
|
590 ucptr [1] = src [count] ;
|
cannam@85
|
591 ucptr [2] = src [count] >> 8 ;
|
cannam@85
|
592 } ;
|
cannam@85
|
593 } /* s2let_array */
|
cannam@85
|
594
|
cannam@85
|
595 static inline void
|
cannam@85
|
596 s2bet_array (const short *src, tribyte *dest, int count)
|
cannam@85
|
597 { unsigned char *ucptr ;
|
cannam@85
|
598
|
cannam@85
|
599 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
600 while (--count >= 0)
|
cannam@85
|
601 { ucptr -= 3 ;
|
cannam@85
|
602 ucptr [2] = 0 ;
|
cannam@85
|
603 ucptr [1] = src [count] ;
|
cannam@85
|
604 ucptr [0] = src [count] >> 8 ;
|
cannam@85
|
605 } ;
|
cannam@85
|
606 } /* s2bet_array */
|
cannam@85
|
607
|
cannam@85
|
608 static inline void
|
cannam@85
|
609 s2lei_array (const short *src, int *dest, int count)
|
cannam@85
|
610 { unsigned char *ucptr ;
|
cannam@85
|
611
|
cannam@85
|
612 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
613 while (--count >= 0)
|
cannam@85
|
614 { ucptr -= 4 ;
|
cannam@85
|
615 ucptr [0] = 0 ;
|
cannam@85
|
616 ucptr [1] = 0 ;
|
cannam@85
|
617 ucptr [2] = src [count] ;
|
cannam@85
|
618 ucptr [3] = src [count] >> 8 ;
|
cannam@85
|
619 } ;
|
cannam@85
|
620 } /* s2lei_array */
|
cannam@85
|
621
|
cannam@85
|
622 static inline void
|
cannam@85
|
623 s2bei_array (const short *src, int *dest, int count)
|
cannam@85
|
624 { unsigned char *ucptr ;
|
cannam@85
|
625
|
cannam@85
|
626 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
627 while (--count >= 0)
|
cannam@85
|
628 { ucptr -= 4 ;
|
cannam@85
|
629 ucptr [0] = src [count] >> 8 ;
|
cannam@85
|
630 ucptr [1] = src [count] ;
|
cannam@85
|
631 ucptr [2] = 0 ;
|
cannam@85
|
632 ucptr [3] = 0 ;
|
cannam@85
|
633 } ;
|
cannam@85
|
634 } /* s2bei_array */
|
cannam@85
|
635
|
cannam@85
|
636 /*--------------------------------------------------------------------------
|
cannam@85
|
637 */
|
cannam@85
|
638
|
cannam@85
|
639 static inline void
|
cannam@85
|
640 i2sc_array (const int *src, signed char *dest, int count)
|
cannam@85
|
641 { while (--count >= 0)
|
cannam@85
|
642 dest [count] = (src [count] >> 24) ;
|
cannam@85
|
643 } /* i2sc_array */
|
cannam@85
|
644
|
cannam@85
|
645 static inline void
|
cannam@85
|
646 i2uc_array (const int *src, unsigned char *dest, int count)
|
cannam@85
|
647 { while (--count >= 0)
|
cannam@85
|
648 dest [count] = ((src [count] >> 24) + 128) ;
|
cannam@85
|
649 } /* i2uc_array */
|
cannam@85
|
650
|
cannam@85
|
651 static inline void
|
cannam@85
|
652 i2bes_array (const int *src, short *dest, int count)
|
cannam@85
|
653 { unsigned char *ucptr ;
|
cannam@85
|
654
|
cannam@85
|
655 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
656 while (--count >= 0)
|
cannam@85
|
657 { ucptr -= 2 ;
|
cannam@85
|
658 ucptr [0] = src [count] >> 24 ;
|
cannam@85
|
659 ucptr [1] = src [count] >> 16 ;
|
cannam@85
|
660 } ;
|
cannam@85
|
661 } /* i2bes_array */
|
cannam@85
|
662
|
cannam@85
|
663 static inline void
|
cannam@85
|
664 i2les_array (const int *src, short *dest, int count)
|
cannam@85
|
665 { unsigned char *ucptr ;
|
cannam@85
|
666
|
cannam@85
|
667 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
668 while (--count >= 0)
|
cannam@85
|
669 { ucptr -= 2 ;
|
cannam@85
|
670 ucptr [0] = src [count] >> 16 ;
|
cannam@85
|
671 ucptr [1] = src [count] >> 24 ;
|
cannam@85
|
672 } ;
|
cannam@85
|
673 } /* i2les_array */
|
cannam@85
|
674
|
cannam@85
|
675 static inline void
|
cannam@85
|
676 i2let_array (const int *src, tribyte *dest, int count)
|
cannam@85
|
677 { unsigned char *ucptr ;
|
cannam@85
|
678 int value ;
|
cannam@85
|
679
|
cannam@85
|
680 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
681 while (--count >= 0)
|
cannam@85
|
682 { ucptr -= 3 ;
|
cannam@85
|
683 value = src [count] >> 8 ;
|
cannam@85
|
684 ucptr [0] = value ;
|
cannam@85
|
685 ucptr [1] = value >> 8 ;
|
cannam@85
|
686 ucptr [2] = value >> 16 ;
|
cannam@85
|
687 } ;
|
cannam@85
|
688 } /* i2let_array */
|
cannam@85
|
689
|
cannam@85
|
690 static inline void
|
cannam@85
|
691 i2bet_array (const int *src, tribyte *dest, int count)
|
cannam@85
|
692 { unsigned char *ucptr ;
|
cannam@85
|
693 int value ;
|
cannam@85
|
694
|
cannam@85
|
695 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
696 while (--count >= 0)
|
cannam@85
|
697 { ucptr -= 3 ;
|
cannam@85
|
698 value = src [count] >> 8 ;
|
cannam@85
|
699 ucptr [2] = value ;
|
cannam@85
|
700 ucptr [1] = value >> 8 ;
|
cannam@85
|
701 ucptr [0] = value >> 16 ;
|
cannam@85
|
702 } ;
|
cannam@85
|
703 } /* i2bet_array */
|
cannam@85
|
704
|
cannam@85
|
705 /*===============================================================================================
|
cannam@85
|
706 */
|
cannam@85
|
707
|
cannam@85
|
708 static sf_count_t
|
cannam@85
|
709 pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
cannam@85
|
710 { int bufferlen, readcount ;
|
cannam@85
|
711 sf_count_t total = 0 ;
|
cannam@85
|
712
|
cannam@85
|
713 bufferlen = ARRAY_LEN (psf->u.scbuf) ;
|
cannam@85
|
714
|
cannam@85
|
715 while (len > 0)
|
cannam@85
|
716 { if (len < bufferlen)
|
cannam@85
|
717 bufferlen = (int) len ;
|
cannam@85
|
718 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
719 sc2s_array (psf->u.scbuf, readcount, ptr + total) ;
|
cannam@85
|
720 total += readcount ;
|
cannam@85
|
721 if (readcount < bufferlen)
|
cannam@85
|
722 break ;
|
cannam@85
|
723 len -= readcount ;
|
cannam@85
|
724 } ;
|
cannam@85
|
725
|
cannam@85
|
726 return total ;
|
cannam@85
|
727 } /* pcm_read_sc2s */
|
cannam@85
|
728
|
cannam@85
|
729 static sf_count_t
|
cannam@85
|
730 pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
cannam@85
|
731 { int bufferlen, readcount ;
|
cannam@85
|
732 sf_count_t total = 0 ;
|
cannam@85
|
733
|
cannam@85
|
734 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
cannam@85
|
735
|
cannam@85
|
736 while (len > 0)
|
cannam@85
|
737 { if (len < bufferlen)
|
cannam@85
|
738 bufferlen = (int) len ;
|
cannam@85
|
739 readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
|
cannam@85
|
740 uc2s_array (psf->u.ucbuf, readcount, ptr + total) ;
|
cannam@85
|
741 total += readcount ;
|
cannam@85
|
742 if (readcount < bufferlen)
|
cannam@85
|
743 break ;
|
cannam@85
|
744 len -= readcount ;
|
cannam@85
|
745 } ;
|
cannam@85
|
746
|
cannam@85
|
747 return total ;
|
cannam@85
|
748 } /* pcm_read_uc2s */
|
cannam@85
|
749
|
cannam@85
|
750 static sf_count_t
|
cannam@85
|
751 pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
cannam@85
|
752 { int total ;
|
cannam@85
|
753
|
cannam@85
|
754 total = psf_fread (ptr, sizeof (short), len, psf) ;
|
cannam@85
|
755 if (CPU_IS_LITTLE_ENDIAN)
|
cannam@85
|
756 endswap_short_array (ptr, len) ;
|
cannam@85
|
757
|
cannam@85
|
758 return total ;
|
cannam@85
|
759 } /* pcm_read_bes2s */
|
cannam@85
|
760
|
cannam@85
|
761 static sf_count_t
|
cannam@85
|
762 pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
cannam@85
|
763 { int total ;
|
cannam@85
|
764
|
cannam@85
|
765 total = psf_fread (ptr, sizeof (short), len, psf) ;
|
cannam@85
|
766 if (CPU_IS_BIG_ENDIAN)
|
cannam@85
|
767 endswap_short_array (ptr, len) ;
|
cannam@85
|
768
|
cannam@85
|
769 return total ;
|
cannam@85
|
770 } /* pcm_read_les2s */
|
cannam@85
|
771
|
cannam@85
|
772 static sf_count_t
|
cannam@85
|
773 pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
cannam@85
|
774 { int bufferlen, readcount ;
|
cannam@85
|
775 sf_count_t total = 0 ;
|
cannam@85
|
776
|
cannam@85
|
777 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
778
|
cannam@85
|
779 while (len > 0)
|
cannam@85
|
780 { if (len < bufferlen)
|
cannam@85
|
781 bufferlen = (int) len ;
|
cannam@85
|
782 readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
783 bet2s_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
|
cannam@85
|
784 total += readcount ;
|
cannam@85
|
785 if (readcount < bufferlen)
|
cannam@85
|
786 break ;
|
cannam@85
|
787 len -= readcount ;
|
cannam@85
|
788 } ;
|
cannam@85
|
789
|
cannam@85
|
790 return total ;
|
cannam@85
|
791 } /* pcm_read_bet2s */
|
cannam@85
|
792
|
cannam@85
|
793 static sf_count_t
|
cannam@85
|
794 pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
cannam@85
|
795 { int bufferlen, readcount ;
|
cannam@85
|
796 sf_count_t total = 0 ;
|
cannam@85
|
797
|
cannam@85
|
798 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
799
|
cannam@85
|
800 while (len > 0)
|
cannam@85
|
801 { if (len < bufferlen)
|
cannam@85
|
802 bufferlen = (int) len ;
|
cannam@85
|
803 readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
804 let2s_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
|
cannam@85
|
805 total += readcount ;
|
cannam@85
|
806 if (readcount < bufferlen)
|
cannam@85
|
807 break ;
|
cannam@85
|
808 len -= readcount ;
|
cannam@85
|
809 } ;
|
cannam@85
|
810
|
cannam@85
|
811 return total ;
|
cannam@85
|
812 } /* pcm_read_let2s */
|
cannam@85
|
813
|
cannam@85
|
814 static sf_count_t
|
cannam@85
|
815 pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
cannam@85
|
816 { int bufferlen, readcount ;
|
cannam@85
|
817 sf_count_t total = 0 ;
|
cannam@85
|
818
|
cannam@85
|
819 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
820
|
cannam@85
|
821 while (len > 0)
|
cannam@85
|
822 { if (len < bufferlen)
|
cannam@85
|
823 bufferlen = (int) len ;
|
cannam@85
|
824 readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
825 bei2s_array (psf->u.ibuf, readcount, ptr + total) ;
|
cannam@85
|
826 total += readcount ;
|
cannam@85
|
827 if (readcount < bufferlen)
|
cannam@85
|
828 break ;
|
cannam@85
|
829 len -= readcount ;
|
cannam@85
|
830 } ;
|
cannam@85
|
831
|
cannam@85
|
832 return total ;
|
cannam@85
|
833 } /* pcm_read_bei2s */
|
cannam@85
|
834
|
cannam@85
|
835 static sf_count_t
|
cannam@85
|
836 pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
|
cannam@85
|
837 { int bufferlen, readcount ;
|
cannam@85
|
838 sf_count_t total = 0 ;
|
cannam@85
|
839
|
cannam@85
|
840 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
841
|
cannam@85
|
842 while (len > 0)
|
cannam@85
|
843 { if (len < bufferlen)
|
cannam@85
|
844 bufferlen = (int) len ;
|
cannam@85
|
845 readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
846 lei2s_array (psf->u.ibuf, readcount, ptr + total) ;
|
cannam@85
|
847 total += readcount ;
|
cannam@85
|
848 if (readcount < bufferlen)
|
cannam@85
|
849 break ;
|
cannam@85
|
850 len -= readcount ;
|
cannam@85
|
851 } ;
|
cannam@85
|
852
|
cannam@85
|
853 return total ;
|
cannam@85
|
854 } /* pcm_read_lei2s */
|
cannam@85
|
855
|
cannam@85
|
856 /*-----------------------------------------------------------------------------------------------
|
cannam@85
|
857 */
|
cannam@85
|
858
|
cannam@85
|
859 static sf_count_t
|
cannam@85
|
860 pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
cannam@85
|
861 { int bufferlen, readcount ;
|
cannam@85
|
862 sf_count_t total = 0 ;
|
cannam@85
|
863
|
cannam@85
|
864 bufferlen = ARRAY_LEN (psf->u.scbuf) ;
|
cannam@85
|
865
|
cannam@85
|
866 while (len > 0)
|
cannam@85
|
867 { if (len < bufferlen)
|
cannam@85
|
868 bufferlen = (int) len ;
|
cannam@85
|
869 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
870 sc2i_array (psf->u.scbuf, readcount, ptr + total) ;
|
cannam@85
|
871 total += readcount ;
|
cannam@85
|
872 if (readcount < bufferlen)
|
cannam@85
|
873 break ;
|
cannam@85
|
874 len -= readcount ;
|
cannam@85
|
875 } ;
|
cannam@85
|
876
|
cannam@85
|
877 return total ;
|
cannam@85
|
878 } /* pcm_read_sc2i */
|
cannam@85
|
879
|
cannam@85
|
880 static sf_count_t
|
cannam@85
|
881 pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
cannam@85
|
882 { int bufferlen, readcount ;
|
cannam@85
|
883 sf_count_t total = 0 ;
|
cannam@85
|
884
|
cannam@85
|
885 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
cannam@85
|
886
|
cannam@85
|
887 while (len > 0)
|
cannam@85
|
888 { if (len < bufferlen)
|
cannam@85
|
889 bufferlen = (int) len ;
|
cannam@85
|
890 readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
|
cannam@85
|
891 uc2i_array (psf->u.ucbuf, readcount, ptr + total) ;
|
cannam@85
|
892 total += readcount ;
|
cannam@85
|
893 if (readcount < bufferlen)
|
cannam@85
|
894 break ;
|
cannam@85
|
895 len -= readcount ;
|
cannam@85
|
896 } ;
|
cannam@85
|
897
|
cannam@85
|
898 return total ;
|
cannam@85
|
899 } /* pcm_read_uc2i */
|
cannam@85
|
900
|
cannam@85
|
901 static sf_count_t
|
cannam@85
|
902 pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
cannam@85
|
903 { int bufferlen, readcount ;
|
cannam@85
|
904 sf_count_t total = 0 ;
|
cannam@85
|
905
|
cannam@85
|
906 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
907
|
cannam@85
|
908 while (len > 0)
|
cannam@85
|
909 { if (len < bufferlen)
|
cannam@85
|
910 bufferlen = (int) len ;
|
cannam@85
|
911 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
912 bes2i_array (psf->u.sbuf, readcount, ptr + total) ;
|
cannam@85
|
913 total += readcount ;
|
cannam@85
|
914 if (readcount < bufferlen)
|
cannam@85
|
915 break ;
|
cannam@85
|
916 len -= readcount ;
|
cannam@85
|
917 } ;
|
cannam@85
|
918
|
cannam@85
|
919 return total ;
|
cannam@85
|
920 } /* pcm_read_bes2i */
|
cannam@85
|
921
|
cannam@85
|
922 static sf_count_t
|
cannam@85
|
923 pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
cannam@85
|
924 { int bufferlen, readcount ;
|
cannam@85
|
925 sf_count_t total = 0 ;
|
cannam@85
|
926
|
cannam@85
|
927 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
928
|
cannam@85
|
929 while (len > 0)
|
cannam@85
|
930 { if (len < bufferlen)
|
cannam@85
|
931 bufferlen = (int) len ;
|
cannam@85
|
932 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
933 les2i_array (psf->u.sbuf, readcount, ptr + total) ;
|
cannam@85
|
934 total += readcount ;
|
cannam@85
|
935 if (readcount < bufferlen)
|
cannam@85
|
936 break ;
|
cannam@85
|
937 len -= readcount ;
|
cannam@85
|
938 } ;
|
cannam@85
|
939
|
cannam@85
|
940 return total ;
|
cannam@85
|
941 } /* pcm_read_les2i */
|
cannam@85
|
942
|
cannam@85
|
943 static sf_count_t
|
cannam@85
|
944 pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
cannam@85
|
945 { int bufferlen, readcount ;
|
cannam@85
|
946 sf_count_t total = 0 ;
|
cannam@85
|
947
|
cannam@85
|
948 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
949
|
cannam@85
|
950 while (len > 0)
|
cannam@85
|
951 { if (len < bufferlen)
|
cannam@85
|
952 bufferlen = (int) len ;
|
cannam@85
|
953 readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
954 bet2i_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
|
cannam@85
|
955 total += readcount ;
|
cannam@85
|
956 if (readcount < bufferlen)
|
cannam@85
|
957 break ;
|
cannam@85
|
958 len -= readcount ;
|
cannam@85
|
959 } ;
|
cannam@85
|
960
|
cannam@85
|
961 return total ;
|
cannam@85
|
962 } /* pcm_read_bet2i */
|
cannam@85
|
963
|
cannam@85
|
964 static sf_count_t
|
cannam@85
|
965 pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
cannam@85
|
966 { int bufferlen, readcount ;
|
cannam@85
|
967 sf_count_t total = 0 ;
|
cannam@85
|
968
|
cannam@85
|
969 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
970
|
cannam@85
|
971 while (len > 0)
|
cannam@85
|
972 { if (len < bufferlen)
|
cannam@85
|
973 bufferlen = (int) len ;
|
cannam@85
|
974 readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
975 let2i_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
|
cannam@85
|
976 total += readcount ;
|
cannam@85
|
977 if (readcount < bufferlen)
|
cannam@85
|
978 break ;
|
cannam@85
|
979 len -= readcount ;
|
cannam@85
|
980 } ;
|
cannam@85
|
981
|
cannam@85
|
982 return total ;
|
cannam@85
|
983 } /* pcm_read_let2i */
|
cannam@85
|
984
|
cannam@85
|
985 static sf_count_t
|
cannam@85
|
986 pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
cannam@85
|
987 { int total ;
|
cannam@85
|
988
|
cannam@85
|
989 total = psf_fread (ptr, sizeof (int), len, psf) ;
|
cannam@85
|
990 if (CPU_IS_LITTLE_ENDIAN)
|
cannam@85
|
991 endswap_int_array (ptr, len) ;
|
cannam@85
|
992
|
cannam@85
|
993 return total ;
|
cannam@85
|
994 } /* pcm_read_bei2i */
|
cannam@85
|
995
|
cannam@85
|
996 static sf_count_t
|
cannam@85
|
997 pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
|
cannam@85
|
998 { int total ;
|
cannam@85
|
999
|
cannam@85
|
1000 total = psf_fread (ptr, sizeof (int), len, psf) ;
|
cannam@85
|
1001 if (CPU_IS_BIG_ENDIAN)
|
cannam@85
|
1002 endswap_int_array (ptr, len) ;
|
cannam@85
|
1003
|
cannam@85
|
1004 return total ;
|
cannam@85
|
1005 } /* pcm_read_lei2i */
|
cannam@85
|
1006
|
cannam@85
|
1007 /*-----------------------------------------------------------------------------------------------
|
cannam@85
|
1008 */
|
cannam@85
|
1009
|
cannam@85
|
1010 static sf_count_t
|
cannam@85
|
1011 pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
cannam@85
|
1012 { int bufferlen, readcount ;
|
cannam@85
|
1013 sf_count_t total = 0 ;
|
cannam@85
|
1014 float normfact ;
|
cannam@85
|
1015
|
cannam@85
|
1016 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
|
cannam@85
|
1017
|
cannam@85
|
1018 bufferlen = ARRAY_LEN (psf->u.scbuf) ;
|
cannam@85
|
1019
|
cannam@85
|
1020 while (len > 0)
|
cannam@85
|
1021 { if (len < bufferlen)
|
cannam@85
|
1022 bufferlen = (int) len ;
|
cannam@85
|
1023 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
1024 sc2f_array (psf->u.scbuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1025 total += readcount ;
|
cannam@85
|
1026 if (readcount < bufferlen)
|
cannam@85
|
1027 break ;
|
cannam@85
|
1028 len -= readcount ;
|
cannam@85
|
1029 } ;
|
cannam@85
|
1030
|
cannam@85
|
1031 return total ;
|
cannam@85
|
1032 } /* pcm_read_sc2f */
|
cannam@85
|
1033
|
cannam@85
|
1034 static sf_count_t
|
cannam@85
|
1035 pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
cannam@85
|
1036 { int bufferlen, readcount ;
|
cannam@85
|
1037 sf_count_t total = 0 ;
|
cannam@85
|
1038 float normfact ;
|
cannam@85
|
1039
|
cannam@85
|
1040 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
|
cannam@85
|
1041
|
cannam@85
|
1042 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
cannam@85
|
1043
|
cannam@85
|
1044 while (len > 0)
|
cannam@85
|
1045 { if (len < bufferlen)
|
cannam@85
|
1046 bufferlen = (int) len ;
|
cannam@85
|
1047 readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
|
cannam@85
|
1048 uc2f_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1049 total += readcount ;
|
cannam@85
|
1050 if (readcount < bufferlen)
|
cannam@85
|
1051 break ;
|
cannam@85
|
1052 len -= readcount ;
|
cannam@85
|
1053 } ;
|
cannam@85
|
1054
|
cannam@85
|
1055 return total ;
|
cannam@85
|
1056 } /* pcm_read_uc2f */
|
cannam@85
|
1057
|
cannam@85
|
1058 static sf_count_t
|
cannam@85
|
1059 pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
cannam@85
|
1060 { int bufferlen, readcount ;
|
cannam@85
|
1061 sf_count_t total = 0 ;
|
cannam@85
|
1062 float normfact ;
|
cannam@85
|
1063
|
cannam@85
|
1064 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
|
cannam@85
|
1065
|
cannam@85
|
1066 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1067
|
cannam@85
|
1068 while (len > 0)
|
cannam@85
|
1069 { if (len < bufferlen)
|
cannam@85
|
1070 bufferlen = (int) len ;
|
cannam@85
|
1071 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1072 bes2f_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1073 total += readcount ;
|
cannam@85
|
1074 if (readcount < bufferlen)
|
cannam@85
|
1075 break ;
|
cannam@85
|
1076 len -= readcount ;
|
cannam@85
|
1077 } ;
|
cannam@85
|
1078
|
cannam@85
|
1079 return total ;
|
cannam@85
|
1080 } /* pcm_read_bes2f */
|
cannam@85
|
1081
|
cannam@85
|
1082 static sf_count_t
|
cannam@85
|
1083 pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
cannam@85
|
1084 { int bufferlen, readcount ;
|
cannam@85
|
1085 sf_count_t total = 0 ;
|
cannam@85
|
1086 float normfact ;
|
cannam@85
|
1087
|
cannam@85
|
1088 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
|
cannam@85
|
1089
|
cannam@85
|
1090 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1091
|
cannam@85
|
1092 while (len > 0)
|
cannam@85
|
1093 { if (len < bufferlen)
|
cannam@85
|
1094 bufferlen = (int) len ;
|
cannam@85
|
1095 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1096 les2f_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1097 total += readcount ;
|
cannam@85
|
1098 if (readcount < bufferlen)
|
cannam@85
|
1099 break ;
|
cannam@85
|
1100 len -= readcount ;
|
cannam@85
|
1101 } ;
|
cannam@85
|
1102
|
cannam@85
|
1103 return total ;
|
cannam@85
|
1104 } /* pcm_read_les2f */
|
cannam@85
|
1105
|
cannam@85
|
1106 static sf_count_t
|
cannam@85
|
1107 pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
cannam@85
|
1108 { int bufferlen, readcount ;
|
cannam@85
|
1109 sf_count_t total = 0 ;
|
cannam@85
|
1110 float normfact ;
|
cannam@85
|
1111
|
cannam@85
|
1112 /* Special normfactor because tribyte value is read into an int. */
|
cannam@85
|
1113 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ;
|
cannam@85
|
1114
|
cannam@85
|
1115 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
1116
|
cannam@85
|
1117 while (len > 0)
|
cannam@85
|
1118 { if (len < bufferlen)
|
cannam@85
|
1119 bufferlen = (int) len ;
|
cannam@85
|
1120 readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
1121 bet2f_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
|
cannam@85
|
1122 total += readcount ;
|
cannam@85
|
1123 if (readcount < bufferlen)
|
cannam@85
|
1124 break ;
|
cannam@85
|
1125 len -= readcount ;
|
cannam@85
|
1126 } ;
|
cannam@85
|
1127
|
cannam@85
|
1128 return total ;
|
cannam@85
|
1129 } /* pcm_read_bet2f */
|
cannam@85
|
1130
|
cannam@85
|
1131 static sf_count_t
|
cannam@85
|
1132 pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
cannam@85
|
1133 { int bufferlen, readcount ;
|
cannam@85
|
1134 sf_count_t total = 0 ;
|
cannam@85
|
1135 float normfact ;
|
cannam@85
|
1136
|
cannam@85
|
1137 /* Special normfactor because tribyte value is read into an int. */
|
cannam@85
|
1138 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ;
|
cannam@85
|
1139
|
cannam@85
|
1140 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
1141
|
cannam@85
|
1142 while (len > 0)
|
cannam@85
|
1143 { if (len < bufferlen)
|
cannam@85
|
1144 bufferlen = (int) len ;
|
cannam@85
|
1145 readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
1146 let2f_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
|
cannam@85
|
1147 total += readcount ;
|
cannam@85
|
1148 if (readcount < bufferlen)
|
cannam@85
|
1149 break ;
|
cannam@85
|
1150 len -= readcount ;
|
cannam@85
|
1151 } ;
|
cannam@85
|
1152
|
cannam@85
|
1153 return total ;
|
cannam@85
|
1154 } /* pcm_read_let2f */
|
cannam@85
|
1155
|
cannam@85
|
1156 static sf_count_t
|
cannam@85
|
1157 pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
cannam@85
|
1158 { int bufferlen, readcount ;
|
cannam@85
|
1159 sf_count_t total = 0 ;
|
cannam@85
|
1160 float normfact ;
|
cannam@85
|
1161
|
cannam@85
|
1162 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
|
cannam@85
|
1163
|
cannam@85
|
1164 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
1165
|
cannam@85
|
1166 while (len > 0)
|
cannam@85
|
1167 { if (len < bufferlen)
|
cannam@85
|
1168 bufferlen = (int) len ;
|
cannam@85
|
1169 readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
1170 bei2f_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1171 total += readcount ;
|
cannam@85
|
1172 if (readcount < bufferlen)
|
cannam@85
|
1173 break ;
|
cannam@85
|
1174 len -= readcount ;
|
cannam@85
|
1175 } ;
|
cannam@85
|
1176
|
cannam@85
|
1177 return total ;
|
cannam@85
|
1178 } /* pcm_read_bei2f */
|
cannam@85
|
1179
|
cannam@85
|
1180 static sf_count_t
|
cannam@85
|
1181 pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
|
cannam@85
|
1182 { int bufferlen, readcount ;
|
cannam@85
|
1183 sf_count_t total = 0 ;
|
cannam@85
|
1184 float normfact ;
|
cannam@85
|
1185
|
cannam@85
|
1186 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
|
cannam@85
|
1187
|
cannam@85
|
1188 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
1189
|
cannam@85
|
1190 while (len > 0)
|
cannam@85
|
1191 { if (len < bufferlen)
|
cannam@85
|
1192 bufferlen = (int) len ;
|
cannam@85
|
1193 readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
1194 lei2f_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1195 total += readcount ;
|
cannam@85
|
1196 if (readcount < bufferlen)
|
cannam@85
|
1197 break ;
|
cannam@85
|
1198 len -= readcount ;
|
cannam@85
|
1199 } ;
|
cannam@85
|
1200
|
cannam@85
|
1201 return total ;
|
cannam@85
|
1202 } /* pcm_read_lei2f */
|
cannam@85
|
1203
|
cannam@85
|
1204 /*-----------------------------------------------------------------------------------------------
|
cannam@85
|
1205 */
|
cannam@85
|
1206
|
cannam@85
|
1207 static sf_count_t
|
cannam@85
|
1208 pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
cannam@85
|
1209 { int bufferlen, readcount ;
|
cannam@85
|
1210 sf_count_t total = 0 ;
|
cannam@85
|
1211 double normfact ;
|
cannam@85
|
1212
|
cannam@85
|
1213 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
|
cannam@85
|
1214
|
cannam@85
|
1215 bufferlen = ARRAY_LEN (psf->u.scbuf) ;
|
cannam@85
|
1216
|
cannam@85
|
1217 while (len > 0)
|
cannam@85
|
1218 { if (len < bufferlen)
|
cannam@85
|
1219 bufferlen = (int) len ;
|
cannam@85
|
1220 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
1221 sc2d_array (psf->u.scbuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1222 total += readcount ;
|
cannam@85
|
1223 if (readcount < bufferlen)
|
cannam@85
|
1224 break ;
|
cannam@85
|
1225 len -= readcount ;
|
cannam@85
|
1226 } ;
|
cannam@85
|
1227
|
cannam@85
|
1228 return total ;
|
cannam@85
|
1229 } /* pcm_read_sc2d */
|
cannam@85
|
1230
|
cannam@85
|
1231 static sf_count_t
|
cannam@85
|
1232 pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
cannam@85
|
1233 { int bufferlen, readcount ;
|
cannam@85
|
1234 sf_count_t total = 0 ;
|
cannam@85
|
1235 double normfact ;
|
cannam@85
|
1236
|
cannam@85
|
1237 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
|
cannam@85
|
1238
|
cannam@85
|
1239 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
cannam@85
|
1240
|
cannam@85
|
1241 while (len > 0)
|
cannam@85
|
1242 { if (len < bufferlen)
|
cannam@85
|
1243 bufferlen = (int) len ;
|
cannam@85
|
1244 readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
|
cannam@85
|
1245 uc2d_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1246 total += readcount ;
|
cannam@85
|
1247 if (readcount < bufferlen)
|
cannam@85
|
1248 break ;
|
cannam@85
|
1249 len -= readcount ;
|
cannam@85
|
1250 } ;
|
cannam@85
|
1251
|
cannam@85
|
1252 return total ;
|
cannam@85
|
1253 } /* pcm_read_uc2d */
|
cannam@85
|
1254
|
cannam@85
|
1255 static sf_count_t
|
cannam@85
|
1256 pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
cannam@85
|
1257 { int bufferlen, readcount ;
|
cannam@85
|
1258 sf_count_t total = 0 ;
|
cannam@85
|
1259 double normfact ;
|
cannam@85
|
1260
|
cannam@85
|
1261 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
|
cannam@85
|
1262
|
cannam@85
|
1263 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1264
|
cannam@85
|
1265 while (len > 0)
|
cannam@85
|
1266 { if (len < bufferlen)
|
cannam@85
|
1267 bufferlen = (int) len ;
|
cannam@85
|
1268 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1269 bes2d_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1270 total += readcount ;
|
cannam@85
|
1271 if (readcount < bufferlen)
|
cannam@85
|
1272 break ;
|
cannam@85
|
1273 len -= readcount ;
|
cannam@85
|
1274 } ;
|
cannam@85
|
1275
|
cannam@85
|
1276 return total ;
|
cannam@85
|
1277 } /* pcm_read_bes2d */
|
cannam@85
|
1278
|
cannam@85
|
1279 static sf_count_t
|
cannam@85
|
1280 pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
cannam@85
|
1281 { int bufferlen, readcount ;
|
cannam@85
|
1282 sf_count_t total = 0 ;
|
cannam@85
|
1283 double normfact ;
|
cannam@85
|
1284
|
cannam@85
|
1285 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
|
cannam@85
|
1286
|
cannam@85
|
1287 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1288
|
cannam@85
|
1289 while (len > 0)
|
cannam@85
|
1290 { if (len < bufferlen)
|
cannam@85
|
1291 bufferlen = (int) len ;
|
cannam@85
|
1292 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1293 les2d_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1294 total += readcount ;
|
cannam@85
|
1295 if (readcount < bufferlen)
|
cannam@85
|
1296 break ;
|
cannam@85
|
1297 len -= readcount ;
|
cannam@85
|
1298 } ;
|
cannam@85
|
1299
|
cannam@85
|
1300 return total ;
|
cannam@85
|
1301 } /* pcm_read_les2d */
|
cannam@85
|
1302
|
cannam@85
|
1303 static sf_count_t
|
cannam@85
|
1304 pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
cannam@85
|
1305 { int bufferlen, readcount ;
|
cannam@85
|
1306 sf_count_t total = 0 ;
|
cannam@85
|
1307 double normfact ;
|
cannam@85
|
1308
|
cannam@85
|
1309 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ;
|
cannam@85
|
1310
|
cannam@85
|
1311 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
1312
|
cannam@85
|
1313 while (len > 0)
|
cannam@85
|
1314 { if (len < bufferlen)
|
cannam@85
|
1315 bufferlen = (int) len ;
|
cannam@85
|
1316 readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
1317 bet2d_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
|
cannam@85
|
1318 total += readcount ;
|
cannam@85
|
1319 if (readcount < bufferlen)
|
cannam@85
|
1320 break ;
|
cannam@85
|
1321 len -= readcount ;
|
cannam@85
|
1322 } ;
|
cannam@85
|
1323
|
cannam@85
|
1324 return total ;
|
cannam@85
|
1325 } /* pcm_read_bet2d */
|
cannam@85
|
1326
|
cannam@85
|
1327 static sf_count_t
|
cannam@85
|
1328 pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
cannam@85
|
1329 { int bufferlen, readcount ;
|
cannam@85
|
1330 sf_count_t total = 0 ;
|
cannam@85
|
1331 double normfact ;
|
cannam@85
|
1332
|
cannam@85
|
1333 /* Special normfactor because tribyte value is read into an int. */
|
cannam@85
|
1334 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ;
|
cannam@85
|
1335
|
cannam@85
|
1336 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
1337
|
cannam@85
|
1338 while (len > 0)
|
cannam@85
|
1339 { if (len < bufferlen)
|
cannam@85
|
1340 bufferlen = (int) len ;
|
cannam@85
|
1341 readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
1342 let2d_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
|
cannam@85
|
1343 total += readcount ;
|
cannam@85
|
1344 if (readcount < bufferlen)
|
cannam@85
|
1345 break ;
|
cannam@85
|
1346 len -= readcount ;
|
cannam@85
|
1347 } ;
|
cannam@85
|
1348
|
cannam@85
|
1349 return total ;
|
cannam@85
|
1350 } /* pcm_read_let2d */
|
cannam@85
|
1351
|
cannam@85
|
1352 static sf_count_t
|
cannam@85
|
1353 pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
cannam@85
|
1354 { int bufferlen, readcount ;
|
cannam@85
|
1355 sf_count_t total = 0 ;
|
cannam@85
|
1356 double normfact ;
|
cannam@85
|
1357
|
cannam@85
|
1358 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
|
cannam@85
|
1359
|
cannam@85
|
1360 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
1361
|
cannam@85
|
1362 while (len > 0)
|
cannam@85
|
1363 { if (len < bufferlen)
|
cannam@85
|
1364 bufferlen = (int) len ;
|
cannam@85
|
1365 readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
1366 bei2d_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1367 total += readcount ;
|
cannam@85
|
1368 if (readcount < bufferlen)
|
cannam@85
|
1369 break ;
|
cannam@85
|
1370 len -= readcount ;
|
cannam@85
|
1371 } ;
|
cannam@85
|
1372
|
cannam@85
|
1373 return total ;
|
cannam@85
|
1374 } /* pcm_read_bei2d */
|
cannam@85
|
1375
|
cannam@85
|
1376 static sf_count_t
|
cannam@85
|
1377 pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
|
cannam@85
|
1378 { int bufferlen, readcount ;
|
cannam@85
|
1379 sf_count_t total = 0 ;
|
cannam@85
|
1380 double normfact ;
|
cannam@85
|
1381
|
cannam@85
|
1382 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
|
cannam@85
|
1383
|
cannam@85
|
1384 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
1385
|
cannam@85
|
1386 while (len > 0)
|
cannam@85
|
1387 { if (len < bufferlen)
|
cannam@85
|
1388 bufferlen = (int) len ;
|
cannam@85
|
1389 readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
1390 lei2d_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
|
cannam@85
|
1391 total += readcount ;
|
cannam@85
|
1392 if (readcount < bufferlen)
|
cannam@85
|
1393 break ;
|
cannam@85
|
1394 len -= readcount ;
|
cannam@85
|
1395 } ;
|
cannam@85
|
1396
|
cannam@85
|
1397 return total ;
|
cannam@85
|
1398 } /* pcm_read_lei2d */
|
cannam@85
|
1399
|
cannam@85
|
1400 /*===============================================================================================
|
cannam@85
|
1401 **-----------------------------------------------------------------------------------------------
|
cannam@85
|
1402 **===============================================================================================
|
cannam@85
|
1403 */
|
cannam@85
|
1404
|
cannam@85
|
1405 static sf_count_t
|
cannam@85
|
1406 pcm_write_s2sc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
cannam@85
|
1407 { int bufferlen, writecount ;
|
cannam@85
|
1408 sf_count_t total = 0 ;
|
cannam@85
|
1409
|
cannam@85
|
1410 bufferlen = ARRAY_LEN (psf->u.scbuf) ;
|
cannam@85
|
1411
|
cannam@85
|
1412 while (len > 0)
|
cannam@85
|
1413 { if (len < bufferlen)
|
cannam@85
|
1414 bufferlen = (int) len ;
|
cannam@85
|
1415 s2sc_array (ptr + total, psf->u.scbuf, bufferlen) ;
|
cannam@85
|
1416 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
1417 total += writecount ;
|
cannam@85
|
1418 if (writecount < bufferlen)
|
cannam@85
|
1419 break ;
|
cannam@85
|
1420 len -= writecount ;
|
cannam@85
|
1421 } ;
|
cannam@85
|
1422
|
cannam@85
|
1423 return total ;
|
cannam@85
|
1424 } /* pcm_write_s2sc */
|
cannam@85
|
1425
|
cannam@85
|
1426 static sf_count_t
|
cannam@85
|
1427 pcm_write_s2uc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
cannam@85
|
1428 { int bufferlen, writecount ;
|
cannam@85
|
1429 sf_count_t total = 0 ;
|
cannam@85
|
1430
|
cannam@85
|
1431 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
cannam@85
|
1432
|
cannam@85
|
1433 while (len > 0)
|
cannam@85
|
1434 { if (len < bufferlen)
|
cannam@85
|
1435 bufferlen = (int) len ;
|
cannam@85
|
1436 s2uc_array (ptr + total, psf->u.ucbuf, bufferlen) ;
|
cannam@85
|
1437 writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
|
cannam@85
|
1438 total += writecount ;
|
cannam@85
|
1439 if (writecount < bufferlen)
|
cannam@85
|
1440 break ;
|
cannam@85
|
1441 len -= writecount ;
|
cannam@85
|
1442 } ;
|
cannam@85
|
1443
|
cannam@85
|
1444 return total ;
|
cannam@85
|
1445 } /* pcm_write_s2uc */
|
cannam@85
|
1446
|
cannam@85
|
1447 static sf_count_t
|
cannam@85
|
1448 pcm_write_s2bes (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
cannam@85
|
1449 { int bufferlen, writecount ;
|
cannam@85
|
1450 sf_count_t total = 0 ;
|
cannam@85
|
1451
|
cannam@85
|
1452 if (CPU_IS_BIG_ENDIAN)
|
cannam@85
|
1453 return psf_fwrite (ptr, sizeof (short), len, psf) ;
|
cannam@85
|
1454 else
|
cannam@85
|
1455
|
cannam@85
|
1456 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1457
|
cannam@85
|
1458 while (len > 0)
|
cannam@85
|
1459 { if (len < bufferlen)
|
cannam@85
|
1460 bufferlen = (int) len ;
|
cannam@85
|
1461 endswap_short_copy (psf->u.sbuf, ptr + total, bufferlen) ;
|
cannam@85
|
1462 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1463 total += writecount ;
|
cannam@85
|
1464 if (writecount < bufferlen)
|
cannam@85
|
1465 break ;
|
cannam@85
|
1466 len -= writecount ;
|
cannam@85
|
1467 } ;
|
cannam@85
|
1468
|
cannam@85
|
1469 return total ;
|
cannam@85
|
1470 } /* pcm_write_s2bes */
|
cannam@85
|
1471
|
cannam@85
|
1472 static sf_count_t
|
cannam@85
|
1473 pcm_write_s2les (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
cannam@85
|
1474 { int bufferlen, writecount ;
|
cannam@85
|
1475 sf_count_t total = 0 ;
|
cannam@85
|
1476
|
cannam@85
|
1477 if (CPU_IS_LITTLE_ENDIAN)
|
cannam@85
|
1478 return psf_fwrite (ptr, sizeof (short), len, psf) ;
|
cannam@85
|
1479
|
cannam@85
|
1480 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1481
|
cannam@85
|
1482 while (len > 0)
|
cannam@85
|
1483 { if (len < bufferlen)
|
cannam@85
|
1484 bufferlen = (int) len ;
|
cannam@85
|
1485 endswap_short_copy (psf->u.sbuf, ptr + total, bufferlen) ;
|
cannam@85
|
1486 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1487 total += writecount ;
|
cannam@85
|
1488 if (writecount < bufferlen)
|
cannam@85
|
1489 break ;
|
cannam@85
|
1490 len -= writecount ;
|
cannam@85
|
1491 } ;
|
cannam@85
|
1492
|
cannam@85
|
1493 return total ;
|
cannam@85
|
1494 } /* pcm_write_s2les */
|
cannam@85
|
1495
|
cannam@85
|
1496 static sf_count_t
|
cannam@85
|
1497 pcm_write_s2bet (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
cannam@85
|
1498 { int bufferlen, writecount ;
|
cannam@85
|
1499 sf_count_t total = 0 ;
|
cannam@85
|
1500
|
cannam@85
|
1501 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
1502
|
cannam@85
|
1503 while (len > 0)
|
cannam@85
|
1504 { if (len < bufferlen)
|
cannam@85
|
1505 bufferlen = (int) len ;
|
cannam@85
|
1506 s2bet_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
|
cannam@85
|
1507 writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
1508 total += writecount ;
|
cannam@85
|
1509 if (writecount < bufferlen)
|
cannam@85
|
1510 break ;
|
cannam@85
|
1511 len -= writecount ;
|
cannam@85
|
1512 } ;
|
cannam@85
|
1513
|
cannam@85
|
1514 return total ;
|
cannam@85
|
1515 } /* pcm_write_s2bet */
|
cannam@85
|
1516
|
cannam@85
|
1517 static sf_count_t
|
cannam@85
|
1518 pcm_write_s2let (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
cannam@85
|
1519 { int bufferlen, writecount ;
|
cannam@85
|
1520 sf_count_t total = 0 ;
|
cannam@85
|
1521
|
cannam@85
|
1522 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
1523
|
cannam@85
|
1524 while (len > 0)
|
cannam@85
|
1525 { if (len < bufferlen)
|
cannam@85
|
1526 bufferlen = (int) len ;
|
cannam@85
|
1527 s2let_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
|
cannam@85
|
1528 writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
1529 total += writecount ;
|
cannam@85
|
1530 if (writecount < bufferlen)
|
cannam@85
|
1531 break ;
|
cannam@85
|
1532 len -= writecount ;
|
cannam@85
|
1533 } ;
|
cannam@85
|
1534
|
cannam@85
|
1535 return total ;
|
cannam@85
|
1536 } /* pcm_write_s2let */
|
cannam@85
|
1537
|
cannam@85
|
1538 static sf_count_t
|
cannam@85
|
1539 pcm_write_s2bei (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
cannam@85
|
1540 { int bufferlen, writecount ;
|
cannam@85
|
1541 sf_count_t total = 0 ;
|
cannam@85
|
1542
|
cannam@85
|
1543 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
1544
|
cannam@85
|
1545 while (len > 0)
|
cannam@85
|
1546 { if (len < bufferlen)
|
cannam@85
|
1547 bufferlen = (int) len ;
|
cannam@85
|
1548 s2bei_array (ptr + total, psf->u.ibuf, bufferlen) ;
|
cannam@85
|
1549 writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
1550 total += writecount ;
|
cannam@85
|
1551 if (writecount < bufferlen)
|
cannam@85
|
1552 break ;
|
cannam@85
|
1553 len -= writecount ;
|
cannam@85
|
1554 } ;
|
cannam@85
|
1555
|
cannam@85
|
1556 return total ;
|
cannam@85
|
1557 } /* pcm_write_s2bei */
|
cannam@85
|
1558
|
cannam@85
|
1559 static sf_count_t
|
cannam@85
|
1560 pcm_write_s2lei (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
|
cannam@85
|
1561 { int bufferlen, writecount ;
|
cannam@85
|
1562 sf_count_t total = 0 ;
|
cannam@85
|
1563
|
cannam@85
|
1564 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
1565
|
cannam@85
|
1566 while (len > 0)
|
cannam@85
|
1567 { if (len < bufferlen)
|
cannam@85
|
1568 bufferlen = (int) len ;
|
cannam@85
|
1569 s2lei_array (ptr + total, psf->u.ibuf, bufferlen) ;
|
cannam@85
|
1570 writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
1571 total += writecount ;
|
cannam@85
|
1572 if (writecount < bufferlen)
|
cannam@85
|
1573 break ;
|
cannam@85
|
1574 len -= writecount ;
|
cannam@85
|
1575 } ;
|
cannam@85
|
1576
|
cannam@85
|
1577 return total ;
|
cannam@85
|
1578 } /* pcm_write_s2lei */
|
cannam@85
|
1579
|
cannam@85
|
1580 /*-----------------------------------------------------------------------------------------------
|
cannam@85
|
1581 */
|
cannam@85
|
1582
|
cannam@85
|
1583 static sf_count_t
|
cannam@85
|
1584 pcm_write_i2sc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
cannam@85
|
1585 { int bufferlen, writecount ;
|
cannam@85
|
1586 sf_count_t total = 0 ;
|
cannam@85
|
1587
|
cannam@85
|
1588 bufferlen = ARRAY_LEN (psf->u.scbuf) ;
|
cannam@85
|
1589
|
cannam@85
|
1590 while (len > 0)
|
cannam@85
|
1591 { if (len < bufferlen)
|
cannam@85
|
1592 bufferlen = (int) len ;
|
cannam@85
|
1593 i2sc_array (ptr + total, psf->u.scbuf, bufferlen) ;
|
cannam@85
|
1594 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
1595 total += writecount ;
|
cannam@85
|
1596 if (writecount < bufferlen)
|
cannam@85
|
1597 break ;
|
cannam@85
|
1598 len -= writecount ;
|
cannam@85
|
1599 } ;
|
cannam@85
|
1600
|
cannam@85
|
1601 return total ;
|
cannam@85
|
1602 } /* pcm_write_i2sc */
|
cannam@85
|
1603
|
cannam@85
|
1604 static sf_count_t
|
cannam@85
|
1605 pcm_write_i2uc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
cannam@85
|
1606 { int bufferlen, writecount ;
|
cannam@85
|
1607 sf_count_t total = 0 ;
|
cannam@85
|
1608
|
cannam@85
|
1609 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
cannam@85
|
1610
|
cannam@85
|
1611 while (len > 0)
|
cannam@85
|
1612 { if (len < bufferlen)
|
cannam@85
|
1613 bufferlen = (int) len ;
|
cannam@85
|
1614 i2uc_array (ptr + total, psf->u.ucbuf, bufferlen) ;
|
cannam@85
|
1615 writecount = psf_fwrite (psf->u.ucbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
1616 total += writecount ;
|
cannam@85
|
1617 if (writecount < bufferlen)
|
cannam@85
|
1618 break ;
|
cannam@85
|
1619 len -= writecount ;
|
cannam@85
|
1620 } ;
|
cannam@85
|
1621
|
cannam@85
|
1622 return total ;
|
cannam@85
|
1623 } /* pcm_write_i2uc */
|
cannam@85
|
1624
|
cannam@85
|
1625 static sf_count_t
|
cannam@85
|
1626 pcm_write_i2bes (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
cannam@85
|
1627 { int bufferlen, writecount ;
|
cannam@85
|
1628 sf_count_t total = 0 ;
|
cannam@85
|
1629
|
cannam@85
|
1630 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1631
|
cannam@85
|
1632 while (len > 0)
|
cannam@85
|
1633 { if (len < bufferlen)
|
cannam@85
|
1634 bufferlen = (int) len ;
|
cannam@85
|
1635 i2bes_array (ptr + total, psf->u.sbuf, bufferlen) ;
|
cannam@85
|
1636 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1637 total += writecount ;
|
cannam@85
|
1638 if (writecount < bufferlen)
|
cannam@85
|
1639 break ;
|
cannam@85
|
1640 len -= writecount ;
|
cannam@85
|
1641 } ;
|
cannam@85
|
1642
|
cannam@85
|
1643 return total ;
|
cannam@85
|
1644 } /* pcm_write_i2bes */
|
cannam@85
|
1645
|
cannam@85
|
1646 static sf_count_t
|
cannam@85
|
1647 pcm_write_i2les (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
cannam@85
|
1648 { int bufferlen, writecount ;
|
cannam@85
|
1649 sf_count_t total = 0 ;
|
cannam@85
|
1650
|
cannam@85
|
1651 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1652
|
cannam@85
|
1653 while (len > 0)
|
cannam@85
|
1654 { if (len < bufferlen)
|
cannam@85
|
1655 bufferlen = (int) len ;
|
cannam@85
|
1656 i2les_array (ptr + total, psf->u.sbuf, bufferlen) ;
|
cannam@85
|
1657 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1658 total += writecount ;
|
cannam@85
|
1659 if (writecount < bufferlen)
|
cannam@85
|
1660 break ;
|
cannam@85
|
1661 len -= writecount ;
|
cannam@85
|
1662 } ;
|
cannam@85
|
1663
|
cannam@85
|
1664 return total ;
|
cannam@85
|
1665 } /* pcm_write_i2les */
|
cannam@85
|
1666
|
cannam@85
|
1667 static sf_count_t
|
cannam@85
|
1668 pcm_write_i2bet (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
cannam@85
|
1669 { int bufferlen, writecount ;
|
cannam@85
|
1670 sf_count_t total = 0 ;
|
cannam@85
|
1671
|
cannam@85
|
1672 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
1673
|
cannam@85
|
1674 while (len > 0)
|
cannam@85
|
1675 { if (len < bufferlen)
|
cannam@85
|
1676 bufferlen = (int) len ;
|
cannam@85
|
1677 i2bet_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
|
cannam@85
|
1678 writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
1679 total += writecount ;
|
cannam@85
|
1680 if (writecount < bufferlen)
|
cannam@85
|
1681 break ;
|
cannam@85
|
1682 len -= writecount ;
|
cannam@85
|
1683 } ;
|
cannam@85
|
1684
|
cannam@85
|
1685 return total ;
|
cannam@85
|
1686 } /* pcm_write_i2bet */
|
cannam@85
|
1687
|
cannam@85
|
1688 static sf_count_t
|
cannam@85
|
1689 pcm_write_i2let (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
cannam@85
|
1690 { int bufferlen, writecount ;
|
cannam@85
|
1691 sf_count_t total = 0 ;
|
cannam@85
|
1692
|
cannam@85
|
1693 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
1694
|
cannam@85
|
1695 while (len > 0)
|
cannam@85
|
1696 { if (len < bufferlen)
|
cannam@85
|
1697 bufferlen = (int) len ;
|
cannam@85
|
1698 i2let_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
|
cannam@85
|
1699 writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
1700 total += writecount ;
|
cannam@85
|
1701 if (writecount < bufferlen)
|
cannam@85
|
1702 break ;
|
cannam@85
|
1703 len -= writecount ;
|
cannam@85
|
1704 } ;
|
cannam@85
|
1705
|
cannam@85
|
1706 return total ;
|
cannam@85
|
1707 } /* pcm_write_i2les */
|
cannam@85
|
1708
|
cannam@85
|
1709 static sf_count_t
|
cannam@85
|
1710 pcm_write_i2bei (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
cannam@85
|
1711 { int bufferlen, writecount ;
|
cannam@85
|
1712 sf_count_t total = 0 ;
|
cannam@85
|
1713
|
cannam@85
|
1714 if (CPU_IS_BIG_ENDIAN)
|
cannam@85
|
1715 return psf_fwrite (ptr, sizeof (int), len, psf) ;
|
cannam@85
|
1716
|
cannam@85
|
1717 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
1718
|
cannam@85
|
1719 while (len > 0)
|
cannam@85
|
1720 { if (len < bufferlen)
|
cannam@85
|
1721 bufferlen = (int) len ;
|
cannam@85
|
1722 endswap_int_copy (psf->u.ibuf, ptr + total, bufferlen) ;
|
cannam@85
|
1723 writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
1724 total += writecount ;
|
cannam@85
|
1725 if (writecount < bufferlen)
|
cannam@85
|
1726 break ;
|
cannam@85
|
1727 len -= writecount ;
|
cannam@85
|
1728 } ;
|
cannam@85
|
1729
|
cannam@85
|
1730 return total ;
|
cannam@85
|
1731 } /* pcm_write_i2bei */
|
cannam@85
|
1732
|
cannam@85
|
1733 static sf_count_t
|
cannam@85
|
1734 pcm_write_i2lei (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
|
cannam@85
|
1735 { int bufferlen, writecount ;
|
cannam@85
|
1736 sf_count_t total = 0 ;
|
cannam@85
|
1737
|
cannam@85
|
1738 if (CPU_IS_LITTLE_ENDIAN)
|
cannam@85
|
1739 return psf_fwrite (ptr, sizeof (int), len, psf) ;
|
cannam@85
|
1740
|
cannam@85
|
1741 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
1742
|
cannam@85
|
1743 while (len > 0)
|
cannam@85
|
1744 { if (len < bufferlen)
|
cannam@85
|
1745 bufferlen = (int) len ;
|
cannam@85
|
1746 endswap_int_copy (psf->u.ibuf, ptr + total, bufferlen) ;
|
cannam@85
|
1747 writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
1748 total += writecount ;
|
cannam@85
|
1749 if (writecount < bufferlen)
|
cannam@85
|
1750 break ;
|
cannam@85
|
1751 len -= writecount ;
|
cannam@85
|
1752 } ;
|
cannam@85
|
1753
|
cannam@85
|
1754 return total ;
|
cannam@85
|
1755 } /* pcm_write_i2lei */
|
cannam@85
|
1756
|
cannam@85
|
1757 /*------------------------------------------------------------------------------
|
cannam@85
|
1758 **==============================================================================
|
cannam@85
|
1759 **------------------------------------------------------------------------------
|
cannam@85
|
1760 */
|
cannam@85
|
1761
|
cannam@85
|
1762 static void
|
cannam@85
|
1763 f2sc_array (const float *src, signed char *dest, int count, int normalize)
|
cannam@85
|
1764 { float normfact ;
|
cannam@85
|
1765
|
cannam@85
|
1766 normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
|
cannam@85
|
1767
|
cannam@85
|
1768 while (--count >= 0)
|
cannam@85
|
1769 { dest [count] = lrintf (src [count] * normfact) ;
|
cannam@85
|
1770 } ;
|
cannam@85
|
1771 } /* f2sc_array */
|
cannam@85
|
1772
|
cannam@85
|
1773 static void
|
cannam@85
|
1774 f2sc_clip_array (const float *src, signed char *dest, int count, int normalize)
|
cannam@85
|
1775 { float normfact, scaled_value ;
|
cannam@85
|
1776
|
cannam@85
|
1777 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ;
|
cannam@85
|
1778
|
cannam@85
|
1779 while (--count >= 0)
|
cannam@85
|
1780 { scaled_value = src [count] * normfact ;
|
cannam@85
|
1781 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
1782 { dest [count] = 127 ;
|
cannam@85
|
1783 continue ;
|
cannam@85
|
1784 } ;
|
cannam@85
|
1785 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
1786 { dest [count] = -128 ;
|
cannam@85
|
1787 continue ;
|
cannam@85
|
1788 } ;
|
cannam@85
|
1789
|
cannam@85
|
1790 dest [count] = lrintf (scaled_value) >> 24 ;
|
cannam@85
|
1791 } ;
|
cannam@85
|
1792 } /* f2sc_clip_array */
|
cannam@85
|
1793
|
cannam@85
|
1794 static sf_count_t
|
cannam@85
|
1795 pcm_write_f2sc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
cannam@85
|
1796 { void (*convert) (const float *, signed char *, int, int) ;
|
cannam@85
|
1797 int bufferlen, writecount ;
|
cannam@85
|
1798 sf_count_t total = 0 ;
|
cannam@85
|
1799
|
cannam@85
|
1800 convert = (psf->add_clipping) ? f2sc_clip_array : f2sc_array ;
|
cannam@85
|
1801 bufferlen = ARRAY_LEN (psf->u.scbuf) ;
|
cannam@85
|
1802
|
cannam@85
|
1803 while (len > 0)
|
cannam@85
|
1804 { if (len < bufferlen)
|
cannam@85
|
1805 bufferlen = (int) len ;
|
cannam@85
|
1806 convert (ptr + total, psf->u.scbuf, bufferlen, psf->norm_float) ;
|
cannam@85
|
1807 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
1808 total += writecount ;
|
cannam@85
|
1809 if (writecount < bufferlen)
|
cannam@85
|
1810 break ;
|
cannam@85
|
1811 len -= writecount ;
|
cannam@85
|
1812 } ;
|
cannam@85
|
1813
|
cannam@85
|
1814 return total ;
|
cannam@85
|
1815 } /* pcm_write_f2sc */
|
cannam@85
|
1816
|
cannam@85
|
1817 /*==============================================================================
|
cannam@85
|
1818 */
|
cannam@85
|
1819
|
cannam@85
|
1820 static void
|
cannam@85
|
1821 f2uc_array (const float *src, unsigned char *dest, int count, int normalize)
|
cannam@85
|
1822 { float normfact ;
|
cannam@85
|
1823
|
cannam@85
|
1824 normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
|
cannam@85
|
1825
|
cannam@85
|
1826 while (--count >= 0)
|
cannam@85
|
1827 { dest [count] = lrintf (src [count] * normfact) + 128 ;
|
cannam@85
|
1828 } ;
|
cannam@85
|
1829 } /* f2uc_array */
|
cannam@85
|
1830
|
cannam@85
|
1831 static void
|
cannam@85
|
1832 f2uc_clip_array (const float *src, unsigned char *dest, int count, int normalize)
|
cannam@85
|
1833 { float normfact, scaled_value ;
|
cannam@85
|
1834
|
cannam@85
|
1835 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ;
|
cannam@85
|
1836
|
cannam@85
|
1837 while (--count >= 0)
|
cannam@85
|
1838 { scaled_value = src [count] * normfact ;
|
cannam@85
|
1839 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
1840 { dest [count] = 0xFF ;
|
cannam@85
|
1841 continue ;
|
cannam@85
|
1842 } ;
|
cannam@85
|
1843 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
1844 { dest [count] = 0 ;
|
cannam@85
|
1845 continue ;
|
cannam@85
|
1846 } ;
|
cannam@85
|
1847
|
cannam@85
|
1848 dest [count] = (lrintf (scaled_value) >> 24) + 128 ;
|
cannam@85
|
1849 } ;
|
cannam@85
|
1850 } /* f2uc_clip_array */
|
cannam@85
|
1851
|
cannam@85
|
1852 static sf_count_t
|
cannam@85
|
1853 pcm_write_f2uc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
cannam@85
|
1854 { void (*convert) (const float *, unsigned char *, int, int) ;
|
cannam@85
|
1855 int bufferlen, writecount ;
|
cannam@85
|
1856 sf_count_t total = 0 ;
|
cannam@85
|
1857
|
cannam@85
|
1858 convert = (psf->add_clipping) ? f2uc_clip_array : f2uc_array ;
|
cannam@85
|
1859 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
cannam@85
|
1860
|
cannam@85
|
1861 while (len > 0)
|
cannam@85
|
1862 { if (len < bufferlen)
|
cannam@85
|
1863 bufferlen = (int) len ;
|
cannam@85
|
1864 convert (ptr + total, psf->u.ucbuf, bufferlen, psf->norm_float) ;
|
cannam@85
|
1865 writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
|
cannam@85
|
1866 total += writecount ;
|
cannam@85
|
1867 if (writecount < bufferlen)
|
cannam@85
|
1868 break ;
|
cannam@85
|
1869 len -= writecount ;
|
cannam@85
|
1870 } ;
|
cannam@85
|
1871
|
cannam@85
|
1872 return total ;
|
cannam@85
|
1873 } /* pcm_write_f2uc */
|
cannam@85
|
1874
|
cannam@85
|
1875 /*==============================================================================
|
cannam@85
|
1876 */
|
cannam@85
|
1877
|
cannam@85
|
1878 static void
|
cannam@85
|
1879 f2bes_array (const float *src, short *dest, int count, int normalize)
|
cannam@85
|
1880 { unsigned char *ucptr ;
|
cannam@85
|
1881 float normfact ;
|
cannam@85
|
1882 short value ;
|
cannam@85
|
1883
|
cannam@85
|
1884 normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
|
cannam@85
|
1885 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
1886
|
cannam@85
|
1887 while (--count >= 0)
|
cannam@85
|
1888 { ucptr -= 2 ;
|
cannam@85
|
1889 value = lrintf (src [count] * normfact) ;
|
cannam@85
|
1890 ucptr [1] = value ;
|
cannam@85
|
1891 ucptr [0] = value >> 8 ;
|
cannam@85
|
1892 } ;
|
cannam@85
|
1893 } /* f2bes_array */
|
cannam@85
|
1894
|
cannam@85
|
1895 static void
|
cannam@85
|
1896 f2bes_clip_array (const float *src, short *dest, int count, int normalize)
|
cannam@85
|
1897 { unsigned char *ucptr ;
|
cannam@85
|
1898 float normfact, scaled_value ;
|
cannam@85
|
1899 int value ;
|
cannam@85
|
1900
|
cannam@85
|
1901 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ;
|
cannam@85
|
1902 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
1903
|
cannam@85
|
1904 while (--count >= 0)
|
cannam@85
|
1905 { ucptr -= 2 ;
|
cannam@85
|
1906 scaled_value = src [count] * normfact ;
|
cannam@85
|
1907 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
1908 { ucptr [1] = 0xFF ;
|
cannam@85
|
1909 ucptr [0] = 0x7F ;
|
cannam@85
|
1910 continue ;
|
cannam@85
|
1911 } ;
|
cannam@85
|
1912 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
1913 { ucptr [1] = 0x00 ;
|
cannam@85
|
1914 ucptr [0] = 0x80 ;
|
cannam@85
|
1915 continue ;
|
cannam@85
|
1916 } ;
|
cannam@85
|
1917
|
cannam@85
|
1918 value = lrintf (scaled_value) ;
|
cannam@85
|
1919 ucptr [1] = value >> 16 ;
|
cannam@85
|
1920 ucptr [0] = value >> 24 ;
|
cannam@85
|
1921 } ;
|
cannam@85
|
1922 } /* f2bes_clip_array */
|
cannam@85
|
1923
|
cannam@85
|
1924 static sf_count_t
|
cannam@85
|
1925 pcm_write_f2bes (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
cannam@85
|
1926 { void (*convert) (const float *, short *t, int, int) ;
|
cannam@85
|
1927 int bufferlen, writecount ;
|
cannam@85
|
1928 sf_count_t total = 0 ;
|
cannam@85
|
1929
|
cannam@85
|
1930 convert = (psf->add_clipping) ? f2bes_clip_array : f2bes_array ;
|
cannam@85
|
1931 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
1932
|
cannam@85
|
1933 while (len > 0)
|
cannam@85
|
1934 { if (len < bufferlen)
|
cannam@85
|
1935 bufferlen = (int) len ;
|
cannam@85
|
1936 convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_float) ;
|
cannam@85
|
1937 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
1938 total += writecount ;
|
cannam@85
|
1939 if (writecount < bufferlen)
|
cannam@85
|
1940 break ;
|
cannam@85
|
1941 len -= writecount ;
|
cannam@85
|
1942 } ;
|
cannam@85
|
1943
|
cannam@85
|
1944 return total ;
|
cannam@85
|
1945 } /* pcm_write_f2bes */
|
cannam@85
|
1946
|
cannam@85
|
1947 /*==============================================================================
|
cannam@85
|
1948 */
|
cannam@85
|
1949
|
cannam@85
|
1950 static void
|
cannam@85
|
1951 f2les_array (const float *src, short *dest, int count, int normalize)
|
cannam@85
|
1952 { unsigned char *ucptr ;
|
cannam@85
|
1953 float normfact ;
|
cannam@85
|
1954 int value ;
|
cannam@85
|
1955
|
cannam@85
|
1956 normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
|
cannam@85
|
1957 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
1958
|
cannam@85
|
1959 while (--count >= 0)
|
cannam@85
|
1960 { ucptr -= 2 ;
|
cannam@85
|
1961 value = lrintf (src [count] * normfact) ;
|
cannam@85
|
1962 ucptr [0] = value ;
|
cannam@85
|
1963 ucptr [1] = value >> 8 ;
|
cannam@85
|
1964 } ;
|
cannam@85
|
1965 } /* f2les_array */
|
cannam@85
|
1966
|
cannam@85
|
1967 static void
|
cannam@85
|
1968 f2les_clip_array (const float *src, short *dest, int count, int normalize)
|
cannam@85
|
1969 { unsigned char *ucptr ;
|
cannam@85
|
1970 float normfact, scaled_value ;
|
cannam@85
|
1971 int value ;
|
cannam@85
|
1972
|
cannam@85
|
1973 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ;
|
cannam@85
|
1974 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
1975
|
cannam@85
|
1976 while (--count >= 0)
|
cannam@85
|
1977 { ucptr -= 2 ;
|
cannam@85
|
1978 scaled_value = src [count] * normfact ;
|
cannam@85
|
1979 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
1980 { ucptr [0] = 0xFF ;
|
cannam@85
|
1981 ucptr [1] = 0x7F ;
|
cannam@85
|
1982 continue ;
|
cannam@85
|
1983 } ;
|
cannam@85
|
1984 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
1985 { ucptr [0] = 0x00 ;
|
cannam@85
|
1986 ucptr [1] = 0x80 ;
|
cannam@85
|
1987 continue ;
|
cannam@85
|
1988 } ;
|
cannam@85
|
1989
|
cannam@85
|
1990 value = lrintf (scaled_value) ;
|
cannam@85
|
1991 ucptr [0] = value >> 16 ;
|
cannam@85
|
1992 ucptr [1] = value >> 24 ;
|
cannam@85
|
1993 } ;
|
cannam@85
|
1994 } /* f2les_clip_array */
|
cannam@85
|
1995
|
cannam@85
|
1996 static sf_count_t
|
cannam@85
|
1997 pcm_write_f2les (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
cannam@85
|
1998 { void (*convert) (const float *, short *t, int, int) ;
|
cannam@85
|
1999 int bufferlen, writecount ;
|
cannam@85
|
2000 sf_count_t total = 0 ;
|
cannam@85
|
2001
|
cannam@85
|
2002 convert = (psf->add_clipping) ? f2les_clip_array : f2les_array ;
|
cannam@85
|
2003 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
2004
|
cannam@85
|
2005 while (len > 0)
|
cannam@85
|
2006 { if (len < bufferlen)
|
cannam@85
|
2007 bufferlen = (int) len ;
|
cannam@85
|
2008 convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_float) ;
|
cannam@85
|
2009 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
2010 total += writecount ;
|
cannam@85
|
2011 if (writecount < bufferlen)
|
cannam@85
|
2012 break ;
|
cannam@85
|
2013 len -= writecount ;
|
cannam@85
|
2014 } ;
|
cannam@85
|
2015
|
cannam@85
|
2016 return total ;
|
cannam@85
|
2017 } /* pcm_write_f2les */
|
cannam@85
|
2018
|
cannam@85
|
2019 /*==============================================================================
|
cannam@85
|
2020 */
|
cannam@85
|
2021
|
cannam@85
|
2022 static void
|
cannam@85
|
2023 f2let_array (const float *src, tribyte *dest, int count, int normalize)
|
cannam@85
|
2024 { unsigned char *ucptr ;
|
cannam@85
|
2025 float normfact ;
|
cannam@85
|
2026 int value ;
|
cannam@85
|
2027
|
cannam@85
|
2028 normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
|
cannam@85
|
2029 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
2030
|
cannam@85
|
2031 while (--count >= 0)
|
cannam@85
|
2032 { ucptr -= 3 ;
|
cannam@85
|
2033 value = lrintf (src [count] * normfact) ;
|
cannam@85
|
2034 ucptr [0] = value ;
|
cannam@85
|
2035 ucptr [1] = value >> 8 ;
|
cannam@85
|
2036 ucptr [2] = value >> 16 ;
|
cannam@85
|
2037 } ;
|
cannam@85
|
2038 } /* f2let_array */
|
cannam@85
|
2039
|
cannam@85
|
2040 static void
|
cannam@85
|
2041 f2let_clip_array (const float *src, tribyte *dest, int count, int normalize)
|
cannam@85
|
2042 { unsigned char *ucptr ;
|
cannam@85
|
2043 float normfact, scaled_value ;
|
cannam@85
|
2044 int value ;
|
cannam@85
|
2045
|
cannam@85
|
2046 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ;
|
cannam@85
|
2047 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
2048
|
cannam@85
|
2049 while (--count >= 0)
|
cannam@85
|
2050 { ucptr -= 3 ;
|
cannam@85
|
2051 scaled_value = src [count] * normfact ;
|
cannam@85
|
2052 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2053 { ucptr [0] = 0xFF ;
|
cannam@85
|
2054 ucptr [1] = 0xFF ;
|
cannam@85
|
2055 ucptr [2] = 0x7F ;
|
cannam@85
|
2056 continue ;
|
cannam@85
|
2057 } ;
|
cannam@85
|
2058 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2059 { ucptr [0] = 0x00 ;
|
cannam@85
|
2060 ucptr [1] = 0x00 ;
|
cannam@85
|
2061 ucptr [2] = 0x80 ;
|
cannam@85
|
2062 continue ;
|
cannam@85
|
2063 } ;
|
cannam@85
|
2064
|
cannam@85
|
2065 value = lrintf (scaled_value) ;
|
cannam@85
|
2066 ucptr [0] = value >> 8 ;
|
cannam@85
|
2067 ucptr [1] = value >> 16 ;
|
cannam@85
|
2068 ucptr [2] = value >> 24 ;
|
cannam@85
|
2069 } ;
|
cannam@85
|
2070 } /* f2let_clip_array */
|
cannam@85
|
2071
|
cannam@85
|
2072 static sf_count_t
|
cannam@85
|
2073 pcm_write_f2let (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
cannam@85
|
2074 { void (*convert) (const float *, tribyte *, int, int) ;
|
cannam@85
|
2075 int bufferlen, writecount ;
|
cannam@85
|
2076 sf_count_t total = 0 ;
|
cannam@85
|
2077
|
cannam@85
|
2078 convert = (psf->add_clipping) ? f2let_clip_array : f2let_array ;
|
cannam@85
|
2079 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
2080
|
cannam@85
|
2081 while (len > 0)
|
cannam@85
|
2082 { if (len < bufferlen)
|
cannam@85
|
2083 bufferlen = (int) len ;
|
cannam@85
|
2084 convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_float) ;
|
cannam@85
|
2085 writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
2086 total += writecount ;
|
cannam@85
|
2087 if (writecount < bufferlen)
|
cannam@85
|
2088 break ;
|
cannam@85
|
2089 len -= writecount ;
|
cannam@85
|
2090 } ;
|
cannam@85
|
2091
|
cannam@85
|
2092 return total ;
|
cannam@85
|
2093 } /* pcm_write_f2let */
|
cannam@85
|
2094
|
cannam@85
|
2095 /*==============================================================================
|
cannam@85
|
2096 */
|
cannam@85
|
2097
|
cannam@85
|
2098 static void
|
cannam@85
|
2099 f2bet_array (const float *src, tribyte *dest, int count, int normalize)
|
cannam@85
|
2100 { unsigned char *ucptr ;
|
cannam@85
|
2101 float normfact ;
|
cannam@85
|
2102 int value ;
|
cannam@85
|
2103
|
cannam@85
|
2104 normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
|
cannam@85
|
2105 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
2106
|
cannam@85
|
2107 while (--count >= 0)
|
cannam@85
|
2108 { ucptr -= 3 ;
|
cannam@85
|
2109 value = lrintf (src [count] * normfact) ;
|
cannam@85
|
2110 ucptr [0] = value >> 16 ;
|
cannam@85
|
2111 ucptr [1] = value >> 8 ;
|
cannam@85
|
2112 ucptr [2] = value ;
|
cannam@85
|
2113 } ;
|
cannam@85
|
2114 } /* f2bet_array */
|
cannam@85
|
2115
|
cannam@85
|
2116 static void
|
cannam@85
|
2117 f2bet_clip_array (const float *src, tribyte *dest, int count, int normalize)
|
cannam@85
|
2118 { unsigned char *ucptr ;
|
cannam@85
|
2119 float normfact, scaled_value ;
|
cannam@85
|
2120 int value ;
|
cannam@85
|
2121
|
cannam@85
|
2122 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ;
|
cannam@85
|
2123 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
2124
|
cannam@85
|
2125 while (--count >= 0)
|
cannam@85
|
2126 { ucptr -= 3 ;
|
cannam@85
|
2127 scaled_value = src [count] * normfact ;
|
cannam@85
|
2128 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2129 { ucptr [0] = 0x7F ;
|
cannam@85
|
2130 ucptr [1] = 0xFF ;
|
cannam@85
|
2131 ucptr [2] = 0xFF ;
|
cannam@85
|
2132 continue ;
|
cannam@85
|
2133 } ;
|
cannam@85
|
2134 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2135 { ucptr [0] = 0x80 ;
|
cannam@85
|
2136 ucptr [1] = 0x00 ;
|
cannam@85
|
2137 ucptr [2] = 0x00 ;
|
cannam@85
|
2138 continue ;
|
cannam@85
|
2139 } ;
|
cannam@85
|
2140
|
cannam@85
|
2141 value = lrint (scaled_value) ;
|
cannam@85
|
2142 ucptr [0] = value >> 24 ;
|
cannam@85
|
2143 ucptr [1] = value >> 16 ;
|
cannam@85
|
2144 ucptr [2] = value >> 8 ;
|
cannam@85
|
2145 } ;
|
cannam@85
|
2146 } /* f2bet_clip_array */
|
cannam@85
|
2147
|
cannam@85
|
2148 static sf_count_t
|
cannam@85
|
2149 pcm_write_f2bet (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
cannam@85
|
2150 { void (*convert) (const float *, tribyte *, int, int) ;
|
cannam@85
|
2151 int bufferlen, writecount ;
|
cannam@85
|
2152 sf_count_t total = 0 ;
|
cannam@85
|
2153
|
cannam@85
|
2154 convert = (psf->add_clipping) ? f2bet_clip_array : f2bet_array ;
|
cannam@85
|
2155 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
2156
|
cannam@85
|
2157 while (len > 0)
|
cannam@85
|
2158 { if (len < bufferlen)
|
cannam@85
|
2159 bufferlen = (int) len ;
|
cannam@85
|
2160 convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_float) ;
|
cannam@85
|
2161 writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
2162 total += writecount ;
|
cannam@85
|
2163 if (writecount < bufferlen)
|
cannam@85
|
2164 break ;
|
cannam@85
|
2165 len -= writecount ;
|
cannam@85
|
2166 } ;
|
cannam@85
|
2167
|
cannam@85
|
2168 return total ;
|
cannam@85
|
2169 } /* pcm_write_f2bet */
|
cannam@85
|
2170
|
cannam@85
|
2171 /*==============================================================================
|
cannam@85
|
2172 */
|
cannam@85
|
2173
|
cannam@85
|
2174 static void
|
cannam@85
|
2175 f2bei_array (const float *src, int *dest, int count, int normalize)
|
cannam@85
|
2176 { unsigned char *ucptr ;
|
cannam@85
|
2177 float normfact ;
|
cannam@85
|
2178 int value ;
|
cannam@85
|
2179
|
cannam@85
|
2180 normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
|
cannam@85
|
2181 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
2182 while (--count >= 0)
|
cannam@85
|
2183 { ucptr -= 4 ;
|
cannam@85
|
2184 value = lrintf (src [count] * normfact) ;
|
cannam@85
|
2185 ucptr [0] = value >> 24 ;
|
cannam@85
|
2186 ucptr [1] = value >> 16 ;
|
cannam@85
|
2187 ucptr [2] = value >> 8 ;
|
cannam@85
|
2188 ucptr [3] = value ;
|
cannam@85
|
2189 } ;
|
cannam@85
|
2190 } /* f2bei_array */
|
cannam@85
|
2191
|
cannam@85
|
2192 static void
|
cannam@85
|
2193 f2bei_clip_array (const float *src, int *dest, int count, int normalize)
|
cannam@85
|
2194 { unsigned char *ucptr ;
|
cannam@85
|
2195 float normfact, scaled_value ;
|
cannam@85
|
2196 int value ;
|
cannam@85
|
2197
|
cannam@85
|
2198 normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
|
cannam@85
|
2199 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
2200
|
cannam@85
|
2201 while (--count >= 0)
|
cannam@85
|
2202 { ucptr -= 4 ;
|
cannam@85
|
2203 scaled_value = src [count] * normfact ;
|
cannam@85
|
2204 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= 1.0 * 0x7FFFFFFF)
|
cannam@85
|
2205 { ucptr [0] = 0x7F ;
|
cannam@85
|
2206 ucptr [1] = 0xFF ;
|
cannam@85
|
2207 ucptr [2] = 0xFF ;
|
cannam@85
|
2208 ucptr [3] = 0xFF ;
|
cannam@85
|
2209 continue ;
|
cannam@85
|
2210 } ;
|
cannam@85
|
2211 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2212 { ucptr [0] = 0x80 ;
|
cannam@85
|
2213 ucptr [1] = 0x00 ;
|
cannam@85
|
2214 ucptr [2] = 0x00 ;
|
cannam@85
|
2215 ucptr [3] = 0x00 ;
|
cannam@85
|
2216 continue ;
|
cannam@85
|
2217 } ;
|
cannam@85
|
2218
|
cannam@85
|
2219 value = lrintf (scaled_value) ;
|
cannam@85
|
2220 ucptr [0] = value >> 24 ;
|
cannam@85
|
2221 ucptr [1] = value >> 16 ;
|
cannam@85
|
2222 ucptr [2] = value >> 8 ;
|
cannam@85
|
2223 ucptr [3] = value ;
|
cannam@85
|
2224 } ;
|
cannam@85
|
2225 } /* f2bei_clip_array */
|
cannam@85
|
2226
|
cannam@85
|
2227 static sf_count_t
|
cannam@85
|
2228 pcm_write_f2bei (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
cannam@85
|
2229 { void (*convert) (const float *, int *, int, int) ;
|
cannam@85
|
2230 int bufferlen, writecount ;
|
cannam@85
|
2231 sf_count_t total = 0 ;
|
cannam@85
|
2232
|
cannam@85
|
2233 convert = (psf->add_clipping) ? f2bei_clip_array : f2bei_array ;
|
cannam@85
|
2234 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
2235
|
cannam@85
|
2236 while (len > 0)
|
cannam@85
|
2237 { if (len < bufferlen)
|
cannam@85
|
2238 bufferlen = (int) len ;
|
cannam@85
|
2239 convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_float) ;
|
cannam@85
|
2240 writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
2241 total += writecount ;
|
cannam@85
|
2242 if (writecount < bufferlen)
|
cannam@85
|
2243 break ;
|
cannam@85
|
2244 len -= writecount ;
|
cannam@85
|
2245 } ;
|
cannam@85
|
2246
|
cannam@85
|
2247 return total ;
|
cannam@85
|
2248 } /* pcm_write_f2bei */
|
cannam@85
|
2249
|
cannam@85
|
2250 /*==============================================================================
|
cannam@85
|
2251 */
|
cannam@85
|
2252
|
cannam@85
|
2253 static void
|
cannam@85
|
2254 f2lei_array (const float *src, int *dest, int count, int normalize)
|
cannam@85
|
2255 { unsigned char *ucptr ;
|
cannam@85
|
2256 float normfact ;
|
cannam@85
|
2257 int value ;
|
cannam@85
|
2258
|
cannam@85
|
2259 normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
|
cannam@85
|
2260 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
2261
|
cannam@85
|
2262 while (--count >= 0)
|
cannam@85
|
2263 { ucptr -= 4 ;
|
cannam@85
|
2264 value = lrintf (src [count] * normfact) ;
|
cannam@85
|
2265 ucptr [0] = value ;
|
cannam@85
|
2266 ucptr [1] = value >> 8 ;
|
cannam@85
|
2267 ucptr [2] = value >> 16 ;
|
cannam@85
|
2268 ucptr [3] = value >> 24 ;
|
cannam@85
|
2269 } ;
|
cannam@85
|
2270 } /* f2lei_array */
|
cannam@85
|
2271
|
cannam@85
|
2272 static void
|
cannam@85
|
2273 f2lei_clip_array (const float *src, int *dest, int count, int normalize)
|
cannam@85
|
2274 { unsigned char *ucptr ;
|
cannam@85
|
2275 float normfact, scaled_value ;
|
cannam@85
|
2276 int value ;
|
cannam@85
|
2277
|
cannam@85
|
2278 normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
|
cannam@85
|
2279 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
2280
|
cannam@85
|
2281 while (--count >= 0)
|
cannam@85
|
2282 { ucptr -= 4 ;
|
cannam@85
|
2283 scaled_value = src [count] * normfact ;
|
cannam@85
|
2284 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2285 { ucptr [0] = 0xFF ;
|
cannam@85
|
2286 ucptr [1] = 0xFF ;
|
cannam@85
|
2287 ucptr [2] = 0xFF ;
|
cannam@85
|
2288 ucptr [3] = 0x7F ;
|
cannam@85
|
2289 continue ;
|
cannam@85
|
2290 } ;
|
cannam@85
|
2291 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2292 { ucptr [0] = 0x00 ;
|
cannam@85
|
2293 ucptr [1] = 0x00 ;
|
cannam@85
|
2294 ucptr [2] = 0x00 ;
|
cannam@85
|
2295 ucptr [3] = 0x80 ;
|
cannam@85
|
2296 continue ;
|
cannam@85
|
2297 } ;
|
cannam@85
|
2298
|
cannam@85
|
2299 value = lrintf (scaled_value) ;
|
cannam@85
|
2300 ucptr [0] = value ;
|
cannam@85
|
2301 ucptr [1] = value >> 8 ;
|
cannam@85
|
2302 ucptr [2] = value >> 16 ;
|
cannam@85
|
2303 ucptr [3] = value >> 24 ;
|
cannam@85
|
2304 } ;
|
cannam@85
|
2305 } /* f2lei_clip_array */
|
cannam@85
|
2306
|
cannam@85
|
2307 static sf_count_t
|
cannam@85
|
2308 pcm_write_f2lei (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
|
cannam@85
|
2309 { void (*convert) (const float *, int *, int, int) ;
|
cannam@85
|
2310 int bufferlen, writecount ;
|
cannam@85
|
2311 sf_count_t total = 0 ;
|
cannam@85
|
2312
|
cannam@85
|
2313 convert = (psf->add_clipping) ? f2lei_clip_array : f2lei_array ;
|
cannam@85
|
2314 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
2315
|
cannam@85
|
2316 while (len > 0)
|
cannam@85
|
2317 { if (len < bufferlen)
|
cannam@85
|
2318 bufferlen = (int) len ;
|
cannam@85
|
2319 convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_float) ;
|
cannam@85
|
2320 writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
2321 total += writecount ;
|
cannam@85
|
2322 if (writecount < bufferlen)
|
cannam@85
|
2323 break ;
|
cannam@85
|
2324 len -= writecount ;
|
cannam@85
|
2325 } ;
|
cannam@85
|
2326
|
cannam@85
|
2327 return total ;
|
cannam@85
|
2328 } /* pcm_write_f2lei */
|
cannam@85
|
2329
|
cannam@85
|
2330 /*==============================================================================
|
cannam@85
|
2331 */
|
cannam@85
|
2332
|
cannam@85
|
2333 static void
|
cannam@85
|
2334 d2sc_array (const double *src, signed char *dest, int count, int normalize)
|
cannam@85
|
2335 { double normfact ;
|
cannam@85
|
2336
|
cannam@85
|
2337 normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
|
cannam@85
|
2338
|
cannam@85
|
2339 while (--count >= 0)
|
cannam@85
|
2340 { dest [count] = lrint (src [count] * normfact) ;
|
cannam@85
|
2341 } ;
|
cannam@85
|
2342 } /* d2sc_array */
|
cannam@85
|
2343
|
cannam@85
|
2344 static void
|
cannam@85
|
2345 d2sc_clip_array (const double *src, signed char *dest, int count, int normalize)
|
cannam@85
|
2346 { double normfact, scaled_value ;
|
cannam@85
|
2347
|
cannam@85
|
2348 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ;
|
cannam@85
|
2349
|
cannam@85
|
2350 while (--count >= 0)
|
cannam@85
|
2351 { scaled_value = src [count] * normfact ;
|
cannam@85
|
2352 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2353 { dest [count] = 127 ;
|
cannam@85
|
2354 continue ;
|
cannam@85
|
2355 } ;
|
cannam@85
|
2356 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2357 { dest [count] = -128 ;
|
cannam@85
|
2358 continue ;
|
cannam@85
|
2359 } ;
|
cannam@85
|
2360
|
cannam@85
|
2361 dest [count] = lrintf (scaled_value) >> 24 ;
|
cannam@85
|
2362 } ;
|
cannam@85
|
2363 } /* d2sc_clip_array */
|
cannam@85
|
2364
|
cannam@85
|
2365 static sf_count_t
|
cannam@85
|
2366 pcm_write_d2sc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
cannam@85
|
2367 { void (*convert) (const double *, signed char *, int, int) ;
|
cannam@85
|
2368 int bufferlen, writecount ;
|
cannam@85
|
2369 sf_count_t total = 0 ;
|
cannam@85
|
2370
|
cannam@85
|
2371 convert = (psf->add_clipping) ? d2sc_clip_array : d2sc_array ;
|
cannam@85
|
2372 bufferlen = ARRAY_LEN (psf->u.scbuf) ;
|
cannam@85
|
2373
|
cannam@85
|
2374 while (len > 0)
|
cannam@85
|
2375 { if (len < bufferlen)
|
cannam@85
|
2376 bufferlen = (int) len ;
|
cannam@85
|
2377 convert (ptr + total, psf->u.scbuf, bufferlen, psf->norm_double) ;
|
cannam@85
|
2378 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
|
cannam@85
|
2379 total += writecount ;
|
cannam@85
|
2380 if (writecount < bufferlen)
|
cannam@85
|
2381 break ;
|
cannam@85
|
2382 len -= writecount ;
|
cannam@85
|
2383 } ;
|
cannam@85
|
2384
|
cannam@85
|
2385 return total ;
|
cannam@85
|
2386 } /* pcm_write_d2sc */
|
cannam@85
|
2387
|
cannam@85
|
2388 /*==============================================================================
|
cannam@85
|
2389 */
|
cannam@85
|
2390
|
cannam@85
|
2391 static void
|
cannam@85
|
2392 d2uc_array (const double *src, unsigned char *dest, int count, int normalize)
|
cannam@85
|
2393 { double normfact ;
|
cannam@85
|
2394
|
cannam@85
|
2395 normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
|
cannam@85
|
2396
|
cannam@85
|
2397 while (--count >= 0)
|
cannam@85
|
2398 { dest [count] = lrint (src [count] * normfact) + 128 ;
|
cannam@85
|
2399 } ;
|
cannam@85
|
2400 } /* d2uc_array */
|
cannam@85
|
2401
|
cannam@85
|
2402 static void
|
cannam@85
|
2403 d2uc_clip_array (const double *src, unsigned char *dest, int count, int normalize)
|
cannam@85
|
2404 { double normfact, scaled_value ;
|
cannam@85
|
2405
|
cannam@85
|
2406 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ;
|
cannam@85
|
2407
|
cannam@85
|
2408 while (--count >= 0)
|
cannam@85
|
2409 { scaled_value = src [count] * normfact ;
|
cannam@85
|
2410 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2411 { dest [count] = 255 ;
|
cannam@85
|
2412 continue ;
|
cannam@85
|
2413 } ;
|
cannam@85
|
2414 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2415 { dest [count] = 0 ;
|
cannam@85
|
2416 continue ;
|
cannam@85
|
2417 } ;
|
cannam@85
|
2418
|
cannam@85
|
2419 dest [count] = (lrint (src [count] * normfact) >> 24) + 128 ;
|
cannam@85
|
2420 } ;
|
cannam@85
|
2421 } /* d2uc_clip_array */
|
cannam@85
|
2422
|
cannam@85
|
2423 static sf_count_t
|
cannam@85
|
2424 pcm_write_d2uc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
cannam@85
|
2425 { void (*convert) (const double *, unsigned char *, int, int) ;
|
cannam@85
|
2426 int bufferlen, writecount ;
|
cannam@85
|
2427 sf_count_t total = 0 ;
|
cannam@85
|
2428
|
cannam@85
|
2429 convert = (psf->add_clipping) ? d2uc_clip_array : d2uc_array ;
|
cannam@85
|
2430 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
|
cannam@85
|
2431
|
cannam@85
|
2432 while (len > 0)
|
cannam@85
|
2433 { if (len < bufferlen)
|
cannam@85
|
2434 bufferlen = (int) len ;
|
cannam@85
|
2435 convert (ptr + total, psf->u.ucbuf, bufferlen, psf->norm_double) ;
|
cannam@85
|
2436 writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
|
cannam@85
|
2437 total += writecount ;
|
cannam@85
|
2438 if (writecount < bufferlen)
|
cannam@85
|
2439 break ;
|
cannam@85
|
2440 len -= writecount ;
|
cannam@85
|
2441 } ;
|
cannam@85
|
2442
|
cannam@85
|
2443 return total ;
|
cannam@85
|
2444 } /* pcm_write_d2uc */
|
cannam@85
|
2445
|
cannam@85
|
2446 /*==============================================================================
|
cannam@85
|
2447 */
|
cannam@85
|
2448
|
cannam@85
|
2449 static void
|
cannam@85
|
2450 d2bes_array (const double *src, short *dest, int count, int normalize)
|
cannam@85
|
2451 { unsigned char *ucptr ;
|
cannam@85
|
2452 short value ;
|
cannam@85
|
2453 double normfact ;
|
cannam@85
|
2454
|
cannam@85
|
2455 normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
|
cannam@85
|
2456 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
2457
|
cannam@85
|
2458 while (--count >= 0)
|
cannam@85
|
2459 { ucptr -= 2 ;
|
cannam@85
|
2460 value = lrint (src [count] * normfact) ;
|
cannam@85
|
2461 ucptr [1] = value ;
|
cannam@85
|
2462 ucptr [0] = value >> 8 ;
|
cannam@85
|
2463 } ;
|
cannam@85
|
2464 } /* d2bes_array */
|
cannam@85
|
2465
|
cannam@85
|
2466 static void
|
cannam@85
|
2467 d2bes_clip_array (const double *src, short *dest, int count, int normalize)
|
cannam@85
|
2468 { unsigned char *ucptr ;
|
cannam@85
|
2469 double normfact, scaled_value ;
|
cannam@85
|
2470 int value ;
|
cannam@85
|
2471
|
cannam@85
|
2472 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ;
|
cannam@85
|
2473 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
2474
|
cannam@85
|
2475 while (--count >= 0)
|
cannam@85
|
2476 { ucptr -= 2 ;
|
cannam@85
|
2477 scaled_value = src [count] * normfact ;
|
cannam@85
|
2478 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2479 { ucptr [1] = 0xFF ;
|
cannam@85
|
2480 ucptr [0] = 0x7F ;
|
cannam@85
|
2481 continue ;
|
cannam@85
|
2482 } ;
|
cannam@85
|
2483 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2484 { ucptr [1] = 0x00 ;
|
cannam@85
|
2485 ucptr [0] = 0x80 ;
|
cannam@85
|
2486 continue ;
|
cannam@85
|
2487 } ;
|
cannam@85
|
2488
|
cannam@85
|
2489 value = lrint (scaled_value) ;
|
cannam@85
|
2490 ucptr [1] = value >> 16 ;
|
cannam@85
|
2491 ucptr [0] = value >> 24 ;
|
cannam@85
|
2492 } ;
|
cannam@85
|
2493 } /* d2bes_clip_array */
|
cannam@85
|
2494
|
cannam@85
|
2495 static sf_count_t
|
cannam@85
|
2496 pcm_write_d2bes (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
cannam@85
|
2497 { void (*convert) (const double *, short *, int, int) ;
|
cannam@85
|
2498 int bufferlen, writecount ;
|
cannam@85
|
2499 sf_count_t total = 0 ;
|
cannam@85
|
2500
|
cannam@85
|
2501 convert = (psf->add_clipping) ? d2bes_clip_array : d2bes_array ;
|
cannam@85
|
2502 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
2503
|
cannam@85
|
2504 while (len > 0)
|
cannam@85
|
2505 { if (len < bufferlen)
|
cannam@85
|
2506 bufferlen = (int) len ;
|
cannam@85
|
2507 convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_double) ;
|
cannam@85
|
2508 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
2509 total += writecount ;
|
cannam@85
|
2510 if (writecount < bufferlen)
|
cannam@85
|
2511 break ;
|
cannam@85
|
2512 len -= writecount ;
|
cannam@85
|
2513 } ;
|
cannam@85
|
2514
|
cannam@85
|
2515 return total ;
|
cannam@85
|
2516 } /* pcm_write_d2bes */
|
cannam@85
|
2517
|
cannam@85
|
2518 /*==============================================================================
|
cannam@85
|
2519 */
|
cannam@85
|
2520
|
cannam@85
|
2521 static void
|
cannam@85
|
2522 d2les_array (const double *src, short *dest, int count, int normalize)
|
cannam@85
|
2523 { unsigned char *ucptr ;
|
cannam@85
|
2524 short value ;
|
cannam@85
|
2525 double normfact ;
|
cannam@85
|
2526
|
cannam@85
|
2527 normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
|
cannam@85
|
2528 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
2529
|
cannam@85
|
2530 while (--count >= 0)
|
cannam@85
|
2531 { ucptr -= 2 ;
|
cannam@85
|
2532 value = lrint (src [count] * normfact) ;
|
cannam@85
|
2533 ucptr [0] = value ;
|
cannam@85
|
2534 ucptr [1] = value >> 8 ;
|
cannam@85
|
2535 } ;
|
cannam@85
|
2536 } /* d2les_array */
|
cannam@85
|
2537
|
cannam@85
|
2538 static void
|
cannam@85
|
2539 d2les_clip_array (const double *src, short *dest, int count, int normalize)
|
cannam@85
|
2540 { unsigned char *ucptr ;
|
cannam@85
|
2541 int value ;
|
cannam@85
|
2542 double normfact, scaled_value ;
|
cannam@85
|
2543
|
cannam@85
|
2544 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ;
|
cannam@85
|
2545 ucptr = ((unsigned char*) dest) + 2 * count ;
|
cannam@85
|
2546
|
cannam@85
|
2547 while (--count >= 0)
|
cannam@85
|
2548 { ucptr -= 2 ;
|
cannam@85
|
2549 scaled_value = src [count] * normfact ;
|
cannam@85
|
2550 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2551 { ucptr [0] = 0xFF ;
|
cannam@85
|
2552 ucptr [1] = 0x7F ;
|
cannam@85
|
2553 continue ;
|
cannam@85
|
2554 } ;
|
cannam@85
|
2555 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2556 { ucptr [0] = 0x00 ;
|
cannam@85
|
2557 ucptr [1] = 0x80 ;
|
cannam@85
|
2558 continue ;
|
cannam@85
|
2559 } ;
|
cannam@85
|
2560
|
cannam@85
|
2561 value = lrint (scaled_value) ;
|
cannam@85
|
2562 ucptr [0] = value >> 16 ;
|
cannam@85
|
2563 ucptr [1] = value >> 24 ;
|
cannam@85
|
2564 } ;
|
cannam@85
|
2565 } /* d2les_clip_array */
|
cannam@85
|
2566
|
cannam@85
|
2567 static sf_count_t
|
cannam@85
|
2568 pcm_write_d2les (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
cannam@85
|
2569 { void (*convert) (const double *, short *, int, int) ;
|
cannam@85
|
2570 int bufferlen, writecount ;
|
cannam@85
|
2571 sf_count_t total = 0 ;
|
cannam@85
|
2572
|
cannam@85
|
2573 convert = (psf->add_clipping) ? d2les_clip_array : d2les_array ;
|
cannam@85
|
2574 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
|
cannam@85
|
2575
|
cannam@85
|
2576 while (len > 0)
|
cannam@85
|
2577 { if (len < bufferlen)
|
cannam@85
|
2578 bufferlen = (int) len ;
|
cannam@85
|
2579 convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_double) ;
|
cannam@85
|
2580 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
|
cannam@85
|
2581 total += writecount ;
|
cannam@85
|
2582 if (writecount < bufferlen)
|
cannam@85
|
2583 break ;
|
cannam@85
|
2584 len -= writecount ;
|
cannam@85
|
2585 } ;
|
cannam@85
|
2586
|
cannam@85
|
2587 return total ;
|
cannam@85
|
2588 } /* pcm_write_d2les */
|
cannam@85
|
2589
|
cannam@85
|
2590 /*==============================================================================
|
cannam@85
|
2591 */
|
cannam@85
|
2592
|
cannam@85
|
2593 static void
|
cannam@85
|
2594 d2let_array (const double *src, tribyte *dest, int count, int normalize)
|
cannam@85
|
2595 { unsigned char *ucptr ;
|
cannam@85
|
2596 int value ;
|
cannam@85
|
2597 double normfact ;
|
cannam@85
|
2598
|
cannam@85
|
2599 normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
|
cannam@85
|
2600 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
2601
|
cannam@85
|
2602 while (--count >= 0)
|
cannam@85
|
2603 { ucptr -= 3 ;
|
cannam@85
|
2604 value = lrint (src [count] * normfact) ;
|
cannam@85
|
2605 ucptr [0] = value ;
|
cannam@85
|
2606 ucptr [1] = value >> 8 ;
|
cannam@85
|
2607 ucptr [2] = value >> 16 ;
|
cannam@85
|
2608 } ;
|
cannam@85
|
2609 } /* d2let_array */
|
cannam@85
|
2610
|
cannam@85
|
2611 static void
|
cannam@85
|
2612 d2let_clip_array (const double *src, tribyte *dest, int count, int normalize)
|
cannam@85
|
2613 { unsigned char *ucptr ;
|
cannam@85
|
2614 int value ;
|
cannam@85
|
2615 double normfact, scaled_value ;
|
cannam@85
|
2616
|
cannam@85
|
2617 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ;
|
cannam@85
|
2618 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
2619
|
cannam@85
|
2620 while (--count >= 0)
|
cannam@85
|
2621 { ucptr -= 3 ;
|
cannam@85
|
2622 scaled_value = src [count] * normfact ;
|
cannam@85
|
2623 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2624 { ucptr [0] = 0xFF ;
|
cannam@85
|
2625 ucptr [1] = 0xFF ;
|
cannam@85
|
2626 ucptr [2] = 0x7F ;
|
cannam@85
|
2627 continue ;
|
cannam@85
|
2628 } ;
|
cannam@85
|
2629 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2630 { ucptr [0] = 0x00 ;
|
cannam@85
|
2631 ucptr [1] = 0x00 ;
|
cannam@85
|
2632 ucptr [2] = 0x80 ;
|
cannam@85
|
2633 continue ;
|
cannam@85
|
2634 } ;
|
cannam@85
|
2635
|
cannam@85
|
2636 value = lrint (scaled_value) ;
|
cannam@85
|
2637 ucptr [0] = value >> 8 ;
|
cannam@85
|
2638 ucptr [1] = value >> 16 ;
|
cannam@85
|
2639 ucptr [2] = value >> 24 ;
|
cannam@85
|
2640 } ;
|
cannam@85
|
2641 } /* d2let_clip_array */
|
cannam@85
|
2642
|
cannam@85
|
2643 static sf_count_t
|
cannam@85
|
2644 pcm_write_d2let (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
cannam@85
|
2645 { void (*convert) (const double *, tribyte *, int, int) ;
|
cannam@85
|
2646 int bufferlen, writecount ;
|
cannam@85
|
2647 sf_count_t total = 0 ;
|
cannam@85
|
2648
|
cannam@85
|
2649 convert = (psf->add_clipping) ? d2let_clip_array : d2let_array ;
|
cannam@85
|
2650 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
2651
|
cannam@85
|
2652 while (len > 0)
|
cannam@85
|
2653 { if (len < bufferlen)
|
cannam@85
|
2654 bufferlen = (int) len ;
|
cannam@85
|
2655 convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_double) ;
|
cannam@85
|
2656 writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
2657 total += writecount ;
|
cannam@85
|
2658 if (writecount < bufferlen)
|
cannam@85
|
2659 break ;
|
cannam@85
|
2660 len -= writecount ;
|
cannam@85
|
2661 } ;
|
cannam@85
|
2662
|
cannam@85
|
2663 return total ;
|
cannam@85
|
2664 } /* pcm_write_d2let */
|
cannam@85
|
2665
|
cannam@85
|
2666 /*==============================================================================
|
cannam@85
|
2667 */
|
cannam@85
|
2668
|
cannam@85
|
2669 static void
|
cannam@85
|
2670 d2bet_array (const double *src, tribyte *dest, int count, int normalize)
|
cannam@85
|
2671 { unsigned char *ucptr ;
|
cannam@85
|
2672 int value ;
|
cannam@85
|
2673 double normfact ;
|
cannam@85
|
2674
|
cannam@85
|
2675 normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
|
cannam@85
|
2676 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
2677
|
cannam@85
|
2678 while (--count >= 0)
|
cannam@85
|
2679 { ucptr -= 3 ;
|
cannam@85
|
2680 value = lrint (src [count] * normfact) ;
|
cannam@85
|
2681 ucptr [2] = value ;
|
cannam@85
|
2682 ucptr [1] = value >> 8 ;
|
cannam@85
|
2683 ucptr [0] = value >> 16 ;
|
cannam@85
|
2684 } ;
|
cannam@85
|
2685 } /* d2bet_array */
|
cannam@85
|
2686
|
cannam@85
|
2687 static void
|
cannam@85
|
2688 d2bet_clip_array (const double *src, tribyte *dest, int count, int normalize)
|
cannam@85
|
2689 { unsigned char *ucptr ;
|
cannam@85
|
2690 int value ;
|
cannam@85
|
2691 double normfact, scaled_value ;
|
cannam@85
|
2692
|
cannam@85
|
2693 normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ;
|
cannam@85
|
2694 ucptr = ((unsigned char*) dest) + 3 * count ;
|
cannam@85
|
2695
|
cannam@85
|
2696 while (--count >= 0)
|
cannam@85
|
2697 { ucptr -= 3 ;
|
cannam@85
|
2698 scaled_value = src [count] * normfact ;
|
cannam@85
|
2699 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2700 { ucptr [2] = 0xFF ;
|
cannam@85
|
2701 ucptr [1] = 0xFF ;
|
cannam@85
|
2702 ucptr [0] = 0x7F ;
|
cannam@85
|
2703 continue ;
|
cannam@85
|
2704 } ;
|
cannam@85
|
2705 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2706 { ucptr [2] = 0x00 ;
|
cannam@85
|
2707 ucptr [1] = 0x00 ;
|
cannam@85
|
2708 ucptr [0] = 0x80 ;
|
cannam@85
|
2709 continue ;
|
cannam@85
|
2710 } ;
|
cannam@85
|
2711
|
cannam@85
|
2712 value = lrint (scaled_value) ;
|
cannam@85
|
2713 ucptr [2] = value >> 8 ;
|
cannam@85
|
2714 ucptr [1] = value >> 16 ;
|
cannam@85
|
2715 ucptr [0] = value >> 24 ;
|
cannam@85
|
2716 } ;
|
cannam@85
|
2717 } /* d2bet_clip_array */
|
cannam@85
|
2718
|
cannam@85
|
2719 static sf_count_t
|
cannam@85
|
2720 pcm_write_d2bet (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
cannam@85
|
2721 { void (*convert) (const double *, tribyte *, int, int) ;
|
cannam@85
|
2722 int bufferlen, writecount ;
|
cannam@85
|
2723 sf_count_t total = 0 ;
|
cannam@85
|
2724
|
cannam@85
|
2725 convert = (psf->add_clipping) ? d2bet_clip_array : d2bet_array ;
|
cannam@85
|
2726 bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
|
cannam@85
|
2727
|
cannam@85
|
2728 while (len > 0)
|
cannam@85
|
2729 { if (len < bufferlen)
|
cannam@85
|
2730 bufferlen = (int) len ;
|
cannam@85
|
2731 convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_double) ;
|
cannam@85
|
2732 writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
|
cannam@85
|
2733 total += writecount ;
|
cannam@85
|
2734 if (writecount < bufferlen)
|
cannam@85
|
2735 break ;
|
cannam@85
|
2736 len -= writecount ;
|
cannam@85
|
2737 } ;
|
cannam@85
|
2738
|
cannam@85
|
2739 return total ;
|
cannam@85
|
2740 } /* pcm_write_d2bet */
|
cannam@85
|
2741
|
cannam@85
|
2742 /*==============================================================================
|
cannam@85
|
2743 */
|
cannam@85
|
2744
|
cannam@85
|
2745 static void
|
cannam@85
|
2746 d2bei_array (const double *src, int *dest, int count, int normalize)
|
cannam@85
|
2747 { unsigned char *ucptr ;
|
cannam@85
|
2748 int value ;
|
cannam@85
|
2749 double normfact ;
|
cannam@85
|
2750
|
cannam@85
|
2751 normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
|
cannam@85
|
2752 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
2753
|
cannam@85
|
2754 while (--count >= 0)
|
cannam@85
|
2755 { ucptr -= 4 ;
|
cannam@85
|
2756 value = lrint (src [count] * normfact) ;
|
cannam@85
|
2757 ucptr [0] = value >> 24 ;
|
cannam@85
|
2758 ucptr [1] = value >> 16 ;
|
cannam@85
|
2759 ucptr [2] = value >> 8 ;
|
cannam@85
|
2760 ucptr [3] = value ;
|
cannam@85
|
2761 } ;
|
cannam@85
|
2762 } /* d2bei_array */
|
cannam@85
|
2763
|
cannam@85
|
2764 static void
|
cannam@85
|
2765 d2bei_clip_array (const double *src, int *dest, int count, int normalize)
|
cannam@85
|
2766 { unsigned char *ucptr ;
|
cannam@85
|
2767 int value ;
|
cannam@85
|
2768 double normfact, scaled_value ;
|
cannam@85
|
2769
|
cannam@85
|
2770 normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
|
cannam@85
|
2771 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
2772
|
cannam@85
|
2773 while (--count >= 0)
|
cannam@85
|
2774 { ucptr -= 4 ;
|
cannam@85
|
2775 scaled_value = src [count] * normfact ;
|
cannam@85
|
2776 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2777 { ucptr [3] = 0xFF ;
|
cannam@85
|
2778 ucptr [2] = 0xFF ;
|
cannam@85
|
2779 ucptr [1] = 0xFF ;
|
cannam@85
|
2780 ucptr [0] = 0x7F ;
|
cannam@85
|
2781 continue ;
|
cannam@85
|
2782 } ;
|
cannam@85
|
2783 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2784 { ucptr [3] = 0x00 ;
|
cannam@85
|
2785 ucptr [2] = 0x00 ;
|
cannam@85
|
2786 ucptr [1] = 0x00 ;
|
cannam@85
|
2787 ucptr [0] = 0x80 ;
|
cannam@85
|
2788 continue ;
|
cannam@85
|
2789 } ;
|
cannam@85
|
2790
|
cannam@85
|
2791 value = lrint (scaled_value) ;
|
cannam@85
|
2792 ucptr [0] = value >> 24 ;
|
cannam@85
|
2793 ucptr [1] = value >> 16 ;
|
cannam@85
|
2794 ucptr [2] = value >> 8 ;
|
cannam@85
|
2795 ucptr [3] = value ;
|
cannam@85
|
2796 } ;
|
cannam@85
|
2797 } /* d2bei_clip_array */
|
cannam@85
|
2798
|
cannam@85
|
2799 static sf_count_t
|
cannam@85
|
2800 pcm_write_d2bei (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
cannam@85
|
2801 { void (*convert) (const double *, int *, int, int) ;
|
cannam@85
|
2802 int bufferlen, writecount ;
|
cannam@85
|
2803 sf_count_t total = 0 ;
|
cannam@85
|
2804
|
cannam@85
|
2805 convert = (psf->add_clipping) ? d2bei_clip_array : d2bei_array ;
|
cannam@85
|
2806 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
2807
|
cannam@85
|
2808 while (len > 0)
|
cannam@85
|
2809 { if (len < bufferlen)
|
cannam@85
|
2810 bufferlen = (int) len ;
|
cannam@85
|
2811 convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_double) ;
|
cannam@85
|
2812 writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
2813 total += writecount ;
|
cannam@85
|
2814 if (writecount < bufferlen)
|
cannam@85
|
2815 break ;
|
cannam@85
|
2816 len -= writecount ;
|
cannam@85
|
2817 } ;
|
cannam@85
|
2818
|
cannam@85
|
2819 return total ;
|
cannam@85
|
2820 } /* pcm_write_d2bei */
|
cannam@85
|
2821
|
cannam@85
|
2822 /*==============================================================================
|
cannam@85
|
2823 */
|
cannam@85
|
2824
|
cannam@85
|
2825 static void
|
cannam@85
|
2826 d2lei_array (const double *src, int *dest, int count, int normalize)
|
cannam@85
|
2827 { unsigned char *ucptr ;
|
cannam@85
|
2828 int value ;
|
cannam@85
|
2829 double normfact ;
|
cannam@85
|
2830
|
cannam@85
|
2831 normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
|
cannam@85
|
2832 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
2833
|
cannam@85
|
2834 while (--count >= 0)
|
cannam@85
|
2835 { ucptr -= 4 ;
|
cannam@85
|
2836 value = lrint (src [count] * normfact) ;
|
cannam@85
|
2837 ucptr [0] = value ;
|
cannam@85
|
2838 ucptr [1] = value >> 8 ;
|
cannam@85
|
2839 ucptr [2] = value >> 16 ;
|
cannam@85
|
2840 ucptr [3] = value >> 24 ;
|
cannam@85
|
2841 } ;
|
cannam@85
|
2842 } /* d2lei_array */
|
cannam@85
|
2843
|
cannam@85
|
2844 static void
|
cannam@85
|
2845 d2lei_clip_array (const double *src, int *dest, int count, int normalize)
|
cannam@85
|
2846 { unsigned char *ucptr ;
|
cannam@85
|
2847 int value ;
|
cannam@85
|
2848 double normfact, scaled_value ;
|
cannam@85
|
2849
|
cannam@85
|
2850 normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
|
cannam@85
|
2851 ucptr = ((unsigned char*) dest) + 4 * count ;
|
cannam@85
|
2852
|
cannam@85
|
2853 while (--count >= 0)
|
cannam@85
|
2854 { ucptr -= 4 ;
|
cannam@85
|
2855 scaled_value = src [count] * normfact ;
|
cannam@85
|
2856 if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
|
cannam@85
|
2857 { ucptr [0] = 0xFF ;
|
cannam@85
|
2858 ucptr [1] = 0xFF ;
|
cannam@85
|
2859 ucptr [2] = 0xFF ;
|
cannam@85
|
2860 ucptr [3] = 0x7F ;
|
cannam@85
|
2861 continue ;
|
cannam@85
|
2862 } ;
|
cannam@85
|
2863 if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
|
cannam@85
|
2864 { ucptr [0] = 0x00 ;
|
cannam@85
|
2865 ucptr [1] = 0x00 ;
|
cannam@85
|
2866 ucptr [2] = 0x00 ;
|
cannam@85
|
2867 ucptr [3] = 0x80 ;
|
cannam@85
|
2868 continue ;
|
cannam@85
|
2869 } ;
|
cannam@85
|
2870
|
cannam@85
|
2871 value = lrint (scaled_value) ;
|
cannam@85
|
2872 ucptr [0] = value ;
|
cannam@85
|
2873 ucptr [1] = value >> 8 ;
|
cannam@85
|
2874 ucptr [2] = value >> 16 ;
|
cannam@85
|
2875 ucptr [3] = value >> 24 ;
|
cannam@85
|
2876 } ;
|
cannam@85
|
2877 } /* d2lei_clip_array */
|
cannam@85
|
2878
|
cannam@85
|
2879 static sf_count_t
|
cannam@85
|
2880 pcm_write_d2lei (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
|
cannam@85
|
2881 { void (*convert) (const double *, int *, int, int) ;
|
cannam@85
|
2882 int bufferlen, writecount ;
|
cannam@85
|
2883 sf_count_t total = 0 ;
|
cannam@85
|
2884
|
cannam@85
|
2885 convert = (psf->add_clipping) ? d2lei_clip_array : d2lei_array ;
|
cannam@85
|
2886 bufferlen = ARRAY_LEN (psf->u.ibuf) ;
|
cannam@85
|
2887
|
cannam@85
|
2888 while (len > 0)
|
cannam@85
|
2889 { if (len < bufferlen)
|
cannam@85
|
2890 bufferlen = (int) len ;
|
cannam@85
|
2891 convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_double) ;
|
cannam@85
|
2892 writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
|
cannam@85
|
2893 total += writecount ;
|
cannam@85
|
2894 if (writecount < bufferlen)
|
cannam@85
|
2895 break ;
|
cannam@85
|
2896 len -= writecount ;
|
cannam@85
|
2897 } ;
|
cannam@85
|
2898
|
cannam@85
|
2899 return total ;
|
cannam@85
|
2900 } /* pcm_write_d2lei */
|
cannam@85
|
2901
|