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 |
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, ------------------------------------------------------------------------------ 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 |
Free forum by Nabble | Edit this page |