5 #ifndef _RNBO_Presets_H_
6 #define _RNBO_Presets_H_
9 #include "RNBO_PatcherState.h"
12 #define RNBO_NOPRESETS
18 using Preset = PatcherState;
21 using PresetPtr = std::shared_ptr<Preset>;
27 RNBO_PUSH_DISABLE_WARNINGS
28 #include "3rdparty/json/json.hpp"
29 RNBO_POP_DISABLE_WARNINGS
31 #include "RNBO_Utils.h"
32 #include "RNBO_Debug.h"
42 using PresetMap = StateMap;
83 bool isDummy()
const override {
return true; }
96 #endif // RNBO_NOSTDLIB
98 #ifndef RNBO_NOJSONPRESETS
100 using Json = nlohmann::json;
102 static Json convertPresetToJSONObj(
const Preset& preset) {
104 for (
auto const& entry : preset) {
105 const char *key = entry.first.c_str();
106 auto type = entry.second.getType();
109 float value = (float)entry.second;
114 double value = (double)entry.second;
120 const list& value = entry.second;
121 for (
size_t i = 0; i < value.
length; i++) {
122 j.push_back(value[i]);
127 case ValueHolder::STRING: {
128 const char * str = entry.second;
133 const Preset& subPreset = entry.second;
134 json[key] = convertPresetToJSONObj(subPreset);
138 Index size = entry.second.getSubStateMapSize();
141 for (
Index i = 0; i < size; i++) {
142 const Preset& subPreset = entry.second[i];
143 j.push_back(convertPresetToJSONObj(subPreset));
149 case ValueHolder::UINT32: {
150 UInt32 value = (UInt32)entry.second;
154 case ValueHolder::UINT64: {
155 UInt64 value = (UInt64)entry.second;
160 case ValueHolder::EXTERNAL:
161 case ValueHolder::EVENTTARGET:
162 case ValueHolder::DATAREF:
163 case ValueHolder::MULTIREF:
164 case ValueHolder::SIGNAL:
165 case ValueHolder::BOOLEAN:
166 case ValueHolder::INTVALUE:
177 static std::string convertPresetToJSON(
const Preset& preset) {
178 return convertPresetToJSONObj(preset).dump();
181 static void convertJSONObjToPreset(Json& json, Preset& preset) {
182 for (Json::iterator it = json.begin(); it != json.end(); it++) {
183 const char* key = it.key().c_str();
184 if (it->is_number()) {
185 number value = it.value();
188 else if (it->is_string()) {
189 std::string value = it.value();
190 preset[key] = value.c_str();
192 else if (it->is_array()) {
195 if (j[0].is_number()) {
197 for (Index i = 0; i < j.size(); i++) {
202 else if (j[0].is_object()) {
203 for (Index i = 0; i < j.size(); i++) {
204 Preset& subPreset = preset[key][i];
205 convertJSONObjToPreset(j[i], subPreset);
210 else if (it->is_object()) {
213 convertJSONObjToPreset(j, subPreset);
219 static void convertJSONArrayToPresetList(std::string jsonString, std::vector<std::shared_ptr<NamedPresetEntry>>& presetList) {
220 Json json = Json::parse(jsonString);
221 for (Json::iterator it = json.begin(); it != json.end(); it++) {
222 if (it->is_object()) {
224 std::shared_ptr<NamedPresetEntry> entry(
new NamedPresetEntry);
225 std::string name = j[
"name"];
226 Json presetPayload = j[
"preset"];
228 PresetPtr preset = std::make_shared<Preset>();
229 convertJSONObjToPreset(presetPayload, *preset);
230 entry->preset = preset;
231 presetList.push_back(entry);
239 Json json = Json::parse(jsonString);
240 convertJSONObjToPreset(json, *preset);
245 static void copyPreset(
const Preset& src, Preset &dst)
247 for (
auto const& entry : src) {
248 const char *key = entry.first.c_str();
249 auto type = entry.second.getType();
252 float value = (float)entry.second;
257 double value = (double)entry.second;
261 case ValueHolder::UINT32: {
262 UInt32 value = (UInt32)entry.second;
266 case ValueHolder::UINT64: {
267 UInt64 value = (UInt64)entry.second;
273 const list& srclist = entry.second;
275 for (Index i = 0; i < srclist.length; i++) {
276 dstlist.
push(srclist[i]);
282 const Preset& preset = entry.second;
283 copyPreset(preset, dst[key]);
287 Index size = entry.second.getSubStateMapSize();
289 for (Index i = 0; i < size; i++) {
290 const Preset& preset = entry.second[i];
291 Preset& dstSubPreset = dst[key][i];
292 copyPreset(preset, dstSubPreset);
297 case ValueHolder::STRING:
299 RNBO_ASSERT(strcmp(key,
"__presetid") == 0);
302 case ValueHolder::EXTERNAL:
303 case ValueHolder::EVENTTARGET:
304 case ValueHolder::DATAREF:
305 case ValueHolder::MULTIREF:
306 case ValueHolder::SIGNAL:
307 case ValueHolder::BOOLEAN:
308 case ValueHolder::INTVALUE:
317 #endif // RNBO_NOJSONPRESETS
321 #endif // RNBO_NOPRESETS
323 #endif // _RNBO_Presets_H_