[pulseaudio/f18] huge skype sound events delay (#888422)

Rex Dieter rdieter at fedoraproject.org
Thu Dec 27 16:10:09 UTC 2012


commit 3fbb08b3e3f7aaab0553625215ba35a7a8c306cc
Author: Rex Dieter <rdieter at math.unl.edu>
Date:   Thu Dec 27 10:10:30 2012 -0600

    huge skype sound events delay (#888422)

 ...ocess-rewind-requests-also-when-suspended.patch |  370 ++++++++++++++++++++
 pulseaudio.spec                                    |    9 +-
 2 files changed, 378 insertions(+), 1 deletions(-)
---
diff --git a/0003-sink-Process-rewind-requests-also-when-suspended.patch b/0003-sink-Process-rewind-requests-also-when-suspended.patch
new file mode 100644
index 0000000..01cec03
--- /dev/null
+++ b/0003-sink-Process-rewind-requests-also-when-suspended.patch
@@ -0,0 +1,370 @@
+From afbc9dbe49325882dbfad9a068d8d0537f3a62a1 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen <tanuk at iki.fi>
+Date: Thu, 30 Aug 2012 16:50:13 +0300
+Subject: [PATCH 3/3] sink: Process rewind requests also when suspended.
+
+When a rewind is requested on a sink input, the request parameters are
+stored in the pa_sink_input struct. The parameters are reset during
+rewind processing, and if the sink decides to ignore the rewind
+request due to being suspended, stale parameters are left in
+pa_sink_input. It's particularly problematic if the rewrite_bytes
+parameter is left at -1, because that will prevent all future rewind
+processing on that sink input. So, in order to avoid stale parameters,
+every rewind request needs to be processed, even if the sink is
+suspended.
+
+Reported-by: Uoti Urpala
+---
+ src/modules/alsa/alsa-sink.c                 | 14 ++++++++++----
+ src/modules/jack/module-jack-sink.c          |  5 ++---
+ src/modules/macosx/module-coreaudio-device.c |  9 ++++++---
+ src/modules/module-combine-sink.c            |  5 ++---
+ src/modules/module-esound-sink.c             |  5 ++---
+ src/modules/module-null-sink.c               | 22 +++++++++-------------
+ src/modules/module-pipe-sink.c               |  7 +++----
+ src/modules/module-solaris.c                 | 13 ++++++++-----
+ src/modules/module-tunnel.c                  |  5 ++---
+ src/modules/module-waveout.c                 |  9 ++++++---
+ src/modules/oss/module-oss.c                 |  5 ++---
+ src/modules/raop/module-raop-sink.c          |  5 ++---
+ src/modules/xen/module-xenpv-sink.c          |  7 +++----
+ src/pulsecore/sink.c                         |  6 ------
+ 14 files changed, 57 insertions(+), 60 deletions(-)
+
+diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
+index 1bee8f3..9492cab 100644
+--- a/src/modules/alsa/alsa-sink.c
++++ b/src/modules/alsa/alsa-sink.c
+@@ -1602,6 +1602,11 @@ static int process_rewind(struct userdata *u) {
+     size_t rewind_nbytes, unused_nbytes, limit_nbytes;
+     pa_assert(u);
+ 
++    if (!PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
++        pa_sink_process_rewind(u->sink, 0);
++        return 0;
++    }
++
+     /* Figure out how much we shall rewind and reset the counter */
+     rewind_nbytes = u->sink->thread_info.rewind_nbytes;
+ 
+@@ -1681,16 +1686,17 @@ static void thread_func(void *userdata) {
+         pa_log_debug("Loop");
+ #endif
+ 
++        if (PA_UNLIKELY(u->sink->thread_info.rewind_requested)) {
++            if (process_rewind(u) < 0)
++                goto fail;
++        }
++
+         /* Render some data and write it to the dsp */
+         if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
+             int work_done;
+             pa_usec_t sleep_usec = 0;
+             pa_bool_t on_timeout = pa_rtpoll_timer_elapsed(u->rtpoll);
+ 
+-            if (PA_UNLIKELY(u->sink->thread_info.rewind_requested))
+-                if (process_rewind(u) < 0)
+-                        goto fail;
+-
+             if (u->use_mmap)
+                 work_done = mmap_write(u, &sleep_usec, revents & POLLOUT, on_timeout);
+             else
+diff --git a/src/modules/jack/module-jack-sink.c b/src/modules/jack/module-jack-sink.c
+index 017fbf6..cf97e4a 100644
+--- a/src/modules/jack/module-jack-sink.c
++++ b/src/modules/jack/module-jack-sink.c
+@@ -229,9 +229,8 @@ static void thread_func(void *userdata) {
+     for (;;) {
+         int ret;
+ 
+-        if (PA_SINK_IS_OPENED(u->sink->thread_info.state))
+-            if (u->sink->thread_info.rewind_requested)
+-                pa_sink_process_rewind(u->sink, 0);
++        if (u->sink->thread_info.rewind_requested)
++            pa_sink_process_rewind(u->sink, 0);
+ 
+         if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
+             goto fail;
+diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c
+index 47fd1e6..e2a533b 100644
+--- a/src/modules/macosx/module-coreaudio-device.c
++++ b/src/modules/macosx/module-coreaudio-device.c
+@@ -274,9 +274,6 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
+                 pa_assert(sink);
+ 
+                 if (PA_SINK_IS_OPENED(sink->pa_sink->thread_info.state)) {
+-                    if (sink->pa_sink->thread_info.rewind_requested)
+-                        pa_sink_process_rewind(sink->pa_sink, 0);
+-
+                     audio_chunk.memblock = pa_memblock_new_fixed(u->module->core->mempool, buf->mData, buf->mDataByteSize, FALSE);
+                     audio_chunk.length = buf->mDataByteSize;
+                     audio_chunk.index = 0;
+@@ -658,8 +655,14 @@ static void thread_func(void *userdata) {
+     pa_thread_mq_install(&u->thread_mq);
+ 
+     for (;;) {
++        coreaudio_sink *ca_sink;
+         int ret;
+ 
++        PA_LLIST_FOREACH(ca_sink, u->sinks) {
++            if (ca_sink->pa_sink->thread_info.rewind_requested)
++                pa_sink_process_rewind(ca_sink->pa_sink, 0);
++        }
++
+         ret = pa_rtpoll_run(u->rtpoll, TRUE);
+ 
+         if (ret < 0)
+diff --git a/src/modules/module-combine-sink.c b/src/modules/module-combine-sink.c
+index dec2279..8847077 100644
+--- a/src/modules/module-combine-sink.c
++++ b/src/modules/module-combine-sink.c
+@@ -307,9 +307,8 @@ static void thread_func(void *userdata) {
+     for (;;) {
+         int ret;
+ 
+-        if (PA_SINK_IS_OPENED(u->sink->thread_info.state))
+-            if (u->sink->thread_info.rewind_requested)
+-                pa_sink_process_rewind(u->sink, 0);
++        if (u->sink->thread_info.rewind_requested)
++            pa_sink_process_rewind(u->sink, 0);
+ 
+         /* If no outputs are connected, render some data and drop it immediately. */
+         if (PA_SINK_IS_OPENED(u->sink->thread_info.state) && !u->thread_info.active_outputs) {
+diff --git a/src/modules/module-esound-sink.c b/src/modules/module-esound-sink.c
+index 1e26e5e..468de01 100644
+--- a/src/modules/module-esound-sink.c
++++ b/src/modules/module-esound-sink.c
+@@ -213,9 +213,8 @@ static void thread_func(void *userdata) {
+     for (;;) {
+         int ret;
+ 
+-        if (PA_SINK_IS_OPENED(u->sink->thread_info.state))
+-            if (u->sink->thread_info.rewind_requested)
+-                pa_sink_process_rewind(u->sink, 0);
++        if (u->sink->thread_info.rewind_requested)
++            pa_sink_process_rewind(u->sink, 0);
+ 
+         if (u->rtpoll_item) {
+             struct pollfd *pollfd;
+diff --git a/src/modules/module-null-sink.c b/src/modules/module-null-sink.c
+index f40546a..d6ea43f 100644
+--- a/src/modules/module-null-sink.c
++++ b/src/modules/module-null-sink.c
+@@ -136,11 +136,11 @@ static void process_rewind(struct userdata *u, pa_usec_t now) {
+ 
+     pa_assert(u);
+ 
+-    /* Figure out how much we shall rewind and reset the counter */
+     rewind_nbytes = u->sink->thread_info.rewind_nbytes;
+-    u->sink->thread_info.rewind_nbytes = 0;
+ 
+-    pa_assert(rewind_nbytes > 0);
++    if (!PA_SINK_IS_OPENED(u->sink->thread_info.state) || rewind_nbytes <= 0)
++        goto do_nothing;
++
+     pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes);
+ 
+     if (u->timestamp <= now)
+@@ -207,21 +207,17 @@ static void thread_func(void *userdata) {
+     u->timestamp = pa_rtclock_now();
+ 
+     for (;;) {
++        pa_usec_t now = 0;
+         int ret;
+ 
+-        /* Render some data and drop it immediately */
+-        if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
+-            pa_usec_t now;
+-
++        if (PA_SINK_IS_OPENED(u->sink->thread_info.state))
+             now = pa_rtclock_now();
+ 
+-            if (u->sink->thread_info.rewind_requested) {
+-                if (u->sink->thread_info.rewind_nbytes > 0)
+-                    process_rewind(u, now);
+-                else
+-                    pa_sink_process_rewind(u->sink, 0);
+-            }
++        if (u->sink->thread_info.rewind_requested)
++            process_rewind(u, now);
+ 
++        /* Render some data and drop it immediately */
++        if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
+             if (u->timestamp <= now)
+                 process_render(u, now);
+ 
+diff --git a/src/modules/module-pipe-sink.c b/src/modules/module-pipe-sink.c
+index 91e01f9..a3cff6b 100644
+--- a/src/modules/module-pipe-sink.c
++++ b/src/modules/module-pipe-sink.c
+@@ -180,12 +180,11 @@ static void thread_func(void *userdata) {
+ 
+         pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
+ 
++        if (u->sink->thread_info.rewind_requested)
++            pa_sink_process_rewind(u->sink, 0);
++
+         /* Render some data and write it to the fifo */
+         if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
+-
+-            if (u->sink->thread_info.rewind_requested)
+-                pa_sink_process_rewind(u->sink, 0);
+-
+             if (pollfd->revents) {
+                 if (process_render(u) < 0)
+                     goto fail;
+diff --git a/src/modules/module-solaris.c b/src/modules/module-solaris.c
+index 5081ceb..aaf7189 100644
+--- a/src/modules/module-solaris.c
++++ b/src/modules/module-solaris.c
+@@ -587,9 +587,12 @@ static void process_rewind(struct userdata *u) {
+ 
+     pa_assert(u);
+ 
+-    /* Figure out how much we shall rewind and reset the counter */
++    if (!PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
++        pa_sink_process_rewind(u->sink, 0);
++        return;
++    }
++
+     rewind_nbytes = u->sink->thread_info.rewind_nbytes;
+-    u->sink->thread_info.rewind_nbytes = 0;
+ 
+     if (rewind_nbytes > 0) {
+         pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes);
+@@ -625,13 +628,13 @@ static void thread_func(void *userdata) {
+     for (;;) {
+         /* Render some data and write it to the dsp */
+ 
++        if (u->sink->thread_info.rewind_requested)
++            process_rewind(u);
++
+         if (u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
+             pa_usec_t xtime0, ysleep_interval, xsleep_interval;
+             uint64_t buffered_bytes;
+ 
+-            if (u->sink->thread_info.rewind_requested)
+-                process_rewind(u);
+-
+             err = ioctl(u->fd, AUDIO_GETINFO, &info);
+             if (err < 0) {
+                 pa_log("AUDIO_GETINFO ioctl failed: %s", pa_cstrerror(errno));
+diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c
+index 0916717..61c00c9 100644
+--- a/src/modules/module-tunnel.c
++++ b/src/modules/module-tunnel.c
+@@ -698,9 +698,8 @@ static void thread_func(void *userdata) {
+         int ret;
+ 
+ #ifdef TUNNEL_SINK
+-        if (PA_SINK_IS_OPENED(u->sink->thread_info.state))
+-            if (PA_UNLIKELY(u->sink->thread_info.rewind_requested))
+-                pa_sink_process_rewind(u->sink, 0);
++        if (PA_UNLIKELY(u->sink->thread_info.rewind_requested))
++            pa_sink_process_rewind(u->sink, 0);
+ #endif
+ 
+         if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
+diff --git a/src/modules/module-waveout.c b/src/modules/module-waveout.c
+index 53efce9..d02bb6b 100644
+--- a/src/modules/module-waveout.c
++++ b/src/modules/module-waveout.c
+@@ -255,13 +255,16 @@ static void thread_func(void *userdata) {
+         int ret;
+         pa_bool_t need_timer = FALSE;
+ 
+-        if (u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
++        if (u->sink) {
+             if (u->sink->thread_info.rewind_requested)
+                 pa_sink_process_rewind(u->sink, 0);
+ 
+-            do_write(u);
+-            need_timer = TRUE;
++            if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
++                do_write(u);
++                need_timer = TRUE;
++            }
+         }
++
+         if (u->source && PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
+             do_read(u);
+             need_timer = TRUE;
+diff --git a/src/modules/oss/module-oss.c b/src/modules/oss/module-oss.c
+index 6f0f271..3d79412 100644
+--- a/src/modules/oss/module-oss.c
++++ b/src/modules/oss/module-oss.c
+@@ -891,9 +891,8 @@ static void thread_func(void *userdata) {
+ 
+ /*        pa_log("loop");    */
+ 
+-        if (u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state))
+-            if (u->sink->thread_info.rewind_requested)
+-                pa_sink_process_rewind(u->sink, 0);
++        if (u->sink && u->sink->thread_info.rewind_requested)
++            pa_sink_process_rewind(u->sink, 0);
+ 
+         /* Render some data and write it to the dsp */
+ 
+diff --git a/src/modules/raop/module-raop-sink.c b/src/modules/raop/module-raop-sink.c
+index 2cb7a95..2952216 100644
+--- a/src/modules/raop/module-raop-sink.c
++++ b/src/modules/raop/module-raop-sink.c
+@@ -327,9 +327,8 @@ static void thread_func(void *userdata) {
+     for (;;) {
+         int ret;
+ 
+-        if (PA_SINK_IS_OPENED(u->sink->thread_info.state))
+-            if (u->sink->thread_info.rewind_requested)
+-                pa_sink_process_rewind(u->sink, 0);
++        if (u->sink->thread_info.rewind_requested)
++            pa_sink_process_rewind(u->sink, 0);
+ 
+         if (u->rtpoll_item) {
+             struct pollfd *pollfd;
+diff --git a/src/modules/xen/module-xenpv-sink.c b/src/modules/xen/module-xenpv-sink.c
+index 34e5fc4..a5756e5 100644
+--- a/src/modules/xen/module-xenpv-sink.c
++++ b/src/modules/xen/module-xenpv-sink.c
+@@ -338,12 +338,11 @@ static void thread_func(void *userdata) {
+ 
+         pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
+ 
++        if (u->sink->thread_info.rewind_requested)
++            pa_sink_process_rewind(u->sink, 0);
++
+         /* Render some data and write it to the fifo */
+         if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
+-
+-            if (u->sink->thread_info.rewind_requested)
+-                pa_sink_process_rewind(u->sink, 0);
+-
+             if (pollfd->revents) {
+                 if (process_render(u) < 0)
+                     goto fail;
+diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
+index e4c343d..3d08d1a 100644
+--- a/src/pulsecore/sink.c
++++ b/src/pulsecore/sink.c
+@@ -928,9 +928,6 @@ void pa_sink_process_rewind(pa_sink *s, size_t nbytes) {
+     s->thread_info.rewind_nbytes = 0;
+     s->thread_info.rewind_requested = FALSE;
+ 
+-    if (s->thread_info.state == PA_SINK_SUSPENDED)
+-        return;
+-
+     if (nbytes > 0) {
+         pa_log_debug("Processing rewind...");
+         if (s->flags & PA_SINK_DEFERRED_VOLUME)
+@@ -2898,9 +2895,6 @@ void pa_sink_request_rewind(pa_sink*s, size_t nbytes) {
+     pa_sink_assert_io_context(s);
+     pa_assert(PA_SINK_IS_LINKED(s->thread_info.state));
+ 
+-    if (s->thread_info.state == PA_SINK_SUSPENDED)
+-        return;
+-
+     if (nbytes == (size_t) -1)
+         nbytes = s->thread_info.max_rewind;
+ 
+-- 
+1.8.0.2
+
diff --git a/pulseaudio.spec b/pulseaudio.spec
index 63bd517..3b41075 100644
--- a/pulseaudio.spec
+++ b/pulseaudio.spec
@@ -5,7 +5,7 @@
 Name:           pulseaudio
 Summary:        Improved Linux Sound Server
 Version:        2.1
-Release:        4%{?dist}
+Release:        5%{?dist}
 License:        LGPLv2+
 Group:          System Environment/Daemons
 URL:            http://www.freedesktop.org/wiki/Software/PulseAudio
@@ -15,6 +15,9 @@ Source1:        default.pa-for-gdm
 # activate pulseaudio early at login
 Patch0:         pulseaudio-activation.patch
 
+## upstream patches
+Patch103: 0003-sink-Process-rewind-requests-also-when-suspended.patch
+
 BuildRequires:  m4
 BuildRequires:  libtool-ltdl-devel
 BuildRequires:  intltool
@@ -197,6 +200,7 @@ This package contains GDM integration hooks for the PulseAudio sound server.
 %prep
 %setup -q -T -b0
 %patch0 -p1 -b .activation
+%patch103 -p1 -b .0003
 
 ## kill rpaths
 %if "%{_libdir}" != "/usr/lib"
@@ -477,6 +481,9 @@ exit 0
 %attr(0600, gdm, gdm) %{_localstatedir}/lib/gdm/.pulse/default.pa
 
 %changelog
+* Thu Dec 27 2012 Rex Dieter <rdieter at fedoraproject.org> 2.1-5
+- huge skype sound events delay (#888422)
+
 * Wed Oct 10 2012 Dan HorĂ¡k <dan[at]danny.cz> 2.1-4
 - fix the with_webrtc condition
 


More information about the scm-commits mailing list