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.

308 lines
7.9KB

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