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