Index: jamboree/Makefile.am =================================================================== --- jamboree.orig/Makefile.am 2005-06-02 12:32:35.371238416 +0200 +++ jamboree/Makefile.am 2005-06-02 12:33:38.683613472 +0200 @@ -1,4 +1,4 @@ -SUBDIRS=src data po +SUBDIRS=src data po test @INTLTOOL_DESKTOP_RULE@ Index: jamboree/src/tag-reader.c =================================================================== --- jamboree.orig/src/tag-reader.c 2005-06-02 12:32:35.371238416 +0200 +++ jamboree/src/tag-reader.c 2005-06-02 12:33:38.684613320 +0200 @@ -170,40 +170,14 @@ } static void -reader_found_tag_cb (GObject *pipeline, - GstElement *element, - GstTagList *tags, - TagReader *reader) -{ - gst_tag_list_foreach (tags, (GstTagForeachFunc) reader_load_tag, reader); -} - -static void -reader_error_cb (GstElement *element, - GstElement *source, - GError *error, - char *debug, - TagReader *reader) -{ - g_print ("error: %s ", error->message); - reader->got_error = TRUE; -} - -static void -reader_eos_cb (GstElement *element, - TagReader *reader) -{ - gst_element_set_state (reader->pipeline, GST_STATE_NULL); - reader->got_eos = TRUE; -} - -static void reader_handoff_cb (GstElement *sink, GstBuffer *buf, GstPad *pad, TagReader *reader) { reader->got_handoff = TRUE; + gst_element_post_message + (sink, gst_message_new_application (gst_structure_new ("foo", NULL))); } static void @@ -227,15 +201,13 @@ caps = gst_pad_get_caps (pad); str = gst_caps_get_structure (caps, 0); if (!g_strrstr (gst_structure_get_name (str), "audio")) { - gst_caps_free (caps); + gst_caps_unref (caps); return; } - gst_caps_free (caps); + gst_caps_unref (caps); - gst_bin_add (GST_BIN (reader->pipeline), reader->sink); gst_pad_link (pad, audio_pad); - gst_bin_sync_children_state (GST_BIN (reader->pipeline)); } static TagReader * @@ -245,7 +217,7 @@ reader = g_new0 (TagReader, 1); - reader->pipeline = gst_pipeline_new ("pipeline"); + reader->pipeline = gst_element_factory_make ("pipeline", "pipeline"); if (!reader->pipeline) { goto fail; } @@ -267,6 +239,7 @@ if (!reader->sink) { goto fail; } + gst_bin_add (GST_BIN (reader->pipeline), reader->sink); if (!gst_element_link (reader->source, reader->decoder)) { goto fail; @@ -281,18 +254,6 @@ "handoff", G_CALLBACK (reader_handoff_cb), reader); - g_signal_connect (reader->pipeline, - "found_tag", - G_CALLBACK (reader_found_tag_cb), - reader); - g_signal_connect (reader->sink, - "eos", - G_CALLBACK (reader_eos_cb), - reader); - g_signal_connect (reader->pipeline, - "error", - G_CALLBACK (reader_error_cb), - reader); return reader; @@ -304,13 +265,9 @@ static void reader_free (TagReader *reader) { - /* If the sink is not added, we need to free it ourselves. */ - if (reader->sink && !gst_element_get_parent (reader->sink)) { - g_object_unref (reader->sink); - } - if (reader->pipeline) { - g_object_unref (reader->pipeline); + gst_element_set_state ((GstObject*)reader->pipeline, GST_STATE_NULL); + gst_object_unref ((GstObject*)reader->pipeline); } g_free (reader); @@ -336,16 +293,73 @@ } } +static void +reader_loop (TagReader *reader) +{ + GstBus *bus; + GstMessageType revent; + GstMessage *message = NULL; + + bus = gst_element_get_bus (reader->pipeline); + + while (TRUE) { + revent = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND); + + if (revent == GST_MESSAGE_UNKNOWN) + /* poll timed out */ + return; + + message = gst_bus_pop (bus); + //g_print ("message rec'd %p\n", message); + + switch (revent) { + case GST_MESSAGE_EOS: + gst_message_unref (message); + return; + + case GST_MESSAGE_TAG: { + GstTagList *tags; + + gst_message_parse_tag (message, &tags); + gst_tag_list_foreach (tags, reader_load_tag, reader); + gst_tag_list_free (tags); + gst_message_unref (message); + break; + } + + case GST_MESSAGE_WARNING: + case GST_MESSAGE_ERROR: { + GError *gerror; + gchar *debug; + + gst_message_parse_error (message, &gerror, &debug); + gst_message_unref (message); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + g_error_free (gerror); + g_free (debug); + return; + } + + case GST_MESSAGE_APPLICATION: + gst_message_unref (message); + return; + + default: + gst_message_unref (message); + break; + } + } + + g_assert_not_reached (); +} + static Song * reader_read_file (const char *path) { TagReader *reader; - GstFormat format = GST_FORMAT_TIME; - gint64 duration; - Song *song; + Song *song = NULL; time_t now; struct stat buf; - int i; if (!is_valid_file (path)) { return NULL; @@ -356,21 +370,29 @@ return NULL; } - gst_element_set_state (reader->pipeline, GST_STATE_PLAYING); - - i = 0; - while (gst_bin_iterate (GST_BIN (reader->pipeline)) && - !reader->got_handoff && !reader->got_eos && !reader->got_error && i++ < 5000) { + if (gst_element_set_state (reader->pipeline, GST_STATE_PLAYING) != GST_STATE_SUCCESS) { + goto fail; } + reader_loop (reader); + + gst_element_set_state (reader->pipeline, GST_STATE_PAUSED); + if (reader->duration == 0 && reader->got_handoff) { - if (gst_element_query (reader->sink, GST_QUERY_TOTAL, &format, &duration)) { - reader->duration = duration / GST_SECOND; + GstPad *pad, *peer; + GstFormat format = GST_FORMAT_TIME; + gint64 total; + + pad = gst_element_get_pad (reader->sink, "sink"); + peer = gst_pad_get_peer (pad); + gst_object_unref (GST_OBJECT (pad)); + + if (gst_pad_query_position (peer, &format, NULL, &total)) { + reader->duration = total / GST_SECOND; } + gst_object_unref (GST_OBJECT (peer)); } - gst_element_set_state (reader->pipeline, GST_STATE_NULL); - song = song_new (path); /* These move the ownership of the strings to the song. */ @@ -392,6 +414,8 @@ reader_fixup_tags (reader, song); + fail: + reader_free (reader); return song; Index: jamboree/test/Makefile.am =================================================================== --- jamboree.orig/test/Makefile.am 2005-06-02 12:33:23.915858512 +0200 +++ jamboree/test/Makefile.am 2005-06-02 12:33:54.269244096 +0200 @@ -6,4 +6,3 @@ $(top_srcdir)/src/string-utils.c read_tags_CFLAGS=$(JAMBOREE_CFLAGS) read_tags_LDFLAGS=$(JAMBOREE_LIBS) - Index: jamboree/test/read-tags.c =================================================================== --- jamboree.orig/test/read-tags.c 2005-06-02 12:32:35.372238264 +0200 +++ jamboree/test/read-tags.c 2005-06-02 12:33:38.684613320 +0200 @@ -63,6 +63,13 @@ usage (argv[0]); } + gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE); + if (!gst_alloc_trace_available ()) { + g_warning ("Trace not available (recompile with trace enabled)."); + } + gst_alloc_trace_print_all (); + g_print ("\n"); + if (!tag_reader_read_path (argv[1], song_found, song_read, @@ -72,6 +79,9 @@ return 1; } + g_print ("\n"); + gst_alloc_trace_print_all (); + g_print ("Successfully read %s\n", argv[1]); return 0; }