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.

1959 lines
59KB

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