You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
3.0KB

  1. #include "engine/Module.hpp"
  2. namespace rack {
  3. namespace engine {
  4. Module::Module() {
  5. }
  6. Module::~Module() {
  7. for (ParamQuantity *paramQuantity : paramQuantities) {
  8. if (paramQuantity)
  9. delete paramQuantity;
  10. }
  11. }
  12. void Module::config(int numParams, int numInputs, int numOutputs, int numLights) {
  13. // This method should only be called once.
  14. assert(params.empty() && inputs.empty() && outputs.empty() && lights.empty() && paramQuantities.empty());
  15. params.resize(numParams);
  16. inputs.resize(numInputs);
  17. outputs.resize(numOutputs);
  18. lights.resize(numLights);
  19. paramQuantities.resize(numParams);
  20. // Initialize paramQuantities
  21. for (int i = 0; i < numParams; i++) {
  22. configParam(i, 0.f, 1.f, 0.f);
  23. }
  24. }
  25. json_t *Module::toJson() {
  26. json_t *rootJ = json_object();
  27. // params
  28. json_t *paramsJ = json_array();
  29. for (size_t paramId = 0; paramId < params.size(); paramId++) {
  30. // Don't serialize unbounded Params
  31. if (!paramQuantities[paramId]->isBounded())
  32. continue;
  33. json_t *paramJ = json_object();
  34. json_object_set_new(paramJ, "id", json_integer(paramId));
  35. float value = params[paramId].getValue();
  36. json_object_set_new(paramJ, "value", json_real(value));
  37. json_array_append(paramsJ, paramJ);
  38. }
  39. json_object_set_new(rootJ, "params", paramsJ);
  40. // bypass
  41. if (bypass)
  42. json_object_set_new(rootJ, "bypass", json_boolean(bypass));
  43. // data
  44. json_t *dataJ = dataToJson();
  45. if (dataJ) {
  46. json_object_set_new(rootJ, "data", dataJ);
  47. }
  48. // leftModuleId
  49. if (leftModuleId >= 0)
  50. json_object_set_new(rootJ, "leftModuleId", json_integer(leftModuleId));
  51. // rightModuleId
  52. if (rightModuleId >= 0)
  53. json_object_set_new(rootJ, "rightModuleId", json_integer(rightModuleId));
  54. return rootJ;
  55. }
  56. void Module::fromJson(json_t *rootJ) {
  57. // params
  58. json_t *paramsJ = json_object_get(rootJ, "params");
  59. size_t i;
  60. json_t *paramJ;
  61. json_array_foreach(paramsJ, i, paramJ) {
  62. // Get paramId
  63. json_t *paramIdJ = json_object_get(paramJ, "id");
  64. // Legacy v0.6 to <v1
  65. if (!paramIdJ)
  66. paramIdJ = json_object_get(paramJ, "paramId");
  67. size_t paramId;
  68. if (paramIdJ)
  69. paramId = json_integer_value(paramIdJ);
  70. // Use index if all else fails
  71. else
  72. paramId = i;
  73. // Check ID bounds
  74. if (paramId >= params.size())
  75. continue;
  76. // Check that the Param is bounded
  77. if (!paramQuantities[paramId]->isBounded())
  78. continue;
  79. json_t *valueJ = json_object_get(paramJ, "value");
  80. if (valueJ)
  81. params[paramId].setValue(json_number_value(valueJ));
  82. }
  83. // bypass
  84. json_t *bypassJ = json_object_get(rootJ, "bypass");
  85. if (bypassJ)
  86. bypass = json_boolean_value(bypassJ);
  87. // data
  88. json_t *dataJ = json_object_get(rootJ, "data");
  89. if (dataJ)
  90. dataFromJson(dataJ);
  91. // leftModuleId
  92. json_t *leftModuleIdJ = json_object_get(rootJ, "leftModuleId");
  93. if (leftModuleIdJ)
  94. leftModuleId = json_integer_value(leftModuleIdJ);
  95. // rightModuleId
  96. json_t *rightModuleIdJ = json_object_get(rootJ, "rightModuleId");
  97. if (rightModuleIdJ)
  98. rightModuleId = json_integer_value(rightModuleIdJ);
  99. }
  100. } // namespace engine
  101. } // namespace rack