diff options
author | xians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-01 03:12:09 +0000 |
---|---|---|
committer | xians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-01 03:12:09 +0000 |
commit | 4a3b96896eecdc7d7a11fc767306ca375c558742 (patch) | |
tree | c24764d354ed021bd93287c339420a2c2212ca22 /media/audio/pulse | |
parent | fe4d04c860556f92ae2e531946eb2d6cbe507ea6 (diff) | |
download | chromium_src-4a3b96896eecdc7d7a11fc767306ca375c558742.zip chromium_src-4a3b96896eecdc7d7a11fc767306ca375c558742.tar.gz chromium_src-4a3b96896eecdc7d7a11fc767306ca375c558742.tar.bz2 |
Implement the HasAudioOutputDevices() and HasAudioInputDevices() for Pulse to make it correct for unittests.
Some of our bots are running pulse, and out AudioManagerPulse::HasAudioOutput/InputDevices() are hard coded to be true. This will fail some of our unittests since we are expecting a non-empty list of devices from our enumeration APIs.
This patch fixes the problem by implementing those two APIs instead of returning a hard-coded true.
BUG=263760
TEST=content_unittests --gtest_filter="*AudioInputDevice*"
Review URL: https://chromiumcodereview.appspot.com/21061003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214937 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/pulse')
-rw-r--r-- | media/audio/pulse/audio_manager_pulse.cc | 41 | ||||
-rw-r--r-- | media/audio/pulse/audio_manager_pulse.h | 9 | ||||
-rw-r--r-- | media/audio/pulse/pulse.sigs | 3 |
3 files changed, 40 insertions, 13 deletions
diff --git a/media/audio/pulse/audio_manager_pulse.cc b/media/audio/pulse/audio_manager_pulse.cc index 18effa6..dcdd328 100644 --- a/media/audio/pulse/audio_manager_pulse.cc +++ b/media/audio/pulse/audio_manager_pulse.cc @@ -66,13 +66,21 @@ AudioManagerPulse::~AudioManagerPulse() { // Implementation of AudioManager. bool AudioManagerPulse::HasAudioOutputDevices() { - // TODO(xians): implement this function. - return true; + 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); + return !devices.empty(); } bool AudioManagerPulse::HasAudioInputDevices() { - // TODO(xians): implement this function. - return true; + media::AudioDeviceNames devices; + GetAudioInputDeviceNames(&devices); + return !devices.empty(); } void AudioManagerPulse::ShowAudioInputSettings() { @@ -84,10 +92,10 @@ void AudioManagerPulse::GetAudioInputDeviceNames( DCHECK(device_names->empty()); DCHECK(input_mainloop_); DCHECK(input_context_); - devices_ = device_names; AutoPulseLock auto_lock(input_mainloop_); + devices_ = device_names; pa_operation* operation = pa_context_get_source_info_list( - input_context_, DevicesInfoCallback, this); + input_context_, InputDevicesInfoCallback, this); WaitForOperationCompletion(input_mainloop_, operation); // Append the default device on the top of the list if the list is not empty. @@ -265,9 +273,9 @@ void AudioManagerPulse::DestroyPulse() { input_mainloop_ = NULL; } -void AudioManagerPulse::DevicesInfoCallback(pa_context* context, - const pa_source_info* info, - int error, void *user_data) { +void AudioManagerPulse::InputDevicesInfoCallback(pa_context* context, + const pa_source_info* info, + int error, void *user_data) { AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data); if (error) { @@ -283,6 +291,21 @@ void AudioManagerPulse::DevicesInfoCallback(pa_context* context, } } +void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context, + const pa_sink_info* info, + int error, void *user_data) { + AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data); + + if (error) { + // Signal the pulse object that it is done. + pa_threaded_mainloop_signal(manager->input_mainloop_, 0); + return; + } + + manager->devices_->push_back(media::AudioDeviceName(info->description, + info->name)); +} + void AudioManagerPulse::SampleRateInfoCallback(pa_context* context, const pa_server_info* info, void* user_data) { diff --git a/media/audio/pulse/audio_manager_pulse.h b/media/audio/pulse/audio_manager_pulse.h index d5cb93e..6dfebae 100644 --- a/media/audio/pulse/audio_manager_pulse.h +++ b/media/audio/pulse/audio_manager_pulse.h @@ -50,9 +50,12 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase { void DestroyPulse(); // Callback to get the devices' info like names, used by GetInputDevices(). - static void DevicesInfoCallback(pa_context* context, - const pa_source_info* info, - int error, void* user_data); + static void InputDevicesInfoCallback(pa_context* context, + const pa_source_info* info, + int error, void* user_data); + static void OutputDevicesInfoCallback(pa_context* context, + const pa_sink_info* info, + int error, void* user_data); // Callback to get the native sample rate of PulseAudio, used by // GetNativeSampleRate(). diff --git a/media/audio/pulse/pulse.sigs b/media/audio/pulse/pulse.sigs index 667e6be..b5d927c 100644 --- a/media/audio/pulse/pulse.sigs +++ b/media/audio/pulse/pulse.sigs @@ -21,6 +21,7 @@ void pa_context_disconnect(pa_context* c); pa_operation* pa_context_get_server_info(pa_context* c, pa_server_info_cb_t cb, void* userdata); pa_operation* pa_context_get_source_info_by_index(pa_context* c, uint32_t idx, pa_source_info_cb_t cb, void* userdata); pa_operation* pa_context_get_source_info_list(pa_context* c, pa_source_info_cb_t cb, void* userdata); +pa_operation* pa_context_get_sink_info_list(pa_context* c, pa_sink_info_cb_t cb, void* userdata); pa_context_state_t pa_context_get_state(pa_context* c); pa_context* pa_context_new(pa_mainloop_api* mainloop, const char* name); pa_operation* pa_context_set_source_volume_by_index(pa_context* c, uint32_t idx, const pa_cvolume* volume, pa_context_success_cb_t cb, void* userdata); @@ -48,4 +49,4 @@ void pa_stream_set_write_callback(pa_stream *p, pa_stream_request_cb_t cb, void void pa_stream_unref(pa_stream* s); int pa_context_errno(pa_context *c); const char* pa_strerror(int error); -pa_cvolume* pa_cvolume_set(pa_cvolume* a, unsigned channels, pa_volume_t v);
\ No newline at end of file +pa_cvolume* pa_cvolume_set(pa_cvolume* a, unsigned channels, pa_volume_t v); |