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.

1895 lines
57KB

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