Capturing EOS message from the bus.

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Capturing EOS message from the bus.

Osmo Maatta
Hello,
I have created an audio-recorder application using the GStreamer framework. My question is:
How to catch and react to the EOS (end of stream, end of recording) message?

When starting a recording the state change from NULL -> PLAYING works fine.
My program now updates the GUI (buttons, icons in the GUI) when the recording changes state from NULL -> READY -> PLAYING. This works OK. 

Also state change from PLAYING -> PAUSED works fine. My program captures the PAUSED message and updates the GUI. This is OK.

But how to catch the STOP message (when the recording stops/ends) ?  Obviously Gstreamer has no STOP/STREAM END message.  Are there event-chain for PLAYING -> PAUSED -> STOP/NULL?

I want to update the GUI solely via the Gstreamer's state-change messages/events.
Why? Because the recording can be controlled from various places; directly from the GUI using buttons, it can be controlled from DBus by Media Players (like Amarok/RhythmBox/Banshee and there are threads involved etc.). So I want to update the GUI solely via (event's) state changes.

Here is how I setup the callback functions to receive events/messages from the bus.
See:  rec_state_changed_cb(...) function in
http://www.futuredesktop.com/tmp/gst-recorder.c

The message/event handlers are set up like this (in the rec_create_pipeline(...) function) :

// Add a message handlers
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_signal_watch(bus);

// Detect state changes
g_signal_connect(bus, "message::state-changed", G_CALLBACK(rec_state_changed_cb), NULL);

// Monitor sound level/amplitude
g_signal_connect(bus, "message::element", G_CALLBACK(rec_level_message_cb), NULL);

// Catch error messages
g_signal_connect(bus, "message::error", G_CALLBACK(rec_pipeline_error_cb), NULL);

// EOS
g_signal_connect(bus, "message::eos", G_CALLBACK(rec_eos_msg_cb), NULL);

gst_object_unref(bus);
----

Thanks,
  Osmo Antero (Moma)
  http://www.futuredesktop.org







------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: Capturing EOS message from the bus. [SOLVED]

Osmo Maatta
Re-hi,

Ok, I found a solution by studying the source of gnome-media-2.30.0/grecord.

My code now calls rec_set_state_to_null() function that sets the pipeline to GST_STATE_NULL state.  Rec_state_changed_cb(...) function receives now messages so the state goes from PLAYING -> PAUSED -> READY/NULL. And the GUI is updated appropriately.

Very good. I can now bake the code to my recorder.

void rec_set_state_to_null() {
    // Copyright notice:
    // Copied from gnome-media-2.30.0/grecord.

    // Set state of pipeline to GST_STATE_NULL.
    GstMessage *msg;
    GstState cur_state, pending;
    GstBus *bus;

    if (!GST_IS_PIPELINE(g_rec.pipeline)) return;

    gst_element_get_state(g_rec.pipeline, &cur_state, &pending, 0);

    if (cur_state == GST_STATE_NULL && pending == GST_STATE_VOID_PENDING)
        return;

    if (cur_state == GST_STATE_NULL && pending != GST_STATE_VOID_PENDING) {
        gst_element_set_state (g_rec.pipeline, GST_STATE_NULL);
        return;
    }

    gst_element_set_state(g_rec.pipeline, GST_STATE_READY);
    gst_element_get_state(g_rec.pipeline, NULL, NULL, -1);

    bus = gst_element_get_bus(g_rec.pipeline);
    if (GST_IS_BUS(bus)) {
        while ((msg = gst_bus_pop(bus))) {
            gst_bus_async_signal_func(bus, msg, NULL);

            gst_message_unref(msg);

        }
        gst_object_unref(bus);
    }

    gst_element_set_state(g_rec.pipeline, GST_STATE_NULL);
}

Thanks.
  Osmo Antero (Moma)
  http://www.futuredesktop.org


On 12/20/2010 11:43 AM, Osmo Antero Maatta wrote:
Hello,
I have created an audio-recorder application using the GStreamer framework. My question is:
How to catch and react to the EOS (end of stream, end of recording) message?

When starting a recording the state change from NULL -> PLAYING works fine.
My program now updates the GUI (buttons, icons in the GUI) when the recording changes state from NULL -> READY -> PLAYING. This works OK. 

Also state change from PLAYING -> PAUSED works fine. My program captures the PAUSED message and updates the GUI. This is OK.

But how to catch the STOP message (when the recording stops/ends) ?  Obviously Gstreamer has no STOP/STREAM END message.  Are there event-chain for PLAYING -> PAUSED -> STOP/NULL?

I want to update the GUI solely via the Gstreamer's state-change messages/events.
Why? Because the recording can be controlled from various places; directly from the GUI using buttons, it can be controlled from DBus by Media Players (like Amarok/RhythmBox/Banshee and there are threads involved etc.). So I want to update the GUI solely via (event's) state changes.

Here is how I setup the callback functions to receive events/messages from the bus.
See:  rec_state_changed_cb(...) function in
http://www.futuredesktop.com/tmp/gst-recorder.c

The message/event handlers are set up like this (in the rec_create_pipeline(...) function) :

// Add a message handlers
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_signal_watch(bus);

// Detect state changes
g_signal_connect(bus, "message::state-changed", G_CALLBACK(rec_state_changed_cb), NULL);

// Monitor sound level/amplitude
g_signal_connect(bus, "message::element", G_CALLBACK(rec_level_message_cb), NULL);

// Catch error messages
g_signal_connect(bus, "message::error", G_CALLBACK(rec_pipeline_error_cb), NULL);

// EOS
g_signal_connect(bus, "message::eos", G_CALLBACK(rec_eos_msg_cb), NULL);

gst_object_unref(bus);
----

Thanks,
  Osmo Antero (Moma)
  http://www.futuredesktop.org









------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel