zynaddsubfx

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

commit e70011c3d34b4caf6f7fba74848946c4b9d789c4
parent 6f7046f4894e0a95cbbc85ae62c6c0b4d95ac43c
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Fri, 17 Oct 2014 11:33:04 -0400

Fix Effect RT Allocation On Part Load

Diffstat:
Msrc/Effects/DynamicFilter.cpp | 1+
Msrc/Effects/EffectMgr.cpp | 10+++++++++-
Msrc/Effects/EffectMgr.h | 1+
Msrc/Misc/Master.cpp | 6+++++-
Msrc/Misc/Part.cpp | 6++++++
Msrc/Misc/Part.h | 1+
6 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/Effects/DynamicFilter.cpp b/src/Effects/DynamicFilter.cpp @@ -36,6 +36,7 @@ DynamicFilter::DynamicFilter(EffectParams pars) filterl(NULL), filterr(NULL) { + filterpars = memory.alloc<FilterParams>(0,0,0); setpreset(Ppreset); cleanup(); } diff --git a/src/Effects/EffectMgr.cpp b/src/Effects/EffectMgr.cpp @@ -179,7 +179,7 @@ void EffectMgr::changeeffectrt(int _nefx) void EffectMgr::changeeffect(int _nefx) { - effect_id = 0; + effect_id = _nefx; preset = 0; memset(settings, 0, sizeof(settings)); } @@ -193,12 +193,20 @@ int EffectMgr::geteffect(void) // Initialize An Effect in RT context void EffectMgr::init(void) { + //printf("Initializing Effect(%d)\n", effect_id); changeeffectrt(effect_id); changepresetrt(preset); for(int i=0; i<128; ++i) seteffectparrt(i, settings[i]); } +//Strip effect manager of it's realtime memory +void EffectMgr::kill(void) +{ + //printf("Killing Effect(%d)\n", effect_id); + memory.dealloc(efx); +} + // Cleanup the current effect void EffectMgr::cleanup(void) { diff --git a/src/Effects/EffectMgr.h b/src/Effects/EffectMgr.h @@ -58,6 +58,7 @@ class EffectMgr:public Presets float sysefxgetvolume(void); void init(void) REALTIME; + void kill(void) REALTIME; void cleanup(void) REALTIME; void changeeffectrt(int nefx_) REALTIME; diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp @@ -55,7 +55,7 @@ static Ports localports = { rRecur(microtonal, "Micrtonal Mapping Functionality"), rParamZyn(Pkeyshift, "Global Key Shift"), rParams(Pinsparts, NUM_INS_EFX, "Part to insert part onto"), - {"echo", "=documentation\0:Hidden port to echo messages\0", 0, [](const char *m, RtData&) { + {"echo", rDoc("Hidden port to echo messages"), 0, [](const char *m, RtData&) { bToU->raw_write(m-1);}}, {"get-vu", rDoc("Grab VU Data"), 0, [](const char *, RtData &d) { Master *m = (Master*)d.obj; @@ -68,8 +68,10 @@ static Ports localports = { Part *p = *(Part**)rtosc_argument(msg, 1).b.data; int i = rtosc_argument(msg, 0).i; m->part[i]->cloneTraits(*p); + m->part[i]->kill_rt(); d.reply("/free", "sb", "Part", sizeof(void*), &m->part[i]); m->part[i] = p; + p->initialize_rt(); printf("part %d is now pointer %p\n", i, p);}}, {"Pvolume::i", rDoc("Master Volume"), 0, [](const char *m, rtosc::RtData &d) { @@ -484,6 +486,8 @@ void dump_msg(const char* ptr, std::ostream& os = std::cerr) */ void Master::AudioOut(float *outl, float *outr) { + if(memory->lowMemory(4,1024*1024)) + printf("LOW MEMORY OHOH NOONONONONOOOOOOOO!!\n"); //Handle user events TODO move me to a proper location char loc_buf[1024]; DataObj d{loc_buf, 1024, this, bToU}; diff --git a/src/Misc/Part.cpp b/src/Misc/Part.cpp @@ -1199,6 +1199,12 @@ void Part::initialize_rt(void) partefx[i]->init(); } +void Part::kill_rt(void) +{ + for(int i=0; i<NUM_PART_EFX; ++i) + partefx[i]->kill(); +} + void Part::getfromXMLinstrument(XMLwrapper *xml) { if(xml->enterbranch("INFO")) { diff --git a/src/Misc/Part.h b/src/Misc/Part.h @@ -88,6 +88,7 @@ class Part void applyparameters(std::function<bool()> do_abort) NONREALTIME; void initialize_rt(void) REALTIME; + void kill_rt(void) REALTIME; void getfromXML(XMLwrapper *xml); void getfromXMLinstrument(XMLwrapper *xml);