From 63a8a5bf433f9ad40705c394f8e170a02d51f78e Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Wed, 6 May 2026 20:16:32 +0700 Subject: [PATCH] fix(recording): compact short mic discontinuities --- .../bin/win32-x64/helpers-manifest.json | 6 +++--- electron/native/bin/win32-x64/wgc-capture.exe | Bin 104448 -> 105472 bytes electron/native/wgc-capture/src/main.cpp | 12 ++++++++++-- .../wgc-capture/src/wasapi_loopback.cpp | 16 +++++++++++++--- .../native/wgc-capture/src/wasapi_loopback.h | 4 ++++ 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/electron/native/bin/win32-x64/helpers-manifest.json b/electron/native/bin/win32-x64/helpers-manifest.json index dcc4ca13..3061bf01 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": "b016da7435ba68b9c235e85818b5f4e8c1647f2386b4f2205e9a690cd057f908", + "binarySha256": "a0e2f0b98a903f89ab4706a56623f141604c3a311102e8914c2780745e94c635", "sourceDir": "electron/native/wgc-capture", - "sourceFingerprint": "7ef55b0d4bb9674de2b263e9dad2de2a593d0cb6aa09aea9ab3dc1832010a9d0", - "updatedAt": "2026-05-06T11:48:48.808Z" + "sourceFingerprint": "820d13741c659a0357d4d7944f3dbf4ce778b9716725b47ec088f573db0e7311", + "updatedAt": "2026-05-06T13:15:19.804Z" }, "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 54477a6ca0cdb7804643082f3b3c0f1b9d352ecb..c99ebf226dcc515173209bebab54587b81fa1cf3 100644 GIT binary patch delta 33871 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 pj-nl 0) { metadataFile << ",\"dataDiscontinuityCount\":" << discontinuityCount; @@ -445,13 +447,16 @@ int main(int argc, char* argv[]) { if ( loopback.dataDiscontinuityCount() > 0 || loopback.timestampErrorCount() > 0 || - loopback.gapFillCount() > 0 + loopback.gapFillCount() > 0 || + loopback.compactedDiscontinuityCount() > 0 ) { std::cerr << "WARNING: System audio timing metadata includes discontinuities=" << loopback.dataDiscontinuityCount() << " timestampErrors=" << loopback.timestampErrorCount() << " gapFills=" << loopback.gapFillCount() << " insertedSilenceFrames=" << loopback.insertedSilenceFrames() + << " compactedDiscontinuities=" << loopback.compactedDiscontinuityCount() + << " compactedDiscontinuityFrames=" << loopback.compactedDiscontinuityFrames() << std::endl; } std::cout << "Audio path: " << config.audioOutputPath << std::endl; @@ -460,13 +465,16 @@ int main(int argc, char* argv[]) { if ( micCapture.dataDiscontinuityCount() > 0 || micCapture.timestampErrorCount() > 0 || - micCapture.gapFillCount() > 0 + micCapture.gapFillCount() > 0 || + micCapture.compactedDiscontinuityCount() > 0 ) { std::cerr << "WARNING: Microphone timing metadata includes discontinuities=" << micCapture.dataDiscontinuityCount() << " timestampErrors=" << micCapture.timestampErrorCount() << " gapFills=" << micCapture.gapFillCount() << " insertedSilenceFrames=" << micCapture.insertedSilenceFrames() + << " compactedDiscontinuities=" << micCapture.compactedDiscontinuityCount() + << " compactedDiscontinuityFrames=" << micCapture.compactedDiscontinuityFrames() << 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 f7565ec7..80fa4dcc 100644 --- a/electron/native/wgc-capture/src/wasapi_loopback.cpp +++ b/electron/native/wgc-capture/src/wasapi_loopback.cpp @@ -11,7 +11,9 @@ namespace { constexpr int64_t kHundredNanosecondsPerSecond = 10000000; constexpr uint64_t kSilenceWriteChunkFrames = 4096; constexpr uint32_t kMinimumGapFillThresholdMs = 50; -constexpr uint32_t kDiscontinuityGapFillThresholdMs = 10; +// 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 kBoundaryFadeInMs = 5; int64_t queryPerformanceCounterHns() { @@ -193,6 +195,8 @@ bool WasapiCapture::start() { timestampErrorCount_ = 0; gapFillCount_ = 0; insertedSilenceFrames_ = 0; + compactedDiscontinuityCount_ = 0; + compactedDiscontinuityFrames_ = 0; fadeInFramesRemaining_ = 0; writeWavHeader(outputFile_, 0); @@ -461,8 +465,14 @@ void WasapiCapture::captureThread() { const uint64_t gapThresholdFrames = gapThresholdFrameCount > 0 ? gapThresholdFrameCount : 1; - if (expectedStartFrame > writtenFrames + gapThresholdFrames) { - writeSilenceFrames(expectedStartFrame - writtenFrames, channels); + if (expectedStartFrame > writtenFrames) { + const uint64_t missingFrames = expectedStartFrame - writtenFrames; + if (missingFrames > gapThresholdFrames) { + writeSilenceFrames(missingFrames, channels); + } else if (hasDataDiscontinuity) { + compactedDiscontinuityCount_.fetch_add(1); + compactedDiscontinuityFrames_.fetch_add(missingFrames); + } } } } diff --git a/electron/native/wgc-capture/src/wasapi_loopback.h b/electron/native/wgc-capture/src/wasapi_loopback.h index 1a513446..01b6a01f 100644 --- a/electron/native/wgc-capture/src/wasapi_loopback.h +++ b/electron/native/wgc-capture/src/wasapi_loopback.h @@ -28,6 +28,8 @@ public: uint32_t timestampErrorCount() const { return timestampErrorCount_.load(); } uint32_t gapFillCount() const { return gapFillCount_.load(); } uint64_t insertedSilenceFrames() const { return insertedSilenceFrames_.load(); } + uint32_t compactedDiscontinuityCount() const { return compactedDiscontinuityCount_.load(); } + uint64_t compactedDiscontinuityFrames() const { return compactedDiscontinuityFrames_.load(); } private: bool initializeCommon(); @@ -61,5 +63,7 @@ private: std::atomic timestampErrorCount_{0}; std::atomic gapFillCount_{0}; std::atomic insertedSilenceFrames_{0}; + std::atomic compactedDiscontinuityCount_{0}; + std::atomic compactedDiscontinuityFrames_{0}; std::atomic fadeInFramesRemaining_{0}; };