[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