From 4f54c3e07cad0d2c64e1b435f87e8e952640faad Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Fri, 13 Feb 2026 20:10:47 +0100 Subject: [PATCH] settings: Get available audio devices lazily when first required (#49115) Release Notes: - Get available audio devices lazily when first required. --- crates/audio/src/audio.rs | 12 ++++++++++-- .../src/pages/audio_input_output_setup.rs | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/audio/src/audio.rs b/crates/audio/src/audio.rs index d684b9c79e296e141a021a32c88c009e85504457..bc2933647f5facc966ec0471ad3a6a81d25c48f1 100644 --- a/crates/audio/src/audio.rs +++ b/crates/audio/src/audio.rs @@ -54,13 +54,21 @@ pub const REPLAY_DURATION: Duration = Duration::from_secs(30); pub fn init(cx: &mut App) { LIVE_SETTINGS.initialize(cx); - // TODO(jk): this is currently cached only once at startup - we should observe and react instead +} + +// TODO(jk): this is currently cached only once - we should observe and react instead +pub fn ensure_devices_initialized(cx: &mut App) { + if cx.has_global::() { + return; + } + cx.default_global::(); let task = cx .background_executor() .spawn(async move { get_available_audio_devices() }); cx.spawn(async move |cx: &mut AsyncApp| { let devices = task.await; - cx.update(|cx| cx.set_global(AvailableAudioDevices(devices))) + cx.update(|cx| cx.set_global(AvailableAudioDevices(devices))); + cx.refresh(); }) .detach(); } diff --git a/crates/settings_ui/src/pages/audio_input_output_setup.rs b/crates/settings_ui/src/pages/audio_input_output_setup.rs index e19f5441eff03dcf20aa77eb6d0cd3dfceab02dc..7ae8f0c7816445a8f5dfc4bcbbdbb5259cfcdc52 100644 --- a/crates/settings_ui/src/pages/audio_input_output_setup.rs +++ b/crates/settings_ui/src/pages/audio_input_output_setup.rs @@ -35,7 +35,8 @@ pub(crate) fn render_audio_device_dropdown( where F: Fn(Option, &mut Window, &mut App) + Clone + 'static, { - let devices = cx.default_global::().0.clone(); + audio::ensure_devices_initialized(cx); + let devices = cx.global::().0.clone(); let current_device = get_current_device(current_device_id.as_ref(), is_input, &devices); let menu = ContextMenu::build(window, cx, {