Audio cues: per-cue default-sound picker, keyboard-click typing feedback, passkey on password fields
Cue sounds now ship as numbered variants ("connect 1.wav", "connect 2.wav", ...); the
count is never hard-coded so more can be added with no code change.
- CueSounds.cs: discovers a cue's "<base> <n>.wav" variants (case-insensitive) and
resolves the active default: per-profile custom WAV > machine-wide chosen variant >
first variant > silent. Wired into MainForm.TryLoadCueSound, the startup cue in
Program.cs, and PreferencesDialog.ResolveCueFilePath.
- AppConfig: DefaultCueSounds (machine-wide cueId -> chosen filename) and
EnableKeyboardClicks (on by default).
- Preferences: a "Choose default sound" listbox under the cue checklist - it lists the
selected cue's variants, arrowing it previews each sound and makes it that cue's
default. Plus a "Play keyboard clicks when typing into any edit field" checkbox.
- KeyClickService.cs: an app-wide WM_CHAR message filter + a low-latency NAudio mixer.
Typing into any edit field plays a random key click (key 1..N.wav); password fields
also play passkey.wav at the same instant. On/off live from the Preferences toggle.
Inert if the sounds are missing or the device won't open; never consumes the keystroke.
- csproj: ship every sounds\*.wav via a wildcard (variants, key clicks, passkey, future
additions) instead of stale per-file canonical names.
- Tests: resource checks (self-test + run-tests.ps1) now verify each cue has >=1 variant
and that key 1.wav / passkey.wav are present. Accessibility audit still green with the
new Preferences controls (Alt+D, Alt+K - no mnemonic clashes).
- Manual: variant picker, keyboard clicks, and the new sound-file naming documented.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
ad66fe5364
commit
e526014e6a
@@ -82,6 +82,20 @@ public sealed class AppConfig
|
||||
/// custom-cue paths) is loaded, so it can't live on <see cref="Profile"/>.</summary>
|
||||
public string? StartupCueCustomPath { get; set; }
|
||||
|
||||
/// <summary>The chosen default-sound FILENAME for each cue (e.g. "connect 2.wav"), keyed by
|
||||
/// the cue id (<c>MainForm.CueId</c>). The cue WAVs ship as numbered variants ("connect 1.wav",
|
||||
/// "connect 2.wav", ...); this records which one the user picked in Preferences. Machine-wide,
|
||||
/// so a user's preferred sound palette follows them across every profile. A cue absent from the
|
||||
/// dictionary uses the first available variant (the "1"s) by default. A per-profile custom WAV
|
||||
/// (<see cref="Profile.CustomCuePaths"/>) still overrides this choice.</summary>
|
||||
public Dictionary<string, string> DefaultCueSounds { get; set; } = new();
|
||||
|
||||
/// <summary>If true (the default), typing into any edit field anywhere in RemSound plays a soft
|
||||
/// keyboard-click sound (one of several, picked at random), so a screen-reader user gets audible
|
||||
/// typing feedback. Password fields additionally play a distinct key sound at the same time.
|
||||
/// Machine-wide; the user unticks "Play keyboard clicks" in Preferences to silence it.</summary>
|
||||
public bool EnableKeyboardClicks { get; set; } = true;
|
||||
|
||||
/// <summary>If true, RemSound writes a tab-separated diagnostic log to
|
||||
/// <c><exe>\logs\</c>. Lives here (not in <see cref="Profile"/>) because logging
|
||||
/// is a debugging affordance for the installation, not a user-facing audio preference —
|
||||
|
||||
Reference in New Issue
Block a user