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