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:
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