Hi,

calling clutter_threads_init() right before clutter_init() should fix
it.

:wq buz

On Fri, Nov 13, 2009 at 10:05:20AM +0200, Aapo Rantalainen wrote:
> Hi, I have problem with clutter1.0.6 behaviours and
> gstreamer-gnonlinear-plugin. I think I'm using gnonlinear proper way,
> because it works. If I add clutter and clutter_actor it still works.
> When I add clutter_behavour, application doesn't work anymore.
> 
> Application:
> I'm playing two different length wav-clip starting on same time.
> 
> Expected:
> Shorter ends and another continues playing.
> 
> What happens:
> When shorter ends, there are silence moment (cap). Sometimes it is
> short, sometimes long, and sometimes there are many caps.
> 
> 
> If I'm using alsasink, there are no message, with pulsesink I got this:
> pulse 
> pulsesink.c:523:gst_pulsering_stream_underflow_cb:<sink-actual-sink-pulse>
> Got underflow
> (This message comes even when it works.)
> 
> And as I said application works if I disable all clutter_behaviours.
> This is the reason I'm posting this to clutter list, not gstreamer
> list. Any advice is welcome. (Do this happens to you? Is this
> gstreamer's fault? Is this gnonlinear's fault?)
> 
> I made simples version which triggers this bug and it is easy to
> reproduce, you can download it from here (1.5M):
> http://cc.oulu.fi/~rantalai/clutter_gnonlin_bug.tar.gz
> 
> You need gstreamer0.10-gnonlin to run it.
> 
> make
> ./works.sh
> /trigger_bug.sh
> 
> 
> -Aapo Rantalainen
> 
> 
> And the application:
> 
> #include <gst/gst.h>
> #include <glib.h>
> #include <stdbool.h>
> #include <clutter/clutter.h>
> 
> 
> // Variables
> GstElement *conv1, *conv2;
> GstPad *audiopad;
> GstBus *bus;
> GMainLoop *loop;
> GstFormat fmt;
> gint64 pos, len;
> GstElement *pipeline;
> 
> static gboolean my_bus_callback (GstBus *bus, GstMessage *msg, gpointer    
> data)
> {
>   switch (GST_MESSAGE_TYPE (msg)) {
> 
>     case GST_MESSAGE_EOS:
>       g_print ("\nEnd of stream\n");
>       break;
> 
>     case GST_MESSAGE_ERROR: {
>       gchar  *debug;
>       GError *error;
> 
>       gst_message_parse_error (msg, &error, &debug);
>       g_free (debug);
> 
>       g_printerr ("Error: %s\n", error->message);
>       g_error_free (error);
>       break;
>     }
>     default:
>       break;
>   }
> 
>   return TRUE;
> }
> 
> 
> 
> 
> static void gnl_OnNewPad(GstElement *elem, GstPad *pad, gpointer data)
> {
>   GstPad *convsink;
> 
>   convsink = gst_element_get_compatible_pad(conv1, pad, 
> gst_pad_get_caps(pad));
>   if(convsink)
>     printf("Compatible pad found...\n");
>   else
>     printf("Compatible pad not found!\n");
>   gst_pad_link(pad, convsink);
>   if(GST_PAD_LINK_SUCCESSFUL(GST_PAD_LINK_OK))
>     printf("Linking successfully completed\n");
> 
>   printf("Element name: %s\n", gst_element_get_name(elem));
> 
>   gst_object_unref(convsink);
> }
> 
> static void gnl_OnNewPad2(GstElement *elem, GstPad *pad, gpointer data)
> {
>   GstPad *convsink;
> 
>   convsink = gst_element_get_compatible_pad(conv2, pad, 
> gst_pad_get_caps(pad));
>   if(convsink)
>     printf("Compatible pad found...\n");
>   else
>     printf("Compatible pad not found!\n");
>   gst_pad_link(pad, convsink);
>   if(GST_PAD_LINK_SUCCESSFUL(GST_PAD_LINK_OK))
>     printf("Linking successfully completed\n");
> 
>   printf("Element name: %s\n", gst_element_get_name(elem));
> 
>   gst_object_unref(convsink);
> }
> 
> 
> 
> gint player_init (gchar *location1, gchar *location2)
> {
>   GstElement *dec,  *track1, *track2, *adder, *audio1, *audio1_2,
> *audio2, *sink;
> 
>   gst_init (NULL, NULL);
> 
>   /* setup */
>   pipeline = gst_pipeline_new ("pipeline");
> 
>   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
>   gst_bus_add_watch (bus, my_bus_callback, NULL);
>   gst_object_unref (bus);
> 
>   /* track 1 */
>   track1 = gst_element_factory_make("gnlcomposition", "track1");
>   gst_bin_add(GST_BIN (pipeline), track1);
>   g_signal_connect (track1, "pad-added", G_CALLBACK (gnl_OnNewPad), NULL);
> 
>   /* add audio file to composition / track 1 */
>   audio1_2 = gst_element_factory_make("gnlfilesource", "audio1_2");
>   gst_bin_add(GST_BIN (track1), audio1_2);
>   g_object_set(G_OBJECT (audio1_2), "location", location1, NULL);
>   g_object_set(G_OBJECT (audio1_2), "start", 2 * GST_SECOND, NULL);
>   g_object_set(G_OBJECT (audio1_2), "duration", 5 * GST_SECOND, NULL);
>   g_object_set(G_OBJECT (audio1_2), "media-start", 0 * GST_SECOND, NULL);
>   g_object_set(G_OBJECT (audio1_2), "media-duration", 30 * GST_SECOND, NULL);
>   g_object_set(G_OBJECT (audio1_2), "priority", 0, NULL);
> 
> 
>   /* track 2 */
>   track2 = gst_element_factory_make("gnlcomposition", "track2");
>   gst_bin_add(GST_BIN (pipeline), track2);
>   g_signal_connect (track2, "pad-added", G_CALLBACK (gnl_OnNewPad2), NULL);
> 
>   /* add audio file to composition / track 2 */
>   audio2 = gst_element_factory_make("gnlfilesource", "audio2");
>   gst_bin_add(GST_BIN (track2), audio2);
>   g_object_set(G_OBJECT (audio2), "location", location2, NULL);
>   g_object_set(G_OBJECT (audio2), "start", 2 * GST_SECOND, NULL);
>   g_object_set(G_OBJECT (audio2), "duration", 6 * GST_SECOND, NULL);
>   g_object_set(G_OBJECT (audio2), "media-start", 0 * GST_SECOND, NULL);
>   g_object_set(G_OBJECT (audio2), "media-duration", 50 * GST_SECOND, NULL);
>   g_object_set(G_OBJECT (audio2), "priority", 0, NULL);
> 
> 
>   conv1 = gst_element_factory_make("audioconvert", "conv1");
>   conv2 = gst_element_factory_make("audioconvert", "conv2");
> 
>   adder = gst_element_factory_make("adder", "adder");
>   if(!adder)
>     printf("Couldn't create adder element!");
> 
>   sink = gst_element_factory_make("autoaudiosink", "sink");
> 
>   /* add elements to pipeline */
>   gst_bin_add_many(GST_BIN(pipeline), conv1, conv2, adder, sink, NULL);
> 
>   /* adder combines multiple channels (in our case tracks) to single output */
>   gst_element_link(conv1, adder);
>   gst_element_link(conv2, adder);
>   gst_element_link(adder, sink);
> 
>   return 0;
> }
> 
> 
> int main (int argc, char *argv[])
> {
>   if (argc<3)
>   {
>   printf("Usage: give 1.wav 2.wav [trigger_bug]\n");
>   printf("last parameter can be anything\n");
>   exit(0);
>   }
> 
>   gst_init (&argc, &argv);
>   GMainLoop *loop= g_main_loop_new (NULL, FALSE);
> 
>   ClutterActor     *stage;
>   ClutterActor     *actor;
>   clutter_init (&argc, &argv);
>   stage = clutter_stage_get_default ();
> 
> 
>   actor = clutter_texture_new_from_file("forest.png", NULL);
>           clutter_container_add_actor(CLUTTER_CONTAINER(stage), actor);
>   clutter_actor_set_position (actor, 150, 150);
>   ///////////////////////////////////////////
>   /* Make a timeline */
>   ClutterTimeline  *timeline;
>   ClutterBehaviour *behave;
>   ClutterAlpha     *behaviours_alpha;
> 
>   timeline = clutter_timeline_new (2000);
>   g_object_set(timeline, "loop", TRUE, NULL);
> 
>   behaviours_alpha = clutter_alpha_new_full (timeline, CLUTTER_LINEAR);
>   behave = clutter_behaviour_rotate_new (behaviours_alpha, CLUTTER_X_AXIS,
>                                           CLUTTER_ROTATE_CW, 0.0, 360.0);
> 
>   clutter_behaviour_apply (behave, actor);
>   if (argc==4)
>     clutter_timeline_start (timeline);
>   ///////////////////////////////////////////
>   clutter_actor_show_all(stage);
> 
>   player_init(argv[1],argv[2]);
> 
> 
>   gst_element_set_state(pipeline, GST_STATE_PLAYING);
> 
>   g_main_loop_run (loop);
>   return 0;
> }
> -- 
> To unsubscribe send a mail to [email protected]
> 

-- 
USER ERROR: replace user and press any key to continue.

GnuPG Fingerprint: 2FFF FC48 C7DF 1EA0 00A0  FD53 8C35 FD2E 6908 7B82

Attachment: signature.asc
Description: Digital signature

Reply via email to