Use single multi-universe sACN receiver

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-30 15:39:47 -08:00
parent 664f0850de
commit 79c0877208

63
main.go
View File

@@ -22,24 +22,24 @@ import (
) )
type App struct { type App struct {
cfg *config.Config cfg *config.Config
artReceiver *artnet.Receiver artReceiver *artnet.Receiver
sacnReceivers []*sacn.Receiver sacnReceiver *sacn.Receiver
artSender *artnet.Sender artSender *artnet.Sender
sacnSender *sacn.Sender sacnSender *sacn.Sender
discovery *artnet.Discovery discovery *artnet.Discovery
engine *remap.Engine engine *remap.Engine
artTargets map[uint16]*net.UDPAddr artTargets map[uint16]*net.UDPAddr
sacnTargets map[uint16][]*net.UDPAddr sacnTargets map[uint16][]*net.UDPAddr
debug bool debug bool
inputMu sync.Mutex inputMu sync.Mutex
inputBySrc map[string]uint64 inputBySrc map[string]uint64
inputByUniv map[string]uint64 inputByUniv map[string]uint64
inputByName map[string]uint64 inputByName map[string]uint64
inputLastSeq map[string]uint8 inputLastSeq map[string]uint8
inputSeqSame map[string]uint64 inputSeqSame map[string]uint64
inputSeqDiff map[string]uint64 inputSeqDiff map[string]uint64
} }
func main() { func main() {
@@ -180,27 +180,24 @@ func main() {
log.Printf("[artnet] listening addr=%s", addr) log.Printf("[artnet] listening addr=%s", addr)
} }
// Create sACN receivers (one per universe) // Create sACN receiver for all source universes
sacnUniverses := cfg.SACNSourceUniverses() sacnUniverses := cfg.SACNSourceUniverses()
if len(sacnUniverses) > 0 { if len(sacnUniverses) > 0 {
var iface *net.Interface var iface *net.Interface
if *sacnInterface != "" { if *sacnInterface != "" {
iface, _ = net.InterfaceByName(*sacnInterface) iface, _ = net.InterfaceByName(*sacnInterface)
} }
for _, u := range sacnUniverses { receiver, err := sacn.NewMultiUniverseReceiver(iface, sacnUniverses)
receiver, err := sacn.NewUniverseReceiver(iface, u) if err != nil {
if err != nil { log.Fatalf("[sacn] failed to create receiver: %v", err)
log.Printf("[sacn] failed to create receiver for universe %d: %v", u, err)
continue
}
receiver.SetHandler(func(src *net.UDPAddr, pkt interface{}) {
if data, ok := pkt.(*sacn.DataPacket); ok {
app.HandleSACN(src, data)
}
})
app.sacnReceivers = append(app.sacnReceivers, receiver)
receiver.Start()
} }
receiver.SetHandler(func(src *net.UDPAddr, pkt interface{}) {
if data, ok := pkt.(*sacn.DataPacket); ok {
app.HandleSACN(src, data)
}
})
app.sacnReceiver = receiver
receiver.Start()
log.Printf("[sacn] listening universes=%v", sacnUniverses) log.Printf("[sacn] listening universes=%v", sacnUniverses)
} }
@@ -243,8 +240,8 @@ func main() {
if app.artReceiver != nil { if app.artReceiver != nil {
app.artReceiver.Stop() app.artReceiver.Stop()
} }
for _, r := range app.sacnReceivers { if app.sacnReceiver != nil {
r.Stop() app.sacnReceiver.Stop()
} }
discovery.Stop() discovery.Stop()
} }