Reset-ASIO button + checkbox tick/untick sounds (parts 1-2 of the cue/preferences overhaul)
Part 1 - "Uncheck all inputs and outputs" button now also resets the ASIO driver to "(none)": renamed to say so, and UncheckAllDevices sets asioDriverBox to row 0 for a full clean WASAPI-only, nothing-selected state. Part 2 - checkbox tick/untick sounds: every checkbox toggle anywhere in RemSound now plays a short cue (check.wav on tick, uncheck.wav on untick) - instant feedback on which way a box went, especially in the inputs/outputs lists. New CheckSoundService + two machine-wide cues (CheckboxOn/Off) with the usual numbered-variant + Preferences treatment. Hooked from AccessibleCheckBox.OnCheckedChanged and the device lists' WireCheckedListAccessibility, both gated on the control being Focused so a genuine user toggle clicks but bulk programmatic (un)checking (profile load, "uncheck all") stays silent. Reloaded at startup and on cue change. Tests + manual updated; .sfk byproducts cleared. Remaining for the overhaul (next): tabbed Preferences (General / Audio cues / Startup behaviour / Update settings), the cue-list redesign with a "none" option replacing per-cue checkboxes, moving Startup behaviour out of the Options menu, and a front-most "missing sound file" error. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
8763470037
commit
aed555cc2e
@@ -0,0 +1,47 @@
|
||||
using RemSound.Core;
|
||||
|
||||
namespace RemSound.App;
|
||||
|
||||
/// <summary>
|
||||
/// Plays a short tick / untick sound whenever the user checks or unchecks a checkbox anywhere in
|
||||
/// RemSound - instant audible feedback of which way a box just went, which matters most in the busy
|
||||
/// inputs/outputs lists. Two normal machine-wide cues: CheckboxOn (check.wav) and CheckboxOff
|
||||
/// (uncheck.wav), each with numbered variants + an off option in Preferences, like any other cue.
|
||||
///
|
||||
/// Wired from <see cref="AccessibleCheckBox"/> and the device <c>LiveCheckedListBox</c>, both gated
|
||||
/// on the control being focused - so a genuine user toggle clicks, but the bulk programmatic
|
||||
/// checking done on profile load or by "uncheck all" stays silent.
|
||||
/// </summary>
|
||||
internal static class CheckSoundService
|
||||
{
|
||||
private static CuePlayer? checkSound;
|
||||
private static CuePlayer? uncheckSound;
|
||||
|
||||
/// <summary>(Re)load the tick/untick sounds from the current cue configuration. Call at startup
|
||||
/// and whenever cue settings change.</summary>
|
||||
public static void Reload()
|
||||
{
|
||||
var cfg = AppConfig.Load();
|
||||
checkSound = LoadCue(MainForm.CueId.CheckboxOn, "check.wav", cfg);
|
||||
uncheckSound = LoadCue(MainForm.CueId.CheckboxOff, "uncheck.wav", cfg);
|
||||
}
|
||||
|
||||
public static void Play(bool isChecked)
|
||||
{
|
||||
var cfg = AppConfig.Load();
|
||||
if (isChecked) { if (cfg.EnableCheckboxOnCue) checkSound?.Play(); }
|
||||
else { if (cfg.EnableCheckboxOffCue) uncheckSound?.Play(); }
|
||||
}
|
||||
|
||||
private static CuePlayer? LoadCue(string cueId, string defaultFile, AppConfig cfg)
|
||||
{
|
||||
try
|
||||
{
|
||||
string? path = cfg.MachineCueCustomPaths.TryGetValue(cueId, out var custom) && File.Exists(custom)
|
||||
? custom
|
||||
: CueSounds.ResolveDefaultPath(cueId, defaultFile, cfg);
|
||||
return path is not null && File.Exists(path) ? new CuePlayer(path) : null;
|
||||
}
|
||||
catch { return null; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user