WinRT: got the XAudio2 backend compiling (but not running, yet)
authorDavid Ludwig <dludwig@pobox.com>
Thu, 22 Nov 2012 22:34:50 -0500
changeset 8353 82447809a27e
parent 8352 deef25f5fce1
child 8354 c086e9e73916
WinRT: got the XAudio2 backend compiling (but not running, yet)
VisualC/SDL/SDL_VS2012_WinRT.vcxproj
include/SDL_config_windowsrt.h
src/audio/xaudio2/SDL_xaudio2.c
src/audio/xaudio2/SDL_xaudio2_winrthelpers.cpp
src/audio/xaudio2/SDL_xaudio2_winrthelpers.h
src/core/windows/SDL_windows.h
--- a/VisualC/SDL/SDL_VS2012_WinRT.vcxproj	Thu Nov 22 13:11:05 2012 -0500
+++ b/VisualC/SDL/SDL_VS2012_WinRT.vcxproj	Thu Nov 22 22:34:50 2012 -0500
@@ -37,6 +37,22 @@
     <ClCompile Include="..\..\src\audio\SDL_audiotypecvt.c" />
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
+    <ClCompile Include="..\..\src\audio\xaudio2\SDL_xaudio2.c">
+      <CompileAs Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">CompileAsCpp</CompileAs>
+      <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">CompileAsCpp</CompileAs>
+      <CompileAs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">CompileAsCpp</CompileAs>
+      <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">CompileAsCpp</CompileAs>
+      <CompileAs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">CompileAsCpp</CompileAs>
+      <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">CompileAsCpp</CompileAs>
+    </ClCompile>
+    <ClCompile Include="..\..\src\audio\xaudio2\SDL_xaudio2_winrthelpers.cpp">
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</CompileAsWinRT>
+    </ClCompile>
     <ClCompile Include="..\..\src\cpuinfo\SDL_cpuinfo.c" />
     <ClCompile Include="..\..\src\events\SDL_clipboardevents.c" />
     <ClCompile Include="..\..\src\events\SDL_dropevents.c" />
@@ -206,6 +222,8 @@
     <ClInclude Include="..\..\src\audio\SDL_audio_c.h" />
     <ClInclude Include="..\..\src\audio\SDL_sysaudio.h" />
     <ClInclude Include="..\..\src\audio\SDL_wave.h" />
+    <ClInclude Include="..\..\src\audio\xaudio2\SDL_xaudio2_winrthelpers.h" />
+    <ClInclude Include="..\..\src\core\windows\SDL_windows.h" />
     <ClInclude Include="..\..\src\events\blank_cursor.h" />
     <ClInclude Include="..\..\src\events\default_cursor.h" />
     <ClInclude Include="..\..\src\events\SDL_clipboardevents_c.h" />
@@ -384,7 +402,7 @@
       <SubSystem>Console</SubSystem>
       <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
       <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
-      <AdditionalDependencies>d2d1.lib; d3d11.lib; dxgi.lib; ole32.lib; windowscodecs.lib; dwrite.lib; kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>xaudio2.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -398,7 +416,7 @@
       <SubSystem>Console</SubSystem>
       <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
       <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
-      <AdditionalDependencies>d2d1.lib; d3d11.lib; dxgi.lib; ole32.lib; windowscodecs.lib; dwrite.lib; kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>xaudio2.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|arm'">
@@ -412,7 +430,7 @@
       <SubSystem>Console</SubSystem>
       <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
       <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
-      <AdditionalDependencies>d2d1.lib; d3d11.lib; dxgi.lib; ole32.lib; windowscodecs.lib; dwrite.lib; kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>xaudio2.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|arm'">
@@ -426,7 +444,7 @@
       <SubSystem>Console</SubSystem>
       <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
       <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
-      <AdditionalDependencies>d2d1.lib; d3d11.lib; dxgi.lib; ole32.lib; windowscodecs.lib; dwrite.lib; kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>xaudio2.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -440,7 +458,7 @@
       <SubSystem>Console</SubSystem>
       <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
       <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
-      <AdditionalDependencies>d2d1.lib; d3d11.lib; dxgi.lib; ole32.lib; windowscodecs.lib; dwrite.lib; kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>xaudio2.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -454,7 +472,7 @@
       <SubSystem>Console</SubSystem>
       <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
       <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
-      <AdditionalDependencies>d2d1.lib; d3d11.lib; dxgi.lib; ole32.lib; windowscodecs.lib; dwrite.lib; kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>xaudio2.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
--- a/include/SDL_config_windowsrt.h	Thu Nov 22 13:11:05 2012 -0500
+++ b/include/SDL_config_windowsrt.h	Thu Nov 22 22:34:50 2012 -0500
@@ -144,7 +144,7 @@
 #endif
 
 /* Enable various audio drivers */
-//#define SDL_AUDIO_DRIVER_XAUDIO2	1	// TODO, WinRT: see if SDL's XAudio2 driver can compile
+#define SDL_AUDIO_DRIVER_XAUDIO2	1
 #define SDL_AUDIO_DRIVER_DISK	1
 #define SDL_AUDIO_DRIVER_DUMMY	1
 
--- a/src/audio/xaudio2/SDL_xaudio2.c	Thu Nov 22 13:11:05 2012 -0500
+++ b/src/audio/xaudio2/SDL_xaudio2.c	Thu Nov 22 22:34:50 2012 -0500
@@ -18,22 +18,90 @@
      misrepresented as being the original software.
   3. This notice may not be removed or altered from any source distribution.
 */
+
+/* WinRT NOTICE:
+
+   A number of changes were warranted to SDL's XAudio2 backend in order to
+   get it compiling for Windows RT.
+
+   When compiling for WinRT, XAudio2.h requires that it be compiled in a C++
+   file, and not a straight C file.  Trying to compile it as C leads to lots
+   of errors, at least with MSVC 2012 and Windows SDK 8.0, as of Nov 22, 2012.
+   To address this specific issue, a few changes were made to SDL_xaudio2.c:
+   
+   1. SDL_xaudio2.c is compiled as a C++ file in WinRT builds.  Exported
+      symbols, namely XAUDIO2_bootstrap, uses 'extern "C"' to make sure the
+      rest of SDL can access it.  Non-WinRT builds continue to compile
+      SDL_xaudio2.c as a C file.
+   2. A macro redefines variables named 'this' to '_this', to prevent compiler
+      errors (C2355 in Visual C++) related to 'this' being a reserverd keyword.
+      This hack may need to be altered in the future, particularly if C++'s
+      'this' keyword needs to be used (within SDL_xaudio2.c).  At the time
+      WinRT support was initially added to SDL's XAudio2 backend, this
+      capability was not needed.
+   3. The C-style macros to invoke XAudio2's COM-based methods were
+      rewritten to be C++-friendly.  These are provided in the file,
+      SDL_xaudio2_winrthelpers.h.
+   4. IXAudio2::CreateSourceVoice, when used in C++, requires its callbacks to
+      be specified via a C++ class.  SDL's XAudio2 backend was written with
+      C-style callbacks.  A class to bridge these two interfaces,
+      SDL_XAudio2VoiceCallback, was written to make XAudio2 happy.  Its methods
+      just call SDL's existing, C-style callbacks.
+   5. Multiple checks for the __cplusplus macro were made, in appropriate
+      places.  
+
+
+   A few additional changes to SDL's XAudio2 backend were warranted by API
+   changes to Windows.  Many, but not all of these are documented by Microsoft
+   at:
+   http://blogs.msdn.com/b/chuckw/archive/2012/04/02/xaudio2-and-windows-8-consumer-preview.aspx
+
+   1. Windows' thread synchronization function, CreateSemaphore, was removed
+      from Windows RT.  SDL's semaphore API was substituted instead.
+   2. The method calls, IXAudio2::GetDeviceCount and IXAudio2::GetDeviceDetails
+      were removed from the XAudio2 API.  Microsoft is telling developers to
+      use APIs in Windows::Foundation instead.
+      For SDL, the missing methods were reimplemented using the APIs Microsoft
+      said to use.
+   3. CoInitialize and CoUninitialize are not available in Windows RT.
+      These calls were removed, as COM will have been initialized earlier,
+      at least by the call to the WinRT app's main function
+      (aka 'int main(Platform::Array<Platform::String^>^)).  (DLudwig:
+      This was my understanding of how WinRT: the 'main' function uses
+      a tag of [MTAThread], which should initialize COM.  My understanding
+      of COM is somewhat limited, and I may be incorrect here.)
+   4. IXAudio2::CreateMasteringVoice changed its integer-based 'DeviceIndex'
+      argument to a string-based one, 'szDeviceId'.  In Windows RT, the
+      string-based argument will be used.
+*/
+
 #include "SDL_config.h"
 
 #if SDL_AUDIO_DRIVER_XAUDIO2
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 #include "../../core/windows/SDL_windows.h"
 #include "SDL_audio.h"
 #include "../SDL_audio_c.h"
 #include "../SDL_sysaudio.h"
 #include "SDL_assert.h"
+#ifdef __cplusplus
+}
+#endif
 
+#if defined(__WINRT__)
+#  define SDL_XAUDIO2_HAS_SDK 1
+#endif
+#if defined(__WIN32__)
 #include <dxsdkver.h> /* XAudio2 exists as of the March 2008 DirectX SDK */
 #if (!defined(_DXSDK_BUILD_MAJOR) || (_DXSDK_BUILD_MAJOR < 1284))
 #  pragma message("Your DirectX SDK is too old. Disabling XAudio2 support.")
 #else
 #  define SDL_XAUDIO2_HAS_SDK 1
 #endif
+#endif
 
 #ifdef SDL_XAUDIO2_HAS_SDK
 
@@ -43,12 +111,17 @@
 /* Hidden "this" pointer for the audio functions */
 #define _THIS	SDL_AudioDevice *this
 
+#ifdef __cplusplus
+#define this _this
+#include "SDL_xaudio2_winrthelpers.h"
+#endif
+
 struct SDL_PrivateAudioData
 {
     IXAudio2 *ixa2;
     IXAudio2SourceVoice *source;
     IXAudio2MasteringVoice *mastering;
-    HANDLE semaphore;
+    SDL_sem * semaphore;
     Uint8 *mixbuf;
     int mixlen;
     Uint8 *nextbuf;
@@ -102,7 +175,7 @@
 {
     /* Just signal the SDL audio thread and get out of XAudio2's way. */
     SDL_AudioDevice *this = (SDL_AudioDevice *) data;
-    ReleaseSemaphore(this->hidden->semaphore, 1, NULL);
+    SDL_SemPost(this->hidden->semaphore);
 }
 
 static void STDMETHODCALLTYPE
@@ -119,6 +192,33 @@
 static void STDMETHODCALLTYPE VoiceCBOnBufferStart(THIS_ void *data) {}
 static void STDMETHODCALLTYPE VoiceCBOnLoopEnd(THIS_ void *data) {}
 
+#if defined(__cplusplus)
+class SDL_XAudio2VoiceCallback : public IXAudio2VoiceCallback
+{
+public:
+    STDMETHOD_(void, OnBufferEnd)(void *pBufferContext) {
+        VoiceCBOnBufferEnd(pBufferContext);
+    }
+    STDMETHOD_(void, OnBufferStart)(void *pBufferContext) {
+        VoiceCBOnBufferEnd(pBufferContext);
+    }
+    STDMETHOD_(void, OnLoopEnd)(void *pBufferContext) {
+        VoiceCBOnLoopEnd(pBufferContext);
+    }
+    STDMETHOD_(void, OnStreamEnd)() {
+        VoiceCBOnStreamEnd();
+    }
+    STDMETHOD_(void, OnVoiceError)(void *pBufferContext, HRESULT Error) {
+        VoiceCBOnVoiceError(pBufferContext, Error);
+    }
+    STDMETHOD_(void, OnVoiceProcessingPassEnd)() {
+        VoiceCBOnVoiceProcessPassEnd();
+    }
+    STDMETHOD_(void, OnVoiceProcessingPassStart)(UINT32 BytesRequired) {
+        VoiceCBOnVoiceProcessPassStart(BytesRequired);
+    }
+};
+#endif
 
 static Uint8 *
 XAUDIO2_GetDeviceBuf(_THIS)
@@ -168,7 +268,7 @@
 XAUDIO2_WaitDevice(_THIS)
 {
     if (this->enabled) {
-        WaitForSingleObject(this->hidden->semaphore, INFINITE);
+        SDL_SemWait(this->hidden->semaphore);
     }
 }
 
@@ -181,7 +281,7 @@
     IXAudio2SourceVoice_Discontinuity(source);
     IXAudio2SourceVoice_GetState(source, &state);
     while (state.BuffersQueued > 0) {
-        WaitForSingleObject(this->hidden->semaphore, INFINITE);
+        SDL_SemWait(this->hidden->semaphore);
         IXAudio2SourceVoice_GetState(source, &state);
     }
 }
@@ -230,8 +330,15 @@
     SDL_AudioFormat test_format = SDL_FirstAudioFormat(this->spec.format);
     IXAudio2 *ixa2 = NULL;
     IXAudio2SourceVoice *source = NULL;
+#if defined(__WINRT__)
+    WCHAR devId[256];
+#else
     UINT32 devId = 0;  /* 0 == system default device. */
+#endif
 
+#if defined(__cplusplus)
+    static SDL_XAudio2VoiceCallback callbacks;
+#else
 	static IXAudio2VoiceCallbackVtbl callbacks_vtable = {
 	    VoiceCBOnVoiceProcessPassStart,
         VoiceCBOnVoiceProcessPassEnd,
@@ -243,6 +350,11 @@
 	};
 
 	static IXAudio2VoiceCallback callbacks = { &callbacks_vtable };
+#endif // ! defined(__cplusplus)
+
+#if defined(__WINRT__)
+    SDL_zero(devId);
+#endif
 
     if (iscapture) {
         SDL_SetError("XAudio2: capture devices unsupported.");
@@ -269,7 +381,11 @@
                     const int match = (SDL_strcmp(str, devname) == 0);
                     SDL_free(str);
                     if (match) {
+#if defined(__WINRT__)
+                        wcsncpy_s(devId, ARRAYSIZE(devId), details.DeviceID, _TRUNCATE);
+#else
                         devId = i;
+#endif
                         break;
                     }
                 }
@@ -294,7 +410,7 @@
     SDL_memset(this->hidden, 0, (sizeof *this->hidden));
 
     this->hidden->ixa2 = ixa2;
-    this->hidden->semaphore = CreateSemaphore(NULL, 1, 2, NULL);
+    this->hidden->semaphore = SDL_CreateSemaphore(1);
     if (this->hidden->semaphore == NULL) {
         XAUDIO2_CloseDevice(this);
         SDL_SetError("XAudio2: CreateSemaphore() failed!");
@@ -395,7 +511,9 @@
 static void
 XAUDIO2_Deinitialize(void)
 {
+#if defined(__WIN32__)
     WIN_CoUninitialize();
+#endif
 }
 
 #endif  /* SDL_XAUDIO2_HAS_SDK */
@@ -410,13 +528,17 @@
 #else
     /* XAudio2Create() is a macro that uses COM; we don't load the .dll */
     IXAudio2 *ixa2 = NULL;
+#if defined(__WIN32__)
     if (FAILED(WIN_CoInitialize())) {
         SDL_SetError("XAudio2: CoInitialize() failed");
         return 0;
     }
+#endif
 
     if (XAudio2Create(&ixa2, 0, XAUDIO2_DEFAULT_PROCESSOR) != S_OK) {
+#if defined(__WIN32__)
         WIN_CoUninitialize();
+#endif
         SDL_SetError("XAudio2: XAudio2Create() failed");
         return 0;  /* not available. */
     }
@@ -436,6 +558,9 @@
 #endif
 }
 
+#if defined(__cplusplus)
+extern "C"
+#endif
 AudioBootStrap XAUDIO2_bootstrap = {
     "xaudio2", "XAudio2", XAUDIO2_Init, 0
 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/audio/xaudio2/SDL_xaudio2_winrthelpers.cpp	Thu Nov 22 22:34:50 2012 -0500
@@ -0,0 +1,41 @@
+
+#include <xaudio2.h>
+#include "SDL_xaudio2_winrthelpers.h"
+
+using Windows::Devices::Enumeration::DeviceClass;
+using Windows::Devices::Enumeration::DeviceInformation;
+using Windows::Devices::Enumeration::DeviceInformationCollection;
+
+HRESULT IXAudio2_GetDeviceCount(IXAudio2 * ixa2, UINT32 * devcount)
+{
+    auto operation = DeviceInformation::FindAllAsync(DeviceClass::AudioRender);
+    while (operation->Status != Windows::Foundation::AsyncStatus::Completed)
+    {
+    }
+ 
+    DeviceInformationCollection^ devices = operation->GetResults();
+    *devcount = devices->Size;
+    return S_OK;
+}
+
+HRESULT IXAudio2_GetDeviceDetails(IXAudio2 * unused, UINT32 index, XAUDIO2_DEVICE_DETAILS * details)
+{
+    auto operation = DeviceInformation::FindAllAsync(DeviceClass::AudioRender);
+    while (operation->Status != Windows::Foundation::AsyncStatus::Completed)
+    {
+    }
+ 
+    DeviceInformationCollection^ devices = operation->GetResults();
+    if (index >= devices->Size)
+    {
+        return XAUDIO2_E_INVALID_CALL;
+    }
+
+    DeviceInformation^ d = devices->GetAt(index);
+    if (details)
+    {
+        wcsncpy_s(details->DeviceID, ARRAYSIZE(details->DeviceID), d->Id->Data(), _TRUNCATE);
+        wcsncpy_s(details->DisplayName, ARRAYSIZE(details->DisplayName), d->Name->Data(), _TRUNCATE);
+    }
+    return S_OK;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/audio/xaudio2/SDL_xaudio2_winrthelpers.h	Thu Nov 22 22:34:50 2012 -0500
@@ -0,0 +1,40 @@
+
+#pragma once
+
+//
+// Re-implementation of methods removed from XAudio2 (in Windows RT):
+//
+
+typedef struct XAUDIO2_DEVICE_DETAILS
+{
+    WCHAR DeviceID[256];
+    WCHAR DisplayName[256];
+    /* Other fields exist in the pre-Windows 8 version of this struct, however
+       they weren't used by SDL, so they weren't added.
+    */
+} XAUDIO2_DEVICE_DETAILS;
+
+HRESULT IXAudio2_GetDeviceCount(IXAudio2 * unused, UINT32 * devcount);
+HRESULT IXAudio2_GetDeviceDetails(IXAudio2 * unused, UINT32 index, XAUDIO2_DEVICE_DETAILS * details);
+
+
+//
+// C-style macros to call XAudio2's methods in C++:
+//
+
+#define IXAudio2_CreateMasteringVoice(A, B, C, D, E, F, G) (A)->CreateMasteringVoice((B), (C), (D), (E), (F), (G))
+#define IXAudio2_CreateSourceVoice(A, B, C, D, E, F, G, H) (A)->CreateSourceVoice((B), (C), (D), (E), (F), (G), (H))
+#define IXAudio2_QueryInterface(A, B, C) (A)->QueryInterface((B), (C))
+#define IXAudio2_Release(A) (A)->Release()
+#define IXAudio2_StartEngine(A) (A)->StartEngine()
+#define IXAudio2_StopEngine(A) (A)->StopEngine()
+
+#define IXAudio2MasteringVoice_DestroyVoice(A) (A)->DestroyVoice()
+
+#define IXAudio2SourceVoice_DestroyVoice(A) (A)->DestroyVoice()
+#define IXAudio2SourceVoice_Discontinuity(A) (A)->Discontinuity()
+#define IXAudio2SourceVoice_FlushSourceBuffers(A) (A)->FlushSourceBuffers()
+#define IXAudio2SourceVoice_GetState(A, B) (A)->GetState((B))
+#define IXAudio2SourceVoice_Start(A, B, C) (A)->Start((B), (C))
+#define IXAudio2SourceVoice_Stop(A, B, C) (A)->Stop((B), (C))
+#define IXAudio2SourceVoice_SubmitSourceBuffer(A, B, C) (A)->SubmitSourceBuffer((B), (C))
--- a/src/core/windows/SDL_windows.h	Thu Nov 22 13:11:05 2012 -0500
+++ b/src/core/windows/SDL_windows.h	Thu Nov 22 22:34:50 2012 -0500
@@ -24,6 +24,7 @@
 #ifndef _INCLUDED_WINDOWS_H
 #define _INCLUDED_WINDOWS_H
 
+#if defined(__WIN32__)
 #define WIN32_LEAN_AND_MEAN
 #define STRICT
 #ifndef UNICODE
@@ -31,6 +32,7 @@
 #endif
 #undef _WIN32_WINNT
 #define _WIN32_WINNT  0x501   /* Need 0x410 for AlphaBlend() and 0x500 for EnumDisplayDevices(), 0x501 for raw input */
+#endif
 
 #include <windows.h>