/* * 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_