forked from lornajane/streamdeck-tricks
/
caster.go
97 lines (82 loc) · 2.39 KB
/
caster.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package addons
import (
"image/color"
"regexp"
"strconv"
"github.com/hypebeast/go-osc/osc"
"github.com/rf152/streamdeck-tricks/actionhandlers"
"github.com/rf152/go-streamdeck"
buttons "github.com/rf152/go-streamdeck/buttons"
sddecorators "github.com/rf152/go-streamdeck/decorators"
"github.com/rs/zerolog/log"
)
type Caster struct {
SD *streamdeck.StreamDeck
}
var buttons_osc map[int]string // just the track ID and name
func (c *Caster) Init() {
go c.osc_server()
}
func (c *Caster) Buttons() {
buttons_osc = make(map[int]string)
osc_send_sync()
}
func (c *Caster) osc_server() {
addr := "127.0.0.1:9000"
d := osc.NewStandardDispatcher()
d.AddMsgHandler("*", func(msg *osc.Message) {
go c.osc_event(msg.Address, msg.Arguments)
})
server := &osc.Server{
Addr: addr,
Dispatcher: d,
}
log.Debug().Msg("Starting OSC Listener")
go server.ListenAndServe()
}
func (c *Caster) osc_event(Address string, Arguments []interface{}) {
// buttons offset, where to start
offset := 23
// react to a new track name
re := regexp.MustCompile(`/cbp/(.)/m/label/tr_name$`)
info := re.FindStringSubmatch(Address)
if len(info) > 1 {
track_name := Arguments[0].(string)
track_index, _ := strconv.Atoi(info[1])
if (track_name) != "<Drop File>" {
log.Debug().Msg("Track " + info[1] + " is: " + track_name)
// make a button
audiobutton := buttons.NewTextButton(track_name)
audiobutton.SetActionHandler(&actionhandlers.OSCAction{Track: track_index})
c.SD.AddButton(offset+track_index, audiobutton)
buttons_osc[track_index] = track_name
}
}
rf := regexp.MustCompile(`/cbp/(.)/m/label/p_s$`)
info = rf.FindStringSubmatch(Address)
if len(info) > 1 {
track_index, _ := strconv.Atoi(info[1])
// ignore all the tracks that we didn't register
if _, ok := buttons_osc[track_index]; ok {
action := Arguments[0].(string)
if action == "Playing" {
log.Debug().Msg("Playing: " + buttons_osc[track_index])
decorator2 := sddecorators.NewBorder(12, color.RGBA{255, 255, 150, 255})
c.SD.SetDecorator(offset+track_index, decorator2)
}
if action == "Stopped" {
log.Debug().Msg("Stopped: " + buttons_osc[track_index])
c.SD.UnsetDecorator(offset + track_index)
}
}
}
}
func osc_send_sync() {
client := osc.NewClient("127.0.0.1", 5051)
msg := osc.NewMessage("/glo/sync")
msg.Append(int32(1))
err := client.Send(msg)
if err != nil {
log.Error().Err(err)
}
}