mirror of
https://github.com/onyx-and-iris/voicemeeter-api-powershell.git
synced 2026-04-20 14:33:32 +00:00
Compare commits
40 Commits
add-more-l
...
16dd73231e
| Author | SHA1 | Date | |
|---|---|---|---|
| 16dd73231e | |||
|
|
15a977834d | ||
|
|
f3ed1de557 | ||
|
|
54319924d0 | ||
| 4d54e0a15f | |||
|
|
dce6f37bf1 | ||
|
|
5fc5680c75 | ||
|
|
80869d4306 | ||
|
|
e0b01288ff | ||
|
|
3a5c7286f6 | ||
|
|
c086f58ade | ||
|
|
e5137b842b | ||
|
|
78f7fc80d4 | ||
|
|
62d9e89b5f | ||
|
|
a6f7d8efe0 | ||
|
|
b372cf8087 | ||
|
|
eeb30925fa | ||
|
|
09d8bd48eb | ||
|
|
b0a6bf7b63 | ||
|
|
9a2529c617 | ||
|
|
2404bfb50f | ||
| bd0779add2 | |||
| a0a2c72634 | |||
| 0f68a2373d | |||
| 2d6437d37b | |||
| f199fa587f | |||
| b6c9c65390 | |||
| 436b47a5db | |||
| 0cdd71600f | |||
| 41529c0d58 | |||
| b1a6ac68c1 | |||
| fbfab5b4aa | |||
| 4d371a7582 | |||
| 15b3b375bd | |||
| c8abc6964a | |||
| 907ee3e63b | |||
| f3ed9c28c7 | |||
| d305a4048d | |||
| 108731b4cf | |||
| e7c648f1d0 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,7 +1,6 @@
|
|||||||
# quick test
|
|
||||||
quick.ps1
|
|
||||||
|
|
||||||
lib/*.psd1
|
lib/*.psd1
|
||||||
**/*.log
|
**/*.log
|
||||||
|
|
||||||
config.psd1
|
config.psd1
|
||||||
|
|
||||||
|
test-*.ps1
|
||||||
14
.vscode/launch.json
vendored
14
.vscode/launch.json
vendored
@@ -51,21 +51,9 @@
|
|||||||
"type": "PowerShell",
|
"type": "PowerShell",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"cwd": "${workspaceRoot}",
|
"cwd": "${workspaceRoot}",
|
||||||
"script": "${workspaceFolder}/tests/pre-commit.ps1",
|
"script": "${workspaceFolder}/tests/run.ps1",
|
||||||
"args": [],
|
"args": [],
|
||||||
"createTemporaryIntegratedConsole": true
|
"createTemporaryIntegratedConsole": true
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "PowerShell: Launch Quick Test",
|
|
||||||
"type": "PowerShell",
|
|
||||||
"request": "launch",
|
|
||||||
"cwd": "${workspaceRoot}",
|
|
||||||
"script": "${workspaceFolder}/quick.ps1",
|
|
||||||
"args": [
|
|
||||||
"-Verbose",
|
|
||||||
"-Debug"
|
|
||||||
],
|
|
||||||
"createTemporaryIntegratedConsole": true
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -9,7 +9,23 @@ Before any major/minor/patch is released all test units will be run to verify th
|
|||||||
|
|
||||||
## [Unreleased] These changes have not been added to PSGallery yet
|
## [Unreleased] These changes have not been added to PSGallery yet
|
||||||
|
|
||||||
## [3.2.0]
|
### Added
|
||||||
|
|
||||||
|
- IRemote base class
|
||||||
|
- ArrayMember classes for array-like properties
|
||||||
|
- Patch class
|
||||||
|
|
||||||
|
## [3.3.0] - 2024-06-29
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add a timeout (2s) to the login function. If timeout exceeded a VMRemoteError is thrown.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Launch x64 bit GUIs for all kinds if on 64 bit system.
|
||||||
|
|
||||||
|
## [3.2.0] - 2023-08-17
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
@@ -21,10 +37,10 @@ Before any major/minor/patch is released all test units will be run to verify th
|
|||||||
|
|
||||||
- All CAPIErrors are now exposed to the consumer.
|
- All CAPIErrors are now exposed to the consumer.
|
||||||
- The function name and error code can be retrieved using [CAPIError].function and [CAPIError].code
|
- The function name and error code can be retrieved using [CAPIError].function and [CAPIError].code
|
||||||
- Set_By_Script now throws [VMError] if script length exceeds 48kB.
|
- Set_By_Script now throws [VMRemoteError] if script length exceeds 48kB.
|
||||||
- parameter range checks in Vban class.
|
- parameter range checks in Vban class.
|
||||||
|
|
||||||
## [3.1.0]
|
## [3.1.0] - 2023-08-15
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
@@ -33,7 +49,7 @@ Before any major/minor/patch is released all test units will be run to verify th
|
|||||||
- More Recorder commands implemented. See Recorder section in README.
|
- More Recorder commands implemented. See Recorder section in README.
|
||||||
- RunMacrobuttons, CloseMacrobuttons added to Special class
|
- RunMacrobuttons, CloseMacrobuttons added to Special class
|
||||||
|
|
||||||
## [3.0.0]
|
## [3.0.0] - 2023-08-09
|
||||||
|
|
||||||
v3 introduces some breaking changes. They are as follows:
|
v3 introduces some breaking changes. They are as follows:
|
||||||
|
|
||||||
|
|||||||
45
README.md
45
README.md
@@ -8,9 +8,9 @@ For past/future changes to this project refer to: [CHANGELOG](CHANGELOG.md)
|
|||||||
|
|
||||||
## Tested against
|
## Tested against
|
||||||
|
|
||||||
- Basic 1.0.8.8
|
- Basic 1.1.1.1
|
||||||
- Banana 2.0.6.8
|
- Banana 2.1.1.1
|
||||||
- Potato 3.0.2.8
|
- Potato 3.1.1.1
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
@@ -402,6 +402,8 @@ The following commands are available:
|
|||||||
The following methods are available:
|
The following methods are available:
|
||||||
|
|
||||||
- Load($filepath): string
|
- Load($filepath): string
|
||||||
|
- RunMacrobuttons(): Launches the macrobuttons app
|
||||||
|
- CloseMacrobuttons(): Closes the macrobuttons app
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -411,6 +413,31 @@ $vmr.command.show
|
|||||||
$vmr.command.lock = $true
|
$vmr.command.lock = $true
|
||||||
|
|
||||||
$vmr.command.Load("path/to/filename.xml")
|
$vmr.command.Load("path/to/filename.xml")
|
||||||
|
|
||||||
|
$vmr.command.RunMacrobuttons()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Patch
|
||||||
|
|
||||||
|
The following Patch commands are available:
|
||||||
|
|
||||||
|
- postFaderComposite: bool
|
||||||
|
- postFxInsert: bool
|
||||||
|
|
||||||
|
The following Patch members have .Set($val) and .Get() available:
|
||||||
|
|
||||||
|
- asio[i]: int, from 0 to ASIO input channels
|
||||||
|
- OutA2[i]-OutA5[i]: int, from 0 to ASIO output channels
|
||||||
|
- composite[i]: int, from 0 to strip channels
|
||||||
|
- insert[i]: bool
|
||||||
|
|
||||||
|
for example:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.patch.asio[3].set(2) # patches ASIO input channel 2 (2) to strip 2, channel 2 (3)
|
||||||
|
$vmr.patch.OutA3[0].set(24) # patches bus A3, channel 1 (0) to ASIO output channel 24
|
||||||
|
$vmr.patch.composite[5].set(0) # sets composite channel 6 (5) to default bus channel
|
||||||
|
$vmr.patch.insert[4].get()
|
||||||
```
|
```
|
||||||
|
|
||||||
### Recorder
|
### Recorder
|
||||||
@@ -553,17 +580,17 @@ Access to lower level polling functions are provided with these functions:
|
|||||||
|
|
||||||
### Run tests
|
### Run tests
|
||||||
|
|
||||||
Run tests using .\tests\pre-commit.ps1 which accepts the following parameters:
|
Parameters:
|
||||||
|
|
||||||
- `kind`: Run tests of this kind
|
- `kind`: Run tests of this kind
|
||||||
- `tag`: Run tests tagged with this marker (currently `higher` or `lower`)
|
- `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
|
### Official Documentation
|
||||||
|
|
||||||
- [Voicemeeter Remote C API](https://github.com/onyx-and-iris/Voicemeeter-SDK/blob/update-docs/VoicemeeterRemoteAPI.pdf)
|
- [Voicemeeter Remote C API](https://github.com/onyx-and-iris/Voicemeeter-SDK/blob/main/VoicemeeterRemoteAPI.pdf)
|
||||||
|
|||||||
11
Taskfile.yaml
Normal file
11
Taskfile.yaml
Normal 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}}"
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
[cmdletbinding()]
|
[cmdletbinding()]
|
||||||
param(
|
param(
|
||||||
[switch]$interactive,
|
[switch]$interactive,
|
||||||
[String]$kind = "banana",
|
[String]$kind = 'banana',
|
||||||
[String[]]$script = @()
|
[String[]]$script = @()
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -20,20 +20,20 @@ function get-value {
|
|||||||
|
|
||||||
function msgHandler {
|
function msgHandler {
|
||||||
param([object]$vmr, [string]$line)
|
param([object]$vmr, [string]$line)
|
||||||
$line + " passed to handler" | Write-Debug
|
$line + ' passed to handler' | Write-Debug
|
||||||
if ($line[0] -eq "!") {
|
if ($line[0] -eq '!') {
|
||||||
"Toggling " + $line.substring(1) | Write-Debug
|
'Toggling ' + $line.substring(1) | Write-Debug
|
||||||
$retval = get-value -vmr $vmr -line $line.substring(1)
|
$retval = get-value -vmr $vmr -line $line.substring(1)
|
||||||
$vmr.Setter($line.substring(1), 1 - $retval)
|
$vmr.Setter($line.substring(1), 1 - $retval)
|
||||||
}
|
}
|
||||||
elseif ($line.Contains("=")) {
|
elseif ($line.Contains('=')) {
|
||||||
"Setting $line" | Write-Debug
|
"Setting $line" | Write-Debug
|
||||||
$vmr.SendText($line)
|
$vmr.SendText($line)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
"Getting $line" | Write-Debug
|
"Getting $line" | Write-Debug
|
||||||
$retval = get-value -vmr $vmr -line $line
|
$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
|
$vmr = Connect-Voicemeeter -Kind $kind
|
||||||
|
|
||||||
if ($interactive) {
|
if ($interactive) {
|
||||||
"Press <Enter> to exit" | Write-Host
|
'Press <Enter> to exit' | Write-Host
|
||||||
read-hostuntilempty -vmr $vmr
|
read-hostuntilempty -vmr $vmr
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ param()
|
|||||||
Import-Module ..\..\lib\Voicemeeter.psm1
|
Import-Module ..\..\lib\Voicemeeter.psm1
|
||||||
|
|
||||||
try {
|
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 = @($vmr.bus[1], $vmr.bus[2], $vmr.bus[4], $vmr.bus[6])
|
||||||
"Buses in selection: $($buses)"
|
"Buses in selection: $($buses)"
|
||||||
$unmutedIndex = $null
|
$unmutedIndex = $null
|
||||||
|
|
||||||
# 1)
|
# 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) {
|
foreach ($bus in $buses) {
|
||||||
# 2)
|
# 2)
|
||||||
if (-not $bus.mute) {
|
if (-not $bus.mute) {
|
||||||
|
|||||||
@@ -6,28 +6,28 @@ Import-Module obs-powershell
|
|||||||
|
|
||||||
function CurrentProgramSceneChanged {
|
function CurrentProgramSceneChanged {
|
||||||
param([System.Object]$data)
|
param([System.Object]$data)
|
||||||
Write-Host "Switched to scene", $data.sceneName
|
Write-Host 'Switched to scene', $data.sceneName
|
||||||
|
|
||||||
switch ($data.sceneName) {
|
switch ($data.sceneName) {
|
||||||
"START" {
|
'START' {
|
||||||
$vmr.strip[0].mute = !$vmr.strip[0].mute
|
$vmr.strip[0].mute = !$vmr.strip[0].mute
|
||||||
}
|
}
|
||||||
"BRB" {
|
'BRB' {
|
||||||
$vmr.strip[0].gain = -8.3
|
$vmr.strip[0].gain = -8.3
|
||||||
}
|
}
|
||||||
"END" {
|
'END' {
|
||||||
$vmr.strip[0].mono = $true
|
$vmr.strip[0].mono = $true
|
||||||
}
|
}
|
||||||
"LIVE" {
|
'LIVE' {
|
||||||
$vmr.strip[0].color_x = 0.3
|
$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 {
|
function ExitStarted {
|
||||||
param([System.Object]$data)
|
param([System.Object]$data)
|
||||||
"OBS shutdown has begun!" | Write-Host
|
'OBS shutdown has begun!' | Write-Host
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,12 +38,12 @@ function eventHandler($data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ConnFromFile {
|
function ConnFromFile {
|
||||||
$configpath = Join-Path $PSScriptRoot "config.psd1"
|
$configpath = Join-Path $PSScriptRoot 'config.psd1'
|
||||||
return Import-PowerShellDataFile -Path $configpath
|
return Import-PowerShellDataFile -Path $configpath
|
||||||
}
|
}
|
||||||
|
|
||||||
function main {
|
function main {
|
||||||
$vmr = Connect-Voicemeeter -Kind "basic"
|
$vmr = Connect-Voicemeeter -Kind 'basic'
|
||||||
|
|
||||||
$conn = ConnFromFile
|
$conn = ConnFromFile
|
||||||
$job = Watch-OBS -WebSocketURI "ws://$($conn.host):$($conn.port)" -WebSocketToken $conn.password
|
$job = Watch-OBS -WebSocketURI "ws://$($conn.host):$($conn.port)" -WebSocketToken $conn.password
|
||||||
|
|||||||
125
examples/streamdeck/README.md
Normal file
125
examples/streamdeck/README.md
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
# About
|
||||||
|
|
||||||
|
Thanks to the guys at [Start Automating](https://startautomating.com/) it's possible to use this module straight from your Stream Deck.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
### ScriptDeck
|
||||||
|
|
||||||
|
*Windows Powershell*
|
||||||
|
|
||||||
|
- [Windows ScriptDeck](https://marketplace.elgato.com/product/windows-scriptdeck-857f01dd-8fd4-44d5-8ec7-67ac850b21d3)
|
||||||
|
|
||||||
|
*Powershell core*
|
||||||
|
|
||||||
|
- [ScriptDeck](https://marketplace.elgato.com/product/scriptdeck-927e59aa-b42d-4da7-84cc-8c78f4dd7e18)
|
||||||
|
|
||||||
|
Note, even though one of them is named Windows they both work on Windows for different powershell versions, see [this issue](https://github.com/StartAutomating/ScriptDeck/issues/120)
|
||||||
|
|
||||||
|
### Voicemeeter API Powershell
|
||||||
|
|
||||||
|
- Install it as a module, see [Installation](https://github.com/onyx-and-iris/voicemeeter-api-powershell?tab=readme-ov-file#installation)
|
||||||
|
|
||||||
|
## How
|
||||||
|
|
||||||
|
Once ScriptDeck is installed create a button using *Powershell Script*, then:
|
||||||
|
|
||||||
|
### On one button
|
||||||
|
|
||||||
|
Due to the design of Voicemeeter's API you may only login/logout once per session so in order to program multiple buttons you must do the following for just ONE button (it can be any button).
|
||||||
|
|
||||||
|
#### Button 1
|
||||||
|
|
||||||
|
*When Loaded*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$global:vmr = Connect-Voicemeeter -Kind "banana"
|
||||||
|
```
|
||||||
|
|
||||||
|
*When Unloaded*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Disconnect-Voicemeeter
|
||||||
|
```
|
||||||
|
|
||||||
|
*When Pressed*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
if ($vmr.strip[0].mute) {
|
||||||
|
$vmr.bus[0].mute=1
|
||||||
|
$vmr.bus[1].mute=1
|
||||||
|
} else {
|
||||||
|
$vmr.bus[0].mute=0
|
||||||
|
$vmr.bus[1].mute=0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Other buttons
|
||||||
|
|
||||||
|
Then your other buttons can have any scripts using the `$vmr` object:
|
||||||
|
|
||||||
|
#### Button 2
|
||||||
|
|
||||||
|
*When Pressed*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.strip[1].mute=1
|
||||||
|
$vmr.strip[2].mute=1
|
||||||
|
|
||||||
|
if (-not $vmr.strip[0].mute) {
|
||||||
|
$vmr.strip[0].mute=1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Button 3
|
||||||
|
|
||||||
|
*When Pressed*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.strip[0].mute=$(-not $vmr.strip[0].mute)
|
||||||
|
$vmr.strip[1].mute=$(-not $vmr.strip[1].mute)
|
||||||
|
$vmr.strip[2].mute=$(-not $vmr.strip[2].mute)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Then let's say you have zillions of buttons you want to program, for each Stream Deck window configure ONE button as described above and the other buttons of the same window as described above.
|
||||||
|
|
||||||
|
If this explanation is unclear or you'd like me to add some screenshots just ask.
|
||||||
|
|
||||||
|
## Leveraging Powershell
|
||||||
|
|
||||||
|
Since we're now working with Powershell we can do some useful things, for example, lets create a button that interacts with Voicemeeter and OBS:
|
||||||
|
|
||||||
|
First make sure you've installed [obs-powershell](https://github.com/StartAutomating/obs-powershell).
|
||||||
|
|
||||||
|
Now let's create a button that only toggles some strip mutes if the current OBS scene is "LIVE".
|
||||||
|
|
||||||
|
#### Button
|
||||||
|
|
||||||
|
*When Loaded*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$global:vmr = Connect-Voicemeeter -Kind "banana"
|
||||||
|
|
||||||
|
Connect-OBS -WebSocketToken <websocket token>
|
||||||
|
```
|
||||||
|
|
||||||
|
*When Unloaded*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Disconnect-Voicemeeter
|
||||||
|
Disconnect-OBS
|
||||||
|
```
|
||||||
|
|
||||||
|
*When Pressed*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$currentScene = $(Get-OBSCurrentProgramScene | Select-Object -ExpandProperty currentProgramSceneName)
|
||||||
|
|
||||||
|
if ($currentScene -eq "LIVE") {
|
||||||
|
$vmr.strip[0].mute=$(-not $vmr.strip[0].mute)
|
||||||
|
$vmr.strip[1].mute=$(-not $vmr.strip[1].mute)
|
||||||
|
$vmr.strip[2].mute=$(-not $vmr.strip[2].mute)
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -2,12 +2,15 @@
|
|||||||
. $PSScriptRoot\meta.ps1
|
. $PSScriptRoot\meta.ps1
|
||||||
. $PSScriptRoot\base.ps1
|
. $PSScriptRoot\base.ps1
|
||||||
. $PSScriptRoot\kinds.ps1
|
. $PSScriptRoot\kinds.ps1
|
||||||
|
. $PSScriptRoot\iremote.ps1
|
||||||
|
. $PSScriptRoot\arraymember.ps1
|
||||||
. $PSScriptRoot\strip.ps1
|
. $PSScriptRoot\strip.ps1
|
||||||
. $PSScriptRoot\bus.ps1
|
. $PSScriptRoot\bus.ps1
|
||||||
. $PSScriptRoot\macrobuttons.ps1
|
. $PSScriptRoot\macrobuttons.ps1
|
||||||
. $PSScriptRoot\vban.ps1
|
. $PSScriptRoot\vban.ps1
|
||||||
. $PSScriptRoot\command.ps1
|
. $PSScriptRoot\command.ps1
|
||||||
. $PSScriptRoot\recorder.ps1
|
. $PSScriptRoot\recorder.ps1
|
||||||
|
. $PSScriptRoot\patch.ps1
|
||||||
. $PSScriptRoot\profiles.ps1
|
. $PSScriptRoot\profiles.ps1
|
||||||
|
|
||||||
class Remote {
|
class Remote {
|
||||||
@@ -22,7 +25,7 @@ class Remote {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[string] ToString() {
|
[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() {
|
[Remote] Login() {
|
||||||
@@ -77,6 +80,7 @@ class RemoteBasic : Remote {
|
|||||||
[System.Collections.ArrayList]$button
|
[System.Collections.ArrayList]$button
|
||||||
[PSCustomObject]$vban
|
[PSCustomObject]$vban
|
||||||
[Object]$command
|
[Object]$command
|
||||||
|
[Object]$patch
|
||||||
|
|
||||||
RemoteBasic () : base ('basic') {
|
RemoteBasic () : base ('basic') {
|
||||||
$this.strip = Make_Strips($this)
|
$this.strip = Make_Strips($this)
|
||||||
@@ -84,6 +88,7 @@ class RemoteBasic : Remote {
|
|||||||
$this.button = Make_Buttons
|
$this.button = Make_Buttons
|
||||||
$this.vban = Make_Vban($this)
|
$this.vban = Make_Vban($this)
|
||||||
$this.command = Make_Command($this)
|
$this.command = Make_Command($this)
|
||||||
|
$this.patch = Make_Patch($this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,6 +98,7 @@ class RemoteBanana : Remote {
|
|||||||
[System.Collections.ArrayList]$button
|
[System.Collections.ArrayList]$button
|
||||||
[PSCustomObject]$vban
|
[PSCustomObject]$vban
|
||||||
[Object]$command
|
[Object]$command
|
||||||
|
[Object]$patch
|
||||||
[Object]$recorder
|
[Object]$recorder
|
||||||
|
|
||||||
RemoteBanana () : base ('banana') {
|
RemoteBanana () : base ('banana') {
|
||||||
@@ -101,6 +107,7 @@ class RemoteBanana : Remote {
|
|||||||
$this.button = Make_Buttons
|
$this.button = Make_Buttons
|
||||||
$this.vban = Make_Vban($this)
|
$this.vban = Make_Vban($this)
|
||||||
$this.command = Make_Command($this)
|
$this.command = Make_Command($this)
|
||||||
|
$this.patch = Make_Patch($this)
|
||||||
$this.recorder = Make_Recorder($this)
|
$this.recorder = Make_Recorder($this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,6 +118,7 @@ class RemotePotato : Remote {
|
|||||||
[System.Collections.ArrayList]$button
|
[System.Collections.ArrayList]$button
|
||||||
[PSCustomObject]$vban
|
[PSCustomObject]$vban
|
||||||
[Object]$command
|
[Object]$command
|
||||||
|
[Object]$patch
|
||||||
[Object]$recorder
|
[Object]$recorder
|
||||||
|
|
||||||
RemotePotato () : base ('potato') {
|
RemotePotato () : base ('potato') {
|
||||||
@@ -119,6 +127,7 @@ class RemotePotato : Remote {
|
|||||||
$this.button = Make_Buttons
|
$this.button = Make_Buttons
|
||||||
$this.vban = Make_Vban($this)
|
$this.vban = Make_Vban($this)
|
||||||
$this.command = Make_Command($this)
|
$this.command = Make_Command($this)
|
||||||
|
$this.patch = Make_Patch($this)
|
||||||
$this.recorder = Make_Recorder($this)
|
$this.recorder = Make_Recorder($this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,13 +147,13 @@ Function Get-RemotePotato {
|
|||||||
Function Connect-Voicemeeter {
|
Function Connect-Voicemeeter {
|
||||||
param([String]$Kind)
|
param([String]$Kind)
|
||||||
switch ($Kind) {
|
switch ($Kind) {
|
||||||
"basic" {
|
'basic' {
|
||||||
return Get-RemoteBasic
|
return Get-RemoteBasic
|
||||||
}
|
}
|
||||||
"banana" {
|
'banana' {
|
||||||
return Get-RemoteBanana
|
return Get-RemoteBanana
|
||||||
}
|
}
|
||||||
"potato" {
|
'potato' {
|
||||||
return Get-RemotePotato
|
return Get-RemotePotato
|
||||||
}
|
}
|
||||||
default {
|
default {
|
||||||
|
|||||||
64
lib/arraymember.ps1
Normal file
64
lib/arraymember.ps1
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
class ArrayMember : IRemote {
|
||||||
|
[string]$prefix
|
||||||
|
[Object]$parent
|
||||||
|
|
||||||
|
ArrayMember (
|
||||||
|
[int]$index, [string]$prefix, [Object]$parent
|
||||||
|
) : base ($index, $parent.remote) {
|
||||||
|
$this.prefix = $prefix
|
||||||
|
$this.parent = $parent
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] identifier () {
|
||||||
|
$parentId = $this.parent.identifier()
|
||||||
|
return "{0}.{1}[{2}]" -f $parentId, $this.prefix, $this.index
|
||||||
|
}
|
||||||
|
|
||||||
|
[void] Set ($val) {
|
||||||
|
$this.Setter('', $val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class BoolArrayMember : ArrayMember {
|
||||||
|
BoolArrayMember (
|
||||||
|
[int]$index, [string]$prefix, [Object]$parent
|
||||||
|
) : base ($index, $prefix, $parent) {}
|
||||||
|
|
||||||
|
[bool] Get () {
|
||||||
|
return [bool]$this.Getter('')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class IntArrayMember : ArrayMember {
|
||||||
|
IntArrayMember (
|
||||||
|
[int]$index, [string]$prefix, [Object]$parent
|
||||||
|
) : base ($index, $prefix, $parent) {}
|
||||||
|
|
||||||
|
[int] Get () {
|
||||||
|
return [int]$this.Getter('')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FloatArrayMember : ArrayMember {
|
||||||
|
[int]$decimals
|
||||||
|
|
||||||
|
FloatArrayMember (
|
||||||
|
[int]$index, [string]$prefix, [Object]$parent, [int]$decimals = 1
|
||||||
|
) : base ($index, $prefix, $parent) {
|
||||||
|
$this.decimals = $decimals
|
||||||
|
}
|
||||||
|
|
||||||
|
[double] Get () {
|
||||||
|
return [math]::Round($this.Getter(''), $this.decimals)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class StringArrayMember : ArrayMember {
|
||||||
|
StringArrayMember (
|
||||||
|
[int]$index, [string]$prefix, [Object]$parent
|
||||||
|
) : base ($index, $prefix, $parent) {}
|
||||||
|
|
||||||
|
[string] Get () {
|
||||||
|
return [string]$this.Getter_String('')
|
||||||
|
}
|
||||||
|
}
|
||||||
76
lib/base.ps1
76
lib/base.ps1
@@ -7,30 +7,49 @@ function Login {
|
|||||||
)
|
)
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_Login()
|
$retval = [int][Voicemeeter.Remote]::VBVMR_Login()
|
||||||
if ($retval -notin @(0, 1, -2)) {
|
if ($retval -notin @(0, 1, -2)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_Login")
|
throw [CAPIError]::new($retval, 'VBVMR_Login')
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ($retval) {
|
switch ($retval) {
|
||||||
1 {
|
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
|
RunVoicemeeter -kindId $kindId
|
||||||
}
|
}
|
||||||
-2 {
|
-2 {
|
||||||
throw [LoginError]::new("Login may only be called once per session.")
|
throw [LoginError]::new('Login may only be called once per session.')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$timeout = New-TimeSpan -Seconds 2
|
||||||
|
$sw = [diagnostics.stopwatch]::StartNew()
|
||||||
|
$exception = $null
|
||||||
|
do {
|
||||||
|
Start-Sleep -m 100
|
||||||
|
try {
|
||||||
|
'Successfully logged into Voicemeeter [' + $(VmType).ToUpper() + '] Version ' + $(VmVersion) | Write-Verbose
|
||||||
|
$exception = $null
|
||||||
|
break
|
||||||
|
}
|
||||||
|
catch [CAPIError] {
|
||||||
|
$exception = $_
|
||||||
|
$exception | Write-Debug
|
||||||
|
}
|
||||||
|
} while ($sw.elapsed -lt $timeout)
|
||||||
|
|
||||||
|
if ($null -ne $exception) {
|
||||||
|
throw [VMRemoteError]::new('Timeout logging into the API.')
|
||||||
|
}
|
||||||
|
|
||||||
while (P_Dirty -or M_Dirty) { Start-Sleep -m 1 }
|
while (P_Dirty -or M_Dirty) { Start-Sleep -m 1 }
|
||||||
"Successfully logged into Voicemeeter [" + $(VmType).ToUpper() + "] Version " + $(VmVersion) | Write-Verbose
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Logout {
|
function Logout {
|
||||||
Start-Sleep -m 100
|
Start-Sleep -m 100
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_Logout()
|
$retval = [int][Voicemeeter.Remote]::VBVMR_Logout()
|
||||||
if ($retval -notin @(0)) {
|
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 {
|
function RunVoicemeeter {
|
||||||
@@ -38,22 +57,21 @@ function RunVoicemeeter {
|
|||||||
[string]$kindId
|
[string]$kindId
|
||||||
)
|
)
|
||||||
$kinds = @{
|
$kinds = @{
|
||||||
"basic" = 1
|
'basic' = $(if ([Environment]::Is64BitOperatingSystem) { 4 } else { 1 })
|
||||||
"banana" = 2
|
'banana' = $(if ([Environment]::Is64BitOperatingSystem) { 5 } else { 2 })
|
||||||
"potato" = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 })
|
'potato' = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 })
|
||||||
}
|
}
|
||||||
|
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_RunVoicemeeter([int64]$kinds[$kindId])
|
$retval = [int][Voicemeeter.Remote]::VBVMR_RunVoicemeeter([int64]$kinds[$kindId])
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_RunVoicemeeter")
|
throw [CAPIError]::new($retval, 'VBVMR_RunVoicemeeter')
|
||||||
}
|
}
|
||||||
Start-Sleep -s 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function P_Dirty {
|
function P_Dirty {
|
||||||
$retval = [Voicemeeter.Remote]::VBVMR_IsParametersDirty()
|
$retval = [Voicemeeter.Remote]::VBVMR_IsParametersDirty()
|
||||||
if ($retval -notin @(0, 1)) {
|
if ($retval -notin @(0, 1)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_RunVoicemeeter")
|
throw [CAPIError]::new($retval, 'VBVMR_IsParametersDirty')
|
||||||
}
|
}
|
||||||
[bool]$retval
|
[bool]$retval
|
||||||
}
|
}
|
||||||
@@ -61,7 +79,7 @@ function P_Dirty {
|
|||||||
function M_Dirty {
|
function M_Dirty {
|
||||||
$retval = [Voicemeeter.Remote]::VBVMR_MacroButton_IsDirty()
|
$retval = [Voicemeeter.Remote]::VBVMR_MacroButton_IsDirty()
|
||||||
if ($retval -notin @(0, 1)) {
|
if ($retval -notin @(0, 1)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_RunVoicemeeter")
|
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_IsDirty')
|
||||||
}
|
}
|
||||||
[bool]$retval
|
[bool]$retval
|
||||||
}
|
}
|
||||||
@@ -70,12 +88,12 @@ function VmType {
|
|||||||
New-Variable -Name ptr -Value 0
|
New-Variable -Name ptr -Value 0
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterType([ref]$ptr)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterType([ref]$ptr)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_GetVoicemeeterType")
|
throw [CAPIError]::new($retval, 'VBVMR_GetVoicemeeterType')
|
||||||
}
|
}
|
||||||
switch ($ptr) {
|
switch ($ptr) {
|
||||||
1 { return "basic" }
|
1 { return 'basic' }
|
||||||
2 { return "banana" }
|
2 { return 'banana' }
|
||||||
3 { return "potato" }
|
3 { return 'potato' }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +101,7 @@ function VmVersion {
|
|||||||
New-Variable -Name ptr -Value 0
|
New-Variable -Name ptr -Value 0
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterVersion([ref]$ptr)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterVersion([ref]$ptr)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_GetVoicemeeterVersion")
|
throw [CAPIError]::new($retval, 'VBVMR_GetVoicemeeterVersion')
|
||||||
}
|
}
|
||||||
$v1 = ($ptr -band 0xFF000000) -shr 24
|
$v1 = ($ptr -band 0xFF000000) -shr 24
|
||||||
$v2 = ($ptr -band 0x00FF0000) -shr 16
|
$v2 = ($ptr -band 0x00FF0000) -shr 16
|
||||||
@@ -104,7 +122,7 @@ function Param_Get {
|
|||||||
$BYTES = [System.Byte[]]::new(512)
|
$BYTES = [System.Byte[]]::new(512)
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterStringA($PARAM, $BYTES)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterStringA($PARAM, $BYTES)
|
||||||
if ($retval -notin @(0)) {
|
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)
|
[System.Text.Encoding]::ASCII.GetString($BYTES).Trim([char]0)
|
||||||
}
|
}
|
||||||
@@ -112,7 +130,7 @@ function Param_Get {
|
|||||||
New-Variable -Name ptr -Value 0.0
|
New-Variable -Name ptr -Value 0.0
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterFloat($PARAM, [ref]$ptr)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterFloat($PARAM, [ref]$ptr)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_GetParameterFloat")
|
throw [CAPIError]::new($retval, 'VBVMR_GetParameterFloat')
|
||||||
}
|
}
|
||||||
[single]$ptr
|
[single]$ptr
|
||||||
}
|
}
|
||||||
@@ -125,13 +143,13 @@ function Param_Set {
|
|||||||
if ($VALUE -is [string]) {
|
if ($VALUE -is [string]) {
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterStringA($PARAM, $VALUE)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterStringA($PARAM, $VALUE)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_SetParameterStringA")
|
throw [CAPIError]::new($retval, 'VBVMR_SetParameterStringA')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterFloat($PARAM, $VALUE)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterFloat($PARAM, $VALUE)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_SetParameterFloat")
|
throw [CAPIError]::new($retval, 'VBVMR_SetParameterFloat')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,7 +160,7 @@ function MB_Set {
|
|||||||
)
|
)
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_SetStatus($ID, $SET, $MODE)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_SetStatus($ID, $SET, $MODE)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_MacroButton_SetStatus")
|
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_SetStatus')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +174,7 @@ function MB_Get {
|
|||||||
New-Variable -Name ptr -Value 0.0
|
New-Variable -Name ptr -Value 0.0
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_GetStatus($ID, [ref]$ptr, $MODE)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_GetStatus($ID, [ref]$ptr, $MODE)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, $MyInvocation.MyCommand)
|
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_GetStatus')
|
||||||
}
|
}
|
||||||
[int]$ptr
|
[int]$ptr
|
||||||
}
|
}
|
||||||
@@ -166,8 +184,8 @@ function Param_Set_Multi {
|
|||||||
[hashtable]$HASH
|
[hashtable]$HASH
|
||||||
)
|
)
|
||||||
foreach ($key in $HASH.keys) {
|
foreach ($key in $HASH.keys) {
|
||||||
$classobj, $m2, $m3 = $key.Split("_")
|
$classobj, $m2, $m3 = $key.Split('_')
|
||||||
if ($m2 -match "^\d+$") { $index = [int]$m2 } else { $index = [int]$m3 }
|
if ($m2 -match '^\d+$') { $index = [int]$m2 } else { $index = [int]$m3 }
|
||||||
|
|
||||||
foreach ($h in $HASH[$key].GetEnumerator()) {
|
foreach ($h in $HASH[$key].GetEnumerator()) {
|
||||||
$property = $h.Name
|
$property = $h.Name
|
||||||
@@ -189,11 +207,11 @@ function Set_By_Script {
|
|||||||
[string]$script
|
[string]$script
|
||||||
)
|
)
|
||||||
if ($script.Length -gt 48000) {
|
if ($script.Length -gt 48000) {
|
||||||
throw [VMError]::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)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameters($script)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_SetParameters")
|
throw [CAPIError]::new($retval, 'VBVMR_SetParameters')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,7 +222,7 @@ function Get_Level {
|
|||||||
New-Variable -Name ptr -Value 0.0
|
New-Variable -Name ptr -Value 0.0
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetLevel($MODE, $INDEX, [ref]$ptr)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetLevel($MODE, $INDEX, [ref]$ptr)
|
||||||
if ($retval -notin @(0)) {
|
if ($retval -notin @(0)) {
|
||||||
throw [CAPIError]::new($retval, "VBVMR_GetLevel")
|
throw [CAPIError]::new($retval, 'VBVMR_GetLevel')
|
||||||
}
|
}
|
||||||
[float]$ptr
|
[float]$ptr
|
||||||
}
|
}
|
||||||
@@ -3,9 +3,9 @@
|
|||||||
function Setup_DLL {
|
function Setup_DLL {
|
||||||
$VMPATH = Get_VMPath
|
$VMPATH = Get_VMPath
|
||||||
|
|
||||||
$dll = Join-Path -Path $VMPATH -ChildPath ("VoicemeeterRemote" + `
|
$dll = Join-Path -Path $VMPATH -ChildPath ('VoicemeeterRemote' + `
|
||||||
(& { if ([Environment]::Is64BitOperatingSystem) { "64" } else { "" } }) + `
|
(& { if ([Environment]::Is64BitOperatingSystem) { '64' } else { '' } }) + `
|
||||||
".dll")
|
'.dll')
|
||||||
|
|
||||||
$Signature = @"
|
$Signature = @"
|
||||||
[DllImport(@"$dll")]
|
[DllImport(@"$dll")]
|
||||||
|
|||||||
56
lib/bus.ps1
56
lib/bus.ps1
@@ -1,40 +1,4 @@
|
|||||||
class IBus {
|
class Bus : IRemote {
|
||||||
[int]$index
|
|
||||||
[Object]$remote
|
|
||||||
|
|
||||||
IBus ([int]$index, [Object]$remote) {
|
|
||||||
$this.index = $index
|
|
||||||
$this.remote = $remote
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] identifier () {
|
|
||||||
return "Bus[" + $this.index + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
[single] Getter ($param) {
|
|
||||||
$this.ToString() + " Getter: $($this.Cmd($param))" | Write-Debug
|
|
||||||
return $this.remote.Getter($this.Cmd($param))
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Getter_String ($param) {
|
|
||||||
$this.ToString() + " Getter_String: $($this.Cmd($param))" | Write-Debug
|
|
||||||
return $this.remote.Getter_String($this.Cmd($param))
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Setter ($param, $val) {
|
|
||||||
$this.ToString() + " Setter: $($this.Cmd($param))=$val" | Write-Debug
|
|
||||||
$this.remote.Setter($this.Cmd($param), $val)
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Cmd ($param) {
|
|
||||||
if ([string]::IsNullOrEmpty($param)) {
|
|
||||||
return $this.identifier()
|
|
||||||
}
|
|
||||||
return "$($this.identifier()).$param"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Bus : IBus {
|
|
||||||
[Object]$mode
|
[Object]$mode
|
||||||
[Object]$eq
|
[Object]$eq
|
||||||
[Object]$levels
|
[Object]$levels
|
||||||
@@ -49,8 +13,8 @@ class Bus : IBus {
|
|||||||
$this.levels = [BusLevels]::new($index, $remote)
|
$this.levels = [BusLevels]::new($index, $remote)
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] ToString() {
|
[string] identifier () {
|
||||||
return $this.GetType().Name + $this.index
|
return 'Bus[' + $this.index + ']'
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] FadeTo ([single]$target, [int]$time) {
|
[void] FadeTo ([single]$target, [int]$time) {
|
||||||
@@ -62,7 +26,7 @@ class Bus : IBus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BusLevels : IBus {
|
class BusLevels : IRemote {
|
||||||
[int]$init
|
[int]$init
|
||||||
[int]$offset
|
[int]$offset
|
||||||
|
|
||||||
@@ -93,7 +57,7 @@ class BusLevels : IBus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BusMode : IBus {
|
class BusMode : IRemote {
|
||||||
[System.Collections.ArrayList]$modes
|
[System.Collections.ArrayList]$modes
|
||||||
|
|
||||||
BusMode ([int]$index, [Object]$remote) : base ($index, $remote) {
|
BusMode ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
@@ -106,7 +70,7 @@ class BusMode : IBus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Bus[" + $this.index + "].mode"
|
return 'Bus[' + $this.index + '].mode'
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] Get () {
|
[string] Get () {
|
||||||
@@ -119,13 +83,13 @@ class BusMode : IBus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BusEq : IBus {
|
class BusEq : IRemote {
|
||||||
BusEq ([int]$index, [Object]$remote) : base ($index, $remote) {
|
BusEq ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
AddBoolMembers -PARAMS @('on', 'ab')
|
AddBoolMembers -PARAMS @('on', 'ab')
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Bus[" + $this.index + "].EQ"
|
return 'Bus[' + $this.index + '].EQ'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,12 +101,12 @@ class PhysicalBus : Bus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BusDevice : IBus {
|
class BusDevice : IRemote {
|
||||||
BusDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
|
BusDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Bus[" + $this.index + "].Device"
|
return 'Bus[' + $this.index + '].Device'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||||
|
|||||||
@@ -1,41 +1,20 @@
|
|||||||
class Special {
|
class Special : IRemote {
|
||||||
[Object]$remote
|
Special ([Object]$remote) : base ($remote) {
|
||||||
|
|
||||||
Special ([Object]$remote) {
|
|
||||||
AddActionMembers -PARAMS @('restart', 'shutdown', 'show')
|
AddActionMembers -PARAMS @('restart', 'shutdown', 'show')
|
||||||
|
|
||||||
$this.remote = $remote
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Command"
|
return 'Command'
|
||||||
}
|
|
||||||
|
|
||||||
[string] ToString() {
|
|
||||||
return $this.GetType().Name
|
|
||||||
}
|
|
||||||
|
|
||||||
[single] Getter ($param) {
|
|
||||||
return $this.remote.Getter("$($this.identifier()).$param")
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Setter ($param, $val) {
|
|
||||||
if ($val -is [Boolean]) {
|
|
||||||
$this.remote.Setter("$($this.identifier()).$param", $(if ($val) { 1 } else { 0 }))
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$this.remote.Setter("$($this.identifier()).$param", $val)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] RunMacrobuttons() {
|
[void] RunMacrobuttons() {
|
||||||
"Launching the MacroButtons app" | Write-Verbose
|
'Launching the MacroButtons app' | Write-Verbose
|
||||||
Start-Process -FilePath $(Join-Path -Path $this.remote.vmpath -ChildPath "VoicemeeterMacroButtons.exe")
|
Start-Process -FilePath $(Join-Path -Path $this.remote.vmpath -ChildPath 'VoicemeeterMacroButtons.exe')
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] CloseMacrobuttons() {
|
[void] CloseMacrobuttons() {
|
||||||
"Closing the MacroButtons app" | Write-Verbose
|
'Closing the MacroButtons app' | Write-Verbose
|
||||||
Stop-Process -Name "VoicemeeterMacroButtons"
|
Stop-Process -Name 'VoicemeeterMacroButtons'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_hide = $($this | Add-Member ScriptProperty 'hide' `
|
hidden $_hide = $($this | Add-Member ScriptProperty 'hide' `
|
||||||
|
|||||||
18
lib/inst.ps1
18
lib/inst.ps1
@@ -1,13 +1,19 @@
|
|||||||
function Get_VMPath {
|
function Get_VMPath {
|
||||||
$REG_KEY = "Registry::HKEY_LOCAL_MACHINE\Software" + `
|
$REG_KEY = @(
|
||||||
(& { if ([Environment]::Is64BitOperatingSystem) { "\WOW6432Node" } else { "" } }) + `
|
'Registry::HKEY_LOCAL_MACHINE',
|
||||||
"\Microsoft\Windows\CurrentVersion\Uninstall"
|
'Software',
|
||||||
$VM_KEY = "\VB:Voicemeeter {17359A74-1236-5467}\"
|
(& { if ([Environment]::Is64BitOperatingSystem) { 'WOW6432Node' } else { '' } }),
|
||||||
|
'Microsoft',
|
||||||
|
'Windows',
|
||||||
|
'CurrentVersion',
|
||||||
|
'Uninstall'
|
||||||
|
).Where({ $_ -ne '' }) -Join '\'
|
||||||
|
$VM_KEY = 'VB:Voicemeeter {17359A74-1236-5467}'
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return $(Get-ItemPropertyValue -Path ($REG_KEY + $VM_KEY) -Name UninstallString | Split-Path -Parent)
|
return $(Get-ItemPropertyValue -Path (@($REG_KEY, $VM_KEY) -Join '\') -Name UninstallString | Split-Path -Parent)
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
throw [VMRemoteError]::new("Unable to fetch Voicemeeter path from the Registry.")
|
throw [VMRemoteError]::new('Unable to fetch Voicemeeter path from the Registry.')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
52
lib/iremote.ps1
Normal file
52
lib/iremote.ps1
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
class IRemote {
|
||||||
|
[Nullable[int]]$index
|
||||||
|
[Object]$remote
|
||||||
|
|
||||||
|
IRemote ([Object]$remote) {
|
||||||
|
$this.remote = $remote
|
||||||
|
}
|
||||||
|
|
||||||
|
IRemote ([int]$index, [Object]$remote) {
|
||||||
|
$this.index = $index
|
||||||
|
$this.remote = $remote
|
||||||
|
}
|
||||||
|
|
||||||
|
[single] Getter ($param) {
|
||||||
|
$this.ToString() + " Getter: $($this.Cmd($param))" | Write-Debug
|
||||||
|
return $this.remote.Getter($this.Cmd($param))
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] Getter_String ($param) {
|
||||||
|
$this.ToString() + " Getter_String: $($this.Cmd($param))" | Write-Debug
|
||||||
|
return $this.remote.Getter_String($this.Cmd($param))
|
||||||
|
}
|
||||||
|
|
||||||
|
[void] Setter ($param, $val) {
|
||||||
|
$this.ToString() + " Setter: $($this.Cmd($param))=$val" | Write-Debug
|
||||||
|
if ($val -is [Boolean]) {
|
||||||
|
$this.remote.Setter($this.Cmd($param), $(if ($val) { 1 } else { 0 }))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$this.remote.Setter($this.Cmd($param), $val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] Cmd ($param) {
|
||||||
|
if ([string]::IsNullOrEmpty($param)) {
|
||||||
|
return $this.identifier()
|
||||||
|
}
|
||||||
|
return "$($this.identifier()).$param"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Must be overridden by derived classes
|
||||||
|
[string] identifier () {
|
||||||
|
throw [System.NotImplementedException]::new("$($this.GetType().Name) must override identifier()")
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] ToString() {
|
||||||
|
if ($null -ne $this.index) {
|
||||||
|
return $this.GetType().Name + $this.index
|
||||||
|
}
|
||||||
|
return $this.GetType().Name
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,30 +1,42 @@
|
|||||||
$KindMap = @{
|
$KindMap = @{
|
||||||
"basic" = @{
|
'basic' = @{
|
||||||
"name" = "basic"
|
'name' = 'basic'
|
||||||
"p_in" = 2
|
'p_in' = 2
|
||||||
"v_in" = 1
|
'v_in' = 1
|
||||||
"p_out" = 1
|
'p_out' = 1
|
||||||
"v_out" = 1
|
'v_out' = 1
|
||||||
"vban_in" = 4
|
'asio_in' = 4
|
||||||
"vban_out" = 4
|
'asio_out' = 8
|
||||||
|
'composite' = 0
|
||||||
|
'insert' = 0
|
||||||
|
'vban_in' = 4
|
||||||
|
'vban_out' = 4
|
||||||
};
|
};
|
||||||
"banana" = @{
|
'banana' = @{
|
||||||
"name" = "banana"
|
'name' = 'banana'
|
||||||
"p_in" = 3
|
'p_in' = 3
|
||||||
"v_in" = 2
|
'v_in' = 2
|
||||||
"p_out" = 3
|
'p_out' = 3
|
||||||
"v_out" = 2
|
'v_out' = 2
|
||||||
"vban_in" = 8
|
'asio_in' = 6
|
||||||
"vban_out" = 8
|
'asio_out' = 8
|
||||||
|
'composite' = 8
|
||||||
|
'insert' = 22
|
||||||
|
'vban_in' = 8
|
||||||
|
'vban_out' = 8
|
||||||
};
|
};
|
||||||
"potato" = @{
|
'potato' = @{
|
||||||
"name" = "potato"
|
'name' = 'potato'
|
||||||
"p_in" = 5
|
'p_in' = 5
|
||||||
"v_in" = 3
|
'v_in' = 3
|
||||||
"p_out" = 5
|
'p_out' = 5
|
||||||
"v_out" = 3
|
'v_out' = 3
|
||||||
"vban_in" = 8
|
'asio_in' = 10
|
||||||
"vban_out" = 8
|
'asio_out' = 8
|
||||||
|
'composite' = 8
|
||||||
|
'insert' = 34
|
||||||
|
'vban_in' = 8
|
||||||
|
'vban_out' = 8
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
32
lib/meta.ps1
32
lib/meta.ps1
@@ -5,9 +5,9 @@ function AddBoolMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "[bool]`$this.Getter('{0}')" -f $param
|
$Signatures['Getter'] = "[bool]`$this.Getter('{0}')" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
||||||
-f $param
|
-f $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -21,9 +21,9 @@ function AddFloatMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "[math]::Round(`$this.Getter('{0}'), 1)" -f $param
|
$Signatures['Getter'] = "[math]::Round(`$this.Getter('{0}'), 1)" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
||||||
-f $param
|
-f $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -37,9 +37,9 @@ function AddIntMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "[Int]`$this.Getter('{0}')" -f $param
|
$Signatures['Getter'] = "[Int]`$this.Getter('{0}')" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
||||||
-f $param
|
-f $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -53,9 +53,9 @@ function AddStringMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "[String]`$this.Getter_String('{0}')" -f $param
|
$Signatures['Getter'] = "[String]`$this.Getter_String('{0}')" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [String]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
$Signatures['Setter'] = "param ( [String]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
||||||
-f $param
|
-f $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -69,9 +69,9 @@ function AddActionMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "`$this.Setter('{0}', `$true)" -f $param
|
$Signatures['Getter'] = "`$this.Setter('{0}', `$true)" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = ""
|
$Signatures['Setter'] = ''
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ function AddChannelMembers () {
|
|||||||
|
|
||||||
[System.Collections.ArrayList]$channels = @()
|
[System.Collections.ArrayList]$channels = @()
|
||||||
1..$($num_A + $num_B) | ForEach-Object {
|
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
|
AddBoolMembers -PARAMS $channels
|
||||||
@@ -93,11 +93,11 @@ function AddGainlayerMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
0..7 | ForEach-Object {
|
0..7 | ForEach-Object {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "`$this.Getter('gainlayer[{0}]')" -f $_
|
$Signatures['Getter'] = "`$this.Getter('gainlayer[{0}]')" -f $_
|
||||||
# Define setter
|
# 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 $_
|
-f $_
|
||||||
$param = "gainlayer{0}" -f $_
|
$param = 'gainlayer{0}' -f $_
|
||||||
$null = $param
|
$null = $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -108,8 +108,8 @@ function Addmember {
|
|||||||
$AddMemberParams = @{
|
$AddMemberParams = @{
|
||||||
Name = $param
|
Name = $param
|
||||||
MemberType = 'ScriptProperty'
|
MemberType = 'ScriptProperty'
|
||||||
Value = [scriptblock]::Create($Signatures["Getter"])
|
Value = [scriptblock]::Create($Signatures['Getter'])
|
||||||
SecondValue = [scriptblock]::Create($Signatures["Setter"])
|
SecondValue = [scriptblock]::Create($Signatures['Setter'])
|
||||||
}
|
}
|
||||||
$this | Add-Member @AddMemberParams
|
$this | Add-Member @AddMemberParams
|
||||||
}
|
}
|
||||||
|
|||||||
52
lib/patch.ps1
Normal file
52
lib/patch.ps1
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
class Patch : IRemote {
|
||||||
|
[System.Collections.ArrayList]$asio
|
||||||
|
[System.Collections.ArrayList]$composite
|
||||||
|
[System.Collections.ArrayList]$insert
|
||||||
|
|
||||||
|
Patch ([Object]$remote) : base ($remote) {
|
||||||
|
AddBoolMembers -PARAMS @('postFaderComposite', 'postFxInsert')
|
||||||
|
|
||||||
|
$this.AddASIOOutMembers()
|
||||||
|
|
||||||
|
$this.asio = @()
|
||||||
|
for ($i = 0; $i -lt $remote.kind.asio_in; $i++) {
|
||||||
|
$this.asio.Add([IntArrayMember]::new($i, 'asio', $this))
|
||||||
|
}
|
||||||
|
|
||||||
|
$this.composite = @()
|
||||||
|
for ($i = 0; $i -lt $remote.kind.composite; $i++) {
|
||||||
|
$this.composite.Add([IntArrayMember]::new($i, 'composite', $this))
|
||||||
|
}
|
||||||
|
|
||||||
|
$this.insert = @()
|
||||||
|
for ($i = 0; $i -lt $remote.kind.insert; $i++) {
|
||||||
|
$this.insert.Add([BoolArrayMember]::new($i, 'insert', $this))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] identifier () {
|
||||||
|
return 'Patch'
|
||||||
|
}
|
||||||
|
|
||||||
|
hidden [void] AddASIOOutMembers () {
|
||||||
|
$num_A = $this.remote.kind.p_out
|
||||||
|
if ($this.remote.kind.name -eq 'basic') {
|
||||||
|
$num_A += $this.remote.kind.v_out
|
||||||
|
}
|
||||||
|
$asio_out = $this.remote.kind.asio_out
|
||||||
|
|
||||||
|
if ($asio_out -le 0) { return }
|
||||||
|
|
||||||
|
for ($a = 2; $a -le $num_A; $a++) {
|
||||||
|
[System.Collections.ArrayList]$members = @()
|
||||||
|
for ($i = 0; $i -lt $asio_out; $i++) {
|
||||||
|
$members.Add([IntArrayMember]::new($i, "OutA$a", $this))
|
||||||
|
}
|
||||||
|
Add-Member -InputObject $this -MemberType NoteProperty -Name "OutA$a" -Value $members -Force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Make_Patch ([Object]$remote) {
|
||||||
|
return [Patch]::new($remote)
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
function Get_Profiles ([string]$kind_id) {
|
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) {
|
if (Test-Path $basepath) {
|
||||||
$fullpath = Join-Path -Path $basepath -ChildPath $kind_id
|
$fullpath = Join-Path -Path $basepath -ChildPath $kind_id
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@ function Get_Profiles ([string]$kind_id) {
|
|||||||
$filenames | ForEach-Object {
|
$filenames | ForEach-Object {
|
||||||
(Join-Path -Path $fullpath -ChildPath $_) | ForEach-Object {
|
(Join-Path -Path $fullpath -ChildPath $_) | ForEach-Object {
|
||||||
$filename = [System.IO.Path]::GetFileNameWithoutExtension($_)
|
$filename = [System.IO.Path]::GetFileNameWithoutExtension($_)
|
||||||
Write-Host ("Importing profile " + $kind_id + "/" + $filename)
|
Write-Host ('Importing profile ' + $kind_id + '/' + $filename)
|
||||||
$data[$filename] = Import-PowerShellDataFile -Path $_
|
$data[$filename] = Import-PowerShellDataFile -Path $_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +1,4 @@
|
|||||||
class IRecorder {
|
class Recorder : IRemote {
|
||||||
[Object]$remote
|
|
||||||
|
|
||||||
IRecorder ([Object]$remote) {
|
|
||||||
$this.remote = $remote
|
|
||||||
}
|
|
||||||
|
|
||||||
[single] Getter ($param) {
|
|
||||||
$this.Cmd($param) | Write-Debug
|
|
||||||
return $this.remote.Getter($this.Cmd($param))
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Setter ($param, $val) {
|
|
||||||
"$($this.Cmd($param))=$val" | Write-Debug
|
|
||||||
if ($val -is [Boolean]) {
|
|
||||||
$this.remote.Setter($this.Cmd($param), $(if ($val) { 1 } else { 0 }))
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$this.remote.Setter($this.Cmd($param), $val)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Cmd ($param) {
|
|
||||||
if ([string]::IsNullOrEmpty($param)) {
|
|
||||||
return $this.identifier()
|
|
||||||
}
|
|
||||||
return "$($this.identifier()).$param"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Recorder : IRecorder {
|
|
||||||
[Object]$remote
|
|
||||||
[Object]$mode
|
[Object]$mode
|
||||||
[System.Collections.ArrayList]$armstrip
|
[System.Collections.ArrayList]$armstrip
|
||||||
[System.Collections.ArrayList]$armbus
|
[System.Collections.ArrayList]$armbus
|
||||||
@@ -51,11 +20,7 @@ class Recorder : IRecorder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Recorder"
|
return 'Recorder'
|
||||||
}
|
|
||||||
|
|
||||||
[string] ToString() {
|
|
||||||
return $this.GetType().Name
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_loop = $($this | Add-Member ScriptProperty 'loop' `
|
hidden $_loop = $($this | Add-Member ScriptProperty 'loop' `
|
||||||
@@ -137,9 +102,9 @@ class Recorder : IRecorder {
|
|||||||
|
|
||||||
[void] GoTo ([string]$timestring) {
|
[void] GoTo ([string]$timestring) {
|
||||||
try {
|
try {
|
||||||
if ([datetime]::ParseExact($timestring, "HH:mm:ss", $null)) {
|
if ([datetime]::ParseExact($timestring, 'HH:mm:ss', $null)) {
|
||||||
$timespan = [timespan]::Parse($timestring)
|
$timespan = [timespan]::Parse($timestring)
|
||||||
$this.Setter("GoTo", $timespan.TotalSeconds)
|
$this.Setter('GoTo', $timespan.TotalSeconds)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch [FormatException] {
|
catch [FormatException] {
|
||||||
@@ -150,35 +115,32 @@ class Recorder : IRecorder {
|
|||||||
[void] FileType($format) {
|
[void] FileType($format) {
|
||||||
[int]$val = 0
|
[int]$val = 0
|
||||||
switch ($format) {
|
switch ($format) {
|
||||||
"wav" { $val = 1 }
|
'wav' { $val = 1 }
|
||||||
"aiff" { $val = 2 }
|
'aiff' { $val = 2 }
|
||||||
"bwf" { $val = 3 }
|
'bwf' { $val = 3 }
|
||||||
"mp3" { $val = 100 }
|
'mp3' { $val = 100 }
|
||||||
default { "Filetype() got: $format, expected one of 'wav', 'aiff', 'bwf', 'mp3'" }
|
default { "Filetype() got: $format, expected one of 'wav', 'aiff', 'bwf', 'mp3'" }
|
||||||
}
|
}
|
||||||
$this.Setter("filetype", $val)
|
$this.Setter('filetype', $val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class RecorderMode : IRecorder {
|
class RecorderMode : IRemote {
|
||||||
RecorderMode ([Object]$remote) : base ($remote) {
|
RecorderMode ([Object]$remote) : base ($remote) {
|
||||||
AddBoolMembers -PARAMS @('recbus', 'playonload', 'loop', 'multitrack')
|
AddBoolMembers -PARAMS @('recbus', 'playonload', 'loop', 'multitrack')
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Recorder.Mode"
|
return 'Recorder.Mode'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class RecorderArm : IRecorder {
|
class RecorderArm : IRemote {
|
||||||
[int]$index
|
RecorderArm ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
|
|
||||||
RecorderArm ([int]$index, [Object]$remote) : base ($remote) {
|
|
||||||
$this.index = $index
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Set ([bool]$val) {
|
Set ([bool]$val) {
|
||||||
$this.Setter("", $(if ($val) { 1 } else { 0 }))
|
$this.Setter('', $(if ($val) { 1 } else { 0 }))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,4 @@
|
|||||||
class IStrip {
|
class Strip : IRemote {
|
||||||
[int]$index
|
|
||||||
[Object]$remote
|
|
||||||
|
|
||||||
IStrip ([int]$index, [Object]$remote) {
|
|
||||||
$this.index = $index
|
|
||||||
$this.remote = $remote
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] identifier () {
|
|
||||||
return "Strip[" + $this.index + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
[single] Getter ($param) {
|
|
||||||
$this.Cmd($param) | Write-Debug
|
|
||||||
return $this.remote.Getter($this.Cmd($param))
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Getter_String ($param) {
|
|
||||||
$this.Cmd($param) | Write-Debug
|
|
||||||
return $this.remote.Getter_String($this.Cmd($param))
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Setter ($param, $val) {
|
|
||||||
"$($this.Cmd($param))=$val" | Write-Debug
|
|
||||||
$this.remote.Setter($this.Cmd($param), $val)
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Cmd ($param) {
|
|
||||||
if ([string]::IsNullOrEmpty($param)) {
|
|
||||||
return $this.identifier()
|
|
||||||
}
|
|
||||||
return "$($this.identifier()).$param"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Strip : IStrip {
|
|
||||||
[Object]$levels
|
[Object]$levels
|
||||||
|
|
||||||
Strip ([int]$index, [Object]$remote) : base ($index, $remote) {
|
Strip ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
@@ -49,8 +13,8 @@ class Strip : IStrip {
|
|||||||
$this.levels = [StripLevels]::new($index, $remote)
|
$this.levels = [StripLevels]::new($index, $remote)
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] ToString() {
|
[string] identifier () {
|
||||||
return $this.GetType().Name + $this.index
|
return 'Strip[' + $this.index + ']'
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] FadeTo ([single]$target, [int]$time) {
|
[void] FadeTo ([single]$target, [int]$time) {
|
||||||
@@ -62,7 +26,7 @@ class Strip : IStrip {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StripLevels : IStrip {
|
class StripLevels : IRemote {
|
||||||
[int]$init
|
[int]$init
|
||||||
[int]$offset
|
[int]$offset
|
||||||
|
|
||||||
@@ -128,14 +92,14 @@ class PhysicalStrip : Strip {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StripComp : IStrip {
|
class StripComp : IRemote {
|
||||||
StripComp ([int]$index, [Object]$remote) : base ($index, $remote) {
|
StripComp ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
AddFloatMembers -PARAMS @('gainin', 'ratio', 'threshold', 'attack', 'release', 'knee', 'gainout')
|
AddFloatMembers -PARAMS @('gainin', 'ratio', 'threshold', 'attack', 'release', 'knee', 'gainout')
|
||||||
AddBoolMembers -PARAMS @('makeup')
|
AddBoolMembers -PARAMS @('makeup')
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].Comp"
|
return 'Strip[' + $this.index + '].Comp'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||||
@@ -149,13 +113,13 @@ class StripComp : IStrip {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class StripGate : IStrip {
|
class StripGate : IRemote {
|
||||||
StripGate ([int]$index, [Object]$remote) : base ($index, $remote) {
|
StripGate ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
AddFloatMembers -PARAMS @('threshold', 'damping', 'bpsidechain', 'attack', 'hold', 'release')
|
AddFloatMembers -PARAMS @('threshold', 'damping', 'bpsidechain', 'attack', 'hold', 'release')
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].Gate"
|
return 'Strip[' + $this.index + '].Gate'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||||
@@ -169,12 +133,12 @@ class StripGate : IStrip {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class StripDenoiser : IStrip {
|
class StripDenoiser : IRemote {
|
||||||
StripDenoiser ([int]$index, [Object]$remote) : base ($index, $remote) {
|
StripDenoiser ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].Denoiser"
|
return 'Strip[' + $this.index + '].Denoiser'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||||
@@ -188,22 +152,22 @@ class StripDenoiser : IStrip {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class StripEq : IStrip {
|
class StripEq : IRemote {
|
||||||
StripEq ([int]$index, [Object]$remote) : base ($index, $remote) {
|
StripEq ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
AddBoolMembers -PARAMS @('on', 'ab')
|
AddBoolMembers -PARAMS @('on', 'ab')
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].EQ"
|
return 'Strip[' + $this.index + '].EQ'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StripDevice : IStrip {
|
class StripDevice : IRemote {
|
||||||
StripDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
|
StripDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].Device"
|
return 'Strip[' + $this.index + '].Device'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||||
|
|||||||
56
lib/vban.ps1
56
lib/vban.ps1
@@ -1,46 +1,12 @@
|
|||||||
class IVban {
|
class Vban : IRemote {
|
||||||
[int32]$index
|
|
||||||
[Object]$remote
|
|
||||||
[string]$direction
|
[string]$direction
|
||||||
|
|
||||||
IVban ([int]$index, [Object]$remote, [string]$direction) {
|
Vban ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote) {
|
||||||
$this.index = $index
|
|
||||||
$this.remote = $remote
|
|
||||||
$this.direction = $direction
|
$this.direction = $direction
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "vban." + $this.direction + "stream[" + $this.index + "]"
|
return 'vban.' + $this.direction + 'stream[' + $this.index + ']'
|
||||||
}
|
|
||||||
|
|
||||||
[single] Getter ($param) {
|
|
||||||
return $this.remote.Getter($this.Cmd($param))
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Getter_String ($param) {
|
|
||||||
$this.Cmd($param) | Write-Debug
|
|
||||||
return $this.remote.Getter_String($this.Cmd($param))
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Setter ($param, $val) {
|
|
||||||
"$($this.Cmd($param))=$val" | Write-Debug
|
|
||||||
$this.remote.Setter($this.Cmd($param), $val)
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Cmd ($param) {
|
|
||||||
if ([string]::IsNullOrEmpty($param)) {
|
|
||||||
return $this.identifier()
|
|
||||||
}
|
|
||||||
return "$($this.identifier()).$param"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Vban : IVban {
|
|
||||||
Vban ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] ToString() {
|
|
||||||
return $this.GetType().Name + $this.index
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_on = $($this | Add-Member ScriptProperty 'on' `
|
hidden $_on = $($this | Add-Member ScriptProperty 'on' `
|
||||||
@@ -94,7 +60,7 @@ class Vban : IVban {
|
|||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param([int]$arg)
|
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 {
|
else {
|
||||||
$opts = @(11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
|
$opts = @(11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
|
||||||
if ($opts.Contains($arg)) {
|
if ($opts.Contains($arg)) {
|
||||||
@@ -113,7 +79,7 @@ class Vban : IVban {
|
|||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param([int]$arg)
|
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 {
|
else {
|
||||||
if ($arg -ge 1 -and $arg -le 8) {
|
if ($arg -ge 1 -and $arg -le 8) {
|
||||||
$this._channel = $this.Setter('channel', $arg)
|
$this._channel = $this.Setter('channel', $arg)
|
||||||
@@ -132,7 +98,7 @@ class Vban : IVban {
|
|||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param([int]$arg)
|
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 {
|
else {
|
||||||
if (@(16, 24).Contains($arg)) {
|
if (@(16, 24).Contains($arg)) {
|
||||||
$val = if ($arg -eq 16) { 1 } else { 2 }
|
$val = if ($arg -eq 16) { 1 } else { 2 }
|
||||||
@@ -151,7 +117,7 @@ class Vban : IVban {
|
|||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param([int]$arg)
|
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 {
|
else {
|
||||||
if ($arg -ge 0 -and $arg -le 4) {
|
if ($arg -ge 0 -and $arg -le 4) {
|
||||||
$this._quality = $this.Setter('quality', $arg)
|
$this._quality = $this.Setter('quality', $arg)
|
||||||
@@ -169,7 +135,7 @@ class Vban : IVban {
|
|||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param([int]$arg)
|
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 {
|
else {
|
||||||
if ($arg -ge 0 -and $arg -le 8) {
|
if ($arg -ge 0 -and $arg -le 8) {
|
||||||
$this._route = $this.Setter('route', $arg)
|
$this._route = $this.Setter('route', $arg)
|
||||||
@@ -200,10 +166,10 @@ function Make_Vban ([Object]$remote) {
|
|||||||
[System.Collections.ArrayList]$outstream = @()
|
[System.Collections.ArrayList]$outstream = @()
|
||||||
|
|
||||||
0..$($remote.kind.vban_in - 1) | ForEach-Object {
|
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 {
|
0..$($remote.kind.vban_out - 1) | ForEach-Object {
|
||||||
[void]$outstream.Add([VbanOutstream]::new($_, $remote, "out"))
|
[void]$outstream.Add([VbanOutstream]::new($_, $remote, 'out'))
|
||||||
}
|
}
|
||||||
|
|
||||||
$CustomObject = [pscustomobject]@{
|
$CustomObject = [pscustomobject]@{
|
||||||
@@ -213,7 +179,7 @@ function Make_Vban ([Object]$remote) {
|
|||||||
|
|
||||||
$CustomObject | Add-Member ScriptProperty 'enable' `
|
$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)
|
param([bool]$arg)
|
||||||
|
|||||||
@@ -90,17 +90,17 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Context 'Recorder' -Skip:$ifBasic {
|
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 = $value
|
||||||
$vmr.recorder.A3 | Should -Be $expected
|
$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 = $value
|
||||||
$vmr.recorder.B1 | Should -Be $expected
|
$vmr.recorder.B1 | Should -Be $expected
|
||||||
}
|
}
|
||||||
|
|
||||||
It "Should set and get Recorder.loop" {
|
It 'Should set and get Recorder.loop' {
|
||||||
$vmr.recorder.loop = $value
|
$vmr.recorder.loop = $value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,6 +110,23 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
$vmr.command.lock = $value
|
$vmr.command.lock = $value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context 'Patch' {
|
||||||
|
It 'Should set and get Patch.insert[$insert]' -Skip:$ifBasic {
|
||||||
|
$vmr.patch.insert[$insert].set($value)
|
||||||
|
$vmr.patch.insert[$insert].get() | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It 'Should set and get Patch.postfadercomposite' -Skip:$ifBasic {
|
||||||
|
$vmr.patch.postfadercomposite = $value
|
||||||
|
$vmr.patch.postfadercomposite | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It 'Should set and get Patch.postfxinsert' -Skip:$ifBasic {
|
||||||
|
$vmr.patch.postfxinsert = $value
|
||||||
|
$vmr.patch.postfxinsert | Should -Be $value
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Describe 'Float Tests' {
|
Describe 'Float Tests' {
|
||||||
@@ -241,6 +258,15 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context 'Patch' {
|
||||||
|
It 'Should set and get Patch.composite[$composite]' -Skip:$ifBasic -ForEach @(
|
||||||
|
@{ Value = 22 }, @{ Value = 6 }
|
||||||
|
) {
|
||||||
|
$vmr.patch.composite[$composite].set($value)
|
||||||
|
$vmr.patch.composite[$composite].get() | Should -Be $value
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Describe 'String Tests' {
|
Describe 'String Tests' {
|
||||||
@@ -248,8 +274,8 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||||
) {
|
) {
|
||||||
It "Should set Strip[$index].Label" -ForEach @(
|
It "Should set Strip[$index].Label" -ForEach @(
|
||||||
@{ Value = "test0"; Expected = "test0" }
|
@{ Value = 'test0'; Expected = 'test0' }
|
||||||
@{ Value = "test1"; Expected = "test1" }
|
@{ Value = 'test1'; Expected = 'test1' }
|
||||||
) {
|
) {
|
||||||
$vmr.strip[$index].label = $value
|
$vmr.strip[$index].label = $value
|
||||||
$vmr.strip[$index].label | Should -Be $expected
|
$vmr.strip[$index].label | Should -Be $expected
|
||||||
@@ -260,8 +286,8 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
@{ Index = $phys_out }, @{ Index = $virt_out }
|
@{ Index = $phys_out }, @{ Index = $virt_out }
|
||||||
) {
|
) {
|
||||||
It "Should set Bus[$index].Label" -ForEach @(
|
It "Should set Bus[$index].Label" -ForEach @(
|
||||||
@{ Value = "test0"; Expected = "test0" }
|
@{ Value = 'test0'; Expected = 'test0' }
|
||||||
@{ Value = "test1"; Expected = "test1" }
|
@{ Value = 'test1'; Expected = 'test1' }
|
||||||
) {
|
) {
|
||||||
$vmr.bus[$index].label = $value
|
$vmr.bus[$index].label = $value
|
||||||
$vmr.bus[$index].label | Should -Be $expected
|
$vmr.bus[$index].label | Should -Be $expected
|
||||||
@@ -273,7 +299,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
) {
|
) {
|
||||||
Context 'instream' {
|
Context 'instream' {
|
||||||
Context 'ip' -ForEach @(
|
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" {
|
It "Should set vban.instream[$index].name to $value" {
|
||||||
$vmr.vban.instream[$index].ip = $value
|
$vmr.vban.instream[$index].ip = $value
|
||||||
@@ -284,7 +310,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
|
|
||||||
Context 'outstream' {
|
Context 'outstream' {
|
||||||
Context 'ip' -ForEach @(
|
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" {
|
It "Should set vban.outstream[$index].name to $value" {
|
||||||
$vmr.vban.outstream[$index].ip = $value
|
$vmr.vban.outstream[$index].ip = $value
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ Describe -Tag 'lower', -TestName 'All Lower Tests' {
|
|||||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||||
) {
|
) {
|
||||||
Context 'mute, mono, A1, B2' -ForEach @(
|
Context 'mute, mono, A1, B2' -ForEach @(
|
||||||
@{ param = "mute" }, @{ param = "A1" }
|
@{ param = 'mute' }, @{ param = 'A1' }
|
||||||
) {
|
) {
|
||||||
It "Should set Strip[0].$param to 1" {
|
It "Should set Strip[0].$param to 1" {
|
||||||
Param_Set -PARAM "Strip[$index].$param" -VALUE $value
|
Param_Set -PARAM "Strip[$index].$param" -VALUE $value
|
||||||
|
|||||||
@@ -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
|
|
||||||
32
tests/run.ps1
Normal file
32
tests/run.ps1
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "", Target = "variablename")]
|
||||||
|
Param([String]$tag, [string]$kind = 'potato')
|
||||||
|
Import-Module (Join-Path (Split-Path $PSScriptRoot -Parent) 'lib\Voicemeeter.psm1') -Force
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
$insert = $vmr.kind.insert - 1
|
||||||
|
$composite = $vmr.kind.composite - 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
|
||||||
Reference in New Issue
Block a user