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