Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
process_block.hpp
Go to the documentation of this file.
1#pragma once
2
9
10#include <array>
11#include <bit>
12#include <cmath>
13#include <cstddef>
14#include <cstdint>
15#include <limits>
16#include <span>
17#include <string_view>
18#include <type_traits>
19
20namespace pulp::format {
21
22struct ProcessContext;
23
29enum class ProcessMode : std::uint8_t {
32};
33
35 bool bypass = false;
36 bool reset = false;
37 bool tail_drain = false;
38 bool transport_jump = false;
39};
40
42public:
43 ScratchArenaView() = default;
44 explicit ScratchArenaView(std::span<std::byte> memory) noexcept
45 : memory_(memory) {}
50
51 void reset() noexcept { offset_ = 0; }
52 std::size_t size_bytes() const noexcept { return memory_.size(); }
53 std::size_t used_bytes() const noexcept { return offset_; }
54 std::size_t remaining_bytes() const noexcept {
55 return offset_ <= memory_.size() ? memory_.size() - offset_ : 0;
56 }
57 bool empty() const noexcept { return memory_.empty(); }
58
59 std::span<std::byte> try_allocate_bytes(std::size_t byte_count,
60 std::size_t alignment) noexcept {
61 if (byte_count == 0) return {};
62 if (alignment == 0 || !std::has_single_bit(alignment)) return {};
63 if (memory_.empty()) return {};
64
65 const auto base = reinterpret_cast<std::uintptr_t>(memory_.data());
66 const auto current = base + offset_;
67 const auto aligned = align_up(current, alignment);
68 const auto aligned_offset = static_cast<std::size_t>(aligned - base);
69 if (aligned_offset > memory_.size()) return {};
70 if (byte_count > memory_.size() - aligned_offset) return {};
71
72 offset_ = aligned_offset + byte_count;
73 return memory_.subspan(aligned_offset, byte_count);
74 }
75
76 template<typename T>
77 std::span<T> try_allocate(std::size_t count) noexcept {
78 static_assert(std::is_trivially_copyable_v<T>,
79 "scratch spans are for plain DSP scratch types");
80 if (count == 0) return {};
81 if (count > std::numeric_limits<std::size_t>::max() / sizeof(T)) return {};
82 auto bytes = try_allocate_bytes(count * sizeof(T), alignof(T));
83 if (bytes.empty()) return {};
84 return {reinterpret_cast<T*>(bytes.data()), count};
85 }
86
87private:
88 static std::uintptr_t align_up(std::uintptr_t value,
89 std::size_t alignment) noexcept {
90 const auto mask = static_cast<std::uintptr_t>(alignment - 1);
91 return (value + mask) & ~mask;
92 }
93
94 std::span<std::byte> memory_;
95 std::size_t offset_ = 0;
96};
97
101public:
103};
104
108public:
110};
111
112enum class BusDirection : std::uint8_t {
115};
116
117struct BusBuffer {
118 std::string_view name;
121 bool active = true;
124
125 std::size_t num_channels() const noexcept {
126 return direction == BusDirection::Output ? output.num_channels()
127 : input.num_channels();
128 }
129
130 std::size_t num_frames() const noexcept {
131 return direction == BusDirection::Output ? output.num_samples()
132 : input.num_samples();
133 }
134
135 bool empty() const noexcept {
136 return direction == BusDirection::Output ? output.empty() : input.empty();
137 }
138};
139
147public:
148 static constexpr std::size_t kMaxBuses = 16;
149
150 bool add_input(std::string_view name,
152 BusRole role = BusRole::Main,
153 bool active = true) noexcept {
154 if (size_ >= buses_.size()) return false;
155 buses_[size_++] = BusBuffer{name, BusDirection::Input, role, active, input, {}};
156 return true;
157 }
158
159 bool add_output(std::string_view name,
161 BusRole role = BusRole::Main,
162 bool active = true) noexcept {
163 if (size_ >= buses_.size()) return false;
164 buses_[size_++] = BusBuffer{name, BusDirection::Output, role, active, {}, output};
165 return true;
166 }
167
168 void clear() noexcept { size_ = 0; }
169 std::size_t size() const noexcept { return size_; }
170 std::size_t capacity() const noexcept { return buses_.size(); }
171 bool empty() const noexcept { return size_ == 0; }
172
173 std::span<BusBuffer> buses() noexcept { return {buses_.data(), size_}; }
174 std::span<const BusBuffer> buses() const noexcept { return {buses_.data(), size_}; }
175
176 BusBuffer* find(BusDirection direction, std::string_view name) noexcept {
177 for (auto& bus : buses()) {
178 if (bus.direction == direction && bus.name == name) return &bus;
179 }
180 return nullptr;
181 }
182
183 const BusBuffer* find(BusDirection direction, std::string_view name) const noexcept {
184 for (const auto& bus : buses()) {
185 if (bus.direction == direction && bus.name == name) return &bus;
186 }
187 return nullptr;
188 }
189
191 BusRole role = BusRole::Main) noexcept {
192 for (auto& bus : buses()) {
193 if (bus.direction == direction && bus.role == role) return &bus;
194 }
195 return nullptr;
196 }
197
198 const BusBuffer* first(BusDirection direction,
199 BusRole role = BusRole::Main) const noexcept {
200 for (const auto& bus : buses()) {
201 if (bus.direction == direction && bus.role == role) return &bus;
202 }
203 return nullptr;
204 }
205
206 bool validate_frame_count(std::size_t frame_count) const noexcept {
207 for (const auto& bus : buses()) {
208 if (bus.active && bus.num_frames() != frame_count) return false;
209 }
210 return true;
211 }
212
213private:
214 std::array<BusBuffer, kMaxBuses> buses_{};
215 std::size_t size_ = 0;
216};
217
220 std::string_view name;
221 std::size_t index = 0;
225 bool optional = false;
226 bool active = true;
227};
228
230template <typename SampleType>
234
235 bool active() const noexcept { return info.active; }
236 bool optional() const noexcept { return info.optional; }
237 bool main() const noexcept { return info.role == BusRole::Main; }
238 bool sidechain() const noexcept { return info.role == BusRole::Sidechain; }
239 std::size_t num_channels() const noexcept { return buffer.num_channels(); }
240 std::size_t num_samples() const noexcept { return buffer.num_samples(); }
241
242 bool matches_declared_layout() const noexcept {
243 if (!active()) return buffer.empty();
244 return info.declared_channels >= 0 &&
245 num_channels() == static_cast<std::size_t>(info.declared_channels);
246 }
247
248 bool has_channel_storage() const noexcept {
249 if (!active() || buffer.num_channels() == 0) return true;
250 for (std::size_t ch = 0; ch < buffer.num_channels(); ++ch) {
251 if (buffer.channel_ptr(ch) == nullptr) return false;
252 }
253 return true;
254 }
255};
256
258template <typename SampleType>
260public:
263 : buses_(buses) {}
264
265 std::size_t size() const noexcept { return buses_.size(); }
266 bool empty() const noexcept { return buses_.empty(); }
267
268 ProcessBusBufferView<SampleType>& operator[](std::size_t index) noexcept {
269 return buses_[index];
270 }
271 const ProcessBusBufferView<SampleType>& operator[](std::size_t index) const noexcept {
272 return buses_[index];
273 }
274
276 return find(role, 0);
277 }
278
279 const ProcessBusBufferView<SampleType>* find(BusRole role) const noexcept {
280 return find(role, 0);
281 }
282
284 std::size_t occurrence) noexcept {
285 std::size_t seen = 0;
286 for (auto& bus : buses_) {
287 if (bus.info.role != role) continue;
288 if (seen == occurrence) return &bus;
289 ++seen;
290 }
291 return nullptr;
292 }
293
295 BusRole role,
296 std::size_t occurrence) const noexcept {
297 std::size_t seen = 0;
298 for (const auto& bus : buses_) {
299 if (bus.info.role != role) continue;
300 if (seen == occurrence) return &bus;
301 ++seen;
302 }
303 return nullptr;
304 }
305
306 ProcessBusBufferView<SampleType>* find_by_index(std::size_t index) noexcept {
307 for (auto& bus : buses_) {
308 if (bus.info.index == index) return &bus;
309 }
310 return nullptr;
311 }
312
314 std::size_t index) const noexcept {
315 for (const auto& bus : buses_) {
316 if (bus.info.index == index) return &bus;
317 }
318 return nullptr;
319 }
320
321 ProcessBusBufferView<SampleType>* find_by_name(std::string_view name) noexcept {
322 for (auto& bus : buses_) {
323 if (bus.info.name == name) return &bus;
324 }
325 return nullptr;
326 }
327
329 std::string_view name) const noexcept {
330 for (const auto& bus : buses_) {
331 if (bus.info.name == name) return &bus;
332 }
333 return nullptr;
334 }
335
337 const ProcessBusBufferView<SampleType>* main() const noexcept {
338 return find(BusRole::Main);
339 }
340
345 return find(BusRole::Sidechain);
346 }
347
348 std::size_t active_count() const noexcept {
349 std::size_t count = 0;
350 for (const auto& bus : buses_) {
351 if (bus.active()) ++count;
352 }
353 return count;
354 }
355
356 std::size_t count(BusRole role) const noexcept {
357 std::size_t total = 0;
358 for (const auto& bus : buses_) {
359 if (bus.info.role == role) ++total;
360 }
361 return total;
362 }
363
364 std::size_t active_count(BusRole role) const noexcept {
365 std::size_t total = 0;
366 for (const auto& bus : buses_) {
367 if (bus.info.role == role && bus.active()) ++total;
368 }
369 return total;
370 }
371
372 bool layouts_match_descriptors() const noexcept {
373 for (const auto& bus : buses_) {
374 if (!bus.matches_declared_layout()) return false;
375 }
376 return true;
377 }
378
379 bool active_buses_have_storage() const noexcept {
380 for (const auto& bus : buses_) {
381 if (!bus.has_channel_storage()) return false;
382 }
383 return true;
384 }
385
386private:
387 std::span<ProcessBusBufferView<SampleType>> buses_;
388};
389
391template <typename SampleType = float>
395
397 if (auto* bus = inputs.main(); bus && bus->active()) return &bus->buffer;
398 return nullptr;
399 }
400
402 if (auto* bus = outputs.main(); bus && bus->active()) return &bus->buffer;
403 return nullptr;
404 }
405
407 if (auto* bus = inputs.sidechain(); bus && bus->active()) return &bus->buffer;
408 return nullptr;
409 }
410
411 bool layouts_match_descriptors() const noexcept {
412 return inputs.layouts_match_descriptors() &&
413 outputs.layouts_match_descriptors();
414 }
415
416 bool active_buses_have_storage() const noexcept {
417 return inputs.active_buses_have_storage() &&
418 outputs.active_buses_have_storage();
419 }
420};
421
424
426 std::uint32_t parameter_events = 0;
427 std::uint32_t midi_events = 0;
428 std::uint32_t sysex_events = 0;
429 std::uint32_t ump_packets = 0;
430 std::uint32_t mpe_events = 0;
431 std::uint32_t graph_events = 0;
432 std::uint32_t audio_rate_modulations = 0;
433
434 bool any() const noexcept {
435 return parameter_events != 0 || audio_rate_modulations != 0 ||
436 midi_events != 0 || sysex_events != 0 || ump_packets != 0 ||
437 mpe_events != 0 || graph_events != 0;
438 }
439
440 std::uint32_t total() const noexcept {
443 }
444};
445
453 std::uint32_t param_id = 0;
454 std::span<const float> values;
455
456 bool empty() const noexcept { return values.empty(); }
457 std::size_t size() const noexcept { return values.size(); }
458};
459
467 // Mutable to match the legacy Processor::process() ABI. Processors should
468 // still treat inbound MIDI as read-only; graph paths that need shared
469 // immutable event streams should adapt before entering the legacy ABI.
472 // Null means no sidecar events for this block. Adapters should leave these
473 // null instead of publishing empty sidecars.
474 const midi::MpeBuffer* mpe_input = nullptr;
475 const midi::UmpBuffer* ump_input = nullptr;
477 std::span<const AudioRateModulationView> audio_rate_modulations;
478
479 std::span<const state::ParameterEvent> parameters() const noexcept {
480 return parameter_events ? parameter_events->events()
481 : std::span<const state::ParameterEvent>{};
482 }
483
484 std::size_t parameter_event_count() const noexcept {
485 return parameter_events ? parameter_events->size() : 0;
486 }
487
488 std::size_t midi_input_event_count() const noexcept {
489 return midi_in ? midi_in->size() : 0;
490 }
491
492 std::size_t midi_output_event_count() const noexcept {
493 return midi_out ? midi_out->size() : 0;
494 }
495
496 std::size_t audio_rate_modulation_count() const noexcept {
497 return audio_rate_modulations.size();
498 }
499
500 std::size_t sysex_event_count() const noexcept {
501 return midi_in ? midi_in->sysex_size() : 0;
502 }
503
504 bool empty() const noexcept {
505 return parameter_event_count() == 0 && midi_input_event_count() == 0 &&
507 mpe_input == nullptr && ump_input == nullptr &&
508 audio_rate_modulations.empty() && !drops.any();
509 }
510};
511
520 double sample_rate = 0.0;
521 std::uint32_t frame_count = 0;
522 double render_speed = 1.0;
523 std::uint64_t block_index = 0;
524 const ProcessContext* transport = nullptr;
525 BusBufferSet* buses = nullptr;
526 EventBlock* events = nullptr;
528
529 bool is_realtime() const noexcept { return mode == ProcessMode::Realtime; }
530 bool is_offline() const noexcept { return mode == ProcessMode::Offline; }
531 bool has_transport() const noexcept { return transport != nullptr; }
532 bool has_scratch() const noexcept { return scratch != nullptr; }
533
534 bool validate() const noexcept {
535 if (mode != ProcessMode::Realtime && mode != ProcessMode::Offline) return false;
536 if (sample_rate <= 0.0 || !std::isfinite(sample_rate) || frame_count == 0) return false;
537 if (render_speed <= 0.0 || !std::isfinite(render_speed)) return false;
538 if (buses && !buses->validate_frame_count(frame_count)) return false;
539 if (events) {
540 for (const auto& lane : events->audio_rate_modulations) {
541 if (lane.values.size() != frame_count) return false;
542 }
543 }
544 return true;
545 }
546};
547
548} // namespace pulp::format
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Block-local scratch view for realtime/offline processing.
Definition process_block.hpp:107
Fixed-capacity, non-owning set of block-local bus views.
Definition process_block.hpp:146
bool validate_frame_count(std::size_t frame_count) const noexcept
Definition process_block.hpp:206
const BusBuffer * find(BusDirection direction, std::string_view name) const noexcept
Definition process_block.hpp:183
const BusBuffer * first(BusDirection direction, BusRole role=BusRole::Main) const noexcept
Definition process_block.hpp:198
std::span< BusBuffer > buses() noexcept
Definition process_block.hpp:173
BusBuffer * find(BusDirection direction, std::string_view name) noexcept
Definition process_block.hpp:176
std::span< const BusBuffer > buses() const noexcept
Definition process_block.hpp:174
static constexpr std::size_t kMaxBuses
Definition process_block.hpp:148
bool empty() const noexcept
Definition process_block.hpp:171
bool add_input(std::string_view name, audio::BufferView< const float > input, BusRole role=BusRole::Main, bool active=true) noexcept
Definition process_block.hpp:150
BusBuffer * first(BusDirection direction, BusRole role=BusRole::Main) noexcept
Definition process_block.hpp:190
void clear() noexcept
Definition process_block.hpp:168
bool add_output(std::string_view name, audio::BufferView< float > output, BusRole role=BusRole::Main, bool active=true) noexcept
Definition process_block.hpp:159
std::size_t size() const noexcept
Definition process_block.hpp:169
std::size_t capacity() const noexcept
Definition process_block.hpp:170
Prepare-time scratch view.
Definition process_block.hpp:100
Non-owning span of richer-surface process buses for one direction.
Definition process_block.hpp:259
ProcessBusBufferView< SampleType > * find_by_name(std::string_view name) noexcept
Definition process_block.hpp:321
const ProcessBusBufferView< SampleType > * find(BusRole role, std::size_t occurrence) const noexcept
Definition process_block.hpp:294
std::size_t active_count(BusRole role) const noexcept
Definition process_block.hpp:364
std::size_t active_count() const noexcept
Definition process_block.hpp:348
ProcessBusBufferView< SampleType > * find(BusRole role) noexcept
Definition process_block.hpp:275
ProcessBusBufferView< SampleType > * main() noexcept
Definition process_block.hpp:336
ProcessBusBufferView< SampleType > * find_by_index(std::size_t index) noexcept
Definition process_block.hpp:306
const ProcessBusBufferView< SampleType > * find(BusRole role) const noexcept
Definition process_block.hpp:279
ProcessBusBufferView< SampleType > * sidechain() noexcept
Definition process_block.hpp:341
const ProcessBusBufferView< SampleType > * find_by_index(std::size_t index) const noexcept
Definition process_block.hpp:313
const ProcessBusBufferView< SampleType > * main() const noexcept
Definition process_block.hpp:337
const ProcessBusBufferView< SampleType > * find_by_name(std::string_view name) const noexcept
Definition process_block.hpp:328
bool active_buses_have_storage() const noexcept
Definition process_block.hpp:379
std::size_t size() const noexcept
Definition process_block.hpp:265
std::size_t count(BusRole role) const noexcept
Definition process_block.hpp:356
ProcessBusBufferView< SampleType > * find(BusRole role, std::size_t occurrence) noexcept
Definition process_block.hpp:283
bool empty() const noexcept
Definition process_block.hpp:266
ProcessBusBufferSet(std::span< ProcessBusBufferView< SampleType > > buses)
Definition process_block.hpp:262
const ProcessBusBufferView< SampleType > & operator[](std::size_t index) const noexcept
Definition process_block.hpp:271
const ProcessBusBufferView< SampleType > * sidechain() const noexcept
Definition process_block.hpp:344
ProcessBusBufferView< SampleType > & operator[](std::size_t index) noexcept
Definition process_block.hpp:268
bool layouts_match_descriptors() const noexcept
Definition process_block.hpp:372
ScratchArenaView & operator=(const ScratchArenaView &)=delete
void reset() noexcept
Definition process_block.hpp:51
std::span< T > try_allocate(std::size_t count) noexcept
Definition process_block.hpp:77
std::span< std::byte > try_allocate_bytes(std::size_t byte_count, std::size_t alignment) noexcept
Definition process_block.hpp:59
std::size_t used_bytes() const noexcept
Definition process_block.hpp:53
ScratchArenaView & operator=(ScratchArenaView &&)=default
ScratchArenaView(std::span< std::byte > memory) noexcept
Definition process_block.hpp:44
std::size_t size_bytes() const noexcept
Definition process_block.hpp:52
std::size_t remaining_bytes() const noexcept
Definition process_block.hpp:54
bool empty() const noexcept
Definition process_block.hpp:57
ScratchArenaView(ScratchArenaView &&)=default
ScratchArenaView(const ScratchArenaView &)=delete
Collection of timestamped MIDI events within a single audio buffer period.
Definition buffer.hpp:31
A time-ordered list of per-note expression events for one block.
Definition mpe_buffer.hpp:51
A time-ordered list of UMP events for one audio block.
Definition ump_buffer.hpp:41
Definition parameter_event_queue.hpp:82
Sample-accurate MPE expression event stream.
What the product grants a device: the quota table indexed by capability tier and live thermal state.
Definition aax_editor.hpp:31
@ Offline
Definition generation_routing.hpp:81
BusDirection
Definition process_block.hpp:112
@ Output
Definition process_block.hpp:114
@ Input
Definition process_block.hpp:113
ProcessMode
Coarse processing mode for one block.
Definition process_block.hpp:29
@ Offline
Definition process_block.hpp:31
@ Realtime
Definition process_block.hpp:30
ProcessBuffersT< double > ProcessBuffers64
Definition process_block.hpp:423
BusRole
Semantic role of a declared audio bus.
Definition bus_role.hpp:9
@ Main
Definition bus_role.hpp:10
@ Sidechain
Definition bus_role.hpp:12
ProcessBuffersT< float > ProcessBuffers
Definition process_block.hpp:422
Non-owning dense per-sample parameter-modulation lane.
Definition process_block.hpp:452
std::size_t size() const noexcept
Definition process_block.hpp:457
std::uint32_t param_id
Definition process_block.hpp:453
bool empty() const noexcept
Definition process_block.hpp:456
std::span< const float > values
Definition process_block.hpp:454
Definition process_block.hpp:117
bool empty() const noexcept
Definition process_block.hpp:135
BusRole role
Definition process_block.hpp:120
audio::BufferView< float > output
Definition process_block.hpp:123
std::string_view name
Definition process_block.hpp:118
std::size_t num_frames() const noexcept
Definition process_block.hpp:130
audio::BufferView< const float > input
Definition process_block.hpp:122
bool active
Definition process_block.hpp:121
std::size_t num_channels() const noexcept
Definition process_block.hpp:125
BusDirection direction
Definition process_block.hpp:119
Non-owning view of all sparse events visible to one process block.
Definition process_block.hpp:465
midi::MidiBuffer * midi_in
Definition process_block.hpp:470
midi::MidiBuffer * midi_out
Definition process_block.hpp:471
std::span< const state::ParameterEvent > parameters() const noexcept
Definition process_block.hpp:479
EventDropCounters drops
Definition process_block.hpp:476
const midi::UmpBuffer * ump_input
Definition process_block.hpp:475
bool empty() const noexcept
Definition process_block.hpp:504
std::size_t audio_rate_modulation_count() const noexcept
Definition process_block.hpp:496
std::size_t midi_input_event_count() const noexcept
Definition process_block.hpp:488
std::size_t parameter_event_count() const noexcept
Definition process_block.hpp:484
std::size_t midi_output_event_count() const noexcept
Definition process_block.hpp:492
std::size_t sysex_event_count() const noexcept
Definition process_block.hpp:500
std::span< const AudioRateModulationView > audio_rate_modulations
Definition process_block.hpp:477
const state::ParameterEventQueue * parameter_events
Definition process_block.hpp:466
const midi::MpeBuffer * mpe_input
Definition process_block.hpp:474
Definition process_block.hpp:425
std::uint32_t mpe_events
Definition process_block.hpp:430
std::uint32_t total() const noexcept
Definition process_block.hpp:440
std::uint32_t audio_rate_modulations
Definition process_block.hpp:432
std::uint32_t ump_packets
Definition process_block.hpp:429
bool any() const noexcept
Definition process_block.hpp:434
std::uint32_t midi_events
Definition process_block.hpp:427
std::uint32_t sysex_events
Definition process_block.hpp:428
std::uint32_t graph_events
Definition process_block.hpp:431
std::uint32_t parameter_events
Definition process_block.hpp:426
Definition process_block.hpp:34
bool tail_drain
Definition process_block.hpp:37
bool bypass
Definition process_block.hpp:35
bool transport_jump
Definition process_block.hpp:38
bool reset
Definition process_block.hpp:36
Additive block-scoped process contract.
Definition process_block.hpp:517
bool is_realtime() const noexcept
Definition process_block.hpp:529
double render_speed
Definition process_block.hpp:522
double sample_rate
Definition process_block.hpp:520
std::uint64_t block_index
Definition process_block.hpp:523
ProcessBlockFlags flags
Definition process_block.hpp:519
bool is_offline() const noexcept
Definition process_block.hpp:530
bool has_transport() const noexcept
Definition process_block.hpp:531
ProcessMode mode
Definition process_block.hpp:518
bool validate() const noexcept
Definition process_block.hpp:534
BusBufferSet * buses
Definition process_block.hpp:525
std::uint32_t frame_count
Definition process_block.hpp:521
const ProcessContext * transport
Definition process_block.hpp:524
bool has_scratch() const noexcept
Definition process_block.hpp:532
BlockScratch * scratch
Definition process_block.hpp:527
EventBlock * events
Definition process_block.hpp:526
Additive richer-surface process-buffer view. It is intentionally non-owning.
Definition process_block.hpp:392
bool layouts_match_descriptors() const noexcept
Definition process_block.hpp:411
ProcessBusBufferSet< const float > inputs
Definition process_block.hpp:393
const audio::BufferView< const SampleType > * main_input() const noexcept
Definition process_block.hpp:396
const audio::BufferView< const SampleType > * sidechain_input() const noexcept
Definition process_block.hpp:406
ProcessBusBufferSet< float > outputs
Definition process_block.hpp:394
bool active_buses_have_storage() const noexcept
Definition process_block.hpp:416
audio::BufferView< SampleType > * main_output() noexcept
Definition process_block.hpp:401
Metadata that travels with a non-owning richer-surface process bus view.
Definition process_block.hpp:219
std::string_view name
Definition process_block.hpp:220
BusRole role
Definition process_block.hpp:223
BusDirection direction
Definition process_block.hpp:222
std::size_t index
Definition process_block.hpp:221
bool optional
Definition process_block.hpp:225
bool active
Definition process_block.hpp:226
int declared_channels
Definition process_block.hpp:224
Non-owning view of one richer-surface process bus.
Definition process_block.hpp:231
bool active() const noexcept
Definition process_block.hpp:235
bool sidechain() const noexcept
Definition process_block.hpp:238
ProcessBusBufferInfo info
Definition process_block.hpp:232
std::size_t num_channels() const noexcept
Definition process_block.hpp:239
bool matches_declared_layout() const noexcept
Definition process_block.hpp:242
bool optional() const noexcept
Definition process_block.hpp:236
audio::BufferView< SampleType > buffer
Definition process_block.hpp:233
bool has_channel_storage() const noexcept
Definition process_block.hpp:248
std::size_t num_samples() const noexcept
Definition process_block.hpp:240
bool main() const noexcept
Definition process_block.hpp:237
Process context — passed every audio callback with transport state.
Definition process_context.hpp:89
Sample-accurate MIDI 2.0 UMP packet stream.