v3.9.1: plain/WASAPI streams now play on an ASIO-mode receiver (silent-mic fix)

Receiver: a Mixed (plain) session is rendered on an active lane in BothIndependent mode instead of being skipped, so a WASAPI-only sender is no longer silent to a receiver that has an ASIO driver selected. Also port the per-session buffer depth-drain (stops the receive jitter buffer bloating).

Sender: add sndAudFr meter (audio frames actually sent) to localise capture vs send.

App: startup sound cue (machine-wide, Preferences); stop sending audio when no peer is reachable (issue #8). Version 3.9.1.

Server (relay): fix updater version-compare for multi-dot tags, guard the main loop against crashes, reject spoofed BYE from a mismatched endpoint.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ednunp
2026-06-12 19:00:33 +01:00
co-authored by Claude Opus 4.8
parent 04b17ff1ab
commit 84c4a47411
15 changed files with 360 additions and 148 deletions
+9
View File
@@ -188,6 +188,15 @@ public sealed class AudioSender : IDisposable
return a > b ? a : b;
}
/// <summary>Total audio frames both lanes actually handed to the wire since the last call
/// (resets on read). Pairs with <see cref="TakeMaxSenderPreEncodePeak"/> on the diag line:
/// capPeak proves real signal reached the encoder; this proves frames left the socket. A
/// high capPeak with zero frames sent localises a silence to the encode/encrypt stage — the
/// missing measurement behind the "mic only works in ASIO" report. In WasapiOnly mode only
/// defaultLane fires, so this number IS the WASAPI mic lane's output.</summary>
public long TakeSenderAudioFramesSent() =>
defaultLane.TakeAudioFramesSent() + asioLane.TakeAudioFramesSent();
// Cross-buffer (boundary) and within-buffer (content) split — see AudioStepProbe for the
// diagnostic distinction. Used by the per-second diag logger to emit two extra columns so
// an offline log inspection can tell a real audio transient apart from a buffer-boundary