Bump to v2.1.0: UPnP, read-only profile lock, sleep/hibernate audio fix
Headline features: * Automatic router port opening (UPnP / NAT-PMP / PCP). Opt-in via Preferences; surfaces external address + carrier-grade NAT detection. * Lock profile (read-only). New File-menu tick that makes a profile load-only — session changes don't persist, no save prompt on close. Unblocks unattended shutdowns (NVDA gone, remote dropped, hibernate) where the existing save prompt could deadlock. * Check for updates on startup (default on) + brief countdown notice before silent updates install, so a launch-time update doesn't make the app silently vanish. * "Cue sounds" -> "Audio cue sounds" label clarification. Bug fixes: * No sound after the computer wakes from sleep. PowerResumeHandler rebuilds the audio backend automatically on resume; brief "Reconnecting to audio driver" splash during the rebuild. * Receiver audio silent after waking from hibernate. RefreshAudioDeviceLists now treats a transient ASIO probe failure (returns -1/-1 because the driver is mid-teardown / mid-reinit) as "retry next tick" instead of clearing the user's tick selection. Diagnostic-only changes (gated on the existing Enable-logs checkbox, zero cost when off): * AudioStepProbe split into cross-buffer vs within-buffer maxes so log inspection can tell a real-content sharp transient apart from a pipeline-boundary glitch. Plumbed through every probe owner. * New rxNetGapMs + gc0/gc1/gc2 delta columns in the diag log to split receive-side jitter into network-layer vs managed-runtime causes. Files touched: RELEASE_NOTES.md + readme.html + 24 source files across RemSound.Core / RemSound.Sender / RemSound.Receiver / RemSound.App. Three new app files: PowerResumeHandler, RouterPortMapper, UpdateInstallNoticeDialog. Wire format and audio pipeline unchanged from v1.5 onward — v1.5 through v2.1 peers interoperate.
This commit is contained in:
@@ -23,6 +23,19 @@ public sealed class Profile
|
||||
/// <summary>Display title and filename stem (sanitised). Required.</summary>
|
||||
public string Title { get; set; } = "";
|
||||
|
||||
/// <summary>If true, this profile is loaded for use but the app never writes the user's
|
||||
/// in-session changes back to disk: Ctrl+S / File → Save politely refuses (with a "use
|
||||
/// Save As instead" message), and FormClosing skips its usual "save changes?" prompt
|
||||
/// entirely. Whatever the user fiddled with this session is kept in memory until the
|
||||
/// app closes and then discarded; the file on disk stays exactly as it was. Off by
|
||||
/// default. Toggled per-profile via File → Lock profile (read-only). Use case: a
|
||||
/// "default" profile you want to live in and toggle send/receive on without the close
|
||||
/// prompt blocking shutdown — important for users who can't reach the prompt because
|
||||
/// they're remote, or because the screen reader has crashed, or because the laptop is
|
||||
/// hibernating. The flag is the *only* property the lock-toggle writes back to disk;
|
||||
/// any other in-session edits stay session-only. 2026-05-22.</summary>
|
||||
public bool ReadOnly { get; set; }
|
||||
|
||||
// === Main form: send / receive ===
|
||||
public bool ReceiveAudioOn { get; set; }
|
||||
public bool SendAudioOn { get; set; }
|
||||
|
||||
Reference in New Issue
Block a user