1ea81d6eaSJerome Leveque /* 2ea81d6eaSJerome Leveque * Copyright 2012 Jérôme Leveque 3ea81d6eaSJerome Leveque * Copyright 2012 Jérôme Duval 4ea81d6eaSJerome Leveque * Copyright 2003 Marcus Overhagen 5ea81d6eaSJerome Leveque * Distributed under the terms of the MIT License. 6ea81d6eaSJerome Leveque */ 7ea81d6eaSJerome Leveque 8ea81d6eaSJerome Leveque 9ea81d6eaSJerome Leveque #include "Resampler.h" 10ea81d6eaSJerome Leveque #include "MultiAudioUtility.h" 11ea81d6eaSJerome Leveque #include "debug.h" 12ea81d6eaSJerome Leveque 13ea81d6eaSJerome Leveque 14ea81d6eaSJerome Leveque /*! A simple resampling class for the multi_audio add-ons. 15ea81d6eaSJerome Leveque You pick the conversion function on object creation, 16ea81d6eaSJerome Leveque and then call the Resample() function, specifying data pointer, 17ea81d6eaSJerome Leveque offset (in bytes) to the next sample, and count of samples. 18ea81d6eaSJerome Leveque */ 19ea81d6eaSJerome Leveque 20ea81d6eaSJerome Leveque 21ea81d6eaSJerome Leveque Resampler::Resampler(uint32 sourceFormat, uint32 destFormat) 22ea81d6eaSJerome Leveque : 23*7633665cSJerome Duval fFunc(&Resampler::_Void) 24ea81d6eaSJerome Leveque { 25ea81d6eaSJerome Leveque PRINT(("Resampler() in 0x%x, out 0x%x\n", (unsigned int)sourceFormat, 26ea81d6eaSJerome Leveque (unsigned int)destFormat)); 27ea81d6eaSJerome Leveque 28ea81d6eaSJerome Leveque switch (sourceFormat) { 29ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_FLOAT: 30ea81d6eaSJerome Leveque switch (destFormat) { 31ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_FLOAT: 32*7633665cSJerome Duval fFunc = &Resampler::_CopyFloat2Float; 33ea81d6eaSJerome Leveque break; 34ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_DOUBLE: 35ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyFloat2Double; 36ea81d6eaSJerome Leveque break; 37ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_INT: 38ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyFloat2Int; 39ea81d6eaSJerome Leveque break; 40ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_SHORT: 41ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyFloat2Short; 42ea81d6eaSJerome Leveque break; 43ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_UCHAR: 44ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyFloat2UChar; 45ea81d6eaSJerome Leveque break; 46ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_CHAR: 47ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyFloat2Char; 48ea81d6eaSJerome Leveque break; 49ea81d6eaSJerome Leveque } 50ea81d6eaSJerome Leveque break; 51ea81d6eaSJerome Leveque 52ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_DOUBLE: 53ea81d6eaSJerome Leveque switch (destFormat) { 54ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_FLOAT: 55ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyDouble2Float; 56ea81d6eaSJerome Leveque break; 57ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_DOUBLE: 58*7633665cSJerome Duval fFunc = &Resampler::_CopyDouble2Double; 59ea81d6eaSJerome Leveque break; 60ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_INT: 61ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyDouble2Int; 62ea81d6eaSJerome Leveque break; 63ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_SHORT: 64ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyDouble2Short; 65ea81d6eaSJerome Leveque break; 66ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_UCHAR: 67ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyDouble2UChar; 68ea81d6eaSJerome Leveque break; 69ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_CHAR: 70ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyDouble2Char; 71ea81d6eaSJerome Leveque break; 72ea81d6eaSJerome Leveque } 73ea81d6eaSJerome Leveque break; 74ea81d6eaSJerome Leveque 75ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_INT: 76ea81d6eaSJerome Leveque switch (destFormat) { 77ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_FLOAT: 78ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyInt2Float; 79ea81d6eaSJerome Leveque break; 80ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_DOUBLE: 81ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyInt2Double; 82ea81d6eaSJerome Leveque break; 83ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_INT: 84*7633665cSJerome Duval fFunc = &Resampler::_CopyInt2Int; 85ea81d6eaSJerome Leveque break; 86ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_SHORT: 87ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyInt2Short; 88ea81d6eaSJerome Leveque break; 89ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_UCHAR: 90ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyInt2UChar; 91ea81d6eaSJerome Leveque break; 92ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_CHAR: 93ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyInt2Char; 94ea81d6eaSJerome Leveque break; 95ea81d6eaSJerome Leveque } 96ea81d6eaSJerome Leveque break; 97ea81d6eaSJerome Leveque 98ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_SHORT: 99ea81d6eaSJerome Leveque switch (destFormat) { 100ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_FLOAT: 101ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyShort2Float; 102ea81d6eaSJerome Leveque break; 103ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_DOUBLE: 104ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyShort2Double; 105ea81d6eaSJerome Leveque break; 106ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_INT: 107ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyShort2Int; 108ea81d6eaSJerome Leveque break; 109ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_SHORT: 110*7633665cSJerome Duval fFunc = &Resampler::_CopyShort2Short; 111ea81d6eaSJerome Leveque break; 112ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_UCHAR: 113ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyShort2UChar; 114ea81d6eaSJerome Leveque break; 115ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_CHAR: 116ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyShort2Char; 117ea81d6eaSJerome Leveque break; 118ea81d6eaSJerome Leveque } 119ea81d6eaSJerome Leveque break; 120ea81d6eaSJerome Leveque 121ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_UCHAR: 122ea81d6eaSJerome Leveque switch (destFormat) { 123ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_FLOAT: 124ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyUChar2Float; 125ea81d6eaSJerome Leveque break; 126ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_DOUBLE: 127ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyUChar2Double; 128ea81d6eaSJerome Leveque break; 129ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_INT: 130ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyUChar2Int; 131ea81d6eaSJerome Leveque break; 132ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_SHORT: 133ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyUChar2Short; 134ea81d6eaSJerome Leveque break; 135ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_UCHAR: 136*7633665cSJerome Duval fFunc = &Resampler::_CopyUChar2UChar; 137ea81d6eaSJerome Leveque break; 138ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_CHAR: 139ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyUChar2Char; 140ea81d6eaSJerome Leveque break; 141ea81d6eaSJerome Leveque } 142ea81d6eaSJerome Leveque break; 143ea81d6eaSJerome Leveque 144ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_CHAR: 145ea81d6eaSJerome Leveque switch (destFormat) { 146ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_FLOAT: 147ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyChar2Float; 148ea81d6eaSJerome Leveque break; 149ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_DOUBLE: 150ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyChar2Double; 151ea81d6eaSJerome Leveque break; 152ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_INT: 153ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyChar2Int; 154ea81d6eaSJerome Leveque break; 155ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_SHORT: 156ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyChar2Short; 157ea81d6eaSJerome Leveque break; 158ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_UCHAR: 159ea81d6eaSJerome Leveque fFunc = &Resampler::_CopyChar2UChar; 160ea81d6eaSJerome Leveque break; 161ea81d6eaSJerome Leveque case media_raw_audio_format::B_AUDIO_CHAR: 162*7633665cSJerome Duval fFunc = &Resampler::_CopyChar2Char; 163ea81d6eaSJerome Leveque break; 164ea81d6eaSJerome Leveque } 165ea81d6eaSJerome Leveque break; 166ea81d6eaSJerome Leveque } 167ea81d6eaSJerome Leveque } 168ea81d6eaSJerome Leveque 169ea81d6eaSJerome Leveque 170ea81d6eaSJerome Leveque Resampler::~Resampler() 171ea81d6eaSJerome Leveque { 172ea81d6eaSJerome Leveque } 173ea81d6eaSJerome Leveque 174ea81d6eaSJerome Leveque 175*7633665cSJerome Duval void 176*7633665cSJerome Duval Resampler::_Void(const void *inputData, uint32 inputStride, 177*7633665cSJerome Duval void *outputData, uint32 outputStride, uint32 sampleCount) 178ea81d6eaSJerome Leveque { 179*7633665cSJerome Duval 180ea81d6eaSJerome Leveque } 181ea81d6eaSJerome Leveque 182ea81d6eaSJerome Leveque 183ea81d6eaSJerome Leveque void 184*7633665cSJerome Duval Resampler::_CopyFloat2Float(const void *inputData, uint32 inputStride, 185ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 186ea81d6eaSJerome Leveque { 187ea81d6eaSJerome Leveque while (sampleCount > 0) { 188*7633665cSJerome Duval *(float*)outputData = *(const float*)inputData; 189ea81d6eaSJerome Leveque 190ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 191ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 192ea81d6eaSJerome Leveque 193ea81d6eaSJerome Leveque sampleCount--; 194ea81d6eaSJerome Leveque } 195ea81d6eaSJerome Leveque } 196ea81d6eaSJerome Leveque 197ea81d6eaSJerome Leveque 198ea81d6eaSJerome Leveque void 199ea81d6eaSJerome Leveque Resampler::_CopyFloat2Double(const void *inputData, uint32 inputStride, 200ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 201ea81d6eaSJerome Leveque { 202ea81d6eaSJerome Leveque while (sampleCount > 0) { 203ea81d6eaSJerome Leveque *(double*)outputData = *(const float*)inputData; 204ea81d6eaSJerome Leveque 205ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 206ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 207ea81d6eaSJerome Leveque 208ea81d6eaSJerome Leveque sampleCount--; 209ea81d6eaSJerome Leveque } 210ea81d6eaSJerome Leveque } 211ea81d6eaSJerome Leveque 212ea81d6eaSJerome Leveque 213ea81d6eaSJerome Leveque void 214ea81d6eaSJerome Leveque Resampler::_CopyFloat2Int(const void *inputData, uint32 inputStride, 215ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 216ea81d6eaSJerome Leveque { 217ea81d6eaSJerome Leveque while (sampleCount > 0) { 218ea81d6eaSJerome Leveque *(int32*)outputData = (int32)(*(const float*)inputData * 2147483647.0f); 219ea81d6eaSJerome Leveque 220ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 221ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 222ea81d6eaSJerome Leveque 223ea81d6eaSJerome Leveque sampleCount--; 224ea81d6eaSJerome Leveque } 225ea81d6eaSJerome Leveque } 226ea81d6eaSJerome Leveque 227ea81d6eaSJerome Leveque void 228ea81d6eaSJerome Leveque Resampler::_CopyFloat2Short(const void *inputData, uint32 inputStride, 229ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 230ea81d6eaSJerome Leveque { 231ea81d6eaSJerome Leveque while (sampleCount > 0) { 232ea81d6eaSJerome Leveque *(int16*)outputData = (int16)(*(const float*)inputData * 32767.0f); 233ea81d6eaSJerome Leveque 234ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 235ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 236ea81d6eaSJerome Leveque 237ea81d6eaSJerome Leveque sampleCount--; 238ea81d6eaSJerome Leveque } 239ea81d6eaSJerome Leveque } 240ea81d6eaSJerome Leveque 241ea81d6eaSJerome Leveque 242ea81d6eaSJerome Leveque void 243ea81d6eaSJerome Leveque Resampler::_CopyFloat2UChar(const void *inputData, uint32 inputStride, 244ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 245ea81d6eaSJerome Leveque { 246ea81d6eaSJerome Leveque while (sampleCount > 0) { 247ea81d6eaSJerome Leveque *(uint8*)outputData = (uint8)(128.0f + *(const float*)inputData * 127.0f); 248ea81d6eaSJerome Leveque 249ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 250ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 251ea81d6eaSJerome Leveque 252ea81d6eaSJerome Leveque sampleCount--; 253ea81d6eaSJerome Leveque } 254ea81d6eaSJerome Leveque } 255ea81d6eaSJerome Leveque 256ea81d6eaSJerome Leveque 257ea81d6eaSJerome Leveque void 258ea81d6eaSJerome Leveque Resampler::_CopyFloat2Char(const void *inputData, uint32 inputStride, 259ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 260ea81d6eaSJerome Leveque { 261ea81d6eaSJerome Leveque while (sampleCount > 0) { 262ea81d6eaSJerome Leveque *(int8*)outputData = (int8)(*(const float*)inputData * 127.0f); 263ea81d6eaSJerome Leveque 264ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 265ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 266ea81d6eaSJerome Leveque 267ea81d6eaSJerome Leveque sampleCount--; 268ea81d6eaSJerome Leveque } 269ea81d6eaSJerome Leveque } 270ea81d6eaSJerome Leveque 271ea81d6eaSJerome Leveque 272ea81d6eaSJerome Leveque void 273ea81d6eaSJerome Leveque Resampler::_CopyDouble2Float(const void *inputData, uint32 inputStride, 274ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 275ea81d6eaSJerome Leveque { 276ea81d6eaSJerome Leveque while (sampleCount > 0) { 277ea81d6eaSJerome Leveque *(float*)outputData = *(const double*)inputData; 278ea81d6eaSJerome Leveque 279ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 280ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 281ea81d6eaSJerome Leveque 282ea81d6eaSJerome Leveque sampleCount--; 283ea81d6eaSJerome Leveque } 284ea81d6eaSJerome Leveque } 285ea81d6eaSJerome Leveque 286ea81d6eaSJerome Leveque 287ea81d6eaSJerome Leveque void 288*7633665cSJerome Duval Resampler::_CopyDouble2Double(const void *inputData, uint32 inputStride, 289*7633665cSJerome Duval void *outputData, uint32 outputStride, uint32 sampleCount) 290*7633665cSJerome Duval { 291*7633665cSJerome Duval while (sampleCount > 0) { 292*7633665cSJerome Duval *(double*)outputData = *(const double*)inputData; 293*7633665cSJerome Duval 294*7633665cSJerome Duval outputData = (void*)((uint8*)outputData + outputStride); 295*7633665cSJerome Duval inputData = (void*)((uint8*)inputData + inputStride); 296*7633665cSJerome Duval 297*7633665cSJerome Duval sampleCount--; 298*7633665cSJerome Duval } 299*7633665cSJerome Duval } 300*7633665cSJerome Duval 301*7633665cSJerome Duval 302*7633665cSJerome Duval void 303ea81d6eaSJerome Leveque Resampler::_CopyDouble2Int(const void *inputData, uint32 inputStride, 304ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 305ea81d6eaSJerome Leveque { 306ea81d6eaSJerome Leveque while (sampleCount > 0) { 307ea81d6eaSJerome Leveque *(int32*)outputData = (int32)(*(const double*)inputData * 2147483647.0f); 308ea81d6eaSJerome Leveque 309ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 310ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 311ea81d6eaSJerome Leveque 312ea81d6eaSJerome Leveque sampleCount--; 313ea81d6eaSJerome Leveque } 314ea81d6eaSJerome Leveque } 315ea81d6eaSJerome Leveque 316ea81d6eaSJerome Leveque 317ea81d6eaSJerome Leveque void 318ea81d6eaSJerome Leveque Resampler::_CopyDouble2Short(const void *inputData, uint32 inputStride, 319ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 320ea81d6eaSJerome Leveque { 321ea81d6eaSJerome Leveque while (sampleCount > 0) { 322ea81d6eaSJerome Leveque *(int16*)outputData = (int16)(*(const double*)inputData * 32767.0f); 323ea81d6eaSJerome Leveque 324ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 325ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 326ea81d6eaSJerome Leveque 327ea81d6eaSJerome Leveque sampleCount--; 328ea81d6eaSJerome Leveque } 329ea81d6eaSJerome Leveque } 330ea81d6eaSJerome Leveque 331ea81d6eaSJerome Leveque 332ea81d6eaSJerome Leveque void 333ea81d6eaSJerome Leveque Resampler::_CopyDouble2UChar(const void *inputData, uint32 inputStride, 334ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 335ea81d6eaSJerome Leveque { 336ea81d6eaSJerome Leveque while (sampleCount > 0) { 337ea81d6eaSJerome Leveque *(uint8*)outputData = (uint8)(128.0f + *(const double*)inputData * 127.0f); 338ea81d6eaSJerome Leveque 339ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 340ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 341ea81d6eaSJerome Leveque 342ea81d6eaSJerome Leveque sampleCount--; 343ea81d6eaSJerome Leveque } 344ea81d6eaSJerome Leveque } 345ea81d6eaSJerome Leveque 346ea81d6eaSJerome Leveque 347ea81d6eaSJerome Leveque void 348ea81d6eaSJerome Leveque Resampler::_CopyDouble2Char(const void *inputData, uint32 inputStride, 349ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 350ea81d6eaSJerome Leveque { 351ea81d6eaSJerome Leveque while (sampleCount > 0) { 352ea81d6eaSJerome Leveque *(int8*)outputData = (int8)(*(const double*)inputData * 127.0f); 353ea81d6eaSJerome Leveque 354ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 355ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 356ea81d6eaSJerome Leveque 357ea81d6eaSJerome Leveque sampleCount--; 358ea81d6eaSJerome Leveque } 359ea81d6eaSJerome Leveque } 360ea81d6eaSJerome Leveque 361ea81d6eaSJerome Leveque 362ea81d6eaSJerome Leveque void 363ea81d6eaSJerome Leveque Resampler::_CopyShort2Float(const void *inputData, uint32 inputStride, 364ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 365ea81d6eaSJerome Leveque { 366ea81d6eaSJerome Leveque while (sampleCount > 0) { 367ea81d6eaSJerome Leveque *(float*)outputData = *(const int16*)inputData / 32767.0f; 368ea81d6eaSJerome Leveque 369ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 370ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 371ea81d6eaSJerome Leveque 372ea81d6eaSJerome Leveque sampleCount--; 373ea81d6eaSJerome Leveque } 374ea81d6eaSJerome Leveque } 375ea81d6eaSJerome Leveque 376ea81d6eaSJerome Leveque 377ea81d6eaSJerome Leveque void 378ea81d6eaSJerome Leveque Resampler::_CopyShort2Double(const void *inputData, uint32 inputStride, 379ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 380ea81d6eaSJerome Leveque { 381ea81d6eaSJerome Leveque while (sampleCount > 0) { 382ea81d6eaSJerome Leveque *(double*)outputData = *(const int16*)inputData / 32767.0; 383ea81d6eaSJerome Leveque 384ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 385ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 386ea81d6eaSJerome Leveque 387ea81d6eaSJerome Leveque sampleCount--; 388ea81d6eaSJerome Leveque } 389ea81d6eaSJerome Leveque } 390ea81d6eaSJerome Leveque 391ea81d6eaSJerome Leveque 392ea81d6eaSJerome Leveque void 393ea81d6eaSJerome Leveque Resampler::_CopyShort2Int(const void *inputData, uint32 inputStride, 394ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 395ea81d6eaSJerome Leveque { 396ea81d6eaSJerome Leveque while (sampleCount > 0) { 397ea81d6eaSJerome Leveque *(int32*)outputData = (int32)*(const int16*)inputData << 16; 398ea81d6eaSJerome Leveque 399ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 400ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 401ea81d6eaSJerome Leveque 402ea81d6eaSJerome Leveque sampleCount--; 403ea81d6eaSJerome Leveque } 404ea81d6eaSJerome Leveque } 405ea81d6eaSJerome Leveque 406ea81d6eaSJerome Leveque 407ea81d6eaSJerome Leveque void 408*7633665cSJerome Duval Resampler::_CopyShort2Short(const void *inputData, uint32 inputStride, 409*7633665cSJerome Duval void *outputData, uint32 outputStride, uint32 sampleCount) 410*7633665cSJerome Duval { 411*7633665cSJerome Duval while (sampleCount > 0) { 412*7633665cSJerome Duval *(int16*)outputData = *(const int16*)inputData; 413*7633665cSJerome Duval 414*7633665cSJerome Duval outputData = (void*)((uint8*)outputData + outputStride); 415*7633665cSJerome Duval inputData = (void*)((uint8*)inputData + inputStride); 416*7633665cSJerome Duval 417*7633665cSJerome Duval sampleCount--; 418*7633665cSJerome Duval } 419*7633665cSJerome Duval } 420*7633665cSJerome Duval 421*7633665cSJerome Duval 422*7633665cSJerome Duval void 423ea81d6eaSJerome Leveque Resampler::_CopyShort2UChar(const void *inputData, uint32 inputStride, 424ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 425ea81d6eaSJerome Leveque { 426ea81d6eaSJerome Leveque while (sampleCount > 0) { 427ea81d6eaSJerome Leveque *(uint8*)outputData = 128 + (*(const int16*)inputData >> 8); 428ea81d6eaSJerome Leveque 429ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 430ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 431ea81d6eaSJerome Leveque 432ea81d6eaSJerome Leveque sampleCount--; 433ea81d6eaSJerome Leveque } 434ea81d6eaSJerome Leveque } 435ea81d6eaSJerome Leveque 436ea81d6eaSJerome Leveque 437ea81d6eaSJerome Leveque void 438ea81d6eaSJerome Leveque Resampler::_CopyShort2Char(const void *inputData, uint32 inputStride, 439ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 440ea81d6eaSJerome Leveque { 441ea81d6eaSJerome Leveque while (sampleCount > 0) { 442ea81d6eaSJerome Leveque *(int8*)outputData = *(const int16*)inputData >> 8; 443ea81d6eaSJerome Leveque 444ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 445ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 446ea81d6eaSJerome Leveque 447ea81d6eaSJerome Leveque sampleCount--; 448ea81d6eaSJerome Leveque } 449ea81d6eaSJerome Leveque } 450ea81d6eaSJerome Leveque 451ea81d6eaSJerome Leveque 452ea81d6eaSJerome Leveque void 453ea81d6eaSJerome Leveque Resampler::_CopyInt2Float(const void *inputData, uint32 inputStride, 454ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 455ea81d6eaSJerome Leveque { 456ea81d6eaSJerome Leveque while (sampleCount > 0) { 457ea81d6eaSJerome Leveque *(float*)outputData = *(const int32*)inputData / 2147483647.0f; 458ea81d6eaSJerome Leveque 459ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 460ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 461ea81d6eaSJerome Leveque 462ea81d6eaSJerome Leveque sampleCount--; 463ea81d6eaSJerome Leveque } 464ea81d6eaSJerome Leveque } 465ea81d6eaSJerome Leveque 466ea81d6eaSJerome Leveque 467ea81d6eaSJerome Leveque void 468ea81d6eaSJerome Leveque Resampler::_CopyInt2Double(const void *inputData, uint32 inputStride, 469ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 470ea81d6eaSJerome Leveque { 471ea81d6eaSJerome Leveque while (sampleCount > 0) { 472ea81d6eaSJerome Leveque *(double*)outputData = *(const int32*)inputData / 2147483647.0; 473ea81d6eaSJerome Leveque 474ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 475ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 476ea81d6eaSJerome Leveque 477ea81d6eaSJerome Leveque sampleCount--; 478ea81d6eaSJerome Leveque } 479ea81d6eaSJerome Leveque } 480ea81d6eaSJerome Leveque 481ea81d6eaSJerome Leveque 482ea81d6eaSJerome Leveque void 483*7633665cSJerome Duval Resampler::_CopyInt2Int(const void *inputData, uint32 inputStride, 484*7633665cSJerome Duval void *outputData, uint32 outputStride, uint32 sampleCount) 485*7633665cSJerome Duval { 486*7633665cSJerome Duval while (sampleCount > 0) { 487*7633665cSJerome Duval *(int32*)outputData = *(const int32*)inputData; 488*7633665cSJerome Duval 489*7633665cSJerome Duval outputData = (void*)((uint8*)outputData + outputStride); 490*7633665cSJerome Duval inputData = (void*)((uint8*)inputData + inputStride); 491*7633665cSJerome Duval 492*7633665cSJerome Duval sampleCount--; 493*7633665cSJerome Duval } 494*7633665cSJerome Duval } 495*7633665cSJerome Duval 496*7633665cSJerome Duval 497*7633665cSJerome Duval void 498ea81d6eaSJerome Leveque Resampler::_CopyInt2Short(const void *inputData, uint32 inputStride, 499ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 500ea81d6eaSJerome Leveque { 501ea81d6eaSJerome Leveque while (sampleCount > 0) { 502ea81d6eaSJerome Leveque *(int16*)outputData = *(const int32*)inputData >> 16; 503ea81d6eaSJerome Leveque 504ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 505ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 506ea81d6eaSJerome Leveque 507ea81d6eaSJerome Leveque sampleCount--; 508ea81d6eaSJerome Leveque } 509ea81d6eaSJerome Leveque } 510ea81d6eaSJerome Leveque 511ea81d6eaSJerome Leveque 512ea81d6eaSJerome Leveque void 513ea81d6eaSJerome Leveque Resampler::_CopyInt2UChar(const void *inputData, uint32 inputStride, 514ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 515ea81d6eaSJerome Leveque { 516ea81d6eaSJerome Leveque while (sampleCount > 0) { 517ea81d6eaSJerome Leveque *(uint8*)outputData = 128 + (*(const int32*)inputData >> 24); 518ea81d6eaSJerome Leveque 519ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 520ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 521ea81d6eaSJerome Leveque 522ea81d6eaSJerome Leveque sampleCount--; 523ea81d6eaSJerome Leveque } 524ea81d6eaSJerome Leveque } 525ea81d6eaSJerome Leveque 526ea81d6eaSJerome Leveque 527ea81d6eaSJerome Leveque void 528ea81d6eaSJerome Leveque Resampler::_CopyInt2Char(const void *inputData, uint32 inputStride, 529ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 530ea81d6eaSJerome Leveque { 531ea81d6eaSJerome Leveque while (sampleCount > 0) { 532ea81d6eaSJerome Leveque *(uint8*)outputData = *(const int32*)inputData >> 24; 533ea81d6eaSJerome Leveque 534ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 535ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 536ea81d6eaSJerome Leveque 537ea81d6eaSJerome Leveque sampleCount--; 538ea81d6eaSJerome Leveque } 539ea81d6eaSJerome Leveque } 540ea81d6eaSJerome Leveque 541ea81d6eaSJerome Leveque 542ea81d6eaSJerome Leveque void 543ea81d6eaSJerome Leveque Resampler::_CopyUChar2Float(const void *inputData, uint32 inputStride, 544ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 545ea81d6eaSJerome Leveque { 546ea81d6eaSJerome Leveque while (sampleCount > 0) { 547ea81d6eaSJerome Leveque *(float*)outputData = (*(const uint8*)inputData - 128) / 127.0f; 548ea81d6eaSJerome Leveque 549ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 550ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 551ea81d6eaSJerome Leveque 552ea81d6eaSJerome Leveque sampleCount--; 553ea81d6eaSJerome Leveque } 554ea81d6eaSJerome Leveque } 555ea81d6eaSJerome Leveque 556ea81d6eaSJerome Leveque 557ea81d6eaSJerome Leveque void 558ea81d6eaSJerome Leveque Resampler::_CopyUChar2Double(const void *inputData, uint32 inputStride, 559ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 560ea81d6eaSJerome Leveque { 561ea81d6eaSJerome Leveque while (sampleCount > 0) { 562ea81d6eaSJerome Leveque *(double*)outputData = (*(const uint8*)inputData - 128) / 127.0; 563ea81d6eaSJerome Leveque 564ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 565ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 566ea81d6eaSJerome Leveque 567ea81d6eaSJerome Leveque sampleCount--; 568ea81d6eaSJerome Leveque } 569ea81d6eaSJerome Leveque } 570ea81d6eaSJerome Leveque 571ea81d6eaSJerome Leveque 572ea81d6eaSJerome Leveque void 573ea81d6eaSJerome Leveque Resampler::_CopyUChar2Short(const void *inputData, uint32 inputStride, 574ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 575ea81d6eaSJerome Leveque { 576ea81d6eaSJerome Leveque while (sampleCount > 0) { 577ea81d6eaSJerome Leveque *(int16*)outputData = (int16)(*(const uint8*)inputData - 128) << 8; 578ea81d6eaSJerome Leveque 579ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 580ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 581ea81d6eaSJerome Leveque 582ea81d6eaSJerome Leveque sampleCount--; 583ea81d6eaSJerome Leveque } 584ea81d6eaSJerome Leveque } 585ea81d6eaSJerome Leveque 586ea81d6eaSJerome Leveque 587ea81d6eaSJerome Leveque void 588ea81d6eaSJerome Leveque Resampler::_CopyUChar2Int(const void *inputData, uint32 inputStride, 589ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 590ea81d6eaSJerome Leveque { 591ea81d6eaSJerome Leveque while (sampleCount > 0) { 592ea81d6eaSJerome Leveque *(int32*)outputData = (int32)(*(const uint8*)inputData - 128) << 24; 593ea81d6eaSJerome Leveque 594ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 595ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 596ea81d6eaSJerome Leveque 597ea81d6eaSJerome Leveque sampleCount--; 598ea81d6eaSJerome Leveque } 599ea81d6eaSJerome Leveque } 600ea81d6eaSJerome Leveque 601ea81d6eaSJerome Leveque 602ea81d6eaSJerome Leveque void 603*7633665cSJerome Duval Resampler::_CopyUChar2UChar(const void *inputData, uint32 inputStride, 604*7633665cSJerome Duval void *outputData, uint32 outputStride, uint32 sampleCount) 605*7633665cSJerome Duval { 606*7633665cSJerome Duval while (sampleCount > 0) { 607*7633665cSJerome Duval *(uint8*)outputData = *(const uint8*)inputData; 608*7633665cSJerome Duval 609*7633665cSJerome Duval outputData = (void*)((uint8*)outputData + outputStride); 610*7633665cSJerome Duval inputData = (void*)((uint8*)inputData + inputStride); 611*7633665cSJerome Duval 612*7633665cSJerome Duval sampleCount--; 613*7633665cSJerome Duval } 614*7633665cSJerome Duval } 615*7633665cSJerome Duval 616*7633665cSJerome Duval 617*7633665cSJerome Duval void 618ea81d6eaSJerome Leveque Resampler::_CopyUChar2Char(const void *inputData, uint32 inputStride, 619ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 620ea81d6eaSJerome Leveque { 621ea81d6eaSJerome Leveque while (sampleCount > 0) { 622ea81d6eaSJerome Leveque *(int8*)outputData = *(const uint8*)inputData - 128; 623ea81d6eaSJerome Leveque 624ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 625ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 626ea81d6eaSJerome Leveque 627ea81d6eaSJerome Leveque sampleCount--; 628ea81d6eaSJerome Leveque } 629ea81d6eaSJerome Leveque } 630ea81d6eaSJerome Leveque 631ea81d6eaSJerome Leveque 632ea81d6eaSJerome Leveque void 633ea81d6eaSJerome Leveque Resampler::_CopyChar2Float(const void *inputData, uint32 inputStride, 634ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 635ea81d6eaSJerome Leveque { 636ea81d6eaSJerome Leveque while (sampleCount > 0) { 637ea81d6eaSJerome Leveque *(float*)outputData = *(const int8*)inputData / 127.0f; 638ea81d6eaSJerome Leveque 639ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 640ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 641ea81d6eaSJerome Leveque 642ea81d6eaSJerome Leveque sampleCount--; 643ea81d6eaSJerome Leveque } 644ea81d6eaSJerome Leveque } 645ea81d6eaSJerome Leveque 646ea81d6eaSJerome Leveque 647ea81d6eaSJerome Leveque void 648ea81d6eaSJerome Leveque Resampler::_CopyChar2Double(const void *inputData, uint32 inputStride, 649ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 650ea81d6eaSJerome Leveque { 651ea81d6eaSJerome Leveque while (sampleCount > 0) { 652ea81d6eaSJerome Leveque *(double*)outputData = *(const int8*)inputData / 127.0; 653ea81d6eaSJerome Leveque 654ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 655ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 656ea81d6eaSJerome Leveque 657ea81d6eaSJerome Leveque sampleCount--; 658ea81d6eaSJerome Leveque } 659ea81d6eaSJerome Leveque } 660ea81d6eaSJerome Leveque 661ea81d6eaSJerome Leveque 662ea81d6eaSJerome Leveque void 663ea81d6eaSJerome Leveque Resampler::_CopyChar2Short(const void *inputData, uint32 inputStride, 664ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 665ea81d6eaSJerome Leveque { 666ea81d6eaSJerome Leveque while (sampleCount > 0) { 667ea81d6eaSJerome Leveque *(int16*)outputData = ((int16)*(const int8*)inputData) << 8; 668ea81d6eaSJerome Leveque 669ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 670ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 671ea81d6eaSJerome Leveque 672ea81d6eaSJerome Leveque sampleCount--; 673ea81d6eaSJerome Leveque } 674ea81d6eaSJerome Leveque } 675ea81d6eaSJerome Leveque 676ea81d6eaSJerome Leveque 677ea81d6eaSJerome Leveque void 678ea81d6eaSJerome Leveque Resampler::_CopyChar2Int(const void *inputData, uint32 inputStride, 679ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 680ea81d6eaSJerome Leveque { 681ea81d6eaSJerome Leveque while (sampleCount > 0) { 682ea81d6eaSJerome Leveque *(int32*)outputData = ((int16)*(const int8*)inputData) << 24; 683ea81d6eaSJerome Leveque 684ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 685ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 686ea81d6eaSJerome Leveque 687ea81d6eaSJerome Leveque sampleCount--; 688ea81d6eaSJerome Leveque } 689ea81d6eaSJerome Leveque } 690ea81d6eaSJerome Leveque 691ea81d6eaSJerome Leveque 692ea81d6eaSJerome Leveque void 693ea81d6eaSJerome Leveque Resampler::_CopyChar2UChar(const void *inputData, uint32 inputStride, 694ea81d6eaSJerome Leveque void *outputData, uint32 outputStride, uint32 sampleCount) 695ea81d6eaSJerome Leveque { 696ea81d6eaSJerome Leveque while (sampleCount > 0) { 697ea81d6eaSJerome Leveque *(uint8*)outputData = *(const int8*)inputData + 128; 698ea81d6eaSJerome Leveque 699ea81d6eaSJerome Leveque outputData = (void*)((uint8*)outputData + outputStride); 700ea81d6eaSJerome Leveque inputData = (void*)((uint8*)inputData + inputStride); 701ea81d6eaSJerome Leveque 702ea81d6eaSJerome Leveque sampleCount--; 703ea81d6eaSJerome Leveque } 704ea81d6eaSJerome Leveque } 705ea81d6eaSJerome Leveque 706*7633665cSJerome Duval 707*7633665cSJerome Duval void 708*7633665cSJerome Duval Resampler::_CopyChar2Char(const void *inputData, uint32 inputStride, 709*7633665cSJerome Duval void *outputData, uint32 outputStride, uint32 sampleCount) 710*7633665cSJerome Duval { 711*7633665cSJerome Duval while (sampleCount > 0) { 712*7633665cSJerome Duval *(int8*)outputData = *(const int8*)inputData; 713*7633665cSJerome Duval 714*7633665cSJerome Duval outputData = (void*)((uint8*)outputData + outputStride); 715*7633665cSJerome Duval inputData = (void*)((uint8*)inputData + inputStride); 716*7633665cSJerome Duval 717*7633665cSJerome Duval sampleCount--; 718*7633665cSJerome Duval } 719*7633665cSJerome Duval } 720*7633665cSJerome Duval 721