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