zynaddsubfx

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

commit dfe6076bad9205a1ab18ede4260b37a59ab2d0b7
parent 734588ecbfdc662a5a0dc9318c4a23a558f0d0ef
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Sat, 18 Oct 2014 22:57:10 -0400

Add RT Mempool Expansion

Diffstat:
Msrc/Misc/Master.cpp | 22+++++++++++++++++++---
Msrc/Misc/Master.h | 1+
Msrc/Misc/MiddleWare.cpp | 6++++++
3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp @@ -160,7 +160,16 @@ static Ports localports = { printf("learning '%s'\n", rtosc_argument(m,0).s); M->midi.learn(rtosc_argument(m,0).s);}}, {"close-ui", rDoc("Request to close any connection named \"GUI\""), 0, [](const char *, RtData &) { - bToU->write("/close-ui", "");}}, + bToU->write("/close-ui", "");}}, + {"add-rt-memory:bi", rProp(internal) rDoc("Add Additional Memory To RT MemPool"), 0, + [](const char *msg, RtData &d) + { + Master &m = *(Master*)d.obj; + char *mem = *(char**)rtosc_argument(msg, 0).b.data; + int i = rtosc_argument(msg, 1).i; + m.memory->addMemory(mem, i); + m.pendingMemory = false; + }}, }; @@ -214,7 +223,7 @@ vuData::vuData(void) {} Master::Master() -:midi(Master::ports), frozenState(false) +:midi(Master::ports), frozenState(false), pendingMemory(false) { memory = new Allocator(); the_master = this; @@ -522,8 +531,15 @@ void dump_msg(const char* ptr, std::ostream& os = std::cerr) */ void Master::AudioOut(float *outl, float *outr) { - if(memory->lowMemory(4,1024*1024)) + //Danger Limits + if(memory->lowMemory(2,1024*1024)) printf("LOW MEMORY OHOH NOONONONONOOOOOOOO!!\n"); + //Normal Limits + if(!pendingMemory && memory->lowMemory(4,1024*1024)) { + printf("Requesting more memory\n"); + bToU->write("/request-memory", ""); + pendingMemory = true; + } //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/Master.h b/src/Misc/Master.h @@ -168,6 +168,7 @@ class Master bool frozenState;//read-only parameters for threadsafe actions Allocator *memory; + bool pendingMemory; private: float sysefxvol[NUM_SYS_EFX][NUM_MIDI_PARTS]; float sysefxsend[NUM_SYS_EFX][NUM_SYS_EFX]; diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp @@ -551,6 +551,12 @@ public: else if(!strcmp(rtmsg, "/free") && !strcmp(rtosc_argument_string(rtmsg),"sb")) { deallocate(rtosc_argument(rtmsg, 0).s, *((void**)rtosc_argument(rtmsg, 1).b.data)); + } else if(!strcmp(rtmsg, "/request-memory")) { + //Generate out more memory for the RT memory pool + //5MBi chunk + size_t N = 5*1024*1024; + void *mem = malloc(N); + uToB->write("/add-rt-memory", "bi", sizeof(void*), &mem, N); } else if(!strcmp(rtmsg, "/setprogram") && !strcmp(rtosc_argument_string(rtmsg),"cc")) { loadPart(rtosc_argument(rtmsg,0).i, master->bank.ins[rtosc_argument(rtmsg,1).i].filename.c_str(), master, osc);