diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | cmd/dolmetschctld/dolmetschctld.go | 12 | ||||
-rw-r--r-- | pkg/mixer/mixer.go | 89 |
3 files changed, 101 insertions, 2 deletions
@@ -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 } |