From 0a2efad2cf0a4d43cf3384b68d1f7b761f407a90 Mon Sep 17 00:00:00 2001
From: Florent Berthaut <florent.berthaut@univ-lille.fr>
Date: Tue, 18 Feb 2025 11:53:14 +0100
Subject: [PATCH] Update for reverberations

---
 demo/addons/gdpd/patches/gdpd.pd      | Bin 2135 -> 2528 bytes
 demo/addons/gdpd/patches/gdpd_send.pd | Bin 146 -> 370 bytes
 patches/gdpd.pd                       | Bin 2135 -> 2528 bytes
 patches/gdpd_send.pd                  | Bin 146 -> 370 bytes
 src/gdpd.cpp                          |  69 ++++++++++++++++----------
 src/gdpd.h                            |  17 ++++++-
 src/rtaudio/RtAudio.os                | Bin 58992 -> 0 bytes
 7 files changed, 58 insertions(+), 28 deletions(-)
 delete mode 100644 src/rtaudio/RtAudio.os

diff --git a/demo/addons/gdpd/patches/gdpd.pd b/demo/addons/gdpd/patches/gdpd.pd
index a0843bc7bb6e8f312ae3e9bb1a4e3cf9d447f2d2..99faa5f136e354096f96cd4225af423d24ee1f50 100644
GIT binary patch
literal 2528
zcmY%PQ%FwCD@!a^urxDJFf}z+urxJOFflVzFf_8}QjSo_Ps&m-G%{8&GBZ}lOD!o%
zO-{`$OI6S<RnSdBRbXhLkdvR7l9ZU2jw)ecp^#skT##5)oQfi0Y-p^IlUZD%P*Rkc
ziz;Jmp-_}xT9T@eo>GtkmohUpRxq+O!L-KM$U?!)P@y0tIX|zYC_e|RBeytR0VH8;
zu8>%iUaVjM76thSBx+#-u{$R<FTErKMas|&(*_d*Qw1XfBZU%$BoIWXH#AW&GB;Bw
zuFOr!&ryg`F+@liStuA9m@5>g=A<T<C>SUhDj<T?$k<H5*u)r{K2T_z7?~*KmzLzD
zmcWezS!7|UP^6Gnl%E@)o}ZGBBxhu-U~FNbP@<5ikciM>Zm9q=s2HjRIVeqxEEJ3|
z?FWY$$R<lmaPXw&fxM((X=DiT7f2qg)yzyGIX^EC<gpkPLy!W5-^@+S6pTy^6^a!~
z@{t@0(rapBreJCYj#ZGsaHkqu7%3PUn_>hnNWHNUwoo!RH&?JUK=Uz3xrHH`ASgVI
z&5WT5svxl>84=xJry81r{i;w<lv<FQmjZDeLLJE6Mn(!oMiyXYsd><p1QItlGF33L
zuvAFNEQSUL+)JkBpinRZCH=JgqTIw1baO!|(bU{R!Pvq~p(H&=!N@?tKp{1^prjIo
zG*Hkr1j!g0DJZ8UgP?-40T{q(0|i9vfP4#zSWw1F%>zY@p@NaIrJj+Yfu50}p`H;m
zUxQo^%1_3ImhhNFQwP!viB*tda|06vV^f4;LnCuN13d#hw8#hh$kY&2RuqE*6SbfK
z$(k5rq-|qk69q$KGf4EqLl6|jrWOiC;AE6ikP;8d#&B6PGXqebN0LoRDT2$Io0uvX
zS{j053>L9)Nsv}hprhm#Q;-`>Ajuv>2UyY!RZ^iCnmbEUD@qiM%nTF^Efri+OF(%d
zu_(PXH#M)MSRpOHNCBLd6!H>tQxy{PQWP=^;4T51YXLPEUJOE$k^(5&ji9LwCT6H$
zpkQo_CTIi_L=!VsFi<c-6EjgTP%tt_6Ep>BMptR3V4z@urqEo$K*0=6%mP%dp}Wyi
z!9W4s7DyU4MAL2vDisaUEiwdo($ErJt&xJEf-#0#BLyP`BlG|<1o_^`9GWlSVF&gq
zy0IXy8lwB(&`iNl!4Sg}An$_mDL4Y*#)AB7fMzU6m4Y#Pa2bJO$_PUg<XVuEQH(V*
z1~~!4Tw{=b(Vc4qj#>10FarA*J<N?v6$}+jFhoJYU}B6GVn(1~0M%otE(4_mLkwSl
z0|&!gY=L78O4%5JV+@LROi@sf8KcJpC<}n{2a3ClL7{+Y05}xTT?<mCV2mDOpyZ{1
z5fjE1pt>79%#A@l0|haP8%#i6GeI{O6x<3%=xG<EOu+;_?V5nnxrrfKOn{Urn4r4>
RB%ok|?l+Kt0w^@Cxd3j2l$HPh

literal 2135
zcmY%PQ%FwCD@!a^urxDJFf}z+urxJOFflVzFf_8}QjSo_Ps&m-G%-^!GBZ`kOD!o%
zO-{`$OI6S<RnSdBRbXVGkdvR7l9ZU2jw)ekppajjT##5)oQfi0Y-p;GlUZD%P*Rkc
ziz;Jcpiq=wT9T@eo>GtkmohUpRxq+O!L-KM(m=t~T%jN(IX|zYC_e|RBeytR0VH8;
ztdLlgUaVjM76thSBx+#*u{$R<FTErKMas|!(*_fBGX+CaONA1JBoKtFH!?9%Fto5x
zD6Y&+%Fj`VQ89!|fow4}Fjgo|%}GrzQ7}+2R6qo&k*TGEv56@*eW1`bF)~xgFD=PQ
zEkPJ(u3%(os8FPkR+OI`pPrwRkB|dt0a;g~kf@Ld*I{H}qyRFg7^($1D9sJb6ikd1
ziWExn<59xc#L`m1$iM*IVW7YS`PInK5FBo)c_6<kSQ;5ZJPeWtYc(=fNY2m81Nk^c
z#So+b;b{wFBL$G7iov$ReE`yHYGS5fY6gyOkil?2n1I69*bpP!LF$c-&|L|NT#$?*
zC@q3gRzXo}L26!#LNQW6g1l~SqJSD!AYB$9YmfsF9IR%h(4<(9SdxrLDCWi%3WkQz
zL<F-26p{)Ebs&$Km?{_<LzJcFLDL{e+}y}i!N|f=AtkdI8eVWeo0*v_7#V^yO<I0Y
zZej@}SP<rdy=iWtU~FNgP?DabU}T_RppcqdP*RCP8Yt)*f@BPh6qM7FK~O>201V)?
zfdV4>K)y9Hfn>?lJW$LTDi|4C>KPdt=ouLr>KQ>x1d!`NInmhA5+2oP>Oh(y(GF5<
zZeXHdY>H59Xk@Nupl6_mmO4y9J~A}~l`_SkI72OBK(Z#rCdj!08g2?8KN>-U7A9t>
zV4z@ZiY90T5=0X-RxnU7K@&4kFi<eEL=!XxX*NR>G*d88us{<tS1?dOS7!mr{^)MB
zR4`C5N7D?6FhfjHLj^;07a4*)35t7g%7OdbNWoCS&=}nWBLyP`BXo~~l!1H-Nd#~c
zz+Oc+0OVCe3<JzSmSK1T<Xs~SQILO)(7gt7KPU!K`~Xs=V2mEHMxeMd!Vm?;7RV#0
zCYXR6W`O1iBNI?4U?dBWe?f+$ngH^!F?u+He5HU*)KI|~!!~d*peF?*3k9%R)G!An
zHw8m<wICxEjL_4KF(}^AEi(ouZuGzbxfC-XjX^<XjGml8*##pejKQIRVJs+(W5f?g
KKmla7H5ULQHz`&C

diff --git a/demo/addons/gdpd/patches/gdpd_send.pd b/demo/addons/gdpd/patches/gdpd_send.pd
index 61e18c7c8ea264bcef5e1d3525271bb6a4d40f0f..4bb09c4e684c9164cebcf772004c572872c4d9a4 100644
GIT binary patch
literal 370
zcmY%PQ%FwCD@!a^urxDJFf}z+urxJOFflVzFf_8}QjSo_Ps&m-w@@%KQ^?HANiBhk
z85<cZSePpmq$KC(l@#UYfF*K^(-lAxX2uGMMd`%~24GQ;5g<_$BZZv&#FV7OymYv@
zxrKtExrsutLP>sndP+e`JV+n1thu2=i9(`65?sv4%vizD#7rS4v$#Ydv7jI|F9k`?
zNWswD4B5Dplp?Tna(-T3YI2E!fr5d8Db!&wF+&9d1v3Rh6m>=l1`38~>Wmc(6pYZs
XOce|iOfbX@70l4Y%oGe1%t2xR$7f<i

delta 96
zcmeywG>LJ7Wu&=<f}ydALa{<getddLL5ek(a)d&DQkH_bg@UDlLQZCJi9$h9YC&pV
jib9NvAy_&&KQAvexkSN0!9c-C!2m_fNWnnC5F`cwS?e0H

diff --git a/patches/gdpd.pd b/patches/gdpd.pd
index a0843bc7bb6e8f312ae3e9bb1a4e3cf9d447f2d2..99faa5f136e354096f96cd4225af423d24ee1f50 100644
GIT binary patch
literal 2528
zcmY%PQ%FwCD@!a^urxDJFf}z+urxJOFflVzFf_8}QjSo_Ps&m-G%{8&GBZ}lOD!o%
zO-{`$OI6S<RnSdBRbXhLkdvR7l9ZU2jw)ecp^#skT##5)oQfi0Y-p^IlUZD%P*Rkc
ziz;Jmp-_}xT9T@eo>GtkmohUpRxq+O!L-KM$U?!)P@y0tIX|zYC_e|RBeytR0VH8;
zu8>%iUaVjM76thSBx+#-u{$R<FTErKMas|&(*_d*Qw1XfBZU%$BoIWXH#AW&GB;Bw
zuFOr!&ryg`F+@liStuA9m@5>g=A<T<C>SUhDj<T?$k<H5*u)r{K2T_z7?~*KmzLzD
zmcWezS!7|UP^6Gnl%E@)o}ZGBBxhu-U~FNbP@<5ikciM>Zm9q=s2HjRIVeqxEEJ3|
z?FWY$$R<lmaPXw&fxM((X=DiT7f2qg)yzyGIX^EC<gpkPLy!W5-^@+S6pTy^6^a!~
z@{t@0(rapBreJCYj#ZGsaHkqu7%3PUn_>hnNWHNUwoo!RH&?JUK=Uz3xrHH`ASgVI
z&5WT5svxl>84=xJry81r{i;w<lv<FQmjZDeLLJE6Mn(!oMiyXYsd><p1QItlGF33L
zuvAFNEQSUL+)JkBpinRZCH=JgqTIw1baO!|(bU{R!Pvq~p(H&=!N@?tKp{1^prjIo
zG*Hkr1j!g0DJZ8UgP?-40T{q(0|i9vfP4#zSWw1F%>zY@p@NaIrJj+Yfu50}p`H;m
zUxQo^%1_3ImhhNFQwP!viB*tda|06vV^f4;LnCuN13d#hw8#hh$kY&2RuqE*6SbfK
z$(k5rq-|qk69q$KGf4EqLl6|jrWOiC;AE6ikP;8d#&B6PGXqebN0LoRDT2$Io0uvX
zS{j053>L9)Nsv}hprhm#Q;-`>Ajuv>2UyY!RZ^iCnmbEUD@qiM%nTF^Efri+OF(%d
zu_(PXH#M)MSRpOHNCBLd6!H>tQxy{PQWP=^;4T51YXLPEUJOE$k^(5&ji9LwCT6H$
zpkQo_CTIi_L=!VsFi<c-6EjgTP%tt_6Ep>BMptR3V4z@urqEo$K*0=6%mP%dp}Wyi
z!9W4s7DyU4MAL2vDisaUEiwdo($ErJt&xJEf-#0#BLyP`BlG|<1o_^`9GWlSVF&gq
zy0IXy8lwB(&`iNl!4Sg}An$_mDL4Y*#)AB7fMzU6m4Y#Pa2bJO$_PUg<XVuEQH(V*
z1~~!4Tw{=b(Vc4qj#>10FarA*J<N?v6$}+jFhoJYU}B6GVn(1~0M%otE(4_mLkwSl
z0|&!gY=L78O4%5JV+@LROi@sf8KcJpC<}n{2a3ClL7{+Y05}xTT?<mCV2mDOpyZ{1
z5fjE1pt>79%#A@l0|haP8%#i6GeI{O6x<3%=xG<EOu+;_?V5nnxrrfKOn{Urn4r4>
RB%ok|?l+Kt0w^@Cxd3j2l$HPh

literal 2135
zcmY%PQ%FwCD@!a^urxDJFf}z+urxJOFflVzFf_8}QjSo_Ps&m-G%-^!GBZ`kOD!o%
zO-{`$OI6S<RnSdBRbXVGkdvR7l9ZU2jw)ekppajjT##5)oQfi0Y-p;GlUZD%P*Rkc
ziz;Jcpiq=wT9T@eo>GtkmohUpRxq+O!L-KM(m=t~T%jN(IX|zYC_e|RBeytR0VH8;
ztdLlgUaVjM76thSBx+#*u{$R<FTErKMas|!(*_fBGX+CaONA1JBoKtFH!?9%Fto5x
zD6Y&+%Fj`VQ89!|fow4}Fjgo|%}GrzQ7}+2R6qo&k*TGEv56@*eW1`bF)~xgFD=PQ
zEkPJ(u3%(os8FPkR+OI`pPrwRkB|dt0a;g~kf@Ld*I{H}qyRFg7^($1D9sJb6ikd1
ziWExn<59xc#L`m1$iM*IVW7YS`PInK5FBo)c_6<kSQ;5ZJPeWtYc(=fNY2m81Nk^c
z#So+b;b{wFBL$G7iov$ReE`yHYGS5fY6gyOkil?2n1I69*bpP!LF$c-&|L|NT#$?*
zC@q3gRzXo}L26!#LNQW6g1l~SqJSD!AYB$9YmfsF9IR%h(4<(9SdxrLDCWi%3WkQz
zL<F-26p{)Ebs&$Km?{_<LzJcFLDL{e+}y}i!N|f=AtkdI8eVWeo0*v_7#V^yO<I0Y
zZej@}SP<rdy=iWtU~FNgP?DabU}T_RppcqdP*RCP8Yt)*f@BPh6qM7FK~O>201V)?
zfdV4>K)y9Hfn>?lJW$LTDi|4C>KPdt=ouLr>KQ>x1d!`NInmhA5+2oP>Oh(y(GF5<
zZeXHdY>H59Xk@Nupl6_mmO4y9J~A}~l`_SkI72OBK(Z#rCdj!08g2?8KN>-U7A9t>
zV4z@ZiY90T5=0X-RxnU7K@&4kFi<eEL=!XxX*NR>G*d88us{<tS1?dOS7!mr{^)MB
zR4`C5N7D?6FhfjHLj^;07a4*)35t7g%7OdbNWoCS&=}nWBLyP`BXo~~l!1H-Nd#~c
zz+Oc+0OVCe3<JzSmSK1T<Xs~SQILO)(7gt7KPU!K`~Xs=V2mEHMxeMd!Vm?;7RV#0
zCYXR6W`O1iBNI?4U?dBWe?f+$ngH^!F?u+He5HU*)KI|~!!~d*peF?*3k9%R)G!An
zHw8m<wICxEjL_4KF(}^AEi(ouZuGzbxfC-XjX^<XjGml8*##pejKQIRVJs+(W5f?g
KKmla7H5ULQHz`&C

diff --git a/patches/gdpd_send.pd b/patches/gdpd_send.pd
index 61e18c7c8ea264bcef5e1d3525271bb6a4d40f0f..4bb09c4e684c9164cebcf772004c572872c4d9a4 100644
GIT binary patch
literal 370
zcmY%PQ%FwCD@!a^urxDJFf}z+urxJOFflVzFf_8}QjSo_Ps&m-w@@%KQ^?HANiBhk
z85<cZSePpmq$KC(l@#UYfF*K^(-lAxX2uGMMd`%~24GQ;5g<_$BZZv&#FV7OymYv@
zxrKtExrsutLP>sndP+e`JV+n1thu2=i9(`65?sv4%vizD#7rS4v$#Ydv7jI|F9k`?
zNWswD4B5Dplp?Tna(-T3YI2E!fr5d8Db!&wF+&9d1v3Rh6m>=l1`38~>Wmc(6pYZs
XOce|iOfbX@70l4Y%oGe1%t2xR$7f<i

delta 96
zcmeywG>LJ7Wu&=<f}ydALa{<getddLL5ek(a)d&DQkH_bg@UDlLQZCJi9$h9YC&pV
jib9NvAy_&&KQAvexkSN0!9c-C!2m_fNWnnC5F`cwS?e0H

diff --git a/src/gdpd.cpp b/src/gdpd.cpp
index ceef2ac..9b4e75e 100644
--- a/src/gdpd.cpp
+++ b/src/gdpd.cpp
@@ -63,6 +63,17 @@ void GdPd::_bind_methods() {
     ClassDB::bind_method(D_METHOD("get_pd_patch"), 
                          &GdPd::get_pd_patch);
 
+    ClassDB::bind_method(D_METHOD("set_addon_patches_folder", 
+                         "p_addon_patches_folder"), 
+                         &GdPd::set_addon_patches_folder);
+    ClassDB::bind_method(D_METHOD("get_addon_patches_folder"), 
+                         &GdPd::get_addon_patches_folder);
+
+    ClassDB::bind_method(D_METHOD("set_application_name", 
+                         "p_application_name"), 
+                         &GdPd::set_application_name);
+    ClassDB::bind_method(D_METHOD("get_application_name"), 
+                         &GdPd::get_application_name);
 
     ClassDB::bind_method(D_METHOD("send"), &GdPd::send);
 
@@ -75,6 +86,10 @@ void GdPd::_bind_methods() {
                  "set_osc_address", "get_osc_address");
     ADD_PROPERTY(PropertyInfo(Variant::STRING, "pd_patch", PROPERTY_HINT_FILE), 
                  "set_pd_patch", "get_pd_patch");
+    ADD_PROPERTY(PropertyInfo(Variant::STRING, "addon_patches_folder"), 
+                 "set_addon_patches_folder", "get_addon_patches_folder");
+    ADD_PROPERTY(PropertyInfo(Variant::STRING, "application_name"), 
+                 "set_application_name", "get_application_name");
 
 	ADD_SIGNAL(MethodInfo("got_message", 
                 PropertyInfo(Variant::STRING, "address"), 
@@ -88,6 +103,8 @@ GdPd::GdPd() {
     m_rtDefaults=true;
     m_player=NULL;
     osc_address = String(MULTICAST_ADDRESS.c_str());
+    addon_patches_folder = "res://addons/gdpd/patches";
+    m_applicationNameStr = "patch";
 }
 
 GdPd::~GdPd() {}
@@ -95,7 +112,7 @@ GdPd::~GdPd() {}
 
 int GdPd::audioCallback(void *outputBuffer, void *inputBuffer, 
 					    unsigned int nBufferFrames, double streamTime, 
-						RtAudioStreamStatus status, void *userData){
+						RtAudioStreamStatus status, void *userData) {
 	GdPd* gdpd = static_cast<GdPd*>(userData);
 	gdpd->processAudio(outputBuffer, inputBuffer, nBufferFrames);
 	return 0;
@@ -184,8 +201,8 @@ int GdPd::start() {
         //FIXME add local port in addition to multicast
         m_receiver = lo_server_new_multicast(
                             MULTICAST_ADDRESS.c_str(), 
-                            std::to_string(RECEIVER_PORT).c_str(),
-                            errorHandler);
+                            std::to_string(RECEIVER_PORT).c_str(),NULL);
+                            //errorHandler);
         /*
         m_receiver = lo_server_new_with_proto(
                             std::to_string(RECEIVER_PORT).c_str(),
@@ -342,13 +359,13 @@ void GdPd::send(String address, Array arguments) {
         }
         
         std::string addrStr(address.utf8().get_data());
-        addrStr = std::string("/gdpd/patch/")+addrStr;
+        addrStr = std::string("/gdpd/")+m_applicationNameStr+"/"+addrStr;
         lo_send_message(m_destination, addrStr.c_str(), msg);
     }
     else {
         libpd_start_message(arguments.size()+2);
         libpd_add_symbol("gdpd");
-        libpd_add_symbol("patch");
+        libpd_add_symbol(m_applicationNameStr.c_str());
         libpd_add_symbol(String(address).utf8().get_data());
         for(int i=0; i<arguments.size(); ++i) {
             switch(arguments[i].get_type()) {
@@ -372,10 +389,9 @@ void GdPd::_process(double delta) {
     if(!m_init) {
         return;
     }
-
     if(mode==OSC) {
         if(m_receiver!=NULL) {
-            lo_server_recv_noblock(m_receiver, 1);
+            lo_server_recv_noblock(m_receiver, 10);
         }
     }
     else {
@@ -410,22 +426,21 @@ void GdPd::processAudio(void *outputBuffer, void *inputBuffer,
 }
 
 bool GdPd::open_patch() {
-    std::string pdPatchStr;
-    std::string pdDirStr;
 
     //If opening from editor, just set the paths
     if(OS::get_singleton()->has_feature("editor")) {
-        print("Loading patch from editor");
 		String fullpath = ProjectSettings::get_singleton()
                             ->globalize_path(pd_patch);
 
-        
-
 		String pat = fullpath.get_slice("/",fullpath.get_slice_count("/")-1);
 		String dir = fullpath.trim_suffix(pat);
 
-        pdPatchStr = std::string(pat.utf8().get_data());
-        pdDirStr = std::string(dir.utf8().get_data());
+        m_pdPatchStr = std::string(pat.utf8().get_data());
+        m_pdDirStr = std::string(dir.utf8().get_data());
+
+        print("Loading patch "+m_pdPatchStr
+                +" from editor at path "
+                +m_pdDirStr);
     }
     else {
         // Otherwise, copy the files to user folder
@@ -435,9 +450,11 @@ bool GdPd::open_patch() {
 
 		if(OS::get_singleton()->get_name() == "Android") {
             print("On Android, so start copying files to user folder");
-            String packageName = "com.example.gdpd";
+            String packageName = ProjectSettings::get_singleton()
+                    ->globalize_path("user://").trim_suffix("/").rsplit("/")[2];
+
+            print(packageName.utf8().get_data());
 
-            //FIXME get Android package name
             userPath = String("/sdcard/Android/data/")
                         + packageName
                         + String("/files/");
@@ -454,39 +471,38 @@ bool GdPd::open_patch() {
         //Recursively copy this folder from res to user directory
         recurseCopy("res://"+patchDir, userPath+patchDir);
 
-        //Also copy gdpd patches
+        //Also copy gdpd patches from patches folder
         std::vector<String> gdpdFiles{"gdpd.pd", "gdpd_send.pd", 
                                       "gdpd_receive.pd"};
         for(auto& f : gdpdFiles) {
             Ref<DirAccess> diracc = DirAccess::open("res://");
-            diracc->copy("res://addons/gdpd/patches/"+f,
+            diracc->copy(addon_patches_folder+"/"+f,
                          userPath+patchDir+"/"+f);
         }
 
         //Define new paths
-        pdPatchStr = std::string(patch.utf8().get_data());
-        pdDirStr = std::string((userPath+patchDir).utf8().get_data());
+        m_pdPatchStr = std::string(patch.utf8().get_data());
+        m_pdDirStr = std::string((userPath+patchDir).utf8().get_data());
     }
 
-
     // Open the patch
     m_patchOpened=false;
-	pd::Patch p1 = m_pd.openPatch(pdPatchStr.c_str(), pdDirStr.c_str());
+	pd::Patch p1 = m_pd.openPatch(m_pdPatchStr.c_str(), m_pdDirStr.c_str());
+    /*
 	if(!p1.isValid()) {
-		print("Could not open patch "+pdPatchStr);
+		print("Could not open patch "+m_pdPatchStr);
         return false;
 	}
 	else {
-		print("Opened patch "+pdPatchStr);
+		print("Opened patch "+m_pdPatchStr);
         m_patchOpened=true;
         std::string patchStr(pd_patch.utf8().get_data());
         m_patchsMap[patchStr] = p1;
-	}
+	}*/
     return true;
 }
 
 void GdPd::recurseCopy(String fromPath, String toPath) {
-
     //Create the toPath folder
     DirAccess::make_dir_absolute(toPath);
 
@@ -505,7 +521,6 @@ void GdPd::recurseCopy(String fromPath, String toPath) {
         String dirName = dirs[i];
         recurseCopy(fromPath+"/"+dirName, toPath+"/"+dirName);
     }
-
 }
 
 void GdPd::close_patch() {
diff --git a/src/gdpd.h b/src/gdpd.h
index 4d8b67e..74d278a 100644
--- a/src/gdpd.h
+++ b/src/gdpd.h
@@ -58,7 +58,6 @@ protected:
                             lo_arg ** argv,
                             int argc, lo_message msg, void *user_data) {
         GdPd* gdpd = (GdPd*)user_data; 
-        std::cout<<"got osc message"<<std::endl;
         gdpd->handleOSC(path, types, argv, argc, msg);
         return 0;
     }
@@ -97,6 +96,12 @@ private:
     String pd_patch;
     String pd_folder;
     bool m_patchOpened;
+    String addon_patches_folder;
+    std::string m_pdPatchStr;
+    std::string m_pdDirStr;
+
+    String application_name;
+    std::string m_applicationNameStr;
 
     const int SENDER_PORT = 9211;
     const int RECEIVER_PORT = 9212;
@@ -133,6 +138,16 @@ public:
     inline String get_pd_folder() const{return pd_folder;}
     inline void set_pd_patch(const String p_patch){pd_patch=p_patch;}
     inline String get_pd_patch() const{return pd_patch;}
+    inline void set_addon_patches_folder(const String p_addon_patches_folder){
+        addon_patches_folder=p_addon_patches_folder;
+    }
+    inline String get_addon_patches_folder() const{return addon_patches_folder;}
+
+    inline void set_application_name(const String p_application_name){
+        application_name=p_application_name;
+        m_applicationNameStr = application_name.utf8().get_data();
+    }
+    inline String get_application_name() const{return application_name;}
 
     inline void set_osc_address(const String p_osc_address) { 
         osc_address = p_osc_address;
diff --git a/src/rtaudio/RtAudio.os b/src/rtaudio/RtAudio.os
deleted file mode 100644
index 1ec3e45a8b107c72164645ecd3c180df9bc90664..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 58992
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

-- 
GitLab