<!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 -&gt; PLAYING
    works fine.<br>
    My program now updates the GUI (buttons, icons in the GUI) when the
    recording changes state from NULL -&gt; READY -&gt; PLAYING. This
    works OK.&nbsp; <br>
    <br>
    Also state change from PLAYING -&gt; 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) ?&nbsp;
    Obviously Gstreamer has no STOP/STREAM END message.&nbsp; Are there
    event-chain for PLAYING -&gt; PAUSED -&gt; 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:&nbsp; 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>
    &nbsp; Osmo Antero (Moma)<br>
    &nbsp; <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>