<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body bgcolor="#ffffff" text="#000000">
Hello,<br>
I have created an audio-recorder application using the GStreamer
framework. My question is:<br>
How to catch and react to the EOS (end of stream, end of recording)
message? <br>
<br>
When starting a recording the state change from NULL -> PLAYING
works fine.<br>
My program now updates the GUI (buttons, icons in the GUI) when the
recording changes state from NULL -> READY -> PLAYING. This
works OK. <br>
<br>
Also state change from PLAYING -> PAUSED works fine. My program
captures the PAUSED message and updates the GUI. This is OK.<br>
<br>
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?<br>
<br>
<b>I want to update the GUI solely via the Gstreamer's state-change
messages/events. </b><br>
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.<br>
<br>
Here is how I setup the callback functions to receive
events/messages from the bus.<br>
See: rec_state_changed_cb(...) function in <br>
<a class="moz-txt-link-freetext" href="http://www.futuredesktop.com/tmp/gst-recorder.c">http://www.futuredesktop.com/tmp/gst-recorder.c</a> <br>
<br>
The message/event handlers are set up like this (in the
rec_create_pipeline(...) function) :<br>
<br>
// Add a message handlers<br>
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));<br>
gst_bus_add_signal_watch(bus);<br>
<br>
// Detect state changes<br>
g_signal_connect(bus, "message::state-changed",
G_CALLBACK(rec_state_changed_cb), NULL);<br>
<br>
// Monitor sound level/amplitude<br>
g_signal_connect(bus, "message::element",
G_CALLBACK(rec_level_message_cb), NULL);<br>
<br>
// Catch error messages<br>
g_signal_connect(bus, "message::error",
G_CALLBACK(rec_pipeline_error_cb), NULL);<br>
<br>
// EOS<br>
g_signal_connect(bus, "message::eos", G_CALLBACK(rec_eos_msg_cb),
NULL);<br>
<br>
gst_object_unref(bus);<br>
----<br>
<br>
Thanks,<br>
Osmo Antero (Moma)<br>
<a class="moz-txt-link-freetext" href="http://www.futuredesktop.org">http://www.futuredesktop.org</a><br>
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>