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.

2247 lines
73KB

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