22struct RealtimeGpuHealth;
23struct GpuAudioTransportDiagnostics;
24struct SharedIoCompletionNotifier;
159 return latency_blocks_ * block_size_;
170 uint32_t n)
noexcept;
191 void pump(uint32_t max_blocks = 0) noexcept;
227 void release_pipeline_hosting() noexcept;
228 using TrialDeliveryFn =
void (*)(
void*,
std::uint64_t,
std::uint8_t,
std::uint64_t,
229 std::uint64_t,
std::uint64_t) noexcept;
231 TrialDeliveryFn) noexcept;
236 uint32_t channels_ = 0;
237 uint32_t block_size_ = 0;
238 uint32_t sample_rate_ = 0;
239 uint32_t latency_blocks_ = 0;
240 uint32_t ring_blocks_ = 0;
243 bool prepared_ = false;
245 void reset_staged_transport_state() noexcept;
249 bool record_dropped_slot(
std::uint64_t
sequence,
bool dropped) noexcept;
250 void process_shared(const
audio::BufferView<const
float>&,
audio::BufferView<
float>&,
251 std::uint32_t,
std::uint64_t,
bool input_valid,
252 std::uint64_t callback_start_ns,
bool count_delivery) noexcept;
253 void process_realtime_position(const
audio::BufferView<const
float>&,
audio::BufferView<
float>&,
254 std::uint32_t,
std::uint64_t,
bool input_valid,
255 std::uint64_t callback_start_ns) noexcept;
256 void process_offline_position(const
audio::BufferView<const
float>&,
audio::BufferView<
float>&,
257 std::uint32_t,
std::uint64_t,
bool input_valid) noexcept;
258 void process_invalid_position(
audio::BufferView<
float>&,
std::uint64_t,
bool offline) noexcept;
259 void publish_trial_delivery(
std::uint64_t
sequence,
std::uint8_t disposition,
260 std::uint64_t callback_start_ns,
std::uint64_t callback_end_ns,
261 std::uint64_t result_visible_ns) noexcept;
262 void record_delivery(
std::uint8_t disposition,
bool worker_output) noexcept;
264 audio::PlanarAudioRingBuffer input_ring_;
265 audio::PlanarAudioRingBuffer output_ring_;
267 audio::Buffer<
float> worker_in_;
268 audio::Buffer<
float> worker_out_;
271 audio::Buffer<
float> rejected_input_;
272 audio::Buffer<
float> rejected_output_;
273 std::vector<const
float*> rejected_input_ptrs_;
274 std::vector<
float*> rejected_output_ptrs_;
277 std::vector<
float*> in_fptrs_;
278 std::vector<const
float*> in_cptrs_;
279 std::vector<
float*> out_fptrs_;
281 std::atomic<
std::uint64_t> produced_blocks_{0};
282 std::atomic<std::uint64_t> miss_blocks_{0};
283 std::atomic<std::uint64_t> input_dropped_blocks_{0};
284 std::atomic<std::uint64_t> resynced_blocks_{0};
285 std::atomic<std::uint64_t> delivery_gpu_{0}, delivery_worker_{0}, delivery_fallback_{0},
286 delivery_silence_{0}, delivery_passthrough_{0}, delivery_priming_{0}, delivery_invalid_{0};
293 std::uint64_t blocks_owed_ = 0;
301 std::vector<std::uint8_t> dropped_slots_;
304 std::atomic<std::uint64_t> last_block_ns_{0};
305 std::atomic<std::uint64_t> avg_block_ns_{0};
309 void worker_loop() noexcept;
311 std::atomic<
bool> worker_running_{
false};
312 std::chrono::microseconds poll_interval_{200};
313 void* audio_workgroup_ =
nullptr;
314 bool join_audio_workgroup_ =
false;
315 std::atomic<bool> worker_workgroup_joined_{
false};
316 std::atomic<std::uint64_t> worker_workgroup_join_failures_{0};
317 std::atomic<bool> worker_interactive_qos_{
false};
325 bool wake_on_write_ =
false;
326 std::unique_ptr<detail::WorkerWake> wake_;
329 bool (*realtime_gpu_set_notifier_)(
void*,
330 detail::SharedIoCompletionNotifier)
noexcept =
nullptr;
331 bool completion_notifier_installed_ =
false;
332 static void notify_worker(
void* self)
noexcept;
337 void* realtime_gpu_context_ =
nullptr;
338 std::uint8_t (*realtime_gpu_process_)(
void*,
const audio::BufferView<const float>&,
339 audio::BufferView<float>&, std::uint32_t, std::uint64_t,
340 bool, std::uint64_t)
noexcept =
nullptr;
341 std::uint32_t (*realtime_gpu_service_)(
void*, std::uint64_t)
noexcept =
nullptr;
342 bool (*realtime_gpu_fence_)(
void*)
noexcept =
nullptr;
343 void (*realtime_gpu_delivered_)(
void*, std::uint64_t, std::uint8_t, std::uint64_t,
344 std::uint64_t)
noexcept =
nullptr;
349 bool (*realtime_gpu_health_)(
const void*, detail::RealtimeGpuHealth&)
noexcept =
nullptr;
350 bool sample_staged_health_ =
false;
351 std::unique_ptr<detail::GpuAudioTransportDiagnostics> diagnostics_;
352 void refresh_node_health() noexcept;
353 void publish_prepared_configuration() noexcept;
356 void steward_reacquire() noexcept;
357 bool (*realtime_gpu_reprepare_)(
void*, std::uint64_t) noexcept =
nullptr;
359 std::uint64_t reacquire_budget_ns_ = 0;
360 std::uint32_t reacquire_max_attempts_ = 0;
361 std::uint64_t reacquire_backoff_ns_ = 0;
362 std::uint32_t reacquire_round_ = 0;
363 std::uint64_t outage_started_ns_ = 0;
364 std::uint64_t next_reacquire_ns_ = 0;
368 bool resume_armed_ = false;
369 std::atomic<std::uint64_t> reacquire_attempts_{0};
370 std::atomic<std::uint64_t> reacquire_successes_{0};
371 std::atomic<std::uint64_t> last_reacquire_to_gpu_ns_{0};
374 std::atomic<std::uint64_t> resume_pending_from_ns_{0};
375 std::uint64_t callback_sequence_ = 0;
376 bool realtime_gpu_fenced_for_offline_ =
false;
379 void (*realtime_gpu_offline_render_)(
void*, bool)
noexcept =
nullptr;
380 bool realtime_gpu_offline_ =
false;
388 std::atomic<bool> synchronous_{
false};
389 std::mutex pump_mutex_;
394 void* trial_observer_context_ =
nullptr;
395 TrialDeliveryFn trial_observer_ =
nullptr;
401 bool pipeline_hosted_ =
false;
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
A unit of audio work the transport schedules onto a non-real-time worker.
Definition gpu_audio_node.hpp:92
GpuAudioCapabilityReport capability_report() const noexcept
Host/UI-only snapshot of the prepared integration path.
bool is_prepared() const noexcept
Definition gpu_audio_transport.hpp:155
uint32_t latency_samples() const noexcept
Definition gpu_audio_transport.hpp:158
GpuAudioStatus status_snapshot() const noexcept
Allocation-free host/UI snapshot with stable, versioned field semantics.
void process(const audio::BufferView< const float > &input, audio::BufferView< float > &output, uint32_t n) noexcept
Real-time-safe.
GpuAudioTransport(const GpuAudioTransport &)=delete
GpuAudioTransport & operator=(const GpuAudioTransport &)=delete
void process_offline(const audio::BufferView< const float > &input, audio::BufferView< float > &output, uint32_t n) noexcept
Offline / faster-than-real-time render path.
friend bool configure_gpu_audio_transport_trial_observer(GpuAudioTransport &, void *, TrialDeliveryFn) noexcept
DeliverySnapshot delivery_snapshot() const noexcept
Allocation-free independent atomic loads: approximate while process() runs, exact once its caller has...
void pump(uint32_t max_blocks=0) noexcept
Non-RT worker step: drain ready input blocks, run the node, fill output.
Stats stats() const noexcept
bool prepare(GpuAudioNode *node, const Config &config)
Non-RT.
Definition analyzer_provider.hpp:12
Definition gpu_audio_node.hpp:78
Definition flow_pans.hpp:19
GpuAudioRecoveryPolicy
Whether a node may re-acquire a lost provider on its own.
Definition gpu_audio_capability.hpp:39
@ Manual
Definition gpu_audio_capability.hpp:40
MissPolicy
What the transport does for a block when the GPU result is not ready in time (the worker fell behind,...
Definition gpu_audio_node.hpp:12
@ Silence
Output silence for the missed block (+ telemetry).
Definition gpu_audio_node.hpp:15
Definition host_transport_projector.hpp:8
Backend-neutral, allocation-free capability snapshot for installed SDK consumers.
Definition gpu_audio_capability.hpp:46
Versioned, allocation-free status shared by native hosts and UI adapters.
Definition gpu_audio_status.hpp:80
Definition gpu_audio_transport.hpp:45
GpuAudioRecoveryPolicy recovery_policy
AutoReacquire lets the worker replace a fenced node's provider while the callback stays on its prepar...
Definition gpu_audio_transport.hpp:77
std::uint32_t reacquire_max_attempts
Attempts per outage.
Definition gpu_audio_transport.hpp:85
bool wake_on_write
Definition gpu_audio_transport.hpp:63
std::uint64_t reacquire_release_budget_ns
Budget for releasing the old provider.
Definition gpu_audio_transport.hpp:81
uint32_t ring_blocks
Definition gpu_audio_transport.hpp:46
bool join_audio_workgroup
Definition gpu_audio_transport.hpp:69
void * audio_workgroup
Definition gpu_audio_transport.hpp:68
std::uint64_t reacquire_backoff_ns
The first attempt is immediate.
Definition gpu_audio_transport.hpp:91
bool run_worker_thread
Definition gpu_audio_transport.hpp:51
Selected output for prepared process() calls, not worker completions or GPU admissions.
Definition gpu_audio_transport.hpp:123
std::uint64_t invalid_blocks
Definition gpu_audio_transport.hpp:132
std::uint64_t priming_blocks
Definition gpu_audio_transport.hpp:131
std::uint64_t worker_output_blocks
Definition gpu_audio_transport.hpp:127
std::uint64_t cpu_fallback_blocks
Definition gpu_audio_transport.hpp:128
std::uint64_t silence_blocks
Definition gpu_audio_transport.hpp:129
std::uint64_t passthrough_blocks
Definition gpu_audio_transport.hpp:130
std::uint64_t gpu_blocks
Definition gpu_audio_transport.hpp:124
Definition gpu_audio_transport.hpp:94
bool worker_workgroup_joined
Definition gpu_audio_transport.hpp:112
std::uint64_t miss_blocks
Definition gpu_audio_transport.hpp:96
std::uint64_t resynced_blocks
Definition gpu_audio_transport.hpp:103
bool worker_interactive_qos
Definition gpu_audio_transport.hpp:116
std::uint64_t worker_workgroup_join_failures
Definition gpu_audio_transport.hpp:113
std::uint64_t input_dropped_frames
Definition gpu_audio_transport.hpp:97
double avg_block_us
Definition gpu_audio_transport.hpp:111
std::uint64_t produced_blocks
Definition gpu_audio_transport.hpp:95
double last_block_us
Definition gpu_audio_transport.hpp:110
Real-time thread priority management.