Audio plugin host https://kx.studio/carla
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.

285 lines
6.8KB

  1. /*
  2. * DISTRHO Plugin Toolkit (DPT)
  3. * Copyright (C) 2012-2013 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 Lesser General Public
  7. * License as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. *
  14. * For a full copy of the license see the LGPL.txt file
  15. */
  16. #ifndef __DISTRHO_UI_INTERNAL_HPP__
  17. #define __DISTRHO_UI_INTERNAL_HPP__
  18. #include "DistrhoDefines.h"
  19. #if defined(DISTRHO_UI_EXTERNAL)
  20. # include "../DistrhoUIExternal.hpp"
  21. #elif defined(DISTRHO_UI_OPENGL)
  22. # include "../DistrhoUIOpenGL.hpp"
  23. # include "../dgl/App.hpp"
  24. # include "../dgl/Window.hpp"
  25. #else
  26. # include "../DistrhoUIQt.hpp"
  27. #endif
  28. #include <cassert>
  29. START_NAMESPACE_DISTRHO
  30. // -------------------------------------------------
  31. typedef void (*editParamFunc) (void* ptr, uint32_t index, bool started);
  32. typedef void (*setParamFunc) (void* ptr, uint32_t index, float value);
  33. typedef void (*setStateFunc) (void* ptr, const char* key, const char* value);
  34. typedef void (*sendNoteFunc) (void* ptr, bool onOff, uint8_t channel, uint8_t note, uint8_t velo);
  35. typedef void (*uiResizeFunc) (void* ptr, unsigned int width, unsigned int height);
  36. extern double d_lastUiSampleRate;
  37. // -------------------------------------------------
  38. struct UI::PrivateData {
  39. // DSP
  40. double sampleRate;
  41. uint32_t parameterOffset;
  42. // Callbacks
  43. editParamFunc editParamCallbackFunc;
  44. setParamFunc setParamCallbackFunc;
  45. setStateFunc setStateCallbackFunc;
  46. sendNoteFunc sendNoteCallbackFunc;
  47. uiResizeFunc uiResizeCallbackFunc;
  48. void* ptr;
  49. PrivateData()
  50. : sampleRate(d_lastUiSampleRate),
  51. parameterOffset(0),
  52. editParamCallbackFunc(nullptr),
  53. setParamCallbackFunc(nullptr),
  54. setStateCallbackFunc(nullptr),
  55. sendNoteCallbackFunc(nullptr),
  56. uiResizeCallbackFunc(nullptr),
  57. ptr(nullptr)
  58. {
  59. assert(sampleRate != 0.0);
  60. #if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2)
  61. parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS;
  62. # if DISTRHO_PLUGIN_WANT_LATENCY
  63. parameterOffset += 1; // latency
  64. # endif
  65. #endif
  66. }
  67. ~PrivateData()
  68. {
  69. }
  70. void editParamCallback(uint32_t index, bool started)
  71. {
  72. if (editParamCallbackFunc != nullptr)
  73. editParamCallbackFunc(ptr, index, started);
  74. }
  75. void setParamCallback(uint32_t rindex, float value)
  76. {
  77. if (setParamCallbackFunc != nullptr)
  78. setParamCallbackFunc(ptr, rindex, value);
  79. }
  80. void setStateCallback(const char* key, const char* value)
  81. {
  82. if (setStateCallbackFunc != nullptr)
  83. setStateCallbackFunc(ptr, key, value);
  84. }
  85. void sendNoteCallback(bool onOff, uint8_t channel, uint8_t note, uint8_t velocity)
  86. {
  87. if (sendNoteCallbackFunc != nullptr)
  88. sendNoteCallbackFunc(ptr, onOff, channel, note, velocity);
  89. }
  90. void uiResizeCallback(unsigned int width, unsigned int height)
  91. {
  92. if (uiResizeCallbackFunc != nullptr)
  93. uiResizeCallbackFunc(ptr, width, height);
  94. }
  95. };
  96. // -------------------------------------------------
  97. class UIInternal
  98. {
  99. public:
  100. UIInternal(void* ptr, intptr_t winId, editParamFunc editParamCall, setParamFunc setParamCall, setStateFunc setStateCall, sendNoteFunc sendNoteCall, uiResizeFunc uiResizeCall)
  101. #ifdef DISTRHO_UI_OPENGL
  102. : glApp(),
  103. glWindow(&glApp, winId),
  104. kUi(createUI()),
  105. #else
  106. : kUi(createUI()),
  107. #endif
  108. kData((kUi != nullptr) ? kUi->pData : nullptr)
  109. {
  110. assert(kUi != nullptr);
  111. if (kUi == nullptr)
  112. return;
  113. #ifdef DISTRHO_UI_QT
  114. assert(winId == 0);
  115. if (winId != 0)
  116. return;
  117. #endif
  118. kData->ptr = ptr;
  119. kData->editParamCallbackFunc = editParamCall;
  120. kData->setParamCallbackFunc = setParamCall;
  121. kData->setStateCallbackFunc = setStateCall;
  122. kData->sendNoteCallbackFunc = sendNoteCall;
  123. kData->uiResizeCallbackFunc = uiResizeCall;
  124. }
  125. ~UIInternal()
  126. {
  127. if (kUi != nullptr)
  128. delete kUi;
  129. }
  130. // ---------------------------------------------
  131. const char* name() const
  132. {
  133. assert(kUi != nullptr);
  134. return (kUi != nullptr) ? kUi->d_name() : "";
  135. }
  136. unsigned int width() const
  137. {
  138. assert(kUi != nullptr);
  139. return (kUi != nullptr) ? kUi->d_width() : 0;
  140. }
  141. unsigned int height() const
  142. {
  143. assert(kUi != nullptr);
  144. return (kUi != nullptr) ? kUi->d_height() : 0;
  145. }
  146. // ---------------------------------------------
  147. void parameterChanged(uint32_t index, float value)
  148. {
  149. assert(kUi != nullptr);
  150. if (kUi != nullptr)
  151. kUi->d_parameterChanged(index, value);
  152. }
  153. #if DISTRHO_PLUGIN_WANT_PROGRAMS
  154. void programChanged(uint32_t index)
  155. {
  156. assert(kUi != nullptr);
  157. if (kUi != nullptr)
  158. kUi->d_programChanged(index);
  159. }
  160. #endif
  161. #if DISTRHO_PLUGIN_WANT_STATE
  162. void stateChanged(const char* key, const char* value)
  163. {
  164. assert(kUi != nullptr);
  165. if (kUi != nullptr)
  166. kUi->d_stateChanged(key, value);
  167. }
  168. #endif
  169. #if DISTRHO_PLUGIN_IS_SYNTH
  170. void noteReceived(bool onOff, uint8_t channel, uint8_t note, uint8_t velocity)
  171. {
  172. assert(kUi != nullptr);
  173. if (kUi != nullptr)
  174. kUi->d_noteReceived(onOff, channel, note, velocity);
  175. }
  176. #endif
  177. // ---------------------------------------------
  178. void idle()
  179. {
  180. #if defined(DISTRHO_UI_EXTERNAL)
  181. // needed?
  182. #elif defined(DISTRHO_UI_OPENGL)
  183. glApp.idle();
  184. #endif
  185. assert(kUi != nullptr);
  186. if (kUi != nullptr)
  187. kUi->d_uiIdle();
  188. }
  189. #if defined(DISTRHO_UI_EXTERNAL)
  190. // needed?
  191. #elif defined(DISTRHO_UI_OPENGL)
  192. App& getApp()
  193. {
  194. return glApp;
  195. }
  196. Window& getWindow()
  197. {
  198. return glWindow;
  199. }
  200. intptr_t getWindowId() const
  201. {
  202. return glWindow.getWindowId();
  203. }
  204. void fixSize()
  205. {
  206. assert(kUi != nullptr);
  207. glWindow.setSize(kUi->d_width(), kUi->d_height());
  208. }
  209. #else
  210. QtUI* getQtUI() const
  211. {
  212. return (QtUI*)kUi;
  213. }
  214. bool resizable() const
  215. {
  216. return ((QtUI*)kUi)->d_resizable();
  217. }
  218. #endif
  219. // ---------------------------------------------
  220. #ifdef DISTRHO_UI_OPENGL
  221. private:
  222. App glApp;
  223. Window glWindow;
  224. #endif
  225. protected:
  226. UI* const kUi;
  227. UI::PrivateData* const kData;
  228. };
  229. // -------------------------------------------------
  230. END_NAMESPACE_DISTRHO
  231. #endif // __DISTRHO_UI_INTERNAL_HPP__