1
0
Fork 0

Add a (not yet functional) standalone run function

This commit is contained in:
Robbert van der Helm 2022-04-22 18:54:39 +02:00
parent f838062d72
commit 6c84fec09e
2 changed files with 45 additions and 13 deletions

View file

@ -72,19 +72,28 @@ pub fn nih_export_standalone_with_args<P: Plugin, Args: IntoIterator<Item = Stri
let wrapper = match Wrapper::<P>::new(config.clone()) { let wrapper = match Wrapper::<P>::new(config.clone()) {
Ok(wrapper) => wrapper, Ok(wrapper) => wrapper,
Err(WrapperError::IncompatibleConfig) => { Err(err) => {
eprintln!("The plugin does not support the {} channel input and {} channel output configuration", config.input_channels, config.output_channels); print_error(err, &config);
return false;
}
Err(WrapperError::InitializationFailed) => {
eprintln!("The plugin failed to initialize");
return false; return false;
} }
}; };
// TODO: Open the editor if available, do IO things match wrapper.run() {
// TODO: If the plugin has an editor, block until the editor is closed. Otherwise block Ok(()) => true,
// indefinitely or until SIGINT (how do signal handlers work in Rust?) Err(err) => {
print_error(err, &config);
true false
}
}
}
fn print_error(error: WrapperError, config: &WrapperConfig) {
match error {
WrapperError::IncompatibleConfig => {
eprintln!("The plugin does not support the {} channel input and {} channel output configuration", config.input_channels, config.output_channels);
}
WrapperError::InitializationFailed => {
eprintln!("The plugin failed to initialize");
}
}
} }

View file

@ -3,7 +3,7 @@ use std::sync::Arc;
use super::context::WrapperProcessContext; use super::context::WrapperProcessContext;
use crate::context::Transport; use crate::context::Transport;
use crate::plugin::{BufferConfig, BusConfig, Plugin}; use crate::plugin::{BufferConfig, BusConfig, Editor, Plugin};
/// Configuration for a standalone plugin that would normally be provided by the DAW. /// Configuration for a standalone plugin that would normally be provided by the DAW.
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -28,6 +28,10 @@ pub struct WrapperConfig {
pub struct Wrapper<P: Plugin> { pub struct Wrapper<P: Plugin> {
/// The wrapped plugin instance. /// The wrapped plugin instance.
plugin: RwLock<P>, plugin: RwLock<P>,
/// The plugin's editor, if it has one. This object does not do anything on its own, but we need
/// to instantiate this in advance so we don't need to lock the entire [`Plugin`] object when
/// creating an editor.
editor: Option<Box<dyn Editor>>,
config: WrapperConfig, config: WrapperConfig,
@ -37,6 +41,7 @@ pub struct Wrapper<P: Plugin> {
} }
/// Errors that may arise while initializing the wrapped plugins. /// Errors that may arise while initializing the wrapped plugins.
#[derive(Debug, Clone, Copy)]
pub enum WrapperError { pub enum WrapperError {
/// The plugin does not accept the IO configuration from the config. /// The plugin does not accept the IO configuration from the config.
IncompatibleConfig, IncompatibleConfig,
@ -48,8 +53,13 @@ impl<P: Plugin> Wrapper<P> {
/// Instantiate a new instance of the standalone wrapper. Returns an error if the plugin does /// Instantiate a new instance of the standalone wrapper. Returns an error if the plugin does
/// not accept the IO configuration from the wrapper config. /// not accept the IO configuration from the wrapper config.
pub fn new(config: WrapperConfig) -> Result<Arc<Self>, WrapperError> { pub fn new(config: WrapperConfig) -> Result<Arc<Self>, WrapperError> {
let plugin = P::default();
let editor = plugin.editor();
let wrapper = Arc::new(Wrapper { let wrapper = Arc::new(Wrapper {
plugin: RwLock::new(P::default()), plugin: RwLock::new(plugin),
editor,
bus_config: BusConfig { bus_config: BusConfig {
num_input_channels: config.input_channels, num_input_channels: config.input_channels,
num_output_channels: config.output_channels, num_output_channels: config.output_channels,
@ -81,6 +91,19 @@ impl<P: Plugin> Wrapper<P> {
Ok(wrapper) Ok(wrapper)
} }
/// Open the editor, start processing audio, and block this thread until the editor is closed.
/// If the plugin does not have an editor, then this will block until SIGINT is received.
///
/// Will return an error if the plugin threw an error during audio processing or if the editor
/// could not be opened.
pub fn run(self: Arc<Self>) -> Result<(), WrapperError> {
// TODO: Open the editor and block until it is closed
// TODO: Do IO things
// TODO: Block until SIGINT is received if the plugin does not have an editor
Ok(())
}
fn make_process_context(&self, transport: Transport) -> WrapperProcessContext<'_, P> { fn make_process_context(&self, transport: Transport) -> WrapperProcessContext<'_, P> {
WrapperProcessContext { WrapperProcessContext {
wrapper: self, wrapper: self,