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.

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