5#if PULP_ENABLE_AUDIO_PROBES
9#include <pulp/format/detail/playhead_diff.hpp>
42class StandaloneMusicalTyping;
233 std::size_t popped = 0;
234 std::size_t drained = 0;
239 if (out.
add(*event)) ++drained;
309 void prepare(
bool playing,
double tempo_bpm) noexcept;
311 int block_size_samples) noexcept;
318 std::uint64_t generation = 0;
320 struct TransportCommand {
322 double tempo_bpm = 120.0;
323 std::int64_t position_samples = 0;
324 std::uint64_t position_revision = 0;
328 int sample_offset)
noexcept;
331 std::atomic<std::uint64_t> midi_generation_{1};
332 std::uint64_t audio_midi_generation_ = 1;
333 std::array<std::array<bool, 128>, 16> active_notes_{};
334 bool note_release_pending_ =
false;
336 TransportCommand control_transport_{};
337 mutable std::mutex control_transport_mutex_;
338 std::optional<TransportCommand> transport_before_control_;
339 runtime::TripleBuffer<TransportCommand> transport_commands_{control_transport_};
340 StandaloneTestTransportState audio_transport_{};
341 runtime::SeqLock<StandaloneTestTransportState> observed_transport_{audio_transport_};
342 std::uint64_t audio_position_revision_ = 0;
343 bool prepared_ =
false;
360 return audio_device_ ? audio_device_->xrun_count() : 0;
377 std::function<
void(
const std::vector<std::string>&)> handler) {
378 open_files_handler_ = std::move(handler);
397#if PULP_ENABLE_AUDIO_PROBES
418 return test_input_host_;
447 std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now());
456 return state_persist_.active;
462 return state_persist_.saves;
475 void attach_view_layer();
479 void shutdown_view_input() noexcept;
480 int view_waveform_capacity() const noexcept;
483 bool run_view_editor(
bool use_gpu, const
StandaloneConfig& effective_config);
484 std::function<
void(const
std::
vector<
std::
string>&)> open_files_handler_;
491 runtime::ScopedTracingAttachment tracing_;
496 void stop_audio_keep_processor();
502 void prepare_render_state();
508 void render_audio_block(const
audio::BufferView<const
float>& input,
509 audio::BufferView<
float>& output,
510 const
audio::CallbackContext& ctx);
527 state::StateStore store_;
535 bool persisted_config_loaded_ = false;
538 struct StatePersistence {
540 bool pending =
false;
541 std::uint32_t saves = 0;
542 std::uint64_t saved_fingerprint = 0;
543 std::uint64_t observed_fingerprint = 0;
544 std::chrono::steady_clock::time_point first_change{};
545 std::chrono::steady_clock::time_point last_change{};
546 std::chrono::steady_clock::time_point last_poll{};
548 void restore_persisted_state();
549 std::uint64_t state_fingerprint()
const;
555 detail::PlayheadSnapshot playhead_prev_{};
557 std::unique_ptr<audio::AudioSystem> audio_system_;
558 std::unique_ptr<audio::AudioDevice> audio_device_;
561 bool audio_skipped_for_capture_ =
false;
564 std::function<std::unique_ptr<audio::AudioSystem>()> audio_system_factory_;
565 std::unique_ptr<midi::MidiSystem> midi_system_;
566 std::unique_ptr<midi::MidiInput> midi_input_;
572 detail::StandaloneTestInputHost test_input_host_;
573 std::atomic<bool> running_{
false};
575 TestSignalSource test_signal_;
576 view::AudioBridge input_meter_bridge_;
577 view::AudioBridge output_meter_bridge_;
581 template <
typename T>
using ViewLayerPtr = std::unique_ptr<T, void (*)(T*)>;
582 ViewLayerPtr<view::CommandRegistry> command_registry_{
nullptr,
nullptr};
583 ViewLayerPtr<detail::StandaloneMusicalTyping> musical_typing_{
nullptr,
nullptr};
584#if PULP_ENABLE_AUDIO_PROBES
588 audio::AudioProbe output_probe_;
591 std::vector<const float*> output_probe_ptrs_;
598 audio::RollingAudioCaptureBuffer rolling_capture_;
599 bool rolling_capture_active_ =
false;
604 std::atomic<int> rolling_capture_channels_{0};
615 ViewLayerPtr<view::AudioInspectorWindow> audio_inspector_{
nullptr,
nullptr};
625 int max_callback_block_ = 0;
626 audio::Buffer<float> test_buffer_;
627 audio::Buffer<float> silence_buffer_;
628 std::vector<float*> test_ptrs_;
629 std::vector<float*> direct_output_ptrs_;
630 std::vector<const float*> silence_ptrs_;
631 std::vector<const float*> meter_ptrs_;
632 std::vector<const float*> output_meter_ptrs_;
Realtime-safe audio output probe.
Realtime output-boundary probe.
Definition audio_probe.hpp:53
Definition device.hpp:149
Definition audio_bridge.hpp:122
Collection of timestamped MIDI events within a single audio buffer period.
Definition buffer.hpp:31
bool add(const MidiEvent &event)
Append a MIDI event to the buffer.
Definition buffer.hpp:98
Definition message_collector.hpp:61
static constexpr std::size_t pending_capacity()
Compile-time size of the consumer-owned pending ring.
Definition message_collector.hpp:214
static constexpr std::size_t capacity()
Compile-time capacity of the producer queue.
Definition message_collector.hpp:205
Definition spsc_queue.hpp:23
bool try_pop(T &item)
Definition spsc_queue.hpp:45
Centralized parameter storage with lock-free value access.
Definition store.hpp:164
Floating Audio Inspector window.
Definition audio_inspector_window.hpp:46
Central command dispatcher.
Definition command_registry.hpp:207
SPSC MIDI accumulator for UI-thread → audio-thread MIDI delivery.
Definition analyzer_provider.hpp:12
Definition custom_node_events.hpp:26
Definition generated_event_source.hpp:33
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
Lock-free sequence-lock for coherent multi-field snapshots.
Lock-free latest-value publication between two threads.
Source-compatible spelling of <pulp/dataplane/audio_bridge.hpp>.