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 {
// recording.
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
// of the audio stream to be created.
//
......
......@@ -309,7 +309,13 @@ void AudioManagerBase::ShowAudioInputSettings() {
}
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) {
......
......@@ -47,7 +47,10 @@ class MEDIA_EXPORT AudioManagerBase : public AudioManager {
virtual void ShowAudioInputSettings() OVERRIDE;
virtual void GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) OVERRIDE;
AudioDeviceNames* device_names) OVERRIDE;
virtual void GetAudioOutputDeviceNames(
AudioDeviceNames* device_names) OVERRIDE;
virtual AudioOutputStream* MakeAudioOutputStream(
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(
media::AudioDeviceNames* device_names) {
}
void MockAudioManager::GetAudioOutputDeviceNames(
media::AudioDeviceNames* device_names) {
}
media::AudioOutputStream* MockAudioManager::MakeAudioOutputStream(
const media::AudioParameters& params,
const std::string& device_id,
......
......@@ -34,6 +34,9 @@ class MockAudioManager : public media::AudioManager {
virtual void GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) OVERRIDE;
virtual void GetAudioOutputDeviceNames(
media::AudioDeviceNames* device_names) OVERRIDE;
virtual media::AudioOutputStream* MakeAudioOutputStream(
const media::AudioParameters& params,
const std::string& device_id,
......
......@@ -66,19 +66,13 @@ AudioManagerPulse::~AudioManagerPulse() {
// Implementation of AudioManager.
bool AudioManagerPulse::HasAudioOutputDevices() {
DCHECK(input_mainloop_);
DCHECK(input_context_);
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);
AudioDeviceNames devices;
GetAudioOutputDeviceNames(&devices);
return !devices.empty();
}
bool AudioManagerPulse::HasAudioInputDevices() {
media::AudioDeviceNames devices;
AudioDeviceNames devices;
GetAudioInputDeviceNames(&devices);
return !devices.empty();
}
......@@ -87,18 +81,24 @@ void AudioManagerPulse::ShowAudioInputSettings() {
AudioManagerLinux::ShowLinuxAudioInputSettings();
}
void AudioManagerPulse::GetAudioInputDeviceNames(
media::AudioDeviceNames* device_names) {
void AudioManagerPulse::GetAudioDeviceNames(
bool input, media::AudioDeviceNames* device_names) {
DCHECK(device_names->empty());
DCHECK(input_mainloop_);
DCHECK(input_context_);
AutoPulseLock auto_lock(input_mainloop_);
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);
} else {
operation = pa_context_get_sink_info_list(
input_context_, OutputDevicesInfoCallback, this);
}
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()) {
device_names->push_front(
AudioDeviceName(AudioManagerBase::kDefaultDeviceName,
......@@ -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(
const std::string& device_id) {
static const int kDefaultInputBufferSize = 1024;
......@@ -292,8 +302,8 @@ void AudioManagerPulse::InputDevicesInfoCallback(pa_context* context,
// Exclude the output devices.
if (info->monitor_of_sink == PA_INVALID_INDEX) {
manager->devices_->push_back(media::AudioDeviceName(info->description,
info->name));
manager->devices_->push_back(AudioDeviceName(info->description,
info->name));
}
}
......@@ -308,8 +318,8 @@ void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context,
return;
}
manager->devices_->push_back(media::AudioDeviceName(info->description,
info->name));
manager->devices_->push_back(AudioDeviceName(info->description,
info->name));
}
void AudioManagerPulse::SampleRateInfoCallback(pa_context* context,
......
......@@ -27,6 +27,8 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase {
virtual void ShowAudioInputSettings() OVERRIDE;
virtual void GetAudioInputDeviceNames(media::AudioDeviceNames* device_names)
OVERRIDE;
virtual void GetAudioOutputDeviceNames(media::AudioDeviceNames* device_names)
OVERRIDE;
virtual AudioParameters GetInputStreamParameters(
const std::string& device_id) OVERRIDE;
......@@ -51,6 +53,8 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase {
bool Init();
void DestroyPulse();
void GetAudioDeviceNames(bool input, media::AudioDeviceNames* device_names);
// Callback to get the devices' info like names, used by GetInputDevices().
static void InputDevicesInfoCallback(pa_context* context,
const pa_source_info* info,
......
......@@ -916,6 +916,7 @@
'audio/audio_input_unittest.cc',
'audio/audio_input_volume_unittest.cc',
'audio/audio_low_latency_input_output_unittest.cc',
'audio/audio_manager_unittest.cc',
'audio/audio_output_controller_unittest.cc',
'audio/audio_output_device_unittest.cc',
'audio/audio_output_proxy_unittest.cc',
......@@ -1041,6 +1042,11 @@
'base/media_file_checker_unittest.cc',
],
}],
['use_pulseaudio==1', {
'defines': [
'USE_PULSEAUDIO',
],
}],
['os_posix==1 and OS!="mac" and OS!="ios"', {
'conditions': [
['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