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; }
static void gst_nas_sink_reset (GstAudioSink * asink) { GstNasSink *sink = GST_NAS_SINK (asink); GST_DEBUG_OBJECT (sink, "reset"); NAS_flush (sink); }
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; }
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); }
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; }