Home | History | Annotate | Download | only in audio
      1 // Copyright (c) 2013 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 CHROMEOS_AUDIO_CRAS_AUDIO_HANDLER_H_
      6 #define CHROMEOS_AUDIO_CRAS_AUDIO_HANDLER_H_
      7 
      8 #include <queue>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/weak_ptr.h"
     13 #include "base/observer_list.h"
     14 #include "chromeos/audio/audio_device.h"
     15 #include "chromeos/audio/audio_pref_observer.h"
     16 #include "chromeos/dbus/audio_node.h"
     17 #include "chromeos/dbus/cras_audio_client.h"
     18 #include "chromeos/dbus/session_manager_client.h"
     19 #include "chromeos/dbus/volume_state.h"
     20 
     21 class PrefRegistrySimple;
     22 class PrefService;
     23 
     24 namespace chromeos {
     25 
     26 class AudioDevicesPrefHandler;
     27 
     28 class CHROMEOS_EXPORT CrasAudioHandler : public CrasAudioClient::Observer,
     29                                          public AudioPrefObserver,
     30                                          public SessionManagerClient::Observer {
     31  public:
     32   typedef std::priority_queue<AudioDevice,
     33                               std::vector<AudioDevice>,
     34                               AudioDeviceCompare> AudioDevicePriorityQueue;
     35 
     36   class AudioObserver {
     37    public:
     38     // Called when output volume changed.
     39     virtual void OnOutputVolumeChanged();
     40 
     41     // Called when output mute state changed.
     42     virtual void OnOutputMuteChanged();
     43 
     44     // Called when input mute state changed.
     45     virtual void OnInputGainChanged();
     46 
     47     // Called when input mute state changed.
     48     virtual void OnInputMuteChanged();
     49 
     50     // Called when audio nodes changed.
     51     virtual void OnAudioNodesChanged();
     52 
     53     // Called when active audio node changed.
     54     virtual void OnActiveOutputNodeChanged();
     55 
     56     // Called when active audio input node changed.
     57     virtual void OnActiveInputNodeChanged();
     58 
     59    protected:
     60     AudioObserver();
     61     virtual ~AudioObserver();
     62     DISALLOW_COPY_AND_ASSIGN(AudioObserver);
     63   };
     64 
     65   // Sets the global instance. Must be called before any calls to Get().
     66   static void Initialize(
     67       scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler);
     68 
     69   // Sets the global instance for testing.
     70   static void InitializeForTesting();
     71 
     72   // Destroys the global instance.
     73   static void Shutdown();
     74 
     75   // Returns true if the global instance is initialized.
     76   static bool IsInitialized();
     77 
     78   // Gets the global instance. Initialize must be called first.
     79   static CrasAudioHandler* Get();
     80 
     81   // Adds an audio observer.
     82   virtual void AddAudioObserver(AudioObserver* observer);
     83 
     84   // Removes an audio observer.
     85   virtual void RemoveAudioObserver(AudioObserver* observer);
     86 
     87   // Returns true if audio output is muted.
     88   virtual bool IsOutputMuted();
     89 
     90   // Returns true if audio output is muted for a device.
     91   virtual bool IsOutputMutedForDevice(uint64 device_id);
     92 
     93   // Returns true if audio input is muted.
     94   virtual bool IsInputMuted();
     95 
     96   // Returns true if audio input is muted for a device.
     97   virtual bool IsInputMutedForDevice(uint64 device_id);
     98 
     99   // Returns true if the output volume is below the default mute volume level.
    100   virtual bool IsOutputVolumeBelowDefaultMuteLvel();
    101 
    102   // Gets volume level in 0-100% range (0 being pure silence) for the current
    103   // active node.
    104   virtual int GetOutputVolumePercent();
    105 
    106   // Gets volume level in 0-100% range (0 being pure silence) for a device.
    107   virtual int GetOutputVolumePercentForDevice(uint64 device_id);
    108 
    109   // Gets gain level in 0-100% range (0 being pure silence) for the current
    110   // active node.
    111   virtual int GetInputGainPercent();
    112 
    113   // Gets volume level in 0-100% range (0 being pure silence) for a device.
    114   virtual int GetInputGainPercentForDevice(uint64 device_id);
    115 
    116   // Returns node_id of the active output node.
    117   virtual uint64 GetActiveOutputNode() const;
    118 
    119   // Returns the node_id of the active input node.
    120   virtual uint64 GetActiveInputNode() const;
    121 
    122   // Gets the audio devices back in |device_list|.
    123   virtual void GetAudioDevices(AudioDeviceList* device_list) const;
    124 
    125   virtual bool GetActiveOutputDevice(AudioDevice* device) const;
    126 
    127   // Whether there is alternative input/output audio device.
    128   virtual bool has_alternative_input() const;
    129   virtual bool has_alternative_output() const;
    130 
    131   // Sets volume level to |volume_percent|, whose range is from 0-100%.
    132   virtual void SetOutputVolumePercent(int volume_percent);
    133 
    134   // Sets gain level to |gain_percent|, whose range is from 0-100%.
    135   virtual void SetInputGainPercent(int gain_percent);
    136 
    137   // Adjusts volume up (positive percentage) or down (negative percentage).
    138   virtual void AdjustOutputVolumeByPercent(int adjust_by_percent);
    139 
    140   // Adjusts output volume to a minimum audible level if it is too low.
    141   virtual void AdjustOutputVolumeToAudibleLevel();
    142 
    143   // Mutes or unmutes audio output device.
    144   virtual void SetOutputMute(bool mute_on);
    145 
    146   // Mutes or unmutes audio input device.
    147   virtual void SetInputMute(bool mute_on);
    148 
    149   // Switches active audio device to |device|.
    150   virtual void SwitchToDevice(const AudioDevice& device);
    151 
    152   // Sets volume/gain level for a device.
    153   virtual void SetVolumeGainPercentForDevice(uint64 device_id, int value);
    154 
    155   // Sets the mute for device.
    156   virtual void SetMuteForDevice(uint64 device_id, bool mute_on);
    157 
    158   // Enables error logging.
    159   virtual void LogErrors();
    160 
    161  protected:
    162   explicit CrasAudioHandler(
    163       scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler);
    164   virtual ~CrasAudioHandler();
    165 
    166  private:
    167   // CrasAudioClient::Observer overrides.
    168   virtual void AudioClientRestarted() OVERRIDE;
    169   virtual void NodesChanged() OVERRIDE;
    170   virtual void ActiveOutputNodeChanged(uint64 node_id) OVERRIDE;
    171   virtual void ActiveInputNodeChanged(uint64 node_id) OVERRIDE;
    172 
    173   // AudioPrefObserver overrides.
    174   virtual void OnAudioPolicyPrefChanged() OVERRIDE;
    175 
    176   // SessionManagerClient::Observer overrides.
    177   virtual void EmitLoginPromptVisibleCalled() OVERRIDE;
    178 
    179   // Sets the active audio output/input node to the node with |node_id|.
    180   void SetActiveOutputNode(uint64 node_id);
    181   void SetActiveInputNode(uint64 node_id);
    182 
    183   // Sets up the audio device state based on audio policy and audio settings
    184   // saved in prefs.
    185   void SetupAudioInputState();
    186   void SetupAudioOutputState();
    187 
    188   const AudioDevice* GetDeviceFromId(uint64 device_id) const;
    189 
    190   // Initializes audio state, which should only be called when CrasAudioHandler
    191   // is created or cras audio client is restarted.
    192   void InitializeAudioState();
    193 
    194   // Applies the audio muting policies whenever the user logs in or policy
    195   // change notification is received.
    196   void ApplyAudioPolicy();
    197 
    198   // Sets output volume of |node_id| to |volume|.
    199   void SetOutputNodeVolume(uint64 node_id, int volume);
    200 
    201   // Sets output mute state to |mute_on| internally, returns true if output mute
    202   // is set.
    203   bool SetOutputMuteInternal(bool mute_on);
    204 
    205   // Sets input gain of |node_id| to |gain|.
    206   void SetInputNodeGain(uint64 node_id, int gain);
    207 
    208   // Sets input mute state to |mute_on| internally, returns true if input mute
    209   // is set.
    210   bool SetInputMuteInternal(bool mute_on);
    211 
    212   // Calling dbus to get nodes data.
    213   void GetNodes();
    214 
    215   // Updates the current audio nodes list and switches the active device
    216   // if needed.
    217   void UpdateDevicesAndSwitchActive(const AudioNodeList& nodes);
    218 
    219   // Returns true if *|current_active_node_id| device is changed to
    220   // |new_active_device|.
    221   bool ChangeActiveDevice(const AudioDevice& new_active_device,
    222                           uint64* current_active_node_id);
    223 
    224   // Returns true if the audio nodes change is caused by some non-active
    225   // audio nodes unplugged.
    226   bool NonActiveDeviceUnplugged(size_t old_devices_size,
    227                                 size_t new_device_size,
    228                                 uint64 current_active_node);
    229 
    230   // Returns true if there is any device change for for input or output,
    231   // specified by |is_input|.
    232   bool HasDeviceChange(const AudioNodeList& new_nodes, bool is_input);
    233 
    234   // Handles dbus callback for GetNodes.
    235   void HandleGetNodes(const chromeos::AudioNodeList& node_list, bool success);
    236 
    237   // Handles the dbus error callback.
    238   void HandleGetNodesError(const std::string& error_name,
    239                            const std::string& error_msg);
    240 
    241   // Returns true if |device| is not found in audio_devices_.
    242   bool FoundNewDevice(const AudioDevice& device);
    243 
    244   // Returns a sanitized AudioDevice from |node|.
    245   AudioDevice GetSanitizedAudioDevice(const AudioNode& node);
    246 
    247   scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler_;
    248   base::WeakPtrFactory<CrasAudioHandler> weak_ptr_factory_;
    249   ObserverList<AudioObserver> observers_;
    250 
    251   // Audio data and state.
    252   AudioDeviceMap audio_devices_;
    253 
    254   AudioDevicePriorityQueue input_devices_pq_;
    255   AudioDevicePriorityQueue output_devices_pq_;
    256 
    257   bool output_mute_on_;
    258   bool input_mute_on_;
    259   int output_volume_;
    260   int input_gain_;
    261   uint64 active_output_node_id_;
    262   uint64 active_input_node_id_;
    263   bool has_alternative_input_;
    264   bool has_alternative_output_;
    265 
    266   bool output_mute_locked_;
    267   bool input_mute_locked_;
    268 
    269   // Failures are not logged at startup, since CRAS may not be running yet.
    270   bool log_errors_;
    271 
    272   DISALLOW_COPY_AND_ASSIGN(CrasAudioHandler);
    273 };
    274 
    275 }  // namespace chromeos
    276 
    277 #endif  // CHROMEOS_AUDIO_CRAS_AUDIO_HANDLER_H_
    278