Audio plugin host https://kx.studio/carla
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.

2002 lines
61KB

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