audio_output_dispatcher.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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// AudioOutputDispatcher is a single-threaded base class that dispatches
6// creation and deletion of audio output streams. AudioOutputProxy objects use
7// this class to allocate and recycle actual audio output streams. When playback
8// is started, the proxy calls StartStream() to get an output stream that it
9// uses to play audio. When playback is stopped, the proxy returns the stream
10// back to the dispatcher by calling StopStream().
11//
12// AudioManagerBase creates one specialization of AudioOutputDispatcher on the
13// audio thread for each possible set of audio parameters. I.e streams with
14// different parameters are managed independently.  The AudioOutputDispatcher
15// instance is then deleted on the audio thread when the AudioManager shuts
16// down.
17
18#ifndef MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_H_
19#define MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_H_
20
21#include "base/basictypes.h"
22#include "base/memory/ref_counted.h"
23#include "base/timer.h"
24#include "media/audio/audio_io.h"
25#include "media/audio/audio_manager.h"
26#include "media/audio/audio_parameters.h"
27
28namespace base {
29class MessageLoop;
30}
31
32namespace media {
33
34class AudioOutputProxy;
35
36class MEDIA_EXPORT AudioOutputDispatcher
37    : public base::RefCountedThreadSafe<AudioOutputDispatcher> {
38 public:
39  AudioOutputDispatcher(AudioManager* audio_manager,
40                        const AudioParameters& params);
41
42  // Called by AudioOutputProxy to open the stream.
43  // Returns false, if it fails to open it.
44  virtual bool OpenStream() = 0;
45
46  // Called by AudioOutputProxy when the stream is started.
47  // Uses |callback| to get source data and report errors, if any.
48  // Does *not* take ownership of this callback.
49  // Returns true if started successfully, false otherwise.
50  virtual bool StartStream(AudioOutputStream::AudioSourceCallback* callback,
51                           AudioOutputProxy* stream_proxy) = 0;
52
53  // Called by AudioOutputProxy when the stream is stopped.
54  // Ownership of the |stream_proxy| is passed to the dispatcher.
55  virtual void StopStream(AudioOutputProxy* stream_proxy) = 0;
56
57  // Called by AudioOutputProxy when the volume is set.
58  virtual void StreamVolumeSet(AudioOutputProxy* stream_proxy,
59                               double volume) = 0;
60
61  // Called by AudioOutputProxy when the stream is closed.
62  virtual void CloseStream(AudioOutputProxy* stream_proxy) = 0;
63
64  // Called on the audio thread when the AudioManager is shutting down.
65  virtual void Shutdown() = 0;
66
67 protected:
68  friend class base::RefCountedThreadSafe<AudioOutputDispatcher>;
69  friend class AudioOutputProxyTest;
70
71  virtual ~AudioOutputDispatcher();
72
73  // A no-reference-held pointer (we don't want circular references) back to the
74  // AudioManager that owns this object.
75  AudioManager* audio_manager_;
76  base::MessageLoop* message_loop_;
77  AudioParameters params_;
78
79 private:
80  DISALLOW_COPY_AND_ASSIGN(AudioOutputDispatcher);
81};
82
83}  // namespace media
84
85#endif  // MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_H_
86