annotate src/libsndfile-1.0.25/src/pcm.c @ 128:5b4145a0d408

Current zlib source
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 18 Oct 2016 14:33:52 +0100
parents 545efbb81310
children
rev   line source
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