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:
50
main.go
50
main.go
@@ -18,16 +18,16 @@ 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
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -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{}) {
|
||||||
|
if data, ok := pkt.(*sacn.DataPacket); ok {
|
||||||
|
app.HandleSACN(data.Universe, data.Data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
app.sacnReceivers = append(app.sacnReceivers, receiver)
|
||||||
|
receiver.Start()
|
||||||
}
|
}
|
||||||
sacnReceiver.SetHandler(func(src *net.UDPAddr, pkt interface{}) {
|
|
||||||
if data, ok := pkt.(*sacn.DataPacket); ok {
|
|
||||||
app.HandleSACN(data.Universe, data.Data)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
app.sacnReceiver = sacnReceiver
|
|
||||||
sacnReceiver.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()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user