From a552636034dc325ee335b65208e70f1731111335 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 18 Nov 2018 16:03:58 +0000 Subject: [PATCH 1/5] cmakelists-install.patch report --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b1832f..b36f31d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -417,6 +417,8 @@ IF(WIN32 AND MSVC) SET_TARGET_PROPERTIES(portaudio_static PROPERTIES OUTPUT_NAME portaudio) ENDIF() ENDIF() + INSTALL(FILES ${PA_PUBLIC_INCLUDES} DESTINATION include) + INSTALL(TARGETS portaudio portaudio_static RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib) ELSE() IF(APPLE AND CMAKE_VERSION VERSION_GREATER 3.4.2) OPTION(PA_OUTPUT_OSX_FRAMEWORK "Generate an OS X framework instead of the simple library" OFF) From 9505c2e3a5013f96a658944ce10afc78ff3f4979 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 18 Nov 2018 16:10:58 +0000 Subject: [PATCH 2/5] Report find_dsound.patch --- cmake_support/FindDXSDK.cmake | 67 +++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/cmake_support/FindDXSDK.cmake b/cmake_support/FindDXSDK.cmake index e487537..2043c95 100644 --- a/cmake_support/FindDXSDK.cmake +++ b/cmake_support/FindDXSDK.cmake @@ -24,7 +24,29 @@ else(WIN32) message(FATAL_ERROR "FindDXSDK.cmake: Unsupported platform ${CMAKE_SYSTEM_NAME}" ) endif(WIN32) -if(MSVC) +# Dsound.lib is statically linked (i.e. dsound.dll not required) and DXSDK_LIBRARY_DIR not used. +# In the environments supported by VCPKG we may as well avoid looking out for DX9 to avoid version +# mismatch in find. + +if(MSVC AND MSVC_VERSION GREATER_EQUAL 1900) + + # if the environment is set up properly, matching lib and header will be found + + find_path(DXSDK_INCLUDE_DIR + dsound.h + ) + find_library(DXSDK_DSOUND_LIBRARY + dsound.lib + ) + + INCLUDE(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(DXSDK DEFAULT_MSG DXSDK_INCLUDE_DIR DXSDK_DSOUND_LIBRARY) + + MARK_AS_ADVANCED( + DXSDK_INCLUDE_DIR DXSDK_DSOUND_LIBRARY + ) + +else() find_path(DXSDK_ROOT_DIR include/dxsdkver.h @@ -34,28 +56,28 @@ if(MSVC) find_path(DXSDK_INCLUDE_DIR dxsdkver.h - PATHS + HINTS ${DXSDK_ROOT_DIR}/include ) IF(CMAKE_CL_64) - find_path(DXSDK_LIBRARY_DIR + find_path(DXSDK_LIBRARY_DIR dsound.lib - PATHS - ${DXSDK_ROOT_DIR}/lib/x64 + HINTS + ${DXSDK_ROOT_DIR}/lib/x64 ) ELSE(CMAKE_CL_64) - find_path(DXSDK_LIBRARY_DIR + find_path(DXSDK_LIBRARY_DIR dsound.lib - PATHS - ${DXSDK_ROOT_DIR}/lib/x86 + HINTS + ${DXSDK_ROOT_DIR}/lib/x86 ) ENDIF(CMAKE_CL_64) find_library(DXSDK_DSOUND_LIBRARY dsound.lib - PATHS - ${DXSDK_LIBRARY_DIR} + HINTS + ${DXSDK_LIBRARY_DIR} ) # handle the QUIETLY and REQUIRED arguments and set DXSDK_FOUND to TRUE if @@ -63,26 +85,9 @@ if(MSVC) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(DXSDK DEFAULT_MSG DXSDK_ROOT_DIR DXSDK_INCLUDE_DIR) -ELSEIF(MINGW) - - GET_FILENAME_COMPONENT(MINGW_BIN_DIR ${CMAKE_C_COMPILER} DIRECTORY) - GET_FILENAME_COMPONENT(MINGW_SYSROOT ${MINGW_BIN_DIR} DIRECTORY) - # The glob expression below should only return a single folder: - FILE(GLOB MINGW_TOOLCHAIN_FOLDER ${MINGW_SYSROOT}/*mingw32) - - find_library(DXSDK_DSOUND_LIBRARY - libdsound.a dsound - HINTS - "${MINGW_TOOLCHAIN_FOLDER}/lib" - "${MINGW_SYSROOT}/lib" + MARK_AS_ADVANCED( + DXSDK_ROOT_DIR DXSDK_INCLUDE_DIR + DXSDK_LIBRARY_DIR DXSDK_DSOUND_LIBRARY ) - INCLUDE(FindPackageHandleStandardArgs) - FIND_PACKAGE_HANDLE_STANDARD_ARGS(DXSDK DEFAULT_MSG DXSDK_DSOUND_LIBRARY) - -ENDIF(MSVC) - -MARK_AS_ADVANCED( - DXSDK_ROOT_DIR DXSDK_INCLUDE_DIR - DXSDK_LIBRARY_DIR DXSDK_DSOUND_LIBRARY -) +endif() From e0b9ce6f48d7caf9f1c5abbcdb08a034e39ed1ae Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 18 Nov 2018 16:06:19 +0000 Subject: [PATCH 3/5] crt_linkage_build_config.patch report --- CMakeLists.txt | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b36f31d..142fc0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,40 +6,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -# Check if the user is building PortAudio stand-alone or as part of a larger -# project. If this is part of a larger project (i.e. the CMakeLists.txt has -# been imported by some other CMakeLists.txt), we don't want to trump over -# the top of that project's global settings. -IF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_LIST_DIR}) - PROJECT(portaudio) - - # CMAKE_CONFIGURATION_TYPES only exists for multi-config generators (like - # Visual Studio or Xcode). For these projects, we won't define - # CMAKE_BUILD_TYPE as it does not make sense. - IF(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - MESSAGE(STATUS "Setting CMAKE_BUILD_TYPE type to 'Debug' as none was specified.") - SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE) - SET_PROPERTY(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release") - ENDIF() - - SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) - - IF(WIN32 AND MSVC) - OPTION(PA_DLL_LINK_WITH_STATIC_RUNTIME "Link with static runtime libraries (minimizes runtime dependencies)" ON) - IF(PA_DLL_LINK_WITH_STATIC_RUNTIME) - FOREACH(flag_var - CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) - IF(${flag_var} MATCHES "/MD") - STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") - ENDIF() - ENDFOREACH() - ENDIF() - ENDIF() -ENDIF() - SET(PA_VERSION 19) SET(PA_PKGCONFIG_VERSION ${PA_VERSION}) SET(PA_SOVERSION "${PA_VERSION}.0") From 0bb476d8dc1a536484b0a7ea647f365ab5332bfe Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 18 Nov 2018 16:13:07 +0000 Subject: [PATCH 4/5] Report pa_win_waveformat.patch --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 142fc0a..7503510 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,7 +181,7 @@ IF(WIN32) IF(PA_USE_WASAPI) SET(PA_WASAPI_SOURCES src/hostapi/wasapi/pa_win_wasapi.c) SOURCE_GROUP("hostapi\\wasapi" FILES ${PA_WASAPI_SOURCES}) - SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_win_wasapi.h) + SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_win_wasapi.h include/pa_win_waveformat.h) SET(PA_SOURCES ${PA_SOURCES} ${PA_WASAPI_SOURCES}) SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ole32 uuid) ELSE() From 1f5429ee433c5a379ed96256f21f288e163a9a38 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Mon, 19 Nov 2018 22:21:47 +0000 Subject: [PATCH 5/5] Use GetMixFormat() instead of PKEY_AudioEngine_DeviceFormat. See #286 for rationale. --- src/hostapi/wasapi/pa_win_wasapi.c | 31 +++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 0daa221..7c3a9e9 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -1790,19 +1790,6 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA PA_DEBUG(("WASAPI:%d| name[%s]\n", i, deviceInfo->name)); } - // Default format - { - PROPVARIANT value; - PropVariantInit(&value); - hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEngine_DeviceFormat, &value); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - memcpy(&paWasapi->devInfo[i].DefaultFormat, value.blob.pBlobData, min(sizeof(paWasapi->devInfo[i].DefaultFormat), value.blob.cbSize)); - // cleanup - PropVariantClear(&value); - } - // Formfactor { PROPVARIANT value; @@ -1855,6 +1842,24 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA // [IF_FAILED_JUMP(hResult, error);] IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // Get the default format. + // + // Note: this is using IAudioClient::GetMixFormat(), not + // PKEY_AudioEngine_DeviceFormat, because the latter has been shown to + // be unreliable - see: + // https://app.assembla.com/spaces/portaudio/tickets/286 + // The downside of using GetMixFormat() is that the sample type reported + // by PaWasapi_GetDeviceDefaultFormat() will always be 32-bit float. + // That seems fine since PortAudio will automatically do any required + // conversions. + WAVEFORMATEXTENSIBLE *format; + hr = IAudioClient_GetMixFormat(tmpClient, &format); + if (SUCCEEDED(hr)) + { + memcpy(&paWasapi->devInfo[i].DefaultFormat, format, sizeof(*format)); + CoTaskMemFree(format); + } + // Get latency hr = IAudioClient_GetDevicePeriod(tmpClient, &paWasapi->devInfo[i].DefaultDevicePeriod,