Bump to v1.6.0: peer-address recovery, reconnect crash, long-run memory/CPU leak
Three reliability fixes. Wire format and audio pipeline unchanged from v1.4 / v1.5 — all interoperate. Peer address recovery: * When a tracked peer goes Unreachable (its resolved address — often a stale DNS / Pi-hole record, or a peer that rebooted onto a new IP) but the same peer is still heartbeat-pinging us from a different address, RemSound now adopts the live address instead of transmitting to a dead one. HeartbeatService records untracked ping sources; MainForm's TryAdoptLiveHeartbeatAddress (1 Hz) re-points the sender, heartbeat tracking and receiver allow-list. Conservative: fires only on the unambiguous one-unreachable-and-one-source case, private-range (RFC1918) addresses only so a relay can't hijack the sender, 10 s cooldown. Reconnect crash: * Fixed IndexOutOfRangeException in MainForm.SyncConnectedList. A churny peer-list rebuild (peer reboot) left SelectedIndex pointing past the rebuilt item array; the 1 Hz status timer read SelectedItem and crashed the app. New SafeSelectedItem bounds-checks the index; applied to all three timer-driven sync methods. The status tick is also wrapped in try/catch so a transient WinForms hiccup logs instead of crashing. Long-run memory / CPU leak: * A receiver left running for hours grew to gigabytes and climbing CPU. Decoder sessions orphaned by peer reconnects were not reaped — every reconnect mints a fresh (endpoint, streamId) key, and PruneIdleSessions silently skipped sessions whose PlayoutEngine lookup missed. Rewrote it to reap on each session's own LastWriteUtc (no cross-dictionary lookup), added a hard MaxLiveSessions cap as a backstop, and a "stream sessions live: N" diagnostic line. Bounds both memory and render-thread CPU. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
9ceff8bcc1
commit
918ca6cac0
@@ -20,6 +20,31 @@ internal sealed class AboutDialog : Form
|
||||
/// updates" path.</summary>
|
||||
private const string ReleaseNotes =
|
||||
"""
|
||||
RemSound v1.6
|
||||
|
||||
Three reliability fixes. No wire-format or audio-pipeline
|
||||
changes — v1.5 and v1.6 peers interoperate.
|
||||
|
||||
Bug fixes:
|
||||
* Peer address recovery. If the address you connected
|
||||
to goes unreachable — a peer rebooted onto a new IP,
|
||||
or a computer name resolved to a stale address —
|
||||
RemSound now follows the peer to the live address it
|
||||
is heartbeating from, instead of sending audio into
|
||||
the void. Recovers on its own within a few seconds.
|
||||
Limited to private-network addresses so a relay can
|
||||
never be mistaken for a moved peer.
|
||||
* Fixed a crash that could happen when a peer
|
||||
reconnected (e.g. after rebooting). The Connectivity
|
||||
peer list could be read mid-rebuild with a stale
|
||||
index and bring the app down from the status timer.
|
||||
* Fixed runaway memory and CPU on a long-running
|
||||
receiver. Decoder sessions orphaned by peer
|
||||
reconnects were not being reclaimed — over hours they
|
||||
piled up, each holding a multi-megabyte buffer and
|
||||
costing render-thread time every callback. They are
|
||||
now reaped once idle, with a hard cap as a backstop.
|
||||
|
||||
RemSound v1.5
|
||||
|
||||
Menu reorganisation, multi-peer audio-routing fix, recording
|
||||
|
||||
Reference in New Issue
Block a user