opensles: implement _delay function

This commit is contained in:
Josep Torra 2012-09-27 05:40:46 +02:00 committed by Sebastian Dröge
parent 9fcfa00680
commit 27cdb7c2ca
2 changed files with 23 additions and 15 deletions

View file

@ -104,16 +104,6 @@ _opensles_format (GstRingBufferSpec * spec, SLDataFormat_PCM * format)
(spec->bigend ? SL_BYTEORDER_BIGENDIAN : SL_BYTEORDER_LITTLEENDIAN); (spec->bigend ? SL_BYTEORDER_BIGENDIAN : SL_BYTEORDER_LITTLEENDIAN);
} }
static inline void
_opensles_player_read_position (GstOpenSLESRingBuffer * thiz)
{
if (thiz->playerPlay) {
SLmillisecond position;
(*thiz->playerPlay)->GetPosition (thiz->playerPlay, &position);
GST_LOG_OBJECT (thiz, "position %u ms", (guint) position);
}
}
/* Recorder related functions */ /* Recorder related functions */
static gboolean static gboolean
@ -199,8 +189,6 @@ _opensles_recorder_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
gint seg; gint seg;
gint len; gint len;
_opensles_player_read_position (thiz);
if (!gst_ring_buffer_prepare_read (rb, &seg, &ptr, &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;
@ -428,8 +416,6 @@ _opensles_player_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
gint seg; gint seg;
gint len; gint len;
_opensles_player_read_position (thiz);
if (!gst_ring_buffer_prepare_read (rb, &seg, &ptr, &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;
@ -439,6 +425,7 @@ _opensles_player_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
cur = thiz->data + (thiz->cursor * rb->spec.segsize); cur = thiz->data + (thiz->cursor * rb->spec.segsize);
thiz->cursor = (thiz->cursor + 1) % thiz->data_segtotal; thiz->cursor = (thiz->cursor + 1) % thiz->data_segtotal;
memcpy (cur, ptr, len); memcpy (cur, ptr, len);
thiz->queued_samples += len / rb->spec.bytes_per_sample;
/* Enqueue a buffer */ /* Enqueue a buffer */
GST_LOG_OBJECT (thiz, "enqueue: %p size %d segment: %d", cur, len, seg); GST_LOG_OBJECT (thiz, "enqueue: %p size %d segment: %d", cur, len, seg);
@ -538,6 +525,8 @@ _opensles_player_stop (GstRingBuffer * rb)
return FALSE; return FALSE;
} }
thiz->queued_samples = 0;
return TRUE; return TRUE;
} }
@ -784,7 +773,25 @@ gst_opensles_ringbuffer_stop (GstRingBuffer * rb)
static guint static guint
gst_opensles_ringbuffer_delay (GstRingBuffer * rb) gst_opensles_ringbuffer_delay (GstRingBuffer * rb)
{ {
return 0; GstOpenSLESRingBuffer *thiz;
SLmillisecond position;
guint64 samplepos;
guint res = 0;
thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
if (thiz->playerPlay) {
(*thiz->playerPlay)->GetPosition (thiz->playerPlay, &position);
samplepos = gst_util_uint64_scale_round (position, rb->spec.rate, 1000);
res = thiz->queued_samples - samplepos;
GST_LOG_OBJECT (thiz, "queued samples %" G_GUINT64_FORMAT " position %u ms "
"(%" G_GUINT64_FORMAT " samples) delay %u samples",
thiz->queued_samples, (guint) position, samplepos, res);
}
return res;
} }
static void static void

View file

@ -87,6 +87,7 @@ struct _GstOpenSLESRingBuffer
guint data_segtotal; guint data_segtotal;
guint8 * data; guint8 * data;
guint cursor; guint cursor;
guint64 queued_samples;
/* vmethods */ /* vmethods */
AcquireFunc acquire; AcquireFunc acquire;