/* vim: set filetype=c: */
% ClassName
GstAudioSink
% TYPE_CLASS_NAME
GST_TYPE_AUDIO_SINK
% pads
sinkpad-audio
% pkg-config
gstreamer-audio-1.0
% includes
#include <gst/audio/gstaudiosink.h>
% prototypes
static gboolean gst_replace_open (GstAudioSink * sink);
static gboolean gst_replace_prepare (GstAudioSink * sink,
    GstAudioRingBufferSpec * spec);
static gboolean gst_replace_unprepare (GstAudioSink * sink);
static gboolean gst_replace_close (GstAudioSink * sink);
static gint gst_replace_write (GstAudioSink * sink, gpointer data,
    guint length);
static guint gst_replace_delay (GstAudioSink * sink);
static void gst_replace_reset (GstAudioSink * sink);
% declare-class
  GstAudioSinkClass *audio_sink_class = GST_AUDIO_SINK_CLASS (klass);
% set-methods
  audio_sink_class->open = GST_DEBUG_FUNCPTR (gst_replace_open);
  audio_sink_class->prepare = GST_DEBUG_FUNCPTR (gst_replace_prepare);
  audio_sink_class->unprepare = GST_DEBUG_FUNCPTR (gst_replace_unprepare);
  audio_sink_class->close = GST_DEBUG_FUNCPTR (gst_replace_close);
  audio_sink_class->write = GST_DEBUG_FUNCPTR (gst_replace_write);
  audio_sink_class->delay = GST_DEBUG_FUNCPTR (gst_replace_delay);
  audio_sink_class->reset = GST_DEBUG_FUNCPTR (gst_replace_reset);
% methods
/* open the device with given specs */
static gboolean
gst_replace_open (GstAudioSink * sink)
{
  GstReplace *replace = GST_REPLACE (sink);

  GST_DEBUG_OBJECT (replace, "open");

  return TRUE;
}

/* prepare resources and state to operate with the given specs */
static gboolean
gst_replace_prepare (GstAudioSink * sink, GstAudioRingBufferSpec * spec)
{
  GstReplace *replace = GST_REPLACE (sink);

  GST_DEBUG_OBJECT (replace, "prepare");

  return TRUE;
}

/* undo anything that was done in prepare() */
static gboolean
gst_replace_unprepare (GstAudioSink * sink)
{
  GstReplace *replace = GST_REPLACE (sink);

  GST_DEBUG_OBJECT (replace, "unprepare");

  return TRUE;
}

/* close the device */
static gboolean
gst_replace_close (GstAudioSink * sink)
{
  GstReplace *replace = GST_REPLACE (sink);

  GST_DEBUG_OBJECT (replace, "close");

  return TRUE;
}

/* write samples to the device */
static gint
gst_replace_write (GstAudioSink * sink, gpointer data, guint length)
{
  GstReplace *replace = GST_REPLACE (sink);

  GST_DEBUG_OBJECT (replace, "write");

  return 0;
}

/* get number of samples queued in the device */
static guint
gst_replace_delay (GstAudioSink * sink)
{
  GstReplace *replace = GST_REPLACE (sink);

  GST_DEBUG_OBJECT (replace, "delay");

  return 0;
}

/* reset the audio device, unblock from a write */
static void
gst_replace_reset (GstAudioSink * sink)
{
  GstReplace *replace = GST_REPLACE (sink);

  GST_DEBUG_OBJECT (replace, "reset");

}
% end
