Chromium Code Reviews| 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 |