ext/wavpack/gstwavpackdec.c: Fix caps after previous change to byte order endianness.
authorTim-Philipp Müller <tim@centricular.net>
Tue, 18 Jul 2006 18:05:15 +0000 (18:05 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Tue, 18 Jul 2006 18:05:15 +0000 (18:05 +0000)
Original commit message from CVS:
* ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain):
Fix caps after previous change to byte order endianness.
* ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset),
(gst_wavpack_parse_sink_event), (gst_wavpack_parse_init),
(gst_wavpack_parse_loop):
* ext/wavpack/gstwavpackparse.h:
Queue incoming events if there's no source pad yet and
send them downstream later when the pad is there.

ext/wavpack/gstwavpackdec.c
ext/wavpack/gstwavpackparse.c
ext/wavpack/gstwavpackparse.h

index 60a005f..3e61c9a 100644 (file)
@@ -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);
index 1febaf6..b311af3 100644 (file)
@@ -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,
index 9e6c334..37321d8 100644 (file)
@@ -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