diff --git a/src/DSP/AnalogFilter.cpp b/src/DSP/AnalogFilter.cpp index 58f46a21..b25f1f6c 100644 --- a/src/DSP/AnalogFilter.cpp +++ b/src/DSP/AnalogFilter.cpp @@ -391,7 +391,11 @@ void AnalogFilter::filterout(float *smp) if(needsinterpolation) { //Merge Filter at old coeff with new coeff +#ifdef _MSC_VER + const auto ismp = static_cast(_alloca(buffersize * sizeof(float))); +#else float ismp[buffersize]; +#endif memcpy(ismp, smp, bufferbytes); for(int i = 0; i < stages + 1; ++i) diff --git a/src/DSP/FormantFilter.cpp b/src/DSP/FormantFilter.cpp index 36db5f6d..26761901 100644 --- a/src/DSP/FormantFilter.cpp +++ b/src/DSP/FormantFilter.cpp @@ -204,13 +204,18 @@ void FormantFilter::setfreq_and_q(float frequency, float q_) void FormantFilter::filterout(float *smp) { +#ifdef _MSC_VER + const auto inbuffer = static_cast(_alloca(buffersize * sizeof(float))); + const auto tmpbuf = static_cast(_alloca(buffersize * sizeof(float))); +#else float inbuffer[buffersize]; + float tmpbuf[buffersize]; +#endif memcpy(inbuffer, smp, bufferbytes); memset(smp, 0, bufferbytes); for(int j = 0; j < numformants; ++j) { - float tmpbuf[buffersize]; for(int i = 0; i < buffersize; ++i) tmpbuf[i] = inbuffer[i] * outgain; formant[j]->filterout(tmpbuf); diff --git a/src/DSP/SVFilter.cpp b/src/DSP/SVFilter.cpp index 5e27c39c..49fed553 100644 --- a/src/DSP/SVFilter.cpp +++ b/src/DSP/SVFilter.cpp @@ -165,7 +165,11 @@ void SVFilter::filterout(float *smp) singlefilterout(smp, st[i], par); if(needsinterpolation) { +#ifdef _MSC_VER + const auto ismp = static_cast(_alloca(buffersize * sizeof(float))); +#else float ismp[buffersize]; +#endif memcpy(ismp, smp, bufferbytes); for(int i = 0; i < stages + 1; ++i) diff --git a/src/Effects/EffectMgr.cpp b/src/Effects/EffectMgr.cpp index 08d4f1d8..7d9fdc60 100644 --- a/src/Effects/EffectMgr.cpp +++ b/src/Effects/EffectMgr.cpp @@ -34,7 +34,7 @@ #include using namespace std; -EffectMgr::EffectMgr(const bool insertion_, pthread_mutex_t *mutex_) +EffectMgr::EffectMgr(const bool insertion_, std::mutex *mutex_) :insertion(insertion_), efxoutl(new float[synth->buffersize]), efxoutr(new float[synth->buffersize]), @@ -142,9 +142,9 @@ void EffectMgr::changepreset_nolock(unsigned char npreset) //Change the preset of the current effect(with thread locking) void EffectMgr::changepreset(unsigned char npreset) { - pthread_mutex_lock(mutex); + mutex->lock(); changepreset_nolock(npreset); - pthread_mutex_unlock(mutex); + mutex->unlock(); } @@ -159,9 +159,9 @@ void EffectMgr::seteffectpar_nolock(int npar, unsigned char value) // Change a parameter of the current effect (with thread locking) void EffectMgr::seteffectpar(int npar, unsigned char value) { - pthread_mutex_lock(mutex); + mutex->lock(); seteffectpar_nolock(npar, value); - pthread_mutex_unlock(mutex); + mutex->unlock(); } //Get a parameter of the current effect diff --git a/src/Effects/EffectMgr.h b/src/Effects/EffectMgr.h index 256a8d81..71e2548b 100644 --- a/src/Effects/EffectMgr.h +++ b/src/Effects/EffectMgr.h @@ -22,7 +22,7 @@ #ifndef EFFECTMGR_H #define EFFECTMGR_H -#include +#include "ThreadShims.h" #include "Alienwah.h" #include "Phaser.h" @@ -43,7 +43,7 @@ class XMLwrapper; class EffectMgr:public Presets { public: - EffectMgr(const bool insertion_, pthread_mutex_t *mutex_); + EffectMgr(const bool insertion_, std::mutex *mutex_); ~EffectMgr(); void add2XML(XMLwrapper *xml); @@ -79,7 +79,7 @@ class EffectMgr:public Presets private: int nefx; Effect *efx; - pthread_mutex_t *mutex; + std::mutex *mutex; bool dryonly; }; diff --git a/src/Effects/Reverb.cpp b/src/Effects/Reverb.cpp index 74961b2f..b3f679e4 100644 --- a/src/Effects/Reverb.cpp +++ b/src/Effects/Reverb.cpp @@ -144,7 +144,11 @@ void Reverb::out(const Stereo &smp) if(!Pvolume && insertion) return; +#ifdef _MSC_VER + const auto inputbuf = static_cast(_alloca(buffersize * sizeof(float))); +#else float inputbuf[buffersize]; +#endif for(int i = 0; i < buffersize; ++i) inputbuf[i] = (smp.l[i] + smp.r[i]) / 2.0f; diff --git a/src/Misc/Bank.cpp b/src/Misc/Bank.cpp index 3d74629b..9e42e574 100644 --- a/src/Misc/Bank.cpp +++ b/src/Misc/Bank.cpp @@ -31,10 +31,15 @@ #include #include +#ifdef WIN32 +#include +#include "IoHelper.h" +#else #include #include #include #include +#endif #include "Config.h" #include "Util.h" @@ -260,14 +265,14 @@ int Bank::newbank(string newbankdirname) // FIXME: Zyn should automatically handle creation of parent directory #ifdef WIN32 - if(mkdir(bankdir.c_str()) < 0) return -1; + if(_wmkdir(lmms::toWString(bankdir).c_str()) < 0) return -1; #else if(mkdir(bankdir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) return -1; #endif bankdir += newbankdirname; #ifdef WIN32 - if(mkdir(bankdir.c_str()) < 0) + if(_wmkdir(lmms::toWString(bankdir).c_str()) < 0) #else if(mkdir(bankdir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0) #endif diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp index c4b8947b..331ab911 100644 --- a/src/Misc/Master.cpp +++ b/src/Misc/Master.cpp @@ -36,8 +36,6 @@ #include #include -#include - using namespace std; vuData::vuData(void) @@ -55,8 +53,6 @@ Master::Master() bufl = new float[synth->buffersize]; bufr = new float[synth->buffersize]; - pthread_mutex_init(&mutex, NULL); - pthread_mutex_init(&vumutex, NULL); fft = new FFTwrapper(synth->oscilsize); shutup = 0; @@ -116,11 +112,11 @@ bool Master::mutexLock(lockset request) { switch(request) { case MUTEX_TRYLOCK: - return !pthread_mutex_trylock(&mutex); + return mutex.try_lock(); case MUTEX_LOCK: - return !pthread_mutex_lock(&mutex); + mutex.lock(); return true; case MUTEX_UNLOCK: - return !pthread_mutex_unlock(&mutex); + mutex.unlock(); return true; } return false; } @@ -245,9 +241,9 @@ void Master::setProgram(char chan, unsigned int pgm) //Hack to get pad note parameters to update //this is not real time safe and makes assumptions about the calling //convention of this function... - pthread_mutex_unlock(&mutex); + mutex.unlock(); part[npart]->applyparameters(); - pthread_mutex_lock(&mutex); + mutex.lock(); } } @@ -336,9 +332,9 @@ void Master::AudioOut(float *outl, float *outr) //Compute part samples and store them part[npart]->partoutl,partoutr for(int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { - if(part[npart]->Penabled != 0 && !pthread_mutex_trylock(&part[npart]->load_mutex)) { + if(part[npart]->Penabled != 0 && part[npart]->load_mutex.try_lock()) { part[npart]->ComputePartSmps(); - pthread_mutex_unlock(&part[npart]->load_mutex); + part[npart]->load_mutex.unlock(); } } @@ -394,8 +390,13 @@ void Master::AudioOut(float *outl, float *outr) if(sysefx[nefx]->geteffect() == 0) continue; //the effect is disabled +#ifdef _MSC_VER + const auto tmpmixl = static_cast(_alloca(synth->buffersize * sizeof(float))); + const auto tmpmixr = static_cast(_alloca(synth->buffersize * sizeof(float))); +#else float tmpmixl[synth->buffersize]; float tmpmixr[synth->buffersize]; +#endif //Clean up the samples used by the system effects memset(tmpmixl, 0, synth->bufferbytes); memset(tmpmixr, 0, synth->bufferbytes); @@ -458,9 +459,9 @@ void Master::AudioOut(float *outl, float *outr) outr[i] *= volume; } - if(!pthread_mutex_trylock(&vumutex)) { + if(vumutex.try_lock()) { vuUpdate(outl, outr); - pthread_mutex_unlock(&vumutex); + vumutex.unlock(); } //Shutup if it is asked (with fade-out) @@ -530,9 +531,6 @@ Master::~Master() delete sysefx[nefx]; delete fft; - - pthread_mutex_destroy(&mutex); - pthread_mutex_destroy(&vumutex); } @@ -588,21 +586,21 @@ void Master::ShutUp() */ void Master::vuresetpeaks() { - pthread_mutex_lock(&vumutex); + vumutex.lock(); vu.outpeakl = 1e-9; vu.outpeakr = 1e-9; vu.maxoutpeakl = 1e-9; vu.maxoutpeakr = 1e-9; vu.clipped = 0; - pthread_mutex_unlock(&vumutex); + vumutex.unlock(); } vuData Master::getVuData() { vuData tmp; - pthread_mutex_lock(&vumutex); + vumutex.lock(); tmp = vu; - pthread_mutex_unlock(&vumutex); + vumutex.unlock(); return tmp; } @@ -673,9 +671,9 @@ int Master::getalldata(char **data) xml->beginbranch("MASTER"); - pthread_mutex_lock(&mutex); + mutex.lock(); add2XML(xml); - pthread_mutex_unlock(&mutex); + mutex.unlock(); xml->endbranch(); @@ -695,9 +693,9 @@ void Master::putalldata(char *data, int /*size*/) if(xml->enterbranch("MASTER") == 0) return; - pthread_mutex_lock(&mutex); + mutex.lock(); getfromXML(xml); - pthread_mutex_unlock(&mutex); + mutex.unlock(); xml->exitbranch(); diff --git a/src/Misc/Master.h b/src/Misc/Master.h index 2238d759..de37e484 100644 --- a/src/Misc/Master.h +++ b/src/Misc/Master.h @@ -23,7 +23,7 @@ #ifndef MASTER_H #define MASTER_H -#include +#include "ThreadShims.h" #include "../globals.h" #include "Microtonal.h" @@ -162,8 +162,8 @@ class Master Bank bank; class FFTwrapper * fft; - pthread_mutex_t mutex; - pthread_mutex_t vumutex; + std::mutex mutex; + std::mutex vumutex; private: diff --git a/src/Misc/Part.cpp b/src/Misc/Part.cpp index 144cec9f..fc999b71 100644 --- a/src/Misc/Part.cpp +++ b/src/Misc/Part.cpp @@ -36,12 +36,11 @@ #include #include -Part::Part(Microtonal *microtonal_, FFTwrapper *fft_, pthread_mutex_t *mutex_) +Part::Part(Microtonal *microtonal_, FFTwrapper *fft_, std::mutex *mutex_) { microtonal = microtonal_; fft = fft_; mutex = mutex_; - pthread_mutex_init(&load_mutex, NULL); partoutl = new float [synth->buffersize]; partoutr = new float [synth->buffersize]; @@ -232,7 +231,7 @@ void Part::NoteOn(unsigned char note, } else // Poly mode is On so just make sure the list is empty. - if(not monomemnotes.empty()) + if(!monomemnotes.empty()) monomemnotes.clear(); lastnote = note; @@ -254,7 +253,7 @@ void Part::NoteOn(unsigned char note, else { // Legato mode is on and applicable. legatomodevalid = true; - if((not ismonofirstnote) && (lastlegatomodevalid)) { + if((!ismonofirstnote) && (lastlegatomodevalid)) { // At least one other key is held or sustained, and the // previous note was played while in valid legato mode. doinglegato = true; // So we'll do a legato note. @@ -337,7 +336,7 @@ void Part::NoteOn(unsigned char note, // still held down or sustained for the Portamento to activate // (that's like Legato). int portamento = 0; - if((Ppolymode != 0) || (not ismonofirstnote)) + if((Ppolymode != 0) || (!ismonofirstnote)) // I added a third argument to the // ctl.initportamento(...) function to be able // to tell it if we're doing a legato note. @@ -629,13 +628,13 @@ void Part::NoteOff(unsigned char note) //release the key int i; // This note is released, so we remove it from the list. - if(not monomemnotes.empty()) + if(!monomemnotes.empty()) monomemnotes.remove(note); for(i = POLIPHONY - 1; i >= 0; i--) //first note in, is first out if there are same note multiple times if((partnote[i].status == KEY_PLAYING) && (partnote[i].note == note)) { if(ctl.sustain.sustain == 0) { //the sustain pedal is not pushed - if((Ppolymode == 0) && (not monomemnotes.empty())) + if((Ppolymode == 0) && (!monomemnotes.empty())) MonoMemRenote(); // To play most recent still held note. else RelaseNotePos(i); @@ -796,7 +795,7 @@ void Part::SetController(unsigned int type, int par) void Part::RelaseSustainedKeys() { // Let's call MonoMemRenote() on some conditions: - if((Ppolymode == 0) && (not monomemnotes.empty())) + if((Ppolymode == 0) && (!monomemnotes.empty())) if(monomemnotes.back() != lastnote) // Sustain controller manipulation would cause repeated same note respawn without this check. MonoMemRenote(); // To play most recent still held note. @@ -947,8 +946,13 @@ void Part::RunNote(unsigned int k) continue; noteplay++; +#ifdef _MSC_VER + const auto tmpoutr = static_cast(_alloca(synth->buffersize * sizeof(float))); + const auto tmpoutl = static_cast(_alloca(synth->buffersize * sizeof(float))); +#else float tmpoutr[synth->buffersize]; float tmpoutl[synth->buffersize]; +#endif (*note)->noteout(&tmpoutl[0], &tmpoutr[0]); if((*note)->finished()) { diff --git a/src/Misc/Part.h b/src/Misc/Part.h index ed247d30..f6e50155 100644 --- a/src/Misc/Part.h +++ b/src/Misc/Part.h @@ -29,7 +29,7 @@ #include "../Params/Controller.h" #include "../Misc/Microtonal.h" -#include +#include "ThreadShims.h" #include // For the monomemnotes list. class EffectMgr; @@ -47,8 +47,8 @@ class Part /**Constructor * @param microtonal_ Pointer to the microtonal object * @param fft_ Pointer to the FFTwrapper - * @param mutex_ Pointer to the master pthread_mutex_t*/ - Part(Microtonal *microtonal_, FFTwrapper *fft_, pthread_mutex_t *mutex_); + * @param mutex_ Pointer to the master std::mutex*/ + Part(Microtonal *microtonal_, FFTwrapper *fft_, std::mutex *mutex_); /**Destructor*/ ~Part(); @@ -152,8 +152,8 @@ class Part bool Pefxbypass[NUM_PART_EFX]; //if the effects are bypassed - pthread_mutex_t *mutex; - pthread_mutex_t load_mutex; + std::mutex *mutex; + std::mutex load_mutex; int lastnote; diff --git a/src/Misc/Util.cpp b/src/Misc/Util.cpp index 9025c622..24c14319 100644 --- a/src/Misc/Util.cpp +++ b/src/Misc/Util.cpp @@ -32,7 +32,7 @@ #include #include #include -#include +#include "ThreadShims.h" #include #include #ifdef HAVE_SCHEDULER @@ -135,7 +135,7 @@ void set_realtime() void os_sleep(long length) { - usleep(length); + std::this_thread::sleep_for(std::chrono::microseconds{length}); } std::string legalizeFilename(std::string filename) diff --git a/src/Nio/CMakeLists.txt b/src/Nio/CMakeLists.txt index 9386610b..f2c12212 100644 --- a/src/Nio/CMakeLists.txt +++ b/src/Nio/CMakeLists.txt @@ -42,6 +42,6 @@ if(OssEnable) endif(OssEnable) -add_library(zynaddsubfx_nio STATIC +add_library(zynaddsubfx_nio OBJECT ${zynaddsubfx_nio_SRCS} ) diff --git a/src/Nio/InMgr.cpp b/src/Nio/InMgr.cpp index 441a6dcd..b4eb15cd 100644 --- a/src/Nio/InMgr.cpp +++ b/src/Nio/InMgr.cpp @@ -44,7 +44,7 @@ InMgr::InMgr() :queue(100), master(Master::getInstance()) { current = NULL; - work.init(PTHREAD_PROCESS_PRIVATE, 0); + work.init(0, 0); } InMgr::~InMgr() diff --git a/src/Nio/NulEngine.cpp b/src/Nio/NulEngine.cpp index 633e2ae2..ee2cac81 100644 --- a/src/Nio/NulEngine.cpp +++ b/src/Nio/NulEngine.cpp @@ -23,17 +23,16 @@ #include "NulEngine.h" #include "../globals.h" -#include #include using namespace std; +using Clock = std::chrono::steady_clock; NulEngine::NulEngine() :AudioOut(), pThread(NULL) { name = "NULL"; - playing_until.tv_sec = 0; - playing_until.tv_usec = 0; + playing_until = Clock::time_point::min(); } void *NulEngine::_AudioThread(void *arg) @@ -46,28 +45,24 @@ void *NulEngine::AudioThread() while(pThread) { getNext(); - struct timeval now; - int remaining = 0; - gettimeofday(&now, NULL); - if((playing_until.tv_usec == 0) && (playing_until.tv_sec == 0)) { - playing_until.tv_usec = now.tv_usec; - playing_until.tv_sec = now.tv_sec; + using namespace std::literals::chrono_literals; + const auto now = Clock::now(); + auto remaining = Clock::duration{}; + if(playing_until == Clock::time_point::min()) { + playing_until = now; } else { - remaining = (playing_until.tv_usec - now.tv_usec) - + (playing_until.tv_sec - now.tv_sec) * 1000000; - if(remaining > 10000) //Don't sleep() less than 10ms. + remaining = playing_until - now; + if(remaining > 10ms) //Don't sleep() less than 10ms. //This will add latency... - usleep(remaining - 10000); - if(remaining < 0) + std::this_thread::sleep_for(remaining - 10ms); + if(remaining < 0ms) cerr << "WARNING - too late" << endl; } - playing_until.tv_usec += synth->buffersize * 1000000 + playing_until += synth->buffersize * std::chrono::duration_cast(1s) / synth->samplerate; - if(remaining < 0) - playing_until.tv_usec -= remaining; - playing_until.tv_sec += playing_until.tv_usec / 1000000; - playing_until.tv_usec %= 1000000; + if(remaining < 0ms) + playing_until -= remaining; } return NULL; } @@ -90,19 +85,14 @@ void NulEngine::setAudioEn(bool nval) { if(nval) { if(!getAudioEn()) { - pthread_t *thread = new pthread_t; - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - pThread = thread; - pthread_create(pThread, &attr, _AudioThread, this); + pThread = new std::thread{_AudioThread, this}; } } else if(getAudioEn()) { - pthread_t *thread = pThread; + std::thread *thread = pThread; pThread = NULL; - pthread_join(*thread, NULL); + thread->join(); delete thread; } } diff --git a/src/Nio/NulEngine.h b/src/Nio/NulEngine.h index 18341809..a363e4c2 100644 --- a/src/Nio/NulEngine.h +++ b/src/Nio/NulEngine.h @@ -23,8 +23,8 @@ #ifndef NUL_ENGINE_H #define NUL_ENGINE_H -#include -#include +#include +#include "ThreadShims.h" #include "../globals.h" #include "AudioOut.h" #include "MidiIn.h" @@ -49,8 +49,8 @@ class NulEngine:public AudioOut, MidiIn static void *_AudioThread(void *arg); private: - struct timeval playing_until; - pthread_t *pThread; + std::chrono::steady_clock::time_point playing_until; + std::thread *pThread; }; #endif diff --git a/src/Nio/OutMgr.cpp b/src/Nio/OutMgr.cpp index 7fbe2417..ef94513d 100644 --- a/src/Nio/OutMgr.cpp +++ b/src/Nio/OutMgr.cpp @@ -26,7 +26,6 @@ OutMgr::OutMgr() { currentOut = NULL; stales = 0; - master = Master::getInstance(); //init samples outr = new float[synth->buffersize]; @@ -61,13 +60,13 @@ const Stereo OutMgr::tick(unsigned int frameSize) int i=0; while(frameSize > storedSmps()) { if(!midi.empty()) { - pthread_mutex_lock(&(master.mutex)); + master.mutex.lock(); midi.flush(i*synth->buffersize, (i+1)*synth->buffersize); - pthread_mutex_unlock(&(master.mutex)); + master.mutex.unlock(); } - pthread_mutex_lock(&(master.mutex)); + master.mutex.lock(); master.AudioOut(outl, outr); - pthread_mutex_unlock(&(master.mutex)); + master.mutex.unlock(); addSmps(outl, outr); i++; } diff --git a/src/Nio/OutMgr.h b/src/Nio/OutMgr.h index bc3a922d..b503b100 100644 --- a/src/Nio/OutMgr.h +++ b/src/Nio/OutMgr.h @@ -4,8 +4,6 @@ #include "../Misc/Stereo.h" #include #include -#include -#include class AudioOut; @@ -49,8 +47,6 @@ class OutMgr AudioOut *currentOut; /** priBuf; //buffer for primary drivers Stereo priBuffCurrent; //current array accessor diff --git a/src/Nio/SafeQueue.cpp b/src/Nio/SafeQueue.cpp index 510e4b20..db1951bb 100644 --- a/src/Nio/SafeQueue.cpp +++ b/src/Nio/SafeQueue.cpp @@ -3,8 +3,8 @@ template SafeQueue::SafeQueue(size_t maxlen) :writePtr(0), readPtr(0), bufSize(maxlen) { - w_space.init(PTHREAD_PROCESS_PRIVATE, maxlen - 1); - r_space.init(PTHREAD_PROCESS_PRIVATE, 0); + w_space.init(0, maxlen - 1); + r_space.init(0, 0); buffer = new T[maxlen]; } diff --git a/src/Nio/SafeQueue.h b/src/Nio/SafeQueue.h index 9bba53a6..dcebd253 100644 --- a/src/Nio/SafeQueue.h +++ b/src/Nio/SafeQueue.h @@ -3,8 +3,6 @@ #define SAFEQUEUE_H #include #include "ZynSema.h" -#include -#include /** * C++ thread safe lockless queue diff --git a/src/Nio/WavEngine.cpp b/src/Nio/WavEngine.cpp index 1c3d66ec..2c3a31e4 100644 --- a/src/Nio/WavEngine.cpp +++ b/src/Nio/WavEngine.cpp @@ -28,7 +28,7 @@ using namespace std; WavEngine::WavEngine() :AudioOut(), file(NULL), buffer(synth->samplerate * 4), pThread(NULL) { - work.init(PTHREAD_PROCESS_PRIVATE, 0); + work.init(0, 0); } WavEngine::~WavEngine() @@ -46,12 +46,7 @@ bool WavEngine::Start() { if(pThread) return true; - pThread = new pthread_t; - - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - pthread_create(pThread, &attr, _AudioThread, this); + pThread = new std::thread{_AudioThread, this}; return true; } @@ -61,11 +56,11 @@ void WavEngine::Stop() if(!pThread) return; - pthread_t *tmp = pThread; + std::thread *tmp = pThread; pThread = NULL; work.post(); - pthread_join(*tmp, NULL); + tmp->join(); delete pThread; } diff --git a/src/Nio/WavEngine.h b/src/Nio/WavEngine.h index 73f553c9..2e786e8a 100644 --- a/src/Nio/WavEngine.h +++ b/src/Nio/WavEngine.h @@ -24,7 +24,7 @@ #define WAVENGINE_H #include "AudioOut.h" #include -#include +#include "ThreadShims.h" #include "ZynSema.h" #include "SafeQueue.h" @@ -56,6 +56,6 @@ class WavEngine:public AudioOut ZynSema work; SafeQueue buffer; - pthread_t *pThread; + std::thread *pThread; }; #endif diff --git a/src/Nio/ZynSema.h b/src/Nio/ZynSema.h index c41477e0..b4b36943 100644 --- a/src/Nio/ZynSema.h +++ b/src/Nio/ZynSema.h @@ -3,7 +3,7 @@ #if defined __APPLE__ || defined WIN32 -#include +#include "ThreadShims.h" class ZynSema { @@ -12,45 +12,38 @@ class ZynSema { } - ~ZynSema (void) - { - pthread_mutex_destroy (&_mutex); - pthread_cond_destroy (&_cond); - } - int init (int, int v) { _count = v; - return pthread_mutex_init (&_mutex, 0) || pthread_cond_init (&_cond, 0); + return 0; } int post (void) { - pthread_mutex_lock (&_mutex); - if (++_count == 1) pthread_cond_signal (&_cond); - pthread_mutex_unlock (&_mutex); + _mutex.lock(); + if (++_count == 1) _cond.notify_one(); + _mutex.unlock(); return 0; } int wait (void) { - pthread_mutex_lock (&_mutex); - while (_count < 1) pthread_cond_wait (&_cond, &_mutex); + auto lock = std::unique_lock{_mutex}; + while (_count < 1) _cond.wait(lock); --_count; - pthread_mutex_unlock (&_mutex); return 0; } int trywait (void) { - if (pthread_mutex_trylock (&_mutex)) return -1; + if (!_mutex.try_lock()) return -1; if (_count < 1) { - pthread_mutex_unlock (&_mutex); + _mutex.unlock(); return -1; } --_count; - pthread_mutex_unlock (&_mutex); + _mutex.unlock(); return 0; } @@ -62,8 +55,8 @@ class ZynSema private: int _count; - pthread_mutex_t _mutex; - pthread_cond_t _cond; + std::mutex _mutex; + std::condition_variable _cond; }; #else // POSIX sempahore diff --git a/src/Params/PADnoteParameters.cpp b/src/Params/PADnoteParameters.cpp index 5d4af3d1..31437b17 100644 --- a/src/Params/PADnoteParameters.cpp +++ b/src/Params/PADnoteParameters.cpp @@ -24,7 +24,7 @@ #include "../Misc/WavFile.h" PADnoteParameters::PADnoteParameters(FFTwrapper *fft_, - pthread_mutex_t *mutex_):Presets() + std::mutex *mutex_):Presets() { setpresettype("Ppadsynth"); @@ -395,7 +395,11 @@ void PADnoteParameters::generatespectrum_bandwidthMode(float *spectrum, for(int i = 0; i < size; ++i) spectrum[i] = 0.0f; +#ifdef _MSC_VER + const auto harmonics = static_cast(_alloca(synth->oscilsize / 2 * sizeof(float))); +#else float harmonics[synth->oscilsize / 2]; +#endif for(int i = 0; i < synth->oscilsize / 2; ++i) harmonics[i] = 0.0f; //get the harmonic structure from the oscillator (I am using the frequency amplitudes, only) @@ -503,7 +507,11 @@ void PADnoteParameters::generatespectrum_otherModes(float *spectrum, for(int i = 0; i < size; ++i) spectrum[i] = 0.0f; +#ifdef _MSC_VER + const auto harmonics = static_cast(_alloca(synth->oscilsize / 2 * sizeof(float))); +#else float harmonics[synth->oscilsize / 2]; +#endif for(int i = 0; i < synth->oscilsize / 2; ++i) harmonics[i] = 0.0f; //get the harmonic structure from the oscillator (I am using the frequency amplitudes, only) @@ -565,7 +573,11 @@ void PADnoteParameters::applyparameters(bool lockmutex) int spectrumsize = samplesize / 2; float *spectrum = new float[spectrumsize]; int profilesize = 512; +#ifdef _MSC_VER + const auto profile = static_cast(_alloca(profilesize * sizeof(float))); +#else float profile[profilesize]; +#endif float bwadjust = getprofile(profile, profilesize); @@ -591,7 +603,11 @@ void PADnoteParameters::applyparameters(bool lockmutex) FFTwrapper *fft = new FFTwrapper(samplesize); fft_t *fftfreqs = new fft_t[samplesize / 2]; +#ifdef _MSC_VER + const auto adj = static_cast(_alloca(samplemax * sizeof(float))); +#else float adj[samplemax]; //this is used to compute frequency relation to the base frequency +#endif for(int nsample = 0; nsample < samplemax; ++nsample) adj[nsample] = (Pquality.oct + 1.0f) * (float)nsample / samplemax; for(int nsample = 0; nsample < samplemax; ++nsample) { @@ -637,12 +653,12 @@ void PADnoteParameters::applyparameters(bool lockmutex) //replace the current sample with the new computed sample if(lockmutex) { - pthread_mutex_lock(mutex); + mutex->lock(); deletesample(nsample); sample[nsample].smp = newsample.smp; sample[nsample].size = samplesize; sample[nsample].basefreq = basefreq * basefreqadjust; - pthread_mutex_unlock(mutex); + mutex->unlock(); } else { deletesample(nsample); @@ -658,10 +674,10 @@ void PADnoteParameters::applyparameters(bool lockmutex) //delete the additional samples that might exists and are not useful if(lockmutex) { - pthread_mutex_lock(mutex); + mutex->lock(); for(int i = samplemax; i < PAD_MAX_SAMPLES; ++i) deletesample(i); - pthread_mutex_unlock(mutex); + mutex->unlock(); } else for(int i = samplemax; i < PAD_MAX_SAMPLES; ++i) diff --git a/src/Params/PADnoteParameters.h b/src/Params/PADnoteParameters.h index b3283216..ad3c8c8d 100644 --- a/src/Params/PADnoteParameters.h +++ b/src/Params/PADnoteParameters.h @@ -35,12 +35,12 @@ #include "FilterParams.h" #include "Presets.h" #include -#include +#include "ThreadShims.h" class PADnoteParameters:public Presets { public: - PADnoteParameters(FFTwrapper *fft_, pthread_mutex_t *mutex_); + PADnoteParameters(FFTwrapper *fft_, std::mutex *mutex_); ~PADnoteParameters(); void defaults(); @@ -171,7 +171,7 @@ class PADnoteParameters:public Presets void deletesample(int n); FFTwrapper *fft; - pthread_mutex_t *mutex; + std::mutex *mutex; }; diff --git a/src/Synth/ADnote.cpp b/src/Synth/ADnote.cpp index 201a6771..df64aad8 100644 --- a/src/Synth/ADnote.cpp +++ b/src/Synth/ADnote.cpp @@ -136,7 +136,11 @@ ADnote::ADnote(ADnoteParameters *pars, }; break; default: { //unison for more than 2 subvoices +#ifdef _MSC_VER + const auto unison_values = static_cast(_alloca(unison * sizeof(float))); +#else float unison_values[unison]; +#endif float min = -1e-6, max = 1e-6; for(int k = 0; k < unison; ++k) { float step = (k / (float) (unison - 1)) * 2.0f - 1.0f; //this makes the unison spread more uniform diff --git a/src/Synth/OscilGen.cpp b/src/Synth/OscilGen.cpp index d3f39a12..df179d6e 100644 --- a/src/Synth/OscilGen.cpp +++ b/src/Synth/OscilGen.cpp @@ -25,6 +25,7 @@ #include #include +#define _USE_MATH_DEFINES #include #include @@ -203,7 +204,11 @@ void OscilGen::defaults() void OscilGen::convert2sine() { float mag[MAX_AD_HARMONICS], phase[MAX_AD_HARMONICS]; +#ifdef _MSC_VER + const auto oscil = static_cast(_alloca(synth->oscilsize * sizeof(float))); +#else float oscil[synth->oscilsize]; +#endif fft_t *freqs = new fft_t[synth->oscilsize / 2]; get(oscil, -1.0f); diff --git a/src/Synth/SUBnote.cpp b/src/Synth/SUBnote.cpp index 2f352afb..cc2975b4 100644 --- a/src/Synth/SUBnote.cpp +++ b/src/Synth/SUBnote.cpp @@ -20,6 +20,7 @@ */ +#define _USE_MATH_DEFINES #include #include #include @@ -505,8 +506,13 @@ int SUBnote::noteout(float *outl, float *outr) if(NoteEnabled == OFF) return 0; +#ifdef _MSC_VER + const auto tmprnd = static_cast(_alloca(synth->buffersize * sizeof(float))); + const auto tmpsmp = static_cast(_alloca(synth->buffersize * sizeof(float))); +#else float tmprnd[synth->buffersize]; float tmpsmp[synth->buffersize]; +#endif //left channel for(int i = 0; i < synth->buffersize; ++i) tmprnd[i] = RND * 2.0f - 1.0f; diff --git a/src/UI/BankUI.fl b/src/UI/BankUI.fl index a7eab825..a7aa98e1 100644 --- a/src/UI/BankUI.fl +++ b/src/UI/BankUI.fl @@ -265,9 +265,9 @@ if ((what==2)&&(bank->emptyslot(slot)==0)&&(mode!=4)) {//Rename slot }; if ((what==1)&&(mode==1)&&(!bank->emptyslot(slot))){//Reads from slot - pthread_mutex_lock(&master->part[*npart]->load_mutex); + master->part[*npart]->load_mutex.lock(); bank->loadfromslot(slot,master->part[*npart]); - pthread_mutex_unlock(&master->part[*npart]->load_mutex); + master->part[*npart]->load_mutex.unlock(); master->part[*npart]->applyparameters(); snprintf((char *)master->part[*npart]->Pname,PART_MAX_NAME_LEN,"%s",bank->getname(slot).c_str()); cbwig->do_callback(); @@ -281,9 +281,9 @@ if ((what==1)&&(mode==2)){//save(write) to slot if (!bank->emptyslot(slot)){ if (!fl_choice("Overwrite the slot no. %d ?","No","Yes",NULL,slot+1)) goto nooverwriteslot; }; - pthread_mutex_lock(&master->part[*npart]->load_mutex); + master->part[*npart]->load_mutex.lock(); bank->savetoslot(slot,master->part[*npart]); - pthread_mutex_unlock(&master->part[*npart]->load_mutex); + master->part[*npart]->load_mutex.unlock(); bs[slot]->refresh(); mode=1;readbutton->value(1);writebutton->value(0); diff --git a/src/UI/CMakeLists.txt b/src/UI/CMakeLists.txt index 38ea1e11..723d8b88 100644 --- a/src/UI/CMakeLists.txt +++ b/src/UI/CMakeLists.txt @@ -29,7 +29,7 @@ if(LibloEnable) set(zynaddsubfx_gui_FLTK_UI_SRCS ${zynaddsubfx_gui_FLTK_UI_SRCS} NSM.C NSM/Client.C) endif() -add_library(zynaddsubfx_gui STATIC +add_library(zynaddsubfx_gui OBJECT ${UI_objs} ${zynaddsubfx_gui_FLTK_UI_SRCS} NioUI.cpp diff --git a/src/UI/MasterUI.fl b/src/UI/MasterUI.fl index 641f8321..c537e22f 100644 --- a/src/UI/MasterUI.fl +++ b/src/UI/MasterUI.fl @@ -92,7 +92,7 @@ int ox=x(); int oy=y(); int lx=w(); int ly=h(); vuData data = master->getVuData(); -//pthread_mutex_lock(&master->mutex); +//master->mutex.lock(); float dbl=rap2dB(data.outpeakl); float dbr=rap2dB(data.outpeakr); float rmsdbl=rap2dB(data.rmspeakl); @@ -100,7 +100,7 @@ float rmsdbr=rap2dB(data.rmspeakr); float maxdbl=rap2dB(data.maxoutpeakl); float maxdbr=rap2dB(data.maxoutpeakr); int clipped=data.clipped; -//pthread_mutex_unlock(&master->mutex); +//master->mutex.unlock(); dbl=(MIN_DB-dbl)/MIN_DB; if (dbl<0.0) dbl=0.0; @@ -198,9 +198,9 @@ if ((maxdbr>MIN_DB-20)){ int ox=x(); int oy=y(); int lx=w(); int ly=h(); if (!active_r()){ - pthread_mutex_lock(&master->vumutex); + master->vumutex.lock(); int fakedb=master->fakepeakpart[npart]; - pthread_mutex_unlock(&master->vumutex); + master->vumutex.unlock(); fl_rectf(ox,oy,lx,ly,140,140,140); if (fakedb>0){ fakedb=(int)(fakedb/255.0*ly)+4; @@ -211,9 +211,9 @@ if (!active_r()){ }; //draw the vu lines -pthread_mutex_lock(&master->vumutex); +master->vumutex.lock(); float db=rap2dB(master->vuoutpeakpart[npart]); -pthread_mutex_unlock(&master->vumutex); +master->vumutex.unlock(); db=(MIN_DB-db)/MIN_DB; if (db<0.0) db=0.0; @@ -259,9 +259,9 @@ float tmp=ly*1.0/MIN_DB; break; case FL_PUSH: if (npart>=0) break; - pthread_mutex_lock(&master->mutex); + master->mutex.lock(); master->vuresetpeaks(); - pthread_mutex_unlock(&master->mutex); + master->mutex.unlock(); break; }; return(1);} {} @@ -370,9 +370,9 @@ bankui->show();} } Fl_Check_Button partenabled { label 01 - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); master->partonoff(npart,(int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if ((int) o->value()==0) panellistitemgroup->deactivate(); else { @@ -499,13 +499,13 @@ class MasterUI {open filename=fl_file_chooser("Open:","({*.xsz})",NULL,0); if (filename==NULL) return; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); //clear all parameters master->microtonal.defaults(); //load the data int result=master->microtonal.loadXML(filename); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); delete microtonalui; @@ -532,9 +532,9 @@ if (result) { }; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); result=master->microtonal.saveXML(filename); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if (result<0) fl_alert("Error: Could not save the file."); @@ -577,9 +577,9 @@ nioui.show();} label {&Clear Instrument...} callback {if (fl_choice("Clear instrument's parameters ?","No","Yes",NULL)){ // int npart=(int)npartcounter->value()-1; - pthread_mutex_lock(&master->mutex); + master->mutex.lock(); master->part[npart]->defaultsinstrument(); - pthread_mutex_unlock(&master->mutex); + master->mutex.unlock(); npartcounter->do_callback(); }; @@ -594,7 +594,7 @@ filename=fl_file_chooser("Load:","({*.xiz})",NULL,0); if (filename==NULL) return; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); // int npart=(int)npartcounter->value()-1; //clear all instrument parameters, first @@ -603,7 +603,7 @@ pthread_mutex_lock(&master->mutex); //load the instr. parameters int result=master->part[npart]->loadXMLinstrument(filename); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); master->part[npart]->applyparameters(); npartcounter->do_callback(); @@ -629,9 +629,9 @@ if (result) { }; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); result=master->part[npart]->saveXML(filename); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if (result<0) fl_alert("Error: Could not save the file."); @@ -709,9 +709,9 @@ if (result!=0) fl_alert("Error: Could not save the file.");} Fl_Button {} { label {Panic!} callback {virkeyboard->relaseallkeys(); -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); master->shutup=1; -pthread_mutex_unlock(&master->mutex);} +master->mutex.unlock();} xywh {280 29 105 53} color 90 labelfont 1 } Fl_Group partuigroup {open @@ -742,9 +742,9 @@ syseffectui->refresh(master->sysefx[nsyseff]);} } Fl_Choice sysefftype { label EffType - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); master->sysefx[nsyseff]->changeeffect((int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); syseffectui->refresh(master->sysefx[nsyseff]);} xywh {285 176 100 22} down_box BORDER_BOX labelsize 10 code0 {o->value(master->sysefx[nsyseff]->geteffect());} @@ -807,9 +807,9 @@ syseffectui->refresh(master->sysefx[nsyseff]);} } Fl_Button {} { label P - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); presetsui->paste(master->sysefx[nsyseff],syseffectui); -pthread_mutex_unlock(&master->mutex);} +master->mutex.unlock();} xywh {210 187 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 55 } } @@ -839,9 +839,9 @@ if (master->Pinsparts[ninseff]!=-1) { } Fl_Choice insefftype { label EffType - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); master->insefx[ninseff]->changeeffect((int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); inseffectui->refresh(master->insefx[ninseff]); inseffectui->show();} xywh {285 173 100 22} down_box BORDER_BOX labelsize 10 @@ -920,9 +920,9 @@ master->insefx[ninseff]->cleanup();} open } Fl_Button {} { label P - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); presetsui->paste(master->insefx[ninseff],inseffectui); -pthread_mutex_unlock(&master->mutex);} +master->mutex.unlock();} xywh {210 185 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 55 } } @@ -1188,7 +1188,7 @@ filename=fl_file_chooser("Load:","({*.xiz})",NULL,0); if (filename==NULL) return; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); // int npart=(int)npartcounter->value()-1; //clear all instrument parameters, first @@ -1197,7 +1197,7 @@ pthread_mutex_lock(&master->mutex); //load the instr. parameters int result=master->part[npart]->loadXMLinstrument(filename); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); master->part[npart]->applyparameters(); simplenpartcounter->do_callback(); @@ -1329,9 +1329,9 @@ simplemaxkcounter->do_callback();} } Fl_Check_Button partenabled { label Enabled - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); master->partonoff(npart,(int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if ((int) o->value()==0) simplelistitemgroup->deactivate(); else { @@ -1375,9 +1375,9 @@ simplerefresh();} } Fl_Choice simplesysefftype { label EffType - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); master->sysefx[nsyseff]->changeeffect((int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); simplesyseffectui->refresh(master->sysefx[nsyseff]);} xywh {515 80 70 15} down_box BORDER_BOX labelsize 10 align 5 code0 {o->value(master->sysefx[nsyseff]->geteffect());} @@ -1435,9 +1435,9 @@ simplesyseffectui->refresh(master->sysefx[nsyseff]);} } Fl_Button {} { label P - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); presetsui->paste(master->sysefx[nsyseff],simplesyseffectui); -pthread_mutex_unlock(&master->mutex);} +master->mutex.unlock();} xywh {560 65 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 55 } } @@ -1467,9 +1467,9 @@ if (master->Pinsparts[ninseff]!=-1) { } Fl_Choice simpleinsefftype { label EffType - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); master->insefx[ninseff]->changeeffect((int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); simpleinseffectui->refresh(master->insefx[ninseff]); simpleinseffectui->show();} xywh {515 80 70 15} down_box BORDER_BOX labelsize 10 align 5 @@ -1543,9 +1543,9 @@ master->insefx[ninseff]->cleanup();} open } {} Fl_Button {} { label P - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); presetsui->paste(master->insefx[ninseff],simpleinseffectui); -pthread_mutex_unlock(&master->mutex);} +master->mutex.unlock();} xywh {560 65 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 55 } } @@ -1578,9 +1578,9 @@ pthread_mutex_unlock(&master->mutex);} Fl_Button {} { label {Stop ALL sounds!} callback {virkeyboard->relaseallkeys(); -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); master->shutup=1; -pthread_mutex_unlock(&master->mutex);} +master->mutex.unlock();} xywh {5 149 115 31} color 90 labelfont 1 labelsize 10 } Fl_Button {} { @@ -1756,9 +1756,9 @@ simplesyseffsend->value(master->Psysefxvol[nsyseff][npart]);} {} Function {do_new_master_unconditional()} {} { code {delete microtonalui; - pthread_mutex_lock(&master->mutex); + master->mutex.lock(); master->defaults(); - pthread_mutex_unlock(&master->mutex); + master->mutex.unlock(); npartcounter->value(1); refresh_master_ui(); @@ -1771,7 +1771,7 @@ simplesyseffsend->value(master->Psysefxvol[nsyseff][npart]);} {} } Function {do_load_master_unconditional(const char *filename, const char *display_name)} {return_type int } { - code {pthread_mutex_lock(&master->mutex); + code {master->mutex.lock(); //clear all parameters master->defaults(); @@ -1779,7 +1779,7 @@ simplesyseffsend->value(master->Psysefxvol[nsyseff][npart]);} {} int result=master->loadXML(filename); master->applyparameters(false); - pthread_mutex_unlock(&master->mutex); + master->mutex.unlock(); npartcounter->value(1); refresh_master_ui(); @@ -1825,9 +1825,9 @@ char *tmp; } -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); result=master->saveXML(filename); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if (result<0) fl_alert("Error: Could not save the file."); else diff --git a/src/UI/OscilGenUI.fl b/src/UI/OscilGenUI.fl index 54329db5..14a1f90c 100644 --- a/src/UI/OscilGenUI.fl +++ b/src/UI/OscilGenUI.fl @@ -74,10 +74,10 @@ float x; float* spc=new float[n]; for (i=0;imutex); +master->mutex.lock(); if (oscbase==0) oscil->getspectrum(n,spc,0); else oscil->getspectrum(n,spc,1); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); //normalize float max=0; @@ -186,11 +186,15 @@ master=master_;} {} Function {draw()} {open } { code {int ox=x(),oy=y(),lx=w(),ly=h()-1,i; +\#ifdef _MSC_VER +const auto smps = static_cast(_alloca(synth->oscilsize * sizeof(float))); +\#else float smps[synth->oscilsize]; -pthread_mutex_lock(&master->mutex); +\#endif +master->mutex.lock(); if (oscbase==0) oscil->get(smps,-1.0); else oscil->getcurrentbasefunction(smps); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if (damage()!=1){ fl_color( fl_color_average( FL_BLACK, FL_BACKGROUND_COLOR, 0.5 )); @@ -262,14 +266,14 @@ if (Fl::event_button3()) o->value(x); if (x==64) o->selection_color(0); else o->selection_color(222); -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); oscil->Phmag[n]=x; if (x==64) { oscil->Phphase[n]=64; phase->value(64); }; oscil->prepare(); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); display->redraw(); oldosc->redraw(); @@ -288,10 +292,10 @@ if (cbwidget!=NULL) { if (Fl::event_button3()) o->value(x); else x=(int)o->value(); -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); oscil->Phphase[n]=x; oscil->prepare(); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); display->redraw(); oldosc->redraw(); @@ -644,13 +648,13 @@ if (autoclearbutton->value()){ sabutton->do_callback(); }; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); for (int i=0;iPhmag[i]==64) h[i]->mag->selection_color(0); else h[i]->mag->selection_color(222); }; oscil->prepare(); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); basefuncdisplaygroup->redraw(); redrawoscil();} @@ -681,9 +685,9 @@ for (int i=0;iredraw(); -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); oscil->prepare(); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); redrawoscil();} xywh {670 505 55 15} box THIN_UP_BOX labelfont 1 labelsize 11 @@ -1037,9 +1041,9 @@ redrawoscil();} label Sine callback {if (!fl_choice("Convert to SINE?","No","Yes",NULL)) return; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); oscil->convert2sine(); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); redrawoscil(); refresh();} @@ -1125,9 +1129,9 @@ adhrtype->value(oscil->Padaptiveharmonicspar); for (int i=0;irefresh(); -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); oscil->prepare(); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); basefuncdisplaygroup->redraw(); redrawoscil();} {} diff --git a/src/UI/PADnoteUI.fl b/src/UI/PADnoteUI.fl index c79f9e30..9550dbdf 100644 --- a/src/UI/PADnoteUI.fl +++ b/src/UI/PADnoteUI.fl @@ -61,7 +61,11 @@ this->pars=pars;} {} Function {draw()} {} { code {int ox=x(),oy=y(),lx=w(),ly=h(); if (!visible()) return; +\#ifdef _MSC_VER +const auto smps = static_cast(_alloca(lx * sizeof(float))); +\#else float smps[lx]; +\#endif float realbw=pars->getprofile(smps,lx); bool active=active_r(); @@ -160,12 +164,16 @@ for (int i=1;ioscilsize/2; +\#ifdef _MSC_VER +const auto spc = static_cast(_alloca(n * sizeof(float))); +\#else float spc[n]; +\#endif for (int i=0;imutex); +master->mutex.lock(); pars->oscilgen->getspectrum(n,spc,0); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); //normalize @@ -177,7 +185,11 @@ for (int i=0;i(_alloca(lx * sizeof(float))); +\#else float spectrum[lx]; +\#endif for (int i=0;ikit[n].Ppadenabled!=0) padeditbutton->activate(); callback {int answer=1; if (o->value()==0) answer=fl_choice("Delete the item?","No","Yes",NULL); if (answer!=0){ -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); part->setkititemstatus(n,(int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if (o->value()==0) partkititemgroup->deactivate(); else partkititemgroup->activate(); @@ -238,9 +238,9 @@ this->redraw();} { callback {int answer=1; if (o->value()==0) answer=fl_choice("Delete the item?","No","Yes",NULL); if (answer!=0){ -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); part->setkititemstatus(n,(int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if (o->value()==0) partkititemgroup->deactivate(); else partkititemgroup->activate(); @@ -441,9 +441,9 @@ part->setkeylimit(val);} open } Fl_Check_Button {} { label Enabled - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); master->partonoff(npart,(int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); if (part->Penabled==0) partgroupui->deactivate(); else partgroupui->activate();} xywh {90 5 75 20} down_box DOWN_BOX labelfont 1 labelsize 11 @@ -654,9 +654,9 @@ sendtochoice->value(x);} } Fl_Choice insefftype { label EffType - callback {pthread_mutex_lock(part->mutex); + callback {part->mutex->lock(); part->partefx[ninseff]->changeeffect((int) o->value()); -pthread_mutex_unlock(part->mutex); +part->mutex->unlock(); inseffectui->refresh(part->partefx[ninseff]);} xywh {155 110 70 15} down_box BORDER_BOX labelsize 10 align 6 code0 {o->value(part->partefx[ninseff]->geteffect());} @@ -748,9 +748,9 @@ if (x==2) part->partefx[ninseff]->setdryonly(true); } Fl_Button {} { label P - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); presetsui->paste(part->partefx[ninseff],inseffectui); -pthread_mutex_unlock(&master->mutex);} +master->mutex.unlock();} xywh {120 127 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 55 } } diff --git a/src/UI/VirKeyboard.fl b/src/UI/VirKeyboard.fl index 805e00cf..1a39b1fe 100644 --- a/src/UI/VirKeyboard.fl +++ b/src/UI/VirKeyboard.fl @@ -266,9 +266,9 @@ if (rndvelocity!=0){ vel=midivel*(127.0-rndvelocity)/127.0+RND*rndvelocity; }; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); master->noteOn(midich,nk+midioct*12,(int)vel); -pthread_mutex_unlock(&master->mutex);} {} +master->mutex.unlock();} {} } Function {relasekey(int nk,int type)} {} { code {if ((nk<0)||(nk>=N_OCT*12)) return; @@ -280,9 +280,9 @@ pressed[nk]=0; damage(1); -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); master->noteOff(midich,nk+12*midioct); -pthread_mutex_unlock(&master->mutex);} {} +master->mutex.unlock();} {} } Function {relaseallkeys(int type)} {} { code {for (int i=0;ihide();} label Cval callback {int ctl=midictl; -pthread_mutex_lock(&master->mutex); +master->mutex.lock(); master->setController(virkeys->midich,ctl,(int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); virkeys->take_focus();} tooltip {Controller value} xywh {605 10 15 115} type {Vert Fill} box ENGRAVED_BOX selection_color 229 labelsize 8 align 5 minimum 127 maximum 0 step 1 value 64 textsize 7 } @@ -438,9 +438,9 @@ virkeys->take_focus();} } Fl_Roller pitchwheelroller { label Pwh - callback {pthread_mutex_lock(&master->mutex); + callback {master->mutex.lock(); master->setController(virkeys->midich,C_pitchwheel,-(int) o->value()); -pthread_mutex_unlock(&master->mutex); +master->mutex.unlock(); virkeys->take_focus();} tooltip {Pitch Wheel} xywh {625 10 20 95} labelsize 8 align 1 when 3 minimum -8192 maximum 8192 step 64 }