#![deny(missing_docs)]
pub mod audio;
pub mod error;
pub mod host;
pub mod midi;
pub mod parameters;
pub mod playback;
pub mod plugin;
pub mod realtime;
pub mod simple;
pub mod transport;
pub mod window;
pub mod discovery;
#[cfg(feature = "egui-widgets")]
pub mod embed;
#[cfg(feature = "cpal-backend")]
pub mod backends;
pub mod process_isolation;
#[cfg(feature = "midi-input")]
pub mod midi_input;
mod internal;
pub use audio::{
read_wav, AudioBackend, AudioBuffers, AudioBusBuffer, AudioBusConfig, AudioBusLayout,
AudioConfig, AudioLevels, AudioStream, BusArrangements, BusAudioBuffers, BusDirection,
ChannelLevel, InputSource, MediaType, PeakMeter, RmsWindow, SignalSource, SpeakerArrangement,
};
pub use discovery::{
discover_plugins_safe, get_detailed_plugin_info, probe_plugin_info_isolated, BusInfo,
BusLayout, ClassInfo, DetailedPluginInfo, FactoryInfo, PluginReport, SafeDiscoveryReport,
SafeDiscoverySkip, DEFAULT_PROBE_TIMEOUT,
};
#[cfg(feature = "egui-widgets")]
pub use embed::{EditorRect, EmbeddedEditor};
pub use error::{Error, Result};
pub use host::{DiscoveryProgress, ProbeResult, Vst3Host, Vst3HostBuilder};
pub use midi::{
cc, MidiChannel, MidiEvent, NoteExpressionInfo, NoteExpressionType, NoteId, OutputEvent,
PluginEvent, PluginEventData,
};
#[cfg(feature = "midi-input")]
pub use midi_input::{
bind_to_handle, connect, list_midi_input_ports, MidiInputConnection, MidiInputPort,
};
pub use parameters::{
AutomationCurve, AutomationPoint, Parameter, ParameterAutomation, ParameterChange,
};
pub use playback::{
play_realtime_with_backend, play_with_backend, play_with_input_backend, AudioHandle, MidiSink,
RtAudioHandle,
};
pub use plugin::{
AutomationState, ContextMenuItem, DataExchangeBlock, HostNotification, OutputMidiConsumer,
ParameterEdit, ParameterEditKind, Plugin, PluginInfo, PluginPreset, PluginUnit, ProcessMode,
ProgramPitchName, ProgressKind, ProgressValue, RestartFlags, StateContext, WindowHandle,
};
pub use realtime::{RealtimePluginRunner, RtControl};
pub use transport::{AutomationLane, BlockEvents, MidiClip, Timeline};
pub use window::PluginWindow;
pub mod prelude {
pub use crate::{
audio::{
AudioBackend, AudioBuffers, AudioBusBuffer, AudioBusConfig, AudioBusLayout,
AudioConfig, AudioLevels, AudioStream, BusArrangements, BusAudioBuffers, BusDirection,
ChannelLevel, InputSource, MediaType, PeakMeter, RmsWindow, SignalSource,
SpeakerArrangement,
},
error::Error,
host::{DiscoveryProgress, Vst3Host, Vst3HostBuilder},
midi::{
cc, MidiChannel, MidiEvent, NoteExpressionInfo, NoteExpressionType, NoteId,
OutputEvent, PluginEvent, PluginEventData,
},
parameters::{AutomationCurve, AutomationPoint, Parameter, ParameterAutomation},
playback::{play_with_backend, AudioHandle},
plugin::{
AutomationState, ContextMenuItem, DataExchangeBlock, HostNotification,
OutputEventConsumer, OutputMidiConsumer, ParameterEdit, ParameterEditKind, Plugin,
PluginInfo, ProcessMode, ProgramPitchName, ProgressKind, ProgressValue, StateContext,
WindowHandle,
},
transport::{AutomationLane, MidiClip, Timeline},
window::PluginWindow,
};
#[cfg(feature = "cpal-backend")]
pub use crate::backends::CpalBackend;
#[cfg(feature = "midi-input")]
pub use crate::midi_input::{MidiInputConnection, MidiInputPort};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_host_creation() {
let host = Vst3Host::new();
assert!(host.is_ok());
}
#[test]
fn new_scans_default_paths_like_default() {
let via_new = Vst3Host::new().unwrap();
assert!(
via_new.scan_default_paths,
"Vst3Host::new() should scan standard system paths"
);
assert_eq!(
via_new.scan_default_paths,
Vst3Host::default().scan_default_paths
);
}
#[test]
fn test_host_builder() {
let host = Vst3Host::builder()
.sample_rate(48000.0)
.block_size(1024)
.build();
assert!(host.is_ok());
let host = host.unwrap();
assert_eq!(host.config().sample_rate, 48000.0);
assert_eq!(host.config().block_size, 1024);
}
}