From 4118c75b86b87e8be15df923efd165efd4f45dca Mon Sep 17 00:00:00 2001 From: Skyler Lehmkuhl Date: Tue, 10 Mar 2026 03:24:03 -0400 Subject: [PATCH] Performance tweaks --- .../lightningbeam-editor/src/main.rs | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/lightningbeam-ui/lightningbeam-editor/src/main.rs b/lightningbeam-ui/lightningbeam-editor/src/main.rs index c5196fd..8d41811 100644 --- a/lightningbeam-ui/lightningbeam-editor/src/main.rs +++ b/lightningbeam-ui/lightningbeam-editor/src/main.rs @@ -804,7 +804,7 @@ struct EditorApp { audio_input_stream: Option, audio_buffer_size: u32, audio_event_rx: Option>, - audio_events_pending: std::sync::Arc, + last_input_monitoring: bool, /// Count of in-flight graph preset loads — keeps the repaint loop alive /// until the audio thread sends GraphPresetLoaded events for all of them pending_graph_loads: std::sync::Arc, @@ -1088,10 +1088,10 @@ impl EditorApp { audio_stream, audio_controller, audio_event_rx, + last_input_monitoring: false, audio_input, audio_input_stream: None, 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)), commit_raster_floating_if_any: 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; - // 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 if self.pending_graph_loads.load(std::sync::atomic::Ordering::Relaxed) > 0 { ctx.request_repaint(); @@ -4847,9 +4843,7 @@ impl eframe::App for EditorApp { // Poll audio events from the audio engine if let Some(event_rx) = &mut self.audio_event_rx { - let mut polled_events = false; while let Ok(event) = event_rx.pop() { - polled_events = true; use daw_backend::AudioEvent; match event { 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 - if let Some(controller) = &self.audio_controller { - let should_monitor = self.active_layer_id.map_or(false, |layer_id| { + // Update input monitoring based on active layer (only send command when changed) + { + let should_monitor = self.audio_controller.is_some() && self.active_layer_id.map_or(false, |layer_id| { let doc = self.action_executor.document(); 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) @@ -5282,8 +5268,13 @@ impl eframe::App for EditorApp { false } }); - if let Ok(mut ctrl) = controller.try_lock() { - ctrl.set_input_monitoring(should_monitor); + if should_monitor != self.last_input_monitoring { + 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); + } + } } }