commit 3d4bb34ad39d0d3d24fd5ae76c580903ef10d139
parent 61561b9530b2a2bf67d9348bab9f29f610ea00fb
Author: fundamental <[email protected]>
Date: Tue, 26 Jul 2016 16:50:20 -0400
Merge branch 'win64'
Diffstat:
18 files changed, 301 insertions(+), 35 deletions(-)
diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake
@@ -0,0 +1,17 @@
+#Find FFTW
+
+find_path(FFTW_INCLUDE_DIR
+ NAMES fftw3.h
+ PATHS ${FFTW_INCLUDE_DIRS}
+ )
+
+find_library(FFTW_LIBRARIES
+ NAMES fftw3
+ PATHS ${FFTW_LIBRARY_DIRS}
+ )
+
+set(FFTW_PROCESS_INCLUDES FFTW_INCLUDE_DIR)
+set(FFTW_PROCESS_LIBS FFTW_LIBRARIES)
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(FFTW DEFAULT_MSG
+ FFTW_INCLUDE_DIR FFTW_LIBRARIES)
diff --git a/cmake/FindLIBLO.cmake b/cmake/FindLIBLO.cmake
@@ -0,0 +1,17 @@
+#Find Lo
+
+find_path(LIBLO_INCLUDE_DIR
+ NAMES lo/lo.h
+ PATHS ${LIBLO_INCLUDE_DIRS}
+ )
+
+find_library(LIBLO_LIBRARIES
+ NAMES lo
+ PATHS ${LIBLO_LIBRARY_DIRS}
+ )
+
+set(LIBLO_PROCESS_INCLUDES LIBLO_INCLUDE_DIR)
+set(LIBLO_PROCESS_LIBS LIBLO_LIBRARIES)
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBLO DEFAULT_MSG
+ LIBLO_INCLUDE_DIR LIBLO_LIBRARIES)
diff --git a/cmake/FindMXML.cmake b/cmake/FindMXML.cmake
@@ -0,0 +1,17 @@
+#Find MXML
+
+find_path(MXML_INCLUDE_DIR
+ NAMES mxml.h
+ PATHS ${MXML_INCLUDE_DIRS}
+ )
+
+find_library(MXML_LIBRARIES
+ NAMES mxml
+ PATHS ${MXML_LIBRARY_DIRS}
+ )
+
+set(MXML_PROCESS_INCLUDES MXML_INCLUDE_DIR)
+set(MXML_PROCESS_LIBS MXML_LIBRARIES)
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(MXML DEFAULT_MSG
+ MXML_INCLUDE_DIR MXML_LIBRARIES)
diff --git a/cmake/FindPA.cmake b/cmake/FindPA.cmake
@@ -0,0 +1,17 @@
+#Find FFTW
+
+find_path(FFTW_INCLUDE_DIR
+ NAMES fftw3.h
+ PATHS ${FFTW_INCLUDE_DIRS}
+ )
+
+find_library(FFTW_LIBRARIES
+ NAMES fftw3
+ PATHS ${FFTW_LIBRARY_DIRS}
+ )
+
+set(FFTW_PROCESS_INCLUDES FFTW_INCLUDE_DIR)
+set(FFTW_PROCESS_LIBS FFTW_LIBRARIES)
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(FFTW DEFAULT_MSG
+ FFTW_INCLUDE_DIR FFTW_LIBRARIES)
diff --git a/cmake/FindPORTAUDIO.cmake b/cmake/FindPORTAUDIO.cmake
@@ -0,0 +1,15 @@
+#Find PORTAUDIO
+
+find_path(PORTAUDIO_INCLUDE_DIR
+ NAMES portaudio.h
+ PATHS ${PORTAUDIO_INCLUDE_DIRS}
+ )
+
+find_library(PORTAUDIO_LIBRARIES
+ NAMES portaudio
+ PATHS ${PORTAUDIO_LIBRARY_DIRS}
+ )
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(PORTAUDIO DEFAULT_MSG
+ PORTAUDIO_INCLUDE_DIR PORTAUDIO_LIBRARIES)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
@@ -6,21 +6,16 @@ message(STATUS "Checking Library Path" $ENV{CMAKE_LIBRARY_PATH} ${CMAKE_LIBRARY_
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CheckCXXSourceCompiles)
-include(CheckCXXCompilerFlag)
-find_package(PkgConfig REQUIRED)
+include(CheckCXXCompilerFlag)
+if(NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Windows"))
+ find_package(PkgConfig)
+endif()
find_package(zlib REQUIRED)
find_package(X11)
check_include_file(X11/xpm.h HAS_XPM)
-pkg_check_modules(FFTW REQUIRED fftw3)
-pkg_check_modules(MXML REQUIRED mxml)
find_package(Threads REQUIRED)
find_package(OSS)
find_package(Alsa)
-pkg_check_modules(JACK jack)
-pkg_check_modules(PORTAUDIO portaudio-2.0>=19)
-set(FLTK_SKIP_OPENGL true)
-pkg_check_modules(NTK ntk)
-pkg_check_modules(NTK_IMAGES ntk_images)
find_package(FLTK)
find_package(OpenGL) #for FLTK
find_package(CxxTest)
@@ -28,12 +23,31 @@ if(CXXTEST_FOUND)
set(CXXTEST_USE_PYTHON TRUE)
endif()
# lash
-pkg_search_module(LASH lash-1.0)
-mark_as_advanced(LASH_LIBRARIES)
-pkg_search_module(DSSI dssi>=0.9.0)
-mark_as_advanced(DSSI_LIBRARIES)
-pkg_search_module(LIBLO liblo>=0.26 REQUIRED)
-mark_as_advanced(LIBLO_LIBRARIES)
+if(PkgConfig_FOUND AND NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Windows"))
+ message("Looking For pkg config modules")
+ pkg_check_modules(JACK jack)
+ pkg_check_modules(PORTAUDIO portaudio-2.0>=19)
+ set(FLTK_SKIP_OPENGL true)
+ pkg_check_modules(NTK ntk)
+ pkg_check_modules(NTK_IMAGES ntk_images)
+
+ pkg_check_modules(FFTW REQUIRED fftw3)
+ pkg_check_modules(MXML REQUIRED mxml)
+
+ pkg_check_modules(PORTAUDIO portaudio-2.0>=19)
+
+ pkg_search_module(LASH lash-1.0)
+ mark_as_advanced(LASH_LIBRARIES)
+ pkg_search_module(DSSI dssi>=0.9.0)
+ mark_as_advanced(DSSI_LIBRARIES)
+ pkg_search_module(LIBLO liblo>=0.26 REQUIRED)
+ mark_as_advanced(LIBLO_LIBRARIES)
+else()
+ find_package(FFTW REQUIRED)
+ find_package(MXML REQUIRED)
+ find_package(LIBLO REQUIRED)
+ find_package(PORTAUDIO)
+endif()
CHECK_FUNCTION_EXISTS(sched_setscheduler HAVE_SCHEDULER)
set(CMAKE_REQUIRED_FLAGS "-std=c++11")
@@ -88,6 +102,9 @@ SET (PluginLibDir "lib" CACHE STRING
# Add version information
add_definitions(-DVERSION="${VERSION}")
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+ add_definitions(-static)
+endif()
if(NOT "Darwin" STREQUAL ${CMAKE_SYSTEM_NAME})
# Add scheduler function existance info (OSX compatiability)
@@ -236,6 +253,10 @@ message(STATUS "Compiling with liblo")
# other include directories
include_directories(${ZLIB_INCLUDE_DIRS} ${MXML_INCLUDE_DIRS})
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+ add_definitions(-DWIN32)
+endif()
+
add_definitions(
-Wall
-Wextra
@@ -273,7 +294,9 @@ else (BuildForDebug)
message (STATUS "Building for ${CMAKE_BUILD_TYPE}, flags: ${CMAKE_CXX_FLAGS_RELEASE}")
endif (BuildForDebug)
-add_definitions(-fPIC)
+if(NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Windows"))
+ add_definitions(-fPIC)
+endif()
if(FLTK_FOUND)
mark_as_advanced(FORCE FLTK_BASE_LIBRARY)
@@ -329,8 +352,8 @@ endif()
if(NtkGui)
- find_program( FLTK_FLUID_EXECUTABLE ntk-fluid)
-
+ find_program( FLTK_FLUID_EXECUTABLE ntk-fluid)
+
message(STATUS ${NTK_LDFLAGS} ${NTK_IMAGES_LDFLAGS})
set(GUI_LIBRARIES zynaddsubfx_gui ${NTK_LIBRARIES} ${NTK_IMAGES_LIBRARIES} ${OPENGL_LIBRARIES})
@@ -405,12 +428,24 @@ add_library(zynaddsubfx_core STATIC
${zynaddsubfx_synth_SRCS}
)
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+ set(PTHREAD_LIBRARY winpthread)
+ set(PLATFORM_LIBRARIES ws2_32
+ winmm
+ wsock32
+ "-static" iphlpapi
+ "-static" winpthread)
+else()
+ set(PLATFORM_LIBRARIES "")
+ set(PTHREAD_LIBRARY pthread)
+endif()
+
target_link_libraries(zynaddsubfx_core
${ZLIB_LIBRARIES}
${FFTW_LIBRARIES}
${MXML_LIBRARIES}
${OS_LIBRARIES}
- pthread
+ ${PTHREAD_LIBRARY}
rtosc rtosc-cpp)
if(CompileTests)
@@ -429,7 +464,8 @@ target_link_libraries(zynaddsubfx
${GUI_LIBRARIES}
${NIO_LIBRARIES}
${AUDIO_LIBRARIES}
- )
+ ${PLATFORM_LIBRARIES}
+ )
if (DssiEnable)
add_library(zynaddsubfx_dssi SHARED
diff --git a/src/DSP/SVFilter.cpp b/src/DSP/SVFilter.cpp
@@ -18,6 +18,7 @@
#include "../Misc/Util.h"
#include "SVFilter.h"
+#define errx(...)
#ifndef errx
#include <err.h>
#endif
diff --git a/src/DSP/Unison.cpp b/src/DSP/Unison.cpp
@@ -18,6 +18,8 @@
#include "Unison.h"
#include "globals.h"
+#define errx(...)
+#define warnx(...)
#ifndef errx
#include <err.h>
#endif
diff --git a/src/Misc/BankDb.cpp b/src/Misc/BankDb.cpp
@@ -14,9 +14,31 @@ BankEntry::BankEntry(void)
:id(0), add(false), pad(false), sub(false)
{}
+bool platform_strcasestr(const char *hay, const char *needle)
+{
+ int n = strlen(hay);
+ int m = strlen(needle);
+ for(int i=0; i<n; i++) {
+ int good = 1;
+ for(int j=0; j<m; ++j) {
+ if(toupper(hay[i+j]) != toupper(needle[j])) {
+ good = 0;
+break;
+}
+
+ }
+ if(good)
+ return 1;
+ }
+ return 0;
+
+}
+
bool sfind(std::string hay, std::string needle)
{
- return strcasestr(hay.c_str(), needle.c_str());
+ //return strcasestr(hay.c_str(), needle.c_str());
+ return platform_strcasestr(hay.c_str(), needle.c_str());
+ return false;
}
bool BankEntry::match(string s) const
diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp
@@ -49,6 +49,8 @@
#include <atomic>
#include <list>
+#define errx(...)
+#define warnx(...)
#ifndef errx
#include <err.h>
#endif
@@ -489,7 +491,7 @@ public:
assert(actual_load[npart] <= pending_load[npart]);
//load part in async fashion when possible
-#if HAVE_ASYNC
+#if 0
auto alloc = std::async(std::launch::async,
[master,filename,this,npart](){
Part *p = new Part(*master->memory, synth,
diff --git a/src/Misc/Schema.cpp b/src/Misc/Schema.cpp
@@ -168,7 +168,7 @@ void dump_param_cb(const rtosc::Port *p, const char *full_name, void *v)
const char *max = meta["max"];
for(auto m:meta) {
- if(strlen(m.title) >= 5 && !bcmp(m.title, "map ", 4)) {
+ if(strlen(m.title) >= 5 && !memcmp(m.title, "map ", 4)) {
int id = atoi(m.title+4);
std::string val = m.value;
options.push_back(std::make_pair(id, val));
diff --git a/src/Misc/Util.cpp b/src/Misc/Util.cpp
@@ -29,6 +29,7 @@
#include <sched.h>
#endif
+#define errx(...)
#ifndef errx
#include <err.h>
#endif
diff --git a/src/Plugin/CMakeLists.txt b/src/Plugin/CMakeLists.txt
@@ -5,8 +5,6 @@ CHECK_LIBRARY_EXISTS(dl dlopen "" LIBDL_FOUND)
IF(LIBDL_FOUND)
target_link_libraries(lv2-ttl-generator "dl")
-ENDIF(LIBDL_FOUND)
-
add_subdirectory(AlienWah)
add_subdirectory(Chorus)
add_subdirectory(Distortion)
@@ -14,4 +12,6 @@ add_subdirectory(DynamicFilter)
add_subdirectory(Echo)
add_subdirectory(Phaser)
add_subdirectory(Reverb)
+ENDIF(LIBDL_FOUND)
+
add_subdirectory(ZynAddSubFX)
diff --git a/src/Plugin/ZynAddSubFX/CMakeLists.txt b/src/Plugin/ZynAddSubFX/CMakeLists.txt
@@ -69,8 +69,10 @@ set_target_properties(ZynAddSubFX_vst PROPERTIES LIBRARY_OUTPUT_DIRECTORY "vst")
set_target_properties(ZynAddSubFX_vst PROPERTIES OUTPUT_NAME "ZynAddSubFX")
set_target_properties(ZynAddSubFX_vst PROPERTIES PREFIX "")
-target_link_libraries(ZynAddSubFX_lv2 zynaddsubfx_core ${OS_LIBRARIES} ${LIBLO_LIBRARIES})
-target_link_libraries(ZynAddSubFX_vst zynaddsubfx_core ${OS_LIBRARIES} ${LIBLO_LIBRARIES})
+target_link_libraries(ZynAddSubFX_lv2 zynaddsubfx_core ${OS_LIBRARIES} ${LIBLO_LIBRARIES}
+ ${PLATFORM_LIBRARIES})
+target_link_libraries(ZynAddSubFX_vst zynaddsubfx_core ${OS_LIBRARIES} ${LIBLO_LIBRARIES}
+ ${PLATFORM_LIBRARIES})
install(TARGETS ZynAddSubFX_lv2 LIBRARY DESTINATION ${PluginLibDir}/lv2/ZynAddSubFX.lv2/)
install(TARGETS ZynAddSubFX_vst LIBRARY DESTINATION ${PluginLibDir}/vst/)
diff --git a/src/Synth/OscilGen.cpp b/src/Synth/OscilGen.cpp
@@ -27,8 +27,6 @@
#include <rtosc/ports.h>
#include <rtosc/port-sugar.h>
-pthread_t main_thread;
-
#define rObject OscilGen
const rtosc::Ports OscilGen::non_realtime_ports = {
rSelf(OscilGen),
@@ -228,6 +226,10 @@ const rtosc::MergePorts OscilGen::ports{
&OscilGen::non_realtime_ports
};
+#ifndef M_PI_2
+# define M_PI_2 1.57079632679489661923 /* pi/2 */
+#endif
+
//operations on FFTfreqs
inline void clearAll(fft_t *freqs, int oscilsize)
diff --git a/src/Synth/SUBnote.cpp b/src/Synth/SUBnote.cpp
@@ -28,6 +28,10 @@
#include "../Misc/Util.h"
#include "../Misc/Allocator.h"
+#ifndef M_PI
+# define M_PI 3.14159265358979323846 /* pi */
+#endif
+
SUBnote::SUBnote(const SUBnoteParameters *parameters, SynthParams &spars)
:SynthNote(spars), pars(*parameters),
AmpEnvelope(nullptr),
diff --git a/src/UI/NSM.C b/src/UI/NSM.C
@@ -82,7 +82,7 @@ NSM_Client::command_open(const char *name,
char *new_filename;
- asprintf(&new_filename, "%s.xmz", name);
+ //asprintf(&new_filename, "%s.xmz", name);
struct stat st;
diff --git a/src/main.cpp b/src/main.cpp
@@ -17,6 +17,7 @@
#include <map>
#include <cmath>
#include <cctype>
+#include <ctime>
#include <algorithm>
#include <signal.h>
@@ -25,7 +26,6 @@
#include <getopt.h>
-#include <lo/lo.h>
#include <rtosc/ports.h>
#include <rtosc/thread-link.h>
#include "Params/PADnoteParameters.h"
@@ -39,6 +39,7 @@
//Nio System
#include "Nio/Nio.h"
+#include "Nio/InMgr.h"
//GUI System
#include "UI/Connection.h"
@@ -70,7 +71,6 @@ char *instance_name = 0;
void exitprogram(const Config &config);
-extern pthread_t main_thread;
//cleanup on signaled exit
void sigterm_exit(int /*sig*/)
@@ -117,9 +117,88 @@ void exitprogram(const Config& config)
FFT_cleanup();
}
+//Windows MIDI OH WHAT A HACK...
+#ifdef WIN32
+#include <windows.h>
+#include <mmsystem.h>
+extern InMgr *in;
+HMIDIIN winmidiinhandle = 0;
+
+void CALLBACK WinMidiInProc(HMIDIIN hMidiIn,UINT wMsg,DWORD dwInstance,
+ DWORD dwParam1,DWORD dwParam2)
+{
+ int midicommand=0;
+ if (wMsg==MIM_DATA) {
+ int cmd,par1,par2;
+ cmd=dwParam1&0xff;
+ if (cmd==0xfe) return;
+ par1=(dwParam1>>8)&0xff;
+ par2=dwParam1>>16;
+ int cmdchan=cmd&0x0f;
+ int cmdtype=(cmd>>4)&0x0f;
+
+ int tmp=0;
+ MidiEvent ev;
+ switch (cmdtype) {
+ case(0x8)://noteon
+ ev.type = 1;
+ ev.num = par1;
+ ev.channel = cmdchan;
+ ev.value = 0;
+ in->putEvent(ev);
+ break;
+ case(0x9)://noteoff
+ ev.type = 1;
+ ev.num = par1;
+ ev.channel = cmdchan;
+ ev.value = par2&0xff;
+ in->putEvent(ev);
+ break;
+ case(0xb)://controller
+ ev.type = 2;
+ ev.num = par1;
+ ev.channel = cmdchan;
+ ev.value = par2&0xff;
+ in->putEvent(ev);
+ break;
+ case(0xe)://pitch wheel
+ //tmp=(par1+par2*(long int) 128)-8192;
+ //winmaster->SetController(cmdchan,C_pitchwheel,tmp);
+ break;
+ default:
+ break;
+ };
+
+ };
+};
+
+void InitWinMidi(int midi)
+{
+(void)midi;
+ for(int i=0; i<10; ++i) {
+ long int res=midiInOpen(&winmidiinhandle,i,(DWORD_PTR)(void*)WinMidiInProc,0,CALLBACK_FUNCTION);
+ if(res == MMSYSERR_NOERROR) {
+ res=midiInStart(winmidiinhandle);
+ printf("[INFO] Starting Windows MIDI At %d with code %d(noerror=%d)\n", i, res, MMSYSERR_NOERROR);
+ if(res == 0)
+ return;
+ } else
+ printf("[INFO] No Windows MIDI Device At id %d\n", i);
+ }
+};
+
+//void StopWinMidi()
+//{
+// midiInStop(winmidiinhandle);
+// midiInClose(winmidiinhandle);
+//};
+#else
+void InitWinMidi(int) {}
+#endif
+
+
int main(int argc, char *argv[])
{
- main_thread = pthread_self();
SYNTH_T synth;
Config config;
config.init();
@@ -221,6 +300,7 @@ int main(int argc, char *argv[])
int option_index = 0, opt, exitwithhelp = 0, exitwithversion = 0;
int prefered_port = -1;
int auto_save_interval = 60;
+int wmidi = -1;
string loadfile, loadinstrument, execAfterInit, ui_title;
@@ -230,7 +310,7 @@ int main(int argc, char *argv[])
/**\todo check this process for a small memory leak*/
opt = getopt_long(argc,
argv,
- "l:L:r:b:o:I:O:N:e:P:A:u:D:hvapSDUY",
+ "l:L:r:b:o:I:O:N:e:P:A:u:D:hvapSDUYZ",
opts,
&option_index);
char *optarguments = optarg;
@@ -351,6 +431,10 @@ int main(int argc, char *argv[])
dump_json(outfile, Master::ports);
}
break;
+ case 'Z':
+ if(optarguments)
+ wmidi = atoi(optarguments);
+ break;
case 'u':
if(optarguments)
ui_title = optarguments;
@@ -445,18 +529,23 @@ int main(int argc, char *argv[])
middleware->updateResources(master);
//Run the Nio system
+ printf("[INFO] Nio::start()\n");
bool ioGood = Nio::start();
+ printf("[INFO] exec-after-init\n");
if(!execAfterInit.empty()) {
cout << "Executing user supplied command: " << execAfterInit << endl;
if(system(execAfterInit.c_str()) == -1)
cerr << "Command Failed..." << endl;
}
+ InitWinMidi(wmidi);
+
gui = NULL;
//Capture Startup Responses
+ printf("[INFO] startup OSC\n");
typedef std::vector<const char *> wait_t;
wait_t msg_waitlist;
middleware->setUiCallback([](void*v,const char*msg) {
@@ -467,12 +556,14 @@ int main(int argc, char *argv[])
wait.push_back(copy);
}, &msg_waitlist);
+ printf("[INFO] UI calbacks\n");
if(!noui)
gui = GUI::createUi(middleware->spawnUiApi(), &Pexitprogram);
middleware->setUiCallback(GUI::raiseUi, gui);
middleware->setIdleCallback([](void*){GUI::tickUi(gui);}, NULL);
//Replay Startup Responses
+ printf("[INFO] OSC replay\n");
for(auto msg:msg_waitlist) {
GUI::raiseUi(gui, msg);
delete [] msg;
@@ -490,12 +581,25 @@ int main(int argc, char *argv[])
"Default IO did not initialize.\nDefaulting to NULL backend.");
}
- if(auto_save_interval > 0) {
+ printf("[INFO] auto_save setup\n");
+ if(auto_save_interval > 0 && false) {
int old_save = middleware->checkAutoSave();
if(old_save > 0)
GUI::raiseUi(gui, "/alert-reload", "i", old_save);
middleware->enableAutoSave(auto_save_interval);
}
+ printf("[INFO] NSM Stuff\n");
+
+ //TODO move this stuff into Cmake
+#if USE_NSM && defined(WIN32)
+#undef USE_NSM
+#define USE_NSM 0
+#endif
+
+#if LASH && defined(WIN32)
+#undef LASH
+#define LASH 0
+#endif
#if USE_NSM
char *nsm_url = getenv("NSM_URL");
@@ -512,6 +616,7 @@ int main(int argc, char *argv[])
}
#endif
+ printf("[INFO] LASH Stuff\n");
#if USE_NSM
if(!nsm)
#endif
@@ -522,7 +627,9 @@ int main(int argc, char *argv[])
#endif
}
+ printf("[INFO] Main Loop...\n");
while(Pexitprogram == 0) {
+#ifndef WIN32
#if USE_NSM
if(nsm) {
nsm->check();
@@ -553,7 +660,11 @@ int main(int argc, char *argv[])
done:
#endif
GUI::tickUi(gui);
+#endif
middleware->tick();
+#ifdef WIN32
+ Sleep(1);
+#endif
}
exitprogram(config);