Service: fix divergences from the main app's send path
Local checkpoint - NOT for public release. Audited ServiceSendHost against MainForm's send path (Ed: make the service reuse the same code, be just as stable). Three real divergences found and fixed: 1. ENCRYPTION FINGERPRINT (critical): the host set sender.AudioKey but NOT sender.AudioFingerprint. The main app (RecomputeAudioCrypto) sets both, and the peer verifies the fingerprint before accepting a stream - so the service's encrypted audio would have been REJECTED at the far end. Now derives and sets both from the password. 2. OPUS FRAME: the main app applies EffectiveOpusFrameSamples (the "Small" send rate halves the Opus frame); the host passed the raw frame, so it would encode differently than the main app for the same profile. Now reuses MainForm.EffectiveOpusFrameSamples (made internal - same code, not a copy). 3. PEER PORT: send target fell back to the profile's LOCAL AudioPort; the correct default is RemPacket.DefaultPeerDialPort (what the main app's manual-peer path uses). Same value today but the right constant. Reviewed and OK: sender defaults to WasapiOnly (no SetAudioMode needed); BuildSendSpecs matches ApplySendSources for explicit-device profiles; default-device changes are covered by the device-change watcher; direct-send (no relay/StartReceiving) is the intended v1 scope. New self-test "Service sender parity" asserts key + fingerprint + effective Opus frame match the main app. Gate 26/26. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
4fb490b2d5
commit
78a9aa6572
@@ -9211,7 +9211,8 @@ public sealed class MainForm : Form
|
||||
/// Standard returns the codec's natural frame; Tight halves it (Opus 960 → 480 → 240 → 120
|
||||
/// floored). Floor is 120 samples = 2.5 ms = standard libopus's RESTRICTED_LOWDELAY minimum.
|
||||
/// </summary>
|
||||
private static int EffectiveOpusFrameSamples(AudioTransportCodec codec, int opusFrameSamples, SendRate rate)
|
||||
// internal so the send-only service host reuses the exact same frame-size rule as the main app.
|
||||
internal static int EffectiveOpusFrameSamples(AudioTransportCodec codec, int opusFrameSamples, SendRate rate)
|
||||
{
|
||||
if (codec != AudioTransportCodec.Opus) return opusFrameSamples;
|
||||
return rate == SendRate.Tight ? Math.Max(120, opusFrameSamples / 2) : opusFrameSamples;
|
||||
|
||||
Reference in New Issue
Block a user