diff --git a/host/src/audio/audio_loopback.cpp b/host/src/audio/audio_loopback.cpp index 3d14ade..969517f 100644 --- a/host/src/audio/audio_loopback.cpp +++ b/host/src/audio/audio_loopback.cpp @@ -496,7 +496,7 @@ AudioMirror::HookedResult AudioMirror::run_hooked(AudioRingHeader* const* rings) } char st[96]; - std::snprintf(st, sizeof(st), "Mirroring (hooked, no echo): %u Hz %u ch %u-bit", rate, channels, bits); + std::snprintf(st, sizeof(st), "Mirroring (hooked): %u Hz %u ch %u-bit", rate, channels, bits); set_status(st); source_.store(Source::Hooked, std::memory_order_relaxed); running_.store(true, std::memory_order_release); diff --git a/host/src/audio/audio_loopback.hpp b/host/src/audio/audio_loopback.hpp index d181256..64d3a27 100644 --- a/host/src/audio/audio_loopback.hpp +++ b/host/src/audio/audio_loopback.hpp @@ -86,7 +86,7 @@ public: switch (source()) { case Source::Hooked: - return "Hooked (no echo)"; + return "Hooked"; // echo depends on the format provenance; the panel shows it case Source::Loopback: return "Loopback (echo)"; default: diff --git a/host/src/audio_panel.cpp b/host/src/audio_panel.cpp index 00b92e0..b735a70 100644 --- a/host/src/audio_panel.cpp +++ b/host/src/audio_panel.cpp @@ -213,7 +213,20 @@ void AudioPanel::draw_ui(const HookStatusView& status, bool debug_details) ImGui::TextColored(kGreen, "Mirroring %u Hz, %u ch", mirror_.sample_rate(), mirror_.channels()); ImGui::Text("Source:"); ImGui::SameLine(); - ImGui::TextColored(hooked ? kGreen : kAmber, "%s", mirror_.source_name()); + if (hooked) + { + // The hooked path only silences (no echo) an EXACT / override format, whose frame + // size is known. A guessed stream is captured but not silenced (silencing a guessed + // buffer could over-write it), so the game stays audible -- an echo. Make that clear. + const std::uint32_t st = status.audio_streams[0].format_state; + const bool no_echo = (st == AudioFormat_Exact || st == AudioFormat_Override); + ImGui::TextColored(no_echo ? kGreen : kAmber, "Hooked (%s)", + no_echo ? "no echo" : "echo -- guessed format"); + } + else + { + ImGui::TextColored(kAmber, "%s", mirror_.source_name()); + } // Where the rendered format came from -- so it's clear the playback pitch is right. // Hooked: the primary stream's provenance (exact / measured). Loopback: the audio is