annotate src/libsndfile-1.0.27/src/float32.c @ 143:e95e00bdc3eb

Further win32 build updates
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 09 Jan 2017 13:51:38 +0000
parents cd6cdf86811e
children
rev   line source
cannam@125 1 /*
cannam@125 2 ** Copyright (C) 1999-2015 Erik de Castro Lopo <erikd@mega-nerd.com>
cannam@125 3 **
cannam@125 4 ** This program is free software; you can redistribute it and/or modify
cannam@125 5 ** it under the terms of the GNU Lesser General Public License as published by
cannam@125 6 ** the Free Software Foundation; either version 2.1 of the License, or
cannam@125 7 ** (at your option) any later version.
cannam@125 8 **
cannam@125 9 ** This program is distributed in the hope that it will be useful,
cannam@125 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@125 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@125 12 ** GNU Lesser General Public License for more details.
cannam@125 13 **
cannam@125 14 ** You should have received a copy of the GNU Lesser General Public License
cannam@125 15 ** along with this program; if not, write to the Free Software
cannam@125 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cannam@125 17 */
cannam@125 18
cannam@125 19 #include "sfconfig.h"
cannam@125 20
cannam@125 21 #include <stdio.h>
cannam@125 22 #include <stdlib.h>
cannam@125 23 #include <string.h>
cannam@125 24 #include <limits.h>
cannam@125 25 #include <math.h>
cannam@125 26
cannam@125 27 #include "sndfile.h"
cannam@125 28 #include "sfendian.h"
cannam@125 29 #include "common.h"
cannam@125 30
cannam@125 31 #if CPU_IS_LITTLE_ENDIAN
cannam@125 32 #define FLOAT32_READ float32_le_read
cannam@125 33 #define FLOAT32_WRITE float32_le_write
cannam@125 34 #elif CPU_IS_BIG_ENDIAN
cannam@125 35 #define FLOAT32_READ float32_be_read
cannam@125 36 #define FLOAT32_WRITE float32_be_write
cannam@125 37 #endif
cannam@125 38
cannam@125 39 /*--------------------------------------------------------------------------------------------
cannam@125 40 ** Processor floating point capabilities. float32_get_capability () returns one of the
cannam@125 41 ** latter four values.
cannam@125 42 */
cannam@125 43
cannam@125 44 enum
cannam@125 45 { FLOAT_UNKNOWN = 0x00,
cannam@125 46 FLOAT_CAN_RW_LE = 0x12,
cannam@125 47 FLOAT_CAN_RW_BE = 0x23,
cannam@125 48 FLOAT_BROKEN_LE = 0x34,
cannam@125 49 FLOAT_BROKEN_BE = 0x45
cannam@125 50 } ;
cannam@125 51
cannam@125 52 /*--------------------------------------------------------------------------------------------
cannam@125 53 ** Prototypes for private functions.
cannam@125 54 */
cannam@125 55
cannam@125 56 static sf_count_t host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
cannam@125 57 static sf_count_t host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
cannam@125 58 static sf_count_t host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
cannam@125 59 static sf_count_t host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
cannam@125 60
cannam@125 61 static sf_count_t host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
cannam@125 62 static sf_count_t host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
cannam@125 63 static sf_count_t host_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
cannam@125 64 static sf_count_t host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
cannam@125 65
cannam@125 66 static void float32_peak_update (SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx) ;
cannam@125 67
cannam@125 68 static sf_count_t replace_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
cannam@125 69 static sf_count_t replace_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
cannam@125 70 static sf_count_t replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
cannam@125 71 static sf_count_t replace_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
cannam@125 72
cannam@125 73 static sf_count_t replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
cannam@125 74 static sf_count_t replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
cannam@125 75 static sf_count_t replace_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
cannam@125 76 static sf_count_t replace_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
cannam@125 77
cannam@125 78 static void bf2f_array (float *buffer, int count) ;
cannam@125 79 static void f2bf_array (float *buffer, int count) ;
cannam@125 80
cannam@125 81 static int float32_get_capability (SF_PRIVATE *psf) ;
cannam@125 82
cannam@125 83 /*--------------------------------------------------------------------------------------------
cannam@125 84 ** Exported functions.
cannam@125 85 */
cannam@125 86
cannam@125 87 int
cannam@125 88 float32_init (SF_PRIVATE *psf)
cannam@125 89 { static int float_caps ;
cannam@125 90
cannam@125 91 if (psf->sf.channels < 1)
cannam@125 92 { psf_log_printf (psf, "float32_init : internal error : channels = %d\n", psf->sf.channels) ;
cannam@125 93 return SFE_INTERNAL ;
cannam@125 94 } ;
cannam@125 95
cannam@125 96 float_caps = float32_get_capability (psf) ;
cannam@125 97
cannam@125 98 psf->blockwidth = sizeof (float) * psf->sf.channels ;
cannam@125 99
cannam@125 100 if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
cannam@125 101 { switch (psf->endian + float_caps)
cannam@125 102 { case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) :
cannam@125 103 psf->data_endswap = SF_FALSE ;
cannam@125 104 psf->read_short = host_read_f2s ;
cannam@125 105 psf->read_int = host_read_f2i ;
cannam@125 106 psf->read_float = host_read_f ;
cannam@125 107 psf->read_double = host_read_f2d ;
cannam@125 108 break ;
cannam@125 109
cannam@125 110 case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) :
cannam@125 111 psf->data_endswap = SF_FALSE ;
cannam@125 112 psf->read_short = host_read_f2s ;
cannam@125 113 psf->read_int = host_read_f2i ;
cannam@125 114 psf->read_float = host_read_f ;
cannam@125 115 psf->read_double = host_read_f2d ;
cannam@125 116 break ;
cannam@125 117
cannam@125 118 case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) :
cannam@125 119 psf->data_endswap = SF_TRUE ;
cannam@125 120 psf->read_short = host_read_f2s ;
cannam@125 121 psf->read_int = host_read_f2i ;
cannam@125 122 psf->read_float = host_read_f ;
cannam@125 123 psf->read_double = host_read_f2d ;
cannam@125 124 break ;
cannam@125 125
cannam@125 126 case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) :
cannam@125 127 psf->data_endswap = SF_TRUE ;
cannam@125 128 psf->read_short = host_read_f2s ;
cannam@125 129 psf->read_int = host_read_f2i ;
cannam@125 130 psf->read_float = host_read_f ;
cannam@125 131 psf->read_double = host_read_f2d ;
cannam@125 132 break ;
cannam@125 133
cannam@125 134 /* When the CPU is not IEEE compatible. */
cannam@125 135 case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) :
cannam@125 136 psf->data_endswap = SF_TRUE ;
cannam@125 137 psf->read_short = replace_read_f2s ;
cannam@125 138 psf->read_int = replace_read_f2i ;
cannam@125 139 psf->read_float = replace_read_f ;
cannam@125 140 psf->read_double = replace_read_f2d ;
cannam@125 141 break ;
cannam@125 142
cannam@125 143 case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) :
cannam@125 144 psf->data_endswap = SF_FALSE ;
cannam@125 145 psf->read_short = replace_read_f2s ;
cannam@125 146 psf->read_int = replace_read_f2i ;
cannam@125 147 psf->read_float = replace_read_f ;
cannam@125 148 psf->read_double = replace_read_f2d ;
cannam@125 149 break ;
cannam@125 150
cannam@125 151 case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) :
cannam@125 152 psf->data_endswap = SF_FALSE ;
cannam@125 153 psf->read_short = replace_read_f2s ;
cannam@125 154 psf->read_int = replace_read_f2i ;
cannam@125 155 psf->read_float = replace_read_f ;
cannam@125 156 psf->read_double = replace_read_f2d ;
cannam@125 157 break ;
cannam@125 158
cannam@125 159 case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) :
cannam@125 160 psf->data_endswap = SF_TRUE ;
cannam@125 161 psf->read_short = replace_read_f2s ;
cannam@125 162 psf->read_int = replace_read_f2i ;
cannam@125 163 psf->read_float = replace_read_f ;
cannam@125 164 psf->read_double = replace_read_f2d ;
cannam@125 165 break ;
cannam@125 166
cannam@125 167 default : break ;
cannam@125 168 } ;
cannam@125 169 } ;
cannam@125 170
cannam@125 171 if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
cannam@125 172 { switch (psf->endian + float_caps)
cannam@125 173 { case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) :
cannam@125 174 psf->data_endswap = SF_FALSE ;
cannam@125 175 psf->write_short = host_write_s2f ;
cannam@125 176 psf->write_int = host_write_i2f ;
cannam@125 177 psf->write_float = host_write_f ;
cannam@125 178 psf->write_double = host_write_d2f ;
cannam@125 179 break ;
cannam@125 180
cannam@125 181 case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) :
cannam@125 182 psf->data_endswap = SF_FALSE ;
cannam@125 183 psf->write_short = host_write_s2f ;
cannam@125 184 psf->write_int = host_write_i2f ;
cannam@125 185 psf->write_float = host_write_f ;
cannam@125 186 psf->write_double = host_write_d2f ;
cannam@125 187 break ;
cannam@125 188
cannam@125 189 case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) :
cannam@125 190 psf->data_endswap = SF_TRUE ;
cannam@125 191 psf->write_short = host_write_s2f ;
cannam@125 192 psf->write_int = host_write_i2f ;
cannam@125 193 psf->write_float = host_write_f ;
cannam@125 194 psf->write_double = host_write_d2f ;
cannam@125 195 break ;
cannam@125 196
cannam@125 197 case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) :
cannam@125 198 psf->data_endswap = SF_TRUE ;
cannam@125 199 psf->write_short = host_write_s2f ;
cannam@125 200 psf->write_int = host_write_i2f ;
cannam@125 201 psf->write_float = host_write_f ;
cannam@125 202 psf->write_double = host_write_d2f ;
cannam@125 203 break ;
cannam@125 204
cannam@125 205 /* When the CPU is not IEEE compatible. */
cannam@125 206 case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) :
cannam@125 207 psf->data_endswap = SF_TRUE ;
cannam@125 208 psf->write_short = replace_write_s2f ;
cannam@125 209 psf->write_int = replace_write_i2f ;
cannam@125 210 psf->write_float = replace_write_f ;
cannam@125 211 psf->write_double = replace_write_d2f ;
cannam@125 212 break ;
cannam@125 213
cannam@125 214 case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) :
cannam@125 215 psf->data_endswap = SF_FALSE ;
cannam@125 216 psf->write_short = replace_write_s2f ;
cannam@125 217 psf->write_int = replace_write_i2f ;
cannam@125 218 psf->write_float = replace_write_f ;
cannam@125 219 psf->write_double = replace_write_d2f ;
cannam@125 220 break ;
cannam@125 221
cannam@125 222 case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) :
cannam@125 223 psf->data_endswap = SF_FALSE ;
cannam@125 224 psf->write_short = replace_write_s2f ;
cannam@125 225 psf->write_int = replace_write_i2f ;
cannam@125 226 psf->write_float = replace_write_f ;
cannam@125 227 psf->write_double = replace_write_d2f ;
cannam@125 228 break ;
cannam@125 229
cannam@125 230 case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) :
cannam@125 231 psf->data_endswap = SF_TRUE ;
cannam@125 232 psf->write_short = replace_write_s2f ;
cannam@125 233 psf->write_int = replace_write_i2f ;
cannam@125 234 psf->write_float = replace_write_f ;
cannam@125 235 psf->write_double = replace_write_d2f ;
cannam@125 236 break ;
cannam@125 237
cannam@125 238 default : break ;
cannam@125 239 } ;
cannam@125 240 } ;
cannam@125 241
cannam@125 242 if (psf->filelength > psf->dataoffset)
cannam@125 243 { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset :
cannam@125 244 psf->filelength - psf->dataoffset ;
cannam@125 245 }
cannam@125 246 else
cannam@125 247 psf->datalength = 0 ;
cannam@125 248
cannam@125 249 psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ;
cannam@125 250
cannam@125 251 return 0 ;
cannam@125 252 } /* float32_init */
cannam@125 253
cannam@125 254 float
cannam@125 255 float32_be_read (const unsigned char *cptr)
cannam@125 256 { int exponent, mantissa, negative ;
cannam@125 257 float fvalue ;
cannam@125 258
cannam@125 259 negative = cptr [0] & 0x80 ;
cannam@125 260 exponent = ((cptr [0] & 0x7F) << 1) | ((cptr [1] & 0x80) ? 1 : 0) ;
cannam@125 261 mantissa = ((cptr [1] & 0x7F) << 16) | (cptr [2] << 8) | (cptr [3]) ;
cannam@125 262
cannam@125 263 if (! (exponent || mantissa))
cannam@125 264 return 0.0 ;
cannam@125 265
cannam@125 266 mantissa |= 0x800000 ;
cannam@125 267 exponent = exponent ? exponent - 127 : 0 ;
cannam@125 268
cannam@125 269 fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ;
cannam@125 270
cannam@125 271 if (negative)
cannam@125 272 fvalue *= -1 ;
cannam@125 273
cannam@125 274 if (exponent > 0)
cannam@125 275 fvalue *= pow (2.0, exponent) ;
cannam@125 276 else if (exponent < 0)
cannam@125 277 fvalue /= pow (2.0, abs (exponent)) ;
cannam@125 278
cannam@125 279 return fvalue ;
cannam@125 280 } /* float32_be_read */
cannam@125 281
cannam@125 282 float
cannam@125 283 float32_le_read (const unsigned char *cptr)
cannam@125 284 { int exponent, mantissa, negative ;
cannam@125 285 float fvalue ;
cannam@125 286
cannam@125 287 negative = cptr [3] & 0x80 ;
cannam@125 288 exponent = ((cptr [3] & 0x7F) << 1) | ((cptr [2] & 0x80) ? 1 : 0) ;
cannam@125 289 mantissa = ((cptr [2] & 0x7F) << 16) | (cptr [1] << 8) | (cptr [0]) ;
cannam@125 290
cannam@125 291 if (! (exponent || mantissa))
cannam@125 292 return 0.0 ;
cannam@125 293
cannam@125 294 mantissa |= 0x800000 ;
cannam@125 295 exponent = exponent ? exponent - 127 : 0 ;
cannam@125 296
cannam@125 297 fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ;
cannam@125 298
cannam@125 299 if (negative)
cannam@125 300 fvalue *= -1 ;
cannam@125 301
cannam@125 302 if (exponent > 0)
cannam@125 303 fvalue *= pow (2.0, exponent) ;
cannam@125 304 else if (exponent < 0)
cannam@125 305 fvalue /= pow (2.0, abs (exponent)) ;
cannam@125 306
cannam@125 307 return fvalue ;
cannam@125 308 } /* float32_le_read */
cannam@125 309
cannam@125 310 void
cannam@125 311 float32_le_write (float in, unsigned char *out)
cannam@125 312 { int exponent, mantissa, negative = 0 ;
cannam@125 313
cannam@125 314 memset (out, 0, sizeof (int)) ;
cannam@125 315
cannam@125 316 if (fabs (in) < 1e-30)
cannam@125 317 return ;
cannam@125 318
cannam@125 319 if (in < 0.0)
cannam@125 320 { in *= -1.0 ;
cannam@125 321 negative = 1 ;
cannam@125 322 } ;
cannam@125 323
cannam@125 324 in = frexp (in, &exponent) ;
cannam@125 325
cannam@125 326 exponent += 126 ;
cannam@125 327
cannam@125 328 in *= (float) 0x1000000 ;
cannam@125 329 mantissa = (((int) in) & 0x7FFFFF) ;
cannam@125 330
cannam@125 331 if (negative)
cannam@125 332 out [3] |= 0x80 ;
cannam@125 333
cannam@125 334 if (exponent & 0x01)
cannam@125 335 out [2] |= 0x80 ;
cannam@125 336
cannam@125 337 out [0] = mantissa & 0xFF ;
cannam@125 338 out [1] = (mantissa >> 8) & 0xFF ;
cannam@125 339 out [2] |= (mantissa >> 16) & 0x7F ;
cannam@125 340 out [3] |= (exponent >> 1) & 0x7F ;
cannam@125 341
cannam@125 342 return ;
cannam@125 343 } /* float32_le_write */
cannam@125 344
cannam@125 345 void
cannam@125 346 float32_be_write (float in, unsigned char *out)
cannam@125 347 { int exponent, mantissa, negative = 0 ;
cannam@125 348
cannam@125 349 memset (out, 0, sizeof (int)) ;
cannam@125 350
cannam@125 351 if (fabs (in) < 1e-30)
cannam@125 352 return ;
cannam@125 353
cannam@125 354 if (in < 0.0)
cannam@125 355 { in *= -1.0 ;
cannam@125 356 negative = 1 ;
cannam@125 357 } ;
cannam@125 358
cannam@125 359 in = frexp (in, &exponent) ;
cannam@125 360
cannam@125 361 exponent += 126 ;
cannam@125 362
cannam@125 363 in *= (float) 0x1000000 ;
cannam@125 364 mantissa = (((int) in) & 0x7FFFFF) ;
cannam@125 365
cannam@125 366 if (negative)
cannam@125 367 out [0] |= 0x80 ;
cannam@125 368
cannam@125 369 if (exponent & 0x01)
cannam@125 370 out [1] |= 0x80 ;
cannam@125 371
cannam@125 372 out [3] = mantissa & 0xFF ;
cannam@125 373 out [2] = (mantissa >> 8) & 0xFF ;
cannam@125 374 out [1] |= (mantissa >> 16) & 0x7F ;
cannam@125 375 out [0] |= (exponent >> 1) & 0x7F ;
cannam@125 376
cannam@125 377 return ;
cannam@125 378 } /* float32_be_write */
cannam@125 379
cannam@125 380 /*==============================================================================================
cannam@125 381 ** Private functions.
cannam@125 382 */
cannam@125 383
cannam@125 384 static void
cannam@125 385 float32_peak_update (SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx)
cannam@125 386 { int chan ;
cannam@125 387 int k, position ;
cannam@125 388 float fmaxval ;
cannam@125 389
cannam@125 390 for (chan = 0 ; chan < psf->sf.channels ; chan++)
cannam@125 391 { fmaxval = fabs (buffer [chan]) ;
cannam@125 392 position = 0 ;
cannam@125 393 for (k = chan ; k < count ; k += psf->sf.channels)
cannam@125 394 if (fmaxval < fabs (buffer [k]))
cannam@125 395 { fmaxval = fabs (buffer [k]) ;
cannam@125 396 position = k ;
cannam@125 397 } ;
cannam@125 398
cannam@125 399 if (fmaxval > psf->peak_info->peaks [chan].value)
cannam@125 400 { psf->peak_info->peaks [chan].value = fmaxval ;
cannam@125 401 psf->peak_info->peaks [chan].position = psf->write_current + indx + (position / psf->sf.channels) ;
cannam@125 402 } ;
cannam@125 403 } ;
cannam@125 404
cannam@125 405 return ;
cannam@125 406 } /* float32_peak_update */
cannam@125 407
cannam@125 408 static int
cannam@125 409 float32_get_capability (SF_PRIVATE *psf)
cannam@125 410 { union
cannam@125 411 { float f ;
cannam@125 412 int i ;
cannam@125 413 unsigned char c [4] ;
cannam@125 414 } data ;
cannam@125 415
cannam@125 416 data.f = (float) 1.23456789 ; /* Some abitrary value. */
cannam@125 417
cannam@125 418 if (! psf->ieee_replace)
cannam@125 419 { /* If this test is true ints and floats are compatible and little endian. */
cannam@125 420 if (data.c [0] == 0x52 && data.c [1] == 0x06 && data.c [2] == 0x9e && data.c [3] == 0x3f)
cannam@125 421 return FLOAT_CAN_RW_LE ;
cannam@125 422
cannam@125 423 /* If this test is true ints and floats are compatible and big endian. */
cannam@125 424 if (data.c [3] == 0x52 && data.c [2] == 0x06 && data.c [1] == 0x9e && data.c [0] == 0x3f)
cannam@125 425 return FLOAT_CAN_RW_BE ;
cannam@125 426 } ;
cannam@125 427
cannam@125 428 /* Floats are broken. Don't expect reading or writing to be fast. */
cannam@125 429 psf_log_printf (psf, "Using IEEE replacement code for float.\n") ;
cannam@125 430
cannam@125 431 return (CPU_IS_LITTLE_ENDIAN) ? FLOAT_BROKEN_LE : FLOAT_BROKEN_BE ;
cannam@125 432 } /* float32_get_capability */
cannam@125 433
cannam@125 434 /*=======================================================================================
cannam@125 435 */
cannam@125 436
cannam@125 437 static void
cannam@125 438 f2s_array (const float *src, int count, short *dest, float scale)
cannam@125 439 {
cannam@125 440 while (--count >= 0)
cannam@125 441 { dest [count] = lrintf (scale * src [count]) ;
cannam@125 442 } ;
cannam@125 443 } /* f2s_array */
cannam@125 444
cannam@125 445 static void
cannam@125 446 f2s_clip_array (const float *src, int count, short *dest, float scale)
cannam@125 447 { while (--count >= 0)
cannam@125 448 { float tmp = scale * src [count] ;
cannam@125 449
cannam@125 450 if (CPU_CLIPS_POSITIVE == 0 && tmp > 32767.0)
cannam@125 451 dest [count] = SHRT_MAX ;
cannam@125 452 else if (CPU_CLIPS_NEGATIVE == 0 && tmp < -32768.0)
cannam@125 453 dest [count] = SHRT_MIN ;
cannam@125 454 else
cannam@125 455 dest [count] = lrintf (tmp) ;
cannam@125 456 } ;
cannam@125 457 } /* f2s_clip_array */
cannam@125 458
cannam@125 459 static inline void
cannam@125 460 f2i_array (const float *src, int count, int *dest, float scale)
cannam@125 461 { while (--count >= 0)
cannam@125 462 { dest [count] = lrintf (scale * src [count]) ;
cannam@125 463 } ;
cannam@125 464 } /* f2i_array */
cannam@125 465
cannam@125 466 static inline void
cannam@125 467 f2i_clip_array (const float *src, int count, int *dest, float scale)
cannam@125 468 { while (--count >= 0)
cannam@125 469 { float tmp = scale * src [count] ;
cannam@125 470
cannam@125 471 if (CPU_CLIPS_POSITIVE == 0 && tmp > (1.0 * INT_MAX))
cannam@125 472 dest [count] = INT_MAX ;
cannam@125 473 else if (CPU_CLIPS_NEGATIVE == 0 && tmp < (-1.0 * INT_MAX))
cannam@125 474 dest [count] = INT_MIN ;
cannam@125 475 else
cannam@125 476 dest [count] = lrintf (tmp) ;
cannam@125 477 } ;
cannam@125 478 } /* f2i_clip_array */
cannam@125 479
cannam@125 480 static inline void
cannam@125 481 f2d_array (const float *src, int count, double *dest)
cannam@125 482 { while (--count >= 0)
cannam@125 483 { dest [count] = src [count] ;
cannam@125 484 } ;
cannam@125 485 } /* f2d_array */
cannam@125 486
cannam@125 487 static inline void
cannam@125 488 s2f_array (const short *src, float *dest, int count, float scale)
cannam@125 489 { while (--count >= 0)
cannam@125 490 { dest [count] = scale * src [count] ;
cannam@125 491 } ;
cannam@125 492 } /* s2f_array */
cannam@125 493
cannam@125 494 static inline void
cannam@125 495 i2f_array (const int *src, float *dest, int count, float scale)
cannam@125 496 { while (--count >= 0)
cannam@125 497 { dest [count] = scale * src [count] ;
cannam@125 498 } ;
cannam@125 499 } /* i2f_array */
cannam@125 500
cannam@125 501 static inline void
cannam@125 502 d2f_array (const double *src, float *dest, int count)
cannam@125 503 { while (--count >= 0)
cannam@125 504 { dest [count] = src [count] ;
cannam@125 505 } ;
cannam@125 506 } /* d2f_array */
cannam@125 507
cannam@125 508 /*----------------------------------------------------------------------------------------------
cannam@125 509 */
cannam@125 510
cannam@125 511 static sf_count_t
cannam@125 512 host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
cannam@125 513 { BUF_UNION ubuf ;
cannam@125 514 void (*convert) (const float *, int, short *, float) ;
cannam@125 515 int bufferlen, readcount ;
cannam@125 516 sf_count_t total = 0 ;
cannam@125 517 float scale ;
cannam@125 518
cannam@125 519 convert = (psf->add_clipping) ? f2s_clip_array : f2s_array ;
cannam@125 520 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 521 scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
cannam@125 522
cannam@125 523 while (len > 0)
cannam@125 524 { if (len < bufferlen)
cannam@125 525 bufferlen = (int) len ;
cannam@125 526 readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 527
cannam@125 528 /* Fix me : Need lef2s_array */
cannam@125 529 if (psf->data_endswap == SF_TRUE)
cannam@125 530 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 531
cannam@125 532 convert (ubuf.fbuf, readcount, ptr + total, scale) ;
cannam@125 533 total += readcount ;
cannam@125 534 if (readcount < bufferlen)
cannam@125 535 break ;
cannam@125 536 len -= readcount ;
cannam@125 537 } ;
cannam@125 538
cannam@125 539 return total ;
cannam@125 540 } /* host_read_f2s */
cannam@125 541
cannam@125 542 static sf_count_t
cannam@125 543 host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
cannam@125 544 { BUF_UNION ubuf ;
cannam@125 545 void (*convert) (const float *, int, int *, float) ;
cannam@125 546 int bufferlen, readcount ;
cannam@125 547 sf_count_t total = 0 ;
cannam@125 548 float scale ;
cannam@125 549
cannam@125 550 convert = (psf->add_clipping) ? f2i_clip_array : f2i_array ;
cannam@125 551 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 552 scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ;
cannam@125 553
cannam@125 554 while (len > 0)
cannam@125 555 { if (len < bufferlen)
cannam@125 556 bufferlen = (int) len ;
cannam@125 557 readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 558
cannam@125 559 if (psf->data_endswap == SF_TRUE)
cannam@125 560 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 561
cannam@125 562 convert (ubuf.fbuf, readcount, ptr + total, scale) ;
cannam@125 563 total += readcount ;
cannam@125 564 if (readcount < bufferlen)
cannam@125 565 break ;
cannam@125 566 len -= readcount ;
cannam@125 567 } ;
cannam@125 568
cannam@125 569 return total ;
cannam@125 570 } /* host_read_f2i */
cannam@125 571
cannam@125 572 static sf_count_t
cannam@125 573 host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
cannam@125 574 { BUF_UNION ubuf ;
cannam@125 575 int bufferlen, readcount ;
cannam@125 576 sf_count_t total = 0 ;
cannam@125 577
cannam@125 578 if (psf->data_endswap != SF_TRUE)
cannam@125 579 return psf_fread (ptr, sizeof (float), len, psf) ;
cannam@125 580
cannam@125 581 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 582
cannam@125 583 while (len > 0)
cannam@125 584 { if (len < bufferlen)
cannam@125 585 bufferlen = (int) len ;
cannam@125 586 readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 587
cannam@125 588 endswap_int_copy ((int*) (ptr + total), ubuf.ibuf, readcount) ;
cannam@125 589
cannam@125 590 total += readcount ;
cannam@125 591 if (readcount < bufferlen)
cannam@125 592 break ;
cannam@125 593 len -= readcount ;
cannam@125 594 } ;
cannam@125 595
cannam@125 596 return total ;
cannam@125 597 } /* host_read_f */
cannam@125 598
cannam@125 599 static sf_count_t
cannam@125 600 host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
cannam@125 601 { BUF_UNION ubuf ;
cannam@125 602 int bufferlen, readcount ;
cannam@125 603 sf_count_t total = 0 ;
cannam@125 604
cannam@125 605 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 606
cannam@125 607 while (len > 0)
cannam@125 608 { if (len < bufferlen)
cannam@125 609 bufferlen = (int) len ;
cannam@125 610 readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 611
cannam@125 612 if (psf->data_endswap == SF_TRUE)
cannam@125 613 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 614
cannam@125 615 /* Fix me : Need lef2d_array */
cannam@125 616 f2d_array (ubuf.fbuf, readcount, ptr + total) ;
cannam@125 617 total += readcount ;
cannam@125 618 if (readcount < bufferlen)
cannam@125 619 break ;
cannam@125 620 len -= readcount ;
cannam@125 621 } ;
cannam@125 622
cannam@125 623 return total ;
cannam@125 624 } /* host_read_f2d */
cannam@125 625
cannam@125 626 static sf_count_t
cannam@125 627 host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
cannam@125 628 { BUF_UNION ubuf ;
cannam@125 629 int bufferlen, writecount ;
cannam@125 630 sf_count_t total = 0 ;
cannam@125 631 float scale ;
cannam@125 632
cannam@125 633 /* Erik */
cannam@125 634 scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
cannam@125 635 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 636
cannam@125 637 while (len > 0)
cannam@125 638 { if (len < bufferlen)
cannam@125 639 bufferlen = (int) len ;
cannam@125 640 s2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ;
cannam@125 641
cannam@125 642 if (psf->peak_info)
cannam@125 643 float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
cannam@125 644
cannam@125 645 if (psf->data_endswap == SF_TRUE)
cannam@125 646 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 647
cannam@125 648 writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 649 total += writecount ;
cannam@125 650 if (writecount < bufferlen)
cannam@125 651 break ;
cannam@125 652 len -= writecount ;
cannam@125 653 } ;
cannam@125 654
cannam@125 655 return total ;
cannam@125 656 } /* host_write_s2f */
cannam@125 657
cannam@125 658 static sf_count_t
cannam@125 659 host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
cannam@125 660 { BUF_UNION ubuf ;
cannam@125 661 int bufferlen, writecount ;
cannam@125 662 sf_count_t total = 0 ;
cannam@125 663 float scale ;
cannam@125 664
cannam@125 665 scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
cannam@125 666 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 667
cannam@125 668 while (len > 0)
cannam@125 669 { if (len < bufferlen)
cannam@125 670 bufferlen = (int) len ;
cannam@125 671 i2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ;
cannam@125 672
cannam@125 673 if (psf->peak_info)
cannam@125 674 float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
cannam@125 675
cannam@125 676 if (psf->data_endswap == SF_TRUE)
cannam@125 677 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 678
cannam@125 679 writecount = psf_fwrite (ubuf.fbuf, sizeof (float) , bufferlen, psf) ;
cannam@125 680 total += writecount ;
cannam@125 681 if (writecount < bufferlen)
cannam@125 682 break ;
cannam@125 683 len -= writecount ;
cannam@125 684 } ;
cannam@125 685
cannam@125 686 return total ;
cannam@125 687 } /* host_write_i2f */
cannam@125 688
cannam@125 689 static sf_count_t
cannam@125 690 host_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
cannam@125 691 { BUF_UNION ubuf ;
cannam@125 692 int bufferlen, writecount ;
cannam@125 693 sf_count_t total = 0 ;
cannam@125 694
cannam@125 695 if (psf->peak_info)
cannam@125 696 float32_peak_update (psf, ptr, len, 0) ;
cannam@125 697
cannam@125 698 if (psf->data_endswap != SF_TRUE)
cannam@125 699 return psf_fwrite (ptr, sizeof (float), len, psf) ;
cannam@125 700
cannam@125 701 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 702
cannam@125 703 while (len > 0)
cannam@125 704 { if (len < bufferlen)
cannam@125 705 bufferlen = (int) len ;
cannam@125 706
cannam@125 707 endswap_int_copy (ubuf.ibuf, (const int*) (ptr + total), bufferlen) ;
cannam@125 708
cannam@125 709 writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 710 total += writecount ;
cannam@125 711 if (writecount < bufferlen)
cannam@125 712 break ;
cannam@125 713 len -= writecount ;
cannam@125 714 } ;
cannam@125 715
cannam@125 716 return total ;
cannam@125 717 } /* host_write_f */
cannam@125 718
cannam@125 719 static sf_count_t
cannam@125 720 host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
cannam@125 721 { BUF_UNION ubuf ;
cannam@125 722 int bufferlen, writecount ;
cannam@125 723 sf_count_t total = 0 ;
cannam@125 724
cannam@125 725 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 726
cannam@125 727 while (len > 0)
cannam@125 728 { if (len < bufferlen)
cannam@125 729 bufferlen = (int) len ;
cannam@125 730
cannam@125 731 d2f_array (ptr + total, ubuf.fbuf, bufferlen) ;
cannam@125 732
cannam@125 733 if (psf->peak_info)
cannam@125 734 float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
cannam@125 735
cannam@125 736 if (psf->data_endswap == SF_TRUE)
cannam@125 737 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 738
cannam@125 739 writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 740 total += writecount ;
cannam@125 741 if (writecount < bufferlen)
cannam@125 742 break ;
cannam@125 743 len -= writecount ;
cannam@125 744 } ;
cannam@125 745
cannam@125 746 return total ;
cannam@125 747 } /* host_write_d2f */
cannam@125 748
cannam@125 749 /*=======================================================================================
cannam@125 750 */
cannam@125 751
cannam@125 752 static sf_count_t
cannam@125 753 replace_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
cannam@125 754 { BUF_UNION ubuf ;
cannam@125 755 int bufferlen, readcount ;
cannam@125 756 sf_count_t total = 0 ;
cannam@125 757 float scale ;
cannam@125 758
cannam@125 759 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 760 scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
cannam@125 761
cannam@125 762 while (len > 0)
cannam@125 763 { if (len < bufferlen)
cannam@125 764 bufferlen = (int) len ;
cannam@125 765 readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 766
cannam@125 767 if (psf->data_endswap == SF_TRUE)
cannam@125 768 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 769
cannam@125 770 bf2f_array (ubuf.fbuf, bufferlen) ;
cannam@125 771
cannam@125 772 f2s_array (ubuf.fbuf, readcount, ptr + total, scale) ;
cannam@125 773 total += readcount ;
cannam@125 774 if (readcount < bufferlen)
cannam@125 775 break ;
cannam@125 776 len -= readcount ;
cannam@125 777 } ;
cannam@125 778
cannam@125 779 return total ;
cannam@125 780 } /* replace_read_f2s */
cannam@125 781
cannam@125 782 static sf_count_t
cannam@125 783 replace_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
cannam@125 784 { BUF_UNION ubuf ;
cannam@125 785 int bufferlen, readcount ;
cannam@125 786 sf_count_t total = 0 ;
cannam@125 787 float scale ;
cannam@125 788
cannam@125 789 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 790 scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
cannam@125 791
cannam@125 792 while (len > 0)
cannam@125 793 { if (len < bufferlen)
cannam@125 794 bufferlen = (int) len ;
cannam@125 795 readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 796
cannam@125 797 if (psf->data_endswap == SF_TRUE)
cannam@125 798 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 799
cannam@125 800 bf2f_array (ubuf.fbuf, bufferlen) ;
cannam@125 801
cannam@125 802 f2i_array (ubuf.fbuf, readcount, ptr + total, scale) ;
cannam@125 803 total += readcount ;
cannam@125 804 if (readcount < bufferlen)
cannam@125 805 break ;
cannam@125 806 len -= readcount ;
cannam@125 807 } ;
cannam@125 808
cannam@125 809 return total ;
cannam@125 810 } /* replace_read_f2i */
cannam@125 811
cannam@125 812 static sf_count_t
cannam@125 813 replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
cannam@125 814 { BUF_UNION ubuf ;
cannam@125 815 int bufferlen, readcount ;
cannam@125 816 sf_count_t total = 0 ;
cannam@125 817
cannam@125 818 /* FIX THIS */
cannam@125 819
cannam@125 820 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 821
cannam@125 822 while (len > 0)
cannam@125 823 { if (len < bufferlen)
cannam@125 824 bufferlen = (int) len ;
cannam@125 825 readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 826
cannam@125 827 if (psf->data_endswap == SF_TRUE)
cannam@125 828 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 829
cannam@125 830 bf2f_array (ubuf.fbuf, bufferlen) ;
cannam@125 831
cannam@125 832 memcpy (ptr + total, ubuf.fbuf, bufferlen * sizeof (float)) ;
cannam@125 833
cannam@125 834 total += readcount ;
cannam@125 835 if (readcount < bufferlen)
cannam@125 836 break ;
cannam@125 837 len -= readcount ;
cannam@125 838 } ;
cannam@125 839
cannam@125 840 return total ;
cannam@125 841 } /* replace_read_f */
cannam@125 842
cannam@125 843 static sf_count_t
cannam@125 844 replace_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
cannam@125 845 { BUF_UNION ubuf ;
cannam@125 846 int bufferlen, readcount ;
cannam@125 847 sf_count_t total = 0 ;
cannam@125 848
cannam@125 849 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 850
cannam@125 851 while (len > 0)
cannam@125 852 { if (len < bufferlen)
cannam@125 853 bufferlen = (int) len ;
cannam@125 854 readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 855
cannam@125 856 if (psf->data_endswap == SF_TRUE)
cannam@125 857 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 858
cannam@125 859 bf2f_array (ubuf.fbuf, bufferlen) ;
cannam@125 860
cannam@125 861 f2d_array (ubuf.fbuf, readcount, ptr + total) ;
cannam@125 862 total += readcount ;
cannam@125 863 if (readcount < bufferlen)
cannam@125 864 break ;
cannam@125 865 len -= readcount ;
cannam@125 866 } ;
cannam@125 867
cannam@125 868 return total ;
cannam@125 869 } /* replace_read_f2d */
cannam@125 870
cannam@125 871 static sf_count_t
cannam@125 872 replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
cannam@125 873 { BUF_UNION ubuf ;
cannam@125 874 int bufferlen, writecount ;
cannam@125 875 sf_count_t total = 0 ;
cannam@125 876 float scale ;
cannam@125 877
cannam@125 878 scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
cannam@125 879 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 880
cannam@125 881 while (len > 0)
cannam@125 882 { if (len < bufferlen)
cannam@125 883 bufferlen = (int) len ;
cannam@125 884 s2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ;
cannam@125 885
cannam@125 886 if (psf->peak_info)
cannam@125 887 float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
cannam@125 888
cannam@125 889 f2bf_array (ubuf.fbuf, bufferlen) ;
cannam@125 890
cannam@125 891 if (psf->data_endswap == SF_TRUE)
cannam@125 892 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 893
cannam@125 894 writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 895 total += writecount ;
cannam@125 896 if (writecount < bufferlen)
cannam@125 897 break ;
cannam@125 898 len -= writecount ;
cannam@125 899 } ;
cannam@125 900
cannam@125 901 return total ;
cannam@125 902 } /* replace_write_s2f */
cannam@125 903
cannam@125 904 static sf_count_t
cannam@125 905 replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
cannam@125 906 { BUF_UNION ubuf ;
cannam@125 907 int bufferlen, writecount ;
cannam@125 908 sf_count_t total = 0 ;
cannam@125 909 float scale ;
cannam@125 910
cannam@125 911 scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
cannam@125 912 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 913
cannam@125 914 while (len > 0)
cannam@125 915 { if (len < bufferlen)
cannam@125 916 bufferlen = (int) len ;
cannam@125 917 i2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ;
cannam@125 918
cannam@125 919 if (psf->peak_info)
cannam@125 920 float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
cannam@125 921
cannam@125 922 f2bf_array (ubuf.fbuf, bufferlen) ;
cannam@125 923
cannam@125 924 if (psf->data_endswap == SF_TRUE)
cannam@125 925 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 926
cannam@125 927 writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 928 total += writecount ;
cannam@125 929 if (writecount < bufferlen)
cannam@125 930 break ;
cannam@125 931 len -= writecount ;
cannam@125 932 } ;
cannam@125 933
cannam@125 934 return total ;
cannam@125 935 } /* replace_write_i2f */
cannam@125 936
cannam@125 937 static sf_count_t
cannam@125 938 replace_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
cannam@125 939 { BUF_UNION ubuf ;
cannam@125 940 int bufferlen, writecount ;
cannam@125 941 sf_count_t total = 0 ;
cannam@125 942
cannam@125 943 /* FIX THIS */
cannam@125 944 if (psf->peak_info)
cannam@125 945 float32_peak_update (psf, ptr, len, 0) ;
cannam@125 946
cannam@125 947 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 948
cannam@125 949 while (len > 0)
cannam@125 950 { if (len < bufferlen)
cannam@125 951 bufferlen = (int) len ;
cannam@125 952
cannam@125 953 memcpy (ubuf.fbuf, ptr + total, bufferlen * sizeof (float)) ;
cannam@125 954
cannam@125 955 f2bf_array (ubuf.fbuf, bufferlen) ;
cannam@125 956
cannam@125 957 if (psf->data_endswap == SF_TRUE)
cannam@125 958 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 959
cannam@125 960 writecount = psf_fwrite (ubuf.fbuf, sizeof (float) , bufferlen, psf) ;
cannam@125 961 total += writecount ;
cannam@125 962 if (writecount < bufferlen)
cannam@125 963 break ;
cannam@125 964 len -= writecount ;
cannam@125 965 } ;
cannam@125 966
cannam@125 967 return total ;
cannam@125 968 } /* replace_write_f */
cannam@125 969
cannam@125 970 static sf_count_t
cannam@125 971 replace_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
cannam@125 972 { BUF_UNION ubuf ;
cannam@125 973 int bufferlen, writecount ;
cannam@125 974 sf_count_t total = 0 ;
cannam@125 975
cannam@125 976 bufferlen = ARRAY_LEN (ubuf.fbuf) ;
cannam@125 977
cannam@125 978 while (len > 0)
cannam@125 979 { if (len < bufferlen)
cannam@125 980 bufferlen = (int) len ;
cannam@125 981 d2f_array (ptr + total, ubuf.fbuf, bufferlen) ;
cannam@125 982
cannam@125 983 if (psf->peak_info)
cannam@125 984 float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ;
cannam@125 985
cannam@125 986 f2bf_array (ubuf.fbuf, bufferlen) ;
cannam@125 987
cannam@125 988 if (psf->data_endswap == SF_TRUE)
cannam@125 989 endswap_int_array (ubuf.ibuf, bufferlen) ;
cannam@125 990
cannam@125 991 writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ;
cannam@125 992 total += writecount ;
cannam@125 993 if (writecount < bufferlen)
cannam@125 994 break ;
cannam@125 995 len -= writecount ;
cannam@125 996 } ;
cannam@125 997
cannam@125 998 return total ;
cannam@125 999 } /* replace_write_d2f */
cannam@125 1000
cannam@125 1001 /*----------------------------------------------------------------------------------------------
cannam@125 1002 */
cannam@125 1003
cannam@125 1004 static void
cannam@125 1005 bf2f_array (float *buffer, int count)
cannam@125 1006 { while (--count >= 0)
cannam@125 1007 { buffer [count] = FLOAT32_READ ((unsigned char *) (buffer + count)) ;
cannam@125 1008 } ;
cannam@125 1009 } /* bf2f_array */
cannam@125 1010
cannam@125 1011 static void
cannam@125 1012 f2bf_array (float *buffer, int count)
cannam@125 1013 { while (--count >= 0)
cannam@125 1014 { FLOAT32_WRITE (buffer [count], (unsigned char*) (buffer + count)) ;
cannam@125 1015 } ;
cannam@125 1016 } /* f2bf_array */
cannam@125 1017