1
0
Fork 0

Add a cli for controlling the standalone settings

This commit is contained in:
Robbert van der Helm 2022-06-14 15:44:42 +02:00
parent f3c4331ed9
commit 49e683e396
2 changed files with 30 additions and 28 deletions

View file

@ -1,6 +1,8 @@
//! A standalone plugin target that directly connects to the system's audio and MIDI ports instead
//! of relying on a plugin host. This is mostly useful for quickly testing GUI changes.
use clap::{FromArgMatches, IntoApp};
use self::wrapper::{Wrapper, WrapperConfig, WrapperError};
use super::util::setup_logger;
use crate::plugin::Plugin;
@ -42,13 +44,6 @@ mod wrapper;
///
/// If the wrapped plugin fails to initialize or throws an error during audio processing, then this
/// function will return `false`.
///
/// # TODOs
///
/// The aforementioned command line options have not yet been implemented. Currently there's also no
/// way to change these options at runtime, for instance through the plugin's GUI. And lastly
/// there's no way to interact with parameters outside of what's exposed through the plugin's GUI.
/// We should implement a REPL at some point for interacting with the plugin.
pub fn nih_export_standalone<P: Plugin>() -> bool {
nih_export_standalone_with_args::<P, _>(std::env::args())
}
@ -56,26 +51,20 @@ pub fn nih_export_standalone<P: Plugin>() -> bool {
/// The same as [`nih_export_standalone()`], but with the arguments taken from an iterator instead
/// of using [`std::env::args()`].
pub fn nih_export_standalone_with_args<P: Plugin, Args: IntoIterator<Item = String>>(
_args: Args,
args: Args,
) -> bool {
setup_logger();
// TODO: Do something with the arguments
// FIXME: The configuration should be set based on the command line arguments
let config = WrapperConfig {
input_channels: 2,
output_channels: 2,
sample_rate: 44100.0,
period_size: 512,
// TODO: When adding command line options, ignore this option on macOS
dpi_scale: 1.0,
tempo: 120.0,
timesig_num: 4,
timesig_denom: 4,
};
// Instead of parsing this directly, we need to take a bit of a roundabout approach to get the
// plugin's name and vendor in here since they'd otherwise be taken from NIH-plug's own
// `Cargo.toml` file.
let config = WrapperConfig::from_arg_matches(
&WrapperConfig::command()
.name(P::NAME)
.author(P::VENDOR)
.get_matches_from(args),
)
.unwrap_or_else(|err| err.exit());
nih_log!(
"Audio and MIDI IO has not yet been implemented in the standalone targets. So if you're \
@ -93,6 +82,7 @@ pub fn nih_export_standalone_with_args<P: Plugin, Args: IntoIterator<Item = Stri
}
};
// TODO: Add a repl while the application is running to interact with parameters
match wrapper.run() {
Ok(()) => true,
Err(err) => {

View file

@ -1,5 +1,6 @@
use atomic_refcell::AtomicRefCell;
use baseview::{EventStatus, Window, WindowHandler, WindowOpenOptions};
use clap::Parser;
use crossbeam::channel;
use crossbeam::queue::ArrayQueue;
use parking_lot::RwLock;
@ -27,28 +28,39 @@ use crate::wrapper::state::{self, PluginState};
const EVENT_QUEUE_CAPACITY: usize = 2048;
/// Configuration for a standalone plugin that would normally be provided by the DAW.
#[derive(Debug, Clone)]
#[derive(Debug, Clone, Parser)]
#[clap(about = None, long_about = None)]
pub struct WrapperConfig {
/// The number of input channels.
#[clap(value_parser, short = 'i', long, default_value = "2")]
pub input_channels: u32,
/// The number of output channels.
#[clap(value_parser, short = 'o', long, default_value = "2")]
pub output_channels: u32,
/// The audio backend's sample rate.
#[clap(value_parser, short = 'r', long, default_value = "44100")]
pub sample_rate: f32,
/// The audio backend's period size.
#[clap(value_parser, short = 'p', long, default_value = "512")]
pub period_size: u32,
/// The editor's DPI scaling factor. Currently baseview has no way to report this to us, so
/// we'll expose it as a command line option instead.
/// The editor's DPI scaling factor.
///
/// This option is ignored on macOS.
//
// Currently baseview has no way to report this to us, so we'll expose it as a command line
// option instead.
#[clap(value_parser, long, default_value = "1.0")]
pub dpi_scale: f32,
/// The current tempo.
/// The transport's tempo.
#[clap(value_parser, long, default_value = "120")]
pub tempo: f32,
/// The time signature's numerator.
#[clap(value_parser, long, default_value = "4")]
pub timesig_num: u32,
/// The time signature's denominator.
#[clap(value_parser, long, default_value = "4")]
pub timesig_denom: u32,
}