cc: Fix logic for detecting when raster tasks were throttled
[chromium-blink-merge.git] / media / base / audio_renderer_mixer.h
blob942c61fe8495cd3b0a921bf0a12dc7da10269b29
1 // Copyright (c) 2012 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_RENDERER_MIXER_H_
6 #define MEDIA_BASE_AUDIO_RENDERER_MIXER_H_
8 #include <map>
10 #include "base/synchronization/lock.h"
11 #include "base/time/time.h"
12 #include "media/base/audio_converter.h"
13 #include "media/base/audio_renderer_sink.h"
15 namespace media {
17 // Mixes a set of AudioConverter::InputCallbacks into a single output stream
18 // which is funneled into a single shared AudioRendererSink; saving a bundle
19 // on renderer side resources.
20 class MEDIA_EXPORT AudioRendererMixer
21 : NON_EXPORTED_BASE(public AudioRendererSink::RenderCallback) {
22 public:
23 AudioRendererMixer(const AudioParameters& input_params,
24 const AudioParameters& output_params,
25 const scoped_refptr<AudioRendererSink>& sink);
26 virtual ~AudioRendererMixer();
28 // Add or remove a mixer input from mixing; called by AudioRendererMixerInput.
29 void AddMixerInput(AudioConverter::InputCallback* input,
30 const base::Closure& error_cb);
31 void RemoveMixerInput(AudioConverter::InputCallback* input);
33 void set_pause_delay_for_testing(base::TimeDelta delay) {
34 pause_delay_ = delay;
37 private:
38 // AudioRendererSink::RenderCallback implementation.
39 virtual int Render(AudioBus* audio_bus,
40 int audio_delay_milliseconds) OVERRIDE;
41 virtual void OnRenderError() OVERRIDE;
43 // Output sink for this mixer.
44 scoped_refptr<AudioRendererSink> audio_sink_;
46 // Set of mixer inputs to be mixed by this mixer. Access is thread-safe
47 // through |mixer_inputs_lock_|.
48 typedef std::map<AudioConverter::InputCallback*, base::Closure>
49 AudioRendererMixerInputSet;
50 AudioRendererMixerInputSet mixer_inputs_;
51 base::Lock mixer_inputs_lock_;
53 // Handles mixing and resampling between input and output parameters.
54 AudioConverter audio_converter_;
56 // Handles physical stream pause when no inputs are playing. For latency
57 // reasons we don't want to immediately pause the physical stream.
58 base::TimeDelta pause_delay_;
59 base::TimeTicks last_play_time_;
60 bool playing_;
62 DISALLOW_COPY_AND_ASSIGN(AudioRendererMixer);
65 } // namespace media
67 #endif // MEDIA_BASE_AUDIO_RENDERER_MIXER_H_