
<!-- ############ chapter ############# -->

<chapter id="chapter-building-queryfn">
  <title>The query function</title>
  <para>
    Through the query function, your element will receive queries that it
    has to reply to. These are queries like position, duration but also
    about the supported formats and scheduling modes your element supports.
    Queries can travel both upstream and downstream, so you can receive them
    on sink pads as well as source pads. 
  </para>
  <para>
    Below follows a very simple query function that we install on the source
    pad of our element.
  </para>
  <programlisting>
<![CDATA[
static gboolean gst_my_filter_src_query (GstPad    *pad,
                                         GstObject *parent,
                                         GstQuery  *query);

[..]

static void
gst_my_filter_init (GstMyFilter * filter)
{
[..]
  /* configure event function on the pad before adding
   * the pad to the element */
  gst_pad_set_query_function (filter->srcpad,
      gst_my_filter_src_query);
[..]
}

static gboolean
gst_my_filter_src_query (GstPad    *pad,
		         GstObject *parent,
		         GstQuery  *query)
{
  gboolean ret;
  GstMyFilter *filter = GST_MY_FILTER (parent);

  switch (GST_QUERY_TYPE (query)) {
    case GST_QUERY_POSITION:
      /* we should report the current position */
      [...]
      break;
    case GST_QUERY_DURATION:
      /* we should report the duration here */
      [...]
      break;
    case GST_QUERY_CAPS:
      /* we should report the supported caps here */
      [...]
      break;
    default:
      /* just call the default handler */
      ret = gst_pad_query_default (pad, parent, query);
      break;
  }
  return ret;
}
]]>
  </programlisting>
  <para>
    It is a good idea to call the default query handler
    <function>gst_pad_query_default ()</function> for unknown queries.
    Depending on the query type, the default handler will forward 
    the query or simply unref it.
  </para>
</chapter>
