OpenVR : log la décision d'état au niveau INFO

Single ligne par transition de state (RuntimeMissing → HmdAbsent → Ready).
Si jamais ça re-crash dans cette zone, on aura la dernière trace avant le
silence de Serilog ; ex. « OpenVR state: HmdAbsent (vrserver.exe pas lancé) ».
Pas de spam : on log uniquement à la transition (un check tourne toutes les
5 s, sans dédup ce serait 700 messages/heure).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-03 19:42:26 +02:00
parent c997859750
commit b94c0235b6

View File

@@ -27,6 +27,7 @@ public sealed class OpenVrService : IOpenVrService, IDisposable
private bool _resolverEnsured;
private bool _initAttempted;
private VrRuntimeState _lastLoggedState = (VrRuntimeState)(-99); // sentinelle « jamais loggé »
private uint _initToken;
private IntPtr _vrSystemVTable = IntPtr.Zero;
@@ -50,6 +51,7 @@ public sealed class OpenVrService : IOpenVrService, IDisposable
lock (_lock)
{
var state = EnsureReady();
LogStateTransition(state);
var label = ResolveLabel(deviceAlias);
if (state != VrRuntimeState.Ready)
{
@@ -317,6 +319,28 @@ public sealed class OpenVrService : IOpenVrService, IDisposable
catch { return null; }
}
/// <summary>
/// Log au niveau INFO la première occurrence d'un état + chaque transition.
/// Évite de spammer (un check s'exécute toutes les 5 s, on aurait 700 messages
/// par heure si on loggait à chaque tick) tout en laissant une trace claire
/// dans le journal au cas où ça re-crasherait — la dernière ligne avant le
/// silence de Serilog dirait par exemple « OpenVR state: HmdAbsent ».
/// </summary>
private void LogStateTransition(VrRuntimeState newState)
{
if (newState == _lastLoggedState) return;
_lastLoggedState = newState;
var detail = newState switch
{
VrRuntimeState.RuntimeMissing => "openvr_api.dll introuvable (SteamVR pas installé)",
VrRuntimeState.HmdAbsent => "vrserver.exe pas lancé ou aucun HMD branché",
VrRuntimeState.InitFailed => "VR_InitInternal2 a échoué",
VrRuntimeState.Ready => "OK, vtable IVRSystem_022 bindée",
_ => "?",
};
_logger.LogInformation("OpenVR state: {State} ({Detail})", newState, detail);
}
/// <summary>
/// vrserver.exe est le process central de SteamVR ; sa présence garantit qu'on
/// peut init OpenVR sans déclencher de chargement de drivers risqué. Cache de