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.
5 #ifndef CHROMEOS_AUDIO_CRAS_AUDIO_HANDLER_H_
6 #define CHROMEOS_AUDIO_CRAS_AUDIO_HANDLER_H_
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"
21 class PrefRegistrySimple
;
26 class AudioDevicesPrefHandler
;
28 class CHROMEOS_EXPORT CrasAudioHandler
: public CrasAudioClient::Observer
,
29 public AudioPrefObserver
,
30 public SessionManagerClient::Observer
{
32 typedef std::priority_queue
<AudioDevice
,
33 std::vector
<AudioDevice
>,
34 AudioDeviceCompare
> AudioDevicePriorityQueue
;
38 // Called when output volume changed.
39 virtual void OnOutputVolumeChanged();
41 // Called when output mute state changed.
42 virtual void OnOutputMuteChanged();
44 // Called when input mute state changed.
45 virtual void OnInputGainChanged();
47 // Called when input mute state changed.
48 virtual void OnInputMuteChanged();
50 // Called when audio nodes changed.
51 virtual void OnAudioNodesChanged();
53 // Called when active audio node changed.
54 virtual void OnActiveOutputNodeChanged();
56 // Called when active audio input node changed.
57 virtual void OnActiveInputNodeChanged();
61 virtual ~AudioObserver();
62 DISALLOW_COPY_AND_ASSIGN(AudioObserver
);
65 // Sets the global instance. Must be called before any calls to Get().
66 static void Initialize(
67 scoped_refptr
<AudioDevicesPrefHandler
> audio_pref_handler
);
69 // Sets the global instance for testing.
70 static void InitializeForTesting();
72 // Destroys the global instance.
73 static void Shutdown();
75 // Returns true if the global instance is initialized.
76 static bool IsInitialized();
78 // Gets the global instance. Initialize must be called first.
79 static CrasAudioHandler
* Get();
81 // Adds an audio observer.
82 virtual void AddAudioObserver(AudioObserver
* observer
);
84 // Removes an audio observer.
85 virtual void RemoveAudioObserver(AudioObserver
* observer
);
87 // Returns true if keyboard mic exists.
88 virtual bool HasKeyboardMic();
90 // Returns true if audio output is muted.
91 virtual bool IsOutputMuted();
93 // Returns true if audio output is muted for a device.
94 virtual bool IsOutputMutedForDevice(uint64 device_id
);
96 // Returns true if audio input is muted.
97 virtual bool IsInputMuted();
99 // Returns true if audio input is muted for a device.
100 virtual bool IsInputMutedForDevice(uint64 device_id
);
102 // Returns true if the output volume is below the default mute volume level.
103 virtual bool IsOutputVolumeBelowDefaultMuteLevel();
105 // Returns volume level in 0-100% range at which the volume should be muted.
106 virtual int GetOutputDefaultVolumeMuteThreshold();
108 // Gets volume level in 0-100% range (0 being pure silence) for the current
110 virtual int GetOutputVolumePercent();
112 // Gets volume level in 0-100% range (0 being pure silence) for a device.
113 virtual int GetOutputVolumePercentForDevice(uint64 device_id
);
115 // Gets gain level in 0-100% range (0 being pure silence) for the current
117 virtual int GetInputGainPercent();
119 // Gets volume level in 0-100% range (0 being pure silence) for a device.
120 virtual int GetInputGainPercentForDevice(uint64 device_id
);
122 // Returns node_id of the active output node.
123 virtual uint64
GetActiveOutputNode() const;
125 // Returns the node_id of the active input node.
126 virtual uint64
GetActiveInputNode() const;
128 // Gets the audio devices back in |device_list|.
129 virtual void GetAudioDevices(AudioDeviceList
* device_list
) const;
131 virtual bool GetActiveOutputDevice(AudioDevice
* device
) const;
133 // Whether there is alternative input/output audio device.
134 virtual bool has_alternative_input() const;
135 virtual bool has_alternative_output() const;
137 // Sets volume level to |volume_percent|, whose range is from 0-100%.
138 virtual void SetOutputVolumePercent(int volume_percent
);
140 // Sets gain level to |gain_percent|, whose range is from 0-100%.
141 virtual void SetInputGainPercent(int gain_percent
);
143 // Adjusts volume up (positive percentage) or down (negative percentage).
144 virtual void AdjustOutputVolumeByPercent(int adjust_by_percent
);
146 // Adjusts output volume to a minimum audible level if it is too low.
147 virtual void AdjustOutputVolumeToAudibleLevel();
149 // Mutes or unmutes audio output device.
150 virtual void SetOutputMute(bool mute_on
);
152 // Mutes or unmutes audio input device.
153 virtual void SetInputMute(bool mute_on
);
155 // Switches active audio device to |device|.
156 virtual void SwitchToDevice(const AudioDevice
& device
);
158 // Sets volume/gain level for a device.
159 virtual void SetVolumeGainPercentForDevice(uint64 device_id
, int value
);
161 // Sets the mute for device.
162 virtual void SetMuteForDevice(uint64 device_id
, bool mute_on
);
164 // Activates or deactivates keyboard mic if there's one.
165 virtual void SetKeyboardMicActive(bool active
);
167 // Enables error logging.
168 virtual void LogErrors();
171 explicit CrasAudioHandler(
172 scoped_refptr
<AudioDevicesPrefHandler
> audio_pref_handler
);
173 virtual ~CrasAudioHandler();
176 // CrasAudioClient::Observer overrides.
177 virtual void AudioClientRestarted() OVERRIDE
;
178 virtual void NodesChanged() OVERRIDE
;
179 virtual void ActiveOutputNodeChanged(uint64 node_id
) OVERRIDE
;
180 virtual void ActiveInputNodeChanged(uint64 node_id
) OVERRIDE
;
182 // AudioPrefObserver overrides.
183 virtual void OnAudioPolicyPrefChanged() OVERRIDE
;
185 // SessionManagerClient::Observer overrides.
186 virtual void EmitLoginPromptVisibleCalled() OVERRIDE
;
188 // Sets the active audio output/input node to the node with |node_id|.
189 void SetActiveOutputNode(uint64 node_id
);
190 void SetActiveInputNode(uint64 node_id
);
192 // Sets up the audio device state based on audio policy and audio settings
194 void SetupAudioInputState();
195 void SetupAudioOutputState();
197 const AudioDevice
* GetDeviceFromId(uint64 device_id
) const;
198 const AudioDevice
* GetKeyboardMic() const;
200 // Initializes audio state, which should only be called when CrasAudioHandler
201 // is created or cras audio client is restarted.
202 void InitializeAudioState();
204 // Applies the audio muting policies whenever the user logs in or policy
205 // change notification is received.
206 void ApplyAudioPolicy();
208 // Sets output volume of |node_id| to |volume|.
209 void SetOutputNodeVolume(uint64 node_id
, int volume
);
211 // Sets output mute state to |mute_on| internally, returns true if output mute
213 bool SetOutputMuteInternal(bool mute_on
);
215 // Sets input gain of |node_id| to |gain|.
216 void SetInputNodeGain(uint64 node_id
, int gain
);
218 // Sets input mute state to |mute_on| internally, returns true if input mute
220 bool SetInputMuteInternal(bool mute_on
);
222 // Calling dbus to get nodes data.
225 // Updates the current audio nodes list and switches the active device
227 void UpdateDevicesAndSwitchActive(const AudioNodeList
& nodes
);
229 // Returns true if *|current_active_node_id| device is changed to
230 // |new_active_device|.
231 bool ChangeActiveDevice(const AudioDevice
& new_active_device
,
232 uint64
* current_active_node_id
);
234 // Returns true if the audio nodes change is caused by some non-active
235 // audio nodes unplugged.
236 bool NonActiveDeviceUnplugged(size_t old_devices_size
,
237 size_t new_device_size
,
238 uint64 current_active_node
);
240 // Returns true if there is any device change for for input or output,
241 // specified by |is_input|.
242 bool HasDeviceChange(const AudioNodeList
& new_nodes
, bool is_input
);
244 // Handles dbus callback for GetNodes.
245 void HandleGetNodes(const chromeos::AudioNodeList
& node_list
, bool success
);
247 // Handles the dbus error callback.
248 void HandleGetNodesError(const std::string
& error_name
,
249 const std::string
& error_msg
);
251 // Returns true if |device| is not found in audio_devices_.
252 bool FoundNewDevice(const AudioDevice
& device
);
254 // Returns a sanitized AudioDevice from |node|.
255 AudioDevice
GetSanitizedAudioDevice(const AudioNode
& node
);
257 scoped_refptr
<AudioDevicesPrefHandler
> audio_pref_handler_
;
258 base::WeakPtrFactory
<CrasAudioHandler
> weak_ptr_factory_
;
259 ObserverList
<AudioObserver
> observers_
;
261 // Audio data and state.
262 AudioDeviceMap audio_devices_
;
264 AudioDevicePriorityQueue input_devices_pq_
;
265 AudioDevicePriorityQueue output_devices_pq_
;
267 bool output_mute_on_
;
271 uint64 active_output_node_id_
;
272 uint64 active_input_node_id_
;
273 bool has_alternative_input_
;
274 bool has_alternative_output_
;
276 bool output_mute_locked_
;
277 bool input_mute_locked_
;
279 // Failures are not logged at startup, since CRAS may not be running yet.
282 DISALLOW_COPY_AND_ASSIGN(CrasAudioHandler
);
285 } // namespace chromeos
287 #endif // CHROMEOS_AUDIO_CRAS_AUDIO_HANDLER_H_