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

Unified 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromeos/dbus/cras_audio_client.cc
diff --git a/chromeos/dbus/cras_audio_client.cc b/chromeos/dbus/cras_audio_client.cc
index 6de300186958bb6341f7d80e52e060638f0c826d..bffa4d40cecf2b7ded287bc0d988201662de2f23 100644
--- a/chromeos/dbus/cras_audio_client.cc
+++ b/chromeos/dbus/cras_audio_client.cc
@@ -12,6 +12,17 @@
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace {
+
+// TODO(jennyz): Remove this section and use the dbus properties constants
+// defined in service_constants.h, once the change is done in cros side for
+// service_constants.h and rolled down to chrome.
+const char kIsInputProperty[] = "IsInput";
+const char kIdProperty[] = "Id";
+const char kDeviceNameProperty[] = "DeviceName";
+const char kTypeProperty[] = "Type";
+const char kNameProperty[] = "Name";
+const char kActiveProperty[] = "Active";
+
} // namespace
namespace chromeos {
@@ -116,6 +127,16 @@ class CrasAudioClientImpl : public CrasAudioClient {
weak_ptr_factory_.GetWeakPtr(), callback));
}
+ virtual void GetNodes(const GetNodesCallback& callback) OVERRIDE {
+ dbus::MethodCall method_call(cras::kCrasControlInterface,
+ cras::kGetNodes);
+ cras_proxy_->CallMethod(
+ &method_call,
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+ base::Bind(&CrasAudioClientImpl::OnGetNodes,
+ weak_ptr_factory_.GetWeakPtr(), callback));
+ }
+
virtual void SetOutputVolume(int32 volume) OVERRIDE {
dbus::MethodCall method_call(cras::kCrasControlInterface,
cras::kSetOutputVolume);
@@ -261,21 +282,94 @@ class CrasAudioClientImpl : public CrasAudioClient {
void OnGetVolumeState(const GetVolumeStateCallback& callback,
dbus::Response* response) {
- if (!response) {
+ bool success = true;
+ VolumeState volume_state;
+ if (response) {
+ dbus::MessageReader reader(response);
+ if (!reader.PopInt32(&volume_state.output_volume) ||
+ !reader.PopBool(&volume_state.output_mute) ||
+ !reader.PopInt32(&volume_state.input_gain) ||
+ !reader.PopBool(&volume_state.input_mute)) {
+ success = false;
+ LOG(ERROR) << "Error reading response from cras: "
+ << response->ToString();
+ }
+ } else {
+ success = false;
LOG(ERROR) << "Error calling " << cras::kGetVolumeState;
- return;
}
- dbus::MessageReader reader(response);
- VolumeState volume_state;
- if (!reader.PopInt32(&volume_state.output_volume) ||
- !reader.PopBool(&volume_state.output_mute) ||
- !reader.PopInt32(&volume_state.input_gain) ||
- !reader.PopBool(&volume_state.input_mute)) {
- LOG(ERROR) << "Error reading response from cras: "
- << response->ToString();
+ callback.Run(volume_state, success);
+ }
+
+ void OnGetNodes(const GetNodesCallback& callback,
+ dbus::Response* response) {
+ bool success = true;
+ AudioNodeList node_list;
+ if (response) {
+ dbus::MessageReader response_reader(response);
+ dbus::MessageReader array_reader(response);
+ while(response_reader.HasMoreData()) {
+ if (!response_reader.PopArray(&array_reader)) {
+ success = false;
+ LOG(ERROR) << "Error reading response from cras: "
+ << response->ToString();
+ break;
+ }
+
+ AudioNode node;
+ if (!GetAudioNode(response, &array_reader, &node)) {
+ success = false;
+ LOG(WARNING) << "Error reading audio node data from cras: "
+ << response->ToString();
+ break;
+ }
+
+ node_list.push_back(node);
+ }
+ } else {
+ success = false;
+ LOG(ERROR) << "Error calling " << cras::kGetNodes;
}
- callback.Run(volume_state);
+
+ callback.Run(node_list, success);
+ }
+
+ bool GetAudioNode(dbus::Response* response,
+ dbus::MessageReader* array_reader,
+ AudioNode *node) {
+ while (array_reader->HasMoreData()) {
+ dbus::MessageReader dict_entry_reader(response);
+ dbus::MessageReader value_reader(response);
+ std::string key;
+ if (!array_reader->PopDictEntry(&dict_entry_reader) ||
+ !dict_entry_reader.PopString(&key) ||
+ !dict_entry_reader.PopVariant(&value_reader)) {
+ return false;
+ }
+
+ if (key == kIsInputProperty) {
+ if (!value_reader.PopBool(&node->is_input))
+ return false;
+ } else if (key == kIdProperty) {
+ if (!value_reader.PopUint64(&node->id))
+ return false;
+ } else if (key == kDeviceNameProperty) {
+ if (!value_reader.PopString(&node->device_name))
+ return false;
+ } else if (key == kTypeProperty) {
+ if (!value_reader.PopString(&node->type))
+ return false;
+ } else if (key == kNameProperty) {
+ if (!value_reader.PopString(&node->name))
+ return false;
+ } else if (key == kActiveProperty) {
+ if (!value_reader.PopBool(&node->active))
+ return false;
+ }
+ }
+
+ return true;
}
dbus::ObjectProxy* cras_proxy_;
@@ -305,6 +399,7 @@ class CrasAudioClientStubImpl : public CrasAudioClient {
virtual bool HasObserver(Observer* observer) OVERRIDE { return false; }
virtual void GetVolumeState(const GetVolumeStateCallback& callback) OVERRIDE {
}
+ virtual void GetNodes(const GetNodesCallback& callback)OVERRIDE {}
virtual void SetOutputVolume(int32 volume) OVERRIDE {}
virtual void SetOutputMute(bool mute_on) OVERRIDE {}
virtual void SetInputGain(int32 input_gain) OVERRIDE {}
« 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