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.

1957 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. }
  57. void CarlaEngineControlPort::initBuffer(CarlaEngine* const engine)
  58. {
  59. CARLA_ASSERT(engine);
  60. #ifndef BUILD_BRIDGE
  61. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  62. buffer = isInput ? engine->rackControlEventsIn : engine->rackControlEventsOut;
  63. #endif
  64. }
  65. uint32_t CarlaEngineControlPort::getEventCount()
  66. {
  67. if (! isInput)
  68. return 0;
  69. CARLA_ASSERT(buffer);
  70. #ifndef BUILD_BRIDGE
  71. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  72. {
  73. uint32_t count = 0;
  74. const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  75. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS; i++, count++)
  76. {
  77. if (events[i].type == CarlaEngineNullEvent)
  78. break;
  79. }
  80. return count;
  81. }
  82. #endif
  83. return 0;
  84. }
  85. const CarlaEngineControlEvent* CarlaEngineControlPort::getEvent(uint32_t index)
  86. {
  87. if (! isInput)
  88. return nullptr;
  89. CARLA_ASSERT(buffer);
  90. #ifndef BUILD_BRIDGE
  91. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  92. {
  93. CARLA_ASSERT(index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS);
  94. const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  95. if (index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS)
  96. return &events[index];
  97. }
  98. #endif
  99. return nullptr;
  100. }
  101. void CarlaEngineControlPort::writeEvent(CarlaEngineControlEventType type, uint32_t time, uint8_t channel, uint16_t controller, double value)
  102. {
  103. if (isInput)
  104. return;
  105. CARLA_ASSERT(buffer);
  106. CARLA_ASSERT(type != CarlaEngineNullEvent);
  107. #ifndef BUILD_BRIDGE
  108. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  109. {
  110. CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  111. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS; i++)
  112. {
  113. if (events[i].type != CarlaEngineNullEvent)
  114. continue;
  115. events[i].type = type;
  116. events[i].time = time;
  117. events[i].value = value;
  118. events[i].channel = channel;
  119. events[i].controller = controller;
  120. break;
  121. }
  122. }
  123. #endif
  124. }
  125. // -------------------------------------------------------------------------------------------------------------------
  126. // Engine port (MIDI)
  127. CarlaEngineMidiPort::CarlaEngineMidiPort(const bool isInput, const ProcessMode processMode)
  128. : CarlaEngineBasePort(isInput, processMode)
  129. {
  130. qDebug("CarlaEngineMidiPort::CarlaEngineMidiPort(%s, %s)", bool2str(isInput), ProcessMode2Str(processMode));
  131. }
  132. CarlaEngineMidiPort::~CarlaEngineMidiPort()
  133. {
  134. }
  135. void CarlaEngineMidiPort::initBuffer(CarlaEngine* const engine)
  136. {
  137. CARLA_ASSERT(engine);
  138. #ifndef BUILD_BRIDGE
  139. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  140. buffer = isInput ? engine->rackMidiEventsIn : engine->rackMidiEventsOut;
  141. #endif
  142. }
  143. uint32_t CarlaEngineMidiPort::getEventCount()
  144. {
  145. if (! isInput)
  146. return 0;
  147. CARLA_ASSERT(buffer);
  148. #ifndef BUILD_BRIDGE
  149. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  150. {
  151. uint32_t count = 0;
  152. const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  153. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_MIDI_EVENTS; i++, count++)
  154. {
  155. if (events[i].size == 0)
  156. break;
  157. }
  158. return count;
  159. }
  160. #endif
  161. return 0;
  162. }
  163. const CarlaEngineMidiEvent* CarlaEngineMidiPort::getEvent(uint32_t index)
  164. {
  165. if (! isInput)
  166. return nullptr;
  167. CARLA_ASSERT(buffer);
  168. #ifndef BUILD_BRIDGE
  169. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  170. {
  171. CARLA_ASSERT(index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS);
  172. const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  173. if (index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS)
  174. return &events[index];
  175. }
  176. #endif
  177. return nullptr;
  178. }
  179. void CarlaEngineMidiPort::writeEvent(uint32_t time, const uint8_t* data, uint8_t size)
  180. {
  181. if (isInput)
  182. return;
  183. CARLA_ASSERT(buffer);
  184. CARLA_ASSERT(data);
  185. CARLA_ASSERT(size > 0);
  186. #ifndef BUILD_BRIDGE
  187. if (processMode == PROCESS_MODE_CONTINUOUS_RACK)
  188. {
  189. if (size > 4)
  190. return;
  191. CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  192. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_MIDI_EVENTS; i++)
  193. {
  194. if (events[i].size != 0)
  195. continue;
  196. events[i].time = time;
  197. events[i].size = size;
  198. memcpy(events[i].data, data, size);
  199. break;
  200. }
  201. }
  202. #endif
  203. }
  204. //#ifdef CARLA_ENGINE_JACK
  205. //float* CarlaEngineAudioPort::getJackAudioBuffer(uint32_t nframes)
  206. //{
  207. //# ifndef BUILD_BRIDGE
  208. // if (CarlaEngine::processMode == PROCESS_MODE_CONTINUOUS_RACK)
  209. // return nullptr;
  210. //# endif
  211. // CARLA_ASSERT(handle.jackPort);
  212. // return (float*)jackbridge_port_get_buffer(handle.jackPort, nframes);
  213. //}
  214. //#endif
  215. // -------------------------------------------------------------------------------------------------------------------
  216. // Carla Engine Client
  217. CarlaEngineClient::CarlaEngineClient(const CarlaEngineType engineType_, const ProcessMode processMode_)
  218. : engineType(engineType_),
  219. processMode(processMode_)
  220. {
  221. qDebug("CarlaEngineClient::CarlaEngineClient(%s, %s)", "" /* TODO */, ProcessMode2Str(processMode));
  222. CARLA_ASSERT(engineType != CarlaEngineTypeNull);
  223. m_active = false;
  224. m_latency = 0;
  225. }
  226. CarlaEngineClient::~CarlaEngineClient()
  227. {
  228. qDebug("CarlaEngineClient::~CarlaEngineClient()");
  229. CARLA_ASSERT(! m_active);
  230. }
  231. void CarlaEngineClient::activate()
  232. {
  233. qDebug("CarlaEngineClient::activate()");
  234. CARLA_ASSERT(! m_active);
  235. m_active = true;
  236. }
  237. void CarlaEngineClient::deactivate()
  238. {
  239. qDebug("CarlaEngineClient::deactivate()");
  240. CARLA_ASSERT(m_active);
  241. m_active = false;
  242. }
  243. bool CarlaEngineClient::isActive() const
  244. {
  245. qDebug("CarlaEngineClient::isActive()");
  246. return m_active;
  247. }
  248. bool CarlaEngineClient::isOk() const
  249. {
  250. qDebug("CarlaEngineClient::isOk()");
  251. return true;
  252. }
  253. uint32_t CarlaEngineClient::getLatency() const
  254. {
  255. return m_latency;
  256. }
  257. void CarlaEngineClient::setLatency(const uint32_t samples)
  258. {
  259. m_latency = samples;
  260. }
  261. //const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType portType, const char* const name, const bool isInput)
  262. //{
  263. // qDebug("CarlaEngineClient::addPort(%i, \"%s\", %s)", portType, name, bool2str(isInput));
  264. // CarlaEngineBasePort::Handle portHandle;
  265. //#ifndef BUILD_BRIDGE
  266. // if (CarlaEngine::processMode != PROCESS_MODE_CONTINUOUS_RACK)
  267. //#endif
  268. // {
  269. //#ifdef CARLA_ENGINE_JACK
  270. // if (engineType == CarlaEngineTypeJack)
  271. // {
  272. // switch (portType)
  273. // {
  274. // case CarlaEnginePortTypeAudio:
  275. // portHandle = jackbridge_port_register((jack_client_t*)handle, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  276. // break;
  277. // case CarlaEnginePortTypeControl:
  278. // case CarlaEnginePortTypeMIDI:
  279. // portHandle = jackbridge_port_register((jack_client_t*)handle, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  280. // break;
  281. // }
  282. // }
  283. //#endif
  284. // }
  285. // switch (portType)
  286. // {
  287. // case CarlaEnginePortTypeAudio:
  288. // return new CarlaEngineAudioPort(portHandle, isInput);
  289. // case CarlaEnginePortTypeControl:
  290. // return new CarlaEngineControlPort(portHandle, isInput);
  291. // case CarlaEnginePortTypeMIDI:
  292. // return new CarlaEngineMidiPort(portHandle, isInput);
  293. // }
  294. // qCritical("CarlaEngineClient::addPort(%i, \"%s\", %s) - invalid type", portType, name, bool2str(isInput));
  295. // return nullptr;
  296. //}
  297. //void CarlaEngineClient::removePort(CarlaEngineBasePort* const port)
  298. //{
  299. //#ifndef BUILD_BRIDGE
  300. // if (CarlaEngine::processMode == PROCESS_MODE_CONTINUOUS_RACK)
  301. // return;
  302. //#endif
  303. //#ifdef CARLA_ENGINE_JACK
  304. // if (engineType == CarlaEngineTypeJack)
  305. // {
  306. // if (handle && port->handle)
  307. // jackbridge_port_unregister((jack_client_t*)handle, (jack_port_t*)port->handle);
  308. // }
  309. //#endif
  310. //}
  311. // -------------------------------------------------------------------------------------------------------------------
  312. // Carla Engine Client
  313. CarlaEngine::CarlaEngine()
  314. : m_thread(this),
  315. #ifndef BUILD_BRIDGE
  316. m_osc(this),
  317. #endif
  318. m_oscData(nullptr),
  319. m_callback(nullptr),
  320. #ifdef Q_COMPILER_INITIALIZER_LISTS
  321. m_callbackPtr(nullptr),
  322. m_carlaPlugins{nullptr},
  323. m_uniqueNames{nullptr},
  324. m_insPeak{0.0},
  325. m_outsPeak{0.0}
  326. #else
  327. m_callbackPtr(nullptr)
  328. #endif
  329. {
  330. qDebug("CarlaEngine::CarlaEngine()");
  331. bufferSize = 0;
  332. sampleRate = 0.0;
  333. m_maxPluginNumber = 0;
  334. #ifndef Q_COMPILER_INITIALIZER_LISTS
  335. for (unsigned short i=0; i < MAX_PLUGINS; i++)
  336. {
  337. m_carlaPlugins[i] = nullptr;
  338. m_uniqueNames[i] = nullptr;
  339. }
  340. for (unsigned short i=0; i < MAX_PLUGINS * MAX_PEAKS; i++)
  341. {
  342. m_insPeak[i] = 0.0;
  343. m_outsPeak[i] = 0.0;
  344. }
  345. #endif
  346. }
  347. CarlaEngine::~CarlaEngine()
  348. {
  349. qDebug("CarlaEngine::~CarlaEngine()");
  350. }
  351. // -----------------------------------------------------------------------
  352. // Static values
  353. unsigned int CarlaEngine::getDriverCount()
  354. {
  355. unsigned int count = 0;
  356. #ifdef CARLA_ENGINE_JACK
  357. count += 1;
  358. #endif
  359. #ifdef CARLA_ENGINE_RTAUDIO
  360. count += getRtAudioApiCount();
  361. #endif
  362. return count;
  363. }
  364. const char* CarlaEngine::getDriverName(unsigned int index)
  365. {
  366. #ifdef CARLA_ENGINE_JACK
  367. if (index == 0)
  368. return "JACK";
  369. else
  370. index -= 1;
  371. #endif
  372. #ifdef CARLA_ENGINE_RTAUDIO
  373. if (index < getRtAudioApiCount())
  374. return getRtAudioApiName(index);
  375. #endif
  376. qWarning("CarlaEngine::getDriverName(%i) - invalid index", index);
  377. return nullptr;
  378. }
  379. CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName)
  380. {
  381. #ifdef CARLA_ENGINE_JACK
  382. if (strcmp(driverName, "JACK") == 0)
  383. return newJack();
  384. #else
  385. if (false)
  386. pass();
  387. #endif
  388. #ifdef CARLA_ENGINE_RTAUDIO
  389. # ifdef __LINUX_ALSA__
  390. else if (strcmp(driverName, "ALSA") == 0)
  391. return newRtAudio(RTAUDIO_LINUX_ALSA);
  392. # endif
  393. # ifdef __LINUX_PULSE__
  394. else if (strcmp(driverName, "PulseAudio") == 0)
  395. return newRtAudio(RTAUDIO_LINUX_PULSE);
  396. # endif
  397. # ifdef __LINUX_OSS__
  398. else if (strcmp(driverName, "OSS") == 0)
  399. return newRtAudio(RTAUDIO_LINUX_OSS);
  400. # endif
  401. # ifdef __UNIX_JACK__
  402. else if (strcmp(driverName, "JACK (RtAudio)") == 0)
  403. return newRtAudio(RTAUDIO_UNIX_JACK);
  404. # endif
  405. # ifdef __MACOSX_CORE__
  406. else if (strcmp(driverName, "CoreAudio") == 0)
  407. return newRtAudio(RTAUDIO_MACOSX_CORE);
  408. # endif
  409. # ifdef __WINDOWS_ASIO__
  410. else if (strcmp(driverName, "ASIO") == 0)
  411. return newRtAudio(RTAUDIO_WINDOWS_ASIO);
  412. # endif
  413. # ifdef __WINDOWS_DS__
  414. else if (strcmp(driverName, "DirectSound") == 0)
  415. return newRtAudio(RTAUDIO_WINDOWS_DS);
  416. # endif
  417. #endif
  418. return nullptr;
  419. }
  420. // -----------------------------------------------------------------------
  421. // Maximum values
  422. int CarlaEngine::maxClientNameSize()
  423. {
  424. //#ifdef CARLA_ENGINE_JACK
  425. //# ifndef BUILD_BRIDGE
  426. // if (type() == CarlaEngineTypeJack && processMode != PROCESS_MODE_CONTINUOUS_RACK)
  427. //# endif
  428. // return jackbridge_client_name_size();
  429. //#endif
  430. return STR_MAX/2;
  431. }
  432. int CarlaEngine::maxPortNameSize()
  433. {
  434. //#ifdef CARLA_ENGINE_JACK
  435. //# ifndef BUILD_BRIDGE
  436. // if (type() == CarlaEngineTypeJack && processMode != PROCESS_MODE_CONTINUOUS_RACK)
  437. //# endif
  438. // return jackbridge_port_name_size();
  439. //#endif
  440. return STR_MAX;
  441. }
  442. unsigned short CarlaEngine::maxPluginNumber()
  443. {
  444. return m_maxPluginNumber;
  445. }
  446. // -----------------------------------------------------------------------
  447. // Virtual, per-engine type calls
  448. bool CarlaEngine::init(const char* const clientName)
  449. {
  450. qDebug("CarlaEngine::init(\"%s\")", clientName);
  451. #ifndef BUILD_BRIDGE
  452. m_osc.init(clientName);
  453. m_oscData = m_osc.getControlData();
  454. if (strcmp(clientName, "Carla") != 0)
  455. carla_setprocname(clientName);
  456. #endif
  457. m_thread.startNow();
  458. return true;
  459. }
  460. bool CarlaEngine::close()
  461. {
  462. qDebug("CarlaEngine::close()");
  463. m_thread.stopNow();
  464. #ifndef BUILD_BRIDGE
  465. osc_send_control_exit();
  466. m_osc.close();
  467. #endif
  468. m_oscData = nullptr;
  469. m_maxPluginNumber = 0;
  470. name.clear();
  471. return true;
  472. }
  473. // -----------------------------------------------------------------------
  474. // Plugin management
  475. short CarlaEngine::getNewPluginId() const
  476. {
  477. qDebug("CarlaEngine::getNewPluginId()");
  478. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  479. {
  480. if (! m_carlaPlugins[i])
  481. return i;
  482. }
  483. return -1;
  484. }
  485. CarlaPlugin* CarlaEngine::getPlugin(const unsigned short id) const
  486. {
  487. qDebug("CarlaEngine::getPlugin(%i/%i)", id, m_maxPluginNumber);
  488. CARLA_ASSERT(m_maxPluginNumber != 0);
  489. CARLA_ASSERT(id < m_maxPluginNumber);
  490. if (id < m_maxPluginNumber)
  491. return m_carlaPlugins[id];
  492. return nullptr;
  493. }
  494. CarlaPlugin* CarlaEngine::getPluginUnchecked(const unsigned short id) const
  495. {
  496. CARLA_ASSERT(m_maxPluginNumber != 0);
  497. CARLA_ASSERT(id < m_maxPluginNumber);
  498. return m_carlaPlugins[id];
  499. }
  500. const char* CarlaEngine::getUniquePluginName(const char* const name)
  501. {
  502. qDebug("CarlaEngine::getUniquePluginName(\"%s\")", name);
  503. CARLA_ASSERT(name);
  504. CarlaString sname(name);
  505. if (sname.isEmpty())
  506. sname = "(No name)";
  507. sname.truncate(maxClientNameSize()-5-1); // 5 = strlen(" (10)")
  508. sname.replace(':', '.'); // ':' is used in JACK1 to split client/port names
  509. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  510. {
  511. // Check if unique name already exists
  512. if (m_uniqueNames[i] && sname == m_uniqueNames[i])
  513. {
  514. // Check if string has already been modified
  515. size_t len = sname.length();
  516. // 1 digit, ex: " (2)"
  517. if (sname[len-4] == ' ' && sname[len-3] == '(' && sname.isDigit(len-2) && sname[len-1] == ')')
  518. {
  519. int number = sname[len-2]-'0';
  520. if (number == 9)
  521. {
  522. // next number is 10, 2 digits
  523. sname.truncate(len-4);
  524. sname += " (10)";
  525. //sname.replace(" (9)", " (10)");
  526. }
  527. else
  528. sname[len-2] = '0'+number+1;
  529. continue;
  530. }
  531. // 2 digits, ex: " (11)"
  532. if (sname[len-5] == ' ' && sname[len-4] == '(' && sname.isDigit(len-3) && sname.isDigit(len-2) && sname[len-1] == ')')
  533. {
  534. char n2 = sname[len-2];
  535. char n3 = sname[len-3];
  536. if (n2 == '9')
  537. {
  538. n2 = '0';
  539. n3 = n3+1;
  540. }
  541. else
  542. n2 = n2+1;
  543. sname[len-2] = n2;
  544. sname[len-3] = n3;
  545. continue;
  546. }
  547. // Modify string if not
  548. sname += " (2)";
  549. }
  550. }
  551. return strdup(sname);
  552. }
  553. short CarlaEngine::addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra)
  554. {
  555. return addPlugin(BINARY_NATIVE, ptype, filename, name, label, extra);
  556. }
  557. short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra)
  558. {
  559. qDebug("CarlaEngine::addPlugin(%s, %s, \"%s\", \"%s\", \"%s\", %p)", BinaryType2Str(btype), PluginType2Str(ptype), filename, name, label, extra);
  560. CARLA_ASSERT(btype != BINARY_NONE);
  561. CARLA_ASSERT(ptype != PLUGIN_NONE);
  562. CARLA_ASSERT(filename);
  563. CARLA_ASSERT(label);
  564. if (m_maxPluginNumber == 0)
  565. {
  566. #ifdef BUILD_BRIDGE
  567. m_maxPluginNumber = MAX_PLUGINS;
  568. #else
  569. m_maxPluginNumber = (options.processMode == PROCESS_MODE_CONTINUOUS_RACK) ? 16 : MAX_PLUGINS;
  570. #endif
  571. }
  572. CarlaPlugin::initializer init = {
  573. this,
  574. filename,
  575. name,
  576. label
  577. };
  578. CarlaPlugin* plugin = nullptr;
  579. #ifndef BUILD_BRIDGE
  580. if (btype != BINARY_NATIVE || (options.preferPluginBridges && /*getBinaryBidgePath(btype) &&*/ type() == CarlaEngineTypeJack))
  581. {
  582. # ifdef CARLA_ENGINE_JACK
  583. if (options.processMode != CarlaBackend::PROCESS_MODE_MULTIPLE_CLIENTS)
  584. {
  585. setLastError("Can only use bridged plugins in JACK Multi-Client mode");
  586. return -1;
  587. }
  588. # endif
  589. if (type() != CarlaEngineTypeJack)
  590. {
  591. setLastError("Can only use bridged plugins with JACK backend");
  592. return -1;
  593. }
  594. plugin = CarlaPlugin::newBridge(init, btype, ptype);
  595. }
  596. else
  597. #endif
  598. {
  599. switch (ptype)
  600. {
  601. case PLUGIN_NONE:
  602. break;
  603. #ifndef BUILD_BRIDGE
  604. case PLUGIN_INTERNAL:
  605. plugin = CarlaPlugin::newNative(init);
  606. break;
  607. #endif
  608. case PLUGIN_LADSPA:
  609. plugin = CarlaPlugin::newLADSPA(init, extra);
  610. break;
  611. case PLUGIN_DSSI:
  612. plugin = CarlaPlugin::newDSSI(init, extra);
  613. break;
  614. case PLUGIN_LV2:
  615. plugin = CarlaPlugin::newLV2(init);
  616. break;
  617. case PLUGIN_VST:
  618. plugin = CarlaPlugin::newVST(init);
  619. break;
  620. #ifndef BUILD_BRIDGE
  621. case PLUGIN_GIG:
  622. plugin = CarlaPlugin::newGIG(init);
  623. break;
  624. case PLUGIN_SF2:
  625. plugin = CarlaPlugin::newSF2(init);
  626. break;
  627. case PLUGIN_SFZ:
  628. plugin = CarlaPlugin::newSFZ(init);
  629. break;
  630. #else
  631. default:
  632. break;
  633. #endif
  634. }
  635. }
  636. if (! plugin)
  637. return -1;
  638. const short id = plugin->id();
  639. m_carlaPlugins[id] = plugin;
  640. m_uniqueNames[id] = plugin->name();
  641. if (! m_thread.isRunning())
  642. m_thread.startNow();
  643. return id;
  644. }
  645. bool CarlaEngine::removePlugin(const unsigned short id)
  646. {
  647. qDebug("CarlaEngine::removePlugin(%i)", id);
  648. CARLA_ASSERT(m_maxPluginNumber != 0);
  649. CARLA_ASSERT(id < m_maxPluginNumber);
  650. CarlaPlugin* const plugin = m_carlaPlugins[id];
  651. if (plugin /*&& plugin->id() == id*/)
  652. {
  653. CARLA_ASSERT(plugin->id() == id);
  654. m_thread.stopNow();
  655. processLock();
  656. plugin->setEnabled(false);
  657. m_carlaPlugins[id] = nullptr;
  658. m_uniqueNames[id] = nullptr;
  659. processUnlock();
  660. delete plugin;
  661. #ifndef BUILD_BRIDGE
  662. osc_send_control_remove_plugin(id);
  663. if (options.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  664. {
  665. // TODO - handle OSC server comm
  666. for (unsigned short i=id; i < m_maxPluginNumber-1; i++)
  667. {
  668. m_carlaPlugins[i] = m_carlaPlugins[i+1];
  669. m_uniqueNames[i] = m_uniqueNames[i+1];
  670. if (m_carlaPlugins[i])
  671. m_carlaPlugins[i]->setId(i);
  672. }
  673. }
  674. #endif
  675. if (isRunning())
  676. {
  677. // only re-start check thread if there are still plugins left
  678. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  679. {
  680. if (m_carlaPlugins[i])
  681. {
  682. m_thread.startNow();
  683. break;
  684. }
  685. }
  686. }
  687. return true;
  688. }
  689. qCritical("CarlaEngine::removePlugin(%i) - could not find plugin", id);
  690. setLastError("Could not find plugin to remove");
  691. return false;
  692. }
  693. void CarlaEngine::removeAllPlugins()
  694. {
  695. qDebug("CarlaEngine::removeAllPlugins()");
  696. m_thread.stopNow();
  697. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  698. {
  699. CarlaPlugin* const plugin = m_carlaPlugins[i];
  700. if (plugin)
  701. {
  702. processLock();
  703. plugin->setEnabled(false);
  704. processUnlock();
  705. delete plugin;
  706. m_carlaPlugins[i] = nullptr;
  707. m_uniqueNames[i] = nullptr;
  708. }
  709. }
  710. m_maxPluginNumber = 0;
  711. }
  712. void CarlaEngine::idlePluginGuis()
  713. {
  714. CARLA_ASSERT(m_maxPluginNumber != 0);
  715. for (unsigned short i=0; i < m_maxPluginNumber; i++)
  716. {
  717. CarlaPlugin* const plugin = m_carlaPlugins[i];
  718. if (plugin && plugin->enabled())
  719. plugin->idleGui();
  720. }
  721. }
  722. #ifndef BUILD_BRIDGE
  723. void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], uint32_t frames)
  724. {
  725. // initialize outputs (zero)
  726. carla_zeroF(outBuf[0], frames);
  727. carla_zeroF(outBuf[1], frames);
  728. memset(rackControlEventsOut, 0, sizeof(CarlaEngineControlEvent)*MAX_ENGINE_CONTROL_EVENTS);
  729. memset(rackMidiEventsOut, 0, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);
  730. bool processed = false;
  731. // process plugins
  732. for (unsigned short i=0, max=maxPluginNumber(); i < max; i++)
  733. {
  734. CarlaPlugin* const plugin = getPluginUnchecked(i);
  735. if (plugin && plugin->enabled())
  736. {
  737. if (processed)
  738. {
  739. // initialize inputs (from previous outputs)
  740. memcpy(inBuf[0], outBuf[0], sizeof(float)*frames);
  741. memcpy(inBuf[1], outBuf[1], sizeof(float)*frames);
  742. memcpy(rackMidiEventsIn, rackMidiEventsOut, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);
  743. // initialize outputs (zero)
  744. carla_zeroF(outBuf[0], frames);
  745. carla_zeroF(outBuf[1], frames);
  746. memset(rackMidiEventsOut, 0, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);
  747. }
  748. // process
  749. plugin->engineProcessLock();
  750. plugin->initBuffers();
  751. if (options.processHighPrecision)
  752. {
  753. float* inBuf2[2];
  754. float* outBuf2[2];
  755. for (uint32_t j=0; j < frames; j += 8)
  756. {
  757. inBuf2[0] = inBuf[0] + j;
  758. inBuf2[1] = inBuf[1] + j;
  759. outBuf2[0] = outBuf[0] + j;
  760. outBuf2[1] = outBuf[1] + j;
  761. plugin->process(inBuf2, outBuf2, 8, j);
  762. }
  763. }
  764. else
  765. plugin->process(inBuf, outBuf, frames);
  766. plugin->engineProcessUnlock();
  767. // if plugin has no audio inputs, add previous buffers
  768. if (plugin->audioInCount() == 0)
  769. {
  770. for (uint32_t j=0; j < frames; j++)
  771. {
  772. outBuf[0][j] += inBuf[0][j];
  773. outBuf[1][j] += inBuf[1][j];
  774. }
  775. }
  776. // if plugin has no midi output, add previous midi input
  777. if (plugin->midiOutCount() == 0)
  778. {
  779. memcpy(rackMidiEventsOut, rackMidiEventsIn, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);
  780. }
  781. // set peaks
  782. {
  783. double inPeak1 = 0.0;
  784. double inPeak2 = 0.0;
  785. double outPeak1 = 0.0;
  786. double outPeak2 = 0.0;
  787. for (uint32_t k=0; k < frames; k++)
  788. {
  789. if (std::abs(inBuf[0][k]) > inPeak1)
  790. inPeak1 = std::abs(inBuf[0][k]);
  791. if (std::abs(inBuf[1][k]) > inPeak2)
  792. inPeak2 = std::abs(inBuf[1][k]);
  793. if (std::abs(outBuf[0][k]) > outPeak1)
  794. outPeak1 = std::abs(outBuf[0][k]);
  795. if (std::abs(outBuf[1][k]) > outPeak2)
  796. outPeak2 = std::abs(outBuf[1][k]);
  797. }
  798. m_insPeak[i*MAX_PEAKS + 0] = inPeak1;
  799. m_insPeak[i*MAX_PEAKS + 1] = inPeak2;
  800. m_outsPeak[i*MAX_PEAKS + 0] = outPeak1;
  801. m_outsPeak[i*MAX_PEAKS + 1] = outPeak2;
  802. }
  803. processed = true;
  804. }
  805. }
  806. // if no plugins in the rack, copy inputs over outputs
  807. if (! processed)
  808. {
  809. memcpy(outBuf[0], inBuf[0], sizeof(float)*frames);
  810. memcpy(outBuf[1], inBuf[1], sizeof(float)*frames);
  811. memcpy(rackMidiEventsOut, rackMidiEventsIn, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);
  812. }
  813. }
  814. #endif
  815. // -----------------------------------------------------------------------
  816. // Information (base)
  817. const char* CarlaEngine::getName() const
  818. {
  819. CARLA_ASSERT(name);
  820. return name;
  821. }
  822. double CarlaEngine::getSampleRate() const
  823. {
  824. //CARLA_ASSERT(sampleRate != 0.0);
  825. return sampleRate;
  826. }
  827. uint32_t CarlaEngine::getBufferSize() const
  828. {
  829. //CARLA_ASSERT(bufferSize != 0);
  830. return bufferSize;
  831. }
  832. const CarlaEngineTimeInfo* CarlaEngine::getTimeInfo() const
  833. {
  834. return &timeInfo;
  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