very strange behavior related to jack support

Victor henri nadaeck at hotmail.com
Fri Apr 22 15:53:42 PDT 2011


I see a *very* strange behavior of a function I've written.

I get data's for spectral analysis from either (1) a mic, or (2) a sound
file, or (3) from from jack input. Then the values of the spectrum are send
to a function that diplay it on a 3d graph (with openGL).

I have made possible to disable jack support  : with a define, jack's code
is not included.

The very strange behavior is this : when jack is enabled, everything works
fine; when jack is disabled, displaying data from source is ok, BUT NOT FROM
AUDIO FILE, although these 2 path (input from audio file and input from
jack) are not related to each other...). When this happens, the audio file
is played; i can hear it, but it seems that no messages are passed to the
message handler that result in displaying the values of the sprectrum...

Everything is declared like this:
    
    AUDIOFREQ = 44100;
    int interval = 100000000;
    GstElement *src, *dec, *audioconvert, *conv, *spectrum, *sink;
    GstBus *bus;
    GstCaps *caps;
    GstPad *audiopad;
    GstStateChangeReturn ret;

// pipeline is initialized as a global variable since it is necessary in
many other functions

//Then here are the function to play the sound :

    gst_init (NULL, NULL);
    loop = g_main_loop_new(NULL, FALSE);
    playing = 1;
            
    if (typeSource == 0) { // source == microphone 
        pipeline = gst_pipeline_new ("pipeline");
            bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
        gst_bus_add_watch(bus, message_handler, NULL);
        gst_object_unref(bus);
        src = gst_element_factory_make ("alsasrc", "src");
        audioconvert = gst_element_factory_make ("audioconvert", NULL);
        g_assert (audioconvert);
        spectrum = gst_element_factory_make ("spectrum", "spectrum");
        g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,
"interval", interval, NULL);
        sink = gst_element_factory_make ("fakesink", "sink");
        gst_bin_add_many (GST_BIN (pipeline), src, audioconvert, spectrum, sink,
NULL);
        caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT,
AUDIOFREQ, NULL);

            if (!gst_element_link (src, audioconvert) ||
                !gst_element_link_filtered (audioconvert, spectrum, caps) ||
                !gst_element_link (spectrum, sink)) {
                fprintf (stderr, "can't link elements\n");
                exit (1);
                }
        gst_caps_unref (caps);
        ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
            if (ret == GST_STATE_CHANGE_FAILURE) {
                g_print ("Failed to start up pipeline!\n");
                }
        g_main_loop_run (loop);
        gst_element_set_state (pipeline, GST_STATE_NULL);
        gst_object_unref(pipeline);
    }

else if (typeSource == 1) { // source == file read from disk
        int positionTimeout = 0, seekTimeout = 0;
        pipeline = gst_pipeline_new ("pipeline");
        bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
        gst_bus_add_watch (bus, message_handler, NULL);
        gst_object_unref (bus);

        src = gst_element_factory_make ("filesrc", "source");
        g_object_set (G_OBJECT (src), "location", sFile, NULL);
        dec = gst_element_factory_make ("decodebin", "decoder");
        g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL);
        spectrum = gst_element_factory_make ("spectrum", "spectrum");
        g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,
            "message", TRUE, "message-phase", TRUE, "interval", interval, NULL);
        gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);
        gst_element_link (src, dec);

        audio = gst_bin_new ("audiobin");
        conv = gst_element_factory_make ("audioconvert", "aconv");
        audiopad = gst_element_get_static_pad (conv, "sink");
        sink = gst_element_factory_make ("alsasink", "sink");
        gst_bin_add_many (GST_BIN (audio), conv, spectrum, sink, NULL);
        gst_element_link_many (conv, spectrum, sink, NULL);
        gst_element_add_pad (audio,
        gst_ghost_pad_new ("sink", audiopad));
        gst_object_unref (audiopad);
        gst_bin_add (GST_BIN (pipeline), audio);
        
        g_timeout_add (200, (GSourceFunc) cb_print_position, pipeline);
        gst_element_set_state (pipeline, GST_STATE_PLAYING);
        g_timeout_add (101, (GSourceFunc) seek_to_time, pipeline);

        g_main_loop_run (loop);
        gst_element_set_state (pipeline, GST_STATE_NULL);
        gst_object_unref (GST_OBJECT (pipeline));
        g_source_remove(positionTimeout);
        g_source_remove(seekTimeout);
        printf("stop playing\n");
        filenames = filenames->next;
        getFileName();    
        }
    else if (typeSource == 2) //source == JACK 
    {
#ifdef JACK // this include or not the code for jack's support
        pipeline = gst_pipeline_new ("pipeline");
        bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
        gst_bus_add_watch(bus, message_handler, NULL);
        gst_object_unref(bus);
        jack_client_t *src_client;
        jack_status_t status;

        src_client = jack_client_open ("src_client", JackNoStartServer, &status);
// create jack clients
        if (src_client == NULL) {
            if (status & JackServerFailed){
                GtkWidget *pAbout;
                //gchar *sSite = "";
                pAbout = gtk_message_dialog_new (GTK_WINDOW(mainWindow),
                    GTK_DIALOG_MODAL,
                    GTK_MESSAGE_WARNING,
                    GTK_BUTTONS_OK,
                    "JACK server not running");
                gtk_dialog_run(GTK_DIALOG(pAbout));
                     gtk_widget_destroy(pAbout);
                SDL_Quit();
                playing = 0;
                }
            else {
                GtkWidget *pAbout;
                gchar *sSite = "";
                pAbout = gtk_message_dialog_new (GTK_WINDOW(mainWindow),
                    GTK_DIALOG_MODAL,
                    GTK_MESSAGE_WARNING,
                    GTK_BUTTONS_OK,
                    "jack_client_open() failed %s",
                    sSite);
                gtk_dialog_run(GTK_DIALOG(pAbout));
                     gtk_widget_destroy(pAbout);
                SDL_Quit();
                exit(1);
                }              
            }

        src = gst_element_factory_make ("jackaudiosrc", NULL);
        sink = gst_element_factory_make ("fakesink", NULL);
        spectrum = gst_element_factory_make ("spectrum", "spectrum");
        g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,
"interval", interval, NULL);
        gst_bin_add_many (GST_BIN (pipeline), src, spectrum, sink, NULL);

            if (!gst_element_link (src, spectrum) ||
                !gst_element_link (spectrum, sink)) {
            fprintf (stderr, "can't link elements\n");
            exit (1);
            }
        gst_element_set_state(pipeline, GST_STATE_PLAYING);
        g_main_loop_run (loop);
        gst_element_set_state (pipeline, GST_STATE_NULL);
        gst_object_unref(pipeline);
        #endif
    }

Actually I have put a counter in the 'message handler' that is supposed to
be called; when I have problems, i can see that the counter stop after 48
calls.....

This is REALLY unbelivable, since the 3 parts of the functions (analyse from
mic or from file or from jack) have completely separate path........

Wold someone have a clue...?

Victor

--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/very-strange-behavior-related-to-jack-support-tp3469041p3469041.html
Sent from the GStreamer-devel mailing list archive at Nabble.com. 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20110423/ae83721b/attachment.htm>


More information about the gstreamer-devel mailing list