Mercurial > mplayer.hg
changeset 28633:28fe0787a67c
Work around a PulseAudio bug that causes MPlayer to hang after unpausing.
author | reimar |
---|---|
date | Thu, 19 Feb 2009 14:00:33 +0000 |
parents | 6e90a47a6aaf |
children | 480c7c73deba |
files | libao2/ao_pulse.c |
diffstat | 1 files changed, 18 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/libao2/ao_pulse.c Thu Feb 19 13:57:14 2009 +0000 +++ b/libao2/ao_pulse.c Thu Feb 19 14:00:33 2009 +0000 @@ -52,6 +52,8 @@ /** A temporary variable to store the current volume */ static pa_cvolume volume; +static int broken_pause; + LIBAO_EXTERN(pulse) #define GENERIC_ERR_MSG(ctx, str) \ @@ -138,6 +140,7 @@ char *devarg = NULL; char *host = NULL; char *sink = NULL; + char *version = pa_get_library_version(); if (ao_subdevice) { devarg = strdup(ao_subdevice); @@ -146,6 +149,17 @@ if (devarg[0]) host = devarg; } + broken_pause = 0; + // not sure which versions are affected, assume 0.9.1* + // known bad: 0.9.14, 0.9.13 + // known good: 0.9.9, 0.9.10 + // to test: pause, wait ca. 5 seconds framestep and see if MPlayer hangs somewhen + if (strncmp(version, "0.9.1", 5) == 0 && strncmp(version, "0.9.10", 6) != 0) { + mp_msg(MSGT_AO, MSGL_WARN, "[pulse] working around probably broken pause functionality,\n" + " see http://www.pulseaudio.org/ticket/440\n"); + broken_pause = 1; + } + ss.channels = channels; ss.rate = rate_hz; @@ -288,6 +302,10 @@ /** Resume the audio stream by uncorking it on the server */ static void audio_resume(void) { + // without this, certain versions will cause an infinite hang because + // pa_stream_writable_size returns 0 always. + // Note that this workaround causes A-V desync after pause + if (broken_pause) reset(); cork(0); }