zynaddsubfx

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

commit 4eddd5bfa2fd5875f5bd5ecf5118b0366725cecd
parent 0134df8b4c08eacaed4a47d3cddfd88692313d8d
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Thu, 14 Jun 2012 10:35:45 -0400

Reduces XRuns for UI Instrument Loads

This commit adds another mutex per part, such that one can be locked by the UI
for loading without blocking the RT thread. While adding additional mutexes is
generally a bad thing, this should allow for instruments to load without
zombifying things, which is an improvement on the current situation.

Diffstat:
Msrc/Misc/Master.cpp | 7+++++--
Msrc/Misc/Part.cpp | 1+
Msrc/Misc/Part.h | 1+
Msrc/UI/BankUI.fl | 8++++----
4 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp @@ -318,9 +318,12 @@ void Master::AudioOut(float *outl, float *outr) memset(outr, 0, synth->bufferbytes); //Compute part samples and store them part[npart]->partoutl,partoutr - for(int npart = 0; npart < NUM_MIDI_PARTS; ++npart) - if(part[npart]->Penabled != 0) + for(int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { + if(part[npart]->Penabled != 0 && !pthread_mutex_trylock(&part[npart]->load_mutex)) { part[npart]->ComputePartSmps(); + pthread_mutex_unlock(&part[npart]->load_mutex); + } + } //Insertion effects for(int nefx = 0; nefx < NUM_INS_EFX; ++nefx) diff --git a/src/Misc/Part.cpp b/src/Misc/Part.cpp @@ -41,6 +41,7 @@ Part::Part(Microtonal *microtonal_, FFTwrapper *fft_, pthread_mutex_t *mutex_) microtonal = microtonal_; fft = fft_; mutex = mutex_; + pthread_mutex_init(&load_mutex, NULL); partoutl = new float [synth->buffersize]; partoutr = new float [synth->buffersize]; diff --git a/src/Misc/Part.h b/src/Misc/Part.h @@ -152,6 +152,7 @@ class Part pthread_mutex_t *mutex; + pthread_mutex_t load_mutex; int lastnote; diff --git a/src/UI/BankUI.fl b/src/UI/BankUI.fl @@ -262,9 +262,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->mutex); + pthread_mutex_lock(&master->part[*npart]->load_mutex); bank->loadfromslot(slot,master->part[*npart]); - pthread_mutex_unlock(&master->mutex); + pthread_mutex_unlock(&master->part[*npart]->load_mutex); master->part[*npart]->applyparameters(); snprintf((char *)master->part[*npart]->Pname,PART_MAX_NAME_LEN,"%s",bank->getname(slot).c_str()); cbwig->do_callback(); @@ -278,9 +278,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->mutex); + pthread_mutex_lock(&master->part[*npart]->load_mutex); bank->savetoslot(slot,master->part[*npart]); - pthread_mutex_unlock(&master->mutex); + pthread_mutex_unlock(&master->part[*npart]->load_mutex); bs[slot]->refresh(); mode=1;readbutton->value(1);writebutton->value(0);