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
15namespace 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.
20class 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