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