From 1b957471d5ea1520d05cd88a05e567db1261b4f2 Mon Sep 17 00:00:00 2001 From: David Reid Date: Tue, 26 Feb 2019 19:54:07 +1000 Subject: [PATCH] WASAPI: Fix errors with exclusive mode. --- mini_al.h | 14 ++++++++++---- tests/mal_duplex.c | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/mini_al.h b/mini_al.h index 1000743c..d9ca8bee 100644 --- a/mini_al.h +++ b/mini_al.h @@ -7855,8 +7855,11 @@ mal_result mal_device_write__wasapi(mal_device* pDevice, const void* pPCMFrames, //printf("TRACE 1: capacity playback: %d, %d\n", pDevice->wasapi.deviceBufferFramesCapacityPlayback, pDevice->wasapi.periodSizeInFramesPlayback); - if (pDevice->wasapi.deviceBufferFramesCapacityPlayback > pDevice->wasapi.periodSizeInFramesPlayback) { - pDevice->wasapi.deviceBufferFramesCapacityPlayback = pDevice->wasapi.periodSizeInFramesPlayback; + /* In exclusive mode, the frame count needs to exactly match the value returned by GetCurrentPadding(). */ + if (pDevice->playback.shareMode != mal_share_mode_exclusive) { + if (pDevice->wasapi.deviceBufferFramesCapacityPlayback > pDevice->wasapi.periodSizeInFramesPlayback) { + pDevice->wasapi.deviceBufferFramesCapacityPlayback = pDevice->wasapi.periodSizeInFramesPlayback; + } } hr = mal_IAudioRenderClient_GetBuffer((mal_IAudioRenderClient*)pDevice->wasapi.pRenderClient, pDevice->wasapi.deviceBufferFramesCapacityPlayback, (BYTE**)&pDevice->wasapi.pDeviceBufferPlayback); @@ -7978,8 +7981,11 @@ mal_result mal_device_read__wasapi(mal_device* pDevice, void* pPCMFrames, mal_ui //printf("TRACE 1: capacity capture: %d, %d\n", pDevice->wasapi.deviceBufferFramesCapacityCapture, pDevice->wasapi.periodSizeInFramesCapture); - if (pDevice->wasapi.deviceBufferFramesCapacityCapture > pDevice->wasapi.periodSizeInFramesCapture) { - pDevice->wasapi.deviceBufferFramesCapacityCapture = pDevice->wasapi.periodSizeInFramesCapture; + /* In exclusive mode, the frame count needs to exactly match the value returned by GetCurrentPadding(). */ + if (pDevice->playback.shareMode != mal_share_mode_exclusive) { + if (pDevice->wasapi.deviceBufferFramesCapacityCapture > pDevice->wasapi.periodSizeInFramesCapture) { + pDevice->wasapi.deviceBufferFramesCapacityCapture = pDevice->wasapi.periodSizeInFramesCapture; + } } hr = mal_IAudioCaptureClient_GetBuffer((mal_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, (BYTE**)&pDevice->wasapi.pDeviceBufferCapture, &pDevice->wasapi.deviceBufferFramesCapacityCapture, &flags, NULL, NULL); diff --git a/tests/mal_duplex.c b/tests/mal_duplex.c index b48364b7..3127b00b 100644 --- a/tests/mal_duplex.c +++ b/tests/mal_duplex.c @@ -79,6 +79,7 @@ int main(int argc, char** argv) deviceConfig.playback.pDeviceID = NULL; deviceConfig.playback.format = mal_format_s16; deviceConfig.playback.channels = 2; + deviceConfig.playback.shareMode = mal_share_mode_shared; deviceConfig.sampleRate = 44100; deviceConfig.bufferSizeInMilliseconds = 100; deviceConfig.periods = 2;