From 40211f9bdcea586130d4707825fecc4ca9cb8f30 Mon Sep 17 00:00:00 2001
From: Florent Berthaut <florent.berthaut@univ-lille.fr>
Date: Tue, 18 Feb 2025 23:26:41 +0100
Subject: [PATCH] Fix messages from/to pd

---
 demo/addons/gdpd/patches/gdpd.pd      | Bin 2528 -> 2562 bytes
 demo/addons/gdpd/patches/gdpd_send.pd | Bin 370 -> 430 bytes
 patches/gdpd.pd                       | Bin 2528 -> 2562 bytes
 patches/gdpd_send.pd                  | Bin 370 -> 430 bytes
 src/gdpd.cpp                          |  82 ++++++++++++++++----------
 5 files changed, 50 insertions(+), 32 deletions(-)

diff --git a/demo/addons/gdpd/patches/gdpd.pd b/demo/addons/gdpd/patches/gdpd.pd
index 99faa5f136e354096f96cd4225af423d24ee1f50..2b9668c6a405e06b231dec17a46e42c974f501ea 100644
GIT binary patch
delta 1013
zcmaDL+$6%K?5B{Nm{*oqtgw-XlabMMvlyclBUf&5x`K(Nfr6#w<WeRrMG({6RH3*s
zHz_|yAx6c}noBuCAwMY#tjN&FWbzdz_07u6m5l7BCMF7o78aBBSf$wv&CL{y%qIJ@
zs@Ll%q$wC$!nJ`^85vk8<YX3?D3las=Ay_Lnn7g>ic$+w^HLPjQwmZP3KC0_GvMmX
z4Ga{FOcaU~O7i1D(g+E2V+C_#h0?r&#N=#+G>CY8QkDWphl!;^i9#X>Lc~GBX66cp
z7RCz2V3YDw@=Fj>24)I|2F4Iq78m4XBBadB%oNO_t^~^{Ai~5PWTL4hL>t5lJji~S
zJb_h>(O~j+RvR%>1p}~c$@zJCsmUb@rV0iM#)gwQ*;eSHOBos|7%3PTp=mHQRxnU7
zGM#*ntx?<<P0q*=Bxf=?fn8*>2&Z7Zk&%L-f}sJrDzLd2dco!zqN_Clxz7^nSD2%X
zOcV?iOw7<lL4GkbLzqwx_MwrPf&mDkc-zPvWG;pqEU=1Nf<#Ra=7Nni1{;bl2nqmW
zn6Z=hv2y4c8-aAggkU}ZsZlVpMAvRQS&&my##F&j!3aYK$Q#BMlQ=~rj4aUgfn8`e
z*@;uj1(X|5ylMh+fC+l!nt-Cl1U<M-Kv832HhBZ5h=(z{>p&(eVAyQ}a;*t^=$L?9
IYXbHI08vW?8vp<R

delta 999
zcmZn?c_7TA?5B{Nm{*oqtYB%jk&Ba&(QLB_qZOlSeo~f#xrv#Ak%^%~u|i3He0qLL
zeu*`ga)d%|ak_%3iJ5|_+2jZ&EmIKF*hrzcGB+tdM<GVV5UdES-`rfm(m<g^AyFX_
zE(lU?VK{j)le#Qe4ag2dbA_DD;u3{|qSS)aycC7>l!BDa`<Yr8>&?y06-+G@ioh;N
zDM*P=EJ`nin`LHZpkQW*ESr*21eY~8F;y_MG(<5PE(y|VVTSHDV-p2K6H9~+;ncho
zxE528teNFxFBWMwBQpa9L(9q8Eb3CI@)l6tB}JLJljpFiF&a-k%xc4EK8a0)(PXkH
z+X`I^1p}~_<ovw6)Z`KcLn8$v1tVj0QDX%I1tasxuh<&v&CukGj6iZ2q97fH=;jz1
zD;O#m8lanC46@S%UDO0*t`WNEWPUc$d?Ql@Lj@B<bU8Bx0|gUf1xTF3d}L&%V5neZ
zfi7yUV4z@#;c5$zofzg$4rCXpH#Sf(P%uW<VQh$16ci@L=4kFS289W_=Z!($#5C3v
z-B@2x?10oM7^8=YG04>zVQp*y@;7>@8e4*VXgb+~Q>(-XJ@QRJ&Ne}hG!r98V50^r
YNST5Oy73?Z1rzi@0tqO9Ldu#80Aj`iO#lD@

diff --git a/demo/addons/gdpd/patches/gdpd_send.pd b/demo/addons/gdpd/patches/gdpd_send.pd
index 4bb09c4e684c9164cebcf772004c572872c4d9a4..2bbc9dfeea6e0a655d77fa5e82af9d210385659b 100644
GIT binary patch
literal 430
zcmY%PQ%FwCD@!a^Fi<cuSFkiSQ!p_zRWLNN=2DJO$WO{rFt<=JF;mFQ%SkPPiy0Xh
zDHs}9Diow7=jW9a<>!E9a*NXyKr$AV3W-JO#R>*sQIHuRQ8P=0oczR;q{O^*6mdf%
zONA1JM1@3zsIiHHp_#ElPG)h5LQZO4dPxRc&fG%5$iNIDRZx^#keZi*B4=!XTh7!%
zp;)0LKR!LB0HP^5KQAvexkSN0!9c+b>RgzZp@M;e37VLZf`Nh|nwT*t;LyZOz~&i(
l9R@ScM8QzO6iuC}f`Nj$0;)PQuoxuhV0z6J3=}LtdI70|amfGx

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

diff --git a/patches/gdpd.pd b/patches/gdpd.pd
index 99faa5f136e354096f96cd4225af423d24ee1f50..2b9668c6a405e06b231dec17a46e42c974f501ea 100644
GIT binary patch
delta 1013
zcmaDL+$6%K?5B{Nm{*oqtgw-XlabMMvlyclBUf&5x`K(Nfr6#w<WeRrMG({6RH3*s
zHz_|yAx6c}noBuCAwMY#tjN&FWbzdz_07u6m5l7BCMF7o78aBBSf$wv&CL{y%qIJ@
zs@Ll%q$wC$!nJ`^85vk8<YX3?D3las=Ay_Lnn7g>ic$+w^HLPjQwmZP3KC0_GvMmX
z4Ga{FOcaU~O7i1D(g+E2V+C_#h0?r&#N=#+G>CY8QkDWphl!;^i9#X>Lc~GBX66cp
z7RCz2V3YDw@=Fj>24)I|2F4Iq78m4XBBadB%oNO_t^~^{Ai~5PWTL4hL>t5lJji~S
zJb_h>(O~j+RvR%>1p}~c$@zJCsmUb@rV0iM#)gwQ*;eSHOBos|7%3PTp=mHQRxnU7
zGM#*ntx?<<P0q*=Bxf=?fn8*>2&Z7Zk&%L-f}sJrDzLd2dco!zqN_Clxz7^nSD2%X
zOcV?iOw7<lL4GkbLzqwx_MwrPf&mDkc-zPvWG;pqEU=1Nf<#Ra=7Nni1{;bl2nqmW
zn6Z=hv2y4c8-aAggkU}ZsZlVpMAvRQS&&my##F&j!3aYK$Q#BMlQ=~rj4aUgfn8`e
z*@;uj1(X|5ylMh+fC+l!nt-Cl1U<M-Kv832HhBZ5h=(z{>p&(eVAyQ}a;*t^=$L?9
IYXbHI08vW?8vp<R

delta 999
zcmZn?c_7TA?5B{Nm{*oqtYB%jk&Ba&(QLB_qZOlSeo~f#xrv#Ak%^%~u|i3He0qLL
zeu*`ga)d%|ak_%3iJ5|_+2jZ&EmIKF*hrzcGB+tdM<GVV5UdES-`rfm(m<g^AyFX_
zE(lU?VK{j)le#Qe4ag2dbA_DD;u3{|qSS)aycC7>l!BDa`<Yr8>&?y06-+G@ioh;N
zDM*P=EJ`nin`LHZpkQW*ESr*21eY~8F;y_MG(<5PE(y|VVTSHDV-p2K6H9~+;ncho
zxE528teNFxFBWMwBQpa9L(9q8Eb3CI@)l6tB}JLJljpFiF&a-k%xc4EK8a0)(PXkH
z+X`I^1p}~_<ovw6)Z`KcLn8$v1tVj0QDX%I1tasxuh<&v&CukGj6iZ2q97fH=;jz1
zD;O#m8lanC46@S%UDO0*t`WNEWPUc$d?Ql@Lj@B<bU8Bx0|gUf1xTF3d}L&%V5neZ
zfi7yUV4z@#;c5$zofzg$4rCXpH#Sf(P%uW<VQh$16ci@L=4kFS289W_=Z!($#5C3v
z-B@2x?10oM7^8=YG04>zVQp*y@;7>@8e4*VXgb+~Q>(-XJ@QRJ&Ne}hG!r98V50^r
YNST5Oy73?Z1rzi@0tqO9Ldu#80Aj`iO#lD@

diff --git a/patches/gdpd_send.pd b/patches/gdpd_send.pd
index 4bb09c4e684c9164cebcf772004c572872c4d9a4..2bbc9dfeea6e0a655d77fa5e82af9d210385659b 100644
GIT binary patch
literal 430
zcmY%PQ%FwCD@!a^Fi<cuSFkiSQ!p_zRWLNN=2DJO$WO{rFt<=JF;mFQ%SkPPiy0Xh
zDHs}9Diow7=jW9a<>!E9a*NXyKr$AV3W-JO#R>*sQIHuRQ8P=0oczR;q{O^*6mdf%
zONA1JM1@3zsIiHHp_#ElPG)h5LQZO4dPxRc&fG%5$iNIDRZx^#keZi*B4=!XTh7!%
zp;)0LKR!LB0HP^5KQAvexkSN0!9c+b>RgzZp@M;e37VLZf`Nh|nwT*t;LyZOz~&i(
l9R@ScM8QzO6iuC}f`Nj$0;)PQuoxuhV0z6J3=}LtdI70|amfGx

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

diff --git a/src/gdpd.cpp b/src/gdpd.cpp
index 9b4e75e..5baa83c 100644
--- a/src/gdpd.cpp
+++ b/src/gdpd.cpp
@@ -366,7 +366,10 @@ void GdPd::send(String address, Array arguments) {
         libpd_start_message(arguments.size()+2);
         libpd_add_symbol("gdpd");
         libpd_add_symbol(m_applicationNameStr.c_str());
-        libpd_add_symbol(String(address).utf8().get_data());
+        Array addrArray = address.split("/");
+        for(int i=0; i<addrArray.size(); ++i) {
+            libpd_add_symbol(String(addrArray[i]).utf8().get_data());
+        }
         for(int i=0; i<arguments.size(); ++i) {
             switch(arguments[i].get_type()) {
                 case Variant::INT :
@@ -401,21 +404,49 @@ void GdPd::_process(double delta) {
 
 void GdPd::handleOSC(const char* path, const char* types, 
                      lo_arg** argv, int argc, lo_message msg) {
-	Array gdList;
-	for(int i = 0; i < argc; ++i) {
-        switch(types[i]) {
-            case 'f' :
-                gdList.push_back(argv[i]->f);
-                break;
-            case 'i' :
-                gdList.push_back(argv[i]->i);
-                break;
-            case 's' :
-                gdList.push_back(String(&(argv[i]->s)));
-                break;
-		}
-	}
-    emit_signal("got_message", String(path), gdList);
+    if(std::string(path).find("/gdpd/"+m_applicationNameStr)==0) {
+        Array gdList;
+        for(int i = 0; i < argc; ++i) {
+            switch(types[i]) {
+                case 'f' :
+                    gdList.push_back(argv[i]->f);
+                    break;
+                case 'i' :
+                    gdList.push_back(argv[i]->i);
+                    break;
+                case 's' :
+                    gdList.push_back(String(&(argv[i]->s)));
+                    break;
+            }
+        }
+        emit_signal("got_message", String(path), gdList);
+    }
+}
+
+void GdPd::receiveList(const std::string& dest, const pd::List& list) {
+    if(dest == "to_godot") {
+        //retrieve address
+        int nb_addr = list.getFloat(2);
+        int start_addr = 3;
+        std::string addr = "/"+std::string(list.getSymbol(0).c_str())
+                          +"/"+std::string(list.getSymbol(1).c_str());
+        for(int i = start_addr; i < start_addr + nb_addr; ++i) {
+            addr += "/"+std::string(list.getSymbol(i).c_str());
+        }
+
+        //retrieve agruments
+        Array gdList;
+        for(int i = start_addr+nb_addr; i < list.len(); ++i) {
+            if(list.isFloat(i)) {
+                gdList.push_back(list.getFloat(i));
+            }
+            else if(list.isSymbol(i)) {
+                String symbStr(list.getSymbol(i).c_str());
+                gdList.push_back(symbStr);
+            }
+        }
+        emit_signal("got_message", String(addr.c_str()), gdList);
+    }
 }
 
 void GdPd::processAudio(void *outputBuffer, void *inputBuffer, 
@@ -487,8 +518,8 @@ bool GdPd::open_patch() {
 
     // Open the patch
     m_patchOpened=false;
-	pd::Patch p1 = m_pd.openPatch(m_pdPatchStr.c_str(), m_pdDirStr.c_str());
-    /*
+    //FIXME fix issue in libpd with itoa in dollarzero
+	pd::Patch p1 = m_pd.openPatch(m_pdPatchStr, m_pdDirStr);
 	if(!p1.isValid()) {
 		print("Could not open patch "+m_pdPatchStr);
         return false;
@@ -498,7 +529,7 @@ bool GdPd::open_patch() {
         m_patchOpened=true;
         std::string patchStr(pd_patch.utf8().get_data());
         m_patchsMap[patchStr] = p1;
-	}*/
+	}
     return true;
 }
 
@@ -538,19 +569,6 @@ void GdPd::print(const std::string& message) {
 	UtilityFunctions::print((std::string("GdPd : ")+message).c_str());
 }
 
-void GdPd::receiveList(const std::string& dest, const pd::List& list) {
-	Array gdList;
-	for(int i = 0; i < list.len(); ++i) {
-		if(list.isFloat(i)) {
-			gdList.push_back(list.getFloat(i));
-		}
-		else if(list.isSymbol(i)) {
-			String symbStr(list.getSymbol(i).c_str());
-			gdList.push_back(symbStr);
-		}
-	}
-    emit_signal("got_message", String(dest.c_str()), gdList);
-}
 
 /* GdPdStream */
 GdPdStream::GdPdStream() {
-- 
GitLab