zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit 3f266b752f4b73bc288e19d3e12fbb2594ff50ab
parent 8e30753aebf515b3e323034f712092c278e6491b
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Mon, 21 Dec 2009 18:12:35 -0800

Nio: Work on cygwin port

- Reworking a good bit of the platform specific code
- Fixing a possible segfault in OutMgr

Diffstat:
Mcmake/Findfftw.cmake | 4++--
Msrc/CMakeLists.txt | 19+++++++++++++++++--
Msrc/Input/CMakeLists.txt | 2+-
Msrc/Misc/Bank.cpp | 6++++--
Msrc/Misc/Config.cpp | 18+++++++++++-------
Msrc/Misc/Util.cpp | 19++++++++++++++++++-
Msrc/Misc/Util.h | 3+++
Msrc/Nio/OutMgr.cpp | 12+++++++++++-
Msrc/main.cpp | 48++++++++++++++++++++++--------------------------
9 files changed, 89 insertions(+), 42 deletions(-)

diff --git a/cmake/Findfftw.cmake b/cmake/Findfftw.cmake @@ -7,7 +7,7 @@ SET(fftw_FOUND 0) -IF(UNIX) +IF(UNIX OR CYGWIN) FIND_PATH(fftw_INCLUDE_DIR fftw3.h /usr/include @@ -18,7 +18,7 @@ IF(UNIX) /usr/lib ) -ENDIF(UNIX) +ENDIF(UNIX OR CYGWIN) # handle the QUIETLY and REQUIRED arguments and set fftw_FOUND to TRUE if # all listed variables are TRUE diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt @@ -97,14 +97,27 @@ if(PortAudioOutput) endif() add_definitions(-DFFTW_VERSION_${FFTW_VERSION} - -DOS_LINUX - -DALSAMIDIIN -DASM_F2I_YES -g #TODO #todo put in a better location -Wall -Wextra ) +#set os flag +if(CYGWIN) + add_definitions(-DOS_CYGWIN=1) + set(OS_LIBRARIES "-Wl,--enable-auto-import") +elseif(WINDOWS) + add_definitions(-DOS_WINDOWS=1) + set(OS_LIBRARIES "") +elseif(LINUX) + add_definitions(-DOS_LINUX=1) + set(OS_LIBRARIES "") +else() + message(STATUS Error: building on unsupported OS) +endif() + + if(FLTK_FOUND) mark_as_advanced(FORCE FLTK_BASE_LIBRARY) mark_as_advanced(FORCE FLTK_CONFIG_SCRIPT) @@ -176,6 +189,7 @@ macro(unit_test NAME CXX_FILE FILES) ${zlib_LIBRARIES} ${fftw_LIBRARIES} ${MXML_LIBRARIES} + ${OS_LIBRARIES} ) add_test("${NAME}" "${EXECUTABLE_OUTPUT_PATH}/${NAME}") endif() @@ -228,5 +242,6 @@ target_link_libraries(zynaddsubfx ${NIO_LIBRARIES} ${AUDIO_LIBRARIES} ${MIDIINPUT_LIBRARIES} + ${OS_LIBRARIES} ) diff --git a/src/Input/CMakeLists.txt b/src/Input/CMakeLists.txt @@ -1,4 +1,4 @@ -set(AlsaMidiInput On CACHE BOOL "Include ALSA Midi input") +set(AlsaMidiInput ${ALSA_FOUND} CACHE BOOL "Include ALSA Midi input") set(zynaddsubfx_input_SRCS MidiIn.cpp NULLMidiIn.cpp diff --git a/src/Misc/Bank.cpp b/src/Misc/Bank.cpp @@ -340,10 +340,12 @@ int Bank::newbank(const char *newbankdirname) strncat(bankdir, "/", MAX_STRING_SIZE); ; strncat(bankdir, newbankdirname, MAX_STRING_SIZE); -#ifdef OS_WINDOWS +#if OS_WINDOWS result = mkdir(bankdir); -#else +#elif OS_LINUX || OS_CYGWIN result = mkdir(bankdir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); +#else +#warning Undefined OS #endif if(result < 0) return -1; diff --git a/src/Misc/Config.cpp b/src/Misc/Config.cpp @@ -24,7 +24,7 @@ #include <stdlib.h> #include <string.h> -#ifdef OS_WINDOWS +#if OS_WINDOWS #include <windows.h> #include <mmsystem.h> #endif @@ -107,7 +107,7 @@ void Config::init() readConfig(filename); if(cfg.bankRootDirList[0] == NULL) { -#if defined(OS_LINUX) +#if OS_LINUX //banks cfg.bankRootDirList[0] = new char[MAX_STRING_SIZE]; sprintf(cfg.bankRootDirList[0], "~/banks"); @@ -146,7 +146,7 @@ void Config::init() } if(cfg.presetsDirList[0] == NULL) { -#if defined(OS_LINUX) +#if OS_LINUX || OS_CYGWIN //presets cfg.presetsDirList[0] = new char[MAX_STRING_SIZE]; sprintf(cfg.presetsDirList[0], "./"); @@ -163,7 +163,7 @@ void Config::init() cfg.presetsDirList[4] = new char[MAX_STRING_SIZE]; sprintf(cfg.presetsDirList[4], "/usr/local/share/zynaddsubfx/presets"); -#else +#elif OS_WINDOWS //presets cfg.presetsDirList[0] = new char[MAX_STRING_SIZE]; sprintf(cfg.presetsDirList[0], "./"); @@ -174,11 +174,13 @@ void Config::init() #else cfg.presetsDirList[1] = new char[MAX_STRING_SIZE]; sprintf(cfg.presetsDirList[1], "../presets"); -#endif +#endif //end vst cfg.presetsDirList[2] = new char[MAX_STRING_SIZE]; sprintf(cfg.presetsDirList[2], "presets"); -#endif +#else +#error Undefined OS +#endif //end OS } cfg.LinuxALSAaudioDev = "default"; cfg.nameTag = ""; @@ -398,8 +400,10 @@ void Config::getConfigFileName(char *name, int namesize) name[0] = 0; #ifdef OS_LINUX snprintf(name, namesize, "%s%s", getenv("HOME"), "/.zynaddsubfxXML.cfg"); -#else +#elif OS_WINDOWS || OS_CYGWIN snprintf(name, namesize, "%s", "zynaddsubfxXML.cfg"); +#else +#error Undefined OS #endif } diff --git a/src/Misc/Util.cpp b/src/Misc/Util.cpp @@ -31,6 +31,11 @@ #include <errno.h> #include <string.h> #include <sched.h> +#if OS_WINDOWS +//used for the sleep func +#include <winbase.h> +#include <windows.h> +#endif int SAMPLE_RATE = 44100; @@ -117,12 +122,24 @@ bool fileexists(const char *filename) void set_realtime() { -#ifdef OS_LINUX +#if OS_LINUX || OS_CYGWIN sched_param sc; sc.sched_priority = 60; //if you want get "sched_setscheduler undeclared" from compilation, //you can safely remove the folowing line: sched_setscheduler(0, SCHED_FIFO, &sc); //if (err==0) printf("Real-time"); +#else +#warning set_realtime() undefined for your opperating system +#endif +} + +void os_sleep(long length) +{ +#if OS_LINUX || OS_CYGWIN + usleep(length); +#elif OS_WINDOWS + Sleep((long)length/1000); #endif } + diff --git a/src/Misc/Util.h b/src/Misc/Util.h @@ -44,6 +44,9 @@ extern REALTYPE getdetune(unsigned char type, * pthread_attr_t*/ void set_realtime(); +/**Os independent sleep in microsecond*/ +void os_sleep(long length); + extern REALTYPE *denormalkillbuf; /**<the buffer to add noise in order to avoid denormalisation*/ extern Config config; diff --git a/src/Nio/OutMgr.cpp b/src/Nio/OutMgr.cpp @@ -155,6 +155,7 @@ void *OutMgr::outputThread() } pthread_exit(NULL); + return NULL; } void OutMgr::run() @@ -167,8 +168,17 @@ void OutMgr::run() AudioOut *OutMgr::getOut(string name) { + AudioOut *ans = NULL; + transform(name.begin(), name.end(), name.begin(), ::toupper); - return managedOuts[name]; + for(map<string,AudioOut*>::iterator itr = managedOuts.begin(); + itr != managedOuts.end(); ++itr) { + if(itr->first == name) { + ans = itr->second; + break; + } + } + return ans; } void OutMgr::add(AudioOut *driver) diff --git a/src/main.cpp b/src/main.cpp @@ -27,9 +27,9 @@ #include <unistd.h> #include <pthread.h> -#ifdef OS_LINUX +#if OS_LINUX || OS_CYGWIN #include <getopt.h> -#elif OS_WINDOIWS +#elif OS_WINDOWS #include <winbase.h> #include <windows.h> #endif @@ -41,6 +41,8 @@ extern Dump dump; #include "Nio/OutMgr.h" +#include "Input/MidiIn.h" + #ifdef ALSAMIDIIN #include "Input/ALSAMidiIn.h" #endif @@ -49,7 +51,7 @@ extern Dump dump; #include "Input/OSSMidiIn.h" #endif -#if (defined(NONEMIDIIN) || defined(VSTMIDIIN)) +#if (defined(NONEMIDIIN) || (defined(VSTMIDIIN))||(!ALSAMIDIIN && !OSSMIDIIN)) #include "Input/NULLMidiIn.h" #endif @@ -75,7 +77,7 @@ MasterUI *ui; using namespace std; -pthread_t thr1, thr2, thr3, thr4;/**@deprecated*/ +pthread_t thr1, thr2, thr3, thr4; Master *master; int swaplr = 0; //1 for left-right swapping bool usejackit = false; @@ -201,11 +203,7 @@ void *thread4(void *arg) } //if (!realtime player) atunci fac asta //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -#ifdef OS_LINUX - usleep(1000); -#elif OS_WINDOWS - Sleep(1); -#endif + os_sleep(1000); } return 0; @@ -246,7 +244,7 @@ void initprogram() #ifdef OSSMIDIIN Midi = new OSSMidiIn(); #endif -#if (defined(NONEMIDIIN) || (defined(VSTMIDIIN))) +#if (defined(NONEMIDIIN) || (defined(VSTMIDIIN))||(!ALSAMIDIIN && !OSSMIDIIN)) Midi = new NULLMidiIn(); #endif @@ -280,7 +278,7 @@ void exitprogram() delete [] denormalkillbuf; } -#ifdef OS_WINDOWS +#if OS_WINDOWS #define ARGSIZE 100 char winoptarguments[ARGSIZE]; char getopt(int argc, char *argv[], const char *shortopts, int *index) @@ -326,13 +324,13 @@ int main(int argc, char *argv[]) cerr << "Compiled: " << __DATE__ << " " << __TIME__ << endl; cerr << "This program is free software (GNU GPL v.2 or later) and \n"; cerr << "it comes with ABSOLUTELY NO WARRANTY.\n" << endl; -#ifdef OS_LINUX - if(argc == 1) - cerr << "Try 'zynaddsubfx --help' for command-line options." << endl; -#else - if(argc == 1) - cerr << "Try 'zynaddsubfx -h' for command-line options.\n" << endl; + if(argc == 1) +#if OS_LINUX || OS_CYGWIN + cerr << "Try 'zynaddsubfx --help' for command-line options." << endl; +#else //assuming windows + cerr << "Try 'zynaddsubfx -h' for command-line options.\n" << endl; #endif + /* Get the settings from the Config*/ SAMPLE_RATE = config.cfg.SampleRate; SOUND_BUFFER_SIZE = config.cfg.SoundBufferSize; @@ -341,7 +339,7 @@ int main(int argc, char *argv[]) /* Parse command-line options */ -#ifdef OS_LINUX +#if OS_LINUX || OS_CYGWIN struct option opts[] = { {"load", 2, NULL, 'l'}, {"load-instrument", 2, NULL, 'L' @@ -386,12 +384,14 @@ int main(int argc, char *argv[]) while(1) { /**\todo check this process for a small memory leak*/ -#ifdef OS_LINUX +#if OS_LINUX || OS_CYGWIN opt = getopt_long(argc, argv, "l:L:r:b:o:hSDUAY", opts, &option_index); char *optarguments = optarg; -#else +#elif OS_WINDOWS opt = getopt(argc, argv, "l:L:r:b:o:hSDUAY", &option_index); char *optarguments = &winoptarguments[0]; +#else +#error Undefined OS #endif if(opt == -1) @@ -505,7 +505,7 @@ int main(int argc, char *argv[]) << endl; #endif #endif -#ifdef OS_WINDOWS +#if OS == WINDOWS cout << "\nWARNING: On Windows systems, only short comandline parameters works." @@ -584,11 +584,7 @@ int main(int argc, char *argv[]) #endif while(Pexitprogram == 0) { -#ifdef OS_LINUX - usleep(100000); -#elif OS_WINDOWS - Sleep(100); -#endif + os_sleep(100000); } #ifdef WINMIDIIN