| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_CHROMEOS_AUDIO_HANDLER_H_ |
| #define CHROME_BROWSER_CHROMEOS_AUDIO_HANDLER_H_ |
| #pragma once |
| |
| #include "base/basictypes.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/threading/thread.h" |
| |
| class InProcessBrowserTest; |
| template <typename T> struct DefaultSingletonTraits; |
| |
| namespace chromeos { |
| |
| class AudioMixer; |
| |
| class AudioHandler { |
| public: |
| static AudioHandler* GetInstance(); |
| |
| // Get volume level in our internal 0-100% range, 0 being pure silence. |
| // Returns default of 0 on error. This function will block until the volume |
| // is retrieved or fails. Blocking call. |
| double GetVolumePercent(); |
| |
| // Set volume level from 0-100%. Volumes above 100% are OK and boost volume, |
| // although clipping will occur more at higher volumes. Volume gets quieter |
| // as the percentage gets lower, and then switches to silence at 0%. |
| void SetVolumePercent(double volume_percent); |
| |
| // Adjust volume up (positive percentage) or down (negative percentage), |
| // capping at 100%. GetVolumePercent() will be accurate after this |
| // blocking call. |
| void AdjustVolumeByPercent(double adjust_by_percent); |
| |
| // Just returns true if mute, false if not or an error occurred. |
| // Blocking call. |
| bool IsMute(); |
| |
| // Mutes all audio. Non-blocking call. |
| void SetMute(bool do_mute); |
| |
| // Disconnects from mixer. Called during shutdown. |
| void Disconnect(); |
| |
| private: |
| enum MixerType { |
| MIXER_TYPE_ALSA = 0, |
| MIXER_TYPE_NONE, |
| }; |
| |
| // Defines the delete on exit Singleton traits we like. Best to have this |
| // and constructor/destructor private as recommended for Singletons. |
| friend struct DefaultSingletonTraits<AudioHandler>; |
| |
| friend class ::InProcessBrowserTest; |
| // Disable audio in browser tests. This is a workaround for the bug |
| // crosbug.com/17058. Remove this once it's fixed. |
| static void Disable(); |
| |
| // Connect to the current mixer_type_. |
| bool TryToConnect(bool async); |
| |
| void OnMixerInitialized(bool success); |
| |
| AudioHandler(); |
| virtual ~AudioHandler(); |
| bool VerifyMixerConnection(); |
| |
| // Conversion between our internal scaling (0-100%) and decibels. |
| double VolumeDbToPercent(double volume_db) const; |
| double PercentToVolumeDb(double volume_percent) const; |
| |
| scoped_ptr<AudioMixer> mixer_; |
| |
| bool connected_; |
| int reconnect_tries_; |
| |
| // The min and max volume in decibels, limited to the maximum range of the |
| // audio system being used. |
| double max_volume_db_; |
| double min_volume_db_; |
| |
| // Which mixer is being used, ALSA or none. |
| MixerType mixer_type_; |
| |
| DISALLOW_COPY_AND_ASSIGN(AudioHandler); |
| }; |
| |
| } // namespace chromeos |
| |
| DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::AudioHandler); |
| |
| #endif // CHROME_BROWSER_CHROMEOS_AUDIO_HANDLER_H_ |