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/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                        const std::string& input_device_id);
42
43  // Called by AudioOutputProxy to open the stream.
44  // Returns false, if it fails to open it.
45  virtual bool OpenStream() = 0;
46
47  // Called by AudioOutputProxy when the stream is started.
48  // Uses |callback| to get source data and report errors, if any.
49  // Does *not* take ownership of this callback.
50  // Returns true if started successfully, false otherwise.
51  virtual bool StartStream(AudioOutputStream::AudioSourceCallback* callback,
52                           AudioOutputProxy* stream_proxy) = 0;
53
54  // Called by AudioOutputProxy when the stream is stopped.
55  // Ownership of the |stream_proxy| is passed to the dispatcher.
56  virtual void StopStream(AudioOutputProxy* stream_proxy) = 0;
57
58  // Called by AudioOutputProxy when the volume is set.
59  virtual void StreamVolumeSet(AudioOutputProxy* stream_proxy,
60                               double volume) = 0;
61
62  // Called by AudioOutputProxy when the stream is closed.
63  virtual void CloseStream(AudioOutputProxy* stream_proxy) = 0;
64
65  // Called on the audio thread when the AudioManager is shutting down.
66  virtual void Shutdown() = 0;
67
68  // Accessor to the input device id used by unified IO.
69  const std::string& input_device_id() const { return input_device_id_; }
70
71 protected:
72  friend class base::RefCountedThreadSafe<AudioOutputDispatcher>;
73  friend class AudioOutputProxyTest;
74
75  virtual ~AudioOutputDispatcher();
76
77  // A no-reference-held pointer (we don't want circular references) back to the
78  // AudioManager that owns this object.
79  AudioManager* audio_manager_;
80  base::MessageLoop* message_loop_;
81  AudioParameters params_;
82  const std::string input_device_id_;
83
84 private:
85  DISALLOW_COPY_AND_ASSIGN(AudioOutputDispatcher);
86};
87
88}  // namespace media
89
90#endif  // MEDIA_AUDIO_AUDIO_OUTPUT_DISPATCHER_H_
91