summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorjoi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-05 19:02:40 +0000
committerjoi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-05 19:02:40 +0000
commit9b122748bd68eebad8c036a1af98e7ecae6bbc4f (patch)
tree5a16b9841cac9096dfb434a01a1c766a4a33aaa0 /media
parente1c395febf7bdaa0e14a5c46e9f8b199d67eba24 (diff)
downloadchromium_src-9b122748bd68eebad8c036a1af98e7ecae6bbc4f.zip
chromium_src-9b122748bd68eebad8c036a1af98e7ecae6bbc4f.tar.gz
chromium_src-9b122748bd68eebad8c036a1af98e7ecae6bbc4f.tar.bz2
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
Diffstat (limited to 'media')
-rw-r--r--media/audio/audio_manager.h4
-rw-r--r--media/audio/audio_manager_base.cc8
-rw-r--r--media/audio/audio_manager_base.h5
-rw-r--r--media/audio/audio_manager_unittest.cc37
-rw-r--r--media/audio/mock_audio_manager.cc4
-rw-r--r--media/audio/mock_audio_manager.h3
-rw-r--r--media/audio/pulse/audio_manager_pulse.cc44
-rw-r--r--media/audio/pulse/audio_manager_pulse.h4
-rw-r--r--media/media.gyp6
9 files changed, 96 insertions, 19 deletions
diff --git a/media/audio/audio_manager.h b/media/audio/audio_manager.h
index 87c3f81..891d2a2 100644
--- a/media/audio/audio_manager.h
+++ b/media/audio/audio_manager.h
@@ -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.
//
diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc
index 675078b..e5f8333 100644
--- a/media/audio/audio_manager_base.cc
+++ b/media/audio/audio_manager_base.cc
@@ -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) {
diff --git a/media/audio/audio_manager_base.h b/media/audio/audio_manager_base.h
index cdb0685..15c1b24 100644
--- a/media/audio/audio_manager_base.h
+++ b/media/audio/audio_manager_base.h
@@ -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,
diff --git a/media/audio/audio_manager_unittest.cc b/media/audio/audio_manager_unittest.cc
new file mode 100644
index 0000000..5063d07
--- /dev/null
+++ b/media/audio/audio_manager_unittest.cc
@@ -0,0 +1,37 @@
+// 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
diff --git a/media/audio/mock_audio_manager.cc b/media/audio/mock_audio_manager.cc
index 0fd345f..2ab2b70 100644
--- a/media/audio/mock_audio_manager.cc
+++ b/media/audio/mock_audio_manager.cc
@@ -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,
diff --git a/media/audio/mock_audio_manager.h b/media/audio/mock_audio_manager.h
index de65af5..7bc30f5 100644
--- a/media/audio/mock_audio_manager.h
+++ b/media/audio/mock_audio_manager.h
@@ -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,
diff --git a/media/audio/pulse/audio_manager_pulse.cc b/media/audio/pulse/audio_manager_pulse.cc
index 47b603b..5c09f14 100644
--- a/media/audio/pulse/audio_manager_pulse.cc
+++ b/media/audio/pulse/audio_manager_pulse.cc
@@ -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,
diff --git a/media/audio/pulse/audio_manager_pulse.h b/media/audio/pulse/audio_manager_pulse.h
index f46f2be..8fc4310 100644
--- a/media/audio/pulse/audio_manager_pulse.h
+++ b/media/audio/pulse/audio_manager_pulse.h
@@ -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,
diff --git a/media/media.gyp b/media/media.gyp
index fca53ba..29f7c6d 100644
--- a/media/media.gyp
+++ b/media/media.gyp
@@ -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', {