fluidsynth: produce more accurate timestamps

This commit is contained in:
Wim Taymans 2013-03-21 17:05:36 +01:00
parent 15f07e7f12
commit 5256b6bf89
2 changed files with 31 additions and 19 deletions

View file

@ -234,21 +234,26 @@ gst_fluidsynth_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
} }
static GstFlowReturn static GstFlowReturn
produce_samples (GstFluidsynth * fluidsynth, GstClockTime pts) produce_samples (GstFluidsynth * fluidsynth, GstClockTime pts, guint64 sample)
{ {
GstClockTime out_duration; GstClockTime duration, timestamp;
guint samples; guint64 samples, offset;
GstMapInfo info; GstMapInfo info;
GstBuffer *outbuf; GstBuffer *outbuf;
out_duration = pts - fluidsynth->last_pts; samples = sample - fluidsynth->last_sample;
duration = pts - fluidsynth->last_pts;
offset = fluidsynth->last_sample;
timestamp = fluidsynth->last_pts;
samples = fluidsynth->last_pts = pts;
gst_util_uint64_scale_int (out_duration, FLUIDSYNTH_RATE, GST_SECOND); fluidsynth->last_sample = sample;
GST_DEBUG_OBJECT (fluidsynth, if (samples == 0)
"duration %" GST_TIME_FORMAT ", samples %u", return GST_FLOW_OK;
GST_TIME_ARGS (out_duration), samples);
GST_DEBUG_OBJECT (fluidsynth, "duration %" GST_TIME_FORMAT
", samples %u", GST_TIME_ARGS (duration), samples);
outbuf = gst_buffer_new_allocate (NULL, samples * FLUIDSYNTH_BPS, NULL); outbuf = gst_buffer_new_allocate (NULL, samples * FLUIDSYNTH_BPS, NULL);
@ -257,9 +262,11 @@ produce_samples (GstFluidsynth * fluidsynth, GstClockTime pts)
info.data, 1, 2); info.data, 1, 2);
gst_buffer_unmap (outbuf, &info); gst_buffer_unmap (outbuf, &info);
GST_BUFFER_DTS (outbuf) = fluidsynth->last_pts; GST_BUFFER_DTS (outbuf) = timestamp;
GST_BUFFER_PTS (outbuf) = fluidsynth->last_pts; GST_BUFFER_PTS (outbuf) = timestamp;
GST_BUFFER_DURATION (outbuf) = out_duration; GST_BUFFER_DURATION (outbuf) = duration;
GST_BUFFER_OFFSET (outbuf) = offset;
GST_BUFFER_OFFSET_END (outbuf) = offset + samples;
return gst_pad_push (fluidsynth->srcpad, outbuf); return gst_pad_push (fluidsynth->srcpad, outbuf);
} }
@ -343,17 +350,21 @@ gst_fluidsynth_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * buffer)
pts = GST_BUFFER_PTS (buffer); pts = GST_BUFFER_PTS (buffer);
if (pts != GST_CLOCK_TIME_NONE) {
guint64 sample =
gst_util_uint64_scale_int (pts, FLUIDSYNTH_RATE, GST_SECOND);
if (fluidsynth->last_pts == GST_CLOCK_TIME_NONE) { if (fluidsynth->last_pts == GST_CLOCK_TIME_NONE) {
fluidsynth->last_pts = pts; fluidsynth->last_pts = pts;
} else if (pts != GST_CLOCK_TIME_NONE && fluidsynth->last_pts < pts) { fluidsynth->last_sample = sample;
} else if (fluidsynth->last_pts < pts) {
/* generate samples for the elapsed time */ /* generate samples for the elapsed time */
res = produce_samples (fluidsynth, pts); res = produce_samples (fluidsynth, pts, sample);
}
} }
if (res == GST_FLOW_OK) { if (res == GST_FLOW_OK) {
handle_buffer (fluidsynth, buffer); handle_buffer (fluidsynth, buffer);
fluidsynth->last_pts = pts;
} }
gst_buffer_unref (buffer); gst_buffer_unref (buffer);

View file

@ -50,6 +50,7 @@ struct _GstFluidsynth
GstPad *sinkpad, *srcpad; GstPad *sinkpad, *srcpad;
GstSegment segment; GstSegment segment;
GstClockTime last_pts; GstClockTime last_pts;
guint64 last_sample;
fluid_settings_t* settings; fluid_settings_t* settings;
fluid_synth_t* synth; fluid_synth_t* synth;