1mod audio;
2pub mod client;
3mod engine;
4pub use engine::Engine;
5pub mod history;
6mod hw;
7pub mod kind;
8pub mod message;
9mod midi;
10pub mod mutex;
11mod osc;
12pub mod plugins;
13mod routing;
14#[cfg(unix)]
15mod rubberband;
16pub mod simd;
17pub mod state;
18mod track;
19pub mod workers;
20pub use workers::worker;
21
22pub use plugins::clap_proc;
23#[cfg(all(unix, not(target_os = "macos")))]
24pub use plugins::lv2_proc;
25pub use plugins::vst3_proc;
26
27pub 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 init() -> (Sender<message::Message>, JoinHandle<()>) {
64 let (tx, rx) = channel::<message::Message>(32);
65 let mut engine = engine::Engine::new(rx, tx.clone());
66 let handle = tokio::spawn(async move {
67 engine.init().await;
68 engine.work().await;
69 });
70 (tx.clone(), handle)
71}