Skip to main content

maolan_engine/
lib.rs

1mod audio;
2mod audio_codec;
3pub mod client;
4mod engine;
5pub use engine::Engine;
6pub mod history;
7mod hw;
8pub mod kind;
9pub mod message;
10mod midi;
11pub mod modulator;
12pub mod mutex;
13mod osc;
14pub mod plugins;
15mod routing;
16#[cfg(unix)]
17mod rubberband;
18pub mod simd;
19pub mod state;
20mod track;
21pub mod workers;
22pub use workers::worker;
23
24pub use plugins::clap_proc;
25#[cfg(all(unix, not(target_os = "macos")))]
26pub use plugins::lv2_proc;
27pub use plugins::vst3_proc;
28
29pub mod clap {
30    pub use crate::plugins::types::is_supported_clap_binary;
31    pub use crate::plugins::types::{
32        ClapMidiOutputEvent, ClapParameterInfo, ClapPluginInfo, ClapPluginState,
33    };
34}
35pub mod vst3 {
36    pub use crate::plugins::types::{Vst3PluginInfo, Vst3PluginState};
37    pub mod interfaces {
38        pub use crate::plugins::types::Vst3GuiInfo;
39    }
40    pub mod port {
41        pub use crate::plugins::types::ParameterInfo;
42    }
43    pub mod state {
44        pub use crate::plugins::types::Vst3PluginState;
45    }
46}
47#[cfg(all(unix, not(target_os = "macos")))]
48pub mod lv2 {
49    pub use crate::plugins::types::Lv2PluginInfo;
50}
51
52use tokio::sync::mpsc::{Sender, channel};
53use tokio::task::JoinHandle;
54
55#[cfg(target_os = "macos")]
56pub fn discover_coreaudio_devices() -> Vec<String> {
57    hw::coreaudio::device::list_devices()
58        .into_iter()
59        .map(|d| d.name)
60        .collect()
61}
62
63pub fn enable_flush_denormals_to_zero() {
64    #[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
65    unsafe {
66        let mut mxcsr: u32 = 0;
67        std::arch::asm!("stmxcsr [{}]", in(reg) &mut mxcsr);
68        mxcsr |= 0x8040;
69        std::arch::asm!("ldmxcsr [{}]", in(reg) &mxcsr);
70    }
71
72    #[cfg(target_arch = "aarch64")]
73    unsafe {
74        let mut fpcr: u64;
75        std::arch::asm!("mrs {0}, fpcr", out(reg) fpcr);
76        fpcr |= 1 << 24;
77        std::arch::asm!("msr fpcr, {0}", in(reg) fpcr);
78    }
79}
80
81pub fn init() -> (Sender<message::Message>, JoinHandle<()>) {
82    let (tx, rx) = channel::<message::Message>(32);
83    let mut engine = engine::Engine::new(rx, tx.clone());
84    let handle = tokio::spawn(async move {
85        engine.init().await;
86        engine.work().await;
87    });
88    (tx.clone(), handle)
89}