diff --git a/docs/manual/advanced-threads.xml b/docs/manual/advanced-threads.xml index f4d5a10801..fef17023a5 100644 --- a/docs/manual/advanced-threads.xml +++ b/docs/manual/advanced-threads.xml @@ -79,8 +79,13 @@ +/* example-begin threads.c */ #include <gst/gst.h> +/* we set this to TRUE right before gst_main (), but there could still + be a race condition between setting it and entering the function */ +gboolean can_quit = FALSE; + /* eos will be called when the src element has an end of stream */ void eos (GstElement *src, gpointer data) @@ -91,18 +96,18 @@ eos (GstElement *src, gpointer data) /* stop the bin */ gst_element_set_state (GST_ELEMENT (thread), GST_STATE_NULL); + while (!can_quit) /* waste cycles */ ; gst_main_quit (); } int main (int argc, char *argv[]) { - GstElement *filesrc, *audiosink; - GstElement *pipeline; + GstElement *filesrc, *decoder, *audiosink; GstElement *thread; - if (argc != 2) { - g_print ("usage: %s <filename>\n", argv[0]); + if (argc < 2) { + g_print ("usage: %s <Ogg/Vorbis filename>\n", argv[0]); exit (-1); } @@ -112,10 +117,6 @@ main (int argc, char *argv[]) thread = gst_thread_new ("thread"); g_assert (thread != NULL); - /* create a new bin to hold the elements */ - pipeline = gst_pipeline_new ("pipeline"); - g_assert (pipeline != NULL); - /* create a disk reader */ filesrc = gst_element_factory_make ("filesrc", "disk_source"); g_assert (filesrc != NULL); @@ -123,42 +124,33 @@ main (int argc, char *argv[]) g_signal_connect (G_OBJECT (filesrc), "eos", G_CALLBACK (eos), thread); + /* create an ogg decoder */ + decoder = gst_element_factory_make ("vorbisfile", "decoder"); + g_assert (decoder != NULL); + /* and an audio sink */ - audiosink = gst_element_factory_make ("audiosink", "play_audio"); + audiosink = gst_element_factory_make ("osssink", "play_audio"); g_assert (audiosink != NULL); - /* add objects to the main pipeline */ - gst_bin_add (GST_BIN (pipeline), filesrc); - gst_bin_add (GST_BIN (pipeline), audiosink); - - /* automatically setup the pipeline */ - if (!gst_pipeline_autoplug (GST_PIPELINE (pipeline))) { - g_print ("unable to handle stream\n"); - exit (-1); - } - - /* remove the source element from the pipeline */ - gst_bin_remove (GST_BIN (pipeline), filesrc); - - /* insert the source element in the thread, remember a thread needs at - least one source or connection element */ - gst_bin_add (GST_BIN (thread), filesrc); - - /* add the pipeline to the thread too */ - gst_bin_add (GST_BIN (thread), GST_ELEMENT (pipeline)); + /* add objects to the thread */ + gst_bin_add_many (GST_BIN (thread), filesrc, decoder, audiosink, NULL); + /* connect them in the logical order */ + gst_element_connect_many (filesrc, decoder, audiosink, NULL); /* start playing */ gst_element_set_state (GST_ELEMENT (thread), GST_STATE_PLAYING); /* do whatever you want here, the thread will be playing */ - ... + g_print ("thread is playing\n"); + can_quit = TRUE; gst_main (); gst_pipeline_destroy (thread); exit (0); } +/* example-end threads.c */ diff --git a/docs/manual/threads.xml b/docs/manual/threads.xml index f4d5a10801..fef17023a5 100644 --- a/docs/manual/threads.xml +++ b/docs/manual/threads.xml @@ -79,8 +79,13 @@ +/* example-begin threads.c */ #include <gst/gst.h> +/* we set this to TRUE right before gst_main (), but there could still + be a race condition between setting it and entering the function */ +gboolean can_quit = FALSE; + /* eos will be called when the src element has an end of stream */ void eos (GstElement *src, gpointer data) @@ -91,18 +96,18 @@ eos (GstElement *src, gpointer data) /* stop the bin */ gst_element_set_state (GST_ELEMENT (thread), GST_STATE_NULL); + while (!can_quit) /* waste cycles */ ; gst_main_quit (); } int main (int argc, char *argv[]) { - GstElement *filesrc, *audiosink; - GstElement *pipeline; + GstElement *filesrc, *decoder, *audiosink; GstElement *thread; - if (argc != 2) { - g_print ("usage: %s <filename>\n", argv[0]); + if (argc < 2) { + g_print ("usage: %s <Ogg/Vorbis filename>\n", argv[0]); exit (-1); } @@ -112,10 +117,6 @@ main (int argc, char *argv[]) thread = gst_thread_new ("thread"); g_assert (thread != NULL); - /* create a new bin to hold the elements */ - pipeline = gst_pipeline_new ("pipeline"); - g_assert (pipeline != NULL); - /* create a disk reader */ filesrc = gst_element_factory_make ("filesrc", "disk_source"); g_assert (filesrc != NULL); @@ -123,42 +124,33 @@ main (int argc, char *argv[]) g_signal_connect (G_OBJECT (filesrc), "eos", G_CALLBACK (eos), thread); + /* create an ogg decoder */ + decoder = gst_element_factory_make ("vorbisfile", "decoder"); + g_assert (decoder != NULL); + /* and an audio sink */ - audiosink = gst_element_factory_make ("audiosink", "play_audio"); + audiosink = gst_element_factory_make ("osssink", "play_audio"); g_assert (audiosink != NULL); - /* add objects to the main pipeline */ - gst_bin_add (GST_BIN (pipeline), filesrc); - gst_bin_add (GST_BIN (pipeline), audiosink); - - /* automatically setup the pipeline */ - if (!gst_pipeline_autoplug (GST_PIPELINE (pipeline))) { - g_print ("unable to handle stream\n"); - exit (-1); - } - - /* remove the source element from the pipeline */ - gst_bin_remove (GST_BIN (pipeline), filesrc); - - /* insert the source element in the thread, remember a thread needs at - least one source or connection element */ - gst_bin_add (GST_BIN (thread), filesrc); - - /* add the pipeline to the thread too */ - gst_bin_add (GST_BIN (thread), GST_ELEMENT (pipeline)); + /* add objects to the thread */ + gst_bin_add_many (GST_BIN (thread), filesrc, decoder, audiosink, NULL); + /* connect them in the logical order */ + gst_element_connect_many (filesrc, decoder, audiosink, NULL); /* start playing */ gst_element_set_state (GST_ELEMENT (thread), GST_STATE_PLAYING); /* do whatever you want here, the thread will be playing */ - ... + g_print ("thread is playing\n"); + can_quit = TRUE; gst_main (); gst_pipeline_destroy (thread); exit (0); } +/* example-end threads.c */