mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-24 01:04:02 +02:00
WASAPI: Correctly handle AUDCLNT_BUFFERFLAGS_SILENT.
This commit is contained in:
+42
-8
@@ -5715,10 +5715,17 @@ ma_uint32 ma_device__pcm_converter__on_read_from_buffer_capture(ma_pcm_converter
|
|||||||
}
|
}
|
||||||
|
|
||||||
bytesToRead = framesToRead * ma_get_bytes_per_frame(pConverter->formatConverterIn.config.formatIn, pConverter->channelRouter.config.channelsIn);
|
bytesToRead = framesToRead * ma_get_bytes_per_frame(pConverter->formatConverterIn.config.formatIn, pConverter->channelRouter.config.channelsIn);
|
||||||
ma_copy_memory(pFramesOut, pDevice->capture._dspFrames, bytesToRead);
|
|
||||||
pDevice->capture._dspFrameCount -= framesToRead;
|
|
||||||
pDevice->capture._dspFrames += bytesToRead;
|
|
||||||
|
|
||||||
|
/* pDevice->capture._dspFrames can be null in which case it should be treated as silence. */
|
||||||
|
if (pDevice->capture._dspFrames != NULL) {
|
||||||
|
ma_copy_memory(pFramesOut, pDevice->capture._dspFrames, bytesToRead);
|
||||||
|
pDevice->capture._dspFrames += bytesToRead;
|
||||||
|
} else {
|
||||||
|
ma_zero_memory(pFramesOut, bytesToRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
pDevice->capture._dspFrameCount -= framesToRead;
|
||||||
|
|
||||||
return framesToRead;
|
return framesToRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5740,10 +5747,17 @@ ma_uint32 ma_device__pcm_converter__on_read_from_buffer_playback(ma_pcm_converte
|
|||||||
}
|
}
|
||||||
|
|
||||||
bytesToRead = framesToRead * ma_get_bytes_per_frame(pConverter->formatConverterIn.config.formatIn, pConverter->channelRouter.config.channelsIn);
|
bytesToRead = framesToRead * ma_get_bytes_per_frame(pConverter->formatConverterIn.config.formatIn, pConverter->channelRouter.config.channelsIn);
|
||||||
ma_copy_memory(pFramesOut, pDevice->playback._dspFrames, bytesToRead);
|
|
||||||
pDevice->playback._dspFrameCount -= framesToRead;
|
|
||||||
pDevice->playback._dspFrames += bytesToRead;
|
|
||||||
|
|
||||||
|
/* pDevice->playback._dspFrames can be null in which case it should be treated as silence. */
|
||||||
|
if (pDevice->playback._dspFrames != NULL) {
|
||||||
|
ma_copy_memory(pFramesOut, pDevice->playback._dspFrames, bytesToRead);
|
||||||
|
pDevice->playback._dspFrames += bytesToRead;
|
||||||
|
} else {
|
||||||
|
ma_zero_memory(pFramesOut, bytesToRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
pDevice->playback._dspFrameCount -= framesToRead;
|
||||||
|
|
||||||
return framesToRead;
|
return framesToRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6918,6 +6932,8 @@ WASAPI Backend
|
|||||||
#endif /* 0 */
|
#endif /* 0 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Some compilers don't define VerifyVersionInfoW. Need to write this ourselves. */
|
/* Some compilers don't define VerifyVersionInfoW. Need to write this ourselves. */
|
||||||
#define MA_WIN32_WINNT_VISTA 0x0600
|
#define MA_WIN32_WINNT_VISTA 0x0600
|
||||||
#define MA_VER_MINORVERSION 0x01
|
#define MA_VER_MINORVERSION 0x01
|
||||||
@@ -7027,6 +7043,11 @@ typedef ma_int64 MA_REFERENCE_TIME;
|
|||||||
#define MA_AUDCLNT_S_BUFFER_EMPTY (143196161)
|
#define MA_AUDCLNT_S_BUFFER_EMPTY (143196161)
|
||||||
#define MA_AUDCLNT_E_DEVICE_IN_USE (-2004287478)
|
#define MA_AUDCLNT_E_DEVICE_IN_USE (-2004287478)
|
||||||
|
|
||||||
|
/* Buffer flags. */
|
||||||
|
#define MA_AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY 1
|
||||||
|
#define MA_AUDCLNT_BUFFERFLAGS_SILENT 2
|
||||||
|
#define MA_AUDCLNT_BUFFERFLAGS_TIMESTAMP_ERROR 4
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
ma_eRender = 0,
|
ma_eRender = 0,
|
||||||
@@ -9137,17 +9158,30 @@ ma_result ma_device_main_loop__wasapi(ma_device* pDevice)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: How do we handle the capture flags returned by GetBuffer()? In particular, AUDCLNT_BUFFERFLAGS_SILENT (1). */
|
/*
|
||||||
|
Debug output for IAudioCaptureClient_GetBuffer(). The flagsCapture variable will contain information. A glitch will occur when
|
||||||
|
AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY (1) is set.
|
||||||
|
*/
|
||||||
#ifdef MA_DEBUG_OUTPUT
|
#ifdef MA_DEBUG_OUTPUT
|
||||||
if (flagsCapture != 0) {
|
if (flagsCapture != 0) {
|
||||||
printf("[WASAPI] Capture Flags: %d\n", flagsCapture);
|
printf("[WASAPI] Capture Flags: %d\n", flagsCapture);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if ((flagsCapture & MA_AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY) == 0) {
|
||||||
|
/* Glitched. Probably due to an overrun. */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
mappedBufferFramesRemainingCapture = mappedBufferSizeInFramesCapture;
|
mappedBufferFramesRemainingCapture = mappedBufferSizeInFramesCapture;
|
||||||
|
|
||||||
pDevice->capture._dspFrameCount = mappedBufferSizeInFramesCapture;
|
pDevice->capture._dspFrameCount = mappedBufferSizeInFramesCapture;
|
||||||
pDevice->capture._dspFrames = (const ma_uint8*)pMappedBufferCapture;
|
|
||||||
|
if ((flagsCapture & MA_AUDCLNT_BUFFERFLAGS_SILENT) == 0) {
|
||||||
|
pDevice->capture._dspFrames = (const ma_uint8*)pMappedBufferCapture;
|
||||||
|
} else {
|
||||||
|
pDevice->capture._dspFrames = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user