1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MEDIA_BASE_AUDIO_BUFFER_CONVERTER 6 #define MEDIA_BASE_AUDIO_BUFFER_CONVERTER 7 8 #include <deque> 9 10 #include "base/memory/ref_counted.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "base/time/time.h" 13 #include "media/audio/audio_parameters.h" 14 #include "media/base/audio_converter.h" 15 #include "media/base/audio_timestamp_helper.h" 16 #include "media/base/media_export.h" 17 18 namespace media { 19 20 class AudioBuffer; 21 class AudioBus; 22 23 // Takes AudioBuffers in any format and uses an AudioConverter to convert them 24 // to a common format (usually the hardware output format). 25 class MEDIA_EXPORT AudioBufferConverter : public AudioConverter::InputCallback { 26 public: 27 explicit AudioBufferConverter(const AudioParameters& output_params); 28 virtual ~AudioBufferConverter(); 29 30 void AddInput(const scoped_refptr<AudioBuffer>& buffer); 31 32 // Is an output buffer available via GetNextBuffer()? 33 bool HasNextBuffer(); 34 35 // This should only be called this is HasNextBuffer() returns true. 36 scoped_refptr<AudioBuffer> GetNextBuffer(); 37 38 // Reset internal state. 39 void Reset(); 40 41 // Reset internal timestamp state. Upon the next AddInput() call, our base 42 // timestamp will be set to match the input buffer. 43 void ResetTimestampState(); 44 45 int input_buffer_size_for_testing() const { 46 return input_params_.frames_per_buffer(); 47 } 48 int input_frames_left_for_testing() const { 49 return input_frames_; 50 } 51 52 private: 53 // Callback to provide data to the AudioConverter 54 virtual double ProvideInput(AudioBus* audio_bus, 55 base::TimeDelta buffer_delay) OVERRIDE; 56 57 // Reset the converter in response to a configuration change. 58 void ResetConverter(const scoped_refptr<AudioBuffer>& input_buffer); 59 60 // Perform conversion if we have enough data. 61 void ConvertIfPossible(); 62 63 // Flush remaining output 64 void Flush(); 65 66 // The output parameters. 67 AudioParameters output_params_; 68 69 // The current input parameters (we cache these to detect configuration 70 // changes, so we know when to reset the AudioConverter). 71 AudioParameters input_params_; 72 73 typedef std::deque<scoped_refptr<AudioBuffer> > BufferQueue; 74 75 // Queued up inputs (there will never be all that much data stored here, as 76 // soon as there's enough here to produce an output buffer we will do so). 77 BufferQueue queued_inputs_; 78 79 // Offset into the front element of |queued_inputs_|. A ProvideInput() call 80 // doesn't necessarily always consume an entire buffer. 81 int last_input_buffer_offset_; 82 83 // Buffer of output frames, to be returned by GetNextBuffer(). 84 BufferQueue queued_outputs_; 85 86 // How many frames of input we have in |queued_inputs_|. 87 int input_frames_; 88 89 // Input frames in the AudioConverter's internal buffers. 90 double buffered_input_frames_; 91 92 // Ratio of sample rates, in/out. 93 double io_sample_rate_ratio_; 94 95 // Computes timestamps in terms of the output sample rate. 96 AudioTimestampHelper timestamp_helper_; 97 98 // Are we flushing everything, without regard for providing AudioConverter 99 // full AudioBuses in ProvideInput()? 100 bool is_flushing_; 101 102 // The AudioConverter which does the real work here. 103 scoped_ptr<AudioConverter> audio_converter_; 104 }; 105 106 } // namespace media 107 108 #endif // MEDIA_BASE_AUDIO_BUFFER_CONVERTER 109