| 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 { | 14 namespace { |
| 15 |
| 16 // TODO(jennyz): Remove this section and use the dbus properties constants |
| 17 // defined in service_constants.h, once the change is done in cros side for |
| 18 // service_constants.h and rolled down to chrome. |
| 19 const char kIsInputProperty[] = "IsInput"; |
| 20 const char kIdProperty[] = "Id"; |
| 21 const char kDeviceNameProperty[] = "DeviceName"; |
| 22 const char kTypeProperty[] = "Type"; |
| 23 const char kNameProperty[] = "Name"; |
| 24 const char kActiveProperty[] = "Active"; |
| 25 |
| 15 } // namespace | 26 } // namespace |
| 16 | 27 |
| 17 namespace chromeos { | 28 namespace chromeos { |
| 18 | 29 |
| 19 // The CrasAudioClient implementation used in production. | 30 // The CrasAudioClient implementation used in production. |
| 20 class CrasAudioClientImpl : public CrasAudioClient { | 31 class CrasAudioClientImpl : public CrasAudioClient { |
| 21 public: | 32 public: |
| 22 explicit CrasAudioClientImpl(dbus::Bus* bus) | 33 explicit CrasAudioClientImpl(dbus::Bus* bus) |
| 23 : cras_proxy_(NULL), | 34 : cras_proxy_(NULL), |
| 24 weak_ptr_factory_(this) { | 35 weak_ptr_factory_(this) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE { | 120 virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE { |
| 110 dbus::MethodCall method_call(cras::kCrasControlInterface, | 121 dbus::MethodCall method_call(cras::kCrasControlInterface, |
| 111 cras::kGetVolumeState); | 122 cras::kGetVolumeState); |
| 112 cras_proxy_->CallMethod( | 123 cras_proxy_->CallMethod( |
| 113 &method_call, | 124 &method_call, |
| 114 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 125 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 115 base::Bind(&CrasAudioClientImpl::OnGetVolumeState, | 126 base::Bind(&CrasAudioClientImpl::OnGetVolumeState, |
| 116 weak_ptr_factory_.GetWeakPtr(), callback)); | 127 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 117 } | 128 } |
| 118 | 129 |
| 130 virtual void GetNodes(const GetNodesCallback& callback) OVERRIDE { |
| 131 dbus::MethodCall method_call(cras::kCrasControlInterface, |
| 132 cras::kGetNodes); |
| 133 cras_proxy_->CallMethod( |
| 134 &method_call, |
| 135 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 136 base::Bind(&CrasAudioClientImpl::OnGetNodes, |
| 137 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 138 } |
| 139 |
| 119 virtual void SetOutputVolume(int32 volume) OVERRIDE { | 140 virtual void SetOutputVolume(int32 volume) OVERRIDE { |
| 120 dbus::MethodCall method_call(cras::kCrasControlInterface, | 141 dbus::MethodCall method_call(cras::kCrasControlInterface, |
| 121 cras::kSetOutputVolume); | 142 cras::kSetOutputVolume); |
| 122 dbus::MessageWriter writer(&method_call); | 143 dbus::MessageWriter writer(&method_call); |
| 123 writer.AppendInt32(volume); | 144 writer.AppendInt32(volume); |
| 124 cras_proxy_->CallMethod( | 145 cras_proxy_->CallMethod( |
| 125 &method_call, | 146 &method_call, |
| 126 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 147 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 127 dbus::ObjectProxy::EmptyResponseCallback()); | 148 dbus::ObjectProxy::EmptyResponseCallback()); |
| 128 } | 149 } |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 uint64 node_id; | 275 uint64 node_id; |
| 255 if (!reader.PopUint64(&node_id)) { | 276 if (!reader.PopUint64(&node_id)) { |
| 256 LOG(ERROR) << "Error reading signal from cras:" | 277 LOG(ERROR) << "Error reading signal from cras:" |
| 257 << signal->ToString(); | 278 << signal->ToString(); |
| 258 } | 279 } |
| 259 FOR_EACH_OBSERVER(Observer, observers_, ActiveInputNodeChanged(node_id)); | 280 FOR_EACH_OBSERVER(Observer, observers_, ActiveInputNodeChanged(node_id)); |
| 260 } | 281 } |
| 261 | 282 |
| 262 void OnGetVolumeState(const GetVolumeStateCallback& callback, | 283 void OnGetVolumeState(const GetVolumeStateCallback& callback, |
| 263 dbus::Response* response) { | 284 dbus::Response* response) { |
| 264 if (!response) { | 285 bool success = true; |
| 286 VolumeState volume_state; |
| 287 if (response) { |
| 288 dbus::MessageReader reader(response); |
| 289 if (!reader.PopInt32(&volume_state.output_volume) || |
| 290 !reader.PopBool(&volume_state.output_mute) || |
| 291 !reader.PopInt32(&volume_state.input_gain) || |
| 292 !reader.PopBool(&volume_state.input_mute)) { |
| 293 success = false; |
| 294 LOG(ERROR) << "Error reading response from cras: " |
| 295 << response->ToString(); |
| 296 } |
| 297 } else { |
| 298 success = false; |
| 265 LOG(ERROR) << "Error calling " << cras::kGetVolumeState; | 299 LOG(ERROR) << "Error calling " << cras::kGetVolumeState; |
| 266 return; | |
| 267 } | 300 } |
| 268 | 301 |
| 269 dbus::MessageReader reader(response); | 302 callback.Run(volume_state, success); |
| 270 VolumeState volume_state; | 303 } |
| 271 if (!reader.PopInt32(&volume_state.output_volume) || | 304 |
| 272 !reader.PopBool(&volume_state.output_mute) || | 305 void OnGetNodes(const GetNodesCallback& callback, |
| 273 !reader.PopInt32(&volume_state.input_gain) || | 306 dbus::Response* response) { |
| 274 !reader.PopBool(&volume_state.input_mute)) { | 307 bool success = true; |
| 275 LOG(ERROR) << "Error reading response from cras: " | 308 AudioNodeList node_list; |
| 276 << response->ToString(); | 309 if (response) { |
| 310 dbus::MessageReader response_reader(response); |
| 311 dbus::MessageReader array_reader(response); |
| 312 while(response_reader.HasMoreData()) { |
| 313 if (!response_reader.PopArray(&array_reader)) { |
| 314 success = false; |
| 315 LOG(ERROR) << "Error reading response from cras: " |
| 316 << response->ToString(); |
| 317 break; |
| 318 } |
| 319 |
| 320 AudioNode node; |
| 321 if (!GetAudioNode(response, &array_reader, &node)) { |
| 322 success = false; |
| 323 LOG(WARNING) << "Error reading audio node data from cras: " |
| 324 << response->ToString(); |
| 325 break; |
| 326 } |
| 327 |
| 328 node_list.push_back(node); |
| 329 } |
| 330 } else { |
| 331 success = false; |
| 332 LOG(ERROR) << "Error calling " << cras::kGetNodes; |
| 277 } | 333 } |
| 278 callback.Run(volume_state); | 334 |
| 335 callback.Run(node_list, success); |
| 336 } |
| 337 |
| 338 bool GetAudioNode(dbus::Response* response, |
| 339 dbus::MessageReader* array_reader, |
| 340 AudioNode *node) { |
| 341 while (array_reader->HasMoreData()) { |
| 342 dbus::MessageReader dict_entry_reader(response); |
| 343 dbus::MessageReader value_reader(response); |
| 344 std::string key; |
| 345 if (!array_reader->PopDictEntry(&dict_entry_reader) || |
| 346 !dict_entry_reader.PopString(&key) || |
| 347 !dict_entry_reader.PopVariant(&value_reader)) { |
| 348 return false; |
| 349 } |
| 350 |
| 351 if (key == kIsInputProperty) { |
| 352 if (!value_reader.PopBool(&node->is_input)) |
| 353 return false; |
| 354 } else if (key == kIdProperty) { |
| 355 if (!value_reader.PopUint64(&node->id)) |
| 356 return false; |
| 357 } else if (key == kDeviceNameProperty) { |
| 358 if (!value_reader.PopString(&node->device_name)) |
| 359 return false; |
| 360 } else if (key == kTypeProperty) { |
| 361 if (!value_reader.PopString(&node->type)) |
| 362 return false; |
| 363 } else if (key == kNameProperty) { |
| 364 if (!value_reader.PopString(&node->name)) |
| 365 return false; |
| 366 } else if (key == kActiveProperty) { |
| 367 if (!value_reader.PopBool(&node->active)) |
| 368 return false; |
| 369 } |
| 370 } |
| 371 |
| 372 return true; |
| 279 } | 373 } |
| 280 | 374 |
| 281 dbus::ObjectProxy* cras_proxy_; | 375 dbus::ObjectProxy* cras_proxy_; |
| 282 ObserverList<Observer> observers_; | 376 ObserverList<Observer> observers_; |
| 283 | 377 |
| 284 // Note: This should remain the last member so it'll be destroyed and | 378 // Note: This should remain the last member so it'll be destroyed and |
| 285 // invalidate its weak pointers before any other members are destroyed. | 379 // invalidate its weak pointers before any other members are destroyed. |
| 286 base::WeakPtrFactory<CrasAudioClientImpl> weak_ptr_factory_; | 380 base::WeakPtrFactory<CrasAudioClientImpl> weak_ptr_factory_; |
| 287 | 381 |
| 288 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientImpl); | 382 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientImpl); |
| 289 }; | 383 }; |
| 290 | 384 |
| 291 // The CrasAudioClient implementation used on Linux desktop, | 385 // The CrasAudioClient implementation used on Linux desktop, |
| 292 // which does nothing. | 386 // which does nothing. |
| 293 class CrasAudioClientStubImpl : public CrasAudioClient { | 387 class CrasAudioClientStubImpl : public CrasAudioClient { |
| 294 public: | 388 public: |
| 295 CrasAudioClientStubImpl() { | 389 CrasAudioClientStubImpl() { |
| 296 VLOG(1) << "CrasAudioClientStubImpl is created"; | 390 VLOG(1) << "CrasAudioClientStubImpl is created"; |
| 297 } | 391 } |
| 298 virtual ~CrasAudioClientStubImpl() {} | 392 virtual ~CrasAudioClientStubImpl() {} |
| 299 | 393 |
| 300 // CrasAudioClient overrides: | 394 // CrasAudioClient overrides: |
| 301 // TODO(jennyz): Implement the observers and callbacks in the stub for UI | 395 // TODO(jennyz): Implement the observers and callbacks in the stub for UI |
| 302 // testing. | 396 // testing. |
| 303 virtual void AddObserver(Observer* observer) OVERRIDE {} | 397 virtual void AddObserver(Observer* observer) OVERRIDE {} |
| 304 virtual void RemoveObserver(Observer* observer) OVERRIDE {} | 398 virtual void RemoveObserver(Observer* observer) OVERRIDE {} |
| 305 virtual bool HasObserver(Observer* observer) OVERRIDE { return false; } | 399 virtual bool HasObserver(Observer* observer) OVERRIDE { return false; } |
| 306 virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE { | 400 virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE { |
| 307 } | 401 } |
| 402 virtual void GetNodes(const GetNodesCallback& callback)OVERRIDE {} |
| 308 virtual void SetOutputVolume(int32 volume) OVERRIDE {} | 403 virtual void SetOutputVolume(int32 volume) OVERRIDE {} |
| 309 virtual void SetOutputMute(bool mute_on) OVERRIDE {} | 404 virtual void SetOutputMute(bool mute_on) OVERRIDE {} |
| 310 virtual void SetInputGain(int32 input_gain) OVERRIDE {} | 405 virtual void SetInputGain(int32 input_gain) OVERRIDE {} |
| 311 virtual void SetInputMute(bool mute_on) OVERRIDE {} | 406 virtual void SetInputMute(bool mute_on) OVERRIDE {} |
| 312 virtual void SetActiveOutputNode(uint64 node_id) OVERRIDE {} | 407 virtual void SetActiveOutputNode(uint64 node_id) OVERRIDE {} |
| 313 virtual void SetActiveInputNode(uint64 node_id) OVERRIDE {} | 408 virtual void SetActiveInputNode(uint64 node_id) OVERRIDE {} |
| 314 | 409 |
| 315 private: | 410 private: |
| 316 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientStubImpl); | 411 DISALLOW_COPY_AND_ASSIGN(CrasAudioClientStubImpl); |
| 317 }; | 412 }; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 DBusClientImplementationType type, | 446 DBusClientImplementationType type, |
| 352 dbus::Bus* bus) { | 447 dbus::Bus* bus) { |
| 353 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { | 448 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { |
| 354 return new CrasAudioClientImpl(bus); | 449 return new CrasAudioClientImpl(bus); |
| 355 } | 450 } |
| 356 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); | 451 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
| 357 return new CrasAudioClientStubImpl(); | 452 return new CrasAudioClientStubImpl(); |
| 358 } | 453 } |
| 359 | 454 |
| 360 } // namespace chromeos | 455 } // namespace chromeos |
| OLD | NEW |