fix dante flow count and zero-pad rx channel numbers

This commit is contained in:
Ian Gulliver
2026-01-23 16:30:53 -08:00
parent c694efade5
commit c16146f2d8

View File

@@ -115,58 +115,63 @@ func (d *DanteFlows) LogAll() {
return sortorder.NaturalLess(flows[i].SourceName, flows[j].SourceName) return sortorder.NaturalLess(flows[i].SourceName, flows[j].SourceName)
}) })
log.Printf("[sigusr1] ================ %d dante flows ================", len(flows))
for _, flow := range flows {
type channelFlow struct { type channelFlow struct {
sourceName string
txCh string txCh string
rxName string rxName string
rxCh string rxCh string
} }
var channelFlows []channelFlow var allChannelFlows []channelFlow
var noChannelSubs []string var allNoChannelFlows []string
for _, sub := range flow.Subscribers {
if len(sub.Channels) == 0 {
noChannelSubs = append(noChannelSubs, sub.Name)
} else {
for _, ch := range sub.Channels {
parts := strings.Split(ch, "->")
if len(parts) == 2 {
channelFlows = append(channelFlows, channelFlow{
txCh: parts[0],
rxName: sub.Name,
rxCh: parts[1],
})
} else {
noChannelSubs = append(noChannelSubs, fmt.Sprintf("%s[%s]", sub.Name, ch))
}
}
}
}
sort.Slice(channelFlows, func(i, j int) bool {
if channelFlows[i].txCh != channelFlows[j].txCh {
return sortorder.NaturalLess(channelFlows[i].txCh, channelFlows[j].txCh)
}
return sortorder.NaturalLess(channelFlows[i].rxName, channelFlows[j].rxName)
})
sort.Slice(noChannelSubs, func(i, j int) bool {
return sortorder.NaturalLess(noChannelSubs[i], noChannelSubs[j])
})
for _, flow := range flows {
sourceName := flow.SourceName sourceName := flow.SourceName
if strings.HasPrefix(sourceName, "dante-av:") || strings.HasPrefix(sourceName, "dante-mcast:") { if strings.HasPrefix(sourceName, "dante-av:") || strings.HasPrefix(sourceName, "dante-mcast:") {
sourceName = "?? (" + sourceName + ")" sourceName = "?? (" + sourceName + ")"
} }
for _, cf := range channelFlows { for _, sub := range flow.Subscribers {
log.Printf("[sigusr1] %s[%s] -> %s[%s]", sourceName, cf.txCh, cf.rxName, cf.rxCh) if len(sub.Channels) == 0 {
allNoChannelFlows = append(allNoChannelFlows, fmt.Sprintf("%s -> %s", sourceName, sub.Name))
} else {
for _, ch := range sub.Channels {
parts := strings.Split(ch, "->")
if len(parts) == 2 {
allChannelFlows = append(allChannelFlows, channelFlow{
sourceName: sourceName,
txCh: parts[0],
rxName: sub.Name,
rxCh: parts[1],
})
} else {
allNoChannelFlows = append(allNoChannelFlows, fmt.Sprintf("%s -> %s[%s]", sourceName, sub.Name, ch))
} }
if len(noChannelSubs) > 0 {
log.Printf("[sigusr1] %s -> %s", sourceName, strings.Join(noChannelSubs, ", "))
} }
} }
} }
}
totalFlows := len(allChannelFlows) + len(allNoChannelFlows)
log.Printf("[sigusr1] ================ %d dante flows ================", totalFlows)
sort.Slice(allChannelFlows, func(i, j int) bool {
if allChannelFlows[i].sourceName != allChannelFlows[j].sourceName {
return sortorder.NaturalLess(allChannelFlows[i].sourceName, allChannelFlows[j].sourceName)
}
if allChannelFlows[i].txCh != allChannelFlows[j].txCh {
return sortorder.NaturalLess(allChannelFlows[i].txCh, allChannelFlows[j].txCh)
}
return sortorder.NaturalLess(allChannelFlows[i].rxName, allChannelFlows[j].rxName)
})
sort.Strings(allNoChannelFlows)
for _, cf := range allChannelFlows {
log.Printf("[sigusr1] %s[%s] -> %s[%s]", cf.sourceName, cf.txCh, cf.rxName, cf.rxCh)
}
for _, flow := range allNoChannelFlows {
log.Printf("[sigusr1] %s", flow)
}
}
func nextDanteSeq() uint16 { func nextDanteSeq() uint16 {
return uint16(atomic.AddUint32(&danteSeqID, 1)) return uint16(atomic.AddUint32(&danteSeqID, 1))
@@ -477,7 +482,7 @@ func (t *Tendrils) probeDanteDeviceWithPort(ip net.IP, port int) {
if sub.TxDeviceName != "" && info.Name != "" { if sub.TxDeviceName != "" && info.Name != "" {
channelInfo := "" channelInfo := ""
if sub.TxChannelName != "" { if sub.TxChannelName != "" {
channelInfo = fmt.Sprintf("%s->%d", sub.TxChannelName, sub.RxChannel) channelInfo = fmt.Sprintf("%s->%02d", sub.TxChannelName, sub.RxChannel)
} }
t.danteFlows.Update(sub.TxDeviceName, info.Name, channelInfo) t.danteFlows.Update(sub.TxDeviceName, info.Name, channelInfo)
needIGMPFallback = false needIGMPFallback = false