[Spice-devel] [PATCH spice-gtk 2/8] spice-pulse: update the playback latency automatically when it changes

Yonit Halperin yhalperi at redhat.com
Tue Feb 26 10:04:52 PST 2013


---
 gtk/spice-pulse.c | 69 +++++++++++++++++++++----------------------------------
 1 file changed, 26 insertions(+), 43 deletions(-)

diff --git a/gtk/spice-pulse.c b/gtk/spice-pulse.c
index 295ea4f..107ce7c 100644
--- a/gtk/spice-pulse.c
+++ b/gtk/spice-pulse.c
@@ -275,6 +275,30 @@ static void stream_underflow_cb(pa_stream *s, void *userdata)
 #endif
 }
 
+static void stream_update_latency_callback(pa_stream *s, void *userdata)
+{
+    pa_usec_t usec;
+    int negative = 0;
+    SpicePulsePrivate *p;
+
+    p = SPICE_PULSE_GET_PRIVATE(userdata);
+
+    g_return_if_fail(s != NULL);
+    g_return_if_fail(p != NULL);
+
+    if (!p->playback.stream || !p->playback.started)
+        return;
+
+    if (pa_stream_get_latency(s, &usec, &negative) < 0) {
+        g_warning("Failed to get latency: %s", pa_strerror(pa_context_errno(p->context)));
+        return;
+    }
+
+    g_return_if_fail(negative == FALSE);
+
+    spice_playback_channel_set_delay(SPICE_PLAYBACK_CHANNEL(p->pchannel), usec / 1000);
+}
+
 static void create_playback(SpicePulse *pulse)
 {
     SpicePulsePrivate *p = SPICE_PULSE_GET_PRIVATE(pulse);
@@ -291,13 +315,14 @@ static void create_playback(SpicePulse *pulse)
                                        &p->playback.spec, NULL);
     pa_stream_set_state_callback(p->playback.stream, stream_state_callback, pulse);
     pa_stream_set_underflow_callback(p->playback.stream, stream_underflow_cb, pulse);
+    pa_stream_set_latency_update_callback(p->playback.stream, stream_update_latency_callback, pulse);
 
     /* FIXME: we might want customizable latency */
     buffer_attr.maxlength = -1;
     buffer_attr.tlength = pa_usec_to_bytes(100 * PA_USEC_PER_MSEC, &p->playback.spec);
     buffer_attr.prebuf = -1;
     buffer_attr.minreq = -1;
-    flags = PA_STREAM_ADJUST_LATENCY;
+    flags = PA_STREAM_ADJUST_LATENCY | PA_STREAM_AUTO_TIMING_UPDATE;
 
     if (pa_stream_connect_playback(p->playback.stream,
                                    NULL, &buffer_attr, flags, NULL, NULL) < 0) {
@@ -399,46 +424,6 @@ static void playback_stop(SpicePlaybackChannel *channel, gpointer data)
     stream_cork(pulse, &p->playback);
 }
 
-static void stream_update_timing_callback(pa_stream *s, int success, void *userdata)
-{
-    pa_usec_t usec;
-    int negative = 0;
-    SpicePulsePrivate *p;
-
-    p = SPICE_PULSE_GET_PRIVATE(userdata);
-
-    g_return_if_fail(s != NULL);
-    g_return_if_fail(p != NULL);
-
-    if (!p->playback.stream || !p->playback.started)
-        return;
-
-    if (!success ||
-        pa_stream_get_latency(s, &usec, &negative) < 0) {
-        g_warning("Failed to get latency: %s", pa_strerror(pa_context_errno(p->context)));
-        return;
-    }
-
-    g_return_if_fail(negative == FALSE);
-
-    spice_playback_channel_set_delay(SPICE_PLAYBACK_CHANNEL(p->pchannel), usec / 1000);
-}
-
-static void playback_get_delay(SpicePlaybackChannel *channel, gpointer data)
-{
-    SpicePulse *pulse = data;
-    SpicePulsePrivate *p = pulse->priv;
-
-    if (p->playback.stream && pa_stream_get_state(p->playback.stream) == PA_STREAM_READY) {
-        pa_operation *o;
-        if (!(o = pa_stream_update_timing_info(p->playback.stream, stream_update_timing_callback, data)))
-            g_warning("pa_stream_update_timing_info() failed: %s",
-                      pa_strerror(pa_context_errno(p->context)));
-        else
-            pa_operation_unref(o);
-    }
-}
-
 static void stream_read_callback(pa_stream *s, size_t length, void *data)
 {
     SpicePulse *pulse = data;
@@ -716,8 +701,6 @@ static gboolean connect_channel(SpiceAudio *audio, SpiceChannel *channel)
         p->pchannel = g_object_ref(channel);
         spice_g_signal_connect_object(channel, "playback-start",
                                       G_CALLBACK(playback_start), pulse, 0);
-        spice_g_signal_connect_object(channel, "playback-get-delay",
-                                      G_CALLBACK(playback_get_delay), pulse, 0);
         spice_g_signal_connect_object(channel, "playback-data",
                                       G_CALLBACK(playback_data), pulse, 0);
         spice_g_signal_connect_object(channel, "playback-stop",
-- 
1.8.1



More information about the Spice-devel mailing list