diff options
Diffstat (limited to 'src/audio/ring_buffer.cc')
| -rw-r--r-- | src/audio/ring_buffer.cc | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/audio/ring_buffer.cc b/src/audio/ring_buffer.cc index 7cedb56..30566c9 100644 --- a/src/audio/ring_buffer.cc +++ b/src/audio/ring_buffer.cc @@ -152,3 +152,29 @@ void AudioRingBuffer::clear() { // Note: Don't reset total_read_ - it tracks absolute playback time memset(buffer_, 0, sizeof(buffer_)); } + +float* AudioRingBuffer::get_write_region(int* out_available_samples) { + const int write = write_pos_.load(std::memory_order_acquire); + const int avail = available_write(); + + // Return linear region (less than available if wraps around) + const int space_to_end = capacity_ - write; + *out_available_samples = std::min(avail, space_to_end); + + return &buffer_[write]; +} + +void AudioRingBuffer::commit_write(int num_samples) { + const int write = write_pos_.load(std::memory_order_acquire); + + // BOUNDS CHECK + FATAL_CHECK(write < 0 || write + num_samples > capacity_, + "commit_write out of bounds: write=%d, num_samples=%d, " + "capacity=%d\n", + write, num_samples, capacity_); + + // Advance write position atomically + write_pos_.store((write + num_samples) % capacity_, + std::memory_order_release); + total_written_.fetch_add(num_samples, std::memory_order_release); +} |
