diff options
author | joi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-05 19:02:40 +0000 |
---|---|---|
committer | joi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-05 19:02:40 +0000 |
commit | 9b122748bd68eebad8c036a1af98e7ecae6bbc4f (patch) | |
tree | 5a16b9841cac9096dfb434a01a1c766a4a33aaa0 /media | |
parent | e1c395febf7bdaa0e14a5c46e9f8b199d67eba24 (diff) | |
download | chromium_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.h | 4 | ||||
-rw-r--r-- | media/audio/audio_manager_base.cc | 8 | ||||
-rw-r--r-- | media/audio/audio_manager_base.h | 5 | ||||
-rw-r--r-- | media/audio/audio_manager_unittest.cc | 37 | ||||
-rw-r--r-- | media/audio/mock_audio_manager.cc | 4 | ||||
-rw-r--r-- | media/audio/mock_audio_manager.h | 3 | ||||
-rw-r--r-- | media/audio/pulse/audio_manager_pulse.cc | 44 | ||||
-rw-r--r-- | media/audio/pulse/audio_manager_pulse.h | 4 | ||||
-rw-r--r-- | media/media.gyp | 6 |
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', { |