Merge branch 'dev' into dev-0.12

This commit is contained in:
David Reid
2025-08-07 18:00:40 +10:00
2 changed files with 393 additions and 206 deletions
+260 -75
View File
@@ -3884,11 +3884,35 @@ typedef ma_uint16 wchar_t;
#define MA_WIN32_UWP #define MA_WIN32_UWP
#elif defined(WINAPI_FAMILY) && (defined(WINAPI_FAMILY_GAMES) && WINAPI_FAMILY == WINAPI_FAMILY_GAMES) #elif defined(WINAPI_FAMILY) && (defined(WINAPI_FAMILY_GAMES) && WINAPI_FAMILY == WINAPI_FAMILY_GAMES)
#define MA_WIN32_GDK #define MA_WIN32_GDK
#elif defined(NXDK)
#define MA_WIN32_NXDK
#else #else
#define MA_WIN32_DESKTOP #define MA_WIN32_DESKTOP
#endif #endif
/* The original Xbox. */
#if defined(NXDK) /* <-- Add other Xbox compiler toolchains here, and then add a toolchain-specific define in case we need to discriminate between them later. */
#define MA_XBOX
#if defined(NXDK)
#define MA_XBOX_NXDK
#endif
#endif
#endif #endif
#if !defined(_WIN32) /* If it's not Win32, assume POSIX. */ #if defined(__MSDOS__) || defined(MSDOS) || defined(_MSDOS) || defined(__DOS__)
#define MA_DOS
/* No threading allowed on DOS. */
#ifndef MA_NO_THREADING
#define MA_NO_THREADING
#endif
/* No runtime linking allowed on DOS. */
#ifndef MA_NO_RUNTIME_LINKING
#define MA_NO_RUNTIME_LINKING
#endif
#endif
#if !defined(MA_WIN32) && !defined(MA_DOS) /* If it's not Win32, assume POSIX. */
#define MA_POSIX #define MA_POSIX
#if !defined(MA_NO_THREADING) #if !defined(MA_NO_THREADING)
@@ -3935,13 +3959,10 @@ typedef ma_uint16 wchar_t;
#if defined(__PROSPERO__) #if defined(__PROSPERO__)
#define MA_PROSPERO #define MA_PROSPERO
#endif #endif
#if defined(__NX__)
#define MA_NX
#endif
#if defined(__3DS__) #if defined(__3DS__)
#define MA_3DS #define MA_3DS
#endif #endif
#if defined(__SWITCH__) #if defined(__SWITCH__) || defined(__NX__)
#define MA_SWITCH #define MA_SWITCH
#endif #endif
#if defined(__BEOS__) || defined(__HAIKU__) #if defined(__BEOS__) || defined(__HAIKU__)
@@ -11230,7 +11251,12 @@ IMPLEMENTATION
#include <unistd.h> #include <unistd.h>
#endif #endif
#include <sys/stat.h> /* For fstat(), etc. */ /* For fstat(), etc. */
#if defined(MA_XBOX_NXDK)
#include <stat.h> /* Suggestion for NXDK: Add a sys/stat.h wrapper for compatibility. */
#else
#include <sys/stat.h>
#endif
#ifdef MA_EMSCRIPTEN #ifdef MA_EMSCRIPTEN
#include <emscripten/emscripten.h> #include <emscripten/emscripten.h>
@@ -11632,7 +11658,7 @@ static void ma_sleep__posix(ma_uint32 milliseconds)
(void)milliseconds; (void)milliseconds;
MA_ASSERT(MA_FALSE); /* The Emscripten build should never sleep. */ MA_ASSERT(MA_FALSE); /* The Emscripten build should never sleep. */
#else #else
#if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || defined(MA_NX) #if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || defined(MA_SWITCH)
struct timespec ts; struct timespec ts;
ts.tv_sec = milliseconds / 1000; ts.tv_sec = milliseconds / 1000;
ts.tv_nsec = milliseconds % 1000 * 1000000; ts.tv_nsec = milliseconds % 1000 * 1000000;
@@ -11697,7 +11723,7 @@ static MA_INLINE unsigned int ma_disable_denormals(void)
{ {
unsigned int prevState; unsigned int prevState;
#if defined(_MSC_VER) #if defined(_MSC_VER) && !defined(MA_XBOX_NXDK)
{ {
/* /*
Older versions of Visual Studio don't support the "safe" versions of _controlfp_s(). I don't Older versions of Visual Studio don't support the "safe" versions of _controlfp_s(). I don't
@@ -11744,7 +11770,7 @@ static MA_INLINE unsigned int ma_disable_denormals(void)
static MA_INLINE void ma_restore_denormals(unsigned int prevState) static MA_INLINE void ma_restore_denormals(unsigned int prevState)
{ {
#if defined(_MSC_VER) #if defined(_MSC_VER) && !defined(MA_XBOX_NXDK)
{ {
/* Older versions of Visual Studio do not support _controlfp_s(). See ma_disable_denormals(). */ /* Older versions of Visual Studio do not support _controlfp_s(). See ma_disable_denormals(). */
#if _MSC_VER <= 1200 #if _MSC_VER <= 1200
@@ -12369,6 +12395,29 @@ MA_API MA_NO_INLINE int ma_strcmp(const char* str1, const char* str2)
return ((unsigned char*)str1)[0] - ((unsigned char*)str2)[0]; return ((unsigned char*)str1)[0] - ((unsigned char*)str2)[0];
} }
MA_API MA_NO_INLINE int ma_wcscmp(const wchar_t* str1, const wchar_t* str2)
{
if (str1 == str2) return 0;
/* These checks differ from the standard implementation. It's not important, but I prefer it just for sanity. */
if (str1 == NULL) return -1;
if (str2 == NULL) return 1;
for (;;) {
if (str1[0] == L'\0') {
break;
}
if (str1[0] != str2[0]) {
break;
}
str1 += 1;
str2 += 1;
}
return ((unsigned short*)str1)[0] - ((unsigned short*)str2)[0];
}
MA_API MA_NO_INLINE int ma_strappend(char* dst, size_t dstSize, const char* srcA, const char* srcB) MA_API MA_NO_INLINE int ma_strappend(char* dst, size_t dstSize, const char* srcA, const char* srcB)
{ {
int result; int result;
@@ -12386,6 +12435,22 @@ MA_API MA_NO_INLINE int ma_strappend(char* dst, size_t dstSize, const char* srcA
return result; return result;
} }
MA_API MA_NO_INLINE size_t ma_wcslen(const wchar_t* str)
{
const wchar_t* end;
if (str == NULL) {
return 0;
}
end = str;
while (end[0] != '\0') {
end += 1;
}
return end - str;
}
MA_API MA_NO_INLINE char* ma_copy_string(const char* src, const ma_allocation_callbacks* pAllocationCallbacks) MA_API MA_NO_INLINE char* ma_copy_string(const char* src, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
size_t sz; size_t sz;
@@ -12408,7 +12473,7 @@ MA_API MA_NO_INLINE char* ma_copy_string(const char* src, const ma_allocation_ca
MA_API MA_NO_INLINE wchar_t* ma_copy_string_w(const wchar_t* src, const ma_allocation_callbacks* pAllocationCallbacks) MA_API MA_NO_INLINE wchar_t* ma_copy_string_w(const wchar_t* src, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
size_t sz = wcslen(src)+1; size_t sz = ma_wcslen(src)+1;
wchar_t* dst = (wchar_t*)ma_malloc(sz * sizeof(*dst), pAllocationCallbacks); wchar_t* dst = (wchar_t*)ma_malloc(sz * sizeof(*dst), pAllocationCallbacks);
if (dst == NULL) { if (dst == NULL) {
return NULL; return NULL;
@@ -12839,7 +12904,7 @@ MA_API ma_result ma_fopen(FILE** ppFile, const char* pFilePath, const char* pOpe
return MA_INVALID_ARGS; return MA_INVALID_ARGS;
} }
#if defined(_MSC_VER) && _MSC_VER >= 1400 #if (defined(_MSC_VER) && _MSC_VER >= 1400) && !defined(MA_XBOX_NXDK)
err = fopen_s(ppFile, pFilePath, pOpenMode); err = fopen_s(ppFile, pFilePath, pOpenMode);
if (err != 0) { if (err != 0) {
return ma_result_from_errno(err); return ma_result_from_errno(err);
@@ -12881,7 +12946,7 @@ _wfopen() isn't always available in all compilation environments.
This can be reviewed as compatibility issues arise. The preference is to use _wfopen_s() and _wfopen() as opposed to the wcsrtombs() This can be reviewed as compatibility issues arise. The preference is to use _wfopen_s() and _wfopen() as opposed to the wcsrtombs()
fallback, so if you notice your compiler not detecting this properly I'm happy to look at adding support. fallback, so if you notice your compiler not detecting this properly I'm happy to look at adding support.
*/ */
#if defined(_WIN32) #if defined(_WIN32) && !defined(MA_XBOX_NXDK)
#if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS))
#define MA_HAS_WFOPEN #define MA_HAS_WFOPEN
#endif #endif
@@ -12897,29 +12962,34 @@ MA_API ma_result ma_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_
return MA_INVALID_ARGS; return MA_INVALID_ARGS;
} }
#if defined(MA_HAS_WFOPEN) #if defined(MA_HAS_WFOPEN)
{ {
/* Use _wfopen() on Windows. */ /* Use _wfopen() on Windows. */
#if defined(_MSC_VER) && _MSC_VER >= 1400 #if defined(_MSC_VER) && _MSC_VER >= 1400
{
errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode); errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode);
if (err != 0) { if (err != 0) {
return ma_result_from_errno(err); return ma_result_from_errno(err);
} }
}
#else #else
{
*ppFile = _wfopen(pFilePath, pOpenMode); *ppFile = _wfopen(pFilePath, pOpenMode);
if (*ppFile == NULL) { if (*ppFile == NULL) {
return ma_result_from_errno(errno); return ma_result_from_errno(errno);
} }
}
#endif #endif
(void)pAllocationCallbacks; (void)pAllocationCallbacks;
} }
#else #elif !defined(MA_XBOX_NXDK) && !defined(MA_DOS) /* If your compiler does not support wcsrtombs(), add it here. */
{
/* /*
Use fopen() on anything other than Windows. Requires a conversion. This is annoying because fopen() is locale specific. The only real way I can Use fopen() on anything other than Windows. Requires a conversion. This is annoying because fopen() is locale specific. The only real way I can
think of to do this is with wcsrtombs(). Note that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for think of to do this is with wcsrtombs(). Note that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for
maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler error I'll look into improving compatibility. maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler error I'll look into improving compatibility.
*/ */
{
mbstate_t mbs; mbstate_t mbs;
size_t lenMB; size_t lenMB;
const wchar_t* pFilePathTemp = pFilePath; const wchar_t* pFilePathTemp = pFilePath;
@@ -12960,11 +13030,16 @@ MA_API ma_result ma_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_
ma_free(pFilePathMB, pAllocationCallbacks); ma_free(pFilePathMB, pAllocationCallbacks);
} }
#else
{
/* Getting here means there is no way to open the file with a wide character string. */
*ppFile = NULL;
}
#endif
if (*ppFile == NULL) { if (*ppFile == NULL) {
return MA_ERROR; return MA_ERROR;
} }
#endif
return MA_SUCCESS; return MA_SUCCESS;
} }
@@ -17479,7 +17554,7 @@ static ma_result ma_event_signal__win32(ma_event* pEvent)
static ma_result ma_semaphore_init__win32(int initialValue, ma_semaphore* pSemaphore) static ma_result ma_semaphore_init__win32(int initialValue, ma_semaphore* pSemaphore)
{ {
*pSemaphore = CreateSemaphoreW(NULL, (LONG)initialValue, LONG_MAX, NULL); *pSemaphore = CreateSemaphore(NULL, (LONG)initialValue, LONG_MAX, NULL);
if (*pSemaphore == NULL) { if (*pSemaphore == NULL) {
return ma_result_from_GetLastError(GetLastError()); return ma_result_from_GetLastError(GetLastError());
} }
@@ -18859,10 +18934,11 @@ Dynamic Linking
MA_API ma_handle ma_dlopen(ma_log* pLog, const char* filename) MA_API ma_handle ma_dlopen(ma_log* pLog, const char* filename)
{ {
#ifndef MA_NO_RUNTIME_LINKING #ifndef MA_NO_RUNTIME_LINKING
{
ma_handle handle; ma_handle handle;
ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, "Loading library: %s", filename); ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, "Loading library: %s\n", filename);
#ifdef MA_WIN32 #ifdef MA_WIN32
/* From MSDN: Desktop applications cannot use LoadPackagedLibrary; if a desktop application calls this function it fails with APPMODEL_ERROR_NO_PACKAGE.*/ /* From MSDN: Desktop applications cannot use LoadPackagedLibrary; if a desktop application calls this function it fails with APPMODEL_ERROR_NO_PACKAGE.*/
@@ -18886,24 +18962,31 @@ MA_API ma_handle ma_dlopen(ma_log* pLog, const char* filename)
backend is a deliberate design choice. Instead I'm logging it as an informational message. backend is a deliberate design choice. Instead I'm logging it as an informational message.
*/ */
if (handle == NULL) { if (handle == NULL) {
ma_log_postf(pLog, MA_LOG_LEVEL_INFO, "Failed to load library: %s", filename); ma_log_postf(pLog, MA_LOG_LEVEL_INFO, "Failed to load library: %s\n", filename);
} }
return handle; return handle;
#else }
#else
{
/* Runtime linking is disabled. */ /* Runtime linking is disabled. */
(void)pLog; (void)pLog;
(void)filename; (void)filename;
return NULL; return NULL;
#endif }
#endif
} }
MA_API void ma_dlclose(ma_log* pLog, ma_handle handle) MA_API void ma_dlclose(ma_log* pLog, ma_handle handle)
{ {
#ifndef MA_NO_RUNTIME_LINKING #ifndef MA_NO_RUNTIME_LINKING
{
#ifdef MA_WIN32 #ifdef MA_WIN32
{
FreeLibrary((HMODULE)handle); FreeLibrary((HMODULE)handle);
}
#else #else
{
/* Hack for Android bug (see https://github.com/android/ndk/issues/360). Calling dlclose() pre-API 28 may segfault. */ /* Hack for Android bug (see https://github.com/android/ndk/issues/360). Calling dlclose() pre-API 28 may segfault. */
#if !defined(MA_ANDROID) || (defined(__ANDROID_API__) && __ANDROID_API__ >= 28) #if !defined(MA_ANDROID) || (defined(__ANDROID_API__) && __ANDROID_API__ >= 28)
{ {
@@ -18914,49 +18997,61 @@ MA_API void ma_dlclose(ma_log* pLog, ma_handle handle)
(void)handle; (void)handle;
} }
#endif #endif
}
#endif #endif
(void)pLog; (void)pLog;
#else }
#else
{
/* Runtime linking is disabled. */ /* Runtime linking is disabled. */
(void)pLog; (void)pLog;
(void)handle; (void)handle;
#endif }
#endif
} }
MA_API ma_proc ma_dlsym(ma_log* pLog, ma_handle handle, const char* symbol) MA_API ma_proc ma_dlsym(ma_log* pLog, ma_handle handle, const char* symbol)
{ {
#ifndef MA_NO_RUNTIME_LINKING #ifndef MA_NO_RUNTIME_LINKING
{
ma_proc proc; ma_proc proc;
ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, "Loading symbol: %s", symbol); ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, "Loading symbol: %s\n", symbol);
#ifdef _WIN32 #ifdef _WIN32
{
proc = (ma_proc)GetProcAddress((HMODULE)handle, symbol); proc = (ma_proc)GetProcAddress((HMODULE)handle, symbol);
#else }
#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || defined(__clang__) #else
{
#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || defined(__clang__)
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic" #pragma GCC diagnostic ignored "-Wpedantic"
#endif #endif
proc = (ma_proc)dlsym((void*)handle, symbol); proc = (ma_proc)dlsym((void*)handle, symbol);
#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || defined(__clang__) #if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || defined(__clang__)
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif #endif
#endif }
#endif
if (proc == NULL) { if (proc == NULL) {
ma_log_postf(pLog, MA_LOG_LEVEL_WARNING, "Failed to load symbol: %s", symbol); ma_log_postf(pLog, MA_LOG_LEVEL_WARNING, "Failed to load symbol: %s\n", symbol);
} }
(void)pLog; /* It's possible for pContext to be unused. */ (void)pLog; /* It's possible for pContext to be unused. */
return proc; return proc;
#else }
#else
{
/* Runtime linking is disabled. */ /* Runtime linking is disabled. */
(void)pLog; (void)pLog;
(void)handle; (void)handle;
(void)symbol; (void)symbol;
return NULL; return NULL;
#endif }
#endif
} }
@@ -19001,7 +19096,7 @@ BACKENDS
************************************************************************************************************************************************************/ ************************************************************************************************************************************************************/
/* Some backends are only supported on certain platforms. */ /* Some backends are only supported on certain platforms. */
#if defined(MA_WIN32) #if defined(MA_WIN32) && !defined(MA_XBOX)
#define MA_SUPPORT_WASAPI #define MA_SUPPORT_WASAPI
#if defined(MA_WIN32_DESKTOP) /* DirectSound and WinMM backends are only supported on desktops. */ #if defined(MA_WIN32_DESKTOP) /* DirectSound and WinMM backends are only supported on desktops. */
@@ -19414,7 +19509,7 @@ MA_API void ma_device_info_add_native_data_format(ma_device_info* pDeviceInfo, m
#if defined(MA_WIN32) #if defined(MA_WIN32) && !defined(MA_XBOX)
/* WASAPI error codes. */ /* WASAPI error codes. */
#define MA_AUDCLNT_E_NOT_INITIALIZED ((HRESULT)0x88890001) #define MA_AUDCLNT_E_NOT_INITIALIZED ((HRESULT)0x88890001)
#define MA_AUDCLNT_E_ALREADY_INITIALIZED ((HRESULT)0x88890002) #define MA_AUDCLNT_E_ALREADY_INITIALIZED ((HRESULT)0x88890002)
@@ -19629,6 +19724,11 @@ typedef LONG (WINAPI * MA_PFN_RegCloseKey)(HKEY hKey);
typedef LONG (WINAPI * MA_PFN_RegQueryValueExA)(HKEY hKey, const char* lpValueName, DWORD* lpReserved, DWORD* lpType, BYTE* lpData, DWORD* lpcbData); typedef LONG (WINAPI * MA_PFN_RegQueryValueExA)(HKEY hKey, const char* lpValueName, DWORD* lpReserved, DWORD* lpType, BYTE* lpData, DWORD* lpcbData);
#endif /* MA_WIN32_DESKTOP */ #endif /* MA_WIN32_DESKTOP */
static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
/*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_ALAW = {0x00000006, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/
/*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_MULAW = {0x00000007, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/
MA_API size_t ma_strlen_WCHAR(const WCHAR* str) MA_API size_t ma_strlen_WCHAR(const WCHAR* str)
{ {
size_t len = 0; size_t len = 0;
@@ -20308,14 +20408,6 @@ static MA_INLINE void ma_device_set_status(ma_device* pDevice, ma_device_status
} }
#if defined(MA_WIN32)
static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
/*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_ALAW = {0x00000006, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/
/*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_MULAW = {0x00000007, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/
#endif
MA_API ma_uint32 ma_get_format_priority_index(ma_format format) /* Lower = better. */ MA_API ma_uint32 ma_get_format_priority_index(ma_format format) /* Lower = better. */
{ {
@@ -21129,7 +21221,7 @@ ma_device_backend_vtable* ma_device_backend_null = NULL;
WIN32 COMMON WIN32 COMMON
*******************************************************************************/ *******************************************************************************/
#if defined(MA_WIN32) #if defined(MA_WIN32) && !defined(MA_XBOX)
#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)
#define ma_CoInitializeEx(pContext, pvReserved, dwCoInit) ((pContext->win32.CoInitializeEx) ? ((MA_PFN_CoInitializeEx)pContext->win32.CoInitializeEx)(pvReserved, dwCoInit) : ((MA_PFN_CoInitialize)pContext->win32.CoInitialize)(pvReserved)) #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit) ((pContext->win32.CoInitializeEx) ? ((MA_PFN_CoInitializeEx)pContext->win32.CoInitializeEx)(pvReserved, dwCoInit) : ((MA_PFN_CoInitialize)pContext->win32.CoInitialize)(pvReserved))
#define ma_CoUninitialize(pContext) ((MA_PFN_CoUninitialize)pContext->win32.CoUninitialize)() #define ma_CoUninitialize(pContext) ((MA_PFN_CoUninitialize)pContext->win32.CoUninitialize)()
@@ -21144,7 +21236,7 @@ WIN32 COMMON
#define ma_PropVariantClear(pContext, pvar) PropVariantClear(pvar) #define ma_PropVariantClear(pContext, pvar) PropVariantClear(pvar)
#endif #endif
#if !defined(MAXULONG_PTR) && !defined(__WATCOMC__) #if !defined(MAXULONG_PTR) && !defined(__WATCOMC__) && !defined(MA_XBOX_NXDK)
typedef size_t DWORD_PTR; typedef size_t DWORD_PTR;
#endif #endif
@@ -23233,7 +23325,7 @@ static ma_result ma_context_get_IAudioClient__wasapi(ma_context* pContext, ma_de
pActivationParams = &activationParams; pActivationParams = &activationParams;
/* When requesting a specific device ID we need to use a special device ID. */ /* When requesting a specific device ID we need to use a special device ID. */
MA_COPY_MEMORY(virtualDeviceID.wasapi, MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, (wcslen(MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK) + 1) * sizeof(wchar_t)); /* +1 for the null terminator. */ MA_COPY_MEMORY(virtualDeviceID.wasapi, MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, (ma_wcslen(MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK) + 1) * sizeof(wchar_t)); /* +1 for the null terminator. */
pDeviceID = &virtualDeviceID; pDeviceID = &virtualDeviceID;
} else { } else {
pActivationParams = NULL; /* No activation parameters required. */ pActivationParams = NULL; /* No activation parameters required. */
@@ -43465,13 +43557,13 @@ MA_API ma_result ma_device_post_init(ma_device* pDevice, ma_device_type deviceTy
static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData) static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData)
{ {
ma_device* pDevice = (ma_device*)pData; ma_device* pDevice = (ma_device*)pData;
#ifdef MA_WIN32 #if defined(MA_WIN32) && !defined(MA_XBOX)
HRESULT CoInitializeResult; HRESULT CoInitializeResult;
#endif #endif
MA_ASSERT(pDevice != NULL); MA_ASSERT(pDevice != NULL);
#ifdef MA_WIN32 #if defined(MA_WIN32) && !defined(MA_XBOX)
CoInitializeResult = ma_CoInitializeEx(pDevice->pContext, NULL, MA_COINIT_VALUE); CoInitializeResult = ma_CoInitializeEx(pDevice->pContext, NULL, MA_COINIT_VALUE);
#endif #endif
@@ -43562,7 +43654,7 @@ static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData)
ma_event_signal(&pDevice->stopEvent); ma_event_signal(&pDevice->stopEvent);
} }
#ifdef MA_WIN32 #if defined(MA_WIN32) && !defined(MA_XBOX)
if (CoInitializeResult == S_OK || CoInitializeResult == S_FALSE) { if (CoInitializeResult == S_OK || CoInitializeResult == S_FALSE) {
ma_CoUninitialize(pDevice->pContext); ma_CoUninitialize(pDevice->pContext);
} }
@@ -43577,10 +43669,16 @@ static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData)
static ma_result ma_context_uninit_backend_apis__win32(ma_context* pContext) static ma_result ma_context_uninit_backend_apis__win32(ma_context* pContext)
{ {
/* For some reason UWP complains when CoUninitialize() is called. I'm just not going to call it on UWP. */ /* For some reason UWP complains when CoUninitialize() is called. I'm just not going to call it on UWP. */
#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)
{
/* TODO: Remove this once the new single threaded backend system is in place in 0.12. */
#if !defined(MA_XBOX)
{
if (pContext->win32.CoInitializeResult == S_OK || pContext->win32.CoInitializeResult == S_FALSE) { if (pContext->win32.CoInitializeResult == S_OK || pContext->win32.CoInitializeResult == S_FALSE) {
ma_CoUninitialize(pContext); ma_CoUninitialize(pContext); /* TODO: Remove this once the new single threaded backend system is in place in 0.12. */
} }
}
#endif
#if defined(MA_WIN32_DESKTOP) #if defined(MA_WIN32_DESKTOP)
ma_dlclose(ma_context_get_log(pContext), pContext->win32.hUser32DLL); ma_dlclose(ma_context_get_log(pContext), pContext->win32.hUser32DLL);
@@ -43588,17 +43686,26 @@ static ma_result ma_context_uninit_backend_apis__win32(ma_context* pContext)
#endif #endif
ma_dlclose(ma_context_get_log(pContext), pContext->win32.hOle32DLL); ma_dlclose(ma_context_get_log(pContext), pContext->win32.hOle32DLL);
#else }
#else
{
(void)pContext; (void)pContext;
#endif }
#endif
return MA_SUCCESS; return MA_SUCCESS;
} }
static ma_result ma_context_init_backend_apis__win32(ma_context* pContext) static ma_result ma_context_init_backend_apis__win32(ma_context* pContext)
{ {
#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) /*
TODO: Reassess all of this stuff and move everything to the relevant backends. For example, I think
GetForegroundWindow() and GetDesktopWindow() are only used by the DirectSound backend.
*/
#if (defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)) && !defined(MA_XBOX)
{
#if defined(MA_WIN32_DESKTOP) #if defined(MA_WIN32_DESKTOP)
{
/* User32.dll */ /* User32.dll */
pContext->win32.hUser32DLL = ma_dlopen(ma_context_get_log(pContext), "user32.dll"); pContext->win32.hUser32DLL = ma_dlopen(ma_context_get_log(pContext), "user32.dll");
if (pContext->win32.hUser32DLL == NULL) { if (pContext->win32.hUser32DLL == NULL) {
@@ -43618,6 +43725,7 @@ static ma_result ma_context_init_backend_apis__win32(ma_context* pContext)
pContext->win32.RegOpenKeyExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegOpenKeyExA"); pContext->win32.RegOpenKeyExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegOpenKeyExA");
pContext->win32.RegCloseKey = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegCloseKey"); pContext->win32.RegCloseKey = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegCloseKey");
pContext->win32.RegQueryValueExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegQueryValueExA"); pContext->win32.RegQueryValueExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegQueryValueExA");
}
#endif #endif
/* Ole32.dll */ /* Ole32.dll */
@@ -43633,11 +43741,20 @@ static ma_result ma_context_init_backend_apis__win32(ma_context* pContext)
pContext->win32.CoTaskMemFree = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoTaskMemFree"); pContext->win32.CoTaskMemFree = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoTaskMemFree");
pContext->win32.PropVariantClear = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "PropVariantClear"); pContext->win32.PropVariantClear = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "PropVariantClear");
pContext->win32.StringFromGUID2 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "StringFromGUID2"); pContext->win32.StringFromGUID2 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "StringFromGUID2");
#else }
#else
{
(void)pContext; /* Unused. */ (void)pContext; /* Unused. */
#endif }
#endif
/* TODO: Remove this once the new single threaded backend system is in place in 0.12. */
#if !defined(MA_XBOX)
{
pContext->win32.CoInitializeResult = ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE); pContext->win32.CoInitializeResult = ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE);
}
#endif
return MA_SUCCESS; return MA_SUCCESS;
} }
#else #else
@@ -61817,7 +61934,7 @@ MA_API ma_result ma_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo
} }
#if !defined(MA_USE_WIN32_FILEIO) && (defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) && !defined(MA_POSIX)) #if !defined(MA_USE_WIN32_FILEIO) && (defined(MA_WIN32) && (defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_NXDK)) && !defined(MA_NO_WIN32_FILEIO) && !defined(MA_POSIX))
#define MA_USE_WIN32_FILEIO #define MA_USE_WIN32_FILEIO
#endif #endif
@@ -61894,6 +62011,8 @@ static ma_result ma_default_vfs_open__win32(ma_vfs* pVFS, const char* pFilePath,
static ma_result ma_default_vfs_open_w__win32(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) static ma_result ma_default_vfs_open_w__win32(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)
{ {
#if !defined(MA_XBOX_NXDK)
{
HANDLE hFile; HANDLE hFile;
DWORD dwDesiredAccess; DWORD dwDesiredAccess;
DWORD dwShareMode; DWORD dwShareMode;
@@ -61913,6 +62032,13 @@ static ma_result ma_default_vfs_open_w__win32(ma_vfs* pVFS, const wchar_t* pFile
*pFile = hFile; *pFile = hFile;
return MA_SUCCESS; return MA_SUCCESS;
}
#else
{
/* No CreateFileW() available. */
return MA_NOT_IMPLEMENTED;
}
#endif
} }
static ma_result ma_default_vfs_close__win32(ma_vfs* pVFS, ma_vfs_file file) static ma_result ma_default_vfs_close__win32(ma_vfs* pVFS, ma_vfs_file file)
@@ -62083,11 +62209,13 @@ static ma_result ma_default_vfs_tell__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i
static ma_result ma_default_vfs_info__win32(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) static ma_result ma_default_vfs_info__win32(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo)
{ {
(void)pVFS;
#if !defined(MA_XBOX_NXDK)
{
BY_HANDLE_FILE_INFORMATION fi; BY_HANDLE_FILE_INFORMATION fi;
BOOL result; BOOL result;
(void)pVFS;
result = GetFileInformationByHandle((HANDLE)file, &fi); result = GetFileInformationByHandle((HANDLE)file, &fi);
if (result == 0) { if (result == 0) {
return ma_result_from_GetLastError(GetLastError()); return ma_result_from_GetLastError(GetLastError());
@@ -62096,6 +62224,13 @@ static ma_result ma_default_vfs_info__win32(ma_vfs* pVFS, ma_vfs_file file, ma_f
pInfo->sizeInBytes = ((ma_uint64)fi.nFileSizeHigh << 32) | ((ma_uint64)fi.nFileSizeLow); pInfo->sizeInBytes = ((ma_uint64)fi.nFileSizeHigh << 32) | ((ma_uint64)fi.nFileSizeLow);
return MA_SUCCESS; return MA_SUCCESS;
}
#else
{
/* GetFileInformationByHandle() is unavailable. */
return MA_NOT_IMPLEMENTED;
}
#endif
} }
#else #else
static ma_result ma_default_vfs_open__stdio(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) static ma_result ma_default_vfs_open__stdio(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)
@@ -62433,6 +62568,8 @@ static ma_result ma_default_vfs_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* p
static ma_result ma_default_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) static ma_result ma_default_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo)
{ {
ma_result result;
if (pInfo == NULL) { if (pInfo == NULL) {
return MA_INVALID_ARGS; return MA_INVALID_ARGS;
} }
@@ -62444,10 +62581,43 @@ static ma_result ma_default_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_inf
} }
#if defined(MA_USE_WIN32_FILEIO) #if defined(MA_USE_WIN32_FILEIO)
return ma_default_vfs_info__win32(pVFS, file, pInfo); result = ma_default_vfs_info__win32(pVFS, file, pInfo);
#else #else
return ma_default_vfs_info__stdio(pVFS, file, pInfo); result = ma_default_vfs_info__stdio(pVFS, file, pInfo);
#endif #endif
if (result == MA_NOT_IMPLEMENTED) {
/* Not implemented. Fall back to seek/tell/seek. */
ma_result result;
ma_int64 cursor;
ma_int64 sizeInBytes;
result = ma_default_vfs_tell(pVFS, file, &cursor);
if (result != MA_SUCCESS) {
return result;
}
result = ma_default_vfs_seek(pVFS, file, 0, MA_SEEK_END);
if (result != MA_SUCCESS) {
return result;
}
result = ma_default_vfs_tell(pVFS, file, &sizeInBytes);
if (result != MA_SUCCESS) {
return result;
}
pInfo->sizeInBytes = sizeInBytes;
result = ma_default_vfs_seek(pVFS, file, cursor, MA_SEEK_SET);
if (result != MA_SUCCESS) {
return result;
}
MA_ASSERT(result == MA_SUCCESS);
}
return result;
} }
@@ -63365,7 +63535,7 @@ extern "C" {
#define MA_DR_MP3_XSTRINGIFY(x) MA_DR_MP3_STRINGIFY(x) #define MA_DR_MP3_XSTRINGIFY(x) MA_DR_MP3_STRINGIFY(x)
#define MA_DR_MP3_VERSION_MAJOR 0 #define MA_DR_MP3_VERSION_MAJOR 0
#define MA_DR_MP3_VERSION_MINOR 7 #define MA_DR_MP3_VERSION_MINOR 7
#define MA_DR_MP3_VERSION_REVISION 0 #define MA_DR_MP3_VERSION_REVISION 1
#define MA_DR_MP3_VERSION_STRING MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MAJOR) "." MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MINOR) "." MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_REVISION) #define MA_DR_MP3_VERSION_STRING MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MAJOR) "." MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MINOR) "." MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_REVISION)
#include <stddef.h> #include <stddef.h>
#define MA_DR_MP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152 #define MA_DR_MP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152
@@ -66488,14 +66658,16 @@ static ma_bool32 ma_path_extension_equal_w(const wchar_t* path, const wchar_t* e
ext1 = extension; ext1 = extension;
ext2 = ma_path_extension_w(path); ext2 = ma_path_extension_w(path);
#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__) #if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__)) && !defined(MA_XBOX_NXDK)
{
return _wcsicmp(ext1, ext2) == 0; return _wcsicmp(ext1, ext2) == 0;
#else }
#elif !defined(MA_XBOX_NXDK) && !defined(MA_DOS)
{
/* /*
I'm not aware of a wide character version of strcasecmp(). I'm therefore converting the extensions to multibyte strings and comparing those. This I'm not aware of a wide character version of strcasecmp(). I'm therefore converting the extensions to multibyte strings and comparing those. This
isn't the most efficient way to do it, but it should work OK. isn't the most efficient way to do it, but it should work OK.
*/ */
{
char ext1MB[4096]; char ext1MB[4096];
char ext2MB[4096]; char ext2MB[4096];
const wchar_t* pext1 = ext1; const wchar_t* pext1 = ext1;
@@ -66515,7 +66687,13 @@ static ma_bool32 ma_path_extension_equal_w(const wchar_t* path, const wchar_t* e
return strcasecmp(ext1MB, ext2MB) == 0; return strcasecmp(ext1MB, ext2MB) == 0;
} }
#endif #else
{
/* Getting here means we don't have a way to do a case-sensitive comparison for wide strings. Fall back to a simple case-sensitive comparison. */
/* TODO: Implement our own wchar_t-to-char conversion routine and then use the char* version for comparing. */
return ma_wcscmp(ext1, ext2) == 0;
}
#endif
} }
@@ -69630,7 +69808,7 @@ static ma_uint32 ma_hash_string_32(const char* str)
static ma_uint32 ma_hash_string_w_32(const wchar_t* str) static ma_uint32 ma_hash_string_w_32(const wchar_t* str)
{ {
return ma_hash_32(str, (int)wcslen(str) * sizeof(*str), MA_DEFAULT_HASH_SEED); return ma_hash_32(str, (int)ma_wcslen(str) * sizeof(*str), MA_DEFAULT_HASH_SEED);
} }
@@ -78593,7 +78771,7 @@ static ma_result ma_sound_init_from_data_source_internal(ma_engine* pEngine, con
} }
if (pConfig->loopPointBegInPCMFrames != 0 || pConfig->loopPointEndInPCMFrames != ~((ma_uint64)0)) { if (pConfig->loopPointBegInPCMFrames != 0 || pConfig->loopPointEndInPCMFrames != ~((ma_uint64)0)) {
ma_data_source_set_range_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); ma_data_source_set_loop_point_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames);
} }
ma_sound_set_looping(pSound, (pConfig->flags & MA_SOUND_FLAG_LOOPING) != 0); ma_sound_set_looping(pSound, (pConfig->flags & MA_SOUND_FLAG_LOOPING) != 0);
@@ -82475,7 +82653,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav__on_tell_stdio(void* pUserData, ma_int64* pCursor
ma_int64 result; ma_int64 result;
MA_DR_WAV_ASSERT(pFileStdio != NULL); MA_DR_WAV_ASSERT(pFileStdio != NULL);
MA_DR_WAV_ASSERT(pCursor != NULL); MA_DR_WAV_ASSERT(pCursor != NULL);
#if defined(_WIN32) #if defined(_WIN32) && !defined(NXDK)
#if defined(_MSC_VER) && _MSC_VER > 1200 #if defined(_MSC_VER) && _MSC_VER > 1200
result = _ftelli64(pFileStdio); result = _ftelli64(pFileStdio);
#else #else
@@ -89985,7 +90163,7 @@ static ma_bool32 ma_dr_flac__on_tell_stdio(void* pUserData, ma_int64* pCursor)
ma_int64 result; ma_int64 result;
MA_DR_FLAC_ASSERT(pFileStdio != NULL); MA_DR_FLAC_ASSERT(pFileStdio != NULL);
MA_DR_FLAC_ASSERT(pCursor != NULL); MA_DR_FLAC_ASSERT(pCursor != NULL);
#if defined(_WIN32) #if defined(_WIN32) && !defined(NXDK)
#if defined(_MSC_VER) && _MSC_VER > 1200 #if defined(_MSC_VER) && _MSC_VER > 1200
result = _ftelli64(pFileStdio); result = _ftelli64(pFileStdio);
#else #else
@@ -93317,6 +93495,10 @@ static float ma_dr_mp3_L3_ldexp_q2(float y, int exp_q2)
} while ((exp_q2 -= e) > 0); } while ((exp_q2 -= e) > 0);
return y; return y;
} }
#if (defined(__GNUC__) && (__GNUC__ >= 14)) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstringop-overflow"
#endif
static void ma_dr_mp3_L3_decode_scalefactors(const ma_uint8 *hdr, ma_uint8 *ist_pos, ma_dr_mp3_bs *bs, const ma_dr_mp3_L3_gr_info *gr, float *scf, int ch) static void ma_dr_mp3_L3_decode_scalefactors(const ma_uint8 *hdr, ma_uint8 *ist_pos, ma_dr_mp3_bs *bs, const ma_dr_mp3_L3_gr_info *gr, float *scf, int ch)
{ {
static const ma_uint8 g_scf_partitions[3][28] = { static const ma_uint8 g_scf_partitions[3][28] = {
@@ -93375,6 +93557,9 @@ static void ma_dr_mp3_L3_decode_scalefactors(const ma_uint8 *hdr, ma_uint8 *ist_
scf[i] = ma_dr_mp3_L3_ldexp_q2(gain, iscf[i] << scf_shift); scf[i] = ma_dr_mp3_L3_ldexp_q2(gain, iscf[i] << scf_shift);
} }
} }
#if (defined(__GNUC__) && (__GNUC__ >= 14)) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif
static const float ma_dr_mp3_g_pow43[129 + 16] = { static const float ma_dr_mp3_g_pow43[129 + 16] = {
0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f,
0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f
@@ -95114,7 +95299,7 @@ static ma_bool32 ma_dr_mp3__on_tell_stdio(void* pUserData, ma_int64* pCursor)
ma_int64 result; ma_int64 result;
MA_DR_MP3_ASSERT(pFileStdio != NULL); MA_DR_MP3_ASSERT(pFileStdio != NULL);
MA_DR_MP3_ASSERT(pCursor != NULL); MA_DR_MP3_ASSERT(pCursor != NULL);
#if defined(_WIN32) #if defined(_WIN32) && !defined(NXDK)
#if defined(_MSC_VER) && _MSC_VER > 1200 #if defined(_MSC_VER) && _MSC_VER > 1200
result = _ftelli64(pFileStdio); result = _ftelli64(pFileStdio);
#else #else
+2
View File
@@ -0,0 +1,2 @@
set DJGPP=C:\DJGPP\DJGPP.ENV
set PATH=C:\DJGPP\BIN;%PATH%