From 2129d44be378df5b9a20ec7e72766a12686bd967 Mon Sep 17 00:00:00 2001 From: onyx-and-iris <75868496+onyx-and-iris@users.noreply.github.com> Date: Tue, 28 Jun 2022 14:34:03 +0100 Subject: [PATCH] recorder implemented fixes #1 added remote tests to check recorder --- voicemeeter/bus.go | 4 ++-- voicemeeter/command.go | 21 ++++++------------ voicemeeter/iremote.go | 36 +++++++++++++++---------------- voicemeeter/recorder.go | 44 ++++++++++++++++++++++++++++++++++++++ voicemeeter/remote.go | 41 ++++++++++++++++++++++++++++------- voicemeeter/remote_test.go | 27 +++++++++++++++++++++++ voicemeeter/strip.go | 4 ++-- voicemeeter/vban.go | 6 ++++-- 8 files changed, 137 insertions(+), 46 deletions(-) create mode 100644 voicemeeter/recorder.go diff --git a/voicemeeter/bus.go b/voicemeeter/bus.go index 9f9b139..1a3c8ed 100644 --- a/voicemeeter/bus.go +++ b/voicemeeter/bus.go @@ -79,7 +79,7 @@ type physicalBus struct { } func newPhysicalBus(i int) t_bus { - pb := physicalBus{bus{iRemote{"bus", i}}} + pb := physicalBus{bus{iRemote{fmt.Sprintf("bus[%d]", i), i}}} return t_bus(&pb) } @@ -93,7 +93,7 @@ type virtualBus struct { } func newVirtualBus(i int) t_bus { - vb := virtualBus{bus{iRemote{"bus", i}}} + vb := virtualBus{bus{iRemote{fmt.Sprintf("bus[%d]", i), i}}} return t_bus(&vb) } diff --git a/voicemeeter/command.go b/voicemeeter/command.go index 7c2f90b..93726ad 100644 --- a/voicemeeter/command.go +++ b/voicemeeter/command.go @@ -1,38 +1,31 @@ package voicemeeter -import "fmt" - type command struct { - identifier string + iRemote } func newCommand() *command { - return &command{"command"} -} - -func (c *command) setter(p string, v float32) { - param := fmt.Sprintf("%s.%s", c.identifier, p) - setParameterFloat(param, v) + return &command{iRemote{"command", 0}} } // Show shows the Voicemeete GUI if it's hidden func (c *command) Show() { - c.setter("Show", 1) + c.setter_float("Show", 1) } // Hide hides the Voicemeete GUI if it's shown func (c *command) Hide() { - c.setter("Show", 0) + c.setter_float("Show", 0) } // Shutdown shutdown the Voicemeeter GUI func (c *command) Shutdown() { - c.setter("Shutdown", 1) + c.setter_float("Shutdown", 1) } // Restart restarts the Voicemeeter audio engine func (c *command) Restart() { - c.setter("Restart", 1) + c.setter_float("Restart", 1) } // Lock locks or unlocks the Voiceemeter GUI @@ -44,5 +37,5 @@ func (c *command) Lock(val bool) { } else { value = 0 } - c.setter("Lock", value) + c.setter_float("Lock", value) } diff --git a/voicemeeter/iremote.go b/voicemeeter/iremote.go index d142a75..ff69873 100644 --- a/voicemeeter/iremote.go +++ b/voicemeeter/iremote.go @@ -10,19 +10,19 @@ type iRemote struct { index int } -func (c *iRemote) identifier() string { - return c._identifier +func (ir *iRemote) identifier() string { + return ir._identifier } // getter_bool returns the value of a boolean parameter -func (c *iRemote) getter_bool(p string) bool { - param := fmt.Sprintf("%s[%d].%s", c.identifier(), c.index, p) +func (ir *iRemote) getter_bool(p string) bool { + param := fmt.Sprintf("%s.%s", ir.identifier(), p) return getParameterFloat(param) == 1 } // setter_bool sets the value of a boolean parameter -func (c *iRemote) setter_bool(p string, v bool) { - param := fmt.Sprintf("%s[%d].%s", c.identifier(), c.index, p) +func (ir *iRemote) setter_bool(p string, v bool) { + param := fmt.Sprintf("%s.%s", ir.identifier(), p) var value float32 if v { value = 1 @@ -33,37 +33,37 @@ func (c *iRemote) setter_bool(p string, v bool) { } // getter_int returns the value of an int parameter p -func (c *iRemote) getter_int(p string) int { - param := fmt.Sprintf("%s[%d].%s", c.identifier(), c.index, p) +func (ir *iRemote) getter_int(p string) int { + param := fmt.Sprintf("%s.%s", ir.identifier(), p) return int(getParameterFloat(param)) } // setter_int sets the value v of an int parameter p -func (c *iRemote) setter_int(p string, v int) { - param := fmt.Sprintf("%s[%d].%s", c.identifier(), c.index, p) +func (ir *iRemote) setter_int(p string, v int) { + param := fmt.Sprintf("%s.%s", ir.identifier(), p) setParameterFloat(param, float32(v)) } // getter_float returns the value of an int parameter p -func (c *iRemote) getter_float(p string) float64 { - param := fmt.Sprintf("%s[%d].%s", c.identifier(), c.index, p) +func (ir *iRemote) getter_float(p string) float64 { + param := fmt.Sprintf("%s.%s", ir.identifier(), p) return getParameterFloat(param) } // setter_float sets the value v of an int parameter p -func (c *iRemote) setter_float(p string, v float32) { - param := fmt.Sprintf("%s[%d].%s", c.identifier(), c.index, p) +func (ir *iRemote) setter_float(p string, v float32) { + param := fmt.Sprintf("%s.%s", ir.identifier(), p) setParameterFloat(param, float32(v)) } // getter_string returns the value of a string parameter p -func (c *iRemote) getter_string(p string) string { - param := fmt.Sprintf("%s[%d].%s", c.identifier(), c.index, p) +func (ir *iRemote) getter_string(p string) string { + param := fmt.Sprintf("%s.%s", ir.identifier(), p) return getParameterString(param) } // setter_string sets the value v of a string parameter p -func (c *iRemote) setter_string(p, v string) { - param := fmt.Sprintf("%s[%d].%s", c.identifier(), c.index, p) +func (ir *iRemote) setter_string(p, v string) { + param := fmt.Sprintf("%s.%s", ir.identifier(), p) setParameterString(param, v) } diff --git a/voicemeeter/recorder.go b/voicemeeter/recorder.go new file mode 100644 index 0000000..eddb68e --- /dev/null +++ b/voicemeeter/recorder.go @@ -0,0 +1,44 @@ +package voicemeeter + +type recorder struct { + iRemote +} + +func newRecorder() *recorder { + return &recorder{iRemote{"recorder", 0}} +} + +// Play plays the file currently loaded into the recorder +func (r *recorder) Play() { + r.setter_float("Play", 1) +} + +// Stop stops the file currently playing +func (r *recorder) Stop() { + r.setter_float("Stop", 0) +} + +// Pause pauses the file currently playing +func (r *recorder) Pause() { + r.setter_float("Pause", 1) +} + +// Restart restarts the Voicemeeter audio engine +func (r *recorder) Replay() { + r.setter_float("Replay", 1) +} + +// Record records the current track playing +func (r *recorder) Record() { + r.setter_float("Record", 1) +} + +// Ff fast forwards the recorder +func (r *recorder) Ff() { + r.setter_float("Ff", 1) +} + +// Rew rewinds the recorder +func (r *recorder) Rew() { + r.setter_float("Rew", 1) +} diff --git a/voicemeeter/remote.go b/voicemeeter/remote.go index 7b357c9..c7d454a 100644 --- a/voicemeeter/remote.go +++ b/voicemeeter/remote.go @@ -8,12 +8,13 @@ import ( // A remote type represents the API for a kind, // comprised of slices representing each member type remote struct { - kind *kind - Strip []t_strip - Bus []t_bus - Button []button - Command *command - Vban *vban + kind *kind + Strip []t_strip + Bus []t_bus + Button []button + Command *command + Vban *vban + Recorder *recorder pooler *pooler } @@ -66,6 +67,8 @@ type remoteBuilder interface { makeButton() remoteBuilder makeCommand() remoteBuilder makeVban() remoteBuilder + makeRecorder() remoteBuilder + Build() remoteBuilder Get() *remote } @@ -79,9 +82,9 @@ func (d *director) SetBuilder(b remoteBuilder) { d.builder = b } -// Construct defines the steps required for building a remote type +// Construct calls the build function for the specific builder func (d *director) Construct() { - d.builder.setKind().makeStrip().makeBus().makeButton().makeCommand().makeVban() + d.builder.Build() } // Get forwards the Get method to the builder @@ -156,6 +159,13 @@ func (b *genericBuilder) makeVban() remoteBuilder { return b } +// makeVban makes a Vban type and assignss it to remote.Vban +func (b *genericBuilder) makeRecorder() remoteBuilder { + fmt.Println("building recorder") + b.r.Recorder = newRecorder() + return b +} + // Get returns a fully constructed remote type for a kind func (b *genericBuilder) Get() *remote { return &b.r @@ -165,14 +175,29 @@ type basicBuilder struct { genericBuilder } +// Build defines the steps required to build a basic type +func (basb *genericBuilder) Build() remoteBuilder { + return basb.setKind().makeStrip().makeBus().makeButton().makeCommand().makeVban() +} + type bananaBuilder struct { genericBuilder } +// Build defines the steps required to build a banana type +func (banb *bananaBuilder) Build() remoteBuilder { + return banb.setKind().makeStrip().makeBus().makeButton().makeCommand().makeVban().makeRecorder() +} + type potatoBuilder struct { genericBuilder } +// Build defines the steps required to build a potato type +func (potb *potatoBuilder) Build() remoteBuilder { + return potb.setKind().makeStrip().makeBus().makeButton().makeCommand().makeVban().makeRecorder() +} + // GetRemote returns a remote type for a kind // this is the interface entry point func GetRemote(kindId string) *remote { diff --git a/voicemeeter/remote_test.go b/voicemeeter/remote_test.go index fddd0b5..16e44f5 100644 --- a/voicemeeter/remote_test.go +++ b/voicemeeter/remote_test.go @@ -21,6 +21,15 @@ func TestGetBasicRemote(t *testing.T) { t.Run("Should bus length equal 2", func(t *testing.T) { assert.Equal(t, 2, len(__rem.Bus)) }) + t.Run("Should return a valid command pointer", func(t *testing.T) { + assert.NotNil(t, __rem.Command) + }) + t.Run("Should return a valid vban pointer", func(t *testing.T) { + assert.NotNil(t, __rem.Vban) + }) + t.Run("Should return nil recorder pointer", func(t *testing.T) { + assert.Nil(t, __rem.Recorder) + }) } func TestGetBananaRemote(t *testing.T) { @@ -38,6 +47,15 @@ func TestGetBananaRemote(t *testing.T) { t.Run("Should bus length equal 5", func(t *testing.T) { assert.Equal(t, 5, len(__rem.Bus)) }) + t.Run("Should return a valid command pointer", func(t *testing.T) { + assert.NotNil(t, __rem.Command) + }) + t.Run("Should return a valid vban pointer", func(t *testing.T) { + assert.NotNil(t, __rem.Vban) + }) + t.Run("Should return a valid recorder", func(t *testing.T) { + assert.NotNil(t, __rem.Recorder) + }) } func TestGetPotatoRemote(t *testing.T) { @@ -55,4 +73,13 @@ func TestGetPotatoRemote(t *testing.T) { t.Run("Should bus length equal 8", func(t *testing.T) { assert.Equal(t, 8, len(__rem.Bus)) }) + t.Run("Should return a valid command pointer", func(t *testing.T) { + assert.NotNil(t, __rem.Command) + }) + t.Run("Should return a valid vban pointer", func(t *testing.T) { + assert.NotNil(t, __rem.Vban) + }) + t.Run("Should return a valid recorder", func(t *testing.T) { + assert.NotNil(t, __rem.Recorder) + }) } diff --git a/voicemeeter/strip.go b/voicemeeter/strip.go index b72d0c3..f8c4bf3 100644 --- a/voicemeeter/strip.go +++ b/voicemeeter/strip.go @@ -102,7 +102,7 @@ type physicalStrip struct { func newPhysicalStrip(i int) t_strip { o := newOutputs("strip", i) - ps := physicalStrip{strip{iRemote{"strip", i}, o}} + ps := physicalStrip{strip{iRemote{fmt.Sprintf("strip[%d]", i), i}, o}} return t_strip(&ps) } @@ -157,7 +157,7 @@ type virtualStrip struct { func newVirtualStrip(i int) t_strip { o := newOutputs("strip", i) - vs := virtualStrip{strip{iRemote{"strip", i}, o}} + vs := virtualStrip{strip{iRemote{fmt.Sprintf("strip[%d]", i), i}, o}} return t_strip(&vs) } diff --git a/voicemeeter/vban.go b/voicemeeter/vban.go index 5dc2090..c762a42 100644 --- a/voicemeeter/vban.go +++ b/voicemeeter/vban.go @@ -1,5 +1,7 @@ package voicemeeter +import "fmt" + type t_vban interface { GetOn() bool SetOn(val bool) @@ -132,7 +134,7 @@ type vbanInStream struct { } func newVbanInStream(i int) t_vban { - vbi := vbanInStream{vbanStream{iRemote{"vban.instream", i}}} + vbi := vbanInStream{vbanStream{iRemote{fmt.Sprintf("vban.instream[%d]", i), i}}} return t_vban(&vbi) } @@ -156,7 +158,7 @@ type vbanOutStream struct { } func newVbanOutStream(i int) t_vban { - vbo := vbanOutStream{vbanStream{iRemote{"vban.outstream", i}}} + vbo := vbanOutStream{vbanStream{iRemote{fmt.Sprintf("vban.outstream[%d]", i), i}}} return t_vban(&vbo) }