15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_AUDIO_AUDIO_OUTPUT_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_AUDIO_AUDIO_OUTPUT_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/atomic_ref_count.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/timer/timer.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "build/build_config.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_io.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_manager.h"
15c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "media/audio/audio_power_monitor.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_source_diverter.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/simple_sources.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An AudioOutputController controls an AudioOutputStream and provides data
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to this output stream. It has an important function that it executes
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// audio operations like play, pause, stop, etc. on a separate thread,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// namely the audio manager thread.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All the public methods of AudioOutputController are non-blocking.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The actual operations are performed on the audio manager thread.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is a state transition diagram for the AudioOutputController:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//   *[ Empty ]  -->  [ Created ]  -->  [ Playing ]  -------.
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//        |                |               |    ^           |
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//        |                |               |    |           |
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//        |                |               |    |           v
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//        |                |               |    `-----  [ Paused ]
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//        |                |               |                |
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//        |                v               v                |
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//        `----------->  [      Closed       ]  <-----------'
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Initial state
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// At any time after reaching the Created state but before Closed, the
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AudioOutputController may be notified of a device change via
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnDeviceChange().  As the OnDeviceChange() is processed, state transitions
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will occur, ultimately ending up in an equivalent pre-call state.  E.g., if
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the state was Paused, the new state will be Created, since these states are
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// all functionally equivalent and require a Play() call to continue to the next
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// state.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The AudioOutputStream can request data from the AudioOutputController via the
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AudioSourceCallback interface. AudioOutputController uses the SyncReader
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// passed to it via construction to synchronously fulfill this read request.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT AudioOutputController
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<AudioOutputController>,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public AudioOutputStream::AudioSourceCallback,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public AudioSourceDiverter,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NON_EXPORTED_BASE(public AudioManager::AudioDeviceListener)  {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An event handler that receives events from the AudioOutputController. The
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // following methods are called on the audio manager thread.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MEDIA_EXPORT EventHandler {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnCreated() = 0;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnPlaying() = 0;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnPaused() = 0;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnError() = 0;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnDeviceChange(int new_buffer_size, int new_sample_rate) = 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~EventHandler() {}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A synchronous reader interface used by AudioOutputController for
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // synchronous reading.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(crogers): find a better name for this class and the Read() method
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // now that it can handle synchronized I/O.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SyncReader {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~SyncReader() {}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify the synchronous reader the number of bytes in the
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // AudioOutputController not yet played. This is used by SyncReader to
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // prepare more data and perform synchronization.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void UpdatePendingBytes(uint32 bytes) = 0;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Attempts to completely fill |dest|, zeroing |dest| if the request can not
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // be fulfilled (due to timeout).
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual void Read(AudioBus* dest) = 0;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Close this synchronous reader.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void Close() = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory method for creating an AudioOutputController.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This also creates and opens an AudioOutputStream on the audio manager
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread, and if this is successful, the |event_handler| will receive an
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnCreated() call from the same audio manager thread.  |audio_manager| must
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // outlive AudioOutputController.
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The |output_device_id| can be either empty (default device) or specify a
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // specific hardware device for audio output.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_refptr<AudioOutputController> Create(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AudioManager* audio_manager, EventHandler* event_handler,
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const AudioParameters& params, const std::string& output_device_id,
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SyncReader* sync_reader);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Indicates whether audio power level analysis will be performed.  If false,
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // ReadCurrentPowerAndClip() can not be called.
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static bool will_monitor_audio_levels() {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID) || defined(OS_IOS)
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Methods to control playback of the stream.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the playback of this audio output stream.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Play();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pause this audio output stream.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Pause();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes the audio output stream. The state is changed and the resources
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are freed on the audio manager thread. closed_task is executed after that.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callbacks (EventHandler and SyncReader) must exist until closed_task is
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is safe to call this method more than once. Calls after the first one
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will have no effect.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Close(const base::Closure& closed_task);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the volume of the audio output stream.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetVolume(double volume);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Calls |callback| (on the caller's thread) with the current output
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // device ID.
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void GetOutputDeviceId(
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Callback<void(const std::string&)> callback) const;
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Changes which output device to use. If desired, you can provide a
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // callback that will be notified (on the thread you called from)
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // when the function has completed execution.
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  //
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Changing the output device causes the controller to go through
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // the same state transition back to the current state as a call to
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // OnDeviceChange (unless it is currently diverting, see
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Start/StopDiverting below, in which case the state transition
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // will happen when StopDiverting is called).
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SwitchOutputDevice(const std::string& output_device_id,
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                          const base::Closure& callback);
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AudioSourceCallback implementation.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnMoreData(AudioBus* dest,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         AudioBuffersState buffers_state) OVERRIDE;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnError(AudioOutputStream* stream) OVERRIDE;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AudioDeviceListener implementation.  When called AudioOutputController will
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // shutdown the existing |stream_|, transition to the kRecreating state,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create a new stream, and then transition back to an equivalent state prior
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to being called.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDeviceChange() OVERRIDE;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // AudioSourceDiverter implementation.
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const AudioParameters& GetAudioParameters() OVERRIDE;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartDiverting(AudioOutputStream* to_stream) OVERRIDE;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StopDiverting() OVERRIDE;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Accessor for AudioPowerMonitor::ReadCurrentPowerAndClip().  See comments in
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // audio_power_monitor.h for usage.  This may be called on any thread.
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::pair<float, bool> ReadCurrentPowerAndClip();
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Internal state of the source.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kEmpty,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kCreated,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kPlaying,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPaused,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kClosed,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kError,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Time constant for AudioPowerMonitor.  See AudioPowerMonitor ctor comments
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // for semantics.  This value was arbitrarily chosen, but seems to work well.
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum { kPowerMeasurementTimeConstantMillis = 10 };
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<AudioOutputController>;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AudioOutputController();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AudioOutputController(AudioManager* audio_manager, EventHandler* handler,
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        const AudioParameters& params,
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const std::string& output_device_id,
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        SyncReader* sync_reader);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following methods are executed on the audio manager thread.
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoCreate(bool is_for_device_change);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoPlay();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoPause();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoClose();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoSetVolume(double volume);
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string DoGetOutputDeviceId() const;
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void DoSwitchOutputDevice(const std::string& output_device_id);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoReportError();
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoStartDiverting(AudioOutputStream* to_stream);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoStopDiverting();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Helper method that stops the physical stream.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopStream();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method that stops, closes, and NULLs |*stream_|.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoStopCloseAndClearStream();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Checks if a stream was started successfully but never calls OnMoreData().
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void WedgeCheck();
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioManager* const audio_manager_;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const AudioParameters params_;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EventHandler* const handler_;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Specifies the device id of the output device to open or empty for the
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // default output device.
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string output_device_id_;
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AudioOutputStream* stream_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When non-NULL, audio is being diverted to this stream.
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioOutputStream* diverting_to_stream_;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current volume of the audio stream.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double volume_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |state_| is written on the audio manager thread and is read on the
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hardware audio thread. These operations need to be locked. But lock
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is not required for reading on the audio manager thread.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SyncReader is used only in low latency mode for synchronous reading.
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SyncReader* const sync_reader_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The message loop of audio manager thread that this object runs on.
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const scoped_refptr<base::SingleThreadTaskRunner> message_loop_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Scans audio samples from OnMoreData() as input to compute power levels.
249c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  AudioPowerMonitor power_monitor_;
25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Flags when we've asked for a stream to start but it never did.
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::AtomicRefCount on_more_io_data_called_;
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<base::OneShotTimer<AudioOutputController> > wedge_timer_;
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AudioOutputController);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_AUDIO_AUDIO_OUTPUT_CONTROLLER_H_
261