Create one sACN receiver per universe for proper IGMP handling

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-29 21:42:58 -08:00
parent 52d069b5b8
commit 61ecd93c32

26
main.go
View File

@@ -20,7 +20,7 @@ import (
type App struct { type App struct {
cfg *config.Config cfg *config.Config
artReceiver *artnet.Receiver artReceiver *artnet.Receiver
sacnReceiver *sacn.Receiver sacnReceivers []*sacn.Receiver
artSender *artnet.Sender artSender *artnet.Sender
sacnSender *sacn.Sender sacnSender *sacn.Sender
discovery *artnet.Discovery discovery *artnet.Discovery
@@ -159,29 +159,27 @@ func main() {
log.Printf("[artnet] listening addr=%s", addr) log.Printf("[artnet] listening addr=%s", addr)
} }
// Create sACN receiver if needed // Create sACN receivers (one per universe)
sacnUniverses := cfg.SACNSourceUniverses() sacnUniverses := cfg.SACNSourceUniverses()
if len(sacnUniverses) > 0 { if len(sacnUniverses) > 0 {
sacnReceiver, err := sacn.NewReceiver(*sacnInterface)
if err != nil {
log.Fatalf("sacn receiver error: %v", err)
}
var iface *net.Interface var iface *net.Interface
if *sacnInterface != "" { if *sacnInterface != "" {
iface, _ = net.InterfaceByName(*sacnInterface) iface, _ = net.InterfaceByName(*sacnInterface)
} }
for _, u := range sacnUniverses { for _, u := range sacnUniverses {
if err := sacnReceiver.JoinUniverse(iface, u); err != nil { receiver, err := sacn.NewUniverseReceiver(iface, u)
log.Printf("[sacn] failed to join universe %d: %v", u, err) if err != nil {
log.Printf("[sacn] failed to create receiver for universe %d: %v", u, err)
continue
} }
} receiver.SetHandler(func(src *net.UDPAddr, pkt interface{}) {
sacnReceiver.SetHandler(func(src *net.UDPAddr, pkt interface{}) {
if data, ok := pkt.(*sacn.DataPacket); ok { if data, ok := pkt.(*sacn.DataPacket); ok {
app.HandleSACN(data.Universe, data.Data) app.HandleSACN(data.Universe, data.Data)
} }
}) })
app.sacnReceiver = sacnReceiver app.sacnReceivers = append(app.sacnReceivers, receiver)
sacnReceiver.Start() receiver.Start()
}
log.Printf("[sacn] listening universes=%v", sacnUniverses) log.Printf("[sacn] listening universes=%v", sacnUniverses)
} }
@@ -197,8 +195,8 @@ func main() {
if app.artReceiver != nil { if app.artReceiver != nil {
app.artReceiver.Stop() app.artReceiver.Stop()
} }
if app.sacnReceiver != nil { for _, r := range app.sacnReceivers {
app.sacnReceiver.Stop() r.Stop()
} }
discovery.Stop() discovery.Stop()
} }