21#include <JuceHeader.h>
35class ADMOSController :
public juce::OSCReceiver::Listener<juce::OSCReceiver::RealtimeCallback>,
public juce::MessageListener
59 type = std::uint16_t(t);
169 std::tuple<float, float> val;
170 std::memcpy(&std::get<0>(val), &
parameter1,
sizeof(std::get<0>(val)));
171 std::memcpy(&std::get<1>(val), &
parameter2,
sizeof(std::get<1>(val)));
193 std::tuple<float, float, float> val;
194 std::memcpy(&std::get<0>(val), &
parameter1,
sizeof(std::get<0>(val)));
195 std::memcpy(&std::get<1>(val), &
parameter2,
sizeof(std::get<1>(val)));
196 std::memcpy(&std::get<2>(val), &
parameter3,
sizeof(std::get<2>(val)));
252 std::lock_guard<std::mutex> l(m_typeMapMutex);
253 auto iter = std::find(m_typeMap[objNum].begin(), m_typeMap[objNum].end(), type);
254 if (iter == m_typeMap[objNum].end())
255 m_typeMap[objNum].push_back(type);
259 std::lock_guard<std::mutex> l(m_typeMapMutex);
260 auto iter = std::find(m_typeMap[m_objNum].begin(), m_typeMap[m_objNum].end(), m_type);
261 jassert(iter != m_typeMap[m_objNum].end());
262 if (iter != m_typeMap[m_objNum].end())
263 m_typeMap[m_objNum].erase(iter);
268 bool isAlreadyPending =
false;
270 std::lock_guard<std::mutex> l(m_typeMapMutex);
271 auto iter = std::find(m_typeMap[objNum].begin(), m_typeMap[objNum].end(), type);
272 if (iter != m_typeMap[objNum].end())
273 isAlreadyPending =
true;
276 if (!isAlreadyPending)
278 postTarget->postMessage(std::make_unique<ADMOSCParameterChangedMessage>(objNum, type, target).release());
299 static std::mutex m_typeMapMutex;
300 static std::map<int, std::vector<std::uint16_t>> m_typeMap;
303 std::uint16_t m_type;
311 bool startConnection(
int oscPort, juce::IPAddress targetIP,
int targetPort);
316 ADMOSCParameter
getParameter(
int objNum, std::uint16_t type);
338 const juce::String s_admObjDomainStr =
"/adm/obj/";
339 const juce::String s_xStr=
"/x";
340 const juce::String s_yStr=
"/y";
341 const juce::String s_zStr=
"/z";
342 const juce::String s_xyStr=
"/xy";
343 const juce::String s_xyzStr=
"/xyz";
344 const juce::String s_widthStr =
"/w";
345 const juce::String s_muteStr=
"/mute";
348 std::unique_ptr<juce::OSCReceiver> m_oscReceiver;
349 std::unique_ptr<juce::OSCSender> m_oscSender;
352 std::vector<int> m_knownObjNums;
353 std::mutex m_objCacheMutex;
354 std::map<int, std::map<std::uint16_t, ADMOSCParameter>> m_objCache;
ADMOSCParameterChangeTarget getTarget() const
ADMOSCParameterChangedMessage(int objNum, std::uint16_t type, ADMOSCParameterChangeTarget target)
std::uint16_t getType() const
~ADMOSCParameterChangedMessage()
static bool createAndPostIfNotAlreadyPending(int objNum, std::uint16_t type, ADMOSCParameterChangeTarget target, ADMOSController *postTarget)
Receives ADM-OSC UDP packets and translates them into panning position and mute updates.
ADMOSCParameter getParameter(int objNum, std::uint16_t type)
bool startConnection(int oscPort, juce::IPAddress targetIP, int targetPort)
void handleMessage(const Message &message) override
void oscBundleReceived(const juce::OSCBundle &bundle) override
const std::vector< int > getObjNumsFromObjIdent(const juce::String &objIdent)
ADMOSCParameterChangeTarget
void setNumObjects(int numObjects)
bool sendParameterChange(int objNum, const ADMOSController::ADMOSCParameter ¶m)
void setParameter(int objNum, const ADMOSCParameter ¶m, const ADMOSCParameterChangeTarget &pct=ADMOSCParameterChangeTarget::None)
std::function< void(int, std::uint16_t)> onParameterChanged
void oscMessageReceived(const juce::OSCMessage &message) override
const juce::OSCMessage getParameterAsOSCMessage(int objNum, const ADMOSController::ADMOSCParameter ¶m)
ADMOSCParameterMute(const ADMOSCParameter &other)
ADMOSCParameterMute(int mute01)
ADMOSCParameterMute(bool mute)
ADMOSCParameterWidth(float width)
ADMOSCParameterWidth(const ADMOSCParameter &other)
ADMOSCParameterXYZ(float xVal, float yVal, float zVal)
std::tuple< float, float, float > getParameterVals()
ADMOSCParameterXYZ(const ADMOSCParameter &other)
ADMOSCParameterXY(const ADMOSCParameter &other)
ADMOSCParameterXY(float xVal, float yVal)
std::tuple< float, float > getParameterVals()
ADMOSCParameterX(float xVal)
ADMOSCParameterX(const ADMOSCParameter &other)
ADMOSCParameterY(float yVal)
ADMOSCParameterY(const ADMOSCParameter &other)
ADMOSCParameterZ(const ADMOSCParameter &other)
ADMOSCParameterZ(float zVal)
std::uint16_t parameterCount
ADMOSCParameter(ADMOSCParameterType t)
ADMOSCParameter()=default