1 /* 2 * Copyright 2012 Jérôme Leveque 3 * Copyright 2003 Marcus Overhagen 4 * Distributed under the terms of the MIT License. 5 */ 6 #ifndef _MULTI_AUDIO_RESAMPLER_H 7 #define _MULTI_AUDIO_RESAMPLER_H 8 9 10 #include <MediaDefs.h> 11 12 13 class Resampler { 14 public: 15 Resampler(uint32 sourceFormat, 16 uint32 destFormat); 17 18 virtual ~Resampler(); 19 20 status_t InitCheck() const; 21 22 void Resample(const void *inputData, 23 uint32 inputStride, void *outputData, 24 uint32 outputStride, uint32 sampleCount); 25 26 protected: 27 //static functions for converting datas 28 template<typename T> void _CopyType2Type(const void *inputData, 29 uint32 inputStride, void *outputData, 30 uint32 outputStride, uint32 sampleCount); 31 virtual void _CopyFloat2Double(const void *inputData, 32 uint32 inputStride, void *outputData, 33 uint32 outputStride, uint32 sampleCount); 34 virtual void _CopyFloat2Short(const void *inputData, 35 uint32 inputStride, void *outputData, 36 uint32 outputStride, uint32 sampleCount); 37 virtual void _CopyFloat2Int(const void *inputData, 38 uint32 inputStride, void *outputData, 39 uint32 outputStride, uint32 sampleCount); 40 virtual void _CopyFloat2UChar(const void *inputData, 41 uint32 inputStride, void *outputData, 42 uint32 outputStride, uint32 sampleCount); 43 virtual void _CopyFloat2Char(const void *inputData, 44 uint32 inputStride, void *outputData, 45 uint32 outputStride, uint32 sampleCount); 46 47 virtual void _CopyDouble2Float(const void *inputData, 48 uint32 inputStride, void *outputData, 49 uint32 outputStride, uint32 sampleCount); 50 virtual void _CopyDouble2Short(const void *inputData, 51 uint32 inputStride, void *outputData, 52 uint32 outputStride, uint32 sampleCount); 53 virtual void _CopyDouble2Int(const void *inputData, 54 uint32 inputStride, void *outputData, 55 uint32 outputStride, uint32 sampleCount); 56 virtual void _CopyDouble2UChar(const void *inputData, 57 uint32 inputStride, void *outputData, 58 uint32 outputStride, uint32 sampleCount); 59 virtual void _CopyDouble2Char(const void *inputData, 60 uint32 inputStride, void *outputData, 61 uint32 outputStride, uint32 sampleCount); 62 63 virtual void _CopyInt2Float(const void *inputData, 64 uint32 inputStride, void *outputData, 65 uint32 outputStride, uint32 sampleCount); 66 virtual void _CopyInt2Double(const void *inputData, 67 uint32 inputStride, void *outputData, 68 uint32 outputStride, uint32 sampleCount); 69 virtual void _CopyInt2Short(const void *inputData, 70 uint32 inputStride, void *outputData, 71 uint32 outputStride, uint32 sampleCount); 72 virtual void _CopyInt2UChar(const void *inputData, 73 uint32 inputStride, void *outputData, 74 uint32 outputStride, uint32 sampleCount); 75 virtual void _CopyInt2Char(const void *inputData, 76 uint32 inputStride, void *outputData, 77 uint32 outputStride, uint32 sampleCount); 78 79 virtual void _CopyShort2Float(const void *inputData, 80 uint32 inputStride, void *outputData, 81 uint32 outputStride, uint32 sampleCount); 82 virtual void _CopyShort2Double(const void *inputData, 83 uint32 inputStride, void *outputData, 84 uint32 outputStride, uint32 sampleCount); 85 virtual void _CopyShort2Int(const void *inputData, 86 uint32 inputStride, void *outputData, 87 uint32 outputStride, uint32 sampleCount); 88 virtual void _CopyShort2UChar(const void *inputData, 89 uint32 inputStride, void *outputData, 90 uint32 outputStride, uint32 sampleCount); 91 virtual void _CopyShort2Char(const void *inputData, 92 uint32 inputStride, void *outputData, 93 uint32 outputStride, uint32 sampleCount); 94 95 virtual void _CopyUChar2Float(const void *inputData, 96 uint32 inputStride, void *outputData, 97 uint32 outputStride, uint32 sampleCount); 98 virtual void _CopyUChar2Double(const void *inputData, 99 uint32 inputStride, void *outputData, 100 uint32 outputStride, uint32 sampleCount); 101 virtual void _CopyUChar2Short(const void *inputData, 102 uint32 inputStride, void *outputData, 103 uint32 outputStride, uint32 sampleCount); 104 virtual void _CopyUChar2Int(const void *inputData, 105 uint32 inputStride, void *outputData, 106 uint32 outputStride, uint32 sampleCount); 107 virtual void _CopyUChar2Char(const void *inputData, 108 uint32 inputStride, void *outputData, 109 uint32 outputStride, uint32 sampleCount); 110 111 virtual void _CopyChar2Float(const void *inputData, 112 uint32 inputStride, void *outputData, 113 uint32 outputStride, uint32 sampleCount); 114 virtual void _CopyChar2Double(const void *inputData, 115 uint32 inputStride, void *outputData, 116 uint32 outputStride, uint32 sampleCount); 117 virtual void _CopyChar2Short(const void *inputData, 118 uint32 inputStride, void *outputData, 119 uint32 outputStride, uint32 sampleCount); 120 virtual void _CopyChar2Int(const void *inputData, 121 uint32 inputStride, void *outputData, 122 uint32 outputStride, uint32 sampleCount); 123 virtual void _CopyChar2UChar(const void *inputData, 124 uint32 inputStride, void *outputData, 125 uint32 outputStride, uint32 sampleCount); 126 127 private: 128 void (Resampler::*fFunc)(const void *inputData, 129 uint32 inputStride, void *outputData, 130 uint32 outputStride, uint32 sampleCount); 131 }; 132 133 134 inline void 135 Resampler::Resample(const void *inputData, uint32 inputStride, 136 void *outputData, uint32 outputStride, uint32 sampleCount) 137 { 138 if (this->InitCheck() != B_OK) 139 return; 140 (this->*fFunc)(inputData, inputStride, outputData, outputStride, 141 sampleCount); 142 } 143 144 145 #endif // _MULTI_AUDIO_RESAMPLER_H 146