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