shout2: use gstpoll for timeouts

Use our own GstPoll based timeout instead of the shout sleep so that we can
interrupt when doing a state change and shutting down.

Fixes #602887
This commit is contained in:
Wim Taymans 2009-11-28 19:23:26 +01:00 committed by Wim Taymans
parent 5c8527bb20
commit 4519bdc983
2 changed files with 49 additions and 3 deletions

View file

@ -89,6 +89,8 @@ static void gst_shout2send_init (GstShout2send * shout2send);
static void gst_shout2send_finalize (GstShout2send * shout2send); static void gst_shout2send_finalize (GstShout2send * shout2send);
static gboolean gst_shout2send_event (GstBaseSink * sink, GstEvent * event); static gboolean gst_shout2send_event (GstBaseSink * sink, GstEvent * event);
static gboolean gst_shout2send_unlock (GstBaseSink * basesink);
static gboolean gst_shout2send_unlock_stop (GstBaseSink * basesink);
static GstFlowReturn gst_shout2send_render (GstBaseSink * sink, static GstFlowReturn gst_shout2send_render (GstBaseSink * sink,
GstBuffer * buffer); GstBuffer * buffer);
static gboolean gst_shout2send_start (GstBaseSink * basesink); static gboolean gst_shout2send_start (GstBaseSink * basesink);
@ -237,6 +239,9 @@ gst_shout2send_class_init (GstShout2sendClass * klass)
gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_shout2send_start); gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_shout2send_start);
gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_shout2send_stop); gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_shout2send_stop);
gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_shout2send_unlock);
gstbasesink_class->unlock_stop =
GST_DEBUG_FUNCPTR (gst_shout2send_unlock_stop);
gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_shout2send_render); gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_shout2send_render);
gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_shout2send_event); gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_shout2send_event);
} }
@ -249,6 +254,8 @@ gst_shout2send_init (GstShout2send * shout2send)
gst_pad_set_setcaps_function (GST_BASE_SINK_PAD (shout2send), gst_pad_set_setcaps_function (GST_BASE_SINK_PAD (shout2send),
GST_DEBUG_FUNCPTR (gst_shout2send_setcaps)); GST_DEBUG_FUNCPTR (gst_shout2send_setcaps));
shout2send->timer = gst_poll_new_timer ();
shout2send->ip = g_strdup (DEFAULT_IP); shout2send->ip = g_strdup (DEFAULT_IP);
shout2send->port = DEFAULT_PORT; shout2send->port = DEFAULT_PORT;
shout2send->password = g_strdup (DEFAULT_PASSWORD); shout2send->password = g_strdup (DEFAULT_PASSWORD);
@ -283,6 +290,8 @@ gst_shout2send_finalize (GstShout2send * shout2send)
gst_tag_list_free (shout2send->tags); gst_tag_list_free (shout2send->tags);
gst_poll_free (shout2send->timer);
G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (shout2send)); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (shout2send));
} }
@ -585,11 +594,39 @@ gst_shout2send_stop (GstBaseSink * basesink)
return TRUE; return TRUE;
} }
static gboolean
gst_shout2send_unlock (GstBaseSink * basesink)
{
GstShout2send *sink;
sink = GST_SHOUT2SEND (basesink);
GST_DEBUG_OBJECT (basesink, "unlock");
gst_poll_set_flushing (sink->timer, TRUE);
return TRUE;
}
static gboolean
gst_shout2send_unlock_stop (GstBaseSink * basesink)
{
GstShout2send *sink;
sink = GST_SHOUT2SEND (basesink);
GST_DEBUG_OBJECT (basesink, "unlock_stop");
gst_poll_set_flushing (sink->timer, FALSE);
return TRUE;
}
static GstFlowReturn static GstFlowReturn
gst_shout2send_render (GstBaseSink * basesink, GstBuffer * buf) gst_shout2send_render (GstBaseSink * basesink, GstBuffer * buf)
{ {
GstShout2send *sink; GstShout2send *sink;
glong ret; glong ret;
gint delay;
GstFlowReturn fret;
sink = GST_SHOUT2SEND (basesink); sink = GST_SHOUT2SEND (basesink);
@ -600,9 +637,16 @@ gst_shout2send_render (GstBaseSink * basesink, GstBuffer * buf)
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
/* FIXME: do we want to do syncing here at all? (tpm) */ delay = shout_delay (sink->conn);
/* GST_LOG_OBJECT (sink, "using libshout to sync"); */
shout_sync (sink->conn); GST_LOG_OBJECT (sink, "waiting %d msec", delay);
if (gst_poll_wait (sink->timer, 1000 * delay) == -1) {
GST_LOG_OBJECT (sink, "unlocked");
fret = gst_base_sink_wait_preroll (basesink);
if (fret != GST_FLOW_OK)
return fret;
}
GST_LOG_OBJECT (sink, "sending %u bytes of data", GST_BUFFER_SIZE (buf)); GST_LOG_OBJECT (sink, "sending %u bytes of data", GST_BUFFER_SIZE (buf));
ret = shout_send (sink->conn, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); ret = shout_send (sink->conn, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));

View file

@ -42,6 +42,8 @@ struct _GstShout2send {
GstShout2SendProtocol protocol; GstShout2SendProtocol protocol;
GstPoll *timer;
shout_t *conn; shout_t *conn;
gchar *ip; gchar *ip;