Skip to content

Commit c67d8ca

Browse files
DomClarksakertooth
authored andcommitted
Support ZynAddSubFx with MSVC (LMMS#6561)
1 parent 4c1d0a7 commit c67d8ca

File tree

10 files changed

+122
-137
lines changed

10 files changed

+122
-137
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,8 @@ jobs:
225225
--triplet=${{ matrix.arch }}-windows `
226226
--host-triplet=${{ matrix.arch }}-windows `
227227
--recurse `
228-
fftw3 fluidsynth[sndfile] libsamplerate libsndfile libstk lilv lv2 `
229-
portaudio sdl2
228+
fftw3 fltk fluidsynth[sndfile] libsamplerate libsndfile libstk `
229+
lilv lv2 portaudio sdl2
230230
- name: Set up build environment
231231
uses: ilammy/msvc-dev-cmd@d8610e2b41c6d0f0c3b4c46dad8df0fd826c68e1
232232
with:

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,13 @@ ENDIF(WANT_JACK)
486486
FIND_PACKAGE(FFTW COMPONENTS fftw3f REQUIRED)
487487

488488
# check for FLTK
489+
set(FLTK_SKIP_OPENGL TRUE)
490+
set(FLTK_SKIP_FORMS TRUE)
491+
set(FLTK_SKIP_IMAGES TRUE)
492+
set(FLTK_SKIP_MATH TRUE)
493+
if(MINGW_PREFIX)
494+
set(FLTK_SKIP_FLUID TRUE)
495+
endif()
489496
FIND_PACKAGE(FLTK)
490497
IF(FLTK_FOUND)
491498
SET(STATUS_ZYN "OK")

cmake/modules/PluginList.cmake

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ ENDIF()
101101
IF(MSVC)
102102
SET(MSVC_INCOMPATIBLE_PLUGINS
103103
LadspaEffect
104-
ZynAddSubFx
105104
)
106105
message(WARNING "Compiling with MSVC. The following plugins are not available: ${MSVC_INCOMPATIBLE_PLUGINS}")
107106
LIST(REMOVE_ITEM PLUGIN_LIST ${MSVC_INCOMPATIBLE_PLUGINS})

include/IoHelper.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ namespace lmms
4747

4848
#ifdef _WIN32
4949

50-
std::wstring toWString(const std::string& s)
50+
inline std::wstring toWString(const std::string& s)
5151
{
5252
std::wstring ret;
5353
int len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, s.data(),
@@ -64,7 +64,7 @@ std::wstring toWString(const std::string& s)
6464
#endif
6565

6666

67-
FILE* F_OPEN_UTF8(std::string const& fname, const char* mode){
67+
inline FILE* F_OPEN_UTF8(std::string const& fname, const char* mode){
6868
#ifdef LMMS_BUILD_WIN32
6969
return _wfopen(toWString(fname).data(), toWString(mode).data());
7070
#else
@@ -73,7 +73,7 @@ FILE* F_OPEN_UTF8(std::string const& fname, const char* mode){
7373
}
7474

7575

76-
int fileToDescriptor(FILE* f, bool closeFile = true)
76+
inline int fileToDescriptor(FILE* f, bool closeFile = true)
7777
{
7878
int fh;
7979
if (f == nullptr) {return -1;}

plugins/ZynAddSubFx/CMakeLists.txt

Lines changed: 50 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
if(NOT FLTK_FOUND)
2+
return()
3+
endif()
4+
15
INCLUDE(BuildPlugin)
26

7+
find_package(Threads REQUIRED)
8+
find_package(ZLIB REQUIRED)
9+
310
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
411

512
# definitions for ZynAddSubFX
@@ -11,40 +18,20 @@ ELSE()
1118
ADD_DEFINITIONS(-DOS_WINDOWS)
1219
ENDIF()
1320

14-
# do not conflict with LMMS' Controller class
15-
ADD_DEFINITIONS(-DController=ZynController)
16-
1721
# use asm optimizations when on x86 or x86_64
18-
IF(LMMS_HOST_X86 OR LMMS_HOST_X86_64)
22+
if(NOT MSVC AND (LMMS_HOST_X86 OR LMMS_HOST_X86_64))
1923
ADD_DEFINITIONS(-DASM_F2I_YES)
20-
ENDIF(LMMS_HOST_X86 OR LMMS_HOST_X86_64)
24+
endif()
2125

2226
# build ZynAddSubFX with full optimizations
23-
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wno-write-strings -Wno-deprecated-declarations -fpermissive")
27+
if(NOT MSVC)
28+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wno-write-strings -Wno-deprecated-declarations -fpermissive")
29+
endif()
2430

2531
IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND NOT "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "6.0.0")
2632
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-misleading-indentation")
2733
ENDIF()
2834

29-
IF(LMMS_BUILD_WIN32)
30-
# link system-libraries
31-
ADD_DEFINITIONS(-DPTW32_STATIC_LIB)
32-
# fix X11 headers errors caused by bug with mingw + c++11 (enable -std=gnu++0x)
33-
SET(CMAKE_CXX_EXTENSIONS ON)
34-
ENDIF(LMMS_BUILD_WIN32)
35-
36-
SET(FLTK_SKIP_OPENGL TRUE)
37-
SET(FLTK_SKIP_FORMS TRUE)
38-
SET(FLTK_SKIP_IMAGES TRUE)
39-
SET(FLTK_SKIP_MATH TRUE)
40-
IF(MINGW_PREFIX)
41-
SET(FLTK_SKIP_FLUID TRUE)
42-
ENDIF()
43-
44-
IF(NOT FLTK_FOUND)
45-
RETURN()
46-
ENDIF()
47-
4835
IF(MINGW_PREFIX)
4936
SET(FLTK_FLUID_EXECUTABLE "${MINGW_PREFIX}/bin/fluid")
5037
ENDIF()
@@ -57,13 +44,15 @@ IF(NOT EXISTS ${FLTK_FLUID_EXECUTABLE})
5744
ENDIF()
5845
ENDIF()
5946

60-
INCLUDE_DIRECTORIES("${FLTK_INCLUDE_DIR}"
61-
"${CMAKE_CURRENT_SOURCE_DIR}"
62-
${FFTW3F_INCLUDE_DIRS}
63-
"${CMAKE_CURRENT_BINARY_DIR}"
64-
"${CMAKE_BINARY_DIR}")
65-
66-
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/zynaddsubfx/src/UI)
47+
include_directories(
48+
"${FLTK_INCLUDE_DIR}"
49+
"${CMAKE_CURRENT_SOURCE_DIR}"
50+
${FFTW3F_INCLUDE_DIRS}
51+
"${CMAKE_CURRENT_BINARY_DIR}"
52+
"${CMAKE_BINARY_DIR}"
53+
"${CMAKE_SOURCE_DIR}/src/3rdparty/mingw-std-threads"
54+
"${CMAKE_CURRENT_SOURCE_DIR}/zynaddsubfx/src/UI"
55+
)
6756

6857
ADD_DEFINITIONS(-DPLUGINVERSION) # removes exit confirmation dialogs etc. in MasterUI.fl
6958
add_subdirectory(zynaddsubfx/src/Nio)
@@ -116,24 +105,23 @@ SET(zynaddsubfx_core_SRCS
116105
zynaddsubfx/src/Synth/PADnote.cpp
117106
zynaddsubfx/src/Synth/Resonance.cpp
118107
zynaddsubfx/src/Synth/SUBnote.cpp
119-
)
120-
121-
122-
IF(LMMS_BUILD_LINUX)
123-
ADD_LIBRARY(ZynAddSubFxCore MODULE LocalZynAddSubFx.cpp ${zynaddsubfx_core_SRCS})
124-
ELSE()
125-
ADD_LIBRARY(ZynAddSubFxCore SHARED LocalZynAddSubFx.cpp ${zynaddsubfx_core_SRCS})
126-
ENDIF()
127-
TARGET_LINK_LIBRARIES(ZynAddSubFxCore zynaddsubfx_nio ${FFTW3F_LIBRARIES} ${QT_LIBRARIES} -lz -lpthread)
128-
129-
TARGET_LINK_LIBRARIES(ZynAddSubFxCore Qt5::Widgets Qt5::Xml)
130-
131-
IF(LMMS_BUILD_WIN32)
132-
TARGET_LINK_LIBRARIES(ZynAddSubFxCore -lws2_32)
133-
INSTALL(TARGETS ZynAddSubFxCore RUNTIME DESTINATION "${PLUGIN_DIR}")
134-
ELSE(LMMS_BUILD_WIN32)
135-
INSTALL(TARGETS ZynAddSubFxCore LIBRARY DESTINATION "${PLUGIN_DIR}")
136-
ENDIF(LMMS_BUILD_WIN32)
108+
)
109+
110+
add_library(ZynAddSubFxCoreObjs OBJECT LocalZynAddSubFx.cpp ${zynaddsubfx_core_SRCS})
111+
add_library(ZynAddSubFxCore INTERFACE)
112+
target_sources(ZynAddSubFxCore INTERFACE
113+
$<TARGET_OBJECTS:ZynAddSubFxCoreObjs>
114+
$<TARGET_OBJECTS:zynaddsubfx_nio>
115+
)
116+
117+
target_link_libraries(ZynAddSubFxCore INTERFACE
118+
${FFTW3F_LIBRARIES}
119+
${QT_LIBRARIES}
120+
Qt5::Widgets
121+
Qt5::Xml
122+
Threads::Threads
123+
ZLIB::ZLIB
124+
)
137125

138126
LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/..")
139127
IF(LMMS_BUILD_LINUX)
@@ -144,25 +132,31 @@ ELSE()
144132
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${PLUGIN_DIR}")
145133
ENDIF()
146134
BUILD_PLUGIN(zynaddsubfx ZynAddSubFx.cpp ZynAddSubFx.h MOCFILES ZynAddSubFx.h EMBEDDED_RESOURCES artwork.png logo.png)
147-
TARGET_LINK_LIBRARIES(zynaddsubfx -lZynAddSubFxCore)
148-
ADD_DEPENDENCIES(zynaddsubfx ZynAddSubFxCore)
135+
target_link_libraries(zynaddsubfx ZynAddSubFxCore)
149136

150-
IF(WIN32)
137+
if(MSVC)
138+
set(WINRC "${CMAKE_CURRENT_BINARY_DIR}/zynaddsubfx.rc")
139+
elseif(WIN32)
151140
SET(WINRC "${CMAKE_CURRENT_BINARY_DIR}/zynaddsubfxrc.obj")
152141
ADD_CUSTOM_COMMAND(OUTPUT "${WINRC}"
153142
COMMAND "${CMAKE_RC_COMPILER}"
154143
"-I\"${CMAKE_CURRENT_SOURCE_DIR}\""
155144
"-o\"${CMAKE_CURRENT_BINARY_DIR}/zynaddsubfxrc.obj\""
156145
"-i\"${CMAKE_CURRENT_BINARY_DIR}/zynaddsubfx.rc\""
157146
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/zynaddsubfx.rc")
158-
ENDIF(WIN32)
147+
endif()
159148

160149
# Use libraries in non-standard directories (e.g., another version of Qt)
161150
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
162151

163152
ADD_SUBDIRECTORY("${LMMS_SOURCE_DIR}/src/common" common)
164153

165-
ADD_EXECUTABLE(RemoteZynAddSubFx RemoteZynAddSubFx.cpp ${LMMS_COMMON_SRCS} "${WINRC}")
154+
add_executable(RemoteZynAddSubFx
155+
RemoteZynAddSubFx.cpp
156+
${LMMS_COMMON_SRCS}
157+
"${WINRC}"
158+
$<TARGET_OBJECTS:zynaddsubfx_gui>
159+
)
166160
INSTALL(TARGETS RemoteZynAddSubFx RUNTIME DESTINATION "${PLUGIN_DIR}")
167161
# Needed to deploy dependencies of RemoteZynAddSubFx
168162
SET_PROPERTY(GLOBAL APPEND PROPERTY PLUGINS_BUILT "RemoteZynAddSubFx")
@@ -182,8 +176,7 @@ IF(FLTK_CONFIG AND NOT (LMMS_BUILD_APPLE OR LMMS_BUILD_WIN32))
182176
STRING(REPLACE " " ";" FLTK_FILTERED_LDFLAGS ${FLTK_FILTERED_LDFLAGS})
183177
LIST(REMOVE_ITEM FLTK_FILTERED_LDFLAGS -lX11)
184178
ENDIF()
185-
TARGET_LINK_LIBRARIES(RemoteZynAddSubFx zynaddsubfx_gui -lZynAddSubFxCore ${FLTK_FILTERED_LDFLAGS} -lpthread )
186-
ADD_DEPENDENCIES(RemoteZynAddSubFx ZynAddSubFxCore)
179+
target_link_libraries(RemoteZynAddSubFx ZynAddSubFxCore ${FLTK_FILTERED_LDFLAGS})
187180

188181
if(LMMS_HAVE_LIBRT)
189182
target_link_libraries(RemoteZynAddSubFx rt)
@@ -199,13 +192,6 @@ ENDIF(LMMS_BUILD_WIN32)
199192

200193

201194
IF(LMMS_BUILD_WIN32)
202-
add_custom_command(
203-
TARGET ZynAddSubFxCore
204-
POST_BUILD
205-
COMMAND "${STRIP_COMMAND}" "$<TARGET_FILE:ZynAddSubFxCore>"
206-
VERBATIM
207-
COMMAND_EXPAND_LISTS
208-
)
209195
add_custom_command(
210196
TARGET RemoteZynAddSubFx
211197
POST_BUILD

plugins/ZynAddSubFx/LocalZynAddSubFx.cpp

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,25 @@
2222
*
2323
*/
2424

25-
#include <lmmsconfig.h>
25+
#include "LocalZynAddSubFx.h"
2626

27-
#include "zynaddsubfx/src/Misc/Util.h"
28-
#include <unistd.h>
2927
#include <ctime>
3028

31-
#include "LocalZynAddSubFx.h"
29+
#include "lmmsconfig.h"
30+
31+
#ifdef LMMS_BUILD_WIN32
32+
# include <wchar.h>
33+
# include "IoHelper.h"
34+
#else
35+
# include <unistd.h>
36+
#endif
3237

3338
#include "MidiEvent.h"
3439

3540
#include "zynaddsubfx/src/Nio/NulEngine.h"
3641
#include "zynaddsubfx/src/Misc/Master.h"
3742
#include "zynaddsubfx/src/Misc/Part.h"
43+
#include "zynaddsubfx/src/Misc/Util.h"
3844

3945
// Global variable in zynaddsubfx/src/globals.h
4046
SYNTH_T* synth = nullptr;
@@ -53,14 +59,6 @@ LocalZynAddSubFx::LocalZynAddSubFx() :
5359
{
5460
if( s_instanceCount == 0 )
5561
{
56-
#ifdef LMMS_BUILD_WIN32
57-
#ifndef __WINPTHREADS_VERSION
58-
// (non-portable) initialization of statically linked pthread library
59-
pthread_win32_process_attach_np();
60-
pthread_win32_thread_attach_np();
61-
#endif
62-
#endif // LMMS_BUILD_WIN32
63-
6462
initConfig();
6563

6664
synth = new SYNTH_T;
@@ -143,14 +141,20 @@ void LocalZynAddSubFx::loadXML( const std::string & _filename )
143141
{
144142
char * f = strdup( _filename.c_str() );
145143

146-
pthread_mutex_lock( &m_master->mutex );
147-
m_master->defaults();
148-
m_master->loadXML( f );
149-
pthread_mutex_unlock( &m_master->mutex );
144+
{
145+
const auto lock = std::lock_guard{m_master->mutex};
146+
m_master->defaults();
147+
m_master->loadXML( f );
148+
}
150149

151150
m_master->applyparameters();
152151

152+
#ifdef LMMS_BUILD_WIN32
153+
_wunlink(toWString(_filename).c_str());
154+
#else
153155
unlink( f );
156+
#endif
157+
154158
free( f );
155159
}
156160

@@ -161,10 +165,11 @@ void LocalZynAddSubFx::loadPreset( const std::string & _filename, int _part )
161165
{
162166
char * f = strdup( _filename.c_str() );
163167

164-
pthread_mutex_lock( &m_master->mutex );
165-
m_master->part[_part]->defaultsinstrument();
166-
m_master->part[_part]->loadXMLinstrument( f );
167-
pthread_mutex_unlock( &m_master->mutex );
168+
{
169+
const auto lock = std::lock_guard{m_master->mutex};
170+
m_master->part[_part]->defaultsinstrument();
171+
m_master->part[_part]->loadXMLinstrument( f );
172+
}
168173

169174
m_master->applyparameters();
170175

@@ -262,8 +267,13 @@ void LocalZynAddSubFx::processMidiEvent( const MidiEvent& event )
262267

263268
void LocalZynAddSubFx::processAudio( sampleFrame * _out )
264269
{
270+
#ifdef _MSC_VER
271+
const auto outputl = static_cast<float*>(_alloca(synth->buffersize * sizeof(float)));
272+
const auto outputr = static_cast<float*>(_alloca(synth->buffersize * sizeof(float)));
273+
#else
265274
float outputl[synth->buffersize];
266275
float outputr[synth->buffersize];
276+
#endif
267277

268278
m_master->GetAudioOutSamples( synth->buffersize, synth->samplerate, outputl, outputr );
269279

0 commit comments

Comments
 (0)