From ff1b248c5cad47b734862a2377100f906b464058 Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Sat, 13 Jun 2026 08:28:11 -0400 Subject: [PATCH] feat(engine): let CreateSender carry the output frame rate (N/D) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The sender previously had no way to learn the configured frame rate, so NdiInteropPInvoke hardcoded 60000/1001 (59.94) into every outgoing frame regardless of the operator's target — silently defeating the framerate half of "normalization." CreateSender now takes frameRateN/frameRateD, defaulted to 60000/1001 so existing call sites and the fake compile unchanged. The sender pins this onto its handle and stamps it on each frame. --- src/Dragon-ISO.Engine/Interop/INdiInterop.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Dragon-ISO.Engine/Interop/INdiInterop.cs b/src/Dragon-ISO.Engine/Interop/INdiInterop.cs index 4778c63..f68b5f7 100644 --- a/src/Dragon-ISO.Engine/Interop/INdiInterop.cs +++ b/src/Dragon-ISO.Engine/Interop/INdiInterop.cs @@ -47,14 +47,22 @@ public interface INdiInterop // ----- Send ----- /// - /// Creates an NDI sender broadcasting on the given groups. + /// Creates an NDI sender broadcasting on the given groups at the given frame rate. /// /// The NDI source name segment (the part inside parens). /// /// Comma-separated list of NDI group names to broadcast on. null or empty /// uses the NDI default ("Public"). /// - NdiSenderHandle CreateSender(string outputName, string? groups = null); + /// + /// Frame-rate numerator advertised on every frame the sender emits (the NDI + /// frame_rate_N). Defaults to 60000 (the numerator of 59.94). + /// + /// + /// Frame-rate denominator (the NDI frame_rate_D). Defaults to 1001, so the + /// default pair 60000/1001 is exactly 59.94 fps. Must be positive. + /// + NdiSenderHandle CreateSender(string outputName, string? groups = null, int frameRateN = 60000, int frameRateD = 1001); void SendFrame(NdiSenderHandle sender, ProcessedFrame frame);