summaryrefslogtreecommitdiff
path: root/gst/dtmf
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2013-01-25 20:39:33 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.com>2013-01-25 20:45:43 -0500
commit92f9a9d9ff557a886f463fa0a1f7923955ad6fef (patch)
tree162950910e88d66659f6cf5f47bb56d02a5ac404 /gst/dtmf
parent0d316b4f43c56d68ba40b9afd3299372d2d12e47 (diff)
downloadgstreamer-plugins-good-92f9a9d9ff557a886f463fa0a1f7923955ad6fef.tar.gz
rtpdtmfsrc: Post the messages after the clock wait
This way, the messages will be closer in time to when the packets are sent out
Diffstat (limited to 'gst/dtmf')
-rw-r--r--gst/dtmf/gstrtpdtmfsrc.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/gst/dtmf/gstrtpdtmfsrc.c b/gst/dtmf/gstrtpdtmfsrc.c
index ccba67f64..834ec480e 100644
--- a/gst/dtmf/gstrtpdtmfsrc.c
+++ b/gst/dtmf/gstrtpdtmfsrc.c
@@ -642,12 +642,11 @@ gst_rtp_dtmf_src_create_next_rtp_packet (GstRTPDTMFSrc * dtmfsrc)
return buf;
}
-
-static void
-gst_dtmf_src_post_message (GstRTPDTMFSrc * dtmfsrc, const gchar * message_name,
- GstRTPDTMFSrcEvent * event)
+static GstMessage *
+gst_dtmf_src_prepare_message (GstRTPDTMFSrc * dtmfsrc,
+ const gchar * message_name, GstRTPDTMFSrcEvent * event)
{
- GstStructure *s = NULL;
+ GstStructure *s;
switch (event->event_type) {
case RTP_DTMF_EVENT_TYPE_START:
@@ -664,12 +663,21 @@ gst_dtmf_src_post_message (GstRTPDTMFSrc * dtmfsrc, const gchar * message_name,
"start", G_TYPE_BOOLEAN, FALSE, NULL);
break;
case RTP_DTMF_EVENT_TYPE_PAUSE_TASK:
- return;
+ return NULL;
}
- if (s)
- gst_element_post_message (GST_ELEMENT (dtmfsrc),
- gst_message_new_element (GST_OBJECT (dtmfsrc), s));
+ return gst_message_new_element (GST_OBJECT (dtmfsrc), s);
+}
+
+static void
+gst_dtmf_src_post_message (GstRTPDTMFSrc * dtmfsrc, const gchar * message_name,
+ GstRTPDTMFSrcEvent * event)
+{
+ GstMessage *m = gst_dtmf_src_prepare_message (dtmfsrc, message_name, event);
+
+
+ if (m)
+ gst_element_post_message (GST_ELEMENT (dtmfsrc), m);
}
@@ -682,6 +690,8 @@ gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
GstClock *clock;
GstClockID *clockid;
GstClockReturn clockret;
+ GstMessage *message;
+ GQueue messages = G_QUEUE_INIT;
dtmfsrc = GST_RTP_DTMF_SRC (basesrc);
@@ -708,7 +718,9 @@ gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
if (!gst_rtp_dtmf_prepare_timestamps (dtmfsrc))
goto no_clock;
- gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-processed", event);
+ g_queue_push_tail (&messages,
+ gst_dtmf_src_prepare_message (dtmfsrc, "dtmf-event-processed",
+ event));
dtmfsrc->payload = event->payload;
dtmfsrc->payload->duration =
dtmfsrc->ptime * dtmfsrc->clock_rate / 1000;
@@ -752,7 +764,9 @@ gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
dtmfsrc->last_packet = TRUE;
/* Set the redundancy on the last packet */
dtmfsrc->redundancy_count = dtmfsrc->packet_redundancy;
- gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-processed", event);
+ g_queue_push_tail (&messages,
+ gst_dtmf_src_prepare_message (dtmfsrc, "dtmf-event-processed",
+ event));
break;
case RTP_DTMF_EVENT_TYPE_PAUSE_TASK:
@@ -801,6 +815,9 @@ gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
dtmfsrc->clockid = NULL;
GST_OBJECT_UNLOCK (dtmfsrc);
+ while ((message = g_queue_pop_head (&messages)) != NULL)
+ gst_element_post_message (GST_ELEMENT (dtmfsrc), message);
+
if (clockret == GST_CLOCK_UNSCHEDULED) {
goto paused;
}