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