Merge pull request #1424 from PepperDash/fix/videoCodec-routing-issues

fix: update routing logic
This commit is contained in:
Neil Dorin 2026-05-22 10:18:53 -06:00 committed by GitHub
commit aa050121ae
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 23 additions and 10 deletions

View file

@ -249,7 +249,7 @@ namespace PepperDash.Essentials.Core
} }
// otherwise, audioVideo needs to be handled as two steps. // otherwise, audioVideo needs to be handled as two steps.
Debug.LogDebug(destination, "Attempting to build source route from {destinationKey} to {sourceKey} of type {type}", source.Key, signalType); Debug.LogDebug(destination, "Attempting to build source route from {destinationKey} to {sourceKey} of type {type}", destination.Key, source.Key, signalType);
RouteDescriptor audioRouteDescriptor; RouteDescriptor audioRouteDescriptor;
@ -374,24 +374,28 @@ namespace PepperDash.Essentials.Core
IndexTieLines(); IndexTieLines();
} }
var sinks = DeviceManager.AllDevices.OfType<IRoutingInputs>().Where(d => !(d is IRoutingInputsOutputs)); var sinks = DeviceManager.AllDevices.OfType<IRoutingInputs>();
var sources = DeviceManager.AllDevices.OfType<IRoutingOutputs>().Where(d => !(d is IRoutingInputsOutputs)); var sources = DeviceManager.AllDevices.OfType<IRoutingOutputs>();
foreach (var sink in sinks) foreach (var sink in sinks.Where(d => !(d is IRoutingInputsOutputs)))
{ {
foreach (var source in sources) foreach (var source in sources.Where(d => !(d is IRoutingInputsOutputs)))
{ {
foreach (var inputPort in sink.InputPorts) foreach (var inputPort in sink.InputPorts)
{ {
foreach (var outputPort in source.OutputPorts) foreach (var outputPort in source.OutputPorts)
{ {
var (audioOrSingleRoute, videoRoute) = sink.GetRouteToSource(source, inputPort.Type, inputPort, outputPort); var (audioOrSingleRoute, videoRoute) = sink.GetRouteToSource(source, outputPort.Type, inputPort, outputPort);
if (audioOrSingleRoute == null && videoRoute == null) if (audioOrSingleRoute == null && videoRoute == null)
{ {
continue; continue;
} }
Debug.LogVerbose("AudioOrSingleRoute Found: {audioRoute}", audioOrSingleRoute);
Debug.LogVerbose("VideoRoute Found: {videoRoute}", videoRoute);
if (audioOrSingleRoute != null) if (audioOrSingleRoute != null)
{ {
// Only add routes that have actual switching steps // Only add routes that have actual switching steps
@ -646,6 +650,8 @@ namespace PepperDash.Essentials.Core
// Only the ones that are routing devices // Only the ones that are routing devices
var midpointTieLines = destinationTieLines.Where(t => t.SourcePort.ParentDevice is IRoutingInputsOutputs); var midpointTieLines = destinationTieLines.Where(t => t.SourcePort.ParentDevice is IRoutingInputsOutputs);
Debug.LogVerbose(destination, "Found {tieLineCount} tie lines to walk for {destinationKey}", midpointTieLines.Count(), destination.Key);
//Create a list for tracking already checked devices to avoid loops, if it doesn't already exist from previous iteration //Create a list for tracking already checked devices to avoid loops, if it doesn't already exist from previous iteration
if (alreadyCheckedDevices == null) if (alreadyCheckedDevices == null)
alreadyCheckedDevices = new List<IRoutingInputsOutputs>(); alreadyCheckedDevices = new List<IRoutingInputsOutputs>();
@ -685,7 +691,7 @@ namespace PepperDash.Essentials.Core
if (goodInputPort == null) if (goodInputPort == null)
{ {
Debug.LogVerbose(destination, "No route found to {0}", source.Key); Debug.LogVerbose(destination, "No route found to {0} from destination {1} for type {2}", source.Key, destination.Key, signalType);
// Cache this as an impossible route // Cache this as an impossible route
_impossibleRoutes.TryAdd(routeKey, 0); _impossibleRoutes.TryAdd(routeKey, 0);

View file

@ -66,6 +66,9 @@ namespace PepperDash.Essentials.Core.Routing
foreach (var midpointKey in upstreamMidpoints) foreach (var midpointKey in upstreamMidpoints)
{ {
if (string.IsNullOrEmpty(midpointKey))
continue;
if (!midpointToSinksMap.ContainsKey(midpointKey)) if (!midpointToSinksMap.ContainsKey(midpointKey))
midpointToSinksMap[midpointKey] = new HashSet<string>(); midpointToSinksMap[midpointKey] = new HashSet<string>();
@ -115,7 +118,8 @@ namespace PepperDash.Essentials.Core.Routing
if (tieLine.SourcePort.ParentDevice is IRoutingWithFeedback midpoint) if (tieLine.SourcePort.ParentDevice is IRoutingWithFeedback midpoint)
{ {
midpoints.Add(midpoint.Key); if (!string.IsNullOrEmpty(midpoint.Key))
midpoints.Add(midpoint.Key);
// Find upstream TieLines connected to this midpoint's inputs // Find upstream TieLines connected to this midpoint's inputs
var midpointInputs = (midpoint as IRoutingInputs)?.InputPorts; var midpointInputs = (midpoint as IRoutingInputs)?.InputPorts;
@ -244,6 +248,9 @@ namespace PepperDash.Essentials.Core.Routing
var upstreamMidpoints = GetUpstreamMidpoints(sink); var upstreamMidpoints = GetUpstreamMidpoints(sink);
foreach (var midpointKey in upstreamMidpoints) foreach (var midpointKey in upstreamMidpoints)
{ {
if (string.IsNullOrEmpty(midpointKey))
continue;
if (!midpointToSinksMap.ContainsKey(midpointKey)) if (!midpointToSinksMap.ContainsKey(midpointKey))
midpointToSinksMap[midpointKey] = new HashSet<string>(); midpointToSinksMap[midpointKey] = new HashSet<string>();

View file

@ -21,7 +21,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// <summary> /// <summary>
/// Represents a MockVC /// Represents a MockVC
/// </summary> /// </summary>
public class MockVC : VideoCodecBase, IRoutingSource, IHasCallHistory, IHasScheduleAwareness, IHasCallFavorites, IHasDirectory, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets public class MockVC : VideoCodecBase, IRoutingSource, IHasCallHistory, IHasScheduleAwareness, IHasCallFavorites, IHasDirectory, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets, IRoutingInputs
{ {
/// <summary> /// <summary>
/// Gets or sets the PropertiesConfig /// Gets or sets the PropertiesConfig

View file

@ -26,7 +26,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// <summary> /// <summary>
/// Base class for video codec devices /// Base class for video codec devices
/// </summary> /// </summary>
public abstract class VideoCodecBase : ReconfigurableDevice, IRoutingInputsOutputs, public abstract class VideoCodecBase : ReconfigurableDevice,
IUsageTracking, IHasDialer, IHasContentSharing, ICodecAudio, iVideoCodecInfo, IBridgeAdvanced, IHasStandbyMode IUsageTracking, IHasDialer, IHasContentSharing, ICodecAudio, iVideoCodecInfo, IBridgeAdvanced, IHasStandbyMode
{ {
private const int XSigEncoding = 28591; private const int XSigEncoding = 28591;