From a65191f418516ba7122a5b6cd056d3f228e62e98 Mon Sep 17 00:00:00 2001 From: David Reid Date: Sat, 18 Mar 2023 09:28:55 +1000 Subject: [PATCH] Code cleanup. The Cosmopolitan-specific windows.h stuff has now been moved to an external file in the extras folder: extras/cosmopolitan/include/windows.h To compile with Cosmpolitan it is now required that you add the above path to the command line when compiling. --- extras/cosmopolitan/include/windows.h | 85 ++++++++++++++ miniaudio.h | 152 ++++++++------------------ 2 files changed, 132 insertions(+), 105 deletions(-) create mode 100644 extras/cosmopolitan/include/windows.h diff --git a/extras/cosmopolitan/include/windows.h b/extras/cosmopolitan/include/windows.h new file mode 100644 index 00000000..20fb932e --- /dev/null +++ b/extras/cosmopolitan/include/windows.h @@ -0,0 +1,85 @@ +/* +IMPORTANT NOTE: Cosmopolitan is not officially supported by miniaudio. This file was added just as +a way to play around and experiment with Cosmopolitan as a proof of concept and to test the viability +of supporting such a compiler. If you get compilation or runtime errors you're on your own. + +--------------------------------------------------------------------------------------------------- + +This is a version of windows.h for compiling with Cosmopolitan. It's not complete. It's intended to +define some missing items from cosmopolitan.h. Hopefully as the project develops we can eventually +eliminate all of the content in this file. +*/ +#ifndef _WINDOWS_ +#define _WINDOWS_ + +#define WINAPI +#define STDMETHODCALLTYPE + +typedef uint64_t HWND; +typedef uint64_t HANDLE; +typedef uint32_t HRESULT; +typedef uint8_t BYTE; +typedef uint16_t WORD; +typedef uint32_t DWORD; +typedef uint64_t DWORDLONG; +typedef int32_t BOOL; +typedef int32_t LONG; /* `long` is always 32-bit on Windows. */ +typedef uint32_t ULONG; +typedef uint64_t ULONGLONG; +typedef char16_t WCHAR; + +#define TRUE 1 +#define FALSE 0 + +#define WAIT_OBJECT_0 0 +#define INFINITE 0xFFFFFFFF + +#define FAILED(hr) ((hr) < 0) +#define SUCCEEDED(hr) ((hr) >= 0) + +#define NOERROR 0 +#define S_OK 0 +#define S_FALSE 1 +#define E_POINTER ((HRESULT)0x80004003) +#define E_UNEXPECTED ((HRESULT)0x8000FFFF) +#define E_NOTIMPL ((HRESULT)0x80004001) +#define E_OUTOFMEMORY ((HRESULT)0x8007000E) +#define E_INVALIDARG ((HRESULT)0x80070057) +#define E_NOINTERFACE ((HRESULT)0x80004002) +#define E_HANDLE ((HRESULT)0x80070006) +#define E_ABORT ((HRESULT)0x80004004) +#define E_FAIL ((HRESULT)0x80004005) +#define E_ACCESSDENIED ((HRESULT)0x80070005) + +#define ERROR_SUCCESS 0 +#define ERROR_FILE_NOT_FOUND 2 +#define ERROR_PATH_NOT_FOUND 3 +#define ERROR_TOO_MANY_OPEN_FILES 4 +#define ERROR_ACCESS_DENIED 5 +#define ERROR_NOT_ENOUGH_MEMORY 8 +#define ERROR_HANDLE_EOF 38 +#define ERROR_INVALID_PARAMETER 87 +#define ERROR_DISK_FULL 112 +#define ERROR_SEM_TIMEOUT 121 +#define ERROR_NEGATIVE_SEEK 131 + +typedef struct +{ + unsigned long Data1; + unsigned short Data2; + unsigned short Data3; + unsigned char Data4[8]; +} GUID, IID; + +static HANDLE CreateEventA(struct NtSecurityAttributes* lpEventAttributes, bool32 bManualReset, bool32 bInitialState, const char* lpName) +{ + assert(lpName == NULL); /* If this is ever triggered we'll need to do a ANSI-to-Unicode conversion. */ + return (HANDLE)CreateEvent(lpEventAttributes, bManualReset, bInitialState, (const char16_t*)lpName); +} + +static BOOL IsEqualGUID(const GUID* a, const GUID* b) +{ + return memcmp(a, b, sizeof(GUID)) == 0; +} + +#endif /* _WINDOWS_ */ diff --git a/miniaudio.h b/miniaudio.h index a096b12b..8a26ab4c 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -11314,8 +11314,10 @@ IMPLEMENTATION #define miniaudio_c #include -#include /* For INT_MAX */ -#include /* sin(), etc. */ +#include /* For INT_MAX */ +#include /* sin(), etc. */ +#include /* For malloc(), free(), wcstombs(). */ +#include /* For memset() */ #include #include @@ -11328,107 +11330,10 @@ IMPLEMENTATION #endif #if defined(MA_WIN32) - #if !defined(__COSMOPOLITAN__) - #include - #endif - - #if defined(__COSMOPOLITAN__) - #define WINAPI - #define STDMETHODCALLTYPE - - typedef uint64_t HWND; - typedef uint64_t HANDLE; - typedef uint32_t HRESULT; - typedef uint8_t BYTE; - typedef uint16_t WORD; - typedef uint32_t DWORD; - typedef uint64_t DWORDLONG; - typedef int32_t BOOL; - typedef int32_t LONG; /* `long` is always 32-bit on Windows. */ - typedef uint32_t ULONG; - typedef uint64_t ULONGLONG; - typedef char16_t WCHAR; - - #define TRUE 1 - #define FALSE 0 - - #define WAIT_OBJECT_0 0 - #define INFINITE 0xFFFFFFFF - - #define FAILED(hr) ((hr) < 0) - #define SUCCEEDED(hr) ((hr) >= 0) - - #define NOERROR 0 - #define S_OK 0 - #define S_FALSE 1 - #define E_POINTER ((HRESULT)0x80004003) - #define E_UNEXPECTED ((HRESULT)0x8000FFFF) - #define E_NOTIMPL ((HRESULT)0x80004001) - #define E_OUTOFMEMORY ((HRESULT)0x8007000E) - #define E_INVALIDARG ((HRESULT)0x80070057) - #define E_NOINTERFACE ((HRESULT)0x80004002) - #define E_HANDLE ((HRESULT)0x80070006) - #define E_ABORT ((HRESULT)0x80004004) - #define E_FAIL ((HRESULT)0x80004005) - #define E_ACCESSDENIED ((HRESULT)0x80070005) - - #define ERROR_SUCCESS 0 - #define ERROR_FILE_NOT_FOUND 2 - #define ERROR_PATH_NOT_FOUND 3 - #define ERROR_TOO_MANY_OPEN_FILES 4 - #define ERROR_ACCESS_DENIED 5 - #define ERROR_NOT_ENOUGH_MEMORY 8 - #define ERROR_HANDLE_EOF 38 - #define ERROR_INVALID_PARAMETER 87 - #define ERROR_DISK_FULL 112 - #define ERROR_SEM_TIMEOUT 121 - #define ERROR_NEGATIVE_SEEK 131 - - typedef struct - { - unsigned long Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; - } GUID, IID; - - static HANDLE CreateEventA(struct NtSecurityAttributes* lpEventAttributes, bool32 bManualReset, bool32 bInitialState, const char* lpName) - { - assert(lpName == NULL); /* If this is ever triggered we'll need to do a ANSI-to-Unicode conversion. */ - return (HANDLE)CreateEvent(lpEventAttributes, bManualReset, bInitialState, (const char16_t*)lpName); - } - - static BOOL IsEqualGUID(const GUID* a, const GUID* b) - { - return memcmp(a, b, sizeof(GUID)) == 0; - } - #endif - - #define MA_VT_LPWSTR 31 - #define MA_VT_BLOB 65 - - typedef struct - { - WORD vt; - WORD wReserved1; - WORD wReserved2; - WORD wReserved3; - union - { - struct - { - ULONG cbSize; - BYTE* pBlobData; - } blob; - WCHAR* pwszVal; - char pad[16]; /* Just to ensure the size of the struct matches the official version. */ - }; - } MA_PROPVARIANT; + #include #endif #if !defined(MA_WIN32) -#include /* For malloc(), free(), wcstombs(). */ -#include /* For memset() */ #include #include /* select() (used for ma_sleep()). */ #include @@ -18231,6 +18136,43 @@ static ma_result ma_result_from_HRESULT(HRESULT hr) } } +/* PROPVARIANT */ +#define MA_VT_LPWSTR 31 +#define MA_VT_BLOB 65 + +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(push) + #pragma warning(disable:4201) /* nonstandard extension used: nameless struct/union */ +#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpedantic" /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */ + #if defined(__clang__) + #pragma GCC diagnostic ignored "-Wc11-extensions" /* anonymous unions are a C11 extension */ + #endif +#endif +typedef struct +{ + WORD vt; + WORD wReserved1; + WORD wReserved2; + WORD wReserved3; + union + { + struct + { + ULONG cbSize; + BYTE* pBlobData; + } blob; + WCHAR* pwszVal; + char pad[16]; /* Just to ensure the size of the struct matches the official version. */ + }; +} MA_PROPVARIANT; +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(pop) +#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) + #pragma GCC diagnostic pop +#endif + typedef HRESULT (WINAPI * MA_PFN_CoInitialize)(void* pvReserved); typedef HRESULT (WINAPI * MA_PFN_CoInitializeEx)(void* pvReserved, DWORD dwCoInit); typedef void (WINAPI * MA_PFN_CoUninitialize)(void); @@ -18239,14 +18181,14 @@ typedef void (WINAPI * MA_PFN_CoTaskMemFree)(void* pv); typedef HRESULT (WINAPI * MA_PFN_PropVariantClear)(MA_PROPVARIANT *pvar); typedef int (WINAPI * MA_PFN_StringFromGUID2)(const GUID* const rguid, wchar_t* lpsz, int cchMax); -typedef HWND (WINAPI * MA_PFN_GetForegroundWindow)(void); -typedef HWND (WINAPI * MA_PFN_GetDesktopWindow)(void); +typedef HWND (WINAPI * MA_PFN_GetForegroundWindow)(void); +typedef HWND (WINAPI * MA_PFN_GetDesktopWindow)(void); #if defined(MA_WIN32_DESKTOP) /* Microsoft documents these APIs as returning LSTATUS, but the Win32 API shipping with some compilers do not define it. It's just a LONG. */ -typedef LONG (WINAPI * MA_PFN_RegOpenKeyExA)(HKEY hKey, const char* lpSubKey, DWORD ulOptions, DWORD samDesired, HKEY* phkResult); -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_RegOpenKeyExA)(HKEY hKey, const char* lpSubKey, DWORD ulOptions, DWORD samDesired, HKEY* phkResult); +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); #endif /* MA_WIN32_DESKTOP */ #endif /* MA_WIN32 */