SDL: wasapi: Merge wasapi_win32.c into wasapi.c

From 57458588ee905f2a0c22e7567517de2a200e2780 Mon Sep 17 00:00:00 2001
From: Ethan Lee <[EMAIL REDACTED]>
Date: Tue, 22 Nov 2022 16:46:12 -0500
Subject: [PATCH] wasapi: Merge wasapi_win32.c into wasapi.c

---
 VisualC-GDK/SDL/SDL.vcxproj         |   1 -
 VisualC-GDK/SDL/SDL.vcxproj.filters |   3 -
 VisualC/SDL/SDL.vcxproj             |   1 -
 VisualC/SDL/SDL.vcxproj.filters     |   3 -
 src/audio/wasapi/SDL_wasapi.c       | 113 ++++++++++++++-----
 src/audio/wasapi/SDL_wasapi.h       |  15 ---
 src/audio/wasapi/SDL_wasapi_win32.c | 162 ----------------------------
 7 files changed, 85 insertions(+), 213 deletions(-)
 delete mode 100644 src/audio/wasapi/SDL_wasapi_win32.c

diff --git a/VisualC-GDK/SDL/SDL.vcxproj b/VisualC-GDK/SDL/SDL.vcxproj
index 5cecec06cecf..5e5179772f12 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj
+++ b/VisualC-GDK/SDL/SDL.vcxproj
@@ -533,7 +533,6 @@
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
-    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
diff --git a/VisualC-GDK/SDL/SDL.vcxproj.filters b/VisualC-GDK/SDL/SDL.vcxproj.filters
index a44a128f8254..e45001412c5d 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj.filters
+++ b/VisualC-GDK/SDL/SDL.vcxproj.filters
@@ -1018,9 +1018,6 @@
     <ClCompile Include="..\..\src\audio\dummy\SDL_dummyaudio.c">
       <Filter>audio\dummy</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c">
-      <Filter>audio\wasapi</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c">
       <Filter>audio\wasapi</Filter>
     </ClCompile>
diff --git a/VisualC/SDL/SDL.vcxproj b/VisualC/SDL/SDL.vcxproj
index b6b054e16705..821777883ab8 100644
--- a/VisualC/SDL/SDL.vcxproj
+++ b/VisualC/SDL/SDL.vcxproj
@@ -451,7 +451,6 @@
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
-    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
diff --git a/VisualC/SDL/SDL.vcxproj.filters b/VisualC/SDL/SDL.vcxproj.filters
index 993def3aba6e..9385a7fbbf5a 100644
--- a/VisualC/SDL/SDL.vcxproj.filters
+++ b/VisualC/SDL/SDL.vcxproj.filters
@@ -1009,9 +1009,6 @@
     <ClCompile Include="..\..\src\audio\dummy\SDL_dummyaudio.c">
       <Filter>audio\dummy</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c">
-      <Filter>audio\wasapi</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c">
       <Filter>audio\wasapi</Filter>
     </ClCompile>
diff --git a/src/audio/wasapi/SDL_wasapi.c b/src/audio/wasapi/SDL_wasapi.c
index 416870ab4af4..bbb8d0180bd2 100644
--- a/src/audio/wasapi/SDL_wasapi.c
+++ b/src/audio/wasapi/SDL_wasapi.c
@@ -46,13 +46,27 @@
 #endif
 
 /* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */
+static const IID SDL_IID_IAudioClient = { 0x1cb9ad4c, 0xdbfa, 0x4c32,{ 0xb1, 0x78, 0xc2, 0xf5, 0x68, 0xa7, 0x03, 0xb2 } };
 static const IID SDL_IID_IAudioRenderClient = { 0xf294acfc, 0x3146, 0x4483,{ 0xa7, 0xbf, 0xad, 0xdc, 0xa7, 0xc2, 0x60, 0xe2 } };
 static const IID SDL_IID_IAudioCaptureClient = { 0xc8adbd64, 0xe71e, 0x48a0,{ 0xa4, 0xde, 0x18, 0x5c, 0x39, 0x5c, 0xd3, 0x17 } };
 
+/* handle to Avrt.dll--Vista and later!--for flagging the callback thread as "Pro Audio" (low latency). */
+static HMODULE libavrt = NULL;
+typedef HANDLE(WINAPI *pfnAvSetMmThreadCharacteristicsW)(LPCWSTR, LPDWORD);
+typedef BOOL(WINAPI *pfnAvRevertMmThreadCharacteristics)(HANDLE);
+static pfnAvSetMmThreadCharacteristicsW pAvSetMmThreadCharacteristicsW = NULL;
+static pfnAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL;
+
 static void
 WASAPI_DetectDevices(void)
 {
-    WASAPI_EnumerateEndpoints();
+    SDL_IMMDevice_EnumerateEndpoints(SDL_FALSE);
+}
+
+int
+WASAPI_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture)
+{
+    return SDL_IMMDevice_GetDefaultAudioInfo(name, spec, iscapture);
 }
 
 static SDL_INLINE SDL_bool
@@ -126,7 +140,7 @@ UpdateAudioStream(_THIS, const SDL_AudioSpec *oldspec)
     return 0;
 }
 
-
+static int ActivateWasapiDevice(_THIS, SDL_bool isrecovery);
 static void ReleaseWasapiDevice(_THIS);
 
 static SDL_bool
@@ -143,7 +157,7 @@ RecoverWasapiDevice(_THIS)
        devices try to reinitialize whatever the new default is, so it's more
        likely to carry on here, but this handles a non-default device that
        simply had its format changed in the Windows Control Panel. */
-    if (WASAPI_ActivateDevice(this, SDL_TRUE) == -1) {
+    if (ActivateWasapiDevice(this, SDL_TRUE) == -1) {
         SDL_OpenedAudioDeviceDisconnected(this);
         return SDL_FALSE;
     }
@@ -349,11 +363,6 @@ ReleaseWasapiDevice(_THIS)
         this->hidden->capturestream = NULL;
     }
 
-    if (this->hidden->activation_handler) {
-        WASAPI_PlatformDeleteActivationHandler(this->hidden->activation_handler);
-        this->hidden->activation_handler = NULL;
-    }
-
     if (this->hidden->event) {
         CloseHandle(this->hidden->event);
         this->hidden->event = NULL;
@@ -362,18 +371,6 @@ ReleaseWasapiDevice(_THIS)
 
 static void
 WASAPI_CloseDevice(_THIS)
-{
-    WASAPI_UnrefDevice(this);
-}
-
-void
-WASAPI_RefDevice(_THIS)
-{
-    SDL_AtomicIncRef(&this->hidden->refcount);
-}
-
-void
-WASAPI_UnrefDevice(_THIS)
 {
     if (!SDL_AtomicDecRef(&this->hidden->refcount)) {
         return;
@@ -390,7 +387,7 @@ WASAPI_UnrefDevice(_THIS)
 }
 
 /* This is called once a device is activated, possibly asynchronously. */
-int
+static int
 WASAPI_PrepDevice(_THIS, const SDL_bool updatestream)
 {
     /* !!! FIXME: we could request an exclusive mode stream, which is lower latency;
@@ -541,6 +538,34 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream)
     return 0;  /* good to go. */
 }
 
+static int
+ActivateWasapiDevice(_THIS, const SDL_bool isrecovery)
+{
+    IMMDevice *device = NULL;
+    HRESULT ret;
+
+    if (SDL_IMMDevice_Get(this->hidden->devid, &device, this->iscapture) < 0) {
+        this->hidden->client = NULL;
+        return -1; /* This is already set by SDL_IMMDevice_Get */
+    }
+
+    /* this is not async in standard win32, yay! */
+    ret = IMMDevice_Activate(device, &SDL_IID_IAudioClient, CLSCTX_ALL, NULL, (void **) &this->hidden->client);
+    IMMDevice_Release(device);
+
+    if (FAILED(ret)) {
+        SDL_assert(this->hidden->client == NULL);
+        return WIN_SetErrorFromHRESULT("WASAPI can't activate audio endpoint", ret);
+    }
+
+    SDL_assert(this->hidden->client != NULL);
+    if (WASAPI_PrepDevice(this, isrecovery) == -1) {   /* not async, fire it right away. */
+        return -1;
+    }
+
+    return 0;  /* good to go. */
+}
+
 
 static int
 WASAPI_OpenDevice(_THIS, const char *devname)
@@ -555,7 +580,7 @@ WASAPI_OpenDevice(_THIS, const char *devname)
     }
     SDL_zerop(this->hidden);
 
-    WASAPI_RefDevice(this);   /* so CloseDevice() will unref to zero. */
+    SDL_AtomicIncRef(&this->hidden->refcount); /* so CloseDevice() will unref to zero. */
 
     if (!devid) {  /* is default device? */
         this->hidden->default_device_generation = SDL_AtomicGet(this->iscapture ? &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration);
@@ -566,7 +591,7 @@ WASAPI_OpenDevice(_THIS, const char *devname)
         }
     }
 
-    if (WASAPI_ActivateDevice(this, SDL_FALSE) == -1) {
+    if (ActivateWasapiDevice(this, SDL_FALSE) == -1) {
         return -1;  /* already set error. */
     }
 
@@ -584,26 +609,58 @@ WASAPI_OpenDevice(_THIS, const char *devname)
 static void
 WASAPI_ThreadInit(_THIS)
 {
-    WASAPI_PlatformThreadInit(this);
+    /* this thread uses COM. */
+    if (SUCCEEDED(WIN_CoInitialize())) {    /* can't report errors, hope it worked! */
+        this->hidden->coinitialized = SDL_TRUE;
+    }
+
+    /* Set this thread to very high "Pro Audio" priority. */
+    if (pAvSetMmThreadCharacteristicsW) {
+        DWORD idx = 0;
+        this->hidden->task = pAvSetMmThreadCharacteristicsW(L"Pro Audio", &idx);
+    }
 }
 
 static void
 WASAPI_ThreadDeinit(_THIS)
 {
-    WASAPI_PlatformThreadDeinit(this);
+    /* Set this thread back to normal priority. */
+    if (this->hidden->task && pAvRevertMmThreadCharacteristics) {
+        pAvRevertMmThreadCharacteristics(this->hidden->task);
+        this->hidden->task = NULL;
+    }
+
+    if (this->hidden->coinitialized) {
+        WIN_CoUninitialize();
+        this->hidden->coinitialized = SDL_FALSE;
+    }
 }
 
 static void
 WASAPI_Deinitialize(void)
 {
-    WASAPI_PlatformDeinit();
+    if (libavrt) {
+        FreeLibrary(libavrt);
+        libavrt = NULL;
+    }
+
+    pAvSetMmThreadCharacteristicsW = NULL;
+    pAvRevertMmThreadCharacteristics = NULL;
+
+    SDL_IMMDevice_Quit();
 }
 
 static SDL_bool
 WASAPI_Init(SDL_AudioDriverImpl * impl)
 {
-    if (WASAPI_PlatformInit() == -1) {
-        return SDL_FALSE;
+    if (SDL_IMMDevice_Init() < 0) {
+        return SDL_FALSE; /* Error is set by SDL_IMMDevice_Init */
+    }
+
+    libavrt = LoadLibrary(TEXT("avrt.dll"));  /* this library is available in Vista and later. No WinXP, so have to LoadLibrary to use it for now! */
+    if (libavrt) {
+        pAvSetMmThreadCharacteristicsW = (pfnAvSetMmThreadCharacteristicsW) GetProcAddress(libavrt, "AvSetMmThreadCharacteristicsW");
+        pAvRevertMmThreadCharacteristics = (pfnAvRevertMmThreadCharacteristics) GetProcAddress(libavrt, "AvRevertMmThreadCharacteristics");
     }
 
     /* Set the function pointers */
diff --git a/src/audio/wasapi/SDL_wasapi.h b/src/audio/wasapi/SDL_wasapi.h
index 69060677d25f..5a62b0d1ce3e 100644
--- a/src/audio/wasapi/SDL_wasapi.h
+++ b/src/audio/wasapi/SDL_wasapi.h
@@ -55,21 +55,6 @@ struct SDL_PrivateAudioData
     SDL_atomic_t just_activated;
 };
 
-/* win32 and winrt implementations call into these. */
-int WASAPI_PrepDevice(_THIS, const SDL_bool updatestream);
-void WASAPI_RefDevice(_THIS);
-void WASAPI_UnrefDevice(_THIS);
-
-/* These are functions that are implemented differently for Windows vs WinRT. */
-int WASAPI_PlatformInit(void);
-void WASAPI_PlatformDeinit(void);
-void WASAPI_EnumerateEndpoints(void);
-int WASAPI_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture);
-int WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery);
-void WASAPI_PlatformThreadInit(_THIS);
-void WASAPI_PlatformThreadDeinit(_THIS);
-void WASAPI_PlatformDeleteActivationHandler(void *handler);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/audio/wasapi/SDL_wasapi_win32.c b/src/audio/wasapi/SDL_wasapi_win32.c
deleted file mode 100644
index dd3ea09f8678..000000000000
--- a/src/audio/wasapi/SDL_wasapi_win32.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
-  Simple DirectMedia Layer
-  Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-*/
-#include "../../SDL_internal.h"
-
-/* This is code that Windows uses to talk to WASAPI-related system APIs.
-   This is for non-WinRT desktop apps. The C++/CX implementation of these
-   functions, exclusive to WinRT, are in SDL_wasapi_winrt.cpp.
-   The code in SDL_wasapi.c is used by both standard Windows and WinRT builds
-   to deal with audio and calls into these functions. */
-
-#if SDL_AUDIO_DRIVER_WASAPI
-
-#include "../../core/windows/SDL_windows.h"
-#include "../../core/windows/SDL_immdevice.h"
-#include "SDL_audio.h"
-#include "SDL_timer.h"
-#include "../SDL_audio_c.h"
-#include "../SDL_sysaudio.h"
-
-#include <audioclient.h>
-
-#include "SDL_wasapi.h"
-
-/* handle to Avrt.dll--Vista and later!--for flagging the callback thread as "Pro Audio" (low latency). */
-static HMODULE libavrt = NULL;
-typedef HANDLE(WINAPI *pfnAvSetMmThreadCharacteristicsW)(LPCWSTR, LPDWORD);
-typedef BOOL(WINAPI *pfnAvRevertMmThreadCharacteristics)(HANDLE);
-static pfnAvSetMmThreadCharacteristicsW pAvSetMmThreadCharacteristicsW = NULL;
-static pfnAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL;
-
-/* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */
-static const IID SDL_IID_IAudioClient = { 0x1cb9ad4c, 0xdbfa, 0x4c32,{ 0xb1, 0x78, 0xc2, 0xf5, 0x68, 0xa7, 0x03, 0xb2 } };
-
-int
-WASAPI_PlatformInit(void)
-{
-    if (SDL_IMMDevice_Init() < 0) {
-        return -1; /* This is set by SDL_IMMDevice_Init */
-    }
-
-    libavrt = LoadLibrary(TEXT("avrt.dll"));  /* this library is available in Vista and later. No WinXP, so have to LoadLibrary to use it for now! */
-    if (libavrt) {
-        pAvSetMmThreadCharacteristicsW = (pfnAvSetMmThreadCharacteristicsW) GetProcAddress(libavrt, "AvSetMmThreadCharacteristicsW");
-        pAvRevertMmThreadCharacteristics = (pfnAvRevertMmThreadCharacteristics) GetProcAddress(libavrt, "AvRevertMmThreadCharacteristics");
-    }
-
-    return 0;
-}
-
-void
-WASAPI_PlatformDeinit(void)
-{
-    if (libavrt) {
-        FreeLibrary(libavrt);
-        libavrt = NULL;
-    }
-
-    pAvSetMmThreadCharacteristicsW = NULL;
-    pAvRevertMmThreadCharacteristics = NULL;
-
-    SDL_IMMDevice_Quit();
-}
-
-void
-WASAPI_PlatformThreadInit(_THIS)
-{
-    /* this thread uses COM. */
-    if (SUCCEEDED(WIN_CoInitialize())) {    /* can't report errors, hope it worked! */
-        this->hidden->coinitialized = SDL_TRUE;
-    }
-
-    /* Set this thread to very high "Pro Audio" priority. */
-    if (pAvSetMmThreadCharacteristicsW) {
-        DWORD idx = 0;
-        this->hidden->task = pAvSetMmThreadCharacteristicsW(L"Pro Audio", &idx);
-    }
-}
-
-void
-WASAPI_PlatformThreadDeinit(_THIS)
-{
-    /* Set this thread back to normal priority. */
-    if (this->hidden->task && pAvRevertMmThreadCharacteristics) {
-        pAvRevertMmThreadCharacteristics(this->hidden->task);
-        this->hidden->task = NULL;
-    }
-
-    if (this->hidden->coinitialized) {
-        WIN_CoUninitialize();
-        this->hidden->coinitialized = SDL_FALSE;
-    }
-}
-
-int
-WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery)
-{
-    IMMDevice *device = NULL;
-    HRESULT ret;
-
-    if (SDL_IMMDevice_Get(this->hidden->devid, &device, this->iscapture) < 0) {
-        this->hidden->client = NULL;
-        return -1; /* This is already set by SDL_IMMDevice_Get */
-    }
-
-    /* this is not async in standard win32, yay! */
-    ret = IMMDevice_Activate(device, &SDL_IID_IAudioClient, CLSCTX_ALL, NULL, (void **) &this->hidden->client);
-    IMMDevice_Release(device);
-
-    if (FAILED(ret)) {
-        SDL_assert(this->hidden->client == NULL);
-        return WIN_SetErrorFromHRESULT("WASAPI can't activate audio endpoint", ret);
-    }
-
-    SDL_assert(this->hidden->client != NULL);
-    if (WASAPI_PrepDevice(this, isrecovery) == -1) {   /* not async, fire it right away. */
-        return -1;
-    }
-
-    return 0;  /* good to go. */
-}
-
-void
-WASAPI_EnumerateEndpoints(void)
-{
-    SDL_IMMDevice_EnumerateEndpoints(SDL_FALSE);
-}
-
-int
-WASAPI_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture)
-{
-    return SDL_IMMDevice_GetDefaultAudioInfo(name, spec, iscapture);
-}
-
-void
-WASAPI_PlatformDeleteActivationHandler(void *handler)
-{
-    /* not asynchronous. */
-    SDL_assert(!"This function should have only been called on WinRT.");
-}
-
-#endif  /* SDL_AUDIO_DRIVER_WASAPI */
-
-/* vi: set ts=4 sw=4 expandtab: */
-