/* vim: set filetype=c: */
% ClassName
GstAudioDecoder
% TYPE_CLASS_NAME
GST_TYPE_AUDIO_DECODER
% pads
srcpad-audio
sinkpad-simple
% pkg-config
gstreamer-audio-1.0
% includes
#include <gst/audio/gstaudiodecoder.h>
% prototypes
static gboolean gst_replace_start (GstAudioDecoder * decoder);
static gboolean gst_replace_stop (GstAudioDecoder * decoder);
static gboolean gst_replace_set_format (GstAudioDecoder * decoder, GstCaps * caps);
static GstFlowReturn gst_replace_parse (GstAudioDecoder * decoder,
    GstAdapter * adapter, gint * offset, gint * length);
static GstFlowReturn gst_replace_handle_frame (GstAudioDecoder * decoder,
    GstBuffer * buffer);
static void gst_replace_flush (GstAudioDecoder * decoder, gboolean hard);
static GstFlowReturn gst_replace_pre_push (GstAudioDecoder * decoder,
    GstBuffer ** buffer);
static gboolean gst_replace_sink_event (GstAudioDecoder * decoder,
    GstEvent * event);
static gboolean gst_replace_src_event (GstAudioDecoder * decoder, GstEvent * event);
static gboolean gst_replace_open (GstAudioDecoder * decoder);
static gboolean gst_replace_close (GstAudioDecoder * decoder);
static gboolean gst_replace_negotiate (GstAudioDecoder * decoder);
static gboolean gst_replace_decide_allocation (GstAudioDecoder * decoder,
    GstQuery * query);
static gboolean gst_replace_propose_allocation (GstAudioDecoder * decoder,
    GstQuery * query);
% declare-class
  GstAudioDecoderClass *audio_decoder_class = GST_AUDIO_DECODER_CLASS (klass);
% set-methods
  audio_decoder_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
  audio_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
  audio_decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_replace_set_format);
  audio_decoder_class->parse = GST_DEBUG_FUNCPTR (gst_replace_parse);
  audio_decoder_class->handle_frame = GST_DEBUG_FUNCPTR (gst_replace_handle_frame);
  audio_decoder_class->flush = GST_DEBUG_FUNCPTR (gst_replace_flush);
  audio_decoder_class->pre_push = GST_DEBUG_FUNCPTR (gst_replace_pre_push);
  audio_decoder_class->sink_event = GST_DEBUG_FUNCPTR (gst_replace_sink_event);
  audio_decoder_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
  audio_decoder_class->open = GST_DEBUG_FUNCPTR (gst_replace_open);
  audio_decoder_class->close = GST_DEBUG_FUNCPTR (gst_replace_close);
  audio_decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
  audio_decoder_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation);
  audio_decoder_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation);
% methods
static gboolean
gst_replace_start (GstAudioDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "start");

  return TRUE;
}

static gboolean
gst_replace_stop (GstAudioDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "stop");

  return TRUE;
}

static gboolean
gst_replace_set_format (GstAudioDecoder * decoder, GstCaps * caps)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "set_format");

  return TRUE;
}

static GstFlowReturn
gst_replace_parse (GstAudioDecoder * decoder, GstAdapter * adapter, gint * offset,
    gint * length)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "parse");

  return GST_FLOW_OK;
}

static GstFlowReturn
gst_replace_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "handle_frame");

  return GST_FLOW_OK;
}

static void
gst_replace_flush (GstAudioDecoder * decoder, gboolean hard)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "flush");

}

static GstFlowReturn
gst_replace_pre_push (GstAudioDecoder * decoder, GstBuffer ** buffer)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "pre_push");

  return GST_FLOW_OK;
}

static gboolean
gst_replace_sink_event (GstAudioDecoder * decoder, GstEvent * event)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "sink_event");

  return TRUE;
}

static gboolean
gst_replace_src_event (GstAudioDecoder * decoder, GstEvent * event)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "src_event");

  return TRUE;
}

static gboolean
gst_replace_open (GstAudioDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "open");

  return TRUE;
}

static gboolean
gst_replace_close (GstAudioDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "close");

  return TRUE;
}

static gboolean
gst_replace_negotiate (GstAudioDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "negotiate");

  return TRUE;
}

static gboolean
gst_replace_decide_allocation (GstAudioDecoder * decoder, GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "decide_allocation");

  return TRUE;
}

static gboolean
gst_replace_propose_allocation (GstAudioDecoder * decoder, GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "propose_allocation");

  return TRUE;
}
% end
