Commit 19c6a075 authored by dalecurtis's avatar dalecurtis Committed by Commit bot

Query native channel count in preferred parameters.

w/o this, WebAudio will always think there are only two channels
available. Untested since I don't have a 5.1 setup on Linux.

BUG=646435
TEST=verified that 2 channels are reported locally.

Review-Url: https://codereview.chromium.org/2345813002
Cr-Commit-Position: refs/heads/master@{#419052}
parent 2d6dbcaa
...@@ -58,7 +58,8 @@ AudioManagerPulse::AudioManagerPulse( ...@@ -58,7 +58,8 @@ AudioManagerPulse::AudioManagerPulse(
input_mainloop_(NULL), input_mainloop_(NULL),
input_context_(NULL), input_context_(NULL),
devices_(NULL), devices_(NULL),
native_input_sample_rate_(0) { native_input_sample_rate_(0),
native_channel_count_(0) {
SetMaxOutputStreamsAllowed(kMaxOutputStreams); SetMaxOutputStreamsAllowed(kMaxOutputStreams);
} }
...@@ -136,8 +137,9 @@ AudioParameters AudioManagerPulse::GetInputStreamParameters( ...@@ -136,8 +137,9 @@ AudioParameters AudioManagerPulse::GetInputStreamParameters(
user_buffer_size : kDefaultInputBufferSize; user_buffer_size : kDefaultInputBufferSize;
// TODO(xians): add support for querying native channel layout for pulse. // TODO(xians): add support for querying native channel layout for pulse.
UpdateNativeAudioHardwareInfo();
return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
CHANNEL_LAYOUT_STEREO, GetNativeSampleRate(), 16, CHANNEL_LAYOUT_STEREO, native_input_sample_rate_, 16,
buffer_size); buffer_size);
} }
...@@ -180,10 +182,15 @@ AudioParameters AudioManagerPulse::GetPreferredOutputStreamParameters( ...@@ -180,10 +182,15 @@ AudioParameters AudioManagerPulse::GetPreferredOutputStreamParameters(
// TODO(tommi): Support |output_device_id|. // TODO(tommi): Support |output_device_id|.
VLOG_IF(0, !output_device_id.empty()) << "Not implemented!"; VLOG_IF(0, !output_device_id.empty()) << "Not implemented!";
ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
int buffer_size = kMinimumOutputBufferSize; int buffer_size = kMinimumOutputBufferSize;
int bits_per_sample = 16; int bits_per_sample = 16;
int sample_rate = GetNativeSampleRate();
// Query native parameters where applicable; Pulse does not require these to
// be respected though, so prefer the input parameters for channel count.
UpdateNativeAudioHardwareInfo();
int sample_rate = native_input_sample_rate_;
ChannelLayout channel_layout = GuessChannelLayout(native_channel_count_);
if (input_params.IsValid()) { if (input_params.IsValid()) {
bits_per_sample = input_params.bits_per_sample(); bits_per_sample = input_params.bits_per_sample();
channel_layout = input_params.channel_layout(); channel_layout = input_params.channel_layout();
...@@ -213,15 +220,13 @@ AudioInputStream* AudioManagerPulse::MakeInputStream( ...@@ -213,15 +220,13 @@ AudioInputStream* AudioManagerPulse::MakeInputStream(
input_mainloop_, input_context_); input_mainloop_, input_context_);
} }
int AudioManagerPulse::GetNativeSampleRate() { void AudioManagerPulse::UpdateNativeAudioHardwareInfo() {
DCHECK(input_mainloop_); DCHECK(input_mainloop_);
DCHECK(input_context_); DCHECK(input_context_);
AutoPulseLock auto_lock(input_mainloop_); AutoPulseLock auto_lock(input_mainloop_);
pa_operation* operation = pa_context_get_server_info( pa_operation* operation = pa_context_get_server_info(
input_context_, SampleRateInfoCallback, this); input_context_, AudioHardwareInfoCallback, this);
WaitForOperationCompletion(input_mainloop_, operation); WaitForOperationCompletion(input_mainloop_, operation);
return native_input_sample_rate_;
} }
bool AudioManagerPulse::InitPulse() { bool AudioManagerPulse::InitPulse() {
...@@ -336,12 +341,13 @@ void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context, ...@@ -336,12 +341,13 @@ void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context,
info->name)); info->name));
} }
void AudioManagerPulse::SampleRateInfoCallback(pa_context* context, void AudioManagerPulse::AudioHardwareInfoCallback(pa_context* context,
const pa_server_info* info, const pa_server_info* info,
void* user_data) { void* user_data) {
AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data); AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data);
manager->native_input_sample_rate_ = info->sample_spec.rate; manager->native_input_sample_rate_ = info->sample_spec.rate;
manager->native_channel_count_ = info->sample_spec.channels;
pa_threaded_mainloop_signal(manager->input_mainloop_, 0); pa_threaded_mainloop_signal(manager->input_mainloop_, 0);
} }
......
...@@ -72,10 +72,10 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase { ...@@ -72,10 +72,10 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase {
int error, void* user_data); int error, void* user_data);
// Callback to get the native sample rate of PulseAudio, used by // Callback to get the native sample rate of PulseAudio, used by
// GetNativeSampleRate(). // UpdateNativeAudioHardwareInfo().
static void SampleRateInfoCallback(pa_context* context, static void AudioHardwareInfoCallback(pa_context* context,
const pa_server_info* info, const pa_server_info* info,
void* user_data); void* user_data);
// Called by MakeLinearOutputStream and MakeLowLatencyOutputStream. // Called by MakeLinearOutputStream and MakeLowLatencyOutputStream.
AudioOutputStream* MakeOutputStream(const AudioParameters& params, AudioOutputStream* MakeOutputStream(const AudioParameters& params,
...@@ -85,13 +85,14 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase { ...@@ -85,13 +85,14 @@ class MEDIA_EXPORT AudioManagerPulse : public AudioManagerBase {
AudioInputStream* MakeInputStream(const AudioParameters& params, AudioInputStream* MakeInputStream(const AudioParameters& params,
const std::string& device_id); const std::string& device_id);
// Gets the native sample rate of Pulse. // Updates |native_input_sample_rate_| and |native_channel_count_|.
int GetNativeSampleRate(); void UpdateNativeAudioHardwareInfo();
pa_threaded_mainloop* input_mainloop_; pa_threaded_mainloop* input_mainloop_;
pa_context* input_context_; pa_context* input_context_;
AudioDeviceNames* devices_; AudioDeviceNames* devices_;
int native_input_sample_rate_; int native_input_sample_rate_;
int native_channel_count_;
DISALLOW_COPY_AND_ASSIGN(AudioManagerPulse); DISALLOW_COPY_AND_ASSIGN(AudioManagerPulse);
}; };
......
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