/* function is called with LOCK */ static gboolean gst_audioringbuffer_release (GstRingBuffer * buf) { GstAudioSink *sink; GstAudioSinkClass *csink; gboolean result = FALSE; sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); csink = GST_AUDIO_SINK_GET_CLASS (sink); /* free the buffer */ gst_buffer_unref (buf->data); buf->data = NULL; if (csink->unprepare) result = csink->unprepare (sink); if (!result) goto could_not_unprepare; GST_DEBUG_OBJECT (sink, "unprepared"); return result; could_not_unprepare: { GST_DEBUG_OBJECT (sink, "could not unprepare device"); return FALSE; } }
static gboolean gst_audioringbuffer_stop (GstRingBuffer * buf) { GstAudioSink *sink; GstAudioSinkClass *csink; sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); csink = GST_AUDIO_SINK_GET_CLASS (sink); /* unblock any pending writes to the audio device */ if (csink->reset) { GST_DEBUG_OBJECT (sink, "reset..."); csink->reset (sink); GST_DEBUG_OBJECT (sink, "reset done"); } #if 0 if (abuf->running) { GST_DEBUG_OBJECT (sink, "stop, waiting..."); GST_AUDIORING_BUFFER_WAIT (buf); GST_DEBUG_OBJECT (sink, "stopped"); } #endif return TRUE; }
static gboolean gst_audioringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec) { GstAudioSink *sink; GstAudioSinkClass *csink; gboolean result = FALSE; sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); csink = GST_AUDIO_SINK_GET_CLASS (sink); if (csink->prepare) result = csink->prepare (sink, spec); if (!result) goto could_not_prepare; /* set latency to one more segment as we need some headroom */ spec->seglatency = spec->segtotal + 1; buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize); memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data)); return TRUE; /* ERRORS */ could_not_prepare: { GST_DEBUG_OBJECT (sink, "could not prepare device"); return FALSE; } }
static guint gst_audioringbuffer_delay (GstRingBuffer * buf) { GstAudioSink *sink; GstAudioSinkClass *csink; guint res = 0; sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); csink = GST_AUDIO_SINK_GET_CLASS (sink); if (csink->delay) res = csink->delay (sink); return res; }
static gboolean gst_audioringbuffer_pause (GstRingBuffer * buf) { GstAudioSink *sink; GstAudioSinkClass *csink; sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); csink = GST_AUDIO_SINK_GET_CLASS (sink); /* unblock any pending writes to the audio device */ if (csink->reset) { GST_DEBUG_OBJECT (sink, "reset..."); csink->reset (sink); GST_DEBUG_OBJECT (sink, "reset done"); } return TRUE; }
static gboolean gst_audio_sink_ring_buffer_acquire (GstAudioRingBuffer * buf, GstAudioRingBufferSpec * spec) { GstAudioSink *sink; GstAudioSinkClass *csink; gboolean result = FALSE; sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); csink = GST_AUDIO_SINK_GET_CLASS (sink); if (csink->prepare) result = csink->prepare (sink, spec); if (!result) goto could_not_prepare; /* set latency to one more segment as we need some headroom */ spec->seglatency = spec->segtotal + 1; buf->size = spec->segtotal * spec->segsize; buf->memory = g_malloc (buf->size); if (buf->spec.type == GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW) { gst_audio_format_fill_silence (buf->spec.info.finfo, buf->memory, buf->size); } else { /* FIXME, non-raw formats get 0 as the empty sample */ memset (buf->memory, 0, buf->size); } return TRUE; /* ERRORS */ could_not_prepare: { GST_DEBUG_OBJECT (sink, "could not prepare device"); return FALSE; } }
static gboolean gst_audioringbuffer_close_device (GstRingBuffer * buf) { GstAudioSink *sink; GstAudioSinkClass *csink; gboolean result = TRUE; sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); csink = GST_AUDIO_SINK_GET_CLASS (sink); if (csink->close) result = csink->close (sink); if (!result) goto could_not_close; return result; could_not_close: { GST_DEBUG_OBJECT (sink, "could not close device"); return FALSE; } }
static gboolean gst_audio_sink_ring_buffer_open_device (GstAudioRingBuffer * buf) { GstAudioSink *sink; GstAudioSinkClass *csink; gboolean result = TRUE; sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf)); csink = GST_AUDIO_SINK_GET_CLASS (sink); if (csink->open) result = csink->open (sink); if (!result) goto could_not_open; return result; could_not_open: { GST_DEBUG_OBJECT (sink, "could not open device"); return FALSE; } }