summaryrefslogtreecommitdiff
path: root/src/audio/ring_buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/ring_buffer.cc')
-rw-r--r--src/audio/ring_buffer.cc26
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);
+}