#99: VERIFY IN THE IMAGE -- the shared-alarm Stop is authentic; do not diverge

Answering "did you check the decomp or disassembly?" -- I had not.  I had checked
the authored data (BTL4.RES) and the MUNGA engine source and called it authentic
on source lineage alone.  Now verified in BTL4OPT.EXE:

  same sources compiled in : d:\tesla_bt\munga\AUDSEQ.CPP / AUDWTHR.CPP strings
  object factory           : @00466184  case 0x4b -> alloc 0x5C -> ctor @0043ccec
  vtable                   : 0x4ead48
  ReceiveControl           : @0043d3a4 -- switch on control IDs 1 / 2 / 9 / 12,
                             which is exactly our enum Start / Stop / Idle / Tempo
  Stop case                : @0043d3ca -> unconditional call StopSequence @0043d2d4
  StopSequence             : tests only its OWN isRunning (+0x28) then the Chase
                             loop -- NO refcount, NO awareness of other leak sources

Structurally identical to engine/MUNGA/AUDSEQ.cpp.  So the arcade behaved the same
way: with 19 subsystems sharing one alarm sequence, any one of them clearing its
leak silences the alarm while the others still leak.  AUTHENTIC -- do not "fix".

(The tempo bound check could not be used as an anchor: Verify() compiles out of the
retail build, so the AUDSEQ.CPP assert strings are present in .data but unreferenced
by code and invisible to the decomp export -- gotcha 21 again.  The object-factory
route via the numeric ClassID is what actually located the class.)

Recorded in context/gauges-hud.md with the full chain and the address table, so the
next person does not re-chase it or "fix" it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joe DiPrima
2026-08-01 18:32:33 -05:00
co-authored by Claude Opus 5
parent e058b6acb7
commit 8daac37e40
+41
View File
@@ -699,6 +699,47 @@ a batch of gauges per gauge turn (a visit is only a rate-mask check unless due).
within ~1s, bg cost 2-4 ms/frame. Diagnostics: `BT_PERF=1` → `[perf] … bgTasks/gaugeTurns/
sweeps/active` 1 Hz (APPMGR.cpp); `[score] panel DRAW` edge log (btl4gau3.cpp, BT_SCORE_LOG).
## The COOLANT-LEAK ALARM audio chain — fully built; the shared-Stop is AUTHENTIC (#99, 2026-08-01) [T1 disasm-verified]
The audible leak warning is **implemented and works end to end**; an earlier note
claiming it was "genuinely unbuilt" was wrong (asserted without checking).
**The chain**, traced live (all probes under `BT_ATTRBIND_LOG`):
`HeatSink::coolantActive` (published as the `ReportLeak` attribute) changes 0->1
-> `AttributeWatcherOf<Logical>::Execute` sees it (`[watchpoll] CHANGE`)
-> `AudioMatchOf<Logical>::SendNotificationOfChange` fires (`[matchfire] val=1 -> ctl 1`)
-> `AudioControlSequence::ReceiveControl(StartAudioControlID)` -> `StartSequence`
-> an `AudioIdleWatcher` ticks it each frame (`IdleAudioControlID` -> `RunSequence`)
-> `[seqsend]` emits the authored pattern: two chirps then an ~8s sustained tone, looped.
**The authored wiring (BTL4.RES): 19 subsystems, ONE shared alarm sequence.**
`Condenser1-6, GeneratorA-D, Myomers, PPC_1/2, ERMLaser_1-3, SRM6_1/2, Avionics`
each bind TWO `AudioLogicalTrigger`s to their own `ReportLeak` — match 1 -> ctl 1
(Start), match 0 -> ctl 2 (Stop) — and every one of them drives the SAME sequence.
**Consequence, and it is AUTHENTIC:** any single subsystem clearing its leak sends
an unconditional Stop, silencing the alarm even while others still leak; the
still-leaking ones never re-assert because their flag has not *changed*. Reported
from the field as a bug ("was sounding, resolved a leak, but there was another").
**Do NOT 'fix' it** — verified in the arcade image, not merely inferred from the
engine source lineage:
| what | where |
|---|---|
| same MUNGA sources compiled in | `d: esla_bt\munga\AUDSEQ.CPP` / `AUDWTHR.CPP` strings present |
| object factory | `@00466184` `case 0x4b` -> alloc **0x5C** -> ctor `@0043ccec` |
| vtable | `0x4ead48` |
| `ReceiveControl` | `@0043d3a4` — switch on control IDs **1 / 2 / 9 / 12** = Start / Stop / Idle / Tempo (exactly our enum) |
| Stop case | `@0043d3ca` -> unconditional `call StopSequence @0043d2d4` |
| `StopSequence` | tests only its OWN `isRunning` (`+0x28`), then the Chase loop — **no refcount, no awareness of other leak sources** |
So the arcade had the identical structure. Silence in 4.11.674 was a different
cause: the OpenAL source pool was exhausted in every player session (see the audio
pooling fix) — an alarm that cannot acquire a source is silent.
⚠ The bench cannot confirm audibility: it runs with no audio device (`live=0
pooled=0`), so the control chain is verified but final playback is not.
## Key Relationships
- Full history: `docs/GAUGE_COMPOSITE.md`; reticle recovery: `phases/phase-02-dpl2d-reticle.md`.
- Uses: [[attribute-pointer]] + [[reconstruction-gotchas]]; reads [[subsystems]] state.