xref: /haiku/src/add-ons/media/media-add-ons/multi_audio/Resampler.h (revision ea81d6eaf00849fcf8bb46d5e2c2f59142dfc19b)
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