From c2ec1fb49edb131d9fa61fd9972d0d277fde27b3 Mon Sep 17 00:00:00 2001 From: derrod Date: Fri, 6 Oct 2023 19:44:47 +0200 Subject: [PATCH] win-wasapi: Handle flags set by GetBuffer --- plugins/win-wasapi/win-wasapi.cpp | 34 +++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/plugins/win-wasapi/win-wasapi.cpp b/plugins/win-wasapi/win-wasapi.cpp index 0dd6b063a..dd40f51f6 100644 --- a/plugins/win-wasapi/win-wasapi.cpp +++ b/plugins/win-wasapi/win-wasapi.cpp @@ -249,6 +249,8 @@ class WASAPISource { audio_format format; uint32_t sampleRate; + vector silence; + static DWORD WINAPI ReconnectThread(LPVOID param); static DWORD WINAPI CaptureThread(LPVOID param); @@ -1136,9 +1138,37 @@ bool WASAPISource::ProcessCaptureData() return false; } + if (flags & AUDCLNT_BUFFERFLAGS_TIMESTAMP_ERROR) { + blog(LOG_ERROR, "[WASAPISource::ProcessCaptureData]" + " Timestamp error!"); + capture->ReleaseBuffer(frames); + return false; + } + + if (flags & AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY) { + /* libobs should handle discontinuities fine. */ + blog(LOG_DEBUG, "[WASAPISource::ProcessCaptureData]" + " Discontinuity flag is set."); + } + + if (flags & AUDCLNT_BUFFERFLAGS_SILENT) { + blog(LOG_DEBUG, "[WASAPISource::ProcessCaptureData]" + " Silent flag is set."); + + /* buffer size = frame size * number of frames + * frame size = channels * sample size + * sample size = 4 bytes (always float per InitFormat) */ + uint32_t requiredBufSize = + get_audio_channels(speakers) * frames * 4; + if (silence.size() < requiredBufSize) + silence.resize(requiredBufSize); + + buffer = silence.data(); + } + obs_source_audio data = {}; - data.data[0] = (const uint8_t *)buffer; - data.frames = (uint32_t)frames; + data.data[0] = buffer; + data.frames = frames; data.speakers = speakers; data.samples_per_sec = sampleRate; data.format = format;