multi_channel_resampler.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
10a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang// Copyright (c) 2012 The Chromium Authors. All rights reserved. 20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang// Use of this source code is governed by a BSD-style license that can be 30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang// found in the LICENSE file. 40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef MEDIA_BASE_MULTI_CHANNEL_RESAMPLER_H_ 60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define MEDIA_BASE_MULTI_CHANNEL_RESAMPLER_H_ 70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <vector> 90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "base/callback.h" 110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "base/memory/scoped_ptr.h" 120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "base/memory/scoped_vector.h" 130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "media/base/sinc_resampler.h" 140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangnamespace media { 160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangclass AudioBus; 170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang// MultiChannelResampler is a multi channel wrapper for SincResampler; allowing 190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang// high quality sample rate conversion of multiple channels at once. 200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangclass MEDIA_EXPORT MultiChannelResampler { 210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang public: 220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // Callback type for providing more data into the resampler. Expects AudioBus 230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // to be completely filled with data upon return; zero padded if not enough 240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // frames are available to satisfy the request. 250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang typedef base::Callback<void(AudioBus* audio_bus)> ReadCB; 260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // Constructs a MultiChannelResampler with the specified |read_cb|, which is 280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // used to acquire audio data for resampling. |io_sample_rate_ratio| is the 290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // ratio of input / output sample rates. 300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang MultiChannelResampler(int channels, double io_sample_rate_ratio, 310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang const ReadCB& read_cb); 320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang virtual ~MultiChannelResampler(); 330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // Resamples |frames| of data from |read_cb_| into AudioBus. 350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang void Resample(AudioBus* audio_bus, int frames); 360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // Flush all buffered data and reset internal indices. 380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang void Flush(); 390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang private: 410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // SincResampler::ReadCB implementation. ProvideInput() will be called for 420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // each channel (in channel order) as SincResampler needs more data. 430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang void ProvideInput(int channel, float* destination, int frames); 440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // Sanity check to ensure that ProvideInput() retrieves the same number of 460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // frames for every channel. 470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int last_frame_count_; 480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // Source of data for resampling. 500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ReadCB read_cb_; 510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // Each channel has its own high quality resampler. 530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ScopedVector<SincResampler> resamplers_; 540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang // Buffers for audio data going into SincResampler from ReadCB. 560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang scoped_ptr<AudioBus> resampler_audio_bus_; 570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang scoped_ptr<AudioBus> wrapped_resampler_audio_bus_; 580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang std::vector<float*> resampler_audio_data_; 590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} // namespace media 620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif // MEDIA_BASE_MULTI_CHANNEL_RESAMPLER_H_ 640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang