Per-subsystem hook control: install/remove input, focus, audio at runtime
Add a host->hook control channel (protocol v5 -> v6: HookControl in SharedBlock, per-subsystem "disabled" flags, 0 = install so the zero-filled default is unchanged). The worker now reconciles each subsystem every tick: install what's requested-and-missing, remove what's no longer wanted -- so the audio hooks re-attach the ring and republish format on a reinstall, and XInput/focus clear their stale status flags on removal. Injection panel: a checkbox per subsystem (input forwarding / focus spoof / audio render-hook) toggles it at runtime, showing the requested vs actual installed state from the registry, plus DLL heartbeat liveness. The hook-status section now keys off whether a DLL was injected (host-side) rather than the input-hook "attached" flag, so it stays visible with input unhooked. Guards for dependent features: the synthetic-input control is disabled when input forwarding is off, and the Audio panel explains that mirroring uses loopback (echo) when the render-hook is off. Verified against Phantom Brave via coop_audio_probe: starting with audio requested off installs only input+focus (8 hooks, no capture); re-enabling at runtime installs the audio hooks (13) and capture starts immediately. All four tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -88,7 +88,25 @@ void AudioPanel::draw_ui(const HookStatusView& status, bool debug_details)
|
||||
// hooked path silences it, so don't warn there.
|
||||
if (mirror_.source() == AudioMirror::Source::Loopback)
|
||||
{
|
||||
ImGui::TextDisabled("Game audio also plays locally (echo). Inject the hook to remove it.");
|
||||
bool audio_hook_on = false;
|
||||
const std::uint32_t hn =
|
||||
status.hook_entry_count < kMaxHookEntries ? status.hook_entry_count : kMaxHookEntries;
|
||||
for (std::uint32_t i = 0; i < hn; ++i)
|
||||
{
|
||||
if (status.hook_entries[i].subsystem == HookSubsys_Audio && status.hook_entries[i].installed)
|
||||
{
|
||||
audio_hook_on = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (audio_hook_on)
|
||||
{
|
||||
ImGui::TextDisabled("Game audio also plays locally (echo).");
|
||||
}
|
||||
else
|
||||
{
|
||||
ImGui::TextDisabled("Audio render-hook is off -> loopback (echo). Enable it in the Injection panel.");
|
||||
}
|
||||
}
|
||||
|
||||
// --- Render-stream view -----------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user