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}