Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2241 lines
74KB

  1. /*
  2. * Carla JACK Engine
  3. * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or 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 GPL.txt file
  16. */
  17. #include "CarlaEngineInternal.hpp"
  18. #include "CarlaBackendUtils.hpp"
  19. #include "CarlaMIDI.h"
  20. #ifdef JACKBRIDGE_EXPORT
  21. # include "jackbridge/JackBridge.hpp"
  22. #else
  23. # include "jackbridge/JackBridge1.cpp"
  24. # include "jackbridge/JackBridge2.cpp"
  25. #endif
  26. #include <cmath>
  27. #include <QtCore/QStringList>
  28. #define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon"
  29. CARLA_BACKEND_START_NAMESPACE
  30. #if 0
  31. } // Fix editor indentation
  32. #endif
  33. // -------------------------------------------------------------------------------------------------------------------
  34. // Fallback data
  35. static const EngineEvent kFallbackJackEngineEvent;
  36. // -------------------------------------------------------------------------------------------------------------------
  37. // Plugin Helpers, defined in CarlaPlugin.cpp
  38. extern CarlaEngine* CarlaPluginGetEngine(CarlaPlugin* const plugin);
  39. extern CarlaEngineClient* CarlaPluginGetEngineClient(CarlaPlugin* const plugin);
  40. extern CarlaEngineAudioPort* CarlaPluginGetAudioInPort(CarlaPlugin* const plugin, uint32_t index);
  41. extern CarlaEngineAudioPort* CarlaPluginGetAudioOutPort(CarlaPlugin* const plugin, uint32_t index);
  42. // -------------------------------------------------------------------------------------------------------------------
  43. // Carla Engine JACK-Audio port
  44. class CarlaEngineJackAudioPort : public CarlaEngineAudioPort
  45. {
  46. public:
  47. CarlaEngineJackAudioPort(const bool isInput, const ProcessMode processMode, jack_client_t* const client, jack_port_t* const port)
  48. : CarlaEngineAudioPort(isInput, processMode),
  49. kClient(client),
  50. kPort(port)
  51. {
  52. carla_debug("CarlaEngineJackAudioPort::CarlaEngineJackAudioPort(%s, %s, %p, %p)", bool2str(isInput), ProcessMode2Str(processMode), client, port);
  53. if (processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  54. {
  55. CARLA_ASSERT(client != nullptr && port != nullptr);
  56. }
  57. else
  58. {
  59. CARLA_ASSERT(client == nullptr && port == nullptr);
  60. }
  61. }
  62. ~CarlaEngineJackAudioPort() override
  63. {
  64. carla_debug("CarlaEngineJackAudioPort::~CarlaEngineJackAudioPort()");
  65. if (kClient != nullptr && kPort != nullptr)
  66. jackbridge_port_unregister(kClient, kPort);
  67. }
  68. void initBuffer(CarlaEngine* const engine) override
  69. {
  70. CARLA_ASSERT(engine != nullptr);
  71. if (engine == nullptr)
  72. return;
  73. if (kPort == nullptr)
  74. return CarlaEngineAudioPort::initBuffer(engine);
  75. const uint32_t bufferSize(engine->getBufferSize());
  76. fBuffer = (float*)jackbridge_port_get_buffer(kPort, bufferSize);
  77. if (! kIsInput)
  78. carla_zeroFloat(fBuffer, bufferSize);
  79. }
  80. private:
  81. jack_client_t* const kClient;
  82. jack_port_t* const kPort;
  83. friend class CarlaEngineJack;
  84. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackAudioPort)
  85. };
  86. // -------------------------------------------------------------------------------------------------------------------
  87. // Carla Engine JACK-CV port
  88. class CarlaEngineJackCVPort : public CarlaEngineCVPort
  89. {
  90. public:
  91. CarlaEngineJackCVPort(const bool isInput, const ProcessMode processMode, const uint32_t bufferSize, jack_client_t* const client, jack_port_t* const port)
  92. : CarlaEngineCVPort(isInput, processMode, bufferSize),
  93. kClient(client),
  94. kPort(port)
  95. {
  96. carla_debug("CarlaEngineJackCVPort::CarlaEngineJackCVPort(%s, %s, %p, %p)", bool2str(isInput), ProcessMode2Str(processMode), client, port);
  97. if (processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  98. {
  99. CARLA_ASSERT(client != nullptr && port != nullptr);
  100. }
  101. else
  102. {
  103. CARLA_ASSERT(client == nullptr && port == nullptr);
  104. }
  105. }
  106. ~CarlaEngineJackCVPort() override
  107. {
  108. carla_debug("CarlaEngineJackCVPort::~CarlaEngineJackCVPort()");
  109. if (kClient != nullptr && kPort != nullptr)
  110. jackbridge_port_unregister(kClient, kPort);
  111. }
  112. void initBuffer(CarlaEngine* const engine) override
  113. {
  114. CARLA_ASSERT(engine != nullptr);
  115. if (engine == nullptr)
  116. return;
  117. if (kPort == nullptr)
  118. return CarlaEngineCVPort::initBuffer(engine);
  119. CARLA_ASSERT(engine->getBufferSize() == fBufferSize);
  120. if (kIsInput)
  121. {
  122. float* const jackBuffer((float*)jackbridge_port_get_buffer(kPort, fBufferSize));
  123. carla_copyFloat(fBuffer, jackBuffer, fBufferSize);
  124. }
  125. else
  126. {
  127. carla_zeroFloat(fBuffer, fBufferSize);
  128. }
  129. }
  130. void writeBuffer(const uint32_t frames, const uint32_t timeOffset) override
  131. {
  132. CARLA_ASSERT(! kIsInput);
  133. if (kIsInput)
  134. return;
  135. float* const jackBuffer((float*)jackbridge_port_get_buffer(kPort, fBufferSize));
  136. carla_copyFloat(jackBuffer+timeOffset, fBuffer, frames);
  137. }
  138. private:
  139. jack_client_t* const kClient;
  140. jack_port_t* const kPort;
  141. friend class CarlaEngineJack;
  142. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackCVPort)
  143. };
  144. // -------------------------------------------------------------------------------------------------------------------
  145. // Carla Engine JACK-Event port
  146. class CarlaEngineJackEventPort : public CarlaEngineEventPort
  147. {
  148. public:
  149. CarlaEngineJackEventPort(const bool isInput, const ProcessMode processMode, jack_client_t* const client, jack_port_t* const port)
  150. : CarlaEngineEventPort(isInput, processMode),
  151. kClient(client),
  152. kPort(port),
  153. fJackBuffer(nullptr)
  154. {
  155. carla_debug("CarlaEngineJackEventPort::CarlaEngineJackEventPort(%s, %s, %p, %p)", bool2str(isInput), ProcessMode2Str(processMode), client, port);
  156. if (processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  157. {
  158. CARLA_ASSERT(client != nullptr && port != nullptr);
  159. }
  160. else
  161. {
  162. CARLA_ASSERT(client == nullptr && port == nullptr);
  163. }
  164. }
  165. ~CarlaEngineJackEventPort() override
  166. {
  167. carla_debug("CarlaEngineJackEventPort::~CarlaEngineJackEventPort()");
  168. if (kClient != nullptr && kPort != nullptr)
  169. jackbridge_port_unregister(kClient, kPort);
  170. }
  171. void initBuffer(CarlaEngine* const engine) override
  172. {
  173. CARLA_ASSERT(engine != nullptr);
  174. if (engine == nullptr)
  175. return;
  176. if (kPort == nullptr)
  177. return CarlaEngineEventPort::initBuffer(engine);
  178. fJackBuffer = jackbridge_port_get_buffer(kPort, engine->getBufferSize());
  179. if (! kIsInput)
  180. jackbridge_midi_clear_buffer(fJackBuffer);
  181. }
  182. uint32_t getEventCount() const override
  183. {
  184. if (kPort == nullptr)
  185. return CarlaEngineEventPort::getEventCount();
  186. CARLA_ASSERT(kIsInput);
  187. CARLA_ASSERT(fJackBuffer != nullptr);
  188. if (! kIsInput)
  189. return 0;
  190. if (fJackBuffer == nullptr)
  191. return 0;
  192. return jackbridge_midi_get_event_count(fJackBuffer);
  193. }
  194. const EngineEvent& getEvent(const uint32_t index) override
  195. {
  196. if (kPort == nullptr)
  197. return CarlaEngineEventPort::getEvent(index);
  198. CARLA_ASSERT(kIsInput);
  199. CARLA_ASSERT(fJackBuffer != nullptr);
  200. if (! kIsInput)
  201. return kFallbackJackEngineEvent;
  202. if (fJackBuffer == nullptr)
  203. return kFallbackJackEngineEvent;
  204. jack_midi_event_t jackEvent;
  205. carla_zeroStruct<jack_midi_event_t>(jackEvent);
  206. if (! jackbridge_midi_event_get(&jackEvent, fJackBuffer, index))
  207. return kFallbackJackEngineEvent;
  208. if (jackEvent.size == 0 || jackEvent.size > 4)
  209. return kFallbackJackEngineEvent;
  210. fRetEvent.clear();
  211. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  212. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  213. fRetEvent.time = jackEvent.time;
  214. fRetEvent.channel = midiChannel;
  215. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  216. {
  217. CARLA_ASSERT(jackEvent.size == 2 || jackEvent.size == 3);
  218. const uint8_t midiControl = jackEvent.buffer[1];
  219. fRetEvent.type = kEngineEventTypeControl;
  220. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  221. {
  222. const uint8_t midiBank = jackEvent.buffer[2];
  223. fRetEvent.ctrl.type = kEngineControlEventTypeMidiBank;
  224. fRetEvent.ctrl.param = midiBank;
  225. fRetEvent.ctrl.value = 0.0f;
  226. }
  227. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  228. {
  229. fRetEvent.ctrl.type = kEngineControlEventTypeAllSoundOff;
  230. fRetEvent.ctrl.param = 0;
  231. fRetEvent.ctrl.value = 0.0f;
  232. }
  233. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  234. {
  235. fRetEvent.ctrl.type = kEngineControlEventTypeAllNotesOff;
  236. fRetEvent.ctrl.param = 0;
  237. fRetEvent.ctrl.value = 0.0f;
  238. }
  239. else
  240. {
  241. CARLA_ASSERT(jackEvent.size == 3);
  242. const uint8_t midiValue = jackEvent.buffer[2];
  243. fRetEvent.ctrl.type = kEngineControlEventTypeParameter;
  244. fRetEvent.ctrl.param = midiControl;
  245. fRetEvent.ctrl.value = float(midiValue)/127.0f;
  246. }
  247. }
  248. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  249. {
  250. CARLA_ASSERT(jackEvent.size == 2);
  251. const uint8_t midiProgram = jackEvent.buffer[1];
  252. fRetEvent.type = kEngineEventTypeControl;
  253. fRetEvent.ctrl.type = kEngineControlEventTypeMidiProgram;
  254. fRetEvent.ctrl.param = midiProgram;
  255. fRetEvent.ctrl.value = 0.0f;
  256. }
  257. else
  258. {
  259. fRetEvent.type = kEngineEventTypeMidi;
  260. fRetEvent.midi.data[0] = midiStatus;
  261. fRetEvent.midi.size = static_cast<uint8_t>(jackEvent.size);
  262. if (jackEvent.size > 1)
  263. carla_copy<uint8_t>(fRetEvent.midi.data+1, jackEvent.buffer+1, jackEvent.size-1);
  264. }
  265. return fRetEvent;
  266. }
  267. void writeControlEvent(const uint32_t time, const uint8_t channel, const EngineControlEventType type, const uint16_t param, const float value) override
  268. {
  269. if (kPort == nullptr)
  270. return CarlaEngineEventPort::writeControlEvent(time, channel, type, param, value);
  271. CARLA_ASSERT(! kIsInput);
  272. CARLA_ASSERT(fJackBuffer != nullptr);
  273. CARLA_ASSERT(type != kEngineControlEventTypeNull);
  274. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  275. CARLA_ASSERT(param < MAX_MIDI_VALUE);
  276. CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f);
  277. if (kIsInput)
  278. return;
  279. if (fJackBuffer == nullptr)
  280. return;
  281. if (type == kEngineControlEventTypeNull)
  282. return;
  283. if (channel >= MAX_MIDI_CHANNELS)
  284. return;
  285. if (param >= MAX_MIDI_VALUE)
  286. return;
  287. if (type == kEngineControlEventTypeParameter)
  288. {
  289. CARLA_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(param));
  290. }
  291. const float fixedValue(carla_fixValue<float>(0.0f, 1.0f, value));
  292. size_t size = 0;
  293. jack_midi_data_t data[4] = { 0 };
  294. switch (type)
  295. {
  296. case kEngineControlEventTypeNull:
  297. break;
  298. case kEngineControlEventTypeParameter:
  299. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  300. data[1] = param;
  301. data[2] = fixedValue * 127.0f;
  302. size = 3;
  303. break;
  304. case kEngineControlEventTypeMidiBank:
  305. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  306. data[1] = MIDI_CONTROL_BANK_SELECT;
  307. data[2] = param;
  308. size = 3;
  309. break;
  310. case kEngineControlEventTypeMidiProgram:
  311. data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
  312. data[1] = param;
  313. size = 2;
  314. break;
  315. case kEngineControlEventTypeAllSoundOff:
  316. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  317. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  318. data[2] = 0;
  319. size = 3;
  320. break;
  321. case kEngineControlEventTypeAllNotesOff:
  322. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  323. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  324. data[2] = 0;
  325. size = 3;
  326. break;
  327. }
  328. if (size > 0)
  329. jackbridge_midi_event_write(fJackBuffer, time, data, size);
  330. }
  331. void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t port, const uint8_t* const data, const uint8_t size) override
  332. {
  333. if (kPort == nullptr)
  334. return CarlaEngineEventPort::writeMidiEvent(time, channel, port, data, size);
  335. CARLA_ASSERT(! kIsInput);
  336. CARLA_ASSERT(fJackBuffer != nullptr);
  337. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  338. CARLA_ASSERT(data != nullptr);
  339. CARLA_ASSERT(size != 0);
  340. if (kIsInput)
  341. return;
  342. if (fJackBuffer == nullptr)
  343. return;
  344. if (channel >= MAX_MIDI_CHANNELS)
  345. return;
  346. if (data == nullptr)
  347. return;
  348. if (size == 0)
  349. return;
  350. uint8_t jdata[size];
  351. carla_copy<uint8_t>(jdata, data, size);
  352. jdata[0] = MIDI_GET_STATUS_FROM_DATA(data) + channel;
  353. jackbridge_midi_event_write(fJackBuffer, time, jdata, size);
  354. }
  355. private:
  356. jack_client_t* const kClient;
  357. jack_port_t* const kPort;
  358. void* fJackBuffer;
  359. EngineEvent fRetEvent;
  360. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackEventPort)
  361. };
  362. // -------------------------------------------------------------------------------------------------------------------
  363. // Jack Engine client
  364. class CarlaEngineJackClient : public CarlaEngineClient
  365. {
  366. public:
  367. CarlaEngineJackClient(const CarlaEngine& engine, jack_client_t* const client)
  368. : CarlaEngineClient(engine),
  369. kClient(client),
  370. kUseClient(engine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || engine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  371. {
  372. carla_debug("CarlaEngineJackClient::CarlaEngineJackClient(name:\"%s\", %p)", engine.getName(), client);
  373. if (kUseClient)
  374. {
  375. CARLA_ASSERT(kClient != nullptr);
  376. }
  377. else
  378. {
  379. CARLA_ASSERT(kClient == nullptr);
  380. }
  381. }
  382. ~CarlaEngineJackClient() override
  383. {
  384. carla_debug("CarlaEngineClient::~CarlaEngineClient()");
  385. if (kEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS && kClient != nullptr)
  386. jackbridge_client_close(kClient);
  387. }
  388. void activate() override
  389. {
  390. carla_debug("CarlaEngineJackClient::activate()");
  391. if (kEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  392. {
  393. CARLA_ASSERT(kClient != nullptr && ! fActive);
  394. if (kClient != nullptr && ! fActive)
  395. jackbridge_activate(kClient);
  396. }
  397. CarlaEngineClient::activate();
  398. }
  399. void deactivate() override
  400. {
  401. carla_debug("CarlaEngineJackClient::deactivate()");
  402. if (kEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  403. {
  404. CARLA_ASSERT(kClient != nullptr && fActive);
  405. if (kClient != nullptr && fActive)
  406. jackbridge_deactivate(kClient);
  407. }
  408. CarlaEngineClient::deactivate();
  409. }
  410. bool isOk() const override
  411. {
  412. carla_debug("CarlaEngineJackClient::isOk()");
  413. if (kUseClient)
  414. return (kClient != nullptr);
  415. return CarlaEngineClient::isOk();
  416. }
  417. #if 0
  418. void setLatency(const uint32_t samples) override
  419. {
  420. CarlaEngineClient::setLatency(samples);
  421. if (kUseClient)
  422. jackbridge_recompute_total_latencies(kClient);
  423. }
  424. #endif
  425. CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) override
  426. {
  427. carla_debug("CarlaEngineJackClient::addPort(%s, \"%s\", %s)", EnginePortType2Str(portType), name, bool2str(isInput));
  428. jack_port_t* port = nullptr;
  429. // Create JACK port first, if needed
  430. if (kUseClient)
  431. {
  432. switch (portType)
  433. {
  434. case kEnginePortTypeNull:
  435. break;
  436. case kEnginePortTypeAudio:
  437. port = jackbridge_port_register(kClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  438. break;
  439. case kEnginePortTypeCV:
  440. port = jackbridge_port_register(kClient, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsControlVoltage | (isInput ? JackPortIsInput : JackPortIsOutput), 0);
  441. break;
  442. case kEnginePortTypeEvent:
  443. port = jackbridge_port_register(kClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  444. break;
  445. }
  446. }
  447. // Create Engine port
  448. switch (portType)
  449. {
  450. case kEnginePortTypeNull:
  451. break;
  452. case kEnginePortTypeAudio:
  453. return new CarlaEngineJackAudioPort(isInput, kEngine.getProccessMode(), kClient, port);
  454. case kEnginePortTypeCV:
  455. return new CarlaEngineJackCVPort(isInput, kEngine.getProccessMode(), kEngine.getBufferSize(), kClient, port);
  456. case kEnginePortTypeEvent:
  457. return new CarlaEngineJackEventPort(isInput, kEngine.getProccessMode(), kClient, port);
  458. }
  459. carla_stderr("CarlaEngineJackClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput));
  460. return nullptr;
  461. }
  462. private:
  463. jack_client_t* const kClient;
  464. const bool kUseClient;
  465. friend class CarlaEngineJack;
  466. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackClient)
  467. };
  468. // -------------------------------------------------------------------------------------------------------------------
  469. // Jack Engine
  470. class CarlaEngineJack : public CarlaEngine
  471. {
  472. public:
  473. CarlaEngineJack()
  474. : CarlaEngine(),
  475. fClient(nullptr),
  476. fTransportState(JackTransportStopped),
  477. fFreewheel(false),
  478. #ifdef BUILD_BRIDGE
  479. fHasQuit(false)
  480. #else
  481. # ifdef CARLA_PROPER_CPP11_SUPPORT
  482. fRackPorts{nullptr},
  483. # endif
  484. fLastGroupId(0),
  485. fLastPortId(0),
  486. fLastConnectionId(0)
  487. #endif
  488. {
  489. carla_debug("CarlaEngineJack::CarlaEngineJack()");
  490. #ifdef BUILD_BRIDGE
  491. fOptions.processMode = PROCESS_MODE_MULTIPLE_CLIENTS;
  492. #else
  493. # ifndef CARLA_PROPER_CPP11_SUPPORT
  494. carla_fill<jack_port_t*>(fRackPorts, kRackPortCount, nullptr);
  495. # endif
  496. #endif
  497. // FIXME: Always enable JACK transport for now
  498. fOptions.transportMode = TRANSPORT_MODE_JACK;
  499. carla_zeroStruct<jack_position_t>(fTransportPos);
  500. }
  501. ~CarlaEngineJack() override
  502. {
  503. carla_debug("CarlaEngineJack::~CarlaEngineJack()");
  504. CARLA_ASSERT(fClient == nullptr);
  505. #ifndef BUILD_BRIDGE
  506. fUsedGroupNames.clear();
  507. fUsedPortNames.clear();
  508. fUsedConnections.clear();
  509. fGroupIconsChanged.clear();
  510. #endif
  511. }
  512. // -------------------------------------------------------------------
  513. // Maximum values
  514. unsigned int maxClientNameSize() const override
  515. {
  516. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  517. return static_cast<unsigned int>(jackbridge_client_name_size());
  518. return CarlaEngine::maxClientNameSize();
  519. }
  520. unsigned int maxPortNameSize() const override
  521. {
  522. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  523. return static_cast<unsigned int>(jackbridge_port_name_size());
  524. return CarlaEngine::maxPortNameSize();
  525. }
  526. // -------------------------------------------------------------------
  527. // Virtual, per-engine type calls
  528. bool init(const char* const clientName) override
  529. {
  530. carla_debug("CarlaEngineJack::init(\"%s\")", clientName);
  531. fFreewheel = false;
  532. fTransportState = JackTransportStopped;
  533. carla_zeroStruct<jack_position_t>(fTransportPos);
  534. #ifndef BUILD_BRIDGE
  535. fLastGroupId = 0;
  536. fLastPortId = 0;
  537. fLastConnectionId = 0;
  538. fUsedGroupNames.clear();
  539. fUsedPortNames.clear();
  540. fUsedConnections.clear();
  541. fGroupIconsChanged.clear();
  542. fClient = jackbridge_client_open(clientName, JackNullOption, nullptr);
  543. if (fClient != nullptr)
  544. {
  545. fBufferSize = jackbridge_get_buffer_size(fClient);
  546. fSampleRate = jackbridge_get_sample_rate(fClient);
  547. jackbridge_custom_publish_data(fClient, URI_CANVAS_ICON, "carla", 6);
  548. jackbridge_custom_set_data_appearance_callback(fClient, carla_jack_custom_appearance_callback, this);
  549. jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback, this);
  550. jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback, this);
  551. jackbridge_set_freewheel_callback(fClient, carla_jack_freewheel_callback, this);
  552. jackbridge_set_latency_callback(fClient, carla_jack_latency_callback, this);
  553. jackbridge_set_process_callback(fClient, carla_jack_process_callback, this);
  554. jackbridge_on_shutdown(fClient, carla_jack_shutdown_callback, this);
  555. const char* const jackClientName(jackbridge_get_client_name(fClient));
  556. initJackPatchbay(jackClientName);
  557. jackbridge_set_client_registration_callback(fClient, carla_jack_client_registration_callback, this);
  558. jackbridge_set_port_registration_callback(fClient, carla_jack_port_registration_callback, this);
  559. jackbridge_set_port_connect_callback(fClient, carla_jack_port_connect_callback, this);
  560. jackbridge_set_port_rename_callback(fClient, carla_jack_port_rename_callback, this);
  561. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  562. {
  563. fRackPorts[kRackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  564. fRackPorts[kRackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  565. fRackPorts[kRackPortAudioOut1] = jackbridge_port_register(fClient, "audio-out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  566. fRackPorts[kRackPortAudioOut2] = jackbridge_port_register(fClient, "audio-out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  567. fRackPorts[kRackPortEventIn] = jackbridge_port_register(fClient, "events-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  568. fRackPorts[kRackPortEventOut] = jackbridge_port_register(fClient, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  569. }
  570. if (jackbridge_activate(fClient))
  571. {
  572. CarlaEngine::init(jackClientName);
  573. return true;
  574. }
  575. else
  576. {
  577. setLastError("Failed to activate the JACK client");
  578. jackbridge_client_close(fClient);
  579. fClient = nullptr;
  580. }
  581. }
  582. else
  583. setLastError("Failed to create new JACK client");
  584. return false;
  585. #else
  586. if (fBufferSize == 0 || fSampleRate == 0.0)
  587. {
  588. // open temp client to get initial buffer-size and sample-rate values
  589. if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr))
  590. {
  591. fBufferSize = jackbridge_get_buffer_size(tmpClient);
  592. fSampleRate = jackbridge_get_sample_rate(tmpClient);
  593. jackbridge_client_close(tmpClient);
  594. }
  595. }
  596. return CarlaEngine::init(clientName);
  597. #endif
  598. }
  599. bool close() override
  600. {
  601. carla_debug("CarlaEngineJack::close()");
  602. CarlaEngine::close();
  603. #ifdef BUILD_BRIDGE
  604. fClient = nullptr;
  605. fHasQuit = true;
  606. return true;
  607. #else
  608. if (jackbridge_deactivate(fClient))
  609. {
  610. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  611. {
  612. jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn1]);
  613. jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn2]);
  614. jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioOut1]);
  615. jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioOut2]);
  616. jackbridge_port_unregister(fClient, fRackPorts[kRackPortEventIn]);
  617. jackbridge_port_unregister(fClient, fRackPorts[kRackPortEventOut]);
  618. }
  619. if (jackbridge_client_close(fClient))
  620. {
  621. fClient = nullptr;
  622. return true;
  623. }
  624. else
  625. setLastError("Failed to close the JACK client");
  626. }
  627. else
  628. setLastError("Failed to deactivate the JACK client");
  629. fClient = nullptr;
  630. fUsedGroupNames.clear();
  631. fUsedPortNames.clear();
  632. fUsedConnections.clear();
  633. fGroupIconsChanged.clear();
  634. #endif
  635. return false;
  636. }
  637. #ifndef BUILD_BRIDGE
  638. void idle() override
  639. {
  640. CarlaEngine::idle();
  641. if (fGroupIconsChanged.count() == 0)
  642. return;
  643. static bool checkIcons = false;
  644. if (! checkIcons)
  645. {
  646. checkIcons = true; // check them next time
  647. return;
  648. }
  649. checkIcons = false;
  650. void* data;
  651. size_t dataSize;
  652. QList<int> groupIconsCopy(fGroupIconsChanged);
  653. fGroupIconsChanged.clear();
  654. foreach (const int& groupId, groupIconsCopy)
  655. {
  656. const char* const groupName(getGroupName(groupId));
  657. data = nullptr;
  658. dataSize = 0;
  659. if (jackbridge_custom_get_data(fClient, groupName, URI_CANVAS_ICON, &data, &dataSize) && data != nullptr && dataSize != 0)
  660. {
  661. const char* const icon((const char*)data);
  662. CARLA_ASSERT(std::strlen(icon)+1 == dataSize);
  663. PatchbayIconType groupIcon;
  664. if (std::strcmp(icon, "app") == 0 || std::strcmp(icon, "application") == 0)
  665. groupIcon = PATCHBAY_ICON_APPLICATION;
  666. else if (std::strcmp(icon, "hardware") == 0)
  667. groupIcon = PATCHBAY_ICON_HARDWARE;
  668. else if (std::strcmp(icon, "carla") == 0)
  669. groupIcon = PATCHBAY_ICON_CARLA;
  670. else if (std::strcmp(icon, "distrho") == 0)
  671. groupIcon = PATCHBAY_ICON_DISTRHO;
  672. else if (std::strcmp(icon, "file") == 0)
  673. groupIcon = PATCHBAY_ICON_FILE;
  674. else if (std::strcmp(icon, "plugin") == 0)
  675. groupIcon = PATCHBAY_ICON_PLUGIN;
  676. else
  677. groupIcon = PATCHBAY_ICON_APPLICATION;
  678. callback(CALLBACK_PATCHBAY_ICON_CHANGED, 0, groupId, groupIcon, 0.0f, nullptr);
  679. jackbridge_free(data);
  680. }
  681. }
  682. }
  683. #endif
  684. bool isRunning() const override
  685. {
  686. #ifdef BUILD_BRIDGE
  687. return (fClient != nullptr || ! fHasQuit);
  688. #else
  689. return (fClient != nullptr);
  690. #endif
  691. }
  692. bool isOffline() const override
  693. {
  694. return fFreewheel;
  695. }
  696. EngineType type() const override
  697. {
  698. return kEngineTypeJack;
  699. }
  700. CarlaEngineClient* addClient(CarlaPlugin* const plugin) override
  701. {
  702. const char* const iconName(plugin->iconName());
  703. jack_client_t* client = nullptr;
  704. #ifdef BUILD_BRIDGE
  705. client = fClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  706. fBufferSize = jackbridge_get_buffer_size(client);
  707. fSampleRate = jackbridge_get_sample_rate(client);
  708. jackbridge_custom_publish_data(client, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1);
  709. jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
  710. jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
  711. jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
  712. jackbridge_set_latency_callback(client, carla_jack_latency_callback, this);
  713. jackbridge_set_process_callback(client, carla_jack_process_callback, this);
  714. jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
  715. #else
  716. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  717. {
  718. client = fClient;
  719. }
  720. else if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  721. {
  722. client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  723. CARLA_ASSERT(client != nullptr);
  724. if (client == nullptr)
  725. return nullptr;
  726. jackbridge_custom_publish_data(client, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1);
  727. jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin);
  728. jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin);
  729. }
  730. #endif
  731. return new CarlaEngineJackClient(*this, client);
  732. }
  733. #ifndef BUILD_BRIDGE
  734. const char* renamePlugin(const unsigned int id, const char* const newName) override
  735. {
  736. CARLA_ASSERT(kData->curPluginCount > 0);
  737. CARLA_ASSERT(id < kData->curPluginCount);
  738. CARLA_ASSERT(kData->plugins != nullptr);
  739. CARLA_ASSERT(newName != nullptr);
  740. if (kData->plugins == nullptr)
  741. {
  742. setLastError("Critical error: no plugins are currently loaded!");
  743. return nullptr;
  744. }
  745. CarlaPlugin* const plugin(kData->plugins[id].plugin);
  746. if (plugin == nullptr)
  747. {
  748. carla_stderr("CarlaEngine::clonePlugin(%i) - could not find plugin", id);
  749. return nullptr;
  750. }
  751. CARLA_ASSERT(plugin->id() == id);
  752. bool needsReinit = (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT);
  753. const char* name = getUniquePluginName(newName);
  754. // TODO - use rename port if single-client
  755. // JACK client rename
  756. if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  757. {
  758. CarlaEngineJackClient* const client((CarlaEngineJackClient*)CarlaPluginGetEngineClient(plugin));
  759. if (bridge.client_rename_ptr != nullptr)
  760. {
  761. name = bridge.client_rename_ptr(client->kClient, name);
  762. }
  763. else
  764. {
  765. // we should not be able to do this, jack really needs to allow client rename
  766. needsReinit = true;
  767. if (jack_client_t* jclient = jackbridge_client_open(name, JackNullOption, nullptr))
  768. {
  769. const char* const iconName(plugin->iconName());
  770. jackbridge_custom_publish_data(jclient, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1);
  771. // close old client
  772. plugin->setEnabled(false);
  773. if (client->isActive())
  774. client->deactivate();
  775. plugin->clearBuffers();
  776. jackbridge_client_close(client->kClient);
  777. // set new client data
  778. name = jackbridge_get_client_name(jclient);
  779. jackbridge_set_process_callback(jclient, carla_jack_process_callback_plugin, plugin);
  780. jackbridge_set_latency_callback(jclient, carla_jack_latency_callback_plugin, plugin);
  781. // this is supposed to be constant...
  782. std::memcpy((jack_client_t**)&client->kClient, &jclient, sizeof(jack_client_t**));
  783. }
  784. }
  785. }
  786. if (name == nullptr)
  787. return nullptr;
  788. // Rename
  789. plugin->setName(name);
  790. if (needsReinit)
  791. {
  792. // reload plugin to recreate its ports
  793. const SaveState& saveState(plugin->getSaveState());
  794. plugin->reload();
  795. plugin->loadSaveState(saveState);
  796. }
  797. return name;
  798. }
  799. // -------------------------------------------------------------------
  800. // Patchbay
  801. bool patchbayConnect(int portA, int portB) override
  802. {
  803. CARLA_ASSERT(fClient != nullptr);
  804. if (fClient == nullptr)
  805. {
  806. setLastError("Invalid JACK client");
  807. return false;
  808. }
  809. char portNameA[STR_MAX+1];
  810. char portNameB[STR_MAX+1];
  811. getFullPortName(portA, portNameA);
  812. getFullPortName(portB, portNameB);
  813. if (! jackbridge_connect(fClient, portNameA, portNameB))
  814. {
  815. setLastError("JACK operation failed");
  816. return false;
  817. }
  818. return true;
  819. }
  820. bool patchbayDisconnect(int connectionId) override
  821. {
  822. CARLA_ASSERT(fClient != nullptr);
  823. if (fClient == nullptr)
  824. {
  825. setLastError("Invalid JACK client");
  826. return false;
  827. }
  828. foreach (const ConnectionToId& connectionToId, fUsedConnections)
  829. {
  830. if (connectionToId.id == connectionId)
  831. {
  832. char portNameOut[STR_MAX+1];
  833. char portNameIn[STR_MAX+1];
  834. getFullPortName(connectionToId.portOut, portNameOut);
  835. getFullPortName(connectionToId.portIn, portNameIn);
  836. if (! jackbridge_disconnect(fClient, portNameOut, portNameIn))
  837. {
  838. setLastError("JACK operation failed");
  839. return false;
  840. }
  841. return true;
  842. }
  843. }
  844. setLastError("Failed to find the requested connection");
  845. return false;
  846. }
  847. void patchbayRefresh() override
  848. {
  849. CARLA_ASSERT(fClient != nullptr);
  850. if (fClient == nullptr)
  851. return;
  852. fLastGroupId = 0;
  853. fLastPortId = 0;
  854. fLastConnectionId = 0;
  855. fUsedGroupNames.clear();
  856. fUsedPortNames.clear();
  857. fUsedConnections.clear();
  858. fGroupIconsChanged.clear();
  859. initJackPatchbay(jackbridge_get_client_name(fClient));
  860. }
  861. #endif
  862. // -------------------------------------------------------------------
  863. // Transport
  864. void transportPlay() override
  865. {
  866. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  867. CarlaEngine::transportPlay();
  868. else if (fClient != nullptr)
  869. jackbridge_transport_start(fClient);
  870. }
  871. void transportPause() override
  872. {
  873. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  874. CarlaEngine::transportPause();
  875. else if (fClient != nullptr)
  876. jackbridge_transport_stop(fClient);
  877. }
  878. void transportRelocate(const uint32_t frame) override
  879. {
  880. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  881. CarlaEngine::transportRelocate(frame);
  882. else if (fClient != nullptr)
  883. jackbridge_transport_locate(fClient, frame);
  884. }
  885. // -------------------------------------
  886. protected:
  887. void handleJackBufferSizeCallback(const uint32_t newBufferSize)
  888. {
  889. if (fBufferSize == newBufferSize)
  890. return;
  891. fBufferSize = newBufferSize;
  892. bufferSizeChanged(newBufferSize);
  893. }
  894. void handleJackSampleRateCallback(const double newSampleRate)
  895. {
  896. if (fSampleRate == newSampleRate)
  897. return;
  898. fSampleRate = newSampleRate;
  899. sampleRateChanged(newSampleRate);
  900. }
  901. void handleJackFreewheelCallback(const bool isFreewheel)
  902. {
  903. if (fFreewheel == isFreewheel)
  904. return;
  905. fFreewheel = isFreewheel;
  906. offlineModeChanged(isFreewheel);
  907. }
  908. void saveTransportInfo()
  909. {
  910. if (fOptions.transportMode != TRANSPORT_MODE_JACK)
  911. return;
  912. fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate
  913. fTransportState = jackbridge_transport_query(fClient, &fTransportPos);
  914. fTimeInfo.playing = (fTransportState == JackTransportRolling);
  915. if (fTransportPos.unique_1 == fTransportPos.unique_2)
  916. {
  917. fTimeInfo.frame = fTransportPos.frame;
  918. fTimeInfo.usecs = fTransportPos.usecs;
  919. if (fTransportPos.valid & JackPositionBBT)
  920. {
  921. fTimeInfo.valid = EngineTimeInfo::ValidBBT;
  922. fTimeInfo.bbt.bar = fTransportPos.bar;
  923. fTimeInfo.bbt.beat = fTransportPos.beat;
  924. fTimeInfo.bbt.tick = fTransportPos.tick;
  925. fTimeInfo.bbt.barStartTick = fTransportPos.bar_start_tick;
  926. fTimeInfo.bbt.beatsPerBar = fTransportPos.beats_per_bar;
  927. fTimeInfo.bbt.beatType = fTransportPos.beat_type;
  928. fTimeInfo.bbt.ticksPerBeat = fTransportPos.ticks_per_beat;
  929. fTimeInfo.bbt.beatsPerMinute = fTransportPos.beats_per_minute;
  930. }
  931. else
  932. fTimeInfo.valid = 0x0;
  933. }
  934. else
  935. {
  936. fTimeInfo.frame = 0;
  937. fTimeInfo.valid = 0x0;
  938. }
  939. }
  940. void handleJackProcessCallback(const uint32_t nframes)
  941. {
  942. saveTransportInfo();
  943. if (kData->curPluginCount == 0)
  944. {
  945. #ifndef BUILD_BRIDGE
  946. // pass-through
  947. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  948. {
  949. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes);
  950. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes);
  951. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut1], nframes);
  952. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes);
  953. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes);
  954. CARLA_ASSERT(audioIn1 != nullptr);
  955. CARLA_ASSERT(audioIn2 != nullptr);
  956. CARLA_ASSERT(audioOut1 != nullptr);
  957. CARLA_ASSERT(audioOut2 != nullptr);
  958. CARLA_ASSERT(eventOut != nullptr);
  959. carla_copyFloat(audioOut1, audioIn1, nframes);
  960. carla_copyFloat(audioOut2, audioIn2, nframes);
  961. jackbridge_midi_clear_buffer(eventOut);
  962. }
  963. #endif
  964. return proccessPendingEvents();
  965. }
  966. #ifdef BUILD_BRIDGE
  967. CarlaPlugin* const plugin(kData->plugins[0].plugin);
  968. if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
  969. {
  970. plugin->initBuffers();
  971. processPlugin(plugin, nframes);
  972. plugin->unlock();
  973. }
  974. #else
  975. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  976. {
  977. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  978. {
  979. CarlaPlugin* const plugin(kData->plugins[i].plugin);
  980. if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
  981. {
  982. plugin->initBuffers();
  983. processPlugin(plugin, nframes);
  984. plugin->unlock();
  985. }
  986. }
  987. }
  988. else if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  989. {
  990. // get buffers from jack
  991. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes);
  992. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes);
  993. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut1], nframes);
  994. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes);
  995. void* const eventIn = jackbridge_port_get_buffer(fRackPorts[kRackPortEventIn], nframes);
  996. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes);
  997. // assert buffers
  998. CARLA_ASSERT(audioIn1 != nullptr);
  999. CARLA_ASSERT(audioIn2 != nullptr);
  1000. CARLA_ASSERT(audioOut1 != nullptr);
  1001. CARLA_ASSERT(audioOut2 != nullptr);
  1002. CARLA_ASSERT(eventIn != nullptr);
  1003. CARLA_ASSERT(eventOut != nullptr);
  1004. // create audio buffers
  1005. float* inBuf[2] = { audioIn1, audioIn2 };
  1006. float* outBuf[2] = { audioOut1, audioOut2 };
  1007. // initialize input events
  1008. carla_zeroStruct<EngineEvent>(kData->bufEvents.in, INTERNAL_EVENT_COUNT);
  1009. {
  1010. uint32_t engineEventIndex = 0;
  1011. jack_midi_event_t jackEvent;
  1012. const uint32_t jackEventCount(jackbridge_midi_get_event_count(eventIn));
  1013. for (uint32_t jackEventIndex=0; jackEventIndex < jackEventCount; ++jackEventIndex)
  1014. {
  1015. if (! jackbridge_midi_event_get(&jackEvent, eventIn, jackEventIndex))
  1016. continue;
  1017. EngineEvent* const engineEvent(&kData->bufEvents.in[engineEventIndex++]);
  1018. engineEvent->clear();
  1019. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  1020. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  1021. engineEvent->time = jackEvent.time;
  1022. engineEvent->channel = midiChannel;
  1023. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  1024. {
  1025. CARLA_ASSERT(jackEvent.size == 2 || jackEvent.size == 3);
  1026. const uint8_t midiControl = jackEvent.buffer[1];
  1027. engineEvent->type = kEngineEventTypeControl;
  1028. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  1029. {
  1030. const uint8_t midiBank = jackEvent.buffer[2];
  1031. engineEvent->ctrl.type = kEngineControlEventTypeMidiBank;
  1032. engineEvent->ctrl.param = midiBank;
  1033. engineEvent->ctrl.value = 0.0f;
  1034. }
  1035. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  1036. {
  1037. engineEvent->ctrl.type = kEngineControlEventTypeAllSoundOff;
  1038. engineEvent->ctrl.param = 0;
  1039. engineEvent->ctrl.value = 0.0f;
  1040. }
  1041. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  1042. {
  1043. engineEvent->ctrl.type = kEngineControlEventTypeAllNotesOff;
  1044. engineEvent->ctrl.param = 0;
  1045. engineEvent->ctrl.value = 0.0f;
  1046. }
  1047. else
  1048. {
  1049. CARLA_ASSERT(jackEvent.size == 3);
  1050. const uint8_t midiValue = jackEvent.buffer[2];
  1051. engineEvent->ctrl.type = kEngineControlEventTypeParameter;
  1052. engineEvent->ctrl.param = midiControl;
  1053. engineEvent->ctrl.value = float(midiValue)/127.0f;
  1054. }
  1055. }
  1056. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  1057. {
  1058. CARLA_ASSERT(jackEvent.size == 2);
  1059. const uint8_t midiProgram = jackEvent.buffer[1];
  1060. engineEvent->type = kEngineEventTypeControl;
  1061. engineEvent->ctrl.type = kEngineControlEventTypeMidiProgram;
  1062. engineEvent->ctrl.param = midiProgram;
  1063. engineEvent->ctrl.value = 0.0f;
  1064. }
  1065. else if (jackEvent.size <= 4)
  1066. {
  1067. engineEvent->type = kEngineEventTypeMidi;
  1068. engineEvent->midi.data[0] = midiStatus;
  1069. engineEvent->midi.size = static_cast<uint8_t>(jackEvent.size);
  1070. if (jackEvent.size > 1)
  1071. carla_copy<uint8_t>(engineEvent->midi.data+1, jackEvent.buffer+1, jackEvent.size-1);
  1072. }
  1073. if (engineEventIndex >= INTERNAL_EVENT_COUNT)
  1074. break;
  1075. }
  1076. }
  1077. // process rack
  1078. processRack(inBuf, outBuf, nframes);
  1079. // output control
  1080. {
  1081. jackbridge_midi_clear_buffer(eventOut);
  1082. for (unsigned short i=0; i < INTERNAL_EVENT_COUNT; ++i)
  1083. {
  1084. EngineEvent* const engineEvent = &kData->bufEvents.out[i];
  1085. uint8_t data[3] = { 0 };
  1086. uint8_t size = 0;
  1087. switch (engineEvent->type)
  1088. {
  1089. case kEngineEventTypeNull:
  1090. break;
  1091. case kEngineEventTypeControl:
  1092. {
  1093. EngineControlEvent* const ctrlEvent = &engineEvent->ctrl;
  1094. if (ctrlEvent->type == kEngineControlEventTypeParameter && MIDI_IS_CONTROL_BANK_SELECT(ctrlEvent->param))
  1095. {
  1096. // FIXME?
  1097. ctrlEvent->type = kEngineControlEventTypeMidiBank;
  1098. ctrlEvent->param = ctrlEvent->value;
  1099. ctrlEvent->value = 0.0f;
  1100. }
  1101. switch (ctrlEvent->type)
  1102. {
  1103. case kEngineControlEventTypeNull:
  1104. break;
  1105. case kEngineControlEventTypeParameter:
  1106. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1107. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  1108. data[2] = uint8_t(ctrlEvent->value * 127.0f);
  1109. size = 3;
  1110. break;
  1111. case kEngineControlEventTypeMidiBank:
  1112. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1113. data[1] = MIDI_CONTROL_BANK_SELECT;
  1114. data[2] = static_cast<uint8_t>(ctrlEvent->param);
  1115. size = 3;
  1116. break;
  1117. case kEngineControlEventTypeMidiProgram:
  1118. data[0] = MIDI_STATUS_PROGRAM_CHANGE + engineEvent->channel;
  1119. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  1120. size = 2;
  1121. break;
  1122. case kEngineControlEventTypeAllSoundOff:
  1123. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1124. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  1125. size = 2;
  1126. break;
  1127. case kEngineControlEventTypeAllNotesOff:
  1128. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1129. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  1130. size = 2;
  1131. break;
  1132. }
  1133. break;
  1134. }
  1135. case kEngineEventTypeMidi:
  1136. {
  1137. EngineMidiEvent* const midiEvent = &engineEvent->midi;
  1138. data[0] = midiEvent->data[0];
  1139. data[1] = midiEvent->data[1];
  1140. data[2] = midiEvent->data[2];
  1141. size = midiEvent->size;
  1142. break;
  1143. }
  1144. }
  1145. if (size > 0)
  1146. jackbridge_midi_event_write(eventOut, engineEvent->time, data, size);
  1147. }
  1148. }
  1149. }
  1150. #endif // ! BUILD_BRIDGE
  1151. proccessPendingEvents();
  1152. }
  1153. void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
  1154. {
  1155. if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
  1156. return;
  1157. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  1158. {
  1159. CarlaPlugin* const plugin(kData->plugins[i].plugin);
  1160. if (plugin != nullptr && plugin->enabled())
  1161. latencyPlugin(plugin, mode);
  1162. }
  1163. }
  1164. #ifndef BUILD_BRIDGE
  1165. void handleCustomAppearanceCallback(const char* client_name, const char* key, jack_custom_change_t change)
  1166. {
  1167. if ((change == JackCustomAdded || change == JackCustomReplaced) && std::strcmp(key, URI_CANVAS_ICON) == 0)
  1168. {
  1169. const int groupId (getGroupId(client_name));
  1170. if (groupId == -1)
  1171. return;
  1172. fGroupIconsChanged.append(groupId);
  1173. }
  1174. }
  1175. void handleJackClientRegistrationCallback(const char* const name, const bool reg)
  1176. {
  1177. // do nothing on client registration, wait for first port
  1178. if (reg) return;
  1179. const int id(getGroupId(name)); // also checks name nullness
  1180. if (id == -1)
  1181. return;
  1182. GroupNameToId groupNameId(id, name);
  1183. fUsedGroupNames.removeAll(groupNameId);
  1184. callback(CALLBACK_PATCHBAY_CLIENT_REMOVED, 0, id, 0, 0.0f, nullptr);
  1185. }
  1186. void handleJackPortRegistrationCallback(const jack_port_id_t port, const bool reg)
  1187. {
  1188. jack_port_t* const jackPort(jackbridge_port_by_id(fClient, port));
  1189. const char* const portName(jackbridge_port_short_name(jackPort));
  1190. const char* const fullPortName(jackbridge_port_name(jackPort));
  1191. CARLA_ASSERT(jackPort != nullptr);
  1192. CARLA_ASSERT(portName != nullptr);
  1193. CARLA_ASSERT(fullPortName != nullptr);
  1194. if (jackPort == nullptr)
  1195. return;
  1196. if (portName == nullptr)
  1197. return;
  1198. if (fullPortName == nullptr)
  1199. return;
  1200. CarlaString groupName(fullPortName);
  1201. groupName.truncate(groupName.rfind(portName)-1);
  1202. int groupId = getGroupId(groupName);
  1203. if (reg)
  1204. {
  1205. const int jackPortFlags(jackbridge_port_flags(jackPort));
  1206. if (groupId == -1)
  1207. {
  1208. groupId = fLastGroupId++;
  1209. GroupNameToId groupNameToId(groupId, groupName);
  1210. fUsedGroupNames.append(groupNameToId);
  1211. if (jackPortFlags & JackPortIsPhysical)
  1212. {
  1213. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, PATCHBAY_ICON_HARDWARE, 0.0f, groupName);
  1214. }
  1215. else
  1216. {
  1217. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, PATCHBAY_ICON_APPLICATION, 0.0f, groupName);
  1218. fGroupIconsChanged.append(groupId);
  1219. }
  1220. }
  1221. bool portIsInput = (jackPortFlags & JackPortIsInput);
  1222. bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
  1223. bool portIsCV = (jackPortFlags & JackPortIsControlVoltage);
  1224. unsigned int canvasPortFlags = 0x0;
  1225. canvasPortFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
  1226. canvasPortFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
  1227. if (portIsAudio && portIsCV)
  1228. canvasPortFlags |= PATCHBAY_PORT_IS_CV;
  1229. PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName);
  1230. fUsedPortNames.append(portNameToId);
  1231. callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, portNameToId.portId, canvasPortFlags, portName);
  1232. }
  1233. else
  1234. {
  1235. const int portId(getPortId(fullPortName));
  1236. CARLA_ASSERT(groupId != -1);
  1237. CARLA_ASSERT(portId != -1);
  1238. if (groupId == -1 || portId == -1)
  1239. return;
  1240. PortNameToId portNameId(groupId, portId, portName, fullPortName);
  1241. fUsedPortNames.removeOne(portNameId);
  1242. callback(CALLBACK_PATCHBAY_PORT_REMOVED, 0, portId, 0, 0.0f, fullPortName);
  1243. }
  1244. }
  1245. void handleJackPortConnectCallback(const jack_port_id_t a, const jack_port_id_t b, const bool connect)
  1246. {
  1247. jack_port_t* const jackPortA(jackbridge_port_by_id(fClient, a));
  1248. jack_port_t* const jackPortB(jackbridge_port_by_id(fClient, b));
  1249. const char* const fullPortNameA(jackbridge_port_name(jackPortA));
  1250. const char* const fullPortNameB(jackbridge_port_name(jackPortB));
  1251. CARLA_ASSERT(jackPortA != nullptr);
  1252. CARLA_ASSERT(jackPortB != nullptr);
  1253. CARLA_ASSERT(fullPortNameA != nullptr);
  1254. CARLA_ASSERT(fullPortNameB != nullptr);
  1255. if (jackPortA == nullptr)
  1256. return;
  1257. if (jackPortB == nullptr)
  1258. return;
  1259. if (fullPortNameA == nullptr)
  1260. return;
  1261. if (fullPortNameB == nullptr)
  1262. return;
  1263. const int portIdA(getPortId(fullPortNameA));
  1264. const int portIdB(getPortId(fullPortNameB));
  1265. if (portIdA == -1 || portIdB == -1)
  1266. return;
  1267. if (connect)
  1268. {
  1269. ConnectionToId connectionToId(fLastConnectionId++, portIdA, portIdB);
  1270. fUsedConnections.append(connectionToId);
  1271. callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, connectionToId.id, portIdA, portIdB, nullptr);
  1272. }
  1273. else
  1274. {
  1275. for (int i=0, count=fUsedConnections.count(); i < count; ++i)
  1276. {
  1277. const ConnectionToId& connectionToId(fUsedConnections[i]);
  1278. if (connectionToId.portOut == portIdA && connectionToId.portIn == portIdB)
  1279. {
  1280. callback(CALLBACK_PATCHBAY_CONNECTION_REMOVED, 0, connectionToId.id, 0, 0.0f, nullptr);
  1281. fUsedConnections.takeAt(i);
  1282. break;
  1283. }
  1284. }
  1285. }
  1286. }
  1287. void handleJackClientRenameCallback(const char* const oldName, const char* const newName)
  1288. {
  1289. for (int i=0, count=fUsedGroupNames.count(); i < count; ++i)
  1290. {
  1291. GroupNameToId& groupNameToId(fUsedGroupNames[i]);
  1292. if (std::strcmp(groupNameToId.name, oldName) == 0)
  1293. {
  1294. groupNameToId.rename(newName);
  1295. callback(CALLBACK_PATCHBAY_CLIENT_RENAMED, 0, groupNameToId.id, 0, 0.0f, newName);
  1296. break;
  1297. }
  1298. }
  1299. }
  1300. void handleJackPortRenameCallback(const jack_port_id_t port, const char* const oldName, const char* const newName)
  1301. {
  1302. jack_port_t* const jackPort(jackbridge_port_by_id(fClient, port));
  1303. const char* const portName(jackbridge_port_short_name(jackPort));
  1304. CARLA_ASSERT(jackPort != nullptr);
  1305. CARLA_ASSERT(portName != nullptr);
  1306. if (jackPort == nullptr)
  1307. return;
  1308. if (portName == nullptr)
  1309. return;
  1310. CarlaString groupName(newName);
  1311. groupName.truncate(groupName.rfind(portName)-1);
  1312. const int groupId(getGroupId(groupName));
  1313. CARLA_ASSERT(groupId != -1);
  1314. if (groupId == -1)
  1315. return;
  1316. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1317. {
  1318. PortNameToId& portNameId(fUsedPortNames[i]);
  1319. if (std::strcmp(portNameId.fullName, oldName) == 0)
  1320. {
  1321. CARLA_ASSERT(portNameId.groupId == groupId);
  1322. portNameId.rename(portName, newName);
  1323. callback(CALLBACK_PATCHBAY_PORT_RENAMED, 0, portNameId.portId, 0, 0.0f, newName);
  1324. break;
  1325. }
  1326. }
  1327. }
  1328. #endif
  1329. void handleJackShutdownCallback()
  1330. {
  1331. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  1332. {
  1333. //CarlaPlugin* const plugin(kData->plugins[i].plugin);
  1334. //if (plugin)
  1335. // plugin->x_client = nullptr;
  1336. }
  1337. fClient = nullptr;
  1338. callback(CALLBACK_QUIT, 0, 0, 0, 0.0f, nullptr);
  1339. }
  1340. // -------------------------------------
  1341. private:
  1342. jack_client_t* fClient;
  1343. jack_position_t fTransportPos;
  1344. jack_transport_state_t fTransportState;
  1345. bool fFreewheel;
  1346. // -------------------------------------
  1347. #ifdef BUILD_BRIDGE
  1348. bool fHasQuit;
  1349. #else
  1350. enum RackPorts {
  1351. kRackPortAudioIn1 = 0,
  1352. kRackPortAudioIn2 = 1,
  1353. kRackPortAudioOut1 = 2,
  1354. kRackPortAudioOut2 = 3,
  1355. kRackPortEventIn = 4,
  1356. kRackPortEventOut = 5,
  1357. kRackPortCount = 6
  1358. };
  1359. jack_port_t* fRackPorts[kRackPortCount];
  1360. struct GroupNameToId {
  1361. int id;
  1362. char name[STR_MAX+1];
  1363. GroupNameToId()
  1364. {
  1365. id = -1;
  1366. name[0] = '\0';
  1367. }
  1368. GroupNameToId(const int id, const char name[])
  1369. {
  1370. this->id = id;
  1371. std::strncpy(this->name, name, STR_MAX);
  1372. this->name[STR_MAX] = '\0';
  1373. }
  1374. void rename(const char name[])
  1375. {
  1376. std::strncpy(this->name, name, STR_MAX);
  1377. this->name[STR_MAX] = '\0';
  1378. }
  1379. bool operator==(const GroupNameToId& groupNameId)
  1380. {
  1381. if (groupNameId.id != id)
  1382. return false;
  1383. if (std::strcmp(groupNameId.name, name) != 0)
  1384. return false;
  1385. return true;
  1386. }
  1387. };
  1388. struct PortNameToId {
  1389. int groupId;
  1390. int portId;
  1391. char name[STR_MAX+1];
  1392. char fullName[STR_MAX+1]; // unique
  1393. PortNameToId()
  1394. {
  1395. groupId = -1;
  1396. portId = -1;
  1397. name[0] = '\0';
  1398. fullName[0] = '\0';
  1399. }
  1400. PortNameToId(const int groupId, const int portId, const char name[], const char fullName[])
  1401. {
  1402. this->groupId = groupId;
  1403. this->portId = portId;
  1404. std::strncpy(this->name, name, STR_MAX);
  1405. this->name[STR_MAX] = '\0';
  1406. std::strncpy(this->fullName, fullName, STR_MAX);
  1407. this->fullName[STR_MAX] = '\0';
  1408. }
  1409. void rename(const char name[], const char fullName[])
  1410. {
  1411. std::strncpy(this->name, name, STR_MAX);
  1412. this->name[STR_MAX] = '\0';
  1413. std::strncpy(this->fullName, fullName, STR_MAX);
  1414. this->fullName[STR_MAX] = '\0';
  1415. }
  1416. bool operator==(const PortNameToId& portNameId)
  1417. {
  1418. if (portNameId.groupId != groupId)
  1419. return false;
  1420. if (portNameId.portId != portId)
  1421. return false;
  1422. if (std::strcmp(portNameId.name, name) != 0)
  1423. return false;
  1424. if (std::strcmp(portNameId.fullName, fullName) != 0)
  1425. return false;
  1426. return true;
  1427. }
  1428. };
  1429. struct ConnectionToId {
  1430. int id;
  1431. int portOut;
  1432. int portIn;
  1433. ConnectionToId()
  1434. {
  1435. id = -1;
  1436. portOut = -1;
  1437. portIn = -1;
  1438. }
  1439. ConnectionToId(const int id, const int portOut, const int portIn)
  1440. {
  1441. this->id = id;
  1442. this->portOut = portOut;
  1443. this->portIn = portIn;
  1444. }
  1445. bool operator==(const ConnectionToId& connectionId)
  1446. {
  1447. if (connectionId.id != id)
  1448. return false;
  1449. if (connectionId.portOut != portOut)
  1450. return false;
  1451. if (connectionId.portIn != portIn)
  1452. return false;
  1453. return true;
  1454. }
  1455. };
  1456. int fLastGroupId;
  1457. int fLastPortId;
  1458. int fLastConnectionId;
  1459. QList<GroupNameToId> fUsedGroupNames;
  1460. QList<PortNameToId> fUsedPortNames;
  1461. QList<ConnectionToId> fUsedConnections;
  1462. QList<int> fGroupIconsChanged;
  1463. int getGroupId(const char* const name)
  1464. {
  1465. CARLA_ASSERT(name != nullptr);
  1466. if (name == nullptr)
  1467. return -1;
  1468. foreach (const GroupNameToId& groupNameId, fUsedGroupNames)
  1469. {
  1470. if (std::strcmp(groupNameId.name, name) == 0)
  1471. return groupNameId.id;
  1472. }
  1473. return -1;
  1474. }
  1475. const char* getGroupName(const int groupId)
  1476. {
  1477. CARLA_ASSERT(groupId >= 0);
  1478. static const char fallback[1] = { '\0' };
  1479. if (groupId < 0)
  1480. return fallback;
  1481. foreach (const GroupNameToId& groupNameId, fUsedGroupNames)
  1482. {
  1483. if (groupNameId.id == groupId)
  1484. return groupNameId.name;
  1485. }
  1486. return fallback;
  1487. }
  1488. int getPortId(const char* const fullName)
  1489. {
  1490. CARLA_ASSERT(fullName != nullptr);
  1491. if (fullName == nullptr)
  1492. return -1;
  1493. foreach (const PortNameToId& portNameId, fUsedPortNames)
  1494. {
  1495. if (std::strcmp(portNameId.fullName, fullName) == 0)
  1496. return portNameId.portId;
  1497. }
  1498. return -1;
  1499. }
  1500. void getFullPortName(const int portId, char nameBuf[STR_MAX+1])
  1501. {
  1502. foreach (const PortNameToId& portNameId, fUsedPortNames)
  1503. {
  1504. if (portNameId.portId == portId)
  1505. {
  1506. std::strncpy(nameBuf, portNameId.fullName, STR_MAX);
  1507. nameBuf[STR_MAX] = '\0';
  1508. return;
  1509. }
  1510. }
  1511. nameBuf[0] = '\0';
  1512. }
  1513. void initJackPatchbay(const char* const ourName)
  1514. {
  1515. CARLA_ASSERT(fLastGroupId == 0);
  1516. CARLA_ASSERT(fLastPortId == 0);
  1517. CARLA_ASSERT(fLastConnectionId == 0);
  1518. CARLA_ASSERT(ourName != nullptr);
  1519. // query initial jack ports
  1520. QStringList parsedGroups;
  1521. // our client
  1522. if (ourName != nullptr)
  1523. {
  1524. parsedGroups.append(QString(ourName));
  1525. GroupNameToId groupNameToId(fLastGroupId++, ourName);
  1526. fUsedGroupNames.append(groupNameToId);
  1527. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupNameToId.id, PATCHBAY_ICON_CARLA, 0.0f, ourName);
  1528. }
  1529. if (const char** ports = jackbridge_get_ports(fClient, nullptr, nullptr, 0))
  1530. {
  1531. for (int i=0; ports[i] != nullptr; ++i)
  1532. {
  1533. jack_port_t* const jackPort(jackbridge_port_by_name(fClient, ports[i]));
  1534. const char* const portName(jackbridge_port_short_name(jackPort));
  1535. const char* const fullPortName(ports[i]);
  1536. CARLA_ASSERT(jackPort != nullptr);
  1537. CARLA_ASSERT(portName != nullptr);
  1538. if (jackPort == nullptr)
  1539. continue;
  1540. if (portName == nullptr)
  1541. continue;
  1542. const int jackPortFlags(jackbridge_port_flags(jackPort));
  1543. int groupId = -1;
  1544. CarlaString groupName(fullPortName);
  1545. groupName.truncate(groupName.rfind(portName)-1);
  1546. QString qGroupName(groupName);
  1547. if (parsedGroups.contains(qGroupName))
  1548. {
  1549. groupId = getGroupId(groupName);
  1550. CARLA_ASSERT(groupId != -1);
  1551. }
  1552. else
  1553. {
  1554. groupId = fLastGroupId++;
  1555. parsedGroups.append(qGroupName);
  1556. GroupNameToId groupNameToId(groupId, groupName);
  1557. fUsedGroupNames.append(groupNameToId);
  1558. PatchbayIconType groupIcon = PATCHBAY_ICON_APPLICATION;
  1559. void* data = nullptr;
  1560. size_t dataSize = 0;
  1561. if (jackPortFlags & JackPortIsPhysical)
  1562. {
  1563. groupIcon = PATCHBAY_ICON_HARDWARE;
  1564. }
  1565. else if (jackbridge_custom_get_data(fClient, groupName, URI_CANVAS_ICON, &data, &dataSize) && data != nullptr && dataSize != 0)
  1566. {
  1567. const char* const icon((const char*)data);
  1568. CARLA_ASSERT(std::strlen(icon)+1 == dataSize);
  1569. if (std::strcmp(icon, "app") == 0 || std::strcmp(icon, "application") == 0)
  1570. groupIcon = PATCHBAY_ICON_APPLICATION;
  1571. else if (std::strcmp(icon, "hardware") == 0)
  1572. groupIcon = PATCHBAY_ICON_HARDWARE;
  1573. else if (std::strcmp(icon, "carla") == 0)
  1574. groupIcon = PATCHBAY_ICON_CARLA;
  1575. else if (std::strcmp(icon, "distrho") == 0)
  1576. groupIcon = PATCHBAY_ICON_DISTRHO;
  1577. else if (std::strcmp(icon, "file") == 0)
  1578. groupIcon = PATCHBAY_ICON_FILE;
  1579. else if (std::strcmp(icon, "plugin") == 0)
  1580. groupIcon = PATCHBAY_ICON_PLUGIN;
  1581. }
  1582. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, groupIcon, 0.0f, groupName);
  1583. }
  1584. bool portIsInput = (jackPortFlags & JackPortIsInput);
  1585. bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
  1586. bool portIsCV = (jackPortFlags & JackPortIsControlVoltage);
  1587. unsigned int canvasPortFlags = 0x0;
  1588. canvasPortFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
  1589. canvasPortFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
  1590. if (portIsAudio && portIsCV)
  1591. canvasPortFlags |= PATCHBAY_PORT_IS_CV;
  1592. PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName);
  1593. fUsedPortNames.append(portNameToId);
  1594. callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, portNameToId.portId, canvasPortFlags, portName);
  1595. }
  1596. jackbridge_free(ports);
  1597. }
  1598. // query connections, after all ports are in place
  1599. if (const char** ports = jackbridge_get_ports(fClient, nullptr, nullptr, JackPortIsOutput))
  1600. {
  1601. for (int i=0; ports[i] != nullptr; ++i)
  1602. {
  1603. jack_port_t* const jackPort(jackbridge_port_by_name(fClient, ports[i]));
  1604. const char* const fullPortName(ports[i]);
  1605. CARLA_ASSERT(jackPort != nullptr);
  1606. if (jackPort == nullptr)
  1607. continue;
  1608. const int thisPortId(getPortId(fullPortName));
  1609. if (thisPortId == -1)
  1610. continue;
  1611. if (const char** connections = jackbridge_port_get_connections(jackPort))
  1612. {
  1613. for (int j=0; connections[j] != nullptr; ++j)
  1614. {
  1615. const int targetPortId(getPortId(connections[j]));
  1616. ConnectionToId connectionToId(fLastConnectionId++, thisPortId, targetPortId);
  1617. fUsedConnections.append(connectionToId);
  1618. callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, connectionToId.id, thisPortId, targetPortId, nullptr);
  1619. }
  1620. jackbridge_free(connections);
  1621. }
  1622. }
  1623. jackbridge_free(ports);
  1624. }
  1625. }
  1626. #endif
  1627. // -------------------------------------
  1628. void processPlugin(CarlaPlugin* const plugin, const uint32_t nframes)
  1629. {
  1630. const uint32_t inCount(plugin->audioInCount());
  1631. const uint32_t outCount(plugin->audioOutCount());
  1632. float* inBuffer[inCount];
  1633. float* outBuffer[outCount];
  1634. float inPeaks[2] = { 0.0f };
  1635. float outPeaks[2] = { 0.0f };
  1636. for (uint32_t i=0; i < inCount; ++i)
  1637. {
  1638. CarlaEngineAudioPort* const port(CarlaPluginGetAudioInPort(plugin, i));
  1639. inBuffer[i] = port->getBuffer();
  1640. }
  1641. for (uint32_t i=0; i < outCount; ++i)
  1642. {
  1643. CarlaEngineAudioPort* const port(CarlaPluginGetAudioOutPort(plugin, i));
  1644. outBuffer[i] = port->getBuffer();
  1645. }
  1646. for (uint32_t i=0; i < inCount && i < 2; ++i)
  1647. {
  1648. for (uint32_t j=0; j < nframes; ++j)
  1649. {
  1650. const float absV(std::abs(inBuffer[i][j]));
  1651. if (absV > inPeaks[i])
  1652. inPeaks[i] = absV;
  1653. }
  1654. }
  1655. plugin->process(inBuffer, outBuffer, nframes);
  1656. for (uint32_t i=0; i < outCount && i < 2; ++i)
  1657. {
  1658. for (uint32_t j=0; j < nframes; ++j)
  1659. {
  1660. const float absV(std::abs(outBuffer[i][j]));
  1661. if (absV > outPeaks[i])
  1662. outPeaks[i] = absV;
  1663. }
  1664. }
  1665. setPeaks(plugin->id(), inPeaks, outPeaks);
  1666. }
  1667. void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode)
  1668. {
  1669. //const uint32_t inCount(plugin->audioInCount());
  1670. //const uint32_t outCount(plugin->audioOutCount());
  1671. const uint32_t latency(plugin->latency());
  1672. if (latency == 0)
  1673. return;
  1674. //jack_latency_range_t range;
  1675. // TODO
  1676. if (mode == JackCaptureLatency)
  1677. {
  1678. #if 0
  1679. for (uint32_t i=0; i < inCount; ++i)
  1680. {
  1681. uint32_t aOutI = (i >= outCount) ? outCount : i;
  1682. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, i))->kPort;
  1683. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, aOutI))->kPort;
  1684. jackbridge_port_get_latency_range(portIn, mode, &range);
  1685. range.min += latency;
  1686. range.max += latency;
  1687. jackbridge_port_set_latency_range(portOut, mode, &range);
  1688. }
  1689. #endif
  1690. }
  1691. else
  1692. {
  1693. #if 0
  1694. for (uint32_t i=0; i < outCount; ++i)
  1695. {
  1696. uint32_t aInI = (i >= inCount) ? inCount : i;
  1697. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, aInI))->kPort;
  1698. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, i))->kPort;
  1699. jackbridge_port_get_latency_range(portOut, mode, &range);
  1700. range.min += latency;
  1701. range.max += latency;
  1702. jackbridge_port_set_latency_range(portIn, mode, &range);
  1703. }
  1704. #endif
  1705. }
  1706. }
  1707. // -------------------------------------
  1708. #define handlePtr ((CarlaEngineJack*)arg)
  1709. static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg)
  1710. {
  1711. handlePtr->handleJackBufferSizeCallback(newBufferSize);
  1712. return 0;
  1713. }
  1714. static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg)
  1715. {
  1716. handlePtr->handleJackSampleRateCallback(newSampleRate);
  1717. return 0;
  1718. }
  1719. static void carla_jack_freewheel_callback(int starting, void* arg)
  1720. {
  1721. handlePtr->handleJackFreewheelCallback(bool(starting));
  1722. }
  1723. static int carla_jack_process_callback(jack_nframes_t nframes, void* arg)
  1724. {
  1725. handlePtr->handleJackProcessCallback(nframes);
  1726. return 0;
  1727. }
  1728. static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg)
  1729. {
  1730. handlePtr->handleJackLatencyCallback(mode);
  1731. }
  1732. #ifndef BUILD_BRIDGE
  1733. static void carla_jack_custom_appearance_callback(const char* client_name, const char* key, jack_custom_change_t change, void* arg)
  1734. {
  1735. handlePtr->handleCustomAppearanceCallback(client_name, key, change);
  1736. }
  1737. static void carla_jack_client_registration_callback(const char* name, int reg, void* arg)
  1738. {
  1739. handlePtr->handleJackClientRegistrationCallback(name, (reg != 0));
  1740. }
  1741. static void carla_jack_port_registration_callback(jack_port_id_t port, int reg, void* arg)
  1742. {
  1743. handlePtr->handleJackPortRegistrationCallback(port, (reg != 0));
  1744. }
  1745. static void carla_jack_port_connect_callback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg)
  1746. {
  1747. handlePtr->handleJackPortConnectCallback(a, b, (connect != 0));
  1748. }
  1749. static int carla_jack_client_rename_callback(const char* oldName, const char* newName, void* arg)
  1750. {
  1751. handlePtr->handleJackClientRenameCallback(oldName, newName);
  1752. return 0;
  1753. }
  1754. static int carla_jack_port_rename_callback(jack_port_id_t port, const char* oldName, const char* newName, void* arg)
  1755. {
  1756. handlePtr->handleJackPortRenameCallback(port, oldName, newName);
  1757. return 0;
  1758. }
  1759. #endif
  1760. static void carla_jack_shutdown_callback(void* arg)
  1761. {
  1762. handlePtr->handleJackShutdownCallback();
  1763. }
  1764. #undef handlePtr
  1765. // -------------------------------------
  1766. #ifndef BUILD_BRIDGE
  1767. static int carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg)
  1768. {
  1769. CarlaPlugin* const plugin((CarlaPlugin*)arg);
  1770. if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
  1771. {
  1772. CarlaEngineJack* const engine((CarlaEngineJack*)CarlaPluginGetEngine(plugin));
  1773. CARLA_ASSERT(engine != nullptr);
  1774. plugin->initBuffers();
  1775. engine->saveTransportInfo();
  1776. engine->processPlugin(plugin, nframes);
  1777. plugin->unlock();
  1778. }
  1779. return 0;
  1780. }
  1781. static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg)
  1782. {
  1783. CarlaPlugin* const plugin((CarlaPlugin*)arg);
  1784. if (plugin != nullptr && plugin->enabled())
  1785. {
  1786. CarlaEngineJack* const engine((CarlaEngineJack*)CarlaPluginGetEngine(plugin));
  1787. CARLA_ASSERT(engine != nullptr);
  1788. engine->latencyPlugin(plugin, mode);
  1789. }
  1790. }
  1791. #endif
  1792. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJack)
  1793. };
  1794. // -----------------------------------------
  1795. CarlaEngine* CarlaEngine::newJack()
  1796. {
  1797. carla_debug("CarlaEngine::newJack()");
  1798. return new CarlaEngineJack();
  1799. }
  1800. // -----------------------------------------
  1801. CARLA_BACKEND_END_NAMESPACE