13 Commits

Author SHA1 Message Date
onyx-and-iris
db7826dab6 reword in readme 2022-09-14 16:11:34 +01:00
onyx-and-iris
32780f11e4 changelog, readme updated to reflect changes
minor bump.
2022-09-14 16:05:49 +01:00
onyx-and-iris
8ca545b1c4 NewRemote now accepts delay param
getters clear dirty params sync enabled.

examples and tests updated
2022-09-14 16:05:15 +01:00
onyx-and-iris
a4b84f289e higher methods/functions now accept/return float64
update tests

update readme, changelog
2022-09-14 00:58:05 +01:00
onyx-and-iris
67cb8509b4 Update README.md 2022-09-07 22:32:37 +01:00
onyx-and-iris
e4de1d49cb upd go.mod for obs example 2022-09-07 21:10:42 +01:00
onyx-and-iris
50d045d823 fix ver in changelog 2022-09-07 21:04:14 +01:00
onyx-and-iris
6ed4e38dae changes to error handling
readme, changelog updated to reflect changes

version bump
2022-09-07 20:59:55 +01:00
onyx-and-iris
505b5969a2 go fmt all files.
add midi event toggle to the pooler
2022-08-23 14:03:07 +01:00
onyx-and-iris
7f992a1a87 only check subject once per update 2022-08-23 03:58:49 +01:00
onyx-and-iris
fa8e9f3e76 obs example added. 2022-08-23 03:53:51 +01:00
onyx-and-iris
7a79555cb8 use log.Fatal during setup procedures.
update readme example
2022-08-23 03:35:34 +01:00
onyx-and-iris
6fabc43998 return err from NewRemote\
pass Kind.Name to logout

update examples/tests to reflect changes
2022-08-23 03:16:43 +01:00
23 changed files with 439 additions and 231 deletions

View File

@@ -11,7 +11,27 @@ Before any major/minor/patch bump all unit tests will be run to verify they pass
- [x] - [x]
## [1.3.0] - 2022-08-22 ## [1.7.0] - 2022-09-14
### Added
- voicemeeter.NewRemote now accepts a delay int argument (milliseconds).
- vm.Sync() can now be used to force the dirty parameters to clear.
### Changed
- higher level methods/functions now accept/return float64
- tests updated to reflect changes.
## [1.5.0] - 2022-09-07
### Changed
- changes to error handling.
- functions that wrap capi calls now return error types.
- higher level functions print error messages
## [1.4.0] - 2022-08-22
### Added ### Added

View File

@@ -19,20 +19,14 @@ For an outline of past/future changes refer to: [CHANGELOG](CHANGELOG.md)
## Installation ## Installation
#### GO.MOD
Add to your `go.mod` file:
`require github.com/onyx-and-iris/voicemeeter-api-go vX.X.X`
where `vX.X.X` is the version you require.
#### GO GET #### GO GET
Install voicemeeter-api-go package from your console to download the latest version. Install voicemeeter-api-go package from your console to download the latest version.
`go get github.com/onyx-and-iris/voicemeeter-api-go` `go get github.com/onyx-and-iris/voicemeeter-api-go`
or add it to your `go.mod` file.
## `Use` ## `Use`
#### `main.go` #### `main.go`
@@ -42,25 +36,32 @@ package main
import ( import (
"fmt" "fmt"
"log"
"github.com/onyx-and-iris/voicemeeter-api-go" "github.com/onyx-and-iris/voicemeeter-api-go"
) )
func main() { func main() {
kindId := "banana" vm, err := voicemeeter.NewRemote("banana", 15)
vm := voicemeeter.NewRemote(kindId) if err != nil {
log.Fatal(err)
}
vm.Login() err = vm.Login()
if err != nil {
log.Fatal(err)
}
defer vm.Logout()
vm.Strip[0].SetLabel("rode podmic") vm.Strip[0].SetLabel("rode podmic")
vm.Strip[0].SetMute(true) vm.Strip[0].SetMute(true)
fmt.Printf("Strip 0 (%s) mute was set to %v\n", vm.Strip[0].GetLabel(), vm.Strip[0].GetMute()) fmt.Printf("Strip 0 (%s) mute was set to %v\n", vm.Strip[0].GetLabel(), vm.Strip[0].GetMute())
vm.Logout()
} }
``` ```
## `kindId` ## `voicemeeter.NewRemote(<kindId>, <delay>)`
### `kindId`
Pass the kind of Voicemeeter as an argument. kindId may be: Pass the kind of Voicemeeter as an argument. kindId may be:
@@ -68,6 +69,12 @@ Pass the kind of Voicemeeter as an argument. kindId may be:
- `banana` - `banana`
- `potato` - `potato`
### `delay`
Pass a delay in milliseconds to force the getters to wait for dirty parameters to clear.
Useful if not running callbacks.
## `Remote Type` ## `Remote Type`
#### `vm.Strip` #### `vm.Strip`
@@ -154,6 +161,10 @@ returns True iff a GUI parameter has changed
returns True iff a macrobutton parameter has changed returns True iff a macrobutton parameter has changed
#### `vm.Sync()`
Use this to force dirty parameters to clear after a delay in milliseconds.
## `Available commands` ## `Available commands`
### Strip ### Strip
@@ -171,15 +182,15 @@ The following methods are available
- `GetLabel() string` - `GetLabel() string`
- `SetLabel(val string)` - `SetLabel(val string)`
- `GetGain() float64` - `GetGain() float64`
- `SetGain(val float32)` from -60.0 to 12.0 - `SetGain(val float64)` from -60.0 to 12.0
- `GetMc() bool` - `GetMc() bool`
- `SetMc(val bool)` - `SetMc(val bool)`
- `GetComp() float64` - `GetComp() float64`
- `SetComp(val float32)` from 0.0 to 10.0 - `SetComp(val float64)` from 0.0 to 10.0
- `GetGate() float64` - `GetGate() float64`
- `SetGate(val float32)` from 0.0 to 10.0 - `SetGate(val float64)` from 0.0 to 10.0
- `GetAudibility() float64` - `GetAudibility() float64`
- `SetAudibility(val float32)` from 0.0 to 10.0 - `SetAudibility(val float64)` from 0.0 to 10.0
- `GetA1() bool - GetA5() bool` - `GetA1() bool - GetA5() bool`
- `SetA1(val bool) - SetA5(val bool)` - `SetA1(val bool) - SetA5(val bool)`
@@ -198,7 +209,7 @@ vm.Strip[4].SetA1(true)
The following methods are available The following methods are available
- `Get() float64` - `Get() float64`
- `Set(val float32)` - `Set(val float64)`
example: example:
@@ -212,9 +223,9 @@ vm.Strip[6].GainLayer()[3].Set(-13.6)
The following methods are available The following methods are available
- `PreFader() []float32` - `PreFader() []float64`
- `PostFader() []float32` - `PostFader() []float64`
- `PostMute() []float32` - `PostMute() []float64`
example: example:
@@ -236,7 +247,7 @@ The following methods are available
- `GetLabel() string` - `GetLabel() string`
- `SetLabel(val string)` - `SetLabel(val string)`
- `GetGain() float64` - `GetGain() float64`
- `SetGain(val float32)` from -60.0 to 12.0 - `SetGain(val float64)` from -60.0 to 12.0
```go ```go
vm.Bus[3].SetEq(true) vm.Bus[3].SetEq(true)
@@ -287,7 +298,7 @@ vm.Bus[4].Mode().SetCenterOnly(true)
The following methods are available The following methods are available
- `All() []float32` - `All() []float64`
example: example:

137
base.go
View File

@@ -4,7 +4,6 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"math" "math"
"os"
"strings" "strings"
"syscall" "syscall"
"time" "time"
@@ -44,36 +43,36 @@ 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) { func login(kindId string) error {
res, _, _ := vmLogin.Call() res, _, _ := vmLogin.Call()
if res == 1 { if res == 1 {
runVoicemeeter(kindId) runVoicemeeter(kindId)
time.Sleep(time.Second) 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)
fmt.Println(err) return err
os.Exit(1)
} }
fmt.Println("Logged into API") fmt.Printf("Logged into Voicemeeter %s\n", kindId)
for pdirty() || mdirty() { for pdirty() || mdirty() {
} }
return nil
} }
// logout logs out of the API, // logout logs out of the API,
// delayed for 100ms to allow final operation to complete. // delayed for 100ms to allow final operation to complete.
func logout() { func logout(kindId string) error {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
res, _, _ := vmLogout.Call() res, _, _ := vmLogout.Call()
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_Logout returned %d", res) err := fmt.Errorf("VBVMR_Logout returned %d", res)
fmt.Println(err) return err
os.Exit(1)
} }
fmt.Println("Logged out of API") fmt.Printf("Logged out of Voicemeeter %s\n", kindId)
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) { func runVoicemeeter(kindId string) error {
vals := map[string]uint64{ vals := map[string]uint64{
"basic": 1, "basic": 1,
"banana": 2, "banana": 2,
@@ -82,25 +81,24 @@ func runVoicemeeter(kindId string) {
res, _, _ := vmRunvm.Call(uintptr(vals[kindId])) res, _, _ := vmRunvm.Call(uintptr(vals[kindId]))
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_RunVoicemeeter returned %d", res) err := fmt.Errorf("VBVMR_RunVoicemeeter returned %d", res)
fmt.Println(err) return err
os.Exit(1)
} }
return nil
} }
// getVersion returns the version of Voicemeeter as a string // getVersion returns the version of Voicemeeter as a string
func getVersion() string { func getVersion() (string, error) {
var ver uint64 var ver uint64
res, _, _ := vmGetvmVersion.Call(uintptr(unsafe.Pointer(&ver))) res, _, _ := vmGetvmVersion.Call(uintptr(unsafe.Pointer(&ver)))
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_GetVoicemeeterVersion returned %d", res) err := fmt.Errorf("VBVMR_GetVoicemeeterVersion returned %d", res)
fmt.Println(err) return "", err
os.Exit(1)
} }
v1 := (ver & 0xFF000000) >> 24 v1 := (ver & 0xFF000000) >> 24
v2 := (ver & 0x00FF0000) >> 16 v2 := (ver & 0x00FF0000) >> 16
v3 := (ver & 0x0000FF00) >> 8 v3 := (ver & 0x0000FF00) >> 8
v4 := ver & 0x000000FF v4 := ver & 0x000000FF
return fmt.Sprintf("%d.%d.%d.%d", v1, v2, v3, v4) return fmt.Sprintf("%d.%d.%d.%d", v1, v2, v3, v4), nil
} }
// pdirty returns true iff a parameter value has changed // pdirty returns true iff a parameter value has changed
@@ -117,41 +115,47 @@ func mdirty() bool {
// ldirty returns true iff a level value has changed // ldirty returns true iff a level value has changed
func ldirty(k *kind) bool { func ldirty(k *kind) bool {
_levelCache.stripLevelsBuff = make([]float32, (2*k.PhysIn)+(8*k.VirtIn)) _levelCache.stripLevelsBuff = make([]float64, (2*k.PhysIn)+(8*k.VirtIn))
_levelCache.busLevelsBuff = make([]float32, 8*k.NumBus()) _levelCache.busLevelsBuff = make([]float64, 8*k.NumBus())
for i := 0; i < (2*k.PhysIn)+(8*k.VirtIn); i++ { for i := 0; i < (2*k.PhysIn)+(8*k.VirtIn); i++ {
_levelCache.stripLevelsBuff[i] = float32(getLevel(_levelCache.stripMode, i)) val, _ := getLevel(_levelCache.stripMode, i)
_levelCache.stripLevelsBuff[i] = val
_levelCache.stripComp[i] = _levelCache.stripLevelsBuff[i] == _levelCache.stripLevels[i] _levelCache.stripComp[i] = _levelCache.stripLevelsBuff[i] == _levelCache.stripLevels[i]
} }
for i := 0; i < 8*k.NumBus(); i++ { for i := 0; i < 8*k.NumBus(); i++ {
_levelCache.busLevelsBuff[i] = float32(getLevel(3, i)) val, _ := getLevel(3, i)
_levelCache.busLevelsBuff[i] = val
_levelCache.busComp[i] = _levelCache.busLevelsBuff[i] == _levelCache.busLevels[i] _levelCache.busComp[i] = _levelCache.busLevelsBuff[i] == _levelCache.busLevels[i]
} }
return !(allTrue(_levelCache.stripComp, (2*k.PhysIn)+(8*k.VirtIn)) && allTrue(_levelCache.busComp, 8*k.NumBus())) return !(allTrue(_levelCache.stripComp, (2*k.PhysIn)+(8*k.VirtIn)) && allTrue(_levelCache.busComp, 8*k.NumBus()))
} }
// getVMType returns the type of Voicemeeter, as a string // getVMType returns the type of Voicemeeter, as a string
func getVMType() string { func getVMType() (string, error) {
var type_ uint64 var type_ uint64
res, _, _ := vmGetvmType.Call( res, _, _ := vmGetvmType.Call(
uintptr(unsafe.Pointer(&type_)), uintptr(unsafe.Pointer(&type_)),
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_GetVoicemeeterType returned %d", res) err := fmt.Errorf("VBVMR_GetVoicemeeterType returned %d", res)
fmt.Println(err) return "", err
os.Exit(1)
} }
vals := map[uint64]string{ vals := map[uint64]string{
1: "basic", 1: "basic",
2: "banana", 2: "banana",
3: "potato", 3: "potato",
} }
return vals[type_] return vals[type_], nil
} }
// getParameterFloat gets the value of a float parameter // getParameterFloat gets the value of a float parameter
func getParameterFloat(name string) float64 { func getParameterFloat(name string) (float64, error) {
if vmsync {
time.Sleep(time.Duration(vmdelay) * time.Millisecond)
for pdirty() || mdirty() {
}
}
var value float32 var value float32
b := append([]byte(name), 0) b := append([]byte(name), 0)
res, _, _ := vmGetParamFloat.Call( res, _, _ := vmGetParamFloat.Call(
@@ -160,29 +164,33 @@ func getParameterFloat(name string) float64 {
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_GetParameterFloat returned %d", res) err := fmt.Errorf("VBVMR_GetParameterFloat returned %d", res)
fmt.Println(err) return 0, err
os.Exit(1)
} }
return math.Round(float64(value)*10) / 10 return math.Round(float64(value)*10) / 10, nil
} }
// setParameterFloat sets the value of a float parameter // setParameterFloat sets the value of a float parameter
func setParameterFloat(name string, value float32) { func setParameterFloat(name string, value float64) error {
b1 := append([]byte(name), 0) b1 := append([]byte(name), 0)
b2 := math.Float32bits(value) b2 := math.Float32bits(float32(value))
res, _, _ := vmSetParamFloat.Call( res, _, _ := vmSetParamFloat.Call(
uintptr(unsafe.Pointer(&b1[0])), uintptr(unsafe.Pointer(&b1[0])),
uintptr(b2), uintptr(b2),
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_SetParameterFloat returned %d", res) err := fmt.Errorf("VBVMR_SetParameterFloat returned %d", res)
fmt.Println(err) return err
os.Exit(1)
} }
return nil
} }
// getParameterString gets the value of a string parameter // getParameterString gets the value of a string parameter
func getParameterString(name string) string { func getParameterString(name string) (string, error) {
if vmsync {
time.Sleep(time.Duration(vmdelay) * time.Millisecond)
for pdirty() || mdirty() {
}
}
b1 := append([]byte(name), 0) b1 := append([]byte(name), 0)
var b2 [512]byte var b2 [512]byte
res, _, _ := vmGetParamString.Call( res, _, _ := vmGetParamString.Call(
@@ -191,15 +199,14 @@ func getParameterString(name string) string {
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_GetParameterStringA returned %d", res) err := fmt.Errorf("VBVMR_GetParameterStringA returned %d", res)
fmt.Println(err) return "", err
os.Exit(1)
} }
str := bytes.Trim(b2[:], "\x00") str := bytes.Trim(b2[:], "\x00")
return string(str) return string(str), nil
} }
// getParameterString sets the value of a string parameter // setParameterString sets the value of a string parameter
func setParameterString(name, value string) { func setParameterString(name, value string) error {
b1 := append([]byte(name), 0) b1 := append([]byte(name), 0)
b2 := append([]byte(value), 0) b2 := append([]byte(value), 0)
res, _, _ := vmSetParamString.Call( res, _, _ := vmSetParamString.Call(
@@ -208,26 +215,31 @@ func setParameterString(name, value string) {
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_SetParameterStringA returned %d", res) err := fmt.Errorf("VBVMR_SetParameterStringA returned %d", res)
fmt.Println(err) return err
os.Exit(1)
} }
return nil
} }
// setParametersMulti sets multiple parameters with a script // setParametersMulti sets multiple parameters with a script
func setParametersMulti(script string) { func setParametersMulti(script string) error {
b1 := append([]byte(script), 0) b1 := append([]byte(script), 0)
res, _, _ := vmSetParameters.Call( res, _, _ := vmSetParameters.Call(
uintptr(unsafe.Pointer(&b1[0])), uintptr(unsafe.Pointer(&b1[0])),
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_SetParameters returned %d", res) err := fmt.Errorf("VBVMR_SetParameters returned %d", res)
fmt.Println(err) return err
os.Exit(1)
} }
return nil
} }
// getMacroStatus gets a macrobutton value // getMacroStatus gets a macrobutton value
func getMacroStatus(id, mode int) float32 { func getMacroStatus(id, mode int) (float64, error) {
if vmsync {
time.Sleep(time.Duration(vmdelay) * time.Millisecond)
for pdirty() || mdirty() {
}
}
var state float32 var state float32
res, _, _ := vmGetMacroStatus.Call( res, _, _ := vmGetMacroStatus.Call(
uintptr(id), uintptr(id),
@@ -236,14 +248,13 @@ func getMacroStatus(id, mode int) float32 {
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_MacroButton_GetStatus returned %d", res) err := fmt.Errorf("VBVMR_MacroButton_GetStatus returned %d", res)
fmt.Println(err) return 0, err
os.Exit(1)
} }
return state return float64(state), nil
} }
// setMacroStatus sets a macrobutton value // setMacroStatus sets a macrobutton value
func setMacroStatus(id, state, mode int) { func setMacroStatus(id, state, mode int) error {
res, _, _ := vmSetMacroStatus.Call( res, _, _ := vmSetMacroStatus.Call(
uintptr(id), uintptr(id),
uintptr(state), uintptr(state),
@@ -251,9 +262,9 @@ func setMacroStatus(id, state, mode int) {
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_MacroButton_SetStatus returned %d", res) err := fmt.Errorf("VBVMR_MacroButton_SetStatus returned %d", res)
fmt.Println(err) return err
os.Exit(1)
} }
return nil
} }
// getNumDevices returns the number of hardware input/output devices // getNumDevices returns the number of hardware input/output devices
@@ -268,7 +279,7 @@ func getNumDevices(dir string) uint64 {
} }
// getDeviceDescription returns name, driver type and hwid for a given device // getDeviceDescription returns name, driver type and hwid for a given device
func getDeviceDescription(i int, dir string) (string, uint64, string) { func getDeviceDescription(i int, dir string) (string, uint64, string, error) {
var t_ uint64 var t_ uint64
var b1 [512]byte var b1 [512]byte
var b2 [512]byte var b2 [512]byte
@@ -281,8 +292,7 @@ func getDeviceDescription(i int, dir string) (string, uint64, string) {
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_Input_GetDeviceDescA returned %d", res) err := fmt.Errorf("VBVMR_Input_GetDeviceDescA returned %d", res)
fmt.Println(err) return "", 0, "", err
os.Exit(1)
} }
} else { } else {
res, _, _ := vmGetDevDescOut.Call( res, _, _ := vmGetDevDescOut.Call(
@@ -293,18 +303,17 @@ func getDeviceDescription(i int, dir string) (string, uint64, string) {
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_Output_GetDeviceDescA returned %d", res) err := fmt.Errorf("VBVMR_Output_GetDeviceDescA returned %d", res)
fmt.Println(err) return "", 0, "", err
os.Exit(1)
} }
} }
name := bytes.Trim(b1[:], "\x00") name := bytes.Trim(b1[:], "\x00")
hwid := bytes.Trim(b2[:], "\x00") hwid := bytes.Trim(b2[:], "\x00")
return string(name), t_, string(hwid) return string(name), t_, string(hwid), nil
} }
// getLevel returns a single level value of type type_ for channel[i] // getLevel returns a single level value of type type_ for channel[i]
func getLevel(type_, i int) float32 { func getLevel(type_, i int) (float64, error) {
var val float32 var val float64
res, _, _ := vmGetLevelFloat.Call( res, _, _ := vmGetLevelFloat.Call(
uintptr(type_), uintptr(type_),
uintptr(i), uintptr(i),
@@ -312,10 +321,9 @@ func getLevel(type_, i int) float32 {
) )
if res != 0 { if res != 0 {
err := fmt.Errorf("VBVMR_GetLevel returned %d", res) err := fmt.Errorf("VBVMR_GetLevel returned %d", res)
fmt.Println(err) return 0, err
os.Exit(1)
} }
return val return val, nil
} }
// getMidiMessage gets midi channel, pitch and velocity for a single midi input // getMidiMessage gets midi channel, pitch and velocity for a single midi input
@@ -326,10 +334,13 @@ func getMidiMessage() bool {
uintptr(unsafe.Pointer(&b1[0])), uintptr(unsafe.Pointer(&b1[0])),
uintptr(1024), uintptr(1024),
) )
if int(res) < 0 { x := int(res)
if x < 0 {
err := fmt.Errorf("VBVMR_GetMidiMessage returned %d", res) err := fmt.Errorf("VBVMR_GetMidiMessage returned %d", res)
if err != nil {
fmt.Println(err) fmt.Println(err)
os.Exit(1) }
return false
} }
msg := bytes.Trim(b1[:], "\x00") msg := bytes.Trim(b1[:], "\x00")
if len(msg) > 0 { if len(msg) > 0 {

12
bus.go
View File

@@ -17,7 +17,7 @@ type iBus interface {
GetLabel() string GetLabel() string
SetLabel(val string) SetLabel(val string)
GetGain() float64 GetGain() float64
SetGain(val float32) SetGain(val float64)
Mode() iBusMode Mode() iBusMode
Levels() *levels Levels() *levels
FadeTo(target float32, time_ int) FadeTo(target float32, time_ int)
@@ -77,7 +77,7 @@ func (b *bus) GetGain() float64 {
} }
// SetGain sets the value of the Gain parameter // SetGain sets the value of the Gain parameter
func (b *bus) SetGain(val float32) { func (b *bus) SetGain(val float64) {
b.setter_float("Gain", val) b.setter_float("Gain", val)
} }
@@ -103,7 +103,7 @@ func (b *bus) FadeBy(change float32, time_ int) {
time.Sleep(time.Millisecond) time.Sleep(time.Millisecond)
} }
//physicalBus represents a single physical bus // physicalBus represents a single physical bus
type physicalBus struct { type physicalBus struct {
bus bus
} }
@@ -122,7 +122,7 @@ func (p *physicalBus) String() string {
return fmt.Sprintf("PhysicalBus%d", p.index) return fmt.Sprintf("PhysicalBus%d", p.index)
} }
//virtualBus represents a single virtual bus // virtualBus represents a single virtual bus
type virtualBus struct { type virtualBus struct {
bus bus
} }
@@ -305,8 +305,8 @@ func newBusLevels(i int, k *kind) levels {
} }
// All returns the level values for a bus // All returns the level values for a bus
func (l *levels) All() []float32 { func (l *levels) All() []float64 {
var levels []float32 var levels []float64
for i := l.init; i < l.init+l.offset; i++ { for i := l.init; i < l.init+l.offset; i++ {
levels = append(levels, convertLevel(_levelCache.busLevels[i])) levels = append(levels, convertLevel(_levelCache.busLevels[i]))
} }

View File

@@ -14,7 +14,11 @@ func newButton(i int) button {
// getter returns the value of a macrobutton parameter // getter returns the value of a macrobutton parameter
func (m *button) getter(mode int) bool { func (m *button) getter(mode int) bool {
return getMacroStatus(m.index, mode) == 1 val, err := getMacroStatus(m.index, mode)
if err != nil {
fmt.Println(err)
}
return val == 1
} }
// setter sets the value of a macrobutton parameter // setter sets the value of a macrobutton parameter

View File

@@ -1,6 +1,6 @@
package voicemeeter package voicemeeter
//command represents command (action) type parameters // command represents command (action) type parameters
type command struct { type command struct {
iRemote iRemote
} }
@@ -32,7 +32,7 @@ func (c *command) Restart() {
// Lock locks or unlocks the Voiceemeter GUI // Lock locks or unlocks the Voiceemeter GUI
func (c *command) Lock(val bool) { func (c *command) Lock(val bool) {
var value float32 var value float64
if val { if val {
value = 1 value = 1
} else { } else {

View File

@@ -1,5 +1,7 @@
package voicemeeter package voicemeeter
import "fmt"
type devDesc struct { type devDesc struct {
Name, Type, Hwid string Name, Type, Hwid string
} }
@@ -22,7 +24,10 @@ func (d *device) Outs() int {
} }
func (d *device) Input(i int) devDesc { func (d *device) Input(i int) devDesc {
n, t_, id := getDeviceDescription(i, "in") n, t_, id, err := getDeviceDescription(i, "in")
if err != nil {
fmt.Println(err)
}
vals := map[uint64]string{ vals := map[uint64]string{
1: "mme", 1: "mme",
3: "wdm", 3: "wdm",
@@ -33,7 +38,10 @@ func (d *device) Input(i int) devDesc {
} }
func (d *device) Output(i int) devDesc { func (d *device) Output(i int) devDesc {
n, t_, id := getDeviceDescription(i, "out") n, t_, id, err := getDeviceDescription(i, "out")
if err != nil {
fmt.Println(err)
}
vals := map[uint64]string{ vals := map[uint64]string{
1: "mme", 1: "mme",
3: "wdm", 3: "wdm",

16
examples/obs/go.mod Normal file
View File

@@ -0,0 +1,16 @@
module main
go 1.18
require (
github.com/andreykaipov/goobs v0.10.0
github.com/onyx-and-iris/voicemeeter-api-go v1.5.0
)
require (
github.com/buger/jsonparser v1.1.1 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/hashicorp/logutils v1.0.0 // indirect
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect
)

18
examples/obs/go.sum Normal file
View File

@@ -0,0 +1,18 @@
github.com/andreykaipov/goobs v0.10.0 h1:wa4CxbYu/NqwUmx5E4/baDqYRYEmfHwg2T23RAg3jlU=
github.com/andreykaipov/goobs v0.10.0/go.mod h1:EqG73Uu/4npyhXIWWszgRelNkEeIz+d0slUT6NKWYs4=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
github.com/onyx-and-iris/voicemeeter-api-go v1.5.0 h1:KaMrqM9l62hPXspLY2oPBI/4dhmzEMfFwijnFWuG9bA=
github.com/onyx-and-iris/voicemeeter-api-go v1.5.0/go.mod h1:zAdBhHXQ9n37CUbLizbOPmAutyZI8Ncqeu5e9u1Fy14=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I=
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

81
examples/obs/main.go Normal file
View File

@@ -0,0 +1,81 @@
package main
import (
"fmt"
"log"
"time"
"github.com/onyx-and-iris/voicemeeter-api-go"
"github.com/andreykaipov/goobs"
"github.com/andreykaipov/goobs/api/events"
)
func onStart(vm *voicemeeter.Remote) {
vm.Strip[0].SetMute(true)
vm.Strip[1].SetB1(true)
vm.Strip[2].SetB1(true)
}
func onBrb(vm *voicemeeter.Remote) {
vm.Strip[7].FadeTo(0, 500)
vm.Bus[0].SetMute(true)
}
func onLive(vm *voicemeeter.Remote) {
vm.Strip[0].SetMute(false)
vm.Strip[7].FadeTo(-6, 500)
vm.Strip[7].SetA3(true)
vm.Vban.InStream[0].SetOn(true)
}
func onEnd(vm *voicemeeter.Remote) {
vm.Strip[0].SetMute(true)
vm.Strip[1].SetMute(true)
vm.Strip[1].SetB1(false)
vm.Strip[2].SetMute(true)
vm.Strip[2].SetB1(false)
vm.Vban.InStream[0].SetOn(false)
}
func main() {
vm, err := voicemeeter.NewRemote("potato")
if err != nil {
log.Fatal(err)
}
err = vm.Login()
if err != nil {
log.Fatal(err)
}
defer vm.Logout()
obs, err := goobs.New("localhost:4455", goobs.WithPassword("mystrongpass"))
if err != nil {
log.Fatal(err)
}
defer obs.Disconnect()
version, _ := obs.General.GetVersion()
fmt.Printf("OBS Studio version: %s\n", version.ObsVersion)
fmt.Printf("Websocket server version: %s\n", version.ObsWebSocketVersion)
go obs.Listen(func(event any) {
switch e := event.(type) {
case *events.CurrentProgramSceneChanged:
fmt.Printf("Switched to scene %s\n", e.SceneName)
switch e.SceneName {
case "START":
onStart(vm)
case "BRB":
onBrb(vm)
case "LIVE":
onLive(vm)
case "END":
onEnd(vm)
}
}
})
time.Sleep(30 * time.Second)
}

View File

@@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"log"
"time" "time"
"github.com/onyx-and-iris/voicemeeter-api-go" "github.com/onyx-and-iris/voicemeeter-api-go"
@@ -22,16 +23,13 @@ func (o observer) Deregister() {
func (o observer) OnUpdate(subject string) { func (o observer) OnUpdate(subject string) {
if subject == "pdirty" { if subject == "pdirty" {
fmt.Println("pdirty!") fmt.Println("pdirty!")
} } else if subject == "mdirty" {
if subject == "mdirty" {
fmt.Println("mdirty!") fmt.Println("mdirty!")
} } else if subject == "midi" {
if subject == "midi" {
var current = o.vm.Midi.Current() var current = o.vm.Midi.Current()
var val = o.vm.Midi.Get(current) var val = o.vm.Midi.Get(current)
fmt.Printf("Value of midi button %d: %d\n", current, val) fmt.Printf("Value of midi button %d: %d\n", current, val)
} } else if subject == "ldirty" {
if subject == "ldirty" {
fmt.Printf("%v %v %v %v %v %v %v %v\n", fmt.Printf("%v %v %v %v %v %v %v %v\n",
o.vm.Bus[0].Levels().IsDirty(), o.vm.Bus[0].Levels().IsDirty(),
o.vm.Bus[1].Levels().IsDirty(), o.vm.Bus[1].Levels().IsDirty(),
@@ -46,8 +44,16 @@ func (o observer) OnUpdate(subject string) {
} }
func main() { func main() {
vm := voicemeeter.NewRemote("potato") vm, err := voicemeeter.NewRemote("potato", 0)
vm.Login() if err != nil {
log.Fatal(err)
}
err = vm.Login()
if err != nil {
log.Fatal(err)
}
defer vm.Logout()
// enable level updates (disabled by default) // enable level updates (disabled by default)
vm.EventAdd("ldirty") vm.EventAdd("ldirty")
@@ -55,6 +61,4 @@ func main() {
o.Register() o.Register()
time.Sleep(30 * time.Second) time.Sleep(30 * time.Second)
o.Deregister() o.Deregister()
vm.Logout()
} }

View File

@@ -1,24 +1,22 @@
package voicemeeter package voicemeeter
import ( import (
"log"
"os" "os"
"testing" "testing"
"time"
) )
var ( var (
vm = NewRemote("potato") vm, err = NewRemote("potato", 30)
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
if err != nil {
log.Fatal(err)
}
vm.Login() vm.Login()
code := m.Run() code := m.Run()
vm.Logout() vm.Logout()
os.Exit(code) os.Exit(code)
} }
func sync() {
time.Sleep(30 * time.Millisecond)
for vm.Pdirty() || vm.Mdirty() {
}
}

View File

@@ -19,7 +19,11 @@ func (ir *iRemote) identifier() string {
// getter_bool returns the value of a boolean parameter // getter_bool returns the value of a boolean parameter
func (ir *iRemote) getter_bool(p string) bool { func (ir *iRemote) getter_bool(p string) bool {
param := fmt.Sprintf("%s.%s", ir.identifier(), p) param := fmt.Sprintf("%s.%s", ir.identifier(), p)
return getParameterFloat(param) == 1 val, err := getParameterFloat(param)
if err != nil {
fmt.Println(err)
}
return val == 1
} }
// setter_bool sets the value of a boolean parameter // setter_bool sets the value of a boolean parameter
@@ -31,41 +35,65 @@ func (ir *iRemote) setter_bool(p string, v bool) {
} else { } else {
value = 0 value = 0
} }
setParameterFloat(param, float32(value)) err := setParameterFloat(param, float64(value))
if err != nil {
fmt.Println(err)
}
} }
// getter_int returns the value of an int parameter p // getter_int returns the value of an int parameter p
func (ir *iRemote) getter_int(p string) int { func (ir *iRemote) getter_int(p string) int {
param := fmt.Sprintf("%s.%s", ir.identifier(), p) param := fmt.Sprintf("%s.%s", ir.identifier(), p)
return int(getParameterFloat(param)) val, err := getParameterFloat(param)
if err != nil {
fmt.Println(err)
}
return int(val)
} }
// setter_int sets the value v of an int parameter p // setter_int sets the value v of an int parameter p
func (ir *iRemote) setter_int(p string, v int) { func (ir *iRemote) setter_int(p string, v int) {
param := fmt.Sprintf("%s.%s", ir.identifier(), p) param := fmt.Sprintf("%s.%s", ir.identifier(), p)
setParameterFloat(param, float32(v)) err := setParameterFloat(param, float64(v))
if err != nil {
fmt.Println(err)
}
} }
// getter_float returns the value of an int parameter p // getter_float returns the value of an int parameter p
func (ir *iRemote) getter_float(p string) float64 { func (ir *iRemote) getter_float(p string) float64 {
param := fmt.Sprintf("%s.%s", ir.identifier(), p) param := fmt.Sprintf("%s.%s", ir.identifier(), p)
return getParameterFloat(param) val, err := getParameterFloat(param)
if err != nil {
fmt.Println(err)
}
return val
} }
// setter_float sets the value v of an int parameter p // setter_float sets the value v of an int parameter p
func (ir *iRemote) setter_float(p string, v float32) { func (ir *iRemote) setter_float(p string, v float64) {
param := fmt.Sprintf("%s.%s", ir.identifier(), p) param := fmt.Sprintf("%s.%s", ir.identifier(), p)
setParameterFloat(param, float32(v)) err := setParameterFloat(param, float64(v))
if err != nil {
fmt.Println(err)
}
} }
// getter_string returns the value of a string parameter p // getter_string returns the value of a string parameter p
func (ir *iRemote) getter_string(p string) string { func (ir *iRemote) getter_string(p string) string {
param := fmt.Sprintf("%s.%s", ir.identifier(), p) param := fmt.Sprintf("%s.%s", ir.identifier(), p)
return getParameterString(param) val, err := getParameterString(param)
if err != nil {
fmt.Println(err)
}
return val
} }
// setter_string sets the value v of a string parameter p // setter_string sets the value v of a string parameter p
func (ir *iRemote) setter_string(p, v string) { func (ir *iRemote) setter_string(p, v string) {
param := fmt.Sprintf("%s.%s", ir.identifier(), p) param := fmt.Sprintf("%s.%s", ir.identifier(), p)
setParameterString(param, v) err := setParameterString(param, v)
if err != nil {
fmt.Println(err)
}
} }

View File

@@ -25,18 +25,18 @@ var _levelCache *levelCache
// levelCache defines level slices used by the pooler to track updates // levelCache defines level slices used by the pooler to track updates
type levelCache struct { type levelCache struct {
stripMode int stripMode int
stripLevels []float32 stripLevels []float64
busLevels []float32 busLevels []float64
stripLevelsBuff []float32 stripLevelsBuff []float64
busLevelsBuff []float32 busLevelsBuff []float64
stripComp []bool stripComp []bool
busComp []bool busComp []bool
} }
// newLevelCache returns a levelCache struct address // newLevelCache returns a levelCache struct address
func newLevelCache(k *kind) *levelCache { func newLevelCache(k *kind) *levelCache {
stripLevels := make([]float32, (2*k.PhysIn)+(8*k.VirtIn)) stripLevels := make([]float64, (2*k.PhysIn)+(8*k.VirtIn))
busLevels := make([]float32, 8*k.NumBus()) busLevels := make([]float64, 8*k.NumBus())
stripComp := make([]bool, (2*k.PhysIn)+(8*k.VirtIn)) stripComp := make([]bool, (2*k.PhysIn)+(8*k.VirtIn))
busComp := make([]bool, 8*k.NumBus()) busComp := make([]bool, 8*k.NumBus())
if _levelCache == nil { if _levelCache == nil {

View File

@@ -3,7 +3,7 @@ package voicemeeter
import ( import (
"errors" "errors"
"fmt" "fmt"
"os" "log"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strings" "strings"
@@ -49,8 +49,7 @@ func dllPath() (string, error) {
func getDllPath() string { func getDllPath() string {
path, err := dllPath() path, err := dllPath()
if err != nil { if err != nil {
fmt.Println(err) log.Fatal(err)
os.Exit(1)
} }
return path return path
} }

View File

@@ -119,7 +119,7 @@ func (p *pooler) macrobuttons() {
func (p *pooler) midi() { func (p *pooler) midi() {
for p.run { for p.run {
if getMidiMessage() { if p.event.midi && getMidiMessage() {
p.notify("midi") p.notify("midi")
} }
time.Sleep(33 * time.Millisecond) time.Sleep(33 * time.Millisecond)

View File

@@ -2,7 +2,7 @@ package voicemeeter
import ( import (
"fmt" "fmt"
"os" "time"
) )
// A Remote type represents the API for a kind // A Remote type represents the API for a kind
@@ -27,26 +27,42 @@ 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() { func (r *Remote) Login() error {
login(r.Kind.Name) err := login(r.Kind.Name)
if err != nil {
return err
}
r.pooler = newPooler(r.Kind) r.pooler = newPooler(r.Kind)
return nil
} }
// Logout logs out of the API // Logout logs out of the API
// it also terminates the pooler // it also terminates the pooler
func (r *Remote) Logout() { func (r *Remote) Logout() error {
r.pooler.run = false r.pooler.run = false
logout() err := logout(r.Kind.Name)
if err != nil {
return err
}
return nil
} }
// Type returns the type of Voicemeeter (basic, banana, potato) // Type returns the type of Voicemeeter (basic, banana, potato)
func (r *Remote) Type() string { func (r *Remote) Type() string {
return getVMType() val, err := getVMType()
if err != nil {
fmt.Println(err)
}
return val
} }
// Version returns the version of Voicemeeter as a string // Version returns the version of Voicemeeter as a string
func (r *Remote) Version() string { func (r *Remote) Version() string {
return getVersion() val, err := getVersion()
if err != nil {
fmt.Println(err)
}
return val
} }
// Pdirty returns true iff a parameter value has changed // Pdirty returns true iff a parameter value has changed
@@ -59,19 +75,34 @@ func (r *Remote) Mdirty() bool {
return mdirty() return mdirty()
} }
// Sync is a helper method that waits for dirty parameters to clear
func (r *Remote) Sync() {
time.Sleep(time.Duration(vmdelay) * time.Millisecond)
for r.Pdirty() || r.Mdirty() {
}
}
// Gets a float parameter value // Gets a float parameter value
func (r *Remote) GetFloat(name string) float64 { func (r *Remote) GetFloat(name string) float64 {
return getParameterFloat(name) val, err := getParameterFloat(name)
if err != nil {
fmt.Println(err)
}
return val
} }
// Sets a float paramter value // Sets a float paramter value
func (r *Remote) SetFloat(name string, value float32) { func (r *Remote) SetFloat(name string, value float64) {
setParameterFloat(name, value) setParameterFloat(name, value)
} }
// Gets a string parameter value // Gets a string parameter value
func (r *Remote) GetString(name string) string { func (r *Remote) GetString(name string) string {
return getParameterString(name) val, err := getParameterString(name)
if err != nil {
fmt.Println(err)
}
return val
} }
// Sets a string paramter value // Sets a string paramter value
@@ -287,15 +318,25 @@ func (potb *potatoBuilder) Build() remoteBuilder {
makeMidi() makeMidi()
} }
var (
vmsync bool
vmdelay int
)
// 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) *Remote { func NewRemote(kindId string, delay int) (*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)
fmt.Println(err) return nil, err
os.Exit(1)
} }
if delay < 0 {
err := fmt.Errorf("invalid delay value. should be >= 0")
return nil, err
}
vmsync = delay > 0
vmdelay = delay
director := director{} director := director{}
switch _kind.Name { switch _kind.Name {
@@ -307,5 +348,5 @@ func NewRemote(kindId string) *Remote {
director.SetBuilder(&potatoBuilder{genericBuilder{_kind, Remote{}}}) director.SetBuilder(&potatoBuilder{genericBuilder{_kind, Remote{}}})
} }
director.Construct() director.Construct()
return director.Get() return director.Get(), nil
} }

View File

@@ -8,7 +8,7 @@ import (
func TestGetBasicRemote(t *testing.T) { func TestGetBasicRemote(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
__rem := NewRemote("basic") __rem, _ := NewRemote("basic", 0)
t.Run("Should return a remote basic type", func(t *testing.T) { t.Run("Should return a remote basic type", func(t *testing.T) {
assert.NotNil(t, __rem) assert.NotNil(t, __rem)
}) })
@@ -34,7 +34,7 @@ func TestGetBasicRemote(t *testing.T) {
func TestGetBananaRemote(t *testing.T) { func TestGetBananaRemote(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
__rem := NewRemote("banana") __rem, _ := NewRemote("banana", 0)
t.Run("Should return a remote banana type", func(t *testing.T) { t.Run("Should return a remote banana type", func(t *testing.T) {
assert.NotNil(t, __rem) assert.NotNil(t, __rem)
}) })
@@ -60,7 +60,7 @@ func TestGetBananaRemote(t *testing.T) {
func TestGetPotatoRemote(t *testing.T) { func TestGetPotatoRemote(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
__rem := NewRemote("potato") __rem, _ := NewRemote("potato", 0)
t.Run("Should return a remote basic type", func(t *testing.T) { t.Run("Should return a remote basic type", func(t *testing.T) {
assert.NotNil(t, __rem) assert.NotNil(t, __rem)
}) })
@@ -88,7 +88,6 @@ func TestSetAndGetFloatParameter(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
var param = "strip[0].mute" var param = "strip[0].mute"
vm.SetFloat(param, 1) vm.SetFloat(param, 1)
sync()
t.Run("Should get a float parameter", func(t *testing.T) { t.Run("Should get a float parameter", func(t *testing.T) {
assert.Equal(t, float64(1), vm.GetFloat(param)) assert.Equal(t, float64(1), vm.GetFloat(param))
}) })
@@ -99,7 +98,6 @@ func TestSetAndGetStringParameter(t *testing.T) {
var param = "strip[0].label" var param = "strip[0].label"
var val = "test0" var val = "test0"
vm.SetString(param, val) vm.SetString(param, val)
sync()
t.Run("Should get a string parameter", func(t *testing.T) { t.Run("Should get a string parameter", func(t *testing.T) {
assert.Equal(t, val, vm.GetString(param)) assert.Equal(t, val, vm.GetString(param))
}) })

View File

@@ -19,20 +19,20 @@ type iStrip interface {
GetLabel() string GetLabel() string
SetLabel(val string) SetLabel(val string)
GetGain() float64 GetGain() float64
SetGain(val float32) SetGain(val float64)
GetMc() bool GetMc() bool
SetMc(val bool) SetMc(val bool)
GetComp() float64 GetComp() float64
SetComp(val float32) SetComp(val float64)
GetGate() float64 GetGate() float64
SetGate(val float32) SetGate(val float64)
GetAudibility() float64 GetAudibility() float64
SetAudibility(val float32) SetAudibility(val float64)
GainLayer() []gainLayer GainLayer() []gainLayer
Levels() *levels Levels() *levels
FadeTo(target float32, time_ int) FadeTo(target float64, time_ int)
FadeBy(change float32, time_ int) FadeBy(change float64, time_ int)
AppGain(name string, gain float32) AppGain(name string, gain float64)
AppMute(name string, val bool) AppMute(name string, val bool)
iOutputs iOutputs
} }
@@ -101,7 +101,7 @@ func (s *strip) GetGain() float64 {
} }
// SetGain sets the value of the Gain parameter // SetGain sets the value of the Gain parameter
func (s *strip) SetGain(val float32) { func (s *strip) SetGain(val float64) {
s.setter_float("Gain", val) s.setter_float("Gain", val)
} }
@@ -116,18 +116,18 @@ func (s *strip) Levels() *levels {
} }
// FadeTo sets the value of gain to target over at time interval of time_ // FadeTo sets the value of gain to target over at time interval of time_
func (s *strip) FadeTo(target float32, time_ int) { func (s *strip) FadeTo(target float64, time_ int) {
s.setter_string("FadeTo", fmt.Sprintf("(\"%f\", %d)", target, time_)) s.setter_string("FadeTo", fmt.Sprintf("(\"%f\", %d)", target, time_))
time.Sleep(time.Millisecond) time.Sleep(time.Millisecond)
} }
// FadeBy adjusts the value of gain by change over a time interval of time_ // FadeBy adjusts the value of gain by change over a time interval of time_
func (s *strip) FadeBy(change float32, time_ int) { func (s *strip) FadeBy(change float64, time_ int) {
s.setter_string("FadeBy", fmt.Sprintf("(\"%f\", %d)", change, time_)) s.setter_string("FadeBy", fmt.Sprintf("(\"%f\", %d)", change, time_))
time.Sleep(time.Millisecond) time.Sleep(time.Millisecond)
} }
//physicalStrip represents a single physical strip // physicalStrip represents a single physical strip
type physicalStrip struct { type physicalStrip struct {
strip strip
} }
@@ -155,7 +155,7 @@ func (p *physicalStrip) GetComp() float64 {
} }
// SetComp sets the value of the Comp parameter // SetComp sets the value of the Comp parameter
func (p *physicalStrip) SetComp(val float32) { func (p *physicalStrip) SetComp(val float64) {
p.setter_float("Comp", val) p.setter_float("Comp", val)
} }
@@ -165,7 +165,7 @@ func (p *physicalStrip) GetGate() float64 {
} }
// SetGate sets the value of the Gate parameter // SetGate sets the value of the Gate parameter
func (p *physicalStrip) SetGate(val float32) { func (p *physicalStrip) SetGate(val float64) {
p.setter_float("Gate", val) p.setter_float("Gate", val)
} }
@@ -175,7 +175,7 @@ func (p *physicalStrip) GetAudibility() float64 {
} }
// SetAudibility sets the value of the Audibility parameter // SetAudibility sets the value of the Audibility parameter
func (p *physicalStrip) SetAudibility(val float32) { func (p *physicalStrip) SetAudibility(val float64) {
p.setter_float("Audibility", val) p.setter_float("Audibility", val)
} }
@@ -189,7 +189,7 @@ func (p *physicalStrip) SetMc(val bool) {
panic("invalid parameter MC for physicalStrip") panic("invalid parameter MC for physicalStrip")
} }
//virtualStrip represents a single virtual strip // virtualStrip represents a single virtual strip
type virtualStrip struct { type virtualStrip struct {
strip strip
} }
@@ -227,7 +227,7 @@ func (v *virtualStrip) GetComp() float64 {
} }
// SetComp panics reason invalid parameter // SetComp panics reason invalid parameter
func (v *virtualStrip) SetComp(val float32) { func (v *virtualStrip) SetComp(val float64) {
panic("invalid parameter Comp for virtualStrip") panic("invalid parameter Comp for virtualStrip")
} }
@@ -237,7 +237,7 @@ func (v *virtualStrip) GetGate() float64 {
} }
// SetGate panics reason invalid parameter // SetGate panics reason invalid parameter
func (v *virtualStrip) SetGate(val float32) { func (v *virtualStrip) SetGate(val float64) {
panic("invalid parameter Gate for virtualStrip") panic("invalid parameter Gate for virtualStrip")
} }
@@ -247,12 +247,12 @@ func (v *virtualStrip) GetAudibility() float64 {
} }
// SetAudibility panics reason invalid parameter // SetAudibility panics reason invalid parameter
func (v *virtualStrip) SetAudibility(val float32) { func (v *virtualStrip) SetAudibility(val float64) {
panic("invalid parameter Audibility for virtualStrip") panic("invalid parameter Audibility for virtualStrip")
} }
// AppGain sets the gain in db by val for the app matching name. // AppGain sets the gain in db by val for the app matching name.
func (v *strip) AppGain(name string, val float32) { func (v *strip) AppGain(name string, val float64) {
v.setter_string("AppGain", fmt.Sprintf("(\"%s\", %f)", name, val)) v.setter_string("AppGain", fmt.Sprintf("(\"%s\", %f)", name, val))
} }
@@ -264,7 +264,7 @@ func (v *strip) AppMute(name string, val bool) {
} else { } else {
value = 0 value = 0
} }
v.setter_string("AppMute", fmt.Sprintf("(\"%s\", %f)", name, float32(value))) v.setter_string("AppMute", fmt.Sprintf("(\"%s\", %f)", name, float64(value)))
} }
// gainLayer represents the 8 gainlayers for a single strip // gainLayer represents the 8 gainlayers for a single strip
@@ -284,7 +284,7 @@ func (gl *gainLayer) Get() float64 {
} }
// Set sets the gain value for a single gainlayer // Set sets the gain value for a single gainlayer
func (gl *gainLayer) Set(val float32) { func (gl *gainLayer) Set(val float64) {
gl.setter_float(fmt.Sprintf("gainlayer[%d]", gl.index), val) gl.setter_float(fmt.Sprintf("gainlayer[%d]", gl.index), val)
} }
@@ -303,9 +303,9 @@ func newStripLevels(i int, k *kind) levels {
} }
// PreFader returns the level values for this strip, PREFADER mode // PreFader returns the level values for this strip, PREFADER mode
func (l *levels) PreFader() []float32 { func (l *levels) PreFader() []float64 {
_levelCache.stripMode = 0 _levelCache.stripMode = 0
var levels []float32 var levels []float64
for i := l.init; i < l.init+l.offset; i++ { for i := l.init; i < l.init+l.offset; i++ {
levels = append(levels, convertLevel(_levelCache.stripLevels[i])) levels = append(levels, convertLevel(_levelCache.stripLevels[i]))
} }
@@ -313,9 +313,9 @@ func (l *levels) PreFader() []float32 {
} }
// PostFader returns the level values for this strip, POSTFADER mode // PostFader returns the level values for this strip, POSTFADER mode
func (l *levels) PostFader() []float32 { func (l *levels) PostFader() []float64 {
_levelCache.stripMode = 1 _levelCache.stripMode = 1
var levels []float32 var levels []float64
for i := l.init; i < l.init+l.offset; i++ { for i := l.init; i < l.init+l.offset; i++ {
levels = append(levels, convertLevel(_levelCache.stripLevels[i])) levels = append(levels, convertLevel(_levelCache.stripLevels[i]))
} }
@@ -323,9 +323,9 @@ func (l *levels) PostFader() []float32 {
} }
// PostMute returns the level values for this strip, POSTMUTE mode // PostMute returns the level values for this strip, POSTMUTE mode
func (l *levels) PostMute() []float32 { func (l *levels) PostMute() []float64 {
_levelCache.stripMode = 2 _levelCache.stripMode = 2
var levels []float32 var levels []float64
for i := l.init; i < l.init+l.offset; i++ { for i := l.init; i < l.init+l.offset; i++ {
levels = append(levels, convertLevel(_levelCache.stripLevels[i])) levels = append(levels, convertLevel(_levelCache.stripLevels[i]))
} }

View File

@@ -1,26 +1,26 @@
package voicemeeter_test package voicemeeter_test
import ( import (
"os" "log"
"testing" "testing"
"time"
"github.com/onyx-and-iris/voicemeeter-api-go" "github.com/onyx-and-iris/voicemeeter-api-go"
) )
var ( var (
vm = voicemeeter.NewRemote("potato") vm, err = voicemeeter.NewRemote("potato", 30)
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
vm.Login() if err != nil {
code := m.Run() log.Fatal(err)
vm.Logout()
os.Exit(code)
}
func sync() {
time.Sleep(30 * time.Millisecond)
for vm.Pdirty() || vm.Mdirty() {
} }
err = vm.Login()
if err != nil {
log.Fatal(err)
}
defer vm.Logout()
m.Run()
} }

View File

@@ -9,13 +9,11 @@ import (
func TestStrip0Mute(t *testing.T) { func TestStrip0Mute(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Strip[0].SetMute(true) vm.Strip[0].SetMute(true)
sync()
t.Run("Should return true when SetMute(true)", func(t *testing.T) { t.Run("Should return true when SetMute(true)", func(t *testing.T) {
assert.True(t, vm.Strip[0].GetMute()) assert.True(t, vm.Strip[0].GetMute())
}) })
vm.Strip[0].SetMute(false) vm.Strip[0].SetMute(false)
sync()
t.Run("Should return false when SetMute(false)", func(t *testing.T) { t.Run("Should return false when SetMute(false)", func(t *testing.T) {
assert.False(t, vm.Strip[0].GetMute()) assert.False(t, vm.Strip[0].GetMute())
}) })
@@ -24,13 +22,11 @@ func TestStrip0Mute(t *testing.T) {
func TestStrip3A1(t *testing.T) { func TestStrip3A1(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Strip[3].SetA1(true) vm.Strip[3].SetA1(true)
sync()
t.Run("Should return true when SetA1(true)", func(t *testing.T) { t.Run("Should return true when SetA1(true)", func(t *testing.T) {
assert.True(t, vm.Strip[3].GetA1()) assert.True(t, vm.Strip[3].GetA1())
}) })
vm.Strip[3].SetA1(false) vm.Strip[3].SetA1(false)
sync()
t.Run("Should return false when SetA1(false)", func(t *testing.T) { t.Run("Should return false when SetA1(false)", func(t *testing.T) {
assert.False(t, vm.Strip[3].GetA1()) assert.False(t, vm.Strip[3].GetA1())
}) })
@@ -39,13 +35,11 @@ func TestStrip3A1(t *testing.T) {
func TestStrip2Limit(t *testing.T) { func TestStrip2Limit(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Strip[2].SetLimit(-8) vm.Strip[2].SetLimit(-8)
sync()
t.Run("Should return -8 when SetLimit(-8)", func(t *testing.T) { t.Run("Should return -8 when SetLimit(-8)", func(t *testing.T) {
assert.Equal(t, vm.Strip[2].GetLimit(), -8) assert.Equal(t, vm.Strip[2].GetLimit(), -8)
}) })
vm.Strip[2].SetLimit(-32) vm.Strip[2].SetLimit(-32)
sync()
t.Run("Should return -32 when SetLimit(-8)", func(t *testing.T) { t.Run("Should return -32 when SetLimit(-8)", func(t *testing.T) {
assert.Equal(t, vm.Strip[2].GetLimit(), -32) assert.Equal(t, vm.Strip[2].GetLimit(), -32)
}) })
@@ -55,13 +49,11 @@ func TestStrip2Limit(t *testing.T) {
func TestStrip4Label(t *testing.T) { func TestStrip4Label(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Strip[4].SetLabel("test0") vm.Strip[4].SetLabel("test0")
sync()
t.Run("Should return test0 when SetLimit('test0')", func(t *testing.T) { t.Run("Should return test0 when SetLimit('test0')", func(t *testing.T) {
assert.Equal(t, "test0", vm.Strip[4].GetLabel()) assert.Equal(t, "test0", vm.Strip[4].GetLabel())
}) })
vm.Strip[4].SetLabel("test1") vm.Strip[4].SetLabel("test1")
sync()
t.Run("Should return test1 when SetLimit('test1')", func(t *testing.T) { t.Run("Should return test1 when SetLimit('test1')", func(t *testing.T) {
assert.Equal(t, "test1", vm.Strip[4].GetLabel()) assert.Equal(t, "test1", vm.Strip[4].GetLabel())
}) })
@@ -70,13 +62,11 @@ func TestStrip4Label(t *testing.T) {
func TestStrip5Gain(t *testing.T) { func TestStrip5Gain(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Strip[4].SetGain(-20.8) vm.Strip[4].SetGain(-20.8)
sync()
t.Run("Should return -20.8 when SetGain(-20.8)", func(t *testing.T) { t.Run("Should return -20.8 when SetGain(-20.8)", func(t *testing.T) {
assert.Equal(t, vm.Strip[4].GetGain(), -20.8) assert.Equal(t, vm.Strip[4].GetGain(), -20.8)
}) })
vm.Strip[4].SetGain(-3.6) vm.Strip[4].SetGain(-3.6)
sync()
t.Run("Should return -3.6 when SetGain(-3.6)", func(t *testing.T) { t.Run("Should return -3.6 when SetGain(-3.6)", func(t *testing.T) {
assert.Equal(t, vm.Strip[4].GetGain(), -3.6) assert.Equal(t, vm.Strip[4].GetGain(), -3.6)
}) })
@@ -85,13 +75,11 @@ func TestStrip5Gain(t *testing.T) {
func TestStrip3Comp(t *testing.T) { func TestStrip3Comp(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Strip[4].SetComp(8.1) vm.Strip[4].SetComp(8.1)
sync()
t.Run("Should return 8.1 when SetGain(8.1)", func(t *testing.T) { t.Run("Should return 8.1 when SetGain(8.1)", func(t *testing.T) {
assert.Equal(t, vm.Strip[4].GetComp(), 8.1) assert.Equal(t, vm.Strip[4].GetComp(), 8.1)
}) })
vm.Strip[4].SetComp(1.6) vm.Strip[4].SetComp(1.6)
sync()
t.Run("Should return 1.6 when SetGain(1.6)", func(t *testing.T) { t.Run("Should return 1.6 when SetGain(1.6)", func(t *testing.T) {
assert.Equal(t, vm.Strip[4].GetComp(), 1.6) assert.Equal(t, vm.Strip[4].GetComp(), 1.6)
}) })
@@ -100,13 +88,11 @@ func TestStrip3Comp(t *testing.T) {
func TestStrip5Mc(t *testing.T) { func TestStrip5Mc(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Strip[5].SetMc(true) vm.Strip[5].SetMc(true)
sync()
t.Run("Should return true when SetMc(true)", func(t *testing.T) { t.Run("Should return true when SetMc(true)", func(t *testing.T) {
assert.True(t, vm.Strip[5].GetMc()) assert.True(t, vm.Strip[5].GetMc())
}) })
vm.Strip[5].SetMc(false) vm.Strip[5].SetMc(false)
sync()
t.Run("Should return false when SetMc(false)", func(t *testing.T) { t.Run("Should return false when SetMc(false)", func(t *testing.T) {
assert.False(t, vm.Strip[5].GetMc()) assert.False(t, vm.Strip[5].GetMc())
}) })
@@ -115,13 +101,11 @@ func TestStrip5Mc(t *testing.T) {
func TestStrip2GainLayer3(t *testing.T) { func TestStrip2GainLayer3(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Strip[2].GainLayer()[3].Set(-18.3) vm.Strip[2].GainLayer()[3].Set(-18.3)
sync()
t.Run("Should return -18.3 when SetMc(true)", func(t *testing.T) { t.Run("Should return -18.3 when SetMc(true)", func(t *testing.T) {
assert.Equal(t, vm.Strip[2].GainLayer()[3].Get(), -18.3) assert.Equal(t, vm.Strip[2].GainLayer()[3].Get(), -18.3)
}) })
vm.Strip[2].GainLayer()[3].Set(-25.6) vm.Strip[2].GainLayer()[3].Set(-25.6)
sync()
t.Run("Should return -25.6 when SetMc(true)", func(t *testing.T) { t.Run("Should return -25.6 when SetMc(true)", func(t *testing.T) {
assert.Equal(t, vm.Strip[2].GainLayer()[3].Get(), -25.6) assert.Equal(t, vm.Strip[2].GainLayer()[3].Get(), -25.6)
}) })
@@ -130,13 +114,11 @@ func TestStrip2GainLayer3(t *testing.T) {
func TestBus3Eq(t *testing.T) { func TestBus3Eq(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Bus[3].SetEq(true) vm.Bus[3].SetEq(true)
sync()
t.Run("Should return true when SetEq(true)", func(t *testing.T) { t.Run("Should return true when SetEq(true)", func(t *testing.T) {
assert.True(t, vm.Bus[3].GetEq()) assert.True(t, vm.Bus[3].GetEq())
}) })
vm.Bus[3].SetEq(false) vm.Bus[3].SetEq(false)
sync()
t.Run("Should return false when SetEq(false)", func(t *testing.T) { t.Run("Should return false when SetEq(false)", func(t *testing.T) {
assert.False(t, vm.Bus[3].GetEq()) assert.False(t, vm.Bus[3].GetEq())
}) })
@@ -145,13 +127,11 @@ func TestBus3Eq(t *testing.T) {
func TestBus4Label(t *testing.T) { func TestBus4Label(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Bus[4].SetLabel("test0") vm.Bus[4].SetLabel("test0")
sync()
t.Run("Should return test0 when SetEq('test0')", func(t *testing.T) { t.Run("Should return test0 when SetEq('test0')", func(t *testing.T) {
assert.Equal(t, "test0", vm.Bus[4].GetLabel()) assert.Equal(t, "test0", vm.Bus[4].GetLabel())
}) })
vm.Bus[4].SetLabel("test1") vm.Bus[4].SetLabel("test1")
sync()
t.Run("Should return test1 when SetEq('test1')", func(t *testing.T) { t.Run("Should return test1 when SetEq('test1')", func(t *testing.T) {
assert.Equal(t, "test1", vm.Bus[4].GetLabel()) assert.Equal(t, "test1", vm.Bus[4].GetLabel())
}) })
@@ -160,7 +140,6 @@ func TestBus4Label(t *testing.T) {
func TestBus3ModeAmix(t *testing.T) { func TestBus3ModeAmix(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Bus[3].Mode().SetAmix(true) vm.Bus[3].Mode().SetAmix(true)
sync()
t.Run("Should return true when Mode().SetAmix(true)", func(t *testing.T) { t.Run("Should return true when Mode().SetAmix(true)", func(t *testing.T) {
assert.True(t, vm.Bus[3].Mode().GetAmix()) assert.True(t, vm.Bus[3].Mode().GetAmix())
}) })
@@ -169,13 +148,11 @@ func TestBus3ModeAmix(t *testing.T) {
func TestVbanInStream0On(t *testing.T) { func TestVbanInStream0On(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Vban.InStream[0].SetOn(true) vm.Vban.InStream[0].SetOn(true)
sync()
t.Run("Should return true when SetOn(true)", func(t *testing.T) { t.Run("Should return true when SetOn(true)", func(t *testing.T) {
assert.True(t, vm.Vban.InStream[0].GetOn()) assert.True(t, vm.Vban.InStream[0].GetOn())
}) })
vm.Vban.InStream[0].SetOn(false) vm.Vban.InStream[0].SetOn(false)
sync()
t.Run("Should return false when SetOn(false)", func(t *testing.T) { t.Run("Should return false when SetOn(false)", func(t *testing.T) {
assert.False(t, vm.Vban.InStream[0].GetOn()) assert.False(t, vm.Vban.InStream[0].GetOn())
}) })
@@ -184,13 +161,11 @@ func TestVbanInStream0On(t *testing.T) {
func TestVbanOutStream6On(t *testing.T) { func TestVbanOutStream6On(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Vban.OutStream[6].SetOn(true) vm.Vban.OutStream[6].SetOn(true)
sync()
t.Run("Should return true when SetOn(true)", func(t *testing.T) { t.Run("Should return true when SetOn(true)", func(t *testing.T) {
assert.True(t, vm.Vban.OutStream[6].GetOn()) assert.True(t, vm.Vban.OutStream[6].GetOn())
}) })
vm.Vban.OutStream[6].SetOn(false) vm.Vban.OutStream[6].SetOn(false)
sync()
t.Run("Should return false when SetOn(false)", func(t *testing.T) { t.Run("Should return false when SetOn(false)", func(t *testing.T) {
assert.False(t, vm.Vban.OutStream[6].GetOn()) assert.False(t, vm.Vban.OutStream[6].GetOn())
}) })
@@ -199,13 +174,11 @@ func TestVbanOutStream6On(t *testing.T) {
func TestVbanOutStream3Name(t *testing.T) { func TestVbanOutStream3Name(t *testing.T) {
t.Skip("skipping test") t.Skip("skipping test")
vm.Vban.OutStream[3].SetName("test0") vm.Vban.OutStream[3].SetName("test0")
sync()
t.Run("Should return test0 when SetName('test0')", func(t *testing.T) { t.Run("Should return test0 when SetName('test0')", func(t *testing.T) {
assert.Equal(t, "test0", vm.Vban.OutStream[3].GetName()) assert.Equal(t, "test0", vm.Vban.OutStream[3].GetName())
}) })
vm.Vban.OutStream[3].SetName("test1") vm.Vban.OutStream[3].SetName("test1")
sync()
t.Run("Should return test1 when SetName('test1')", func(t *testing.T) { t.Run("Should return test1 when SetName('test1')", func(t *testing.T) {
assert.Equal(t, "test1", vm.Vban.OutStream[3].GetName()) assert.Equal(t, "test1", vm.Vban.OutStream[3].GetName())
}) })
@@ -226,13 +199,11 @@ func TestVbanInStream4Bit(t *testing.T) {
func TestVbanOutStream4Bit(t *testing.T) { func TestVbanOutStream4Bit(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
vm.Vban.OutStream[4].SetBit(16) vm.Vban.OutStream[4].SetBit(16)
sync()
t.Run("Should return 16 when SetBit(16)", func(t *testing.T) { t.Run("Should return 16 when SetBit(16)", func(t *testing.T) {
assert.Equal(t, vm.Vban.OutStream[4].GetBit(), 16) assert.Equal(t, vm.Vban.OutStream[4].GetBit(), 16)
}) })
vm.Vban.OutStream[4].SetBit(24) vm.Vban.OutStream[4].SetBit(24)
sync()
t.Run("Should return 24 when SetBit(24)", func(t *testing.T) { t.Run("Should return 24 when SetBit(24)", func(t *testing.T) {
assert.Equal(t, vm.Vban.OutStream[4].GetBit(), 24) assert.Equal(t, vm.Vban.OutStream[4].GetBit(), 24)
}) })

View File

@@ -13,7 +13,7 @@ func allTrue(s []bool, sz int) bool {
} }
// update copies the contents of one float slice into another // update copies the contents of one float slice into another
func update(s1 []float32, s2 []float32, sz int) { func update(s1 []float64, s2 []float64, sz int) {
for i := 0; i < sz; i++ { for i := 0; i < sz; i++ {
s1[i] = s2[i] s1[i] = s2[i]
} }
@@ -26,10 +26,10 @@ func roundFloat(val float64, precision uint) float64 {
} }
// convertLevel performs the necessary math for a channel level // convertLevel performs the necessary math for a channel level
func convertLevel(i float32) float32 { func convertLevel(i float64) float64 {
if i > 0 { if i > 0 {
val := 20 * math.Log10(float64(i)) val := 20 * math.Log10(float64(i))
return float32(roundFloat(float64(val), 1)) return float64(roundFloat(float64(val), 1))
} }
return -200.0 return -200.0
} }

View File

@@ -20,8 +20,8 @@ func TestAllTrue(t *testing.T) {
func TestUpdate(t *testing.T) { func TestUpdate(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
s1 := []float32{3.6, 8.7, 1.8, 18.2} s1 := []float64{3.6, 8.7, 1.8, 18.2}
s2 := make([]float32, len(s1)) s2 := make([]float64, len(s1))
update(s2, s1, len(s1)) update(s2, s1, len(s1))
t.Run("Should return true", func(t *testing.T) { t.Run("Should return true", func(t *testing.T) {
assert.Equal(t, s1, s2) assert.Equal(t, s1, s2)
@@ -32,10 +32,10 @@ func TestConvertLevel(t *testing.T) {
//t.Skip("skipping test") //t.Skip("skipping test")
res := convertLevel(0.02) res := convertLevel(0.02)
t.Run("Should be equal", func(t *testing.T) { t.Run("Should be equal", func(t *testing.T) {
assert.Equal(t, float32(-34), res) assert.Equal(t, float64(-34), res)
}) })
res = convertLevel(-0.02) res = convertLevel(-0.02)
t.Run("Should be equal", func(t *testing.T) { t.Run("Should be equal", func(t *testing.T) {
assert.Equal(t, float32(-200), res) assert.Equal(t, float64(-200), res)
}) })
} }