diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/audio/linux/alsa_wrapper.cc | 70 | ||||
-rw-r--r-- | media/audio/linux/alsa_wrapper.h | 6 |
2 files changed, 72 insertions, 4 deletions
diff --git a/media/audio/linux/alsa_wrapper.cc b/media/audio/linux/alsa_wrapper.cc index 8270430..563bccb 100644 --- a/media/audio/linux/alsa_wrapper.cc +++ b/media/audio/linux/alsa_wrapper.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -65,12 +65,76 @@ const char* AlsaWrapper::PcmName(snd_pcm_t* handle) { return snd_pcm_name(handle); } +int AlsaWrapper::ConfigureHwParams(snd_pcm_t* handle, + snd_pcm_hw_params_t* hw_params, + snd_pcm_format_t format, + snd_pcm_access_t access, + unsigned int channels, + unsigned int rate, + int soft_resample, + unsigned int latency) { + int err = 0; + if ((err = snd_pcm_hw_params_any(handle, hw_params)) < 0) + return err; + + if ((err = snd_pcm_hw_params_set_rate_resample(handle, hw_params, + soft_resample)) < 0) { + return err; + } + + if ((err = snd_pcm_hw_params_set_format(handle, hw_params, format)) < 0) + return err; + + int dir = 0; + unsigned new_rate = rate; + if ((err = snd_pcm_hw_params_set_rate_near(handle, hw_params, + &new_rate, &dir)) < 0) { + return err; + } + + if ((err = snd_pcm_hw_params_set_access(handle, hw_params, access)) < 0) + return err; + + if ((err = snd_pcm_hw_params_set_channels(handle, hw_params, channels)) < 0) + return err; + + unsigned buffer_time = latency; + if (buffer_time == 0) { + if ((err = snd_pcm_hw_params_get_buffer_time_max(hw_params, + &buffer_time, 0)) < 0) { + return err; + } + if (buffer_time > 500000) + buffer_time = 500000; + } + + unsigned period_time = buffer_time / 4; + if ((err = snd_pcm_hw_params_set_period_time_near(handle, hw_params, + &period_time, 0)) < 0) { + return err; + } + + err = snd_pcm_hw_params_set_buffer_time_near(handle, hw_params, + &buffer_time, 0); + return err; +} + int AlsaWrapper::PcmSetParams(snd_pcm_t* handle, snd_pcm_format_t format, snd_pcm_access_t access, unsigned int channels, unsigned int rate, int soft_resample, unsigned int latency) { - return snd_pcm_set_params(handle, format, access, channels, rate, - soft_resample, latency); + int err = 0; + snd_pcm_hw_params_t *hw_params; + if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) + return err; + + if ((err = ConfigureHwParams(handle, hw_params, format, access, channels, + rate, soft_resample, latency)) >= 0) { + err = snd_pcm_hw_params(handle, hw_params); + } + + snd_pcm_hw_params_free(hw_params); + return err; } int AlsaWrapper::PcmGetParams(snd_pcm_t* handle, snd_pcm_uframes_t* buffer_size, diff --git a/media/audio/linux/alsa_wrapper.h b/media/audio/linux/alsa_wrapper.h index 88bdb5a..1fe1992 100644 --- a/media/audio/linux/alsa_wrapper.h +++ b/media/audio/linux/alsa_wrapper.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // @@ -46,5 +46,9 @@ class AlsaWrapper { virtual const char* StrError(int errnum); private: + int ConfigureHwParams(snd_pcm_t* handle, snd_pcm_hw_params_t* hw_params, + snd_pcm_format_t format, snd_pcm_access_t access, + unsigned int channels, unsigned int rate, + int soft_resample, unsigned int latency); DISALLOW_COPY_AND_ASSIGN(AlsaWrapper); }; |