summaryrefslogtreecommitdiffstats
path: root/media/audio/pulse
diff options
context:
space:
mode:
authorxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-01 03:12:09 +0000
committerxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-01 03:12:09 +0000
commit4a3b96896eecdc7d7a11fc767306ca375c558742 (patch)
treec24764d354ed021bd93287c339420a2c2212ca22 /media/audio/pulse
parentfe4d04c860556f92ae2e531946eb2d6cbe507ea6 (diff)
downloadchromium_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.cc41
-rw-r--r--media/audio/pulse/audio_manager_pulse.h9
-rw-r--r--media/audio/pulse/pulse.sigs3
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);