Collection of tools useful for audio production
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.

347 lines
8.0KB

  1. /*
  2. * Carla Bridge Client
  3. * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * 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 COPYING file
  16. */
  17. #include "carla_bridge_client.hpp"
  18. #include "carla_bridge_toolkit.hpp"
  19. #ifdef BUILD_BRIDGE_UI
  20. # include "carla_lib_utils.hpp"
  21. #endif
  22. #include <cstdlib>
  23. #include <cstring>
  24. CARLA_BRIDGE_START_NAMESPACE
  25. // ---------------------------------------------------------------------
  26. CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle)
  27. : m_osc(this),
  28. m_toolkit(CarlaBridgeToolkit::createNew(this, uiTitle))
  29. {
  30. qDebug("CarlaBridgeClient::CarlaBridgeClient(\"%s\")", uiTitle);
  31. m_oscData = nullptr;
  32. #ifdef BUILD_BRIDGE_UI
  33. m_uiFilename = nullptr;
  34. m_uiLib = nullptr;
  35. m_uiQuit = false;
  36. #endif
  37. }
  38. CarlaBridgeClient::~CarlaBridgeClient()
  39. {
  40. qDebug("CarlaBridgeClient::~CarlaBridgeClient()");
  41. #ifdef BUILD_BRIDGE_UI
  42. if (m_uiFilename)
  43. free(m_uiFilename);
  44. #endif
  45. delete m_toolkit;
  46. }
  47. #ifdef BUILD_BRIDGE_UI
  48. // ---------------------------------------------------------------------
  49. // ui initialization
  50. bool CarlaBridgeClient::init(const char* const, const char* const)
  51. {
  52. qDebug("CarlaBridgeClient::init()");
  53. // Test for single init
  54. {
  55. static bool initiated = false;
  56. CARLA_ASSERT(! initiated);
  57. initiated = true;
  58. }
  59. m_uiQuit = false;
  60. m_toolkit->init();
  61. return false;
  62. }
  63. void CarlaBridgeClient::close()
  64. {
  65. qDebug("CarlaBridgeClient::close()");
  66. if (! m_uiQuit)
  67. {
  68. m_uiQuit = true;
  69. if (isOscControlRegistered())
  70. sendOscExiting();
  71. }
  72. m_toolkit->quit();
  73. }
  74. #endif
  75. // ---------------------------------------------------------------------
  76. // osc stuff
  77. bool CarlaBridgeClient::oscInit(const char* const url)
  78. {
  79. qDebug("CarlaBridgeClient::oscInit(\"%s\")", url);
  80. const bool ret = m_osc.init(url);
  81. m_oscData = m_osc.getControlData();
  82. return ret;
  83. }
  84. bool CarlaBridgeClient::oscIdle()
  85. {
  86. m_osc.idle();
  87. #ifdef BUILD_BRIDGE_UI
  88. return ! m_uiQuit;
  89. #else
  90. return true;
  91. #endif
  92. }
  93. void CarlaBridgeClient::oscClose()
  94. {
  95. qDebug("CarlaBridgeClient::oscClose()");
  96. CARLA_ASSERT(m_oscData);
  97. m_osc.close();
  98. m_oscData = nullptr;
  99. }
  100. bool CarlaBridgeClient::isOscControlRegistered() const
  101. {
  102. return m_osc.isControlRegistered();
  103. }
  104. void CarlaBridgeClient::sendOscUpdate()
  105. {
  106. qDebug("CarlaBridgeClient::sendOscUpdate()");
  107. CARLA_ASSERT(m_oscData);
  108. if (m_oscData && m_oscData->target)
  109. osc_send_update(m_oscData, m_osc.getServerPath());
  110. }
  111. #ifdef BUILD_BRIDGE_PLUGIN
  112. void CarlaBridgeClient::registerOscEngine(CarlaBackend::CarlaEngine* const engine)
  113. {
  114. qDebug("CarlaBridgeClient::registerOscEngine(%p)", engine);
  115. CARLA_ASSERT(engine);
  116. if (engine)
  117. engine->setOscBridgeData(m_oscData);
  118. }
  119. void CarlaBridgeClient::sendOscBridgeError(const char* const error)
  120. {
  121. qDebug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error);
  122. CARLA_ASSERT(m_oscData);
  123. CARLA_ASSERT(error);
  124. if (m_oscData && m_oscData->target)
  125. osc_send_bridge_error(m_oscData, error);
  126. }
  127. #endif
  128. // ---------------------------------------------------------------------
  129. // toolkit
  130. void CarlaBridgeClient::toolkitShow()
  131. {
  132. qDebug("CarlaBridgeClient::toolkitShow()");
  133. m_toolkit->show();
  134. }
  135. void CarlaBridgeClient::toolkitHide()
  136. {
  137. qDebug("CarlaBridgeClient::toolkitHide()");
  138. m_toolkit->hide();
  139. }
  140. void CarlaBridgeClient::toolkitResize(int width, int height)
  141. {
  142. qDebug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height);
  143. m_toolkit->resize(width, height);
  144. }
  145. void CarlaBridgeClient::toolkitExec(const bool showGui)
  146. {
  147. qDebug("CarlaBridgeClient::toolkitExec(%s)", bool2str(showGui));
  148. m_toolkit->exec(showGui);
  149. }
  150. void CarlaBridgeClient::toolkitQuit()
  151. {
  152. qDebug("CarlaBridgeClient::toolkitQuit()");
  153. #ifdef BUILD_BRIDGE_UI
  154. m_uiQuit = true;
  155. #endif
  156. m_toolkit->quit();
  157. }
  158. // ---------------------------------------------------------------------
  159. void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value)
  160. {
  161. qDebug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value);
  162. CARLA_ASSERT(m_oscData);
  163. if (m_oscData && m_oscData->target)
  164. osc_send_configure(m_oscData, key, value);
  165. }
  166. void CarlaBridgeClient::sendOscControl(const int32_t index, const float value)
  167. {
  168. qDebug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value);
  169. CARLA_ASSERT(m_oscData);
  170. if (m_oscData && m_oscData->target)
  171. osc_send_control(m_oscData, index, value);
  172. }
  173. void CarlaBridgeClient::sendOscProgram(const int32_t index)
  174. {
  175. qDebug("CarlaBridgeClient::sendOscProgram(%i)", index);
  176. CARLA_ASSERT(m_oscData);
  177. if (m_oscData && m_oscData->target)
  178. osc_send_program(m_oscData, index);
  179. }
  180. void CarlaBridgeClient::sendOscMidiProgram(const int32_t index)
  181. {
  182. qDebug("CarlaBridgeClient::sendOscMidiProgram(%i)", index);
  183. CARLA_ASSERT(m_oscData);
  184. if (m_oscData && m_oscData->target)
  185. osc_send_midi_program(m_oscData, index);
  186. }
  187. void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4])
  188. {
  189. qDebug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf);
  190. CARLA_ASSERT(m_oscData);
  191. if (m_oscData && m_oscData->target)
  192. osc_send_midi(m_oscData, midiBuf);
  193. }
  194. void CarlaBridgeClient::sendOscExiting()
  195. {
  196. qDebug("CarlaBridgeClient::sendOscExiting()");
  197. CARLA_ASSERT(m_oscData);
  198. if (m_oscData && m_oscData->target)
  199. osc_send_exiting(m_oscData);
  200. }
  201. #ifdef BRIDGE_LV2
  202. void CarlaBridgeClient::sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf)
  203. {
  204. qDebug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf);
  205. CARLA_ASSERT(m_oscData);
  206. if (m_oscData && m_oscData->target)
  207. osc_send_lv2_transfer_atom(m_oscData, portIndex, typeStr, atomBuf);
  208. }
  209. void CarlaBridgeClient::sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const atomBuf)
  210. {
  211. qDebug("CarlaBridgeClient::sendOscLv2TransferEvent(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf);
  212. CARLA_ASSERT(m_oscData);
  213. if (m_oscData && m_oscData->target)
  214. osc_send_lv2_transfer_event(m_oscData, portIndex, typeStr, atomBuf);
  215. }
  216. #endif
  217. #ifdef BUILD_BRIDGE_PLUGIN
  218. void CarlaBridgeClient::sendOscBridgeUpdate()
  219. {
  220. qDebug("CarlaBridgeClient::sendOscBridgeUpdate()");
  221. CARLA_ASSERT(m_oscData);
  222. CARLA_ASSERT(m_oscData->target && m_osc.m_serverPath);
  223. if (m_oscData && m_oscData->target && m_osc.m_serverPath)
  224. osc_send_bridge_update(m_oscData, m_osc.m_serverPath);
  225. }
  226. #endif
  227. // ---------------------------------------------------------------------
  228. #ifdef BUILD_BRIDGE_UI
  229. void* CarlaBridgeClient::getContainerId()
  230. {
  231. return m_toolkit->getContainerId();
  232. }
  233. bool CarlaBridgeClient::uiLibOpen(const char* const filename)
  234. {
  235. CARLA_ASSERT(! m_uiLib);
  236. CARLA_ASSERT(filename);
  237. if (m_uiFilename)
  238. free(m_uiFilename);
  239. m_uiLib = lib_open(filename);
  240. m_uiFilename = strdup(filename ? filename : "");
  241. return bool(m_uiLib);
  242. }
  243. bool CarlaBridgeClient::uiLibClose()
  244. {
  245. CARLA_ASSERT(m_uiLib);
  246. if (m_uiLib)
  247. {
  248. const bool closed = lib_close(m_uiLib);
  249. m_uiLib = nullptr;
  250. return closed;
  251. }
  252. return false;
  253. }
  254. void* CarlaBridgeClient::uiLibSymbol(const char* const symbol)
  255. {
  256. CARLA_ASSERT(m_uiLib);
  257. if (m_uiLib)
  258. return lib_symbol(m_uiLib, symbol);
  259. return nullptr;
  260. }
  261. const char* CarlaBridgeClient::uiLibError()
  262. {
  263. return lib_error(m_uiFilename);
  264. }
  265. #endif
  266. CARLA_BRIDGE_END_NAMESPACE