Beispiel #1
0
static gboolean
gst_nas_sink_unprepare (GstAudioSink * asink)
{
    GstNasSink *sink = GST_NAS_SINK (asink);

    if (sink->flow != AuNone) {
        AuBool clocked;
        int num_elements;
        AuStatus status;
        AuElement *oldelems;

        GST_DEBUG_OBJECT (sink, "flushing buffer");
        NAS_flush (sink);

        oldelems =
            AuGetElements (sink->audio, sink->flow, &clocked, &num_elements,
                           &status);
        if (num_elements > 0) {
            GST_DEBUG_OBJECT (sink, "GetElements status: %i", status);
            if (oldelems)
                AuFreeElements (sink->audio, num_elements, oldelems);
        }

        AuStopFlow (sink->audio, sink->flow, NULL);
        AuReleaseScratchFlow (sink->audio, sink->flow, NULL);
        sink->flow = AuNone;
    }
    sink->need_data = 0;

    return TRUE;
}
Beispiel #2
0
static void
gst_nas_sink_reset (GstAudioSink * asink)
{
  GstNasSink *sink = GST_NAS_SINK (asink);

  GST_DEBUG_OBJECT (sink, "reset");

  NAS_flush (sink);
}
Beispiel #3
0
static guint
gst_nas_sink_write (GstAudioSink * asink, gpointer data, guint length)
{
    GstNasSink *nassink = GST_NAS_SINK (asink);
    int used = 0;

    NAS_flush (nassink);
    if (!nassink->mute && nassink->audio != NULL && nassink->flow != AuNone) {

        if (nassink->need_data == 0)
            return 0;

        used = nassink->need_data > length ? length : nassink->need_data;
        AuWriteElement (nassink->audio, nassink->flow, 0, used, data, AuFalse,
                        NULL);
        nassink->need_data -= used;
        if (used == length)
            AuSync (nassink->audio, AuFalse);
    } else
        used = length;
    return used;
}
Beispiel #4
0
static gboolean
gst_nas_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec)
{
  GstNasSink *sink = GST_NAS_SINK (asink);

  /*spec->bytes_per_sample = sink->rate * NAS_SOUND_PORT_DURATION; */
  /*spec->bytes_per_sample = (spec->width / 8) * spec->channels; */
  memset (spec->silence_sample, 0, spec->bytes_per_sample);
  GST_DEBUG_OBJECT (sink, "Sample %d", spec->bytes_per_sample);

  if (sink->audio == NULL)
    return TRUE;

  if (sink->flow != AuNone) {
    GST_DEBUG_OBJECT (sink, "flushing buffer");
    NAS_flush (sink);
    AuStopFlow (sink->audio, sink->flow, NULL);
    AuReleaseScratchFlow (sink->audio, sink->flow, NULL);
    sink->flow = AuNone;
  }

  return NAS_createFlow (sink, spec);
}
Beispiel #5
0
static gboolean
gst_nas_sink_close (GstAudioSink * asink)
{
  GstNasSink *sink = GST_NAS_SINK (asink);

  if (sink->audio == NULL)
    return TRUE;

  if (sink->flow != AuNone) {
    NAS_flush (sink);

    AuStopFlow (sink->audio, sink->flow, NULL);
    AuReleaseScratchFlow (sink->audio, sink->flow, NULL);
    sink->flow = AuNone;
  }

  sink->need_data = 0;

  AuCloseServer (sink->audio);
  sink->audio = NULL;

  GST_DEBUG_OBJECT (sink, "closed audio device");
  return TRUE;
}