Skip to content

Commit 542d13d

Browse files
committed
CoInitializeSecurity fallback, Standable toggle
1 parent a4799ba commit 542d13d

File tree

7 files changed

+259
-189
lines changed

7 files changed

+259
-189
lines changed

driver_00Amethyst/ServerProvider.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ vr::EVRInitError ServerProvider::Init(vr::IVRDriverContext* pDriverContext)
5555
catch (const winrt::hresult_error& e)
5656
{
5757
logMessage(std::format("Could not update pose override for ID {}. Exception: {}", id,
58-
WStringToString(e.message().c_str())));
58+
WStringToString(e.message().c_str())));
5959
return e.code().value;
6060
}
6161
catch (const std::exception& e)
@@ -77,7 +77,7 @@ vr::EVRInitError ServerProvider::Init(vr::IVRDriverContext* pDriverContext)
7777
catch (const winrt::hresult_error& e)
7878
{
7979
logMessage(std::format("Could not update pose override for ID {}. Exception: {}", id,
80-
WStringToString(e.message().c_str())));
80+
WStringToString(e.message().c_str())));
8181
return e.code().value;
8282
}
8383
catch (const std::exception& e)
@@ -99,11 +99,20 @@ void ServerProvider::SetupService(const _GUID clsid)
9999
try
100100
{
101101
init_apartment(winrt::apartment_type::multi_threaded);
102-
winrt::check_hresult(CoInitializeSecurity(
102+
if (const auto& result = CoInitializeSecurity(
103103
nullptr, -1, nullptr, nullptr,
104-
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
105-
RPC_C_IMP_LEVEL_IDENTIFY,
106-
nullptr, EOAC_NONE, nullptr));
104+
RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IDENTIFY,
105+
nullptr, EOAC_NONE, nullptr); FAILED(result))
106+
{
107+
logMessage("Failed to initialize security! "
108+
"Amethyst's COM server may be revoked when the app disconnects.");
109+
110+
if (result == RPC_E_TOO_LATE)
111+
logMessage("Reason: CoInitializeSecurity was already called by another driver.");
112+
else
113+
logMessage(std::format(
114+
"Reason: {}", WStringToString(winrt::hresult_error(result).message().c_str())));
115+
}
107116

108117
DriverCleanup();
109118
driver_service_ = winrt::make_self<DriverService>();

driver_Amethyst/ServerProvider.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,20 @@ class ServerProvider : public vr::IServerTrackedDeviceProvider, IRebuildCallback
6161
try
6262
{
6363
init_apartment(winrt::apartment_type::multi_threaded);
64-
winrt::check_hresult(CoInitializeSecurity(
64+
if (const auto& result = CoInitializeSecurity(
6565
nullptr, -1, nullptr, nullptr,
66-
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
67-
RPC_C_IMP_LEVEL_IDENTIFY,
68-
nullptr, EOAC_NONE, nullptr));
66+
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,RPC_C_IMP_LEVEL_IDENTIFY,
67+
nullptr, EOAC_NONE, nullptr); FAILED(result))
68+
{
69+
logMessage("Failed to initialize security! "
70+
"Amethyst's COM server may be revoked when the app disconnects.");
71+
72+
if (result == RPC_E_TOO_LATE)
73+
logMessage("Reason: CoInitializeSecurity was already called by another driver.");
74+
else
75+
logMessage(std::format(
76+
"Reason: {}", WStringToString(winrt::hresult_error(result).message().c_str())));
77+
}
6978

7079
DriverCleanup();
7180
driver_service_ = winrt::make_self<DriverService>();

plugin_OpenVR/Assets/Strings/en.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,14 @@
249249
{
250250
"id": "/ServerStatuses/-111/Content",
251251
"translation": "Please re-register the driver entry from SteamVR service settings within Amethyst."
252+
},
253+
{
254+
"id": "/Settings/Toggles/Standable",
255+
"translation": "Turn on Standable support"
256+
},
257+
{
258+
"id": "/Settings/Toggles/Standable/Comment",
259+
"translation": "ー Amethyst will mark inferred trackers as invalid"
252260
}
253261
]
254262
}

plugin_OpenVR/OpenVR.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -664,9 +664,11 @@ public TrackerBase GetTrackerPose(string contains, bool canBeFromAmethyst = true
664664
var enumTrackerBases = trackerBases.ToList();
665665
foreach (var trackerBase in enumTrackerBases.ToList())
666666
if (IsEmulationEnabled)
667-
_00driverService?.SetTrackerState(trackerBase.ComTracker00());
667+
_00driverService?.SetTrackerState(trackerBase.ComTracker00(
668+
Host.PluginSettings.GetSetting("StandableSupport", false)));
668669
else
669-
_driverService?.SetTrackerState(trackerBase.ComTracker());
670+
_driverService?.SetTrackerState(trackerBase.ComTracker(
671+
Host.PluginSettings.GetSetting("StandableSupport", false)));
670672

671673
return Task.FromResult(wantReply ? enumTrackerBases.Select(x => (x, true)) : null);
672674
}
@@ -691,9 +693,11 @@ public TrackerBase GetTrackerPose(string contains, bool canBeFromAmethyst = true
691693
var enumTrackerBases = trackerBases.ToList();
692694
foreach (var trackerBase in enumTrackerBases.ToList())
693695
if (IsEmulationEnabled)
694-
_00driverService?.UpdateTracker(trackerBase.ComTracker00());
696+
_00driverService?.UpdateTracker(trackerBase.ComTracker00(
697+
Host.PluginSettings.GetSetting("StandableSupport", false)));
695698
else
696-
_driverService?.UpdateTracker(trackerBase.ComTracker());
699+
_driverService?.UpdateTracker(trackerBase.ComTracker(
700+
Host.PluginSettings.GetSetting("StandableSupport", false)));
697701

698702
return Task.FromResult(wantReply ? enumTrackerBases.Select(x => (x, true)) : null);
699703
}
@@ -1231,12 +1235,14 @@ public bool SetupNullDriver(bool enableDriver, bool enableViewport = false)
12311235

12321236
public static class OvrExtensions
12331237
{
1234-
public static driver_Amethyst.dTrackerBase ComTracker(this TrackerBase tracker)
1238+
public static driver_Amethyst.dTrackerBase ComTracker(this TrackerBase tracker, bool allowInferred)
12351239
{
12361240
return new driver_Amethyst.dTrackerBase
12371241
{
12381242
ConnectionState = Convert.ToSByte(tracker.ConnectionState),
1239-
TrackingState = Convert.ToSByte(tracker.TrackingState == TrackedJointState.StateTracked),
1243+
TrackingState = Convert.ToSByte(allowInferred
1244+
? tracker.TrackingState is not TrackedJointState.StateNotTracked
1245+
: tracker.TrackingState is TrackedJointState.StateTracked),
12401246
Serial = tracker.Serial,
12411247
Role = (driver_Amethyst.dTrackerType)tracker.Role,
12421248
Position = tracker.Position.ComVector(),
@@ -1248,12 +1254,14 @@ public static driver_Amethyst.dTrackerBase ComTracker(this TrackerBase tracker)
12481254
};
12491255
}
12501256

1251-
public static driver_00Amethyst.dTrackerBase ComTracker00(this TrackerBase tracker)
1257+
public static driver_00Amethyst.dTrackerBase ComTracker00(this TrackerBase tracker, bool allowInferred)
12521258
{
12531259
return new driver_00Amethyst.dTrackerBase
12541260
{
12551261
ConnectionState = Convert.ToSByte(tracker.ConnectionState),
1256-
TrackingState = Convert.ToSByte(tracker.TrackingState == TrackedJointState.StateTracked),
1262+
TrackingState = Convert.ToSByte(allowInferred
1263+
? tracker.TrackingState is not TrackedJointState.StateNotTracked
1264+
: tracker.TrackingState is TrackedJointState.StateTracked),
12571265
Serial = tracker.Serial,
12581266
Role = (driver_00Amethyst.dTrackerType)tracker.Role,
12591267
Position = tracker.Position.ComVector00(),

0 commit comments

Comments
 (0)