OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromeos/dbus/cras_audio_client.h" | 5 #include "chromeos/dbus/cras_audio_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "dbus/bus.h" | 8 #include "dbus/bus.h" |
9 #include "dbus/message.h" | 9 #include "dbus/message.h" |
10 #include "dbus/object_path.h" | 10 #include "dbus/object_path.h" |
11 #include "dbus/object_proxy.h" | 11 #include "dbus/object_proxy.h" |
12 #include "third_party/cros_system_api/dbus/service_constants.h" | 12 #include "third_party/cros_system_api/dbus/service_constants.h" |
13 | 13 |
14 namespace chromeos { | 14 namespace chromeos { |
15 | 15 |
16 // The CrasAudioClient implementation used in production. | 16 // The CrasAudioClient implementation used in production. |
17 class CrasAudioClientImpl : public CrasAudioClient { | 17 class CrasAudioClientImpl : public CrasAudioClient { |
18 public: | 18 public: |
19 explicit CrasAudioClientImpl(dbus::Bus* bus) | 19 explicit CrasAudioClientImpl(dbus::Bus* bus) |
20 : cras_proxy_(NULL), | 20 : cras_proxy_(NULL), |
21 weak_ptr_factory_(this) { | 21 weak_ptr_factory_(this) { |
22 cras_proxy_ = bus->GetObjectProxy( | 22 cras_proxy_ = bus->GetObjectProxy( |
23 cras::kCrasServiceName, | 23 cras::kCrasServiceName, |
24 dbus::ObjectPath(cras::kCrasServicePath)); | 24 dbus::ObjectPath(cras::kCrasServicePath)); |
25 | 25 |
26 // Monitor NameOwnerChanged signal. | |
27 cras_proxy_->SetNameOwnerChangedCallback( | |
28 base::Bind(&CrasAudioClientImpl::NameOwnerChangedReceived, | |
29 weak_ptr_factory_.GetWeakPtr())); | |
30 | |
26 // Monitor the D-Bus signal for output volume change. | 31 // Monitor the D-Bus signal for output volume change. |
27 cras_proxy_->ConnectToSignal( | 32 cras_proxy_->ConnectToSignal( |
28 cras::kCrasControlInterface, | 33 cras::kCrasControlInterface, |
29 cras::kOutputVolumeChanged, | 34 cras::kOutputVolumeChanged, |
30 base::Bind(&CrasAudioClientImpl::OutputVolumeChangedReceived, | 35 base::Bind(&CrasAudioClientImpl::OutputVolumeChangedReceived, |
31 weak_ptr_factory_.GetWeakPtr()), | 36 weak_ptr_factory_.GetWeakPtr()), |
32 base::Bind(&CrasAudioClientImpl::SignalConnected, | 37 base::Bind(&CrasAudioClientImpl::SignalConnected, |
33 weak_ptr_factory_.GetWeakPtr())); | 38 weak_ptr_factory_.GetWeakPtr())); |
34 | 39 |
35 // Monitor the D-Bus signal for output mute change. | 40 // Monitor the D-Bus signal for output mute change. |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
191 | 196 |
192 private: | 197 private: |
193 // Called when the cras signal is initially connected. | 198 // Called when the cras signal is initially connected. |
194 void SignalConnected(const std::string& interface_name, | 199 void SignalConnected(const std::string& interface_name, |
195 const std::string& signal_name, | 200 const std::string& signal_name, |
196 bool success) { | 201 bool success) { |
197 LOG_IF(ERROR, !success) | 202 LOG_IF(ERROR, !success) |
198 << "Failed to connect to cras signal:" << signal_name; | 203 << "Failed to connect to cras signal:" << signal_name; |
199 } | 204 } |
200 | 205 |
206 void NameOwnerChangedReceived(dbus::Signal* signal) { | |
207 FOR_EACH_OBSERVER(Observer, observers_, AudioClientRestarted()); | |
208 } | |
209 | |
201 // Called when a OutputVolumeChanged signal is received. | 210 // Called when a OutputVolumeChanged signal is received. |
202 void OutputVolumeChangedReceived(dbus::Signal* signal) { | 211 void OutputVolumeChangedReceived(dbus::Signal* signal) { |
203 dbus::MessageReader reader(signal); | 212 dbus::MessageReader reader(signal); |
204 int32 volume; | 213 int32 volume; |
205 if (!reader.PopInt32(&volume)) { | 214 if (!reader.PopInt32(&volume)) { |
206 LOG(ERROR) << "Error reading signal from cras:" | 215 VLOG(1) << "Error reading signal from cras:" |
stevenjb
2013/04/18 17:10:26
These should probably also be LOG(ERROR) or LOG(WA
jennyz
2013/04/18 17:44:21
Done.
| |
207 << signal->ToString(); | 216 << signal->ToString(); |
208 } | 217 } |
209 FOR_EACH_OBSERVER(Observer, observers_, OutputVolumeChanged(volume)); | 218 FOR_EACH_OBSERVER(Observer, observers_, OutputVolumeChanged(volume)); |
210 } | 219 } |
211 | 220 |
212 // Called when a OutputMuteChanged signal is received. | 221 // Called when a OutputMuteChanged signal is received. |
213 void OutputMuteChangedReceived(dbus::Signal* signal) { | 222 void OutputMuteChangedReceived(dbus::Signal* signal) { |
214 dbus::MessageReader reader(signal); | 223 dbus::MessageReader reader(signal); |
215 bool mute; | 224 bool mute; |
216 if (!reader.PopBool(&mute)) { | 225 if (!reader.PopBool(&mute)) { |
217 LOG(ERROR) << "Error reading signal from cras:" | 226 VLOG(1) << "Error reading signal from cras:" |
218 << signal->ToString(); | 227 << signal->ToString(); |
219 } | 228 } |
220 FOR_EACH_OBSERVER(Observer, observers_, OutputMuteChanged(mute)); | 229 FOR_EACH_OBSERVER(Observer, observers_, OutputMuteChanged(mute)); |
221 } | 230 } |
222 | 231 |
223 // Called when a InputGainChanged signal is received. | 232 // Called when a InputGainChanged signal is received. |
224 void InputGainChangedReceived(dbus::Signal* signal) { | 233 void InputGainChangedReceived(dbus::Signal* signal) { |
225 dbus::MessageReader reader(signal); | 234 dbus::MessageReader reader(signal); |
226 int32 gain; | 235 int32 gain; |
227 if (!reader.PopInt32(&gain)) { | 236 if (!reader.PopInt32(&gain)) { |
228 LOG(ERROR) << "Error reading signal from cras:" | 237 VLOG(1) << "Error reading signal from cras:" |
229 << signal->ToString(); | 238 << signal->ToString(); |
230 } | 239 } |
231 FOR_EACH_OBSERVER(Observer, observers_, InputGainChanged(gain)); | 240 FOR_EACH_OBSERVER(Observer, observers_, InputGainChanged(gain)); |
232 } | 241 } |
233 | 242 |
234 // Called when a InputMuteChanged signal is received. | 243 // Called when a InputMuteChanged signal is received. |
235 void InputMuteChangedReceived(dbus::Signal* signal) { | 244 void InputMuteChangedReceived(dbus::Signal* signal) { |
236 dbus::MessageReader reader(signal); | 245 dbus::MessageReader reader(signal); |
237 bool mute; | 246 bool mute; |
238 if (!reader.PopBool(&mute)) { | 247 if (!reader.PopBool(&mute)) { |
239 LOG(ERROR) << "Error reading signal from cras:" | 248 VLOG(1) << "Error reading signal from cras:" |
240 << signal->ToString(); | 249 << signal->ToString(); |
241 } | 250 } |
242 FOR_EACH_OBSERVER(Observer, observers_, InputMuteChanged(mute)); | 251 FOR_EACH_OBSERVER(Observer, observers_, InputMuteChanged(mute)); |
243 } | 252 } |
244 | 253 |
245 void NodesChangedReceived(dbus::Signal* signal) { | 254 void NodesChangedReceived(dbus::Signal* signal) { |
246 FOR_EACH_OBSERVER(Observer, observers_, NodesChanged()); | 255 FOR_EACH_OBSERVER(Observer, observers_, NodesChanged()); |
247 } | 256 } |
248 | 257 |
249 void ActiveOutputNodeChangedReceived(dbus::Signal* signal) { | 258 void ActiveOutputNodeChangedReceived(dbus::Signal* signal) { |
250 dbus::MessageReader reader(signal); | 259 dbus::MessageReader reader(signal); |
251 uint64 node_id; | 260 uint64 node_id; |
252 if (!reader.PopUint64(&node_id)) { | 261 if (!reader.PopUint64(&node_id)) { |
253 LOG(ERROR) << "Error reading signal from cras:" | 262 VLOG(1) << "Error reading signal from cras:" |
254 << signal->ToString(); | 263 << signal->ToString(); |
255 } | 264 } |
256 FOR_EACH_OBSERVER(Observer, observers_, ActiveOutputNodeChanged(node_id)); | 265 FOR_EACH_OBSERVER(Observer, observers_, ActiveOutputNodeChanged(node_id)); |
257 } | 266 } |
258 | 267 |
259 void ActiveInputNodeChangedReceived(dbus::Signal* signal) { | 268 void ActiveInputNodeChangedReceived(dbus::Signal* signal) { |
260 dbus::MessageReader reader(signal); | 269 dbus::MessageReader reader(signal); |
261 uint64 node_id; | 270 uint64 node_id; |
262 if (!reader.PopUint64(&node_id)) { | 271 if (!reader.PopUint64(&node_id)) { |
263 LOG(ERROR) << "Error reading signal from cras:" | 272 VLOG(1) << "Error reading signal from cras:" |
264 << signal->ToString(); | 273 << signal->ToString(); |
265 } | 274 } |
266 FOR_EACH_OBSERVER(Observer, observers_, ActiveInputNodeChanged(node_id)); | 275 FOR_EACH_OBSERVER(Observer, observers_, ActiveInputNodeChanged(node_id)); |
267 } | 276 } |
268 | 277 |
269 void OnGetVolumeState(const GetVolumeStateCallback& callback, | 278 void OnGetVolumeState(const GetVolumeStateCallback& callback, |
270 dbus::Response* response) { | 279 dbus::Response* response) { |
271 bool success = true; | 280 bool success = true; |
272 VolumeState volume_state; | 281 VolumeState volume_state; |
273 if (response) { | 282 if (response) { |
274 dbus::MessageReader reader(response); | 283 dbus::MessageReader reader(response); |
275 if (!reader.PopInt32(&volume_state.output_volume) || | 284 if (!reader.PopInt32(&volume_state.output_volume) || |
276 !reader.PopBool(&volume_state.output_mute) || | 285 !reader.PopBool(&volume_state.output_mute) || |
277 !reader.PopInt32(&volume_state.input_gain) || | 286 !reader.PopInt32(&volume_state.input_gain) || |
278 !reader.PopBool(&volume_state.input_mute)) { | 287 !reader.PopBool(&volume_state.input_mute)) { |
279 success = false; | 288 success = false; |
280 LOG(ERROR) << "Error reading response from cras: " | 289 VLOG(1) << "Error reading response from cras: " |
281 << response->ToString(); | 290 << response->ToString(); |
282 } | 291 } |
283 } else { | 292 } else { |
284 success = false; | 293 success = false; |
285 LOG(ERROR) << "Error calling " << cras::kGetVolumeState; | 294 VLOG(1) << "Error calling " << cras::kGetVolumeState; |
286 } | 295 } |
287 | 296 |
288 callback.Run(volume_state, success); | 297 callback.Run(volume_state, success); |
289 } | 298 } |
290 | 299 |
291 void OnGetNodes(const GetNodesCallback& callback, | 300 void OnGetNodes(const GetNodesCallback& callback, |
292 dbus::Response* response) { | 301 dbus::Response* response) { |
293 bool success = true; | 302 bool success = true; |
294 AudioNodeList node_list; | 303 AudioNodeList node_list; |
295 if (response) { | 304 if (response) { |
296 dbus::MessageReader response_reader(response); | 305 dbus::MessageReader response_reader(response); |
297 dbus::MessageReader array_reader(response); | 306 dbus::MessageReader array_reader(response); |
298 while(response_reader.HasMoreData()) { | 307 while (response_reader.HasMoreData()) { |
299 if (!response_reader.PopArray(&array_reader)) { | 308 if (!response_reader.PopArray(&array_reader)) { |
300 success = false; | 309 success = false; |
301 LOG(ERROR) << "Error reading response from cras: " | 310 VLOG(1) << "Error reading response from cras: " |
302 << response->ToString(); | 311 << response->ToString(); |
303 break; | 312 break; |
304 } | 313 } |
305 | 314 |
306 AudioNode node; | 315 AudioNode node; |
307 if (!GetAudioNode(response, &array_reader, &node)) { | 316 if (!GetAudioNode(response, &array_reader, &node)) { |
308 success = false; | 317 success = false; |
309 LOG(WARNING) << "Error reading audio node data from cras: " | 318 LOG(WARNING) << "Error reading audio node data from cras: " |
310 << response->ToString(); | 319 << response->ToString(); |
311 break; | 320 break; |
312 } | 321 } |
313 | 322 |
314 node_list.push_back(node); | 323 node_list.push_back(node); |
315 } | 324 } |
316 } else { | 325 } else { |
317 success = false; | 326 success = false; |
318 LOG(ERROR) << "Error calling " << cras::kGetNodes; | 327 VLOG(1) << "Error calling " << cras::kGetNodes; |
319 } | 328 } |
320 | 329 |
321 callback.Run(node_list, success); | 330 callback.Run(node_list, success); |
322 } | 331 } |
323 | 332 |
324 bool GetAudioNode(dbus::Response* response, | 333 bool GetAudioNode(dbus::Response* response, |
325 dbus::MessageReader* array_reader, | 334 dbus::MessageReader* array_reader, |
326 AudioNode *node) { | 335 AudioNode *node) { |
327 while (array_reader->HasMoreData()) { | 336 while (array_reader->HasMoreData()) { |
328 dbus::MessageReader dict_entry_reader(response); | 337 dbus::MessageReader dict_entry_reader(response); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
367 | 376 |
368 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientImpl); | 377 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientImpl); |
369 }; | 378 }; |
370 | 379 |
371 // The CrasAudioClient implementation used on Linux desktop, | 380 // The CrasAudioClient implementation used on Linux desktop, |
372 // which does nothing. | 381 // which does nothing. |
373 class CrasAudioClientStubImpl : public CrasAudioClient { | 382 class CrasAudioClientStubImpl : public CrasAudioClient { |
374 public: | 383 public: |
375 CrasAudioClientStubImpl() { | 384 CrasAudioClientStubImpl() { |
376 VLOG(1) << "CrasAudioClientStubImpl is created"; | 385 VLOG(1) << "CrasAudioClientStubImpl is created"; |
386 | |
387 // Fake audio nodes. | |
388 AudioNode node_1; | |
389 node_1.is_input = false; | |
390 node_1.id = 10001; | |
391 node_1.device_name = "Fake Audio Output"; | |
392 node_1.type = "INTERNAL_SPEAKER"; | |
393 node_1.name = "Internal Speaker"; | |
394 node_1.active = true; | |
395 | |
396 AudioNode node_2; | |
397 node_2.is_input = true; | |
398 node_2.id = 10002; | |
399 node_2.device_name = "Fake Audio Input"; | |
400 node_2.type = "INTERNAL_MIC"; | |
401 node_2.name = "Internal Mic"; | |
402 node_2.active = true; | |
403 | |
404 node_list_.push_back(node_1); | |
405 node_list_.push_back(node_2); | |
377 } | 406 } |
378 virtual ~CrasAudioClientStubImpl() {} | 407 virtual ~CrasAudioClientStubImpl() { |
408 } | |
379 | 409 |
380 // CrasAudioClient overrides: | 410 // CrasAudioClient overrides: |
381 // TODO(jennyz): Implement the observers and callbacks in the stub for UI | 411 // TODO(jennyz): Implement the observers and callbacks in the stub for UI |
382 // testing. | 412 // testing. |
383 virtual void AddObserver(Observer* observer) OVERRIDE {} | 413 virtual void AddObserver(Observer* observer) OVERRIDE { |
384 virtual void RemoveObserver(Observer* observer) OVERRIDE {} | 414 observers_.AddObserver(observer); |
385 virtual bool HasObserver(Observer* observer) OVERRIDE { return false; } | 415 } |
416 | |
417 virtual void RemoveObserver(Observer* observer) OVERRIDE { | |
418 observers_.RemoveObserver(observer); | |
419 } | |
420 | |
421 virtual bool HasObserver(Observer* observer) OVERRIDE { | |
422 return observers_.HasObserver(observer); | |
423 } | |
424 | |
386 virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE { | 425 virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE { |
426 callback.Run(volume_state_, true); | |
387 } | 427 } |
388 virtual void GetNodes(const GetNodesCallback& callback)OVERRIDE {} | 428 |
389 virtual void SetOutputVolume(int32 volume) OVERRIDE {} | 429 virtual void GetNodes(const GetNodesCallback& callback)OVERRIDE { |
390 virtual void SetOutputMute(bool mute_on) OVERRIDE {} | 430 callback.Run(node_list_, true); |
391 virtual void SetInputGain(int32 input_gain) OVERRIDE {} | 431 } |
392 virtual void SetInputMute(bool mute_on) OVERRIDE {} | 432 |
393 virtual void SetActiveOutputNode(uint64 node_id) OVERRIDE {} | 433 virtual void SetOutputVolume(int32 volume) OVERRIDE { |
394 virtual void SetActiveInputNode(uint64 node_id) OVERRIDE {} | 434 VLOG(1) << "CrasAudioClientStubImpl::SetOutputVolume volume=" << volume; |
435 volume_state_.output_volume = volume; | |
436 FOR_EACH_OBSERVER(Observer, | |
437 observers_, | |
438 OutputVolumeChanged(volume_state_.output_volume)); | |
439 } | |
440 | |
441 virtual void SetOutputMute(bool mute_on) OVERRIDE { | |
442 VLOG(1) << "CrasAudioClientStubImpl::SetOutputMute, mute_on=" << mute_on; | |
443 volume_state_.output_mute = mute_on; | |
444 FOR_EACH_OBSERVER(Observer, | |
445 observers_, | |
446 OutputMuteChanged(volume_state_.output_mute)); | |
447 } | |
448 | |
449 virtual void SetInputGain(int32 input_gain) OVERRIDE { | |
450 volume_state_.input_gain = input_gain; | |
451 FOR_EACH_OBSERVER(Observer, | |
452 observers_, | |
453 InputGainChanged(volume_state_.input_gain)); | |
454 } | |
455 | |
456 virtual void SetInputMute(bool mute_on) OVERRIDE { | |
457 volume_state_.input_mute = mute_on; | |
458 FOR_EACH_OBSERVER(Observer, | |
459 observers_, | |
460 InputMuteChanged(volume_state_.input_mute)); | |
461 } | |
462 | |
463 virtual void SetActiveOutputNode(uint64 node_id) OVERRIDE { | |
464 active_output_node_id_ = node_id; | |
465 FOR_EACH_OBSERVER(Observer, | |
466 observers_, | |
467 ActiveOutputNodeChanged(node_id)); | |
468 } | |
469 | |
470 virtual void SetActiveInputNode(uint64 node_id) OVERRIDE { | |
471 active_input_node_id_ = node_id; | |
472 FOR_EACH_OBSERVER(Observer, | |
473 observers_, | |
474 ActiveInputNodeChanged(node_id)); | |
475 } | |
395 | 476 |
396 private: | 477 private: |
478 VolumeState volume_state_; | |
479 AudioNodeList node_list_; | |
480 uint64 active_input_node_id_; | |
481 uint64 active_output_node_id_; | |
482 ObserverList<Observer> observers_; | |
483 | |
397 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientStubImpl); | 484 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientStubImpl); |
398 }; | 485 }; |
399 | 486 |
400 CrasAudioClient::Observer::~Observer() { | 487 CrasAudioClient::Observer::~Observer() { |
401 } | 488 } |
402 | 489 |
490 void CrasAudioClient::Observer::AudioClientRestarted() { | |
491 } | |
492 | |
403 void CrasAudioClient::Observer::OutputVolumeChanged(int32 volume) { | 493 void CrasAudioClient::Observer::OutputVolumeChanged(int32 volume) { |
404 } | 494 } |
405 | 495 |
406 void CrasAudioClient::Observer::OutputMuteChanged(bool mute_on) { | 496 void CrasAudioClient::Observer::OutputMuteChanged(bool mute_on) { |
407 } | 497 } |
408 | 498 |
409 void CrasAudioClient::Observer::InputGainChanged(int gain) { | 499 void CrasAudioClient::Observer::InputGainChanged(int gain) { |
410 } | 500 } |
411 | 501 |
412 void CrasAudioClient::Observer::InputMuteChanged(bool mute_on) { | 502 void CrasAudioClient::Observer::InputMuteChanged(bool mute_on) { |
(...skipping 19 matching lines...) Expand all Loading... | |
432 DBusClientImplementationType type, | 522 DBusClientImplementationType type, |
433 dbus::Bus* bus) { | 523 dbus::Bus* bus) { |
434 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { | 524 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { |
435 return new CrasAudioClientImpl(bus); | 525 return new CrasAudioClientImpl(bus); |
436 } | 526 } |
437 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); | 527 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
438 return new CrasAudioClientStubImpl(); | 528 return new CrasAudioClientStubImpl(); |
439 } | 529 } |
440 | 530 |
441 } // namespace chromeos | 531 } // namespace chromeos |
OLD | NEW |