Commit d8dea289 authored by David Reid's avatar David Reid

Fix compilation with Digital Mars.

This also fixes a bug in the WASAPI backend. Thanks to Digital Mars for
picking that one up!
parent 827129f0
...@@ -6669,12 +6669,17 @@ static MA_INLINE void ma_yield() ...@@ -6669,12 +6669,17 @@ static MA_INLINE void ma_yield()
{ {
#if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) #if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
/* x86/x64 */ /* x86/x64 */
#if (defined(_MSC_VER) || defined(__WATCOMC__)) && !defined(__clang__) #if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__)) && !defined(__clang__)
#if _MSC_VER >= 1400 #if _MSC_VER >= 1400
_mm_pause(); _mm_pause();
#else
#if defined(__DMC__)
/* Digital Mars does not recognize the PAUSE opcode. Fall back to NOP. */
__asm nop;
#else #else
__asm pause; __asm pause;
#endif #endif
#endif
#else #else
__asm__ __volatile__ ("pause"); __asm__ __volatile__ ("pause");
#endif #endif
...@@ -12357,7 +12362,7 @@ typedef enum ...@@ -12357,7 +12362,7 @@ typedef enum
typedef struct typedef struct
{ {
UINT32 cbSize; ma_uint32 cbSize;
BOOL bIsOffload; BOOL bIsOffload;
MA_AUDIO_STREAM_CATEGORY eCategory; MA_AUDIO_STREAM_CATEGORY eCategory;
} ma_AudioClientProperties; } ma_AudioClientProperties;
...@@ -12644,9 +12649,9 @@ typedef struct ...@@ -12644,9 +12649,9 @@ typedef struct
HRESULT (STDMETHODCALLTYPE * GetBufferSizeLimits)(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration); HRESULT (STDMETHODCALLTYPE * GetBufferSizeLimits)(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration);
/* IAudioClient3 */ /* IAudioClient3 */
HRESULT (STDMETHODCALLTYPE * GetSharedModeEnginePeriod) (ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, UINT32* pDefaultPeriodInFrames, UINT32* pFundamentalPeriodInFrames, UINT32* pMinPeriodInFrames, UINT32* pMaxPeriodInFrames); HRESULT (STDMETHODCALLTYPE * GetSharedModeEnginePeriod) (ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, ma_uint32* pDefaultPeriodInFrames, ma_uint32* pFundamentalPeriodInFrames, ma_uint32* pMinPeriodInFrames, ma_uint32* pMaxPeriodInFrames);
HRESULT (STDMETHODCALLTYPE * GetCurrentSharedModeEnginePeriod)(ma_IAudioClient3* pThis, WAVEFORMATEX** ppFormat, UINT32* pCurrentPeriodInFrames); HRESULT (STDMETHODCALLTYPE * GetCurrentSharedModeEnginePeriod)(ma_IAudioClient3* pThis, WAVEFORMATEX** ppFormat, ma_uint32* pCurrentPeriodInFrames);
HRESULT (STDMETHODCALLTYPE * InitializeSharedAudioStream) (ma_IAudioClient3* pThis, DWORD streamFlags, UINT32 periodInFrames, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid); HRESULT (STDMETHODCALLTYPE * InitializeSharedAudioStream) (ma_IAudioClient3* pThis, DWORD streamFlags, ma_uint32 periodInFrames, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);
} ma_IAudioClient3Vtbl; } ma_IAudioClient3Vtbl;
struct ma_IAudioClient3 struct ma_IAudioClient3
{ {
...@@ -12670,9 +12675,9 @@ static MA_INLINE HRESULT ma_IAudioClient3_GetService(ma_IAudioClient3* pThis, co ...@@ -12670,9 +12675,9 @@ static MA_INLINE HRESULT ma_IAudioClient3_GetService(ma_IAudioClient3* pThis, co
static MA_INLINE HRESULT ma_IAudioClient3_IsOffloadCapable(ma_IAudioClient3* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable) { return pThis->lpVtbl->IsOffloadCapable(pThis, category, pOffloadCapable); } static MA_INLINE HRESULT ma_IAudioClient3_IsOffloadCapable(ma_IAudioClient3* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable) { return pThis->lpVtbl->IsOffloadCapable(pThis, category, pOffloadCapable); }
static MA_INLINE HRESULT ma_IAudioClient3_SetClientProperties(ma_IAudioClient3* pThis, const ma_AudioClientProperties* pProperties) { return pThis->lpVtbl->SetClientProperties(pThis, pProperties); } static MA_INLINE HRESULT ma_IAudioClient3_SetClientProperties(ma_IAudioClient3* pThis, const ma_AudioClientProperties* pProperties) { return pThis->lpVtbl->SetClientProperties(pThis, pProperties); }
static MA_INLINE HRESULT ma_IAudioClient3_GetBufferSizeLimits(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration) { return pThis->lpVtbl->GetBufferSizeLimits(pThis, pFormat, eventDriven, pMinBufferDuration, pMaxBufferDuration); } static MA_INLINE HRESULT ma_IAudioClient3_GetBufferSizeLimits(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration) { return pThis->lpVtbl->GetBufferSizeLimits(pThis, pFormat, eventDriven, pMinBufferDuration, pMaxBufferDuration); }
static MA_INLINE HRESULT ma_IAudioClient3_GetSharedModeEnginePeriod(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, UINT32* pDefaultPeriodInFrames, UINT32* pFundamentalPeriodInFrames, UINT32* pMinPeriodInFrames, UINT32* pMaxPeriodInFrames) { return pThis->lpVtbl->GetSharedModeEnginePeriod(pThis, pFormat, pDefaultPeriodInFrames, pFundamentalPeriodInFrames, pMinPeriodInFrames, pMaxPeriodInFrames); } static MA_INLINE HRESULT ma_IAudioClient3_GetSharedModeEnginePeriod(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, ma_uint32* pDefaultPeriodInFrames, ma_uint32* pFundamentalPeriodInFrames, ma_uint32* pMinPeriodInFrames, ma_uint32* pMaxPeriodInFrames) { return pThis->lpVtbl->GetSharedModeEnginePeriod(pThis, pFormat, pDefaultPeriodInFrames, pFundamentalPeriodInFrames, pMinPeriodInFrames, pMaxPeriodInFrames); }
static MA_INLINE HRESULT ma_IAudioClient3_GetCurrentSharedModeEnginePeriod(ma_IAudioClient3* pThis, WAVEFORMATEX** ppFormat, UINT32* pCurrentPeriodInFrames) { return pThis->lpVtbl->GetCurrentSharedModeEnginePeriod(pThis, ppFormat, pCurrentPeriodInFrames); } static MA_INLINE HRESULT ma_IAudioClient3_GetCurrentSharedModeEnginePeriod(ma_IAudioClient3* pThis, WAVEFORMATEX** ppFormat, ma_uint32* pCurrentPeriodInFrames) { return pThis->lpVtbl->GetCurrentSharedModeEnginePeriod(pThis, ppFormat, pCurrentPeriodInFrames); }
static MA_INLINE HRESULT ma_IAudioClient3_InitializeSharedAudioStream(ma_IAudioClient3* pThis, DWORD streamFlags, UINT32 periodInFrames, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGUID) { return pThis->lpVtbl->InitializeSharedAudioStream(pThis, streamFlags, periodInFrames, pFormat, pAudioSessionGUID); } static MA_INLINE HRESULT ma_IAudioClient3_InitializeSharedAudioStream(ma_IAudioClient3* pThis, DWORD streamFlags, ma_uint32 periodInFrames, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGUID) { return pThis->lpVtbl->InitializeSharedAudioStream(pThis, streamFlags, periodInFrames, pFormat, pAudioSessionGUID); }
/* IAudioRenderClient */ /* IAudioRenderClient */
...@@ -13046,10 +13051,8 @@ static ma_result ma_context_get_device_info_from_IAudioClient__wasapi(ma_context ...@@ -13046,10 +13051,8 @@ static ma_result ma_context_get_device_info_from_IAudioClient__wasapi(ma_context
first. If this fails, fall back to a search. first. If this fails, fall back to a search.
*/ */
hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, pWF, NULL); hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, pWF, NULL);
ma_PropVariantClear(pContext, &var);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
/* The format returned by PKEY_AudioEngine_DeviceFormat is not supported. */ /* The format returned by PKEY_AudioEngine_DeviceFormat is supported. */
ma_add_native_data_format_to_device_info_from_WAVEFORMATEX(pWF, ma_share_mode_exclusive, pInfo); ma_add_native_data_format_to_device_info_from_WAVEFORMATEX(pWF, ma_share_mode_exclusive, pInfo);
} else { } else {
/* /*
...@@ -13114,6 +13117,8 @@ static ma_result ma_context_get_device_info_from_IAudioClient__wasapi(ma_context ...@@ -13114,6 +13117,8 @@ static ma_result ma_context_get_device_info_from_IAudioClient__wasapi(ma_context
} }
} }
ma_PropVariantClear(pContext, &var);
if (!found) { if (!found) {
ma_IPropertyStore_Release(pProperties); ma_IPropertyStore_Release(pProperties);
return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to find suitable device format for device info retrieval.", MA_FORMAT_NOT_SUPPORTED); return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to find suitable device format for device info retrieval.", MA_FORMAT_NOT_SUPPORTED);
...@@ -13908,14 +13913,14 @@ static ma_result ma_device_init_internal__wasapi(ma_context* pContext, ma_device ...@@ -13908,14 +13913,14 @@ static ma_result ma_device_init_internal__wasapi(ma_context* pContext, ma_device
ma_IAudioClient3* pAudioClient3 = NULL; ma_IAudioClient3* pAudioClient3 = NULL;
hr = ma_IAudioClient_QueryInterface(pData->pAudioClient, &MA_IID_IAudioClient3, (void**)&pAudioClient3); hr = ma_IAudioClient_QueryInterface(pData->pAudioClient, &MA_IID_IAudioClient3, (void**)&pAudioClient3);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
UINT32 defaultPeriodInFrames; ma_uint32 defaultPeriodInFrames;
UINT32 fundamentalPeriodInFrames; ma_uint32 fundamentalPeriodInFrames;
UINT32 minPeriodInFrames; ma_uint32 minPeriodInFrames;
UINT32 maxPeriodInFrames; ma_uint32 maxPeriodInFrames;
hr = ma_IAudioClient3_GetSharedModeEnginePeriod(pAudioClient3, (WAVEFORMATEX*)&wf, &defaultPeriodInFrames, &fundamentalPeriodInFrames, &minPeriodInFrames, &maxPeriodInFrames); hr = ma_IAudioClient3_GetSharedModeEnginePeriod(pAudioClient3, (WAVEFORMATEX*)&wf, &defaultPeriodInFrames, &fundamentalPeriodInFrames, &minPeriodInFrames, &maxPeriodInFrames);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
UINT32 desiredPeriodInFrames = pData->periodSizeInFramesOut; ma_uint32 desiredPeriodInFrames = pData->periodSizeInFramesOut;
UINT32 actualPeriodInFrames = desiredPeriodInFrames; ma_uint32 actualPeriodInFrames = desiredPeriodInFrames;
/* Make sure the period size is a multiple of fundamentalPeriodInFrames. */ /* Make sure the period size is a multiple of fundamentalPeriodInFrames. */
actualPeriodInFrames = actualPeriodInFrames / fundamentalPeriodInFrames; actualPeriodInFrames = actualPeriodInFrames / fundamentalPeriodInFrames;
...@@ -32437,9 +32442,14 @@ MA_API ma_result ma_context_get_device_info(ma_context* pContext, ma_device_type ...@@ -32437,9 +32442,14 @@ MA_API ma_result ma_context_get_device_info(ma_context* pContext, ma_device_type
deviceInfo.maxSampleRate = 0; deviceInfo.maxSampleRate = 0;
for (iNativeFormat = 0; iNativeFormat < deviceInfo.nativeDataFormatCount; iNativeFormat += 1) { for (iNativeFormat = 0; iNativeFormat < deviceInfo.nativeDataFormatCount; iNativeFormat += 1) {
printf("format: %d\n", deviceInfo.nativeDataFormats[iNativeFormat].format);
printf("channels: %d\n", deviceInfo.nativeDataFormats[iNativeFormat].channels);
printf("rate: %d\n", deviceInfo.nativeDataFormats[iNativeFormat].sampleRate);
/* Formats. */ /* Formats. */
if (deviceInfo.nativeDataFormats[iNativeFormat].format == ma_format_unknown) { if (deviceInfo.nativeDataFormats[iNativeFormat].format == ma_format_unknown) {
/* All formats are supported. */ /* All formats are supported. */
printf("==== ALL FORMATS ====\n");
deviceInfo.formats[0] = ma_format_u8; deviceInfo.formats[0] = ma_format_u8;
deviceInfo.formats[1] = ma_format_s16; deviceInfo.formats[1] = ma_format_s16;
deviceInfo.formats[2] = ma_format_s24; deviceInfo.formats[2] = ma_format_s24;
...@@ -43489,7 +43499,7 @@ static ma_result ma_default_vfs_seek__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i ...@@ -43489,7 +43499,7 @@ static ma_result ma_default_vfs_seek__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i
dwMoveMethod = FILE_BEGIN; dwMoveMethod = FILE_BEGIN;
} }
#if defined(_MSC_VER) && _MSC_VER <= 1200 #if (defined(_MSC_VER) && _MSC_VER <= 1200) || defined(__DMC__)
/* No SetFilePointerEx() so restrict to 31 bits. */ /* No SetFilePointerEx() so restrict to 31 bits. */
if (origin > 0x7FFFFFFF) { if (origin > 0x7FFFFFFF) {
return MA_OUT_OF_RANGE; return MA_OUT_OF_RANGE;
...@@ -43511,7 +43521,7 @@ static ma_result ma_default_vfs_tell__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i ...@@ -43511,7 +43521,7 @@ static ma_result ma_default_vfs_tell__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i
LARGE_INTEGER liZero; LARGE_INTEGER liZero;
LARGE_INTEGER liTell; LARGE_INTEGER liTell;
BOOL result; BOOL result;
#if defined(_MSC_VER) && _MSC_VER <= 1200 #if (defined(_MSC_VER) && _MSC_VER <= 1200) || defined(__DMC__)
LONG tell; LONG tell;
#endif #endif
...@@ -43519,7 +43529,7 @@ static ma_result ma_default_vfs_tell__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i ...@@ -43519,7 +43529,7 @@ static ma_result ma_default_vfs_tell__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i
liZero.QuadPart = 0; liZero.QuadPart = 0;
#if defined(_MSC_VER) && _MSC_VER <= 1200 #if (defined(_MSC_VER) && _MSC_VER <= 1200) || defined(__DMC__)
result = SetFilePointer((HANDLE)file, (LONG)liZero.QuadPart, &tell, FILE_CURRENT); result = SetFilePointer((HANDLE)file, (LONG)liZero.QuadPart, &tell, FILE_CURRENT);
liTell.QuadPart = tell; liTell.QuadPart = tell;
#else #else
...@@ -64043,8 +64053,11 @@ The following miscellaneous changes have also been made. ...@@ -64043,8 +64053,11 @@ The following miscellaneous changes have also been made.
REVISION HISTORY REVISION HISTORY
================ ================
v0.10.26 - TBD v0.10.26 - TBD
- WASAPI: Fix a bug where the exclusive mode format may not be retrieved correctly due to accessing freed memory.
- Fix a bug with ma_waveform where glitching occurs after changing frequency. - Fix a bug with ma_waveform where glitching occurs after changing frequency.
- Fix compilation with OpenWatcom. - Fix compilation with OpenWatcom.
- Fix compilation with TCC.
- Fix compilation with Digital Mars.
- Fix compilation warnings. - Fix compilation warnings.
v0.10.25 - 2020-11-15 v0.10.25 - 2020-11-15
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment