From ec02fff66662537f8dba61ccbd3e8fdede9d5047 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Fri, 1 Nov 2002 15:07:46 +0000 Subject: [PATCH] fix up autoplug test a little Original commit message from CVS: fix up autoplug test a little --- gst/autoplug/autoplugtest.c | 136 ++++++++++++++++++++++++++------------------ 1 file changed, 80 insertions(+), 56 deletions(-) diff --git a/gst/autoplug/autoplugtest.c b/gst/autoplug/autoplugtest.c index daaf7d0..e62fd88 100644 --- a/gst/autoplug/autoplugtest.c +++ b/gst/autoplug/autoplugtest.c @@ -3,7 +3,53 @@ GstElement *pipeline, *src, *autobin, *cache, *typefind, *decoder, *sink; -void cache_empty(GstElement *element, gpointer private) { +/* callback for when we have the type of the file + * we set up a playing pipeline based on the mime type + */ +void +have_type (GstElement *element, GstCaps *caps, GstCaps **private_caps) +{ + gchar *mime = g_strdup_printf (gst_caps_get_mime (caps)); + fprintf (stderr, "have caps, mime type is %s\n", mime); + + gst_element_set_state (pipeline, GST_STATE_PAUSED); + + /* disconnect the typefind from the pipeline and remove it, + * since we now know what the type is */ + gst_element_disconnect (cache, typefind); + gst_bin_remove (GST_BIN (autobin), typefind); + + gst_scheduler_show (GST_ELEMENT_SCHED (pipeline)); + + /* now based on the mime type set up the pipeline properly */ + if (strstr (mime, "mp3")) { + decoder = gst_element_factory_make ("mad", "decoder"); + } + else if (strstr (mime, "x-ogg")) { + decoder = gst_element_factory_make ("vorbisfile", "decoder"); + } + else { + g_print ("mime type %s not handled in this program, exiting.\n", mime); + g_free (mime); + exit (-1); + } + g_free (mime); + + /* handle playback */ + sink = gst_element_factory_make ("osssink", "sink"); + gst_bin_add (GST_BIN (autobin), decoder); + gst_bin_add (GST_BIN (autobin), sink); + gst_element_connect (decoder, sink); + + g_object_set (G_OBJECT (cache), "reset", TRUE, NULL); + + gst_element_connect (cache, decoder); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + fprintf (stderr, "done with have_type signal, playing\n"); +} + +void cache_empty (GstElement *element, gpointer private) { fprintf(stderr,"have cache empty\n"); gst_element_set_state (pipeline, GST_STATE_PAUSED); @@ -23,70 +69,48 @@ void cache_empty(GstElement *element, gpointer private) { fprintf(stderr,"done with cache_empty\n"); } -void have_type(GstElement *element, GstCaps *caps, GstCaps **private_caps) { - fprintf(stderr,"have caps, mime type is %s\n",gst_caps_get_mime(caps)); - - gst_element_set_state (pipeline, GST_STATE_PAUSED); - - /* disconnect the typefind from the pipeline and remove it */ - gst_element_disconnect(cache,typefind); - gst_bin_remove(GST_BIN(autobin),typefind); - - gst_scheduler_show (GST_ELEMENT_SCHED(pipeline)); - - if (strstr(gst_caps_get_mime(caps),"mp3")) { - decoder = gst_element_factory_make ("mad","decoder"); - sink = gst_element_factory_make ("osssink","sink"); - gst_bin_add(GST_BIN(autobin),decoder); - gst_bin_add(GST_BIN(autobin),sink); - gst_element_connect_pads(decoder,"src",sink,"sink"); - - g_object_set (G_OBJECT(cache), "reset", TRUE, NULL); - - gst_element_connect_pads(cache,"src",decoder,"sink"); - } - else if (strstr(gst_caps_get_mime(caps),"x-ogg")) { - decoder = gst_element_factory_make ("vorbisdec","decoder"); - sink = gst_element_factory_make ("osssink","sink"); - gst_bin_add(GST_BIN(autobin),decoder); - gst_bin_add(GST_BIN(autobin),sink); - gst_element_connect_pads(decoder,"src",sink,"sink"); - - g_object_set (G_OBJECT(cache), "reset", TRUE, NULL); - - gst_element_connect_pads(cache,"src",decoder,"sink"); - } - - gst_element_set_state (pipeline, GST_STATE_PLAYING); - fprintf(stderr,"done with have_type signal\n"); -} - int main (int argc,char *argv[]) { GstCaps *caps; - gst_init(&argc,&argv); + gst_init (&argc, &argv); - pipeline = gst_pipeline_new("pipeline"); + pipeline = gst_pipeline_new ("pipeline"); src = gst_element_factory_make ("filesrc","src"); - g_object_set(G_OBJECT(src),"location",argv[1],NULL); - gst_bin_add (GST_BIN(pipeline),src); + if (argc < 2) { + g_print ("Please give a file to test the autoplugger on.\n"); + return -1; + } + g_object_set (G_OBJECT (src), "location", argv[1], NULL); + gst_bin_add (GST_BIN (pipeline), src); - autobin = gst_bin_new("autobin"); - cache = gst_element_factory_make ("autoplugcache","cache"); - g_signal_connect (G_OBJECT(cache),"cache_empty",(GCallback)cache_empty,NULL); - typefind = gst_element_factory_make ("typefind", "typefind"); - g_signal_connect (G_OBJECT(typefind),"have_type",(GCallback)have_type,&caps); - gst_bin_add (GST_BIN(autobin),cache); - gst_bin_add (GST_BIN(autobin),typefind); - gst_element_connect_pads (cache,"src",typefind,"sink"); - gst_element_add_ghost_pad(autobin,gst_element_get_pad(cache,"sink"),"sink"); + /* the autobin will be used to do the autoplugging in */ + autobin = gst_bin_new ("autobin"); - gst_bin_add (GST_BIN(pipeline), autobin); - gst_element_connect_pads (src,"src",autobin,"sink"); + /* a cache is used to make autoplugging quicker */ + cache = gst_element_factory_make ("autoplugcache", "cache"); + g_signal_connect (G_OBJECT (cache), "cache_empty", + G_CALLBACK (cache_empty), NULL); + /* typefind does the type detection */ + typefind = gst_element_factory_make ("typefind", "typefind"); - gst_element_set_state(pipeline,GST_STATE_PLAYING); + /* execute the callback when we find the type */ + g_signal_connect (G_OBJECT (typefind), "have_type", + G_CALLBACK (have_type), &caps); + gst_bin_add (GST_BIN (autobin), cache); + gst_bin_add (GST_BIN (autobin), typefind); + gst_element_connect (cache, typefind); + gst_element_add_ghost_pad (autobin, + gst_element_get_pad (cache, "sink") ,"sink"); + + gst_bin_add (GST_BIN (pipeline), autobin); + gst_element_connect (src, autobin); + + /* pipeline is now src ! autobin + * with autobin: cache ! typefind + */ + gst_element_set_state (pipeline, GST_STATE_PLAYING); - while (gst_bin_iterate(GST_BIN(pipeline))); + while (gst_bin_iterate (GST_BIN (pipeline))); return 0; } -- 2.7.4