Peer rename + details box on Connectivity tab; Add band dialog fixes

Add band dialog (from testing feedback):
 * Tab order is now Start, End, Gain, OK, Cancel (OK was after Cancel).
 * Gain box takes decimals like 1.5 (half-dB steps); parametric list shows one decimal.
 * The two frequency boxes start empty — nothing prepopulated to mislead; both required on OK.

New Connectivity-tab feature (held for next release):
 * Rename peer (Alt+M) opens a dialog to give a peer a friendly name, with a Clear custom name
   button. Names are keyed by the peer's MACHINE NAME (stable across restarts, IP changes and
   networks), stored machine-wide in AppConfig.PeerFriendlyNames, and resolved everywhere a peer
   shows: both peer lists (via PeerListItem.DisplayNameProvider), the volume/pan/EQ list, the
   status line and split-recording filenames. Manual-by-IP peers with no announced name fall back
   to keying by address.
 * Peer details (Alt+E): a read-only box for the highlighted connected peer showing name, machine
   name, IP, connected-for, link health + ping, what they're sending, and whether they're
   receiving our audio. "Sending: 2 devices on ASIO at 48 kHz, Opus" is derived from the live
   receive streams — each stream is one device and its lane gives WASAPI vs ASIO — so NO protocol
   change and no new privacy exposure. AudioReceiver.ActiveFormatsFromAddress added for this.

Manual updated (readme.html + MANUAL.md). Build clean; --selftest passes; deployed to both test
folders. Held for next release.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ednunp
2026-07-07 23:56:42 +01:00
co-authored by Claude Opus 4.8
parent 033edd776f
commit f35f6c3c28
8 changed files with 402 additions and 52 deletions
+26
View File
@@ -864,6 +864,32 @@ public sealed class AudioReceiver : IDisposable
return null;
}
/// <summary>
/// The format of every currently-active (non-idle) receive session from the given peer IP — one
/// entry per stream, i.e. per capture device the peer is sending. Each carries its sample rate,
/// codec and lane (WASAPI vs ASIO), so the UI can say "sending N devices on ASIO at 48 kHz, Opus"
/// with no protocol change. Empty when nothing is arriving from that peer.
/// </summary>
public IReadOnlyList<AudioFormatInfo> ActiveFormatsFromAddress(IPAddress address)
{
var now = DateTime.UtcNow;
var fresh = new List<SessionPlayout>();
foreach (var sp in playoutEngine.ActiveSessions)
{
if (!sp.Endpoint.Address.Equals(address)) continue;
if (now - sp.LastWriteUtc > SessionIdleTimeout) continue;
fresh.Add(sp);
}
var formats = new List<AudioFormatInfo>();
lock (sessionsLock)
{
foreach (var sp in fresh)
if (sessions.TryGetValue((sp.Endpoint, sp.StreamId), out var session) && session.Format is not null)
formats.Add(session.Format);
}
return formats;
}
/// <summary>
/// The wire codec of the freshest currently-active receive session across all peers, or
/// null when nothing is being received. Surfaced in the SNAP log's Codec column so a