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