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.

1931 lines
58KB

  1. /*
  2. * Carla Engine
  3. * Copyright (C) 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_engine.hpp"
  18. #include "carla_plugin.hpp"
  19. CARLA_BACKEND_START_NAMESPACE
  20. // -------------------------------------------------------------------------------------------------------------------
  21. // Utils
  22. const char* CarlaEngineType2Str(const CarlaEngineType type)
  23. {
  24. switch (type)
  25. {
  26. case CarlaEngineTypeNull:
  27. return "CarlaEngineTypeNull";
  28. case CarlaEngineTypeJack:
  29. return "CarlaEngineTypeJack";
  30. case CarlaEngineTypeRtAudio:
  31. return "CarlaEngineTypeRtAudio";
  32. case CarlaEngineTypePlugin:
  33. return "CarlaEngineTypePlugin";
  34. }
  35. qWarning("CarlaBackend::CarlaEngineType2Str(%i) - invalid type", type);
  36. return nullptr;
  37. }
  38. // -------------------------------------------------------------------------------------------------------------------
  39. // Engine port (Base)
  40. CarlaEngineBasePort::CarlaEngineBasePort(const bool isInput_, const ProcessMode processMode_)
  41. : isInput(isInput_),
  42. processMode(processMode_)
  43. {
  44. qDebug("CarlaEngineBasePort::CarlaEngineBasePort(%s, %s)", bool2str(isInput), ProcessMode2Str(processMode));
  45. buffer = nullptr;
  46. }
  47. CarlaEngineBasePort::~CarlaEngineBasePort()
  48. {
  49. qDebug("CarlaEngineBasePort::~CarlaEngineBasePort()");
  50. }
  51. // -------------------------------------------------------------------------------------------------------------------
  52. // Engine port (Audio)
  53. CarlaEngineAudioPort::CarlaEngineAudioPort(const bool isInput, const ProcessMode processMode)
  54. : CarlaEngineBasePort(isInput, processMode)
  55. {
  56. qDebug("CarlaEngineAudioPort::CarlaEngineAudioPort(%s, %s)", bool2str(isInput), ProcessMode2Str(processMode));
  57. }
  58. CarlaEngineAudioPort::~CarlaEngineAudioPort()
  59. {
  60. qDebug("CarlaEngineAudioPort::~CarlaEngineAudioPort()");
  61. }
  62. void CarlaEngineAudioPort::initBuffer(CarlaEngine* const)
  63. {
  64. }
  65. // -------------------------------------------------------------------------------------------------------------------
  66. // Engine port (Control)
  67. CarlaEngineControlPort::CarlaEngineControlPort(const bool isInput, const ProcessMode processMode)
  68. : CarlaEngineBasePort(isInput, processMode)
  69. {
  70. qDebug("CarlaEngineControlPort::CarlaEngineControlPort(%s, %s)", bool2str(isInput), ProcessMode2Str(processMode));
  71. }
  72. CarlaEngineControlPort::~CarlaEngineControlPort()
  73. {
  74. qDebug("CarlaEngineControlPort::~CarlaEngineControlPort()");
  75. }
  76. void CarlaEngineControlPort::initBuffer(CarlaEngine* const engine)
  77. {
  78. CARLA_ASSERT(engine);
  79. #ifndef BUILD_BRIDGE
  80. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  81. buffer = isInput ? engine->rackControlEventsIn : engine->rackControlEventsOut;
  82. #endif
  83. }
  84. uint32_t CarlaEngineControlPort::getEventCount()
  85. {
  86. if (! isInput)
  87. return 0;
  88. CARLA_ASSERT(buffer);
  89. #ifndef BUILD_BRIDGE
  90. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  91. {
  92. uint32_t count = 0;
  93. const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  94. for (unsigned short i=0; i < CarlaEngine::MAX_CONTROL_EVENTS; i++, count++)
  95. {
  96. if (events[i].type == CarlaEngineNullEvent)
  97. break;
  98. }
  99. return count;
  100. }
  101. #endif
  102. return 0;
  103. }
  104. const CarlaEngineControlEvent* CarlaEngineControlPort::getEvent(const uint32_t index)
  105. {
  106. if (! isInput)
  107. return nullptr;
  108. CARLA_ASSERT(buffer);
  109. #ifndef BUILD_BRIDGE
  110. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  111. {
  112. CARLA_ASSERT(index < CarlaEngine::MAX_CONTROL_EVENTS);
  113. const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  114. if (index < CarlaEngine::MAX_CONTROL_EVENTS)
  115. return &events[index];
  116. }
  117. #else
  118. Q_UNUSED(index);
  119. #endif
  120. return nullptr;
  121. }
  122. void CarlaEngineControlPort::writeEvent(const CarlaEngineControlEventType type, const uint32_t time, const uint8_t channel, const uint16_t parameter, const double value)
  123. {
  124. if (isInput)
  125. return;
  126. CARLA_ASSERT(buffer);
  127. CARLA_ASSERT(type != CarlaEngineNullEvent);
  128. if (type == CarlaEngineNullEvent)
  129. return;
  130. if (type == CarlaEngineParameterChangeEvent)
  131. CARLA_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(parameter));
  132. #ifndef BUILD_BRIDGE
  133. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  134. {
  135. CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  136. for (unsigned short i=0; i < CarlaEngine::MAX_CONTROL_EVENTS; i++)
  137. {
  138. if (events[i].type != CarlaEngineNullEvent)
  139. continue;
  140. events[i].type = type;
  141. events[i].time = time;
  142. events[i].value = value;
  143. events[i].channel = channel;
  144. events[i].parameter = parameter;
  145. break;
  146. }
  147. qWarning("CarlaEngineControlPort::writeEvent() - buffer full");
  148. }
  149. #else
  150. Q_UNUSED(time);
  151. Q_UNUSED(channel);
  152. Q_UNUSED(parameter);
  153. Q_UNUSED(value);
  154. #endif
  155. }
  156. // -------------------------------------------------------------------------------------------------------------------
  157. // Engine port (MIDI)
  158. CarlaEngineMidiPort::CarlaEngineMidiPort(const bool isInput, const ProcessMode processMode)
  159. : CarlaEngineBasePort(isInput, processMode)
  160. {
  161. qDebug("CarlaEngineMidiPort::CarlaEngineMidiPort(%s, %s)", bool2str(isInput), ProcessMode2Str(processMode));
  162. }
  163. CarlaEngineMidiPort::~CarlaEngineMidiPort()
  164. {
  165. qDebug("CarlaEngineMidiPort::~CarlaEngineMidiPort()");
  166. }
  167. void CarlaEngineMidiPort::initBuffer(CarlaEngine* const engine)
  168. {
  169. CARLA_ASSERT(engine);
  170. #ifndef BUILD_BRIDGE
  171. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  172. buffer = isInput ? engine->rackMidiEventsIn : engine->rackMidiEventsOut;
  173. #endif
  174. }
  175. uint32_t CarlaEngineMidiPort::getEventCount()
  176. {
  177. if (! isInput)
  178. return 0;
  179. CARLA_ASSERT(buffer);
  180. #ifndef BUILD_BRIDGE
  181. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  182. {
  183. uint32_t count = 0;
  184. const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  185. for (unsigned short i=0; i < CarlaEngine::MAX_MIDI_EVENTS; i++, count++)
  186. {
  187. if (events[i].size == 0)
  188. break;
  189. }
  190. return count;
  191. }
  192. #endif
  193. return 0;
  194. }
  195. const CarlaEngineMidiEvent* CarlaEngineMidiPort::getEvent(uint32_t index)
  196. {
  197. if (! isInput)
  198. return nullptr;
  199. CARLA_ASSERT(buffer);
  200. #ifndef BUILD_BRIDGE
  201. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  202. {
  203. CARLA_ASSERT(index < CarlaEngine::MAX_MIDI_EVENTS);
  204. const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  205. if (index < CarlaEngine::MAX_MIDI_EVENTS)
  206. return &events[index];
  207. }
  208. #else
  209. Q_UNUSED(index);
  210. #endif
  211. return nullptr;
  212. }
  213. void CarlaEngineMidiPort::writeEvent(const uint32_t time, const uint8_t* const data, const uint8_t size)
  214. {
  215. if (isInput)
  216. return;
  217. CARLA_ASSERT(buffer);
  218. CARLA_ASSERT(data);
  219. CARLA_ASSERT(size > 0);
  220. #ifndef BUILD_BRIDGE
  221. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  222. {
  223. if (size > 4)
  224. return;
  225. CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  226. for (unsigned short i=0; i < CarlaEngine::MAX_MIDI_EVENTS; i++)
  227. {
  228. if (events[i].size != 0)
  229. continue;
  230. events[i].time = time;
  231. events[i].size = size;
  232. memcpy(events[i].data, data, size);
  233. break;
  234. }
  235. qWarning("CarlaEngineMidiPort::writeEvent() - buffer full");
  236. }
  237. #else
  238. Q_UNUSED(time);
  239. #endif
  240. }
  241. // -------------------------------------------------------------------------------------------------------------------
  242. // Carla Engine Client
  243. CarlaEngineClient::CarlaEngineClient(const CarlaEngineType engineType_, const ProcessMode processMode_)
  244. : engineType(engineType_),
  245. processMode(processMode_)
  246. {
  247. qDebug("CarlaEngineClient::CarlaEngineClient(%s, %s)", CarlaEngineType2Str(engineType), ProcessMode2Str(processMode));
  248. CARLA_ASSERT(engineType != CarlaEngineTypeNull);
  249. m_active = false;
  250. m_latency = 0;
  251. }
  252. CarlaEngineClient::~CarlaEngineClient()
  253. {
  254. qDebug("CarlaEngineClient::~CarlaEngineClient()");
  255. CARLA_ASSERT(! m_active);
  256. }
  257. void CarlaEngineClient::activate()
  258. {
  259. qDebug("CarlaEngineClient::activate()");
  260. CARLA_ASSERT(! m_active);
  261. m_active = true;
  262. }
  263. void CarlaEngineClient::deactivate()
  264. {
  265. qDebug("CarlaEngineClient::deactivate()");
  266. CARLA_ASSERT(m_active);
  267. m_active = false;
  268. }
  269. bool CarlaEngineClient::isActive() const
  270. {
  271. qDebug("CarlaEngineClient::isActive()");
  272. return m_active;
  273. }
  274. bool CarlaEngineClient::isOk() const
  275. {
  276. qDebug("CarlaEngineClient::isOk()");
  277. return true;
  278. }
  279. uint32_t CarlaEngineClient::getLatency() const
  280. {
  281. return m_latency;
  282. }
  283. void CarlaEngineClient::setLatency(const uint32_t samples)
  284. {
  285. m_latency = samples;
  286. }
  287. // -------------------------------------------------------------------------------------------------------------------
  288. // Carla Engine Client
  289. CarlaEngine::CarlaEngine()
  290. : m_osc(this),
  291. m_thread(this),
  292. m_callbackPtr(nullptr),
  293. m_carlaPlugins{nullptr},
  294. m_uniqueNames{nullptr},
  295. m_insPeak{0.0},
  296. m_outsPeak{0.0}
  297. {
  298. qDebug("CarlaEngine::CarlaEngine()");
  299. bufferSize = 0;
  300. sampleRate = 0.0;
  301. m_oscData = nullptr;
  302. m_callback = nullptr;
  303. m_callbackPtr = nullptr;
  304. m_aboutToClose = false;
  305. m_maxPluginNumber = 0;
  306. }
  307. CarlaEngine::~CarlaEngine()
  308. {
  309. qDebug("CarlaEngine::~CarlaEngine()");
  310. }
  311. // -----------------------------------------------------------------------
  312. // Static values and calls
  313. unsigned int CarlaEngine::getDriverCount()
  314. {
  315. unsigned int count = 0;
  316. #ifdef CARLA_ENGINE_JACK
  317. count += 1;
  318. #endif
  319. #ifdef CARLA_ENGINE_RTAUDIO
  320. count += getRtAudioApiCount();
  321. #endif
  322. return count;
  323. }
  324. const char* CarlaEngine::getDriverName(unsigned int index)
  325. {
  326. #ifdef CARLA_ENGINE_JACK
  327. if (index == 0)
  328. return "JACK";
  329. else
  330. index -= 1;
  331. #endif
  332. #ifdef CARLA_ENGINE_RTAUDIO
  333. if (index < getRtAudioApiCount())
  334. return getRtAudioApiName(index);
  335. #endif
  336. qWarning("CarlaEngine::getDriverName(%i) - invalid index", index);
  337. return nullptr;
  338. }
  339. CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName)
  340. {
  341. #ifdef CARLA_ENGINE_JACK
  342. if (strcmp(driverName, "JACK") == 0)
  343. return newJack();
  344. #else
  345. if (false)
  346. pass();
  347. #endif
  348. #ifdef CARLA_ENGINE_RTAUDIO
  349. # ifdef __LINUX_ALSA__
  350. else if (strcmp(driverName, "ALSA") == 0)
  351. return newRtAudio(RTAUDIO_LINUX_ALSA);
  352. # endif
  353. # ifdef __LINUX_PULSE__
  354. else if (strcmp(driverName, "PulseAudio") == 0)
  355. return newRtAudio(RTAUDIO_LINUX_PULSE);
  356. # endif
  357. # ifdef __LINUX_OSS__
  358. else if (strcmp(driverName, "OSS") == 0)
  359. return newRtAudio(RTAUDIO_LINUX_OSS);
  360. # endif
  361. # ifdef __UNIX_JACK__
  362. else if (strcmp(driverName, "JACK (RtAudio)") == 0)
  363. return newRtAudio(RTAUDIO_UNIX_JACK);
  364. # endif
  365. # ifdef __MACOSX_CORE__
  366. else if (strcmp(driverName, "CoreAudio") == 0)
  367. return newRtAudio(RTAUDIO_MACOSX_CORE);
  368. # endif
  369. # ifdef __WINDOWS_ASIO__
  370. else if (strcmp(driverName, "ASIO") == 0)
  371. return newRtAudio(RTAUDIO_WINDOWS_ASIO);
  372. # endif
  373. # ifdef __WINDOWS_DS__
  374. else if (strcmp(driverName, "DirectSound") == 0)
  375. return newRtAudio(RTAUDIO_WINDOWS_DS);
  376. # endif
  377. #endif
  378. return nullptr;
  379. }
  380. // -----------------------------------------------------------------------
  381. // Maximum values
  382. int CarlaEngine::maxClientNameSize()
  383. {
  384. return STR_MAX/2;
  385. }
  386. int CarlaEngine::maxPortNameSize()
  387. {
  388. return STR_MAX;
  389. }
  390. unsigned short CarlaEngine::maxPluginNumber() const
  391. {
  392. return m_maxPluginNumber;
  393. }
  394. // -----------------------------------------------------------------------
  395. // Virtual, per-engine type calls
  396. bool CarlaEngine::init(const char* const clientName)
  397. {
  398. qDebug("CarlaEngine::init(\"%s\")", clientName);
  399. m_aboutToClose = false;
  400. m_osc.init(clientName);
  401. #ifndef BUILD_BRIDGE
  402. m_oscData = m_osc.getControlData();
  403. if (strcmp(clientName, "Carla") != 0)
  404. carla_setprocname(clientName);
  405. #endif
  406. m_thread.startNow();
  407. return true;
  408. }
  409. bool CarlaEngine::close()
  410. {
  411. qDebug("CarlaEngine::close()");
  412. m_aboutToClose = true;
  413. m_thread.stopNow();
  414. #ifndef BUILD_BRIDGE
  415. osc_send_control_exit();
  416. #endif
  417. m_osc.close();
  418. m_oscData = nullptr;
  419. m_maxPluginNumber = 0;
  420. name.clear();
  421. return true;
  422. }
  423. // -----------------------------------------------------------------------
  424. // Plugin management
  425. short CarlaEngine::getNewPluginId() const
  426. {
  427. qDebug("CarlaEngine::getNewPluginId()");
  428. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  429. {
  430. if (! m_carlaPlugins[i])
  431. return i;
  432. }
  433. return -1;
  434. }
  435. CarlaPlugin* CarlaEngine::getPlugin(const unsigned short id) const
  436. {
  437. qDebug("CarlaEngine::getPlugin(%i/%i)", id, m_maxPluginNumber);
  438. CARLA_ASSERT(m_maxPluginNumber != 0);
  439. CARLA_ASSERT(id < m_maxPluginNumber);
  440. if (id < m_maxPluginNumber)
  441. return m_carlaPlugins[id];
  442. return nullptr;
  443. }
  444. CarlaPlugin* CarlaEngine::getPluginUnchecked(const unsigned short id) const
  445. {
  446. CARLA_ASSERT(m_maxPluginNumber != 0);
  447. CARLA_ASSERT(id < m_maxPluginNumber);
  448. return m_carlaPlugins[id];
  449. }
  450. const char* CarlaEngine::getUniquePluginName(const char* const name)
  451. {
  452. qDebug("CarlaEngine::getUniquePluginName(\"%s\")", name);
  453. CARLA_ASSERT(name);
  454. CarlaString sname(name);
  455. if (sname.isEmpty())
  456. sname = "(No name)";
  457. sname.truncate(maxClientNameSize()-5-1); // 5 = strlen(" (10)")
  458. sname.replace(':', '.'); // ':' is used in JACK1 to split client/port names
  459. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  460. {
  461. // Check if unique name already exists
  462. if (m_uniqueNames[i] && sname == m_uniqueNames[i])
  463. {
  464. // Check if string has already been modified
  465. size_t len = sname.length();
  466. // 1 digit, ex: " (2)"
  467. if (sname[len-4] == ' ' && sname[len-3] == '(' && sname.isDigit(len-2) && sname[len-1] == ')')
  468. {
  469. int number = sname[len-2]-'0';
  470. if (number == 9)
  471. {
  472. // next number is 10, 2 digits
  473. sname.truncate(len-4);
  474. sname += " (10)";
  475. //sname.replace(" (9)", " (10)");
  476. }
  477. else
  478. sname[len-2] = '0'+number+1;
  479. continue;
  480. }
  481. // 2 digits, ex: " (11)"
  482. if (sname[len-5] == ' ' && sname[len-4] == '(' && sname.isDigit(len-3) && sname.isDigit(len-2) && sname[len-1] == ')')
  483. {
  484. char n2 = sname[len-2];
  485. char n3 = sname[len-3];
  486. if (n2 == '9')
  487. {
  488. n2 = '0';
  489. n3 = n3+1;
  490. }
  491. else
  492. n2 = n2+1;
  493. sname[len-2] = n2;
  494. sname[len-3] = n3;
  495. continue;
  496. }
  497. // Modify string if not
  498. sname += " (2)";
  499. }
  500. }
  501. return strdup(sname);
  502. }
  503. short CarlaEngine::addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra)
  504. {
  505. return addPlugin(BINARY_NATIVE, ptype, filename, name, label, extra);
  506. }
  507. short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra)
  508. {
  509. qDebug("CarlaEngine::addPlugin(%s, %s, \"%s\", \"%s\", \"%s\", %p)", BinaryType2Str(btype), PluginType2Str(ptype), filename, name, label, extra);
  510. CARLA_ASSERT(btype != BINARY_NONE);
  511. CARLA_ASSERT(ptype != PLUGIN_NONE);
  512. CARLA_ASSERT(filename);
  513. CARLA_ASSERT(label);
  514. if (m_maxPluginNumber == 0)
  515. {
  516. #ifdef BUILD_BRIDGE
  517. m_maxPluginNumber = MAX_PLUGINS;
  518. #else
  519. m_maxPluginNumber = (options.processMode == PROCESS_MODE_CONTINUOUS_RACK) ? 16 : MAX_PLUGINS;
  520. #endif
  521. }
  522. CarlaPlugin::initializer init = {
  523. this,
  524. filename,
  525. name,
  526. label
  527. };
  528. CarlaPlugin* plugin = nullptr;
  529. #ifndef BUILD_BRIDGE
  530. if (btype != BINARY_NATIVE || (options.preferPluginBridges && extra /* extra = bridgeBinary */ && type() == CarlaEngineTypeJack))
  531. {
  532. # ifdef CARLA_ENGINE_JACK
  533. if (options.processMode != CarlaBackend::PROCESS_MODE_MULTIPLE_CLIENTS)
  534. {
  535. setLastError("Can only use bridged plugins in JACK Multi-Client mode");
  536. return -1;
  537. }
  538. # endif
  539. if (type() != CarlaEngineTypeJack)
  540. {
  541. setLastError("Can only use bridged plugins with JACK backend");
  542. return -1;
  543. }
  544. plugin = CarlaPlugin::newBridge(init, btype, ptype, extra);
  545. }
  546. else
  547. #endif
  548. {
  549. switch (ptype)
  550. {
  551. case PLUGIN_NONE:
  552. break;
  553. #ifndef BUILD_BRIDGE
  554. case PLUGIN_INTERNAL:
  555. plugin = CarlaPlugin::newNative(init);
  556. break;
  557. #endif
  558. case PLUGIN_LADSPA:
  559. plugin = CarlaPlugin::newLADSPA(init, extra);
  560. break;
  561. case PLUGIN_DSSI:
  562. plugin = CarlaPlugin::newDSSI(init, extra);
  563. break;
  564. case PLUGIN_LV2:
  565. plugin = CarlaPlugin::newLV2(init);
  566. break;
  567. case PLUGIN_VST:
  568. plugin = CarlaPlugin::newVST(init);
  569. break;
  570. #ifndef BUILD_BRIDGE
  571. case PLUGIN_GIG:
  572. plugin = CarlaPlugin::newGIG(init);
  573. break;
  574. case PLUGIN_SF2:
  575. plugin = CarlaPlugin::newSF2(init);
  576. break;
  577. case PLUGIN_SFZ:
  578. plugin = CarlaPlugin::newSFZ(init);
  579. break;
  580. #else
  581. default:
  582. break;
  583. #endif
  584. }
  585. }
  586. if (! plugin)
  587. return -1;
  588. const short id = plugin->id();
  589. m_carlaPlugins[id] = plugin;
  590. m_uniqueNames[id] = plugin->name();
  591. return id;
  592. }
  593. bool CarlaEngine::removePlugin(const unsigned short id)
  594. {
  595. qDebug("CarlaEngine::removePlugin(%i)", id);
  596. CARLA_ASSERT(m_maxPluginNumber != 0);
  597. CARLA_ASSERT(id < m_maxPluginNumber);
  598. CarlaPlugin* const plugin = m_carlaPlugins[id];
  599. if (plugin /*&& plugin->id() == id*/)
  600. {
  601. CARLA_ASSERT(plugin->id() == id);
  602. m_thread.stopNow();
  603. processLock();
  604. plugin->setEnabled(false);
  605. m_carlaPlugins[id] = nullptr;
  606. m_uniqueNames[id] = nullptr;
  607. processUnlock();
  608. delete plugin;
  609. #ifndef BUILD_BRIDGE
  610. osc_send_control_remove_plugin(id);
  611. if (options.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  612. {
  613. // TODO - handle OSC server comm
  614. for (unsigned short i=id; i < m_maxPluginNumber-1; i++)
  615. {
  616. m_carlaPlugins[i] = m_carlaPlugins[i+1];
  617. m_uniqueNames[i] = m_uniqueNames[i+1];
  618. if (m_carlaPlugins[i])
  619. m_carlaPlugins[i]->setId(i);
  620. }
  621. }
  622. #endif
  623. if (isRunning() && ! m_aboutToClose)
  624. m_thread.startNow();
  625. return true;
  626. }
  627. qCritical("CarlaEngine::removePlugin(%i) - could not find plugin", id);
  628. setLastError("Could not find plugin to remove");
  629. return false;
  630. }
  631. void CarlaEngine::removeAllPlugins()
  632. {
  633. qDebug("CarlaEngine::removeAllPlugins()");
  634. m_thread.stopNow();
  635. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  636. {
  637. CarlaPlugin* const plugin = m_carlaPlugins[i];
  638. if (plugin)
  639. {
  640. processLock();
  641. plugin->setEnabled(false);
  642. processUnlock();
  643. delete plugin;
  644. m_carlaPlugins[i] = nullptr;
  645. m_uniqueNames[i] = nullptr;
  646. }
  647. }
  648. m_maxPluginNumber = 0;
  649. if (isRunning() && ! m_aboutToClose)
  650. m_thread.startNow();
  651. }
  652. void CarlaEngine::idlePluginGuis()
  653. {
  654. CARLA_ASSERT(m_maxPluginNumber != 0);
  655. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  656. {
  657. CarlaPlugin* const plugin = m_carlaPlugins[i];
  658. if (plugin && plugin->enabled())
  659. plugin->idleGui();
  660. }
  661. }
  662. #ifndef BUILD_BRIDGE
  663. void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t frames)
  664. {
  665. // initialize outputs (zero)
  666. carla_zeroF(outBuf[0], frames);
  667. carla_zeroF(outBuf[1], frames);
  668. memset(rackControlEventsOut, 0, sizeof(CarlaEngineControlEvent)*MAX_CONTROL_EVENTS);
  669. memset(rackMidiEventsOut, 0, sizeof(CarlaEngineMidiEvent)*MAX_MIDI_EVENTS);
  670. bool processed = false;
  671. // process plugins
  672. for (unsigned short i=0, max=maxPluginNumber(); i < max; i++)
  673. {
  674. CarlaPlugin* const plugin = getPluginUnchecked(i);
  675. if (plugin && plugin->enabled())
  676. {
  677. if (processed)
  678. {
  679. // initialize inputs (from previous outputs)
  680. memcpy(inBuf[0], outBuf[0], sizeof(float)*frames);
  681. memcpy(inBuf[1], outBuf[1], sizeof(float)*frames);
  682. memcpy(rackMidiEventsIn, rackMidiEventsOut, sizeof(CarlaEngineMidiEvent)*MAX_MIDI_EVENTS);
  683. // initialize outputs (zero)
  684. carla_zeroF(outBuf[0], frames);
  685. carla_zeroF(outBuf[1], frames);
  686. memset(rackMidiEventsOut, 0, sizeof(CarlaEngineMidiEvent)*MAX_MIDI_EVENTS);
  687. }
  688. // process
  689. processLock();
  690. plugin->initBuffers();
  691. if (plugin->m_processHighPrecision)
  692. {
  693. float* inBuf2[2];
  694. float* outBuf2[2];
  695. for (uint32_t j=0; j < frames; j += 8)
  696. {
  697. inBuf2[0] = inBuf[0] + j;
  698. inBuf2[1] = inBuf[1] + j;
  699. outBuf2[0] = outBuf[0] + j;
  700. outBuf2[1] = outBuf[1] + j;
  701. plugin->process(inBuf2, outBuf2, 8, j);
  702. }
  703. }
  704. else
  705. plugin->process(inBuf, outBuf, frames);
  706. processUnlock();
  707. // if plugin has no audio inputs, add previous buffers
  708. if (plugin->audioInCount() == 0)
  709. {
  710. for (uint32_t j=0; j < frames; j++)
  711. {
  712. outBuf[0][j] += inBuf[0][j];
  713. outBuf[1][j] += inBuf[1][j];
  714. }
  715. }
  716. // if plugin has no midi output, add previous midi input
  717. if (plugin->midiOutCount() == 0)
  718. {
  719. memcpy(rackMidiEventsOut, rackMidiEventsIn, sizeof(CarlaEngineMidiEvent)*MAX_MIDI_EVENTS);
  720. }
  721. // set peaks
  722. {
  723. double inPeak1 = 0.0;
  724. double inPeak2 = 0.0;
  725. double outPeak1 = 0.0;
  726. double outPeak2 = 0.0;
  727. for (uint32_t k=0; k < frames; k++)
  728. {
  729. if (std::abs(inBuf[0][k]) > inPeak1)
  730. inPeak1 = std::abs(inBuf[0][k]);
  731. if (std::abs(inBuf[1][k]) > inPeak2)
  732. inPeak2 = std::abs(inBuf[1][k]);
  733. if (std::abs(outBuf[0][k]) > outPeak1)
  734. outPeak1 = std::abs(outBuf[0][k]);
  735. if (std::abs(outBuf[1][k]) > outPeak2)
  736. outPeak2 = std::abs(outBuf[1][k]);
  737. }
  738. m_insPeak[i*MAX_PEAKS + 0] = inPeak1;
  739. m_insPeak[i*MAX_PEAKS + 1] = inPeak2;
  740. m_outsPeak[i*MAX_PEAKS + 0] = outPeak1;
  741. m_outsPeak[i*MAX_PEAKS + 1] = outPeak2;
  742. }
  743. processed = true;
  744. }
  745. }
  746. // if no plugins in the rack, copy inputs over outputs
  747. if (! processed)
  748. {
  749. memcpy(outBuf[0], inBuf[0], sizeof(float)*frames);
  750. memcpy(outBuf[1], inBuf[1], sizeof(float)*frames);
  751. memcpy(rackMidiEventsOut, rackMidiEventsIn, sizeof(CarlaEngineMidiEvent)*MAX_MIDI_EVENTS);
  752. }
  753. }
  754. #endif
  755. // -----------------------------------------------------------------------
  756. // Information (base)
  757. const char* CarlaEngine::getName() const
  758. {
  759. CARLA_ASSERT(name);
  760. return name;
  761. }
  762. double CarlaEngine::getSampleRate() const
  763. {
  764. CARLA_ASSERT(sampleRate != 0.0);
  765. return sampleRate;
  766. }
  767. uint32_t CarlaEngine::getBufferSize() const
  768. {
  769. CARLA_ASSERT(bufferSize != 0);
  770. return bufferSize;
  771. }
  772. const CarlaEngineTimeInfo* CarlaEngine::getTimeInfo() const
  773. {
  774. return &timeInfo;
  775. }
  776. void CarlaEngine::aboutToClose()
  777. {
  778. qDebug("CarlaEngine::aboutToClose()");
  779. m_aboutToClose = true;
  780. }
  781. // -----------------------------------------------------------------------
  782. // Information (audio peaks)
  783. double CarlaEngine::getInputPeak(const unsigned short pluginId, const unsigned short id) const
  784. {
  785. CARLA_ASSERT(pluginId < m_maxPluginNumber);
  786. CARLA_ASSERT(id < MAX_PEAKS);
  787. return m_insPeak[pluginId*MAX_PEAKS + id];
  788. }
  789. double CarlaEngine::getOutputPeak(const unsigned short pluginId, const unsigned short id) const
  790. {
  791. CARLA_ASSERT(pluginId < m_maxPluginNumber);
  792. CARLA_ASSERT(id < MAX_PEAKS);
  793. return m_outsPeak[pluginId*MAX_PEAKS + id];
  794. }
  795. void CarlaEngine::setInputPeak(const unsigned short pluginId, const unsigned short id, double value)
  796. {
  797. CARLA_ASSERT(pluginId < m_maxPluginNumber);
  798. CARLA_ASSERT(id < MAX_PEAKS);
  799. m_insPeak[pluginId*MAX_PEAKS + id] = value;
  800. }
  801. void CarlaEngine::setOutputPeak(const unsigned short pluginId, const unsigned short id, double value)
  802. {
  803. CARLA_ASSERT(pluginId < m_maxPluginNumber);
  804. CARLA_ASSERT(id < MAX_PEAKS);
  805. m_outsPeak[pluginId*MAX_PEAKS + id] = value;
  806. }
  807. // -----------------------------------------------------------------------
  808. // Callback
  809. void CarlaEngine::callback(const CallbackType action, const unsigned short pluginId, const int value1, const int value2, const double value3, const char* const valueStr)
  810. {
  811. qDebug("CarlaEngine::callback(%s, %i, %i, %i, %f, \"%s\")", CallbackType2Str(action), pluginId, value1, value2, value3, valueStr);
  812. if (m_callback)
  813. m_callback(m_callbackPtr, action, pluginId, value1, value2, value3, valueStr);
  814. }
  815. void CarlaEngine::setCallback(const CallbackFunc func, void* const ptr)
  816. {
  817. qDebug("CarlaEngine::setCallback(%p, %p)", func, ptr);
  818. CARLA_ASSERT(func);
  819. m_callback = func;
  820. m_callbackPtr = ptr;
  821. }
  822. // -----------------------------------------------------------------------
  823. // Error handling
  824. const char* CarlaEngine::getLastError() const
  825. {
  826. return m_lastError;
  827. }
  828. void CarlaEngine::setLastError(const char* const error)
  829. {
  830. m_lastError = error;
  831. }
  832. // -----------------------------------------------------------------------
  833. // Global options
  834. #ifndef BUILD_BRIDGE
  835. #define CARLA_ENGINE_SET_OPTION_RUNNING_CHECK \
  836. if (isRunning()) \
  837. return qCritical("CarlaEngine::setOption(%s, %i, \"%s\") - Cannot set this option while engine is running!", OptionsType2Str(option), value, valueStr);
  838. void CarlaEngine::setOption(const OptionsType option, const int value, const char* const valueStr)
  839. {
  840. qDebug("CarlaEngine::setOption(%s, %i, \"%s\")", OptionsType2Str(option), value, valueStr);
  841. switch (option)
  842. {
  843. case OPTION_PROCESS_NAME:
  844. carla_setprocname(valueStr);
  845. break;
  846. case OPTION_PROCESS_MODE:
  847. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  848. if (value < PROCESS_MODE_SINGLE_CLIENT || value > PROCESS_MODE_PATCHBAY)
  849. return qCritical("CarlaEngine::setOption(%s, %i, \"%s\") - invalid value", OptionsType2Str(option), value, valueStr);
  850. options.processMode = static_cast<ProcessMode>(value);
  851. break;
  852. case OPTION_PROCESS_HIGH_PRECISION:
  853. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  854. options.processHighPrecision = value;
  855. break;
  856. case OPTION_MAX_PARAMETERS:
  857. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  858. options.maxParameters = (value > 0) ? value : MAX_PARAMETERS;
  859. break;
  860. case OPTION_PREFERRED_BUFFER_SIZE:
  861. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  862. options.preferredBufferSize = value;
  863. break;
  864. case OPTION_PREFERRED_SAMPLE_RATE:
  865. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  866. options.preferredSampleRate = value;
  867. break;
  868. case OPTION_FORCE_STEREO:
  869. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  870. options.forceStereo = value;
  871. break;
  872. case OPTION_USE_DSSI_VST_CHUNKS:
  873. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  874. options.useDssiVstChunks = value;
  875. break;
  876. case OPTION_PREFER_PLUGIN_BRIDGES:
  877. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  878. options.preferPluginBridges = value;
  879. break;
  880. case OPTION_PREFER_UI_BRIDGES:
  881. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  882. options.preferUiBridges = value;
  883. break;
  884. case OPTION_OSC_UI_TIMEOUT:
  885. CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
  886. options.oscUiTimeout = value;
  887. break;
  888. case OPTION_PATH_BRIDGE_POSIX32:
  889. options.bridge_posix32 = valueStr;
  890. break;
  891. case OPTION_PATH_BRIDGE_POSIX64:
  892. options.bridge_posix64 = valueStr;
  893. break;
  894. case OPTION_PATH_BRIDGE_WIN32:
  895. options.bridge_win32 = valueStr;
  896. break;
  897. case OPTION_PATH_BRIDGE_WIN64:
  898. options.bridge_win64 = valueStr;
  899. break;
  900. case OPTION_PATH_BRIDGE_LV2_GTK2:
  901. options.bridge_lv2gtk2 = valueStr;
  902. break;
  903. case OPTION_PATH_BRIDGE_LV2_GTK3:
  904. options.bridge_lv2gtk3 = valueStr;
  905. break;
  906. case OPTION_PATH_BRIDGE_LV2_QT4:
  907. options.bridge_lv2qt4 = valueStr;
  908. break;
  909. case OPTION_PATH_BRIDGE_LV2_QT5:
  910. options.bridge_lv2qt5 = valueStr;
  911. break;
  912. case OPTION_PATH_BRIDGE_LV2_COCOA:
  913. options.bridge_lv2cocoa = valueStr;
  914. break;
  915. case OPTION_PATH_BRIDGE_LV2_WINDOWS:
  916. options.bridge_lv2win = valueStr;
  917. break;
  918. case OPTION_PATH_BRIDGE_LV2_X11:
  919. options.bridge_lv2x11 = valueStr;
  920. break;
  921. case OPTION_PATH_BRIDGE_VST_COCOA:
  922. options.bridge_vstcocoa = valueStr;
  923. break;
  924. case OPTION_PATH_BRIDGE_VST_HWND:
  925. options.bridge_vsthwnd = valueStr;
  926. break;
  927. case OPTION_PATH_BRIDGE_VST_X11:
  928. options.bridge_vstx11 = valueStr;
  929. break;
  930. }
  931. }
  932. #endif
  933. // -----------------------------------------------------------------------
  934. // Mutex locks
  935. void CarlaEngine::processLock()
  936. {
  937. m_procLock.lock();
  938. }
  939. void CarlaEngine::processTryLock()
  940. {
  941. m_procLock.tryLock();
  942. }
  943. void CarlaEngine::processUnlock()
  944. {
  945. m_procLock.unlock();
  946. }
  947. void CarlaEngine::midiLock()
  948. {
  949. m_midiLock.lock();
  950. }
  951. void CarlaEngine::midiTryLock()
  952. {
  953. m_midiLock.tryLock();
  954. }
  955. void CarlaEngine::midiUnlock()
  956. {
  957. m_midiLock.unlock();
  958. }
  959. // -----------------------------------------------------------------------
  960. // OSC Stuff
  961. #ifndef BUILD_BRIDGE
  962. bool CarlaEngine::isOscControlRegistered() const
  963. {
  964. return m_osc.isControlRegistered();
  965. }
  966. #else
  967. bool CarlaEngine::isOscBridgeRegistered() const
  968. {
  969. return bool(m_oscData);
  970. }
  971. #endif
  972. void CarlaEngine::idleOsc()
  973. {
  974. m_osc.idle();
  975. }
  976. const char* CarlaEngine::getOscServerPathTCP() const
  977. {
  978. return m_osc.getServerPathTCP();
  979. }
  980. const char* CarlaEngine::getOscServerPathUDP() const
  981. {
  982. return m_osc.getServerPathUDP();
  983. }
  984. #ifdef BUILD_BRIDGE
  985. void CarlaEngine::setOscBridgeData(const CarlaOscData* const oscData)
  986. {
  987. m_oscData = oscData;
  988. }
  989. #endif
  990. // -----------------------------------------------------------------------
  991. // protected calls
  992. void CarlaEngine::bufferSizeChanged(const uint32_t newBufferSize)
  993. {
  994. qDebug("CarlaEngine::bufferSizeChanged(%i)", newBufferSize);
  995. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  996. {
  997. if (m_carlaPlugins[i] && m_carlaPlugins[i]->enabled() && ! m_carlaPlugins[i]->m_processHighPrecision)
  998. m_carlaPlugins[i]->bufferSizeChanged(newBufferSize);
  999. }
  1000. }
  1001. // -------------------------------------------------------------------------------------------------------------------
  1002. // Carla Engine OSC stuff
  1003. #ifdef BUILD_BRIDGE
  1004. void CarlaEngine::osc_send_peaks(CarlaPlugin* const plugin)
  1005. #else
  1006. void CarlaEngine::osc_send_peaks(CarlaPlugin* const plugin, const unsigned short& id)
  1007. #endif
  1008. {
  1009. // Peak values
  1010. if (plugin->audioInCount() > 0)
  1011. {
  1012. #ifdef BUILD_BRIDGE
  1013. osc_send_bridge_set_inpeak(1);
  1014. osc_send_bridge_set_inpeak(2);
  1015. #else
  1016. osc_send_control_set_input_peak_value(id, 1);
  1017. osc_send_control_set_input_peak_value(id, 2);
  1018. #endif
  1019. }
  1020. if (plugin->audioOutCount() > 0)
  1021. {
  1022. #ifdef BUILD_BRIDGE
  1023. osc_send_bridge_set_outpeak(1);
  1024. osc_send_bridge_set_outpeak(2);
  1025. #else
  1026. osc_send_control_set_output_peak_value(id, 1);
  1027. osc_send_control_set_output_peak_value(id, 2);
  1028. #endif
  1029. }
  1030. }
  1031. #ifndef BUILD_BRIDGE
  1032. void CarlaEngine::osc_send_control_add_plugin_start(const int32_t pluginId, const char* const pluginName)
  1033. {
  1034. qDebug("CarlaEngine::osc_send_control_add_plugin_start(%i, \"%s\")", pluginId, pluginName);
  1035. CARLA_ASSERT(m_oscData);
  1036. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1037. CARLA_ASSERT(pluginName);
  1038. if (m_oscData && m_oscData->target)
  1039. {
  1040. char target_path[strlen(m_oscData->path)+18];
  1041. strcpy(target_path, m_oscData->path);
  1042. strcat(target_path, "/add_plugin_start");
  1043. lo_send(m_oscData->target, target_path, "is", pluginId, pluginName);
  1044. }
  1045. }
  1046. void CarlaEngine::osc_send_control_add_plugin_end(const int32_t pluginId)
  1047. {
  1048. qDebug("CarlaEngine::osc_send_control_add_plugin_end(%i)", pluginId);
  1049. CARLA_ASSERT(m_oscData);
  1050. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1051. if (m_oscData && m_oscData->target)
  1052. {
  1053. char target_path[strlen(m_oscData->path)+16];
  1054. strcpy(target_path, m_oscData->path);
  1055. strcat(target_path, "/add_plugin_end");
  1056. lo_send(m_oscData->target, target_path, "i", pluginId);
  1057. }
  1058. }
  1059. void CarlaEngine::osc_send_control_remove_plugin(const int32_t pluginId)
  1060. {
  1061. qDebug("CarlaEngine::osc_send_control_remove_plugin(%i)", pluginId);
  1062. CARLA_ASSERT(m_oscData);
  1063. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1064. if (m_oscData && m_oscData->target)
  1065. {
  1066. char target_path[strlen(m_oscData->path)+15];
  1067. strcpy(target_path, m_oscData->path);
  1068. strcat(target_path, "/remove_plugin");
  1069. lo_send(m_oscData->target, target_path, "i", pluginId);
  1070. }
  1071. }
  1072. 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)
  1073. {
  1074. qDebug("CarlaEngine::osc_send_control_set_plugin_data(%i, %i, %i, %i, \"%s\", \"%s\", \"%s\", \"%s\", " P_INT64 ")", pluginId, type, category, hints, realName, label, maker, copyright, uniqueId);
  1075. CARLA_ASSERT(m_oscData);
  1076. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1077. CARLA_ASSERT(type != PLUGIN_NONE);
  1078. if (m_oscData && m_oscData->target)
  1079. {
  1080. char target_path[strlen(m_oscData->path)+17];
  1081. strcpy(target_path, m_oscData->path);
  1082. strcat(target_path, "/set_plugin_data");
  1083. lo_send(m_oscData->target, target_path, "iiiissssh", pluginId, type, category, hints, realName, label, maker, copyright, uniqueId);
  1084. }
  1085. }
  1086. 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)
  1087. {
  1088. qDebug("CarlaEngine::osc_send_control_set_plugin_ports(%i, %i, %i, %i, %i, %i, %i, %i)", pluginId, audioIns, audioOuts, midiIns, midiOuts, cIns, cOuts, cTotals);
  1089. CARLA_ASSERT(m_oscData);
  1090. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1091. if (m_oscData && m_oscData->target)
  1092. {
  1093. char target_path[strlen(m_oscData->path)+18];
  1094. strcpy(target_path, m_oscData->path);
  1095. strcat(target_path, "/set_plugin_ports");
  1096. lo_send(m_oscData->target, target_path, "iiiiiiii", pluginId, audioIns, audioOuts, midiIns, midiOuts, cIns, cOuts, cTotals);
  1097. }
  1098. }
  1099. 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)
  1100. {
  1101. qDebug("CarlaEngine::osc_send_control_set_parameter_data(%i, %i, %i, %i, \"%s\", \"%s\", %g)", pluginId, index, type, hints, name, label, current);
  1102. CARLA_ASSERT(m_oscData);
  1103. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1104. CARLA_ASSERT(index >= 0);
  1105. CARLA_ASSERT(type != PARAMETER_UNKNOWN);
  1106. if (m_oscData && m_oscData->target)
  1107. {
  1108. char target_path[strlen(m_oscData->path)+20];
  1109. strcpy(target_path, m_oscData->path);
  1110. strcat(target_path, "/set_parameter_data");
  1111. lo_send(m_oscData->target, target_path, "iiiissd", pluginId, index, type, hints, name, label, current);
  1112. }
  1113. }
  1114. 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)
  1115. {
  1116. qDebug("CarlaEngine::osc_send_control_set_parameter_ranges(%i, %i, %g, %g, %g, %g, %g, %g)", pluginId, index, min, max, def, step, stepSmall, stepLarge);
  1117. CARLA_ASSERT(m_oscData);
  1118. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1119. CARLA_ASSERT(index >= 0);
  1120. CARLA_ASSERT(min < max);
  1121. if (m_oscData && m_oscData->target)
  1122. {
  1123. char target_path[strlen(m_oscData->path)+22];
  1124. strcpy(target_path, m_oscData->path);
  1125. strcat(target_path, "/set_parameter_ranges");
  1126. lo_send(m_oscData->target, target_path, "iidddddd", pluginId, index, min, max, def, step, stepSmall, stepLarge);
  1127. }
  1128. }
  1129. void CarlaEngine::osc_send_control_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc)
  1130. {
  1131. qDebug("CarlaEngine::osc_send_control_set_parameter_midi_cc(%i, %i, %i)", pluginId, index, cc);
  1132. CARLA_ASSERT(m_oscData);
  1133. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1134. CARLA_ASSERT(index >= 0);
  1135. if (m_oscData && m_oscData->target)
  1136. {
  1137. char target_path[strlen(m_oscData->path)+23];
  1138. strcpy(target_path, m_oscData->path);
  1139. strcat(target_path, "/set_parameter_midi_cc");
  1140. lo_send(m_oscData->target, target_path, "iii", pluginId, index, cc);
  1141. }
  1142. }
  1143. void CarlaEngine::osc_send_control_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel)
  1144. {
  1145. qDebug("CarlaEngine::osc_send_control_set_parameter_midi_channel(%i, %i, %i)", pluginId, index, channel);
  1146. CARLA_ASSERT(m_oscData);
  1147. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1148. CARLA_ASSERT(index >= 0);
  1149. CARLA_ASSERT(channel >= 0 && channel < 16);
  1150. if (m_oscData && m_oscData->target)
  1151. {
  1152. char target_path[strlen(m_oscData->path)+28];
  1153. strcpy(target_path, m_oscData->path);
  1154. strcat(target_path, "/set_parameter_midi_channel");
  1155. lo_send(m_oscData->target, target_path, "iii", pluginId, index, channel);
  1156. }
  1157. }
  1158. void CarlaEngine::osc_send_control_set_parameter_value(const int32_t pluginId, const int32_t index, const double value)
  1159. {
  1160. #if DEBUG
  1161. if (index < 0)
  1162. qDebug("CarlaEngine::osc_send_control_set_parameter_value(%i, %s, %g)", pluginId, InternalParametersIndex2Str((InternalParametersIndex)index), value);
  1163. else
  1164. qDebug("CarlaEngine::osc_send_control_set_parameter_value(%i, %i, %g)", pluginId, index, value);
  1165. #endif
  1166. CARLA_ASSERT(m_oscData);
  1167. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1168. if (m_oscData && m_oscData->target)
  1169. {
  1170. char target_path[strlen(m_oscData->path)+21];
  1171. strcpy(target_path, m_oscData->path);
  1172. strcat(target_path, "/set_parameter_value");
  1173. lo_send(m_oscData->target, target_path, "iid", pluginId, index, value);
  1174. }
  1175. }
  1176. void CarlaEngine::osc_send_control_set_default_value(const int32_t pluginId, const int32_t index, const double value)
  1177. {
  1178. qDebug("CarlaEngine::osc_send_control_set_default_value(%i, %i, %g)", pluginId, index, value);
  1179. CARLA_ASSERT(m_oscData);
  1180. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1181. CARLA_ASSERT(index >= 0);
  1182. if (m_oscData && m_oscData->target)
  1183. {
  1184. char target_path[strlen(m_oscData->path)+19];
  1185. strcpy(target_path, m_oscData->path);
  1186. strcat(target_path, "/set_default_value");
  1187. lo_send(m_oscData->target, target_path, "iid", pluginId, index, value);
  1188. }
  1189. }
  1190. void CarlaEngine::osc_send_control_set_program(const int32_t pluginId, const int32_t index)
  1191. {
  1192. qDebug("CarlaEngine::osc_send_control_set_program(%i, %i)", pluginId, index);
  1193. CARLA_ASSERT(m_oscData);
  1194. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1195. if (m_oscData && m_oscData->target)
  1196. {
  1197. char target_path[strlen(m_oscData->path)+13];
  1198. strcpy(target_path, m_oscData->path);
  1199. strcat(target_path, "/set_program");
  1200. lo_send(m_oscData->target, target_path, "ii", pluginId, index);
  1201. }
  1202. }
  1203. void CarlaEngine::osc_send_control_set_program_count(const int32_t pluginId, const int32_t count)
  1204. {
  1205. qDebug("CarlaEngine::osc_send_control_set_program_count(%i, %i)", pluginId, count);
  1206. CARLA_ASSERT(m_oscData);
  1207. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1208. CARLA_ASSERT(count >= 0);
  1209. if (m_oscData && m_oscData->target)
  1210. {
  1211. char target_path[strlen(m_oscData->path)+19];
  1212. strcpy(target_path, m_oscData->path);
  1213. strcat(target_path, "/set_program_count");
  1214. lo_send(m_oscData->target, target_path, "ii", pluginId, count);
  1215. }
  1216. }
  1217. void CarlaEngine::osc_send_control_set_program_name(const int32_t pluginId, const int32_t index, const char* const name)
  1218. {
  1219. qDebug("CarlaEngine::osc_send_control_set_program_name(%i, %i, \"%s\")", pluginId, index, name);
  1220. CARLA_ASSERT(m_oscData);
  1221. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1222. CARLA_ASSERT(index >= 0);
  1223. CARLA_ASSERT(name);
  1224. if (m_oscData && m_oscData->target)
  1225. {
  1226. char target_path[strlen(m_oscData->path)+18];
  1227. strcpy(target_path, m_oscData->path);
  1228. strcat(target_path, "/set_program_name");
  1229. lo_send(m_oscData->target, target_path, "iis", pluginId, index, name);
  1230. }
  1231. }
  1232. void CarlaEngine::osc_send_control_set_midi_program(const int32_t pluginId, const int32_t index)
  1233. {
  1234. qDebug("CarlaEngine::osc_send_control_set_midi_program(%i, %i)", pluginId, index);
  1235. CARLA_ASSERT(m_oscData);
  1236. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1237. if (m_oscData && m_oscData->target)
  1238. {
  1239. char target_path[strlen(m_oscData->path)+18];
  1240. strcpy(target_path, m_oscData->path);
  1241. strcat(target_path, "/set_midi_program");
  1242. lo_send(m_oscData->target, target_path, "ii", pluginId, index);
  1243. }
  1244. }
  1245. void CarlaEngine::osc_send_control_set_midi_program_count(const int32_t pluginId, const int32_t count)
  1246. {
  1247. qDebug("CarlaEngine::osc_send_control_set_midi_program_count(%i, %i)", pluginId, count);
  1248. CARLA_ASSERT(m_oscData);
  1249. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1250. CARLA_ASSERT(count >= 0);
  1251. if (m_oscData && m_oscData->target)
  1252. {
  1253. char target_path[strlen(m_oscData->path)+24];
  1254. strcpy(target_path, m_oscData->path);
  1255. strcat(target_path, "/set_midi_program_count");
  1256. lo_send(m_oscData->target, target_path, "ii", pluginId, count);
  1257. }
  1258. }
  1259. 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)
  1260. {
  1261. qDebug("CarlaEngine::osc_send_control_set_midi_program_data(%i, %i, %i, %i, \"%s\")", pluginId, index, bank, program, name);
  1262. CARLA_ASSERT(m_oscData);
  1263. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1264. CARLA_ASSERT(index >= 0);
  1265. CARLA_ASSERT(bank >= 0);
  1266. CARLA_ASSERT(program >= 0);
  1267. CARLA_ASSERT(name);
  1268. if (m_oscData && m_oscData->target)
  1269. {
  1270. char target_path[strlen(m_oscData->path)+23];
  1271. strcpy(target_path, m_oscData->path);
  1272. strcat(target_path, "/set_midi_program_data");
  1273. lo_send(m_oscData->target, target_path, "iiiis", pluginId, index, bank, program, name);
  1274. }
  1275. }
  1276. void CarlaEngine::osc_send_control_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo)
  1277. {
  1278. qDebug("CarlaEngine::osc_send_control_note_on(%i, %i, %i, %i)", pluginId, channel, note, velo);
  1279. CARLA_ASSERT(m_oscData);
  1280. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1281. CARLA_ASSERT(channel >= 0 && channel < 16);
  1282. CARLA_ASSERT(note >= 0 && note < 128);
  1283. CARLA_ASSERT(velo > 0 && velo < 128);
  1284. if (m_oscData && m_oscData->target)
  1285. {
  1286. char target_path[strlen(m_oscData->path)+9];
  1287. strcpy(target_path, m_oscData->path);
  1288. strcat(target_path, "/note_on");
  1289. lo_send(m_oscData->target, target_path, "iiii", pluginId, channel, note, velo);
  1290. }
  1291. }
  1292. void CarlaEngine::osc_send_control_note_off(const int32_t pluginId, const int32_t channel, const int32_t note)
  1293. {
  1294. qDebug("CarlaEngine::osc_send_control_note_off(%i, %i, %i)", pluginId, channel, note);
  1295. CARLA_ASSERT(m_oscData);
  1296. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1297. CARLA_ASSERT(channel >= 0 && channel < 16);
  1298. CARLA_ASSERT(note >= 0 && note < 128);
  1299. if (m_oscData && m_oscData->target)
  1300. {
  1301. char target_path[strlen(m_oscData->path)+10];
  1302. strcpy(target_path, m_oscData->path);
  1303. strcat(target_path, "/note_off");
  1304. lo_send(m_oscData->target, target_path, "iii", pluginId, channel, note);
  1305. }
  1306. }
  1307. void CarlaEngine::osc_send_control_set_input_peak_value(const int32_t pluginId, const int32_t portId)
  1308. {
  1309. //qDebug("CarlaEngine::osc_send_control_set_input_peak_value(%i, %i)", pluginId, portId);
  1310. CARLA_ASSERT(m_oscData);
  1311. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1312. CARLA_ASSERT(portId == 1 || portId == 2);
  1313. if (m_oscData && m_oscData->target)
  1314. {
  1315. char target_path[strlen(m_oscData->path)+22];
  1316. strcpy(target_path, m_oscData->path);
  1317. strcat(target_path, "/set_input_peak_value");
  1318. lo_send(m_oscData->target, target_path, "iid", pluginId, portId, m_insPeak[pluginId*MAX_PEAKS + portId-1]);
  1319. }
  1320. }
  1321. void CarlaEngine::osc_send_control_set_output_peak_value(const int32_t pluginId, const int32_t portId)
  1322. {
  1323. //qDebug("CarlaEngine::osc_send_control_set_output_peak_value(%i, %i)", pluginId, portId);
  1324. CARLA_ASSERT(m_oscData);
  1325. CARLA_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber);
  1326. CARLA_ASSERT(portId == 1 || portId == 2);
  1327. if (m_oscData && m_oscData->target)
  1328. {
  1329. char target_path[strlen(m_oscData->path)+23];
  1330. strcpy(target_path, m_oscData->path);
  1331. strcat(target_path, "/set_output_peak_value");
  1332. lo_send(m_oscData->target, target_path, "iid", pluginId, portId, m_outsPeak[pluginId*MAX_PEAKS + portId-1]);
  1333. }
  1334. }
  1335. void CarlaEngine::osc_send_control_exit()
  1336. {
  1337. qDebug("CarlaEngine::osc_send_control_exit()");
  1338. CARLA_ASSERT(m_oscData);
  1339. if (m_oscData && m_oscData->target)
  1340. {
  1341. char target_path[strlen(m_oscData->path)+6];
  1342. strcpy(target_path, m_oscData->path);
  1343. strcat(target_path, "/exit");
  1344. lo_send(m_oscData->target, target_path, "");
  1345. }
  1346. }
  1347. #else
  1348. void CarlaEngine::osc_send_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total)
  1349. {
  1350. qDebug("CarlaEngine::osc_send_bridge_audio_count(%i, %i, %i)", ins, outs, total);
  1351. CARLA_ASSERT(m_oscData);
  1352. CARLA_ASSERT(total >= 0 && total >= ins + outs);
  1353. if (m_oscData && m_oscData->target)
  1354. {
  1355. char target_path[strlen(m_oscData->path)+20];
  1356. strcpy(target_path, m_oscData->path);
  1357. strcat(target_path, "/bridge_audio_count");
  1358. lo_send(m_oscData->target, target_path, "iii", ins, outs, total);
  1359. }
  1360. }
  1361. void CarlaEngine::osc_send_bridge_midi_count(const int32_t ins, const int32_t outs, const int32_t total)
  1362. {
  1363. qDebug("CarlaEngine::osc_send_bridge_midi_count(%i, %i, %i)", ins, outs, total);
  1364. CARLA_ASSERT(m_oscData);
  1365. CARLA_ASSERT(total >= 0 && total >= ins + outs);
  1366. if (m_oscData && m_oscData->target)
  1367. {
  1368. char target_path[strlen(m_oscData->path)+19];
  1369. strcpy(target_path, m_oscData->path);
  1370. strcat(target_path, "/bridge_midi_count");
  1371. lo_send(m_oscData->target, target_path, "iii", ins, outs, total);
  1372. }
  1373. }
  1374. void CarlaEngine::osc_send_bridge_parameter_count(const int32_t ins, const int32_t outs, const int32_t total)
  1375. {
  1376. qDebug("CarlaEngine::osc_send_bridge_parameter_count(%i, %i, %i)", ins, outs, total);
  1377. CARLA_ASSERT(m_oscData);
  1378. CARLA_ASSERT(total >= 0 && total >= ins + outs);
  1379. if (m_oscData && m_oscData->target)
  1380. {
  1381. char target_path[strlen(m_oscData->path)+24];
  1382. strcpy(target_path, m_oscData->path);
  1383. strcat(target_path, "/bridge_parameter_count");
  1384. lo_send(m_oscData->target, target_path, "iii", ins, outs, total);
  1385. }
  1386. }
  1387. void CarlaEngine::osc_send_bridge_program_count(const int32_t count)
  1388. {
  1389. qDebug("CarlaEngine::osc_send_bridge_program_count(%i)", count);
  1390. CARLA_ASSERT(m_oscData);
  1391. CARLA_ASSERT(count >= 0);
  1392. if (m_oscData && m_oscData->target)
  1393. {
  1394. char target_path[strlen(m_oscData->path)+22];
  1395. strcpy(target_path, m_oscData->path);
  1396. strcat(target_path, "/bridge_program_count");
  1397. lo_send(m_oscData->target, target_path, "i", count);
  1398. }
  1399. }
  1400. void CarlaEngine::osc_send_bridge_midi_program_count(const int32_t count)
  1401. {
  1402. qDebug("CarlaEngine::osc_send_bridge_midi_program_count(%i)", count);
  1403. CARLA_ASSERT(m_oscData);
  1404. CARLA_ASSERT(count >= 0);
  1405. if (m_oscData && m_oscData->target)
  1406. {
  1407. char target_path[strlen(m_oscData->path)+27];
  1408. strcpy(target_path, m_oscData->path);
  1409. strcat(target_path, "/bridge_midi_program_count");
  1410. lo_send(m_oscData->target, target_path, "i", count);
  1411. }
  1412. }
  1413. 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)
  1414. {
  1415. qDebug("CarlaEngine::osc_send_bridge_plugin_info(%i, %i, \"%s\", \"%s\", \"%s\", \"%s\", " P_INT64 ")", category, hints, name, label, maker, copyright, uniqueId);
  1416. CARLA_ASSERT(m_oscData);
  1417. CARLA_ASSERT(name);
  1418. CARLA_ASSERT(label);
  1419. CARLA_ASSERT(maker);
  1420. CARLA_ASSERT(copyright);
  1421. if (m_oscData && m_oscData->target)
  1422. {
  1423. char target_path[strlen(m_oscData->path)+20];
  1424. strcpy(target_path, m_oscData->path);
  1425. strcat(target_path, "/bridge_plugin_info");
  1426. lo_send(m_oscData->target, target_path, "iissssh", category, hints, name, label, maker, copyright, uniqueId);
  1427. }
  1428. }
  1429. void CarlaEngine::osc_send_bridge_parameter_info(const int32_t index, const char* const name, const char* const unit)
  1430. {
  1431. qDebug("CarlaEngine::osc_send_bridge_parameter_info(%i, \"%s\", \"%s\")", index, name, unit);
  1432. CARLA_ASSERT(m_oscData);
  1433. CARLA_ASSERT(name);
  1434. CARLA_ASSERT(unit);
  1435. if (m_oscData && m_oscData->target)
  1436. {
  1437. char target_path[strlen(m_oscData->path)+23];
  1438. strcpy(target_path, m_oscData->path);
  1439. strcat(target_path, "/bridge_parameter_info");
  1440. lo_send(m_oscData->target, target_path, "iss", index, name, unit);
  1441. }
  1442. }
  1443. void CarlaEngine::osc_send_bridge_parameter_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)
  1444. {
  1445. qDebug("CarlaEngine::osc_send_bridge_parameter_data(%i, %i, %i, %i, %i, %i)", index, type, rindex, hints, midiChannel, midiCC);
  1446. CARLA_ASSERT(m_oscData);
  1447. if (m_oscData && m_oscData->target)
  1448. {
  1449. char target_path[strlen(m_oscData->path)+23];
  1450. strcpy(target_path, m_oscData->path);
  1451. strcat(target_path, "/bridge_parameter_data");
  1452. lo_send(m_oscData->target, target_path, "iiiiii", index, type, rindex, hints, midiChannel, midiCC);
  1453. }
  1454. }
  1455. void CarlaEngine::osc_send_bridge_parameter_ranges(const int32_t index, const double def, const double min, const double max, const double step, const double stepSmall, const double stepLarge)
  1456. {
  1457. qDebug("CarlaEngine::osc_send_bridge_parameter_ranges(%i, %g, %g, %g, %g, %g, %g)", index, def, min, max, step, stepSmall, stepLarge);
  1458. CARLA_ASSERT(m_oscData);
  1459. if (m_oscData && m_oscData->target)
  1460. {
  1461. char target_path[strlen(m_oscData->path)+25];
  1462. strcpy(target_path, m_oscData->path);
  1463. strcat(target_path, "/bridge_parameter_ranges");
  1464. lo_send(m_oscData->target, target_path, "idddddd", index, def, min, max, step, stepSmall, stepLarge);
  1465. }
  1466. }
  1467. void CarlaEngine::osc_send_bridge_program_info(const int32_t index, const char* const name)
  1468. {
  1469. qDebug("CarlaEngine::osc_send_bridge_program_info(%i, \"%s\")", index, name);
  1470. CARLA_ASSERT(m_oscData);
  1471. if (m_oscData && m_oscData->target)
  1472. {
  1473. char target_path[strlen(m_oscData->path)+21];
  1474. strcpy(target_path, m_oscData->path);
  1475. strcat(target_path, "/bridge_program_info");
  1476. lo_send(m_oscData->target, target_path, "is", index, name);
  1477. }
  1478. }
  1479. void CarlaEngine::osc_send_bridge_midi_program_info(const int32_t index, const int32_t bank, const int32_t program, const char* const label)
  1480. {
  1481. qDebug("CarlaEngine::osc_send_bridge_midi_program_info(%i, %i, %i, \"%s\")", index, bank, program, label);
  1482. CARLA_ASSERT(m_oscData);
  1483. if (m_oscData && m_oscData->target)
  1484. {
  1485. char target_path[strlen(m_oscData->path)+26];
  1486. strcpy(target_path, m_oscData->path);
  1487. strcat(target_path, "/bridge_midi_program_info");
  1488. lo_send(m_oscData->target, target_path, "iiis", index, bank, program, label);
  1489. }
  1490. }
  1491. void CarlaEngine::osc_send_bridge_configure(const char* const key, const char* const value)
  1492. {
  1493. qDebug("CarlaEngine::osc_send_bridge_configure(\"%s\", \"%s\")", key, value);
  1494. CARLA_ASSERT(m_oscData);
  1495. CARLA_ASSERT(key);
  1496. CARLA_ASSERT(value);
  1497. if (m_oscData && m_oscData->target)
  1498. {
  1499. char target_path[strlen(m_oscData->path)+18];
  1500. strcpy(target_path, m_oscData->path);
  1501. strcat(target_path, "/bridge_configure");
  1502. lo_send(m_oscData->target, target_path, "ss", key, value);
  1503. }
  1504. }
  1505. void CarlaEngine::osc_send_bridge_set_parameter_value(const int32_t index, const double value)
  1506. {
  1507. qDebug("CarlaEngine::osc_send_bridge_set_parameter_value(%i, %g)", index, value);
  1508. CARLA_ASSERT(m_oscData);
  1509. if (m_oscData && m_oscData->target)
  1510. {
  1511. char target_path[strlen(m_oscData->path)+28];
  1512. strcpy(target_path, m_oscData->path);
  1513. strcat(target_path, "/bridge_set_parameter_value");
  1514. lo_send(m_oscData->target, target_path, "id", index, value);
  1515. }
  1516. }
  1517. void CarlaEngine::osc_send_bridge_set_default_value(const int32_t index, const double value)
  1518. {
  1519. qDebug("CarlaEngine::osc_send_bridge_set_default_value(%i, %g)", index, value);
  1520. CARLA_ASSERT(m_oscData);
  1521. if (m_oscData && m_oscData->target)
  1522. {
  1523. char target_path[strlen(m_oscData->path)+26];
  1524. strcpy(target_path, m_oscData->path);
  1525. strcat(target_path, "/bridge_set_default_value");
  1526. lo_send(m_oscData->target, target_path, "id", index, value);
  1527. }
  1528. }
  1529. void CarlaEngine::osc_send_bridge_set_program(const int32_t index)
  1530. {
  1531. qDebug("CarlaEngine::osc_send_bridge_set_program(%i)", index);
  1532. CARLA_ASSERT(m_oscData);
  1533. if (m_oscData && m_oscData->target)
  1534. {
  1535. char target_path[strlen(m_oscData->path)+20];
  1536. strcpy(target_path, m_oscData->path);
  1537. strcat(target_path, "/bridge_set_program");
  1538. lo_send(m_oscData->target, target_path, "i", index);
  1539. }
  1540. }
  1541. void CarlaEngine::osc_send_bridge_set_midi_program(const int32_t index)
  1542. {
  1543. qDebug("CarlaEngine::osc_send_bridge_set_midi_program(%i)", index);
  1544. CARLA_ASSERT(m_oscData);
  1545. if (m_oscData && m_oscData->target)
  1546. {
  1547. char target_path[strlen(m_oscData->path)+25];
  1548. strcpy(target_path, m_oscData->path);
  1549. strcat(target_path, "/bridge_set_midi_program");
  1550. lo_send(m_oscData->target, target_path, "i", index);
  1551. }
  1552. }
  1553. void CarlaEngine::osc_send_bridge_set_custom_data(const char* const type, const char* const key, const char* const value)
  1554. {
  1555. qDebug("CarlaEngine::osc_send_bridge_set_custom_data(\"%s\", \"%s\", \"%s\")", type, key, value);
  1556. CARLA_ASSERT(m_oscData);
  1557. if (m_oscData && m_oscData->target)
  1558. {
  1559. char target_path[strlen(m_oscData->path)+24];
  1560. strcpy(target_path, m_oscData->path);
  1561. strcat(target_path, "/bridge_set_custom_data");
  1562. lo_send(m_oscData->target, target_path, "sss", type, key, value);
  1563. }
  1564. }
  1565. void CarlaEngine::osc_send_bridge_set_chunk_data(const char* const chunkFile)
  1566. {
  1567. qDebug("CarlaEngine::osc_send_bridge_set_chunk_data(\"%s\")", chunkFile);
  1568. CARLA_ASSERT(m_oscData);
  1569. if (m_oscData && m_oscData->target)
  1570. {
  1571. char target_path[strlen(m_oscData->path)+23];
  1572. strcpy(target_path, m_oscData->path);
  1573. strcat(target_path, "/bridge_set_chunk_data");
  1574. lo_send(m_oscData->target, target_path, "s", chunkFile);
  1575. }
  1576. }
  1577. void CarlaEngine::osc_send_bridge_set_inpeak(const int32_t portId)
  1578. {
  1579. CARLA_ASSERT(m_oscData);
  1580. CARLA_ASSERT(portId == 1 || portId == 2);
  1581. if (m_oscData && m_oscData->target)
  1582. {
  1583. char target_path[strlen(m_oscData->path)+28];
  1584. strcpy(target_path, m_oscData->path);
  1585. strcat(target_path, "/bridge_set_inpeak");
  1586. lo_send(m_oscData->target, target_path, "id", portId, m_insPeak[portId-1]);
  1587. }
  1588. }
  1589. void CarlaEngine::osc_send_bridge_set_outpeak(const int32_t portId)
  1590. {
  1591. CARLA_ASSERT(m_oscData);
  1592. CARLA_ASSERT(portId == 1 || portId == 2);
  1593. if (m_oscData && m_oscData->target)
  1594. {
  1595. char target_path[strlen(m_oscData->path)+29];
  1596. strcpy(target_path, m_oscData->path);
  1597. strcat(target_path, "/bridge_set_outpeak");
  1598. lo_send(m_oscData->target, target_path, "id", portId, m_insPeak[portId-1]);
  1599. }
  1600. }
  1601. #endif
  1602. CARLA_BACKEND_END_NAMESPACE