33 m_oscReceiver = std::make_unique<juce::OSCReceiver>(
"ADM-OSC communication thread");
34 m_oscReceiver->registerFormatErrorHandler([=](
const char* ,
int dataSize) { DBG(juce::String(__FUNCTION__) +
" received " + juce::String(dataSize) +
" bytes of unknown data"); });
35 m_oscReceiver->addListener(
this);
37 m_oscSender = std::make_unique<juce::OSCSender>();
46 DBG(juce::String(__FUNCTION__) <<
" RP:" << receiverOscPort <<
" TIP:" << targetIP.toString() <<
" TP:" << targetPort);
51 auto connected = m_oscReceiver->connect(receiverOscPort);
53 juce::AlertWindow::showMessageBoxAsync(juce::MessageBoxIconType::WarningIcon,
"Communication issue",
"ADM-OSC port " + juce::String(receiverOscPort) +
" could not be opened.",
"Ok");
54 success = success && connected;
61 auto connected = m_oscSender->connect(targetIP.toString(), targetPort);
63 juce::AlertWindow::showMessageBoxAsync(juce::MessageBoxIconType::WarningIcon,
"Communication issue",
"ADM-OSC connection to given " + targetIP.toString() +
":" + juce::String(targetPort) +
" could not be established.",
"Ok");
64 success = success && connected;
85 auto objNums = std::vector<int>();
86 if (!objIdent.containsAnyOf(
"*?{}[]"))
87 objNums.push_back(objIdent.getIntValue());
92 objNums = m_knownObjNums;
94 else if (objIdent.startsWith(
"{") && objIdent.endsWith(
"}"))
96 auto numListStr = objIdent.substring(1, objIdent.length());
97 juce::StringArray nsa;
98 nsa.addTokens(numListStr,
",",
"");
99 objNums.reserve(nsa.size());
100 for (
auto const& ns : nsa)
101 objNums.push_back(ns.getIntValue());
103 else if (objIdent.startsWith(
"[") && objIdent.endsWith(
"]"))
105 auto numListStr = objIdent.substring(1, objIdent.length());
106 juce::StringArray nsa;
107 nsa.addTokens(numListStr,
"-",
"");
108 jassert(2 == nsa.size());
109 auto startNum = nsa[0].getIntValue();
110 auto endNum = nsa[1].getIntValue();
111 objNums.reserve(endNum - startNum + 1);
112 for (
auto i = startNum; i <= endNum; i++)
113 objNums.push_back(i);
117 DBG(juce::String(__FUNCTION__) +
" OSC address ident " + objIdent +
" not supported.");
142 DBG(juce::String(__FUNCTION__) <<
" type XY: " << std::get<0>(xyVals) <<
" " << std::get<1>(xyVals));
148 DBG(juce::String(__FUNCTION__) <<
" type XYZ: " << std::get<0>(xyzVals) <<
" " << std::get<1>(xyzVals) <<
" " << std::get<2>(xyzVals));
159 DBG(juce::String(__FUNCTION__) +
" type NONE unsupported.");
173 std::lock_guard<std::mutex> l(m_objCacheMutex);
174 m_objCache[objNum][param.
type] = param;
243 return juce::OSCMessage(juce::OSCAddressPattern(s_admObjDomainStr + juce::String(objNum) + s_xStr),
ADMOSCParameterX(param).getParameterVal());
245 return juce::OSCMessage(juce::OSCAddressPattern(s_admObjDomainStr + juce::String(objNum) + s_yStr),
ADMOSCParameterY(param).getParameterVal());
247 return juce::OSCMessage(juce::OSCAddressPattern(s_admObjDomainStr + juce::String(objNum) + s_zStr),
ADMOSCParameterZ(param).getParameterVal());
251 return juce::OSCMessage(juce::OSCAddressPattern(s_admObjDomainStr + juce::String(objNum) + s_xyStr), std::get<0>(xyVal), std::get<1>(xyVal));
256 return juce::OSCMessage(juce::OSCAddressPattern(s_admObjDomainStr + juce::String(objNum) + s_xyzStr), std::get<0>(xyzVal), std::get<1>(xyzVal), std::get<2>(xyzVal));
259 return juce::OSCMessage(juce::OSCAddressPattern(s_admObjDomainStr + juce::String(objNum) + s_widthStr),
ADMOSCParameterWidth(param).getParameterVal());
261 return juce::OSCMessage(juce::OSCAddressPattern(s_admObjDomainStr + juce::String(objNum) + s_muteStr),
ADMOSCParameterMute(param).getParameterVal01());
265 return juce::OSCMessage(juce::OSCAddressPattern(s_admObjDomainStr + juce::String(objNum)));
271 if (message.isEmpty())
274 auto addrStr = message.getAddressPattern().toString();
275 if (addrStr.startsWith(s_admObjDomainStr))
277 auto addrContents = addrStr.fromFirstOccurrenceOf(s_admObjDomainStr,
false,
false);
279 auto objIdent = addrContents.upToFirstOccurrenceOf(
"/",
false,
false);
283 if (addrContents.endsWith(s_xStr) && 1 == message.size())
285 else if (addrContents.endsWith(s_yStr) && 1 == message.size())
287 else if (addrContents.endsWith(s_zStr) && 1 == message.size())
289 else if (addrContents.endsWith(s_xyStr) && 2 == message.size())
291 else if (addrContents.endsWith(s_xyzStr) && 3 == message.size())
292 param =
ADMOSCParameterXYZ(message[0].getFloat32(), message[1].getFloat32(), message[2].getFloat32());
293 else if (addrContents.endsWith(s_widthStr) && 1 == message.size())
295 else if (addrContents.endsWith(s_muteStr) && 1 == message.size())
298 for (
auto const& objNum : objNums)
303 DBG(juce::String(__FUNCTION__) +
" unhandled OSC message: " + addrStr +
"(" + juce::String(message.size()) +
" args)");