mirror of
https://github.com/onyx-and-iris/voicemeeter-api-powershell.git
synced 2026-04-20 14:33:32 +00:00
Compare commits
86 Commits
add-record
...
e944dc46e6
| Author | SHA1 | Date | |
|---|---|---|---|
| e944dc46e6 | |||
|
|
d87cdbd444 | ||
|
|
06942a234d | ||
|
|
17e601a8d6 | ||
|
|
72185d14b3 | ||
|
|
81764f0e43 | ||
|
|
90e9dcd06c | ||
| b92a2422a7 | |||
|
|
2eecdd7def | ||
| 5c623711f7 | |||
|
|
8d97df2d92 | ||
|
|
438fa525da | ||
|
|
aa2c2a24af | ||
|
|
d3e9ad2bf4 | ||
| abdf2dbf5d | |||
|
|
02bc174746 | ||
|
|
8038fc24ce | ||
|
|
d13b08eff4 | ||
|
|
dedb4201be | ||
|
|
60d97a89b4 | ||
|
|
6154af7ad7 | ||
| 07028478cc | |||
|
|
3f7bef56c1 | ||
|
|
820b897e84 | ||
|
|
1e4a2da821 | ||
|
|
ee85d5ffd8 | ||
| b20f62f17c | |||
|
|
1587b2ea6a | ||
|
|
88468d4e52 | ||
|
|
a69902ec49 | ||
|
|
10c85cead5 | ||
|
|
d81cd32392 | ||
|
|
e887e15168 | ||
|
|
c5a8813e9a | ||
| 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 | |||
| b21a71471b | |||
| 43367525c5 | |||
| d0fbd6deef | |||
| 1df92afcfe | |||
| 2ad8118f2c | |||
| bc6162cf16 | |||
| 9b3d9f2250 | |||
| 844eaeabaa | |||
| a78cdf9a99 | |||
| a40adf27be | |||
| 1397c14522 | |||
| ff1bd5e6cc |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,7 +1,6 @@
|
||||
# quick test
|
||||
quick.ps1
|
||||
|
||||
lib/*.psd1
|
||||
**/*.log
|
||||
|
||||
config.psd1
|
||||
|
||||
test-*.ps1
|
||||
28
.vscode/launch.json
vendored
28
.vscode/launch.json
vendored
@@ -16,7 +16,9 @@
|
||||
"\"!strip[0].mute\",",
|
||||
"\"strip[0].mute\",",
|
||||
"\"bus[2].eq.on=1\",",
|
||||
"\"command.lock=1\""
|
||||
"\"command.lock=1\"",
|
||||
"-Verbose",
|
||||
"-Debug"
|
||||
],
|
||||
"createTemporaryIntegratedConsole": true
|
||||
},
|
||||
@@ -26,7 +28,10 @@
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceRoot}/examples/nextbus",
|
||||
"script": "${workspaceFolder}/examples/nextbus/GoTo-NextBus.ps1",
|
||||
"args": [],
|
||||
"args": [
|
||||
"-Verbose",
|
||||
"-Debug"
|
||||
],
|
||||
"createTemporaryIntegratedConsole": true
|
||||
},
|
||||
{
|
||||
@@ -35,7 +40,10 @@
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceRoot}/examples/obs",
|
||||
"script": "${workspaceFolder}/examples/obs/Vm-Obs-Sync.ps1",
|
||||
"args": [],
|
||||
"args": [
|
||||
"-Verbose",
|
||||
"-Debug"
|
||||
],
|
||||
"createTemporaryIntegratedConsole": true
|
||||
},
|
||||
{
|
||||
@@ -43,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
|
||||
}
|
||||
]
|
||||
}
|
||||
70
CHANGELOG.md
70
CHANGELOG.md
@@ -9,10 +9,74 @@ 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
|
||||
|
||||
- [x] Level methods for Strip,Bus classes implemented.
|
||||
- [x] More Recorder commands implemented.
|
||||
### Added
|
||||
|
||||
## [3.0.0]
|
||||
- IRemote base class
|
||||
- ArrayMember classes for array-like properties
|
||||
- Patch class
|
||||
- Option class
|
||||
- Device classes
|
||||
- EQ class
|
||||
- FX class
|
||||
- Vban.port sets Vban.Instream[0].port
|
||||
- Vban Midi and Command streams
|
||||
- on, write-only
|
||||
- name, write-only
|
||||
- ip, write-only
|
||||
|
||||
### Changed
|
||||
|
||||
- some vban.instream | vban.outstream commands now added with meta functions
|
||||
- on
|
||||
- name
|
||||
- ip
|
||||
- cast vban getters to types for consistency
|
||||
|
||||
### Fixed
|
||||
|
||||
- some vban commands incorrectly read-only/write-only
|
||||
- enable
|
||||
- instream|outstream.quality
|
||||
- instream|outstream.route
|
||||
- vban.stream.port: [string]$arg -> [int]$arg
|
||||
- vban route range (API documentation is incorrect)
|
||||
- vban.stream.sr: $this._port -> $this._sr
|
||||
|
||||
## [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
|
||||
|
||||
- Debug statements added to Getters, Setters in higher classes.
|
||||
- RunVoicemeeter function added to base.ps1. Accepts kind name as parameter.
|
||||
- Errors section to README.
|
||||
|
||||
### Fixed
|
||||
|
||||
- All CAPIErrors are now exposed to the consumer.
|
||||
- The function name and error code can be retrieved using [CAPIError].function and [CAPIError].code
|
||||
- Set_By_Script now throws [VMRemoteError] if script length exceeds 48kB.
|
||||
- parameter range checks in Vban class.
|
||||
|
||||
## [3.1.0] - 2023-08-15
|
||||
|
||||
### Added
|
||||
|
||||
- Level methods for Strip class implemented. See Strip.levels section in README.
|
||||
- Level methods for Bus class implemented. See Bus.levels section in README.
|
||||
- More Recorder commands implemented. See Recorder section in README.
|
||||
- RunMacrobuttons, CloseMacrobuttons added to Special class
|
||||
|
||||
## [3.0.0] - 2023-08-09
|
||||
|
||||
v3 introduces some breaking changes. They are as follows:
|
||||
|
||||
|
||||
217
README.md
217
README.md
@@ -8,9 +8,9 @@ For past/future changes to this project refer to: [CHANGELOG](CHANGELOG.md)
|
||||
|
||||
## Tested against
|
||||
|
||||
- Basic 1.0.8.8
|
||||
- Banana 2.0.6.8
|
||||
- Potato 3.0.2.8
|
||||
- Basic 1.1.1.1
|
||||
- Banana 2.1.1.1
|
||||
- Potato 3.1.1.1
|
||||
|
||||
## Requirements
|
||||
|
||||
@@ -115,13 +115,13 @@ $vmr.Logout()
|
||||
|
||||
The following strip commands are available:
|
||||
|
||||
- mute: boolean
|
||||
- mono: boolean
|
||||
- mc: boolean
|
||||
- mute: bool
|
||||
- mono: bool
|
||||
- mc: bool
|
||||
- k: int, from 0 to 4
|
||||
- solo: boolean
|
||||
- A1-A5: boolean
|
||||
- B1-B3: boolean
|
||||
- solo: bool
|
||||
- A1-A5: bool
|
||||
- B1-B3: bool
|
||||
- limit: int, from -40 to 12
|
||||
- gain: float, from -60.0 to 12.0
|
||||
- label: string
|
||||
@@ -135,10 +135,10 @@ The following strip commands are available:
|
||||
- color_y: float, from 0.0 to 1.0
|
||||
- fx_x: float, from -0.5 to 0.5
|
||||
- fx_y: float, from 0.0 to 1.0
|
||||
- postreverb: boolean
|
||||
- postdelay: boolean
|
||||
- postfx1: boolean
|
||||
- postfx2: boolean
|
||||
- postreverb: bool
|
||||
- postdelay: bool
|
||||
- postfx1: bool
|
||||
- postfx2: bool
|
||||
- gainlayer0-gainlayer7: float
|
||||
|
||||
for example:
|
||||
@@ -165,7 +165,7 @@ The following strip.comp commands are available:
|
||||
- release: float, from 0.0 to 5000.0
|
||||
- knee: float, 0.0 to 1.0
|
||||
- gainout: float, from -24.0 to 24.0
|
||||
- makeup: boolean
|
||||
- makeup: bool
|
||||
|
||||
for example:
|
||||
|
||||
@@ -206,7 +206,7 @@ $vmr.strip[3].denoiser.knob = 5
|
||||
#### AppGain | AppMute
|
||||
|
||||
- `AppGain(amount, gain)` : string, float
|
||||
- `AppMute(amount, mutestate)` : string, boolean
|
||||
- `AppMute(amount, mutestate)` : string, bool
|
||||
|
||||
for example:
|
||||
|
||||
@@ -253,18 +253,18 @@ $vmr.bus[3].returnreverb = 5.7
|
||||
|
||||
The following bus.mode members are available:
|
||||
|
||||
- normal: boolean
|
||||
- amix: boolean
|
||||
- bmix: boolean
|
||||
- repeat: boolean
|
||||
- composite: boolean
|
||||
- tvmix: boolean
|
||||
- upmix21: boolean
|
||||
- upmix41: boolean
|
||||
- upmix61: boolean
|
||||
- centeronly: boolean
|
||||
- lfeonly: boolean
|
||||
- rearonly: boolean
|
||||
- normal: bool
|
||||
- amix: bool
|
||||
- bmix: bool
|
||||
- repeat: bool
|
||||
- composite: bool
|
||||
- tvmix: bool
|
||||
- upmix21: bool
|
||||
- upmix41: bool
|
||||
- upmix61: bool
|
||||
- centeronly: bool
|
||||
- lfeonly: bool
|
||||
- rearonly: bool
|
||||
|
||||
The following bus.mode commands are available:
|
||||
|
||||
@@ -312,13 +312,19 @@ $vmr.bus[0].device.name
|
||||
|
||||
name, sr are defined as read only.
|
||||
wdm, ks, mme, asio are defined as write only.
|
||||
asio only defined for Bus[0].Device
|
||||
|
||||
#### eq
|
||||
|
||||
The following strip.eq | bus.eq commands are available:
|
||||
|
||||
- on: boolean
|
||||
- ab: boolean
|
||||
- on: bool
|
||||
- ab: bool
|
||||
|
||||
The following strip.eq | bus.eq methods are available:
|
||||
|
||||
- Load($filepath) : string
|
||||
- Save($filepath) : string
|
||||
|
||||
for example:
|
||||
|
||||
@@ -327,6 +333,23 @@ $vmr.strip[0].eq.on = $true
|
||||
$vmr.bus[0].eq.ab = $false
|
||||
```
|
||||
|
||||
##### channel.cell
|
||||
|
||||
The following eq.channel.cell commands are available:
|
||||
|
||||
- on: bool
|
||||
- type: int, from 0 to 6
|
||||
- f: float, from 20.0 to 20000.0
|
||||
- gain: float, from -12.0 to 12.0
|
||||
- q: float, from 0.3 to 100.0
|
||||
|
||||
for example:
|
||||
|
||||
```powershell
|
||||
$vmr.strip[2].eq.channel[1].cell[4].type = 1
|
||||
$vmr.bus[5].eq.channel[6].cell[3].on = $false
|
||||
```
|
||||
|
||||
#### FadeTo | FadeBy
|
||||
|
||||
- `FadeTo(amount, time)` : float, int
|
||||
@@ -359,19 +382,21 @@ $vmr.button[5].trigger = $true
|
||||
|
||||
### VBAN
|
||||
|
||||
- vmr.vban.enable: Toggle VBAN on or off. Accepts a boolean value.
|
||||
The following vban commands are available:
|
||||
|
||||
- enable: bool
|
||||
- port: int, from 1024 - 65535
|
||||
|
||||
For each vban in/out stream the following parameters are defined:
|
||||
|
||||
- on: boolean
|
||||
- on: bool
|
||||
- name: string
|
||||
- ip: string
|
||||
- port: int from 1024 - 65535
|
||||
- sr: int (11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
|
||||
- sr: in, (11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
|
||||
- channel: int from 1 to 8
|
||||
- bit: int 16 or 24
|
||||
- quality: int from 0 to 4
|
||||
- route: int from 0 to 8
|
||||
- bit: int, 16 or 24
|
||||
- quality: int, from 0 to 4
|
||||
- route: int, from 0 to 8
|
||||
|
||||
SR, channel and bit are defined as readonly for instreams. Attempting to write
|
||||
to those parameters will throw an error. They are read and write for outstreams.
|
||||
@@ -380,9 +405,9 @@ example:
|
||||
|
||||
```powershell
|
||||
$vmr.vban.enable = $true
|
||||
$vmr.vban.port = 6990
|
||||
|
||||
$vmr.vban.instream[0].on = $true
|
||||
$vmr.vban.instream[2].port = 6990
|
||||
$vmr.vban.outstream[3].bit = 16
|
||||
```
|
||||
|
||||
@@ -396,12 +421,14 @@ The following commands are available:
|
||||
- hide
|
||||
- restart
|
||||
- shutdown
|
||||
- showvbanchat: boolean (write only)
|
||||
- lock: boolean (write only)
|
||||
- showvbanchat: bool, (write only)
|
||||
- lock: bool, (write only)
|
||||
|
||||
The following methods are available:
|
||||
|
||||
- Load($filepath): string
|
||||
- RunMacrobuttons(): Launches the macrobuttons app
|
||||
- CloseMacrobuttons(): Closes the macrobuttons app
|
||||
|
||||
example:
|
||||
|
||||
@@ -411,6 +438,83 @@ $vmr.command.show
|
||||
$vmr.command.lock = $true
|
||||
|
||||
$vmr.command.Load("path/to/filename.xml")
|
||||
|
||||
$vmr.command.RunMacrobuttons()
|
||||
```
|
||||
|
||||
### Fx
|
||||
|
||||
The following Fx commands are available:
|
||||
|
||||
- Reverb.on: bool
|
||||
- Reverb.ab: bool
|
||||
- Delay.on: bool
|
||||
- Delay.ab: bool
|
||||
|
||||
for example:
|
||||
|
||||
```powershell
|
||||
$vmr.fx.reverb.ab = $false
|
||||
```
|
||||
|
||||
### 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()
|
||||
```
|
||||
|
||||
### Option
|
||||
|
||||
The following Option commands are available:
|
||||
|
||||
- sr: int, (32000, 44100, 48000, 88200, 96000, 176400, 192000)
|
||||
- asiosr: bool
|
||||
- monitorOnSel: bool
|
||||
- sliderMode: bool
|
||||
|
||||
The following Option.delay[i] methods are available:
|
||||
|
||||
- Set($val): float, from 0.00 to 500.00
|
||||
- Get()
|
||||
|
||||
for example:
|
||||
|
||||
```powershell
|
||||
$vmr.Option.delay[2].set(30.26) # sets the delay for the third (2) bus
|
||||
$vmr.Option.sliderMode = $false # sets slider mode to absolute
|
||||
```
|
||||
|
||||
#### buffers
|
||||
|
||||
The following Option.buffer commands are available:
|
||||
|
||||
- mme: int, (441, 480, 512, 576, 640, 704, 768, 896, 1024, 1536, 2048)
|
||||
- wdm: int, (128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024, 1536, 2048)
|
||||
- ks: int, (128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024, 1536, 2048)
|
||||
- asio: int, (0, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024)
|
||||
|
||||
for example:
|
||||
|
||||
```powershell
|
||||
$vmr.Option.buffer.wdm = 512
|
||||
$vmr.Option.buffer.asio = 0 # to use default buffer size
|
||||
```
|
||||
|
||||
### Recorder
|
||||
@@ -423,12 +527,12 @@ The following commands are available:
|
||||
- record
|
||||
- ff
|
||||
- rew
|
||||
- A1 - A5: boolean
|
||||
- B1 - B3: boolean
|
||||
- samplerate: int (22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000)
|
||||
- bitresolution: int (8, 16, 24, 32)
|
||||
- channel: int from 1 to 8
|
||||
- kbps: int (32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320)
|
||||
- A1 - A5: bool
|
||||
- B1 - B3: bool
|
||||
- samplerate: int, (22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000)
|
||||
- bitresolution: int, (8, 16, 24, 32)
|
||||
- channel: int, from 1 to 8
|
||||
- kbps: int, (32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320)
|
||||
|
||||
The following methods are available:
|
||||
|
||||
@@ -464,7 +568,7 @@ $vmr.recorder.mode.loop = $true
|
||||
|
||||
The following method is available:
|
||||
|
||||
- Set($val): boolean
|
||||
- Set($val): bool
|
||||
|
||||
example:
|
||||
|
||||
@@ -542,19 +646,28 @@ Access to lower level polling functions are provided with these functions:
|
||||
- `$vmr.PDirty`: Returns true if a parameter has been updated.
|
||||
- `$vmr.MDirty`: Returns true if a macrobutton has been updated.
|
||||
|
||||
### Errors
|
||||
|
||||
- `VMRemoteError`: Base custom error class.
|
||||
- `LoginError`: Raised when a login error occurs.
|
||||
- `CAPIError`: Raised when a C-API function returns an error code.
|
||||
- The following class properties are available:
|
||||
- `function`: The name of the C-API function that returned the error code.
|
||||
- `code`: The error code.
|
||||
|
||||
### 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
|
||||
|
||||
- [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,14 +1,12 @@
|
||||
[cmdletbinding()]
|
||||
param(
|
||||
[switch]$interactive,
|
||||
[switch]$output,
|
||||
[String]$kind = "banana",
|
||||
[String]$kind = 'banana',
|
||||
[String[]]$script = @()
|
||||
)
|
||||
|
||||
Import-Module ..\..\lib\Voicemeeter.psm1
|
||||
|
||||
$VerbosePreference = "Continue"
|
||||
|
||||
function get-value {
|
||||
param([object]$vmr, [string]$line)
|
||||
try {
|
||||
@@ -22,20 +20,20 @@ function get-value {
|
||||
|
||||
function msgHandler {
|
||||
param([object]$vmr, [string]$line)
|
||||
$line + " passed to handler" | Write-Debug
|
||||
if ($line[0] -eq "!") {
|
||||
if ($output) { "Toggling " + $line.substring(1) | Write-Host }
|
||||
$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("=")) {
|
||||
if ($output) { "Setting $line" | Write-Host }
|
||||
elseif ($line.Contains('=')) {
|
||||
"Setting $line" | Write-Debug
|
||||
$vmr.SendText($line)
|
||||
}
|
||||
else {
|
||||
if ($output) { "Getting $line" | Write-Host }
|
||||
"Getting $line" | Write-Debug
|
||||
$retval = get-value -vmr $vmr -line $line
|
||||
$line + " = " + $retval | Write-Host
|
||||
$line + ' = ' + $retval | Write-Host
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,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
|
||||
}
|
||||
|
||||
@@ -7,27 +7,30 @@
|
||||
Credits go to @bobsupercow
|
||||
#>
|
||||
|
||||
[cmdletbinding()]
|
||||
param()
|
||||
|
||||
Import-Module ..\..\lib\Voicemeeter.psm1
|
||||
|
||||
$VerbosePreference = "Continue"
|
||||
|
||||
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
|
||||
foreach ($bus in $buses) {
|
||||
# 2)
|
||||
if (-not $bus.mute) {
|
||||
"bus $($bus.index) is unmuted... muting it" | Write-Host
|
||||
"Bus $($bus.index) is unmuted... muting it" | Write-Host
|
||||
$unmutedIndex = $buses.IndexOf($bus)
|
||||
$bus.mute = $true
|
||||
|
||||
# 3)
|
||||
if ($buses[++$unmutedIndex]) {
|
||||
"unmuting bus $($buses[$unmutedIndex].index)" | Write-Host
|
||||
"Unmuting Bus $($buses[$unmutedIndex].index)" | Write-Host
|
||||
$buses[$unmutedIndex].mute = $false
|
||||
break
|
||||
}
|
||||
@@ -37,7 +40,7 @@ try {
|
||||
# 4)
|
||||
if ($null -eq $unmutedIndex) {
|
||||
$buses[0].mute = $false
|
||||
"unmuting bus $($buses[0].index)" | Write-Host
|
||||
"Unmuting Bus $($buses[0].index)" | Write-Host
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,36 +1,33 @@
|
||||
[cmdletbinding()]
|
||||
param()
|
||||
|
||||
Import-Module ..\..\lib\Voicemeeter.psm1
|
||||
Import-Module obs-powershell
|
||||
|
||||
$VerbosePreference = "Continue"
|
||||
|
||||
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
|
||||
"Toggling Strip 0 mute"
|
||||
}
|
||||
"BRB" {
|
||||
'BRB' {
|
||||
$vmr.strip[0].gain = -8.3
|
||||
"Setting Strip 0 gain to -8.3"
|
||||
}
|
||||
"END" {
|
||||
'END' {
|
||||
$vmr.strip[0].mono = $true
|
||||
"Setting Strip 0 mono to `$true"
|
||||
}
|
||||
"LIVE" {
|
||||
'LIVE' {
|
||||
$vmr.strip[0].color_x = 0.3
|
||||
"Setting Strip 0 color_x to 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
|
||||
}
|
||||
|
||||
@@ -41,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
|
||||
|
||||
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)
|
||||
}
|
||||
```
|
||||
@@ -1,20 +1,35 @@
|
||||
. $PSScriptRoot\kinds.ps1
|
||||
. $PSScriptRoot\errors.ps1
|
||||
. $PSScriptRoot\meta.ps1
|
||||
. $PSScriptRoot\base.ps1
|
||||
. $PSScriptRoot\kinds.ps1
|
||||
. $PSScriptRoot\iremote.ps1
|
||||
. $PSScriptRoot\arraymember.ps1
|
||||
. $PSScriptRoot\device.ps1
|
||||
. $PSScriptRoot\eq.ps1
|
||||
. $PSScriptRoot\strip.ps1
|
||||
. $PSScriptRoot\bus.ps1
|
||||
. $PSScriptRoot\macrobuttons.ps1
|
||||
. $PSScriptRoot\vban.ps1
|
||||
. $PSScriptRoot\command.ps1
|
||||
. $PSScriptRoot\recorder.ps1
|
||||
. $PSScriptRoot\patch.ps1
|
||||
. $PSScriptRoot\option.ps1
|
||||
. $PSScriptRoot\fx.ps1
|
||||
. $PSScriptRoot\profiles.ps1
|
||||
|
||||
class Remote {
|
||||
[String]$vmpath
|
||||
[Hashtable]$kind
|
||||
[Object]$profiles
|
||||
|
||||
Remote ([String]$kindId) {
|
||||
if (!(Setup_DLL)) {
|
||||
Exit -1
|
||||
}
|
||||
$this.vmpath = Setup_DLL
|
||||
$this.kind = GetKind($kindId)
|
||||
$this.profiles = Get_Profiles($this.kind.name)
|
||||
}
|
||||
|
||||
[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() {
|
||||
@@ -31,7 +46,7 @@ class Remote {
|
||||
}
|
||||
|
||||
[String] GetVersion() {
|
||||
return Version
|
||||
return VmVersion
|
||||
}
|
||||
|
||||
[void] Set_Profile([String]$config) {
|
||||
@@ -69,6 +84,8 @@ class RemoteBasic : Remote {
|
||||
[System.Collections.ArrayList]$button
|
||||
[PSCustomObject]$vban
|
||||
[Object]$command
|
||||
[Object]$patch
|
||||
[Object]$option
|
||||
|
||||
RemoteBasic () : base ('basic') {
|
||||
$this.strip = Make_Strips($this)
|
||||
@@ -76,6 +93,8 @@ class RemoteBasic : Remote {
|
||||
$this.button = Make_Buttons
|
||||
$this.vban = Make_Vban($this)
|
||||
$this.command = Make_Command($this)
|
||||
$this.patch = Make_Patch($this)
|
||||
$this.option = Make_Option($this)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +104,8 @@ class RemoteBanana : Remote {
|
||||
[System.Collections.ArrayList]$button
|
||||
[PSCustomObject]$vban
|
||||
[Object]$command
|
||||
[Object]$patch
|
||||
[Object]$option
|
||||
[Object]$recorder
|
||||
|
||||
RemoteBanana () : base ('banana') {
|
||||
@@ -93,6 +114,8 @@ class RemoteBanana : Remote {
|
||||
$this.button = Make_Buttons
|
||||
$this.vban = Make_Vban($this)
|
||||
$this.command = Make_Command($this)
|
||||
$this.patch = Make_Patch($this)
|
||||
$this.option = Make_Option($this)
|
||||
$this.recorder = Make_Recorder($this)
|
||||
}
|
||||
}
|
||||
@@ -103,6 +126,9 @@ class RemotePotato : Remote {
|
||||
[System.Collections.ArrayList]$button
|
||||
[PSCustomObject]$vban
|
||||
[Object]$command
|
||||
[Object]$fx
|
||||
[Object]$patch
|
||||
[Object]$option
|
||||
[Object]$recorder
|
||||
|
||||
RemotePotato () : base ('potato') {
|
||||
@@ -111,6 +137,9 @@ class RemotePotato : Remote {
|
||||
$this.button = Make_Buttons
|
||||
$this.vban = Make_Vban($this)
|
||||
$this.command = Make_Command($this)
|
||||
$this.fx = Make_Fx($this)
|
||||
$this.patch = Make_Patch($this)
|
||||
$this.option = Make_Option($this)
|
||||
$this.recorder = Make_Recorder($this)
|
||||
}
|
||||
}
|
||||
@@ -129,23 +158,19 @@ Function Get-RemotePotato {
|
||||
|
||||
Function Connect-Voicemeeter {
|
||||
param([String]$Kind)
|
||||
try {
|
||||
switch ($Kind) {
|
||||
"basic" {
|
||||
return Get-RemoteBasic
|
||||
}
|
||||
"banana" {
|
||||
return Get-RemoteBanana
|
||||
}
|
||||
"potato" {
|
||||
return Get-RemotePotato
|
||||
}
|
||||
default { throw [LoginError]::new("Unknown Voicemeeter kind `"$Kind`"") }
|
||||
switch ($Kind) {
|
||||
'basic' {
|
||||
return Get-RemoteBasic
|
||||
}
|
||||
'banana' {
|
||||
return Get-RemoteBanana
|
||||
}
|
||||
'potato' {
|
||||
return Get-RemotePotato
|
||||
}
|
||||
default {
|
||||
throw [LoginError]::new("Unknown Voicemeeter kind `"$Kind`"")
|
||||
}
|
||||
}
|
||||
catch [LoginError], [CAPIError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
throw
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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('')
|
||||
}
|
||||
}
|
||||
202
lib/base.ps1
202
lib/base.ps1
@@ -1,85 +1,108 @@
|
||||
. $PSScriptRoot\errors.ps1
|
||||
. $PSScriptRoot\binding.ps1
|
||||
. $PSScriptRoot\profiles.ps1
|
||||
. $PSScriptRoot\inst.ps1
|
||||
. $PSScriptRoot\strip.ps1
|
||||
. $PSScriptRoot\bus.ps1
|
||||
. $PSScriptRoot\macrobuttons.ps1
|
||||
. $PSScriptRoot\vban.ps1
|
||||
. $PSScriptRoot\command.ps1
|
||||
. $PSScriptRoot\recorder.ps1
|
||||
|
||||
function Login {
|
||||
param(
|
||||
[string]$kindId
|
||||
)
|
||||
try {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_Login()
|
||||
if (-not $retval) {
|
||||
"LOGGED IN" | Write-Verbose
|
||||
}
|
||||
elseif ($retval -eq 1) {
|
||||
"VM NOT RUNNING" | Write-Verbose
|
||||
New-Variable -Name vmExe -Value 0
|
||||
|
||||
if ( $kindId -eq "basic" ) { $vmExe = 1 }
|
||||
elseif ( $kindId -eq "banana" ) { $vmExe = 2 }
|
||||
elseif ( $kindId -eq "potato" ) {
|
||||
$vmExe = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 })
|
||||
}
|
||||
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_RunVoicemeeter([int64]$vmExe)
|
||||
if (-not $retval) {
|
||||
"STARTING VOICEMEETER" | Write-Verbose
|
||||
Start-Sleep -s 1
|
||||
}
|
||||
else {
|
||||
throw [CAPIError]::new($retval, $MyInvocation.MyCommand)
|
||||
}
|
||||
}
|
||||
elseif ($retval -eq -2) {
|
||||
throw [LoginError]::new('login may only be called once per session')
|
||||
}
|
||||
else { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_Login()
|
||||
if ($retval -notin @(0, 1, -2)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_Login')
|
||||
}
|
||||
catch [LoginError] {
|
||||
Write-Warning "$($_.Exception.ErrorMessage()). Fatal error, exiting..."
|
||||
exit -2
|
||||
|
||||
switch ($retval) {
|
||||
1 {
|
||||
'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.')
|
||||
}
|
||||
}
|
||||
|
||||
$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 }
|
||||
"VERSION:[" + $(VmType).ToUpper() + "]" | Write-Verbose
|
||||
}
|
||||
|
||||
function Logout {
|
||||
Start-Sleep -m 20
|
||||
Start-Sleep -m 100
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_Logout()
|
||||
if (-not $retval) { "LOGGED OUT" | Write-Verbose }
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_Logout')
|
||||
}
|
||||
if ($retval -eq 0) { 'Sucessfully logged out' | Write-Verbose }
|
||||
}
|
||||
|
||||
function RunVoicemeeter {
|
||||
param(
|
||||
[string]$kindId
|
||||
)
|
||||
$kinds = @{
|
||||
'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')
|
||||
}
|
||||
}
|
||||
|
||||
function P_Dirty {
|
||||
[bool][Voicemeeter.Remote]::VBVMR_IsParametersDirty()
|
||||
$retval = [Voicemeeter.Remote]::VBVMR_IsParametersDirty()
|
||||
if ($retval -notin @(0, 1)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_IsParametersDirty')
|
||||
}
|
||||
[bool]$retval
|
||||
}
|
||||
|
||||
function M_Dirty {
|
||||
[bool][Voicemeeter.Remote]::VBVMR_MacroButton_IsDirty()
|
||||
$retval = [Voicemeeter.Remote]::VBVMR_MacroButton_IsDirty()
|
||||
if ($retval -notin @(0, 1)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_IsDirty')
|
||||
}
|
||||
[bool]$retval
|
||||
}
|
||||
|
||||
function VmType {
|
||||
New-Variable -Name ptr -Value 0
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterType([ref]$ptr)
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
if ($retval -notin @(0)) {
|
||||
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' }
|
||||
}
|
||||
}
|
||||
|
||||
function Version {
|
||||
function VmVersion {
|
||||
New-Variable -Name ptr -Value 0
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterVersion([ref]$ptr)
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_GetVoicemeeterVersion')
|
||||
}
|
||||
$v1 = ($ptr -band 0xFF000000) -shr 24
|
||||
$v2 = ($ptr -band 0x00FF0000) -shr 16
|
||||
$v3 = ($ptr -band 0x0000FF00) -shr 8
|
||||
@@ -92,28 +115,22 @@ function Param_Get {
|
||||
param(
|
||||
[string]$PARAM, [bool]$IS_STRING = $false
|
||||
)
|
||||
Start-Sleep -m 50
|
||||
Start-Sleep -m 30
|
||||
while (P_Dirty) { Start-Sleep -m 1 }
|
||||
|
||||
if ($IS_STRING) {
|
||||
$BYTES = [System.Byte[]]::new(512)
|
||||
try {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterStringA($PARAM, $BYTES)
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
}
|
||||
catch [CAPIError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterStringA($PARAM, $BYTES)
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_GetParameterStringA')
|
||||
}
|
||||
[System.Text.Encoding]::ASCII.GetString($BYTES).Trim([char]0)
|
||||
}
|
||||
else {
|
||||
New-Variable -Name ptr -Value 0.0
|
||||
try {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterFloat($PARAM, [ref]$ptr)
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
}
|
||||
catch [CAPIError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterFloat($PARAM, [ref]$ptr)
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_GetParameterFloat')
|
||||
}
|
||||
[single]$ptr
|
||||
}
|
||||
@@ -123,17 +140,17 @@ function Param_Set {
|
||||
param(
|
||||
[string]$PARAM, [Object]$VALUE
|
||||
)
|
||||
try {
|
||||
if ($VALUE -is [string]) {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterStringA($PARAM, $VALUE)
|
||||
if ($VALUE -is [string]) {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterStringA($PARAM, $VALUE)
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_SetParameterStringA')
|
||||
}
|
||||
else {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterFloat($PARAM, $VALUE)
|
||||
}
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
}
|
||||
catch [CAPIError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
else {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterFloat($PARAM, $VALUE)
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_SetParameterFloat')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,12 +158,9 @@ function MB_Set {
|
||||
param(
|
||||
[int64]$ID, [single]$SET, [int64]$MODE
|
||||
)
|
||||
try {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_SetStatus($ID, $SET, $MODE)
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
}
|
||||
catch [CAPIError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_SetStatus($ID, $SET, $MODE)
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_SetStatus')
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,12 +172,9 @@ function MB_Get {
|
||||
while (M_Dirty) { Start-Sleep -m 1 }
|
||||
|
||||
New-Variable -Name ptr -Value 0.0
|
||||
try {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_GetStatus($ID, [ref]$ptr, $MODE)
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
}
|
||||
catch [CAPIError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_GetStatus($ID, [ref]$ptr, $MODE)
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_GetStatus')
|
||||
}
|
||||
[int]$ptr
|
||||
}
|
||||
@@ -173,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
|
||||
@@ -195,12 +206,12 @@ function Set_By_Script {
|
||||
param(
|
||||
[string]$script
|
||||
)
|
||||
try {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameters($script)
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
if ($script.Length -gt 48000) {
|
||||
throw [VMRemoteError]::new('Script size cannot be larger than 48kB')
|
||||
}
|
||||
catch [CAPIError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameters($script)
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_SetParameters')
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,12 +220,9 @@ function Get_Level {
|
||||
[int64]$MODE, [int64]$INDEX
|
||||
)
|
||||
New-Variable -Name ptr -Value 0.0
|
||||
try {
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetLevel($MODE, $INDEX, [ref]$ptr)
|
||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
||||
}
|
||||
catch [CAPIError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetLevel($MODE, $INDEX, [ref]$ptr)
|
||||
if ($retval -notin @(0)) {
|
||||
throw [CAPIError]::new($retval, 'VBVMR_GetLevel')
|
||||
}
|
||||
[float]$ptr
|
||||
}
|
||||
@@ -1,18 +1,11 @@
|
||||
function Setup_DLL {
|
||||
try {
|
||||
$vb_path = Get_VMPath
|
||||
. $PSScriptRoot\inst.ps1
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($vb_path)) {
|
||||
throw [VMRemoteError]::new("couldn't get Voicemeeter path")
|
||||
}
|
||||
$dll = Join-Path -Path $vb_path -ChildPath ("VoicemeeterRemote" + `
|
||||
(& { if ([Environment]::Is64BitOperatingSystem) { "64" } else { "" } }) + `
|
||||
".dll")
|
||||
}
|
||||
catch [VMRemoteError] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
return $false
|
||||
}
|
||||
function Setup_DLL {
|
||||
$VMPATH = Get_VMPath
|
||||
|
||||
$dll = Join-Path -Path $VMPATH -ChildPath ('VoicemeeterRemote' + `
|
||||
(& { if ([Environment]::Is64BitOperatingSystem) { '64' } else { '' } }) + `
|
||||
'.dll')
|
||||
|
||||
$Signature = @"
|
||||
[DllImport(@"$dll")]
|
||||
@@ -53,5 +46,5 @@ function Setup_DLL {
|
||||
"@
|
||||
|
||||
Add-Type -MemberDefinition $Signature -Name Remote -Namespace Voicemeeter -PassThru | Out-Null
|
||||
return $true
|
||||
return $VMPATH
|
||||
}
|
||||
|
||||
131
lib/bus.ps1
131
lib/bus.ps1
@@ -1,36 +1,4 @@
|
||||
. $PSScriptRoot\meta.ps1
|
||||
|
||||
class IBus {
|
||||
[int]$index
|
||||
[Object]$remote
|
||||
|
||||
IBus ([int]$index, [Object]$remote) {
|
||||
$this.index = $index
|
||||
$this.remote = $remote
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Bus[" + $this.index + "]"
|
||||
}
|
||||
|
||||
[string] ToString() {
|
||||
return $this.GetType().Name + $this.index
|
||||
}
|
||||
|
||||
[single] Getter ($param) {
|
||||
return $this.remote.Getter("$($this.identifier()).$param")
|
||||
}
|
||||
|
||||
[string] Getter_String ($param) {
|
||||
return $this.remote.Getter_String("$($this.identifier()).$param")
|
||||
}
|
||||
|
||||
[void] Setter ($param, $val) {
|
||||
$this.remote.Setter("$($this.identifier()).$param", $val)
|
||||
}
|
||||
}
|
||||
|
||||
class Bus : IBus {
|
||||
class Bus : IRemote {
|
||||
[Object]$mode
|
||||
[Object]$eq
|
||||
[Object]$levels
|
||||
@@ -45,6 +13,10 @@ class Bus : IBus {
|
||||
$this.levels = [BusLevels]::new($index, $remote)
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return 'Bus[' + $this.index + ']'
|
||||
}
|
||||
|
||||
[void] FadeTo ([single]$target, [int]$time) {
|
||||
$this.Setter('FadeTo', "($target, $time)")
|
||||
}
|
||||
@@ -54,7 +26,7 @@ class Bus : IBus {
|
||||
}
|
||||
}
|
||||
|
||||
class BusLevels : IBus {
|
||||
class BusLevels : IRemote {
|
||||
[int]$init
|
||||
[int]$offset
|
||||
|
||||
@@ -85,7 +57,7 @@ class BusLevels : IBus {
|
||||
}
|
||||
}
|
||||
|
||||
class BusMode : IBus {
|
||||
class BusMode : IRemote {
|
||||
[System.Collections.ArrayList]$modes
|
||||
|
||||
BusMode ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
@@ -98,7 +70,7 @@ class BusMode : IBus {
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Bus[" + $this.index + "].mode"
|
||||
return 'Bus[' + $this.index + '].mode'
|
||||
}
|
||||
|
||||
[string] Get () {
|
||||
@@ -111,13 +83,12 @@ class BusMode : IBus {
|
||||
}
|
||||
}
|
||||
|
||||
class BusEq : IBus {
|
||||
BusEq ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
AddBoolMembers -PARAMS @('on', 'ab')
|
||||
class BusEq : Eq {
|
||||
BusEq ([int]$index, [Object]$remote) : base ($index, $remote, 'Bus') {
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Bus[" + $this.index + "].EQ"
|
||||
return 'Bus[' + $this.index + '].EQ'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,75 +100,35 @@ class PhysicalBus : Bus {
|
||||
}
|
||||
}
|
||||
|
||||
class BusDevice : IBus {
|
||||
class VirtualBus : Bus {
|
||||
[Object]$device
|
||||
|
||||
VirtualBus ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
if ($this.remote.kind.name -eq 'basic') {
|
||||
$this.device = [BusDevice]::new($index, $remote)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class BusDevice : Device {
|
||||
BusDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
if ($this.index -eq 0) {
|
||||
$this.AddASIO()
|
||||
}
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Bus[" + $this.index + "].Device"
|
||||
return 'Bus[' + $this.index + '].Device'
|
||||
}
|
||||
|
||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||
{
|
||||
$this.Getter_String('name')
|
||||
} `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).name is read only")
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
||||
{
|
||||
$this.Getter('sr')
|
||||
} `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).sr is read only")
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_wdm = $($this | Add-Member ScriptProperty 'wdm' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).wdm is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('wdm', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_ks = $($this | Add-Member ScriptProperty 'ks' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).ks is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('ks', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_mme = $($this | Add-Member ScriptProperty 'mme' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).mme is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('mme', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_asio = $($this | Add-Member ScriptProperty 'asio' `
|
||||
{
|
||||
hidden [void] AddASIO () {
|
||||
Add-Member -InputObject $this -MemberType ScriptProperty -Name 'asio' `
|
||||
-Value {
|
||||
return Write-Warning ("ERROR: $($this.identifier()).asio is write only")
|
||||
} `
|
||||
{
|
||||
} -SecondValue {
|
||||
param($arg)
|
||||
return $this.Setter('asio', $arg)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
class VirtualBus : Bus {
|
||||
VirtualBus ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
} -Force
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,42 +1,20 @@
|
||||
. $PSScriptRoot\meta.ps1
|
||||
. $PSScriptRoot\inst.ps1
|
||||
|
||||
class Special {
|
||||
[Object]$remote
|
||||
|
||||
Special ([Object]$remote) {
|
||||
class Special : IRemote {
|
||||
Special ([Object]$remote) : base ($remote) {
|
||||
AddActionMembers -PARAMS @('restart', 'shutdown', 'show')
|
||||
|
||||
$this.remote = $remote
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
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)
|
||||
}
|
||||
return 'Command'
|
||||
}
|
||||
|
||||
[void] RunMacrobuttons() {
|
||||
Start-Process -FilePath $(Join-Path -Path $(Get_VMPath) -ChildPath "VoicemeeterMacroButtons.exe")
|
||||
'Launching the MacroButtons app' | Write-Verbose
|
||||
Start-Process -FilePath $(Join-Path -Path $this.remote.vmpath -ChildPath 'VoicemeeterMacroButtons.exe')
|
||||
}
|
||||
|
||||
[void] CloseMacrobuttons() {
|
||||
Stop-Process -Name "VoicemeeterMacroButtons"
|
||||
'Closing the MacroButtons app' | Write-Verbose
|
||||
Stop-Process -Name 'VoicemeeterMacroButtons'
|
||||
}
|
||||
|
||||
hidden $_hide = $($this | Add-Member ScriptProperty 'hide' `
|
||||
|
||||
52
lib/device.ps1
Normal file
52
lib/device.ps1
Normal file
@@ -0,0 +1,52 @@
|
||||
class Device : IRemote {
|
||||
Device ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
}
|
||||
|
||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||
{
|
||||
$this.Getter_String('name')
|
||||
} `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).name is read only")
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
||||
{
|
||||
[int]$this.Getter('sr')
|
||||
} `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).sr is read only")
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_wdm = $($this | Add-Member ScriptProperty 'wdm' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).wdm is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('wdm', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_ks = $($this | Add-Member ScriptProperty 'ks' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).ks is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('ks', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_mme = $($this | Add-Member ScriptProperty 'mme' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).mme is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('mme', $arg)
|
||||
}
|
||||
)
|
||||
}
|
||||
60
lib/eq.ps1
Normal file
60
lib/eq.ps1
Normal file
@@ -0,0 +1,60 @@
|
||||
class Eq : IRemote {
|
||||
[System.Collections.ArrayList]$channel
|
||||
[string]$kindOfEq
|
||||
|
||||
Eq ([int]$index, [Object]$remote, [string]$kindOfEq) : base ($index, $remote) {
|
||||
$this.kindOfEq = $kindOfEq
|
||||
|
||||
AddBoolMembers -PARAMS @('on', 'ab')
|
||||
|
||||
$this.channel = @()
|
||||
for ($ch = 0; $ch -lt $remote.kind.eq_ch[$this.kindOfEq]; $ch++) {
|
||||
$this.channel.Add([EqChannel]::new($ch, $remote, $this.identifier()))
|
||||
}
|
||||
}
|
||||
|
||||
[void] Load ([string]$filename) {
|
||||
$param = 'Command.Load{0}Eq[{1}]' -f $this.kindOfEq, $this.index
|
||||
$this.remote.Setter($param, $filename)
|
||||
}
|
||||
|
||||
[void] Save ([string]$filename) {
|
||||
$param = 'Command.Save{0}Eq[{1}]' -f $this.kindOfEq, $this.index
|
||||
$this.remote.Setter($param, $filename)
|
||||
}
|
||||
}
|
||||
|
||||
class EqChannel : IRemote {
|
||||
[System.Collections.ArrayList]$cell
|
||||
[string]$eqId
|
||||
|
||||
EqChannel ([int]$index, [Object]$remote, [string]$eqId) : base ($index, $remote) {
|
||||
$this.eqId = $eqId
|
||||
|
||||
$this.cell = @()
|
||||
$cellCount = $this.remote.kind.cells
|
||||
for ($c = 0; $c -lt $cellCount; $c++) {
|
||||
$this.cell.Add([EqCell]::new($c, $remote, $this.identifier()))
|
||||
}
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return '{0}.Channel[{1}]' -f $this.eqId, $this.index
|
||||
}
|
||||
}
|
||||
|
||||
class EqCell : IRemote {
|
||||
[string]$channelId
|
||||
|
||||
EqCell ([int]$index, [Object]$remote, [string]$channelId) : base ($index, $remote) {
|
||||
$this.channelId = $channelId
|
||||
|
||||
AddBoolMembers -PARAMS @('on')
|
||||
AddIntMembers -PARAMS @('type')
|
||||
AddFloatMembers -PARAMS @('f', 'gain', 'q')
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return '{0}.Cell[{1}]' -f $this.channelId, $this.index
|
||||
}
|
||||
}
|
||||
@@ -1,30 +1,19 @@
|
||||
class VMRemoteError : Exception {
|
||||
[string]$msg
|
||||
|
||||
VMRemoteError ([string]$msg) {
|
||||
$this.msg = $msg
|
||||
}
|
||||
|
||||
[string] ErrorMessage () {
|
||||
return $this.msg
|
||||
VMRemoteError ([string]$msg) : base ($msg) {
|
||||
}
|
||||
}
|
||||
|
||||
class LoginError : VMRemoteError {
|
||||
LoginError ([string]$msg) : base ([string]$msg) {
|
||||
LoginError ([string]$msg) : base ($msg) {
|
||||
}
|
||||
}
|
||||
|
||||
class CAPIError : VMRemoteError {
|
||||
[int]$retval
|
||||
[string]$caller
|
||||
[int]$code
|
||||
[string]$function
|
||||
|
||||
CAPIError ([int]$retval, [string]$caller) {
|
||||
$this.retval = $retval
|
||||
$this.caller = $caller
|
||||
}
|
||||
|
||||
[string] ErrorMessage () {
|
||||
return "CAPI return value: {0} in {1}" -f $this.retval, $this.caller
|
||||
CAPIError ([int]$code, [string]$function) : base ("$function returned $code") {
|
||||
$this.code = $code
|
||||
$this.function = $function
|
||||
}
|
||||
}
|
||||
37
lib/fx.ps1
Normal file
37
lib/fx.ps1
Normal file
@@ -0,0 +1,37 @@
|
||||
class Fx : IRemote {
|
||||
[Object]$reverb
|
||||
[Object]$delay
|
||||
|
||||
Fx ([Object]$remote) : base ($remote) {
|
||||
$this.reverb = [FxReverb]::new($remote)
|
||||
$this.delay = [FxDelay]::new($remote)
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return 'Fx'
|
||||
}
|
||||
}
|
||||
|
||||
class FxReverb : IRemote {
|
||||
FxReverb ([Object]$remote) : base ($remote) {
|
||||
AddBoolMembers -PARAMS @('on', 'ab')
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return 'Fx.Reverb'
|
||||
}
|
||||
}
|
||||
|
||||
class FxDelay : IRemote {
|
||||
FxDelay ([Object]$remote) : base ($remote) {
|
||||
AddBoolMembers -PARAMS @('on', 'ab')
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return 'Fx.Delay'
|
||||
}
|
||||
}
|
||||
|
||||
function Make_Fx ([Object]$remote) {
|
||||
return [Fx]::new($remote)
|
||||
}
|
||||
21
lib/inst.ps1
21
lib/inst.ps1
@@ -1,8 +1,19 @@
|
||||
function Get_VMPath {
|
||||
$reg_path = "Registry::HKEY_LOCAL_MACHINE\Software" + `
|
||||
(& { if ([Environment]::Is64BitOperatingSystem) { "\WOW6432Node" } else { "" } }) + `
|
||||
"\Microsoft\Windows\CurrentVersion\Uninstall"
|
||||
$vm_key = "\VB:Voicemeeter {17359A74-1236-5467}\"
|
||||
$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}'
|
||||
|
||||
return $(Get-ItemPropertyValue -Path ($reg_path + $vm_key) -Name UninstallString | Split-Path -Parent)
|
||||
try {
|
||||
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.')
|
||||
}
|
||||
}
|
||||
|
||||
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,45 @@
|
||||
$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
|
||||
'asio_in' = 4
|
||||
'asio_out' = 8
|
||||
'composite' = 0
|
||||
'insert' = 0
|
||||
'vban' = @{ 'in' = 4; 'out' = 4; 'midi' = 1; 'text' = 1 }
|
||||
'eq_ch' = @{ 'strip' = 0; 'bus' = 0 }
|
||||
'cells' = 0
|
||||
};
|
||||
"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
|
||||
'asio_in' = 6
|
||||
'asio_out' = 8
|
||||
'composite' = 8
|
||||
'insert' = 22
|
||||
'vban' = @{ 'in' = 8; 'out' = 8; 'midi' = 1; 'text' = 1 }
|
||||
'eq_ch' = @{ 'strip' = 0; 'bus' = 8 }
|
||||
'cells' = 6
|
||||
};
|
||||
"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
|
||||
'asio_in' = 10
|
||||
'asio_out' = 8
|
||||
'composite' = 8
|
||||
'insert' = 34
|
||||
'vban' = @{ 'in' = 8; 'out' = 8; 'midi' = 1; 'text' = 1 }
|
||||
'eq_ch' = @{ 'strip' = 2; 'bus' = 8 }
|
||||
'cells' = 6
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
enum ButtonTypes {
|
||||
State = 1
|
||||
StateOnly = 2
|
||||
Trigger = 3
|
||||
}
|
||||
|
||||
class MacroButton {
|
||||
[int32]$index
|
||||
|
||||
@@ -10,40 +16,42 @@ class MacroButton {
|
||||
}
|
||||
|
||||
[int] Getter ($mode) {
|
||||
"Button[$($this.index)].$([ButtonTypes].GetEnumName($mode))" | Write-Debug
|
||||
return MB_Get -Id $this.index -Mode $mode
|
||||
}
|
||||
|
||||
[void] Setter ($set, $mode) {
|
||||
MB_Set -Id $this.index -SET $set -Mode $mode
|
||||
[void] Setter ($val, $mode) {
|
||||
"Button[$($this.index)].$([ButtonTypes].GetEnumName($mode))=$val" | Write-Debug
|
||||
MB_Set -Id $this.index -SET $val -Mode $mode
|
||||
}
|
||||
|
||||
hidden $_state = $($this | Add-Member ScriptProperty 'state' `
|
||||
{
|
||||
[bool]$this.Getter(1)
|
||||
[bool]$this.Getter([ButtonTypes]::State)
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
$this._state = $this.Setter($arg, 1)
|
||||
$this._state = $this.Setter($arg, [ButtonTypes]::State)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_stateonly = $($this | Add-Member ScriptProperty 'stateonly' `
|
||||
{
|
||||
[bool]$this.Getter(2)
|
||||
[bool]$this.Getter([ButtonTypes]::StateOnly)
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
$this._stateonly = $this.Setter($arg, 2)
|
||||
$this._stateonly = $this.Setter($arg, [ButtonTypes]::StateOnly)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_trigger = $($this | Add-Member ScriptProperty 'trigger' `
|
||||
{
|
||||
[bool]$this.Getter(3)
|
||||
[bool]$this.Getter([ButtonTypes]::Trigger)
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
$this._trigger = $this.Setter($arg, 3)
|
||||
$this._trigger = $this.Setter($arg, [ButtonTypes]::Trigger)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
32
lib/meta.ps1
32
lib/meta.ps1
@@ -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
|
||||
}
|
||||
|
||||
116
lib/option.ps1
Normal file
116
lib/option.ps1
Normal file
@@ -0,0 +1,116 @@
|
||||
class Option : IRemote {
|
||||
[System.Collections.ArrayList]$delay
|
||||
[Object]$buffer
|
||||
|
||||
Option ([Object]$remote) : base ($remote) {
|
||||
AddBoolMembers -PARAMS @('asiosr', 'monitorOnSel', 'sliderMode')
|
||||
|
||||
$this.buffer = [OptionBuffer]::new($remote)
|
||||
|
||||
$num_A = $this.remote.kind.p_out
|
||||
if ($this.remote.kind.name -eq 'basic') {
|
||||
$num_A += $this.remote.kind.v_out
|
||||
}
|
||||
|
||||
$this.delay = @()
|
||||
for ($i = 0; $i -lt $num_A; $i++) {
|
||||
$this.delay.Add([FloatArrayMember]::new($i, 'delay', $this, 2))
|
||||
}
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return 'Option'
|
||||
}
|
||||
|
||||
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
||||
{
|
||||
$this.Getter('sr')
|
||||
} `
|
||||
{
|
||||
param([int]$arg)
|
||||
$opts = @(32000, 44100, 48000, 88200, 96000, 176400, 192000)
|
||||
if ($opts.Contains($arg)) {
|
||||
$this._sr = $this.Setter('sr', $arg)
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected one of', $opts)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
class OptionBuffer : IRemote {
|
||||
OptionBuffer ([Object]$remote) : base ($remote) {}
|
||||
|
||||
[string] identifier () {
|
||||
return 'Option.Buffer'
|
||||
}
|
||||
|
||||
hidden $_mme = $($this | Add-Member ScriptProperty 'mme' `
|
||||
{
|
||||
$this.Getter('mme')
|
||||
} `
|
||||
{
|
||||
param([int]$arg)
|
||||
$opts = @(441, 480, 512, 576, 640, 704, 768, 896, 1024, 1536, 2048)
|
||||
if ($opts.Contains($arg)) {
|
||||
$this._mme = $this.Setter('mme', $arg)
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected one of', $opts)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_wdm = $($this | Add-Member ScriptProperty 'wdm' `
|
||||
{
|
||||
$this.Getter('wdm')
|
||||
} `
|
||||
{
|
||||
param([int]$arg)
|
||||
$opts = @(128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024, 1536, 2048)
|
||||
if ($opts.Contains($arg)) {
|
||||
$this._wdm = $this.Setter('wdm', $arg)
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected one of', $opts)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_ks = $($this | Add-Member ScriptProperty 'ks' `
|
||||
{
|
||||
$this.Getter('ks')
|
||||
} `
|
||||
{
|
||||
param([int]$arg)
|
||||
$opts = @(128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024, 1536, 2048)
|
||||
if ($opts.Contains($arg)) {
|
||||
$this._ks = $this.Setter('ks', $arg)
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected one of', $opts)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_asio = $($this | Add-Member ScriptProperty 'asio' `
|
||||
{
|
||||
$this.Getter('asio')
|
||||
} `
|
||||
{
|
||||
param([int]$arg)
|
||||
$opts = @(0, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024)
|
||||
if ($opts.Contains($arg)) {
|
||||
$this._asio = $this.Setter('asio', $arg)
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected one of', $opts)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
function Make_Option ([Object]$remote) {
|
||||
return [Option]::new($remote)
|
||||
}
|
||||
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) {
|
||||
$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 $_
|
||||
}
|
||||
}
|
||||
@@ -24,14 +24,9 @@ function Set_Profile {
|
||||
param(
|
||||
[Object]$DATA, [string]$CONF
|
||||
)
|
||||
try {
|
||||
if ($null -eq $DATA -or -not $DATA.$CONF) {
|
||||
throw [VMRemoteErrors]::new("No profile named $CONF was loaded")
|
||||
}
|
||||
Param_Set_Multi -HASH $DATA.$CONF
|
||||
Start-Sleep -m 1
|
||||
}
|
||||
catch [VMRemoteErrors] {
|
||||
Write-Warning $_.Exception.ErrorMessage()
|
||||
if ($null -eq $DATA -or -not $DATA.$CONF) {
|
||||
throw [VMRemoteErrors]::new("No profile named '$CONF' has been loaded into memory.")
|
||||
}
|
||||
Param_Set_Multi -HASH $DATA.$CONF
|
||||
Start-Sleep -m 1
|
||||
}
|
||||
|
||||
@@ -1,37 +1,4 @@
|
||||
. $PSScriptRoot\meta.ps1
|
||||
|
||||
class IRecorder {
|
||||
[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
|
||||
class Recorder : IRemote {
|
||||
[Object]$mode
|
||||
[System.Collections.ArrayList]$armstrip
|
||||
[System.Collections.ArrayList]$armbus
|
||||
@@ -53,11 +20,7 @@ class Recorder : IRecorder {
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Recorder"
|
||||
}
|
||||
|
||||
[string] ToString() {
|
||||
return $this.GetType().Name
|
||||
return 'Recorder'
|
||||
}
|
||||
|
||||
hidden $_loop = $($this | Add-Member ScriptProperty 'loop' `
|
||||
@@ -139,9 +102,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] {
|
||||
@@ -152,35 +115,32 @@ 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)
|
||||
}
|
||||
}
|
||||
|
||||
class RecorderMode : IRecorder {
|
||||
class RecorderMode : IRemote {
|
||||
RecorderMode ([Object]$remote) : base ($remote) {
|
||||
AddBoolMembers -PARAMS @('recbus', 'playonload', 'loop', 'multitrack')
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Recorder.Mode"
|
||||
return 'Recorder.Mode'
|
||||
}
|
||||
}
|
||||
|
||||
class RecorderArm : IRecorder {
|
||||
[int]$index
|
||||
|
||||
RecorderArm ([int]$index, [Object]$remote) : base ($remote) {
|
||||
$this.index = $index
|
||||
class RecorderArm : IRemote {
|
||||
RecorderArm ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
}
|
||||
|
||||
Set ([bool]$val) {
|
||||
$this.Setter("", $(if ($val) { 1 } else { 0 }))
|
||||
$this.Setter('', $(if ($val) { 1 } else { 0 }))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
117
lib/strip.ps1
117
lib/strip.ps1
@@ -1,32 +1,4 @@
|
||||
. $PSScriptRoot\meta.ps1
|
||||
|
||||
class IStrip {
|
||||
[int]$index
|
||||
[Object]$remote
|
||||
|
||||
IStrip ([int]$index, [Object]$remote) {
|
||||
$this.index = $index
|
||||
$this.remote = $remote
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Strip[" + $this.index + "]"
|
||||
}
|
||||
|
||||
[single] Getter ($param) {
|
||||
return $this.remote.Getter("$($this.identifier()).$param")
|
||||
}
|
||||
|
||||
[string] Getter_String ($param) {
|
||||
return $this.remote.Getter_String("$($this.identifier()).$param")
|
||||
}
|
||||
|
||||
[void] Setter ($param, $val) {
|
||||
$this.remote.Setter("$($this.identifier()).$param", $val)
|
||||
}
|
||||
}
|
||||
|
||||
class Strip : IStrip {
|
||||
class Strip : IRemote {
|
||||
[Object]$levels
|
||||
|
||||
Strip ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
@@ -41,8 +13,8 @@ class Strip : IStrip {
|
||||
$this.levels = [StripLevels]::new($index, $remote)
|
||||
}
|
||||
|
||||
[string] ToString() {
|
||||
return $this.GetType().Name + $this.index
|
||||
[string] identifier () {
|
||||
return 'Strip[' + $this.index + ']'
|
||||
}
|
||||
|
||||
[void] FadeTo ([single]$target, [int]$time) {
|
||||
@@ -54,7 +26,7 @@ class Strip : IStrip {
|
||||
}
|
||||
}
|
||||
|
||||
class StripLevels : IStrip {
|
||||
class StripLevels : IRemote {
|
||||
[int]$init
|
||||
[int]$offset
|
||||
|
||||
@@ -120,14 +92,14 @@ class PhysicalStrip : Strip {
|
||||
}
|
||||
}
|
||||
|
||||
class StripComp : IStrip {
|
||||
class StripComp : IRemote {
|
||||
StripComp ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
AddFloatMembers -PARAMS @('gainin', 'ratio', 'threshold', 'attack', 'release', 'knee', 'gainout')
|
||||
AddBoolMembers -PARAMS @('makeup')
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Strip[" + $this.index + "].Comp"
|
||||
return 'Strip[' + $this.index + '].Comp'
|
||||
}
|
||||
|
||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||
@@ -141,13 +113,13 @@ class StripComp : IStrip {
|
||||
)
|
||||
}
|
||||
|
||||
class StripGate : IStrip {
|
||||
class StripGate : IRemote {
|
||||
StripGate ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
AddFloatMembers -PARAMS @('threshold', 'damping', 'bpsidechain', 'attack', 'hold', 'release')
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Strip[" + $this.index + "].Gate"
|
||||
return 'Strip[' + $this.index + '].Gate'
|
||||
}
|
||||
|
||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||
@@ -161,12 +133,12 @@ class StripGate : IStrip {
|
||||
)
|
||||
}
|
||||
|
||||
class StripDenoiser : IStrip {
|
||||
class StripDenoiser : IRemote {
|
||||
StripDenoiser ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Strip[" + $this.index + "].Denoiser"
|
||||
return 'Strip[' + $this.index + '].Denoiser'
|
||||
}
|
||||
|
||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||
@@ -180,81 +152,22 @@ class StripDenoiser : IStrip {
|
||||
)
|
||||
}
|
||||
|
||||
class StripEq : IStrip {
|
||||
StripEq ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
AddBoolMembers -PARAMS @('on', 'ab')
|
||||
class StripEq : Eq {
|
||||
StripEq ([int]$index, [Object]$remote) : base ($index, $remote, 'Strip') {
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Strip[" + $this.index + "].EQ"
|
||||
return 'Strip[' + $this.index + '].EQ'
|
||||
}
|
||||
}
|
||||
|
||||
class StripDevice : IStrip {
|
||||
class StripDevice : Device {
|
||||
StripDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "Strip[" + $this.index + "].Device"
|
||||
return 'Strip[' + $this.index + '].Device'
|
||||
}
|
||||
|
||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||
{
|
||||
$this.Getter_String('name')
|
||||
} `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).name is read only")
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
||||
{
|
||||
$this.Getter('sr')
|
||||
} `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).sr is read only")
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_wdm = $($this | Add-Member ScriptProperty 'wdm' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).wdm is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('wdm', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_ks = $($this | Add-Member ScriptProperty 'ks' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).ks is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('ks', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_mme = $($this | Add-Member ScriptProperty 'mme' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).mme is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('mme', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_asio = $($this | Add-Member ScriptProperty 'asio' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).asio is write only")
|
||||
} `
|
||||
{
|
||||
param($arg)
|
||||
return $this.Setter('asio', $arg)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
class VirtualStrip : Strip {
|
||||
|
||||
239
lib/vban.ps1
239
lib/vban.ps1
@@ -1,75 +1,27 @@
|
||||
class IVban {
|
||||
[int32]$index
|
||||
[Object]$remote
|
||||
class Vban : IRemote {
|
||||
[string]$direction
|
||||
|
||||
IVban ([int]$index, [Object]$remote, [string]$direction) {
|
||||
$this.index = $index
|
||||
$this.remote = $remote
|
||||
Vban ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote) {
|
||||
$this.direction = $direction
|
||||
}
|
||||
|
||||
[string] identifier () {
|
||||
return "vban." + $this.direction + "stream[" + $this.index + "]"
|
||||
}
|
||||
|
||||
[string] ToString() {
|
||||
return $this.GetType().Name + $this.index
|
||||
}
|
||||
|
||||
[single] Getter ($param) {
|
||||
return $this.remote.Getter("$($this.identifier()).$param")
|
||||
}
|
||||
|
||||
[string] Getter_String ($param) {
|
||||
return $this.remote.Getter_String("$($this.identifier()).$param")
|
||||
}
|
||||
|
||||
[void] Setter ($param, $val) {
|
||||
$this.remote.Setter("$($this.identifier()).$param", $val)
|
||||
return 'vban.' + $this.direction + 'stream[' + $this.index + ']'
|
||||
}
|
||||
}
|
||||
|
||||
class Vban : IVban {
|
||||
Vban ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
|
||||
class VbanAudio : Vban {
|
||||
VbanAudio ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
|
||||
AddBoolMembers -PARAMS @('on')
|
||||
AddStringMembers -PARAMS @('name', 'ip')
|
||||
}
|
||||
|
||||
hidden $_on = $($this | Add-Member ScriptProperty 'on' `
|
||||
{
|
||||
$this.Getter('on')
|
||||
} `
|
||||
{
|
||||
param([bool]$arg)
|
||||
$this._on = $this.Setter('on', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||
{
|
||||
$this.Getter_String('name')
|
||||
} `
|
||||
{
|
||||
param([string]$arg)
|
||||
$this._name = $this.Setter('name', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_ip = $($this | Add-Member ScriptProperty 'ip' `
|
||||
{
|
||||
$this.Getter_String('ip')
|
||||
} `
|
||||
{
|
||||
param([string]$arg)
|
||||
$this._ip = $this.Setter('ip', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_port = $($this | Add-Member ScriptProperty 'port' `
|
||||
{
|
||||
$this.Getter('port')
|
||||
[int]$this.Getter('port')
|
||||
} `
|
||||
{
|
||||
param([string]$arg)
|
||||
param([int]$arg)
|
||||
if ($arg -ge 1024 -and $arg -le 65535) {
|
||||
$this._port = $this.Setter('port', $arg)
|
||||
}
|
||||
@@ -81,15 +33,15 @@ class Vban : IVban {
|
||||
|
||||
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
||||
{
|
||||
$this.Getter('sr')
|
||||
[int]$this.Getter('sr')
|
||||
} `
|
||||
{
|
||||
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)) {
|
||||
$this._port = $this.Setter('sr', $arg)
|
||||
$this._sr = $this.Setter('sr', $arg)
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected one of', $opts)
|
||||
@@ -100,11 +52,11 @@ class Vban : IVban {
|
||||
|
||||
hidden $_channel = $($this | Add-Member ScriptProperty 'channel' `
|
||||
{
|
||||
$this.Getter('channel')
|
||||
[int]$this.Getter('channel')
|
||||
} `
|
||||
{
|
||||
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)
|
||||
@@ -123,7 +75,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 }
|
||||
@@ -138,63 +90,156 @@ class Vban : IVban {
|
||||
|
||||
hidden $_quality = $($this | Add-Member ScriptProperty 'quality' `
|
||||
{
|
||||
$this.Getter('quality')
|
||||
[int]$this.Getter('quality')
|
||||
} `
|
||||
{
|
||||
param([int]$arg)
|
||||
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
|
||||
if ($arg -ge 0 -and $arg -le 4) {
|
||||
$this._quality = $this.Setter('quality', $arg)
|
||||
}
|
||||
else {
|
||||
if ($arg -ge 0 -and $arg -le 4) {
|
||||
$this._quality = $this.Setter('quality', $arg)
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected value from 0 to 4')
|
||||
}
|
||||
Write-Warning ('Expected value from 0 to 4')
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_route = $($this | Add-Member ScriptProperty 'route' `
|
||||
{
|
||||
$this.Getter('route')
|
||||
[int]$this.Getter('route')
|
||||
} `
|
||||
{
|
||||
param([int]$arg)
|
||||
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
|
||||
$rt = $this.remote.kind['p_' + $this.direction] + $this.remote.kind['v_' + $this.direction] - 1
|
||||
if ($arg -ge 0 -and $arg -le $rt) {
|
||||
$this._route = $this.Setter('route', $arg)
|
||||
}
|
||||
else {
|
||||
if ($arg -ge 0 -and $arg -le 8) {
|
||||
$this._route = $this.Setter('route', $arg)
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected value from 0 to 8')
|
||||
}
|
||||
Write-Warning ("Expected value from 0 to $rt")
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
class VbanMidi : Vban {
|
||||
VbanMidi ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
|
||||
}
|
||||
|
||||
class VbanInstream : Vban {
|
||||
VbanInstream ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
|
||||
hidden $_on = $($this | Add-Member ScriptProperty 'on' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).on is write only")
|
||||
} `
|
||||
{
|
||||
param([bool]$arg)
|
||||
$this._on = $this.Setter('on', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).name is write only")
|
||||
} `
|
||||
{
|
||||
param([string]$arg)
|
||||
$this._name = $this.Setter('name', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_ip = $($this | Add-Member ScriptProperty 'ip' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).ip is write only")
|
||||
} `
|
||||
{
|
||||
param([string]$arg)
|
||||
$this._ip = $this.Setter('ip', $arg)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
class VbanText : Vban {
|
||||
VbanText ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
|
||||
}
|
||||
|
||||
hidden $_on = $($this | Add-Member ScriptProperty 'on' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).on is write only")
|
||||
} `
|
||||
{
|
||||
param([bool]$arg)
|
||||
$this._on = $this.Setter('on', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).name is write only")
|
||||
} `
|
||||
{
|
||||
param([string]$arg)
|
||||
$this._name = $this.Setter('name', $arg)
|
||||
}
|
||||
)
|
||||
|
||||
hidden $_ip = $($this | Add-Member ScriptProperty 'ip' `
|
||||
{
|
||||
return Write-Warning ("ERROR: $($this.identifier()).ip is write only")
|
||||
} `
|
||||
{
|
||||
param([string]$arg)
|
||||
$this._ip = $this.Setter('ip', $arg)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
class VbanInAudio : VbanAudio {
|
||||
VbanInAudio ([int]$index, [Object]$remote) : base ($index, $remote, 'in') {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class VbanOutstream : Vban {
|
||||
VbanOutstream ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
|
||||
class VbanInMidi : VbanMidi {
|
||||
VbanInMidi ([int]$index, [Object]$remote) : base ($index, $remote, 'in') {
|
||||
}
|
||||
}
|
||||
|
||||
class VbanInText : VbanText {
|
||||
VbanInText ([int]$index, [Object]$remote) : base ($index, $remote, 'in') {
|
||||
}
|
||||
}
|
||||
|
||||
class VbanOutAudio : VbanAudio {
|
||||
VbanOutAudio ([int]$index, [Object]$remote) : base ($index, $remote, 'out') {
|
||||
}
|
||||
}
|
||||
|
||||
class VbanOutMidi : VbanMidi {
|
||||
VbanOutMidi ([int]$index, [Object]$remote) : base ($index, $remote, 'out') {
|
||||
}
|
||||
}
|
||||
|
||||
function Make_Vban ([Object]$remote) {
|
||||
[System.Collections.ArrayList]$instream = @()
|
||||
[System.Collections.ArrayList]$outstream = @()
|
||||
|
||||
0..$($remote.kind.vban_in - 1) | ForEach-Object {
|
||||
[void]$instream.Add([VbanInstream]::new($_, $remote, "in"))
|
||||
$totalInstreams = $remote.kind.vban.in + $remote.kind.vban.midi + $remote.kind.vban.text
|
||||
$totalOutstreams = $remote.kind.vban.out + $remote.kind.vban.midi
|
||||
|
||||
for ($i = 0; $i -lt $totalInstreams; $i++) {
|
||||
if ($i -lt $remote.kind.vban.in) {
|
||||
[void]$instream.Add([VbanInAudio]::new($i, $remote))
|
||||
}
|
||||
elseif ($i -lt ($remote.kind.vban.in + $remote.kind.vban.midi)) {
|
||||
[void]$instream.Add([VbanInMidi]::new($i, $remote))
|
||||
}
|
||||
else {
|
||||
[void]$instream.Add([VbanInText]::new($i, $remote))
|
||||
}
|
||||
}
|
||||
0..$($remote.kind.vban_out - 1) | ForEach-Object {
|
||||
[void]$outstream.Add([VbanOutstream]::new($_, $remote, "out"))
|
||||
for ($i = 0; $i -lt $totalOutstreams; $i++) {
|
||||
if ($i -lt $remote.kind.vban.out) {
|
||||
[void]$outstream.Add([VbanOutAudio]::new($i, $remote))
|
||||
}
|
||||
else {
|
||||
[void]$outstream.Add([VbanOutMidi]::new($i, $remote))
|
||||
}
|
||||
}
|
||||
|
||||
$CustomObject = [pscustomobject]@{
|
||||
@@ -204,11 +249,25 @@ function Make_Vban ([Object]$remote) {
|
||||
|
||||
$CustomObject | Add-Member ScriptProperty 'enable' `
|
||||
{
|
||||
return Write-Warning ("ERROR: vban.enable is write only")
|
||||
return [bool]( Param_Get -PARAM 'vban.enable' )
|
||||
} `
|
||||
{
|
||||
param([bool]$arg)
|
||||
Param_Set -PARAM 'vban.Enable' -Value $(if ($arg) { 1 } else { 0 })
|
||||
Param_Set -PARAM 'vban.enable' -Value $(if ($arg) { 1 } else { 0 })
|
||||
}
|
||||
|
||||
$CustomObject | Add-Member ScriptProperty 'port' `
|
||||
{
|
||||
return [int]( Param_Get -PARAM 'vban.instream[0].port' )
|
||||
} `
|
||||
{
|
||||
param([int]$arg)
|
||||
if ($arg -ge 1024 -and $arg -le 65535) {
|
||||
Param_Set -PARAM 'vban.instream[0].port' -Value $arg
|
||||
}
|
||||
else {
|
||||
Write-Warning ('Expected value from 1024 to 65535')
|
||||
}
|
||||
}
|
||||
|
||||
$CustomObject
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
||||
Describe 'Bool tests' -ForEach @(
|
||||
Describe 'Bool tests' -Tag 'bool' -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
|
||||
@@ -27,25 +27,32 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
||||
}
|
||||
}
|
||||
|
||||
Context 'physical only' -ForEach @(
|
||||
Context 'Strip, physical only' -ForEach @(
|
||||
@{ Index = $phys_in }
|
||||
){
|
||||
Context 'eq.{param}' -Skip:$ifNotPotato {
|
||||
) {
|
||||
Context 'Eq' -Skip:$ifNotPotato -ForEach @(
|
||||
@{ Eq = $vmr.strip[$index].eq }
|
||||
) {
|
||||
It "Should set Strip[$index].EQ.On to $value" {
|
||||
$vmr.strip[$index].eq.on = $value
|
||||
$vmr.strip[$index].eq.on | Should -Be $expected
|
||||
$eq.on = $value
|
||||
$eq.on | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Strip[$index].EQ.AB to $value" {
|
||||
$eq.ab = $value
|
||||
$eq.ab | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].On to $value" {
|
||||
$eq.channel[$strip_ch].cell[$cells].on = $value
|
||||
$eq.channel[$strip_ch].cell[$cells].on | Should -Be $value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
) {
|
||||
It "Should set and get Bus[$index].Mono" {
|
||||
$vmr.bus[$index].mono = $value
|
||||
$vmr.bus[$index].mono | Should -Be $expected
|
||||
@@ -60,47 +67,78 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
||||
$vmr.bus[$index].mode.centeronly = $value
|
||||
$vmr.bus[$index].mode.centeronly | Should -Be $expected
|
||||
}
|
||||
|
||||
Context 'Eq' -Skip:$ifBasic -ForEach @(
|
||||
@{ Eq = $vmr.bus[$index].eq }
|
||||
) {
|
||||
It "Should set Bus[$index].EQ.On to $value" {
|
||||
$eq.on = $value
|
||||
$eq.on | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Bus[$index].EQ.AB to $value" {
|
||||
$eq.ab = $value
|
||||
$eq.ab | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].On to $value" {
|
||||
$eq.channel[$bus_ch].cell[$cells].on = $value
|
||||
$eq.channel[$bus_ch].cell[$cells].on | Should -Be $value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
Context 'Vban' {
|
||||
It 'Should set and get Vban.enable' {
|
||||
$vmr.vban.enable = $value
|
||||
$vmr.command.restart
|
||||
Start-Sleep -Milliseconds 2000
|
||||
$vmr.vban.enable | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
Context 'Instream' -ForEach @(
|
||||
@{ Index = $vban_inA }
|
||||
# @{ Index = $vban_inM }
|
||||
# @{ Index = $vban_inT }
|
||||
) {
|
||||
It "Should set vban.instream[$index].on" {
|
||||
$vmr.vban.instream[$index].on = $value
|
||||
$vmr.vban.instream[$index].on | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Outstream' -ForEach @(
|
||||
@{ Index = $vban_outA }
|
||||
# @{ Index = $vban_outM }
|
||||
) {
|
||||
It "Should set vban.outstream[$index].on" {
|
||||
$vmr.vban.outstream[$index].on = $value
|
||||
$vmr.vban.outstream[$index].on | Should -Be $expected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -110,186 +148,656 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
||||
$vmr.command.lock = $value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Describe 'Float 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
|
||||
}
|
||||
Context 'Fx' -Skip:$ifNotPotato {
|
||||
Context 'Delay' {
|
||||
It 'Should set and get Fx.delay.on' {
|
||||
$vmr.fx.delay.on = $value
|
||||
$vmr.fx.delay.on | Should -Be $expected
|
||||
}
|
||||
|
||||
It 'Should set and get Fx.delay.ab' {
|
||||
$vmr.fx.delay.ab = $value
|
||||
$vmr.fx.delay.ab | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
It "Should set Strip[$index].Gate to $value" {
|
||||
$vmr.strip[$index].gate.knob = $value
|
||||
$vmr.strip[$index].gate.knob | Should -Be $expected
|
||||
}
|
||||
Context 'Reverb' {
|
||||
It 'Should set and get Fx.reverb.on' {
|
||||
$vmr.fx.reverb.on = $value
|
||||
$vmr.fx.reverb.on | Should -Be $expected
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
It 'Should set and get Fx.reverb.ab' {
|
||||
$vmr.fx.reverb.ab = $value
|
||||
$vmr.fx.reverb.ab | Should -Be $expected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Option' {
|
||||
It 'Should set and get Option.monitoronsel' -Skip:$ifNotPotato {
|
||||
$vmr.option.monitoronsel = $value
|
||||
$vmr.command.restart
|
||||
Start-Sleep -Milliseconds 2000
|
||||
$vmr.option.monitoronsel | Should -Be $value
|
||||
}
|
||||
|
||||
It 'Should set and get Option.slidermode' -Skip:$ifNotPotato {
|
||||
$vmr.option.slidermode = $value
|
||||
$vmr.command.restart
|
||||
Start-Sleep -Milliseconds 2000
|
||||
$vmr.option.slidermode | Should -Be $value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Describe 'Float Tests' -Tag 'float' {
|
||||
Context 'Strip, one physical one virtual' -ForEach @(
|
||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||
) {
|
||||
It "Should set Strip[$index].Gain to $value" -ForEach @(
|
||||
@{ Value = 3.6; Expected = 3.6 }, @{ Value = -8.2; Expected = -8.2 }
|
||||
) {
|
||||
$vmr.strip[$index].gain = $value
|
||||
$vmr.strip[$index].gain | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Strip, physical only' -Skip:$ifBasic -ForEach @(
|
||||
@{ Index = $phys_in }
|
||||
) {
|
||||
Context 'Knobs' -Skip:$ifBasic -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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
It "Should set Strip[$index].Gate to $value" {
|
||||
$vmr.strip[$index].gate.knob = $value
|
||||
$vmr.strip[$index].gate.knob | Should -Be $expected
|
||||
}
|
||||
|
||||
Context 'comp.{param}' -Skip:$ifNotPotato -ForEach @(
|
||||
It "Should set Strip[$index].Denoiser to $value" -Skip:$ifNotPotato {
|
||||
$vmr.strip[$index].denoiser.knob = $value
|
||||
$vmr.strip[$index].denoiser.knob | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Comp' -Skip:$ifNotPotato {
|
||||
It "Should set Strip[$index].Comp.Attack" -ForEach @(
|
||||
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
|
||||
) {
|
||||
$vmr.strip[$index].comp.attack = $value
|
||||
$vmr.strip[$index].comp.attack | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set Strip[$index].Comp.Knee" -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
|
||||
}
|
||||
) {
|
||||
$vmr.strip[$index].comp.knee = $value
|
||||
$vmr.strip[$index].comp.knee | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Gate' -Skip:$ifNotPotato {
|
||||
It "Should set Strip[$index].Gate.BPSidechain" -ForEach @(
|
||||
@{ Value = 103.1; Expected = 103.1 }, @{ Value = 3800; Expected = 3800 }
|
||||
) {
|
||||
$vmr.strip[$index].gate.bpsidechain = $value
|
||||
$vmr.strip[$index].gate.bpsidechain | Should -Be $expected
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
Context 'gate.{param}' -Skip:$ifNotPotato -ForEach @(
|
||||
It "Should set Strip[$index].Gate.Hold" -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
|
||||
}
|
||||
) {
|
||||
$vmr.strip[$index].gate.hold = $value
|
||||
$vmr.strip[$index].gate.hold | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
Context 'EQ' -Skip:$ifNotPotato -ForEach @(
|
||||
@{ Eq = $vmr.strip[$index].eq }
|
||||
) {
|
||||
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].F" -ForEach @(
|
||||
@{ Value = 1234.6; Expected = 1234.6 }, @{ Value = 7500; Expected = 7500 }
|
||||
) {
|
||||
$eq.channel[$strip_ch].cell[$cells].f = $value
|
||||
$eq.channel[$strip_ch].cell[$cells].f | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].Gain" -ForEach @(
|
||||
@{ Value = 4.2; Expected = 4.2 }, @{ Value = -7.3; Expected = -7.3 }
|
||||
) {
|
||||
$eq.channel[$strip_ch].cell[$cells].gain = $value
|
||||
$eq.channel[$strip_ch].cell[$cells].gain | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].Q" -ForEach @(
|
||||
@{ Value = 1.2; Expected = 1.2 }, @{ Value = 5.6; Expected = 5.6 }
|
||||
) {
|
||||
$eq.channel[$strip_ch].cell[$cells].q = $value
|
||||
$eq.channel[$strip_ch].cell[$cells].q | Should -Be $expected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Context 'Bus, one physical one virtual' -ForEach @(
|
||||
@{ Index = $phys_out }, @{ Index = $virt_out }
|
||||
) {
|
||||
It "Should set Bus[$index].Gain" -ForEach @(
|
||||
@{ Value = 5.2; Expected = 5.2 }, @{ Value = -38.2; Expected = -38.2 }
|
||||
) {
|
||||
$vmr.bus[$index].gain = $value
|
||||
$vmr.bus[$index].gain | Should -Be $expected
|
||||
}
|
||||
|
||||
Context 'EQ' -Skip:$ifBasic -ForEach @(
|
||||
@{ Eq = $vmr.bus[$index].eq }
|
||||
) {
|
||||
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].F" -ForEach @(
|
||||
@{ Value = 1234.6; Expected = 1234.6 }, @{ Value = 7500; Expected = 7500 }
|
||||
) {
|
||||
$eq.channel[$bus_ch].cell[$cells].f = $value
|
||||
$eq.channel[$bus_ch].cell[$cells].f | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].Gain" -ForEach @(
|
||||
@{ Value = 4.2; Expected = 4.2 }, @{ Value = -7.3; Expected = -7.3 }
|
||||
) {
|
||||
$eq.channel[$bus_ch].cell[$cells].gain = $value
|
||||
$eq.channel[$bus_ch].cell[$cells].gain | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].Q" -ForEach @(
|
||||
@{ Value = 1.2; Expected = 1.2 }, @{ Value = 5.6; Expected = 5.6 }
|
||||
) {
|
||||
$eq.channel[$bus_ch].cell[$cells].q = $value
|
||||
$eq.channel[$bus_ch].cell[$cells].q | Should -Be $expected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Option' {
|
||||
It "Should set and get Option.delay[$phys_out]" -ForEach @(
|
||||
@{ Value = 486.57 }, @{ Value = 26.41 }
|
||||
) {
|
||||
$vmr.option.delay[$phys_out].set($value)
|
||||
$vmr.command.restart
|
||||
Start-Sleep -Milliseconds 2000
|
||||
$vmr.option.delay[$phys_out].get() | Should -Be $value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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" {
|
||||
Describe 'Int Tests' -Tag 'int' {
|
||||
Context 'Strip, one physical, one virtual' -ForEach @(
|
||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||
) {
|
||||
It "Should set and get Strip[$index].Limit" -Skip:$ifBasic -ForEach @(
|
||||
@{ Value = 3; Expected = 3 }
|
||||
@{ Value = -6; Expected = -6 }
|
||||
) {
|
||||
$vmr.strip[$index].limit = $value
|
||||
$vmr.strip[$index].limit | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Vban outstream' {
|
||||
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
|
||||
Context 'Strip, physical only' -ForEach @(
|
||||
@{ Index = $phys_in }
|
||||
) {
|
||||
Context 'Device' {
|
||||
It "Should get Strip[$index].Device.sr" {
|
||||
$vmr.strip[$index].device.sr | Should -BeOfType [int]
|
||||
}
|
||||
}
|
||||
|
||||
Context 'channel' -ForEach @(
|
||||
@{ Value = 1; Expected = 1 }
|
||||
@{ Value = 2; Expected = 2 }
|
||||
){
|
||||
It 'Should set vban.outstream[0].channel to 1' {
|
||||
Context 'Eq' -Skip:$ifNotPotato -ForEach @(
|
||||
@{ Eq = $vmr.strip[$index].eq }
|
||||
) {
|
||||
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].Type" -ForEach @(
|
||||
@{ Value = 0; Expected = 0 }, @{ Value = 6; Expected = 6 }
|
||||
) {
|
||||
$eq.channel[$strip_ch].cell[$cells].type = $value
|
||||
$eq.channel[$strip_ch].cell[$cells].type | Should -Be $expected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Bus, one physical one virtual' -ForEach @(
|
||||
@{ Index = $phys_out }, @{ Index = $virt_out }
|
||||
) {
|
||||
Context 'Eq' -Skip:$ifBasic -ForEach @(
|
||||
@{ Eq = $vmr.bus[$index].eq }
|
||||
) {
|
||||
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].Type" -ForEach @(
|
||||
@{ Value = 0; Expected = 0 }, @{ Value = 6; Expected = 6 }
|
||||
) {
|
||||
$eq.channel[$bus_ch].cell[$cells].type = $value
|
||||
$eq.channel[$bus_ch].cell[$cells].type | Should -Be $expected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Bus, physical only' -ForEach @(
|
||||
@{ Index = $phys_out }
|
||||
) {
|
||||
Context 'Device' {
|
||||
It "Should get Bus[$index].Device.sr" {
|
||||
$vmr.bus[$index].device.sr | Should -BeOfType [int]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Bus, virtual only' -ForEach @(
|
||||
@{ Index = $virt_out }
|
||||
) {
|
||||
Context 'Device' -Skip:$ifNotBasic {
|
||||
It "Should get Bus[$index].Device.sr" {
|
||||
$vmr.bus[$index].device.sr | Should -BeOfType [int]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Vban' {
|
||||
It 'Should set vban.port' -ForEach @(
|
||||
@{ Value = 1024; Expected = 1024 }
|
||||
@{ Value = 65535; Expected = 65535 }
|
||||
) {
|
||||
$vmr.vban.port = $value
|
||||
$vmr.command.restart
|
||||
Start-Sleep -Milliseconds 2000
|
||||
$vmr.vban.port | Should -Be $expected
|
||||
}
|
||||
|
||||
Context 'Instream' -ForEach @(
|
||||
@{ Index = $vban_inA }
|
||||
) {
|
||||
It "Should set vban.instream[$index].port" -ForEach @(
|
||||
@{ Value = 1024; Expected = 1024 }
|
||||
@{ Value = 65535; Expected = 65535 }
|
||||
) {
|
||||
$vmr.vban.instream[$index].port = $value
|
||||
$vmr.command.restart
|
||||
Start-Sleep -Milliseconds 2000
|
||||
$vmr.vban.instream[$index].port | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.instream[$index].sr" {
|
||||
$vmr.vban.instream[$index].sr | Should -BeOfType [int]
|
||||
}
|
||||
|
||||
It "Should set vban.instream[$index].channel" {
|
||||
$vmr.vban.instream[$index].channel | Should -BeOfType [int]
|
||||
}
|
||||
|
||||
It "Should set vban.instream[$index].bit" {
|
||||
$vmr.vban.instream[$index].bit | Should -BeOfType [int]
|
||||
}
|
||||
|
||||
It "Should set vban.instream[$index].quality" -ForEach @(
|
||||
@{ Value = 0; Expected = 0 }
|
||||
@{ Value = 4; Expected = 4 }
|
||||
) {
|
||||
$vmr.vban.instream[$index].quality = $value
|
||||
Start-Sleep -Milliseconds 500
|
||||
$vmr.vban.instream[$index].quality | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.instream[$index].route" -ForEach @(
|
||||
@{ Value = $phys_in; Expected = $phys_in }
|
||||
@{ Value = $virt_in; Expected = $virt_in }
|
||||
) {
|
||||
$vmr.vban.instream[$index].route = $value
|
||||
$vmr.vban.instream[$index].route | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Outstream' -ForEach @(
|
||||
@{ Index = $vban_outA }
|
||||
) {
|
||||
It "Should set vban.outstream[$index].port" -ForEach @(
|
||||
@{ Value = 1024; Expected = 1024 }
|
||||
@{ Value = 65535; Expected = 65535 }
|
||||
) {
|
||||
$vmr.vban.outstream[$index].port = $value
|
||||
$vmr.command.restart
|
||||
Start-Sleep -Milliseconds 2000
|
||||
$vmr.vban.outstream[$index].port | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.outstream[$index].sr" -ForEach @(
|
||||
@{ Value = 44100; Expected = 44100 }
|
||||
@{ Value = 48000; Expected = 48000 }
|
||||
) {
|
||||
$vmr.vban.outstream[$index].sr = $value
|
||||
$vmr.vban.outstream[$index].sr | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.outstream[$index].channel" -ForEach @(
|
||||
@{ Value = 1; Expected = 1 }
|
||||
@{ Value = 2; Expected = 2 }
|
||||
) {
|
||||
$vmr.vban.outstream[$index].channel = $value
|
||||
$vmr.vban.outstream[$index].channel | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.outstream[$index].bit" -ForEach @(
|
||||
@{ Value = 16; Expected = 16 }
|
||||
@{ Value = 24; Expected = 24 }
|
||||
) {
|
||||
$vmr.vban.outstream[$index].bit = $value
|
||||
$vmr.vban.outstream[$index].bit | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.outstream[$index].quality" -ForEach @(
|
||||
@{ Value = 0; Expected = 0 }
|
||||
@{ Value = 4; Expected = 4 }
|
||||
) {
|
||||
$vmr.vban.outstream[$index].quality = $value
|
||||
Start-Sleep -Milliseconds 500
|
||||
$vmr.vban.outstream[$index].quality | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.outstream[$index].route" -ForEach @(
|
||||
@{ Value = $phys_out; Expected = $phys_out }
|
||||
@{ Value = $virt_out; Expected = $virt_out }
|
||||
) {
|
||||
$vmr.vban.outstream[$index].route = $value
|
||||
$vmr.vban.outstream[$index].route | Should -Be $expected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Option' {
|
||||
It 'Should set and get Option.sr' -ForEach @(
|
||||
@{ Value = 44100 }, @{ Value = 48000 }
|
||||
) {
|
||||
$vmr.option.sr = $value
|
||||
Start-Sleep -Milliseconds 500
|
||||
$vmr.option.sr | Should -Be $value
|
||||
}
|
||||
|
||||
Context 'Option.buffer' -ForEach @(
|
||||
@{ Value = 1024 }, @{ Value = 512 }
|
||||
) {
|
||||
It 'Should set and get mme buffer' {
|
||||
$vmr.option.buffer.mme = $value
|
||||
Start-Sleep -Milliseconds 500
|
||||
$vmr.option.buffer.mme | Should -Be $value
|
||||
}
|
||||
|
||||
It 'Should set and get wdm buffer' {
|
||||
$vmr.option.buffer.wdm = $value
|
||||
Start-Sleep -Milliseconds 500
|
||||
$vmr.option.buffer.wdm | Should -Be $value
|
||||
}
|
||||
|
||||
It 'Should set and get ks buffer' {
|
||||
$vmr.option.buffer.ks = $value
|
||||
Start-Sleep -Milliseconds 500
|
||||
$vmr.option.buffer.ks | Should -Be $value
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Describe 'String Tests' {
|
||||
Describe 'String Tests' -Tag 'string' {
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
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" }
|
||||
){
|
||||
$vmr.bus[$index].label = $value
|
||||
$vmr.bus[$index].label | Should -Be $expected
|
||||
}
|
||||
}
|
||||
Context 'Strip, physical only' -ForEach @(
|
||||
@{ Index = $phys_in }
|
||||
) {
|
||||
Context 'Device' -ForEach @(
|
||||
@{ Value = 'testInput' }, @{ Value = '' }
|
||||
) {
|
||||
It "Should set Strip[$index].Device.wdm" {
|
||||
$vmr.strip[$index].device.wdm = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.strip[$index].device.name | Should -Be $value
|
||||
}
|
||||
|
||||
Describe 'Vban' -ForEach @(
|
||||
@{ Index = $vban_in }
|
||||
){
|
||||
Context 'instream' {
|
||||
Context 'ip' -ForEach @(
|
||||
@{ 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
|
||||
}
|
||||
It "Should set Strip[$index].Device.ks" {
|
||||
$vmr.strip[$index].device.ks = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.strip[$index].device.name | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Strip[$index].Device.mme" {
|
||||
$vmr.strip[$index].device.mme = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.strip[$index].device.name | Should -Be $value
|
||||
}
|
||||
}
|
||||
|
||||
Context 'outstream' {
|
||||
Context 'ip' -ForEach @(
|
||||
@{ 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
|
||||
Context 'EQ' -Skip:$ifNotPotato -ForEach @(
|
||||
@{ Eq = $vmr.strip[$index].eq }
|
||||
) {
|
||||
It "Should save then load Strip[$index].EQ" -ForEach @(
|
||||
@{ Fq = 1234.5; Gain = 4.2; Ql = 56.2; Type = 3 }
|
||||
) {
|
||||
$tmp = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "vmreq-$(New-Guid).xml")
|
||||
try {
|
||||
# set some values
|
||||
$eq.channel[$strip_ch].cell[$cells].f = $fq
|
||||
$eq.channel[$strip_ch].cell[$cells].gain = $gain
|
||||
$eq.channel[$strip_ch].cell[$cells].q = $ql
|
||||
$eq.channel[$strip_ch].cell[$cells].type = $type
|
||||
|
||||
# save eq
|
||||
$eq.Save($tmp)
|
||||
Start-Sleep -Milliseconds 100
|
||||
Test-Path $tmp | Should -BeTrue
|
||||
|
||||
# change values
|
||||
$eq.channel[$strip_ch].cell[$cells].f = 1000
|
||||
$eq.channel[$strip_ch].cell[$cells].gain = 0
|
||||
$eq.channel[$strip_ch].cell[$cells].q = 1
|
||||
$eq.channel[$strip_ch].cell[$cells].type = 0
|
||||
|
||||
# load eq
|
||||
$eq.Load($tmp)
|
||||
Start-Sleep -Milliseconds 100
|
||||
|
||||
# verify values
|
||||
$eq.channel[$strip_ch].cell[$cells].f | Should -Be $fq
|
||||
$eq.channel[$strip_ch].cell[$cells].gain | Should -Be $gain
|
||||
$eq.channel[$strip_ch].cell[$cells].q | Should -Be $ql
|
||||
$eq.channel[$strip_ch].cell[$cells].type | Should -Be $type
|
||||
}
|
||||
finally {
|
||||
if (Test-Path $tmp) {
|
||||
Remove-Item $tmp -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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' }
|
||||
) {
|
||||
$vmr.bus[$index].label = $value
|
||||
$vmr.bus[$index].label | Should -Be $expected
|
||||
}
|
||||
|
||||
Context 'EQ' -Skip:$ifBasic -ForEach @(
|
||||
@{ Eq = $vmr.bus[$index].eq }
|
||||
) {
|
||||
It "Should save then load Bus[$index].EQ" -ForEach @(
|
||||
@{ Fq = 1234.5; Gain = 4.2; Ql = 56.2; Type = 3 }
|
||||
) {
|
||||
$tmp = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "vmreq-$(New-Guid).xml")
|
||||
try {
|
||||
# set some values
|
||||
$eq.channel[$bus_ch].cell[$cells].f = $fq
|
||||
$eq.channel[$bus_ch].cell[$cells].gain = $gain
|
||||
$eq.channel[$bus_ch].cell[$cells].q = $ql
|
||||
$eq.channel[$bus_ch].cell[$cells].type = $type
|
||||
|
||||
# save eq
|
||||
$eq.Save($tmp)
|
||||
Start-Sleep -Milliseconds 100
|
||||
Test-Path $tmp | Should -BeTrue
|
||||
|
||||
# change values
|
||||
$eq.channel[$bus_ch].cell[$cells].f = 1000
|
||||
$eq.channel[$bus_ch].cell[$cells].gain = 0
|
||||
$eq.channel[$bus_ch].cell[$cells].q = 1
|
||||
$eq.channel[$bus_ch].cell[$cells].type = 0
|
||||
|
||||
# load eq
|
||||
$eq.Load($tmp)
|
||||
Start-Sleep -Milliseconds 100
|
||||
|
||||
# verify values
|
||||
$eq.channel[$bus_ch].cell[$cells].f | Should -Be $fq
|
||||
$eq.channel[$bus_ch].cell[$cells].gain | Should -Be $gain
|
||||
$eq.channel[$bus_ch].cell[$cells].q | Should -Be $ql
|
||||
$eq.channel[$bus_ch].cell[$cells].type | Should -Be $type
|
||||
}
|
||||
finally {
|
||||
if (Test-Path $tmp) {
|
||||
Remove-Item $tmp -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Bus, physical only' -ForEach @(
|
||||
@{ Index = $phys_out }
|
||||
) {
|
||||
Context 'Device' -ForEach @(
|
||||
@{ Value = 'testOutput' }, @{ Value = '' }
|
||||
) {
|
||||
It "Should set Bus[$index].Device.wdm" {
|
||||
$vmr.bus[$index].device.wdm = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.bus[$index].device.name | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Bus[$index].Device.ks" {
|
||||
$vmr.bus[$index].device.ks = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.bus[$index].device.name | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Bus[$index].Device.mme" {
|
||||
$vmr.bus[$index].device.mme = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.bus[$index].device.name | Should -Be $value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Bus, virtual only' -ForEach @(
|
||||
@{ Index = $virt_out }
|
||||
) {
|
||||
Context 'Device' -Skip:$ifNotBasic -ForEach @(
|
||||
@{ Value = 'testOutput' }, @{ Value = '' }
|
||||
) {
|
||||
It "Should set Bus[$index].Device.wdm" {
|
||||
$vmr.bus[$index].device.wdm = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.bus[$index].device.name | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Bus[$index].Device.ks" {
|
||||
$vmr.bus[$index].device.ks = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.bus[$index].device.name | Should -Be $value
|
||||
}
|
||||
|
||||
It "Should set Bus[$index].Device.mme" {
|
||||
$vmr.bus[$index].device.mme = $value
|
||||
Start-Sleep -Milliseconds 800
|
||||
$vmr.bus[$index].device.name | Should -Be $value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Describe 'Vban' {
|
||||
Context 'Instream' -ForEach @(
|
||||
@{ Index = $vban_inA }
|
||||
# @{ Index = $vban_inM }
|
||||
# @{ Index = $vban_inT }
|
||||
) {
|
||||
It "Should set vban.instream[$index].name" -ForEach @(
|
||||
@{ Value = 'TestIn0'; Expected = 'TestIn0' }
|
||||
@{ Value = 'TestIn1'; Expected = 'TestIn1' }
|
||||
) {
|
||||
$vmr.vban.instream[$index].name = $value
|
||||
$vmr.vban.instream[$index].name | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.instream[$index].ip" -ForEach @(
|
||||
@{ Value = '0.0.0.0'; Expected = '0.0.0.0' }
|
||||
) {
|
||||
$vmr.vban.instream[$index].ip = $value
|
||||
$vmr.vban.instream[$index].ip | Should -Be $expected
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Outstream' -ForEach @(
|
||||
@{ Index = $vban_outA }
|
||||
# @{ Index = $vban_outM }
|
||||
) {
|
||||
It "Should set vban.outstream[$index].name" -ForEach @(
|
||||
@{ Value = 'TestOut0'; Expected = 'TestOut0' }
|
||||
@{ Value = 'TestOut1'; Expected = 'TestOut1' }
|
||||
) {
|
||||
$vmr.vban.outstream[$index].name = $value
|
||||
$vmr.vban.outstream[$index].name | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should set vban.outstream[$index].ip" -ForEach @(
|
||||
@{ Value = '0.0.0.0'; Expected = '0.0.0.0' }
|
||||
) {
|
||||
$vmr.vban.outstream[$index].ip = $value
|
||||
$vmr.vban.outstream[$index].ip | Should -Be $expected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
39
tests/run.ps1
Normal file
39
tests/run.ps1
Normal file
@@ -0,0 +1,39 @@
|
||||
[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_inA = $vmr.kind.vban.in - 1
|
||||
$vban_inM = $vmr.kind.vban.in + $vmr.kind.vban.midi - 1
|
||||
$vban_inT = $vmr.kind.vban.in + $vmr.kind.vban.midi + $vmr.kind.vban.text - 1
|
||||
$vban_outA = $vmr.kind.vban.out - 1
|
||||
$vban_outM = $vmr.kind.vban.out + $vmr.kind.vban.midi - 1
|
||||
$insert = $vmr.kind.insert - 1
|
||||
$composite = $vmr.kind.composite - 1
|
||||
$strip_ch = $vmr.kind.eq_ch['strip'] - 1
|
||||
$bus_ch = $vmr.kind.eq_ch['bus'] - 1
|
||||
$cells = $vmr.kind.cells - 1
|
||||
|
||||
# skip conditions by kind
|
||||
$ifBasic = $vmr.kind.name -eq 'basic'
|
||||
$ifNotBasic = $vmr.kind.name -ne '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