opensles: drop _buffer_clear calls and refactor to a shared _enqueue_cb

This commit is contained in:
Josep Torra 2012-09-25 18:04:27 +02:00 committed by Sebastian Dröge
parent 1694befac6
commit 1d9e16fb78
2 changed files with 14 additions and 55 deletions

View file

@ -102,27 +102,24 @@ _opensles_format (GstRingBufferSpec * spec, SLDataFormat_PCM * format)
(spec->bigend ? SL_BYTEORDER_BIGENDIAN : SL_BYTEORDER_LITTLEENDIAN); (spec->bigend ? SL_BYTEORDER_BIGENDIAN : SL_BYTEORDER_LITTLEENDIAN);
} }
/* Recorder related functions */
static void static void
_opensles_recorder_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context) _opensles_enqueue_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
{ {
GstRingBuffer *rb = GST_RING_BUFFER_CAST (context); GstRingBuffer *rb = GST_RING_BUFFER_CAST (context);
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb); GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
SLresult result; SLresult result;
guint8 *writeptr; guint8 *ptr;
gint writeseg; gint seg;
gint len; gint len;
if (!gst_ring_buffer_prepare_read (rb, &writeseg, &writeptr, &len)) { if (!gst_ring_buffer_prepare_read (rb, &seg, &ptr, &len)) {
GST_WARNING_OBJECT (rb, "No segment available"); GST_WARNING_OBJECT (rb, "No segment available");
return; return;
} }
/* Enqueue a buffer */ /* Enqueue a buffer */
GST_LOG_OBJECT (thiz, "enqueue: %p size %d segment: %d", GST_LOG_OBJECT (thiz, "enqueue: %p size %d segment: %d", ptr, len, seg);
writeptr, len, writeseg); result = (*thiz->bufferQueue)->Enqueue (thiz->bufferQueue, ptr, len);
result = (*thiz->bufferQueue)->Enqueue (thiz->bufferQueue, writeptr, len);
if (result != SL_RESULT_SUCCESS) { if (result != SL_RESULT_SUCCESS) {
GST_ERROR_OBJECT (thiz, "bufferQueue.Enqueue failed(0x%08x)", GST_ERROR_OBJECT (thiz, "bufferQueue.Enqueue failed(0x%08x)",
@ -133,6 +130,8 @@ _opensles_recorder_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
gst_ring_buffer_advance (rb, 1); gst_ring_buffer_advance (rb, 1);
} }
/* Recorder related functions */
static gboolean static gboolean
_opensles_recorder_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec) _opensles_recorder_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec)
{ {
@ -198,7 +197,7 @@ _opensles_recorder_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec)
/* Register callback on the buffer queue */ /* Register callback on the buffer queue */
result = (*thiz->bufferQueue)->RegisterCallback (thiz->bufferQueue, result = (*thiz->bufferQueue)->RegisterCallback (thiz->bufferQueue,
_opensles_recorder_cb, rb); _opensles_enqueue_cb, rb);
if (result != SL_RESULT_SUCCESS) { if (result != SL_RESULT_SUCCESS) {
GST_ERROR_OBJECT (thiz, "bufferQueue.RegisterCallback failed(0x%08x)", GST_ERROR_OBJECT (thiz, "bufferQueue.RegisterCallback failed(0x%08x)",
(guint32) result); (guint32) result);
@ -236,8 +235,8 @@ _opensles_recorder_start (GstRingBuffer * rb)
return FALSE; return FALSE;
} }
_opensles_recorder_cb (NULL, rb); _opensles_enqueue_cb (NULL, rb);
_opensles_recorder_cb (NULL, rb); _opensles_enqueue_cb (NULL, rb);
/* start recording */ /* start recording */
result = result =
@ -270,44 +269,6 @@ _opensles_recorder_stop (GstRingBuffer * rb)
/* Player related functions */ /* Player related functions */
static void
_opensles_player_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
{
GstRingBuffer *rb = GST_RING_BUFFER_CAST (context);
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
SLresult result;
guint8 *readptr;
gint readseg;
gint len;
if (!gst_ring_buffer_prepare_read (rb, &readseg, &readptr, &len)) {
GST_WARNING_OBJECT (rb, "The sink is starving");
return;
}
/* Enqueue a buffer */
GST_LOG_OBJECT (thiz, "enqueue: %p size %d segment: %d",
readptr, len, readseg);
result = (*thiz->bufferQueue)->Enqueue (thiz->bufferQueue, readptr, len);
if (result != SL_RESULT_SUCCESS) {
GST_ERROR_OBJECT (thiz, "bufferQueue.Enqueue failed(0x%08x)",
(guint32) result);
return;
}
if (G_UNLIKELY (thiz->last_clearseg < 0)) {
thiz->last_clearseg++;
} else {
GST_LOG_OBJECT (thiz, "clear segment %d", thiz->last_clearseg);
/* Clear written samples */
gst_ring_buffer_clear (rb, thiz->last_clearseg);
thiz->last_clearseg = (thiz->last_clearseg + 1) % rb->spec.segtotal;
/* We wrote one segment */
}
gst_ring_buffer_advance (rb, 1);
}
static gboolean static gboolean
_opensles_player_change_volume (GstRingBuffer * rb) _opensles_player_change_volume (GstRingBuffer * rb)
{ {
@ -414,7 +375,7 @@ _opensles_player_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec)
/* Register callback on the buffer queue */ /* Register callback on the buffer queue */
result = (*thiz->bufferQueue)->RegisterCallback (thiz->bufferQueue, result = (*thiz->bufferQueue)->RegisterCallback (thiz->bufferQueue,
_opensles_player_cb, rb); _opensles_enqueue_cb, rb);
if (result != SL_RESULT_SUCCESS) { if (result != SL_RESULT_SUCCESS) {
GST_ERROR_OBJECT (thiz, "bufferQueue.RegisterCallback failed(0x%08x)", GST_ERROR_OBJECT (thiz, "bufferQueue.RegisterCallback failed(0x%08x)",
(guint32) result); (guint32) result);
@ -437,7 +398,6 @@ _opensles_player_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec)
/* Define our ringbuffer in terms of number of buffers and buffer size. */ /* Define our ringbuffer in terms of number of buffers and buffer size. */
spec->segsize = (spec->rate * spec->bytes_per_sample) >> 2; spec->segsize = (spec->rate * spec->bytes_per_sample) >> 2;
spec->segtotal = 16; spec->segtotal = 16;
thiz->last_clearseg = 1 - spec->segtotal;
return TRUE; return TRUE;
@ -461,8 +421,8 @@ _opensles_player_start (GstRingBuffer * rb)
} }
/* Fill the queue by enqueing two buffers */ /* Fill the queue by enqueing two buffers */
_opensles_player_cb (NULL, rb); _opensles_enqueue_cb (NULL, rb);
_opensles_player_cb (NULL, rb); _opensles_enqueue_cb (NULL, rb);
return TRUE; return TRUE;
} }

View file

@ -84,7 +84,6 @@ struct _GstOpenSLESRingBuffer
/* buffer queue */ /* buffer queue */
SLAndroidSimpleBufferQueueItf bufferQueue; SLAndroidSimpleBufferQueueItf bufferQueue;
gint last_clearseg;
/* vmethods */ /* vmethods */
AcquireFunc acquire; AcquireFunc acquire;