gint event_type;
gboolean start;
gint method;
+ GstClockTime last_stop;
if (!gst_structure_get_int (event_structure, "type", &event_type) ||
!gst_structure_get_boolean (event_structure, "start", &start) ||
}
}
+
+ GST_OBJECT_LOCK (dtmfsrc);
+ if (gst_structure_get_clock_time (event_structure, "last-stop", &last_stop))
+ dtmfsrc->last_stop = last_stop;
+ else
+ dtmfsrc->last_stop = GST_CLOCK_TIME_NONE;
+ GST_OBJECT_UNLOCK (dtmfsrc);
+
if (start) {
gint event_number;
gint event_volume;
static void
gst_dtmf_prepare_timestamps (GstDTMFSrc * dtmfsrc)
{
- GstClock *clock;
+ GstClockTime last_stop;
+ GstClockTime timestamp;
- clock = gst_element_get_clock (GST_ELEMENT (dtmfsrc));
- if (clock != NULL) {
- dtmfsrc->timestamp = gst_clock_get_time (clock)
- - gst_element_get_base_time (GST_ELEMENT (dtmfsrc));
- gst_object_unref (clock);
+ GST_OBJECT_LOCK (dtmfsrc);
+ last_stop = dtmfsrc->last_stop;
+ GST_OBJECT_UNLOCK (dtmfsrc);
+
+ if (GST_CLOCK_TIME_IS_VALID (last_stop)) {
+ timestamp = last_stop;
} else {
- gchar *dtmf_name = gst_element_get_name (dtmfsrc);
- GST_ERROR_OBJECT (dtmfsrc, "No clock set for element %s", dtmf_name);
- dtmfsrc->timestamp = GST_CLOCK_TIME_NONE;
- g_free (dtmf_name);
+ GstClock *clock;
+
+ /* If there is no valid start time, lets use now as the start time */
+
+ clock = gst_element_get_clock (GST_ELEMENT (dtmfsrc));
+ if (clock != NULL) {
+ timestamp = gst_clock_get_time (clock)
+ - gst_element_get_base_time (GST_ELEMENT (dtmfsrc));
+ gst_object_unref (clock);
+ } else {
+ gchar *dtmf_name = gst_element_get_name (dtmfsrc);
+ GST_ERROR_OBJECT (dtmfsrc, "No clock set for element %s", dtmf_name);
+ dtmfsrc->timestamp = GST_CLOCK_TIME_NONE;
+ g_free (dtmf_name);
+ return;
+ }
}
+
+ /* Make sure the timestamp always goes forward */
+ if (timestamp > dtmfsrc->timestamp)
+ dtmfsrc->timestamp = timestamp;
}
static void
g_slice_free (GstDTMFSrcEvent, event);
event = g_async_queue_try_pop (dtmfsrc->event_queue);
}
+ dtmfsrc->timestamp = 0;
no_preroll = TRUE;
break;
default: