BookmarkManager: Fix 'new folder text field size changes on clicking it' issue.
[chromium-blink-merge.git] / media / base / audio_buffer_converter.h
blobd2c4f6de0b5dff224de3ec3aaa6287ff83f7a58e
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
8 #include <deque>
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"
18 namespace media {
20 class AudioBuffer;
21 class AudioBus;
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 ~AudioBufferConverter() override;
30 void AddInput(const scoped_refptr<AudioBuffer>& buffer);
32 // Is an output buffer available via GetNextBuffer()?
33 bool HasNextBuffer();
35 // This should only be called this is HasNextBuffer() returns true.
36 scoped_refptr<AudioBuffer> GetNextBuffer();
38 // Reset internal state.
39 void Reset();
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 {
49 return input_frames_;
52 private:
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
64 void Flush();
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_|.
87 int input_frames_;
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()?
100 bool is_flushing_;
102 // The AudioConverter which does the real work here.
103 scoped_ptr<AudioConverter> audio_converter_;
106 } // namespace media
108 #endif // MEDIA_BASE_AUDIO_BUFFER_CONVERTER