zynaddsubfx

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

commit 0f0a4fcc0a913bfc4480e4830eb1f57fe8028643
parent 0a044a611d2fa2ca221e401f9f4b4a4fc6583285
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Thu,  9 Apr 2015 20:16:53 -0400

Middleware: Make uToB/bToU non-global

Diffstat:
Msrc/Misc/Master.cpp | 17++++++++++-------
Msrc/Misc/Master.h | 2++
Msrc/Misc/MiddleWare.cpp | 39++++++++++++++++++++++++++-------------
Msrc/Misc/MiddleWare.h | 2+-
Msrc/Nio/InMgr.cpp | 3+--
Msrc/Output/DSSIaudiooutput.cpp | 4+---
Msrc/globals.h | 6+-----
7 files changed, 42 insertions(+), 31 deletions(-)

diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp @@ -107,11 +107,11 @@ Ports Master::ports = { rRecur(ctl, "Controller"), rParamZyn(Pkeyshift, "Global Key Shift"), rArrayI(Pinsparts, NUM_INS_EFX, "Part to insert part onto"), - {"echo", rDoc("Hidden port to echo messages"), 0, [](const char *m, RtData&) { - bToU->raw_write(m-1);}}, + {"echo", rDoc("Hidden port to echo messages"), 0, [](const char *m, RtData&d) { + d.reply(m-1);}}, {"get-vu", rDoc("Grab VU Data"), 0, [](const char *, RtData &d) { Master *m = (Master*)d.obj; - bToU->write("/vu-meter", "bb", sizeof(m->vu), &m->vu, sizeof(float)*NUM_MIDI_PARTS, m->vuoutpeakpart);}}, + d.reply("/vu-meter", "bb", sizeof(m->vu), &m->vu, sizeof(float)*NUM_MIDI_PARTS, m->vuoutpeakpart);}}, {"reset-vu", rDoc("Grab VU Data"), 0, [](const char *, RtData &d) { Master *m = (Master*)d.obj; m->vuresetpeaks();}}, @@ -193,8 +193,8 @@ Ports Master::ports = { Master *M = (Master*)d.obj; 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", "");}}, + {"close-ui", rDoc("Request to close any connection named \"GUI\""), 0, [](const char *, RtData &d) { + d.reply("/close-ui", "");}}, {"add-rt-memory:bi", rProp(internal) rDoc("Add Additional Memory To RT MemPool"), 0, [](const char *msg, RtData &d) { @@ -210,8 +210,9 @@ Ports Master::ports = { {d.reply("/undo_resume", "");}}, }; - +//XXX HACKS Master *the_master; +rtosc::ThreadLink *the_bToU; class DataObj:public rtosc::RtData { @@ -266,6 +267,8 @@ vuData::vuData(void) Master::Master() :midi(Master::ports), frozenState(false), pendingMemory(false) { + bToU = NULL; + uToB = NULL; memory = new Allocator(); the_master = this; swaplr = 0; @@ -299,7 +302,7 @@ Master::Master() midi.event_cb = [](const char *m) { char loc_buf[1024]; - DataObj d{loc_buf, 1024, the_master, bToU}; + DataObj d{loc_buf, 1024, the_master, the_bToU}; memset(loc_buf, sizeof(loc_buf), 0); //printf("sending an event to the owner of '%s'\n", m); Master::ports.dispatch(m+1, d); diff --git a/src/Misc/Master.h b/src/Misc/Master.h @@ -166,6 +166,8 @@ class Master bool frozenState;//read-only parameters for threadsafe actions Allocator *memory; + rtosc::ThreadLink *bToU; + rtosc::ThreadLink *uToB; bool pendingMemory; private: float sysefxvol[NUM_SYS_EFX][NUM_MIDI_PARTS]; diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp @@ -35,8 +35,7 @@ #include <err.h> using std::string; -rtosc::ThreadLink *bToU = new rtosc::ThreadLink(4096*2,1024); -rtosc::ThreadLink *uToB = new rtosc::ThreadLink(4096*2,1024); +extern rtosc::ThreadLink *the_bToU;//XXX rtosc::UndoHistory undo; /****************************************************************************** @@ -116,12 +115,12 @@ static int handler_function(const char *path, const char *types, lo_arg **argv, (void) types; (void) argv; (void) argc; - (void) user_data; + MiddleWare *mw = (MiddleWare*)user_data; lo_address addr = lo_message_get_source(msg); if(addr) { const char *tmp = lo_address_get_url(addr); if(tmp != last_url) { - uToB->write("/echo", "ss", "OSC_URL", tmp); + mw->transmitMsg("/echo", "ss", "OSC_URL", tmp); last_url = tmp; } @@ -134,7 +133,7 @@ static int handler_function(const char *path, const char *types, lo_arg **argv, if(!strcmp(buffer, "/path-search") && !strcmp("ss", rtosc_argument_string(buffer))) { path_search(buffer); } else - uToB->raw_write(buffer); + mw->transmitMsg(buffer); return 0; } @@ -163,14 +162,14 @@ void deallocate(const char *str, void *v) * PadSynth Setup * *****************************************************************************/ -void preparePadSynth(string path, PADnoteParameters *p) +void preparePadSynth(string path, PADnoteParameters *p, rtosc::ThreadLink *uToB) { //printf("preparing padsynth parameters\n"); assert(!path.empty()); path += "sample"; unsigned max = 0; - p->sampleGenerator([&max,&path] + p->sampleGenerator([&max,&path,uToB] (unsigned N, PADnoteParameters::Sample &s) { max = max<N ? N : max; @@ -256,7 +255,7 @@ class DummyDataObj:public rtosc::RtData { public: DummyDataObj(char *loc_, size_t loc_size_, void *obj_, cb_t cb_, void *ui_, - Fl_Osc_Interface *osc_) + Fl_Osc_Interface *osc_, rtosc::ThreadLink *uToB_) { memset(loc_, 0, sizeof(loc_size_)); buffer = new char[4*4096]; @@ -267,6 +266,7 @@ class DummyDataObj:public rtosc::RtData cb = cb_; ui = ui_; osc = osc_; + uToB = uToB_; } ~DummyDataObj(void) { @@ -308,6 +308,7 @@ class DummyDataObj:public rtosc::RtData cb_t cb; void *ui; Fl_Osc_Interface *osc; + rtosc::ThreadLink *uToB; }; @@ -661,6 +662,8 @@ public: void loadMaster(const char *filename) { Master *m = new Master(); + m->uToB = uToB; + m->bToU = bToU; if(filename) { m->loadXML(filename); m->applyparameters(); @@ -700,7 +703,7 @@ public: return true; char buffer[1024]; memset(buffer, 0, sizeof(buffer)); - DummyDataObj d(buffer, 1024, v, cb, ui, osc); + DummyDataObj d(buffer, 1024, v, cb, ui, osc, uToB); strcpy(buffer, path.c_str()); PADnoteParameters::ports.dispatch(msg, d); @@ -754,12 +757,18 @@ public: std::atomic_int pending_load[NUM_MIDI_PARTS]; std::atomic_int actual_load[NUM_MIDI_PARTS]; + + //Link To the Realtime + rtosc::ThreadLink *bToU; + rtosc::ThreadLink *uToB; }; MiddleWareImpl::MiddleWareImpl(MiddleWare *mw) { + bToU = new rtosc::ThreadLink(4096*2,1024); + uToB = new rtosc::ThreadLink(4096*2,1024); server = lo_server_new_with_proto(NULL, LO_UDP, liblo_error_cb); - lo_server_add_method(server, NULL, NULL, handler_function, NULL); + lo_server_add_method(server, NULL, NULL, handler_function, mw); fprintf(stderr, "lo server running on %d\n", lo_server_get_port(server)); clean_up_tmp_nams(); @@ -769,7 +778,10 @@ MiddleWareImpl::MiddleWareImpl(MiddleWare *mw) cb = [](void*, const char*){}; idle = 0; + the_bToU = bToU; master = new Master(); + master->bToU = bToU; + master->uToB = uToB; osc = GUI::genOscInterface(mw); //Grab objects of interest from master @@ -931,7 +943,7 @@ bool MiddleWareImpl::handleOscil(string path, const char *msg, void *v) printf("handleOscil...\n"); char buffer[1024]; memset(buffer, 0, sizeof(buffer)); - DummyDataObj d(buffer, 1024, v, cb, ui, osc); + DummyDataObj d(buffer, 1024, v, cb, ui, osc, uToB); strcpy(buffer, path.c_str()); if(!v) return true; @@ -1066,7 +1078,7 @@ void MiddleWareImpl::handleMsg(const char *msg) //else if(strstr(obj_rl.c_str(), "kititem")) // handleKitItem(obj_rl, objmap[obj_rl],atoi(rindex(msg,'m')+1),rtosc_argument(msg,0).T); } else if(strstr(msg, "padpars/prepare")) - preparePadSynth(obj_rl,(PADnoteParameters *) obj_store.get(obj_rl)); + preparePadSynth(obj_rl,(PADnoteParameters *) obj_store.get(obj_rl), uToB); else if(strstr(msg, "padpars")) { if(!handlePAD(obj_rl, last_path+1, obj_store.get(obj_rl))) uToB->raw_write(msg); @@ -1196,9 +1208,10 @@ void MiddleWare::transmitMsg(const char *path, const char *args, va_list va) fprintf(stderr, "Error in transmitMsg(va)n"); } -void MiddleWare::pendingSetProgram(int part) +void MiddleWare::pendingSetProgram(int part, int program) { impl->pending_load[part]++; + impl->bToU->write("/setprogram", "cc", part, program); } std::string MiddleWare::activeUrl(void) diff --git a/src/Misc/MiddleWare.h b/src/Misc/MiddleWare.h @@ -27,7 +27,7 @@ class MiddleWare //Handle a rtosc Message uToB void transmitMsg(const char *, const char *args, va_list va); //Indicate that a program will be loaded on a known part - void pendingSetProgram(int part); + void pendingSetProgram(int part, int program); //Get/Set the active bToU url std::string activeUrl(void); void activeUrl(std::string u); diff --git a/src/Nio/InMgr.cpp b/src/Nio/InMgr.cpp @@ -98,8 +98,7 @@ void InMgr::flush(unsigned frameStart, unsigned frameStop) for(int i=0; i < NUM_MIDI_PARTS; ++i) { //set the program of the parts assigned to the midi channel if(master->part[i]->Prcvchn == ev.channel) { - bToU->write("/setprogram", "cc", i, ev.num); - middleware->pendingSetProgram(i); + middleware->pendingSetProgram(i, ev.num); } } break; diff --git a/src/Output/DSSIaudiooutput.cpp b/src/Output/DSSIaudiooutput.cpp @@ -364,9 +364,7 @@ const DSSI_Program_Descriptor *DSSIaudiooutput::getProgram(unsigned long index) */ void DSSIaudiooutput::selectProgram(unsigned long bank, unsigned long program) { - middleware->pendingSetProgram(0); - extern rtosc::ThreadLink *bToU; - bToU->write("/setprogram", "cc", 0, program); + middleware->pendingSetProgram(0, program); } /** diff --git a/src/globals.h b/src/globals.h @@ -33,12 +33,8 @@ #define NONREALTIME #endif -//Forward declarations -namespace rtosc{struct Ports; class ThreadLink;}; -extern rtosc::ThreadLink *bToU; -extern rtosc::ThreadLink *uToB; - //Forward Declarations +namespace rtosc{struct Ports; class ThreadLink;}; class EffectMgr; class ADnoteParameters; struct ADnoteGlobalParam;