From 72eb0c6381f9406a4e45d23f65373d4936770433 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Sun, 27 Oct 2024 15:50:21 -0400 Subject: More synced list, another vcr fix Signed-off-by: Andrew Opalach --- src/buffer/audio.c | 25 ++++++++++--------------- src/buffer/clock.c | 10 +++------- src/buffer/video.c | 10 +++++----- 3 files changed, 18 insertions(+), 27 deletions(-) (limited to 'src/buffer') diff --git a/src/buffer/audio.c b/src/buffer/audio.c index 2af24b2..141c589 100644 --- a/src/buffer/audio.c +++ b/src/buffer/audio.c @@ -9,11 +9,9 @@ #include "common_internal.h" #include "volume.h" -#define BUFFER_USEC (3 * 1000000L) -#define BUFFER_MARK_MIN (1.1 * 1000000L) // Must be a most half of the buffer size. -#define BUFFER_MARK_BUFFERED (1.0 * 1000000L) - -#define LARGE_DESYNC_PTS 0.322 +#define BUFFER_USEC (6 * 1000000L) +#define BUFFER_MARK_MIN (2.6 * 1000000L) // Must be a most half of the buffer size. +#define BUFFER_MARK_BUFFERED (1.5 * 1000000L) #ifdef CAMU_AUDIO_BUFFER_FADE #define FADE_STEP(fmt) (1.f / (fmt)->sample_rate) @@ -229,12 +227,18 @@ void camu_audio_buffer_flush(struct camu_audio_buffer *buf) // around in the buffer without worrying about pops. size_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, size_t req) { + u8 flow = al_atomic_load(u8)(&buf->flow, AL_ATOMIC_ACQUIRE); + if (flow == SIGNALED || camu_clock_is_ended(buf->clock)) { + buf->callback(buf->userdata, CAMU_BUFFER_EOF); + return 0; + } + if (camu_clock_is_paused(buf->clock)) { #ifdef CAMU_AUDIO_BUFFER_FADE if (buf->pause == PAUSE_PLAYING) { buf->pause = PAUSE_FADING; buf->fade_offset = 0; - } else if (buf->volume == 0.f) { // Fade out done. + } else if (buf->volume == 0.f || buf->pause == PAUSE_PAUSED) { al_memset(data, 0, req); if (NOT_PAUSED(buf->pause)) { buf->pause = PAUSE_PAUSED; @@ -260,12 +264,6 @@ size_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, size_t re al_atomic_store(u8)(&buf->unpause, 0, AL_ATOMIC_RELEASE); } - u8 flow = al_atomic_load(u8)(&buf->flow, AL_ATOMIC_ACQUIRE); - if (flow == SIGNALED) { - buf->callback(buf->userdata, CAMU_BUFFER_EOF); - return 0; - } - f64 pts = camu_clock_get_pts(buf->clock, buf->latency); size_t ret, signal = req; size_t have = al_ring_buffer_occupied(&buf->rb); @@ -279,9 +277,6 @@ size_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, size_t re // Attempt syncing to the clock. // For this to work the mixer must report a reasonably accurate value for latency. if (UNLIKELY(!buf->ignore_desync && buf->pause == PAUSE_PAUSED)) { - if (UNLIKELY(fabs(pts) >= LARGE_DESYNC_PTS)) { - al_log_warn("audio_buffer", "Abnormally large audio desync of %.5fs", pts); - } if (pts > 0.0) { // Skip. ret = camu_audio_format_sec_to_bytes(&buf->fmt.req, pts); ret = AL_MIN(ret, have); diff --git a/src/buffer/clock.c b/src/buffer/clock.c index a04bb08..cee0ec7 100644 --- a/src/buffer/clock.c +++ b/src/buffer/clock.c @@ -35,23 +35,19 @@ void camu_clock_offset(struct camu_clock *clock, f64 amount) void camu_clock_pause(struct camu_clock *clock, u64 target) { - f64 pause = al_atomic_load(f64)(&clock->pause, AL_ATOMIC_ACQUIRE); - if (pause == ENDED) return; al_assert(clock->paused_at == -1.0); f64 tick = aki_get_tick(); if (target > 0) { tick = calc_tick_offset(tick, aki_get_timestamp(), target); - al_atomic_store(f64)(&clock->pause, tick, AL_ATOMIC_RELEASE); + al_atomic_store(f64)(&clock->pause, tick, AL_ATOMIC_RELAXED); } else { - al_atomic_store(f64)(&clock->pause, PAUSED, AL_ATOMIC_RELEASE); + al_atomic_store(f64)(&clock->pause, PAUSED, AL_ATOMIC_RELAXED); } clock->paused_at = tick; } void camu_clock_resume(struct camu_clock *clock, u64 target) { - f64 pause = al_atomic_load(f64)(&clock->pause, AL_ATOMIC_ACQUIRE); - if (pause == ENDED) return; al_assert(clock->paused_at != -1.0); f64 tick = aki_get_tick(); //if (pause != PAUSED && tick < pause) { @@ -70,7 +66,7 @@ void camu_clock_resume(struct camu_clock *clock, u64 target) } else { clock->offset += tick - clock->paused_at; } - al_atomic_store(f64)(&clock->pause, RUNNING, AL_ATOMIC_RELEASE); + al_atomic_store(f64)(&clock->pause, RUNNING, AL_ATOMIC_RELAXED); clock->paused_at = -1.0; } diff --git a/src/buffer/video.c b/src/buffer/video.c index a7a5594..00902f3 100644 --- a/src/buffer/video.c +++ b/src/buffer/video.c @@ -169,15 +169,15 @@ void camu_video_buffer_flush(struct camu_video_buffer *buf) bool camu_video_buffer_read(struct camu_video_buffer *buf, void *out) { + u8 flow = al_atomic_load(u8)(&buf->flow, AL_ATOMIC_ACQUIRE); if (!buf->single_frame) { + if (flow == SIGNALED || camu_clock_is_ended(buf->clock)) { + buf->callback(buf->userdata, CAMU_BUFFER_EOF); + return false; + } f64 pts = camu_clock_get_pts(buf->clock, buf->latency); if (pts > buf->pts) buf->pts = pts; } - u8 flow = al_atomic_load(u8)(&buf->flow, AL_ATOMIC_ACQUIRE); - if (flow == SIGNALED && !buf->single_frame) { - buf->callback(buf->userdata, CAMU_BUFFER_EOF); - return false; - } u8 ret = buf->queue->read(buf->queue, buf->pts, out); if (flow == FLUSHED && (ret == CAMU_QUEUE_EOF || (buf->single_frame && ret == CAMU_QUEUE_OK))) { buf->callback(buf->userdata, CAMU_BUFFER_EOF); -- cgit v1.2.3-101-g0448