Commit a22cc239 authored by Dale Curtis's avatar Dale Curtis Committed by Commit Bot

[pulse] Don't enumerate input devices when retrieving output info.

4519c32f landed around May when we
started seeing flakiness with many Linux audio tests. This splits
out the addition such that only the input path should hang if it
turns out to be the root cause.

BUG=986021
R=ossu

Change-Id: I103814bf4c244585fd4678d96ecf6f947727d3de
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1807558
Auto-Submit: Dale Curtis <dalecurtis@chromium.org>
Commit-Queue: Oskar Sundbom <ossu@chromium.org>
Reviewed-by: default avatarOskar Sundbom <ossu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#697143}
parent c85791a3
......@@ -104,11 +104,15 @@ void AudioManagerPulse::GetAudioOutputDeviceNames(
AudioParameters AudioManagerPulse::GetInputStreamParameters(
const std::string& device_id) {
int user_buffer_size = GetUserBufferSize();
int buffer_size = user_buffer_size ?
user_buffer_size : kDefaultInputBufferSize;
int buffer_size =
user_buffer_size ? user_buffer_size : kDefaultInputBufferSize;
// TODO(xians): add support for querying native channel layout for pulse.
UpdateNativeAudioHardwareInfo();
auto* operation = pa_context_get_source_info_by_name(
input_context_, default_source_name_.c_str(), DefaultSourceInfoCallback,
this);
WaitForOperationCompletion(input_mainloop_, operation);
// We don't want to accidentally open a monitor device, so return invalid
// parameters for those.
if (device_id == AudioDeviceDescription::kDefaultDeviceId &&
......@@ -260,18 +264,19 @@ void AudioManagerPulse::UpdateNativeAudioHardwareInfo() {
pa_operation* operation = pa_context_get_server_info(
input_context_, AudioHardwareInfoCallback, this);
WaitForOperationCompletion(input_mainloop_, operation);
operation = pa_context_get_source_info_by_name(
input_context_, default_source_name_.c_str(), DefaultSourceInfoCallback,
this);
WaitForOperationCompletion(input_mainloop_, operation);
// Be careful about adding OS calls to this method.
// GetPreferredOutputStreamParameters() calls this method on a critical path.
// If the OS calls hang they will hang all device authorizations.
}
void AudioManagerPulse::InputDevicesInfoCallback(pa_context* context,
const pa_source_info* info,
int error, void *user_data) {
int eol,
void* user_data) {
AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data);
if (error) {
if (eol) {
// Signal the pulse object that it is done.
pa_threaded_mainloop_signal(manager->input_mainloop_, 0);
return;
......@@ -297,17 +302,17 @@ void AudioManagerPulse::InputDevicesInfoCallback(pa_context* context,
void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context,
const pa_sink_info* info,
int error, void *user_data) {
int eol,
void* user_data) {
AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data);
if (error) {
if (eol) {
// Signal the pulse object that it is done.
pa_threaded_mainloop_signal(manager->input_mainloop_, 0);
return;
}
manager->devices_->push_back(AudioDeviceName(info->description,
info->name));
manager->devices_->push_back(AudioDeviceName(info->description, info->name));
}
void AudioManagerPulse::AudioHardwareInfoCallback(pa_context* context,
......
......@@ -69,10 +69,12 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase {
// Callback to get the devices' info like names, used by GetInputDevices().
static void InputDevicesInfoCallback(pa_context* context,
const pa_source_info* info,
int error, void* user_data);
int eol,
void* user_data);
static void OutputDevicesInfoCallback(pa_context* context,
const pa_sink_info* info,
int error, void* user_data);
int eol,
void* user_data);
// Callback to get the native sample rate of PulseAudio, used by
// UpdateNativeAudioHardwareInfo().
......
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