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.
5 #ifndef MEDIA_BASE_AUDIO_BUFFER_CONVERTER
6 #define MEDIA_BASE_AUDIO_BUFFER_CONVERTER
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"
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
{
27 explicit AudioBufferConverter(const AudioParameters
& output_params
);
28 ~AudioBufferConverter() override
;
30 void AddInput(const scoped_refptr
<AudioBuffer
>& buffer
);
32 // Is an output buffer available via GetNextBuffer()?
35 // This should only be called this is HasNextBuffer() returns true.
36 scoped_refptr
<AudioBuffer
> GetNextBuffer();
38 // Reset internal state.
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();
45 int input_buffer_size_for_testing() const {
46 return input_params_
.frames_per_buffer();
48 int input_frames_left_for_testing() const {
53 // Callback to provide data to the AudioConverter
54 double ProvideInput(AudioBus
* audio_bus
,
55 base::TimeDelta buffer_delay
) override
;
57 // Reset the converter in response to a configuration change.
58 void ResetConverter(const scoped_refptr
<AudioBuffer
>& input_buffer
);
60 // Perform conversion if we have enough data.
61 void ConvertIfPossible();
63 // Flush remaining output
66 // The output parameters.
67 AudioParameters output_params_
;
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_
;
73 typedef std::deque
<scoped_refptr
<AudioBuffer
> > BufferQueue
;
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_
;
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_
;
83 // Buffer of output frames, to be returned by GetNextBuffer().
84 BufferQueue queued_outputs_
;
86 // How many frames of input we have in |queued_inputs_|.
89 // Input frames in the AudioConverter's internal buffers.
90 double buffered_input_frames_
;
92 // Ratio of sample rates, in/out.
93 double io_sample_rate_ratio_
;
95 // Computes timestamps in terms of the output sample rate.
96 AudioTimestampHelper timestamp_helper_
;
98 // Are we flushing everything, without regard for providing AudioConverter
99 // full AudioBuses in ProvideInput()?
102 // The AudioConverter which does the real work here.
103 scoped_ptr
<AudioConverter
> audio_converter_
;
108 #endif // MEDIA_BASE_AUDIO_BUFFER_CONVERTER