From 97dfbf565cdb526fe5072f2c8e1109918213d327 Mon Sep 17 00:00:00 2001 From: Graham Bloice Date: Sun, 26 Apr 2015 14:22:05 +0100 Subject: [PATCH] Add PortAudio to Windows CMake build Change-Id: I774ff0bf858280f2a5aa551ae1a5e23eedf8dc20 Reviewed-on: https://code.wireshark.org/review/8848 Reviewed-by: Graham Bloice --- cmake/modules/FindPORTAUDIO.cmake | 54 ++++++++++++++++++++++--------- ui/gtk/CMakeLists.txt | 50 ++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 15 deletions(-) diff --git a/cmake/modules/FindPORTAUDIO.cmake b/cmake/modules/FindPORTAUDIO.cmake index d8a0d351d2..a8676b8202 100644 --- a/cmake/modules/FindPORTAUDIO.cmake +++ b/cmake/modules/FindPORTAUDIO.cmake @@ -5,6 +5,10 @@ # PORTAUDIO_INCLUDE_DIRS - where to find portaudio.h, etc. # PORTAUDIO_LIBRARIES - List of libraries when using portaudio. # PORTAUDIO_FOUND - True if portaudio found. +# +# For Windows, Portaudio is just a set of headers, there is no library +# we build an archive ourselves +# So set PORTAUDIO_SRC_DIR and PORT_AUDIO_INCLUDE_DIRS IF (PORTAUDIO_INCLUDE_DIRS) @@ -31,30 +35,50 @@ FIND_LIBRARY(PORTAUDIO_LIBRARY NAMES ${PORTAUDIO_NAMES} # handle the QUIETLY and REQUIRED arguments and set PORTAUDIO_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(PORTAUDIO DEFAULT_MSG PORTAUDIO_LIBRARY PORTAUDIO_INCLUDE_DIR) +IF(WIN32) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(PORTAUDIO DEFAULT_MSG PORTAUDIO_INCLUDE_DIR) +ELSE(WIN32) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(PORTAUDIO DEFAULT_MSG PORTAUDIO_LIBRARY PORTAUDIO_INCLUDE_DIR) +ENDIF(WIN32) IF(PORTAUDIO_FOUND) - SET( PORTAUDIO_LIBRARIES ${PORTAUDIO_LIBRARY} ) + IF(WIN32) + SET( PORTAUDIO_LIBRARIES "" ) + SET( PORTAUDIO_SRC_DIR "${PORTAUDIO_HINTS}/src" ) + SET( PORTAUDIO_INCLUDE_DIR + ${PORTAUDIO_INCLUDE_DIR} + ${PORTAUDIO_SRC_DIR}/common + ${PORTAUDIO_SRC_DIR}/os/win + ) + ELSE(WIN32) + SET( PORTAUDIO_LIBRARIES ${PORTAUDIO_LIBRARY} ) + ENDIF(WIN32) SET( PORTAUDIO_INCLUDE_DIRS ${PORTAUDIO_INCLUDE_DIR} ) # Check for newer PortAudio V19 API # http://www.portaudio.com/docs/proposals/018-VersionInformationInterface.html - INCLUDE(CheckFunctionExists) - SET(CMAKE_REQUIRED_INCLUDES ${PORTAUDIO_INCLUDE_DIRS}) - SET(CMAKE_REQUIRED_LIBRARIES ${PORTAUDIO_LIBRARIES}) - CHECK_FUNCTION_EXISTS(Pa_GetVersion HAVE_PA_GETVERSION) - SET(CMAKE_REQUIRED_INCLUDES "") - SET(CMAKE_REQUIRED_LIBRARIES "") - IF(HAVE_PA_GETVERSION) - # Symbol found, must be the newer V19 API + IF(WIN32) + # We only have the newer version on Windows SET( PORTAUDIO_API_1 ) - ELSE(HAVE_PA_GETVERSION) - # Symbol not found, must be the older V18 API - SET( PORTAUDIO_API_1 1 ) - ENDIF(HAVE_PA_GETVERSION) + ELSE(WIN32) + INCLUDE(CheckFunctionExists) + SET(CMAKE_REQUIRED_INCLUDES ${PORTAUDIO_INCLUDE_DIRS}) + SET(CMAKE_REQUIRED_LIBRARIES ${PORTAUDIO_LIBRARIES}) + CHECK_FUNCTION_EXISTS(Pa_GetVersion HAVE_PA_GETVERSION) + SET(CMAKE_REQUIRED_INCLUDES "") + SET(CMAKE_REQUIRED_LIBRARIES "") + IF(HAVE_PA_GETVERSION) + # Symbol found, must be the newer V19 API + SET( PORTAUDIO_API_1 ) + ELSE(HAVE_PA_GETVERSION) + # Symbol not found, must be the older V18 API + SET( PORTAUDIO_API_1 1 ) + ENDIF(HAVE_PA_GETVERSION) + ENDIF(WIN32) ELSE(PORTAUDIO_FOUND) SET( PORTAUDIO_LIBRARIES ) SET( PORTAUDIO_INCLUDE_DIRS ) + SET( PORTAUDIO_SRC_DIR ) ENDIF(PORTAUDIO_FOUND) -MARK_AS_ADVANCED( PORTAUDIO_LIBRARIES PORTAUDIO_INCLUDE_DIRS ) +MARK_AS_ADVANCED( PORTAUDIO_LIBRARIES PORTAUDIO_INCLUDE_DIRS PORTAUDIO_SRC_DIR ) diff --git a/ui/gtk/CMakeLists.txt b/ui/gtk/CMakeLists.txt index 55bd6d1784..f0f5ac7fbe 100644 --- a/ui/gtk/CMakeLists.txt +++ b/ui/gtk/CMakeLists.txt @@ -128,6 +128,51 @@ if(PORTAUDIO_FOUND) ${WIRESHARK_GTK_SRC} rtp_player.c ) + + # For Win32, there is no PortAudio lib, we compile the files locally + if(WIN32) + add_definitions( + -DPA_NO_DS + -DPA_NO_ASIO + ) + set(PORTAUDIO_SRC + ${PORTAUDIO_SRC_DIR}/common/pa_allocation.c + ${PORTAUDIO_SRC_DIR}/common/pa_converters.c + ${PORTAUDIO_SRC_DIR}/common/pa_cpuload.c + ${PORTAUDIO_SRC_DIR}/common/pa_dither.c + ${PORTAUDIO_SRC_DIR}/common/pa_front.c + ${PORTAUDIO_SRC_DIR}/common/pa_process.c + ${PORTAUDIO_SRC_DIR}/common/pa_skeleton.c + ${PORTAUDIO_SRC_DIR}/common/pa_stream.c + ${PORTAUDIO_SRC_DIR}/common/pa_trace.c + ${PORTAUDIO_SRC_DIR}/os/win/pa_win_hostapis.c + ${PORTAUDIO_SRC_DIR}/os/win/pa_win_util.c + ${PORTAUDIO_SRC_DIR}/os/win/pa_x86_plain_converters.c + ${PORTAUDIO_SRC_DIR}/os/win/pa_win_waveformat.c + ${PORTAUDIO_SRC_DIR}/hostapi/wmme/pa_win_wmme.c + ) + add_library(portaudio OBJECT + ${PORTAUDIO_SRC} + ) + set_target_properties(portaudio PROPERTIES + INCLUDE_DIRECTORIES "${PORTAUDIO_INCLUDE_DIRS}" + FOLDER "UI") + # Portaudio has some warnings, annoyingly the combination of CMake + # and MSBuild means that just disabling the warnings on the specific + # source files doesn't work, so set them to level 4 for the target + #set_source_files_properties(${PORTAUDIO_SRC_DIR}/common/pa_front.c + # PROPERTIES + # COMPILE_FLAGS "/wd4189" + #) + #set_source_files_properties(${PORTAUDIO_SRC_DIR}/os/win/pa_x86_plain_converters.c + # PROPERTIES + # COMPILE_FLAGS "/wd4305" + #) + target_compile_options(portaudio + PUBLIC "/w44189" + PUBLIC "/w44305" + ) + endif() endif() if(ENABLE_EXTCAP) @@ -240,10 +285,15 @@ register_tap_files(wireshark-tap-register.c ${WIRESHARK_TAP_SRC} ) +if(WIN32) + set(PORTAUDIO_OBJ $) +endif() + add_library(gtkui STATIC ${WIRESHARK_GTK_SRC} ${WIRESHARK_TAP_SRC} ${PLATFORM_UI_SRC} + ${PORTAUDIO_OBJ} wireshark-tap-register.c ) set_target_properties(gtkui PROPERTIES