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_buffer_size: u32,
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
/// until the audio thread sends GraphPresetLoaded events for all of them
pending_graph_loads: std::sync::Arc<std::sync::atomic::AtomicU32>,
@ -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);
}
}
}
}