Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / media / audio / audio_output_controller.h
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_AUDIO_AUDIO_OUTPUT_CONTROLLER_H_
6 #define MEDIA_AUDIO_AUDIO_OUTPUT_CONTROLLER_H_
7
8 #include "base/atomic_ref_count.h"
9 #include "base/callback.h"
10 #include "base/cancelable_callback.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/timer/timer.h"
13 #include "media/audio/audio_io.h"
14 #include "media/audio/audio_manager.h"
15 #include "media/audio/audio_power_monitor.h"
16 #include "media/audio/audio_source_diverter.h"
17 #include "media/audio/simple_sources.h"
18 #include "media/base/media_export.h"
19
20 // An AudioOutputController controls an AudioOutputStream and provides data
21 // to this output stream. It has an important function that it executes
22 // audio operations like play, pause, stop, etc. on a separate thread,
23 // namely the audio manager thread.
24 //
25 // All the public methods of AudioOutputController are non-blocking.
26 // The actual operations are performed on the audio manager thread.
27 //
28 // Here is a state transition diagram for the AudioOutputController:
29 //
30 //   *[ Empty ]  -->  [ Created ]  -->  [ Playing ]  -------.
31 //        |                |               |    ^           |
32 //        |                |               |    |           |
33 //        |                |               |    |           v
34 //        |                |               |    `-----  [ Paused ]
35 //        |                |               |                |
36 //        |                v               v                |
37 //        `----------->  [      Closed       ]  <-----------'
38 //
39 // * Initial state
40 //
41 // At any time after reaching the Created state but before Closed, the
42 // AudioOutputController may be notified of a device change via
43 // OnDeviceChange().  As the OnDeviceChange() is processed, state transitions
44 // will occur, ultimately ending up in an equivalent pre-call state.  E.g., if
45 // the state was Paused, the new state will be Created, since these states are
46 // all functionally equivalent and require a Play() call to continue to the next
47 // state.
48 //
49 // The AudioOutputStream can request data from the AudioOutputController via the
50 // AudioSourceCallback interface. AudioOutputController uses the SyncReader
51 // passed to it via construction to synchronously fulfill this read request.
52 //
53
54 namespace media {
55
56 // Only do power monitoring for non-mobile platforms that need it for the UI.
57 #if !defined(OS_ANDROID) && !defined(OS_IOS)
58 #define AUDIO_POWER_MONITORING
59 #endif
60
61 class MEDIA_EXPORT AudioOutputController
62     : public base::RefCountedThreadSafe<AudioOutputController>,
63       public AudioOutputStream::AudioSourceCallback,
64       public AudioSourceDiverter,
65       NON_EXPORTED_BASE(public AudioManager::AudioDeviceListener)  {
66  public:
67   // An event handler that receives events from the AudioOutputController. The
68   // following methods are called on the audio manager thread.
69   class MEDIA_EXPORT EventHandler {
70    public:
71     virtual void OnCreated() = 0;
72     virtual void OnPlaying() = 0;
73     virtual void OnPowerMeasured(float power_dbfs, bool clipped) = 0;
74     virtual void OnPaused() = 0;
75     virtual void OnError() = 0;
76     virtual void OnDeviceChange(int new_buffer_size, int new_sample_rate) = 0;
77
78    protected:
79     virtual ~EventHandler() {}
80   };
81
82   // A synchronous reader interface used by AudioOutputController for
83   // synchronous reading.
84   // TODO(crogers): find a better name for this class and the Read() method
85   // now that it can handle synchronized I/O.
86   class SyncReader {
87    public:
88     virtual ~SyncReader() {}
89
90     // Notify the synchronous reader the number of bytes in the
91     // AudioOutputController not yet played. This is used by SyncReader to
92     // prepare more data and perform synchronization.
93     virtual void UpdatePendingBytes(uint32 bytes) = 0;
94
95     // Attempts to completely fill |dest|, zeroing |dest| if the request can not
96     // be fulfilled (due to timeout).  |source| may optionally be provided for
97     // input data.
98     virtual void Read(const AudioBus* source, AudioBus* dest) = 0;
99
100     // Close this synchronous reader.
101     virtual void Close() = 0;
102   };
103
104   // Factory method for creating an AudioOutputController.
105   // This also creates and opens an AudioOutputStream on the audio manager
106   // thread, and if this is successful, the |event_handler| will receive an
107   // OnCreated() call from the same audio manager thread.  |audio_manager| must
108   // outlive AudioOutputController.
109   // The |output_device_id| can be either empty (default device) or specify a
110   // specific hardware device for audio output.
111   static scoped_refptr<AudioOutputController> Create(
112       AudioManager* audio_manager, EventHandler* event_handler,
113       const AudioParameters& params, const std::string& output_device_id,
114       SyncReader* sync_reader);
115
116   // Methods to control playback of the stream.
117
118   // Starts the playback of this audio output stream.
119   void Play();
120
121   // Pause this audio output stream.
122   void Pause();
123
124   // Closes the audio output stream. The state is changed and the resources
125   // are freed on the audio manager thread. closed_task is executed after that.
126   // Callbacks (EventHandler and SyncReader) must exist until closed_task is
127   // called.
128   //
129   // It is safe to call this method more than once. Calls after the first one
130   // will have no effect.
131   void Close(const base::Closure& closed_task);
132
133   // Sets the volume of the audio output stream.
134   void SetVolume(double volume);
135
136   // Calls |callback| (on the caller's thread) with the current output
137   // device ID.
138   void GetOutputDeviceId(
139       base::Callback<void(const std::string&)> callback) const;
140
141   // Changes which output device to use. If desired, you can provide a
142   // callback that will be notified (on the thread you called from)
143   // when the function has completed execution.
144   //
145   // Changing the output device causes the controller to go through
146   // the same state transition back to the current state as a call to
147   // OnDeviceChange (unless it is currently diverting, see
148   // Start/StopDiverting below, in which case the state transition
149   // will happen when StopDiverting is called).
150   void SwitchOutputDevice(const std::string& output_device_id,
151                           const base::Closure& callback);
152
153   // AudioSourceCallback implementation.
154   virtual int OnMoreData(AudioBus* dest,
155                          AudioBuffersState buffers_state) OVERRIDE;
156   virtual int OnMoreIOData(AudioBus* source,
157                            AudioBus* dest,
158                            AudioBuffersState buffers_state) OVERRIDE;
159   virtual void OnError(AudioOutputStream* stream) OVERRIDE;
160
161   // AudioDeviceListener implementation.  When called AudioOutputController will
162   // shutdown the existing |stream_|, transition to the kRecreating state,
163   // create a new stream, and then transition back to an equivalent state prior
164   // to being called.
165   virtual void OnDeviceChange() OVERRIDE;
166
167   // AudioSourceDiverter implementation.
168   virtual const AudioParameters& GetAudioParameters() OVERRIDE;
169   virtual void StartDiverting(AudioOutputStream* to_stream) OVERRIDE;
170   virtual void StopDiverting() OVERRIDE;
171
172  protected:
173   // Internal state of the source.
174   enum State {
175     kEmpty,
176     kCreated,
177     kPlaying,
178     kPaused,
179     kClosed,
180     kError,
181   };
182
183   friend class base::RefCountedThreadSafe<AudioOutputController>;
184   virtual ~AudioOutputController();
185
186  private:
187   // We are polling sync reader if data became available.
188   static const int kPollNumAttempts;
189   static const int kPollPauseInMilliseconds;
190
191   AudioOutputController(AudioManager* audio_manager, EventHandler* handler,
192                         const AudioParameters& params,
193                         const std::string& output_device_id,
194                         SyncReader* sync_reader);
195
196   // The following methods are executed on the audio manager thread.
197   void DoCreate(bool is_for_device_change);
198   void DoPlay();
199   void DoPause();
200   void DoClose();
201   void DoSetVolume(double volume);
202   std::string DoGetOutputDeviceId() const;
203   void DoSwitchOutputDevice(const std::string& output_device_id);
204   void DoReportError();
205   void DoStartDiverting(AudioOutputStream* to_stream);
206   void DoStopDiverting();
207
208   // Calls EventHandler::OnPowerMeasured() with the current power level and then
209   // schedules itself to be called again later.
210   void ReportPowerMeasurementPeriodically();
211
212   // Helper method that stops the physical stream.
213   void StopStream();
214
215   // Helper method that stops, closes, and NULLs |*stream_|.
216   void DoStopCloseAndClearStream();
217
218   // Sanity-check that entry/exit to OnMoreIOData() by the hardware audio thread
219   // happens only between AudioOutputStream::Start() and Stop().
220   void AllowEntryToOnMoreIOData();
221   void DisallowEntryToOnMoreIOData();
222
223   // Checks if a stream was started successfully but never calls OnMoreIOData().
224   void WedgeCheck();
225
226   AudioManager* const audio_manager_;
227   const AudioParameters params_;
228   EventHandler* const handler_;
229
230   // Specifies the device id of the output device to open or empty for the
231   // default output device.
232   std::string output_device_id_;
233
234   AudioOutputStream* stream_;
235
236   // When non-NULL, audio is being diverted to this stream.
237   AudioOutputStream* diverting_to_stream_;
238
239   // The current volume of the audio stream.
240   double volume_;
241
242   // |state_| is written on the audio manager thread and is read on the
243   // hardware audio thread. These operations need to be locked. But lock
244   // is not required for reading on the audio manager thread.
245   State state_;
246
247   // Binary semaphore, used to ensure that only one thread enters the
248   // OnMoreIOData() method, and only when it is valid to do so.  This is for
249   // sanity-checking the behavior of platform implementations of
250   // AudioOutputStream.  In other words, multiple contention is not expected,
251   // nor in the design here.
252   base::AtomicRefCount num_allowed_io_;
253
254   // SyncReader is used only in low latency mode for synchronous reading.
255   SyncReader* const sync_reader_;
256
257   // The message loop of audio manager thread that this object runs on.
258   const scoped_refptr<base::SingleThreadTaskRunner> message_loop_;
259
260 #if defined(AUDIO_POWER_MONITORING)
261   // Scans audio samples from OnMoreIOData() as input to compute power levels.
262   AudioPowerMonitor power_monitor_;
263
264   // Periodic callback to report power levels during playback.
265   base::CancelableClosure power_poll_callback_;
266 #endif
267
268   // Flags when we've asked for a stream to start but it never did.
269   base::AtomicRefCount on_more_io_data_called_;
270   scoped_ptr<base::OneShotTimer<AudioOutputController> > wedge_timer_;
271
272   DISALLOW_COPY_AND_ASSIGN(AudioOutputController);
273 };
274
275 }  // namespace media
276
277 #endif  // MEDIA_AUDIO_AUDIO_OUTPUT_CONTROLLER_H_