[MPlayer-cvslog] r28668 - trunk/libao2/ao_pulse.c
reimar
subversion at mplayerhq.hu
Thu Feb 19 15:00:33 CET 2009
Author: reimar
Date: Thu Feb 19 15:00:33 2009
New Revision: 28668
Log:
Work around a PulseAudio bug that causes MPlayer to hang after unpausing.
Modified:
trunk/libao2/ao_pulse.c
Modified: trunk/libao2/ao_pulse.c
==============================================================================
--- trunk/libao2/ao_pulse.c Thu Feb 19 14:57:14 2009 (r28667)
+++ trunk/libao2/ao_pulse.c Thu Feb 19 15:00:33 2009 (r28668)
@@ -52,6 +52,8 @@ static struct pa_threaded_mainloop *main
/** 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 @@ static int init(int rate_hz, int channel
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 @@ static int init(int rate_hz, int channel
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 @@ static void audio_pause(void) {
/** 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);
}
More information about the MPlayer-cvslog
mailing list