]> Repos - portaudio/commitdiff
wasapi:
authordmitrykos <dmitrykos@0f58301d-fd10-0410-b4af-bbb618454e57>
Tue, 9 Mar 2010 12:29:36 +0000 (12:29 +0000)
committerdmitrykos <dmitrykos@0f58301d-fd10-0410-b4af-bbb618454e57>
Tue, 9 Mar 2010 12:29:36 +0000 (12:29 +0000)
- fixed configure.in to compile WASAPI module under MSYS
- fixed include name cases for case-sensitive build environments
- defined LPCGUID for some MinGW compilers which are missing it
- fixed strict-aliasing rules break on line of getting device EndpointFormFactor in case '-Wstrict-aliasing' is specified or corresponding GCC optimization flag is used

configure.in
src/hostapi/wasapi/pa_win_wasapi.c

index 087ff712bad8c5d9622b88e9505ab900cc4f302a..79ebc6717edd4ae063f47a58644d83e88f453fcb 100644 (file)
@@ -38,16 +38,17 @@ AC_ARG_WITH(asihpi,
 
 AC_ARG_WITH(winapi,
             AS_HELP_STRING([--with-winapi],
-                           [Select Windows API support (@<:@wmme|directx|asio|wdmks@:>@@<:@,...@:>@) @<:@wmme@:>@]),
+                           [Select Windows API support (@<:@wmme|directx|asio|wasapi|wdmks@:>@@<:@,...@:>@) @<:@wmme@:>@]),
             [with_winapi=$withval], [with_winapi="wmme"])
 case "$target_os" in *mingw* | *cygwin*)
      with_wmme=no
      with_directx=no
      with_asio=no
+     with_wasapi=no
      with_wdmks=no
      for api in $(echo $with_winapi | sed 's/,/ /g'); do
          case "$api" in
-             wmme|directx|asio|wdmks)
+             wmme|directx|asio|wasapi|wdmks)
                  eval with_$api=yes
                  ;;
              *)
@@ -222,7 +223,7 @@ case "${host_os}" in
         PADLL="portaudio.dll"
         THREAD_CFLAGS="-mthreads"
         SHARED_FLAGS="-shared"
-        CFLAGS="$CFLAGS -I\$(top_srcdir)/include -DPA_NO_WMME -DPA_NO_ASIO -DPA_NO_WDMKS -DPA_NO_DS"
+        CFLAGS="$CFLAGS -I\$(top_srcdir)/include -DPA_NO_WMME -DPA_NO_ASIO -DPA_NO_WDMKS -DPA_NO_DS -DPA_NO_WASAPI"
 
         if [[ "x$with_directx" = "xyes" ]]; then
             DXDIR="$with_dxdir"
@@ -259,6 +260,13 @@ case "${host_os}" in
             DLL_LIBS="${DLL_LIBS} -lwinmm"
             CFLAGS="$CFLAGS -I\$(top_srcdir)/src/common -UPA_NO_WMME"
         fi
+
+        if [[ "x$with_wasapi" = "xyes" ]]; then
+            add_objects src/hostapi/wasapi/pa_win_wasapi.o src/os/win/pa_win_hostapis.o src/os/win/pa_win_util.o src/os/win/pa_win_waveformat.o
+            LIBS="-lwinmm -lm -lole32 -luuid"
+            DLL_LIBS="${DLL_LIBS} -lwinmm"
+            CFLAGS="$CFLAGS -I\$(top_srcdir)/src/common -I\$(top_srcdir)/src/hostapi/wasapi/mingw-include -UPA_NO_WASAPI"
+        fi
         ;;
 
   cygwin* )
@@ -396,11 +404,13 @@ case "$target_os" in
         test "x$with_directx" = "xyes" && with_directx="$with_directx (${with_dxdir})"
         test "x$with_wdmks" = "xyes" && with_wdmks="$with_wdmks (${with_dxdir})"
         test "x$with_asio" = "xyes" && with_asio="$with_asio (${with_asiodir})"
+        test "x$with_wasapi" = "xyes"
         AC_MSG_RESULT([
   WMME ........................ $with_wmme
   DSound ...................... $with_directx
-  WDMKS ....................... $with_wdmks
   ASIO ........................ $with_asio
+  WASAPI ...................... $with_wasapi
+  WDMKS ....................... $with_wdmks
 ])
         ;;
     *darwin*)
index 85d093253dd453074545faf88ecd8c56087e90b9..690aa5502d1aa9685708b67a36f8aa098a43cfed 100644 (file)
@@ -51,8 +51,8 @@
 #if _MSC_VER >= 1400\r
        #include <Avrt.h>\r
        #define COBJMACROS\r
-       #include <audioclient.h>\r
-       #include <Endpointvolume.h>\r
+       #include <Audioclient.h>\r
+       #include <endpointvolume.h>\r
        #define INITGUID //<< avoid additional linkage of static libs, uneeded code will be optimized out\r
        #include <mmdeviceapi.h>\r
        #include <functiondiscoverykeys.h>\r
     #include <rpcsal.h>\r
     #include <sal.h>\r
 \r
+       #ifndef __LPCGUID_DEFINED__\r
+               #define __LPCGUID_DEFINED__\r
+               typedef const GUID *LPCGUID;\r
+       #endif\r
+\r
     #ifndef PROPERTYKEY_DEFINED\r
         #define PROPERTYKEY_DEFINED\r
         typedef struct _tagpropertykey\r
     #include <propkeydef.h>\r
     #define COBJMACROS\r
     #define INITGUID\r
-    #include <audioclient.h>\r
+    #include <Audioclient.h>\r
     #include <mmdeviceapi.h>\r
-    #include <Endpointvolume.h>\r
+    #include <endpointvolume.h>\r
     #include <functiondiscoverykeys.h>\r
     #undef INITGUID\r
 \r
@@ -1030,9 +1035,12 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
                     IF_FAILED_JUMP(hResult, error);\r
                                        // set\r
                                        #if defined(DUMMYUNIONNAME) && defined(NONAMELESSUNION)\r
-                                       paWasapi->devInfo[i].formFactor = (EndpointFormFactor)(*((UINT *)(((WORD *)&value.wReserved3)+1)));\r
+                                               // avoid breaking strict-aliasing rules in such line: (EndpointFormFactor)(*((UINT *)(((WORD *)&value.wReserved3)+1)));\r
+                                               UINT v;\r
+                                               memcpy(&v, (((WORD *)&value.wReserved3)+1), sizeof(v));\r
+                                               paWasapi->devInfo[i].formFactor = (EndpointFormFactor)v;\r
                                        #else\r
-                                       paWasapi->devInfo[i].formFactor = (EndpointFormFactor)value.uintVal;\r
+                                               paWasapi->devInfo[i].formFactor = (EndpointFormFactor)value.uintVal;\r
                                        #endif\r
                                        PA_DEBUG(("WASAPI: device[%s] form-factor: %d\n", deviceInfo->name, paWasapi->devInfo[i].formFactor));\r
                     // cleanup\r