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
23namespace webrtc {
24
25// All methods return 0 on success and -1 on failure.
26class Resampler
27{
28
29public:
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
44private:
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