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.

1616 lines
47KB

  1. /*
  2. * Carla Backend
  3. * Copyright (C) 2012 Filipe Coelho <falktx@gmail.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_engine.h"
  18. #include "carla_plugin.h"
  19. CARLA_BACKEND_START_NAMESPACE
  20. // -----------------------------------------------------------------------
  21. CarlaEngine::CarlaEngine()
  22. : m_checkThread(this),
  23. #ifndef BUILD_BRIDGE
  24. m_osc(this),
  25. m_oscData(nullptr),
  26. #endif
  27. m_callback(nullptr),
  28. #ifdef Q_COMPILER_INITIALIZER_LISTS
  29. m_callbackPtr(nullptr),
  30. m_carlaPlugins{nullptr},
  31. m_uniqueNames{nullptr},
  32. m_insPeak{0.0},
  33. m_outsPeak{0.0}
  34. #else
  35. m_callbackPtr(nullptr)
  36. #endif
  37. {
  38. qDebug("CarlaEngine::CarlaEngine()");
  39. type = CarlaEngineTypeNull;
  40. name = nullptr;
  41. bufferSize = 0;
  42. sampleRate = 0.0;
  43. maxPluginNumber = 0;
  44. #ifndef Q_COMPILER_INITIALIZER_LISTS
  45. for (unsigned short i=0; i < MAX_PLUGINS; i++)
  46. {
  47. m_carlaPlugins[i] = nullptr;
  48. m_uniqueNames[i] = nullptr;
  49. }
  50. for (unsigned short i=0; i < MAX_PLUGINS * MAX_PEAKS; i++)
  51. {
  52. m_insPeak[i] = 0.0;
  53. m_outsPeak[i] = 0.0;
  54. }
  55. #endif
  56. }
  57. CarlaEngine::~CarlaEngine()
  58. {
  59. qDebug("CarlaEngine::~CarlaEngine()");
  60. if (name)
  61. free((void*)name);
  62. }
  63. // -----------------------------------------------------------------------
  64. // Static values
  65. int CarlaEngine::maxClientNameSize()
  66. {
  67. #ifdef CARLA_ENGINE_JACK
  68. # ifndef BUILD_BRIDGE
  69. if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK)
  70. # endif
  71. return jackbridge_client_name_size();
  72. #endif
  73. return STR_MAX/2;
  74. }
  75. int CarlaEngine::maxPortNameSize()
  76. {
  77. #ifdef CARLA_ENGINE_JACK
  78. # ifndef BUILD_BRIDGE
  79. if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK)
  80. # endif
  81. return jackbridge_port_name_size();
  82. #endif
  83. return STR_MAX;
  84. }
  85. bool CarlaEngine::init(const char* const clientName)
  86. {
  87. qDebug("CarlaEngine::init(\"%s\")", clientName);
  88. #ifndef BUILD_BRIDGE
  89. m_osc.init(clientName);
  90. m_oscData = m_osc.getControllerData();
  91. #endif
  92. return true;
  93. }
  94. bool CarlaEngine::close()
  95. {
  96. qDebug("CarlaEngine::close()");
  97. m_checkThread.stopNow();
  98. m_oscData = nullptr;
  99. #ifndef BUILD_BRIDGE
  100. m_osc.close();
  101. #endif
  102. maxPluginNumber = 0;
  103. return true;
  104. }
  105. // -----------------------------------------------------------------------
  106. // plugin management
  107. short CarlaEngine::getNewPluginId() const
  108. {
  109. qDebug("CarlaEngine::getNewPluginId()");
  110. for (unsigned short i=0; i < maxPluginNumber; i++)
  111. {
  112. if (! m_carlaPlugins[i])
  113. return i;
  114. }
  115. return -1;
  116. }
  117. CarlaPlugin* CarlaEngine::getPlugin(const unsigned short id) const
  118. {
  119. qDebug("CarlaEngine::getPlugin(%i/%i)", id, maxPluginNumber);
  120. Q_ASSERT(maxPluginNumber != 0);
  121. Q_ASSERT(id < maxPluginNumber);
  122. if (id < maxPluginNumber)
  123. return m_carlaPlugins[id];
  124. return nullptr;
  125. }
  126. CarlaPlugin* CarlaEngine::getPluginUnchecked(const unsigned short id) const
  127. {
  128. Q_ASSERT(maxPluginNumber != 0);
  129. Q_ASSERT(id < maxPluginNumber);
  130. return m_carlaPlugins[id];
  131. }
  132. const char* CarlaEngine::getUniqueName(const char* const name)
  133. {
  134. qDebug("CarlaEngine::getUniqueName(\"%s\")", name);
  135. QString qname(name);
  136. if (qname.isEmpty())
  137. qname = "(No name)";
  138. qname.truncate(maxClientNameSize()-5-1); // 5 = strlen(" (10)")
  139. qname.replace(":", "."); // ":" is used in JACK1 to split client/port names
  140. for (unsigned short i=0; i < maxPluginNumber; i++)
  141. {
  142. // Check if unique name already exists
  143. if (m_uniqueNames[i] && qname == m_uniqueNames[i])
  144. {
  145. // Check if string has already been modified
  146. uint len = qname.size();
  147. // 1 digit, ex: " (2)"
  148. if (qname.at(len-4) == QChar(' ') && qname.at(len-3) == QChar('(') && qname.at(len-2).isDigit() && qname.at(len-1) == QChar(')'))
  149. {
  150. int number = qname.at(len-2).toAscii()-'0';
  151. if (number == 9)
  152. // next number is 10, 2 digits
  153. qname.replace(" (9)", " (10)");
  154. else
  155. qname[len-2] = QChar('0'+number+1);
  156. continue;
  157. }
  158. // 2 digits, ex: " (11)"
  159. if (qname.at(len-5) == QChar(' ') && qname.at(len-4) == QChar('(') && qname.at(len-3).isDigit() && qname.at(len-2).isDigit() && qname.at(len-1) == QChar(')'))
  160. {
  161. QChar n2 = qname.at(len-2);
  162. QChar n3 = qname.at(len-3);
  163. if (n2 == QChar('9'))
  164. {
  165. n2 = QChar('0');
  166. n3 = QChar(n3.toAscii()+1);
  167. }
  168. else
  169. n2 = QChar(n2.toAscii()+1);
  170. qname[len-2] = n2;
  171. qname[len-3] = n3;
  172. continue;
  173. }
  174. // Modify string if not
  175. qname += " (2)";
  176. }
  177. }
  178. return strdup(qname.toUtf8().constData());
  179. }
  180. short CarlaEngine::addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra)
  181. {
  182. return addPlugin(BINARY_NATIVE, ptype, filename, name, label, extra);
  183. }
  184. short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra)
  185. {
  186. qDebug("CarlaEngine::addPlugin(%s, %s, \"%s\", \"%s\", \"%s\", %p)", BinaryType2str(btype), PluginType2str(ptype), filename, name, label, extra);
  187. Q_ASSERT(btype != BINARY_NONE);
  188. Q_ASSERT(ptype != PLUGIN_NONE);
  189. Q_ASSERT(filename);
  190. Q_ASSERT(label);
  191. if (maxPluginNumber == 0)
  192. #ifdef BUILD_BRIDGE
  193. maxPluginNumber = MAX_PLUGINS;
  194. #else
  195. maxPluginNumber = (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) ? 16 : MAX_PLUGINS;
  196. #endif
  197. CarlaPlugin::initializer init = {
  198. this,
  199. filename,
  200. name,
  201. label
  202. };
  203. CarlaPlugin* plugin = nullptr;
  204. #ifndef BUILD_BRIDGE
  205. if (btype != BINARY_NATIVE)
  206. {
  207. # ifdef CARLA_ENGINE_JACK
  208. if (carlaOptions.processMode != CarlaBackend::PROCESS_MODE_MULTIPLE_CLIENTS)
  209. {
  210. setLastError("Can only use bridged plugins in JACK Multi-Client mode");
  211. return -1;
  212. }
  213. # endif
  214. if (type != CarlaEngineTypeJack)
  215. {
  216. setLastError("Can only use bridged plugins with JACK backend");
  217. return -1;
  218. }
  219. plugin = CarlaPlugin::newBridge(init, btype, ptype);
  220. }
  221. else
  222. #endif
  223. {
  224. switch (ptype)
  225. {
  226. case PLUGIN_NONE:
  227. break;
  228. case PLUGIN_LADSPA:
  229. plugin = CarlaPlugin::newLADSPA(init, extra);
  230. break;
  231. case PLUGIN_DSSI:
  232. plugin = CarlaPlugin::newDSSI(init, extra);
  233. break;
  234. case PLUGIN_LV2:
  235. plugin = CarlaPlugin::newLV2(init);
  236. break;
  237. case PLUGIN_VST:
  238. plugin = CarlaPlugin::newVST(init);
  239. break;
  240. #ifdef BUILD_BRIDGE
  241. case PLUGIN_GIG:
  242. case PLUGIN_SF2:
  243. case PLUGIN_SFZ:
  244. break;
  245. #else
  246. case PLUGIN_GIG:
  247. plugin = CarlaPlugin::newGIG(init);
  248. break;
  249. case PLUGIN_SF2:
  250. plugin = CarlaPlugin::newSF2(init);
  251. break;
  252. case PLUGIN_SFZ:
  253. plugin = CarlaPlugin::newSFZ(init);
  254. break;
  255. #endif
  256. }
  257. }
  258. if (! plugin)
  259. return -1;
  260. const short id = plugin->id();
  261. m_carlaPlugins[id] = plugin;
  262. m_uniqueNames[id] = plugin->name();
  263. if (! m_checkThread.isRunning())
  264. m_checkThread.startNow(maxPluginNumber);
  265. return id;
  266. }
  267. bool CarlaEngine::removePlugin(const unsigned short id)
  268. {
  269. qDebug("CarlaEngine::removePlugin(%i)", id);
  270. Q_ASSERT(maxPluginNumber != 0);
  271. Q_ASSERT(id < maxPluginNumber);
  272. CarlaPlugin* const plugin = m_carlaPlugins[id];
  273. if (plugin /*&& plugin->id() == id*/)
  274. {
  275. Q_ASSERT(plugin->id() == id);
  276. m_checkThread.stopNow();
  277. processLock();
  278. plugin->setEnabled(false);
  279. processUnlock();
  280. delete plugin;
  281. m_carlaPlugins[id] = nullptr;
  282. m_uniqueNames[id] = nullptr;
  283. #ifndef BUILD_BRIDGE
  284. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  285. {
  286. for (unsigned short i=id; i < maxPluginNumber-1; i++)
  287. {
  288. m_carlaPlugins[i] = m_carlaPlugins[i+1];
  289. m_uniqueNames[i] = m_uniqueNames[i+1];
  290. if (m_carlaPlugins[i])
  291. m_carlaPlugins[i]->setId(i);
  292. }
  293. }
  294. #endif
  295. if (isRunning())
  296. m_checkThread.startNow(maxPluginNumber);
  297. return true;
  298. }
  299. qCritical("CarlaEngine::removePlugin(%i) - could not find plugin", id);
  300. setLastError("Could not find plugin to remove");
  301. return false;
  302. }
  303. void CarlaEngine::removeAllPlugins()
  304. {
  305. qDebug("CarlaEngine::removeAllPlugins()");
  306. m_checkThread.stopNow();
  307. for (unsigned short i=0; i < maxPluginNumber; i++)
  308. {
  309. CarlaPlugin* const plugin = m_carlaPlugins[i];
  310. if (plugin)
  311. {
  312. processLock();
  313. plugin->setEnabled(false);
  314. processUnlock();
  315. delete plugin;
  316. m_carlaPlugins[i] = nullptr;
  317. m_uniqueNames[i] = nullptr;
  318. }
  319. }
  320. maxPluginNumber = 0;
  321. }
  322. void CarlaEngine::idlePluginGuis()
  323. {
  324. Q_ASSERT(maxPluginNumber != 0);
  325. for (unsigned short i=0; i < maxPluginNumber; i++)
  326. {
  327. CarlaPlugin* const plugin = m_carlaPlugins[i];
  328. if (plugin && plugin->enabled())
  329. plugin->idleGui();
  330. }
  331. }
  332. // -----------------------------------------------------------------------
  333. // Information (base)
  334. const char* CarlaEngine::getName() const
  335. {
  336. Q_ASSERT(name);
  337. return name;
  338. }
  339. double CarlaEngine::getSampleRate() const
  340. {
  341. //Q_ASSERT(sampleRate != 0.0);
  342. return sampleRate;
  343. }
  344. uint32_t CarlaEngine::getBufferSize() const
  345. {
  346. //Q_ASSERT(bufferSize != 0);
  347. return bufferSize;
  348. }
  349. const CarlaTimeInfo* CarlaEngine::getTimeInfo() const
  350. {
  351. return &timeInfo;
  352. }
  353. // -----------------------------------------------------------------------
  354. // Information (audio peaks)
  355. double CarlaEngine::getInputPeak(const unsigned short pluginId, const unsigned short id) const
  356. {
  357. Q_ASSERT(pluginId < maxPluginNumber);
  358. Q_ASSERT(id < MAX_PEAKS);
  359. return m_insPeak[pluginId*MAX_PEAKS + id];
  360. }
  361. double CarlaEngine::getOutputPeak(const unsigned short pluginId, const unsigned short id) const
  362. {
  363. Q_ASSERT(pluginId < maxPluginNumber);
  364. Q_ASSERT(id < MAX_PEAKS);
  365. return m_outsPeak[pluginId*MAX_PEAKS + id];
  366. }
  367. void CarlaEngine::setInputPeak(const unsigned short pluginId, const unsigned short id, double value)
  368. {
  369. Q_ASSERT(pluginId < maxPluginNumber);
  370. Q_ASSERT(id < MAX_PEAKS);
  371. m_insPeak[pluginId*MAX_PEAKS + id] = value;
  372. }
  373. void CarlaEngine::setOutputPeak(const unsigned short pluginId, const unsigned short id, double value)
  374. {
  375. Q_ASSERT(pluginId < maxPluginNumber);
  376. Q_ASSERT(id < MAX_PEAKS);
  377. m_outsPeak[pluginId*MAX_PEAKS + id] = value;
  378. }
  379. // -----------------------------------------------------------------------
  380. // Callback
  381. void CarlaEngine::callback(const CallbackType action, const unsigned short pluginId, const int value1, const int value2, const double value3)
  382. {
  383. qDebug("CarlaEngine::callback(%s, %i, %i, %i, %f)", CallbackType2str(action), pluginId, value1, value2, value3);
  384. if (m_callback)
  385. m_callback(m_callbackPtr, action, pluginId, value1, value2, value3);
  386. }
  387. void CarlaEngine::setCallback(const CallbackFunc func, void* const ptr)
  388. {
  389. qDebug("CarlaEngine::setCallback(%p, %p)", func, ptr);
  390. m_callback = func;
  391. m_callbackPtr = ptr;
  392. }
  393. // -----------------------------------------------------------------------
  394. // Mutex locks
  395. void CarlaEngine::processLock()
  396. {
  397. m_procLock.lock();
  398. }
  399. void CarlaEngine::processUnlock()
  400. {
  401. m_procLock.unlock();
  402. }
  403. void CarlaEngine::midiLock()
  404. {
  405. m_midiLock.lock();
  406. }
  407. void CarlaEngine::midiUnlock()
  408. {
  409. m_midiLock.unlock();
  410. }
  411. // -----------------------------------------------------------------------
  412. // OSC Stuff
  413. #ifndef BUILD_BRIDGE
  414. bool CarlaEngine::isOscControllerRegisted() const
  415. {
  416. return m_osc.isControllerRegistered();
  417. }
  418. const char* CarlaEngine::getOscServerPath() const
  419. {
  420. return m_osc.getServerPath();
  421. }
  422. #else
  423. void CarlaEngine::setOscBridgeData(const CarlaOscData* const oscData)
  424. {
  425. m_oscData = oscData;
  426. }
  427. #endif
  428. // -----------------------------------------------------------------------
  429. // protected calls
  430. void CarlaEngine::bufferSizeChanged(uint32_t newBufferSize)
  431. {
  432. qDebug("CarlaEngine::bufferSizeChanged(%i)", newBufferSize);
  433. bufferSize = newBufferSize;
  434. for (unsigned short i=0; i < maxPluginNumber; i++)
  435. {
  436. if (m_carlaPlugins[i] && m_carlaPlugins[i]->enabled())
  437. m_carlaPlugins[i]->bufferSizeChanged(newBufferSize);
  438. }
  439. }
  440. // -------------------------------------------------------------------------------------------------------------------
  441. // Carla Engine Client
  442. CarlaEngineClient::CarlaEngineClient(const CarlaEngineType& type_, const CarlaEngineClientNativeHandle& handle_)
  443. : type(type_),
  444. handle(handle_)
  445. {
  446. qDebug("CarlaEngineClient::CarlaEngineClient()");
  447. Q_ASSERT(type != CarlaEngineTypeNull);
  448. m_active = false;
  449. }
  450. CarlaEngineClient::~CarlaEngineClient()
  451. {
  452. qDebug("CarlaEngineClient::~CarlaEngineClient()");
  453. Q_ASSERT(! m_active);
  454. #ifndef BUILD_BRIDGE
  455. if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  456. #endif
  457. {
  458. #ifdef CARLA_ENGINE_JACK
  459. if (handle.jackClient)
  460. jackbridge_client_close(handle.jackClient);
  461. #endif
  462. #ifdef CARLA_ENGINE_RTAUDIO
  463. if (handle.rtAudioPtr)
  464. delete handle.rtAudioPtr;
  465. #endif
  466. }
  467. }
  468. void CarlaEngineClient::activate()
  469. {
  470. qDebug("CarlaEngineClient::activate()");
  471. Q_ASSERT(! m_active);
  472. #ifndef BUILD_BRIDGE
  473. if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  474. #endif
  475. {
  476. if (! m_active)
  477. {
  478. #ifdef CARLA_ENGINE_JACK
  479. if (handle.jackClient)
  480. jackbridge_activate(handle.jackClient);
  481. #endif
  482. #ifdef CARLA_ENGINE_RTAUDIO
  483. if (handle.rtAudioPtr)
  484. handle.rtAudioPtr->startStream();
  485. #endif
  486. }
  487. }
  488. m_active = true;
  489. }
  490. void CarlaEngineClient::deactivate()
  491. {
  492. qDebug("CarlaEngineClient::deactivate()");
  493. Q_ASSERT(m_active);
  494. #ifndef BUILD_BRIDGE
  495. if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  496. #endif
  497. {
  498. if (m_active)
  499. {
  500. #ifdef CARLA_ENGINE_JACK
  501. if (handle.jackClient)
  502. jackbridge_deactivate(handle.jackClient);
  503. #endif
  504. #ifdef CARLA_ENGINE_RTAUDIO
  505. if (handle.rtAudioPtr)
  506. handle.rtAudioPtr->stopStream();
  507. #endif
  508. }
  509. }
  510. m_active = false;
  511. }
  512. bool CarlaEngineClient::isActive() const
  513. {
  514. qDebug("CarlaEngineClient::isActive()");
  515. return m_active;
  516. }
  517. bool CarlaEngineClient::isOk() const
  518. {
  519. qDebug("CarlaEngineClient::isOk()");
  520. #ifndef BUILD_BRIDGE
  521. if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK)
  522. #endif
  523. {
  524. #ifdef CARLA_ENGINE_JACK
  525. return bool(handle.jackClient);
  526. // FIXME
  527. #endif
  528. }
  529. return true;
  530. }
  531. const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType type, const char* const name, const bool isInput)
  532. {
  533. qDebug("CarlaEngineClient::addPort(%i, \"%s\", %s)", type, name, bool2str(isInput));
  534. CarlaEnginePortNativeHandle portHandle;
  535. #ifdef CARLA_ENGINE_JACK
  536. portHandle.jackClient = handle.jackClient;
  537. #endif
  538. #ifdef CARLA_ENGINE_JACK
  539. # ifndef BUILD_BRIDGE
  540. if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK)
  541. # endif
  542. {
  543. switch (type)
  544. {
  545. case CarlaEnginePortTypeAudio:
  546. portHandle.jackPort = jackbridge_port_register(handle.jackClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  547. break;
  548. case CarlaEnginePortTypeControl:
  549. case CarlaEnginePortTypeMIDI:
  550. portHandle.jackPort = jackbridge_port_register(handle.jackClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  551. break;
  552. }
  553. }
  554. #else
  555. Q_UNUSED(name);
  556. #endif
  557. switch (type)
  558. {
  559. case CarlaEnginePortTypeAudio:
  560. return new CarlaEngineAudioPort(portHandle, isInput);
  561. case CarlaEnginePortTypeControl:
  562. return new CarlaEngineControlPort(portHandle, isInput);
  563. case CarlaEnginePortTypeMIDI:
  564. return new CarlaEngineMidiPort(portHandle, isInput);
  565. }
  566. qCritical("CarlaEngineClient::addPort(%i, \"%s\", %s) - invalid type", type, name, bool2str(isInput));
  567. return nullptr;
  568. }
  569. // -------------------------------------------------------------------------------------------------------------------
  570. // Carla Engine Port (Base class)
  571. CarlaEngineBasePort::CarlaEngineBasePort(const CarlaEnginePortNativeHandle& handle_, const bool isInput_)
  572. : isInput(isInput_),
  573. handle(handle_)
  574. {
  575. qDebug("CarlaEngineBasePort::CarlaEngineBasePort(%s)", bool2str(isInput_));
  576. buffer = nullptr;
  577. }
  578. CarlaEngineBasePort::~CarlaEngineBasePort()
  579. {
  580. qDebug("CarlaEngineBasePort::~CarlaEngineBasePort()");
  581. #ifdef CARLA_ENGINE_JACK
  582. # ifndef BUILD_BRIDGE
  583. if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK)
  584. # endif
  585. {
  586. if (handle.jackClient && handle.jackPort)
  587. jackbridge_port_unregister(handle.jackClient, handle.jackPort);
  588. }
  589. #endif
  590. }
  591. // -------------------------------------------------------------------------------------------------------------------
  592. // Carla Engine Port (Audio)
  593. CarlaEngineAudioPort::CarlaEngineAudioPort(const CarlaEnginePortNativeHandle& handle, const bool isInput)
  594. : CarlaEngineBasePort(handle, isInput)
  595. {
  596. qDebug("CarlaEngineAudioPort::CarlaEngineAudioPort(%s)", bool2str(isInput));
  597. }
  598. void CarlaEngineAudioPort::initBuffer(CarlaEngine* const /*engine*/)
  599. {
  600. }
  601. #ifdef CARLA_ENGINE_JACK
  602. float* CarlaEngineAudioPort::getJackAudioBuffer(uint32_t nframes)
  603. {
  604. # ifndef BUILD_BRIDGE
  605. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  606. return nullptr;
  607. # endif
  608. Q_ASSERT(handle.jackPort);
  609. return (float*)jackbridge_port_get_buffer(handle.jackPort, nframes);
  610. }
  611. #endif
  612. // -------------------------------------------------------------------------------------------------------------------
  613. // Carla Engine Port (Control)
  614. CarlaEngineControlPort::CarlaEngineControlPort(const CarlaEnginePortNativeHandle& handle, const bool isInput)
  615. : CarlaEngineBasePort(handle, isInput)
  616. {
  617. qDebug("CarlaEngineControlPort::CarlaEngineControlPort(%s)", bool2str(isInput));
  618. }
  619. void CarlaEngineControlPort::initBuffer(CarlaEngine* const engine)
  620. {
  621. Q_ASSERT(engine);
  622. #ifndef BUILD_BRIDGE
  623. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  624. {
  625. buffer = isInput ? engine->rackControlEventsIn : engine->rackControlEventsOut;
  626. return;
  627. }
  628. #endif
  629. #ifdef CARLA_ENGINE_JACK
  630. if (handle.jackPort)
  631. {
  632. buffer = jackbridge_port_get_buffer(handle.jackPort, engine->getBufferSize());
  633. if (! isInput)
  634. jackbridge_midi_clear_buffer(buffer);
  635. }
  636. #endif
  637. }
  638. uint32_t CarlaEngineControlPort::getEventCount()
  639. {
  640. if (! isInput)
  641. return 0;
  642. Q_ASSERT(buffer);
  643. #ifndef BUILD_BRIDGE
  644. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  645. {
  646. uint32_t count = 0;
  647. const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  648. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS; i++)
  649. {
  650. if (events[i].type != CarlaEngineEventNull)
  651. count++;
  652. else
  653. break;
  654. }
  655. return count;
  656. }
  657. #endif
  658. #ifdef CARLA_ENGINE_JACK
  659. return jackbridge_midi_get_event_count(buffer);
  660. #else
  661. return 0;
  662. #endif
  663. }
  664. const CarlaEngineControlEvent* CarlaEngineControlPort::getEvent(uint32_t index)
  665. {
  666. if (! isInput)
  667. return nullptr;
  668. Q_ASSERT(buffer);
  669. #ifndef BUILD_BRIDGE
  670. Q_ASSERT(index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS);
  671. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  672. {
  673. const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  674. if (index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS)
  675. return &events[index];
  676. return nullptr;
  677. }
  678. #endif
  679. #ifdef CARLA_ENGINE_JACK
  680. static jackbridge_midi_event_t jackEvent;
  681. static CarlaEngineControlEvent carlaEvent;
  682. if (jackbridge_midi_event_get(&jackEvent, buffer, index) != 0)
  683. return nullptr;
  684. memset(&carlaEvent, 0, sizeof(CarlaEngineControlEvent));
  685. uint8_t midiStatus = jackEvent.buffer[0];
  686. uint8_t midiChannel = midiStatus & 0x0F;
  687. carlaEvent.time = jackEvent.time;
  688. carlaEvent.channel = midiChannel;
  689. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  690. {
  691. uint8_t midiControl = jackEvent.buffer[1];
  692. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  693. {
  694. uint8_t midiBank = jackEvent.buffer[2];
  695. carlaEvent.type = CarlaEngineEventMidiBankChange;
  696. carlaEvent.value = midiBank;
  697. }
  698. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  699. {
  700. carlaEvent.type = CarlaEngineEventAllSoundOff;
  701. }
  702. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  703. {
  704. carlaEvent.type = CarlaEngineEventAllNotesOff;
  705. }
  706. else
  707. {
  708. uint8_t midiValue = jackEvent.buffer[2];
  709. carlaEvent.type = CarlaEngineEventControlChange;
  710. carlaEvent.controller = midiControl;
  711. carlaEvent.value = double(midiValue)/127;
  712. }
  713. return &carlaEvent;
  714. }
  715. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  716. {
  717. uint8_t midiProgram = jackEvent.buffer[1];
  718. carlaEvent.type = CarlaEngineEventMidiProgramChange;
  719. carlaEvent.value = midiProgram;
  720. return &carlaEvent;
  721. }
  722. #endif
  723. return nullptr;
  724. }
  725. void CarlaEngineControlPort::writeEvent(CarlaEngineControlEventType type, uint32_t time, uint8_t channel, uint8_t controller, double value)
  726. {
  727. if (isInput)
  728. return;
  729. Q_ASSERT(buffer);
  730. Q_ASSERT(type != CarlaEngineEventNull);
  731. #ifndef BUILD_BRIDGE
  732. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  733. {
  734. CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  735. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS; i++)
  736. {
  737. if (events[i].type == CarlaEngineEventNull)
  738. {
  739. events[i].type = type;
  740. events[i].time = time;
  741. events[i].value = value;
  742. events[i].channel = channel;
  743. events[i].controller = controller;
  744. break;
  745. }
  746. }
  747. return;
  748. }
  749. #endif
  750. #ifdef CARLA_ENGINE_JACK
  751. if (type == CarlaEngineEventControlChange && MIDI_IS_CONTROL_BANK_SELECT(controller))
  752. type = CarlaEngineEventMidiBankChange;
  753. uint8_t data[4] = { 0 };
  754. switch (type)
  755. {
  756. case CarlaEngineEventNull:
  757. break;
  758. case CarlaEngineEventControlChange:
  759. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  760. data[1] = controller;
  761. data[2] = value * 127;
  762. jackbridge_midi_event_write(buffer, time, data, 3);
  763. break;
  764. case CarlaEngineEventMidiBankChange:
  765. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  766. data[1] = MIDI_CONTROL_BANK_SELECT;
  767. data[2] = value;
  768. jackbridge_midi_event_write(buffer, time, data, 3);
  769. break;
  770. case CarlaEngineEventMidiProgramChange:
  771. data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
  772. data[1] = value;
  773. jackbridge_midi_event_write(buffer, time, data, 2);
  774. break;
  775. case CarlaEngineEventAllSoundOff:
  776. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  777. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  778. jackbridge_midi_event_write(buffer, time, data, 2);
  779. break;
  780. case CarlaEngineEventAllNotesOff:
  781. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  782. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  783. jackbridge_midi_event_write(buffer, time, data, 2);
  784. break;
  785. }
  786. #endif
  787. }
  788. // -------------------------------------------------------------------------------------------------------------------
  789. // Carla Engine Port (MIDI)
  790. CarlaEngineMidiPort::CarlaEngineMidiPort(const CarlaEnginePortNativeHandle& handle, const bool isInput)
  791. : CarlaEngineBasePort(handle, isInput)
  792. {
  793. qDebug("CarlaEngineMidiPort::CarlaEngineMidiPort(%s)", bool2str(isInput));
  794. }
  795. void CarlaEngineMidiPort::initBuffer(CarlaEngine* const engine)
  796. {
  797. Q_ASSERT(engine);
  798. #ifndef BUILD_BRIDGE
  799. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  800. {
  801. buffer = isInput ? engine->rackMidiEventsIn : engine->rackMidiEventsOut;
  802. return;
  803. }
  804. #endif
  805. #ifdef CARLA_ENGINE_JACK
  806. if (handle.jackPort)
  807. {
  808. buffer = jackbridge_port_get_buffer(handle.jackPort, engine->getBufferSize());
  809. if (! isInput)
  810. jackbridge_midi_clear_buffer(buffer);
  811. }
  812. #endif
  813. }
  814. uint32_t CarlaEngineMidiPort::getEventCount()
  815. {
  816. if (! isInput)
  817. return 0;
  818. Q_ASSERT(buffer);
  819. #ifndef BUILD_BRIDGE
  820. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  821. {
  822. uint32_t count = 0;
  823. const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  824. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_MIDI_EVENTS; i++)
  825. {
  826. if (events[i].size > 0)
  827. count++;
  828. else
  829. break;
  830. }
  831. return count;
  832. }
  833. #endif
  834. #ifdef CARLA_ENGINE_JACK
  835. return jackbridge_midi_get_event_count(buffer);
  836. #else
  837. return 0;
  838. #endif
  839. }
  840. const CarlaEngineMidiEvent* CarlaEngineMidiPort::getEvent(uint32_t index)
  841. {
  842. if (! isInput)
  843. return nullptr;
  844. Q_ASSERT(buffer);
  845. #ifndef BUILD_BRIDGE
  846. Q_ASSERT(index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS);
  847. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  848. {
  849. const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  850. if (index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS)
  851. return &events[index];
  852. return nullptr;
  853. }
  854. #endif
  855. #ifdef CARLA_ENGINE_JACK
  856. static jackbridge_midi_event_t jackEvent;
  857. static CarlaEngineMidiEvent carlaEvent;
  858. if (jackbridge_midi_event_get(&jackEvent, buffer, index) == 0 && jackEvent.size <= 4)
  859. {
  860. carlaEvent.time = jackEvent.time;
  861. carlaEvent.size = jackEvent.size;
  862. memcpy(carlaEvent.data, jackEvent.buffer, jackEvent.size);
  863. return &carlaEvent;
  864. }
  865. #endif
  866. return nullptr;
  867. }
  868. void CarlaEngineMidiPort::writeEvent(uint32_t time, const uint8_t* data, uint8_t size)
  869. {
  870. if (isInput)
  871. return;
  872. Q_ASSERT(buffer);
  873. Q_ASSERT(data);
  874. Q_ASSERT(size > 0);
  875. #ifndef BUILD_BRIDGE
  876. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  877. {
  878. if (size > 4)
  879. return;
  880. CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  881. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_MIDI_EVENTS; i++)
  882. {
  883. if (events[i].size == 0)
  884. {
  885. events[i].time = time;
  886. events[i].size = size;
  887. memcpy(events[i].data, data, size);
  888. break;
  889. }
  890. }
  891. return;
  892. }
  893. #endif
  894. #ifdef CARLA_ENGINE_JACK
  895. jackbridge_midi_event_write(buffer, time, data, size);
  896. #endif
  897. }
  898. // -------------------------------------------------------------------------------------------------------------------
  899. // Carla Engine OSC stuff
  900. #ifndef BUILD_BRIDGE
  901. void CarlaEngine::osc_send_control_add_plugin(const int32_t pluginId, const char* const pluginName)
  902. {
  903. qDebug("CarlaEngine::osc_send_add_plugin(%i, \"%s\")", pluginId, pluginName);
  904. Q_ASSERT(m_oscData);
  905. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  906. Q_ASSERT(pluginName);
  907. if (m_oscData && m_oscData->target)
  908. {
  909. char target_path[strlen(m_oscData->path)+12];
  910. strcpy(target_path, m_oscData->path);
  911. strcat(target_path, "/add_plugin");
  912. lo_send(m_oscData->target, target_path, "is", pluginId, pluginName);
  913. }
  914. }
  915. void CarlaEngine::osc_send_control_remove_plugin(const int32_t pluginId)
  916. {
  917. qDebug("CarlaEngine::osc_send_remove_plugin(%i)", pluginId);
  918. Q_ASSERT(m_oscData);
  919. if (m_oscData && m_oscData->target)
  920. {
  921. char target_path[strlen(m_oscData->path)+15];
  922. strcpy(target_path, m_oscData->path);
  923. strcat(target_path, "/remove_plugin");
  924. lo_send(m_oscData->target, target_path, "i", pluginId);
  925. }
  926. }
  927. void CarlaEngine::osc_send_control_set_plugin_data(const int32_t pluginId, const int32_t type, const int32_t category, const int32_t hints, const char* const realName, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId)
  928. {
  929. qDebug("CarlaEngine::osc_send_set_plugin_data(%i, %i, %i, %i, \"%s\", \"%s\", \"%s\", \"%s\", %li)", pluginId, type, category, hints, realName, label, maker, copyright, uniqueId);
  930. Q_ASSERT(m_oscData);
  931. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  932. Q_ASSERT(type != PLUGIN_NONE);
  933. if (m_oscData && m_oscData->target)
  934. {
  935. char target_path[strlen(m_oscData->path)+17];
  936. strcpy(target_path, m_oscData->path);
  937. strcat(target_path, "/set_plugin_data");
  938. lo_send(m_oscData->target, target_path, "iiiissssh", pluginId, type, category, hints, realName, label, maker, copyright, uniqueId);
  939. }
  940. }
  941. void CarlaEngine::osc_send_control_set_plugin_ports(const int32_t pluginId, const int32_t audioIns, const int32_t audioOuts, const int32_t midiIns, const int32_t midiOuts, const int32_t cIns, const int32_t cOuts, const int32_t cTotals)
  942. {
  943. qDebug("CarlaEngine::osc_send_set_plugin_ports(%i, %i, %i, %i, %i, %i, %i, %i)", pluginId, audioIns, audioOuts, midiIns, midiOuts, cIns, cOuts, cTotals);
  944. Q_ASSERT(m_oscData);
  945. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  946. if (m_oscData && m_oscData->target)
  947. {
  948. char target_path[strlen(m_oscData->path)+18];
  949. strcpy(target_path, m_oscData->path);
  950. strcat(target_path, "/set_plugin_ports");
  951. lo_send(m_oscData->target, target_path, "iiiiiiii", pluginId, audioIns, audioOuts, midiIns, midiOuts, cIns, cOuts, cTotals);
  952. }
  953. }
  954. void CarlaEngine::osc_send_control_set_parameter_data(const int32_t pluginId, const int32_t index, const int32_t type, const int32_t hints, const char* const name, const char* const label, const double current)
  955. {
  956. qDebug("CarlaEngine::osc_send_set_parameter_data(%i, %i, %i, %i, \"%s\", \"%s\", %g)", pluginId, index, type, hints, name, label, current);
  957. Q_ASSERT(m_oscData);
  958. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  959. Q_ASSERT(index >= 0);
  960. Q_ASSERT(type != PARAMETER_UNKNOWN);
  961. if (m_oscData && m_oscData->target)
  962. {
  963. char target_path[strlen(m_oscData->path)+20];
  964. strcpy(target_path, m_oscData->path);
  965. strcat(target_path, "/set_parameter_data");
  966. lo_send(m_oscData->target, target_path, "iiiissd", pluginId, index, type, hints, name, label, current);
  967. }
  968. }
  969. void CarlaEngine::osc_send_control_set_parameter_ranges(const int32_t pluginId, const int32_t index, const double min, const double max, const double def, const double step, const double stepSmall, const double stepLarge)
  970. {
  971. qDebug("CarlaEngine::osc_send_set_parameter_ranges(%i, %i, %g, %g, %g, %g, %g, %g)", pluginId, index, min, max, def, step, stepSmall, stepLarge);
  972. Q_ASSERT(m_oscData);
  973. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  974. Q_ASSERT(index >= 0);
  975. Q_ASSERT(min < max);
  976. if (m_oscData && m_oscData->target)
  977. {
  978. char target_path[strlen(m_oscData->path)+22];
  979. strcpy(target_path, m_oscData->path);
  980. strcat(target_path, "/set_parameter_ranges");
  981. lo_send(m_oscData->target, target_path, "iidddddd", pluginId, index, min, max, def, step, stepSmall, stepLarge);
  982. }
  983. }
  984. void CarlaEngine::osc_send_control_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc)
  985. {
  986. qDebug("CarlaEngine::osc_send_set_parameter_midi_cc(%i, %i, %i)", pluginId, index, cc);
  987. Q_ASSERT(m_oscData);
  988. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  989. Q_ASSERT(index >= 0);
  990. if (m_oscData && m_oscData->target)
  991. {
  992. char target_path[strlen(m_oscData->path)+23];
  993. strcpy(target_path, m_oscData->path);
  994. strcat(target_path, "/set_parameter_midi_cc");
  995. lo_send(m_oscData->target, target_path, "iii", pluginId, index, cc);
  996. }
  997. }
  998. void CarlaEngine::osc_send_control_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel)
  999. {
  1000. qDebug("CarlaEngine::osc_send_set_parameter_midi_channel(%i, %i, %i)", pluginId, index, channel);
  1001. Q_ASSERT(m_oscData);
  1002. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1003. Q_ASSERT(index >= 0);
  1004. Q_ASSERT(channel >= 0 && channel < 16);
  1005. if (m_oscData && m_oscData->target)
  1006. {
  1007. char target_path[strlen(m_oscData->path)+28];
  1008. strcpy(target_path, m_oscData->path);
  1009. strcat(target_path, "/set_parameter_midi_channel");
  1010. lo_send(m_oscData->target, target_path, "iii", pluginId, index, channel);
  1011. }
  1012. }
  1013. void CarlaEngine::osc_send_control_set_parameter_value(const int32_t pluginId, const int32_t index, const double value)
  1014. {
  1015. #if DEBUG
  1016. if (index < 0)
  1017. qDebug("CarlaEngine::osc_send_set_parameter_value(%i, %s, %g)", pluginId, InternalParametersIndex2str((InternalParametersIndex)index), value);
  1018. else
  1019. qDebug("CarlaEngine::osc_send_set_parameter_value(%i, %i, %g)", pluginId, index, value);
  1020. #endif
  1021. Q_ASSERT(m_oscData);
  1022. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1023. if (m_oscData && m_oscData->target)
  1024. {
  1025. char target_path[strlen(m_oscData->path)+21];
  1026. strcpy(target_path, m_oscData->path);
  1027. strcat(target_path, "/set_parameter_value");
  1028. lo_send(m_oscData->target, target_path, "iid", pluginId, index, value);
  1029. }
  1030. }
  1031. void CarlaEngine::osc_send_control_set_default_value(const int32_t pluginId, const int32_t index, const double value)
  1032. {
  1033. qDebug("CarlaEngine::osc_send_set_default_value(%i, %i, %g)", pluginId, index, value);
  1034. Q_ASSERT(m_oscData);
  1035. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1036. Q_ASSERT(index >= 0);
  1037. if (m_oscData && m_oscData->target)
  1038. {
  1039. char target_path[strlen(m_oscData->path)+19];
  1040. strcpy(target_path, m_oscData->path);
  1041. strcat(target_path, "/set_default_value");
  1042. lo_send(m_oscData->target, target_path, "iid", pluginId, index, value);
  1043. }
  1044. }
  1045. void CarlaEngine::osc_send_control_set_program(const int32_t pluginId, const int32_t index)
  1046. {
  1047. qDebug("CarlaEngine::osc_send_set_program(%i, %i)", pluginId, index);
  1048. Q_ASSERT(m_oscData);
  1049. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1050. if (m_oscData && m_oscData->target)
  1051. {
  1052. char target_path[strlen(m_oscData->path)+13];
  1053. strcpy(target_path, m_oscData->path);
  1054. strcat(target_path, "/set_program");
  1055. lo_send(m_oscData->target, target_path, "ii", pluginId, index);
  1056. }
  1057. }
  1058. void CarlaEngine::osc_send_control_set_program_count(const int32_t pluginId, const int32_t count)
  1059. {
  1060. qDebug("CarlaEngine::osc_send_set_program_count(%i, %i)", pluginId, count);
  1061. Q_ASSERT(m_oscData);
  1062. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1063. Q_ASSERT(count >= 0);
  1064. if (m_oscData && m_oscData->target)
  1065. {
  1066. char target_path[strlen(m_oscData->path)+19];
  1067. strcpy(target_path, m_oscData->path);
  1068. strcat(target_path, "/set_program_count");
  1069. lo_send(m_oscData->target, target_path, "ii", pluginId, count);
  1070. }
  1071. }
  1072. void CarlaEngine::osc_send_control_set_program_name(const int32_t pluginId, const int32_t index, const char* const name)
  1073. {
  1074. qDebug("CarlaEngine::osc_send_set_program_name(%i, %i, %s)", pluginId, index, name);
  1075. Q_ASSERT(m_oscData);
  1076. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1077. Q_ASSERT(index >= 0);
  1078. Q_ASSERT(name);
  1079. if (m_oscData && m_oscData->target)
  1080. {
  1081. char target_path[strlen(m_oscData->path)+18];
  1082. strcpy(target_path, m_oscData->path);
  1083. strcat(target_path, "/set_program_name");
  1084. lo_send(m_oscData->target, target_path, "iis", pluginId, index, name);
  1085. }
  1086. }
  1087. void CarlaEngine::osc_send_control_set_midi_program(const int32_t pluginId, const int32_t index)
  1088. {
  1089. qDebug("CarlaEngine::osc_send_set_midi_program(%i, %i)", pluginId, index);
  1090. Q_ASSERT(m_oscData);
  1091. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1092. if (m_oscData && m_oscData->target)
  1093. {
  1094. char target_path[strlen(m_oscData->path)+18];
  1095. strcpy(target_path, m_oscData->path);
  1096. strcat(target_path, "/set_midi_program");
  1097. lo_send(m_oscData->target, target_path, "ii", pluginId, index);
  1098. }
  1099. }
  1100. void CarlaEngine::osc_send_control_set_midi_program_count(const int32_t pluginId, const int32_t count)
  1101. {
  1102. qDebug("CarlaEngine::osc_send_set_midi_program_count(%i, %i)", pluginId, count);
  1103. Q_ASSERT(m_oscData);
  1104. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1105. Q_ASSERT(count >= 0);
  1106. if (m_oscData && m_oscData->target)
  1107. {
  1108. char target_path[strlen(m_oscData->path)+24];
  1109. strcpy(target_path, m_oscData->path);
  1110. strcat(target_path, "/set_midi_program_count");
  1111. lo_send(m_oscData->target, target_path, "ii", pluginId, count);
  1112. }
  1113. }
  1114. void CarlaEngine::osc_send_control_set_midi_program_data(const int32_t pluginId, const int32_t index, const int32_t bank, const int32_t program, const char* const name)
  1115. {
  1116. qDebug("CarlaEngine::osc_send_set_midi_program_data(%i, %i, %i, %i, %s)", pluginId, index, bank, program, name);
  1117. Q_ASSERT(m_oscData);
  1118. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1119. Q_ASSERT(index >= 0);
  1120. Q_ASSERT(bank >= 0);
  1121. Q_ASSERT(program >= 0);
  1122. Q_ASSERT(name);
  1123. if (m_oscData && m_oscData->target)
  1124. {
  1125. char target_path[strlen(m_oscData->path)+23];
  1126. strcpy(target_path, m_oscData->path);
  1127. strcat(target_path, "/set_midi_program_data");
  1128. lo_send(m_oscData->target, target_path, "iiiis", pluginId, index, bank, program, name);
  1129. }
  1130. }
  1131. void CarlaEngine::osc_send_control_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo)
  1132. {
  1133. qDebug("CarlaEngine::osc_send_note_on(%i, %i, %i, %i)", pluginId, channel, note, velo);
  1134. Q_ASSERT(m_oscData);
  1135. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1136. Q_ASSERT(channel >= 0 && channel < 16);
  1137. Q_ASSERT(note >= 0 && note < 128);
  1138. Q_ASSERT(velo > 0 && velo < 128);
  1139. if (m_oscData && m_oscData->target)
  1140. {
  1141. char target_path[strlen(m_oscData->path)+9];
  1142. strcpy(target_path, m_oscData->path);
  1143. strcat(target_path, "/note_on");
  1144. lo_send(m_oscData->target, target_path, "iiii", pluginId, channel, note, velo);
  1145. }
  1146. }
  1147. void CarlaEngine::osc_send_control_note_off(const int32_t pluginId, const int32_t channel, const int32_t note)
  1148. {
  1149. qDebug("CarlaEngine::osc_send_note_off(%i, %i, %i)", pluginId, channel, note);
  1150. Q_ASSERT(m_oscData);
  1151. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1152. Q_ASSERT(channel >= 0 && channel < 16);
  1153. Q_ASSERT(note >= 0 && note < 128);
  1154. if (m_oscData && m_oscData->target)
  1155. {
  1156. char target_path[strlen(m_oscData->path)+10];
  1157. strcpy(target_path, m_oscData->path);
  1158. strcat(target_path, "/note_off");
  1159. lo_send(m_oscData->target, target_path, "iii", pluginId, channel, note);
  1160. }
  1161. }
  1162. void CarlaEngine::osc_send_control_set_input_peak_value(const int32_t pluginId, const int32_t portId, const double value)
  1163. {
  1164. qDebug("CarlaEngine::osc_send_set_input_peak_value(%i, %i, %g)", pluginId, portId, value);
  1165. Q_ASSERT(m_oscData);
  1166. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1167. Q_ASSERT(portId == 1 || portId == 2);
  1168. if (m_oscData && m_oscData->target)
  1169. {
  1170. char target_path[strlen(m_oscData->path)+22];
  1171. strcpy(target_path, m_oscData->path);
  1172. strcat(target_path, "/set_input_peak_value");
  1173. lo_send(m_oscData->target, target_path, "iid", pluginId, portId, value);
  1174. }
  1175. }
  1176. void CarlaEngine::osc_send_control_set_output_peak_value(const int32_t pluginId, const int32_t portId, const double value)
  1177. {
  1178. qDebug("CarlaEngine::osc_send_set_output_peak_value(%i, %i, %g)", pluginId, portId, value);
  1179. Q_ASSERT(m_oscData);
  1180. Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber);
  1181. Q_ASSERT(portId == 1 || portId == 2);
  1182. if (m_oscData && m_oscData->target)
  1183. {
  1184. char target_path[strlen(m_oscData->path)+23];
  1185. strcpy(target_path, m_oscData->path);
  1186. strcat(target_path, "/set_output_peak_value");
  1187. lo_send(m_oscData->target, target_path, "iid", pluginId, portId, value);
  1188. }
  1189. }
  1190. void CarlaEngine::osc_send_control_exit()
  1191. {
  1192. qDebug("CarlaEngine::osc_send_exit()");
  1193. Q_ASSERT(m_oscData);
  1194. if (m_oscData && m_oscData->target)
  1195. {
  1196. char target_path[strlen(m_oscData->path)+6];
  1197. strcpy(target_path, m_oscData->path);
  1198. strcat(target_path, "/exit");
  1199. lo_send(m_oscData->target, target_path, "");
  1200. }
  1201. }
  1202. #else
  1203. void CarlaEngine::osc_send_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total)
  1204. {
  1205. qDebug("CarlaEngine::osc_send_bridge_audio_count(%i, %i, %i)", ins, outs, total);
  1206. Q_ASSERT(m_oscData);
  1207. Q_ASSERT(total >= 0 && total >= ins + outs);
  1208. if (m_oscData && m_oscData->target)
  1209. {
  1210. char target_path[strlen(m_oscData->path)+20];
  1211. strcpy(target_path, m_oscData->path);
  1212. strcat(target_path, "/bridge_audio_count");
  1213. lo_send(m_oscData->target, target_path, "iii", ins, outs, total);
  1214. }
  1215. }
  1216. void CarlaEngine::osc_send_bridge_midi_count(const int32_t ins, const int32_t outs, const int32_t total)
  1217. {
  1218. qDebug("CarlaEngine::osc_send_bridge_midi_count(%i, %i, %i)", ins, outs, total);
  1219. Q_ASSERT(m_oscData);
  1220. Q_ASSERT(total >= 0 && total >= ins + outs);
  1221. if (m_oscData && m_oscData->target)
  1222. {
  1223. char target_path[strlen(m_oscData->path)+19];
  1224. strcpy(target_path, m_oscData->path);
  1225. strcat(target_path, "/bridge_midi_count");
  1226. lo_send(m_oscData->target, target_path, "iii", ins, outs, total);
  1227. }
  1228. }
  1229. void CarlaEngine::osc_send_bridge_param_count(const int32_t ins, const int32_t outs, const int32_t total)
  1230. {
  1231. qDebug("CarlaEngine::osc_send_bridge_param_count(%i, %i, %i)", ins, outs, total);
  1232. Q_ASSERT(m_oscData);
  1233. Q_ASSERT(total >= 0 && total >= ins + outs);
  1234. if (m_oscData && m_oscData->target)
  1235. {
  1236. char target_path[strlen(m_oscData->path)+20];
  1237. strcpy(target_path, m_oscData->path);
  1238. strcat(target_path, "/bridge_param_count");
  1239. lo_send(m_oscData->target, target_path, "iii", ins, outs, total);
  1240. }
  1241. }
  1242. void CarlaEngine::osc_send_bridge_program_count(const int32_t count)
  1243. {
  1244. qDebug("CarlaEngine::osc_send_bridge_program_count(%i)", count);
  1245. Q_ASSERT(m_oscData);
  1246. Q_ASSERT(count >= 0);
  1247. if (m_oscData && m_oscData->target)
  1248. {
  1249. char target_path[strlen(m_oscData->path)+22];
  1250. strcpy(target_path, m_oscData->path);
  1251. strcat(target_path, "/bridge_program_count");
  1252. lo_send(m_oscData->target, target_path, "i", count);
  1253. }
  1254. }
  1255. void CarlaEngine::osc_send_bridge_midi_program_count(const int32_t count)
  1256. {
  1257. qDebug("CarlaEngine::osc_send_bridge_midi_program_count(%i)", count);
  1258. Q_ASSERT(m_oscData);
  1259. Q_ASSERT(count >= 0);
  1260. if (m_oscData && m_oscData->target)
  1261. {
  1262. char target_path[strlen(m_oscData->path)+27];
  1263. strcpy(target_path, m_oscData->path);
  1264. strcat(target_path, "/bridge_midi_program_count");
  1265. lo_send(m_oscData->target, target_path, "i", count);
  1266. }
  1267. }
  1268. void CarlaEngine::osc_send_bridge_plugin_info(const int32_t category, const int32_t hints, const char* const name, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId)
  1269. {
  1270. qDebug("CarlaEngine::osc_send_bridge_plugin_info(%i, %i, \"%s\", \"%s\", \"%s\", \"%s\", %li)", category, hints, name, label, maker, copyright, uniqueId);
  1271. Q_ASSERT(m_oscData);
  1272. Q_ASSERT(name);
  1273. Q_ASSERT(label);
  1274. Q_ASSERT(maker);
  1275. Q_ASSERT(copyright);
  1276. if (m_oscData && m_oscData->target)
  1277. {
  1278. char target_path[strlen(m_oscData->path)+27];
  1279. strcpy(target_path, m_oscData->path);
  1280. strcat(target_path, "/bridge_plugin_info");
  1281. lo_send(m_oscData->target, target_path, "iissssh", category, hints, name, label, maker, copyright, uniqueId);
  1282. }
  1283. }
  1284. void CarlaEngine::osc_send_bridge_param_info(const int32_t index, const char* const name, const char* const unit)
  1285. {
  1286. qDebug("CarlaEngine::osc_send_bridge_param_info(%i, \"%s\", \"%s\")", index, name, unit);
  1287. Q_ASSERT(m_oscData);
  1288. Q_ASSERT(name);
  1289. Q_ASSERT(unit);
  1290. if (m_oscData && m_oscData->target)
  1291. {
  1292. char target_path[strlen(m_oscData->path)+27];
  1293. strcpy(target_path, m_oscData->path);
  1294. strcat(target_path, "/bridge_param_info");
  1295. lo_send(m_oscData->target, target_path, "iss", index, name, unit);
  1296. }
  1297. }
  1298. void CarlaEngine::osc_send_bridge_param_data(const int32_t index, const int32_t type, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC)
  1299. {
  1300. qDebug("CarlaEngine::osc_send_bridge_param_data(%i, %i, %i, %i, %i, %i)", index, type, rindex, hints, midiChannel, midiCC);
  1301. Q_ASSERT(m_oscData);
  1302. if (m_oscData && m_oscData->target)
  1303. {
  1304. char target_path[strlen(m_oscData->path)+27];
  1305. strcpy(target_path, m_oscData->path);
  1306. strcat(target_path, "/bridge_param_data");
  1307. lo_send(m_oscData->target, target_path, "iiiiii", index, type, rindex, hints, midiChannel, midiCC);
  1308. }
  1309. }
  1310. void CarlaEngine::osc_send_bridge_param_ranges(const int32_t index, const double def, const double min, const double max, const double step, const double stepSmall, const double stepLarge)
  1311. {
  1312. qDebug("CarlaEngine::osc_send_bridge_param_ranges(%i, %g, %g, %g, %g, %g, %g)", index, def, min, max, step, stepSmall, stepLarge);
  1313. Q_ASSERT(m_oscData);
  1314. if (m_oscData && m_oscData->target)
  1315. {
  1316. char target_path[strlen(m_oscData->path)+27];
  1317. strcpy(target_path, m_oscData->path);
  1318. strcat(target_path, "/bridge_param_ranges");
  1319. lo_send(m_oscData->target, target_path, "idddddd", index, def, min, max, step, stepSmall, stepLarge);
  1320. }
  1321. }
  1322. void CarlaEngine::osc_send_bridge_program_info(const int32_t index, const char* const name)
  1323. {
  1324. //qDebug("CarlaEngine::osc_send_bridge_program_info(%i, \"%s\")", index, name);
  1325. Q_ASSERT(m_oscData);
  1326. if (m_oscData && m_oscData->target)
  1327. {
  1328. char target_path[strlen(m_oscData->path)+27];
  1329. strcpy(target_path, m_oscData->path);
  1330. strcat(target_path, "/bridge_midi_program_info");
  1331. lo_send(m_oscData->target, target_path, "is", index, name);
  1332. }
  1333. }
  1334. void CarlaEngine::osc_send_bridge_midi_program_info(const int32_t index, const int32_t bank, const int32_t program, const char* const label)
  1335. {
  1336. qDebug("CarlaEngine::osc_send_bridge_midi_program_info(%i, %i, %i, \"%s\")", index, bank, program, label);
  1337. Q_ASSERT(m_oscData);
  1338. if (m_oscData && m_oscData->target)
  1339. {
  1340. char target_path[strlen(m_oscData->path)+27];
  1341. strcpy(target_path, m_oscData->path);
  1342. strcat(target_path, "/bridge_midi_program_info");
  1343. lo_send(m_oscData->target, target_path, "iiis", index, bank, program, label);
  1344. }
  1345. }
  1346. #endif
  1347. CARLA_BACKEND_END_NAMESPACE