summaryrefslogtreecommitdiffstats
path: root/chromeos
diff options
context:
space:
mode:
authorjennyz@chromium.org <jennyz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-10 22:47:27 +0000
committerjennyz@chromium.org <jennyz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-10 22:47:27 +0000
commit6504feda1e9b48198fe39f91f4fe2ac61848a3ab (patch)
tree05a8a40325c15864ee984dbe9f77e128a574e12b /chromeos
parent5ba236edb45748f60ce8e15de03577f9215688fa (diff)
downloadchromium_src-6504feda1e9b48198fe39f91f4fe2ac61848a3ab.zip
chromium_src-6504feda1e9b48198fe39f91f4fe2ac61848a3ab.tar.gz
chromium_src-6504feda1e9b48198fe39f91f4fe2ac61848a3ab.tar.bz2
Integrate audio dbus api: GetNodes and a small improvement to GetVolumeState.
BUG=160311 Review URL: https://chromiumcodereview.appspot.com/13863007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@193484 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos')
-rw-r--r--chromeos/chromeos.gyp2
-rw-r--r--chromeos/dbus/audio_node.cc42
-rw-r--r--chromeos/dbus/audio_node.h32
-rw-r--r--chromeos/dbus/cras_audio_client.cc117
-rw-r--r--chromeos/dbus/cras_audio_client.h16
-rw-r--r--chromeos/dbus/mock_cras_audio_client.h1
6 files changed, 196 insertions, 14 deletions
diff --git a/chromeos/chromeos.gyp b/chromeos/chromeos.gyp
index eb730bb..b62fb00 100644
--- a/chromeos/chromeos.gyp
+++ b/chromeos/chromeos.gyp
@@ -38,6 +38,8 @@
'chromeos_switches.h',
'cryptohome/async_method_caller.cc',
'cryptohome/async_method_caller.h',
+ 'dbus/audio_node.cc',
+ 'dbus/audio_node.h',
'dbus/blocking_method_caller.cc',
'dbus/blocking_method_caller.h',
'dbus/bluetooth_adapter_client.cc',
diff --git a/chromeos/dbus/audio_node.cc b/chromeos/dbus/audio_node.cc
new file mode 100644
index 0000000..4c021e0
--- /dev/null
+++ b/chromeos/dbus/audio_node.cc
@@ -0,0 +1,42 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/dbus/audio_node.h"
+
+#include "base/format_macros.h"
+#include "base/stringprintf.h"
+
+namespace chromeos {
+
+AudioNode::AudioNode()
+ : is_input(false),
+ id(0),
+ active(false) {
+}
+
+std::string AudioNode::ToString() const {
+ std::string result;
+ base::StringAppendF(&result,
+ "is_input = %s ",
+ is_input ? "true" : "false");
+ base::StringAppendF(&result,
+ "id = %"PRIu64" ",
+ id);
+ base::StringAppendF(&result,
+ "device_name = %s ",
+ device_name.c_str());
+ base::StringAppendF(&result,
+ "type = %s ",
+ type.c_str());
+ base::StringAppendF(&result,
+ "name = %s ",
+ name.c_str());
+ base::StringAppendF(&result,
+ "active = %s ",
+ active ? "true" : "false");
+
+ return result;
+}
+
+} // namespace chromeos
diff --git a/chromeos/dbus/audio_node.h b/chromeos/dbus/audio_node.h
new file mode 100644
index 0000000..8e0f520
--- /dev/null
+++ b/chromeos/dbus/audio_node.h
@@ -0,0 +1,32 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_DBUS_AUDIO_NODE_H_
+#define CHROMEOS_DBUS_AUDIO_NODE_H_
+
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "chromeos/chromeos_export.h"
+
+namespace chromeos {
+
+struct CHROMEOS_EXPORT AudioNode {
+ bool is_input;
+ uint64 id;
+ std::string device_name;
+ std::string type;
+ std::string name;
+ bool active;
+
+ AudioNode();
+ std::string ToString() const;
+};
+
+typedef std::vector<AudioNode> AudioNodeList;
+
+} // namespace chromeos
+
+#endif // CHROMEOS_DBUS_AUDIO_NODE_H_
diff --git a/chromeos/dbus/cras_audio_client.cc b/chromeos/dbus/cras_audio_client.cc
index 6de3001..bffa4d40 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 {}
diff --git a/chromeos/dbus/cras_audio_client.h b/chromeos/dbus/cras_audio_client.h
index 969bfb0..cf12fa2 100644
--- a/chromeos/dbus/cras_audio_client.h
+++ b/chromeos/dbus/cras_audio_client.h
@@ -8,6 +8,7 @@
#include "base/callback.h"
#include "base/observer_list.h"
#include "chromeos/chromeos_export.h"
+#include "chromeos/dbus/audio_node.h"
#include "chromeos/dbus/dbus_client_implementation_type.h"
#include "chromeos/dbus/volume_state.h"
@@ -45,13 +46,22 @@ class CHROMEOS_EXPORT CrasAudioClient {
virtual bool HasObserver(Observer* observer) = 0;
// GetVolumeStateCallback is used for GetVolumeState method. It receives
- // 1 argument, |volume_state| which containing both input and output volume
- // state data.
- typedef base::Callback<void(const VolumeState&)> GetVolumeStateCallback;
+ // 2 arguments, |volume_state| which containing both input and output volume
+ // state data, and |success| which indicates whether or not the request
+ // succeeded.
+ typedef base::Callback<void(const VolumeState&, bool)> GetVolumeStateCallback;
+
+ // GetNodesCallback is used for GetNodes method. It receives 2 arguments,
+ // |audio_nodes| which containing a list of audio nodes data and
+ // |success| which indicates whether or not the request succeeded.
+ typedef base::Callback<void(const AudioNodeList&, bool)> GetNodesCallback;
// Gets the volume state, asynchronously.
virtual void GetVolumeState(const GetVolumeStateCallback& callback) = 0;
+ // Gets an array of audio input and output nodes.
+ virtual void GetNodes(const GetNodesCallback& callback) = 0;
+
// Sets output volume to |volume|, in the range of [0, 100].
virtual void SetOutputVolume(int32 volume) = 0;
diff --git a/chromeos/dbus/mock_cras_audio_client.h b/chromeos/dbus/mock_cras_audio_client.h
index 25e6a24..2c4b92e 100644
--- a/chromeos/dbus/mock_cras_audio_client.h
+++ b/chromeos/dbus/mock_cras_audio_client.h
@@ -19,6 +19,7 @@ class MockCrasAudioClient : public CrasAudioClient {
MOCK_METHOD1(RemoveObserver, void(Observer*));
MOCK_METHOD1(HasObserver, bool(Observer*));
MOCK_METHOD1(GetVolumeState, void(const GetVolumeStateCallback&));
+ MOCK_METHOD1(GetNodes, void(const GetNodesCallback&));
MOCK_METHOD1(SetOutputVolume, void(int32));
MOCK_METHOD1(SetOutputMute, void(bool));
MOCK_METHOD1(SetInputGain, void(int32));