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. 4 5 #ifndef MEDIA_BASE_AUDIO_RENDERER_MIXER_H_ 6 #define MEDIA_BASE_AUDIO_RENDERER_MIXER_H_ 7 8 #include <map> 9 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" 14 15 namespace media { 16 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(); 27 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); 32 33 void set_pause_delay_for_testing(base::TimeDelta delay) { 34 pause_delay_ = delay; 35 } 36 37 private: 38 // AudioRendererSink::RenderCallback implementation. 39 virtual int Render(AudioBus* audio_bus, 40 int audio_delay_milliseconds) OVERRIDE; 41 virtual void OnRenderError() OVERRIDE; 42 43 // Output sink for this mixer. 44 scoped_refptr<AudioRendererSink> audio_sink_; 45 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_; 52 53 // Handles mixing and resampling between input and output parameters. 54 AudioConverter audio_converter_; 55 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_; 61 62 DISALLOW_COPY_AND_ASSIGN(AudioRendererMixer); 63 }; 64 65 } // namespace media 66 67 #endif // MEDIA_BASE_AUDIO_RENDERER_MIXER_H_ 68