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 {} |