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.

108 lines
2.6KB

  1. #include "settings.hpp"
  2. #include "app.hpp"
  3. #include "gui.hpp"
  4. #include "engine.hpp"
  5. #include "plugin.hpp"
  6. #include <jansson.h>
  7. namespace rack {
  8. static json_t *settingsToJson() {
  9. // root
  10. json_t *rootJ = json_object();
  11. // token
  12. json_t *tokenJ = json_string(gToken.c_str());
  13. json_object_set_new(rootJ, "token", tokenJ);
  14. // opacity
  15. float opacity = dynamic_cast<RackScene*>(gScene)->toolbar->wireOpacitySlider->value;
  16. json_t *opacityJ = json_real(opacity);
  17. json_object_set_new(rootJ, "wireOpacity", opacityJ);
  18. // tension
  19. float tension = dynamic_cast<RackScene*>(gScene)->toolbar->wireTensionSlider->value;
  20. json_t *tensionJ = json_real(tension);
  21. json_object_set_new(rootJ, "wireTension", tensionJ);
  22. // allowCursorLock
  23. json_t *allowCursorLockJ = json_boolean(gAllowCursorLock);
  24. json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ);
  25. // sampleRate
  26. float sampleRate = gSampleRate;
  27. json_t *sampleRateJ = json_real(sampleRate);
  28. json_object_set_new(rootJ, "sampleRate", sampleRateJ);
  29. return rootJ;
  30. }
  31. static void settingsFromJson(json_t *rootJ) {
  32. // token
  33. json_t *tokenJ = json_object_get(rootJ, "token");
  34. if (tokenJ)
  35. gToken = json_string_value(tokenJ);
  36. // opacity
  37. json_t *opacityJ = json_object_get(rootJ, "wireOpacity");
  38. if (opacityJ)
  39. dynamic_cast<RackScene*>(gScene)->toolbar->wireOpacitySlider->value = json_number_value(opacityJ);
  40. // tension
  41. json_t *tensionJ = json_object_get(rootJ, "wireTension");
  42. if (tensionJ)
  43. dynamic_cast<RackScene*>(gScene)->toolbar->wireTensionSlider->value = json_number_value(tensionJ);
  44. // allowCursorLock
  45. json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock");
  46. if (allowCursorLockJ)
  47. gAllowCursorLock = json_is_true(allowCursorLockJ);
  48. // sampleRate
  49. json_t *sampleRateJ = json_object_get(rootJ, "sampleRate");
  50. if (sampleRateJ) {
  51. float sampleRate = json_number_value(sampleRateJ);
  52. engineSetSampleRate(sampleRate);
  53. }
  54. }
  55. void settingsSave(std::string filename) {
  56. printf("Saving settings %s\n", filename.c_str());
  57. FILE *file = fopen(filename.c_str(), "w");
  58. if (!file)
  59. return;
  60. json_t *rootJ = settingsToJson();
  61. if (rootJ) {
  62. json_dumpf(rootJ, file, JSON_INDENT(2));
  63. json_decref(rootJ);
  64. }
  65. fclose(file);
  66. }
  67. void settingsLoad(std::string filename) {
  68. printf("Loading settings %s\n", filename.c_str());
  69. FILE *file = fopen(filename.c_str(), "r");
  70. if (!file)
  71. return;
  72. json_error_t error;
  73. json_t *rootJ = json_loadf(file, 0, &error);
  74. if (rootJ) {
  75. settingsFromJson(rootJ);
  76. json_decref(rootJ);
  77. }
  78. else {
  79. printf("JSON parsing error at %s %d:%d %s\n", error.source, error.line, error.column, error.text);
  80. }
  81. fclose(file);
  82. }
  83. } // namespace rack