Commit 10dd6183 authored by jennyz@chromium.org's avatar jennyz@chromium.org

Add ability to active multiple devices via the audio API.

Add the ability to the audio API to activate more than one audio device at a
time. This is currently accomplished via a hack and when getting device info
via audio.getInfo, only one device will show up as active.

This will allow us to active multiple microphones and multiple speakers though.

I've also made couple of changes to OWNERS files so we don't need to keep
chasing rubberstamps for audio changes.

This is patched from rkc@'s original cl:
https://codereview.chromium.org/460113003/

BUG=397664

TBR=asargent

Review URL: https://codereview.chromium.org/478493002

Cr-Commit-Position: refs/heads/master@{#289951}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289951 0039d316-1c4b-4281-b951-d872f2087c98
parent 3c41f25a
......@@ -9,6 +9,8 @@
#include "base/strings/string_number_conversions.h"
#include "chromeos/audio/audio_device.h"
#include "chromeos/audio/cras_audio_handler.h"
#include "chromeos/dbus/cras_audio_client.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "content/public/browser/browser_thread.h"
using content::BrowserThread;
......@@ -135,22 +137,63 @@ void AudioServiceImpl::SetActiveDevices(const DeviceIdList& device_list) {
if (!cras_audio_handler_)
return;
// De-activate all the nodes with RemoveActive{Input/Output}Node API. This is
// kind of hacky, but we don't know which set of nodes are active from
// CrasAudioHandler.
// TODO(rkc): Fix it in http://crbug.com/402072.
chromeos::AudioDeviceList devices;
cras_audio_handler_->GetAudioDevices(&devices);
for (size_t i = 0; i < devices.size(); ++i) {
if (devices[i].is_input) {
chromeos::DBusThreadManager::Get()
->GetCrasAudioClient()
->RemoveActiveInputNode(devices[i].id);
} else { // output
chromeos::DBusThreadManager::Get()
->GetCrasAudioClient()
->RemoveActiveOutputNode(devices[i].id);
}
}
bool input_device_set = false;
bool output_device_set = false;
std::string active_input_node_ids, active_output_node_ids;
for (size_t i = 0; i < device_list.size(); ++i) {
chromeos::AudioDevice device;
bool found = FindDevice(GetIdFromStr(device_list[i]), &device);
if (found) {
if (device.is_input && !input_device_set) {
cras_audio_handler_->SwitchToDevice(device);
input_device_set = true;
} else if (!device.is_input && !output_device_set) {
cras_audio_handler_->SwitchToDevice(device);
output_device_set = true;
if (device.is_input) {
if (!input_device_set) {
cras_audio_handler_->SwitchToDevice(device);
input_device_set = true;
} else {
active_input_node_ids.push_back(device.id);
}
} else { // output device
if (!output_device_set) {
cras_audio_handler_->SwitchToDevice(device);
output_device_set = true;
} else {
active_output_node_ids.push_back(device.id);
}
}
}
}
// Once we have set our devices to active and all the inactive ones have been
// set correctly to inactive, go through our active devices again and set
// them to active using the AddActiveNode API.
// TODO(rkc):Fix this ugly hack in http://crbug.com/402072.
for (size_t i = 0; i < active_input_node_ids.size(); ++i) {
chromeos::DBusThreadManager::Get()
->GetCrasAudioClient()
->AddActiveInputNode(active_input_node_ids[i]);
}
for (size_t i = 0; i < active_output_node_ids.size(); ++i) {
chromeos::DBusThreadManager::Get()
->GetCrasAudioClient()
->AddActiveOutputNode(active_output_node_ids[i]);
}
}
bool AudioServiceImpl::SetDeviceProperties(const std::string& device_id,
......
......@@ -3,3 +3,6 @@ per-file *bluetooth*=armansito@chromium.org
per-file *nfc*=keybuk@chromium.org
per-file *nfc*=armansito@chromium.org
per-file *cryptohome*=dkrahn@chromium.org
per-file *audio*=rkc@chromium.org
per-file *audio*=jennyz@chromium.org
per-file *audio*=hychao@chromium.org
......@@ -154,6 +154,26 @@ class CrasAudioClientImpl : public CrasAudioClient {
dbus::ObjectProxy::EmptyResponseCallback());
}
virtual void AddActiveOutputNode(uint64 node_id) OVERRIDE {
dbus::MethodCall method_call(cras::kCrasControlInterface,
cras::kAddActiveOutputNode);
dbus::MessageWriter writer(&method_call);
writer.AppendUint64(node_id);
cras_proxy_->CallMethod(&method_call,
dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
dbus::ObjectProxy::EmptyResponseCallback());
}
virtual void RemoveActiveOutputNode(uint64 node_id) OVERRIDE {
dbus::MethodCall method_call(cras::kCrasControlInterface,
cras::kRemoveActiveOutputNode);
dbus::MessageWriter writer(&method_call);
writer.AppendUint64(node_id);
cras_proxy_->CallMethod(&method_call,
dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
dbus::ObjectProxy::EmptyResponseCallback());
}
protected:
virtual void Init(dbus::Bus* bus) OVERRIDE {
cras_proxy_ = bus->GetObjectProxy(cras::kCrasServiceName,
......
......@@ -105,6 +105,16 @@ class CHROMEOS_EXPORT CrasAudioClient : public DBusClient {
// removing an active input node added by AddActiveInputNode.
virtual void RemoveActiveInputNode(uint64 node_id) = 0;
// Adds input node |node_id| to the active outputs list. This is used to add
// an additional active output node besides the one set by SetActiveInputNode.
// Note that this action will not trigger an ActiveOutputNodeChanged event
// and nothing will happen if the |node_id| has already been set as active.
virtual void AddActiveOutputNode(uint64 node_id) = 0;
// Removes output node |node_id| from the active output list. This is used for
// removing an active output node added by AddActiveOutputNode.
virtual void RemoveActiveOutputNode(uint64 node_id) = 0;
// Creates the instance.
static CrasAudioClient* Create();
......
......@@ -137,9 +137,31 @@ void CrasAudioClientStubImpl::SetActiveInputNode(uint64 node_id) {
}
void CrasAudioClientStubImpl::AddActiveInputNode(uint64 node_id) {
for (size_t i = 0; i < node_list_.size(); ++i) {
if (node_list_[i].id == node_id)
node_list_[i].active = true;
}
}
void CrasAudioClientStubImpl::RemoveActiveInputNode(uint64 node_id) {
for (size_t i = 0; i < node_list_.size(); ++i) {
if (node_list_[i].id == node_id)
node_list_[i].active = false;
}
}
void CrasAudioClientStubImpl::AddActiveOutputNode(uint64 node_id) {
for (size_t i = 0; i < node_list_.size(); ++i) {
if (node_list_[i].id == node_id)
node_list_[i].active = true;
}
}
void CrasAudioClientStubImpl::RemoveActiveOutputNode(uint64 node_id) {
for (size_t i = 0; i < node_list_.size(); ++i) {
if (node_list_[i].id == node_id)
node_list_[i].active = false;
}
}
void CrasAudioClientStubImpl::SetAudioDevices(
......
......@@ -33,6 +33,8 @@ class CrasAudioClientStubImpl : public CrasAudioClient {
virtual void SetActiveInputNode(uint64 node_id) OVERRIDE;
virtual void AddActiveInputNode(uint64 node_id) OVERRIDE;
virtual void RemoveActiveInputNode(uint64 node_id) OVERRIDE;
virtual void AddActiveOutputNode(uint64 node_id) OVERRIDE;
virtual void RemoveActiveOutputNode(uint64 node_id) OVERRIDE;
protected:
// Helper functions for testing
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment