summaryrefslogtreecommitdiff
path: root/src/buffer/audio.c
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2026-09-14 08:57:42 -0400
committerAndrew Opalach <andrew@akon.city> 2026-09-14 08:57:42 -0400
commit8f208c26b6fa1a9f3372679c047cab559c06e26b (patch)
tree323d894d6ff8e1ed1445c40cb1e2f5d3cee5e8e8 /src/buffer/audio.c
parentc66c7c64ebd16287b892f8a780cffcabafba3799 (diff)
downloadcamu-8f208c26b6fa1a9f3372679c047cab559c06e26b.tar.gz
camu-8f208c26b6fa1a9f3372679c047cab559c06e26b.tar.bz2
camu-8f208c26b6fa1a9f3372679c047cab559c06e26b.zip
Server-side fixes from DIRECT_MODE testing
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/buffer/audio.c')
-rw-r--r--src/buffer/audio.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/buffer/audio.c b/src/buffer/audio.c
index a815c66..1b866a9 100644
--- a/src/buffer/audio.c
+++ b/src/buffer/audio.c
@@ -12,7 +12,7 @@
#define BUFFER_SIZE 7.0
#define BUFFER_MARK_MIN 3.25 // Must be a most half of the buffer size.
-#define BUFFER_MARK_BUFFERED 0.35
+#define BUFFER_MARK_BUFFERED 0.5
#ifdef CAMU_AUDIO_BUFFER_FADE
#define FADE_STEP(fmt, down) ((down ? -4.75f : 2.25f) / (fmt)->sample_rate)
@@ -88,7 +88,8 @@ bool camu_audio_buffer_configure(struct camu_audio_buffer *buf, struct camu_code
return false;
#endif
const char *req_format_name = camu_audio_format_name(req->format);
- log_info("Resampling to: %s (%dch) %dHz.", req_format_name, req->channel_count, req->sample_rate);
+ log_info("Resampling to: %s (%dch) %dHz.", req_format_name,
+ req->channel_count, req->sample_rate);
}
buf->size = (ptrdiff_t)camu_audio_format_sec_to_bytes(req, BUFFER_SIZE);
@@ -155,11 +156,11 @@ static bool push_internal(struct camu_audio_buffer *buf, f64 pts, u8 **data, s32
return true;
}
- // The maximum space is buf->size - 1.
- ptrdiff_t space = al_ring_buffer_space(&buf->rb);
- if (!buf->buffered && (buf->size - 1) - space >= buf->mark.buffered) {
+ // The maximum space in a ring buffer is size - 1.
+ ptrdiff_t occupied, space = al_ring_buffer_space(&buf->rb);
+ if (!buf->buffered && (occupied = (buf->size - 1) - space) >= buf->mark.buffered) {
buf->buffered = true;
- log_debug("Buffered (mark: %.1fKB).", buf->mark.buffered / 1024.0);
+ log_debug("Buffered (%.1fKB).", occupied / 1024.0);
buf->callback(buf->userdata, CAMU_BUFFER_BUFFERED);
}
@@ -241,14 +242,19 @@ void camu_audio_buffer_push(struct camu_audio_buffer *buf, struct camu_codec_fra
void camu_audio_buffer_flush(struct camu_audio_buffer *buf, bool error)
{
log_debug("Flush requested.");
- u8 flow = error ? FLUSHED_ERROR : FLUSHED;
- atomic_store(u32)(&buf->flow, flow, AL_ATOMIC_RELAXED);
+ u8 flow = atomic_load(u32)(&buf->flow, AL_ATOMIC_ACQUIRE);
+ error |= flow == FLUSHED_ERROR;
+ flow = error ? FLUSHED_ERROR : FLUSHED;
+ atomic_store(u32)(&buf->flow, flow, AL_ATOMIC_RELEASE);
if (!push_internal(buf, 0.0, NULL, 0)) {
log_debug("Buffer filled by flush.");
}
if (!buf->buffered) {
buf->buffered = true;
- log_debug("Buffered (flush).");
+#ifdef AL_LOG_ENABLE_DEBUG
+ ptrdiff_t occupied = al_ring_buffer_occupied(&buf->rb);
+ log_debug("Buffered (%.1fKB).", occupied / 1024.0);
+#endif
buf->callback(buf->userdata, CAMU_BUFFER_BUFFERED);
}
}
@@ -289,11 +295,11 @@ ptrdiff_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, ptrdif
f64 base_pts = atomic_load(f64)(&buf->pts, AL_ATOMIC_ACQUIRE);
bool allow_set = atomic_load(bool)(&buf->no_video, AL_ATOMIC_RELAXED);
- bool armed_for_pause = false;
- f64 pts = camu_clock_get_pts(buf->clock, buf->latency, allow_set, &armed_for_pause);
+ u8 status = 0;
+ f64 pts = camu_clock_get_pts(buf->clock, buf->latency, allow_set, &status);
if (pts == CAMU_PTS_SIGNAL_PAUSE) {
return 0;
- } else if (pts == CAMU_PTS_PAUSED || armed_for_pause) {
+ } else if (CAMU_PTS_CONSIDER_PAUSED(pts) || (status & CAMU_CLOCK_EXTERNAL_PAUSE)) {
#ifdef CAMU_AUDIO_BUFFER_FADE
if (buf->pause == PAUSE_SYNC) {
buf->pause = PAUSE_FADE_COMPLETE;
@@ -353,7 +359,7 @@ ptrdiff_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, ptrdif
if (!buf->ignore_desync && atomic_load(u32)(&buf->unpause, AL_ATOMIC_ACQUIRE) > 0) {
// Queuing multiple resyncs before resuming the stream will cause pops!
- log_info("Forcing resync.");
+ log_debug("Forcing resync.");
buf->pause = PAUSE_SYNC;
atomic_sub(u32)(&buf->unpause, 1, AL_ATOMIC_RELEASE);
}