| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| |
| /* |
| * A wrapper for resampling a numerous amount of sampling combinations. |
| */ |
| |
| #ifndef WEBRTC_RESAMPLER_RESAMPLER_H_ |
| #define WEBRTC_RESAMPLER_RESAMPLER_H_ |
| |
| #include "typedefs.h" |
| |
| namespace webrtc |
| { |
| |
| // TODO(andrew): the implementation depends on the exact values of this enum. |
| // It should be rewritten in a less fragile way. |
| enum ResamplerType |
| { |
| // 4 MSB = Number of channels |
| // 4 LSB = Synchronous or asynchronous |
| |
| kResamplerSynchronous = 0x10, |
| kResamplerAsynchronous = 0x11, |
| kResamplerSynchronousStereo = 0x20, |
| kResamplerAsynchronousStereo = 0x21, |
| kResamplerInvalid = 0xff |
| }; |
| |
| // TODO(andrew): doesn't need to be part of the interface. |
| enum ResamplerMode |
| { |
| kResamplerMode1To1, |
| kResamplerMode1To2, |
| kResamplerMode1To3, |
| kResamplerMode1To4, |
| kResamplerMode1To6, |
| kResamplerMode1To12, |
| kResamplerMode2To3, |
| kResamplerMode2To11, |
| kResamplerMode4To11, |
| kResamplerMode8To11, |
| kResamplerMode11To16, |
| kResamplerMode11To32, |
| kResamplerMode2To1, |
| kResamplerMode3To1, |
| kResamplerMode4To1, |
| kResamplerMode6To1, |
| kResamplerMode12To1, |
| kResamplerMode3To2, |
| kResamplerMode11To2, |
| kResamplerMode11To4, |
| kResamplerMode11To8 |
| }; |
| |
| class Resampler |
| { |
| |
| public: |
| Resampler(); |
| // TODO(andrew): use an init function instead. |
| Resampler(int inFreq, int outFreq, ResamplerType type); |
| ~Resampler(); |
| |
| // Reset all states |
| int Reset(int inFreq, int outFreq, ResamplerType type); |
| |
| // Reset all states if any parameter has changed |
| int ResetIfNeeded(int inFreq, int outFreq, ResamplerType type); |
| |
| // Synchronous resampling, all output samples are written to samplesOut |
| int Push(const WebRtc_Word16* samplesIn, int lengthIn, WebRtc_Word16* samplesOut, |
| int maxLen, int &outLen); |
| |
| // Asynchronous resampling, input |
| int Insert(WebRtc_Word16* samplesIn, int lengthIn); |
| |
| // Asynchronous resampling output, remaining samples are buffered |
| int Pull(WebRtc_Word16* samplesOut, int desiredLen, int &outLen); |
| |
| private: |
| // Generic pointers since we don't know what states we'll need |
| void* state1_; |
| void* state2_; |
| void* state3_; |
| |
| // Storage if needed |
| WebRtc_Word16* in_buffer_; |
| WebRtc_Word16* out_buffer_; |
| int in_buffer_size_; |
| int out_buffer_size_; |
| int in_buffer_size_max_; |
| int out_buffer_size_max_; |
| |
| // State |
| int my_in_frequency_khz_; |
| int my_out_frequency_khz_; |
| ResamplerMode my_mode_; |
| ResamplerType my_type_; |
| |
| // Extra instance for stereo |
| Resampler* slave_left_; |
| Resampler* slave_right_; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // WEBRTC_RESAMPLER_RESAMPLER_H_ |