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.

1258 lines
37KB

  1. /*
  2. * Carla Backend
  3. * Copyright (C) 2012 Filipe Coelho <falktx@gmail.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.h"
  18. #include "carla_plugin.h"
  19. CARLA_BACKEND_START_NAMESPACE
  20. // -------------------------------------------------------------------
  21. CarlaEngine::CarlaEngine()
  22. : m_checkThread(this),
  23. #ifndef BUILD_BRIDGE
  24. m_osc(this),
  25. m_oscData(nullptr),
  26. #endif
  27. m_callback(nullptr),
  28. #ifdef Q_COMPILER_INITIALIZER_LISTS
  29. m_callbackPtr(nullptr),
  30. m_carlaPlugins{nullptr},
  31. m_uniqueNames{nullptr},
  32. m_insPeak{0.0},
  33. m_outsPeak{0.0}
  34. #else
  35. m_callbackPtr(nullptr)
  36. #endif
  37. {
  38. qDebug("CarlaEngine::CarlaEngine()");
  39. type = CarlaEngineTypeNull;
  40. name = nullptr;
  41. bufferSize = 0;
  42. sampleRate = 0.0;
  43. #ifndef Q_COMPILER_INITIALIZER_LISTS
  44. for (unsigned short i=0; i < MAX_PLUGINS; i++)
  45. {
  46. m_carlaPlugins[i] = nullptr;
  47. m_uniqueNames[i] = nullptr;
  48. }
  49. for (unsigned short i=0; i < MAX_PLUGINS * MAX_PEAKS; i++)
  50. {
  51. m_insPeak[i] = 0.0;
  52. m_outsPeak[i] = 0.0;
  53. }
  54. #endif
  55. }
  56. CarlaEngine::~CarlaEngine()
  57. {
  58. qDebug("CarlaEngine::~CarlaEngine()");
  59. if (name)
  60. free((void*)name);
  61. }
  62. // -------------------------------------------------------------------
  63. // static values
  64. int CarlaEngine::maxClientNameSize()
  65. {
  66. #ifdef CARLA_ENGINE_JACK
  67. # ifndef BUILD_BRIDGE
  68. if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK)
  69. # endif
  70. return jack_client_name_size();
  71. #endif
  72. return STR_MAX/2;
  73. }
  74. int CarlaEngine::maxPortNameSize()
  75. {
  76. #ifdef CARLA_ENGINE_JACK
  77. # ifndef BUILD_BRIDGE
  78. if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK)
  79. # endif
  80. return jack_port_name_size();
  81. #endif
  82. return STR_MAX;
  83. }
  84. // -------------------------------------------------------------------
  85. // plugin management
  86. short CarlaEngine::getNewPluginId() const
  87. {
  88. qDebug("CarlaEngine::getNewPluginId()");
  89. #ifdef BUILD_BRIDGE
  90. static const unsigned short max = MAX_PLUGINS;
  91. #else
  92. static const unsigned short max = (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) ? 16 : MAX_PLUGINS;
  93. #endif
  94. for (unsigned short i=0; i < max; i++)
  95. {
  96. if (! m_carlaPlugins[i])
  97. return i;
  98. }
  99. return -1;
  100. }
  101. CarlaPlugin* CarlaEngine::getPlugin(const unsigned short id) const
  102. {
  103. qDebug("CarlaEngine::getPlugin(%i)", id);
  104. Q_ASSERT(id < MAX_PLUGINS);
  105. if (id < MAX_PLUGINS)
  106. return m_carlaPlugins[id];
  107. return nullptr;
  108. }
  109. const char* CarlaEngine::getUniqueName(const char* const name)
  110. {
  111. qDebug("CarlaEngine::getUniqueName(\"%s\")", name);
  112. QString qname(name);
  113. if (qname.isEmpty())
  114. qname = "(No name)";
  115. qname.truncate(maxClientNameSize()-5-1); // 5 = strlen(" (10)")
  116. qname.replace(":", "."); // ":" is used in JACK1 to split client/port names
  117. for (unsigned short i=0; i < MAX_PLUGINS; i++)
  118. {
  119. // Check if unique name already exists
  120. if (m_uniqueNames[i] && qname == m_uniqueNames[i])
  121. {
  122. // Check if string has already been modified
  123. uint len = qname.size();
  124. // 1 digit, ex: " (2)"
  125. if (qname.at(len-4) == QChar(' ') && qname.at(len-3) == QChar('(') && qname.at(len-2).isDigit() && qname.at(len-1) == QChar(')'))
  126. {
  127. int number = qname.at(len-2).toAscii()-'0';
  128. if (number == 9)
  129. // next number is 10, 2 digits
  130. qname.replace(" (9)", " (10)");
  131. else
  132. qname[len-2] = QChar('0'+number+1);
  133. continue;
  134. }
  135. // 2 digits, ex: " (11)"
  136. if (qname.at(len-5) == QChar(' ') && qname.at(len-4) == QChar('(') && qname.at(len-3).isDigit() && qname.at(len-2).isDigit() && qname.at(len-1) == QChar(')'))
  137. {
  138. QChar n2 = qname.at(len-2);
  139. QChar n3 = qname.at(len-3);
  140. if (n2 == QChar('9'))
  141. {
  142. n2 = QChar('0');
  143. n3 = QChar(n3.toAscii()+1);
  144. }
  145. else
  146. n2 = QChar(n2.toAscii()+1);
  147. qname[len-2] = n2;
  148. qname[len-3] = n3;
  149. continue;
  150. }
  151. // Modify string if not
  152. qname += " (2)";
  153. }
  154. }
  155. return strdup(qname.toUtf8().constData());
  156. }
  157. short CarlaEngine::addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra)
  158. {
  159. return addPlugin(BINARY_NATIVE, ptype, filename, name, label, extra);
  160. }
  161. short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra)
  162. {
  163. qDebug("CarlaEngine::addPlugin(%s, %s, \"%s\", \"%s\", \"%s\", %p)", BinaryType2str(btype), PluginType2str(ptype), filename, name, label, extra);
  164. CarlaPlugin::initializer init = {
  165. this,
  166. filename,
  167. name,
  168. label
  169. };
  170. CarlaPlugin* plugin = nullptr;
  171. #ifndef BUILD_BRIDGE
  172. if (btype != BINARY_NATIVE)
  173. {
  174. # ifdef CARLA_ENGINE_JACK
  175. if (carlaOptions.process_mode != CarlaBackend::PROCESS_MODE_MULTIPLE_CLIENTS)
  176. {
  177. setLastError("Can only use bridged plugins in JACK Multi-Client mode");
  178. return -1;
  179. }
  180. # endif
  181. if (type != CarlaEngineTypeJack)
  182. {
  183. setLastError("Can only use bridged plugins with JACK backend");
  184. return -1;
  185. }
  186. plugin = CarlaPlugin::newBridge(init, btype, ptype);
  187. }
  188. else
  189. #endif
  190. {
  191. switch (ptype)
  192. {
  193. case PLUGIN_NONE:
  194. break;
  195. case PLUGIN_LADSPA:
  196. plugin = CarlaPlugin::newLADSPA(init, extra);
  197. break;
  198. case PLUGIN_DSSI:
  199. plugin = CarlaPlugin::newDSSI(init, extra);
  200. break;
  201. case PLUGIN_LV2:
  202. plugin = CarlaPlugin::newLV2(init);
  203. break;
  204. case PLUGIN_VST:
  205. plugin = CarlaPlugin::newVST(init);
  206. break;
  207. case PLUGIN_GIG:
  208. plugin = CarlaPlugin::newGIG(init);
  209. break;
  210. case PLUGIN_SF2:
  211. plugin = CarlaPlugin::newSF2(init);
  212. break;
  213. case PLUGIN_SFZ:
  214. plugin = CarlaPlugin::newSFZ(init);
  215. break;
  216. }
  217. }
  218. if (! plugin)
  219. return -1;
  220. const short id = plugin->id();
  221. m_carlaPlugins[id] = plugin;
  222. m_uniqueNames[id] = plugin->name();
  223. return id;
  224. }
  225. bool CarlaEngine::removePlugin(const unsigned short id)
  226. {
  227. qDebug("CarlaEngine::removePlugin(%i)", id);
  228. Q_ASSERT(id < MAX_PLUGINS);
  229. CarlaPlugin* const plugin = m_carlaPlugins[id];
  230. if (plugin && plugin->id() == id)
  231. {
  232. processLock();
  233. plugin->setEnabled(false);
  234. processUnlock();
  235. m_checkThread.stopNow();
  236. delete plugin;
  237. m_carlaPlugins[id] = nullptr;
  238. m_uniqueNames[id] = nullptr;
  239. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  240. {
  241. for (unsigned short i=id; i < MAX_PLUGINS-1; i++)
  242. {
  243. m_carlaPlugins[i] = m_carlaPlugins[i+1];
  244. m_uniqueNames[i] = m_uniqueNames[i+1];
  245. if (m_carlaPlugins[i])
  246. m_carlaPlugins[i]->setId(i);
  247. }
  248. }
  249. if (isRunning())
  250. m_checkThread.start(QThread::HighPriority);
  251. return true;
  252. }
  253. qCritical("CarlaEngine::removePlugin(%i) - could not find plugin", id);
  254. setLastError("Could not find plugin to remove");
  255. return false;
  256. }
  257. void CarlaEngine::removeAllPlugins()
  258. {
  259. qDebug("CarlaEngine::removeAllPlugins()");
  260. const CarlaCheckThread::ScopedLocker m(&m_checkThread);
  261. for (unsigned short i=0; i < MAX_PLUGINS; i++)
  262. {
  263. CarlaPlugin* const plugin = m_carlaPlugins[i];
  264. if (plugin)
  265. {
  266. processLock();
  267. plugin->setEnabled(false);
  268. processUnlock();
  269. delete plugin;
  270. m_carlaPlugins[i] = nullptr;
  271. m_uniqueNames[i] = nullptr;
  272. }
  273. }
  274. }
  275. void CarlaEngine::idlePluginGuis()
  276. {
  277. for (unsigned short i=0; i < MAX_PLUGINS; i++)
  278. {
  279. CarlaPlugin* const plugin = m_carlaPlugins[i];
  280. if (plugin && plugin->enabled())
  281. plugin->idleGui();
  282. }
  283. }
  284. // -------------------------------------------------------------------
  285. // protected calls
  286. void CarlaEngine::bufferSizeChanged(uint32_t newBufferSize)
  287. {
  288. qDebug("CarlaEngine::bufferSizeChanged(%i)", newBufferSize);
  289. bufferSize = newBufferSize;
  290. for (unsigned short i=0; i < MAX_PLUGINS; i++)
  291. {
  292. if (m_carlaPlugins[i] && m_carlaPlugins[i]->enabled())
  293. m_carlaPlugins[i]->bufferSizeChanged(newBufferSize);
  294. }
  295. }
  296. // -------------------------------------------------------------------------------------------------------------------
  297. // Carla Engine Client
  298. CarlaEngineClient::CarlaEngineClient(const CarlaEngineType& type_, const CarlaEngineClientNativeHandle& handle_)
  299. : type(type_),
  300. handle(handle_)
  301. {
  302. qDebug("CarlaEngineClient::CarlaEngineClient()");
  303. m_active = false;
  304. }
  305. CarlaEngineClient::~CarlaEngineClient()
  306. {
  307. qDebug("CarlaEngineClient::~CarlaEngineClient()");
  308. Q_ASSERT(! m_active);
  309. #ifndef BUILD_BRIDGE
  310. if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS)
  311. #endif
  312. {
  313. #ifdef CARLA_ENGINE_JACK
  314. if (handle.jackClient)
  315. jack_client_close(handle.jackClient);
  316. #endif
  317. #ifdef CARLA_ENGINE_RTAUDIO
  318. if (handle.rtAudioPtr)
  319. delete handle.rtAudioPtr;
  320. #endif
  321. }
  322. }
  323. void CarlaEngineClient::activate()
  324. {
  325. qDebug("CarlaEngineClient::activate()");
  326. Q_ASSERT(! m_active);
  327. #ifndef BUILD_BRIDGE
  328. if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS)
  329. #endif
  330. {
  331. if (! m_active)
  332. {
  333. #ifdef CARLA_ENGINE_JACK
  334. if (handle.jackClient)
  335. jack_activate(handle.jackClient);
  336. #endif
  337. #ifdef CARLA_ENGINE_RTAUDIO
  338. if (handle.rtAudioPtr)
  339. handle.rtAudioPtr->startStream();
  340. #endif
  341. }
  342. }
  343. m_active = true;
  344. }
  345. void CarlaEngineClient::deactivate()
  346. {
  347. qDebug("CarlaEngineClient::deactivate()");
  348. Q_ASSERT(m_active);
  349. #ifndef BUILD_BRIDGE
  350. if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS)
  351. #endif
  352. {
  353. if (m_active)
  354. {
  355. #ifdef CARLA_ENGINE_JACK
  356. if (handle.jackClient)
  357. jack_deactivate(handle.jackClient);
  358. #endif
  359. #ifdef CARLA_ENGINE_RTAUDIO
  360. if (handle.rtAudioPtr)
  361. handle.rtAudioPtr->stopStream();
  362. #endif
  363. }
  364. }
  365. m_active = false;
  366. }
  367. bool CarlaEngineClient::isActive() const
  368. {
  369. qDebug("CarlaEngineClient::isActive()");
  370. return m_active;
  371. }
  372. bool CarlaEngineClient::isOk() const
  373. {
  374. qDebug("CarlaEngineClient::isOk()");
  375. #ifndef BUILD_BRIDGE
  376. if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK)
  377. #endif
  378. {
  379. #ifdef CARLA_ENGINE_JACK
  380. return bool(handle.jackClient);
  381. // FIXME
  382. #endif
  383. }
  384. return true;
  385. }
  386. const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType type, const char* const name, const bool isInput)
  387. {
  388. qDebug("CarlaEngineClient::addPort(%i, \"%s\", %s)", type, name, bool2str(isInput));
  389. CarlaEnginePortNativeHandle portHandle;
  390. #ifdef CARLA_ENGINE_JACK
  391. portHandle.jackClient = handle.jackClient;
  392. #endif
  393. #ifdef CARLA_ENGINE_JACK
  394. # ifndef BUILD_BRIDGE
  395. if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK)
  396. # endif
  397. {
  398. switch (type)
  399. {
  400. case CarlaEnginePortTypeAudio:
  401. portHandle.jackPort = jack_port_register(handle.jackClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  402. break;
  403. case CarlaEnginePortTypeControl:
  404. case CarlaEnginePortTypeMIDI:
  405. portHandle.jackPort = jack_port_register(handle.jackClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  406. break;
  407. }
  408. }
  409. #else
  410. Q_UNUSED(name);
  411. #endif
  412. switch (type)
  413. {
  414. case CarlaEnginePortTypeAudio:
  415. return new CarlaEngineAudioPort(portHandle, isInput);
  416. case CarlaEnginePortTypeControl:
  417. return new CarlaEngineControlPort(portHandle, isInput);
  418. case CarlaEnginePortTypeMIDI:
  419. return new CarlaEngineMidiPort(portHandle, isInput);
  420. default:
  421. return nullptr;
  422. }
  423. }
  424. // -------------------------------------------------------------------------------------------------------------------
  425. // Carla Engine Port (Base class)
  426. CarlaEngineBasePort::CarlaEngineBasePort(const CarlaEnginePortNativeHandle& handle_, bool isInput_)
  427. : isInput(isInput_),
  428. handle(handle_)
  429. {
  430. qDebug("CarlaEngineBasePort::CarlaEngineBasePort(%s)", bool2str(isInput_));
  431. buffer = nullptr;
  432. }
  433. CarlaEngineBasePort::~CarlaEngineBasePort()
  434. {
  435. qDebug("CarlaEngineBasePort::~CarlaEngineBasePort()");
  436. #ifdef CARLA_ENGINE_JACK
  437. # ifndef BUILD_BRIDGE
  438. if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK)
  439. # endif
  440. {
  441. if (handle.jackClient && handle.jackPort)
  442. jack_port_unregister(handle.jackClient, handle.jackPort);
  443. }
  444. #endif
  445. }
  446. // -------------------------------------------------------------------------------------------------------------------
  447. // Carla Engine Port (Audio)
  448. CarlaEngineAudioPort::CarlaEngineAudioPort(const CarlaEnginePortNativeHandle& handle, bool isInput)
  449. : CarlaEngineBasePort(handle, isInput)
  450. {
  451. qDebug("CarlaEngineAudioPort::CarlaEngineAudioPort(%s)", bool2str(isInput));
  452. }
  453. void CarlaEngineAudioPort::initBuffer(CarlaEngine* const /*engine*/)
  454. {
  455. }
  456. #ifdef CARLA_ENGINE_JACK
  457. float* CarlaEngineAudioPort::getJackAudioBuffer(uint32_t nframes)
  458. {
  459. # ifndef BUILD_BRIDGE
  460. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  461. return nullptr;
  462. # endif
  463. Q_ASSERT(handle.jackPort);
  464. return (float*)jack_port_get_buffer(handle.jackPort, nframes);
  465. }
  466. #endif
  467. // -------------------------------------------------------------------------------------------------------------------
  468. // Carla Engine Port (Control)
  469. CarlaEngineControlPort::CarlaEngineControlPort(const CarlaEnginePortNativeHandle& handle, bool isInput)
  470. : CarlaEngineBasePort(handle, isInput)
  471. {
  472. qDebug("CarlaEngineControlPort::CarlaEngineControlPort(%s)", bool2str(isInput));
  473. }
  474. void CarlaEngineControlPort::initBuffer(CarlaEngine* const engine)
  475. {
  476. Q_ASSERT(engine);
  477. #ifndef BUILD_BRIDGE
  478. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  479. {
  480. buffer = isInput ? engine->rackControlEventsIn : engine->rackControlEventsOut;
  481. return;
  482. }
  483. #endif
  484. #ifdef CARLA_ENGINE_JACK
  485. if (handle.jackPort)
  486. {
  487. buffer = jack_port_get_buffer(handle.jackPort, engine->getBufferSize());
  488. if (! isInput)
  489. jack_midi_clear_buffer(buffer);
  490. }
  491. #endif
  492. }
  493. uint32_t CarlaEngineControlPort::getEventCount()
  494. {
  495. if (! isInput)
  496. return 0;
  497. Q_ASSERT(buffer);
  498. #ifndef BUILD_BRIDGE
  499. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  500. {
  501. uint32_t count = 0;
  502. const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  503. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS; i++)
  504. {
  505. if (events[i].type != CarlaEngineEventNull)
  506. count++;
  507. else
  508. break;
  509. }
  510. return count;
  511. }
  512. #endif
  513. #ifdef CARLA_ENGINE_JACK
  514. return jack_midi_get_event_count(buffer);
  515. #else
  516. return 0;
  517. #endif
  518. }
  519. const CarlaEngineControlEvent* CarlaEngineControlPort::getEvent(uint32_t index)
  520. {
  521. if (! isInput)
  522. return nullptr;
  523. Q_ASSERT(buffer);
  524. Q_ASSERT(index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS);
  525. #ifndef BUILD_BRIDGE
  526. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  527. {
  528. const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  529. if (index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS)
  530. return &events[index];
  531. return nullptr;
  532. }
  533. #endif
  534. #ifdef CARLA_ENGINE_JACK
  535. static jack_midi_event_t jackEvent;
  536. static CarlaEngineControlEvent carlaEvent;
  537. if (jack_midi_event_get(&jackEvent, buffer, index) != 0)
  538. return nullptr;
  539. memset(&carlaEvent, 0, sizeof(CarlaEngineControlEvent));
  540. uint8_t midiStatus = jackEvent.buffer[0];
  541. uint8_t midiChannel = midiStatus & 0x0F;
  542. carlaEvent.time = jackEvent.time;
  543. carlaEvent.channel = midiChannel;
  544. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  545. {
  546. uint8_t midiControl = jackEvent.buffer[1];
  547. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  548. {
  549. uint8_t midiBank = jackEvent.buffer[2];
  550. carlaEvent.type = CarlaEngineEventMidiBankChange;
  551. carlaEvent.value = midiBank;
  552. }
  553. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  554. {
  555. carlaEvent.type = CarlaEngineEventAllSoundOff;
  556. }
  557. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  558. {
  559. carlaEvent.type = CarlaEngineEventAllNotesOff;
  560. }
  561. else
  562. {
  563. uint8_t midiValue = jackEvent.buffer[2];
  564. carlaEvent.type = CarlaEngineEventControlChange;
  565. carlaEvent.controller = midiControl;
  566. carlaEvent.value = double(midiValue)/127;
  567. }
  568. return &carlaEvent;
  569. }
  570. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  571. {
  572. uint8_t midiProgram = jackEvent.buffer[1];
  573. carlaEvent.type = CarlaEngineEventMidiProgramChange;
  574. carlaEvent.value = midiProgram;
  575. return &carlaEvent;
  576. }
  577. #endif
  578. return nullptr;
  579. }
  580. void CarlaEngineControlPort::writeEvent(CarlaEngineControlEventType type, uint32_t time, uint8_t channel, uint8_t controller, double value)
  581. {
  582. if (isInput)
  583. return;
  584. Q_ASSERT(buffer);
  585. Q_ASSERT(type != CarlaEngineEventNull);
  586. #ifndef BUILD_BRIDGE
  587. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  588. {
  589. CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer;
  590. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS; i++)
  591. {
  592. if (events[i].type == CarlaEngineEventNull)
  593. {
  594. events[i].type = type;
  595. events[i].time = time;
  596. events[i].value = value;
  597. events[i].channel = channel;
  598. events[i].controller = controller;
  599. break;
  600. }
  601. }
  602. return;
  603. }
  604. #endif
  605. #ifdef CARLA_ENGINE_JACK
  606. if (type == CarlaEngineEventControlChange && MIDI_IS_CONTROL_BANK_SELECT(controller))
  607. type = CarlaEngineEventMidiBankChange;
  608. uint8_t data[4] = { 0 };
  609. switch (type)
  610. {
  611. case CarlaEngineEventNull:
  612. break;
  613. case CarlaEngineEventControlChange:
  614. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  615. data[1] = controller;
  616. data[2] = value * 127;
  617. jack_midi_event_write(buffer, time, data, 3);
  618. break;
  619. case CarlaEngineEventMidiBankChange:
  620. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  621. data[1] = MIDI_CONTROL_BANK_SELECT;
  622. data[2] = value;
  623. jack_midi_event_write(buffer, time, data, 3);
  624. break;
  625. case CarlaEngineEventMidiProgramChange:
  626. data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
  627. data[1] = value;
  628. jack_midi_event_write(buffer, time, data, 2);
  629. break;
  630. case CarlaEngineEventAllSoundOff:
  631. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  632. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  633. jack_midi_event_write(buffer, time, data, 2);
  634. break;
  635. case CarlaEngineEventAllNotesOff:
  636. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  637. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  638. jack_midi_event_write(buffer, time, data, 2);
  639. break;
  640. }
  641. #endif
  642. }
  643. // -------------------------------------------------------------------------------------------------------------------
  644. // Carla Engine Port (MIDI)
  645. CarlaEngineMidiPort::CarlaEngineMidiPort(const CarlaEnginePortNativeHandle& handle, bool isInput)
  646. : CarlaEngineBasePort(handle, isInput)
  647. {
  648. qDebug("CarlaEngineMidiPort::CarlaEngineMidiPort(%s)", bool2str(isInput));
  649. }
  650. void CarlaEngineMidiPort::initBuffer(CarlaEngine* const engine)
  651. {
  652. Q_ASSERT(engine);
  653. #ifndef BUILD_BRIDGE
  654. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  655. {
  656. buffer = isInput ? engine->rackMidiEventsIn : engine->rackMidiEventsOut;
  657. return;
  658. }
  659. #endif
  660. #ifdef CARLA_ENGINE_JACK
  661. if (handle.jackPort)
  662. {
  663. buffer = jack_port_get_buffer(handle.jackPort, engine->getBufferSize());
  664. if (! isInput)
  665. jack_midi_clear_buffer(buffer);
  666. }
  667. #endif
  668. }
  669. uint32_t CarlaEngineMidiPort::getEventCount()
  670. {
  671. if (! isInput)
  672. return 0;
  673. Q_ASSERT(buffer);
  674. #ifndef BUILD_BRIDGE
  675. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  676. {
  677. uint32_t count = 0;
  678. const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  679. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_MIDI_EVENTS; i++)
  680. {
  681. if (events[i].size > 0)
  682. count++;
  683. else
  684. break;
  685. }
  686. return count;
  687. }
  688. #endif
  689. #ifdef CARLA_ENGINE_JACK
  690. return jack_midi_get_event_count(buffer);
  691. #else
  692. return 0;
  693. #endif
  694. }
  695. const CarlaEngineMidiEvent* CarlaEngineMidiPort::getEvent(uint32_t index)
  696. {
  697. if (! isInput)
  698. return nullptr;
  699. Q_ASSERT(buffer);
  700. Q_ASSERT(index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS);
  701. #ifndef BUILD_BRIDGE
  702. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  703. {
  704. const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  705. if (index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS)
  706. return &events[index];
  707. return nullptr;
  708. }
  709. #endif
  710. #ifdef CARLA_ENGINE_JACK
  711. static jack_midi_event_t jackEvent;
  712. static CarlaEngineMidiEvent carlaEvent;
  713. if (jack_midi_event_get(&jackEvent, buffer, index) == 0 && jackEvent.size <= 4)
  714. {
  715. carlaEvent.time = jackEvent.time;
  716. carlaEvent.size = jackEvent.size;
  717. memcpy(carlaEvent.data, jackEvent.buffer, jackEvent.size);
  718. return &carlaEvent;
  719. }
  720. #endif
  721. return nullptr;
  722. }
  723. void CarlaEngineMidiPort::writeEvent(uint32_t time, uint8_t* data, uint8_t size)
  724. {
  725. if (isInput)
  726. return;
  727. Q_ASSERT(buffer);
  728. Q_ASSERT(data);
  729. Q_ASSERT(size > 0);
  730. #ifndef BUILD_BRIDGE
  731. if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK)
  732. {
  733. if (size > 4)
  734. return;
  735. CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer;
  736. for (unsigned short i=0; i < CarlaEngine::MAX_ENGINE_MIDI_EVENTS; i++)
  737. {
  738. if (events[i].size == 0)
  739. {
  740. events[i].time = time;
  741. events[i].size = size;
  742. memcpy(events[i].data, data, size);
  743. break;
  744. }
  745. }
  746. return;
  747. }
  748. #endif
  749. #ifdef CARLA_ENGINE_JACK
  750. jack_midi_event_write(buffer, time, data, size);
  751. #endif
  752. }
  753. // -------------------------------------------------------------------------------------------------------------------
  754. // Carla Engine OSC stuff
  755. void CarlaEngine::osc_send_add_plugin(const int32_t pluginId, const char* const pluginName)
  756. {
  757. qDebug("CarlaEngine::osc_send_add_plugin(%i, \"%s\")", pluginId, pluginName);
  758. Q_ASSERT(m_oscData);
  759. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  760. Q_ASSERT(pluginName);
  761. if (m_oscData && m_oscData->target)
  762. {
  763. char target_path[strlen(m_oscData->path)+12];
  764. strcpy(target_path, m_oscData->path);
  765. strcat(target_path, "/add_plugin");
  766. lo_send(m_oscData->target, target_path, "is", pluginId, pluginName);
  767. }
  768. }
  769. void CarlaEngine::osc_send_remove_plugin(const int32_t pluginId)
  770. {
  771. qDebug("CarlaEngine::osc_send_remove_plugin(%i)", pluginId);
  772. Q_ASSERT(m_oscData);
  773. if (m_oscData && m_oscData->target)
  774. {
  775. char target_path[strlen(m_oscData->path)+15];
  776. strcpy(target_path, m_oscData->path);
  777. strcat(target_path, "/remove_plugin");
  778. lo_send(m_oscData->target, target_path, "i", pluginId);
  779. }
  780. }
  781. void CarlaEngine::osc_send_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)
  782. {
  783. qDebug("CarlaEngine::osc_send_set_plugin_data(%i, %i, %i, %i, \"%s\", \"%s\", \"%s\", \"%s\", %li)", pluginId, type, category, hints, realName, label, maker, copyright, uniqueId);
  784. Q_ASSERT(m_oscData);
  785. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  786. Q_ASSERT(type != PLUGIN_NONE);
  787. if (m_oscData && m_oscData->target)
  788. {
  789. char target_path[strlen(m_oscData->path)+17];
  790. strcpy(target_path, m_oscData->path);
  791. strcat(target_path, "/set_plugin_data");
  792. lo_send(m_oscData->target, target_path, "iiiissssh", pluginId, type, category, hints, realName, label, maker, copyright, uniqueId);
  793. }
  794. }
  795. void CarlaEngine::osc_send_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)
  796. {
  797. qDebug("CarlaEngine::osc_send_set_plugin_ports(%i, %i, %i, %i, %i, %i, %i, %i)", pluginId, audioIns, audioOuts, midiIns, midiOuts, cIns, cOuts, cTotals);
  798. Q_ASSERT(m_oscData);
  799. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  800. if (m_oscData && m_oscData->target)
  801. {
  802. char target_path[strlen(m_oscData->path)+18];
  803. strcpy(target_path, m_oscData->path);
  804. strcat(target_path, "/set_plugin_ports");
  805. lo_send(m_oscData->target, target_path, "iiiiiiii", pluginId, audioIns, audioOuts, midiIns, midiOuts, cIns, cOuts, cTotals);
  806. }
  807. }
  808. void CarlaEngine::osc_send_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)
  809. {
  810. qDebug("CarlaEngine::osc_send_set_parameter_data(%i, %i, %i, %i, \"%s\", \"%s\", %g)", pluginId, index, type, hints, name, label, current);
  811. Q_ASSERT(m_oscData);
  812. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  813. Q_ASSERT(index >= 0);
  814. Q_ASSERT(type != PARAMETER_UNKNOWN);
  815. if (m_oscData && m_oscData->target)
  816. {
  817. char target_path[strlen(m_oscData->path)+20];
  818. strcpy(target_path, m_oscData->path);
  819. strcat(target_path, "/set_parameter_data");
  820. lo_send(m_oscData->target, target_path, "iiiissd", pluginId, index, type, hints, name, label, current);
  821. }
  822. }
  823. void CarlaEngine::osc_send_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)
  824. {
  825. qDebug("CarlaEngine::osc_send_set_parameter_ranges(%i, %i, %g, %g, %g, %g, %g, %g)", pluginId, index, min, max, def, step, stepSmall, stepLarge);
  826. Q_ASSERT(m_oscData);
  827. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  828. Q_ASSERT(index >= 0);
  829. Q_ASSERT(min < max);
  830. if (m_oscData && m_oscData->target)
  831. {
  832. char target_path[strlen(m_oscData->path)+22];
  833. strcpy(target_path, m_oscData->path);
  834. strcat(target_path, "/set_parameter_ranges");
  835. lo_send(m_oscData->target, target_path, "iidddddd", pluginId, index, min, max, def, step, stepSmall, stepLarge);
  836. }
  837. }
  838. void CarlaEngine::osc_send_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc)
  839. {
  840. qDebug("CarlaEngine::osc_send_set_parameter_midi_cc(%i, %i, %i)", pluginId, index, cc);
  841. Q_ASSERT(m_oscData);
  842. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  843. Q_ASSERT(index >= 0);
  844. if (m_oscData && m_oscData->target)
  845. {
  846. char target_path[strlen(m_oscData->path)+23];
  847. strcpy(target_path, m_oscData->path);
  848. strcat(target_path, "/set_parameter_midi_cc");
  849. lo_send(m_oscData->target, target_path, "iii", pluginId, index, cc);
  850. }
  851. }
  852. void CarlaEngine::osc_send_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel)
  853. {
  854. qDebug("CarlaEngine::osc_send_set_parameter_midi_channel(%i, %i, %i)", pluginId, index, channel);
  855. Q_ASSERT(m_oscData);
  856. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  857. Q_ASSERT(index >= 0);
  858. Q_ASSERT(channel >= 0 && channel < 16);
  859. if (m_oscData && m_oscData->target)
  860. {
  861. char target_path[strlen(m_oscData->path)+28];
  862. strcpy(target_path, m_oscData->path);
  863. strcat(target_path, "/set_parameter_midi_channel");
  864. lo_send(m_oscData->target, target_path, "iii", pluginId, index, channel);
  865. }
  866. }
  867. void CarlaEngine::osc_send_set_parameter_value(const int32_t pluginId, const int32_t index, const double value)
  868. {
  869. #if DEBUG
  870. if (index < 0)
  871. qDebug("CarlaEngine::osc_send_set_parameter_value(%i, %s, %g)", pluginId, InternalParametersIndex2str((InternalParametersIndex)index), value);
  872. else
  873. qDebug("CarlaEngine::osc_send_set_parameter_value(%i, %i, %g)", pluginId, index, value);
  874. #endif
  875. Q_ASSERT(m_oscData);
  876. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  877. if (m_oscData && m_oscData->target)
  878. {
  879. char target_path[strlen(m_oscData->path)+21];
  880. strcpy(target_path, m_oscData->path);
  881. strcat(target_path, "/set_parameter_value");
  882. lo_send(m_oscData->target, target_path, "iid", pluginId, index, value);
  883. }
  884. }
  885. void CarlaEngine::osc_send_set_default_value(const int32_t pluginId, const int32_t index, const double value)
  886. {
  887. qDebug("CarlaEngine::osc_send_set_default_value(%i, %i, %g)", pluginId, index, value);
  888. Q_ASSERT(m_oscData);
  889. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  890. Q_ASSERT(index >= 0);
  891. if (m_oscData && m_oscData->target)
  892. {
  893. char target_path[strlen(m_oscData->path)+19];
  894. strcpy(target_path, m_oscData->path);
  895. strcat(target_path, "/set_default_value");
  896. lo_send(m_oscData->target, target_path, "iid", pluginId, index, value);
  897. }
  898. }
  899. void CarlaEngine::osc_send_set_program(const int32_t pluginId, const int32_t index)
  900. {
  901. qDebug("CarlaEngine::osc_send_set_program(%i, %i)", pluginId, index);
  902. Q_ASSERT(m_oscData);
  903. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  904. if (m_oscData && m_oscData->target)
  905. {
  906. char target_path[strlen(m_oscData->path)+13];
  907. strcpy(target_path, m_oscData->path);
  908. strcat(target_path, "/set_program");
  909. lo_send(m_oscData->target, target_path, "ii", pluginId, index);
  910. }
  911. }
  912. void CarlaEngine::osc_send_set_program_count(const int32_t pluginId, const int32_t count)
  913. {
  914. qDebug("CarlaEngine::osc_send_set_program_count(%i, %i)", pluginId, count);
  915. Q_ASSERT(m_oscData);
  916. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  917. Q_ASSERT(count >= 0);
  918. if (m_oscData && m_oscData->target)
  919. {
  920. char target_path[strlen(m_oscData->path)+19];
  921. strcpy(target_path, m_oscData->path);
  922. strcat(target_path, "/set_program_count");
  923. lo_send(m_oscData->target, target_path, "ii", pluginId, count);
  924. }
  925. }
  926. void CarlaEngine::osc_send_set_program_name(const int32_t pluginId, const int32_t index, const char* const name)
  927. {
  928. qDebug("CarlaEngine::osc_send_set_program_name(%i, %i, %s)", pluginId, index, name);
  929. Q_ASSERT(m_oscData);
  930. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  931. Q_ASSERT(index >= 0);
  932. Q_ASSERT(name);
  933. if (m_oscData && m_oscData->target)
  934. {
  935. char target_path[strlen(m_oscData->path)+18];
  936. strcpy(target_path, m_oscData->path);
  937. strcat(target_path, "/set_program_name");
  938. lo_send(m_oscData->target, target_path, "iis", pluginId, index, name);
  939. }
  940. }
  941. void CarlaEngine::osc_send_set_midi_program(const int32_t pluginId, const int32_t index)
  942. {
  943. qDebug("CarlaEngine::osc_send_set_midi_program(%i, %i)", pluginId, index);
  944. Q_ASSERT(m_oscData);
  945. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  946. if (m_oscData && m_oscData->target)
  947. {
  948. char target_path[strlen(m_oscData->path)+18];
  949. strcpy(target_path, m_oscData->path);
  950. strcat(target_path, "/set_midi_program");
  951. lo_send(m_oscData->target, target_path, "ii", pluginId, index);
  952. }
  953. }
  954. void CarlaEngine::osc_send_set_midi_program_count(const int32_t pluginId, const int32_t count)
  955. {
  956. qDebug("CarlaEngine::osc_send_set_midi_program_count(%i, %i)", pluginId, count);
  957. Q_ASSERT(m_oscData);
  958. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  959. Q_ASSERT(count >= 0);
  960. if (m_oscData && m_oscData->target)
  961. {
  962. char target_path[strlen(m_oscData->path)+24];
  963. strcpy(target_path, m_oscData->path);
  964. strcat(target_path, "/set_midi_program_count");
  965. lo_send(m_oscData->target, target_path, "ii", pluginId, count);
  966. }
  967. }
  968. void CarlaEngine::osc_send_set_midi_program_data(const int32_t pluginId, const int32_t index, const int32_t bank, const int32_t program, const char* const name)
  969. {
  970. qDebug("CarlaEngine::osc_send_set_midi_program_data(%i, %i, %i, %i, %s)", pluginId, index, bank, program, name);
  971. Q_ASSERT(m_oscData);
  972. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  973. Q_ASSERT(index >= 0);
  974. Q_ASSERT(bank >= 0);
  975. Q_ASSERT(program >= 0);
  976. Q_ASSERT(name);
  977. if (m_oscData && m_oscData->target)
  978. {
  979. char target_path[strlen(m_oscData->path)+23];
  980. strcpy(target_path, m_oscData->path);
  981. strcat(target_path, "/set_midi_program_data");
  982. lo_send(m_oscData->target, target_path, "iiiis", pluginId, index, bank, program, name);
  983. }
  984. }
  985. void CarlaEngine::osc_send_set_input_peak_value(const int32_t pluginId, const int32_t portId, const double value)
  986. {
  987. qDebug("CarlaEngine::osc_send_set_input_peak_value(%i, %i, %g)", pluginId, portId, value);
  988. Q_ASSERT(m_oscData);
  989. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  990. Q_ASSERT(portId == 1 || portId == 2);
  991. if (m_oscData && m_oscData->target)
  992. {
  993. char target_path[strlen(m_oscData->path)+22];
  994. strcpy(target_path, m_oscData->path);
  995. strcat(target_path, "/set_input_peak_value");
  996. lo_send(m_oscData->target, target_path, "iid", pluginId, portId, value);
  997. }
  998. }
  999. void CarlaEngine::osc_send_set_output_peak_value(const int32_t pluginId, const int32_t portId, const double value)
  1000. {
  1001. qDebug("CarlaEngine::osc_send_set_output_peak_value(%i, %i, %g)", pluginId, portId, value);
  1002. Q_ASSERT(m_oscData);
  1003. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  1004. Q_ASSERT(portId == 1 || portId == 2);
  1005. if (m_oscData && m_oscData->target)
  1006. {
  1007. char target_path[strlen(m_oscData->path)+23];
  1008. strcpy(target_path, m_oscData->path);
  1009. strcat(target_path, "/set_output_peak_value");
  1010. lo_send(m_oscData->target, target_path, "iid", pluginId, portId, value);
  1011. }
  1012. }
  1013. void CarlaEngine::osc_send_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo)
  1014. {
  1015. qDebug("CarlaEngine::osc_send_note_on(%i, %i, %i, %i)", pluginId, channel, note, velo);
  1016. Q_ASSERT(m_oscData);
  1017. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  1018. Q_ASSERT(channel >= 0 && channel < 16);
  1019. Q_ASSERT(note >= 0 && note < 128);
  1020. Q_ASSERT(velo >= 0 && velo < 128);
  1021. if (m_oscData && m_oscData->target)
  1022. {
  1023. char target_path[strlen(m_oscData->path)+9];
  1024. strcpy(target_path, m_oscData->path);
  1025. strcat(target_path, "/note_on");
  1026. lo_send(m_oscData->target, target_path, "iiii", pluginId, channel, note, velo);
  1027. }
  1028. }
  1029. void CarlaEngine::osc_send_note_off(const int32_t pluginId, const int32_t channel, const int32_t note)
  1030. {
  1031. qDebug("CarlaEngine::osc_send_note_off(%i, %i, %i)", pluginId, channel, note);
  1032. Q_ASSERT(m_oscData);
  1033. Q_ASSERT(pluginId >= 0 && pluginId < MAX_PLUGINS);
  1034. Q_ASSERT(channel >= 0 && channel < 16);
  1035. Q_ASSERT(note >= 0 && note < 128);
  1036. if (m_oscData && m_oscData->target)
  1037. {
  1038. char target_path[strlen(m_oscData->path)+10];
  1039. strcpy(target_path, m_oscData->path);
  1040. strcat(target_path, "/note_off");
  1041. lo_send(m_oscData->target, target_path, "iii", pluginId, channel, note);
  1042. }
  1043. }
  1044. void CarlaEngine::osc_send_exit()
  1045. {
  1046. qDebug("CarlaEngine::osc_send_exit()");
  1047. Q_ASSERT(m_oscData);
  1048. if (m_oscData && m_oscData->target)
  1049. {
  1050. char target_path[strlen(m_oscData->path)+6];
  1051. strcpy(target_path, m_oscData->path);
  1052. strcat(target_path, "/exit");
  1053. lo_send(m_oscData->target, target_path, "");
  1054. }
  1055. }
  1056. CARLA_BACKEND_END_NAMESPACE