1mod audio;
2pub mod audio_codec;
3pub mod client;
4pub mod connectable;
5mod engine;
6pub use engine::Engine;
7pub mod executor;
8pub mod history;
9mod hw;
10pub mod kind;
11pub mod loudness;
12pub use loudness::LoudnessValues;
13pub mod message;
14pub mod meter;
15mod midi;
16pub mod modulator;
17mod osc;
18mod plan_builder;
19pub mod plugins;
20pub mod render_plan;
21mod routing;
22#[cfg(unix)]
23mod rubberband;
24pub mod simd;
25pub mod state;
26mod track;
27pub mod triple_buffer;
28pub mod workers;
29pub use workers::worker;
30
31pub use plugins::clap_proc;
32#[cfg(all(unix, not(target_os = "macos")))]
33pub use plugins::lv2_proc;
34pub use plugins::vst3_proc;
35
36pub mod clap {
37 pub use crate::plugins::types::is_supported_clap_binary;
38 pub use crate::plugins::types::{
39 ClapMidiOutputEvent, ClapParameterInfo, ClapPluginInfo, ClapPluginState,
40 };
41}
42pub mod vst3 {
43 pub use crate::plugins::types::{Vst3PluginInfo, Vst3PluginState};
44 pub mod interfaces {
45 pub use crate::plugins::types::Vst3GuiInfo;
46 }
47 pub mod port {
48 pub use crate::plugins::types::ParameterInfo;
49 }
50 pub mod state {
51 pub use crate::plugins::types::Vst3PluginState;
52 }
53}
54#[cfg(all(unix, not(target_os = "macos")))]
55pub mod lv2 {
56 pub use crate::plugins::types::Lv2PluginInfo;
57}
58
59use tokio::sync::mpsc::{Sender, channel};
60use tokio::task::JoinHandle;
61
62#[cfg(target_os = "macos")]
63pub fn discover_coreaudio_devices() -> Vec<String> {
64 hw::coreaudio::device::list_devices()
65 .into_iter()
66 .map(|d| d.name)
67 .collect()
68}
69
70pub fn enable_flush_denormals_to_zero() {
71 #[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
72 unsafe {
73 let mut mxcsr: u32 = 0;
74 std::arch::asm!("stmxcsr [{}]", in(reg) &mut mxcsr);
75 mxcsr |= 0x8040;
76 std::arch::asm!("ldmxcsr [{}]", in(reg) &mxcsr);
77 }
78
79 #[cfg(target_arch = "aarch64")]
80 unsafe {
81 let mut fpcr: u64;
82 std::arch::asm!("mrs {0}, fpcr", out(reg) fpcr);
83 fpcr |= 1 << 24;
84 std::arch::asm!("msr fpcr, {0}", in(reg) fpcr);
85 }
86}
87
88pub type EngineInit = (
89 Sender<message::Message>,
90 JoinHandle<()>,
91 triple_buffer::TripleBufferConsumer<meter::MeterSnapshot>,
92 triple_buffer::TripleBufferConsumer<meter::TransportSnapshot>,
93 triple_buffer::TripleBufferConsumer<meter::SessionRuntimeSnapshot>,
94);
95
96pub fn init() -> EngineInit {
97 let (tx, rx) = channel::<message::Message>(32);
98 let (meter_producer, meter_consumer) =
99 triple_buffer::triple_buffer(meter::MeterSnapshot::default());
100 let (transport_producer, transport_consumer) =
101 triple_buffer::triple_buffer(meter::TransportSnapshot::default());
102 let (session_runtime_producer, session_runtime_consumer) =
103 triple_buffer::triple_buffer(meter::SessionRuntimeSnapshot::default());
104 let mut engine = engine::Engine::new_with_snapshots(
105 rx,
106 tx.clone(),
107 meter_producer,
108 transport_producer,
109 session_runtime_producer,
110 );
111 let handle = tokio::spawn(async move {
112 engine.init().await;
113 engine.work().await;
114 });
115 (
116 tx.clone(),
117 handle,
118 meter_consumer,
119 transport_consumer,
120 session_runtime_consumer,
121 )
122}