Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(511)

Side by Side Diff: chromeos/dbus/cras_audio_client.cc

Issue 13863007: Integrate audio dbus api: GetNodes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nit. Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chromeos/dbus/cras_audio_client.h ('k') | chromeos/dbus/mock_cras_audio_client.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « chromeos/dbus/cras_audio_client.h ('k') | chromeos/dbus/mock_cras_audio_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698