automidically/internal/mixer/mixer.go

99 lines
2.3 KiB
Go

// git.auengun.net/GregoryDosh/automidically
// Copyright (C) 2020 GregoryDosh
package mixer
import (
"fmt"
"github.com/sirupsen/logrus"
)
var (
log = logrus.WithField("module", "mixer")
)
type Mapping struct {
Cc int `yaml:"cc"`
HardwareMin int `yaml:"hardwareMin"`
HardwareMax int `yaml:"hardwareMax"`
VolumeMin float32 `yaml:"volumeMin"`
VolumeMax float32 `yaml:"volumeMax"`
Filename []string `yaml:"-"`
Special []string `yaml:"-"`
Device []string `yaml:"-"`
Title []string `yaml:"-"`
}
func (m *Mapping) UnmarshalYAML(unmarshal func(interface{}) error) error {
// This is so we can set some default values if not specified in the config.
type rawMapping Mapping
raw := rawMapping{
HardwareMin: 0,
HardwareMax: 127,
VolumeMin: 0,
VolumeMax: 1,
}
if err := unmarshal(&raw); err != nil {
return err
}
// This is kludgy, but with it we can infer the params as strings or slices.
{
rString := struct {
Filename string
Special string
Device string
Title string
}{}
_ = unmarshal(&rString)
if rString.Filename != "" {
raw.Filename = []string{rString.Filename}
}
if rString.Special != "" {
raw.Special = []string{rString.Special}
}
if rString.Device != "" {
raw.Device = []string{rString.Device}
}
if rString.Title != "" {
raw.Title = []string{rString.Title}
}
rSlice := struct {
Filename []string
Special []string
Device []string
Title []string
}{}
_ = unmarshal(&rSlice)
if len(rSlice.Filename) > 0 {
raw.Filename = rSlice.Filename
}
if len(rSlice.Special) > 0 {
raw.Special = rSlice.Special
}
if len(rSlice.Device) > 0 {
raw.Device = rSlice.Device
}
if len(rSlice.Title) > 0 {
raw.Title = rSlice.Title
}
}
*m = Mapping(raw)
return nil
}
func (m *Mapping) Validate() error {
if m.HardwareMin > m.HardwareMax {
return fmt.Errorf("hardware minimum %d should not be greater than maximum %d", m.HardwareMin, m.HardwareMax)
}
if m.VolumeMin < 0 || m.VolumeMin > 1 {
return fmt.Errorf("volume minimum %f should be in range [0,1]", m.VolumeMin)
}
if m.VolumeMax < 0 || m.VolumeMax > 1 {
return fmt.Errorf("volume maximum %f should be in range [0,1]", m.VolumeMax)
}
log.Debug("validated")
return nil
}