summaryrefslogtreecommitdiff
path: root/src/libsink
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsink')
-rw-r--r--src/libsink/sink.c39
1 files changed, 17 insertions, 22 deletions
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);
@@ -393,13 +395,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;
}
case BIMU_CLIENT_EOF: {
@@ -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
});
}