1#![deny(missing_docs)]
56
57pub mod audio;
58pub mod error;
59pub mod host;
60pub mod midi;
61pub mod parameters;
62pub mod playback;
63pub mod plugin;
64pub mod realtime;
65pub mod simple;
66pub mod transport;
67pub mod window;
68
69pub mod discovery;
70
71#[cfg(feature = "egui-widgets")]
72pub mod embed;
73
74#[cfg(feature = "cpal-backend")]
75pub mod backends;
76
77pub mod process_isolation;
78
79#[cfg(feature = "midi-input")]
80pub mod midi_input;
81
82mod internal;
83
84pub use audio::{
85 read_wav, AudioBackend, AudioBuffers, AudioBusBuffer, AudioBusConfig, AudioBusLayout,
86 AudioConfig, AudioLevels, AudioStream, BusArrangements, BusAudioBuffers, BusDirection,
87 ChannelLevel, InputSource, MediaType, PeakMeter, RmsWindow, SignalSource, SpeakerArrangement,
88};
89pub use discovery::{
90 discover_plugins_safe, get_detailed_plugin_info, probe_plugin_info_isolated, BusInfo,
91 BusLayout, ClassInfo, DetailedPluginInfo, FactoryInfo, PluginReport, SafeDiscoveryReport,
92 SafeDiscoverySkip, DEFAULT_PROBE_TIMEOUT,
93};
94#[cfg(feature = "egui-widgets")]
95pub use embed::{EditorRect, EmbeddedEditor};
96pub use error::{Error, Result};
97pub use host::{DiscoveryProgress, ProbeResult, Vst3Host, Vst3HostBuilder};
98pub use midi::{
99 cc, MidiChannel, MidiEvent, NoteExpressionInfo, NoteExpressionType, NoteId, OutputEvent,
100 PluginEvent, PluginEventData,
101};
102#[cfg(feature = "midi-input")]
103pub use midi_input::{
104 bind_to_handle, connect, list_midi_input_ports, MidiInputConnection, MidiInputPort,
105};
106pub use parameters::{
107 AutomationCurve, AutomationPoint, Parameter, ParameterAutomation, ParameterChange,
108};
109pub use playback::{
110 play_realtime_with_backend, play_with_backend, play_with_input_backend, AudioHandle, MidiSink,
111 RtAudioHandle,
112};
113pub use plugin::{
114 AutomationState, ContextMenuItem, DataExchangeBlock, HostNotification, OutputMidiConsumer,
115 ParameterEdit, ParameterEditKind, Plugin, PluginInfo, PluginPreset, PluginUnit, ProcessMode,
116 ProgramPitchName, ProgressKind, ProgressValue, RestartFlags, StateContext, WindowHandle,
117};
118pub use realtime::{RealtimePluginRunner, RtControl};
119pub use transport::{AutomationLane, BlockEvents, MidiClip, Timeline};
120pub use window::PluginWindow;
121
122pub mod prelude {
124 pub use crate::{
125 audio::{
126 AudioBackend, AudioBuffers, AudioBusBuffer, AudioBusConfig, AudioBusLayout,
127 AudioConfig, AudioLevels, AudioStream, BusArrangements, BusAudioBuffers, BusDirection,
128 ChannelLevel, InputSource, MediaType, PeakMeter, RmsWindow, SignalSource,
129 SpeakerArrangement,
130 },
131 error::Error,
135 host::{DiscoveryProgress, Vst3Host, Vst3HostBuilder},
136 midi::{
137 cc, MidiChannel, MidiEvent, NoteExpressionInfo, NoteExpressionType, NoteId,
138 OutputEvent, PluginEvent, PluginEventData,
139 },
140 parameters::{AutomationCurve, AutomationPoint, Parameter, ParameterAutomation},
141 playback::{play_with_backend, AudioHandle},
142 plugin::{
143 AutomationState, ContextMenuItem, DataExchangeBlock, HostNotification,
144 OutputEventConsumer, OutputMidiConsumer, ParameterEdit, ParameterEditKind, Plugin,
145 PluginInfo, ProcessMode, ProgramPitchName, ProgressKind, ProgressValue, StateContext,
146 WindowHandle,
147 },
148 transport::{AutomationLane, MidiClip, Timeline},
149 window::PluginWindow,
150 };
151
152 #[cfg(feature = "cpal-backend")]
153 pub use crate::backends::CpalBackend;
154
155 #[cfg(feature = "midi-input")]
156 pub use crate::midi_input::{MidiInputConnection, MidiInputPort};
157}
158
159#[cfg(test)]
160mod tests {
161 use super::*;
162
163 #[test]
164 fn test_host_creation() {
165 let host = Vst3Host::new();
166 assert!(host.is_ok());
167 }
168
169 #[test]
170 fn new_scans_default_paths_like_default() {
171 let via_new = Vst3Host::new().unwrap();
173 assert!(
174 via_new.scan_default_paths,
175 "Vst3Host::new() should scan standard system paths"
176 );
177 assert_eq!(
178 via_new.scan_default_paths,
179 Vst3Host::default().scan_default_paths
180 );
181 }
182
183 #[test]
184 fn test_host_builder() {
185 let host = Vst3Host::builder()
186 .sample_rate(48000.0)
187 .block_size(1024)
188 .build();
189 assert!(host.is_ok());
190
191 let host = host.unwrap();
192 assert_eq!(host.config().sample_rate, 48000.0);
193 assert_eq!(host.config().block_size, 1024);
194 }
195}