From f1072e7629c56e6fdd9aab40be15fe9800789b1a Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 29 Nov 2013 15:43:39 +0100 Subject: [PATCH] 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. --- DOCS/man/en/ao.rst | 5 ++++- audio/out/ao_alsa.c | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/DOCS/man/en/ao.rst b/DOCS/man/en/ao.rst index 5b1d710b40..592d2de94f 100644 --- a/DOCS/man/en/ao.rst +++ b/DOCS/man/en/ao.rst @@ -23,10 +23,13 @@ in the list. Suboptions are optional and can mostly be omitted. Available audio output drivers are: ``alsa`` (Linux only) - ALSA 0.9/1.x audio output driver + ALSA audio output driver ``no-block`` Sets noblock-mode. + ``resample=yes`` + Enable ALSA resampling plugin. (This is disabled by default, because + some drivers report incorrect audio delay in some cases.) ``device=`` Sets the device name. For ac3 output via S/PDIF, use an "iec958" or "spdif" device, unless you really know how to set it correctly. 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),