From 9b51dd7d667e97338a92711543fc3e942faae52f Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Mon, 21 Sep 2020 00:43:58 +0300 Subject: Added WinMM driver for windows (#236) * ADLMIDI2: Fixed an MSVC build However, it may work glitchy! * Experimental WinMM MIDI driver TODO: Make a control panel to configure the driver * WinMM-DRV: A workaround for older MinGW * WinMM-DRV: WIP control panel appled / tool * WinMM-DRV: Better test a driver's work * WinMM-DRV: More progress on a control panel * WinMM-DRV: And more progress on this control panel It's almost completed, I need to make the working setup through a registry. * WinMM-DRV: Driver is almost ready However, control panel can't ping a driver to reload settings yet * WinMM-DRV: Fix the missing volume model setup * WinMM-DRV: Setup reload on the fly now work! * WinMM-DRV: Stabilize the thing * WinMM-DRV: Stabilizing * WinMM-DRV: Avoid all "setup" in names to avoid a stupid PCA thing: https://stackoverflow.com/questions/17660404/how-to-programmatically-disable-program-compatibility-assistant-in-windows-7-and * A small warning fix at the WOPL module * WinMM-DRV: Fixed some warnings * WinMM-DRV: Avoid PCA dialog on the installer * WiNMM-DRV: Make the linking of pthread being optional Required to use MinGW-w64 toolchain with the "win32" threading mode * WinMM-DRV: Receive the MODM_RESET to reset the MIDI state * WinMM-DRV: Attempt to fix a sound distorsion on song song * WinMM-Drv: Fixed a build on some older MinGW toolchains * WinMM-Drv: Fixed default settings not being loaded --- utils/winmm_drv/CMakeLists.txt | 126 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 utils/winmm_drv/CMakeLists.txt (limited to 'utils/winmm_drv/CMakeLists.txt') diff --git a/utils/winmm_drv/CMakeLists.txt b/utils/winmm_drv/CMakeLists.txt new file mode 100644 index 0000000..e65f281 --- /dev/null +++ b/utils/winmm_drv/CMakeLists.txt @@ -0,0 +1,126 @@ + +if(NOT WIN32) + message(FATAL_ERROR "WinDriver: This component is for Windows Platform only") +endif() + +option(WITH_WINMMDRV_PTHREADS "Link libwinpthreads statically (when using pthread-based builds)" ON) + +#==================================== +# Driver module +#==================================== + +set(ADLMIDI_DRIVER_SRC + src/winmm_drv.def + src/winmm_drv.cpp + src/MidiSynth.cpp + config/regconfig.c +) + +add_library(adlmididrv MODULE ${ADLMIDI_DRIVER_SRC}) +set_target_properties(adlmididrv PROPERTIES PREFIX "") +target_link_libraries(adlmididrv PRIVATE winmm ADLMIDI_static) +target_include_directories(adlmididrv PRIVATE config) +target_compile_definitions(adlmididrv PRIVATE + -D_USRDLL + -D_WINDLL + -DMM_WIN32DRV_EXPORTS + -DENABLE_REG_SERVER +) + +if(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) + set_property(TARGET adlmididrv APPEND_STRING PROPERTY LINK_FLAGS " -static-libgcc -static-libstdc++ -Wl,--enable-stdcall-fixup") + if(WITH_WINMMDRV_PTHREADS) + set_property(TARGET adlmididrv APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Bstatic,--whole-archive -lpthread -Wl,-Bdynamic,--no-whole-archive") + endif() +endif() + +if(NOT MSVC) + target_compile_options(adlmididrv PRIVATE "-Wno-cast-function-type") +endif() + + + +#==================================== +# Install utility +#==================================== + +set(ADLMIDI_INSTALLER_SRC + installer/drvinst.c +) + +if(NOT MSVC) + list(APPEND ADLMIDI_INSTALLER_SRC + installer/drvinst.rc + ) +endif() + +add_executable(drvsetup ${ADLMIDI_INSTALLER_SRC}) + +target_compile_definitions(drvsetup PRIVATE + -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 + -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1 + -D_CRT_SECURE_NO_WARNINGS +) + +if(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) + set_property(TARGET drvsetup APPEND_STRING PROPERTY LINK_FLAGS " -static-libgcc") +endif() + + +#==================================== +# A unit test to verify the driver +#==================================== + +add_executable(drvtest test/test.c) +target_link_libraries(drvtest PRIVATE winmm) +target_compile_options(drvtest PRIVATE "-Wno-cast-function-type") + + +#==================================== +# Control panel applet +#==================================== + +set(ADLMIDI_DRIVER_SRC + cpl/adlconfig.def + cpl/adlconfig.rc + cpl/config_dialog.c + config/regconfig.c +) + +add_library(adlmidiconfig MODULE ${ADLMIDI_DRIVER_SRC} cpl/adlconfig.c) +set_target_properties(adlmidiconfig PROPERTIES PREFIX "" OUTPUT_NAME "libadlconfig" SUFFIX ".cpl") +target_include_directories(adlmidiconfig PRIVATE config) +target_compile_definitions(adlmidiconfig PRIVATE + -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 + -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1 + -D_CRT_SECURE_NO_WARNINGS + -D_UNICODE + -DUNICODE + -DADL_IS_CPL_APPLET +) + +target_link_libraries(adlmidiconfig PRIVATE comctl32 gdi32 user32) + +add_executable(adlmidiconfigtool ${ADLMIDI_DRIVER_SRC} cpl/adlconfig-tool.c) +set_target_properties(adlmidiconfigtool PROPERTIES WIN32_EXECUTABLE ON) +target_include_directories(adlmidiconfigtool PRIVATE config) +target_compile_definitions(adlmidiconfigtool PRIVATE + -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 + -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1 + -D_CRT_SECURE_NO_WARNINGS + -D_UNICODE + -DUNICODE +) + +target_link_libraries(adlmidiconfigtool PRIVATE comctl32 gdi32 user32) + +if(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) + target_compile_options(adlmidiconfig PRIVATE "-Wno-cast-function-type") + target_compile_options(adlmidiconfigtool PRIVATE "-Wno-cast-function-type") + set_property(TARGET adlmidiconfig APPEND_STRING PROPERTY LINK_FLAGS " -static-libgcc -Wl,--enable-stdcall-fixup") + set_property(TARGET adlmidiconfigtool APPEND_STRING PROPERTY LINK_FLAGS " -static-libgcc -Wl,--enable-stdcall-fixup") +endif() + + +#install(TARGETS adlmididrv +# RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") -- cgit v1.2.3 From 687cea0e53d4b5dcf2326b5c2a4483f5265251ff Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 21 Sep 2020 01:36:34 +0300 Subject: WinMM-DRV: Organize resources and use ResEdit instead of VS --- utils/winmm_drv/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'utils/winmm_drv/CMakeLists.txt') diff --git a/utils/winmm_drv/CMakeLists.txt b/utils/winmm_drv/CMakeLists.txt index e65f281..ad35aaa 100644 --- a/utils/winmm_drv/CMakeLists.txt +++ b/utils/winmm_drv/CMakeLists.txt @@ -87,7 +87,7 @@ set(ADLMIDI_DRIVER_SRC config/regconfig.c ) -add_library(adlmidiconfig MODULE ${ADLMIDI_DRIVER_SRC} cpl/adlconfig.c) +add_library(adlmidiconfig MODULE ${ADLMIDI_DRIVER_SRC} cpl/adlconfig.c cpl/res-cpl.rc) set_target_properties(adlmidiconfig PROPERTIES PREFIX "" OUTPUT_NAME "libadlconfig" SUFFIX ".cpl") target_include_directories(adlmidiconfig PRIVATE config) target_compile_definitions(adlmidiconfig PRIVATE @@ -101,7 +101,7 @@ target_compile_definitions(adlmidiconfig PRIVATE target_link_libraries(adlmidiconfig PRIVATE comctl32 gdi32 user32) -add_executable(adlmidiconfigtool ${ADLMIDI_DRIVER_SRC} cpl/adlconfig-tool.c) +add_executable(adlmidiconfigtool ${ADLMIDI_DRIVER_SRC} cpl/adlconfig-tool.c cpl/res-tool.rc) set_target_properties(adlmidiconfigtool PROPERTIES WIN32_EXECUTABLE ON) target_include_directories(adlmidiconfigtool PRIVATE config) target_compile_definitions(adlmidiconfigtool PRIVATE -- cgit v1.2.3 From 08773b7ed7181e03392a766a7c1a8335d4ac44e6 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 21 Sep 2020 03:33:23 +0300 Subject: WinMM-Drv: Better compatibility with older Windows Do link of a mingwex statically --- utils/winmm_drv/CMakeLists.txt | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'utils/winmm_drv/CMakeLists.txt') diff --git a/utils/winmm_drv/CMakeLists.txt b/utils/winmm_drv/CMakeLists.txt index ad35aaa..ae76a0c 100644 --- a/utils/winmm_drv/CMakeLists.txt +++ b/utils/winmm_drv/CMakeLists.txt @@ -3,7 +3,10 @@ if(NOT WIN32) message(FATAL_ERROR "WinDriver: This component is for Windows Platform only") endif() -option(WITH_WINMMDRV_PTHREADS "Link libwinpthreads statically (when using pthread-based builds)" ON) +if(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) + option(WITH_WINMMDRV_PTHREADS "Link libwinpthreads statically (when using pthread-based builds)" ON) + option(WITH_WINMMDRV_MINGWEX "Link libmingwex statically (when using vanilla MinGW builds)" OFF) +endif() #==================================== # Driver module @@ -32,6 +35,9 @@ if(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) if(WITH_WINMMDRV_PTHREADS) set_property(TARGET adlmididrv APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Bstatic,--whole-archive -lpthread -Wl,-Bdynamic,--no-whole-archive") endif() + if(WITH_WINMMDRV_MINGWEX) + set_property(TARGET adlmididrv APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Bstatic,--whole-archive -lmingwex -Wl,-Bdynamic,--no-whole-archive") + endif() endif() if(NOT MSVC) @@ -64,8 +70,14 @@ target_compile_definitions(drvsetup PRIVATE if(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) set_property(TARGET drvsetup APPEND_STRING PROPERTY LINK_FLAGS " -static-libgcc") + if(WITH_WINMMDRV_MINGWEX) + set_property(TARGET drvsetup APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Bstatic,--whole-archive -lmingwex -Wl,-Bdynamic,--no-whole-archive") + endif() endif() +configure_file(installer/install.bat ${CMAKE_BINARY_DIR}/install.bat COPYONLY) +configure_file(installer/uninstall.bat ${CMAKE_BINARY_DIR}/uninstall.bat COPYONLY) + #==================================== # A unit test to verify the driver @@ -74,6 +86,9 @@ endif() add_executable(drvtest test/test.c) target_link_libraries(drvtest PRIVATE winmm) target_compile_options(drvtest PRIVATE "-Wno-cast-function-type") +if(WITH_WINMMDRV_MINGWEX) + set_property(TARGET drvtest APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Bstatic,--whole-archive -lmingwex -Wl,-Bdynamic,--no-whole-archive") +endif() #==================================== @@ -101,6 +116,7 @@ target_compile_definitions(adlmidiconfig PRIVATE target_link_libraries(adlmidiconfig PRIVATE comctl32 gdi32 user32) + add_executable(adlmidiconfigtool ${ADLMIDI_DRIVER_SRC} cpl/adlconfig-tool.c cpl/res-tool.rc) set_target_properties(adlmidiconfigtool PROPERTIES WIN32_EXECUTABLE ON) target_include_directories(adlmidiconfigtool PRIVATE config) @@ -119,6 +135,10 @@ if(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) target_compile_options(adlmidiconfigtool PRIVATE "-Wno-cast-function-type") set_property(TARGET adlmidiconfig APPEND_STRING PROPERTY LINK_FLAGS " -static-libgcc -Wl,--enable-stdcall-fixup") set_property(TARGET adlmidiconfigtool APPEND_STRING PROPERTY LINK_FLAGS " -static-libgcc -Wl,--enable-stdcall-fixup") + if(WITH_WINMMDRV_MINGWEX) + set_property(TARGET adlmidiconfig APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Bstatic,--whole-archive -lmingwex -Wl,-Bdynamic,--no-whole-archive") + set_property(TARGET adlmidiconfigtool APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Bstatic,--whole-archive -lmingwex -Wl,-Bdynamic,--no-whole-archive") + endif() endif() -- cgit v1.2.3