From 48914ae8c1751c71dffdc78326c04b59dc094fea Mon Sep 17 00:00:00 2001 From: David Kleingeld Date: Thu, 11 Sep 2025 16:21:48 +0200 Subject: [PATCH] adds conditional cmp removing use of libwebrtc on windows/freebsd They cant compile livekit yet. This removes microphone and echo cancellation on those platforms however they can not join calls due to the same cause so it does not matter. --- crates/audio/src/audio.rs | 51 +++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/crates/audio/src/audio.rs b/crates/audio/src/audio.rs index 1478afa0c2b8bf5b5d633b11442f7038198109b0..44f2d5e07d5e7ddb9bbb18925bb8bdbe7581e903 100644 --- a/crates/audio/src/audio.rs +++ b/crates/audio/src/audio.rs @@ -1,24 +1,26 @@ use anyhow::{Context as _, Result}; use collections::HashMap; -use gpui::{App, AsyncApp, BackgroundExecutor, BorrowAppContext, Global}; -use libwebrtc::native::apm; -use log::info; -use parking_lot::Mutex; +use gpui::{App, BackgroundExecutor, BorrowAppContext, Global}; + +#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))] +mod non_windows_and_freebsd_deps { + pub(super) use gpui::AsyncApp; + pub(super) use libwebrtc::native::apm; + pub(super) use log::info; + pub(super) use parking_lot::Mutex; + pub(super) use rodio::cpal::Sample; + pub(super) use rodio::source::{LimitSettings, UniformSourceIterator}; + pub(super) use std::sync::Arc; +} + +#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))] +use non_windows_and_freebsd_deps::*; + use rodio::{ - Decoder, OutputStream, OutputStreamBuilder, Source, - cpal::Sample, - mixer::Mixer, - nz, - source::{Buffered, LimitSettings, UniformSourceIterator}, + Decoder, OutputStream, OutputStreamBuilder, Source, mixer::Mixer, nz, source::Buffered, }; use settings::Settings; -use std::{ - io::Cursor, - num::NonZero, - path::PathBuf, - sync::{Arc, atomic::Ordering}, - time::Duration, -}; +use std::{io::Cursor, num::NonZero, path::PathBuf, sync::atomic::Ordering, time::Duration}; use util::ResultExt; mod audio_settings; @@ -76,6 +78,7 @@ impl Sound { pub struct Audio { output_handle: Option, output_mixer: Option, + #[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))] pub echo_canceller: Arc>, source_cache: HashMap>>>>, replays: replays::Replays, @@ -86,6 +89,10 @@ impl Default for Audio { Self { output_handle: Default::default(), output_mixer: Default::default(), + #[cfg(not(any( + all(target_os = "windows", target_env = "gnu"), + target_os = "freebsd" + )))] echo_canceller: Arc::new(Mutex::new(apm::AudioProcessingModule::new( true, false, false, false, ))), @@ -110,7 +117,16 @@ impl Audio { mixer.add(rodio::source::Zero::new(CHANNEL_COUNT, SAMPLE_RATE)); self.output_mixer = Some(mixer); + // The webrtc apm is not yet compiling for windows & freebsd + #[cfg(not(any( + any(all(target_os = "windows", target_env = "gnu")), + target_os = "freebsd" + )))] let echo_canceller = Arc::clone(&self.echo_canceller); + #[cfg(not(any( + any(all(target_os = "windows", target_env = "gnu")), + target_os = "freebsd" + )))] let source = source.inspect_buffer::(move |buffer| { let mut buf: [i16; _] = buffer.map(|s| s.to_sample()); echo_canceller @@ -139,6 +155,7 @@ impl Audio { self.replays.replays_to_tar(executor) } + #[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))] pub fn open_microphone(voip_parts: VoipParts) -> anyhow::Result { let stream = rodio::microphone::MicrophoneBuilder::new() .default_device()? @@ -248,11 +265,13 @@ impl Audio { } } +#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))] pub struct VoipParts { echo_canceller: Arc>, replays: replays::Replays, } +#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))] impl VoipParts { pub fn new(cx: &AsyncApp) -> anyhow::Result { let (apm, replays) = cx.try_read_default_global::(|audio, _| {