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
;;
*)
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"
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* )
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*)
#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
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