### Launch Voicemeeter Application Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Instructs the system to open the Voicemeeter application window if it's not already visible. Errors if Voicemeeter is not installed. ```rust use voicemeeter::types::VoicemeeterApplication; use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Open Voicemeeter Banana. Errors if Voicemeeter is not installed. remote.run_voicemeeter(VoicemeeterApplication::VoicemeeterBanana)?; Ok(()) } ``` -------------------------------- ### Control Output Bus Parameters with Rust Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Manage parameters for output buses, including label, gain, mute, EQ, mode, and device assignment. This example also shows how to set FX return levels and assign an output device via the WDM driver. ```rust use voicemeeter::{types::BusMode, VoicemeeterRemote}; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let bus = remote.parameters().bus(0)?; println!("Label: {}", bus.label().get()?); bus.gain().set(0.0)?; bus.mute().set(false)?; bus.eq_on().set(true)?; bus.sel().set(false)?; bus.monitor().set(false)?; // FX returns bus.return_reverb().set(0)?; bus.return_fx1().set(0)?; // Bus mixing mode bus.mode().set(BusMode::Normal)?; println!("Mode: {:?}", bus.mode().get()?); // Assign output audio device via WDM driver bus.device().wdm().set("Speakers (Realtek)")?; println!("Device sample rate: {} Hz", bus.device().sr().get()?); remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` -------------------------------- ### Control Input Strip Parameters with Rust Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Access and modify various parameters of an input strip, including toggles, gain, pan, compressor, gate, FX sends, and fade. For physical strips, it shows how to get and set the associated audio device. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let strip = remote.parameters().strip(0)?; // Boolean toggles strip.mono().set(false)?; strip.solo().set(false)?; strip.mute().set(false)?; strip.eq_on().set(true)?; // Gain and pan (-60 to +12 dB; pan -0.5 to +0.5) strip.gain().set(0.0)?; strip.pan_x().set(0.0)?; // Simple compressor knob (0-10) strip.comp().set(3.5)?; // Simple gate knob (0-10) strip.gate().set(2.0)?; // FX send levels (0-10) strip.reverb().set(0.0)?; strip.fx1().set(0.0)?; // Smooth gain transition: fade to -12 dB over 500 ms strip.fade_to().set(-12_i32, 500_usize)?; // For physical strips: check or set audio device if strip.is_physical() { let dev = strip.device()?; println!("Device: {}", dev.name().get()?); println!("Sample rate: {} Hz", dev.sr().get()?); // Assign a WDM device dev.wdm().set("Headphones (Realtek)")?; } remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` -------------------------------- ### Device Enumeration Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Enumerates all audio input and output devices available on the system via Voicemeeter's device API. It provides functions to get the total number of input/output devices and retrieve details for each device. ```APIDOC ## Device Enumeration — `get_total_input_device` / `get_input_device` Enumerates all audio input and output devices available on the system via Voicemeeter's device API. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Input devices let n_in = remote.get_total_input_device()?; println!("{n_in} input devices:"); for i in 0..n_in { let dev = remote.get_input_device(i as usize)?; println!(" [{i}] {:?} — {} (HW: {})", dev.r#type, dev.name, dev.hardware_id); } // Output devices let n_out = remote.get_total_output_device()?; println!("{n_out} output devices:"); for i in 0..n_out { let dev = remote.get_output_device(i as usize)?; println!(" [{i}] {:?} — {} (HW: {})", dev.r#type, dev.name, dev.hardware_id); } Ok(()) } ``` ``` -------------------------------- ### Detailed DSP Controls for Compressor and Gate (Potato Only) Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Configure advanced compressor and gate parameters for a physical strip on Voicemeeter Potato. This includes detailed settings for gain, ratio, threshold, attack, release, and more. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let strip = remote.parameters().strip(0)?; // Detailed compressor (Potato only, physical strip only) let comp = strip.comp_detailed()?; comp.gain_in().set(0.0)?; comp.ratio().set(4.0)?; comp.threshold().set(-18.0)?; comp.attack().set(10.0)?; comp.release().set(200.0)?; comp.knee().set(0.5)?; comp.gain_out().set(0.0)?; comp.make_up().set(true)?; // Detailed gate (Potato only, physical strip only) let gate = strip.gate_detailed()?; gate.threshold().set(-40.0)?; gate.damping().set(-30.0)?; gate.bp_sidechain().set(1000.0)?; gate.attack().set(5.0)?; gate.hold().set(100.0)?; gate.release().set(500.0)?; remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` -------------------------------- ### Create Voicemeeter Session Handle Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Establishes a connection to a running Voicemeeter instance. Automatically logs out when all handles are dropped. Returns an error if the DLL is not found or Voicemeeter is not running. ```rust use voicemeeter::{types::Device, VoicemeeterRemote}; fn main() -> Result<(), Box> { // Connects to the running Voicemeeter instance. // Returns InitializationError if the DLL cannot be found or Voicemeeter is not running. let remote = VoicemeeterRemote::new()?; // The `program` field tells you which Voicemeeter variant is active: // Voicemeeter, VoicemeeterBanana, VoicemeeterPotato, or PotatoX64Bits. println!("Running: {}", remote.program); // Check the initial login status (Launched or NotLaunched). let status = VoicemeeterRemote::initial_status(); println!("Status at login: {:?}", status); Ok(()) // `remote` is dropped here → automatic logout } ``` -------------------------------- ### StripCompressor / StripGate - Detailed DSP controls (Potato only) Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Advanced per-strip compressor and gate parameter blocks, available only on Voicemeeter Potato / Potato x64. ```APIDOC ## `StripCompressor` / `StripGate` — Detailed DSP controls (Potato only) Advanced per-strip compressor and gate parameter blocks, available only on Voicemeeter Potato / Potato x64. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let strip = remote.parameters().strip(0)?; // physical strip required // Detailed compressor (Potato only, physical strip only) let comp = strip.comp_detailed()?; comp.gain_in().set(0.0)?; // input gain: -24 to +24 dB comp.ratio().set(4.0)?; // compression ratio: 1 to 8 comp.threshold().set(-18.0)?; comp.attack().set(10.0)?; comp.release().set(200.0)?; comp.knee().set(0.5)?; comp.gain_out().set(0.0)?; comp.make_up().set(true)?; // Detailed gate (Potato only, physical strip only) let gate = strip.gate_detailed()?; gate.threshold().set(-40.0)?; gate.damping().set(-30.0)?; gate.bp_sidechain().set(1000.0)?; gate.attack().set(5.0)?; gate.hold().set(100.0)?; gate.release().set(500.0)?; remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` ``` -------------------------------- ### Enumerate Voicemeeter Input/Output Devices Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Lists all available audio input and output devices connected to Voicemeeter. Requires an active Voicemeeter instance. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Input devices let n_in = remote.get_total_input_device()?; println!("{n_in} input devices:"); for i in 0..n_in { let dev = remote.get_input_device(i as usize)?; println!(" [{i}] {:?} — {} (HW: {})", dev.r#type, dev.name, dev.hardware_id); } // Output devices let n_out = remote.get_total_output_device()?; println!("{n_out} output devices:"); for i in 0..n_out { let dev = remote.get_output_device(i as usize)?; println!(" [{i}] {:?} — {} (HW: {})", dev.r#type, dev.name, dev.hardware_id); } Ok(()) } ``` -------------------------------- ### run_voicemeeter Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Instructs the system to launch the Voicemeeter application window if it is not already visible. ```APIDOC ## `run_voicemeeter` — Launch Voicemeeter ### Description Instructs the system to open the Voicemeeter application window if it is not already visible. ### Method `run_voicemeeter(application_type: VoicemeeterApplication)` ### Parameters - **application_type** (`VoicemeeterApplication`): Specifies which Voicemeeter variant to launch (e.g., `VoicemeeterApplication::VoicemeeterBanana`). ### Returns A `Result` indicating success or failure. Errors if Voicemeeter is not installed. ### Example ```rust use voicemeeter::{types::VoicemeeterApplication, VoicemeeterRemote}; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; remote.run_voicemeeter(VoicemeeterApplication::VoicemeeterBanana)?; Ok(()) } ``` ``` -------------------------------- ### VoicemeeterRemote::new Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Creates a new VoicemeeterRemote instance, establishing a connection to the running Voicemeeter application. It handles DLL location, login, and automatically logs out when all handles are dropped. ```APIDOC ## `VoicemeeterRemote::new` — Create a session handle ### Description Creates a new `VoicemeeterRemote` instance, locates the DLL via the Windows registry, logs in, and queries the running Voicemeeter application type. Login is automatic; when every clone of the handle is dropped, logout happens automatically. ### Method `VoicemeeterRemote::new()` ### Returns A `Result` containing a `VoicemeeterRemote` instance on success, or an `InitializationError` if the DLL cannot be found or Voicemeeter is not running. ### Example ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; println!("Running: {}", remote.program); let status = VoicemeeterRemote::initial_status(); println!("Status at login: {:?}", status); Ok(()) } ``` ``` -------------------------------- ### Strip - Input Strip Parameters Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Access and modify parameters for input strips, including gain, pan, mute, solo, EQ, compression, gating, FX sends, and device assignment. ```APIDOC ## `Strip` — Input strip parameters The `Strip` struct (returned by `parameters().strip(i)`) gives access to every mixer control on a physical or virtual input strip, including gain, pan, routing, compression, gating, EQ, FX sends, fade, and per-app volume control. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let strip = remote.parameters().strip(0)?; // Boolean toggles strip.mono().set(false)?; strip.solo().set(false)?; strip.mute().set(false)?; strip.eq_on().set(true)?; // Gain and pan (-60 to +12 dB; pan -0.5 to +0.5) strip.gain().set(0.0)?; strip.pan_x().set(0.0)?; // Simple compressor knob (0-10) strip.comp().set(3.5)?; // Simple gate knob (0-10) strip.gate().set(2.0)?; // FX send levels (0-10) strip.reverb().set(0.0)?; strip.fx1().set(0.0)?; // Smooth gain transition: fade to -12 dB over 500 ms strip.fade_to().set(-12_i32, 500_usize)?; // For physical strips: check or set audio device if strip.is_physical() { let dev = strip.device()?; println!("Device: {}", dev.name().get()?); println!("Sample rate: {} Hz", dev.sr().get()?); // Assign a WDM device dev.wdm().set("Headphones (Realtek)")?; } remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` ``` -------------------------------- ### parameters Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Provides access to the typed parameter API for controlling Voicemeeter's strips, buses, VBAN, recorder, FX, and global options. ```APIDOC ## `parameters` — Access the typed parameter API ### Description Returns a `Parameters<'_>` guard that provides access to strip inputs, bus outputs, VBAN, the recorder, FX, and global options via strongly-typed builder methods. ### Method `parameters()` ### Returns A `Parameters` guard providing access to various Voicemeeter settings. ### Example ```rust use voicemeeter::VoicemeeterRemote; use voicemeeter::types::BusMode; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let params = remote.parameters(); // --- Strip (input) parameters (index 0-based) --- let strip0 = params.strip(0)?; println!("Strip 0 label: {}", strip0.label().get()?); strip0.mute().set(true)?; strip0.gain().set(-6.0)?; strip0.a1().set(true)?; strip0.b1().set(true)?; // --- Bus (output) parameters --- let bus0 = params.bus(0)?; println!("Bus 0 label: {}", bus0.label().get()?); println!("Bus 0 device name: {}", bus0.device().name().get()?); bus0.gain().set(-3.0)?; bus0.mode().set(BusMode::Normal)?; println!("Bus 0 mode: {:?}", bus0.mode().get()?); // Flush changes remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` ``` -------------------------------- ### Configure VBAN Network Audio Streams Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Enables and configures VBAN network audio streams for sending and receiving audio over the network. Ensure Voicemeeter is running and VBAN is enabled in its settings. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let vban = remote.parameters().vban(); // Enable VBAN globally vban.enable().set(true)?; // Configure outgoing stream 0 let out0 = vban.outgoing_stream(0)?; out0.on().set(true)?; out0.name().set("MyStream")?; out0.ip().set("192.168.1.100")?; out0.port().set(6980)?; out0.sample_rate().set(44100)?; out0.channel().set(2)?; out0.bit().set(1)?; out0.quality().set(0)?; out0.route().set(0)?; // Read incoming stream 0 info (read-only fields) let in0 = vban.incoming_stream(0)?; println!("Incoming stream name: {}", in0.name().get()?); println!("Incoming sr: {} Hz", in0.sample_rate().get()?); println!("Incoming channels: {}", in0.channel().get()?); remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` -------------------------------- ### Bus - Output Bus Parameters Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Control parameters for output buses, including gain, mute, EQ, mode, device assignment, and FX returns. ```APIDOC ## `Bus` — Output bus parameters The `Bus` struct (returned by `parameters().bus(i)`) controls each output bus (A1–A5 physical, B1–B3 virtual) including gain, mute, EQ, mode, device assignment, and FX returns. ```rust use voicemeeter::{types::BusMode, VoicemeeterRemote}; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let bus = remote.parameters().bus(0)?; println!("Label: {}", bus.label().get()?); bus.gain().set(0.0)?; bus.mute().set(false)?; bus.eq_on().set(true)?; bus.sel().set(false)?; bus.monitor().set(false)?; // FX returns bus.return_reverb().set(0)?; bus.return_fx1().set(0)?; // Bus mixing mode bus.mode().set(BusMode::Normal)?; println!("Mode: {:?}", bus.mode().get()?); // Assign output audio device via WDM driver bus.device().wdm().set("Speakers (Realtek)")?; println!("Device sample rate: {} Hz", bus.device().sr().get()?); remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` ``` -------------------------------- ### Query Voicemeeter Instance Information Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Retrieves the specific Voicemeeter application variant and its four-part version number. Requires an active session handle. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Returns VoicemeeterApplication enum (Voicemeeter / Banana / Potato / PotatoX64Bits) let app_type = remote.get_voicemeeter_type()?; println!("Type: {app_type}"); // Returns VoicemeeterVersion(major, minor, patch, build), implements Display let version = remote.get_voicemeeter_version()?; println!("Version: {version}"); // e.g. "3.0.2.8" Ok(()) } ``` -------------------------------- ### Audio Callback Registration Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Registers a Rust closure as a real-time audio processing callback. The closure receives `CallbackCommand` events containing multichannel PCM buffers that can be read and written to process or redirect audio. ```APIDOC ## Audio Callback — `audio_callback_register` / `audio_callback_start` Registers a Rust closure as a real-time audio processing callback. The closure receives `CallbackCommand` events (`BufferIn`, `BufferMain`, `BufferOut`) containing multichannel PCM buffers that can be read and written to process or redirect audio. ```rust use voicemeeter::{AudioCallbackMode, CallbackCommand, VoicemeeterRemote}; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Register a callback for both MAIN and OUTPUT buffers. // The guard must be kept alive for the duration of streaming. let guard = remote.audio_callback_register( AudioCallbackMode::MAIN | AudioCallbackMode::OUTPUT, "my_application", // name must be < 64 bytes |command: CallbackCommand, _extra: i32| -> i32 { match command { // BufferMain: access all input/output channels simultaneously CallbackCommand::BufferMain(data) => { let (read, mut write) = data.buffer.get_buffers(); // Pass audio through unchanged, device-by-device write.copy_device_from(&read, remote.program.devices()); } // BufferOut: process only output channels (before master section) CallbackCommand::BufferOut(data) => { let (read, mut write) = data.buffer.get_buffers(); write.copy_device_from(&read, remote.program.devices()); } // BufferIn: process only input channels CallbackCommand::BufferIn(_data) => {} // No-op for this example // Starting / stopping events CallbackCommand::Starting(_) => println!("Audio stream starting"), CallbackCommand::Ending(_) => println!("Audio stream ending"), _ => {} // Ignore other commands } 0 // return 0 to signal no error }, )?; // Short pause before starting to avoid initial crackle std::thread::sleep(std::time::Duration::from_millis(500)); remote.audio_callback_start()?; println!("Streaming for 10 seconds…"); std::thread::sleep(std::time::Duration::from_secs(10)); // Stop and unregister (drops the closure cleanly) remote.audio_callback_unregister(guard)?; Ok(()) } ``` ``` -------------------------------- ### Register Real-time Audio Callback Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Registers a Rust closure to process audio buffers in real-time. The closure can handle `BufferMain`, `BufferOut`, or `BufferIn` commands. Ensure the guard is kept alive for the duration of the audio stream. ```rust use voicemeeter::{AudioCallbackMode, CallbackCommand, VoicemeeterRemote}; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Register a callback for both MAIN and OUTPUT buffers. // The guard must be kept alive for the duration of streaming. let guard = remote.audio_callback_register( AudioCallbackMode::MAIN | AudioCallbackMode::OUTPUT, "my_application", // name must be < 64 bytes |command: CallbackCommand, _extra: i32| -> i32 { match command { // BufferMain: access all input/output channels simultaneously CallbackCommand::BufferMain(data) => { let (read, mut write) = data.buffer.get_buffers(); // Pass audio through unchanged, device-by-device write.copy_device_from(&read, remote.program.devices()); } // BufferOut: process only output channels (before master section) CallbackCommand::BufferOut(data) => { let (read, mut write) = data.buffer.get_buffers(); write.copy_device_from(&read, remote.program.devices()); } // BufferIn: process only input channels CallbackCommand::BufferIn(_data) => {} // No-op for this example // Starting / stopping events CallbackCommand::Starting(_) => println!("Audio stream starting"), CallbackCommand::Ending(_) => println!("Audio stream ending"), _ => {} // Ignore other commands } 0 // return 0 to signal no error }, )?; // Short pause before starting to avoid initial crackle std::thread::sleep(std::time::Duration::from_millis(500)); remote.audio_callback_start()?; println!("Streaming for 10 seconds…"); std::thread::sleep(std::time::Duration::from_secs(10)); // Stop and unregister (drops the closure cleanly) remote.audio_callback_unregister(guard)?; Ok(()) } ``` -------------------------------- ### Receive MIDI Messages in Rust Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Retrieve pending MIDI bytes sent to Voicemeeter's virtual MIDI input. The loop continuously checks for messages and prints them, handling potential errors. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; loop { match remote.get_midi_message() { Ok(bytes) if !bytes.is_empty() => { println!("MIDI: {bytes:?}"); // bytes[0] = status byte (0x90 = note on channel 1, etc.) // bytes[1] = note/controller number // bytes[2] = velocity/value } Ok(_) => {} // no data yet Err(e) => eprintln!("MIDI error: {e}"), } std::thread::sleep(std::time::Duration::from_millis(10)); } } ``` -------------------------------- ### Macro Button API Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Reads and writes the state and trigger state of Voicemeeter macro buttons (0-indexed logical buttons). ```APIDOC ## Macro Button API — `get_macrobutton_state` / `set_macrobutton_state` Reads and writes the state and trigger state of Voicemeeter macro buttons (0-indexed logical buttons). ### Methods - `is_macrobutton_dirty()`: Polls for changes in macro button states. Call this periodically (e.g., every ~10 ms) to detect changes. - `get_macrobutton_state(button_index: u32)`: Reads the current state of a macro button. - `get_macrobutton_trigger_state(button_index: u32)`: Reads the trigger state of a macro button. - `set_macrobutton_state(button_index: u32, state: bool, only_display: bool)`: Sets the state of a macro button. If `only_display` is `true`, only the visual state is changed without triggering actions. - `set_macrobutton_trigger_state(button_index: u32, trigger_state: bool)`: Sets the trigger state of a macro button. ### Returns - `get_macrobutton_state`: Returns the state of the button (e.g., `true` for on, `false` for off). - `get_macrobutton_trigger_state`: Returns the trigger state of the button. ### Example Usage ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Poll for macro button changes (call every ~10 ms) if remote.is_macrobutton_dirty()? { // Read current state of button 0 let state = remote.get_macrobutton_state(0u32)?; println!("Button 0: {state}"); // displays 🟢 or 🔴 // Read trigger state of button 0 let trigger = remote.get_macrobutton_trigger_state(0u32)?; println!("Trigger state: {}", *trigger); } // Set button 1 on, triggering its associated requests remote.set_macrobutton_state(1u32, true, false)?; // Set button 2 on, but only change the displayed state (no trigger) remote.set_macrobutton_state(2u32, true, true)?; // Set trigger state of button 3 remote.set_macrobutton_trigger_state(3u32, false)?; Ok(()) } ``` ``` -------------------------------- ### Macro Button API in Rust Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Read and write the state and trigger state of Voicemeeter macro buttons. Use `is_macrobutton_dirty` to poll for changes. Setting a state can optionally trigger the button's associated requests. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Poll for macro button changes (call every ~10 ms) if remote.is_macrobutton_dirty()? { // Read current state of button 0 let state = remote.get_macrobutton_state(0u32)?; println!("Button 0: {state}"); // displays 🟢 or 🔴 // Read trigger state of button 0 let trigger = remote.get_macrobutton_trigger_state(0u32)?; println!("Trigger state: {}", *trigger); } // Set button 1 on, triggering its associated requests remote.set_macrobutton_state(1u32, true, false)?; // Set button 2 on, but only change the displayed state (no trigger) remote.set_macrobutton_state(2u32, true, true)?; // Set trigger state of button 3 remote.set_macrobutton_trigger_state(3u32, false)?; Ok(()) } ``` -------------------------------- ### Access Typed Parameter API Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Provides access to Voicemeeter's strips, buses, VBAN, recorder, FX, and global settings through a type-safe interface. Changes are applied after calling `is_parameters_dirty` and a short delay. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let params = remote.parameters(); // --- Strip (input) parameters (index 0-based) --- let strip0 = params.strip(0)?; println!("Strip 0 label: {}", strip0.label().get()?); // Mute strip 0 strip0.mute().set(true)?; // Set gain (dB, -60.0 to 12.0) strip0.gain().set(-6.0)?; // Route strip 0 to physical output A1 and virtual output B1 strip0.a1().set(true)?; strip0.b1().set(true)?; // --- Bus (output) parameters --- let bus0 = params.bus(0)?; println!("Bus 0 label: {}", bus0.label().get()?); println!("Bus 0 device name: {}", bus0.device().name().get()?); bus0.gain().set(-3.0)?; // Change bus mode use voicemeeter::types::BusMode; bus0.mode().set(BusMode::Normal)?; println!("Bus 0 mode: {:?}", bus0.mode().get()?); // Flush: call is_parameters_dirty to ensure Voicemeeter has processed the changes. remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` -------------------------------- ### VBAN Network Audio Streams Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Controls VBAN (Virtual Audio Network) incoming and outgoing streams. This includes enabling/disabling VBAN globally, and configuring stream name, IP, port, quality, and routing for outgoing streams, as well as reading information about incoming streams. ```APIDOC ## VBAN — Network audio streams Controls VBAN (Virtual Audio Network) incoming and outgoing streams: enabling/disabling VBAN globally, configuring stream name, IP, port, quality, and route. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let vban = remote.parameters().vban(); // Enable VBAN globally vban.enable().set(true)?; // Configure outgoing stream 0 let out0 = vban.outgoing_stream(0)?; out0.on().set(true)?; out0.name().set("MyStream")?; out0.ip().set("192.168.1.100")?; out0.port().set(6980)?; out0.sample_rate().set(44100)?; out0.channel().set(2)?; out0.bit().set(1)?; // 1 = 16-bit PCM, 2 = 24-bit PCM out0.quality().set(0)?; // 0 = Optimal out0.route().set(0)?; // BUS selector (0 = A1) // Read incoming stream 0 info (read-only fields) let in0 = vban.incoming_stream(0)?; println!("Incoming stream name: {}", in0.name().get()?); println!("Incoming sr: {} Hz", in0.sample_rate().get()?); println!("Incoming channels: {}", in0.channel().get()?); remote.is_parameters_dirty()?; std::thread::sleep(std::time::Duration::from_millis(50)); Ok(()) } ``` ``` -------------------------------- ### Receive MIDI messages Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Retrieves pending MIDI bytes sent to Voicemeeter's virtual MIDI input since the last call. ```APIDOC ## `get_midi_message` — Receive MIDI messages Retrieves pending MIDI bytes sent to Voicemeeter's virtual MIDI input since the last call. ### Method `get_midi_message()` ### Returns - `Ok(Vec)`: A vector of bytes representing the MIDI message. The vector will be empty if no message is pending. - `Err(Error)`: An error if communication fails. ### MIDI Message Structure - `bytes[0]`: Status byte (e.g., `0x90` for note on channel 1). - `bytes[1]`: Note/controller number. - `bytes[2]`: Velocity/value. ### Example Usage ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; loop { match remote.get_midi_message() { Ok(bytes) if !bytes.is_empty() => { println!("MIDI: {bytes:?}"); // bytes[0] = status byte (0x90 = note on channel 1, etc.) // bytes[1] = note/controller number // bytes[2] = velocity/value } Ok(_) => {} // no data yet Err(e) => eprintln!("MIDI error: {e}"), } std::thread::sleep(std::time::Duration::from_millis(10)); } } ``` ``` -------------------------------- ### get_voicemeeter_type / get_voicemeeter_version Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Queries the currently running Voicemeeter process to retrieve its application variant and version number. ```APIDOC ## `get_voicemeeter_type` / `get_voicemeeter_version` — Query instance information ### Description Returns the variant (`VoicemeeterApplication`) and the four-part version number of the currently running Voicemeeter process. ### Method - `get_voicemeeter_type()` - `get_voicemeeter_version()` ### Returns - `get_voicemeeter_type()`: Returns a `VoicemeeterApplication` enum (e.g., `Voicemeeter`, `Banana`, `Potato`, `PotatoX64Bits`). - `get_voicemeeter_version()`: Returns a `VoicemeeterVersion` struct (major, minor, patch, build), which implements `Display`. ### Example ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; let app_type = remote.get_voicemeeter_type()?; println!("Type: {app_type}"); let version = remote.get_voicemeeter_version()?; println!("Version: {version}"); // e.g. "3.0.2.8" Ok(()) } ``` ``` -------------------------------- ### Low-level parameter access Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Poll for parameter changes and read/write raw float or string parameters by name, bypassing the typed API. ```APIDOC ## `is_parameters_dirty` / `get_parameter_float` / `set_parameter_float` — Low-level parameter access Poll for parameter changes and read/write raw float or string parameters by name, bypassing the typed API. ### Methods - `is_parameters_dirty()`: Polls for parameter changes. Returns `true` if any parameter has changed since the last poll. - `get_parameter_float(name: String)`: Retrieves the float value of a parameter by its name. - `set_parameter_float(name: String, value: f32)`: Sets the float value of a parameter by its name. - `get_parameter_string(name: String)`: Retrieves the string value of a parameter by its name. - `set_parameter_string(name: String, value: String)`: Sets the string value of a parameter by its name. - `set_parameters(parameters: &str)`: Sets multiple parameters using a script-like string format (e.g., "Strip[0].Gain=-6; Strip[0].Mute=0"). ### Example Usage ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Poll every 10 ms in a loop; returns true if any parameter changed loop { if remote.is_parameters_dirty()? { println!("Parameters changed!"); break; } std::thread::sleep(std::time::Duration::from_millis(10)); } // Raw float access by parameter name string let gain: f32 = remote.get_parameter_float("Strip[0].Gain".into())?; println!("Strip 0 gain: {gain} dB"); remote.set_parameter_float("Strip[0].Gain".into(), -6.0)?; // Raw string access let label: String = remote.get_parameter_string("Strip[0].Label".into())?; println!("Strip 0 label: {label}"); remote.set_parameter_string("Strip[0].Label".into(), "Mic")?; // Script-style multi-parameter set (like macro button scripts) remote.set_parameters("Strip[0].Gain=-6; Strip[0].Mute=0")?; Ok(()) } ``` ``` -------------------------------- ### Read audio level meters Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Reads the current VU meter level for a specific device channel at a given fader position (pre-fader, post-fader, post-mute, or output). ```APIDOC ## `get_level` — Read audio level meters Reads the current VU meter level for a specific device channel at a given fader position (pre-fader, post-fader, post-mute, or output). ### Method `get_level(level_type: LevelType, device: Device, channel: i32)` ### Parameters - `level_type` (LevelType): Specifies the type of level to read (e.g., `PostFaderInputLevels`, `OutputLevels`, `PreFaderInputLevels`). - `device` (Device): The device for which to read the level (e.g., `Strip1`, `OutputA1`). - `channel` (i32): The channel index (typically 0 for the left channel). ### Returns - `Some(f32)`: The level if available. - `None`: If the device/channel is not available in the current Voicemeeter variant. ### Example Usage ```rust use voicemeeter::{types::{Device, LevelType}, VoicemeeterRemote}; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Read left-channel post-fader level for Strip 1 if let Some(level) = remote.get_level(LevelType::PostFaderInputLevels, Device::Strip1, 0)? { println!("Strip1 L post-fader level: {level:.2}"); } // Read left-channel output level for bus A1 if let Some(level) = remote.get_level(LevelType::OutputLevels, Device::OutputA1, 0)? { println!("Bus A1 L output level: {level:.2}"); } // Returns None if the device/channel is not available in the current program let result = remote.get_level(LevelType::PreFaderInputLevels, Device::Strip4, 0)?; match result { Some(v) => println!("Level: {v}"), None => println!("Device not available in this Voicemeeter variant"), } Ok(()) } ``` ``` -------------------------------- ### Low-level Parameter Access in Rust Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Access raw float and string parameters by name, bypassing the typed API. Use `is_parameters_dirty` to poll for changes and `set_parameters` for script-style multi-parameter updates. ```rust use voicemeeter::VoicemeeterRemote; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Poll every 10 ms in a loop; returns true if any parameter changed loop { if remote.is_parameters_dirty()? { println!("Parameters changed!"); break; } std::thread::sleep(std::time::Duration::from_millis(10)); } // Raw float access by parameter name string let gain: f32 = remote.get_parameter_float("Strip[0].Gain".into())?; println!("Strip 0 gain: {gain} dB"); remote.set_parameter_float("Strip[0].Gain".into(), -6.0)?; // Raw string access let label: String = remote.get_parameter_string("Strip[0].Label".into())?; println!("Strip 0 label: {label}"); remote.set_parameter_string("Strip[0].Label".into(), "Mic")?; // Script-style multi-parameter set (like macro button scripts) remote.set_parameters("Strip[0].Gain=-6; Strip[0].Mute=0")?; Ok(()) } ``` -------------------------------- ### Read Audio Level Meters in Rust Source: https://context7.com/emilgardis/voicemeeter-sdk-rs/llms.txt Read VU meter levels for specific device channels at various fader positions (pre-fader, post-fader, post-mute, output). Returns `None` if the device/channel is unavailable in the current Voicemeeter variant. ```rust use voicemeeter::{types::{Device, LevelType}, VoicemeeterRemote}; fn main() -> Result<(), Box> { let remote = VoicemeeterRemote::new()?; // Read left-channel post-fader level for Strip 1 if let Some(level) = remote.get_level(LevelType::PostFaderInputLevels, Device::Strip1, 0)? { println!("Strip1 L post-fader level: {level:.2}"); } // Read left-channel output level for bus A1 if let Some(level) = remote.get_level(LevelType::OutputLevels, Device::OutputA1, 0)? { println!("Bus A1 L output level: {level:.2}"); } // Returns None if the device/channel is not available in the current program let result = remote.get_level(LevelType::PreFaderInputLevels, Device::Strip4, 0)?; match result { Some(v) => println!("Level: {v}"), None => println!("Device not available in this Voicemeeter variant"), } Ok(()) } ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.