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