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 |