From e660b49241d8fcaa904a8d44bbb97a321a81f606 Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Wed, 6 May 2026 23:11:16 +0700 Subject: [PATCH] fix(recording): compact silent mic discontinuities --- .../bin/win32-x64/helpers-manifest.json | 6 ++--- electron/native/bin/win32-x64/wgc-capture.exe | Bin 105472 -> 105984 bytes electron/native/wgc-capture/src/main.cpp | 12 +++++++-- .../wgc-capture/src/wasapi_loopback.cpp | 25 +++++++++++++++++- .../native/wgc-capture/src/wasapi_loopback.h | 4 +++ 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/electron/native/bin/win32-x64/helpers-manifest.json b/electron/native/bin/win32-x64/helpers-manifest.json index 047625ee..53baaf7a 100644 --- a/electron/native/bin/win32-x64/helpers-manifest.json +++ b/electron/native/bin/win32-x64/helpers-manifest.json @@ -5,10 +5,10 @@ "helpers": { "wgc-capture": { "binaryName": "wgc-capture.exe", - "binarySha256": "a0e2f0b98a903f89ab4706a56623f141604c3a311102e8914c2780745e94c635", + "binarySha256": "88226bd499c820081a27264b40f37875d0949d9f921920738e05b7eaeb1a9e7d", "sourceDir": "electron/native/wgc-capture", - "sourceFingerprint": "820d13741c659a0357d4d7944f3dbf4ce778b9716725b47ec088f573db0e7311", - "updatedAt": "2026-05-06T13:15:19.804Z" + "sourceFingerprint": "7190e148ede1fb1c573cc1866405d6345b0c35378a7e32499580bffacf1cc6d2", + "updatedAt": "2026-05-06T16:09:49.253Z" }, "cursor-monitor": { "binaryName": "cursor-monitor.exe", diff --git a/electron/native/bin/win32-x64/wgc-capture.exe b/electron/native/bin/win32-x64/wgc-capture.exe index c99ebf226dcc515173209bebab54587b81fa1cf3..e55df5063462f4c641ad974cb86fe8c8555882e4 100644 GIT binary patch delta 35634 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

7ERlI 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 TrarSGD8EG54< delta 35003 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 Kcy-BKV*UffntD6{ diff --git a/electron/native/wgc-capture/src/main.cpp b/electron/native/wgc-capture/src/main.cpp index 65c2ec33..2c433b3b 100644 --- a/electron/native/wgc-capture/src/main.cpp +++ b/electron/native/wgc-capture/src/main.cpp @@ -231,6 +231,8 @@ static void writeCompanionAudioTimingMetadata( metadataFile << ",\"insertedSilenceFrames\":" << capture.insertedSilenceFrames(); metadataFile << ",\"compactedDiscontinuityCount\":" << capture.compactedDiscontinuityCount(); metadataFile << ",\"compactedDiscontinuityFrames\":" << capture.compactedDiscontinuityFrames(); + metadataFile << ",\"compactedSilentDiscontinuityCount\":" << capture.compactedSilentDiscontinuityCount(); + metadataFile << ",\"compactedSilentDiscontinuityFrames\":" << capture.compactedSilentDiscontinuityFrames(); const uint32_t discontinuityCount = capture.dataDiscontinuityCount(); if (discontinuityCount > 0) { metadataFile << ",\"dataDiscontinuityCount\":" << discontinuityCount; @@ -448,7 +450,8 @@ int main(int argc, char* argv[]) { loopback.dataDiscontinuityCount() > 0 || loopback.timestampErrorCount() > 0 || loopback.gapFillCount() > 0 || - loopback.compactedDiscontinuityCount() > 0 + loopback.compactedDiscontinuityCount() > 0 || + loopback.compactedSilentDiscontinuityCount() > 0 ) { std::cerr << "WARNING: System audio timing metadata includes discontinuities=" << loopback.dataDiscontinuityCount() @@ -457,6 +460,8 @@ int main(int argc, char* argv[]) { << " insertedSilenceFrames=" << loopback.insertedSilenceFrames() << " compactedDiscontinuities=" << loopback.compactedDiscontinuityCount() << " compactedDiscontinuityFrames=" << loopback.compactedDiscontinuityFrames() + << " compactedSilentDiscontinuities=" << loopback.compactedSilentDiscontinuityCount() + << " compactedSilentDiscontinuityFrames=" << loopback.compactedSilentDiscontinuityFrames() << std::endl; } std::cout << "Audio path: " << config.audioOutputPath << std::endl; @@ -466,7 +471,8 @@ int main(int argc, char* argv[]) { micCapture.dataDiscontinuityCount() > 0 || micCapture.timestampErrorCount() > 0 || micCapture.gapFillCount() > 0 || - micCapture.compactedDiscontinuityCount() > 0 + micCapture.compactedDiscontinuityCount() > 0 || + micCapture.compactedSilentDiscontinuityCount() > 0 ) { std::cerr << "WARNING: Microphone timing metadata includes discontinuities=" << micCapture.dataDiscontinuityCount() @@ -475,6 +481,8 @@ int main(int argc, char* argv[]) { << " insertedSilenceFrames=" << micCapture.insertedSilenceFrames() << " compactedDiscontinuities=" << micCapture.compactedDiscontinuityCount() << " compactedDiscontinuityFrames=" << micCapture.compactedDiscontinuityFrames() + << " compactedSilentDiscontinuities=" << micCapture.compactedSilentDiscontinuityCount() + << " compactedSilentDiscontinuityFrames=" << micCapture.compactedSilentDiscontinuityFrames() << std::endl; } std::cout << "Mic path: " << config.micOutputPath << std::endl; diff --git a/electron/native/wgc-capture/src/wasapi_loopback.cpp b/electron/native/wgc-capture/src/wasapi_loopback.cpp index 80fa4dcc..2a8a5d17 100644 --- a/electron/native/wgc-capture/src/wasapi_loopback.cpp +++ b/electron/native/wgc-capture/src/wasapi_loopback.cpp @@ -14,6 +14,7 @@ constexpr uint32_t kMinimumGapFillThresholdMs = 50; // Wireless headsets can flag short WASAPI discontinuities that are less audible // when compacted and later duration-corrected than when rendered as hard silence. constexpr uint32_t kDiscontinuityGapFillThresholdMs = 140; +constexpr uint32_t kSilentDiscontinuityCompactThresholdMs = 40; constexpr uint32_t kBoundaryFadeInMs = 5; int64_t queryPerformanceCounterHns() { @@ -197,6 +198,8 @@ bool WasapiCapture::start() { insertedSilenceFrames_ = 0; compactedDiscontinuityCount_ = 0; compactedDiscontinuityFrames_ = 0; + compactedSilentDiscontinuityCount_ = 0; + compactedSilentDiscontinuityFrames_ = 0; fadeInFramesRemaining_ = 0; writeWavHeader(outputFile_, 0); @@ -478,8 +481,28 @@ void WasapiCapture::captureThread() { } UINT32 totalSamples = numFrames * channels; + const bool isSilentPacket = (flags & AUDCLNT_BUFFERFLAGS_SILENT) != 0; + const uint32_t silentCompactThresholdFrames = + (mixFormat_->nSamplesPerSec * kSilentDiscontinuityCompactThresholdMs) / 1000; + if ( + hasDataDiscontinuity && + isSilentPacket && + framesWritten_.load() > 0 && + numFrames > 0 && + numFrames <= (silentCompactThresholdFrames > 0 ? silentCompactThresholdFrames : 1) + ) { + compactedSilentDiscontinuityCount_.fetch_add(1); + compactedSilentDiscontinuityFrames_.fetch_add(numFrames); + captureClient_->ReleaseBuffer(numFrames); + hr = captureClient_->GetNextPacketSize(&packetLength); + if (FAILED(hr)) { + std::cerr << "WASAPI: GetNextPacketSize failed hr=0x" << std::hex << hr << std::dec << std::endl; + break; + } + continue; + } - if (flags & AUDCLNT_BUFFERFLAGS_SILENT) { + if (isSilentPacket) { pcmBuffer.assign(totalSamples, 0); } else if (isFloat && bitsPerSample == 32 && sourceBytesPerSample >= 4) { pcmBuffer.resize(totalSamples); diff --git a/electron/native/wgc-capture/src/wasapi_loopback.h b/electron/native/wgc-capture/src/wasapi_loopback.h index 01b6a01f..bf88cb16 100644 --- a/electron/native/wgc-capture/src/wasapi_loopback.h +++ b/electron/native/wgc-capture/src/wasapi_loopback.h @@ -30,6 +30,8 @@ public: uint64_t insertedSilenceFrames() const { return insertedSilenceFrames_.load(); } uint32_t compactedDiscontinuityCount() const { return compactedDiscontinuityCount_.load(); } uint64_t compactedDiscontinuityFrames() const { return compactedDiscontinuityFrames_.load(); } + uint32_t compactedSilentDiscontinuityCount() const { return compactedSilentDiscontinuityCount_.load(); } + uint64_t compactedSilentDiscontinuityFrames() const { return compactedSilentDiscontinuityFrames_.load(); } private: bool initializeCommon(); @@ -65,5 +67,7 @@ private: std::atomic insertedSilenceFrames_{0}; std::atomic compactedDiscontinuityCount_{0}; std::atomic compactedDiscontinuityFrames_{0}; + std::atomic compactedSilentDiscontinuityCount_{0}; + std::atomic compactedSilentDiscontinuityFrames_{0}; std::atomic fadeInFramesRemaining_{0}; };