| Index: media/audio/pulse/audio_manager_pulse.cc
|
| diff --git a/media/audio/pulse/audio_manager_pulse.cc b/media/audio/pulse/audio_manager_pulse.cc
|
| index 398826ae1c360a03dcaebfcfea59e8be8e592adb..afa70640d4d367a11ce4afa425f8dc221a435984 100644
|
| --- a/media/audio/pulse/audio_manager_pulse.cc
|
| +++ b/media/audio/pulse/audio_manager_pulse.cc
|
| @@ -58,7 +58,8 @@ AudioManagerPulse::AudioManagerPulse(
|
| input_mainloop_(NULL),
|
| input_context_(NULL),
|
| devices_(NULL),
|
| - native_input_sample_rate_(0) {
|
| + native_input_sample_rate_(0),
|
| + native_channel_count_(0) {
|
| SetMaxOutputStreamsAllowed(kMaxOutputStreams);
|
| }
|
|
|
| @@ -136,8 +137,9 @@ AudioParameters AudioManagerPulse::GetInputStreamParameters(
|
| user_buffer_size : kDefaultInputBufferSize;
|
|
|
| // TODO(xians): add support for querying native channel layout for pulse.
|
| + UpdateNativeAudioHardwareInfo();
|
| return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
|
| - CHANNEL_LAYOUT_STEREO, GetNativeSampleRate(), 16,
|
| + CHANNEL_LAYOUT_STEREO, native_input_sample_rate_, 16,
|
| buffer_size);
|
| }
|
|
|
| @@ -180,10 +182,15 @@ AudioParameters AudioManagerPulse::GetPreferredOutputStreamParameters(
|
| // TODO(tommi): Support |output_device_id|.
|
| VLOG_IF(0, !output_device_id.empty()) << "Not implemented!";
|
|
|
| - ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
|
| int buffer_size = kMinimumOutputBufferSize;
|
| 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()) {
|
| bits_per_sample = input_params.bits_per_sample();
|
| channel_layout = input_params.channel_layout();
|
| @@ -213,15 +220,13 @@ AudioInputStream* AudioManagerPulse::MakeInputStream(
|
| input_mainloop_, input_context_);
|
| }
|
|
|
| -int AudioManagerPulse::GetNativeSampleRate() {
|
| +void AudioManagerPulse::UpdateNativeAudioHardwareInfo() {
|
| DCHECK(input_mainloop_);
|
| DCHECK(input_context_);
|
| AutoPulseLock auto_lock(input_mainloop_);
|
| pa_operation* operation = pa_context_get_server_info(
|
| - input_context_, SampleRateInfoCallback, this);
|
| + input_context_, AudioHardwareInfoCallback, this);
|
| WaitForOperationCompletion(input_mainloop_, operation);
|
| -
|
| - return native_input_sample_rate_;
|
| }
|
|
|
| bool AudioManagerPulse::InitPulse() {
|
| @@ -336,12 +341,13 @@ void AudioManagerPulse::OutputDevicesInfoCallback(pa_context* context,
|
| info->name));
|
| }
|
|
|
| -void AudioManagerPulse::SampleRateInfoCallback(pa_context* context,
|
| - const pa_server_info* info,
|
| - void* user_data) {
|
| +void AudioManagerPulse::AudioHardwareInfoCallback(pa_context* context,
|
| + const pa_server_info* info,
|
| + void* user_data) {
|
| AudioManagerPulse* manager = reinterpret_cast<AudioManagerPulse*>(user_data);
|
|
|
| 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);
|
| }
|
|
|
|
|