Split out from #70 (which covers the ILS reminder audio and lands the cross-platform
one-shot playback groundwork).
Add spoken audio cues for the Atemschutz side, reusing the cross-platform one-shot
IAlarmService.Play(AlarmSound) path introduced in #70:
- "Druckabfrage fällig" — spoken cue when a Trupp's Atemschutzkontrolle (pressure
check) becomes due; once per control cycle, re-armed after a recorded pressure.
- Replace the Rückzugsalarm siren with speech — drop the looping
alarm.wav
siren and announce "Rückzugsalarm", re-announced on a cadence (~15 s) until
acknowledged (to preserve the siren's "insistent until handled" property).
Work:
- Extend the
AlarmSound enum with PressureCheckDue and RetreatAlarm.
- Add the two spoken WAV assets (AI-generated):
voice-druckabfrage.wav,
voice-rueckzugsalarm.wav.
- Migrate
ScbaViewModel.UpdateAlarm off Start()/Stop() onto Play(...), add the
pressure-check-due edge-trigger, and rework the affected ScbaViewModelTests
(IsSounding assertions -> spoken-cue assertions).
- Once the siren is gone, remove
Start()/Stop() and alarm.wav.
Split out from #70 (which covers the ILS reminder audio and lands the cross-platform
one-shot playback groundwork).
Add spoken audio cues for the Atemschutz side, reusing the cross-platform one-shot
IAlarmService.Play(AlarmSound)path introduced in #70:check) becomes due; once per control cycle, re-armed after a recorded pressure.
alarm.wavsiren and announce "Rückzugsalarm", re-announced on a cadence (~15 s) until
acknowledged (to preserve the siren's "insistent until handled" property).
Work:
AlarmSoundenum withPressureCheckDueandRetreatAlarm.voice-druckabfrage.wav,voice-rueckzugsalarm.wav.ScbaViewModel.UpdateAlarmoffStart()/Stop()ontoPlay(...), add thepressure-check-due edge-trigger, and rework the affected
ScbaViewModelTests(
IsSoundingassertions -> spoken-cue assertions).Start()/Stop()andalarm.wav.