1 // Copyright (c) 2011 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 CHROME_BROWSER_CHROMEOS_AUDIO_HANDLER_H_ 6 #define CHROME_BROWSER_CHROMEOS_AUDIO_HANDLER_H_ 7 #pragma once 8 9 #include "base/basictypes.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "base/threading/thread.h" 12 13 class InProcessBrowserTest; 14 template <typename T> struct DefaultSingletonTraits; 15 16 namespace chromeos { 17 18 class AudioMixer; 19 20 class AudioHandler { 21 public: 22 static AudioHandler* GetInstance(); 23 24 // Get volume level in our internal 0-100% range, 0 being pure silence. 25 // Returns default of 0 on error. This function will block until the volume 26 // is retrieved or fails. Blocking call. 27 double GetVolumePercent(); 28 29 // Set volume level from 0-100%. Volumes above 100% are OK and boost volume, 30 // although clipping will occur more at higher volumes. Volume gets quieter 31 // as the percentage gets lower, and then switches to silence at 0%. 32 void SetVolumePercent(double volume_percent); 33 34 // Adjust volume up (positive percentage) or down (negative percentage), 35 // capping at 100%. GetVolumePercent() will be accurate after this 36 // blocking call. 37 void AdjustVolumeByPercent(double adjust_by_percent); 38 39 // Just returns true if mute, false if not or an error occurred. 40 // Blocking call. 41 bool IsMute(); 42 43 // Mutes all audio. Non-blocking call. 44 void SetMute(bool do_mute); 45 46 // Disconnects from mixer. Called during shutdown. 47 void Disconnect(); 48 49 private: 50 enum MixerType { 51 MIXER_TYPE_ALSA = 0, 52 MIXER_TYPE_NONE, 53 }; 54 55 // Defines the delete on exit Singleton traits we like. Best to have this 56 // and constructor/destructor private as recommended for Singletons. 57 friend struct DefaultSingletonTraits<AudioHandler>; 58 59 friend class ::InProcessBrowserTest; 60 // Disable audio in browser tests. This is a workaround for the bug 61 // crosbug.com/17058. Remove this once it's fixed. 62 static void Disable(); 63 64 // Connect to the current mixer_type_. 65 bool TryToConnect(bool async); 66 67 void OnMixerInitialized(bool success); 68 69 AudioHandler(); 70 virtual ~AudioHandler(); 71 bool VerifyMixerConnection(); 72 73 // Conversion between our internal scaling (0-100%) and decibels. 74 double VolumeDbToPercent(double volume_db) const; 75 double PercentToVolumeDb(double volume_percent) const; 76 77 scoped_ptr<AudioMixer> mixer_; 78 79 bool connected_; 80 int reconnect_tries_; 81 82 // The min and max volume in decibels, limited to the maximum range of the 83 // audio system being used. 84 double max_volume_db_; 85 double min_volume_db_; 86 87 // Which mixer is being used, ALSA or none. 88 MixerType mixer_type_; 89 90 DISALLOW_COPY_AND_ASSIGN(AudioHandler); 91 }; 92 93 } // namespace chromeos 94 95 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::AudioHandler); 96 97 #endif // CHROME_BROWSER_CHROMEOS_AUDIO_HANDLER_H_ 98