diff options
-rw-r--r-- | DOCS/man/en/ao.rst | 5 | ||||
-rw-r--r-- | audio/out/ao_alsa.c | 9 |
2 files changed, 13 insertions, 1 deletions
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=<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), |