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.

307 lines
7.7KB

  1. /*
  2. * Carla Bridge Client
  3. * Copyright (C) 2011-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 General Public License as
  7. * published by the Free Software Foundation; either version 2 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 GPL.txt file
  16. */
  17. #include "CarlaBridgeClient.hpp"
  18. #ifdef BUILD_BRIDGE_UI
  19. # include "CarlaBridgeToolkit.hpp"
  20. # include "CarlaLibUtils.hpp"
  21. #endif
  22. CARLA_BRIDGE_START_NAMESPACE
  23. // ---------------------------------------------------------------------
  24. CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle)
  25. : kOsc(this),
  26. #ifdef BUILD_BRIDGE_UI
  27. fUI(CarlaBridgeToolkit::createNew(this, uiTitle)),
  28. #endif
  29. fOscData(nullptr)
  30. {
  31. CARLA_ASSERT(uiTitle != nullptr);
  32. carla_debug("CarlaBridgeClient::CarlaBridgeClient(\"%s\")", uiTitle);
  33. }
  34. CarlaBridgeClient::~CarlaBridgeClient()
  35. {
  36. carla_debug("CarlaBridgeClient::~CarlaBridgeClient()");
  37. }
  38. #ifdef BUILD_BRIDGE_UI
  39. // ---------------------------------------------------------------------
  40. // ui initialization
  41. bool CarlaBridgeClient::uiInit(const char* const, const char* const)
  42. {
  43. carla_debug("CarlaBridgeClient::uiInit()");
  44. // Test for single init
  45. {
  46. static bool initiated = false;
  47. CARLA_ASSERT(! initiated);
  48. initiated = true;
  49. }
  50. fUI.init();
  51. return false;
  52. }
  53. void CarlaBridgeClient::uiClose()
  54. {
  55. carla_debug("CarlaBridgeClient::uiClose()");
  56. if (isOscControlRegistered() && ! fUI.quit)
  57. sendOscExiting();
  58. fUI.close();
  59. }
  60. #endif
  61. // ---------------------------------------------------------------------
  62. // osc stuff
  63. void CarlaBridgeClient::oscInit(const char* const url)
  64. {
  65. carla_debug("CarlaBridgeClient::oscInit(\"%s\")", url);
  66. kOsc.init(url);
  67. fOscData = kOsc.getControlData();
  68. }
  69. bool CarlaBridgeClient::oscIdle()
  70. {
  71. kOsc.idle();
  72. #ifdef BUILD_BRIDGE_UI
  73. return ! fUI.quit;
  74. #else
  75. return true;
  76. #endif
  77. }
  78. void CarlaBridgeClient::oscClose()
  79. {
  80. CARLA_ASSERT(fOscData != nullptr);
  81. carla_debug("CarlaBridgeClient::oscClose()");
  82. fOscData = nullptr;
  83. kOsc.close();
  84. }
  85. bool CarlaBridgeClient::isOscControlRegistered() const
  86. {
  87. return kOsc.isControlRegistered();
  88. }
  89. void CarlaBridgeClient::sendOscUpdate()
  90. {
  91. CARLA_ASSERT(fOscData != nullptr);
  92. carla_debug("CarlaBridgeClient::sendOscUpdate()");
  93. if (fOscData != nullptr && fOscData->target != nullptr)
  94. osc_send_update(fOscData, kOsc.getServerPath());
  95. }
  96. #ifdef BUILD_BRIDGE_PLUGIN
  97. void CarlaBridgeClient::sendOscBridgeUpdate()
  98. {
  99. CARLA_ASSERT(fOscData != nullptr);
  100. CARLA_ASSERT(fOscData->target != nullptr && fOscData->path != nullptr);
  101. carla_debug("CarlaBridgeClient::sendOscBridgeUpdate()");
  102. if (fOscData != nullptr && fOscData->target != nullptr && fOscData->path != nullptr)
  103. osc_send_bridge_update(fOscData, fOscData->path);
  104. }
  105. void CarlaBridgeClient::sendOscBridgeError(const char* const error)
  106. {
  107. CARLA_ASSERT(fOscData != nullptr);
  108. CARLA_ASSERT(error != nullptr);
  109. carla_debug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error);
  110. if (fOscData != nullptr && fOscData->target != nullptr && error != nullptr)
  111. osc_send_bridge_error(fOscData, error);
  112. }
  113. #endif
  114. #ifdef BUILD_BRIDGE_UI
  115. // ---------------------------------------------------------------------
  116. // toolkit
  117. void CarlaBridgeClient::toolkitShow()
  118. {
  119. carla_debug("CarlaBridgeClient::toolkitShow()");
  120. fUI.toolkit->show();
  121. }
  122. void CarlaBridgeClient::toolkitHide()
  123. {
  124. carla_debug("CarlaBridgeClient::toolkitHide()");
  125. fUI.toolkit->hide();
  126. }
  127. void CarlaBridgeClient::toolkitResize(const int width, const int height)
  128. {
  129. carla_debug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height);
  130. fUI.toolkit->resize(width, height);
  131. }
  132. void CarlaBridgeClient::toolkitExec(const bool showGui)
  133. {
  134. carla_debug("CarlaBridgeClient::toolkitExec(%s)", bool2str(showGui));
  135. fUI.toolkit->exec(showGui);
  136. }
  137. void CarlaBridgeClient::toolkitQuit()
  138. {
  139. carla_debug("CarlaBridgeClient::toolkitQuit()");
  140. fUI.close();
  141. }
  142. #endif
  143. // ---------------------------------------------------------------------
  144. void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value)
  145. {
  146. CARLA_ASSERT(fOscData != nullptr);
  147. carla_debug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value);
  148. if (fOscData != nullptr && fOscData->target != nullptr)
  149. osc_send_configure(fOscData, key, value);
  150. }
  151. void CarlaBridgeClient::sendOscControl(const int32_t index, const float value)
  152. {
  153. CARLA_ASSERT(fOscData != nullptr);
  154. carla_debug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value);
  155. if (fOscData != nullptr && fOscData->target != nullptr)
  156. osc_send_control(fOscData, index, value);
  157. }
  158. void CarlaBridgeClient::sendOscProgram(const int32_t index)
  159. {
  160. CARLA_ASSERT(fOscData != nullptr);
  161. carla_debug("CarlaBridgeClient::sendOscProgram(%i)", index);
  162. if (fOscData != nullptr && fOscData->target != nullptr)
  163. osc_send_program(fOscData, index);
  164. }
  165. void CarlaBridgeClient::sendOscMidiProgram(const int32_t index)
  166. {
  167. CARLA_ASSERT(fOscData != nullptr);
  168. carla_debug("CarlaBridgeClient::sendOscMidiProgram(%i)", index);
  169. if (fOscData != nullptr && fOscData->target != nullptr)
  170. osc_send_midi_program(fOscData, index);
  171. }
  172. void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4])
  173. {
  174. CARLA_ASSERT(fOscData != nullptr);
  175. carla_debug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf);
  176. if (fOscData != nullptr && fOscData->target != nullptr)
  177. osc_send_midi(fOscData, midiBuf);
  178. }
  179. void CarlaBridgeClient::sendOscExiting()
  180. {
  181. CARLA_ASSERT(fOscData != nullptr);
  182. carla_debug("CarlaBridgeClient::sendOscExiting()");
  183. if (fOscData != nullptr && fOscData->target != nullptr)
  184. osc_send_exiting(fOscData);
  185. }
  186. #ifdef BRIDGE_LV2
  187. void CarlaBridgeClient::sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf)
  188. {
  189. CARLA_ASSERT(fOscData != nullptr);
  190. carla_debug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\")", portIndex, atomBuf);
  191. if (fOscData != nullptr && fOscData->target != nullptr)
  192. osc_send_lv2_atom_transfer(fOscData, portIndex, atomBuf);
  193. }
  194. void CarlaBridgeClient::sendOscLv2UridMap(const uint32_t urid, const char* const uri)
  195. {
  196. CARLA_ASSERT(fOscData != nullptr);
  197. carla_debug("CarlaBridgeClient::sendOscLv2UridMap(%i, \"%s\")", urid, uri);
  198. if (fOscData != nullptr && fOscData->target != nullptr)
  199. osc_send_lv2_urid_map(fOscData, urid, uri);
  200. }
  201. #endif
  202. // ---------------------------------------------------------------------
  203. #ifdef BUILD_BRIDGE_UI
  204. void* CarlaBridgeClient::getContainerId()
  205. {
  206. return fUI.toolkit->getContainerId();
  207. }
  208. bool CarlaBridgeClient::uiLibOpen(const char* const filename)
  209. {
  210. CARLA_ASSERT(fUI.lib == nullptr);
  211. CARLA_ASSERT(filename != nullptr);
  212. fUI.lib = lib_open(filename);
  213. fUI.filename = filename;
  214. return (fUI.lib != nullptr);
  215. }
  216. bool CarlaBridgeClient::uiLibClose()
  217. {
  218. CARLA_ASSERT(fUI.lib != nullptr);
  219. if (fUI.lib == nullptr)
  220. return false;
  221. const bool closed = lib_close(fUI.lib);
  222. fUI.lib = nullptr;
  223. return closed;
  224. }
  225. void* CarlaBridgeClient::uiLibSymbol(const char* const symbol)
  226. {
  227. CARLA_ASSERT(fUI.lib != nullptr);
  228. if (fUI.lib == nullptr)
  229. return nullptr;
  230. return lib_symbol(fUI.lib, symbol);
  231. }
  232. const char* CarlaBridgeClient::uiLibError()
  233. {
  234. return lib_error(fUI.filename);
  235. }
  236. #endif
  237. CARLA_BRIDGE_END_NAMESPACE