diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ba72a9..5ba96ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,16 @@ Before any major/minor/patch bump all unit tests will be run to verify they pass - [x] +## [1.6.0] - 2022-09-14 + +### Added + +- vm.Sync() can now be used to force the dirty parameters to clear. + +### Changed + +- higher level methods/functions now accept/return float64 + ## [1.5.0] - 2022-09-07 ### Changed diff --git a/README.md b/README.md index ecaee15..60066a2 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ func main() { vm.Strip[0].SetLabel("rode podmic") vm.Strip[0].SetMute(true) + vm.Sync() fmt.Printf("Strip 0 (%s) mute was set to %v\n", vm.Strip[0].GetLabel(), vm.Strip[0].GetMute()) } ``` @@ -154,6 +155,10 @@ returns True iff a GUI parameter has changed returns True iff a macrobutton parameter has changed +#### `vm.Sync()` + +Use this to force dirty parameters to clear before continuing. Useful for slowing down getters. + ## `Available commands` ### Strip @@ -171,15 +176,15 @@ The following methods are available - `GetLabel() string` - `SetLabel(val string)` - `GetGain() float64` -- `SetGain(val float32)` from -60.0 to 12.0 +- `SetGain(val float64)` from -60.0 to 12.0 - `GetMc() bool` - `SetMc(val bool)` - `GetComp() float64` -- `SetComp(val float32)` from 0.0 to 10.0 +- `SetComp(val float64)` from 0.0 to 10.0 - `GetGate() float64` -- `SetGate(val float32)` from 0.0 to 10.0 +- `SetGate(val float64)` from 0.0 to 10.0 - `GetAudibility() float64` -- `SetAudibility(val float32)` from 0.0 to 10.0 +- `SetAudibility(val float64)` from 0.0 to 10.0 - `GetA1() bool - GetA5() bool` - `SetA1(val bool) - SetA5(val bool)` @@ -198,7 +203,7 @@ vm.Strip[4].SetA1(true) The following methods are available - `Get() float64` -- `Set(val float32)` +- `Set(val float64)` example: @@ -212,9 +217,9 @@ vm.Strip[6].GainLayer()[3].Set(-13.6) The following methods are available -- `PreFader() []float32` -- `PostFader() []float32` -- `PostMute() []float32` +- `PreFader() []float64` +- `PostFader() []float64` +- `PostMute() []float64` example: @@ -236,7 +241,7 @@ The following methods are available - `GetLabel() string` - `SetLabel(val string)` - `GetGain() float64` -- `SetGain(val float32)` from -60.0 to 12.0 +- `SetGain(val float64)` from -60.0 to 12.0 ```go vm.Bus[3].SetEq(true) @@ -287,7 +292,7 @@ vm.Bus[4].Mode().SetCenterOnly(true) The following methods are available -- `All() []float32` +- `All() []float64` example: diff --git a/base.go b/base.go index 907aad9..5314b6a 100644 --- a/base.go +++ b/base.go @@ -115,8 +115,8 @@ func mdirty() bool { // ldirty returns true iff a level value has changed func ldirty(k *kind) bool { - _levelCache.stripLevelsBuff = make([]float32, (2*k.PhysIn)+(8*k.VirtIn)) - _levelCache.busLevelsBuff = make([]float32, 8*k.NumBus()) + _levelCache.stripLevelsBuff = make([]float64, (2*k.PhysIn)+(8*k.VirtIn)) + _levelCache.busLevelsBuff = make([]float64, 8*k.NumBus()) for i := 0; i < (2*k.PhysIn)+(8*k.VirtIn); i++ { val, _ := getLevel(_levelCache.stripMode, i) @@ -165,9 +165,9 @@ func getParameterFloat(name string) (float64, error) { } // setParameterFloat sets the value of a float parameter -func setParameterFloat(name string, value float32) error { +func setParameterFloat(name string, value float64) error { b1 := append([]byte(name), 0) - b2 := math.Float32bits(value) + b2 := math.Float32bits(float32(value)) res, _, _ := vmSetParamFloat.Call( uintptr(unsafe.Pointer(&b1[0])), uintptr(b2), @@ -224,7 +224,7 @@ func setParametersMulti(script string) error { } // getMacroStatus gets a macrobutton value -func getMacroStatus(id, mode int) (float32, error) { +func getMacroStatus(id, mode int) (float64, error) { var state float32 res, _, _ := vmGetMacroStatus.Call( uintptr(id), @@ -235,7 +235,7 @@ func getMacroStatus(id, mode int) (float32, error) { err := fmt.Errorf("VBVMR_MacroButton_GetStatus returned %d", res) return 0, err } - return state, nil + return float64(state), nil } // setMacroStatus sets a macrobutton value @@ -297,8 +297,8 @@ func getDeviceDescription(i int, dir string) (string, uint64, string, error) { } // getLevel returns a single level value of type type_ for channel[i] -func getLevel(type_, i int) (float32, error) { - var val float32 +func getLevel(type_, i int) (float64, error) { + var val float64 res, _, _ := vmGetLevelFloat.Call( uintptr(type_), uintptr(i), diff --git a/bus.go b/bus.go index 57832ef..f650307 100644 --- a/bus.go +++ b/bus.go @@ -17,7 +17,7 @@ type iBus interface { GetLabel() string SetLabel(val string) GetGain() float64 - SetGain(val float32) + SetGain(val float64) Mode() iBusMode Levels() *levels FadeTo(target float32, time_ int) @@ -77,7 +77,7 @@ func (b *bus) GetGain() float64 { } // 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) } @@ -103,7 +103,7 @@ func (b *bus) FadeBy(change float32, time_ int) { time.Sleep(time.Millisecond) } -//physicalBus represents a single physical bus +// physicalBus represents a single physical bus type physicalBus struct { bus } @@ -122,7 +122,7 @@ func (p *physicalBus) String() string { return fmt.Sprintf("PhysicalBus%d", p.index) } -//virtualBus represents a single virtual bus +// virtualBus represents a single virtual bus type virtualBus struct { bus } @@ -305,8 +305,8 @@ func newBusLevels(i int, k *kind) levels { } // All returns the level values for a bus -func (l *levels) All() []float32 { - var levels []float32 +func (l *levels) All() []float64 { + var levels []float64 for i := l.init; i < l.init+l.offset; i++ { levels = append(levels, convertLevel(_levelCache.busLevels[i])) } diff --git a/command.go b/command.go index cb71fef..12fa556 100644 --- a/command.go +++ b/command.go @@ -1,6 +1,6 @@ package voicemeeter -//command represents command (action) type parameters +// command represents command (action) type parameters type command struct { iRemote } @@ -32,7 +32,7 @@ func (c *command) Restart() { // Lock locks or unlocks the Voiceemeter GUI func (c *command) Lock(val bool) { - var value float32 + var value float64 if val { value = 1 } else { diff --git a/iremote.go b/iremote.go index 7d91be1..5daabe1 100644 --- a/iremote.go +++ b/iremote.go @@ -35,7 +35,7 @@ func (ir *iRemote) setter_bool(p string, v bool) { } else { value = 0 } - err := setParameterFloat(param, float32(value)) + err := setParameterFloat(param, float64(value)) if err != nil { fmt.Println(err) } @@ -54,7 +54,7 @@ func (ir *iRemote) getter_int(p string) int { // setter_int sets the value v of an int parameter p func (ir *iRemote) setter_int(p string, v int) { param := fmt.Sprintf("%s.%s", ir.identifier(), p) - err := setParameterFloat(param, float32(v)) + err := setParameterFloat(param, float64(v)) if err != nil { fmt.Println(err) } @@ -71,9 +71,9 @@ func (ir *iRemote) getter_float(p string) float64 { } // 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) - err := setParameterFloat(param, float32(v)) + err := setParameterFloat(param, float64(v)) if err != nil { fmt.Println(err) } diff --git a/levels.go b/levels.go index 9da2112..e0f805f 100644 --- a/levels.go +++ b/levels.go @@ -25,18 +25,18 @@ var _levelCache *levelCache // levelCache defines level slices used by the pooler to track updates type levelCache struct { stripMode int - stripLevels []float32 - busLevels []float32 - stripLevelsBuff []float32 - busLevelsBuff []float32 + stripLevels []float64 + busLevels []float64 + stripLevelsBuff []float64 + busLevelsBuff []float64 stripComp []bool busComp []bool } // newLevelCache returns a levelCache struct address func newLevelCache(k *kind) *levelCache { - stripLevels := make([]float32, (2*k.PhysIn)+(8*k.VirtIn)) - busLevels := make([]float32, 8*k.NumBus()) + stripLevels := make([]float64, (2*k.PhysIn)+(8*k.VirtIn)) + busLevels := make([]float64, 8*k.NumBus()) stripComp := make([]bool, (2*k.PhysIn)+(8*k.VirtIn)) busComp := make([]bool, 8*k.NumBus()) if _levelCache == nil { diff --git a/remote.go b/remote.go index 4bd8ee9..9de2007 100644 --- a/remote.go +++ b/remote.go @@ -74,6 +74,12 @@ func (r *Remote) Mdirty() bool { return mdirty() } +// Sync is a helper method that waits for dirty parameters to clear +func (r *Remote) Sync() { + for r.Pdirty() || r.Mdirty() { + } +} + // Gets a float parameter value func (r *Remote) GetFloat(name string) float64 { val, err := getParameterFloat(name) @@ -84,7 +90,7 @@ func (r *Remote) GetFloat(name string) float64 { } // Sets a float paramter value -func (r *Remote) SetFloat(name string, value float32) { +func (r *Remote) SetFloat(name string, value float64) { setParameterFloat(name, value) } diff --git a/strip.go b/strip.go index b170ea1..6ed9daa 100644 --- a/strip.go +++ b/strip.go @@ -19,20 +19,20 @@ type iStrip interface { GetLabel() string SetLabel(val string) GetGain() float64 - SetGain(val float32) + SetGain(val float64) GetMc() bool SetMc(val bool) GetComp() float64 - SetComp(val float32) + SetComp(val float64) GetGate() float64 - SetGate(val float32) + SetGate(val float64) GetAudibility() float64 - SetAudibility(val float32) + SetAudibility(val float64) GainLayer() []gainLayer Levels() *levels - FadeTo(target float32, time_ int) - FadeBy(change float32, time_ int) - AppGain(name string, gain float32) + FadeTo(target float64, time_ int) + FadeBy(change float64, time_ int) + AppGain(name string, gain float64) AppMute(name string, val bool) iOutputs } @@ -101,7 +101,7 @@ func (s *strip) GetGain() float64 { } // 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) } @@ -116,18 +116,18 @@ func (s *strip) Levels() *levels { } // 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_)) time.Sleep(time.Millisecond) } // 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_)) time.Sleep(time.Millisecond) } -//physicalStrip represents a single physical strip +// physicalStrip represents a single physical strip type physicalStrip struct { strip } @@ -155,7 +155,7 @@ func (p *physicalStrip) GetComp() float64 { } // 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) } @@ -165,7 +165,7 @@ func (p *physicalStrip) GetGate() float64 { } // 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) } @@ -175,7 +175,7 @@ func (p *physicalStrip) GetAudibility() float64 { } // 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) } @@ -189,7 +189,7 @@ func (p *physicalStrip) SetMc(val bool) { panic("invalid parameter MC for physicalStrip") } -//virtualStrip represents a single virtual strip +// virtualStrip represents a single virtual strip type virtualStrip struct { strip } @@ -227,7 +227,7 @@ func (v *virtualStrip) GetComp() float64 { } // SetComp panics reason invalid parameter -func (v *virtualStrip) SetComp(val float32) { +func (v *virtualStrip) SetComp(val float64) { panic("invalid parameter Comp for virtualStrip") } @@ -237,7 +237,7 @@ func (v *virtualStrip) GetGate() float64 { } // SetGate panics reason invalid parameter -func (v *virtualStrip) SetGate(val float32) { +func (v *virtualStrip) SetGate(val float64) { panic("invalid parameter Gate for virtualStrip") } @@ -247,12 +247,12 @@ func (v *virtualStrip) GetAudibility() float64 { } // SetAudibility panics reason invalid parameter -func (v *virtualStrip) SetAudibility(val float32) { +func (v *virtualStrip) SetAudibility(val float64) { panic("invalid parameter Audibility for virtualStrip") } // 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)) } @@ -264,7 +264,7 @@ func (v *strip) AppMute(name string, val bool) { } else { 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 @@ -284,7 +284,7 @@ func (gl *gainLayer) Get() float64 { } // 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) } @@ -303,9 +303,9 @@ func newStripLevels(i int, k *kind) levels { } // PreFader returns the level values for this strip, PREFADER mode -func (l *levels) PreFader() []float32 { +func (l *levels) PreFader() []float64 { _levelCache.stripMode = 0 - var levels []float32 + var levels []float64 for i := l.init; i < l.init+l.offset; 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 -func (l *levels) PostFader() []float32 { +func (l *levels) PostFader() []float64 { _levelCache.stripMode = 1 - var levels []float32 + var levels []float64 for i := l.init; i < l.init+l.offset; 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 -func (l *levels) PostMute() []float32 { +func (l *levels) PostMute() []float64 { _levelCache.stripMode = 2 - var levels []float32 + var levels []float64 for i := l.init; i < l.init+l.offset; i++ { levels = append(levels, convertLevel(_levelCache.stripLevels[i])) } diff --git a/util.go b/util.go index e709ed4..eff9f58 100644 --- a/util.go +++ b/util.go @@ -13,7 +13,7 @@ func allTrue(s []bool, sz int) bool { } // 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++ { s1[i] = s2[i] } @@ -26,10 +26,10 @@ func roundFloat(val float64, precision uint) float64 { } // convertLevel performs the necessary math for a channel level -func convertLevel(i float32) float32 { +func convertLevel(i float64) float64 { if i > 0 { val := 20 * math.Log10(float64(i)) - return float32(roundFloat(float64(val), 1)) + return float64(roundFloat(float64(val), 1)) } return -200.0 } diff --git a/util_test.go b/util_test.go index 3dc1fea..da6bab7 100644 --- a/util_test.go +++ b/util_test.go @@ -20,8 +20,8 @@ func TestAllTrue(t *testing.T) { func TestUpdate(t *testing.T) { //t.Skip("skipping test") - s1 := []float32{3.6, 8.7, 1.8, 18.2} - s2 := make([]float32, len(s1)) + s1 := []float64{3.6, 8.7, 1.8, 18.2} + s2 := make([]float64, len(s1)) update(s2, s1, len(s1)) t.Run("Should return true", func(t *testing.T) { assert.Equal(t, s1, s2) @@ -32,10 +32,10 @@ func TestConvertLevel(t *testing.T) { //t.Skip("skipping test") res := convertLevel(0.02) 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) t.Run("Should be equal", func(t *testing.T) { - assert.Equal(t, float32(-200), res) + assert.Equal(t, float64(-200), res) }) }