summaryrefslogtreecommitdiff
path: root/cmd/dolmetschctld
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/dolmetschctld')
-rw-r--r--cmd/dolmetschctld/dolmetschctld.go12
-rw-r--r--cmd/dolmetschctld/statemachine.go78
2 files changed, 68 insertions, 22 deletions
diff --git a/cmd/dolmetschctld/dolmetschctld.go b/cmd/dolmetschctld/dolmetschctld.go
index 45536e8..dfbb47a 100644
--- a/cmd/dolmetschctld/dolmetschctld.go
+++ b/cmd/dolmetschctld/dolmetschctld.go
@@ -29,6 +29,14 @@ import (
"spreadspace.org/dolmetschctl/pkg/mixer"
)
+func addLanguage(sm *StateMachine, name Language, main, voice mixer.Channel) {
+ if err := sm.AddLanguage(name, main, voice); err != nil {
+ log.Printf("adding language '%s' failed: %v", name, err)
+ os.Exit(1)
+ }
+ log.Printf("successfully added language: '%s'", name)
+}
+
func main() {
log.Println("hello world.")
@@ -56,6 +64,10 @@ func main() {
}
log.Printf("state machine successfully initialized!")
+ // TODO: make this configurable
+ addLanguage(sm, "en", 0x20, 0x24)
+ addLanguage(sm, "de", 0x22, 0x25)
+
sm.Start()
defer sm.Shutdown()
diff --git a/cmd/dolmetschctld/statemachine.go b/cmd/dolmetschctld/statemachine.go
index 2aba4bb..97f29c0 100644
--- a/cmd/dolmetschctld/statemachine.go
+++ b/cmd/dolmetschctld/statemachine.go
@@ -23,7 +23,7 @@
package main
import (
- "errors"
+ "fmt"
"log"
"spreadspace.org/dolmetschctl/pkg/mixer"
@@ -52,9 +52,22 @@ func (s State) String() string {
type Language string
+func (l Language) String() string {
+ if l == "" {
+ return "none"
+ }
+ return string(l)
+}
+
+type LanguageChannel struct {
+ Num mixer.Channel
+ currentLevel mixer.FaderLevel
+ muted bool
+}
+
type LanguageChannels struct {
- main mixer.Channel
- voice mixer.Channel
+ main LanguageChannel
+ voice LanguageChannel
}
type selectLangRequest struct {
@@ -68,34 +81,18 @@ type StateMachine struct {
quitCh chan bool
exitedCh chan struct{}
- languages map[Language]LanguageChannels
+ languages map[Language]LanguageChannels
+ channel2lang map[mixer.Channel]Language
currentState State
currentLang Language
targetLang Language
}
-func NewStateMachine(m *mixer.Mixer) (*StateMachine, error) {
- sm := &StateMachine{mixer: m}
- sm.selectLangCh = make(chan selectLangRequest, 10)
- sm.quitCh = make(chan bool, 1)
- sm.exitedCh = make(chan struct{})
-
- sm.languages = make(map[Language]LanguageChannels)
- sm.languages["en"] = LanguageChannels{0x20, 0x24}
- sm.languages["de"] = LanguageChannels{0x22, 0x25}
-
- sm.currentState = StateNew
- sm.currentLang = ""
- sm.targetLang = ""
-
- return sm, nil
-}
-
func (sm *StateMachine) selectLang(l Language) error {
if l != "" {
if _, exists := sm.languages[l]; !exists {
- return errors.New("language '" + string(l) + "' does not exist")
+ return fmt.Errorf("language '%s' does not exist", l)
}
}
sm.targetLang = l
@@ -130,6 +127,43 @@ func (sm *StateMachine) run() {
}
}
+func NewStateMachine(m *mixer.Mixer) (*StateMachine, error) {
+ sm := &StateMachine{mixer: m}
+ sm.selectLangCh = make(chan selectLangRequest, 10)
+ sm.quitCh = make(chan bool, 1)
+ sm.exitedCh = make(chan struct{})
+
+ sm.languages = make(map[Language]LanguageChannels)
+ sm.channel2lang = make(map[mixer.Channel]Language)
+
+ sm.currentState = StateNew
+ sm.currentLang = ""
+ sm.targetLang = ""
+
+ return sm, nil
+}
+
+func (sm *StateMachine) AddLanguage(name Language, main, voice mixer.Channel) error {
+ if name == "none" {
+ return fmt.Errorf("language 'none' is reserved")
+ }
+ if _, exists := sm.languages[name]; exists {
+ return fmt.Errorf("language '%s' already exists", name)
+ }
+ for ch := range []mixer.Channel{main, voice} {
+ if l, exists := sm.languages[name]; exists {
+ return fmt.Errorf("mixer channel %v is already in use by language '%s'", ch, l)
+ }
+ }
+
+ chMain := LanguageChannel{main, mixer.FaderLevel0db, false}
+ chVoice := LanguageChannel{voice, mixer.FaderLevel0db, false}
+ sm.languages[name] = LanguageChannels{chMain, chVoice}
+ sm.channel2lang[main] = name
+ sm.channel2lang[voice] = name
+ return nil
+}
+
func (sm *StateMachine) Start() {
go sm.run()
}