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.

191 lines
6.4KB

  1. /*
  2. * DISTRHO Cardinal Plugin
  3. * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 3 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the LICENSE file.
  16. */
  17. #pragma once
  18. #include <audio.hpp>
  19. #include <context.hpp>
  20. #include <midi.hpp>
  21. #ifdef NDEBUG
  22. # undef DEBUG
  23. #endif
  24. #include "CardinalRemote.hpp"
  25. #include "DistrhoPlugin.hpp"
  26. #if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
  27. # include "WindowParameters.hpp"
  28. #else
  29. # define kWindowParameterCount 0
  30. #endif
  31. #ifndef HEADLESS
  32. # include "DistrhoUI.hpp"
  33. #endif
  34. #include "plugincontext.hpp"
  35. START_NAMESPACE_DISTRHO
  36. // -----------------------------------------------------------------------------------------------------------
  37. enum CardinalParameters {
  38. kCardinalParameterCountAtModules = kModuleParameterCount,
  39. kCardinalParameterBypass = kCardinalParameterCountAtModules,
  40. #if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
  41. kCardinalParameterStartWindow,
  42. kCardinalParameterCountAtWindow = kCardinalParameterStartWindow + kWindowParameterCount,
  43. #if CARDINAL_VARIANT_MINI
  44. kCardinalParameterStartMini = kCardinalParameterCountAtWindow,
  45. kCardinalParameterStartMiniBuffers = kCardinalParameterStartMini,
  46. kCardinalParameterMiniAudioIn1 = kCardinalParameterStartMiniBuffers,
  47. kCardinalParameterMiniAudioIn2,
  48. kCardinalParameterMiniCVIn1,
  49. kCardinalParameterMiniCVIn2,
  50. kCardinalParameterMiniCVIn3,
  51. kCardinalParameterMiniCVIn4,
  52. kCardinalParameterMiniCVIn5,
  53. kCardinalParameterCountAtMiniBuffers,
  54. kCardinalParameterStartMiniTime = kCardinalParameterCountAtMiniBuffers,
  55. kCardinalParameterMiniTimeFlags = kCardinalParameterStartMiniTime,
  56. kCardinalParameterMiniTimeBar,
  57. kCardinalParameterMiniTimeBeat,
  58. kCardinalParameterMiniTimeBeatsPerBar,
  59. kCardinalParameterMiniTimeBeatType,
  60. kCardinalParameterMiniTimeFrame,
  61. kCardinalParameterMiniTimeBarStartTick,
  62. kCardinalParameterMiniTimeBeatsPerMinute,
  63. kCardinalParameterMiniTimeTick,
  64. kCardinalParameterMiniTimeTicksPerBeat,
  65. kCardinalParameterCountAtMiniTime,
  66. kCardinalParameterCountAtMini = kCardinalParameterCountAtMiniTime,
  67. kCardinalParameterCount = kCardinalParameterCountAtMini
  68. #else
  69. kCardinalParameterCount = kCardinalParameterCountAtWindow
  70. #endif
  71. #else
  72. kCardinalParameterCount
  73. #endif
  74. };
  75. enum CardinalStates {
  76. kCardinalStatePatch,
  77. kCardinalStateScreenshot,
  78. kCardinalStateComment,
  79. #if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
  80. kCardinalStateWindowSize,
  81. #endif
  82. #if CARDINAL_VARIANT_MINI
  83. kCardinalStateParamChange,
  84. #endif
  85. kCardinalStateCount
  86. };
  87. static_assert(kCardinalParameterBypass == kModuleParameterCount, "valid parameter indexes");
  88. #if CARDINAL_VARIANT_MINI || !defined(HEADLESS)
  89. static_assert(kCardinalParameterStartWindow == kModuleParameterCount + 1, "valid parameter indexes");
  90. static_assert(kCardinalParameterStartWindow == kCardinalParameterBypass + 1, "valid parameter indexes");
  91. static_assert(kCardinalParameterCountAtWindow == kModuleParameterCount + kWindowParameterCount + 1, "valid parameter indexes");
  92. #endif
  93. #if CARDINAL_VARIANT_MINI
  94. static_assert(0 == kCardinalParameterStartMini - kCardinalParameterMiniAudioIn1, "valid parameter indexes");
  95. static_assert(kCardinalParameterStartMini == kCardinalParameterCountAtWindow, "valid parameter indexes");
  96. static_assert(kCardinalParameterStartMini == kCardinalParameterBypass + kWindowParameterCount + 1, "valid parameter indexes");
  97. static_assert(kCardinalParameterStartMini == kModuleParameterCount + kWindowParameterCount + 1, "valid parameter indexes");
  98. static_assert(kCardinalParameterCountAtWindow == kModuleParameterCount + kWindowParameterCount + 1, "valid parameter indexes");
  99. static_assert(DISTRHO_PLUGIN_NUM_INPUTS == kCardinalParameterCountAtMiniBuffers - kCardinalParameterStartMiniBuffers, "valid parameter indexes");
  100. #endif
  101. // -----------------------------------------------------------------------------------------------------------
  102. #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
  103. CardinalPluginContext* getRackContextFromPlugin(void* ptr);
  104. #endif
  105. class CardinalBasePlugin : public Plugin {
  106. public:
  107. CardinalPluginContext* const context;
  108. CardinalBasePlugin(uint32_t parameterCount, uint32_t programCount, uint32_t stateCount)
  109. : Plugin(parameterCount, programCount, stateCount),
  110. context(new CardinalPluginContext(this)) {}
  111. ~CardinalBasePlugin() override {}
  112. #ifdef HAVE_LIBLO
  113. virtual bool startRemoteServer(const char* port) = 0;
  114. virtual void stopRemoteServer() = 0;
  115. virtual void stepRemoteServer() = 0;
  116. #endif
  117. #ifndef HEADLESS
  118. friend class CardinalUI;
  119. #endif
  120. };
  121. #ifndef HEADLESS
  122. struct WasmRemotePatchLoadingDialog;
  123. class CardinalBaseUI : public UI {
  124. public:
  125. CardinalPluginContext* const context;
  126. remoteUtils::RemoteDetails* remoteDetails;
  127. bool saving;
  128. bool savingUncompressed;
  129. #ifdef DISTRHO_OS_WASM
  130. WasmRemotePatchLoadingDialog* psDialog;
  131. #endif
  132. // for 3rd party modules
  133. std::function<void(char* path)> filebrowseraction;
  134. FileBrowserHandle filebrowserhandle;
  135. CardinalBaseUI(const uint width, const uint height)
  136. : UI(width, height),
  137. #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
  138. context(getRackContextFromPlugin(getPluginInstancePointer())),
  139. #else
  140. context(new CardinalPluginContext(nullptr)),
  141. #endif
  142. remoteDetails(nullptr),
  143. saving(false),
  144. savingUncompressed(false),
  145. #ifdef DISTRHO_OS_WASM
  146. psDialog(nullptr),
  147. #endif
  148. filebrowseraction(),
  149. filebrowserhandle(nullptr)
  150. {
  151. context->tlw = this;
  152. context->ui = this;
  153. }
  154. ~CardinalBaseUI() override
  155. {
  156. remoteUtils::disconnectFromRemote(remoteDetails);
  157. if (filebrowserhandle != nullptr)
  158. fileBrowserClose(filebrowserhandle);
  159. }
  160. };
  161. #endif
  162. // -----------------------------------------------------------------------------------------------------------
  163. END_NAMESPACE_DISTRHO