32 std::uint64_t
capacity_frames() const noexcept {
return usable_capacity_frames_; }
40 return write_impl(source, frames);
44 return write_impl(source, frames);
48 std::uint64_t
drain(std::uint64_t max_frames)
noexcept;
51 void clear_unprepared() noexcept;
52 static
bool valid_capacity(
std::uint64_t usable_capacity_frames) noexcept;
53 static
int clamp_to_fifo_count(
std::uint64_t frames) noexcept;
54 float* channel_storage(
std::uint32_t channel) noexcept;
55 const
float* channel_storage(
std::uint32_t channel) const noexcept;
57 template<typename SampleType>
58 void copy_source_segment(
BufferView<SampleType> source,
59 int destination_start,
60 std::uint64_t source_offset,
61 int frame_count) noexcept;
63 template<typename SampleType>
64 std::uint64_t write_impl(
BufferView<SampleType> source,
std::uint64_t frames) noexcept;
66 std::vector<
float> storage_;
68 std::uint32_t num_channels_ = 0;
69 std::uint64_t usable_capacity_frames_ = 0;
70 std::uint64_t internal_capacity_frames_ = 0;
72 std::atomic<
std::uint64_t> underrun_frames_{0};
73 std::atomic<std::uint64_t> overrun_frames_{0};
74 std::atomic<std::uint64_t> dropped_write_frames_{0};
77template<
typename SampleType>
79 int destination_start,
80 std::uint64_t source_offset,
81 int frame_count)
noexcept {
82 static_assert(std::is_same_v<std::remove_const_t<SampleType>,
float>,
83 "PlanarAudioRingBuffer only supports float sample views");
85 if (frame_count <= 0)
return;
87 for (std::uint32_t ch = 0; ch < num_channels_; ++ch) {
88 float* destination = channel_storage(ch) + destination_start;
89 if (ch < source.num_channels()) {
90 const SampleType* source_ptr = source.channel_ptr(ch) + source_offset;
91 std::copy_n(source_ptr,
static_cast<std::size_t
>(frame_count), destination);
93 std::fill_n(destination,
static_cast<std::size_t
>(frame_count), 0.0f);
98template<
typename SampleType>
100 std::uint64_t frames)
noexcept {
101 static_assert(std::is_same_v<std::remove_const_t<SampleType>,
float>,
102 "PlanarAudioRingBuffer only supports float sample views");
104 if (!fifo_ || num_channels_ == 0 || frames == 0 ||
105 source.num_channels() == 0 || source.num_samples() == 0) {
109 const auto requested = std::min(frames,
static_cast<std::uint64_t
>(source.num_samples()));
114 fifo_->prepare_to_write(clamp_to_fifo_count(requested), start_1, size_1, start_2, size_2);
116 const auto written =
static_cast<std::uint64_t
>(size_1 + size_2);
119 overrun_frames_.fetch_add(requested, std::memory_order_relaxed);
120 dropped_write_frames_.fetch_add(requested, std::memory_order_relaxed);
125 copy_source_segment(source, start_1, 0, size_1);
126 copy_source_segment(source, start_2,
static_cast<std::uint64_t
>(size_1), size_2);
127 fifo_->finish_write(
static_cast<int>(written));
132 if (written < requested) {
133 const auto dropped = requested - written;
134 overrun_frames_.fetch_add(dropped, std::memory_order_relaxed);
135 dropped_write_frames_.fetch_add(dropped, std::memory_order_relaxed);
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
std::uint32_t num_channels() const noexcept
Definition planar_audio_ring_buffer.hpp:31
bool prepare(std::uint32_t num_channels, std::uint64_t usable_capacity_frames)
bool read(BufferView< float > destination, std::uint64_t frames) noexcept
PlanarAudioRingBufferStats stats() const noexcept
std::uint64_t free_frames() const noexcept
std::uint64_t write(BufferView< float > source, std::uint64_t frames) noexcept
Definition planar_audio_ring_buffer.hpp:43
PlanarAudioRingBuffer()=default
std::uint64_t drain(std::uint64_t max_frames) noexcept
std::uint64_t write(BufferView< const float > source, std::uint64_t frames) noexcept
Definition planar_audio_ring_buffer.hpp:39
std::uint64_t available_frames() const noexcept
std::uint64_t capacity_frames() const noexcept
Definition planar_audio_ring_buffer.hpp:32
Definition analyzer_provider.hpp:12
Definition generated_event_source.hpp:33
Definition planar_audio_ring_buffer.hpp:16
std::uint64_t underrun_frames
Definition planar_audio_ring_buffer.hpp:17
std::uint64_t overrun_frames
Definition planar_audio_ring_buffer.hpp:18
std::uint64_t dropped_write_frames
Definition planar_audio_ring_buffer.hpp:19