use rack::prelude::*;
fn main() -> Result<()> {
println!("AudioUnit Preset Browser");
println!("========================\n");
println!("Creating scanner...");
let scanner = Scanner::new()?;
println!("Scanning for AudioUnit plugins...");
let plugins = scanner.scan()?;
if plugins.is_empty() {
println!("No plugins found!");
return Ok(());
}
println!("Found {} plugin(s)\n", plugins.len());
let plugin_with_presets = plugins.iter().find(|info| {
if let Ok(mut plugin) = scanner.load(info) {
if plugin.initialize(48000.0, 512).is_ok() {
return plugin.preset_count().map_or(false, |count| count > 0);
}
}
false
});
let info = if let Some(info) = plugin_with_presets {
info
} else {
println!("No plugins with factory presets found!");
println!("Demonstrating state save/restore with first plugin instead...\n");
&plugins[0]
};
println!("Plugin: {}", info.name);
println!("Manufacturer: {}", info.manufacturer);
println!("Type: {:?}", info.plugin_type);
println!();
println!("Creating plugin instance...");
let mut plugin = scanner.load(info)?;
println!("✓ Plugin instance created");
println!("Initializing plugin (48kHz, 512 samples)...");
plugin.initialize(48000.0, 512)?;
println!("✓ Plugin initialized successfully!\n");
let preset_count = plugin.preset_count()?;
println!("Factory Presets: {}", preset_count);
println!();
if preset_count > 0 {
println!("Available Presets:");
println!("{:-<60}", "");
for i in 0..preset_count {
let preset = plugin.preset_info(i)?;
println!("[{}] {} (preset #{:3})", i, preset.name, preset.preset_number);
}
println!("{:-<60}", "");
println!();
let param_count = plugin.parameter_count();
if param_count > 0 {
println!("Demonstrating preset loading with parameter 0:");
println!();
let param_info = plugin.parameter_info(0)?;
println!("Parameter: {}", param_info.name);
if !param_info.unit.is_empty() {
println!("Unit: {}", param_info.unit);
}
println!("Range: {} - {}", param_info.min, param_info.max);
println!();
let presets_to_demo = preset_count.min(5);
for i in 0..presets_to_demo {
let preset = plugin.preset_info(i)?;
plugin.load_preset(preset.preset_number)?;
let value = plugin.get_parameter(0)?;
let actual = param_info.min + (value * (param_info.max - param_info.min));
println!("Preset '{}': parameter = {:.4} (actual: {:.2})",
preset.name, value, actual);
}
println!();
}
} else {
println!("This plugin has no factory presets.\n");
}
println!("State Serialization Demo:");
println!("{:-<60}", "");
let saved_state = plugin.get_state()?;
println!("✓ Saved plugin state ({} bytes)", saved_state.len());
let param_count = plugin.parameter_count();
if param_count > 0 {
println!();
println!("Making changes to plugin parameters...");
let original_value = plugin.get_parameter(0)?;
println!(" Parameter 0 original: {:.4}", original_value);
plugin.set_parameter(0, 0.75)?;
let changed_value = plugin.get_parameter(0)?;
println!(" Parameter 0 changed: {:.4}", changed_value);
println!();
println!("Restoring saved state...");
plugin.set_state(&saved_state)?;
println!("✓ State restored");
let restored_value = plugin.get_parameter(0)?;
println!(" Parameter 0 restored: {:.4}", restored_value);
if (restored_value - original_value).abs() < 0.01 {
println!();
println!("✓ Parameter successfully restored to original value!");
} else {
println!();
println!("⚠ Parameter value differs slightly (may be rounding)");
}
} else {
println!("Plugin has no parameters to demonstrate state changes.");
}
println!();
println!("{:-<60}", "");
println!();
println!("✓ Preset browser demonstration complete!");
Ok(())
}