From 259c7309dcc05340b811eacd4fa21a5f9c0b344d Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Tue, 20 Jan 2026 13:08:43 +0000 Subject: [PATCH] update CLI example --- examples/cli/CLI.ps1 | 145 ++++++++++++++++++++++++++++------------- examples/cli/README.md | 42 ++++++------ 2 files changed, 122 insertions(+), 65 deletions(-) diff --git a/examples/cli/CLI.ps1 b/examples/cli/CLI.ps1 index 36bcbcb..b56088f 100644 --- a/examples/cli/CLI.ps1 +++ b/examples/cli/CLI.ps1 @@ -1,5 +1,22 @@ +<# +.SYNOPSIS + Command Line Interface for Voicemeeter control. +.DESCRIPTION + This script provides a command line interface to interact with Voicemeeter. It supports both interactive mode and scripted commands. + Users can specify the type of Voicemeeter (banana or potato) and execute commands to get or set parameters. +.PARAMETER help + Displays help information. +.PARAMETER interactive + Starts the CLI in interactive mode. +.PARAMETER kind + Specifies the type of Voicemeeter to connect to (banana or potato). Default is 'banana'. +.PARAMETER script + A list of commands to execute in sequence. +#> + [cmdletbinding()] param( + [switch]$help, [switch]$interactive, [String]$kind = 'banana', [String[]]$script = @() @@ -7,62 +24,98 @@ param( Import-Module ..\..\lib\Voicemeeter.psm1 -function get-value { - param([object]$vmr, [string]$line) +if ($help -or ($script.Count -eq 0 -and -not $interactive)) { + Write-Host 'Voicemeeter CLI' + Write-Host '' + Write-Host 'Usage:' + Write-Host ' CLI.ps1 [-interactive] [-kind ] [-script , , ...]' + Write-Host '' + Write-Host 'Options:' + Write-Host ' -interactive Start in interactive mode.' + Write-Host ' -kind Specify the Voicemeeter type (banana or potato). Default is banana.' + Write-Host ' -script Provide a list of commands to execute in sequence.' + Write-Host '' + Write-Host 'Commands can be of the form:' + Write-Host ' Parameter=Value Set a parameter to a specific value.' + Write-Host ' !Parameter Toggle a boolean parameter.' + Write-Host ' Parameter Get the current value of a parameter.' + exit 0 +} + +function Get-ParameterValue { + param( + [object]$vmr, + [string]$Parameter + ) + try { - $retval = $vmr.Getter($line) + $retval = $vmr.Getter($Parameter) } catch { - $retval = $vmr.Getter_String($line) + $retval = $vmr.Getter_String($Parameter) } $retval } -function msgHandler { - param([object]$vmr, [string]$line) - $line + ' passed to handler' | Write-Debug - if ($line[0] -eq '!') { - 'Toggling ' + $line.substring(1) | Write-Debug - $retval = get-value -vmr $vmr -line $line.substring(1) - $vmr.Setter($line.substring(1), 1 - $retval) + +function Invoke-VoicemeeterCLICommand { + param( + [object]$vmr, + [string]$Command + ) + + # Toggle command + if ($Command[0] -eq '!') { + $parameter = $Command.Substring(1).Trim() + $currentValue = Get-ParameterValue -vmr $vmr -Parameter $parameter + + if ($currentValue -ne 0 -and $currentValue -ne 1) { + throw "Cannot toggle non-boolean parameter '$parameter' with value '$currentValue'" + } + + $newValue = 1 - $currentValue + $vmr.SendText("$parameter=$newValue") + Write-Host "Toggled $parameter to $newValue" } - elseif ($line.Contains('=')) { - "Setting $line" | Write-Debug - $vmr.SendText($line) + # Set command + elseif ($Command.Contains('=')) { + $vmr.SendText("$Command") + Write-Host "Set $Command" + } + # Get command + else { + $parameter = $Command.Trim() + $value = Get-ParameterValue -vmr $vmr -Parameter $parameter + Write-Host "$parameter = $value" + } +} + +function Start-VoicemeeterCLI { + param( + [object]$vmr + ) + + Write-Host "Voicemeeter CLI Interactive Mode. Type 'exit' to quit." + while (($input = Read-Host "Press Enter to rotate buses or type 'Q' to quit.") -ne 'Q') { + try { + Invoke-VoicemeeterCLICommand -vmr $vmr -Command $input + } + catch { + Write-Host "Error: $_" -ForegroundColor Red + } + } +} + +try { + $vmr = Connect-Voicemeeter -Kind $kind + + if ($interactive) { + Start-VoicemeeterCLI -vmr $vmr } else { - "Getting $line" | Write-Debug - $retval = get-value -vmr $vmr -line $line - $line + ' = ' + $retval | Write-Host - } -} - -function read-hostuntilempty { - param([object]$vmr) - while (($line = Read-Host) -cne [string]::Empty) { msgHandler -vmr $vmr -line $line } -} - - -function main { - [object]$vmr - - try { - $vmr = Connect-Voicemeeter -Kind $kind - - if ($interactive) { - 'Press to exit' | Write-Host - read-hostuntilempty -vmr $vmr - return - } - if ($script.Count -eq 0) { - 'No script provided, exiting' | Write-Host - return - } - $script | ForEach-Object { - msgHandler -vmr $vmr -line $_ + foreach ($command in $script) { + Invoke-VoicemeeterCLICommand -vmr $vmr -Command $command } } - finally { Disconnect-Voicemeeter } } - -main +finally { Disconnect-Voicemeeter } \ No newline at end of file diff --git a/examples/cli/README.md b/examples/cli/README.md index 3b04261..5c8ed85 100644 --- a/examples/cli/README.md +++ b/examples/cli/README.md @@ -1,34 +1,38 @@ ## About -A simple voicemeeter-cli script. Offers ability to toggle, get and set parameters. +A basic command-line interface ## Use -Toggle with `!` prefix, get by excluding `=` and set by including `=`. Mix and match arguments. +``` +Voicemeeter CLI -You may pass the following optional flags: +Usage: + CLI.ps1 [-interactive] [-kind ] [-script , , ...] -- -o: (-output) to toggle console output. -- -i: (-interactive) to toggle interactive mode. -- -k: (-kind) to set the kind of Voicemeeter. Defaults to banana. -- -s: (script) a string array, one string for each command. +Options: + -interactive Start in interactive mode. + -kind Specify the Voicemeeter type (banana or potato). Default is banana. + -script Provide a list of commands to execute in sequence. + +Commands can be of the form: + Parameter=Value Set a parameter to a specific value. + !Parameter Toggle a boolean parameter. + Parameter Get the current value of a parameter. +``` for example: ```powershell -.\CLI.ps1 -o -k "banana" -s "strip[0].mute", "!strip[0].mute", "strip[0].mute", "bus[2].eq.on=1", "command.lock=1" +.\CLI.ps1 -script strip[0].mute, !strip[0].mute, strip[0].mute, bus[2].eq.on=1, command.lock=1 ``` -Expected output: +should produce the output: -```powershell -Getting strip[0].mute -strip[0].mute = 0 -Toggling strip[0].mute -Getting strip[0].mute +```console strip[0].mute = 1 -Setting bus[2].eq.on=1 -Setting command.lock=1 -``` - -If running in interactive mode press `` to exit. +Toggled strip[0].mute to 0 +strip[0].mute = 0 +Set bus[2].eq.on=1 +Set command.lock=1 +``` \ No newline at end of file