1 /*
2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 
12 /*
13  * A wrapper for resampling a numerous amount of sampling combinations.
14  */
15 
16 #ifndef WEBRTC_RESAMPLER_RESAMPLER_H_
17 #define WEBRTC_RESAMPLER_RESAMPLER_H_
18 
19 #include <stddef.h>
20 
21 #include "webrtc/typedefs.h"
22 
23 namespace webrtc {
24 
25 // All methods return 0 on success and -1 on failure.
26 class Resampler
27 {
28 
29 public:
30     Resampler();
31     Resampler(int inFreq, int outFreq, size_t num_channels);
32     ~Resampler();
33 
34     // Reset all states
35     int Reset(int inFreq, int outFreq, size_t num_channels);
36 
37     // Reset all states if any parameter has changed
38     int ResetIfNeeded(int inFreq, int outFreq, size_t num_channels);
39 
40     // Resample samplesIn to samplesOut.
41     int Push(const int16_t* samplesIn, size_t lengthIn, int16_t* samplesOut,
42              size_t maxLen, size_t &outLen);
43 
44 private:
45     enum ResamplerMode
46     {
47         kResamplerMode1To1,
48         kResamplerMode1To2,
49         kResamplerMode1To3,
50         kResamplerMode1To4,
51         kResamplerMode1To6,
52         kResamplerMode1To12,
53         kResamplerMode2To3,
54         kResamplerMode2To11,
55         kResamplerMode4To11,
56         kResamplerMode8To11,
57         kResamplerMode11To16,
58         kResamplerMode11To32,
59         kResamplerMode2To1,
60         kResamplerMode3To1,
61         kResamplerMode4To1,
62         kResamplerMode6To1,
63         kResamplerMode12To1,
64         kResamplerMode3To2,
65         kResamplerMode11To2,
66         kResamplerMode11To4,
67         kResamplerMode11To8
68     };
69 
70     // Generic pointers since we don't know what states we'll need
71     void* state1_;
72     void* state2_;
73     void* state3_;
74 
75     // Storage if needed
76     int16_t* in_buffer_;
77     int16_t* out_buffer_;
78     size_t in_buffer_size_;
79     size_t out_buffer_size_;
80     size_t in_buffer_size_max_;
81     size_t out_buffer_size_max_;
82 
83     int my_in_frequency_khz_;
84     int my_out_frequency_khz_;
85     ResamplerMode my_mode_;
86     size_t num_channels_;
87 
88     // Extra instance for stereo
89     Resampler* slave_left_;
90     Resampler* slave_right_;
91 };
92 
93 }  // namespace webrtc
94 
95 #endif // WEBRTC_RESAMPLER_RESAMPLER_H_
96