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_
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"
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
) {
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
) {
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_
;
62 DISALLOW_COPY_AND_ASSIGN(AudioRendererMixer
);
67 #endif // MEDIA_BASE_AUDIO_RENDERER_MIXER_H_