Mercurial > hg > piper-cpp
comparison vamp-json/VampJson.h @ 247:8a031eb9a25f
Merge branch 'output-type-uri'
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Thu, 15 Jun 2017 09:52:01 +0100 |
parents | 82f86151bc4b |
children | 292ec9b50280 |
comparison
equal
deleted
inserted
replaced
219:db929669e7d3 | 247:8a031eb9a25f |
---|---|
2 | 2 |
3 /* | 3 /* |
4 Piper C++ | 4 Piper C++ |
5 | 5 |
6 Centre for Digital Music, Queen Mary, University of London. | 6 Centre for Digital Music, Queen Mary, University of London. |
7 Copyright 2015-2016 QMUL. | 7 Copyright 2015-2017 QMUL. |
8 | 8 |
9 Permission is hereby granted, free of charge, to any person | 9 Permission is hereby granted, free of charge, to any person |
10 obtaining a copy of this software and associated documentation | 10 obtaining a copy of this software and associated documentation |
11 files (the "Software"), to deal in the Software without | 11 files (the "Software"), to deal in the Software without |
12 restriction, including without limitation the rights to use, copy, | 12 restriction, including without limitation the rights to use, copy, |
45 #include <base-n/include/basen.hpp> | 45 #include <base-n/include/basen.hpp> |
46 | 46 |
47 #include <vamp-hostsdk/Plugin.h> | 47 #include <vamp-hostsdk/Plugin.h> |
48 #include <vamp-hostsdk/PluginLoader.h> | 48 #include <vamp-hostsdk/PluginLoader.h> |
49 | 49 |
50 #include "vamp-support/StaticOutputDescriptor.h" | |
50 #include "vamp-support/PluginStaticData.h" | 51 #include "vamp-support/PluginStaticData.h" |
51 #include "vamp-support/PluginConfiguration.h" | 52 #include "vamp-support/PluginConfiguration.h" |
52 #include "vamp-support/RequestResponse.h" | 53 #include "vamp-support/RequestResponse.h" |
53 | 54 |
54 #include "vamp-support/PluginHandleMapper.h" | 55 #include "vamp-support/PluginHandleMapper.h" |
214 return Vamp::Plugin::OutputDescriptor::OneSamplePerStep; | 215 return Vamp::Plugin::OutputDescriptor::OneSamplePerStep; |
215 } | 216 } |
216 } | 217 } |
217 | 218 |
218 static json11::Json | 219 static json11::Json |
220 fromStaticOutputDescriptor(const StaticOutputDescriptor &sd) { | |
221 json11::Json::object jo; | |
222 if (sd.typeURI != "") { | |
223 jo["typeURI"] = sd.typeURI; | |
224 } | |
225 return json11::Json(jo); | |
226 } | |
227 | |
228 static json11::Json | |
219 fromConfiguredOutputDescriptor(const Vamp::Plugin::OutputDescriptor &desc) { | 229 fromConfiguredOutputDescriptor(const Vamp::Plugin::OutputDescriptor &desc) { |
220 json11::Json::object jo { | 230 json11::Json::object jo { |
221 { "unit", desc.unit }, | 231 { "unit", desc.unit }, |
222 { "sampleType", fromSampleType(desc.sampleType) }, | 232 { "sampleType", fromSampleType(desc.sampleType) }, |
223 { "sampleRate", desc.sampleRate }, | 233 { "sampleRate", desc.sampleRate }, |
236 } | 246 } |
237 return json11::Json(jo); | 247 return json11::Json(jo); |
238 } | 248 } |
239 | 249 |
240 static json11::Json | 250 static json11::Json |
241 fromOutputDescriptor(const Vamp::Plugin::OutputDescriptor &desc) { | 251 fromOutputDescriptor(const Vamp::Plugin::OutputDescriptor &desc, |
252 const StaticOutputDescriptor &sd) { | |
242 json11::Json::object jo { | 253 json11::Json::object jo { |
243 { "basic", fromBasicDescriptor(desc) }, | 254 { "basic", fromBasicDescriptor(desc) }, |
255 { "static", fromStaticOutputDescriptor(sd) }, | |
244 { "configured", fromConfiguredOutputDescriptor(desc) } | 256 { "configured", fromConfiguredOutputDescriptor(desc) } |
245 }; | 257 }; |
246 return json11::Json(jo); | 258 return json11::Json(jo); |
259 } | |
260 | |
261 static StaticOutputDescriptor | |
262 toStaticOutputDescriptor(json11::Json j, std::string &err) { | |
263 | |
264 StaticOutputDescriptor sd; | |
265 if (!j.is_object()) { | |
266 err = "object expected for static output descriptor"; | |
267 return sd; | |
268 } | |
269 | |
270 sd.typeURI = j["typeURI"].string_value(); | |
271 return sd; | |
247 } | 272 } |
248 | 273 |
249 static Vamp::Plugin::OutputDescriptor | 274 static Vamp::Plugin::OutputDescriptor |
250 toConfiguredOutputDescriptor(json11::Json j, std::string &err) { | 275 toConfiguredOutputDescriptor(json11::Json j, std::string &err) { |
251 | 276 |
294 } | 319 } |
295 | 320 |
296 return od; | 321 return od; |
297 } | 322 } |
298 | 323 |
299 static Vamp::Plugin::OutputDescriptor | 324 static std::pair<Vamp::Plugin::OutputDescriptor, StaticOutputDescriptor> |
300 toOutputDescriptor(json11::Json j, std::string &err) { | 325 toOutputDescriptor(json11::Json j, std::string &err) { |
301 | 326 |
302 Vamp::Plugin::OutputDescriptor od; | 327 Vamp::Plugin::OutputDescriptor od; |
303 if (!j.is_object()) { | 328 if (!j.is_object()) { |
304 err = "object expected for output descriptor"; | 329 err = "object expected for output descriptor"; |
309 if (failed(err)) return {}; | 334 if (failed(err)) return {}; |
310 | 335 |
311 toBasicDescriptor(j["basic"], od, err); | 336 toBasicDescriptor(j["basic"], od, err); |
312 if (failed(err)) return {}; | 337 if (failed(err)) return {}; |
313 | 338 |
314 return od; | 339 StaticOutputDescriptor sd; |
340 if (j["static"] != json11::Json()) { | |
341 sd = toStaticOutputDescriptor(j["static"], err); | |
342 if (failed(err)) return {}; | |
343 } | |
344 | |
345 return { od, sd }; | |
315 } | 346 } |
316 | 347 |
317 static json11::Json | 348 static json11::Json |
318 fromParameterDescriptor(const Vamp::PluginBase::ParameterDescriptor &desc) { | 349 fromParameterDescriptor(const Vamp::PluginBase::ParameterDescriptor &desc) { |
319 | 350 |
567 | 598 |
568 json11::Json::array outinfo; | 599 json11::Json::array outinfo; |
569 auto vouts = d.basicOutputInfo; | 600 auto vouts = d.basicOutputInfo; |
570 for (auto &o: vouts) outinfo.push_back(fromBasicDescriptor(o)); | 601 for (auto &o: vouts) outinfo.push_back(fromBasicDescriptor(o)); |
571 jo["basicOutputInfo"] = outinfo; | 602 jo["basicOutputInfo"] = outinfo; |
572 | 603 |
573 return json11::Json(jo); | 604 json11::Json::object statinfo; |
574 } | 605 auto souts = d.staticOutputInfo; |
575 | 606 for (auto &s: souts) { |
607 statinfo[s.first] = fromStaticOutputDescriptor(s.second); | |
608 } | |
609 jo["staticOutputInfo"] = statinfo; | |
610 | |
611 return json11::Json(jo); | |
612 } | |
613 | |
614 static StaticOutputInfo | |
615 toStaticOutputInfo(json11::Json j, std::string &err) { | |
616 | |
617 if (j == json11::Json()) return {}; | |
618 | |
619 if (!j.is_object()) { | |
620 err = "object expected for static output info"; | |
621 return {}; | |
622 } | |
623 | |
624 StaticOutputInfo sinfo; | |
625 auto items = j.object_items(); | |
626 for (auto i: items) { | |
627 sinfo[i.first] = toStaticOutputDescriptor(i.second, err); | |
628 if (failed(err)) return {}; | |
629 } | |
630 return sinfo; | |
631 } | |
632 | |
576 static PluginStaticData | 633 static PluginStaticData |
577 toPluginStaticData(json11::Json j, std::string &err) { | 634 toPluginStaticData(json11::Json j, std::string &err) { |
578 | 635 |
579 if (!j.has_shape({ | 636 if (!j.has_shape({ |
580 { "key", json11::Json::STRING }, | 637 { "key", json11::Json::STRING }, |
594 | 651 |
595 err = "string expected for maker"; | 652 err = "string expected for maker"; |
596 | 653 |
597 } else if (!j["rights"].is_null() && | 654 } else if (!j["rights"].is_null() && |
598 !j["rights"].is_string()) { | 655 !j["rights"].is_string()) { |
656 | |
599 err = "string expected for rights"; | 657 err = "string expected for rights"; |
600 | 658 |
601 } else if (!j["category"].is_null() && | 659 } else if (!j["category"].is_null() && |
602 !j["category"].is_array()) { | 660 !j["category"].is_array()) { |
603 | 661 |
616 } else if (!j["inputDomain"].is_null() && | 674 } else if (!j["inputDomain"].is_null() && |
617 !j["inputDomain"].is_string()) { | 675 !j["inputDomain"].is_string()) { |
618 | 676 |
619 err = "string expected for inputDomain"; | 677 err = "string expected for inputDomain"; |
620 | 678 |
621 } else if (!j["basicOutputInfo"].is_null() && | 679 } else if (!j["staticOutputInfo"].is_null() && |
622 !j["basicOutputInfo"].is_array()) { | 680 !j["staticOutputInfo"].is_object()) { |
623 | 681 |
624 err = "array expected for basicOutputInfo"; | 682 err = "object expected for staticOutputInfo"; |
625 | 683 |
626 } else { | 684 } else { |
627 | 685 |
628 PluginStaticData psd; | 686 PluginStaticData psd; |
629 | 687 |
668 PluginStaticData::Basic b; | 726 PluginStaticData::Basic b; |
669 toBasicDescriptor(bo, b, err); | 727 toBasicDescriptor(bo, b, err); |
670 if (failed(err)) return {}; | 728 if (failed(err)) return {}; |
671 psd.basicOutputInfo.push_back(b); | 729 psd.basicOutputInfo.push_back(b); |
672 } | 730 } |
673 | 731 |
732 StaticOutputInfo sinfo = | |
733 toStaticOutputInfo(j["staticOutputInfo"], err); | |
734 if (failed(err)) return {}; | |
735 psd.staticOutputInfo = sinfo; | |
736 | |
674 return psd; | 737 return psd; |
675 } | 738 } |
676 | 739 |
677 // fallthrough error case | 740 // fallthrough error case |
678 return {}; | 741 return {}; |
966 | 1029 |
967 jo["handle"] = double(pmapper.pluginToHandle(cr.plugin)); | 1030 jo["handle"] = double(pmapper.pluginToHandle(cr.plugin)); |
968 | 1031 |
969 json11::Json::array outs; | 1032 json11::Json::array outs; |
970 for (auto &d: cr.outputs) { | 1033 for (auto &d: cr.outputs) { |
971 outs.push_back(fromOutputDescriptor(d)); | 1034 auto id = d.identifier; |
1035 StaticOutputDescriptor sd; | |
1036 if (cr.staticOutputInfo.find(id) != cr.staticOutputInfo.end()) { | |
1037 sd = cr.staticOutputInfo.at(id); | |
1038 } | |
1039 outs.push_back(fromOutputDescriptor(d, sd)); | |
972 } | 1040 } |
973 jo["outputList"] = outs; | 1041 jo["outputList"] = outs; |
974 | 1042 |
975 json11::Json::object framing; | 1043 json11::Json::object framing; |
976 framing["stepSize"] = cr.framing.stepSize; | 1044 framing["stepSize"] = cr.framing.stepSize; |
999 } | 1067 } |
1000 | 1068 |
1001 cr.plugin = pmapper.handleToPlugin(j["handle"].int_value()); | 1069 cr.plugin = pmapper.handleToPlugin(j["handle"].int_value()); |
1002 | 1070 |
1003 for (const auto &o: j["outputList"].array_items()) { | 1071 for (const auto &o: j["outputList"].array_items()) { |
1004 cr.outputs.push_back(toOutputDescriptor(o, err)); | 1072 auto odpair = toOutputDescriptor(o, err); |
1005 if (failed(err)) return {}; | 1073 if (failed(err)) return {}; |
1074 cr.outputs.push_back(odpair.first); | |
1075 cr.staticOutputInfo[odpair.first.identifier] = odpair.second; | |
1006 } | 1076 } |
1007 | 1077 |
1008 cr.framing.stepSize = int(round(j["framing"]["stepSize"].number_value())); | 1078 cr.framing.stepSize = int(round(j["framing"]["stepSize"].number_value())); |
1009 cr.framing.blockSize = int(round(j["framing"]["blockSize"].number_value())); | 1079 cr.framing.blockSize = int(round(j["framing"]["blockSize"].number_value())); |
1010 | 1080 |