diff options
Diffstat (limited to 'src/buffer/audio.c')
| -rw-r--r-- | src/buffer/audio.c | 32 |
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); } |