feat: add safe Tornado K3D playout adapter
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<Platforms>x64</Platforms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\MBN_STOCK_WEBVIEW.Core\MBN_STOCK_WEBVIEW.Core.csproj" />
|
||||
<ProjectReference Include="..\..\src\MBN_STOCK_WEBVIEW.Playout\MBN_STOCK_WEBVIEW.Playout.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
124
tools/MBN_STOCK_WEBVIEW.PlayoutSmoke/Program.cs
Normal file
124
tools/MBN_STOCK_WEBVIEW.PlayoutSmoke/Program.cs
Normal file
@@ -0,0 +1,124 @@
|
||||
using System.Diagnostics;
|
||||
using System.Text.Json;
|
||||
using MBN_STOCK_WEBVIEW.Core.Playout;
|
||||
using MBN_STOCK_WEBVIEW.Playout;
|
||||
using MBN_STOCK_WEBVIEW.Playout.Configuration;
|
||||
using MBN_STOCK_WEBVIEW.Playout.Registration;
|
||||
|
||||
var command = args.Length == 0 ? "--probe" : args[0].ToLowerInvariant();
|
||||
|
||||
return command switch
|
||||
{
|
||||
"--probe" => Probe(),
|
||||
"--dry-run" => await DryRunAsync(),
|
||||
_ => Usage()
|
||||
};
|
||||
|
||||
static int Probe()
|
||||
{
|
||||
var runtimeRegistration = new K3dRegistrationProbe().Probe();
|
||||
var processInspectionAvailable = true;
|
||||
var tornadoProcessCount = 0;
|
||||
var programWindowDetected = false;
|
||||
Process[] processes;
|
||||
try
|
||||
{
|
||||
processes = Process.GetProcesses();
|
||||
}
|
||||
catch
|
||||
{
|
||||
processes = [];
|
||||
processInspectionAvailable = false;
|
||||
}
|
||||
|
||||
foreach (var process in processes)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!process.ProcessName.StartsWith("Tornado2", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
tornadoProcessCount++;
|
||||
var title = process.MainWindowTitle;
|
||||
if (title.Contains("PGM", StringComparison.OrdinalIgnoreCase) ||
|
||||
title.Contains("PROGRAM", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
programWindowDetected = true;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// A process may exit or deny inspection between enumeration and reading.
|
||||
}
|
||||
finally
|
||||
{
|
||||
process.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine(JsonSerializer.Serialize(new
|
||||
{
|
||||
architecture = Environment.Is64BitProcess ? "x64" : "x86",
|
||||
runtimeRegistration = new
|
||||
{
|
||||
ready = runtimeRegistration.IsReady,
|
||||
issues = runtimeRegistration.Issues.ToString(),
|
||||
engineClassReady = runtimeRegistration.IsEngineClassReady,
|
||||
eventHandlerClassReady = runtimeRegistration.IsEventHandlerClassReady,
|
||||
message = runtimeRegistration.Message
|
||||
},
|
||||
tornado = new
|
||||
{
|
||||
inspectionAvailable = processInspectionAvailable,
|
||||
processCount = tornadoProcessCount,
|
||||
programWindowDetected
|
||||
},
|
||||
safety = programWindowDetected
|
||||
? "PROGRAM window detected; no COM activation was attempted."
|
||||
: "Read-only probe complete; no COM activation was attempted."
|
||||
}, new JsonSerializerOptions { WriteIndented = true }));
|
||||
|
||||
return runtimeRegistration.IsReady && Environment.Is64BitProcess
|
||||
? 0
|
||||
: 2;
|
||||
}
|
||||
|
||||
static async Task<int> DryRunAsync()
|
||||
{
|
||||
var options = new PlayoutOptions { Mode = PlayoutMode.DryRun };
|
||||
await using var engine = PlayoutEngineFactory.Create(options);
|
||||
var cue = new PlayoutCue("DRY_RUN_ONLY.t2s", "DRY_RUN_ONLY");
|
||||
|
||||
var results = new[]
|
||||
{
|
||||
await engine.ConnectAsync(),
|
||||
await engine.PrepareAsync(cue),
|
||||
await engine.TakeInAsync(),
|
||||
await engine.NextAsync(cue with { SceneName = "DRY_RUN_NEXT" }),
|
||||
await engine.TakeOutAsync(PlayoutTakeOutScope.All),
|
||||
await engine.DisconnectAsync()
|
||||
};
|
||||
|
||||
Console.WriteLine(JsonSerializer.Serialize(new
|
||||
{
|
||||
mode = engine.Status.Mode.ToString(),
|
||||
state = engine.Status.State.ToString(),
|
||||
commands = results.Select(result => new
|
||||
{
|
||||
operation = result.Operation.ToString(),
|
||||
code = result.Code.ToString(),
|
||||
message = result.Message
|
||||
})
|
||||
}, new JsonSerializerOptions { WriteIndented = true }));
|
||||
|
||||
return results.All(result => result.IsSuccess) ? 0 : 3;
|
||||
}
|
||||
|
||||
static int Usage()
|
||||
{
|
||||
Console.Error.WriteLine("Usage: MBN_STOCK_WEBVIEW.PlayoutSmoke [--probe|--dry-run]");
|
||||
Console.Error.WriteLine("This tool never enables Test or Live mode and never activates K3D COM in dry-run.");
|
||||
return 64;
|
||||
}
|
||||
Reference in New Issue
Block a user