Home | History | Annotate | Download | only in base
      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   void RemoveMixerInput(AudioConverter::InputCallback* input);
     31 
     32   // Since errors may occur even when no inputs are playing, an error callback
     33   // must be registered separately from adding a mixer input.  The same callback
     34   // must be given to both the functions.
     35   void AddErrorCallback(const base::Closure& error_cb);
     36   void RemoveErrorCallback(const base::Closure& error_cb);
     37 
     38   void set_pause_delay_for_testing(base::TimeDelta delay) {
     39     pause_delay_ = delay;
     40   }
     41 
     42  private:
     43   // AudioRendererSink::RenderCallback implementation.
     44   virtual int Render(AudioBus* audio_bus,
     45                      int audio_delay_milliseconds) OVERRIDE;
     46   virtual void OnRenderError() OVERRIDE;
     47 
     48   // Output sink for this mixer.
     49   scoped_refptr<AudioRendererSink> audio_sink_;
     50 
     51   // ---------------[ All variables below protected by |lock_| ]---------------
     52   base::Lock lock_;
     53 
     54   // List of error callbacks used by this mixer.
     55   typedef std::list<base::Closure> ErrorCallbackList;
     56   ErrorCallbackList error_callbacks_;
     57 
     58   // Handles mixing and resampling between input and output parameters.
     59   AudioConverter audio_converter_;
     60 
     61   // Handles physical stream pause when no inputs are playing.  For latency
     62   // reasons we don't want to immediately pause the physical stream.
     63   base::TimeDelta pause_delay_;
     64   base::TimeTicks last_play_time_;
     65   bool playing_;
     66 
     67   DISALLOW_COPY_AND_ASSIGN(AudioRendererMixer);
     68 };
     69 
     70 }  // namespace media
     71 
     72 #endif  // MEDIA_BASE_AUDIO_RENDERER_MIXER_H_
     73