Performance tweaks

This commit is contained in:
Skyler Lehmkuhl 2026-03-10 03:24:03 -04:00
parent ac2b4ff8ab
commit 4118c75b86
1 changed files with 12 additions and 21 deletions

View File

@ -804,7 +804,7 @@ struct EditorApp {
audio_input_stream: Option<cpal::Stream>, audio_input_stream: Option<cpal::Stream>,
audio_buffer_size: u32, audio_buffer_size: u32,
audio_event_rx: Option<rtrb::Consumer<daw_backend::AudioEvent>>, audio_event_rx: Option<rtrb::Consumer<daw_backend::AudioEvent>>,
audio_events_pending: std::sync::Arc<std::sync::atomic::AtomicBool>, last_input_monitoring: bool,
/// Count of in-flight graph preset loads — keeps the repaint loop alive /// Count of in-flight graph preset loads — keeps the repaint loop alive
/// until the audio thread sends GraphPresetLoaded events for all of them /// until the audio thread sends GraphPresetLoaded events for all of them
pending_graph_loads: std::sync::Arc<std::sync::atomic::AtomicU32>, pending_graph_loads: std::sync::Arc<std::sync::atomic::AtomicU32>,
@ -1088,10 +1088,10 @@ impl EditorApp {
audio_stream, audio_stream,
audio_controller, audio_controller,
audio_event_rx, audio_event_rx,
last_input_monitoring: false,
audio_input, audio_input,
audio_input_stream: None, audio_input_stream: None,
audio_buffer_size: config.audio_buffer_size, audio_buffer_size: config.audio_buffer_size,
audio_events_pending: std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)),
pending_graph_loads: std::sync::Arc::new(std::sync::atomic::AtomicU32::new(0)), pending_graph_loads: std::sync::Arc::new(std::sync::atomic::AtomicU32::new(0)),
commit_raster_floating_if_any: false, commit_raster_floating_if_any: false,
pending_node_group: false, pending_node_group: false,
@ -4818,10 +4818,6 @@ impl eframe::App for EditorApp {
} }
let _pre_events_ms = _frame_start.elapsed().as_secs_f64() * 1000.0; let _pre_events_ms = _frame_start.elapsed().as_secs_f64() * 1000.0;
// Check if audio events are pending and request repaint if needed
if self.audio_events_pending.load(std::sync::atomic::Ordering::Relaxed) {
ctx.request_repaint();
}
// Keep repainting while waiting for graph preset loads to complete // Keep repainting while waiting for graph preset loads to complete
if self.pending_graph_loads.load(std::sync::atomic::Ordering::Relaxed) > 0 { if self.pending_graph_loads.load(std::sync::atomic::Ordering::Relaxed) > 0 {
ctx.request_repaint(); ctx.request_repaint();
@ -4847,9 +4843,7 @@ impl eframe::App for EditorApp {
// Poll audio events from the audio engine // Poll audio events from the audio engine
if let Some(event_rx) = &mut self.audio_event_rx { if let Some(event_rx) = &mut self.audio_event_rx {
let mut polled_events = false;
while let Ok(event) = event_rx.pop() { while let Ok(event) = event_rx.pop() {
polled_events = true;
use daw_backend::AudioEvent; use daw_backend::AudioEvent;
match event { match event {
AudioEvent::PlaybackPosition(time) => { AudioEvent::PlaybackPosition(time) => {
@ -5262,19 +5256,11 @@ impl eframe::App for EditorApp {
} }
} }
// If we polled events, set the flag to trigger another update
// (in case more events arrive before the next frame)
if polled_events {
self.audio_events_pending.store(true, std::sync::atomic::Ordering::Relaxed);
} else {
// No events this frame, clear the flag
self.audio_events_pending.store(false, std::sync::atomic::Ordering::Relaxed);
}
} }
// Update input monitoring based on active layer // Update input monitoring based on active layer (only send command when changed)
if let Some(controller) = &self.audio_controller { {
let should_monitor = self.active_layer_id.map_or(false, |layer_id| { let should_monitor = self.audio_controller.is_some() && self.active_layer_id.map_or(false, |layer_id| {
let doc = self.action_executor.document(); let doc = self.action_executor.document();
if let Some(layer) = doc.get_layer(&layer_id) { if let Some(layer) = doc.get_layer(&layer_id) {
matches!(layer, lightningbeam_core::layer::AnyLayer::Audio(a) if a.audio_layer_type == lightningbeam_core::layer::AudioLayerType::Sampled) matches!(layer, lightningbeam_core::layer::AnyLayer::Audio(a) if a.audio_layer_type == lightningbeam_core::layer::AudioLayerType::Sampled)
@ -5282,8 +5268,13 @@ impl eframe::App for EditorApp {
false false
} }
}); });
if let Ok(mut ctrl) = controller.try_lock() { if should_monitor != self.last_input_monitoring {
ctrl.set_input_monitoring(should_monitor); self.last_input_monitoring = should_monitor;
if let Some(controller) = &self.audio_controller {
if let Ok(mut ctrl) = controller.try_lock() {
ctrl.set_input_monitoring(should_monitor);
}
}
} }
} }