Compare commits

...

4 Commits

Author SHA1 Message Date
bd0779add2 add Taskfile
upd tasks in launch.json

add with Task to Run tests in README
2025-06-06 13:50:16 +01:00
a0a2c72634 run through formatter
rename pre-commit to run

remove num and log parameters
2025-06-06 13:49:35 +01:00
0f68a2373d run through formatter 2025-06-06 13:48:24 +01:00
2d6437d37b run through formatter 2025-06-06 13:48:11 +01:00
23 changed files with 237 additions and 285 deletions

5
.gitignore vendored
View File

@ -1,7 +1,6 @@
# quick test
quick.ps1
lib/*.psd1
**/*.log
config.psd1
test-*.ps1

14
.vscode/launch.json vendored
View File

@ -51,21 +51,9 @@
"type": "PowerShell",
"request": "launch",
"cwd": "${workspaceRoot}",
"script": "${workspaceFolder}/tests/pre-commit.ps1",
"script": "${workspaceFolder}/tests/run.ps1",
"args": [],
"createTemporaryIntegratedConsole": true
},
{
"name": "PowerShell: Launch Quick Test",
"type": "PowerShell",
"request": "launch",
"cwd": "${workspaceRoot}",
"script": "${workspaceFolder}/quick.ps1",
"args": [
"-Verbose",
"-Debug"
],
"createTemporaryIntegratedConsole": true
}
]
}

View File

@ -557,16 +557,16 @@ Access to lower level polling functions are provided with these functions:
### Run tests
Run tests using .\tests\pre-commit.ps1 which accepts the following parameters:
Parameters:
- `kind`: Run tests of this kind
- `tag`: Run tests tagged with this marker (currently `higher` or `lower`)
- `num`: Run this number of tests
- `log`: Write summary log file
Run tests from repository root in a subshell and write logs, like so:
*with Task*
`powershell .\tests\pre-commit.ps1 -k "potato" -t "higher" -log`
```console
task test -- -t "higher" -k "banana"
```
### Official Documentation

11
Taskfile.yaml Normal file
View File

@ -0,0 +1,11 @@
version: '3'
tasks:
test:
desc: 'Run tests'
preconditions:
- sh: 'pwsh -c "if ([System.Version](Get-InstalledModule Pester).Version.ToString() -gt [System.Version]"5.7.0") { exit 0 } else { exit 1 }"'
msg: 'Pester version must be greater than 5.7.0'
cmds:
- echo "Running tests..."
- pwsh -c "tests\run.ps1 {{.CLI_ARGS}}"

View File

@ -1,7 +1,7 @@
[cmdletbinding()]
param(
[switch]$interactive,
[String]$kind = "banana",
[String]$kind = 'banana',
[String[]]$script = @()
)
@ -20,20 +20,20 @@ function get-value {
function msgHandler {
param([object]$vmr, [string]$line)
$line + " passed to handler" | Write-Debug
if ($line[0] -eq "!") {
"Toggling " + $line.substring(1) | Write-Debug
$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)
}
elseif ($line.Contains("=")) {
elseif ($line.Contains('=')) {
"Setting $line" | Write-Debug
$vmr.SendText($line)
}
else {
"Getting $line" | Write-Debug
$retval = get-value -vmr $vmr -line $line
$line + " = " + $retval | Write-Host
$line + ' = ' + $retval | Write-Host
}
}
@ -50,7 +50,7 @@ function main {
$vmr = Connect-Voicemeeter -Kind $kind
if ($interactive) {
"Press <Enter> to exit" | Write-Host
'Press <Enter> to exit' | Write-Host
read-hostuntilempty -vmr $vmr
return
}

View File

@ -13,14 +13,14 @@ param()
Import-Module ..\..\lib\Voicemeeter.psm1
try {
$vmr = Connect-Voicemeeter -Kind "potato"
$vmr = Connect-Voicemeeter -Kind 'potato'
$buses = @($vmr.bus[1], $vmr.bus[2], $vmr.bus[4], $vmr.bus[6])
"Buses in selection: $($buses)"
$unmutedIndex = $null
# 1)
"Cycling through bus selection to check for first unmuted Bus..." | Write-Host
'Cycling through bus selection to check for first unmuted Bus...' | Write-Host
foreach ($bus in $buses) {
# 2)
if (-not $bus.mute) {

View File

@ -6,28 +6,28 @@ Import-Module obs-powershell
function CurrentProgramSceneChanged {
param([System.Object]$data)
Write-Host "Switched to scene", $data.sceneName
Write-Host 'Switched to scene', $data.sceneName
switch ($data.sceneName) {
"START" {
'START' {
$vmr.strip[0].mute = !$vmr.strip[0].mute
}
"BRB" {
'BRB' {
$vmr.strip[0].gain = -8.3
}
"END" {
'END' {
$vmr.strip[0].mono = $true
}
"LIVE" {
'LIVE' {
$vmr.strip[0].color_x = 0.3
}
default { "Expected START, BRB, END or LIVE scene" | Write-Warning; return }
default { 'Expected START, BRB, END or LIVE scene' | Write-Warning; return }
}
}
function ExitStarted {
param([System.Object]$data)
"OBS shutdown has begun!" | Write-Host
'OBS shutdown has begun!' | Write-Host
break
}
@ -38,12 +38,12 @@ function eventHandler($data) {
}
function ConnFromFile {
$configpath = Join-Path $PSScriptRoot "config.psd1"
$configpath = Join-Path $PSScriptRoot 'config.psd1'
return Import-PowerShellDataFile -Path $configpath
}
function main {
$vmr = Connect-Voicemeeter -Kind "basic"
$vmr = Connect-Voicemeeter -Kind 'basic'
$conn = ConnFromFile
$job = Watch-OBS -WebSocketURI "ws://$($conn.host):$($conn.port)" -WebSocketToken $conn.password

View File

@ -22,7 +22,7 @@ class Remote {
}
[string] ToString() {
return "Voicemeeter " + $this.kind.name.substring(0, 1).toupper() + $this.kind.name.substring(1)
return 'Voicemeeter ' + $this.kind.name.substring(0, 1).toupper() + $this.kind.name.substring(1)
}
[Remote] Login() {
@ -138,13 +138,13 @@ Function Get-RemotePotato {
Function Connect-Voicemeeter {
param([String]$Kind)
switch ($Kind) {
"basic" {
'basic' {
return Get-RemoteBasic
}
"banana" {
'banana' {
return Get-RemoteBanana
}
"potato" {
'potato' {
return Get-RemotePotato
}
default {

View File

@ -7,16 +7,16 @@ function Login {
)
$retval = [int][Voicemeeter.Remote]::VBVMR_Login()
if ($retval -notin @(0, 1, -2)) {
throw [CAPIError]::new($retval, "VBVMR_Login")
throw [CAPIError]::new($retval, 'VBVMR_Login')
}
switch ($retval) {
1 {
"Voicemeeter Engine running but GUI not launched. Launching GUI now." | Write-Verbose
'Voicemeeter Engine running but GUI not launched. Launching GUI now.' | Write-Verbose
RunVoicemeeter -kindId $kindId
}
-2 {
throw [LoginError]::new("Login may only be called once per session.")
throw [LoginError]::new('Login may only be called once per session.')
}
}
@ -26,7 +26,7 @@ function Login {
do {
Start-Sleep -m 100
try {
"Successfully logged into Voicemeeter [" + $(VmType).ToUpper() + "] Version " + $(VmVersion) | Write-Verbose
'Successfully logged into Voicemeeter [' + $(VmType).ToUpper() + '] Version ' + $(VmVersion) | Write-Verbose
$exception = $null
break
}
@ -37,7 +37,7 @@ function Login {
} while ($sw.elapsed -lt $timeout)
if ($null -ne $exception) {
throw [VMRemoteError]::new("Timeout logging into the API.")
throw [VMRemoteError]::new('Timeout logging into the API.')
}
while (P_Dirty -or M_Dirty) { Start-Sleep -m 1 }
@ -47,9 +47,9 @@ function Logout {
Start-Sleep -m 100
$retval = [int][Voicemeeter.Remote]::VBVMR_Logout()
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_Logout")
throw [CAPIError]::new($retval, 'VBVMR_Logout')
}
if ($retval -eq 0) { "Sucessfully logged out" | Write-Verbose }
if ($retval -eq 0) { 'Sucessfully logged out' | Write-Verbose }
}
function RunVoicemeeter {
@ -57,21 +57,21 @@ function RunVoicemeeter {
[string]$kindId
)
$kinds = @{
"basic" = $(if ([Environment]::Is64BitOperatingSystem) { 4 } else { 1 })
"banana" = $(if ([Environment]::Is64BitOperatingSystem) { 5 } else { 2 })
"potato" = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 })
'basic' = $(if ([Environment]::Is64BitOperatingSystem) { 4 } else { 1 })
'banana' = $(if ([Environment]::Is64BitOperatingSystem) { 5 } else { 2 })
'potato' = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 })
}
$retval = [int][Voicemeeter.Remote]::VBVMR_RunVoicemeeter([int64]$kinds[$kindId])
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_RunVoicemeeter")
throw [CAPIError]::new($retval, 'VBVMR_RunVoicemeeter')
}
}
function P_Dirty {
$retval = [Voicemeeter.Remote]::VBVMR_IsParametersDirty()
if ($retval -notin @(0, 1)) {
throw [CAPIError]::new($retval, "VBVMR_IsParametersDirty")
throw [CAPIError]::new($retval, 'VBVMR_IsParametersDirty')
}
[bool]$retval
}
@ -79,7 +79,7 @@ function P_Dirty {
function M_Dirty {
$retval = [Voicemeeter.Remote]::VBVMR_MacroButton_IsDirty()
if ($retval -notin @(0, 1)) {
throw [CAPIError]::new($retval, "VBVMR_MacroButton_IsDirty")
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_IsDirty')
}
[bool]$retval
}
@ -88,12 +88,12 @@ function VmType {
New-Variable -Name ptr -Value 0
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterType([ref]$ptr)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_GetVoicemeeterType")
throw [CAPIError]::new($retval, 'VBVMR_GetVoicemeeterType')
}
switch ($ptr) {
1 { return "basic" }
2 { return "banana" }
3 { return "potato" }
1 { return 'basic' }
2 { return 'banana' }
3 { return 'potato' }
}
}
@ -101,7 +101,7 @@ function VmVersion {
New-Variable -Name ptr -Value 0
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterVersion([ref]$ptr)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_GetVoicemeeterVersion")
throw [CAPIError]::new($retval, 'VBVMR_GetVoicemeeterVersion')
}
$v1 = ($ptr -band 0xFF000000) -shr 24
$v2 = ($ptr -band 0x00FF0000) -shr 16
@ -122,7 +122,7 @@ function Param_Get {
$BYTES = [System.Byte[]]::new(512)
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterStringA($PARAM, $BYTES)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_GetParameterStringA")
throw [CAPIError]::new($retval, 'VBVMR_GetParameterStringA')
}
[System.Text.Encoding]::ASCII.GetString($BYTES).Trim([char]0)
}
@ -130,7 +130,7 @@ function Param_Get {
New-Variable -Name ptr -Value 0.0
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterFloat($PARAM, [ref]$ptr)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_GetParameterFloat")
throw [CAPIError]::new($retval, 'VBVMR_GetParameterFloat')
}
[single]$ptr
}
@ -143,13 +143,13 @@ function Param_Set {
if ($VALUE -is [string]) {
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterStringA($PARAM, $VALUE)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_SetParameterStringA")
throw [CAPIError]::new($retval, 'VBVMR_SetParameterStringA')
}
}
else {
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterFloat($PARAM, $VALUE)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_SetParameterFloat")
throw [CAPIError]::new($retval, 'VBVMR_SetParameterFloat')
}
}
}
@ -160,7 +160,7 @@ function MB_Set {
)
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_SetStatus($ID, $SET, $MODE)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_MacroButton_SetStatus")
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_SetStatus')
}
}
@ -174,7 +174,7 @@ function MB_Get {
New-Variable -Name ptr -Value 0.0
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_GetStatus($ID, [ref]$ptr, $MODE)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_MacroButton_GetStatus")
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_GetStatus')
}
[int]$ptr
}
@ -184,8 +184,8 @@ function Param_Set_Multi {
[hashtable]$HASH
)
foreach ($key in $HASH.keys) {
$classobj, $m2, $m3 = $key.Split("_")
if ($m2 -match "^\d+$") { $index = [int]$m2 } else { $index = [int]$m3 }
$classobj, $m2, $m3 = $key.Split('_')
if ($m2 -match '^\d+$') { $index = [int]$m2 } else { $index = [int]$m3 }
foreach ($h in $HASH[$key].GetEnumerator()) {
$property = $h.Name
@ -207,11 +207,11 @@ function Set_By_Script {
[string]$script
)
if ($script.Length -gt 48000) {
throw [VMRemoteError]::new("Script size cannot be larger than 48kB")
throw [VMRemoteError]::new('Script size cannot be larger than 48kB')
}
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameters($script)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_SetParameters")
throw [CAPIError]::new($retval, 'VBVMR_SetParameters')
}
}
@ -222,7 +222,7 @@ function Get_Level {
New-Variable -Name ptr -Value 0.0
$retval = [int][Voicemeeter.Remote]::VBVMR_GetLevel($MODE, $INDEX, [ref]$ptr)
if ($retval -notin @(0)) {
throw [CAPIError]::new($retval, "VBVMR_GetLevel")
throw [CAPIError]::new($retval, 'VBVMR_GetLevel')
}
[float]$ptr
}

View File

@ -3,9 +3,9 @@
function Setup_DLL {
$VMPATH = Get_VMPath
$dll = Join-Path -Path $VMPATH -ChildPath ("VoicemeeterRemote" + `
(& { if ([Environment]::Is64BitOperatingSystem) { "64" } else { "" } }) + `
".dll")
$dll = Join-Path -Path $VMPATH -ChildPath ('VoicemeeterRemote' + `
(& { if ([Environment]::Is64BitOperatingSystem) { '64' } else { '' } }) + `
'.dll')
$Signature = @"
[DllImport(@"$dll")]

View File

@ -8,7 +8,7 @@ class IBus {
}
[string] identifier () {
return "Bus[" + $this.index + "]"
return 'Bus[' + $this.index + ']'
}
[single] Getter ($param) {
@ -106,7 +106,7 @@ class BusMode : IBus {
}
[string] identifier () {
return "Bus[" + $this.index + "].mode"
return 'Bus[' + $this.index + '].mode'
}
[string] Get () {
@ -125,7 +125,7 @@ class BusEq : IBus {
}
[string] identifier () {
return "Bus[" + $this.index + "].EQ"
return 'Bus[' + $this.index + '].EQ'
}
}
@ -142,7 +142,7 @@ class BusDevice : IBus {
}
[string] identifier () {
return "Bus[" + $this.index + "].Device"
return 'Bus[' + $this.index + '].Device'
}
hidden $_name = $($this | Add-Member ScriptProperty 'name' `

View File

@ -8,7 +8,7 @@ class Special {
}
[string] identifier () {
return "Command"
return 'Command'
}
[string] ToString() {
@ -29,13 +29,13 @@ class Special {
}
[void] RunMacrobuttons() {
"Launching the MacroButtons app" | Write-Verbose
Start-Process -FilePath $(Join-Path -Path $this.remote.vmpath -ChildPath "VoicemeeterMacroButtons.exe")
'Launching the MacroButtons app' | Write-Verbose
Start-Process -FilePath $(Join-Path -Path $this.remote.vmpath -ChildPath 'VoicemeeterMacroButtons.exe')
}
[void] CloseMacrobuttons() {
"Closing the MacroButtons app" | Write-Verbose
Stop-Process -Name "VoicemeeterMacroButtons"
'Closing the MacroButtons app' | Write-Verbose
Stop-Process -Name 'VoicemeeterMacroButtons'
}
hidden $_hide = $($this | Add-Member ScriptProperty 'hide' `

View File

@ -1,19 +1,19 @@
function Get_VMPath {
$REG_KEY = @(
"Registry::HKEY_LOCAL_MACHINE",
"Software",
(& { if ([Environment]::Is64BitOperatingSystem) { "WOW6432Node" } else { "" } }),
"Microsoft",
"Windows",
"CurrentVersion",
"Uninstall"
).Where({ $_ -ne "" }) -Join "\"
$VM_KEY = "VB:Voicemeeter {17359A74-1236-5467}"
'Registry::HKEY_LOCAL_MACHINE',
'Software',
(& { if ([Environment]::Is64BitOperatingSystem) { 'WOW6432Node' } else { '' } }),
'Microsoft',
'Windows',
'CurrentVersion',
'Uninstall'
).Where({ $_ -ne '' }) -Join '\'
$VM_KEY = 'VB:Voicemeeter {17359A74-1236-5467}'
try {
return $(Get-ItemPropertyValue -Path (@($REG_KEY, $VM_KEY) -Join "\") -Name UninstallString | Split-Path -Parent)
return $(Get-ItemPropertyValue -Path (@($REG_KEY, $VM_KEY) -Join '\') -Name UninstallString | Split-Path -Parent)
}
catch {
throw [VMRemoteError]::new("Unable to fetch Voicemeeter path from the Registry.")
throw [VMRemoteError]::new('Unable to fetch Voicemeeter path from the Registry.')
}
}

View File

@ -1,30 +1,30 @@
$KindMap = @{
"basic" = @{
"name" = "basic"
"p_in" = 2
"v_in" = 1
"p_out" = 1
"v_out" = 1
"vban_in" = 4
"vban_out" = 4
'basic' = @{
'name' = 'basic'
'p_in' = 2
'v_in' = 1
'p_out' = 1
'v_out' = 1
'vban_in' = 4
'vban_out' = 4
};
"banana" = @{
"name" = "banana"
"p_in" = 3
"v_in" = 2
"p_out" = 3
"v_out" = 2
"vban_in" = 8
"vban_out" = 8
'banana' = @{
'name' = 'banana'
'p_in' = 3
'v_in' = 2
'p_out' = 3
'v_out' = 2
'vban_in' = 8
'vban_out' = 8
};
"potato" = @{
"name" = "potato"
"p_in" = 5
"v_in" = 3
"p_out" = 5
"v_out" = 3
"vban_in" = 8
"vban_out" = 8
'potato' = @{
'name' = 'potato'
'p_in' = 5
'v_in' = 3
'p_out' = 5
'v_out' = 3
'vban_in' = 8
'vban_out' = 8
};
}

View File

@ -5,9 +5,9 @@ function AddBoolMembers () {
[hashtable]$Signatures = @{}
foreach ($param in $PARAMS) {
# Define getter
$Signatures["Getter"] = "[bool]`$this.Getter('{0}')" -f $param
$Signatures['Getter'] = "[bool]`$this.Getter('{0}')" -f $param
# Define setter
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
-f $param
Addmember
@ -21,9 +21,9 @@ function AddFloatMembers () {
[hashtable]$Signatures = @{}
foreach ($param in $PARAMS) {
# Define getter
$Signatures["Getter"] = "[math]::Round(`$this.Getter('{0}'), 1)" -f $param
$Signatures['Getter'] = "[math]::Round(`$this.Getter('{0}'), 1)" -f $param
# Define setter
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
-f $param
Addmember
@ -37,9 +37,9 @@ function AddIntMembers () {
[hashtable]$Signatures = @{}
foreach ($param in $PARAMS) {
# Define getter
$Signatures["Getter"] = "[Int]`$this.Getter('{0}')" -f $param
$Signatures['Getter'] = "[Int]`$this.Getter('{0}')" -f $param
# Define setter
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
-f $param
Addmember
@ -53,9 +53,9 @@ function AddStringMembers () {
[hashtable]$Signatures = @{}
foreach ($param in $PARAMS) {
# Define getter
$Signatures["Getter"] = "[String]`$this.Getter_String('{0}')" -f $param
$Signatures['Getter'] = "[String]`$this.Getter_String('{0}')" -f $param
# Define setter
$Signatures["Setter"] = "param ( [String]`$arg )`n`$this.Setter('{0}', `$arg)" `
$Signatures['Setter'] = "param ( [String]`$arg )`n`$this.Setter('{0}', `$arg)" `
-f $param
Addmember
@ -69,9 +69,9 @@ function AddActionMembers () {
[hashtable]$Signatures = @{}
foreach ($param in $PARAMS) {
# Define getter
$Signatures["Getter"] = "`$this.Setter('{0}', `$true)" -f $param
$Signatures['Getter'] = "`$this.Setter('{0}', `$true)" -f $param
# Define setter
$Signatures["Setter"] = ""
$Signatures['Setter'] = ''
Addmember
}
@ -83,7 +83,7 @@ function AddChannelMembers () {
[System.Collections.ArrayList]$channels = @()
1..$($num_A + $num_B) | ForEach-Object {
if ($_ -le $num_A) { $channels.Add("A{0}" -f $_) } else { $channels.Add("B{0}" -f $($_ - $num_A)) }
if ($_ -le $num_A) { $channels.Add('A{0}' -f $_) } else { $channels.Add('B{0}' -f $($_ - $num_A)) }
}
AddBoolMembers -PARAMS $channels
@ -93,11 +93,11 @@ function AddGainlayerMembers () {
[hashtable]$Signatures = @{}
0..7 | ForEach-Object {
# Define getter
$Signatures["Getter"] = "`$this.Getter('gainlayer[{0}]')" -f $_
$Signatures['Getter'] = "`$this.Getter('gainlayer[{0}]')" -f $_
# Define setter
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('gainlayer[{0}]', `$arg)" `
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('gainlayer[{0}]', `$arg)" `
-f $_
$param = "gainlayer{0}" -f $_
$param = 'gainlayer{0}' -f $_
$null = $param
Addmember
@ -108,8 +108,8 @@ function Addmember {
$AddMemberParams = @{
Name = $param
MemberType = 'ScriptProperty'
Value = [scriptblock]::Create($Signatures["Getter"])
SecondValue = [scriptblock]::Create($Signatures["Setter"])
Value = [scriptblock]::Create($Signatures['Getter'])
SecondValue = [scriptblock]::Create($Signatures['Setter'])
}
$this | Add-Member @AddMemberParams
}

View File

@ -1,5 +1,5 @@
function Get_Profiles ([string]$kind_id) {
$basepath = Join-Path -Path $(Split-Path -Path $PSScriptRoot) -ChildPath "profiles"
$basepath = Join-Path -Path $(Split-Path -Path $PSScriptRoot) -ChildPath 'profiles'
if (Test-Path $basepath) {
$fullpath = Join-Path -Path $basepath -ChildPath $kind_id
}
@ -11,7 +11,7 @@ function Get_Profiles ([string]$kind_id) {
$filenames | ForEach-Object {
(Join-Path -Path $fullpath -ChildPath $_) | ForEach-Object {
$filename = [System.IO.Path]::GetFileNameWithoutExtension($_)
Write-Host ("Importing profile " + $kind_id + "/" + $filename)
Write-Host ('Importing profile ' + $kind_id + '/' + $filename)
$data[$filename] = Import-PowerShellDataFile -Path $_
}
}

View File

@ -51,7 +51,7 @@ class Recorder : IRecorder {
}
[string] identifier () {
return "Recorder"
return 'Recorder'
}
[string] ToString() {
@ -137,9 +137,9 @@ class Recorder : IRecorder {
[void] GoTo ([string]$timestring) {
try {
if ([datetime]::ParseExact($timestring, "HH:mm:ss", $null)) {
if ([datetime]::ParseExact($timestring, 'HH:mm:ss', $null)) {
$timespan = [timespan]::Parse($timestring)
$this.Setter("GoTo", $timespan.TotalSeconds)
$this.Setter('GoTo', $timespan.TotalSeconds)
}
}
catch [FormatException] {
@ -150,13 +150,13 @@ class Recorder : IRecorder {
[void] FileType($format) {
[int]$val = 0
switch ($format) {
"wav" { $val = 1 }
"aiff" { $val = 2 }
"bwf" { $val = 3 }
"mp3" { $val = 100 }
'wav' { $val = 1 }
'aiff' { $val = 2 }
'bwf' { $val = 3 }
'mp3' { $val = 100 }
default { "Filetype() got: $format, expected one of 'wav', 'aiff', 'bwf', 'mp3'" }
}
$this.Setter("filetype", $val)
$this.Setter('filetype', $val)
}
}
@ -166,7 +166,7 @@ class RecorderMode : IRecorder {
}
[string] identifier () {
return "Recorder.Mode"
return 'Recorder.Mode'
}
}
@ -178,7 +178,7 @@ class RecorderArm : IRecorder {
}
Set ([bool]$val) {
$this.Setter("", $(if ($val) { 1 } else { 0 }))
$this.Setter('', $(if ($val) { 1 } else { 0 }))
}
}

View File

@ -8,7 +8,7 @@ class IStrip {
}
[string] identifier () {
return "Strip[" + $this.index + "]"
return 'Strip[' + $this.index + ']'
}
[single] Getter ($param) {
@ -135,7 +135,7 @@ class StripComp : IStrip {
}
[string] identifier () {
return "Strip[" + $this.index + "].Comp"
return 'Strip[' + $this.index + '].Comp'
}
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
@ -155,7 +155,7 @@ class StripGate : IStrip {
}
[string] identifier () {
return "Strip[" + $this.index + "].Gate"
return 'Strip[' + $this.index + '].Gate'
}
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
@ -174,7 +174,7 @@ class StripDenoiser : IStrip {
}
[string] identifier () {
return "Strip[" + $this.index + "].Denoiser"
return 'Strip[' + $this.index + '].Denoiser'
}
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
@ -194,7 +194,7 @@ class StripEq : IStrip {
}
[string] identifier () {
return "Strip[" + $this.index + "].EQ"
return 'Strip[' + $this.index + '].EQ'
}
}
@ -203,7 +203,7 @@ class StripDevice : IStrip {
}
[string] identifier () {
return "Strip[" + $this.index + "].Device"
return 'Strip[' + $this.index + '].Device'
}
hidden $_name = $($this | Add-Member ScriptProperty 'name' `

View File

@ -10,7 +10,7 @@ class IVban {
}
[string] identifier () {
return "vban." + $this.direction + "stream[" + $this.index + "]"
return 'vban.' + $this.direction + 'stream[' + $this.index + ']'
}
[single] Getter ($param) {
@ -94,7 +94,7 @@ class Vban : IVban {
} `
{
param([int]$arg)
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
if ($this.direction -eq 'in') { Write-Warning ('Error, read only value') }
else {
$opts = @(11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
if ($opts.Contains($arg)) {
@ -113,7 +113,7 @@ class Vban : IVban {
} `
{
param([int]$arg)
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
if ($this.direction -eq 'in') { Write-Warning ('Error, read only value') }
else {
if ($arg -ge 1 -and $arg -le 8) {
$this._channel = $this.Setter('channel', $arg)
@ -132,7 +132,7 @@ class Vban : IVban {
} `
{
param([int]$arg)
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
if ($this.direction -eq 'in') { Write-Warning ('Error, read only value') }
else {
if (@(16, 24).Contains($arg)) {
$val = if ($arg -eq 16) { 1 } else { 2 }
@ -151,7 +151,7 @@ class Vban : IVban {
} `
{
param([int]$arg)
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
if ($this.direction -eq 'in') { Write-Warning ('Error, read only value') }
else {
if ($arg -ge 0 -and $arg -le 4) {
$this._quality = $this.Setter('quality', $arg)
@ -169,7 +169,7 @@ class Vban : IVban {
} `
{
param([int]$arg)
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
if ($this.direction -eq 'in') { Write-Warning ('Error, read only value') }
else {
if ($arg -ge 0 -and $arg -le 8) {
$this._route = $this.Setter('route', $arg)
@ -200,10 +200,10 @@ function Make_Vban ([Object]$remote) {
[System.Collections.ArrayList]$outstream = @()
0..$($remote.kind.vban_in - 1) | ForEach-Object {
[void]$instream.Add([VbanInstream]::new($_, $remote, "in"))
[void]$instream.Add([VbanInstream]::new($_, $remote, 'in'))
}
0..$($remote.kind.vban_out - 1) | ForEach-Object {
[void]$outstream.Add([VbanOutstream]::new($_, $remote, "out"))
[void]$outstream.Add([VbanOutstream]::new($_, $remote, 'out'))
}
$CustomObject = [pscustomobject]@{
@ -213,7 +213,7 @@ function Make_Vban ([Object]$remote) {
$CustomObject | Add-Member ScriptProperty 'enable' `
{
return Write-Warning ("ERROR: vban.enable is write only")
return Write-Warning ('ERROR: vban.enable is write only')
} `
{
param([bool]$arg)

View File

@ -2,10 +2,10 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Describe 'Bool tests' -ForEach @(
@{ Value = $true; Expected = $true }
@{ Value = $false; Expected = $false }
){
) {
Context 'Strip, one physical one virtual' -ForEach @(
@{ Index = $phys_in }, @{ Index = $virt_in }
){
) {
It "Should set and get Strip[$index].Mute" {
$vmr.strip[$index].mute = $value
$vmr.strip[$index].mute | Should -Be $expected
@ -29,7 +29,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'physical only' -ForEach @(
@{ Index = $phys_in }
){
) {
Context 'eq.{param}' -Skip:$ifNotPotato {
It "Should set Strip[$index].EQ.On to $value" {
$vmr.strip[$index].eq.on = $value
@ -40,7 +40,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'Bus, one physical one virtual' -ForEach @(
@{ Index = $phys_out }, @{ Index = $virt_out }
){
) {
It "Should set and get Bus[$index].Eq.On" -Skip:$ifBasic {
$vmr.bus[$index].eq.on = $value
$vmr.bus[$index].eq.on | Should -Be $expected
@ -64,7 +64,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'Macrobutton' -ForEach @(
@{ Index = 0 }, @{ Index = 69 }
){
) {
It "Should set and get macrobutton[$index] State" {
$vmr.button[$index].state = $value
$vmr.button[$index].state | Should -Be $expected
@ -73,7 +73,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'Vban instream' -ForEach @(
@{ Index = $vban_in }
){
) {
It "Should set vban.instream[$index].on" {
$vmr.vban.instream[$index].on = $value
$vmr.vban.instream[$index].on | Should -Be $expected
@ -82,7 +82,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'Vban outstream' -ForEach @(
@{ Index = $vban_out }
){
) {
It "Should set vban.outstream[$index].on" {
$vmr.vban.outstream[$index].on = $value
$vmr.vban.outstream[$index].on | Should -Be $expected
@ -90,17 +90,17 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
}
Context 'Recorder' -Skip:$ifBasic {
It "Should set and get Recorder.A3" {
It 'Should set and get Recorder.A3' {
$vmr.recorder.A3 = $value
$vmr.recorder.A3 | Should -Be $expected
}
It "Should set and get Recorder.B1" {
It 'Should set and get Recorder.B1' {
$vmr.recorder.B1 = $value
$vmr.recorder.B1 | Should -Be $expected
}
It "Should set and get Recorder.loop" {
It 'Should set and get Recorder.loop' {
$vmr.recorder.loop = $value
}
}
@ -116,10 +116,10 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Describe 'Strip tests' {
Context 'one physical, one virtual' -ForEach @(
@{ Index = $phys_in }, @{ Index = $virt_in }
){
) {
Context 'gain' -ForEach @(
@{ Value = 3.6; Expected = 3.6 }, @{ Value = -8.2; Expected = -8.2 }
){
) {
It "Should set Strip[$index].Gain to $value" {
$vmr.strip[$index].gain = $value
$vmr.strip[$index].gain | Should -Be $expected
@ -129,10 +129,10 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'physical only' -Skip:$ifBasic -ForEach @(
@{ Index = $phys_in }
){
) {
Context 'comp, gate' -ForEach @(
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
){
) {
It "Should set Strip[$index].Comp to $value" {
$vmr.strip[$index].comp.knob = $value
$vmr.strip[$index].comp.knob | Should -Be $expected
@ -146,7 +146,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'denoiser' -Skip:$ifNotPotato -ForEach @(
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
){
) {
It "Should set Strip[$index].Denoiser to $value" {
$vmr.strip[$index].denoiser.knob = $value
$vmr.strip[$index].denoiser.knob | Should -Be $expected
@ -155,7 +155,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'comp.{param}' -Skip:$ifNotPotato -ForEach @(
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
){
) {
It "Should set Strip[$index].Comp.Attack to $value" {
$vmr.strip[$index].comp.attack = $value
$vmr.strip[$index].comp.attack | Should -Be $expected
@ -164,7 +164,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'comp.{param}' -Skip:$ifNotPotato -ForEach @(
@{ Value = 0.3; Expected = 0.3 }, @{ Value = 0.8; Expected = 0.8 }
){
) {
It "Should set Strip[$index].Comp.Knee to $value" {
$vmr.strip[$index].comp.knee = $value
$vmr.strip[$index].comp.knee | Should -Be $expected
@ -173,7 +173,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'gate.{param}' -Skip:$ifNotPotato -ForEach @(
@{ Value = 103; Expected = 103 }, @{ Value = 3800; Expected = 3800 }
){
) {
It "Should set Strip[$index].Gate.BPSidechain to $value" {
$vmr.strip[$index].gate.bpsidechain = $value
$vmr.strip[$index].gate.bpsidechain | Should -Be $expected
@ -182,7 +182,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'gate.{param}' -Skip:$ifNotPotato -ForEach @(
@{ Value = 0.3; Expected = 0.3 }, @{ Value = 5000; Expected = 5000 }
){
) {
It "Should set Strip[$index].Gate.Hold to $value" {
$vmr.strip[$index].gate.hold = $value
$vmr.strip[$index].gate.hold | Should -Be $expected
@ -194,10 +194,10 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Describe 'Bus tests' {
Context 'one physical, one virtual' -ForEach @(
@{ Index = $phys_out }, @{ Index = $virt_out }
){
) {
Context 'gain' -ForEach @(
@{ Value = 5.2; Expected = 5.2 }, @{ Value = -38.2; Expected = -38.2 }
){
) {
It "Should set Bus[$index].Gain to $value" {
$vmr.bus[$index].gain = $value
$vmr.bus[$index].gain | Should -Be $expected
@ -209,11 +209,11 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Describe 'Int Tests' -ForEach @(
@{ Index = $phys_in }, @{ Index = $virt_in }
){
) {
Context 'Strip, one physical, one virtual' -Skip:$ifBasic -ForEach @(
@{ Value = 3; Expected = 3 }
@{ Value = -6; Expected = -6 }
){
) {
It "Should set Strip[$index].Limit to 3" {
$vmr.strip[$index].limit = $value
$vmr.strip[$index].limit | Should -Be $expected
@ -224,7 +224,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'sr' -ForEach @(
@{ Value = 44100; Expected = 44100 }
@{ Value = 48000; Expected = 48000 }
){
) {
It "Should set vban.outstream[$index].sr to $value" {
$vmr.vban.outstream[$index].sr = $value
$vmr.vban.outstream[$index].sr | Should -Be $expected
@ -234,7 +234,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'channel' -ForEach @(
@{ Value = 1; Expected = 1 }
@{ Value = 2; Expected = 2 }
){
) {
It 'Should set vban.outstream[0].channel to 1' {
$vmr.vban.outstream[$index].channel = $value
$vmr.vban.outstream[$index].channel | Should -Be $expected
@ -246,11 +246,11 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Describe 'String Tests' {
Context 'Strip, one physical, one virtual' -ForEach @(
@{ Index = $phys_in }, @{ Index = $virt_in }
){
) {
It "Should set Strip[$index].Label" -ForEach @(
@{ Value = "test0"; Expected = "test0" }
@{ Value = "test1"; Expected = "test1" }
){
@{ Value = 'test0'; Expected = 'test0' }
@{ Value = 'test1'; Expected = 'test1' }
) {
$vmr.strip[$index].label = $value
$vmr.strip[$index].label | Should -Be $expected
}
@ -258,11 +258,11 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'Bus, one physical, one virtual' -ForEach @(
@{ Index = $phys_out }, @{ Index = $virt_out }
){
) {
It "Should set Bus[$index].Label" -ForEach @(
@{ Value = "test0"; Expected = "test0" }
@{ Value = "test1"; Expected = "test1" }
){
@{ Value = 'test0'; Expected = 'test0' }
@{ Value = 'test1'; Expected = 'test1' }
) {
$vmr.bus[$index].label = $value
$vmr.bus[$index].label | Should -Be $expected
}
@ -270,11 +270,11 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Describe 'Vban' -ForEach @(
@{ Index = $vban_in }
){
) {
Context 'instream' {
Context 'ip' -ForEach @(
@{ Value = "0.0.0.0"; Expected = "0.0.0.0" }
){
@{ Value = '0.0.0.0'; Expected = '0.0.0.0' }
) {
It "Should set vban.instream[$index].name to $value" {
$vmr.vban.instream[$index].ip = $value
$vmr.vban.instream[$index].ip | Should -Be $expected
@ -284,8 +284,8 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
Context 'outstream' {
Context 'ip' -ForEach @(
@{ Value = "0.0.0.0"; Expected = "0.0.0.0" }
){
@{ Value = '0.0.0.0'; Expected = '0.0.0.0' }
) {
It "Should set vban.outstream[$index].name to $value" {
$vmr.vban.outstream[$index].ip = $value
$vmr.vban.outstream[$index].ip | Should -Be $expected

View File

@ -6,13 +6,13 @@ Describe -Tag 'lower', -TestName 'All Lower Tests' {
Describe 'Macrobutton Tests' -ForEach @(
@{ Value = 1; Expected = 1 }
@{ Value = 0; Expected = 0 }
){
) {
Context 'buttons 0, 69' -ForEach @(
@{ Index = 0 }, @{ Index = 69 }
){
) {
Context 'state, stateonly and trigger' -ForEach @(
@{ Mode = 1 }, @{ Mode = 2 }, @{ Mode = 3 }
){
) {
It "Should set and get macrobutton[$index] State" {
MB_Set -ID $index -SET $value -MODE $mode
MB_Get -ID $index -MODE $mode | Should -Be $expected
@ -24,13 +24,13 @@ Describe -Tag 'lower', -TestName 'All Lower Tests' {
Describe 'Set and Get Param Float Tests' -ForEach @(
@{ Value = 1; Expected = 1 }
@{ Value = 0; Expected = 0 }
){
) {
Context 'Strip, one physical one virtual' -ForEach @(
@{ Index = $phys_in }, @{ Index = $virt_in }
){
) {
Context 'mute, mono, A1, B2' -ForEach @(
@{ param = "mute" }, @{ param = "A1" }
){
@{ param = 'mute' }, @{ param = 'A1' }
) {
It "Should set Strip[0].$param to 1" {
Param_Set -PARAM "Strip[$index].$param" -VALUE $value
Param_Get -PARAM "Strip[$index].$param" | Should -Be $expected
@ -42,10 +42,10 @@ Describe -Tag 'lower', -TestName 'All Lower Tests' {
Describe 'Set and Get Param String Tests' -ForEach @(
@{ Value = 'test0'; Expected = 'test0' }
@{ Value = 'test1'; Expected = 'test1' }
){
) {
Context 'Strip, one physical one virtual' -ForEach @(
@{ Index = $phys_in }, @{ Index = $virt_in }
){
) {
It "Should set Strip[$index].Label to $value" {
Param_Set -PARAM "Strip[$index].Label" -VALUE $value
Param_Get -PARAM "Strip[$index].Label" -IS_STRING $true | Should -Be $expected

View File

@ -1,76 +0,0 @@
Param([String]$tag, [Int]$num = 1, [switch]$log, [string]$kind = "potato")
Import-Module .\lib\Voicemeeter.psm1
Function ParseLog {
Param([String]$logfile)
$summary_file = Join-Path $PSScriptRoot "_summary.log"
if (Test-Path $summary_file) { Clear-Content $summary_file }
$PASSED_PATTERN = "^PassedCount\s+:\s(\d+)"
$FAILED_PATTERN = "^FailedCount\s+:\s(\d+)"
$DATA = @{
"passed" = 0
"failed" = 0
}
ForEach ($line in `
$(Get-Content -Path "${logfile}")) {
if ($line -match $PASSED_PATTERN) {
$DATA["passed"] += $Matches[1]
}
elseif ($line -match $FAILED_PATTERN) {
$DATA["failed"] += $Matches[1]
}
}
"=========================`n" + `
"$num tests run:`n" + `
"=========================" | Tee-Object -FilePath $summary_file -Append
$DATA | ForEach-Object { $_ } | Tee-Object -FilePath $summary_file -Append
}
function main() {
try {
$vmr = Connect-Voicemeeter -Kind $kind
$vmr.command.RunMacrobuttons() # ensure macrobuttons is running before we begin
Write-Host "Running tests for $vmr"
# test boundaries by kind
$phys_in = $vmr.kind.p_in - 1
$virt_in = $vmr.kind.p_in + $vmr.kind.v_in - 1
$phys_out = $vmr.kind.p_out - 1
$virt_out = $vmr.kind.p_out + $vmr.kind.v_out - 1
$vban_in = $vmr.kind.vban_in - 1
$vban_out = $vmr.kind.vban_out - 1
# skip conditions by kind
$ifBasic = $vmr.kind.name -eq "basic"
$ifBanana = $vmr.kind.name -eq "banana"
$ifPotato = $vmr.kind.name -eq "potato"
$ifNotBasic = $vmr.kind.name -ne "basic"
$ifNotBanana = $vmr.kind.name -ne "banana"
$ifNotPotato = $vmr.kind.name -ne "potato"
$logfile = Join-Path $PSScriptRoot "_results.log"
if (Test-Path $logfile) { Clear-Content $logfile }
1..$num | ForEach-Object {
if ($log) {
"Running test $_ of $num" | Tee-Object -FilePath $logfile -Append
Invoke-Pester -Tag $tag -PassThru | Tee-Object -FilePath $logfile -Append
}
else {
"Running test $_ of $num"
Invoke-Pester -Tag $tag -PassThru
}
}
if ($log) { Parselog -logfile $logfile }
}
finally { Disconnect-Voicemeeter }
}
main

30
tests/run.ps1 Normal file
View File

@ -0,0 +1,30 @@
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "", Target = "variablename")]
Param([String]$tag, [string]$kind = 'potato')
Import-Module .\lib\Voicemeeter.psm1
function main() {
try {
$vmr = Connect-Voicemeeter -Kind $kind
$vmr.command.RunMacrobuttons() # ensure macrobuttons is running before we begin
Write-Host "Running tests for $vmr"
# test boundaries by kind
$phys_in = $vmr.kind.p_in - 1
$virt_in = $vmr.kind.p_in + $vmr.kind.v_in - 1
$phys_out = $vmr.kind.p_out - 1
$virt_out = $vmr.kind.p_out + $vmr.kind.v_out - 1
$vban_in = $vmr.kind.vban_in - 1
$vban_out = $vmr.kind.vban_out - 1
# skip conditions by kind
$ifBasic = $vmr.kind.name -eq 'basic'
$ifNotPotato = $vmr.kind.name -ne 'potato'
Invoke-Pester -Tag $tag -PassThru | Out-Null
}
finally { Disconnect-Voicemeeter }
}
main