<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
I see a *very* strange behavior of a function I've written.<br><br>I get data's for spectral analysis from either (1) a mic, or (2) a sound<br>file, or (3) from from jack input. Then the values of the spectrum are send<br>to a function that diplay it on a 3d graph (with openGL).<br><br>I have made possible to disable jack support&nbsp; : with a define, jack's code<br>is not included.<br><br>The very strange behavior is this : when jack is enabled, everything works<br>fine; when jack is disabled, displaying data from source is ok, BUT NOT FROM<br>AUDIO FILE, although these 2 path (input from audio file and input from<br>jack) are not related to each other...). When this happens, the audio file<br>is played; i can hear it, but it seems that no messages are passed to the<br>message handler that result in displaying the values of the sprectrum...<br><br>Everything is declared like this:<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; AUDIOFREQ = 44100;<br>&nbsp;&nbsp;&nbsp; int interval = 100000000;<br>&nbsp;&nbsp;&nbsp; GstElement *src, *dec, *audioconvert, *conv, *spectrum, *sink;<br>&nbsp;&nbsp;&nbsp; GstBus *bus;<br>&nbsp;&nbsp;&nbsp; GstCaps *caps;<br>&nbsp;&nbsp;&nbsp; GstPad *audiopad;<br>&nbsp;&nbsp;&nbsp; GstStateChangeReturn ret;<br><br>// pipeline is initialized as a global variable since it is necessary in<br>many other functions<br><br>//Then here are the function to play the sound :<br><br>&nbsp;&nbsp;&nbsp; gst_init (NULL, NULL);<br>&nbsp;&nbsp;&nbsp; loop = g_main_loop_new(NULL, FALSE);<br>&nbsp;&nbsp;&nbsp; playing = 1;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;&nbsp;&nbsp; if (typeSource == 0) { // source == microphone <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pipeline = gst_pipeline_new ("pipeline");<br>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_bus_add_watch(bus, message_handler, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_object_unref(bus);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; src = gst_element_factory_make ("alsasrc", "src");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; audioconvert = gst_element_factory_make ("audioconvert", NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_assert (audioconvert);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; spectrum = gst_element_factory_make ("spectrum", "spectrum");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,<br>"interval", interval, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sink = gst_element_factory_make ("fakesink", "sink");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_bin_add_many (GST_BIN (pipeline), src, audioconvert, spectrum, sink,<br>NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT,<br>AUDIOFREQ, NULL);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!gst_element_link (src, audioconvert) ||<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; !gst_element_link_filtered (audioconvert, spectrum, caps) ||<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; !gst_element_link (spectrum, sink)) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; fprintf (stderr, "can't link elements\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit (1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_caps_unref (caps);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ret == GST_STATE_CHANGE_FAILURE) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_print ("Failed to start up pipeline!\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_main_loop_run (loop);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_element_set_state (pipeline, GST_STATE_NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_object_unref(pipeline);<br>&nbsp;&nbsp;&nbsp; }<br><br>else if (typeSource == 1) { // source == file read from disk<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int positionTimeout = 0, seekTimeout = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pipeline = gst_pipeline_new ("pipeline");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_bus_add_watch (bus, message_handler, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_object_unref (bus);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; src = gst_element_factory_make ("filesrc", "source");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_object_set (G_OBJECT (src), "location", sFile, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dec = gst_element_factory_make ("decodebin", "decoder");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; spectrum = gst_element_factory_make ("spectrum", "spectrum");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; "message", TRUE, "message-phase", TRUE, "interval", interval, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_element_link (src, dec);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; audio = gst_bin_new ("audiobin");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conv = gst_element_factory_make ("audioconvert", "aconv");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; audiopad = gst_element_get_static_pad (conv, "sink");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sink = gst_element_factory_make ("alsasink", "sink");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_bin_add_many (GST_BIN (audio), conv, spectrum, sink, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_element_link_many (conv, spectrum, sink, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_element_add_pad (audio,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_ghost_pad_new ("sink", audiopad));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_object_unref (audiopad);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_bin_add (GST_BIN (pipeline), audio);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_timeout_add (200, (GSourceFunc) cb_print_position, pipeline);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_element_set_state (pipeline, GST_STATE_PLAYING);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_timeout_add (101, (GSourceFunc) seek_to_time, pipeline);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_main_loop_run (loop);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_element_set_state (pipeline, GST_STATE_NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_object_unref (GST_OBJECT (pipeline));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_source_remove(positionTimeout);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_source_remove(seekTimeout);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("stop playing\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; filenames = filenames-&gt;next;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; getFileName();&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if (typeSource == 2) //source == JACK <br>&nbsp;&nbsp;&nbsp; {<br>#ifdef JACK // this include or not the code for jack's support<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pipeline = gst_pipeline_new ("pipeline");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_bus_add_watch(bus, message_handler, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_object_unref(bus);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jack_client_t *src_client;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; jack_status_t status;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; src_client = jack_client_open ("src_client", JackNoStartServer, &amp;status);<br>// create jack clients<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (src_client == NULL) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (status &amp; JackServerFailed){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GtkWidget *pAbout;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //gchar *sSite = "";<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pAbout = gtk_message_dialog_new (GTK_WINDOW(mainWindow),<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GTK_DIALOG_MODAL,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GTK_MESSAGE_WARNING,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GTK_BUTTONS_OK,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "JACK server not running");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gtk_dialog_run(GTK_DIALOG(pAbout));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_destroy(pAbout);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SDL_Quit();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; playing = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GtkWidget *pAbout;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gchar *sSite = "";<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pAbout = gtk_message_dialog_new (GTK_WINDOW(mainWindow),<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GTK_DIALOG_MODAL,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GTK_MESSAGE_WARNING,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GTK_BUTTONS_OK,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "jack_client_open() failed %s",<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sSite);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gtk_dialog_run(GTK_DIALOG(pAbout));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_destroy(pAbout);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SDL_Quit();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; src = gst_element_factory_make ("jackaudiosrc", NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sink = gst_element_factory_make ("fakesink", NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; spectrum = gst_element_factory_make ("spectrum", "spectrum");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,<br>"interval", interval, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_bin_add_many (GST_BIN (pipeline), src, spectrum, sink, NULL);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!gst_element_link (src, spectrum) ||<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; !gst_element_link (spectrum, sink)) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf (stderr, "can't link elements\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit (1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_element_set_state(pipeline, GST_STATE_PLAYING);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g_main_loop_run (loop);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_element_set_state (pipeline, GST_STATE_NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gst_object_unref(pipeline);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; #endif<br>&nbsp;&nbsp;&nbsp; }<br><br>Actually I have put a counter in the 'message handler' that is supposed to<br>be called; when I have problems, i can see that the counter stop after 48<br>calls.....<br><br>This is REALLY unbelivable, since the 3 parts of the functions (analyse from<br>mic or from file or from jack) have completely separate path........<br><br>Wold someone have a clue...?<br><br>Victor<br><br>--<br>View this message in context: <a href="http://gstreamer-devel.966125.n4.nabble.com/very-strange-behavior-related-to-jack-support-tp3469041p3469041.html" target="_blank">http://gstreamer-devel.966125.n4.nabble.com/very-strange-behavior-related-to-jack-support-tp3469041p3469041.html</a><br>Sent from the GStreamer-devel mailing list archive at Nabble.com.                                               </body>
</html>