diff options
author | wm4 <wm4@nowhere> | 2013-11-29 15:43:39 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-11-29 15:59:53 +0100 |
commit | f1072e7629c56e6fdd9aab40be15fe9800789b1a (patch) | |
tree | cbae465d7892b9bd5fbf4262c3ebf90bde18c4b8 /audio/out/ao_alsa.c | |
parent | 42714f9a998ecb7ec28a94178f1b547df9c34e54 (diff) | |
download | mpv-f1072e7629c56e6fdd9aab40be15fe9800789b1a.tar.bz2 mpv-f1072e7629c56e6fdd9aab40be15fe9800789b1a.tar.xz |
ao_alsa: disable ALSA resampling by default again
This partially reverts commit 7d152965. It turns out that at least some
ALSA drivers (at least snd-hda-intel) report incorrect audio delay with
non-native sample rates, even if the sample rate is only very slightly
different from the native one.
For example, 48000Hz is fine on my hda-intel system, while both 8000Hz
and 47999Hz lead to a delay off by 40ms (according to mpv's A/V
difference display), which suggests that something in ALSA is
calculating the delay using the wrong sample rate.
As an additional problem, with ALSA resampling enabled, using
48001Hz/float/2ch fails, while 49000Hz/float/2ch or 48001Hz/s16/2ch
work. With resampling disabled, all these cases work obviously, because
our own resampler doesn't just refuse any of these formats.
Since some people want to use the ALSA resampler (because it's highly
configurable, supports multiple backends, etc.), we still allow enabling
ALSA resampling with an ao_alsa suboption.
Diffstat (limited to 'audio/out/ao_alsa.c')
-rw-r--r-- | audio/out/ao_alsa.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c index 84add0a40c..2d256c7e8d 100644 --- a/audio/out/ao_alsa.c +++ b/audio/out/ao_alsa.c @@ -63,6 +63,7 @@ struct priv { char *cfg_mixer_device; char *cfg_mixer_name; int cfg_mixer_index; + int cfg_resample; }; #define BUFFER_TIME 500000 // 0.5 s @@ -475,6 +476,13 @@ static int init(struct ao *ao) mp_chmap_from_channels_alsa(&ao->channels, num_channels); } + // Some ALSA drivers have broken delay reporting, so disable the ALSA + // resampling plugin by default. + if (!p->cfg_resample) { + err = snd_pcm_hw_params_set_rate_resample(p->alsa, alsa_hwparams, 0); + CHECK_ALSA_ERROR("Unable to disable resampling"); + } + err = snd_pcm_hw_params_set_rate_near (p->alsa, alsa_hwparams, &ao->samplerate, NULL); CHECK_ALSA_ERROR("Unable to set samplerate-2"); @@ -743,6 +751,7 @@ const struct ao_driver audio_out_alsa = { .cfg_mixer_index = 0, }, .options = (const struct m_option[]) { + OPT_FLAG("resample", cfg_resample, 0), OPT_STRING("device", cfg_device, 0), OPT_FLAG("block", cfg_block, 0), OPT_STRING("mixer-device", cfg_mixer_device, 0), |