60 bool prepared() const noexcept {
return prepared_; }
61 bool resampling() const noexcept {
return prepared_ && !same_rate_; }
73 std::uint64_t frames)
noexcept;
78 void clear_unprepared() noexcept;
80 void allocate_scratch(
std::uint64_t pending_capacity_frames);
81 void refill_pending_from_ring() noexcept;
82 void consume_pending(
std::uint64_t frames) noexcept;
83 struct ResampledChunkResult {
84 std::uint64_t output_frames = 0;
85 std::uint64_t source_frames_consumed = 0;
88 std::uint64_t frames)
noexcept;
90 std::uint64_t destination_offset,
91 std::uint64_t frames)
noexcept;
94 std::uint64_t frames)
noexcept;
96 template<
typename SampleType>
102 std::vector<std::vector<float>> pending_source_;
103 std::vector<std::vector<float>> resampled_output_;
104 std::vector<float*> pending_write_ptrs_;
105 std::vector<const float*> pending_read_ptrs_;
106 std::vector<float*> resampled_output_ptrs_;
107 std::unique_ptr<runtime::SpscRingIndex> pending_fifo_;
109 std::uint32_t source_channels_ = 0;
110 std::uint32_t host_channels_ = 0;
111 double source_sample_rate_ = 0.0;
112 double host_sample_rate_ = 0.0;
113 std::uint64_t pending_capacity_frames_ = 0;
114 std::uint32_t max_host_block_frames_ = 0;
115 bool prepared_ =
false;
116 bool same_rate_ =
true;
118 std::atomic<std::uint64_t> source_frames_pushed_{0};
119 std::atomic<std::uint64_t> source_frames_consumed_{0};
120 std::atomic<std::uint64_t> output_frames_pulled_{0};
121 std::atomic<std::uint64_t> underrun_frames_{0};
122 std::atomic<std::uint64_t> overrun_frames_{0};
123 std::atomic<std::uint64_t> dropped_source_frames_{0};
124 std::atomic<std::uint64_t> pending_source_frames_snapshot_{0};
127template<
typename SampleType>
129 std::uint64_t frames)
noexcept {
130 if (!prepared_ || frames == 0 || source.num_channels() == 0 ||
131 source.num_samples() == 0) {
135 const auto requested =
136 std::min(frames,
static_cast<std::uint64_t
>(source.num_samples()));
137 const auto written = ring_.write(source, requested);
138 source_frames_pushed_.fetch_add(written, std::memory_order_relaxed);
139 if (written < requested) {
140 const auto dropped = requested - written;
141 overrun_frames_.fetch_add(dropped, std::memory_order_relaxed);
142 dropped_source_frames_.fetch_add(dropped, std::memory_order_relaxed);
std::uint32_t host_channels() const noexcept
Definition audio_stream_handoff.hpp:63
double host_sample_rate() const noexcept
Definition audio_stream_handoff.hpp:65
std::uint64_t push(BufferView< float > source, std::uint64_t frames) noexcept
double source_sample_rate() const noexcept
Definition audio_stream_handoff.hpp:64
bool prepared() const noexcept
Definition audio_stream_handoff.hpp:60
AudioStreamHandoffStats stats() const noexcept
std::uint64_t push(BufferView< const float > source, std::uint64_t frames) noexcept
AudioStreamHandoff()=default
std::uint32_t source_channels() const noexcept
Definition audio_stream_handoff.hpp:62
bool prepare(const AudioStreamHandoffConfig &config)
bool resampling() const noexcept
Definition audio_stream_handoff.hpp:61
AudioStreamHandoffPullResult pull(BufferView< float > destination, std::uint64_t frames) noexcept
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition planar_audio_ring_buffer.hpp:22
Definition analyzer_provider.hpp:12
ResamplerT< float > Resampler
Definition resampler.hpp:382
Polyphase-FIR resampler with a Kaiser-window low-pass prototype.
Definition audio_stream_handoff.hpp:15
std::uint32_t source_channels
Definition audio_stream_handoff.hpp:16
double host_sample_rate
Definition audio_stream_handoff.hpp:19
std::uint32_t max_source_block_frames
Definition audio_stream_handoff.hpp:21
std::uint64_t ring_capacity_frames
Definition audio_stream_handoff.hpp:20
std::uint32_t host_channels
Definition audio_stream_handoff.hpp:17
std::uint32_t max_host_block_frames
Definition audio_stream_handoff.hpp:22
double source_sample_rate
Definition audio_stream_handoff.hpp:18
Definition audio_stream_handoff.hpp:25
std::uint64_t source_frames_consumed
Definition audio_stream_handoff.hpp:32
std::uint64_t requested_frames
Definition audio_stream_handoff.hpp:26
bool underrun
Definition audio_stream_handoff.hpp:33
std::uint64_t source_backed_frames
Definition audio_stream_handoff.hpp:31
std::uint64_t rendered_frames
Definition audio_stream_handoff.hpp:27
Definition audio_stream_handoff.hpp:36
double queued_source_seconds
Definition audio_stream_handoff.hpp:44
double estimated_host_latency_frames
Definition audio_stream_handoff.hpp:46
double estimated_latency_seconds
Definition audio_stream_handoff.hpp:47
std::uint64_t queued_source_frames
Definition audio_stream_handoff.hpp:43
std::uint64_t overrun_frames
Definition audio_stream_handoff.hpp:41
std::uint64_t output_frames_pulled
Definition audio_stream_handoff.hpp:39
std::uint64_t source_frames_consumed
Definition audio_stream_handoff.hpp:38
std::uint64_t underrun_frames
Definition audio_stream_handoff.hpp:40
std::uint64_t source_frames_pushed
Definition audio_stream_handoff.hpp:37
std::uint64_t dropped_source_frames
Definition audio_stream_handoff.hpp:42
double estimated_source_latency_frames
Definition audio_stream_handoff.hpp:45