summaryrefslogtreecommitdiff
path: root/src/buffer
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-10-27 15:50:21 -0400
committerAndrew Opalach <andrew@akon.city> 2024-10-27 15:50:21 -0400
commit72eb0c6381f9406a4e45d23f65373d4936770433 (patch)
tree13e1303372f858a69bfa5324f0aa9d17428fc43a /src/buffer
parent831f260ba2f6bc89f0451f6cc628bd131913a363 (diff)
downloadcamu-72eb0c6381f9406a4e45d23f65373d4936770433.tar.gz
camu-72eb0c6381f9406a4e45d23f65373d4936770433.tar.bz2
camu-72eb0c6381f9406a4e45d23f65373d4936770433.zip
More synced list, another vcr fix
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/buffer')
-rw-r--r--src/buffer/audio.c25
-rw-r--r--src/buffer/clock.c10
-rw-r--r--src/buffer/video.c10
3 files changed, 18 insertions, 27 deletions
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);