Two items from listening-gate round 2. Mute: AcdreamToggleAudioMute (default Ctrl+M; bare M is selection) flips OpenAlAudioEngine.Muted, implemented as the AL LISTENER gain - unused since A2 moved all mixing to the CPU, so it is a free master switch that silences already-playing voices instantly and restores them exactly, without touching the retail mixing math, the -50 dB allocation cutoff, or any persisted volume setting. Rebindable like every other action; console line confirms each flip. Inn chatter: the user hears talk-and-laughter ambience in retail inns and not in acdream. Three installed-dat scans (pinned as conformance tests in EnvCellSoundEmitterInventoryTests) prove the mechanism is NOT client data: no interior static in the town landblock carries an ambient-slot sound table, no Setup among all 5,935 in the portal dat references one, and yet 23 sound tables carrying ONLY Ambient1..8 slots exist - pure soundscape banks with nothing client-side pointing at them. They are wire-bound: the server attaches one to an emitter object via CreateObject's sound-table field and fires the slots over 0xF750 - ACE implements exactly this (EmoteType.Sound heartbeat emotes -> GameMessageSound broadcast). Our 0xF750 receiver (slice A3) is live and now instrumented (ACDREAM_PROBE_SOUND_WIRE=1, via the new AudioDiagnostics owner per Code Structure Rule 5, with per-event drop reasons in AudioHookSink.PlayServerSound). A probed session against the local ACE received ZERO 0xF750 events across a town walkabout: the silence is server world-content (no emitters configured/firing), not a client drop. The first scan's assertion originally encoded the emitter-object hypothesis; the data refuted it, and the test now pins the negative so the conclusion cannot silently rot. Full Release suite green (the one failure during development was the hypothesis-pinning assertion, corrected to pin the finding). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
22 lines
911 B
C#
22 lines
911 B
C#
using System;
|
|
|
|
namespace AcDream.Core.Audio;
|
|
|
|
/// <summary>
|
|
/// Diagnostic toggles for the audio subsystem, read once at startup per the
|
|
/// Code Structure Rules (one static owner per subsystem; no per-call-site
|
|
/// env reads).
|
|
/// </summary>
|
|
public static class AudioDiagnostics
|
|
{
|
|
/// <summary>
|
|
/// One console line per inbound server Sound event (0xF750) and per
|
|
/// wire-sound play decision, with the drop reason when nothing plays.
|
|
/// Used to pin whether interior soundscapes (inn chatter — server-bound
|
|
/// ambient sound tables fired by emitter heartbeats) are absent because
|
|
/// the server never sends them or because the client drops them.
|
|
/// <para>Initial state from <c>ACDREAM_PROBE_SOUND_WIRE=1</c>.</para>
|
|
/// </summary>
|
|
public static bool ProbeWireSoundsEnabled { get; set; } =
|
|
Environment.GetEnvironmentVariable("ACDREAM_PROBE_SOUND_WIRE") == "1";
|
|
}
|