From 0927ebeef7c4d3ff97ca9acf0763e8e01636b226 Mon Sep 17 00:00:00 2001 From: reimar Date: Thu, 19 Feb 2009 14:00:33 +0000 Subject: Work around a PulseAudio bug that causes MPlayer to hang after unpausing. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28668 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libao2/ao_pulse.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'libao2') diff --git a/libao2/ao_pulse.c b/libao2/ao_pulse.c index 827dab92db..d6974f85e0 100644 --- a/libao2/ao_pulse.c +++ b/libao2/ao_pulse.c @@ -52,6 +52,8 @@ static struct pa_threaded_mainloop *mainloop; /** 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 channels, int format, int flags) { 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 channels, int format, int flags) { 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); } -- cgit v1.2.3 From 0ef6b6a546e1a4feb3c87b9eaf435f8311a90f20 Mon Sep 17 00:00:00 2001 From: reimar Date: Sat, 21 Feb 2009 13:37:47 +0000 Subject: Move resetting audio_info_t samples, eof and error in ao_sun.c to reset(), avoids duplication code from init() and fixes hangs after seeking. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28689 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libao2/ao_sun.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'libao2') diff --git a/libao2/ao_sun.c b/libao2/ao_sun.c index ebe17c7926..cae2287f6c 100644 --- a/libao2/ao_sun.c +++ b/libao2/ao_sun.c @@ -584,14 +584,7 @@ static int init(int rate,int channels,int format,int flags){ ao_data.bps = byte_per_sec = bytes_per_sample * ao_data.samplerate; ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192; - AUDIO_INITINFO(&info); - info.play.samples = 0; - info.play.eof = 0; - info.play.error = 0; - ioctl (audio_fd, AUDIO_SETINFO, &info); - - queued_bursts = 0; - queued_samples = 0; + reset(); return 1; } @@ -608,7 +601,15 @@ static void uninit(int immed){ // stop playing and empty buffers (for seeking/pause) static void reset(void){ + audio_info_t info; flush_audio(audio_fd); + + AUDIO_INITINFO(&info); + info.play.samples = 0; + info.play.eof = 0; + info.play.error = 0; + ioctl(audio_fd, AUDIO_SETINFO, &info); + queued_bursts = 0; queued_samples = 0; } -- cgit v1.2.3