IF(LMMS_HAVE_FFTW3F)

INCLUDE(BuildPlugin)

BUILD_PLUGIN(zynaddsubfx zynaddsubfx.cpp zynaddsubfx.h MOCFILES zynaddsubfx.h EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png)

SET(ZYN_SRC
	${CMAKE_CURRENT_SOURCE_DIR}/src/DSP/AnalogFilter.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/DSP/Filter.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/DSP/SVFilter.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/DSP/FFTwrapper.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/DSP/FormantFilter.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Input/NULLMidiIn.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Input/MidiIn.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Output/Recorder.C 
	${CMAKE_CURRENT_SOURCE_DIR}/src/Output/WAVaudiooutput.C 
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/EffectMgr.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/Effect.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/Phaser.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/Echo.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/EffectLFO.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/Chorus.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/DynamicFilter.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/Reverb.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/EQ.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/Distorsion.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Effects/Alienwah.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/LFOParams.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/EnvelopeParams.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/SUBnoteParameters.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/ADnoteParameters.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/Presets.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/FilterParams.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/PADnoteParameters.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/Controller.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Params/PresetsStore.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Seq/MIDIFile.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Seq/MIDIEvents.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Seq/Sequencer.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Synth/PADnote.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Synth/SUBnote.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Synth/LFO.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Synth/Resonance.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Synth/ADnote.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Synth/Envelope.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Synth/OscilGen.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Misc/Dump.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Misc/Bank.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Misc/Config.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Misc/XMLwrapper.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Misc/Util.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Misc/Master.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Misc/Microtonal.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/Misc/Part.C
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/MasterUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/VirKeyboard.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/ConfigUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/OscilGenUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/WidgetPDial.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/ResonanceUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/MicrotonalUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/ADnoteUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/PresetsUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/EffUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/FilterUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/PartUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/EnvelopeUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/LFOUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/SeqUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/PADnoteUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/SUBnoteUI.cc
	${CMAKE_CURRENT_SOURCE_DIR}/src/UI/BankUI.cc
)

SET(MXML_SRC
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-attr.c
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-entity.c
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-file.c
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-index.c
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-node.c
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-private.c
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-search.c
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-set.c
	${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-string.c
)


# definitions for ZynAddSubFX
IF(LMMS_BUILD_LINUX OR LMMS_BUILD_APPLE)
ADD_DEFINITIONS(-DOS_LINUX)
ELSE(LMMS_BUILD_LINUX OR LMMS_BUILD_APPLE)
ADD_DEFINITIONS(-DOS_WINDOWS)
ENDIF(LMMS_BUILD_LINUX OR LMMS_BUILD_APPLE)

# use asm optimizations when on x86 or x86_64
IF(LMMS_HOST_X86 OR LMMS_HOST_X86_64)
ADD_DEFINITIONS(-DASM_F2I_YES)
ENDIF(LMMS_HOST_X86 OR LMMS_HOST_X86_64)

# build ZynAddSubFX with full optimizations
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wno-write-strings -Wno-deprecated-declarations")

# link default libraries
LINK_DIRECTORIES(${FFTW3F_LIBRARY_DIRS})
LINK_LIBRARIES(${FFTW3F_LIBRARIES} -lz -lpthread ${CMAKE_CURRENT_BINARY_DIR}/fltk/bin/libfltk.a)

# FLTK needs X
IF(LMMS_BUILD_LINUX)
FIND_PACKAGE(X11)
FIND_PACKAGE(Freetype)
LINK_LIBRARIES(${X11_LIBRARIES} ${X11_Xft_LIB} ${FREETYPE_LIBRARY})
ENDIF(LMMS_BUILD_LINUX)

# link system-libraries when on win32
IF(LMMS_BUILD_WIN32)
ADD_DEFINITIONS(-DPTW32_STATIC_LIB)
LINK_LIBRARIES(${QT_LIBRARIES} -lole32 -luuid -lcomctl32 -lgdi32)
ENDIF(LMMS_BUILD_WIN32)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/fltk/ ${CMAKE_CURRENT_SOURCE_DIR} ${FFTW3F_INCLUDE_DIRS})

ADD_EXECUTABLE(remote_zynaddsubfx remote_zynaddsubfx.cpp ${ZYN_SRC} ${MXML_SRC})
INSTALL(TARGETS remote_zynaddsubfx RUNTIME DESTINATION ${PLUGIN_DIR})

IF(LMMS_BUILD_WIN32)
	ADD_CUSTOM_COMMAND(TARGET remote_zynaddsubfx POST_BUILD COMMAND ${STRIP} ${CMAKE_CURRENT_BINARY_DIR}/remote_zynaddsubfx.exe)
ENDIF(LMMS_BUILD_WIN32)

# build FLTK
IF(LMMS_BUILD_WIN64)
SET(FLTK_EXTRA_FLAGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/cmake/modules/Win64Toolchain.cmake")
ELSEIF(LMMS_BUILD_WIN32)
SET(FLTK_EXTRA_FLAGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/cmake/modules/Win32Toolchain.cmake")
ENDIF(LMMS_BUILD_WIN64)
ADD_CUSTOM_TARGET(libfltk COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/fltk && cd ${CMAKE_CURRENT_BINARY_DIR}/fltk && ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/fltk ${FLTK_EXTRA_FLAGS} -DFLTK_USE_SYSTEM_ZLIB:BOOL=ON -DFLTK_USE_SYSTEM_JPEG:BOOL=ON -DFLTK_USE_SYSTEM_PNG:BOOL=ON -DUSE_OPENGL:BOOL=OFF -DBUILD_TESTING:BOOL=OFF -DCMAKE_BUILD_TYPE=release && ${CMAKE_BUILD_TOOL})

ADD_DEPENDENCIES(remote_zynaddsubfx libfltk)
ENDIF(LMMS_HAVE_FFTW3F)

