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.

333 lines
7.8KB

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