summaryrefslogtreecommitdiffstats
path: root/ext/wavpack
diff options
context:
space:
mode:
Diffstat (limited to 'ext/wavpack')
-rw-r--r--ext/wavpack/gstwavpackdec.c2
-rw-r--r--ext/wavpack/gstwavpackparse.c40
-rw-r--r--ext/wavpack/gstwavpackparse.h3
3 files changed, 43 insertions, 2 deletions
diff --git a/ext/wavpack/gstwavpackdec.c b/ext/wavpack/gstwavpackdec.c
index 60a005f8..3e61c9a1 100644
--- a/ext/wavpack/gstwavpackdec.c
+++ b/ext/wavpack/gstwavpackdec.c
@@ -287,7 +287,7 @@ gst_wavpack_dec_chain (GstPad * pad, GstBuffer * buf)
"channels", G_TYPE_INT, dec->channels,
"depth", G_TYPE_INT, dec->depth,
"width", G_TYPE_INT, dec->width,
- "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
+ "endianness", G_TYPE_INT, G_BYTE_ORDER,
"signed", G_TYPE_BOOLEAN, TRUE, NULL);
GST_DEBUG_OBJECT (dec, "setting caps %" GST_PTR_FORMAT, caps);
diff --git a/ext/wavpack/gstwavpackparse.c b/ext/wavpack/gstwavpackparse.c
index 1febaf67..b311af38 100644
--- a/ext/wavpack/gstwavpackparse.c
+++ b/ext/wavpack/gstwavpackparse.c
@@ -213,6 +213,11 @@ gst_wavpack_parse_reset (GstWavpackParse * wavpackparse)
gst_object_unref (wavpackparse->srcpad);
wavpackparse->srcpad = NULL;
}
+
+ g_list_foreach (wavpackparse->queued_events, (GFunc) gst_mini_object_unref,
+ NULL);
+ g_list_free (wavpackparse->queued_events);
+ wavpackparse->queued_events = NULL;
}
static gboolean
@@ -532,6 +537,27 @@ gst_wavpack_parse_handle_seek_event (GstWavpackParse * wvparse,
}
static gboolean
+gst_wavpack_parse_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstWavpackParse *parse;
+ gboolean ret = TRUE;
+
+ parse = GST_WAVPACK_PARSE (gst_pad_get_parent (pad));
+
+ /* stream lock is recursive, should be fine for all events */
+ GST_PAD_STREAM_LOCK (pad);
+ if (parse->srcpad == NULL) {
+ parse->queued_events = g_list_append (parse->queued_events, event);
+ } else {
+ ret = gst_pad_push_event (parse->srcpad, event);
+ }
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ gst_object_unref (parse);
+ return ret;
+}
+
+static gboolean
gst_wavpack_parse_src_event (GstPad * pad, GstEvent * event)
{
GstWavpackParse *wavpackparse;
@@ -564,9 +590,10 @@ gst_wavpack_parse_init (GstWavpackParse * wavpackparse,
gst_pad_set_activate_function (wavpackparse->sinkpad,
GST_DEBUG_FUNCPTR (gst_wavepack_parse_sink_activate));
-
gst_pad_set_activatepull_function (wavpackparse->sinkpad,
GST_DEBUG_FUNCPTR (gst_wavepack_parse_sink_activate_pull));
+ gst_pad_set_event_function (wavpackparse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_wavpack_parse_sink_event));
gst_element_add_pad (GST_ELEMENT (wavpackparse), wavpackparse->sinkpad);
@@ -779,6 +806,17 @@ gst_wavpack_parse_loop (GstElement * element)
wavpackparse->need_newsegment = FALSE;
}
+ /* send any queued events */
+ if (wavpackparse->queued_events) {
+ GList *l;
+
+ for (l = wavpackparse->queued_events; l != NULL; l = l->next) {
+ gst_pad_push_event (wavpackparse->srcpad, GST_EVENT (l->data));
+ }
+ g_list_free (wavpackparse->queued_events);
+ wavpackparse->queued_events = NULL;
+ }
+
GST_BUFFER_TIMESTAMP (buf) = gst_util_uint64_scale_int (header.block_index,
GST_SECOND, wavpackparse->samplerate);
GST_BUFFER_DURATION (buf) = gst_util_uint64_scale_int (header.block_samples,
diff --git a/ext/wavpack/gstwavpackparse.h b/ext/wavpack/gstwavpackparse.h
index 9e6c334d..37321d83 100644
--- a/ext/wavpack/gstwavpackparse.h
+++ b/ext/wavpack/gstwavpackparse.h
@@ -72,6 +72,9 @@ struct _GstWavpackParse
* gaps (ie. append only and consecutive entries must always
* map to consecutive chunks in the file). */
GArray *entries;
+
+ /* Queued events (e.g. tag events we receive before we create the src pad) */
+ GList *queued_events; /* STREAM_LOCK */
};
struct _GstWavpackParseClass