From 342e613fba5849c11a07d568f765f512f30ea6cf Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Sun, 7 Jan 2024 17:58:16 -0500 Subject: Rough seek implementation Signed-off-by: Andrew Opalach --- src/libsink/sink.c | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) (limited to 'src/libsink') diff --git a/src/libsink/sink.c b/src/libsink/sink.c index 5addc0f..d49e87b 100644 --- a/src/libsink/sink.c +++ b/src/libsink/sink.c @@ -118,7 +118,7 @@ static void handle_sink_cmd(struct camu_sink *sink, struct camu_sink_cmd *cmd) } case SEEK: { struct camu_sink_entry *entry = (struct camu_sink_entry *)cmd->opaque; - (void)entry; + bmu_client_seek(&entry->client, cmd->value.f); break; } case ENTRY_BUFFERED: { @@ -220,11 +220,12 @@ static void audio_buffer_callback(void *userdata, u8 op) }); break; case CAMU_BUFFER_EOF: { - aki_mutex_lock(&entry->sink->mutex); - u8 ret = entry->sink->callback(entry->sink->userdata, CAMU_SINK_SWAP_BUFFER, CAMU_SINK_AUDIO, &entry->audio.buf); - entry->audio.state = BUFFER_SET_OR_BUFFERED; - aki_mutex_unlock(&entry->sink->mutex); - if (ret != CAMU_SINK_BUFFERS_SWAPPED) { + //aki_mutex_lock(&entry->sink->mutex); + //u8 ret = entry->sink->callback(entry->sink->userdata, CAMU_SINK_SWAP_BUFFER, CAMU_SINK_AUDIO, &entry->audio.buf); + //entry->audio.state = BUFFER_SET_OR_BUFFERED; + //aki_mutex_unlock(&entry->sink->mutex); + //if (ret != CAMU_SINK_BUFFERS_SWAPPED) { + if (1) { // TODO: Can cause popping. Should run a timer // and if any action would queue_cmd(AUDIO_START) before the // the timer, don't queue the stop. @@ -307,12 +308,16 @@ static void client_callback(void *userdata, u8 op, struct bmu_client_stream *str struct bmu_seek_req *req = (struct bmu_seek_req *)opaque; camu_clock_set(&entry->clock, req->base, req->start); camu_audio_buffer_reset(&entry->audio.buf); +#ifndef CAMU_SINK_NO_VIDEO + bool single_frame = camu_video_buffer_is_single_frame(&entry->video.buf); + if (!single_frame) { + camu_video_buffer_reset(&entry->video.buf); + } +#endif break; } - // A lot of logic here assumes that no data will be sent - // until all active streams are configured. This is extremely important, - // if it does not hold true many confusing errors will arise. case BIMU_CLIENT_CONFIGURE: { + // No data can be sent before this step. switch (stream->type) { case BIMU_STREAM_AUDIO: entry->audio.stream = stream; @@ -363,10 +368,7 @@ static void client_callback(void *userdata, u8 op, struct bmu_client_stream *str } break; } - case BIMU_CLIENT_SEEK: { - // Must ensure no more data from the previous - // stream position is sent during or after this call to seek. - struct bmu_seek_req *req = (struct bmu_seek_req *)opaque; + case BIMU_CLIENT_REMOVE_BUFFERS: { aki_mutex_lock(&entry->sink->mutex); if (entry->audio.state == BUFFER_ADDED) { entry->sink->callback(entry->sink->userdata, CAMU_SINK_REMOVE_BUFFER, CAMU_SINK_AUDIO, &entry->audio.buf); @@ -392,13 +394,6 @@ static void client_callback(void *userdata, u8 op, struct bmu_client_stream *str } #ifndef CAMU_SINK_NO_VIDEO } -#endif - camu_clock_seek(&entry->clock, req->base, req->start); - camu_audio_buffer_reset(&entry->audio.buf); -#ifndef CAMU_SINK_NO_VIDEO - if (!single_frame) { - camu_video_buffer_reset(&entry->video.buf); - } #endif break; } @@ -598,7 +593,7 @@ void camu_sink_toggle_pause(struct camu_sink *sink) } } -void camu_sink_seek(struct camu_sink *sink, f64 pos) +void camu_sink_seek(struct camu_sink *sink, f64 precent) { aki_mutex_lock(&sink->mutex); struct camu_sink_entry *current = sink->current; @@ -606,7 +601,7 @@ void camu_sink_seek(struct camu_sink *sink, f64 pos) if (current) { queue_cmd(sink, (struct camu_sink_cmd){ .op = SEEK, - .value.f = pos, + .value.f = precent, .opaque = current }); } -- cgit v1.2.3-101-g0448