mirror of
https://github.com/onyx-and-iris/voicemeeter.git
synced 2026-04-18 13:33:30 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6512b35155 | |||
| 5aabd0a343 | |||
| 0558e8f81d | |||
| 07018d1703 | |||
| 73627ddbf1 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -19,3 +19,7 @@ config.toml
|
|||||||
|
|
||||||
# Dependency directories (remove the comment below to include it)
|
# Dependency directories (remove the comment below to include it)
|
||||||
# vendor/
|
# vendor/
|
||||||
|
|
||||||
|
# work files
|
||||||
|
go.work
|
||||||
|
go.work.sum
|
||||||
145
CHANGELOG.md
145
CHANGELOG.md
@@ -9,7 +9,20 @@ Before any major/minor/patch bump all unit tests will be run to verify they pass
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
- [x]
|
- [x]
|
||||||
|
|
||||||
|
## [2.1.0] - 2024-07-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added a configurable timeout in seconds (defaults to 2).
|
||||||
|
- Option function added for overriding the type of Voicemeeter GUI runVoicemeeter() will launch.
|
||||||
|
- Explanation of Option functions added to README.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- runVoicemeeter() now launches x64 GUIs for all kinds if on a 64 bit system.
|
||||||
|
- this can be overridden to force 32 bit GUI using voicemeeter.WithBits(32) Option function
|
||||||
|
|
||||||
## [2.0.0] - 2022-10-25
|
## [2.0.0] - 2022-10-25
|
||||||
|
|
||||||
@@ -17,150 +30,150 @@ V2 introduces some breaking changes.
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Removed Get prefix from getters in Bus, Strip, Vban, Button and Output types.
|
- Removed Get prefix from getters in Bus, Strip, Vban, Button and Output types.
|
||||||
- Pooler now communicates event updates over a channel.
|
- Pooler now communicates event updates over a channel.
|
||||||
- strip.comp now references comp struct type. (see readme for changes in setting comp parameters)
|
- strip.comp now references comp struct type. (see readme for changes in setting comp parameters)
|
||||||
- strip.gate now references gate struct type. (see readme for changes in setting gate parameters)
|
- strip.gate now references gate struct type. (see readme for changes in setting gate parameters)
|
||||||
- strip.eq, bus.eq now reference eQ struct type. (see readme for changes in setting eq parameters)
|
- strip.eq, bus.eq now reference eQ struct type. (see readme for changes in setting eq parameters)
|
||||||
- All examples and tests have been updated to reflect the changes.
|
- All examples and tests have been updated to reflect the changes.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- denoiser type to strip types.
|
- denoiser type to strip types.
|
||||||
- XY parameters added to strip type
|
- XY parameters added to strip type
|
||||||
- extra logging added to getters/setters in iRemote type.
|
- extra logging added to getters/setters in iRemote type.
|
||||||
- InitPooler to Remote type in case the Pooler needs reinitiating. (perhaps the GUI closed unexpectedly)
|
- InitPooler to Remote type in case the Pooler needs reinitiating. (perhaps the GUI closed unexpectedly)
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Functions that wrap CAPI calls in base.go now return correct error values.
|
- Functions that wrap CAPI calls in base.go now return correct error values.
|
||||||
|
|
||||||
## [1.11.0] - 2022-10-10
|
## [1.11.0] - 2022-10-10
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- type error in getLevel
|
- type error in getLevel
|
||||||
|
|
||||||
## [1.8.0] - 2022-09-17
|
## [1.8.0] - 2022-09-17
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- vm-cli example added + example README
|
- vm-cli example added + example README
|
||||||
- Fade, App methods added to project README
|
- Fade, App methods added to project README
|
||||||
|
|
||||||
## [1.7.0] - 2022-09-14
|
## [1.7.0] - 2022-09-14
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- voicemeeter.NewRemote now accepts a delay int argument (milliseconds).
|
- voicemeeter.NewRemote now accepts a delay int argument (milliseconds).
|
||||||
- vm.Sync() can now be used to force the dirty parameters to clear.
|
- vm.Sync() can now be used to force the dirty parameters to clear.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- higher level methods/functions now accept/return float64
|
- higher level methods/functions now accept/return float64
|
||||||
- tests updated to reflect changes.
|
- tests updated to reflect changes.
|
||||||
|
|
||||||
## [1.5.0] - 2022-09-07
|
## [1.5.0] - 2022-09-07
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- changes to error handling.
|
- changes to error handling.
|
||||||
- functions that wrap capi calls now return error types.
|
- functions that wrap capi calls now return error types.
|
||||||
- higher level functions print error messages
|
- higher level functions print error messages
|
||||||
|
|
||||||
## [1.4.0] - 2022-08-22
|
## [1.4.0] - 2022-08-22
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- midi type, supports midi devices
|
- midi type, supports midi devices
|
||||||
- midi updates added to the pooler
|
- midi updates added to the pooler
|
||||||
- event type, supports toggling event updates through EventAdd() and EventRemove() methods.
|
- event type, supports toggling event updates through EventAdd() and EventRemove() methods.
|
||||||
- Forwarder methods for get/set float/string parameters added to Remote type
|
- Forwarder methods for get/set float/string parameters added to Remote type
|
||||||
- Midi, Events sections added to README.
|
- Midi, Events sections added to README.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- macrobutton updates moved into its own goroutine
|
- macrobutton updates moved into its own goroutine
|
||||||
- observer example updated to include midi updates
|
- observer example updated to include midi updates
|
||||||
- level updates are now disabled by default, should be enabled explicitly
|
- level updates are now disabled by default, should be enabled explicitly
|
||||||
|
|
||||||
## [1.2.0] - 2022-07-10
|
## [1.2.0] - 2022-07-10
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- docstrings added to types, methods and functions
|
- docstrings added to types, methods and functions
|
||||||
- version retractions added to go.mod
|
- version retractions added to go.mod
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Entry method renamed from GetRemote to NewRemote
|
- Entry method renamed from GetRemote to NewRemote
|
||||||
- Readme updated to reflect latest changes
|
- Readme updated to reflect latest changes
|
||||||
|
|
||||||
## [1.1.0] - 2022-06-30
|
## [1.1.0] - 2022-06-30
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Level updates implemented in Pooler struct. Runs in its own goroutine.
|
- Level updates implemented in Pooler struct. Runs in its own goroutine.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Fixed bug with identifier in outputs struct.
|
- Fixed bug with identifier in outputs struct.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Package files moved into root of repository.
|
- Package files moved into root of repository.
|
||||||
- Remote struct now exported type
|
- Remote struct now exported type
|
||||||
|
|
||||||
## [1.0.0] - 2022-06-30
|
## [1.0.0] - 2022-06-30
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- recorder, device structs implemented
|
- recorder, device structs implemented
|
||||||
- gainlayers field in strip struct implemented
|
- gainlayers field in strip struct implemented
|
||||||
- levels field in strip, bus structs implemented
|
- levels field in strip, bus structs implemented
|
||||||
- pooler ratelimit set at 33ms
|
- pooler ratelimit set at 33ms
|
||||||
|
|
||||||
## [0.0.3] - 2022-06-25
|
## [0.0.3] - 2022-06-25
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- pre-commit.ps1 added for use with git hook
|
- pre-commit.ps1 added for use with git hook
|
||||||
- unit tests for factory functions added
|
- unit tests for factory functions added
|
||||||
- vban parameter methods added
|
- vban parameter methods added
|
||||||
- support for observers added. publisher/observer structs defined
|
- support for observers added. publisher/observer structs defined
|
||||||
- Pooler struct added, pdirty, mdirty now updated continously in a goroutine
|
- Pooler struct added, pdirty, mdirty now updated continously in a goroutine
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- NewRemote factory method now uses director, builder types to create Remote types.
|
- NewRemote factory method now uses director, builder types to create Remote types.
|
||||||
- cdll renamed to path
|
- cdll renamed to path
|
||||||
- test suite now using testify/assert
|
- test suite now using testify/assert
|
||||||
|
|
||||||
## [0.0.2] - 2022-06-23
|
## [0.0.2] - 2022-06-23
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- physicalStrip, virtualStrip, physicalBus and virtualBus types defined.
|
- physicalStrip, virtualStrip, physicalBus and virtualBus types defined.
|
||||||
- factory methods for strip, bus now cast return values to interface types.
|
- factory methods for strip, bus now cast return values to interface types.
|
||||||
- parameter methods added to strip, bus types.
|
- parameter methods added to strip, bus types.
|
||||||
- command struct implemented
|
- command struct implemented
|
||||||
- bus, vban unit tests added
|
- bus, vban unit tests added
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- strip, bus slices in remote type defined as interface slice types.
|
- strip, bus slices in remote type defined as interface slice types.
|
||||||
- bindings in base now prepended with vm.
|
- bindings in base now prepended with vm.
|
||||||
- vban fields added to kind structs
|
- vban fields added to kind structs
|
||||||
|
|
||||||
## [0.0.1] - 2022-06-22
|
## [0.0.1] - 2022-06-22
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- interface entry point defined in remote
|
- interface entry point defined in remote
|
||||||
- some base functions are exported through forwarding methods in Remote type (Login, Logout etc)
|
- some base functions are exported through forwarding methods in Remote type (Login, Logout etc)
|
||||||
- wrapper around the CAPI defined in base
|
- wrapper around the CAPI defined in base
|
||||||
- path helper functions defined in cdll
|
- path helper functions defined in cdll
|
||||||
- kind structs defined in kinds. These describe the layout for each version.
|
- kind structs defined in kinds. These describe the layout for each version.
|
||||||
- channel, strip, bus structs getter/setter procedures defined.
|
- channel, strip, bus structs getter/setter procedures defined.
|
||||||
- button struct fully implemented.
|
- button struct fully implemented.
|
||||||
- initial test commit
|
- initial test commit
|
||||||
|
|||||||
352
README.md
352
README.md
@@ -1,21 +1,19 @@
|
|||||||
[](https://pkg.go.dev/github.com/onyx-and-iris/voicemeeter/v2)
|
[](https://pkg.go.dev/github.com/onyx-and-iris/voicemeeter/v2)
|
||||||
|
|
||||||
# A Go Wrapper for Voicemeeter API
|
# A Go Wrapper for the Voicemeeter API
|
||||||
|
|
||||||
This package offers a Go interface for the Voicemeeter Remote C API.
|
|
||||||
|
|
||||||
For an outline of past/future changes refer to: [CHANGELOG](CHANGELOG.md)
|
For an outline of past/future changes refer to: [CHANGELOG](CHANGELOG.md)
|
||||||
|
|
||||||
## Tested against
|
## Tested against
|
||||||
|
|
||||||
- Basic 1.0.8.8
|
- Basic 1.1.1.1
|
||||||
- Banana 2.0.6.8
|
- Banana 2.1.1.1
|
||||||
- Potato 3.0.2.8
|
- Potato 3.1.1.1
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- [Voicemeeter](https://voicemeeter.com/)
|
- [Voicemeeter](https://voicemeeter.com/)
|
||||||
- Go 1.18 or greater
|
- Go 1.18 or greater
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -67,15 +65,15 @@ func vmConnect() (*voicemeeter.Remote, error) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## `voicemeeter.NewRemote(<kindId>, <delay>)`
|
## `voicemeeter.NewRemote(<kindId>, <delay>, opts ...Option)`
|
||||||
|
|
||||||
### `kindId`
|
### `kindId`
|
||||||
|
|
||||||
Pass the kind of Voicemeeter as an argument. kindId may be:
|
Pass the kind of Voicemeeter as an argument. kindId may be:
|
||||||
|
|
||||||
- `basic`
|
- `basic`
|
||||||
- `banana`
|
- `banana`
|
||||||
- `potato`
|
- `potato`
|
||||||
|
|
||||||
### `delay`
|
### `delay`
|
||||||
|
|
||||||
@@ -83,6 +81,18 @@ Pass a delay in milliseconds to force the getters to wait for dirty parameters t
|
|||||||
|
|
||||||
Useful if not listening for event updates.
|
Useful if not listening for event updates.
|
||||||
|
|
||||||
|
### `voicemeeter.WithBits(bits int)`
|
||||||
|
|
||||||
|
Override the type of Voicemeeter GUI to launch on 64 bit systems. For example, to force 32 bit GUI:
|
||||||
|
|
||||||
|
`voicemeeter.NewRemote("banana", 20, voicemeeter.WithBits(32))`
|
||||||
|
|
||||||
|
### `voicemeeter.WithBits(timeout int)`
|
||||||
|
|
||||||
|
Set a login timeout, defaults to 2 seconds. For example to set it to 1s:
|
||||||
|
|
||||||
|
`voicemeeter.NewRemote("banana", 20, voicemeeter.WithBits(1))`
|
||||||
|
|
||||||
## `Remote Type`
|
## `Remote Type`
|
||||||
|
|
||||||
#### `vm.Strip`
|
#### `vm.Strip`
|
||||||
@@ -179,28 +189,28 @@ Use this to force dirty parameters to clear after a delay in milliseconds.
|
|||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Mute() bool`
|
- `Mute() bool`
|
||||||
- `SetMute(val bool)`
|
- `SetMute(val bool)`
|
||||||
- `Mono() bool`
|
- `Mono() bool`
|
||||||
- `SetMono(val bool)`
|
- `SetMono(val bool)`
|
||||||
- `Solo() bool`
|
- `Solo() bool`
|
||||||
- `SetSolo(val bool)`
|
- `SetSolo(val bool)`
|
||||||
- `Limit() int`
|
- `Limit() int`
|
||||||
- `SetLimit(val int)` from -40 to 12
|
- `SetLimit(val int)` from -40 to 12
|
||||||
- `Label() string`
|
- `Label() string`
|
||||||
- `SetLabel(val string)`
|
- `SetLabel(val string)`
|
||||||
- `Gain() float64`
|
- `Gain() float64`
|
||||||
- `SetGain(val float64)` from -60.0 to 12.0
|
- `SetGain(val float64)` from -60.0 to 12.0
|
||||||
- `Mc() bool`
|
- `Mc() bool`
|
||||||
- `SetMc(val bool)`
|
- `SetMc(val bool)`
|
||||||
- `Audibility() float64`
|
- `Audibility() float64`
|
||||||
- `SetAudibility(val float64)` from 0.0 to 10.0
|
- `SetAudibility(val float64)` from 0.0 to 10.0
|
||||||
- `A1() bool - A5() bool`
|
- `A1() bool - A5() bool`
|
||||||
- `SetA1(val bool) - SetA5(val bool)`
|
- `SetA1(val bool) - SetA5(val bool)`
|
||||||
- `B1() bool - B3() bool`
|
- `B1() bool - B3() bool`
|
||||||
- `SetB1(val bool) bool - SetB3(val bool) bool`
|
- `SetB1(val bool) bool - SetB3(val bool) bool`
|
||||||
- `AppGain(name string, gain float64)`
|
- `AppGain(name string, gain float64)`
|
||||||
- `AppMute(name string, val bool)`
|
- `AppMute(name string, val bool)`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -215,28 +225,28 @@ vm.Strip[5].AppMute("Spotify", true)
|
|||||||
|
|
||||||
##### Comp
|
##### Comp
|
||||||
|
|
||||||
- `vm.Strip[i].Comp()`
|
- `vm.Strip[i].Comp()`
|
||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Knob() float64`
|
- `Knob() float64`
|
||||||
- `SetKnob(val float64)` from 0.0 to 10.0
|
- `SetKnob(val float64)` from 0.0 to 10.0
|
||||||
- `GainIn() float64`
|
- `GainIn() float64`
|
||||||
- `SetGainIn(val float64)` from -24.0 to 24.0
|
- `SetGainIn(val float64)` from -24.0 to 24.0
|
||||||
- `Ratio() float64`
|
- `Ratio() float64`
|
||||||
- `SetRatio(val float64)` from 1.0 to 8.0
|
- `SetRatio(val float64)` from 1.0 to 8.0
|
||||||
- `Threshold() float64`
|
- `Threshold() float64`
|
||||||
- `SetThreshold(val float64)` from -40.0 to -3.0
|
- `SetThreshold(val float64)` from -40.0 to -3.0
|
||||||
- `Attack() float64`
|
- `Attack() float64`
|
||||||
- `SetAttack(val float64)` from 0.0 to 200.0
|
- `SetAttack(val float64)` from 0.0 to 200.0
|
||||||
- `Release() float64`
|
- `Release() float64`
|
||||||
- `SetRelease(val float64)` from 0.0 to 5000.0
|
- `SetRelease(val float64)` from 0.0 to 5000.0
|
||||||
- `Knee() float64`
|
- `Knee() float64`
|
||||||
- `SetKnee(val float64)` from 0.0 to 1.0
|
- `SetKnee(val float64)` from 0.0 to 1.0
|
||||||
- `GainOut() float64`
|
- `GainOut() float64`
|
||||||
- `SetGainOut(val float64)` from -24.0 to 24.0
|
- `SetGainOut(val float64)` from -24.0 to 24.0
|
||||||
- `MakeUp() bool`
|
- `MakeUp() bool`
|
||||||
- `SetMakeUp(val bool)`
|
- `SetMakeUp(val bool)`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -246,24 +256,24 @@ vm.Strip[3].Comp().SetRatio(3.5)
|
|||||||
|
|
||||||
##### Gate
|
##### Gate
|
||||||
|
|
||||||
- `vm.Strip[i].Gate()`
|
- `vm.Strip[i].Gate()`
|
||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Knob() float64`
|
- `Knob() float64`
|
||||||
- `SetKnob(val float64)` from 0.0 to 10.0
|
- `SetKnob(val float64)` from 0.0 to 10.0
|
||||||
- `Threshold() float64`
|
- `Threshold() float64`
|
||||||
- `SetThreshold(val float64)` from -60.0 to -10.0
|
- `SetThreshold(val float64)` from -60.0 to -10.0
|
||||||
- `Damping() float64`
|
- `Damping() float64`
|
||||||
- `SetDamping(val float64)` from -60.0 to -10.0
|
- `SetDamping(val float64)` from -60.0 to -10.0
|
||||||
- `BPSidechain() int`
|
- `BPSidechain() int`
|
||||||
- `SetBPSidechain(val int)` from 100 to 4000
|
- `SetBPSidechain(val int)` from 100 to 4000
|
||||||
- `Attack() float64`
|
- `Attack() float64`
|
||||||
- `SetAttack(val float64)` from 0.0 to 1000.0
|
- `SetAttack(val float64)` from 0.0 to 1000.0
|
||||||
- `Hold() float64`
|
- `Hold() float64`
|
||||||
- `SetHold(val float64)` from 0.0 to 5000.0
|
- `SetHold(val float64)` from 0.0 to 5000.0
|
||||||
- `Release() float64`
|
- `Release() float64`
|
||||||
- `SetRelease(val float64)` from 0.0 to 5000.0
|
- `SetRelease(val float64)` from 0.0 to 5000.0
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -273,12 +283,12 @@ fmt.Println(vm.Strip[4].Gate().Attack())
|
|||||||
|
|
||||||
##### Denoiser
|
##### Denoiser
|
||||||
|
|
||||||
- `vm.Strip[i].Denoiser()`
|
- `vm.Strip[i].Denoiser()`
|
||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Knob() float64`
|
- `Knob() float64`
|
||||||
- `SetKnob(val float64)` from 0.0 to 10.0
|
- `SetKnob(val float64)` from 0.0 to 10.0
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -288,12 +298,12 @@ vm.Strip[1].Denoiser().SetKnob(4.2)
|
|||||||
|
|
||||||
##### Gainlayer
|
##### Gainlayer
|
||||||
|
|
||||||
- `vm.Strip[i].Gainlayer()[j]`
|
- `vm.Strip[i].Gainlayer()[j]`
|
||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Get() float64`
|
- `Get() float64`
|
||||||
- `Set(val float64)`
|
- `Set(val float64)`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -303,13 +313,13 @@ vm.Strip[6].GainLayer()[3].Set(-13.6)
|
|||||||
|
|
||||||
##### Levels
|
##### Levels
|
||||||
|
|
||||||
- `vm.Strip[i].Levels()`
|
- `vm.Strip[i].Levels()`
|
||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `PreFader() []float64`
|
- `PreFader() []float64`
|
||||||
- `PostFader() []float64`
|
- `PostFader() []float64`
|
||||||
- `PostMute() []float64`
|
- `PostMute() []float64`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -321,15 +331,15 @@ fmt.Println(vm.Strip[5].Levels().PreFader())
|
|||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `String() string`
|
- `String() string`
|
||||||
- `Mute() bool`
|
- `Mute() bool`
|
||||||
- `SetMute(val bool)`
|
- `SetMute(val bool)`
|
||||||
- `Mono() bool`
|
- `Mono() bool`
|
||||||
- `SetMono(val bool)`
|
- `SetMono(val bool)`
|
||||||
- `Label() string`
|
- `Label() string`
|
||||||
- `SetLabel(val string)`
|
- `SetLabel(val string)`
|
||||||
- `Gain() float64`
|
- `Gain() float64`
|
||||||
- `SetGain(val float64)` from -60.0 to 12.0
|
- `SetGain(val float64)` from -60.0 to 12.0
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -340,34 +350,34 @@ fmt.Println(vm.Bus[0].Label())
|
|||||||
|
|
||||||
##### Modes
|
##### Modes
|
||||||
|
|
||||||
- `vm.Bus[i].Mode()`
|
- `vm.Bus[i].Mode()`
|
||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `SetNormal(val bool)`
|
- `SetNormal(val bool)`
|
||||||
- `Normal() bool`
|
- `Normal() bool`
|
||||||
- `SetAmix(val bool)`
|
- `SetAmix(val bool)`
|
||||||
- `Amix() bool`
|
- `Amix() bool`
|
||||||
- `SetBmix(val bool)`
|
- `SetBmix(val bool)`
|
||||||
- `Bmix() bool`
|
- `Bmix() bool`
|
||||||
- `SetRepeat(val bool)`
|
- `SetRepeat(val bool)`
|
||||||
- `Repeat() bool`
|
- `Repeat() bool`
|
||||||
- `SetComposite(val bool)`
|
- `SetComposite(val bool)`
|
||||||
- `Composite() bool`
|
- `Composite() bool`
|
||||||
- `SetTvMix(val bool)`
|
- `SetTvMix(val bool)`
|
||||||
- `TvMix() bool`
|
- `TvMix() bool`
|
||||||
- `SetUpMix21(val bool)`
|
- `SetUpMix21(val bool)`
|
||||||
- `UpMix21() bool`
|
- `UpMix21() bool`
|
||||||
- `SetUpMix41(val bool)`
|
- `SetUpMix41(val bool)`
|
||||||
- `UpMix41() bool`
|
- `UpMix41() bool`
|
||||||
- `SetUpMix61(val bool)`
|
- `SetUpMix61(val bool)`
|
||||||
- `UpMix61() bool`
|
- `UpMix61() bool`
|
||||||
- `SetCenterOnly(val bool)`
|
- `SetCenterOnly(val bool)`
|
||||||
- `CenterOnly() bool`
|
- `CenterOnly() bool`
|
||||||
- `SetLfeOnly(val bool)`
|
- `SetLfeOnly(val bool)`
|
||||||
- `LfeOnly() bool`
|
- `LfeOnly() bool`
|
||||||
- `SetRearOnly(val bool)`
|
- `SetRearOnly(val bool)`
|
||||||
- `RearOnly() bool`
|
- `RearOnly() bool`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -378,11 +388,11 @@ vm.Bus[4].Mode().SetCenterOnly(true)
|
|||||||
|
|
||||||
##### Levels
|
##### Levels
|
||||||
|
|
||||||
- `vm.Bus[i].Levels()`
|
- `vm.Bus[i].Levels()`
|
||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `All() []float64`
|
- `All() []float64`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -394,14 +404,14 @@ fmt.Println(vm.Bus[1].Levels().All())
|
|||||||
|
|
||||||
##### EQ
|
##### EQ
|
||||||
|
|
||||||
- `vm.Strip[i].Eq()` `vm.Bus[i].Eq()`
|
- `vm.Strip[i].Eq()` `vm.Bus[i].Eq()`
|
||||||
|
|
||||||
The following methods are available.
|
The following methods are available.
|
||||||
|
|
||||||
- `On() bool`
|
- `On() bool`
|
||||||
- `SetOn(val bool)`
|
- `SetOn(val bool)`
|
||||||
- `Ab() bool`
|
- `Ab() bool`
|
||||||
- `SetAb(val bool)`
|
- `SetAb(val bool)`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -412,8 +422,8 @@ fmt.Println(vm.Bus[3].Eq().Ab())
|
|||||||
|
|
||||||
The following methods are available.
|
The following methods are available.
|
||||||
|
|
||||||
- `FadeTo(target float64, time_ int)`: float, int
|
- `FadeTo(target float64, time_ int)`: float, int
|
||||||
- `FadeBy(change float64, time_ int)`: float, int
|
- `FadeBy(change float64, time_ int)`: float, int
|
||||||
|
|
||||||
Modify gain to or by the selected amount in db over a time interval in ms.
|
Modify gain to or by the selected amount in db over a time interval in ms.
|
||||||
|
|
||||||
@@ -428,12 +438,12 @@ vm.Bus[3].FadeTo(-12.8, 500)
|
|||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `State() bool`
|
- `State() bool`
|
||||||
- `SetState(val bool)`
|
- `SetState(val bool)`
|
||||||
- `StateOnly() bool`
|
- `StateOnly() bool`
|
||||||
- `SetStateOnly(val bool)`
|
- `SetStateOnly(val bool)`
|
||||||
- `Trigger() bool`
|
- `Trigger() bool`
|
||||||
- `SetTrigger(val bool)`
|
- `SetTrigger(val bool)`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -446,11 +456,11 @@ fmt.Println(vm.Button[64].StateOnly())
|
|||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Show()` Show Voicemeeter GUI if it's hidden
|
- `Show()` Show Voicemeeter GUI if it's hidden
|
||||||
- `Hide()` Hide Voicemeeter GUI if it's shown
|
- `Hide()` Hide Voicemeeter GUI if it's shown
|
||||||
- `Shutdown()` Shuts down the GUI
|
- `Shutdown()` Shuts down the GUI
|
||||||
- `Restart()` Restart the audio engine
|
- `Restart()` Restart the audio engine
|
||||||
- `Lock(val bool)` Lock the Voicemeeter GUI
|
- `Lock(val bool)` Lock the Voicemeeter GUI
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -461,32 +471,32 @@ vm.Command.Show()
|
|||||||
|
|
||||||
### VBAN
|
### VBAN
|
||||||
|
|
||||||
- `vm.Vban.Enable()` `vm.Vban.Disable()` Turn VBAN on or off
|
- `vm.Vban.Enable()` `vm.Vban.Disable()` Turn VBAN on or off
|
||||||
|
|
||||||
##### Instream | Outstream
|
##### Instream | Outstream
|
||||||
|
|
||||||
- `vm.Vban.InStream[i]` `vm.Vban.OutStream[i]`
|
- `vm.Vban.InStream[i]` `vm.Vban.OutStream[i]`
|
||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `On() bool`
|
- `On() bool`
|
||||||
- `SetOn(val bool)`
|
- `SetOn(val bool)`
|
||||||
- `Name() string`
|
- `Name() string`
|
||||||
- `SetName(val string)`
|
- `SetName(val string)`
|
||||||
- `Ip() string`
|
- `Ip() string`
|
||||||
- `SetIp(val string)`
|
- `SetIp(val string)`
|
||||||
- `Port() int`
|
- `Port() int`
|
||||||
- `SetPort(val int)` from 1024 to 65535
|
- `SetPort(val int)` from 1024 to 65535
|
||||||
- `Sr() int`
|
- `Sr() int`
|
||||||
- `SetSr(val int)` (11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
|
- `SetSr(val int)` (11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
|
||||||
- `Channel() int`
|
- `Channel() int`
|
||||||
- `SetChannel(val int)` from 1 to 8
|
- `SetChannel(val int)` from 1 to 8
|
||||||
- `Bit() int`
|
- `Bit() int`
|
||||||
- `SetBit(val int)` 16 or 24
|
- `SetBit(val int)` 16 or 24
|
||||||
- `Quality() int`
|
- `Quality() int`
|
||||||
- `SetQuality(val int)` from 0 to 4
|
- `SetQuality(val int)` from 0 to 4
|
||||||
- `Route() int`
|
- `Route() int`
|
||||||
- `SetRoute(val int)` from 0 to 8
|
- `SetRoute(val int)` from 0 to 8
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -505,10 +515,10 @@ vm.Vban.OutStream[3].SetBit(24)
|
|||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Ins()`
|
- `Ins()`
|
||||||
- `Outs()`
|
- `Outs()`
|
||||||
- `Input(val int)`
|
- `Input(val int)`
|
||||||
- `Output(val int)`
|
- `Output(val int)`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -522,13 +532,13 @@ for i := 0; i < int(vm.Device.Ins()); i++ {
|
|||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Play()`
|
- `Play()`
|
||||||
- `Stop()`
|
- `Stop()`
|
||||||
- `Pause()`
|
- `Pause()`
|
||||||
- `Replay()`
|
- `Replay()`
|
||||||
- `Record()`
|
- `Record()`
|
||||||
- `Ff()`
|
- `Ff()`
|
||||||
- `Rew()`
|
- `Rew()`
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -547,9 +557,9 @@ vm.Recorder.SetB2(false)
|
|||||||
|
|
||||||
The following methods are available
|
The following methods are available
|
||||||
|
|
||||||
- `Channel()` returns the current midi channel
|
- `Channel()` returns the current midi channel
|
||||||
- `Current()` returns the most recently pressed midi button
|
- `Current()` returns the most recently pressed midi button
|
||||||
- `Get(<button>)` returns the value in cache for the midi button
|
- `Get(<button>)` returns the value in cache for the midi button
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -562,10 +572,10 @@ var val = vm.Midi.Get(current)
|
|||||||
|
|
||||||
By default level updates are disabled. Any event may be enabled or disabled. The following events exist:
|
By default level updates are disabled. Any event may be enabled or disabled. The following events exist:
|
||||||
|
|
||||||
- `pdirty` parameter updates
|
- `pdirty` parameter updates
|
||||||
- `mdirty` macrobutton updates
|
- `mdirty` macrobutton updates
|
||||||
- `midi` midi updates
|
- `midi` midi updates
|
||||||
- `ldirty` level updates
|
- `ldirty` level updates
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -587,4 +597,4 @@ go test ./...
|
|||||||
|
|
||||||
### Official Documentation
|
### Official Documentation
|
||||||
|
|
||||||
- [Voicemeeter Remote C API](https://github.com/onyx-and-iris/Voicemeeter-SDK/blob/update-docs/VoicemeeterRemoteAPI.pdf)
|
- [Voicemeeter Remote C API](https://github.com/onyx-and-iris/Voicemeeter-SDK/blob/main/VoicemeeterRemoteAPI.pdf)
|
||||||
|
|||||||
34
base.go
34
base.go
@@ -2,8 +2,10 @@ package voicemeeter
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@@ -45,16 +47,29 @@ var (
|
|||||||
// login logs into the API,
|
// login logs into the API,
|
||||||
// attempts to launch Voicemeeter if it's not running,
|
// attempts to launch Voicemeeter if it's not running,
|
||||||
// initializes dirty parameters.
|
// initializes dirty parameters.
|
||||||
func login(kindId string) error {
|
func login(kindId string, timeout, bits int) error {
|
||||||
res, _, _ := vmLogin.Call()
|
res, _, _ := vmLogin.Call()
|
||||||
if res == 1 {
|
if res == 1 {
|
||||||
runVoicemeeter(kindId)
|
runVoicemeeter(kindId, bits)
|
||||||
time.Sleep(time.Second)
|
|
||||||
} else if res != 0 {
|
} else if res != 0 {
|
||||||
err := fmt.Errorf("VBVMR_Login returned %d", res)
|
err := fmt.Errorf("VBVMR_Login returned %d", res)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Info("Logged into Voicemeeter ", kindId)
|
|
||||||
|
var ver_s string
|
||||||
|
start := time.Now()
|
||||||
|
var err error
|
||||||
|
for time.Since(start).Seconds() < float64(timeout) {
|
||||||
|
time.Sleep(time.Duration(100) * time.Millisecond)
|
||||||
|
if ver_s, err = getVersion(); err == nil {
|
||||||
|
log.Infof("Logged into Voicemeeter %s v%s", kindMap[kindId], ver_s)
|
||||||
|
log.Debugf("Log in time: %.2f", time.Since(start).Seconds())
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("timeout logging into the API")
|
||||||
|
}
|
||||||
clear()
|
clear()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -68,18 +83,22 @@ func logout(kindId string) error {
|
|||||||
err := fmt.Errorf("VBVMR_Logout returned %d", int32(res))
|
err := fmt.Errorf("VBVMR_Logout returned %d", int32(res))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Info("Logged out of Voicemeeter ", kindId)
|
log.Infof("Logged out of Voicemeeter %s", kindMap[kindId])
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// runVoicemeeter attempts to launch a Voicemeeter GUI of a kind.
|
// runVoicemeeter attempts to launch a Voicemeeter GUI of a kind.
|
||||||
func runVoicemeeter(kindId string) error {
|
func runVoicemeeter(kindId string, bits int) error {
|
||||||
vals := map[string]uint64{
|
vals := map[string]uint64{
|
||||||
"basic": 1,
|
"basic": 1,
|
||||||
"banana": 2,
|
"banana": 2,
|
||||||
"potato": 3,
|
"potato": 3,
|
||||||
}
|
}
|
||||||
res, _, _ := vmRunvm.Call(uintptr(vals[kindId]))
|
val := vals[kindId]
|
||||||
|
if strings.Contains(runtime.GOARCH, "64") && bits == 64 {
|
||||||
|
val += 3
|
||||||
|
}
|
||||||
|
res, _, _ := vmRunvm.Call(uintptr(val))
|
||||||
if int32(res) != 0 {
|
if int32(res) != 0 {
|
||||||
err := fmt.Errorf("VBVMR_RunVoicemeeter returned %d", int32(res))
|
err := fmt.Errorf("VBVMR_RunVoicemeeter returned %d", int32(res))
|
||||||
return err
|
return err
|
||||||
@@ -93,6 +112,7 @@ func getVersion() (string, error) {
|
|||||||
res, _, _ := vmGetvmVersion.Call(uintptr(unsafe.Pointer(&ver)))
|
res, _, _ := vmGetvmVersion.Call(uintptr(unsafe.Pointer(&ver)))
|
||||||
if int32(res) != 0 {
|
if int32(res) != 0 {
|
||||||
err := fmt.Errorf("VBVMR_GetVoicemeeterVersion returned %d", int32(res))
|
err := fmt.Errorf("VBVMR_GetVoicemeeterVersion returned %d", int32(res))
|
||||||
|
log.Error(err.Error())
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
v1 := (ver & 0xFF000000) >> 24
|
v1 := (ver & 0xFF000000) >> 24
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
module main
|
module hotkeys
|
||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
module main
|
module obs
|
||||||
|
|
||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
|
|||||||
69
remote.go
69
remote.go
@@ -20,7 +20,9 @@ type Remote struct {
|
|||||||
Recorder *recorder
|
Recorder *recorder
|
||||||
Midi *midi_t
|
Midi *midi_t
|
||||||
|
|
||||||
pooler *pooler
|
pooler *pooler
|
||||||
|
timeout int
|
||||||
|
bits int
|
||||||
}
|
}
|
||||||
|
|
||||||
// String implements the fmt.stringer interface
|
// String implements the fmt.stringer interface
|
||||||
@@ -31,7 +33,7 @@ func (r *Remote) String() string {
|
|||||||
// Login logs into the API
|
// Login logs into the API
|
||||||
// then it intializes the pooler
|
// then it intializes the pooler
|
||||||
func (r *Remote) Login() error {
|
func (r *Remote) Login() error {
|
||||||
err := login(r.Kind.Name)
|
err := login(r.Kind.Name, r.timeout, r.bits)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -57,12 +59,10 @@ func (r *Remote) InitPooler() {
|
|||||||
|
|
||||||
// Run launches the Voicemeeter GUI for a kind.
|
// Run launches the Voicemeeter GUI for a kind.
|
||||||
func (r *Remote) Run(kindId string) error {
|
func (r *Remote) Run(kindId string) error {
|
||||||
err := runVoicemeeter(kindId)
|
err := runVoicemeeter(kindId, r.bits)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second)
|
|
||||||
clear()
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,6 +173,7 @@ type remoteBuilder interface {
|
|||||||
makeDevice() remoteBuilder
|
makeDevice() remoteBuilder
|
||||||
makeRecorder() remoteBuilder
|
makeRecorder() remoteBuilder
|
||||||
makeMidi() remoteBuilder
|
makeMidi() remoteBuilder
|
||||||
|
setDefaults() remoteBuilder
|
||||||
Build() remoteBuilder
|
Build() remoteBuilder
|
||||||
Get() *Remote
|
Get() *Remote
|
||||||
}
|
}
|
||||||
@@ -212,7 +213,7 @@ func (b *genericBuilder) setKind() remoteBuilder {
|
|||||||
// makeStrip makes a strip slice and assigns it to remote.Strip
|
// makeStrip makes a strip slice and assigns it to remote.Strip
|
||||||
// []iStrip comprises of both physical and virtual strip types
|
// []iStrip comprises of both physical and virtual strip types
|
||||||
func (b *genericBuilder) makeStrip() remoteBuilder {
|
func (b *genericBuilder) makeStrip() remoteBuilder {
|
||||||
log.Info("building strip")
|
log.Debug("building strip")
|
||||||
strip := make([]iStrip, b.k.NumStrip())
|
strip := make([]iStrip, b.k.NumStrip())
|
||||||
for i := 0; i < b.k.NumStrip(); i++ {
|
for i := 0; i < b.k.NumStrip(); i++ {
|
||||||
if i < b.k.PhysIn {
|
if i < b.k.PhysIn {
|
||||||
@@ -228,7 +229,7 @@ func (b *genericBuilder) makeStrip() remoteBuilder {
|
|||||||
// makeBus makes a bus slice and assigns it to remote.Bus
|
// makeBus makes a bus slice and assigns it to remote.Bus
|
||||||
// []t_bus comprises of both physical and virtual bus types
|
// []t_bus comprises of both physical and virtual bus types
|
||||||
func (b *genericBuilder) makeBus() remoteBuilder {
|
func (b *genericBuilder) makeBus() remoteBuilder {
|
||||||
log.Info("building bus")
|
log.Debug("building bus")
|
||||||
bus := make([]iBus, b.k.NumBus())
|
bus := make([]iBus, b.k.NumBus())
|
||||||
for i := 0; i < b.k.NumBus(); i++ {
|
for i := 0; i < b.k.NumBus(); i++ {
|
||||||
if i < b.k.PhysOut {
|
if i < b.k.PhysOut {
|
||||||
@@ -243,7 +244,7 @@ func (b *genericBuilder) makeBus() remoteBuilder {
|
|||||||
|
|
||||||
// makeButton makes a button slice and assigns it to remote.Button
|
// makeButton makes a button slice and assigns it to remote.Button
|
||||||
func (b *genericBuilder) makeButton() remoteBuilder {
|
func (b *genericBuilder) makeButton() remoteBuilder {
|
||||||
log.Info("building button")
|
log.Debug("building button")
|
||||||
button := make([]button, 80)
|
button := make([]button, 80)
|
||||||
for i := 0; i < 80; i++ {
|
for i := 0; i < 80; i++ {
|
||||||
button[i] = newButton(i)
|
button[i] = newButton(i)
|
||||||
@@ -254,39 +255,46 @@ func (b *genericBuilder) makeButton() remoteBuilder {
|
|||||||
|
|
||||||
// makeCommand makes a command type and assigns it to remote.Command
|
// makeCommand makes a command type and assigns it to remote.Command
|
||||||
func (b *genericBuilder) makeCommand() remoteBuilder {
|
func (b *genericBuilder) makeCommand() remoteBuilder {
|
||||||
log.Info("building command")
|
log.Debug("building command")
|
||||||
b.r.Command = newCommand()
|
b.r.Command = newCommand()
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// makeVban makes a vban type and assigns it to remote.Vban
|
// makeVban makes a vban type and assigns it to remote.Vban
|
||||||
func (b *genericBuilder) makeVban() remoteBuilder {
|
func (b *genericBuilder) makeVban() remoteBuilder {
|
||||||
log.Info("building vban")
|
log.Debug("building vban")
|
||||||
b.r.Vban = newVban(b.k)
|
b.r.Vban = newVban(b.k)
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// makeDevice makes a device type and assigns it to remote.Device
|
// makeDevice makes a device type and assigns it to remote.Device
|
||||||
func (b *genericBuilder) makeDevice() remoteBuilder {
|
func (b *genericBuilder) makeDevice() remoteBuilder {
|
||||||
log.Info("building device")
|
log.Debug("building device")
|
||||||
b.r.Device = newDevice()
|
b.r.Device = newDevice()
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// makeRecorder makes a recorder type and assigns it to remote.Recorder
|
// makeRecorder makes a recorder type and assigns it to remote.Recorder
|
||||||
func (b *genericBuilder) makeRecorder() remoteBuilder {
|
func (b *genericBuilder) makeRecorder() remoteBuilder {
|
||||||
log.Info("building recorder")
|
log.Debug("building recorder")
|
||||||
b.r.Recorder = newRecorder()
|
b.r.Recorder = newRecorder()
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// makeMidi makes a midi type and assigns it to remote.Midi
|
// makeMidi makes a midi type and assigns it to remote.Midi
|
||||||
func (b *genericBuilder) makeMidi() remoteBuilder {
|
func (b *genericBuilder) makeMidi() remoteBuilder {
|
||||||
log.Info("building midi")
|
log.Debug("building midi")
|
||||||
b.r.Midi = newMidi()
|
b.r.Midi = newMidi()
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setDefaults sets defaults for optional members
|
||||||
|
func (b *genericBuilder) setDefaults() remoteBuilder {
|
||||||
|
b.r.bits = 64
|
||||||
|
b.r.timeout = 2
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
// Get returns a fully constructed remote type for a kind
|
// Get returns a fully constructed remote type for a kind
|
||||||
func (b *genericBuilder) Get() *Remote {
|
func (b *genericBuilder) Get() *Remote {
|
||||||
return &b.r
|
return &b.r
|
||||||
@@ -306,7 +314,8 @@ func (basb *genericBuilder) Build() remoteBuilder {
|
|||||||
makeCommand().
|
makeCommand().
|
||||||
makeVban().
|
makeVban().
|
||||||
makeDevice().
|
makeDevice().
|
||||||
makeMidi()
|
makeMidi().
|
||||||
|
setDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
// bananaBuilder represents a builder specific to banana type
|
// bananaBuilder represents a builder specific to banana type
|
||||||
@@ -324,7 +333,8 @@ func (banb *bananaBuilder) Build() remoteBuilder {
|
|||||||
makeVban().
|
makeVban().
|
||||||
makeDevice().
|
makeDevice().
|
||||||
makeRecorder().
|
makeRecorder().
|
||||||
makeMidi()
|
makeMidi().
|
||||||
|
setDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
// potatoBuilder represents a builder specific to potato type
|
// potatoBuilder represents a builder specific to potato type
|
||||||
@@ -342,7 +352,8 @@ func (potb *potatoBuilder) Build() remoteBuilder {
|
|||||||
makeVban().
|
makeVban().
|
||||||
makeDevice().
|
makeDevice().
|
||||||
makeRecorder().
|
makeRecorder().
|
||||||
makeMidi()
|
makeMidi().
|
||||||
|
setDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -350,6 +361,22 @@ var (
|
|||||||
vmdelay int
|
vmdelay int
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Option func(*Remote)
|
||||||
|
|
||||||
|
func WithTimeout(timeout int) Option {
|
||||||
|
return func(r *Remote) {
|
||||||
|
r.timeout = timeout
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithBits(bits int) Option {
|
||||||
|
return func(r *Remote) {
|
||||||
|
if bits == 32 || bits == 64 {
|
||||||
|
r.bits = bits
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
log.SetOutput(os.Stdout)
|
log.SetOutput(os.Stdout)
|
||||||
log.SetLevel(log.WarnLevel)
|
log.SetLevel(log.WarnLevel)
|
||||||
@@ -357,7 +384,7 @@ func init() {
|
|||||||
|
|
||||||
// NewRemote returns a Remote type for a kind
|
// NewRemote returns a Remote type for a kind
|
||||||
// this is the interface entry point
|
// this is the interface entry point
|
||||||
func NewRemote(kindId string, delay int) (*Remote, error) {
|
func NewRemote(kindId string, delay int, opts ...Option) (*Remote, error) {
|
||||||
kind, ok := kindMap[kindId]
|
kind, ok := kindMap[kindId]
|
||||||
if !ok {
|
if !ok {
|
||||||
err := fmt.Errorf("unknown Voicemeeter kind '%s'", kindId)
|
err := fmt.Errorf("unknown Voicemeeter kind '%s'", kindId)
|
||||||
@@ -380,5 +407,11 @@ func NewRemote(kindId string, delay int) (*Remote, error) {
|
|||||||
director.SetBuilder(&potatoBuilder{genericBuilder{kind, Remote{}}})
|
director.SetBuilder(&potatoBuilder{genericBuilder{kind, Remote{}}})
|
||||||
}
|
}
|
||||||
director.Construct()
|
director.Construct()
|
||||||
return director.Get(), nil
|
r := director.Get()
|
||||||
|
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user