zynaddsubfx

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

commit e72f8f7772ce6775db19fd713dfa4eb4d9819689
parent c5c9dfe90dda2352a8425959095a1deed8533af7
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Thu, 14 May 2015 10:55:45 -0400

More Changes For Carla Support

Patch By falktx

Diffstat:
Msrc/Misc/Master.cpp | 4++--
Msrc/Misc/Master.h | 6+++---
Msrc/Misc/MiddleWare.cpp | 49++++++++++++++++++++++++++++++++++++++++++++-----
Msrc/Misc/MiddleWare.h | 4+++-
Msrc/UI/guimain.cpp | 6++++++
5 files changed, 58 insertions(+), 11 deletions(-)

diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp @@ -622,7 +622,7 @@ void Master::AudioOut(float *outl, float *outr) } //XXX yes, this is not realtime safe, but it is useful... - if(strcmp(msg, "/get-vu") && false) { + if(strcmp(msg, "/get-vu") && true) { fprintf(stdout, "%c[%d;%d;%dm", 0x1B, 0, 5 + 30, 0 + 40); fprintf(stdout, "backend[%d]: '%s'<%s>\n", msg_id++, msg, rtosc_argument_string(msg)); @@ -999,7 +999,7 @@ int Master::getalldata(char **data) return strlen(*data) + 1; } -void Master::putalldata(char *data, int /*size*/) +void Master::putalldata(const char *data) { XMLwrapper *xml = new XMLwrapper(); if(!xml->putXMLdata(data)) { diff --git a/src/Misc/Master.h b/src/Misc/Master.h @@ -78,11 +78,11 @@ class Master void getfromXML(XMLwrapper *xml); - /**get all data to a newly allocated array (used for VST) + /**get all data to a newly allocated array (used for plugin) * @return the datasize*/ int getalldata(char **data) NONREALTIME; - /**put all data from the *data array to zynaddsubfx parameters (used for VST)*/ - void putalldata(char *data, int size); + /**put all data from the *data array to zynaddsubfx parameters (used for plugin)*/ + void putalldata(const char *data); //Midi IN void noteOn(char chan, char note, char velocity); diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp @@ -636,7 +636,7 @@ public: //Load the part if(idle) { while(alloc.wait_for(std::chrono::seconds(0)) != std::future_status::ready) { - idle(); + idle(idle_ptr); } } @@ -686,6 +686,9 @@ public: master = m; + if (mastercb) + mastercb(mastercb_ptr, m); + //Give it to the backend and wait for the old part to return for //deallocation uToB->write("/load-master", "b", sizeof(Master*), &m); @@ -809,7 +812,13 @@ public: ParamStore kits; //Callback When Waiting on async events - void(*idle)(void); + void(*idle)(void*); + void* idle_ptr; + + //Callback When Master changes + void(*mastercb)(void*,Master*); + void* mastercb_ptr; + //General UI callback cb_t cb; //UI handle @@ -852,6 +861,9 @@ MiddleWareImpl::MiddleWareImpl(MiddleWare *mw, SYNTH_T synth_, int prefered_port //dummy callback for starters cb = [](void*, const char*){}; idle = 0; + idle_ptr = 0; + mastercb = 0; + mastercb_ptr = 0; the_bToU = bToU; master = new Master(synth); @@ -957,6 +969,8 @@ void MiddleWareImpl::doReadOnlyOp(std::function<void()> read_only_fn) void MiddleWareImpl::bToUhandle(const char *rtmsg, bool dummy) { + printf("bToUhandle(%s,%s)\n", last_url.c_str(), + curr_url.c_str()); assert(strcmp(rtmsg, "/part0/kit0/Ppadenableda")); assert(strcmp(rtmsg, "/ze_state")); //Dump Incomming Events For Debugging @@ -996,7 +1010,24 @@ void MiddleWareImpl::bToUhandle(const char *rtmsg, bool dummy) broadcast = true; } else if(broadcast) { broadcast = false; +#ifdef CARLA_VERSION_STRING + if (!curr_url.empty()) // falktx: check added + cb(ui, rtmsg); + + // falktx: changed curr_url to last_url + if(last_url != "GUI") { + lo_message msg = lo_message_deserialise((void*)rtmsg, + rtosc_message_length(rtmsg, bToU->buffer_size()), NULL); + + //Send to known url + if(!last_url.empty()) { + lo_address addr = lo_address_new_from_url(last_url.c_str()); + lo_send_message(addr, rtmsg, msg); + } + } +#else cb(ui, rtmsg); + if(curr_url != "GUI") { lo_message msg = lo_message_deserialise((void*)rtmsg, rtosc_message_length(rtmsg, bToU->buffer_size()), NULL); @@ -1007,6 +1038,7 @@ void MiddleWareImpl::bToUhandle(const char *rtmsg, bool dummy) lo_send_message(addr, rtmsg, msg); } } +#endif } else if((dummy?last_url:curr_url) == "GUI" || !strcmp(rtmsg, "/close-ui")) { cb(ui, rtmsg); } else{ @@ -1270,15 +1302,22 @@ void MiddleWare::doReadOnlyOp(std::function<void()> fn) impl->doReadOnlyOp(fn); } -void MiddleWare::setUiCallback(void(*cb)(void*,const char *),void *ui) +void MiddleWare::setUiCallback(void(*cb)(void*,const char *), void *ui) { impl->cb = cb; impl->ui = ui; } -void MiddleWare::setIdleCallback(void(*cb)(void)) +void MiddleWare::setIdleCallback(void(*cb)(void*), void *ptr) +{ + impl->idle = cb; + impl->idle_ptr = ptr; +} + +void MiddleWare::setMasterChangedCallback(void(*cb)(void*,Master*), void *ptr) { - impl->idle = cb; + impl->mastercb = cb; + impl->mastercb_ptr = ptr; } void MiddleWare::transmitMsg(const char *msg) diff --git a/src/Misc/MiddleWare.h b/src/Misc/MiddleWare.h @@ -19,7 +19,9 @@ class MiddleWare //Set callback to push UI events to void setUiCallback(void(*cb)(void*,const char *),void *ui); //Set callback to run while busy - void setIdleCallback(void(*cb)(void)); + void setIdleCallback(void(*cb)(void*),void *ptr); + //Set callback to run when master changed + void setMasterChangedCallback(void(*cb)(void*,Master*),void *ptr); //Handle events void tick(void); //Do A Readonly Operation (For Parameter Copy) diff --git a/src/UI/guimain.cpp b/src/UI/guimain.cpp @@ -220,10 +220,14 @@ rtosc::Ports uiPorts::ports = { ui->do_load_master(a0.s); } END BEGIN("vu-meter:bb") { +#ifdef DEBUG printf("Vu meter handler...\n"); +#endif if(a0.b.len == sizeof(vuData) && a1.b.len == sizeof(float)*NUM_MIDI_PARTS) { +#ifdef DEBUG printf("Normal behavior...\n"); +#endif //Refresh the primary VU meters ui->simplemastervu->update((vuData*)a0.b.data); ui->mastervu->update((vuData*)a0.b.data); @@ -245,7 +249,9 @@ void GUI::raiseUi(ui_handle_t gui, const char *message) return; MasterUI *mui = (MasterUI*)gui; mui->osc->tryLink(message); +#ifdef DEBUG printf("got message for UI '%s:%s'\n", message, rtosc_argument_string(message)); +#endif char buffer[1024]; memset(buffer, 0, sizeof(buffer)); rtosc::RtData d;