Commit 9b122748 authored by joi@chromium.org's avatar joi@chromium.org

Add AudioManager::GetAudioOutputDeviceNames and implement for pulseaudio.

TBR=vrk@chromium.org
BUG=276894

Review URL: https://chromiumcodereview.appspot.com/23453022

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221484 0039d316-1c4b-4281-b951-d872f2087c98
parent e1c395fe
...@@ -64,6 +64,10 @@ class MEDIA_EXPORT AudioManager { ...@@ -64,6 +64,10 @@ class MEDIA_EXPORT AudioManager {
// recording. // recording.
virtual void GetAudioInputDeviceNames(AudioDeviceNames* device_names) = 0; virtual void GetAudioInputDeviceNames(AudioDeviceNames* device_names) = 0;
// Appends a list of available output devices to |device_names|,
// which must initially be empty.
virtual void GetAudioOutputDeviceNames(AudioDeviceNames* device_names) = 0;
// Factory for all the supported stream formats. |params| defines parameters // Factory for all the supported stream formats. |params| defines parameters
// of the audio stream to be created. // of the audio stream to be created.
// //
......
...@@ -309,7 +309,13 @@ void AudioManagerBase::ShowAudioInputSettings() { ...@@ -309,7 +309,13 @@ void AudioManagerBase::ShowAudioInputSettings() {
} }
void AudioManagerBase::GetAudioInputDeviceNames( void AudioManagerBase::GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) { AudioDeviceNames* device_names) {
}
void AudioManagerBase::GetAudioOutputDeviceNames(
AudioDeviceNames* device_names) {
// TODO(joi): Remove this and keep pure virtual once implemented everywhere.
NOTIMPLEMENTED();
} }
void AudioManagerBase::ReleaseOutputStream(AudioOutputStream* stream) { void AudioManagerBase::ReleaseOutputStream(AudioOutputStream* stream) {
......
...@@ -47,7 +47,10 @@ class MEDIA_EXPORT AudioManagerBase : public AudioManager { ...@@ -47,7 +47,10 @@ class MEDIA_EXPORT AudioManagerBase : public AudioManager {
virtual void ShowAudioInputSettings() OVERRIDE; virtual void ShowAudioInputSettings() OVERRIDE;
virtual void GetAudioInputDeviceNames( virtual void GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) OVERRIDE; AudioDeviceNames* device_names) OVERRIDE;
virtual void GetAudioOutputDeviceNames(
AudioDeviceNames* device_names) OVERRIDE;
virtual AudioOutputStream* MakeAudioOutputStream( virtual AudioOutputStream* MakeAudioOutputStream(
const AudioParameters& params, const AudioParameters& params,
......
// Copyright 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 "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "media/audio/audio_manager.h"
#include "testing/gtest/include/gtest/gtest.h"
#if defined(USE_PULSEAUDIO)
#include "media/audio/pulse/audio_manager_pulse.h"
#endif
namespace media {
// TODO(joi): Remove guards once implemented for all platforms.
TEST(AudioManagerTest, GetAudioOutputDeviceNames) {
#if defined(USE_PULSEAUDIO)
scoped_ptr<AudioManager> audio_manager_pulse(AudioManagerPulse::Create());
if (!audio_manager_pulse)
return;
AudioDeviceNames device_names;
audio_manager_pulse->GetAudioOutputDeviceNames(&device_names);
VLOG(2) << "Got " << device_names.size() << " audio output devices.";
for (AudioDeviceNames::iterator it = device_names.begin();
it != device_names.end();
++it) {
EXPECT_FALSE(it->unique_id.empty());
EXPECT_FALSE(it->device_name.empty());
VLOG(2) << "Device ID(" << it->unique_id << "), label: " << it->device_name;
}
#endif // defined(USE_PULSEAUDIO)
}
} // namespace media
...@@ -36,6 +36,10 @@ void MockAudioManager::GetAudioInputDeviceNames( ...@@ -36,6 +36,10 @@ void MockAudioManager::GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) { media::AudioDeviceNames* device_names) {
} }
void MockAudioManager::GetAudioOutputDeviceNames(
media::AudioDeviceNames* device_names) {
}
media::AudioOutputStream* MockAudioManager::MakeAudioOutputStream( media::AudioOutputStream* MockAudioManager::MakeAudioOutputStream(
const media::AudioParameters& params, const media::AudioParameters& params,
const std::string& device_id, const std::string& device_id,
......
...@@ -34,6 +34,9 @@ class MockAudioManager : public media::AudioManager { ...@@ -34,6 +34,9 @@ class MockAudioManager : public media::AudioManager {
virtual void GetAudioInputDeviceNames( virtual void GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) OVERRIDE; media::AudioDeviceNames* device_names) OVERRIDE;
virtual void GetAudioOutputDeviceNames(
media::AudioDeviceNames* device_names) OVERRIDE;
virtual media::AudioOutputStream* MakeAudioOutputStream( virtual media::AudioOutputStream* MakeAudioOutputStream(
const media::AudioParameters& params, const media::AudioParameters& params,
const std::string& device_id, const std::string& device_id,
......
...@@ -66,19 +66,13 @@ AudioManagerPulse::~AudioManagerPulse() { ...@@ -66,19 +66,13 @@ AudioManagerPulse::~AudioManagerPulse() {
// Implementation of AudioManager. // Implementation of AudioManager.
bool AudioManagerPulse::HasAudioOutputDevices() { bool AudioManagerPulse::HasAudioOutputDevices() {
DCHECK(input_mainloop_); AudioDeviceNames devices;
DCHECK(input_context_); GetAudioOutputDeviceNames(&devices);
media::AudioDeviceNames devices;
AutoPulseLock auto_lock(input_mainloop_);
devices_ = &devices;
pa_operation* operation = pa_context_get_sink_info_list(
input_context_, OutputDevicesInfoCallback, this);
WaitForOperationCompletion(input_mainloop_, operation);
return !devices.empty(); return !devices.empty();
} }
bool AudioManagerPulse::HasAudioInputDevices() { bool AudioManagerPulse::HasAudioInputDevices() {
media::AudioDeviceNames devices; AudioDeviceNames devices;
GetAudioInputDeviceNames(&devices); GetAudioInputDeviceNames(&devices);
return !devices.empty(); return !devices.empty();
} }
...@@ -87,18 +81,24 @@ void AudioManagerPulse::ShowAudioInputSettings() { ...@@ -87,18 +81,24 @@ void AudioManagerPulse::ShowAudioInputSettings() {
AudioManagerLinux::ShowLinuxAudioInputSettings(); AudioManagerLinux::ShowLinuxAudioInputSettings();
} }
void AudioManagerPulse::GetAudioInputDeviceNames( void AudioManagerPulse::GetAudioDeviceNames(
media::AudioDeviceNames* device_names) { bool input, media::AudioDeviceNames* device_names) {
DCHECK(device_names->empty()); DCHECK(device_names->empty());
DCHECK(input_mainloop_); DCHECK(input_mainloop_);
DCHECK(input_context_); DCHECK(input_context_);
AutoPulseLock auto_lock(input_mainloop_); AutoPulseLock auto_lock(input_mainloop_);
devices_ = device_names; devices_ = device_names;
pa_operation* operation = pa_context_get_source_info_list( pa_operation* operation = NULL;
if (input) {
operation = pa_context_get_source_info_list(
input_context_, InputDevicesInfoCallback, this); input_context_, InputDevicesInfoCallback, this);
} else {
operation = pa_context_get_sink_info_list(
input_context_, OutputDevicesInfoCallback, this);
}
WaitForOperationCompletion(input_mainloop_, operation); WaitForOperationCompletion(input_mainloop_, operation);
// Append the default device on the top of the list if the list is not empty. // Prepend the default device if the list is not empty.
if (!device_names->empty()) { if (!device_names->empty()) {
device_names->push_front( device_names->push_front(
AudioDeviceName(AudioManagerBase::kDefaultDeviceName, AudioDeviceName(AudioManagerBase::kDefaultDeviceName,
...@@ -106,6 +106,16 @@ void AudioManagerPulse::GetAudioInputDeviceNames( ...@@ -106,6 +106,16 @@ void AudioManagerPulse::GetAudioInputDeviceNames(
} }
} }
void AudioManagerPulse::GetAudioInputDeviceNames(
AudioDeviceNames* device_names) {
GetAudioDeviceNames(true, device_names);
}
void AudioManagerPulse::GetAudioOutputDeviceNames(
AudioDeviceNames* device_names) {
GetAudioDeviceNames(false, device_names);
}
AudioParameters AudioManagerPulse::GetInputStreamParameters( AudioParameters AudioManagerPulse::GetInputStreamParameters(
const std::string& device_id) { const std::string& device_id) {
static const int kDefaultInputBufferSize = 1024; static const int kDefaultInputBufferSize = 1024;
...@@ -292,7 +302,7 @@ void AudioManagerPulse::InputDevicesInfoCallback(pa_context* context, ...@@ -292,7 +302,7 @@ void AudioManagerPulse::InputDevicesInfoCallback(pa_context* context,
// Exclude the output devices. // Exclude the output devices.
if (info->monitor_of_sink == PA_INVALID_INDEX) { if (info->monitor_of_sink == PA_INVALID_INDEX) {
manager->devices_->push_back(media::AudioDeviceName(info->description, manager->devices_->push_back(AudioDeviceName(info->description,
info->name)); info->name));
} }
} }
...@@ -308,7 +318,7 @@ void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context, ...@@ -308,7 +318,7 @@ void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context,
return; return;
} }
manager->devices_->push_back(media::AudioDeviceName(info->description, manager->devices_->push_back(AudioDeviceName(info->description,
info->name)); info->name));
} }
......
...@@ -27,6 +27,8 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase { ...@@ -27,6 +27,8 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase {
virtual void ShowAudioInputSettings() OVERRIDE; virtual void ShowAudioInputSettings() OVERRIDE;
virtual void GetAudioInputDeviceNames(media::AudioDeviceNames* device_names) virtual void GetAudioInputDeviceNames(media::AudioDeviceNames* device_names)
OVERRIDE; OVERRIDE;
virtual void GetAudioOutputDeviceNames(media::AudioDeviceNames* device_names)
OVERRIDE;
virtual AudioParameters GetInputStreamParameters( virtual AudioParameters GetInputStreamParameters(
const std::string& device_id) OVERRIDE; const std::string& device_id) OVERRIDE;
...@@ -51,6 +53,8 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase { ...@@ -51,6 +53,8 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase {
bool Init(); bool Init();
void DestroyPulse(); void DestroyPulse();
void GetAudioDeviceNames(bool input, media::AudioDeviceNames* device_names);
// Callback to get the devices' info like names, used by GetInputDevices(). // Callback to get the devices' info like names, used by GetInputDevices().
static void InputDevicesInfoCallback(pa_context* context, static void InputDevicesInfoCallback(pa_context* context,
const pa_source_info* info, const pa_source_info* info,
......
...@@ -916,6 +916,7 @@ ...@@ -916,6 +916,7 @@
'audio/audio_input_unittest.cc', 'audio/audio_input_unittest.cc',
'audio/audio_input_volume_unittest.cc', 'audio/audio_input_volume_unittest.cc',
'audio/audio_low_latency_input_output_unittest.cc', 'audio/audio_low_latency_input_output_unittest.cc',
'audio/audio_manager_unittest.cc',
'audio/audio_output_controller_unittest.cc', 'audio/audio_output_controller_unittest.cc',
'audio/audio_output_device_unittest.cc', 'audio/audio_output_device_unittest.cc',
'audio/audio_output_proxy_unittest.cc', 'audio/audio_output_proxy_unittest.cc',
...@@ -1041,6 +1042,11 @@ ...@@ -1041,6 +1042,11 @@
'base/media_file_checker_unittest.cc', 'base/media_file_checker_unittest.cc',
], ],
}], }],
['use_pulseaudio==1', {
'defines': [
'USE_PULSEAUDIO',
],
}],
['os_posix==1 and OS!="mac" and OS!="ios"', { ['os_posix==1 and OS!="mac" and OS!="ios"', {
'conditions': [ 'conditions': [
['linux_use_tcmalloc==1', { ['linux_use_tcmalloc==1', {
......
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