summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--cmd/dolmetschctld/dolmetschctld.go12
-rw-r--r--pkg/mixer/mixer.go89
3 files changed, 101 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index c83f3bc..2dee1e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,8 @@ app/*.o
app/*.d
app/*.d.*
app/config.h
+cmd/dolmetschctl/dolmetschctl
+cmd/dolmetschctld/dolmetschctld
firmware/*.a
firmware/*.o
firmware/*.d
diff --git a/cmd/dolmetschctld/dolmetschctld.go b/cmd/dolmetschctld/dolmetschctld.go
index be9abd0..6cd74bb 100644
--- a/cmd/dolmetschctld/dolmetschctld.go
+++ b/cmd/dolmetschctld/dolmetschctld.go
@@ -25,6 +25,7 @@ package main
import (
"log"
"os"
+ "time"
"spreadspace.org/dolmetschctl/pkg/mixer"
)
@@ -39,6 +40,10 @@ func main() {
}
defer m.Shutdown()
+ log.Printf("successfully connected to mixer:")
+ log.Printf(" input: %s\t%s", m.DevIn.ID, m.DevIn.Name)
+ log.Printf(" output: %s\t%s", m.DevOut.ID, m.DevOut.Name)
+
if err = m.Init(); err != nil {
log.Println("Error initializeing the mixer: %v", err)
os.Exit(1)
@@ -46,7 +51,12 @@ func main() {
log.Printf("mixer successfully initialized!")
- // TODO: do something
+ // TODO: implement state machine
+ m.UnMute(0x24)
+ m.SetLevel(0x24, 42)
+ time.Sleep(2 * time.Second)
+ m.Mute(0x24)
+ m.SetLevel(0x24, mixer.FaderLevel0db)
log.Printf("exiting.")
}
diff --git a/pkg/mixer/mixer.go b/pkg/mixer/mixer.go
index 235978c..c3040fe 100644
--- a/pkg/mixer/mixer.go
+++ b/pkg/mixer/mixer.go
@@ -22,17 +22,104 @@
package mixer
+import (
+ "errors"
+ "strings"
+
+ "github.com/scgolang/midi"
+)
+
+type MixerChannel uint8
+type FaderLevel uint8
+
type Mixer struct {
+ DevIn *midi.Device
+ DevOut *midi.Device
+}
+
+// TODO: make this confgurabel
+const (
+ CC_MUTE = byte(0xB1)
+ CC_FADER = byte(0xB0)
+
+ FaderLevelMax = FaderLevel(0x7F)
+ FaderLevel0db = FaderLevel(0x60)
+ FaderLevelOff = FaderLevel(0x00)
+)
+
+func openDevice(devices []*midi.Device, prefix string) (d *midi.Device, err error) {
+ for _, device := range devices {
+ if strings.HasPrefix(device.Name, prefix) {
+ d = device
+ }
+ }
+ if d == nil {
+ return nil, errors.New("could not find device with prefix " + prefix)
+ }
+ return d, d.Open()
}
func NewMixer(c Config) (*Mixer, error) {
- return &Mixer{}, nil
+ devices, err := midi.Devices()
+ if err != nil {
+ return nil, err
+ }
+
+ m := &Mixer{}
+ if m.DevIn, err = openDevice(devices, c.DevIn); err != nil {
+ return nil, err
+ }
+ if m.DevOut, err = openDevice(devices, c.DevOut); err != nil {
+ return nil, err
+ }
+
+ return m, nil
}
func (m *Mixer) Init() error {
+ // TODO: sync state
return nil
}
func (m *Mixer) Shutdown() error {
+ if m.DevIn != nil {
+ m.DevIn.Close()
+ }
+ if m.DevOut != nil {
+ m.DevOut.Close()
+ }
+ return nil
+}
+
+func (m *Mixer) sendMute(channel byte, value byte) error {
+ n, err := m.DevOut.Write([]byte{CC_MUTE, channel, value})
+ if err != nil {
+ return err
+ }
+ if n != 3 {
+ return errors.New("sending mute command failed.")
+ }
+ return nil
+}
+
+func (m *Mixer) Mute(ch MixerChannel) error {
+ return m.sendMute(byte(ch), 0x7F)
+}
+
+func (m *Mixer) UnMute(ch MixerChannel) error {
+ return m.sendMute(byte(ch), 0x00)
+}
+
+func (m *Mixer) SetLevel(ch MixerChannel, level FaderLevel) error {
+ if level > FaderLevelMax {
+ level = FaderLevelMax
+ }
+ n, err := m.DevOut.Write([]byte{CC_FADER, byte(ch), byte(level)})
+ if err != nil {
+ return err
+ }
+ if n != 3 {
+ return errors.New("setting fader level failed.")
+ }
return nil
}