annotate src/portaudio_20140130/src/common/pa_converters.c @ 58:eab3b14ddc95

Further win32 build updates
author Chris Cannam
date Mon, 09 Jan 2017 13:51:38 +0000
parents 7ddb4fc30dac
children
rev   line source
Chris@39 1 /*
Chris@39 2 * $Id: pa_converters.c 1748 2011-09-01 22:08:32Z philburk $
Chris@39 3 * Portable Audio I/O Library sample conversion mechanism
Chris@39 4 *
Chris@39 5 * Based on the Open Source API proposed by Ross Bencina
Chris@39 6 * Copyright (c) 1999-2002 Phil Burk, Ross Bencina
Chris@39 7 *
Chris@39 8 * Permission is hereby granted, free of charge, to any person obtaining
Chris@39 9 * a copy of this software and associated documentation files
Chris@39 10 * (the "Software"), to deal in the Software without restriction,
Chris@39 11 * including without limitation the rights to use, copy, modify, merge,
Chris@39 12 * publish, distribute, sublicense, and/or sell copies of the Software,
Chris@39 13 * and to permit persons to whom the Software is furnished to do so,
Chris@39 14 * subject to the following conditions:
Chris@39 15 *
Chris@39 16 * The above copyright notice and this permission notice shall be
Chris@39 17 * included in all copies or substantial portions of the Software.
Chris@39 18 *
Chris@39 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@39 20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@39 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Chris@39 22 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
Chris@39 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@39 24 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@39 25 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@39 26 */
Chris@39 27
Chris@39 28 /*
Chris@39 29 * The text above constitutes the entire PortAudio license; however,
Chris@39 30 * the PortAudio community also makes the following non-binding requests:
Chris@39 31 *
Chris@39 32 * Any person wishing to distribute modifications to the Software is
Chris@39 33 * requested to send the modifications to the original developer so that
Chris@39 34 * they can be incorporated into the canonical version. It is also
Chris@39 35 * requested that these non-binding requests be included along with the
Chris@39 36 * license above.
Chris@39 37 */
Chris@39 38
Chris@39 39 /** @file
Chris@39 40 @ingroup common_src
Chris@39 41
Chris@39 42 @brief Conversion function implementations.
Chris@39 43
Chris@39 44 If the C9x function lrintf() is available, define PA_USE_C99_LRINTF to use it
Chris@39 45
Chris@39 46 @todo Consider whether functions which dither but don't clip should exist,
Chris@39 47 V18 automatically enabled clipping whenever dithering was selected. Perhaps
Chris@39 48 we should do the same.
Chris@39 49 see: "require clipping for dithering sample conversion functions?"
Chris@39 50 http://www.portaudio.com/trac/ticket/112
Chris@39 51
Chris@39 52 @todo implement the converters marked IMPLEMENT ME: Int32_To_Int24_Dither,
Chris@39 53 Int32_To_UInt8_Dither, Int24_To_Int16_Dither, Int24_To_Int8_Dither,
Chris@39 54 Int24_To_UInt8_Dither, Int16_To_Int8_Dither, Int16_To_UInt8_Dither
Chris@39 55 see: "some conversion functions are not implemented in pa_converters.c"
Chris@39 56 http://www.portaudio.com/trac/ticket/35
Chris@39 57
Chris@39 58 @todo review the converters marked REVIEW: Float32_To_Int32,
Chris@39 59 Float32_To_Int32_Dither, Float32_To_Int32_Clip, Float32_To_Int32_DitherClip,
Chris@39 60 Int32_To_Int16_Dither, Int32_To_Int8_Dither, Int16_To_Int32
Chris@39 61 */
Chris@39 62
Chris@39 63
Chris@39 64 #include "pa_converters.h"
Chris@39 65 #include "pa_dither.h"
Chris@39 66 #include "pa_endianness.h"
Chris@39 67 #include "pa_types.h"
Chris@39 68
Chris@39 69
Chris@39 70 PaSampleFormat PaUtil_SelectClosestAvailableFormat(
Chris@39 71 PaSampleFormat availableFormats, PaSampleFormat format )
Chris@39 72 {
Chris@39 73 PaSampleFormat result;
Chris@39 74
Chris@39 75 format &= ~paNonInterleaved;
Chris@39 76 availableFormats &= ~paNonInterleaved;
Chris@39 77
Chris@39 78 if( (format & availableFormats) == 0 )
Chris@39 79 {
Chris@39 80 /* NOTE: this code depends on the sample format constants being in
Chris@39 81 descending order of quality - ie best quality is 0
Chris@39 82 FIXME: should write an assert which checks that all of the
Chris@39 83 known constants conform to that requirement.
Chris@39 84 */
Chris@39 85
Chris@39 86 if( format != 0x01 )
Chris@39 87 {
Chris@39 88 /* scan for better formats */
Chris@39 89 result = format;
Chris@39 90 do
Chris@39 91 {
Chris@39 92 result >>= 1;
Chris@39 93 }
Chris@39 94 while( (result & availableFormats) == 0 && result != 0 );
Chris@39 95 }
Chris@39 96 else
Chris@39 97 {
Chris@39 98 result = 0;
Chris@39 99 }
Chris@39 100
Chris@39 101 if( result == 0 ){
Chris@39 102 /* scan for worse formats */
Chris@39 103 result = format;
Chris@39 104 do
Chris@39 105 {
Chris@39 106 result <<= 1;
Chris@39 107 }
Chris@39 108 while( (result & availableFormats) == 0 && result != paCustomFormat );
Chris@39 109
Chris@39 110 if( (result & availableFormats) == 0 )
Chris@39 111 result = paSampleFormatNotSupported;
Chris@39 112 }
Chris@39 113
Chris@39 114 }else{
Chris@39 115 result = format;
Chris@39 116 }
Chris@39 117
Chris@39 118 return result;
Chris@39 119 }
Chris@39 120
Chris@39 121 /* -------------------------------------------------------------------------- */
Chris@39 122
Chris@39 123 #define PA_SELECT_FORMAT_( format, float32, int32, int24, int16, int8, uint8 ) \
Chris@39 124 switch( format & ~paNonInterleaved ){ \
Chris@39 125 case paFloat32: \
Chris@39 126 float32 \
Chris@39 127 case paInt32: \
Chris@39 128 int32 \
Chris@39 129 case paInt24: \
Chris@39 130 int24 \
Chris@39 131 case paInt16: \
Chris@39 132 int16 \
Chris@39 133 case paInt8: \
Chris@39 134 int8 \
Chris@39 135 case paUInt8: \
Chris@39 136 uint8 \
Chris@39 137 default: return 0; \
Chris@39 138 }
Chris@39 139
Chris@39 140 /* -------------------------------------------------------------------------- */
Chris@39 141
Chris@39 142 #define PA_SELECT_CONVERTER_DITHER_CLIP_( flags, source, destination ) \
Chris@39 143 if( flags & paClipOff ){ /* no clip */ \
Chris@39 144 if( flags & paDitherOff ){ /* no dither */ \
Chris@39 145 return paConverters. source ## _To_ ## destination; \
Chris@39 146 }else{ /* dither */ \
Chris@39 147 return paConverters. source ## _To_ ## destination ## _Dither; \
Chris@39 148 } \
Chris@39 149 }else{ /* clip */ \
Chris@39 150 if( flags & paDitherOff ){ /* no dither */ \
Chris@39 151 return paConverters. source ## _To_ ## destination ## _Clip; \
Chris@39 152 }else{ /* dither */ \
Chris@39 153 return paConverters. source ## _To_ ## destination ## _DitherClip; \
Chris@39 154 } \
Chris@39 155 }
Chris@39 156
Chris@39 157 /* -------------------------------------------------------------------------- */
Chris@39 158
Chris@39 159 #define PA_SELECT_CONVERTER_DITHER_( flags, source, destination ) \
Chris@39 160 if( flags & paDitherOff ){ /* no dither */ \
Chris@39 161 return paConverters. source ## _To_ ## destination; \
Chris@39 162 }else{ /* dither */ \
Chris@39 163 return paConverters. source ## _To_ ## destination ## _Dither; \
Chris@39 164 }
Chris@39 165
Chris@39 166 /* -------------------------------------------------------------------------- */
Chris@39 167
Chris@39 168 #define PA_USE_CONVERTER_( source, destination )\
Chris@39 169 return paConverters. source ## _To_ ## destination;
Chris@39 170
Chris@39 171 /* -------------------------------------------------------------------------- */
Chris@39 172
Chris@39 173 #define PA_UNITY_CONVERSION_( wordlength )\
Chris@39 174 return paConverters. Copy_ ## wordlength ## _To_ ## wordlength;
Chris@39 175
Chris@39 176 /* -------------------------------------------------------------------------- */
Chris@39 177
Chris@39 178 PaUtilConverter* PaUtil_SelectConverter( PaSampleFormat sourceFormat,
Chris@39 179 PaSampleFormat destinationFormat, PaStreamFlags flags )
Chris@39 180 {
Chris@39 181 PA_SELECT_FORMAT_( sourceFormat,
Chris@39 182 /* paFloat32: */
Chris@39 183 PA_SELECT_FORMAT_( destinationFormat,
Chris@39 184 /* paFloat32: */ PA_UNITY_CONVERSION_( 32 ),
Chris@39 185 /* paInt32: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int32 ),
Chris@39 186 /* paInt24: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int24 ),
Chris@39 187 /* paInt16: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int16 ),
Chris@39 188 /* paInt8: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, Int8 ),
Chris@39 189 /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_CLIP_( flags, Float32, UInt8 )
Chris@39 190 ),
Chris@39 191 /* paInt32: */
Chris@39 192 PA_SELECT_FORMAT_( destinationFormat,
Chris@39 193 /* paFloat32: */ PA_USE_CONVERTER_( Int32, Float32 ),
Chris@39 194 /* paInt32: */ PA_UNITY_CONVERSION_( 32 ),
Chris@39 195 /* paInt24: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int24 ),
Chris@39 196 /* paInt16: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int16 ),
Chris@39 197 /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, Int8 ),
Chris@39 198 /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int32, UInt8 )
Chris@39 199 ),
Chris@39 200 /* paInt24: */
Chris@39 201 PA_SELECT_FORMAT_( destinationFormat,
Chris@39 202 /* paFloat32: */ PA_USE_CONVERTER_( Int24, Float32 ),
Chris@39 203 /* paInt32: */ PA_USE_CONVERTER_( Int24, Int32 ),
Chris@39 204 /* paInt24: */ PA_UNITY_CONVERSION_( 24 ),
Chris@39 205 /* paInt16: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, Int16 ),
Chris@39 206 /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, Int8 ),
Chris@39 207 /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int24, UInt8 )
Chris@39 208 ),
Chris@39 209 /* paInt16: */
Chris@39 210 PA_SELECT_FORMAT_( destinationFormat,
Chris@39 211 /* paFloat32: */ PA_USE_CONVERTER_( Int16, Float32 ),
Chris@39 212 /* paInt32: */ PA_USE_CONVERTER_( Int16, Int32 ),
Chris@39 213 /* paInt24: */ PA_USE_CONVERTER_( Int16, Int24 ),
Chris@39 214 /* paInt16: */ PA_UNITY_CONVERSION_( 16 ),
Chris@39 215 /* paInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int16, Int8 ),
Chris@39 216 /* paUInt8: */ PA_SELECT_CONVERTER_DITHER_( flags, Int16, UInt8 )
Chris@39 217 ),
Chris@39 218 /* paInt8: */
Chris@39 219 PA_SELECT_FORMAT_( destinationFormat,
Chris@39 220 /* paFloat32: */ PA_USE_CONVERTER_( Int8, Float32 ),
Chris@39 221 /* paInt32: */ PA_USE_CONVERTER_( Int8, Int32 ),
Chris@39 222 /* paInt24: */ PA_USE_CONVERTER_( Int8, Int24 ),
Chris@39 223 /* paInt16: */ PA_USE_CONVERTER_( Int8, Int16 ),
Chris@39 224 /* paInt8: */ PA_UNITY_CONVERSION_( 8 ),
Chris@39 225 /* paUInt8: */ PA_USE_CONVERTER_( Int8, UInt8 )
Chris@39 226 ),
Chris@39 227 /* paUInt8: */
Chris@39 228 PA_SELECT_FORMAT_( destinationFormat,
Chris@39 229 /* paFloat32: */ PA_USE_CONVERTER_( UInt8, Float32 ),
Chris@39 230 /* paInt32: */ PA_USE_CONVERTER_( UInt8, Int32 ),
Chris@39 231 /* paInt24: */ PA_USE_CONVERTER_( UInt8, Int24 ),
Chris@39 232 /* paInt16: */ PA_USE_CONVERTER_( UInt8, Int16 ),
Chris@39 233 /* paInt8: */ PA_USE_CONVERTER_( UInt8, Int8 ),
Chris@39 234 /* paUInt8: */ PA_UNITY_CONVERSION_( 8 )
Chris@39 235 )
Chris@39 236 )
Chris@39 237 }
Chris@39 238
Chris@39 239 /* -------------------------------------------------------------------------- */
Chris@39 240
Chris@39 241 #ifdef PA_NO_STANDARD_CONVERTERS
Chris@39 242
Chris@39 243 /* -------------------------------------------------------------------------- */
Chris@39 244
Chris@39 245 PaUtilConverterTable paConverters = {
Chris@39 246 0, /* PaUtilConverter *Float32_To_Int32; */
Chris@39 247 0, /* PaUtilConverter *Float32_To_Int32_Dither; */
Chris@39 248 0, /* PaUtilConverter *Float32_To_Int32_Clip; */
Chris@39 249 0, /* PaUtilConverter *Float32_To_Int32_DitherClip; */
Chris@39 250
Chris@39 251 0, /* PaUtilConverter *Float32_To_Int24; */
Chris@39 252 0, /* PaUtilConverter *Float32_To_Int24_Dither; */
Chris@39 253 0, /* PaUtilConverter *Float32_To_Int24_Clip; */
Chris@39 254 0, /* PaUtilConverter *Float32_To_Int24_DitherClip; */
Chris@39 255
Chris@39 256 0, /* PaUtilConverter *Float32_To_Int16; */
Chris@39 257 0, /* PaUtilConverter *Float32_To_Int16_Dither; */
Chris@39 258 0, /* PaUtilConverter *Float32_To_Int16_Clip; */
Chris@39 259 0, /* PaUtilConverter *Float32_To_Int16_DitherClip; */
Chris@39 260
Chris@39 261 0, /* PaUtilConverter *Float32_To_Int8; */
Chris@39 262 0, /* PaUtilConverter *Float32_To_Int8_Dither; */
Chris@39 263 0, /* PaUtilConverter *Float32_To_Int8_Clip; */
Chris@39 264 0, /* PaUtilConverter *Float32_To_Int8_DitherClip; */
Chris@39 265
Chris@39 266 0, /* PaUtilConverter *Float32_To_UInt8; */
Chris@39 267 0, /* PaUtilConverter *Float32_To_UInt8_Dither; */
Chris@39 268 0, /* PaUtilConverter *Float32_To_UInt8_Clip; */
Chris@39 269 0, /* PaUtilConverter *Float32_To_UInt8_DitherClip; */
Chris@39 270
Chris@39 271 0, /* PaUtilConverter *Int32_To_Float32; */
Chris@39 272 0, /* PaUtilConverter *Int32_To_Int24; */
Chris@39 273 0, /* PaUtilConverter *Int32_To_Int24_Dither; */
Chris@39 274 0, /* PaUtilConverter *Int32_To_Int16; */
Chris@39 275 0, /* PaUtilConverter *Int32_To_Int16_Dither; */
Chris@39 276 0, /* PaUtilConverter *Int32_To_Int8; */
Chris@39 277 0, /* PaUtilConverter *Int32_To_Int8_Dither; */
Chris@39 278 0, /* PaUtilConverter *Int32_To_UInt8; */
Chris@39 279 0, /* PaUtilConverter *Int32_To_UInt8_Dither; */
Chris@39 280
Chris@39 281 0, /* PaUtilConverter *Int24_To_Float32; */
Chris@39 282 0, /* PaUtilConverter *Int24_To_Int32; */
Chris@39 283 0, /* PaUtilConverter *Int24_To_Int16; */
Chris@39 284 0, /* PaUtilConverter *Int24_To_Int16_Dither; */
Chris@39 285 0, /* PaUtilConverter *Int24_To_Int8; */
Chris@39 286 0, /* PaUtilConverter *Int24_To_Int8_Dither; */
Chris@39 287 0, /* PaUtilConverter *Int24_To_UInt8; */
Chris@39 288 0, /* PaUtilConverter *Int24_To_UInt8_Dither; */
Chris@39 289
Chris@39 290 0, /* PaUtilConverter *Int16_To_Float32; */
Chris@39 291 0, /* PaUtilConverter *Int16_To_Int32; */
Chris@39 292 0, /* PaUtilConverter *Int16_To_Int24; */
Chris@39 293 0, /* PaUtilConverter *Int16_To_Int8; */
Chris@39 294 0, /* PaUtilConverter *Int16_To_Int8_Dither; */
Chris@39 295 0, /* PaUtilConverter *Int16_To_UInt8; */
Chris@39 296 0, /* PaUtilConverter *Int16_To_UInt8_Dither; */
Chris@39 297
Chris@39 298 0, /* PaUtilConverter *Int8_To_Float32; */
Chris@39 299 0, /* PaUtilConverter *Int8_To_Int32; */
Chris@39 300 0, /* PaUtilConverter *Int8_To_Int24 */
Chris@39 301 0, /* PaUtilConverter *Int8_To_Int16; */
Chris@39 302 0, /* PaUtilConverter *Int8_To_UInt8; */
Chris@39 303
Chris@39 304 0, /* PaUtilConverter *UInt8_To_Float32; */
Chris@39 305 0, /* PaUtilConverter *UInt8_To_Int32; */
Chris@39 306 0, /* PaUtilConverter *UInt8_To_Int24; */
Chris@39 307 0, /* PaUtilConverter *UInt8_To_Int16; */
Chris@39 308 0, /* PaUtilConverter *UInt8_To_Int8; */
Chris@39 309
Chris@39 310 0, /* PaUtilConverter *Copy_8_To_8; */
Chris@39 311 0, /* PaUtilConverter *Copy_16_To_16; */
Chris@39 312 0, /* PaUtilConverter *Copy_24_To_24; */
Chris@39 313 0 /* PaUtilConverter *Copy_32_To_32; */
Chris@39 314 };
Chris@39 315
Chris@39 316 /* -------------------------------------------------------------------------- */
Chris@39 317
Chris@39 318 #else /* PA_NO_STANDARD_CONVERTERS is not defined */
Chris@39 319
Chris@39 320 /* -------------------------------------------------------------------------- */
Chris@39 321
Chris@39 322 #define PA_CLIP_( val, min, max )\
Chris@39 323 { val = ((val) < (min)) ? (min) : (((val) > (max)) ? (max) : (val)); }
Chris@39 324
Chris@39 325
Chris@39 326 static const float const_1_div_128_ = 1.0f / 128.0f; /* 8 bit multiplier */
Chris@39 327
Chris@39 328 static const float const_1_div_32768_ = 1.0f / 32768.f; /* 16 bit multiplier */
Chris@39 329
Chris@39 330 static const double const_1_div_2147483648_ = 1.0 / 2147483648.0; /* 32 bit multiplier */
Chris@39 331
Chris@39 332 /* -------------------------------------------------------------------------- */
Chris@39 333
Chris@39 334 static void Float32_To_Int32(
Chris@39 335 void *destinationBuffer, signed int destinationStride,
Chris@39 336 void *sourceBuffer, signed int sourceStride,
Chris@39 337 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 338 {
Chris@39 339 float *src = (float*)sourceBuffer;
Chris@39 340 PaInt32 *dest = (PaInt32*)destinationBuffer;
Chris@39 341 (void)ditherGenerator; /* unused parameter */
Chris@39 342
Chris@39 343 while( count-- )
Chris@39 344 {
Chris@39 345 /* REVIEW */
Chris@39 346 #ifdef PA_USE_C99_LRINTF
Chris@39 347 float scaled = *src * 0x7FFFFFFF;
Chris@39 348 *dest = lrintf(scaled-0.5f);
Chris@39 349 #else
Chris@39 350 double scaled = *src * 0x7FFFFFFF;
Chris@39 351 *dest = (PaInt32) scaled;
Chris@39 352 #endif
Chris@39 353
Chris@39 354 src += sourceStride;
Chris@39 355 dest += destinationStride;
Chris@39 356 }
Chris@39 357 }
Chris@39 358
Chris@39 359 /* -------------------------------------------------------------------------- */
Chris@39 360
Chris@39 361 static void Float32_To_Int32_Dither(
Chris@39 362 void *destinationBuffer, signed int destinationStride,
Chris@39 363 void *sourceBuffer, signed int sourceStride,
Chris@39 364 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 365 {
Chris@39 366 float *src = (float*)sourceBuffer;
Chris@39 367 PaInt32 *dest = (PaInt32*)destinationBuffer;
Chris@39 368
Chris@39 369 while( count-- )
Chris@39 370 {
Chris@39 371 /* REVIEW */
Chris@39 372 #ifdef PA_USE_C99_LRINTF
Chris@39 373 float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 374 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 375 float dithered = ((float)*src * (2147483646.0f)) + dither;
Chris@39 376 *dest = lrintf(dithered - 0.5f);
Chris@39 377 #else
Chris@39 378 double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 379 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 380 double dithered = ((double)*src * (2147483646.0)) + dither;
Chris@39 381 *dest = (PaInt32) dithered;
Chris@39 382 #endif
Chris@39 383 src += sourceStride;
Chris@39 384 dest += destinationStride;
Chris@39 385 }
Chris@39 386 }
Chris@39 387
Chris@39 388 /* -------------------------------------------------------------------------- */
Chris@39 389
Chris@39 390 static void Float32_To_Int32_Clip(
Chris@39 391 void *destinationBuffer, signed int destinationStride,
Chris@39 392 void *sourceBuffer, signed int sourceStride,
Chris@39 393 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 394 {
Chris@39 395 float *src = (float*)sourceBuffer;
Chris@39 396 PaInt32 *dest = (PaInt32*)destinationBuffer;
Chris@39 397 (void) ditherGenerator; /* unused parameter */
Chris@39 398
Chris@39 399 while( count-- )
Chris@39 400 {
Chris@39 401 /* REVIEW */
Chris@39 402 #ifdef PA_USE_C99_LRINTF
Chris@39 403 float scaled = *src * 0x7FFFFFFF;
Chris@39 404 PA_CLIP_( scaled, -2147483648.f, 2147483647.f );
Chris@39 405 *dest = lrintf(scaled-0.5f);
Chris@39 406 #else
Chris@39 407 double scaled = *src * 0x7FFFFFFF;
Chris@39 408 PA_CLIP_( scaled, -2147483648., 2147483647. );
Chris@39 409 *dest = (PaInt32) scaled;
Chris@39 410 #endif
Chris@39 411
Chris@39 412 src += sourceStride;
Chris@39 413 dest += destinationStride;
Chris@39 414 }
Chris@39 415 }
Chris@39 416
Chris@39 417 /* -------------------------------------------------------------------------- */
Chris@39 418
Chris@39 419 static void Float32_To_Int32_DitherClip(
Chris@39 420 void *destinationBuffer, signed int destinationStride,
Chris@39 421 void *sourceBuffer, signed int sourceStride,
Chris@39 422 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 423 {
Chris@39 424 float *src = (float*)sourceBuffer;
Chris@39 425 PaInt32 *dest = (PaInt32*)destinationBuffer;
Chris@39 426
Chris@39 427 while( count-- )
Chris@39 428 {
Chris@39 429 /* REVIEW */
Chris@39 430 #ifdef PA_USE_C99_LRINTF
Chris@39 431 float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 432 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 433 float dithered = ((float)*src * (2147483646.0f)) + dither;
Chris@39 434 PA_CLIP_( dithered, -2147483648.f, 2147483647.f );
Chris@39 435 *dest = lrintf(dithered-0.5f);
Chris@39 436 #else
Chris@39 437 double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 438 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 439 double dithered = ((double)*src * (2147483646.0)) + dither;
Chris@39 440 PA_CLIP_( dithered, -2147483648., 2147483647. );
Chris@39 441 *dest = (PaInt32) dithered;
Chris@39 442 #endif
Chris@39 443
Chris@39 444 src += sourceStride;
Chris@39 445 dest += destinationStride;
Chris@39 446 }
Chris@39 447 }
Chris@39 448
Chris@39 449 /* -------------------------------------------------------------------------- */
Chris@39 450
Chris@39 451 static void Float32_To_Int24(
Chris@39 452 void *destinationBuffer, signed int destinationStride,
Chris@39 453 void *sourceBuffer, signed int sourceStride,
Chris@39 454 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 455 {
Chris@39 456 float *src = (float*)sourceBuffer;
Chris@39 457 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 458 PaInt32 temp;
Chris@39 459
Chris@39 460 (void) ditherGenerator; /* unused parameter */
Chris@39 461
Chris@39 462 while( count-- )
Chris@39 463 {
Chris@39 464 /* convert to 32 bit and drop the low 8 bits */
Chris@39 465 double scaled = (double)(*src) * 2147483647.0;
Chris@39 466 temp = (PaInt32) scaled;
Chris@39 467
Chris@39 468 #if defined(PA_LITTLE_ENDIAN)
Chris@39 469 dest[0] = (unsigned char)(temp >> 8);
Chris@39 470 dest[1] = (unsigned char)(temp >> 16);
Chris@39 471 dest[2] = (unsigned char)(temp >> 24);
Chris@39 472 #elif defined(PA_BIG_ENDIAN)
Chris@39 473 dest[0] = (unsigned char)(temp >> 24);
Chris@39 474 dest[1] = (unsigned char)(temp >> 16);
Chris@39 475 dest[2] = (unsigned char)(temp >> 8);
Chris@39 476 #endif
Chris@39 477
Chris@39 478 src += sourceStride;
Chris@39 479 dest += destinationStride * 3;
Chris@39 480 }
Chris@39 481 }
Chris@39 482
Chris@39 483 /* -------------------------------------------------------------------------- */
Chris@39 484
Chris@39 485 static void Float32_To_Int24_Dither(
Chris@39 486 void *destinationBuffer, signed int destinationStride,
Chris@39 487 void *sourceBuffer, signed int sourceStride,
Chris@39 488 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 489 {
Chris@39 490 float *src = (float*)sourceBuffer;
Chris@39 491 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 492 PaInt32 temp;
Chris@39 493
Chris@39 494 while( count-- )
Chris@39 495 {
Chris@39 496 /* convert to 32 bit and drop the low 8 bits */
Chris@39 497
Chris@39 498 double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 499 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 500 double dithered = ((double)*src * (2147483646.0)) + dither;
Chris@39 501
Chris@39 502 temp = (PaInt32) dithered;
Chris@39 503
Chris@39 504 #if defined(PA_LITTLE_ENDIAN)
Chris@39 505 dest[0] = (unsigned char)(temp >> 8);
Chris@39 506 dest[1] = (unsigned char)(temp >> 16);
Chris@39 507 dest[2] = (unsigned char)(temp >> 24);
Chris@39 508 #elif defined(PA_BIG_ENDIAN)
Chris@39 509 dest[0] = (unsigned char)(temp >> 24);
Chris@39 510 dest[1] = (unsigned char)(temp >> 16);
Chris@39 511 dest[2] = (unsigned char)(temp >> 8);
Chris@39 512 #endif
Chris@39 513
Chris@39 514 src += sourceStride;
Chris@39 515 dest += destinationStride * 3;
Chris@39 516 }
Chris@39 517 }
Chris@39 518
Chris@39 519 /* -------------------------------------------------------------------------- */
Chris@39 520
Chris@39 521 static void Float32_To_Int24_Clip(
Chris@39 522 void *destinationBuffer, signed int destinationStride,
Chris@39 523 void *sourceBuffer, signed int sourceStride,
Chris@39 524 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 525 {
Chris@39 526 float *src = (float*)sourceBuffer;
Chris@39 527 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 528 PaInt32 temp;
Chris@39 529
Chris@39 530 (void) ditherGenerator; /* unused parameter */
Chris@39 531
Chris@39 532 while( count-- )
Chris@39 533 {
Chris@39 534 /* convert to 32 bit and drop the low 8 bits */
Chris@39 535 double scaled = *src * 0x7FFFFFFF;
Chris@39 536 PA_CLIP_( scaled, -2147483648., 2147483647. );
Chris@39 537 temp = (PaInt32) scaled;
Chris@39 538
Chris@39 539 #if defined(PA_LITTLE_ENDIAN)
Chris@39 540 dest[0] = (unsigned char)(temp >> 8);
Chris@39 541 dest[1] = (unsigned char)(temp >> 16);
Chris@39 542 dest[2] = (unsigned char)(temp >> 24);
Chris@39 543 #elif defined(PA_BIG_ENDIAN)
Chris@39 544 dest[0] = (unsigned char)(temp >> 24);
Chris@39 545 dest[1] = (unsigned char)(temp >> 16);
Chris@39 546 dest[2] = (unsigned char)(temp >> 8);
Chris@39 547 #endif
Chris@39 548
Chris@39 549 src += sourceStride;
Chris@39 550 dest += destinationStride * 3;
Chris@39 551 }
Chris@39 552 }
Chris@39 553
Chris@39 554 /* -------------------------------------------------------------------------- */
Chris@39 555
Chris@39 556 static void Float32_To_Int24_DitherClip(
Chris@39 557 void *destinationBuffer, signed int destinationStride,
Chris@39 558 void *sourceBuffer, signed int sourceStride,
Chris@39 559 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 560 {
Chris@39 561 float *src = (float*)sourceBuffer;
Chris@39 562 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 563 PaInt32 temp;
Chris@39 564
Chris@39 565 while( count-- )
Chris@39 566 {
Chris@39 567 /* convert to 32 bit and drop the low 8 bits */
Chris@39 568
Chris@39 569 double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 570 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 571 double dithered = ((double)*src * (2147483646.0)) + dither;
Chris@39 572 PA_CLIP_( dithered, -2147483648., 2147483647. );
Chris@39 573
Chris@39 574 temp = (PaInt32) dithered;
Chris@39 575
Chris@39 576 #if defined(PA_LITTLE_ENDIAN)
Chris@39 577 dest[0] = (unsigned char)(temp >> 8);
Chris@39 578 dest[1] = (unsigned char)(temp >> 16);
Chris@39 579 dest[2] = (unsigned char)(temp >> 24);
Chris@39 580 #elif defined(PA_BIG_ENDIAN)
Chris@39 581 dest[0] = (unsigned char)(temp >> 24);
Chris@39 582 dest[1] = (unsigned char)(temp >> 16);
Chris@39 583 dest[2] = (unsigned char)(temp >> 8);
Chris@39 584 #endif
Chris@39 585
Chris@39 586 src += sourceStride;
Chris@39 587 dest += destinationStride * 3;
Chris@39 588 }
Chris@39 589 }
Chris@39 590
Chris@39 591 /* -------------------------------------------------------------------------- */
Chris@39 592
Chris@39 593 static void Float32_To_Int16(
Chris@39 594 void *destinationBuffer, signed int destinationStride,
Chris@39 595 void *sourceBuffer, signed int sourceStride,
Chris@39 596 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 597 {
Chris@39 598 float *src = (float*)sourceBuffer;
Chris@39 599 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 600 (void)ditherGenerator; /* unused parameter */
Chris@39 601
Chris@39 602 while( count-- )
Chris@39 603 {
Chris@39 604 #ifdef PA_USE_C99_LRINTF
Chris@39 605 float tempf = (*src * (32767.0f)) ;
Chris@39 606 *dest = lrintf(tempf-0.5f);
Chris@39 607 #else
Chris@39 608 short samp = (short) (*src * (32767.0f));
Chris@39 609 *dest = samp;
Chris@39 610 #endif
Chris@39 611
Chris@39 612 src += sourceStride;
Chris@39 613 dest += destinationStride;
Chris@39 614 }
Chris@39 615 }
Chris@39 616
Chris@39 617 /* -------------------------------------------------------------------------- */
Chris@39 618
Chris@39 619 static void Float32_To_Int16_Dither(
Chris@39 620 void *destinationBuffer, signed int destinationStride,
Chris@39 621 void *sourceBuffer, signed int sourceStride,
Chris@39 622 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 623 {
Chris@39 624 float *src = (float*)sourceBuffer;
Chris@39 625 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 626
Chris@39 627 while( count-- )
Chris@39 628 {
Chris@39 629
Chris@39 630 float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 631 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 632 float dithered = (*src * (32766.0f)) + dither;
Chris@39 633
Chris@39 634 #ifdef PA_USE_C99_LRINTF
Chris@39 635 *dest = lrintf(dithered-0.5f);
Chris@39 636 #else
Chris@39 637 *dest = (PaInt16) dithered;
Chris@39 638 #endif
Chris@39 639
Chris@39 640 src += sourceStride;
Chris@39 641 dest += destinationStride;
Chris@39 642 }
Chris@39 643 }
Chris@39 644
Chris@39 645 /* -------------------------------------------------------------------------- */
Chris@39 646
Chris@39 647 static void Float32_To_Int16_Clip(
Chris@39 648 void *destinationBuffer, signed int destinationStride,
Chris@39 649 void *sourceBuffer, signed int sourceStride,
Chris@39 650 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 651 {
Chris@39 652 float *src = (float*)sourceBuffer;
Chris@39 653 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 654 (void)ditherGenerator; /* unused parameter */
Chris@39 655
Chris@39 656 while( count-- )
Chris@39 657 {
Chris@39 658 #ifdef PA_USE_C99_LRINTF
Chris@39 659 long samp = lrintf((*src * (32767.0f)) -0.5f);
Chris@39 660 #else
Chris@39 661 long samp = (PaInt32) (*src * (32767.0f));
Chris@39 662 #endif
Chris@39 663 PA_CLIP_( samp, -0x8000, 0x7FFF );
Chris@39 664 *dest = (PaInt16) samp;
Chris@39 665
Chris@39 666 src += sourceStride;
Chris@39 667 dest += destinationStride;
Chris@39 668 }
Chris@39 669 }
Chris@39 670
Chris@39 671 /* -------------------------------------------------------------------------- */
Chris@39 672
Chris@39 673 static void Float32_To_Int16_DitherClip(
Chris@39 674 void *destinationBuffer, signed int destinationStride,
Chris@39 675 void *sourceBuffer, signed int sourceStride,
Chris@39 676 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 677 {
Chris@39 678 float *src = (float*)sourceBuffer;
Chris@39 679 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 680 (void)ditherGenerator; /* unused parameter */
Chris@39 681
Chris@39 682 while( count-- )
Chris@39 683 {
Chris@39 684
Chris@39 685 float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 686 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 687 float dithered = (*src * (32766.0f)) + dither;
Chris@39 688 PaInt32 samp = (PaInt32) dithered;
Chris@39 689 PA_CLIP_( samp, -0x8000, 0x7FFF );
Chris@39 690 #ifdef PA_USE_C99_LRINTF
Chris@39 691 *dest = lrintf(samp-0.5f);
Chris@39 692 #else
Chris@39 693 *dest = (PaInt16) samp;
Chris@39 694 #endif
Chris@39 695
Chris@39 696 src += sourceStride;
Chris@39 697 dest += destinationStride;
Chris@39 698 }
Chris@39 699 }
Chris@39 700
Chris@39 701 /* -------------------------------------------------------------------------- */
Chris@39 702
Chris@39 703 static void Float32_To_Int8(
Chris@39 704 void *destinationBuffer, signed int destinationStride,
Chris@39 705 void *sourceBuffer, signed int sourceStride,
Chris@39 706 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 707 {
Chris@39 708 float *src = (float*)sourceBuffer;
Chris@39 709 signed char *dest = (signed char*)destinationBuffer;
Chris@39 710 (void)ditherGenerator; /* unused parameter */
Chris@39 711
Chris@39 712 while( count-- )
Chris@39 713 {
Chris@39 714 signed char samp = (signed char) (*src * (127.0f));
Chris@39 715 *dest = samp;
Chris@39 716
Chris@39 717 src += sourceStride;
Chris@39 718 dest += destinationStride;
Chris@39 719 }
Chris@39 720 }
Chris@39 721
Chris@39 722 /* -------------------------------------------------------------------------- */
Chris@39 723
Chris@39 724 static void Float32_To_Int8_Dither(
Chris@39 725 void *destinationBuffer, signed int destinationStride,
Chris@39 726 void *sourceBuffer, signed int sourceStride,
Chris@39 727 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 728 {
Chris@39 729 float *src = (float*)sourceBuffer;
Chris@39 730 signed char *dest = (signed char*)destinationBuffer;
Chris@39 731
Chris@39 732 while( count-- )
Chris@39 733 {
Chris@39 734 float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 735 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 736 float dithered = (*src * (126.0f)) + dither;
Chris@39 737 PaInt32 samp = (PaInt32) dithered;
Chris@39 738 *dest = (signed char) samp;
Chris@39 739
Chris@39 740 src += sourceStride;
Chris@39 741 dest += destinationStride;
Chris@39 742 }
Chris@39 743 }
Chris@39 744
Chris@39 745 /* -------------------------------------------------------------------------- */
Chris@39 746
Chris@39 747 static void Float32_To_Int8_Clip(
Chris@39 748 void *destinationBuffer, signed int destinationStride,
Chris@39 749 void *sourceBuffer, signed int sourceStride,
Chris@39 750 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 751 {
Chris@39 752 float *src = (float*)sourceBuffer;
Chris@39 753 signed char *dest = (signed char*)destinationBuffer;
Chris@39 754 (void)ditherGenerator; /* unused parameter */
Chris@39 755
Chris@39 756 while( count-- )
Chris@39 757 {
Chris@39 758 PaInt32 samp = (PaInt32)(*src * (127.0f));
Chris@39 759 PA_CLIP_( samp, -0x80, 0x7F );
Chris@39 760 *dest = (signed char) samp;
Chris@39 761
Chris@39 762 src += sourceStride;
Chris@39 763 dest += destinationStride;
Chris@39 764 }
Chris@39 765 }
Chris@39 766
Chris@39 767 /* -------------------------------------------------------------------------- */
Chris@39 768
Chris@39 769 static void Float32_To_Int8_DitherClip(
Chris@39 770 void *destinationBuffer, signed int destinationStride,
Chris@39 771 void *sourceBuffer, signed int sourceStride,
Chris@39 772 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 773 {
Chris@39 774 float *src = (float*)sourceBuffer;
Chris@39 775 signed char *dest = (signed char*)destinationBuffer;
Chris@39 776 (void)ditherGenerator; /* unused parameter */
Chris@39 777
Chris@39 778 while( count-- )
Chris@39 779 {
Chris@39 780 float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 781 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 782 float dithered = (*src * (126.0f)) + dither;
Chris@39 783 PaInt32 samp = (PaInt32) dithered;
Chris@39 784 PA_CLIP_( samp, -0x80, 0x7F );
Chris@39 785 *dest = (signed char) samp;
Chris@39 786
Chris@39 787 src += sourceStride;
Chris@39 788 dest += destinationStride;
Chris@39 789 }
Chris@39 790 }
Chris@39 791
Chris@39 792 /* -------------------------------------------------------------------------- */
Chris@39 793
Chris@39 794 static void Float32_To_UInt8(
Chris@39 795 void *destinationBuffer, signed int destinationStride,
Chris@39 796 void *sourceBuffer, signed int sourceStride,
Chris@39 797 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 798 {
Chris@39 799 float *src = (float*)sourceBuffer;
Chris@39 800 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 801 (void)ditherGenerator; /* unused parameter */
Chris@39 802
Chris@39 803 while( count-- )
Chris@39 804 {
Chris@39 805 unsigned char samp = (unsigned char)(128 + ((unsigned char) (*src * (127.0f))));
Chris@39 806 *dest = samp;
Chris@39 807
Chris@39 808 src += sourceStride;
Chris@39 809 dest += destinationStride;
Chris@39 810 }
Chris@39 811 }
Chris@39 812
Chris@39 813 /* -------------------------------------------------------------------------- */
Chris@39 814
Chris@39 815 static void Float32_To_UInt8_Dither(
Chris@39 816 void *destinationBuffer, signed int destinationStride,
Chris@39 817 void *sourceBuffer, signed int sourceStride,
Chris@39 818 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 819 {
Chris@39 820 float *src = (float*)sourceBuffer;
Chris@39 821 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 822
Chris@39 823 while( count-- )
Chris@39 824 {
Chris@39 825 float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 826 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 827 float dithered = (*src * (126.0f)) + dither;
Chris@39 828 PaInt32 samp = (PaInt32) dithered;
Chris@39 829 *dest = (unsigned char) (128 + samp);
Chris@39 830
Chris@39 831 src += sourceStride;
Chris@39 832 dest += destinationStride;
Chris@39 833 }
Chris@39 834 }
Chris@39 835
Chris@39 836 /* -------------------------------------------------------------------------- */
Chris@39 837
Chris@39 838 static void Float32_To_UInt8_Clip(
Chris@39 839 void *destinationBuffer, signed int destinationStride,
Chris@39 840 void *sourceBuffer, signed int sourceStride,
Chris@39 841 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 842 {
Chris@39 843 float *src = (float*)sourceBuffer;
Chris@39 844 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 845 (void)ditherGenerator; /* unused parameter */
Chris@39 846
Chris@39 847 while( count-- )
Chris@39 848 {
Chris@39 849 PaInt32 samp = 128 + (PaInt32)(*src * (127.0f));
Chris@39 850 PA_CLIP_( samp, 0x0000, 0x00FF );
Chris@39 851 *dest = (unsigned char) samp;
Chris@39 852
Chris@39 853 src += sourceStride;
Chris@39 854 dest += destinationStride;
Chris@39 855 }
Chris@39 856 }
Chris@39 857
Chris@39 858 /* -------------------------------------------------------------------------- */
Chris@39 859
Chris@39 860 static void Float32_To_UInt8_DitherClip(
Chris@39 861 void *destinationBuffer, signed int destinationStride,
Chris@39 862 void *sourceBuffer, signed int sourceStride,
Chris@39 863 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 864 {
Chris@39 865 float *src = (float*)sourceBuffer;
Chris@39 866 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 867 (void)ditherGenerator; /* unused parameter */
Chris@39 868
Chris@39 869 while( count-- )
Chris@39 870 {
Chris@39 871 float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
Chris@39 872 /* use smaller scaler to prevent overflow when we add the dither */
Chris@39 873 float dithered = (*src * (126.0f)) + dither;
Chris@39 874 PaInt32 samp = 128 + (PaInt32) dithered;
Chris@39 875 PA_CLIP_( samp, 0x0000, 0x00FF );
Chris@39 876 *dest = (unsigned char) samp;
Chris@39 877
Chris@39 878 src += sourceStride;
Chris@39 879 dest += destinationStride;
Chris@39 880 }
Chris@39 881 }
Chris@39 882
Chris@39 883 /* -------------------------------------------------------------------------- */
Chris@39 884
Chris@39 885 static void Int32_To_Float32(
Chris@39 886 void *destinationBuffer, signed int destinationStride,
Chris@39 887 void *sourceBuffer, signed int sourceStride,
Chris@39 888 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 889 {
Chris@39 890 PaInt32 *src = (PaInt32*)sourceBuffer;
Chris@39 891 float *dest = (float*)destinationBuffer;
Chris@39 892 (void)ditherGenerator; /* unused parameter */
Chris@39 893
Chris@39 894 while( count-- )
Chris@39 895 {
Chris@39 896 *dest = (float) ((double)*src * const_1_div_2147483648_);
Chris@39 897
Chris@39 898 src += sourceStride;
Chris@39 899 dest += destinationStride;
Chris@39 900 }
Chris@39 901 }
Chris@39 902
Chris@39 903 /* -------------------------------------------------------------------------- */
Chris@39 904
Chris@39 905 static void Int32_To_Int24(
Chris@39 906 void *destinationBuffer, signed int destinationStride,
Chris@39 907 void *sourceBuffer, signed int sourceStride,
Chris@39 908 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 909 {
Chris@39 910 PaInt32 *src = (PaInt32*)sourceBuffer;
Chris@39 911 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 912 (void) ditherGenerator; /* unused parameter */
Chris@39 913
Chris@39 914 while( count-- )
Chris@39 915 {
Chris@39 916 /* REVIEW */
Chris@39 917 #if defined(PA_LITTLE_ENDIAN)
Chris@39 918 dest[0] = (unsigned char)(*src >> 8);
Chris@39 919 dest[1] = (unsigned char)(*src >> 16);
Chris@39 920 dest[2] = (unsigned char)(*src >> 24);
Chris@39 921 #elif defined(PA_BIG_ENDIAN)
Chris@39 922 dest[0] = (unsigned char)(*src >> 24);
Chris@39 923 dest[1] = (unsigned char)(*src >> 16);
Chris@39 924 dest[2] = (unsigned char)(*src >> 8);
Chris@39 925 #endif
Chris@39 926 src += sourceStride;
Chris@39 927 dest += destinationStride * 3;
Chris@39 928 }
Chris@39 929 }
Chris@39 930
Chris@39 931 /* -------------------------------------------------------------------------- */
Chris@39 932
Chris@39 933 static void Int32_To_Int24_Dither(
Chris@39 934 void *destinationBuffer, signed int destinationStride,
Chris@39 935 void *sourceBuffer, signed int sourceStride,
Chris@39 936 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 937 {
Chris@39 938 (void) destinationBuffer; /* unused parameters */
Chris@39 939 (void) destinationStride; /* unused parameters */
Chris@39 940 (void) sourceBuffer; /* unused parameters */
Chris@39 941 (void) sourceStride; /* unused parameters */
Chris@39 942 (void) count; /* unused parameters */
Chris@39 943 (void) ditherGenerator; /* unused parameters */
Chris@39 944 /* IMPLEMENT ME */
Chris@39 945 }
Chris@39 946
Chris@39 947 /* -------------------------------------------------------------------------- */
Chris@39 948
Chris@39 949 static void Int32_To_Int16(
Chris@39 950 void *destinationBuffer, signed int destinationStride,
Chris@39 951 void *sourceBuffer, signed int sourceStride,
Chris@39 952 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 953 {
Chris@39 954 PaInt32 *src = (PaInt32*)sourceBuffer;
Chris@39 955 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 956 (void)ditherGenerator; /* unused parameter */
Chris@39 957
Chris@39 958 while( count-- )
Chris@39 959 {
Chris@39 960 *dest = (PaInt16) ((*src) >> 16);
Chris@39 961
Chris@39 962 src += sourceStride;
Chris@39 963 dest += destinationStride;
Chris@39 964 }
Chris@39 965 }
Chris@39 966
Chris@39 967 /* -------------------------------------------------------------------------- */
Chris@39 968
Chris@39 969 static void Int32_To_Int16_Dither(
Chris@39 970 void *destinationBuffer, signed int destinationStride,
Chris@39 971 void *sourceBuffer, signed int sourceStride,
Chris@39 972 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 973 {
Chris@39 974 PaInt32 *src = (PaInt32*)sourceBuffer;
Chris@39 975 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 976 PaInt32 dither;
Chris@39 977
Chris@39 978 while( count-- )
Chris@39 979 {
Chris@39 980 /* REVIEW */
Chris@39 981 dither = PaUtil_Generate16BitTriangularDither( ditherGenerator );
Chris@39 982 *dest = (PaInt16) ((((*src)>>1) + dither) >> 15);
Chris@39 983
Chris@39 984 src += sourceStride;
Chris@39 985 dest += destinationStride;
Chris@39 986 }
Chris@39 987 }
Chris@39 988
Chris@39 989 /* -------------------------------------------------------------------------- */
Chris@39 990
Chris@39 991 static void Int32_To_Int8(
Chris@39 992 void *destinationBuffer, signed int destinationStride,
Chris@39 993 void *sourceBuffer, signed int sourceStride,
Chris@39 994 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 995 {
Chris@39 996 PaInt32 *src = (PaInt32*)sourceBuffer;
Chris@39 997 signed char *dest = (signed char*)destinationBuffer;
Chris@39 998 (void)ditherGenerator; /* unused parameter */
Chris@39 999
Chris@39 1000 while( count-- )
Chris@39 1001 {
Chris@39 1002 *dest = (signed char) ((*src) >> 24);
Chris@39 1003
Chris@39 1004 src += sourceStride;
Chris@39 1005 dest += destinationStride;
Chris@39 1006 }
Chris@39 1007 }
Chris@39 1008
Chris@39 1009 /* -------------------------------------------------------------------------- */
Chris@39 1010
Chris@39 1011 static void Int32_To_Int8_Dither(
Chris@39 1012 void *destinationBuffer, signed int destinationStride,
Chris@39 1013 void *sourceBuffer, signed int sourceStride,
Chris@39 1014 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1015 {
Chris@39 1016 PaInt32 *src = (PaInt32*)sourceBuffer;
Chris@39 1017 signed char *dest = (signed char*)destinationBuffer;
Chris@39 1018 PaInt32 dither;
Chris@39 1019
Chris@39 1020 while( count-- )
Chris@39 1021 {
Chris@39 1022 /* REVIEW */
Chris@39 1023 dither = PaUtil_Generate16BitTriangularDither( ditherGenerator );
Chris@39 1024 *dest = (signed char) ((((*src)>>1) + dither) >> 23);
Chris@39 1025
Chris@39 1026 src += sourceStride;
Chris@39 1027 dest += destinationStride;
Chris@39 1028 }
Chris@39 1029 }
Chris@39 1030
Chris@39 1031 /* -------------------------------------------------------------------------- */
Chris@39 1032
Chris@39 1033 static void Int32_To_UInt8(
Chris@39 1034 void *destinationBuffer, signed int destinationStride,
Chris@39 1035 void *sourceBuffer, signed int sourceStride,
Chris@39 1036 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1037 {
Chris@39 1038 PaInt32 *src = (PaInt32*)sourceBuffer;
Chris@39 1039 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1040 (void)ditherGenerator; /* unused parameter */
Chris@39 1041
Chris@39 1042 while( count-- )
Chris@39 1043 {
Chris@39 1044 (*dest) = (unsigned char)(((*src) >> 24) + 128);
Chris@39 1045
Chris@39 1046 src += sourceStride;
Chris@39 1047 dest += destinationStride;
Chris@39 1048 }
Chris@39 1049 }
Chris@39 1050
Chris@39 1051 /* -------------------------------------------------------------------------- */
Chris@39 1052
Chris@39 1053 static void Int32_To_UInt8_Dither(
Chris@39 1054 void *destinationBuffer, signed int destinationStride,
Chris@39 1055 void *sourceBuffer, signed int sourceStride,
Chris@39 1056 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1057 {
Chris@39 1058 PaInt32 *src = (PaInt32*)sourceBuffer;
Chris@39 1059 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1060 (void)ditherGenerator; /* unused parameter */
Chris@39 1061
Chris@39 1062 while( count-- )
Chris@39 1063 {
Chris@39 1064 /* IMPLEMENT ME */
Chris@39 1065
Chris@39 1066 src += sourceStride;
Chris@39 1067 dest += destinationStride;
Chris@39 1068 }
Chris@39 1069 }
Chris@39 1070
Chris@39 1071 /* -------------------------------------------------------------------------- */
Chris@39 1072
Chris@39 1073 static void Int24_To_Float32(
Chris@39 1074 void *destinationBuffer, signed int destinationStride,
Chris@39 1075 void *sourceBuffer, signed int sourceStride,
Chris@39 1076 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1077 {
Chris@39 1078 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1079 float *dest = (float*)destinationBuffer;
Chris@39 1080 PaInt32 temp;
Chris@39 1081
Chris@39 1082 (void) ditherGenerator; /* unused parameter */
Chris@39 1083
Chris@39 1084 while( count-- )
Chris@39 1085 {
Chris@39 1086
Chris@39 1087 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1088 temp = (((PaInt32)src[0]) << 8);
Chris@39 1089 temp = temp | (((PaInt32)src[1]) << 16);
Chris@39 1090 temp = temp | (((PaInt32)src[2]) << 24);
Chris@39 1091 #elif defined(PA_BIG_ENDIAN)
Chris@39 1092 temp = (((PaInt32)src[0]) << 24);
Chris@39 1093 temp = temp | (((PaInt32)src[1]) << 16);
Chris@39 1094 temp = temp | (((PaInt32)src[2]) << 8);
Chris@39 1095 #endif
Chris@39 1096
Chris@39 1097 *dest = (float) ((double)temp * const_1_div_2147483648_);
Chris@39 1098
Chris@39 1099 src += sourceStride * 3;
Chris@39 1100 dest += destinationStride;
Chris@39 1101 }
Chris@39 1102 }
Chris@39 1103
Chris@39 1104 /* -------------------------------------------------------------------------- */
Chris@39 1105
Chris@39 1106 static void Int24_To_Int32(
Chris@39 1107 void *destinationBuffer, signed int destinationStride,
Chris@39 1108 void *sourceBuffer, signed int sourceStride,
Chris@39 1109 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1110 {
Chris@39 1111 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1112 PaInt32 *dest = (PaInt32*) destinationBuffer;
Chris@39 1113 PaInt32 temp;
Chris@39 1114
Chris@39 1115 (void) ditherGenerator; /* unused parameter */
Chris@39 1116
Chris@39 1117 while( count-- )
Chris@39 1118 {
Chris@39 1119
Chris@39 1120 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1121 temp = (((PaInt32)src[0]) << 8);
Chris@39 1122 temp = temp | (((PaInt32)src[1]) << 16);
Chris@39 1123 temp = temp | (((PaInt32)src[2]) << 24);
Chris@39 1124 #elif defined(PA_BIG_ENDIAN)
Chris@39 1125 temp = (((PaInt32)src[0]) << 24);
Chris@39 1126 temp = temp | (((PaInt32)src[1]) << 16);
Chris@39 1127 temp = temp | (((PaInt32)src[2]) << 8);
Chris@39 1128 #endif
Chris@39 1129
Chris@39 1130 *dest = temp;
Chris@39 1131
Chris@39 1132 src += sourceStride * 3;
Chris@39 1133 dest += destinationStride;
Chris@39 1134 }
Chris@39 1135 }
Chris@39 1136
Chris@39 1137 /* -------------------------------------------------------------------------- */
Chris@39 1138
Chris@39 1139 static void Int24_To_Int16(
Chris@39 1140 void *destinationBuffer, signed int destinationStride,
Chris@39 1141 void *sourceBuffer, signed int sourceStride,
Chris@39 1142 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1143 {
Chris@39 1144 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1145 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 1146
Chris@39 1147 PaInt16 temp;
Chris@39 1148
Chris@39 1149 (void) ditherGenerator; /* unused parameter */
Chris@39 1150
Chris@39 1151 while( count-- )
Chris@39 1152 {
Chris@39 1153
Chris@39 1154 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1155 /* src[0] is discarded */
Chris@39 1156 temp = (((PaInt16)src[1]));
Chris@39 1157 temp = temp | (PaInt16)(((PaInt16)src[2]) << 8);
Chris@39 1158 #elif defined(PA_BIG_ENDIAN)
Chris@39 1159 /* src[2] is discarded */
Chris@39 1160 temp = (PaInt16)(((PaInt16)src[0]) << 8);
Chris@39 1161 temp = temp | (((PaInt16)src[1]));
Chris@39 1162 #endif
Chris@39 1163
Chris@39 1164 *dest = temp;
Chris@39 1165
Chris@39 1166 src += sourceStride * 3;
Chris@39 1167 dest += destinationStride;
Chris@39 1168 }
Chris@39 1169 }
Chris@39 1170
Chris@39 1171 /* -------------------------------------------------------------------------- */
Chris@39 1172
Chris@39 1173 static void Int24_To_Int16_Dither(
Chris@39 1174 void *destinationBuffer, signed int destinationStride,
Chris@39 1175 void *sourceBuffer, signed int sourceStride,
Chris@39 1176 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1177 {
Chris@39 1178 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1179 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 1180
Chris@39 1181 PaInt32 temp, dither;
Chris@39 1182
Chris@39 1183 while( count-- )
Chris@39 1184 {
Chris@39 1185
Chris@39 1186 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1187 temp = (((PaInt32)src[0]) << 8);
Chris@39 1188 temp = temp | (((PaInt32)src[1]) << 16);
Chris@39 1189 temp = temp | (((PaInt32)src[2]) << 24);
Chris@39 1190 #elif defined(PA_BIG_ENDIAN)
Chris@39 1191 temp = (((PaInt32)src[0]) << 24);
Chris@39 1192 temp = temp | (((PaInt32)src[1]) << 16);
Chris@39 1193 temp = temp | (((PaInt32)src[2]) << 8);
Chris@39 1194 #endif
Chris@39 1195
Chris@39 1196 /* REVIEW */
Chris@39 1197 dither = PaUtil_Generate16BitTriangularDither( ditherGenerator );
Chris@39 1198 *dest = (PaInt16) (((temp >> 1) + dither) >> 15);
Chris@39 1199
Chris@39 1200 src += sourceStride * 3;
Chris@39 1201 dest += destinationStride;
Chris@39 1202 }
Chris@39 1203 }
Chris@39 1204
Chris@39 1205 /* -------------------------------------------------------------------------- */
Chris@39 1206
Chris@39 1207 static void Int24_To_Int8(
Chris@39 1208 void *destinationBuffer, signed int destinationStride,
Chris@39 1209 void *sourceBuffer, signed int sourceStride,
Chris@39 1210 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1211 {
Chris@39 1212 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1213 signed char *dest = (signed char*)destinationBuffer;
Chris@39 1214
Chris@39 1215 (void) ditherGenerator; /* unused parameter */
Chris@39 1216
Chris@39 1217 while( count-- )
Chris@39 1218 {
Chris@39 1219
Chris@39 1220 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1221 /* src[0] is discarded */
Chris@39 1222 /* src[1] is discarded */
Chris@39 1223 *dest = src[2];
Chris@39 1224 #elif defined(PA_BIG_ENDIAN)
Chris@39 1225 /* src[2] is discarded */
Chris@39 1226 /* src[1] is discarded */
Chris@39 1227 *dest = src[0];
Chris@39 1228 #endif
Chris@39 1229
Chris@39 1230 src += sourceStride * 3;
Chris@39 1231 dest += destinationStride;
Chris@39 1232 }
Chris@39 1233 }
Chris@39 1234
Chris@39 1235 /* -------------------------------------------------------------------------- */
Chris@39 1236
Chris@39 1237 static void Int24_To_Int8_Dither(
Chris@39 1238 void *destinationBuffer, signed int destinationStride,
Chris@39 1239 void *sourceBuffer, signed int sourceStride,
Chris@39 1240 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1241 {
Chris@39 1242 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1243 signed char *dest = (signed char*)destinationBuffer;
Chris@39 1244
Chris@39 1245 PaInt32 temp, dither;
Chris@39 1246
Chris@39 1247 while( count-- )
Chris@39 1248 {
Chris@39 1249
Chris@39 1250 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1251 temp = (((PaInt32)src[0]) << 8);
Chris@39 1252 temp = temp | (((PaInt32)src[1]) << 16);
Chris@39 1253 temp = temp | (((PaInt32)src[2]) << 24);
Chris@39 1254 #elif defined(PA_BIG_ENDIAN)
Chris@39 1255 temp = (((PaInt32)src[0]) << 24);
Chris@39 1256 temp = temp | (((PaInt32)src[1]) << 16);
Chris@39 1257 temp = temp | (((PaInt32)src[2]) << 8);
Chris@39 1258 #endif
Chris@39 1259
Chris@39 1260 /* REVIEW */
Chris@39 1261 dither = PaUtil_Generate16BitTriangularDither( ditherGenerator );
Chris@39 1262 *dest = (signed char) (((temp >> 1) + dither) >> 23);
Chris@39 1263
Chris@39 1264 src += sourceStride * 3;
Chris@39 1265 dest += destinationStride;
Chris@39 1266 }
Chris@39 1267 }
Chris@39 1268
Chris@39 1269 /* -------------------------------------------------------------------------- */
Chris@39 1270
Chris@39 1271 static void Int24_To_UInt8(
Chris@39 1272 void *destinationBuffer, signed int destinationStride,
Chris@39 1273 void *sourceBuffer, signed int sourceStride,
Chris@39 1274 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1275 {
Chris@39 1276 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1277 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1278
Chris@39 1279 (void) ditherGenerator; /* unused parameter */
Chris@39 1280
Chris@39 1281 while( count-- )
Chris@39 1282 {
Chris@39 1283
Chris@39 1284 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1285 /* src[0] is discarded */
Chris@39 1286 /* src[1] is discarded */
Chris@39 1287 *dest = (unsigned char)(src[2] + 128);
Chris@39 1288 #elif defined(PA_BIG_ENDIAN)
Chris@39 1289 *dest = (unsigned char)(src[0] + 128);
Chris@39 1290 /* src[1] is discarded */
Chris@39 1291 /* src[2] is discarded */
Chris@39 1292 #endif
Chris@39 1293
Chris@39 1294 src += sourceStride * 3;
Chris@39 1295 dest += destinationStride;
Chris@39 1296 }
Chris@39 1297 }
Chris@39 1298
Chris@39 1299 /* -------------------------------------------------------------------------- */
Chris@39 1300
Chris@39 1301 static void Int24_To_UInt8_Dither(
Chris@39 1302 void *destinationBuffer, signed int destinationStride,
Chris@39 1303 void *sourceBuffer, signed int sourceStride,
Chris@39 1304 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1305 {
Chris@39 1306 (void) destinationBuffer; /* unused parameters */
Chris@39 1307 (void) destinationStride; /* unused parameters */
Chris@39 1308 (void) sourceBuffer; /* unused parameters */
Chris@39 1309 (void) sourceStride; /* unused parameters */
Chris@39 1310 (void) count; /* unused parameters */
Chris@39 1311 (void) ditherGenerator; /* unused parameters */
Chris@39 1312 /* IMPLEMENT ME */
Chris@39 1313 }
Chris@39 1314
Chris@39 1315 /* -------------------------------------------------------------------------- */
Chris@39 1316
Chris@39 1317 static void Int16_To_Float32(
Chris@39 1318 void *destinationBuffer, signed int destinationStride,
Chris@39 1319 void *sourceBuffer, signed int sourceStride,
Chris@39 1320 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1321 {
Chris@39 1322 PaInt16 *src = (PaInt16*)sourceBuffer;
Chris@39 1323 float *dest = (float*)destinationBuffer;
Chris@39 1324 (void)ditherGenerator; /* unused parameter */
Chris@39 1325
Chris@39 1326 while( count-- )
Chris@39 1327 {
Chris@39 1328 float samp = *src * const_1_div_32768_; /* FIXME: i'm concerned about this being asymetrical with float->int16 -rb */
Chris@39 1329 *dest = samp;
Chris@39 1330
Chris@39 1331 src += sourceStride;
Chris@39 1332 dest += destinationStride;
Chris@39 1333 }
Chris@39 1334 }
Chris@39 1335
Chris@39 1336 /* -------------------------------------------------------------------------- */
Chris@39 1337
Chris@39 1338 static void Int16_To_Int32(
Chris@39 1339 void *destinationBuffer, signed int destinationStride,
Chris@39 1340 void *sourceBuffer, signed int sourceStride,
Chris@39 1341 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1342 {
Chris@39 1343 PaInt16 *src = (PaInt16*)sourceBuffer;
Chris@39 1344 PaInt32 *dest = (PaInt32*)destinationBuffer;
Chris@39 1345 (void)ditherGenerator; /* unused parameter */
Chris@39 1346
Chris@39 1347 while( count-- )
Chris@39 1348 {
Chris@39 1349 /* REVIEW: we should consider something like
Chris@39 1350 (*src << 16) | (*src & 0xFFFF)
Chris@39 1351 */
Chris@39 1352
Chris@39 1353 *dest = *src << 16;
Chris@39 1354
Chris@39 1355 src += sourceStride;
Chris@39 1356 dest += destinationStride;
Chris@39 1357 }
Chris@39 1358 }
Chris@39 1359
Chris@39 1360 /* -------------------------------------------------------------------------- */
Chris@39 1361
Chris@39 1362 static void Int16_To_Int24(
Chris@39 1363 void *destinationBuffer, signed int destinationStride,
Chris@39 1364 void *sourceBuffer, signed int sourceStride,
Chris@39 1365 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1366 {
Chris@39 1367 PaInt16 *src = (PaInt16*) sourceBuffer;
Chris@39 1368 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1369 PaInt16 temp;
Chris@39 1370
Chris@39 1371 (void) ditherGenerator; /* unused parameter */
Chris@39 1372
Chris@39 1373 while( count-- )
Chris@39 1374 {
Chris@39 1375 temp = *src;
Chris@39 1376
Chris@39 1377 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1378 dest[0] = 0;
Chris@39 1379 dest[1] = (unsigned char)(temp);
Chris@39 1380 dest[2] = (unsigned char)(temp >> 8);
Chris@39 1381 #elif defined(PA_BIG_ENDIAN)
Chris@39 1382 dest[0] = (unsigned char)(temp >> 8);
Chris@39 1383 dest[1] = (unsigned char)(temp);
Chris@39 1384 dest[2] = 0;
Chris@39 1385 #endif
Chris@39 1386
Chris@39 1387 src += sourceStride;
Chris@39 1388 dest += destinationStride * 3;
Chris@39 1389 }
Chris@39 1390 }
Chris@39 1391
Chris@39 1392 /* -------------------------------------------------------------------------- */
Chris@39 1393
Chris@39 1394 static void Int16_To_Int8(
Chris@39 1395 void *destinationBuffer, signed int destinationStride,
Chris@39 1396 void *sourceBuffer, signed int sourceStride,
Chris@39 1397 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1398 {
Chris@39 1399 PaInt16 *src = (PaInt16*)sourceBuffer;
Chris@39 1400 signed char *dest = (signed char*)destinationBuffer;
Chris@39 1401 (void)ditherGenerator; /* unused parameter */
Chris@39 1402
Chris@39 1403 while( count-- )
Chris@39 1404 {
Chris@39 1405 (*dest) = (signed char)((*src) >> 8);
Chris@39 1406
Chris@39 1407 src += sourceStride;
Chris@39 1408 dest += destinationStride;
Chris@39 1409 }
Chris@39 1410 }
Chris@39 1411
Chris@39 1412 /* -------------------------------------------------------------------------- */
Chris@39 1413
Chris@39 1414 static void Int16_To_Int8_Dither(
Chris@39 1415 void *destinationBuffer, signed int destinationStride,
Chris@39 1416 void *sourceBuffer, signed int sourceStride,
Chris@39 1417 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1418 {
Chris@39 1419 PaInt16 *src = (PaInt16*)sourceBuffer;
Chris@39 1420 signed char *dest = (signed char*)destinationBuffer;
Chris@39 1421 (void)ditherGenerator; /* unused parameter */
Chris@39 1422
Chris@39 1423 while( count-- )
Chris@39 1424 {
Chris@39 1425 /* IMPLEMENT ME */
Chris@39 1426
Chris@39 1427 src += sourceStride;
Chris@39 1428 dest += destinationStride;
Chris@39 1429 }
Chris@39 1430 }
Chris@39 1431
Chris@39 1432 /* -------------------------------------------------------------------------- */
Chris@39 1433
Chris@39 1434 static void Int16_To_UInt8(
Chris@39 1435 void *destinationBuffer, signed int destinationStride,
Chris@39 1436 void *sourceBuffer, signed int sourceStride,
Chris@39 1437 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1438 {
Chris@39 1439 PaInt16 *src = (PaInt16*)sourceBuffer;
Chris@39 1440 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1441 (void)ditherGenerator; /* unused parameter */
Chris@39 1442
Chris@39 1443 while( count-- )
Chris@39 1444 {
Chris@39 1445 (*dest) = (unsigned char)(((*src) >> 8) + 128);
Chris@39 1446
Chris@39 1447 src += sourceStride;
Chris@39 1448 dest += destinationStride;
Chris@39 1449 }
Chris@39 1450 }
Chris@39 1451
Chris@39 1452 /* -------------------------------------------------------------------------- */
Chris@39 1453
Chris@39 1454 static void Int16_To_UInt8_Dither(
Chris@39 1455 void *destinationBuffer, signed int destinationStride,
Chris@39 1456 void *sourceBuffer, signed int sourceStride,
Chris@39 1457 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1458 {
Chris@39 1459 PaInt16 *src = (PaInt16*)sourceBuffer;
Chris@39 1460 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1461 (void)ditherGenerator; /* unused parameter */
Chris@39 1462
Chris@39 1463 while( count-- )
Chris@39 1464 {
Chris@39 1465 /* IMPLEMENT ME */
Chris@39 1466
Chris@39 1467 src += sourceStride;
Chris@39 1468 dest += destinationStride;
Chris@39 1469 }
Chris@39 1470 }
Chris@39 1471
Chris@39 1472 /* -------------------------------------------------------------------------- */
Chris@39 1473
Chris@39 1474 static void Int8_To_Float32(
Chris@39 1475 void *destinationBuffer, signed int destinationStride,
Chris@39 1476 void *sourceBuffer, signed int sourceStride,
Chris@39 1477 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1478 {
Chris@39 1479 signed char *src = (signed char*)sourceBuffer;
Chris@39 1480 float *dest = (float*)destinationBuffer;
Chris@39 1481 (void)ditherGenerator; /* unused parameter */
Chris@39 1482
Chris@39 1483 while( count-- )
Chris@39 1484 {
Chris@39 1485 float samp = *src * const_1_div_128_;
Chris@39 1486 *dest = samp;
Chris@39 1487
Chris@39 1488 src += sourceStride;
Chris@39 1489 dest += destinationStride;
Chris@39 1490 }
Chris@39 1491 }
Chris@39 1492
Chris@39 1493 /* -------------------------------------------------------------------------- */
Chris@39 1494
Chris@39 1495 static void Int8_To_Int32(
Chris@39 1496 void *destinationBuffer, signed int destinationStride,
Chris@39 1497 void *sourceBuffer, signed int sourceStride,
Chris@39 1498 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1499 {
Chris@39 1500 signed char *src = (signed char*)sourceBuffer;
Chris@39 1501 PaInt32 *dest = (PaInt32*)destinationBuffer;
Chris@39 1502 (void)ditherGenerator; /* unused parameter */
Chris@39 1503
Chris@39 1504 while( count-- )
Chris@39 1505 {
Chris@39 1506 (*dest) = (*src) << 24;
Chris@39 1507
Chris@39 1508 src += sourceStride;
Chris@39 1509 dest += destinationStride;
Chris@39 1510 }
Chris@39 1511 }
Chris@39 1512
Chris@39 1513 /* -------------------------------------------------------------------------- */
Chris@39 1514
Chris@39 1515 static void Int8_To_Int24(
Chris@39 1516 void *destinationBuffer, signed int destinationStride,
Chris@39 1517 void *sourceBuffer, signed int sourceStride,
Chris@39 1518 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1519 {
Chris@39 1520 signed char *src = (signed char*)sourceBuffer;
Chris@39 1521 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1522 (void)ditherGenerator; /* unused parameter */
Chris@39 1523
Chris@39 1524 while( count-- )
Chris@39 1525 {
Chris@39 1526
Chris@39 1527 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1528 dest[0] = 0;
Chris@39 1529 dest[1] = 0;
Chris@39 1530 dest[2] = (*src);
Chris@39 1531 #elif defined(PA_BIG_ENDIAN)
Chris@39 1532 dest[0] = (*src);
Chris@39 1533 dest[1] = 0;
Chris@39 1534 dest[2] = 0;
Chris@39 1535 #endif
Chris@39 1536
Chris@39 1537 src += sourceStride;
Chris@39 1538 dest += destinationStride * 3;
Chris@39 1539 }
Chris@39 1540 }
Chris@39 1541
Chris@39 1542 /* -------------------------------------------------------------------------- */
Chris@39 1543
Chris@39 1544 static void Int8_To_Int16(
Chris@39 1545 void *destinationBuffer, signed int destinationStride,
Chris@39 1546 void *sourceBuffer, signed int sourceStride,
Chris@39 1547 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1548 {
Chris@39 1549 signed char *src = (signed char*)sourceBuffer;
Chris@39 1550 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 1551 (void)ditherGenerator; /* unused parameter */
Chris@39 1552
Chris@39 1553 while( count-- )
Chris@39 1554 {
Chris@39 1555 (*dest) = (PaInt16)((*src) << 8);
Chris@39 1556
Chris@39 1557 src += sourceStride;
Chris@39 1558 dest += destinationStride;
Chris@39 1559 }
Chris@39 1560 }
Chris@39 1561
Chris@39 1562 /* -------------------------------------------------------------------------- */
Chris@39 1563
Chris@39 1564 static void Int8_To_UInt8(
Chris@39 1565 void *destinationBuffer, signed int destinationStride,
Chris@39 1566 void *sourceBuffer, signed int sourceStride,
Chris@39 1567 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1568 {
Chris@39 1569 signed char *src = (signed char*)sourceBuffer;
Chris@39 1570 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1571 (void)ditherGenerator; /* unused parameter */
Chris@39 1572
Chris@39 1573 while( count-- )
Chris@39 1574 {
Chris@39 1575 (*dest) = (unsigned char)(*src + 128);
Chris@39 1576
Chris@39 1577 src += sourceStride;
Chris@39 1578 dest += destinationStride;
Chris@39 1579 }
Chris@39 1580 }
Chris@39 1581
Chris@39 1582 /* -------------------------------------------------------------------------- */
Chris@39 1583
Chris@39 1584 static void UInt8_To_Float32(
Chris@39 1585 void *destinationBuffer, signed int destinationStride,
Chris@39 1586 void *sourceBuffer, signed int sourceStride,
Chris@39 1587 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1588 {
Chris@39 1589 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1590 float *dest = (float*)destinationBuffer;
Chris@39 1591 (void)ditherGenerator; /* unused parameter */
Chris@39 1592
Chris@39 1593 while( count-- )
Chris@39 1594 {
Chris@39 1595 float samp = (*src - 128) * const_1_div_128_;
Chris@39 1596 *dest = samp;
Chris@39 1597
Chris@39 1598 src += sourceStride;
Chris@39 1599 dest += destinationStride;
Chris@39 1600 }
Chris@39 1601 }
Chris@39 1602
Chris@39 1603 /* -------------------------------------------------------------------------- */
Chris@39 1604
Chris@39 1605 static void UInt8_To_Int32(
Chris@39 1606 void *destinationBuffer, signed int destinationStride,
Chris@39 1607 void *sourceBuffer, signed int sourceStride,
Chris@39 1608 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1609 {
Chris@39 1610 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1611 PaInt32 *dest = (PaInt32*)destinationBuffer;
Chris@39 1612 (void)ditherGenerator; /* unused parameter */
Chris@39 1613
Chris@39 1614 while( count-- )
Chris@39 1615 {
Chris@39 1616 (*dest) = (*src - 128) << 24;
Chris@39 1617
Chris@39 1618 src += sourceStride;
Chris@39 1619 dest += destinationStride;
Chris@39 1620 }
Chris@39 1621 }
Chris@39 1622
Chris@39 1623 /* -------------------------------------------------------------------------- */
Chris@39 1624
Chris@39 1625 static void UInt8_To_Int24(
Chris@39 1626 void *destinationBuffer, signed int destinationStride,
Chris@39 1627 void *sourceBuffer, signed int sourceStride,
Chris@39 1628 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1629 {
Chris@39 1630 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1631 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1632 (void) ditherGenerator; /* unused parameters */
Chris@39 1633
Chris@39 1634 while( count-- )
Chris@39 1635 {
Chris@39 1636
Chris@39 1637 #if defined(PA_LITTLE_ENDIAN)
Chris@39 1638 dest[0] = 0;
Chris@39 1639 dest[1] = 0;
Chris@39 1640 dest[2] = (unsigned char)(*src - 128);
Chris@39 1641 #elif defined(PA_BIG_ENDIAN)
Chris@39 1642 dest[0] = (unsigned char)(*src - 128);
Chris@39 1643 dest[1] = 0;
Chris@39 1644 dest[2] = 0;
Chris@39 1645 #endif
Chris@39 1646
Chris@39 1647 src += sourceStride;
Chris@39 1648 dest += destinationStride * 3;
Chris@39 1649 }
Chris@39 1650 }
Chris@39 1651
Chris@39 1652 /* -------------------------------------------------------------------------- */
Chris@39 1653
Chris@39 1654 static void UInt8_To_Int16(
Chris@39 1655 void *destinationBuffer, signed int destinationStride,
Chris@39 1656 void *sourceBuffer, signed int sourceStride,
Chris@39 1657 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1658 {
Chris@39 1659 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1660 PaInt16 *dest = (PaInt16*)destinationBuffer;
Chris@39 1661 (void)ditherGenerator; /* unused parameter */
Chris@39 1662
Chris@39 1663 while( count-- )
Chris@39 1664 {
Chris@39 1665 (*dest) = (PaInt16)((*src - 128) << 8);
Chris@39 1666
Chris@39 1667 src += sourceStride;
Chris@39 1668 dest += destinationStride;
Chris@39 1669 }
Chris@39 1670 }
Chris@39 1671
Chris@39 1672 /* -------------------------------------------------------------------------- */
Chris@39 1673
Chris@39 1674 static void UInt8_To_Int8(
Chris@39 1675 void *destinationBuffer, signed int destinationStride,
Chris@39 1676 void *sourceBuffer, signed int sourceStride,
Chris@39 1677 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1678 {
Chris@39 1679 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1680 signed char *dest = (signed char*)destinationBuffer;
Chris@39 1681 (void)ditherGenerator; /* unused parameter */
Chris@39 1682
Chris@39 1683 while( count-- )
Chris@39 1684 {
Chris@39 1685 (*dest) = (signed char)(*src - 128);
Chris@39 1686
Chris@39 1687 src += sourceStride;
Chris@39 1688 dest += destinationStride;
Chris@39 1689 }
Chris@39 1690 }
Chris@39 1691
Chris@39 1692 /* -------------------------------------------------------------------------- */
Chris@39 1693
Chris@39 1694 static void Copy_8_To_8(
Chris@39 1695 void *destinationBuffer, signed int destinationStride,
Chris@39 1696 void *sourceBuffer, signed int sourceStride,
Chris@39 1697 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1698 {
Chris@39 1699 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1700 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1701
Chris@39 1702 (void) ditherGenerator; /* unused parameter */
Chris@39 1703
Chris@39 1704 while( count-- )
Chris@39 1705 {
Chris@39 1706 *dest = *src;
Chris@39 1707
Chris@39 1708 src += sourceStride;
Chris@39 1709 dest += destinationStride;
Chris@39 1710 }
Chris@39 1711 }
Chris@39 1712
Chris@39 1713 /* -------------------------------------------------------------------------- */
Chris@39 1714
Chris@39 1715 static void Copy_16_To_16(
Chris@39 1716 void *destinationBuffer, signed int destinationStride,
Chris@39 1717 void *sourceBuffer, signed int sourceStride,
Chris@39 1718 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1719 {
Chris@39 1720 PaUint16 *src = (PaUint16 *)sourceBuffer;
Chris@39 1721 PaUint16 *dest = (PaUint16 *)destinationBuffer;
Chris@39 1722
Chris@39 1723 (void) ditherGenerator; /* unused parameter */
Chris@39 1724
Chris@39 1725 while( count-- )
Chris@39 1726 {
Chris@39 1727 *dest = *src;
Chris@39 1728
Chris@39 1729 src += sourceStride;
Chris@39 1730 dest += destinationStride;
Chris@39 1731 }
Chris@39 1732 }
Chris@39 1733
Chris@39 1734 /* -------------------------------------------------------------------------- */
Chris@39 1735
Chris@39 1736 static void Copy_24_To_24(
Chris@39 1737 void *destinationBuffer, signed int destinationStride,
Chris@39 1738 void *sourceBuffer, signed int sourceStride,
Chris@39 1739 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1740 {
Chris@39 1741 unsigned char *src = (unsigned char*)sourceBuffer;
Chris@39 1742 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1743
Chris@39 1744 (void) ditherGenerator; /* unused parameter */
Chris@39 1745
Chris@39 1746 while( count-- )
Chris@39 1747 {
Chris@39 1748 dest[0] = src[0];
Chris@39 1749 dest[1] = src[1];
Chris@39 1750 dest[2] = src[2];
Chris@39 1751
Chris@39 1752 src += sourceStride * 3;
Chris@39 1753 dest += destinationStride * 3;
Chris@39 1754 }
Chris@39 1755 }
Chris@39 1756
Chris@39 1757 /* -------------------------------------------------------------------------- */
Chris@39 1758
Chris@39 1759 static void Copy_32_To_32(
Chris@39 1760 void *destinationBuffer, signed int destinationStride,
Chris@39 1761 void *sourceBuffer, signed int sourceStride,
Chris@39 1762 unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
Chris@39 1763 {
Chris@39 1764 PaUint32 *dest = (PaUint32 *)destinationBuffer;
Chris@39 1765 PaUint32 *src = (PaUint32 *)sourceBuffer;
Chris@39 1766
Chris@39 1767 (void) ditherGenerator; /* unused parameter */
Chris@39 1768
Chris@39 1769 while( count-- )
Chris@39 1770 {
Chris@39 1771 *dest = *src;
Chris@39 1772
Chris@39 1773 src += sourceStride;
Chris@39 1774 dest += destinationStride;
Chris@39 1775 }
Chris@39 1776 }
Chris@39 1777
Chris@39 1778 /* -------------------------------------------------------------------------- */
Chris@39 1779
Chris@39 1780 PaUtilConverterTable paConverters = {
Chris@39 1781 Float32_To_Int32, /* PaUtilConverter *Float32_To_Int32; */
Chris@39 1782 Float32_To_Int32_Dither, /* PaUtilConverter *Float32_To_Int32_Dither; */
Chris@39 1783 Float32_To_Int32_Clip, /* PaUtilConverter *Float32_To_Int32_Clip; */
Chris@39 1784 Float32_To_Int32_DitherClip, /* PaUtilConverter *Float32_To_Int32_DitherClip; */
Chris@39 1785
Chris@39 1786 Float32_To_Int24, /* PaUtilConverter *Float32_To_Int24; */
Chris@39 1787 Float32_To_Int24_Dither, /* PaUtilConverter *Float32_To_Int24_Dither; */
Chris@39 1788 Float32_To_Int24_Clip, /* PaUtilConverter *Float32_To_Int24_Clip; */
Chris@39 1789 Float32_To_Int24_DitherClip, /* PaUtilConverter *Float32_To_Int24_DitherClip; */
Chris@39 1790
Chris@39 1791 Float32_To_Int16, /* PaUtilConverter *Float32_To_Int16; */
Chris@39 1792 Float32_To_Int16_Dither, /* PaUtilConverter *Float32_To_Int16_Dither; */
Chris@39 1793 Float32_To_Int16_Clip, /* PaUtilConverter *Float32_To_Int16_Clip; */
Chris@39 1794 Float32_To_Int16_DitherClip, /* PaUtilConverter *Float32_To_Int16_DitherClip; */
Chris@39 1795
Chris@39 1796 Float32_To_Int8, /* PaUtilConverter *Float32_To_Int8; */
Chris@39 1797 Float32_To_Int8_Dither, /* PaUtilConverter *Float32_To_Int8_Dither; */
Chris@39 1798 Float32_To_Int8_Clip, /* PaUtilConverter *Float32_To_Int8_Clip; */
Chris@39 1799 Float32_To_Int8_DitherClip, /* PaUtilConverter *Float32_To_Int8_DitherClip; */
Chris@39 1800
Chris@39 1801 Float32_To_UInt8, /* PaUtilConverter *Float32_To_UInt8; */
Chris@39 1802 Float32_To_UInt8_Dither, /* PaUtilConverter *Float32_To_UInt8_Dither; */
Chris@39 1803 Float32_To_UInt8_Clip, /* PaUtilConverter *Float32_To_UInt8_Clip; */
Chris@39 1804 Float32_To_UInt8_DitherClip, /* PaUtilConverter *Float32_To_UInt8_DitherClip; */
Chris@39 1805
Chris@39 1806 Int32_To_Float32, /* PaUtilConverter *Int32_To_Float32; */
Chris@39 1807 Int32_To_Int24, /* PaUtilConverter *Int32_To_Int24; */
Chris@39 1808 Int32_To_Int24_Dither, /* PaUtilConverter *Int32_To_Int24_Dither; */
Chris@39 1809 Int32_To_Int16, /* PaUtilConverter *Int32_To_Int16; */
Chris@39 1810 Int32_To_Int16_Dither, /* PaUtilConverter *Int32_To_Int16_Dither; */
Chris@39 1811 Int32_To_Int8, /* PaUtilConverter *Int32_To_Int8; */
Chris@39 1812 Int32_To_Int8_Dither, /* PaUtilConverter *Int32_To_Int8_Dither; */
Chris@39 1813 Int32_To_UInt8, /* PaUtilConverter *Int32_To_UInt8; */
Chris@39 1814 Int32_To_UInt8_Dither, /* PaUtilConverter *Int32_To_UInt8_Dither; */
Chris@39 1815
Chris@39 1816 Int24_To_Float32, /* PaUtilConverter *Int24_To_Float32; */
Chris@39 1817 Int24_To_Int32, /* PaUtilConverter *Int24_To_Int32; */
Chris@39 1818 Int24_To_Int16, /* PaUtilConverter *Int24_To_Int16; */
Chris@39 1819 Int24_To_Int16_Dither, /* PaUtilConverter *Int24_To_Int16_Dither; */
Chris@39 1820 Int24_To_Int8, /* PaUtilConverter *Int24_To_Int8; */
Chris@39 1821 Int24_To_Int8_Dither, /* PaUtilConverter *Int24_To_Int8_Dither; */
Chris@39 1822 Int24_To_UInt8, /* PaUtilConverter *Int24_To_UInt8; */
Chris@39 1823 Int24_To_UInt8_Dither, /* PaUtilConverter *Int24_To_UInt8_Dither; */
Chris@39 1824
Chris@39 1825 Int16_To_Float32, /* PaUtilConverter *Int16_To_Float32; */
Chris@39 1826 Int16_To_Int32, /* PaUtilConverter *Int16_To_Int32; */
Chris@39 1827 Int16_To_Int24, /* PaUtilConverter *Int16_To_Int24; */
Chris@39 1828 Int16_To_Int8, /* PaUtilConverter *Int16_To_Int8; */
Chris@39 1829 Int16_To_Int8_Dither, /* PaUtilConverter *Int16_To_Int8_Dither; */
Chris@39 1830 Int16_To_UInt8, /* PaUtilConverter *Int16_To_UInt8; */
Chris@39 1831 Int16_To_UInt8_Dither, /* PaUtilConverter *Int16_To_UInt8_Dither; */
Chris@39 1832
Chris@39 1833 Int8_To_Float32, /* PaUtilConverter *Int8_To_Float32; */
Chris@39 1834 Int8_To_Int32, /* PaUtilConverter *Int8_To_Int32; */
Chris@39 1835 Int8_To_Int24, /* PaUtilConverter *Int8_To_Int24 */
Chris@39 1836 Int8_To_Int16, /* PaUtilConverter *Int8_To_Int16; */
Chris@39 1837 Int8_To_UInt8, /* PaUtilConverter *Int8_To_UInt8; */
Chris@39 1838
Chris@39 1839 UInt8_To_Float32, /* PaUtilConverter *UInt8_To_Float32; */
Chris@39 1840 UInt8_To_Int32, /* PaUtilConverter *UInt8_To_Int32; */
Chris@39 1841 UInt8_To_Int24, /* PaUtilConverter *UInt8_To_Int24; */
Chris@39 1842 UInt8_To_Int16, /* PaUtilConverter *UInt8_To_Int16; */
Chris@39 1843 UInt8_To_Int8, /* PaUtilConverter *UInt8_To_Int8; */
Chris@39 1844
Chris@39 1845 Copy_8_To_8, /* PaUtilConverter *Copy_8_To_8; */
Chris@39 1846 Copy_16_To_16, /* PaUtilConverter *Copy_16_To_16; */
Chris@39 1847 Copy_24_To_24, /* PaUtilConverter *Copy_24_To_24; */
Chris@39 1848 Copy_32_To_32 /* PaUtilConverter *Copy_32_To_32; */
Chris@39 1849 };
Chris@39 1850
Chris@39 1851 /* -------------------------------------------------------------------------- */
Chris@39 1852
Chris@39 1853 #endif /* PA_NO_STANDARD_CONVERTERS */
Chris@39 1854
Chris@39 1855 /* -------------------------------------------------------------------------- */
Chris@39 1856
Chris@39 1857 PaUtilZeroer* PaUtil_SelectZeroer( PaSampleFormat destinationFormat )
Chris@39 1858 {
Chris@39 1859 switch( destinationFormat & ~paNonInterleaved ){
Chris@39 1860 case paFloat32:
Chris@39 1861 return paZeroers.Zero32;
Chris@39 1862 case paInt32:
Chris@39 1863 return paZeroers.Zero32;
Chris@39 1864 case paInt24:
Chris@39 1865 return paZeroers.Zero24;
Chris@39 1866 case paInt16:
Chris@39 1867 return paZeroers.Zero16;
Chris@39 1868 case paInt8:
Chris@39 1869 return paZeroers.Zero8;
Chris@39 1870 case paUInt8:
Chris@39 1871 return paZeroers.ZeroU8;
Chris@39 1872 default: return 0;
Chris@39 1873 }
Chris@39 1874 }
Chris@39 1875
Chris@39 1876 /* -------------------------------------------------------------------------- */
Chris@39 1877
Chris@39 1878 #ifdef PA_NO_STANDARD_ZEROERS
Chris@39 1879
Chris@39 1880 /* -------------------------------------------------------------------------- */
Chris@39 1881
Chris@39 1882 PaUtilZeroerTable paZeroers = {
Chris@39 1883 0, /* PaUtilZeroer *ZeroU8; */
Chris@39 1884 0, /* PaUtilZeroer *Zero8; */
Chris@39 1885 0, /* PaUtilZeroer *Zero16; */
Chris@39 1886 0, /* PaUtilZeroer *Zero24; */
Chris@39 1887 0, /* PaUtilZeroer *Zero32; */
Chris@39 1888 };
Chris@39 1889
Chris@39 1890 /* -------------------------------------------------------------------------- */
Chris@39 1891
Chris@39 1892 #else /* PA_NO_STANDARD_ZEROERS is not defined */
Chris@39 1893
Chris@39 1894 /* -------------------------------------------------------------------------- */
Chris@39 1895
Chris@39 1896 static void ZeroU8( void *destinationBuffer, signed int destinationStride,
Chris@39 1897 unsigned int count )
Chris@39 1898 {
Chris@39 1899 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1900
Chris@39 1901 while( count-- )
Chris@39 1902 {
Chris@39 1903 *dest = 128;
Chris@39 1904
Chris@39 1905 dest += destinationStride;
Chris@39 1906 }
Chris@39 1907 }
Chris@39 1908
Chris@39 1909 /* -------------------------------------------------------------------------- */
Chris@39 1910
Chris@39 1911 static void Zero8( void *destinationBuffer, signed int destinationStride,
Chris@39 1912 unsigned int count )
Chris@39 1913 {
Chris@39 1914 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1915
Chris@39 1916 while( count-- )
Chris@39 1917 {
Chris@39 1918 *dest = 0;
Chris@39 1919
Chris@39 1920 dest += destinationStride;
Chris@39 1921 }
Chris@39 1922 }
Chris@39 1923
Chris@39 1924 /* -------------------------------------------------------------------------- */
Chris@39 1925
Chris@39 1926 static void Zero16( void *destinationBuffer, signed int destinationStride,
Chris@39 1927 unsigned int count )
Chris@39 1928 {
Chris@39 1929 PaUint16 *dest = (PaUint16 *)destinationBuffer;
Chris@39 1930
Chris@39 1931 while( count-- )
Chris@39 1932 {
Chris@39 1933 *dest = 0;
Chris@39 1934
Chris@39 1935 dest += destinationStride;
Chris@39 1936 }
Chris@39 1937 }
Chris@39 1938
Chris@39 1939 /* -------------------------------------------------------------------------- */
Chris@39 1940
Chris@39 1941 static void Zero24( void *destinationBuffer, signed int destinationStride,
Chris@39 1942 unsigned int count )
Chris@39 1943 {
Chris@39 1944 unsigned char *dest = (unsigned char*)destinationBuffer;
Chris@39 1945
Chris@39 1946 while( count-- )
Chris@39 1947 {
Chris@39 1948 dest[0] = 0;
Chris@39 1949 dest[1] = 0;
Chris@39 1950 dest[2] = 0;
Chris@39 1951
Chris@39 1952 dest += destinationStride * 3;
Chris@39 1953 }
Chris@39 1954 }
Chris@39 1955
Chris@39 1956 /* -------------------------------------------------------------------------- */
Chris@39 1957
Chris@39 1958 static void Zero32( void *destinationBuffer, signed int destinationStride,
Chris@39 1959 unsigned int count )
Chris@39 1960 {
Chris@39 1961 PaUint32 *dest = (PaUint32 *)destinationBuffer;
Chris@39 1962
Chris@39 1963 while( count-- )
Chris@39 1964 {
Chris@39 1965 *dest = 0;
Chris@39 1966
Chris@39 1967 dest += destinationStride;
Chris@39 1968 }
Chris@39 1969 }
Chris@39 1970
Chris@39 1971 /* -------------------------------------------------------------------------- */
Chris@39 1972
Chris@39 1973 PaUtilZeroerTable paZeroers = {
Chris@39 1974 ZeroU8, /* PaUtilZeroer *ZeroU8; */
Chris@39 1975 Zero8, /* PaUtilZeroer *Zero8; */
Chris@39 1976 Zero16, /* PaUtilZeroer *Zero16; */
Chris@39 1977 Zero24, /* PaUtilZeroer *Zero24; */
Chris@39 1978 Zero32, /* PaUtilZeroer *Zero32; */
Chris@39 1979 };
Chris@39 1980
Chris@39 1981 /* -------------------------------------------------------------------------- */
Chris@39 1982
Chris@39 1983 #endif /* PA_NO_STANDARD_ZEROERS */