diff options
author | jennyz@chromium.org <jennyz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-10 22:47:27 +0000 |
---|---|---|
committer | jennyz@chromium.org <jennyz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-10 22:47:27 +0000 |
commit | 6504feda1e9b48198fe39f91f4fe2ac61848a3ab (patch) | |
tree | 05a8a40325c15864ee984dbe9f77e128a574e12b /chromeos | |
parent | 5ba236edb45748f60ce8e15de03577f9215688fa (diff) | |
download | chromium_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.gyp | 2 | ||||
-rw-r--r-- | chromeos/dbus/audio_node.cc | 42 | ||||
-rw-r--r-- | chromeos/dbus/audio_node.h | 32 | ||||
-rw-r--r-- | chromeos/dbus/cras_audio_client.cc | 117 | ||||
-rw-r--r-- | chromeos/dbus/cras_audio_client.h | 16 | ||||
-rw-r--r-- | chromeos/dbus/mock_cras_audio_client.h | 1 |
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)); |