Mimir/src/Mimir.Runtime/Synchronization/MimirNetworkTransportConfiguration.cs
2026-06-16 18:08:40 +01:00

105 lines
4.5 KiB
C#

namespace Mimir.Runtime.Synchronization;
public enum MimirNetworkPayloadKind
{
TypedTimingState,
RawAudioDebugWindow,
CompressedAudioProgramFeed,
CompressedVideoProgramFeed,
RawVideoDiagnosticWindow,
MuxedAudioVideoProgramFeed
}
public enum MimirNetworkTransportKind
{
CultMeshTypedState,
CultMeshReliableUdpMedia,
LanUdpDatagrams,
SrtDiagnosticMedia,
WebRtcExperimental,
LocalPipeDiagnostic
}
public sealed record MimirNetworkTransportConfiguration(
string Id,
string Description,
MimirNetworkTransportKind TransportKind,
MimirNetworkPayloadKind PayloadKind,
bool MayAffectClock,
bool CarriesRawMedia,
double TargetLatencyMilliseconds,
string[] RequiredDocuments,
string[] RejectionConditions,
string Notes);
public static class MimirNetworkTransportConfigurations
{
public static MimirNetworkTransportConfiguration CultMeshTimingState { get; } = new(
"cultmesh-timing-state",
"Primary remote-witness path: compact decoded anchors, clock fits, response profiles, and health.",
MimirNetworkTransportKind.CultMeshTypedState,
MimirNetworkPayloadKind.TypedTimingState,
MayAffectClock: true,
CarriesRawMedia: false,
TargetLatencyMilliseconds: 20.0,
RequiredDocuments: ["mimir.bioacoustic_codebook_state", "mimir.bioacoustic_decoder_state", "mimir.acoustic_path_state"],
RejectionConditions: ["unknown-node", "wrong-codebook", "low-confidence", "clock-authority-conflict"],
"Network timestamps are metadata. Decoded anchors are timing evidence.");
public static MimirNetworkTransportConfiguration RawAudioDebugWindow { get; } = new(
"raw-audio-debug-window",
"Short raw PCM window for debugging remote witness failures.",
MimirNetworkTransportKind.LanUdpDatagrams,
MimirNetworkPayloadKind.RawAudioDebugWindow,
MayAffectClock: false,
CarriesRawMedia: true,
TargetLatencyMilliseconds: 50.0,
RequiredDocuments: ["mimir.acoustic_path_state"],
RejectionConditions: ["not-requested", "outside-debug-session", "oversized-window"],
"Raw audio can explain failures; it should not become the normal timing authority.");
public static MimirNetworkTransportConfiguration SrtProgramBridge { get; } = new(
"srt-program-bridge",
"Existing LAN media bridge for OBS diagnostics and remote program feeds.",
MimirNetworkTransportKind.SrtDiagnosticMedia,
MimirNetworkPayloadKind.CompressedVideoProgramFeed,
MayAffectClock: false,
CarriesRawMedia: true,
TargetLatencyMilliseconds: 1500.0,
RequiredDocuments: [],
RejectionConditions: ["used-as-clock-authority", "used-for-local-hot-path"],
"Useful bridge. Not the Perfect Machine's synchronization core.");
public static MimirNetworkTransportConfiguration CultMeshProgramBridge { get; } = new(
"cultmesh-program-bridge",
"Reliable-UDP CultMesh media bridge for muxed program frames that OBS consumes through a local Starfire endpoint.",
MimirNetworkTransportKind.CultMeshReliableUdpMedia,
MimirNetworkPayloadKind.MuxedAudioVideoProgramFeed,
MayAffectClock: false,
CarriesRawMedia: true,
TargetLatencyMilliseconds: 500.0,
RequiredDocuments: ["mimir.cultmesh_media_frame"],
RejectionConditions: ["used-as-clock-authority", "unbounded-media-cache", "non-local-obs-egress"],
"Raven publishes rolling media-frame documents over CultNet reliable UDP; Starfire lowers them to a local OBS MPEG-TS endpoint.");
public static MimirNetworkTransportConfiguration WebRtcExperiment { get; } = CultMeshTimingState with
{
Id = "webrtc-experimental-media",
Description = "Experimental phone/browser media path; typed timing state still carries authority.",
TransportKind = MimirNetworkTransportKind.WebRtcExperimental,
PayloadKind = MimirNetworkPayloadKind.CompressedAudioProgramFeed,
CarriesRawMedia = true,
TargetLatencyMilliseconds = 80.0,
RejectionConditions = ["used-without-decoded-anchors", "browser-audio-processing-unknown"],
Notes = "Do not trust browser media timestamps without decoded witness state."
};
public static IReadOnlyList<MimirNetworkTransportConfiguration> BuiltIn { get; } =
[
CultMeshTimingState,
RawAudioDebugWindow,
CultMeshProgramBridge,
SrtProgramBridge,
WebRtcExperiment
];
}