59 #include "al/math/al_Vec.hpp"
60 #include "al/protocol/al_OSC.hpp"
61 #include "al/spatial/al_Pose.hpp"
62 #include "al/types/al_Color.hpp"
63 #include "al/types/al_ValueSource.hpp"
67 enum class TimeMasterMode {
79 typedef enum { FLOAT, INT32, STRING, NULLDATA } ParameterDataType;
89 *
static_cast<float *
>(mData) = value;
95 *
static_cast<float *
>(mData) =
float(value);
101 *
static_cast<int32_t *
>(mData) = value;
106 mData =
new std::string;
107 *
static_cast<std::string *
>(mData) = value;
112 mData =
new std::string;
113 *
static_cast<std::string *
>(mData) = value;
119 delete static_cast<float *
>(mData);
122 delete static_cast<std::string *
>(mData);
125 delete static_cast<int32_t *
>(mData);
137 *
static_cast<float *
>(mData) = *
static_cast<float *
>(paramField.mData);
140 mData =
new std::string;
141 *
static_cast<std::string *
>(mData) =
142 *
static_cast<std::string *
>(paramField.mData);
146 *
static_cast<int32_t *
>(mData) =
147 *
static_cast<int32_t *
>(paramField.mData);
156 : mType(NULLDATA), mData(
nullptr) {
174 std::swap(lhs.mData, rhs.mData);
175 std::swap(lhs.mType, rhs.mType);
178 ParameterDataType type() {
return mType; }
180 template <
typename type> type get() {
return *
static_cast<type *
>(mData); }
182 template <
typename type>
void set(type value) {
183 if (std::is_same<type, float>::value) {
184 if (mType == FLOAT) {
185 *
static_cast<type *
>(mData) = value;
188 <<
"ERROR: Unexpected type for parameter field set(). Ignoring."
191 }
else if (std::is_same<type, double>::value) {
192 if (mType == FLOAT) {
193 *
static_cast<float *
>(mData) = value;
196 <<
"ERROR: Unexpected type for parameter field set(). Ignoring."
199 }
else if (std::is_same<type, std::string>::value) {
200 if (mType == STRING) {
201 *
static_cast<type *
>(mData) = value;
204 <<
"ERROR: Unexpected type for parameter field set(). Ignoring."
207 }
else if (std::is_same<type, char *>::value) {
208 if (mType == STRING) {
209 *
static_cast<std::string *
>(mData) = value;
212 <<
"ERROR: Unexpected type for parameter field set(). Ignoring."
215 }
else if (std::is_same<type, int32_t>::value) {
216 if (mType == INT32) {
217 *
static_cast<type *
>(mData) = value;
220 <<
"ERROR: Unexpected type for parameter field set(). Ignoring."
223 }
else if (std::is_same<type, int>::value) {
224 if (mType == INT32) {
225 *
static_cast<int32_t *
>(mData) = value;
228 <<
"ERROR: Unexpected type for parameter field set(). Ignoring."
235 ParameterDataType mType;
272 std::string
getName() {
return mParameterName; }
308 void setHint(std::string hintName,
float hintValue) {
309 mHints[hintName] = hintValue;
312 float getHint(std::string hintName,
bool *exists =
nullptr) {
314 if (mHints.find(hintName) != mHints.end()) {
315 value = mHints[hintName];
328 virtual void getFields(std::vector<ParameterField> & ) {
330 <<
"get(std::vector<ParameteterField> &fields) not implemented for "
331 <<
typeid(*this).name() << std::endl;
334 virtual void setFields(std::vector<ParameterField> & ) {
336 <<
"set(std::vector<ParameteterField> &fields) not implemented for "
337 <<
typeid(*this).name() << std::endl;
340 virtual void sendValue(osc::Send &sender, std::string prefix =
"") {
342 std::cout <<
"sendValue function not implemented for "
343 <<
typeid(*this).name() << std::endl;
346 virtual void sendMeta(osc::Send &sender, std::string bundleName =
"",
347 std::string
id =
"") {
349 std::cout <<
"sendMeta function not implemented for "
350 <<
typeid(*this).name() << std::endl;
356 std::string mFullAddress;
357 std::string mParameterName;
358 std::string mDisplayName;
361 std::map<std::string, float> mHints;
388 ParameterType defaultValue = ParameterType());
391 ParameterType defaultValue, ParameterType min,
409 if (mProcessCallback) {
410 value = (*mProcessCallback)(value);
413 runChangeCallbacksSynchronous(value, src);
436 virtual void setNoCalls(ParameterType value,
void *blockReceiver =
nullptr) {
440 if (mProcessCallback) {
441 value = (*mProcessCallback)(value);
444 for (
auto cb : mCallbacks) {
470 virtual ParameterType
get();
489 for (
auto cb : mMetaCallbacksSrc) {
493 ParameterType min()
const {
return mMin; }
503 for (
auto cb : mMetaCallbacksSrc) {
507 ParameterType max()
const {
return mMax; }
509 void setDefault(
const ParameterType &defaultValue) {
510 mDefault = defaultValue;
512 ParameterType getDefault()
const {
return mDefault; }
518 typedef const std::function<ParameterType(ParameterType)>
519 ParameterProcessCallback;
520 typedef const std::function<void(ParameterType)> ParameterChangeCallback;
521 typedef const std::function<void(ParameterType, ValueSource *)>
522 ParameterChangeCallbackSrc;
524 typedef const std::function<void(ValueSource *)>
525 ParameterMetaChangeCallbackSrc;
557 void registerMetaChangeCallback(ParameterMetaChangeCallbackSrc cb);
574 if (mCallbacks.size() > 0 && mCallbacks[0] ==
nullptr) {
576 mCallbacks.erase(mCallbacks.begin());
580 mCallbacks.insert(mCallbacks.begin(),
nullptr);
584 bool hasChange() {
return mChanged; }
593 ParameterType value =
get();
596 auto callbackIt = mCallbacks.begin();
597 while (callbackIt != mCallbacks.end()) {
599 (*(*callbackIt))(value);
603 auto callbackSrcIt = mCallbacksSrc.begin();
604 while (callbackSrcIt != mCallbacksSrc.end()) {
605 if (*callbackSrcIt) {
606 (*(*callbackSrcIt))(value,
nullptr);
613 std::vector<ParameterWrapper<ParameterType> *>
615 std::vector<ParameterWrapper<ParameterType> *> paramList;
616 paramList.push_back(&newParam);
620 std::vector<ParameterWrapper<ParameterType> *> &
621 operator<<(std::vector<ParameterWrapper<ParameterType> *> ¶mVector) {
622 paramVector.push_back(
this);
628 operator ParameterType() {
return this->
get(); }
630 ParameterWrapper<ParameterType> operator=(
const ParameterType value) {
639 ParameterType mValue;
640 ParameterType mValueCache;
642 ParameterType mDefault;
644 void runChangeCallbacksSynchronous(ParameterType &value, ValueSource *src);
646 std::shared_ptr<ParameterProcessCallback> mProcessCallback;
650 bool mChanged{
false};
654 std::unique_ptr<std::mutex> mMutex;
657 std::vector<std::shared_ptr<ParameterChangeCallback>> mCallbacks;
658 std::vector<std::shared_ptr<ParameterChangeCallbackSrc>> mCallbacksSrc;
660 std::vector<std::shared_ptr<ParameterMetaChangeCallbackSrc>>
711 Parameter(std::string parameterName, std::string group =
"",
712 float defaultValue = 0,
float min = -99999.0,
float max = 99999.0);
714 Parameter(std::string parameterName,
float defaultValue,
float min = -99999.0,
715 float max = 99999.0);
717 [[deprecated(
"Prefix is ignored")]]
Parameter(
718 std::string parameterName, std::string Group,
float defaultValue,
719 std::string prefix,
float min = -99999.0,
float max = 99999.0);
722 mValue = param.mValue;
723 setDefault(param.getDefault());
742 virtual void setNoCalls(
float value,
void *blockReceiver =
nullptr)
override;
751 virtual float get()
override;
753 virtual float toFloat()
override {
return mValue; }
760 float operator=(
const float value) {
765 virtual void getFields(std::vector<ParameterField> &fields)
override {
766 fields.emplace_back(ParameterField(
get()));
769 virtual void setFields(std::vector<ParameterField> &fields)
override {
770 assert(fields.size() == 1);
771 if (fields.size() == 1) {
772 assert(fields[0].type() == ParameterField::FLOAT);
773 set(fields[0].get<float>());
775 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
780 virtual void sendValue(osc::Send &sender, std::string prefix =
"")
override {
784 virtual void sendMeta(osc::Send &sender, std::string bundleName =
"",
785 std::string
id =
"")
override {
786 if (bundleName.size() == 0) {
788 std::string(),
min(),
max());
790 sender.send(
"/registerBundleParameter", bundleName,
id,
getName(),
817 int32_t defaultValue = 0, int32_t min = 0, int32_t max = 127);
820 std::string parameterName, std::string Group, int32_t defaultValue,
821 std::string prefix, int32_t min = 0, int32_t max = 127);
825 mValue = param.mValue;
826 setDefault(param.getDefault());
846 void *blockReceiver =
nullptr)
override;
858 virtual float toFloat()
override {
return float(mValue); }
865 float operator=(
const int32_t value) {
870 virtual void sendValue(osc::Send &sender, std::string prefix =
"")
override {
874 virtual void getFields(std::vector<ParameterField> &fields)
override {
875 fields.emplace_back(ParameterField(
get()));
878 virtual void setFields(std::vector<ParameterField> &fields)
override {
879 if (fields.size() == 1) {
880 assert(fields[0].type() == ParameterField::INT32);
881 set(fields[0].get<int32_t>());
883 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
888 virtual void sendMeta(osc::Send &sender, std::string bundleName =
"",
889 std::string
id =
"")
override {
890 if (bundleName.size() == 0) {
892 std::string(),
min(),
max());
894 sender.send(
"/registerBundleParameter", bundleName,
id,
getName(),
907 using Parameter::setFields;
924 float defaultValue = 0,
float min = 0,
float max = 1.0);
927 std::string parameterName, std::string Group,
float defaultValue,
928 std::string prefix,
float min = 0,
float max = 1.0);
930 bool operator=(
bool value) {
931 this->
set(value ? 1.0f : 0.0f);
942 virtual void getFields(std::vector<ParameterField> &fields)
override {
946 virtual void setFields(std::vector<ParameterField> &fields)
override {
947 if (fields.size() == 1) {
948 if (fields[0].type() == ParameterField::INT32) {
949 set(fields[0].get<int32_t>() == 1 ? 1.0f : 0.0f);
950 }
else if (fields[0].type() == ParameterField::FLOAT) {
951 set(fields[0].get<float>());
954 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
959 virtual void sendMeta(osc::Send &sender, std::string bundleName =
"",
960 std::string
id =
"")
override {
962 if (bundleName.size() == 0) {
964 std::string(),
min(),
max());
966 sender.send(
"/registerBundleParameter", bundleName,
id,
getName(),
976 Trigger(std::string parameterName, std::string Group =
"")
982 virtual float toFloat()
override {
return get() ? 1.0f : 0.0f; }
989 virtual void sendValue(
osc::Send &sender, std::string prefix =
"")
override {
993 void trigger() {
set(
true); }
1009 std::string defaultValue =
"")
1012 [[deprecated(
"Prefix is ignored")]]
ParameterString(std::string parameterName,
1014 std::string defaultValue,
1021 value = std::stof(
get());
1029 set(std::to_string(value));
1033 virtual void sendValue(
osc::Send &sender, std::string prefix =
"")
override {
1037 virtual void getFields(std::vector<ParameterField> &fields)
override {
1038 fields.emplace_back(ParameterField(
get()));
1041 virtual void setFields(std::vector<ParameterField> &fields)
override {
1042 if (fields.size() == 1) {
1043 set(fields[0].get<std::string>());
1045 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
1050 virtual void sendMeta(osc::Send &sender, std::string bundleName =
"",
1051 std::string
id =
"")
override {
1052 if (bundleName.size() == 0) {
1053 sender.send(
"/registerParameter",
getName(),
getGroup(), getDefault(),
1054 std::string(),
min(),
max());
1056 sender.send(
"/registerBundleParameter", bundleName,
id,
getName(),
1067 ParameterVec3(std::string parameterName, std::string Group =
"",
1076 float operator[](
size_t index) {
1077 assert(index < INT_MAX);
1082 virtual void sendValue(
osc::Send &sender, std::string prefix =
"")
override {
1087 virtual void getFields(std::vector<ParameterField> &fields)
override {
1094 virtual void setFields(std::vector<ParameterField> &fields)
override {
1095 if (fields.size() == 3) {
1096 Vec3f vec(fields[0].get<float>(), fields[1].get<float>(),
1097 fields[2].get<float>());
1100 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
1113 ParameterVec4(std::string parameterName, std::string Group =
"",
1122 float operator[](
size_t index) {
1127 virtual void sendValue(
osc::Send &sender, std::string prefix =
"")
override {
1132 virtual void getFields(std::vector<ParameterField> &fields)
override {
1140 virtual void setFields(std::vector<ParameterField> &fields)
override {
1141 if (fields.size() == 4) {
1142 Vec4f vec(fields[0].get<float>(), fields[1].get<float>(),
1143 fields[2].get<float>(), fields[3].get<float>());
1146 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
1159 ParameterPose(std::string parameterName, std::string Group =
"",
1168 virtual void sendValue(
osc::Send &sender, std::string prefix =
"")
override {
1172 float(pose.z()),
float(q.
w),
float(q.
x),
float(q.
y),
1181 virtual void getFields(std::vector<ParameterField> &fields)
override {
1194 virtual void setFields(std::vector<ParameterField> &fields)
override {
1195 if (fields.size() == 7) {
1196 Pose vec(
Vec3f(fields[0].get<float>(), fields[1].get<float>(),
1197 fields[2].get<float>()),
1198 Quatf(fields[3].get<float>(), fields[4].get<float>(),
1199 fields[5].get<float>(), fields[6].get<float>()));
1202 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
1215 ParameterMenu(std::string parameterName, std::string Group =
"",
1216 int defaultValue = 0)
1219 int operator=(
const int32_t value) {
1224 void setElements(std::vector<std::string> elements) {
1225 std::lock_guard<std::mutex> lk(mElementsLock);
1226 mElements = elements;
1229 std::vector<std::string> getElements() {
1230 std::lock_guard<std::mutex> lk(mElementsLock);
1234 std::string getCurrent() {
1235 int current =
get();
1236 std::lock_guard<std::mutex> lk(mElementsLock);
1237 if (mElements.size() > 0 && current >= 0 &&
1238 current < int32_t(mElements.size())) {
1239 return mElements[current];
1245 void setCurrent(std::string element,
bool noCalls =
false) {
1246 mElementsLock.lock();
1247 auto position = std::find(mElements.begin(), mElements.end(), element);
1248 bool found = position != mElements.end();
1249 int foundPosition = (int32_t)std::distance(mElements.begin(), position);
1250 mElementsLock.unlock();
1258 std::cerr <<
"ERROR: Could not find element: " << element << std::endl;
1263 return float(
get());
1268 set((int32_t)value);
1272 virtual void sendValue(
osc::Send &sender, std::string prefix =
"")
override {
1276 virtual void getFields(std::vector<ParameterField> &fields)
override {
1277 fields.emplace_back(ParameterField(getCurrent()));
1280 virtual void setFields(std::vector<ParameterField> &fields)
override {
1283 if (fields.size() == 1) {
1284 setCurrent(fields[0].get<std::string>());
1286 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
1292 std::mutex mElementsLock;
1293 std::vector<std::string> mElements;
1310 uint64_t defaultValue = 0)
1318 void setElements(std::vector<std::string> &elements,
bool allOn =
false) {
1319 mElements = elements;
1321 assert(((uint64_t)1 << (elements.size() - 1)) < UINT64_MAX);
1322 max((uint64_t)1 << (elements.size() - 1));
1325 for (
unsigned int i = 0; i < elements.size(); i++) {
1332 void setElementSelected(std::string name,
bool selected =
true) {
1333 for (
size_t i = 0; i < mElements.size(); i++) {
1334 if (mElements[i] == name) {
1335 uint64_t value =
get();
1337 value |= UINT64_C(1) << i;
1339 value ^= value | UINT64_C(1) << i;
1346 std::vector<std::string> getElements() {
return mElements; }
1348 std::vector<std::string> getSelectedElements() {
1349 std::vector<std::string> selected;
1350 for (uint64_t i = 0; i < mElements.size(); i++) {
1351 if (
get() & ((uint64_t)1 << i)) {
1352 if (mElements.size() > i) {
1353 selected.push_back(mElements[i]);
1360 void set(std::vector<int8_t> on) {
1362 for (
auto onBit : on) {
1364 value |= UINT64_C(1) << onBit;
1366 std::cerr << __FILE__ <<
" " << __FUNCTION__
1367 <<
" bit index too high. Ignoring" << std::endl;
1374 return (
float)
get();
1379 set((uint64_t)value);
1383 virtual void sendValue(
osc::Send &sender, std::string prefix =
"")
override {
1387 virtual void getFields(std::vector<ParameterField> &fields)
override {
1388 if (
get() > INT32_MAX) {
1389 std::cerr <<
"WARNING: Can't fit choice value." << std::endl;
1391 fields.emplace_back(ParameterField((int32_t)
get()));
1394 virtual void setFields(std::vector<ParameterField> &fields)
override {
1397 if (fields.size() == 1) {
1398 set(fields[0].get<int32_t>());
1400 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
1406 std::vector<std::string> mElements;
1416 ParameterColor(std::string parameterName, std::string Group =
"",
1425 virtual void sendValue(
osc::Send &sender, std::string prefix =
"")
override {
1430 virtual void getFields(std::vector<ParameterField> &fields)
override {
1438 virtual void setFields(std::vector<ParameterField> &fields)
override {
1439 if (fields.size() == 4) {
1440 Color vec(fields[0].get<float>(), fields[1].get<float>(),
1441 fields[2].get<float>(), fields[3].get<float>());
1444 std::cout <<
"Wrong number of parameters for " <<
getFullAddress()
1452 template <
class ParameterType>
1457 template <
class ParameterType>
1460 ParameterType defaultValue)
1461 :
ParameterMeta(parameterName, group), mProcessCallback(nullptr) {
1462 mValue = defaultValue;
1463 mValueCache = defaultValue;
1464 mMutex = std::make_unique<std::mutex>();
1465 setDefault(defaultValue);
1466 std::shared_ptr<ParameterChangeCallback> mAsyncCallback =
1467 std::make_shared<ParameterChangeCallback>(
1468 [&](ParameterType value) { mChanged =
true; });
1471 template <
class ParameterType>
1474 ParameterType defaultValue,
1481 mMutex = std::make_unique<std::mutex>();
1482 setDefault(defaultValue);
1485 template <
class ParameterType>
1487 const ParameterWrapper<ParameterType> ¶m)
1488 : ParameterMeta(param.mParameterName, param.mGroup) {
1491 mProcessCallback = param.mProcessCallback;
1493 mCallbacks = param.mCallbacks;
1494 mMutex = std::make_unique<std::mutex>();
1495 setDefault(param.getDefault());
1499 template <
class ParameterType>
1501 ParameterType current = mValueCache;
1502 if (mMutex->try_lock()) {
1509 template <
class ParameterType>
1514 template <
class ParameterType>
1516 typename ParameterWrapper::ParameterProcessCallback cb) {
1517 mProcessCallback = std::make_shared<ParameterProcessCallback>(cb);
1521 template <
class ParameterType>
1523 ParameterChangeCallback cb) {
1524 mCallbacks.push_back(std::make_shared<ParameterChangeCallback>(cb));
1528 template <
class ParameterType>
1530 ParameterChangeCallbackSrc cb) {
1531 mCallbacksSrc.push_back(std::make_shared<ParameterChangeCallbackSrc>(cb));
1535 template <
class ParameterType>
1536 void ParameterWrapper<ParameterType>::registerMetaChangeCallback(
1537 ParameterMetaChangeCallbackSrc cb) {
1538 mMetaCallbacksSrc.push_back(
1539 std::make_shared<ParameterMetaChangeCallbackSrc>(cb));
1542 template <
class ParameterType>
1543 void ParameterWrapper<ParameterType>::runChangeCallbacksSynchronous(
1544 ParameterType &value, ValueSource *src) {
1545 for (
auto cb : mCallbacks) {
1546 if (cb ==
nullptr) {
1554 for (
auto cb : mCallbacksSrc) {
virtual float toFloat() override
Generic function to return the value of the parameter as a float.
virtual float get() override
get the parameter's value
ParameterBool(std::string parameterName, std::string Group="", float defaultValue=0, float min=0, float max=1.0)
ParameterBool.
virtual bool fromFloat(float value) override
Generic function to set the parameter from a single float value.
A parameter representing selected items from a list.
virtual float toFloat() override
Generic function to return the value of the parameter as a float.
virtual bool fromFloat(float value) override
Generic function to set the parameter from a single float value.
virtual float get() override
get the parameter's value
virtual bool fromFloat(float value) override
Generic function to set the parameter from a single float value.
virtual void set(float value, ValueSource *src=nullptr) override
set the parameter's value
Parameter(std::string parameterName, std::string group="", float defaultValue=0, float min=-99999.0, float max=99999.0)
Parameter.
virtual void setNoCalls(float value, void *blockReceiver=nullptr) override
set the parameter's value without calling callbacks
virtual float toFloat() override
Generic function to return the value of the parameter as a float.
ParameterInt(std::string parameterName, std::string Group="", int32_t defaultValue=0, int32_t min=0, int32_t max=127)
ParameterInt.
virtual void set(int32_t value, ValueSource *src=nullptr) override
set the parameter's value
virtual bool fromFloat(float value) override
Generic function to set the parameter from a single float value.
virtual float toFloat() override
Generic function to return the value of the parameter as a float.
virtual void setNoCalls(int32_t value, void *blockReceiver=nullptr) override
set the parameter's value without calling callbacks
virtual bool fromFloat(float value) override
Generic function to set the parameter from a single float value.
virtual float toFloat() override
Generic function to return the value of the parameter as a float.
The ParameterWrapper class provides a generic thread safe Parameter class from the ParameterType temp...
void setSynchronousCallbacks(bool synchronous=true)
Determines whether value change callbacks are called synchronously.
virtual void setNoCalls(ParameterType value, void *blockReceiver=nullptr)
set the parameter's value without calling callbacks
virtual ParameterType get()
get the parameter's value
void setProcessingCallback(ParameterProcessCallback cb)
setProcessingCallback sets a callback to be called whenever the parameter value changes
bool processChange()
call change callbacks if value has changed since last call
void min(ParameterType minValue, ValueSource *src=nullptr)
set the minimum value for the parameter
virtual void reset()
reset value to default value
ParameterWrapper(std::string parameterName, std::string group="", ParameterType defaultValue=ParameterType())
ParameterWrapper.
void registerChangeCallback(ParameterChangeCallback cb)
registerChangeCallback adds a callback to be called when the value changes
virtual ParameterType getPrevious()
Get previous value.
virtual void set(ParameterType value, ValueSource *src=nullptr)
set the parameter's value
void setLocking(ParameterType value)
set the parameter's value forcing a lock
void max(ParameterType maxValue, ValueSource *src=nullptr)
set the maximum value for the parameter
A local coordinate frame.
Vec3d & pos()
Get "position" vector.
Quatd & quat()
Get quaternion component (represents orientation)
virtual bool fromFloat(float value) override
Generic function to set the parameter from a single float value.
virtual float toFloat() override
Generic function to return the value of the parameter as a float.
size_t send()
Send and clear current packet contents.
T min(const T &v1, const T &v2, const T &v3)
T max(const T &v1, const T &v2, const T &v3)
Quat< float > Quatf
Single-precision quaternion.
Vec< 3, float > Vec3f
float 3-vector
float a
Alpha component in [0, 1].
float r
Red component in [0, 1].
float b
Blue component in [0, 1].
float g
Green component in [0, 1].