diff options
Diffstat (limited to 'tests/examples/dynamic/sprinkle2.c')
-rw-r--r-- | tests/examples/dynamic/sprinkle2.c | 288 |
1 files changed, 0 insertions, 288 deletions
diff --git a/tests/examples/dynamic/sprinkle2.c b/tests/examples/dynamic/sprinkle2.c deleted file mode 100644 index abab47ce..00000000 --- a/tests/examples/dynamic/sprinkle2.c +++ /dev/null @@ -1,288 +0,0 @@ -/* GStreamer - * - * sprinkle.c: sample application to dynamically mix tones with adder - * - * Copyright (C) <2009> Wim Taymans <wim dot taymans at gmail dot com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Produces a sweeping sprinkle of tones by dynamically adding and removing - * elements to adder. - * - * gcc `pkg-config --cflags --libs gstreamer-0.10` sprinkle2.c -osprinkle2 - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gst/gst.h> - -static GstElement *pipeline, *adder; -static GMainLoop *loop; - -typedef struct -{ - GstElement *src, *fx; - GstPad *src_srcpad; - GstPad *fx_sinkpad, *fx_srcpad; - GstPad *adder_sinkpad; - gdouble freq; - gfloat pos; -} SourceInfo; - -/* dynamically add the source to the pipeline and link it to a new pad on - * adder */ -static SourceInfo * -add_source (gdouble freq, gfloat pos) -{ - SourceInfo *info; - - info = g_new0 (SourceInfo, 1); - info->freq = freq; - info->pos = pos; - - /* make source with unique name */ - info->src = gst_element_factory_make ("audiotestsrc", NULL); - info->fx = gst_element_factory_make ("audiopanorama", NULL); - - g_object_set (info->src, "freq", freq, "volume", (gdouble) 0.35, NULL); - g_object_set (info->fx, "panorama", pos, NULL); - - /* add to the bin */ - gst_bin_add (GST_BIN (pipeline), info->src); - gst_bin_add (GST_BIN (pipeline), info->fx); - - /* get pads from the elements */ - info->src_srcpad = gst_element_get_static_pad (info->src, "src"); - info->fx_srcpad = gst_element_get_static_pad (info->fx, "src"); - info->fx_sinkpad = gst_element_get_static_pad (info->fx, "sink"); - - /* get new pad from adder, adder will now wait for data on this pad */ - info->adder_sinkpad = gst_element_get_request_pad (adder, "sink%d"); - - /* link src to fx and fx to adder */ - gst_pad_link (info->fx_srcpad, info->adder_sinkpad); - gst_pad_link (info->src_srcpad, info->fx_sinkpad); - - /* and play the elements, change the state from sink to source */ - gst_element_set_state (info->fx, GST_STATE_PLAYING); - gst_element_set_state (info->src, GST_STATE_PLAYING); - - g_print ("added freq %5.0f, pos %3.1f\n", info->freq, info->pos); - - return info; -} - -/* remove the source from the pipeline after removing it from adder */ -static void -remove_source (SourceInfo * info) -{ - g_print ("remove freq %5.0f, pos %3.1f\n", info->freq, info->pos); - - /* lock the state so that we can put it to NULL without the parent messing - * with our state */ - gst_element_set_locked_state (info->src, TRUE); - gst_element_set_locked_state (info->fx, TRUE); - - /* first stop the source. Remember that this might block when in the PAUSED - * state. Alternatively one could send EOS to the source, install an event - * probe and schedule a state change/unlink/release from the mainthread. */ - gst_element_set_state (info->fx, GST_STATE_NULL); - /* NOTE that the source emits EOS when shutting down but the EOS will not - * reach the adder sinkpad because the effect is in the NULL state. We will - * send an EOS to adder later. */ - gst_element_set_state (info->src, GST_STATE_NULL); - - /* unlink from adder */ - gst_pad_unlink (info->src_srcpad, info->fx_sinkpad); - gst_pad_unlink (info->fx_srcpad, info->adder_sinkpad); - gst_object_unref (info->src_srcpad); - gst_object_unref (info->fx_srcpad); - gst_object_unref (info->fx_sinkpad); - - /* remove from the bin */ - gst_bin_remove (GST_BIN (pipeline), info->src); - gst_bin_remove (GST_BIN (pipeline), info->fx); - - /* send EOS to the sinkpad to make adder EOS when needed */ - gst_pad_send_event (info->adder_sinkpad, gst_event_new_eos ()); - - /* give back the pad */ - gst_element_release_request_pad (adder, info->adder_sinkpad); - gst_object_unref (info->adder_sinkpad); - - g_free (info); -} - -/* we'll keep the state of the sources in this structure. We keep 3 sources - * alive */ -typedef struct -{ - guint count; - SourceInfo *infos[3]; -} SprinkleState; - -static SprinkleState * -create_state (void) -{ - SprinkleState *state; - - state = g_new0 (SprinkleState, 1); - - return state; -} - -static void -free_state (SprinkleState * state) -{ - SourceInfo *info; - gint i; - - for (i = 0; i < 3; i++) { - info = state->infos[i]; - if (info) - remove_source (info); - } - - g_free (state); -} - -static gboolean -do_sprinkle (SprinkleState * state) -{ - SourceInfo *info; - gint i; - - /* first remove the oldest info */ - info = state->infos[2]; - - if (info) - remove_source (info); - - /* move sources */ - for (i = 2; i > 0; i--) { - state->infos[i] = state->infos[i - 1]; - } - - /* add new source, stop adding sources after 10 rounds. */ - if (state->count < 20) { - state->infos[0] = add_source ( - (gdouble) ((state->count * 100) + 200), - ((gfloat) (state->count % 5) / 2.0 - 1.0)); - state->count++; - } else { - state->infos[0] = NULL; - } - return TRUE; -} - -static void -message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline) -{ - const GstStructure *s; - - s = gst_message_get_structure (message); - g_print ("message from \"%s\" (%s): ", - GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))), - gst_message_type_get_name (GST_MESSAGE_TYPE (message))); - if (s) { - gchar *sstr; - - sstr = gst_structure_to_string (s); - g_print ("%s\n", sstr); - g_free (sstr); - } else { - g_print ("no message details\n"); - } -} - -static void -eos_message_received (GstBus * bus, GstMessage * message, - GstPipeline * pipeline) -{ - message_received (bus, message, pipeline); - g_main_loop_quit (loop); -} - -int -main (int argc, char *argv[]) -{ - GstBus *bus; - GstElement *filter, *convert, *sink; - GstCaps *caps; - gboolean res; - SprinkleState *state; - - gst_init (&argc, &argv); - - loop = g_main_loop_new (NULL, TRUE); - - pipeline = gst_pipeline_new ("pipeline"); - - /* add the fixed part to the pipeline. Remember that we need a capsfilter - * after adder so that multiple sources are not racing to negotiate - * a format */ - adder = gst_element_factory_make ("adder", "adder"); - filter = gst_element_factory_make ("capsfilter", "filter"); - convert = gst_element_factory_make ("audioconvert", "convert"); - sink = gst_element_factory_make ("autoaudiosink", "sink"); - - caps = gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, - "channels", G_TYPE_INT, 2, - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, - "rate", G_TYPE_INT, 44100, "signed", G_TYPE_BOOLEAN, TRUE, NULL); - g_object_set (filter, "caps", caps, NULL); - gst_caps_unref (caps); - - gst_bin_add_many (GST_BIN (pipeline), adder, filter, convert, sink, NULL); - - res = gst_element_link_many (adder, filter, convert, sink, NULL); - g_assert (res); - - /* setup message handling */ - bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); - gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH); - g_signal_connect (bus, "message::error", (GCallback) message_received, - pipeline); - g_signal_connect (bus, "message::warning", (GCallback) message_received, - pipeline); - g_signal_connect (bus, "message::eos", (GCallback) eos_message_received, - pipeline); - - /* we set the pipeline to PLAYING, the pipeline will not yet preroll because - * there is no source providing data for it yet */ - gst_element_set_state (pipeline, GST_STATE_PLAYING); - - /* and add the function that modifies the pipeline every 100ms */ - state = create_state (); - g_timeout_add (100, (GSourceFunc) do_sprinkle, state); - - /* go to main loop */ - g_main_loop_run (loop); - - gst_element_set_state (pipeline, GST_STATE_NULL); - - free_state (state); - gst_object_unref (bus); - gst_object_unref (pipeline); - - return 0; -} |