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.

1722 lines
57KB

  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. #ifdef WANT_JACK
  18. #include "CarlaEngineInternal.hpp"
  19. #include "CarlaBackendUtils.hpp"
  20. #include "CarlaMIDI.h"
  21. #include "jackbridge/JackBridge.cpp"
  22. #include <cmath>
  23. #include <QtCore/QStringList>
  24. CARLA_BACKEND_START_NAMESPACE
  25. #if 0
  26. } // Fix editor indentation
  27. #endif
  28. // -------------------------------------------------------------------
  29. // Plugin Helpers, defined in CarlaPlugin.cpp
  30. extern CarlaEngine* CarlaPluginGetEngine(CarlaPlugin* const plugin);
  31. extern CarlaEngineAudioPort* CarlaPluginGetAudioInPort(CarlaPlugin* const plugin, uint32_t index);
  32. extern CarlaEngineAudioPort* CarlaPluginGetAudioOutPort(CarlaPlugin* const plugin, uint32_t index);
  33. // -------------------------------------------------------------------------------------------------------------------
  34. // Carla Engine JACK-Audio port
  35. class CarlaEngineJackAudioPort : public CarlaEngineAudioPort
  36. {
  37. public:
  38. CarlaEngineJackAudioPort(const bool isInput, const ProcessMode processMode, jack_client_t* const client, jack_port_t* const port)
  39. : CarlaEngineAudioPort(isInput, processMode),
  40. kClient(client),
  41. kPort(port)
  42. {
  43. carla_debug("CarlaEngineJackAudioPort::CarlaEngineJackAudioPort(%s, %s, %p, %p)", bool2str(isInput), ProcessMode2Str(processMode), client, port);
  44. if (processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  45. {
  46. CARLA_ASSERT(client != nullptr && port != nullptr);
  47. }
  48. else
  49. {
  50. CARLA_ASSERT(client == nullptr && port == nullptr);
  51. }
  52. }
  53. ~CarlaEngineJackAudioPort() override
  54. {
  55. carla_debug("CarlaEngineJackAudioPort::~CarlaEngineJackAudioPort()");
  56. if (kClient != nullptr && kPort != nullptr)
  57. jackbridge_port_unregister(kClient, kPort);
  58. }
  59. void initBuffer(CarlaEngine* const engine) override
  60. {
  61. CARLA_ASSERT(engine != nullptr);
  62. if (engine == nullptr)
  63. {
  64. fBuffer = nullptr;
  65. return;
  66. }
  67. if (kPort == nullptr)
  68. return CarlaEngineAudioPort::initBuffer(engine);
  69. fBuffer = (float*)jackbridge_port_get_buffer(kPort, engine->getBufferSize());
  70. if (! kIsInput)
  71. carla_zeroFloat(fBuffer, engine->getBufferSize());
  72. }
  73. private:
  74. jack_client_t* const kClient;
  75. jack_port_t* const kPort;
  76. friend class CarlaEngineJack;
  77. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackAudioPort)
  78. };
  79. // -------------------------------------------------------------------------------------------------------------------
  80. // Carla Engine JACK-Event port
  81. static const EngineEvent kFallbackJackEngineEvent;
  82. class CarlaEngineJackEventPort : public CarlaEngineEventPort
  83. {
  84. public:
  85. CarlaEngineJackEventPort(const bool isInput, const ProcessMode processMode, jack_client_t* const client, jack_port_t* const port)
  86. : CarlaEngineEventPort(isInput, processMode),
  87. kClient(client),
  88. kPort(port),
  89. fJackBuffer(nullptr)
  90. {
  91. carla_debug("CarlaEngineJackEventPort::CarlaEngineJackEventPort(%s, %s, %p, %p)", bool2str(isInput), ProcessMode2Str(processMode), client, port);
  92. if (processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  93. {
  94. CARLA_ASSERT(client != nullptr && port != nullptr);
  95. }
  96. else
  97. {
  98. CARLA_ASSERT(client == nullptr && port == nullptr);
  99. }
  100. }
  101. ~CarlaEngineJackEventPort() override
  102. {
  103. carla_debug("CarlaEngineJackEventPort::~CarlaEngineJackEventPort()");
  104. if (kClient != nullptr && kPort != nullptr)
  105. jackbridge_port_unregister(kClient, kPort);
  106. }
  107. void initBuffer(CarlaEngine* const engine) override
  108. {
  109. CARLA_ASSERT(engine != nullptr);
  110. if (engine == nullptr)
  111. {
  112. fJackBuffer = nullptr;
  113. return;
  114. }
  115. if (kPort == nullptr)
  116. return CarlaEngineEventPort::initBuffer(engine);
  117. fJackBuffer = jackbridge_port_get_buffer(kPort, engine->getBufferSize());
  118. if (! kIsInput)
  119. jackbridge_midi_clear_buffer(fJackBuffer);
  120. }
  121. uint32_t getEventCount() override
  122. {
  123. if (kPort == nullptr)
  124. return CarlaEngineEventPort::getEventCount();
  125. CARLA_ASSERT(kIsInput);
  126. CARLA_ASSERT(fJackBuffer != nullptr);
  127. if (! kIsInput)
  128. return 0;
  129. if (fJackBuffer == nullptr)
  130. return 0;
  131. return jackbridge_midi_get_event_count(fJackBuffer);
  132. }
  133. const EngineEvent& getEvent(const uint32_t index) override
  134. {
  135. if (kPort == nullptr)
  136. return CarlaEngineEventPort::getEvent(index);
  137. CARLA_ASSERT(kIsInput);
  138. CARLA_ASSERT(fJackBuffer != nullptr);
  139. if (! kIsInput)
  140. return kFallbackJackEngineEvent;
  141. if (fJackBuffer == nullptr)
  142. return kFallbackJackEngineEvent;
  143. jack_midi_event_t jackEvent;
  144. if (jackbridge_midi_event_get(&jackEvent, fJackBuffer, index) != 0 || jackEvent.size > 3)
  145. return kFallbackJackEngineEvent;
  146. fRetEvent.clear();
  147. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  148. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  149. fRetEvent.time = jackEvent.time;
  150. fRetEvent.channel = midiChannel;
  151. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  152. {
  153. const uint8_t midiControl = jackEvent.buffer[1];
  154. fRetEvent.type = kEngineEventTypeControl;
  155. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  156. {
  157. const uint8_t midiBank = jackEvent.buffer[2];
  158. fRetEvent.ctrl.type = kEngineControlEventTypeMidiBank;
  159. fRetEvent.ctrl.param = midiBank;
  160. fRetEvent.ctrl.value = 0.0;
  161. }
  162. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  163. {
  164. fRetEvent.ctrl.type = kEngineControlEventTypeAllSoundOff;
  165. fRetEvent.ctrl.param = 0;
  166. fRetEvent.ctrl.value = 0.0;
  167. }
  168. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  169. {
  170. fRetEvent.ctrl.type = kEngineControlEventTypeAllNotesOff;
  171. fRetEvent.ctrl.param = 0;
  172. fRetEvent.ctrl.value = 0.0;
  173. }
  174. else
  175. {
  176. const uint8_t midiValue = jackEvent.buffer[2];
  177. fRetEvent.ctrl.type = kEngineControlEventTypeParameter;
  178. fRetEvent.ctrl.param = midiControl;
  179. fRetEvent.ctrl.value = double(midiValue)/127.0;
  180. }
  181. }
  182. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  183. {
  184. const uint8_t midiProgram = jackEvent.buffer[1];
  185. fRetEvent.type = kEngineEventTypeControl;
  186. fRetEvent.ctrl.type = kEngineControlEventTypeMidiProgram;
  187. fRetEvent.ctrl.param = midiProgram;
  188. fRetEvent.ctrl.value = 0.0;
  189. }
  190. else
  191. {
  192. fRetEvent.type = kEngineEventTypeMidi;
  193. fRetEvent.midi.data[0] = midiStatus;
  194. fRetEvent.midi.data[1] = jackEvent.buffer[1];
  195. fRetEvent.midi.data[2] = jackEvent.buffer[2];
  196. fRetEvent.midi.size = static_cast<uint8_t>(jackEvent.size);
  197. }
  198. return fRetEvent;
  199. }
  200. void writeControlEvent(const uint32_t time, const uint8_t channel, const EngineControlEventType type, const uint16_t param, const float value) override
  201. {
  202. if (kPort == nullptr)
  203. return CarlaEngineEventPort::writeControlEvent(time, channel, type, param, value);
  204. CARLA_ASSERT(! kIsInput);
  205. CARLA_ASSERT(fJackBuffer != nullptr);
  206. CARLA_ASSERT(type != kEngineControlEventTypeNull);
  207. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  208. CARLA_ASSERT(param < MAX_MIDI_VALUE);
  209. CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f);
  210. if (kIsInput)
  211. return;
  212. if (fJackBuffer == nullptr)
  213. return;
  214. if (type == kEngineControlEventTypeNull)
  215. return;
  216. if (channel >= MAX_MIDI_CHANNELS)
  217. return;
  218. if (param >= MAX_MIDI_VALUE)
  219. return;
  220. if (type == kEngineControlEventTypeParameter)
  221. {
  222. CARLA_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(param));
  223. }
  224. const float fixedValue = carla_fixValue<float>(0.0f, 1.0f, value);
  225. uint8_t data[4] = { 0 };
  226. uint8_t size = 0;
  227. switch (type)
  228. {
  229. case kEngineControlEventTypeNull:
  230. break;
  231. case kEngineControlEventTypeParameter:
  232. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  233. data[1] = static_cast<uint8_t>(param);
  234. data[2] = uint8_t(fixedValue * 127.0f);
  235. size = 3;
  236. break;
  237. case kEngineControlEventTypeMidiBank:
  238. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  239. data[1] = MIDI_CONTROL_BANK_SELECT;
  240. data[2] = static_cast<uint8_t>(param);
  241. size = 3;
  242. break;
  243. case kEngineControlEventTypeMidiProgram:
  244. data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
  245. data[1] = static_cast<uint8_t>(param);
  246. size = 2;
  247. break;
  248. case kEngineControlEventTypeAllSoundOff:
  249. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  250. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  251. size = 2;
  252. break;
  253. case kEngineControlEventTypeAllNotesOff:
  254. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  255. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  256. size = 2;
  257. break;
  258. }
  259. if (size > 0)
  260. jackbridge_midi_event_write(fJackBuffer, time, data, size);
  261. }
  262. void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t port, const uint8_t* const data, const uint8_t size) override
  263. {
  264. if (kPort == nullptr)
  265. return CarlaEngineEventPort::writeMidiEvent(time, channel, port, data, size);
  266. CARLA_ASSERT(! kIsInput);
  267. CARLA_ASSERT(fJackBuffer != nullptr);
  268. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  269. CARLA_ASSERT(data != nullptr);
  270. CARLA_ASSERT(size > 0);
  271. if (kIsInput)
  272. return;
  273. if (fJackBuffer == nullptr)
  274. return;
  275. if (channel >= MAX_MIDI_CHANNELS)
  276. return;
  277. if (data == nullptr)
  278. return;
  279. if (size == 0)
  280. return;
  281. uint8_t jdata[size];
  282. carla_copy<uint8_t>(jdata, data, size);
  283. jdata[0] = data[0] + channel;
  284. jackbridge_midi_event_write(fJackBuffer, time, jdata, size);
  285. }
  286. private:
  287. jack_client_t* const kClient;
  288. jack_port_t* const kPort;
  289. void* fJackBuffer;
  290. EngineEvent fRetEvent;
  291. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackEventPort)
  292. };
  293. // -------------------------------------------------------------------------------------------------------------------
  294. // Jack Engine client
  295. class CarlaEngineJackClient : public CarlaEngineClient
  296. {
  297. public:
  298. CarlaEngineJackClient(const EngineType engineType, const ProcessMode processMode, jack_client_t* const client)
  299. : CarlaEngineClient(engineType, processMode),
  300. kClient(client),
  301. kUseClient(processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  302. {
  303. carla_debug("CarlaEngineJackClient::CarlaEngineJackClient(%s, %s, %p)", EngineType2Str(engineType), ProcessMode2Str(processMode), client);
  304. if (kUseClient)
  305. {
  306. CARLA_ASSERT(kClient != nullptr);
  307. }
  308. else
  309. {
  310. CARLA_ASSERT(kClient == nullptr);
  311. }
  312. }
  313. ~CarlaEngineJackClient() override
  314. {
  315. carla_debug("CarlaEngineClient::~CarlaEngineClient()");
  316. if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  317. {
  318. if (kClient)
  319. jackbridge_client_close(kClient);
  320. }
  321. }
  322. void activate() override
  323. {
  324. carla_debug("CarlaEngineJackClient::activate()");
  325. if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  326. {
  327. CARLA_ASSERT(kClient && ! fActive);
  328. if (kClient && ! fActive)
  329. jackbridge_activate(kClient);
  330. }
  331. CarlaEngineClient::activate();
  332. }
  333. void deactivate() override
  334. {
  335. carla_debug("CarlaEngineJackClient::deactivate()");
  336. if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  337. {
  338. CARLA_ASSERT(kClient && fActive);
  339. if (kClient && fActive)
  340. jackbridge_deactivate(kClient);
  341. }
  342. CarlaEngineClient::deactivate();
  343. }
  344. bool isOk() const override
  345. {
  346. carla_debug("CarlaEngineJackClient::isOk()");
  347. if (kUseClient)
  348. return bool(kClient);
  349. return CarlaEngineClient::isOk();
  350. }
  351. #if WANT_JACK_LATENCY
  352. void setLatency(const uint32_t samples) override
  353. {
  354. CarlaEngineClient::setLatency(samples);
  355. if (kUseClient)
  356. jackbridge_recompute_total_latencies(kClient);
  357. }
  358. #endif
  359. CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) override
  360. {
  361. carla_debug("CarlaEngineJackClient::addPort(%s, \"%s\", %s)", EnginePortType2Str(portType), name, bool2str(isInput));
  362. jack_port_t* port = nullptr;
  363. // Create JACK port first, if needed
  364. if (kUseClient)
  365. {
  366. switch (portType)
  367. {
  368. case kEnginePortTypeNull:
  369. break;
  370. case kEnginePortTypeAudio:
  371. port = jackbridge_port_register(kClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  372. break;
  373. case kEnginePortTypeEvent:
  374. port = jackbridge_port_register(kClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  375. break;
  376. }
  377. }
  378. // Create Engine port
  379. switch (portType)
  380. {
  381. case kEnginePortTypeNull:
  382. break;
  383. case kEnginePortTypeAudio:
  384. return new CarlaEngineJackAudioPort(isInput, kProcessMode, kClient, port);
  385. case kEnginePortTypeEvent:
  386. return new CarlaEngineJackEventPort(isInput, kProcessMode, kClient, port);
  387. }
  388. carla_stderr("CarlaEngineJackClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput));
  389. return nullptr;
  390. }
  391. private:
  392. jack_client_t* const kClient;
  393. const bool kUseClient;
  394. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackClient)
  395. };
  396. // -------------------------------------------------------------------------------------------------------------------
  397. // Jack Engine
  398. class CarlaEngineJack : public CarlaEngine
  399. {
  400. public:
  401. CarlaEngineJack()
  402. : CarlaEngine(),
  403. fClient(nullptr),
  404. fTransportState(JackTransportStopped),
  405. fFreewheel(false),
  406. #ifdef BUILD_BRIDGE
  407. fHasQuit(false)
  408. #else
  409. # ifndef QTCREATOR_TEST
  410. fRackPorts{nullptr},
  411. fLastGroupId(0),
  412. # endif
  413. fLastPortId(0),
  414. fLastConnectionId(0)
  415. #endif
  416. {
  417. carla_debug("CarlaEngineJack::CarlaEngineJack()");
  418. #ifdef BUILD_BRIDGE
  419. fOptions.processMode = PROCESS_MODE_MULTIPLE_CLIENTS;
  420. #endif
  421. // FIXME: Always enable JACK transport for now
  422. fOptions.transportMode = TRANSPORT_MODE_JACK;
  423. carla_zeroStruct<jack_position_t>(fTransportPos);
  424. }
  425. ~CarlaEngineJack() override
  426. {
  427. carla_debug("CarlaEngineJack::~CarlaEngineJack()");
  428. CARLA_ASSERT(fClient == nullptr);
  429. #ifndef BUILD_BRIDGE
  430. fUsedGroupNames.clear();
  431. fUsedPortNames.clear();
  432. fUsedConnections.clear();
  433. #endif
  434. }
  435. // -------------------------------------------------------------------
  436. // Maximum values
  437. unsigned int maxClientNameSize() const override
  438. {
  439. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  440. return static_cast<unsigned int>(jackbridge_client_name_size());
  441. return CarlaEngine::maxClientNameSize();
  442. }
  443. unsigned int maxPortNameSize() const override
  444. {
  445. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  446. return static_cast<unsigned int>(jackbridge_port_name_size());
  447. return CarlaEngine::maxPortNameSize();
  448. }
  449. // -------------------------------------------------------------------
  450. // Virtual, per-engine type calls
  451. bool init(const char* const clientName) override
  452. {
  453. carla_debug("CarlaEngineJack::init(\"%s\")", clientName);
  454. fFreewheel = false;
  455. fTransportState = JackTransportStopped;
  456. carla_zeroStruct<jack_position_t>(fTransportPos);
  457. #ifndef BUILD_BRIDGE
  458. fLastGroupId = 0;
  459. fLastPortId = 0;
  460. fLastConnectionId = 0;
  461. fUsedGroupNames.clear();
  462. fUsedPortNames.clear();
  463. fUsedConnections.clear();
  464. fClient = jackbridge_client_open(clientName, JackNullOption, nullptr);
  465. if (fClient != nullptr)
  466. {
  467. fBufferSize = jackbridge_get_buffer_size(fClient);
  468. fSampleRate = jackbridge_get_sample_rate(fClient);
  469. jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback, this);
  470. jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback, this);
  471. jackbridge_set_freewheel_callback(fClient, carla_jack_freewheel_callback, this);
  472. jackbridge_set_process_callback(fClient, carla_jack_process_callback, this);
  473. jackbridge_on_shutdown(fClient, carla_jack_shutdown_callback, this);
  474. # if WANT_JACK_LATENCY
  475. jackbridge_set_latency_callback(fClient, carla_jack_latency_callback, this);
  476. # endif
  477. const char* const jackClientName = jackbridge_get_client_name(fClient);
  478. initJackPatchbay(jackClientName);
  479. jackbridge_set_client_registration_callback(fClient, carla_jack_client_registration_callback, this);
  480. jackbridge_set_port_registration_callback(fClient, carla_jack_port_registration_callback, this);
  481. jackbridge_set_port_connect_callback(fClient, carla_jack_port_connect_callback, this);
  482. jackbridge_set_port_rename_callback(fClient, carla_jack_port_rename_callback, this);
  483. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  484. {
  485. fRackPorts[rackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  486. fRackPorts[rackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  487. fRackPorts[rackPortAudioOut1] = jackbridge_port_register(fClient, "audio-out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  488. fRackPorts[rackPortAudioOut2] = jackbridge_port_register(fClient, "audio-out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  489. fRackPorts[rackPortEventIn] = jackbridge_port_register(fClient, "events-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  490. fRackPorts[rackPortEventOut] = jackbridge_port_register(fClient, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  491. }
  492. if (jackbridge_activate(fClient) == 0)
  493. {
  494. return CarlaEngine::init(jackClientName);
  495. }
  496. else
  497. {
  498. setLastError("Failed to activate the JACK client");
  499. jackbridge_client_close(fClient);
  500. fClient = nullptr;
  501. }
  502. }
  503. else
  504. setLastError("Failed to create new JACK client");
  505. return false;
  506. #else
  507. if (fBufferSize == 0 || fSampleRate == 0.0)
  508. {
  509. // open temp client to get initial buffer-size and sample-rate values
  510. if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr))
  511. {
  512. fBufferSize = jackbridge_get_buffer_size(tmpClient);
  513. fSampleRate = jackbridge_get_sample_rate(tmpClient);
  514. jackbridge_client_close(tmpClient);
  515. }
  516. }
  517. return CarlaEngine::init(clientName);
  518. #endif
  519. }
  520. bool close() override
  521. {
  522. carla_debug("CarlaEngineJack::close()");
  523. CarlaEngine::close();
  524. #ifdef BUILD_BRIDGE
  525. fClient = nullptr;
  526. fHasQuit = true;
  527. return true;
  528. #else
  529. if (jackbridge_deactivate(fClient) == 0)
  530. {
  531. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  532. {
  533. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioIn1]);
  534. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioIn2]);
  535. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioOut1]);
  536. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioOut2]);
  537. jackbridge_port_unregister(fClient, fRackPorts[rackPortEventIn]);
  538. jackbridge_port_unregister(fClient, fRackPorts[rackPortEventOut]);
  539. }
  540. if (jackbridge_client_close(fClient) == 0)
  541. {
  542. fClient = nullptr;
  543. return true;
  544. }
  545. else
  546. setLastError("Failed to close the JACK client");
  547. }
  548. else
  549. setLastError("Failed to deactivate the JACK client");
  550. fClient = nullptr;
  551. fUsedGroupNames.clear();
  552. fUsedPortNames.clear();
  553. fUsedConnections.clear();
  554. #endif
  555. return false;
  556. }
  557. bool isRunning() const override
  558. {
  559. #ifdef BUILD_BRIDGE
  560. return (fClient != nullptr || ! fHasQuit);
  561. #else
  562. return (fClient != nullptr);
  563. #endif
  564. }
  565. bool isOffline() const override
  566. {
  567. return fFreewheel;
  568. }
  569. EngineType type() const override
  570. {
  571. return kEngineTypeJack;
  572. }
  573. CarlaEngineClient* addClient(CarlaPlugin* const plugin) override
  574. {
  575. jack_client_t* client = nullptr;
  576. #ifdef BUILD_BRIDGE
  577. client = fClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  578. fBufferSize = jackbridge_get_buffer_size(client);
  579. fSampleRate = jackbridge_get_sample_rate(client);
  580. jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
  581. jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
  582. jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
  583. jackbridge_set_process_callback(client, carla_jack_process_callback, this);
  584. jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
  585. # if WANT_JACK_LATENCY
  586. jackbridge_set_latency_callback(client, carla_jack_latency_callback, this);
  587. # endif
  588. #else
  589. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  590. {
  591. client = fClient;
  592. }
  593. else if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  594. {
  595. client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  596. jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin);
  597. # if WANT_JACK_LATENCY
  598. jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin);
  599. # endif
  600. }
  601. #endif
  602. return new CarlaEngineJackClient(kEngineTypeJack, fOptions.processMode, client);
  603. }
  604. #ifndef BUILD_BRIDGE
  605. // -------------------------------------------------------------------
  606. // Patchbay
  607. bool patchbayConnect(int portA, int portB) override
  608. {
  609. CARLA_ASSERT(fClient != nullptr);
  610. if (fClient == nullptr)
  611. {
  612. setLastError("Invalid JACK client");
  613. return false;
  614. }
  615. const char* const portNameA = getFullPortName(portA).toUtf8().constData();
  616. const char* const portNameB = getFullPortName(portB).toUtf8().constData();
  617. if (jack_connect(fClient, portNameA, portNameB) != 0)
  618. {
  619. setLastError("JACK operation failed");
  620. return false;
  621. }
  622. return true;
  623. }
  624. bool patchbayDisconnect(int connectionId) override
  625. {
  626. CARLA_ASSERT(fClient != nullptr);
  627. if (fClient == nullptr)
  628. {
  629. setLastError("Invalid JACK client");
  630. return false;
  631. }
  632. for (int i=0, count=fUsedConnections.count(); i < count; ++i)
  633. {
  634. if (fUsedConnections[i].id == connectionId)
  635. {
  636. const char* const portNameA = getFullPortName(fUsedConnections[i].portOut).toUtf8().constData();
  637. const char* const portNameB = getFullPortName(fUsedConnections[i].portIn).toUtf8().constData();
  638. if (jack_disconnect(fClient, portNameA, portNameB) != 0)
  639. {
  640. setLastError("JACK operation failed");
  641. return false;
  642. }
  643. return true;
  644. }
  645. }
  646. setLastError("Failed to find the requested connection");
  647. return false;
  648. }
  649. void patchbayRefresh() override
  650. {
  651. CARLA_ASSERT(fClient != nullptr);
  652. if (fClient == nullptr)
  653. return;
  654. fLastGroupId = 0;
  655. fLastPortId = 0;
  656. fLastConnectionId = 0;
  657. fUsedGroupNames.clear();
  658. fUsedPortNames.clear();
  659. fUsedConnections.clear();
  660. initJackPatchbay(jackbridge_get_client_name(fClient));
  661. }
  662. #endif
  663. // -------------------------------------------------------------------
  664. // Transport
  665. void transportPlay() override
  666. {
  667. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  668. CarlaEngine::transportPlay();
  669. else if (fClient != nullptr)
  670. jackbridge_transport_start(fClient);
  671. }
  672. void transportPause() override
  673. {
  674. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  675. CarlaEngine::transportPause();
  676. else if (fClient != nullptr)
  677. jackbridge_transport_stop(fClient);
  678. }
  679. void transportRelocate(const uint32_t frame) override
  680. {
  681. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  682. CarlaEngine::transportRelocate(frame);
  683. else if (fClient != nullptr)
  684. jackbridge_transport_locate(fClient, frame);
  685. }
  686. // -------------------------------------
  687. protected:
  688. void handleJackBufferSizeCallback(const uint32_t newBufferSize)
  689. {
  690. if (fBufferSize == newBufferSize)
  691. return;
  692. fBufferSize = newBufferSize;
  693. bufferSizeChanged(newBufferSize);
  694. }
  695. void handleJackSampleRateCallback(const double newSampleRate)
  696. {
  697. if (fSampleRate == newSampleRate)
  698. return;
  699. fSampleRate = newSampleRate;
  700. sampleRateChanged(newSampleRate);
  701. }
  702. void handleJackFreewheelCallback(const bool isFreewheel)
  703. {
  704. fFreewheel = isFreewheel;
  705. }
  706. void saveTransportInfo()
  707. {
  708. if (fOptions.transportMode != TRANSPORT_MODE_JACK)
  709. return;
  710. fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate
  711. fTransportState = jackbridge_transport_query(fClient, &fTransportPos);
  712. fTimeInfo.playing = (fTransportState == JackTransportRolling);
  713. if (fTransportPos.unique_1 == fTransportPos.unique_2)
  714. {
  715. fTimeInfo.frame = fTransportPos.frame;
  716. fTimeInfo.usecs = fTransportPos.usecs;
  717. if (fTransportPos.valid & JackPositionBBT)
  718. {
  719. fTimeInfo.valid = EngineTimeInfo::ValidBBT;
  720. fTimeInfo.bbt.bar = fTransportPos.bar;
  721. fTimeInfo.bbt.beat = fTransportPos.beat;
  722. fTimeInfo.bbt.tick = fTransportPos.tick;
  723. fTimeInfo.bbt.barStartTick = fTransportPos.bar_start_tick;
  724. fTimeInfo.bbt.beatsPerBar = fTransportPos.beats_per_bar;
  725. fTimeInfo.bbt.beatType = fTransportPos.beat_type;
  726. fTimeInfo.bbt.ticksPerBeat = fTransportPos.ticks_per_beat;
  727. fTimeInfo.bbt.beatsPerMinute = fTransportPos.beats_per_minute;
  728. }
  729. else
  730. fTimeInfo.valid = 0x0;
  731. }
  732. else
  733. {
  734. fTimeInfo.frame = 0;
  735. fTimeInfo.valid = 0x0;
  736. }
  737. }
  738. void handleJackProcessCallback(const uint32_t nframes)
  739. {
  740. saveTransportInfo();
  741. #ifndef BUILD_BRIDGE
  742. if (kData->curPluginCount == 0)
  743. {
  744. // pass-through
  745. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  746. {
  747. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn1], nframes);
  748. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn2], nframes);
  749. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut1], nframes);
  750. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut2], nframes);
  751. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[rackPortEventOut], nframes);
  752. CARLA_ASSERT(audioIn1 != nullptr);
  753. CARLA_ASSERT(audioIn2 != nullptr);
  754. CARLA_ASSERT(audioOut1 != nullptr);
  755. CARLA_ASSERT(audioOut2 != nullptr);
  756. CARLA_ASSERT(eventOut != nullptr);
  757. carla_copyFloat(audioOut1, audioIn1, nframes);
  758. carla_copyFloat(audioOut2, audioIn2, nframes);
  759. jackbridge_midi_clear_buffer(eventOut);
  760. }
  761. return proccessPendingEvents();
  762. }
  763. #endif
  764. #ifdef BUILD_BRIDGE
  765. CarlaPlugin* const plugin = getPluginUnchecked(0);
  766. if (plugin && plugin->enabled() && plugin->tryLock())
  767. {
  768. plugin->initBuffers();
  769. processPlugin(plugin, nframes);
  770. plugin->unlock();
  771. }
  772. #else
  773. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  774. {
  775. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  776. {
  777. CarlaPlugin* const plugin = getPluginUnchecked(i);
  778. if (plugin && plugin->enabled() && plugin->tryLock())
  779. {
  780. plugin->initBuffers();
  781. processPlugin(plugin, nframes);
  782. plugin->unlock();
  783. }
  784. }
  785. }
  786. else if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  787. {
  788. // get buffers from jack
  789. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn1], nframes);
  790. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn2], nframes);
  791. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut1], nframes);
  792. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut2], nframes);
  793. void* const eventIn = jackbridge_port_get_buffer(fRackPorts[rackPortEventIn], nframes);
  794. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[rackPortEventOut], nframes);
  795. // assert buffers
  796. CARLA_ASSERT(audioIn1 != nullptr);
  797. CARLA_ASSERT(audioIn2 != nullptr);
  798. CARLA_ASSERT(audioOut1 != nullptr);
  799. CARLA_ASSERT(audioOut2 != nullptr);
  800. CARLA_ASSERT(eventIn != nullptr);
  801. CARLA_ASSERT(eventOut != nullptr);
  802. // create audio buffers
  803. float* inBuf[2] = { audioIn1, audioIn2 };
  804. float* outBuf[2] = { audioOut1, audioOut2 };
  805. // initialize input events
  806. carla_zeroStruct<EngineEvent>(kData->rack.in, RACK_EVENT_COUNT);
  807. {
  808. uint32_t engineEventIndex = 0;
  809. jack_midi_event_t jackEvent;
  810. const uint32_t jackEventCount = jackbridge_midi_get_event_count(eventIn);
  811. for (uint32_t jackEventIndex=0; jackEventIndex < jackEventCount; ++jackEventIndex)
  812. {
  813. if (jackbridge_midi_event_get(&jackEvent, eventIn, jackEventIndex) != 0)
  814. continue;
  815. EngineEvent* const engineEvent = &kData->rack.in[engineEventIndex++];
  816. engineEvent->clear();
  817. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  818. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  819. engineEvent->time = jackEvent.time;
  820. engineEvent->channel = midiChannel;
  821. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  822. {
  823. const uint8_t midiControl = jackEvent.buffer[1];
  824. engineEvent->type = kEngineEventTypeControl;
  825. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  826. {
  827. const uint8_t midiBank = jackEvent.buffer[2];
  828. engineEvent->ctrl.type = kEngineControlEventTypeMidiBank;
  829. engineEvent->ctrl.param = midiBank;
  830. engineEvent->ctrl.value = 0.0;
  831. }
  832. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  833. {
  834. engineEvent->ctrl.type = kEngineControlEventTypeAllSoundOff;
  835. engineEvent->ctrl.param = 0;
  836. engineEvent->ctrl.value = 0.0;
  837. }
  838. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  839. {
  840. engineEvent->ctrl.type = kEngineControlEventTypeAllNotesOff;
  841. engineEvent->ctrl.param = 0;
  842. engineEvent->ctrl.value = 0.0;
  843. }
  844. else
  845. {
  846. const uint8_t midiValue = jackEvent.buffer[2];
  847. engineEvent->ctrl.type = kEngineControlEventTypeParameter;
  848. engineEvent->ctrl.param = midiControl;
  849. engineEvent->ctrl.value = double(midiValue)/127.0;
  850. }
  851. }
  852. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  853. {
  854. const uint8_t midiProgram = jackEvent.buffer[1];
  855. engineEvent->type = kEngineEventTypeControl;
  856. engineEvent->ctrl.type = kEngineControlEventTypeMidiProgram;
  857. engineEvent->ctrl.param = midiProgram;
  858. engineEvent->ctrl.value = 0.0;
  859. }
  860. else if (jackEvent.size <= 4)
  861. {
  862. engineEvent->type = kEngineEventTypeMidi;
  863. carla_copy<uint8_t>(engineEvent->midi.data, jackEvent.buffer, jackEvent.size);
  864. engineEvent->midi.data[0] = midiStatus;
  865. engineEvent->midi.size = static_cast<uint8_t>(jackEvent.size);
  866. }
  867. if (engineEventIndex >= RACK_EVENT_COUNT)
  868. break;
  869. }
  870. }
  871. // process rack
  872. processRack(inBuf, outBuf, nframes);
  873. // output control
  874. {
  875. jackbridge_midi_clear_buffer(eventOut);
  876. for (unsigned short i=0; i < RACK_EVENT_COUNT; ++i)
  877. {
  878. EngineEvent* const engineEvent = &kData->rack.out[i];
  879. uint8_t data[3] = { 0 };
  880. uint8_t size = 0;
  881. switch (engineEvent->type)
  882. {
  883. case kEngineEventTypeNull:
  884. break;
  885. case kEngineEventTypeControl:
  886. {
  887. EngineControlEvent* const ctrlEvent = &engineEvent->ctrl;
  888. if (ctrlEvent->type == kEngineControlEventTypeParameter && MIDI_IS_CONTROL_BANK_SELECT(ctrlEvent->param))
  889. {
  890. // FIXME?
  891. ctrlEvent->type = kEngineControlEventTypeMidiBank;
  892. ctrlEvent->param = ctrlEvent->value;
  893. ctrlEvent->value = 0.0;
  894. }
  895. switch (ctrlEvent->type)
  896. {
  897. case kEngineControlEventTypeNull:
  898. break;
  899. case kEngineControlEventTypeParameter:
  900. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  901. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  902. data[2] = uint8_t(ctrlEvent->value * 127.0);
  903. size = 3;
  904. break;
  905. case kEngineControlEventTypeMidiBank:
  906. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  907. data[1] = MIDI_CONTROL_BANK_SELECT;
  908. data[2] = static_cast<uint8_t>(ctrlEvent->param);
  909. size = 3;
  910. break;
  911. case kEngineControlEventTypeMidiProgram:
  912. data[0] = MIDI_STATUS_PROGRAM_CHANGE + engineEvent->channel;
  913. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  914. size = 2;
  915. break;
  916. case kEngineControlEventTypeAllSoundOff:
  917. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  918. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  919. size = 2;
  920. break;
  921. case kEngineControlEventTypeAllNotesOff:
  922. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  923. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  924. size = 2;
  925. break;
  926. }
  927. break;
  928. }
  929. case kEngineEventTypeMidi:
  930. {
  931. EngineMidiEvent* const midiEvent = &engineEvent->midi;
  932. data[0] = midiEvent->data[0];
  933. data[1] = midiEvent->data[1];
  934. data[2] = midiEvent->data[2];
  935. size = midiEvent->size;
  936. break;
  937. }
  938. }
  939. if (size > 0)
  940. jackbridge_midi_event_write(eventOut, engineEvent->time, data, size);
  941. }
  942. }
  943. }
  944. #endif // ! BUILD_BRIDGE
  945. proccessPendingEvents();
  946. }
  947. #if WANT_JACK_LATENCY
  948. void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
  949. {
  950. if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
  951. return;
  952. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  953. {
  954. CarlaPlugin* const plugin = getPluginUnchecked(i);
  955. if (plugin && plugin->enabled())
  956. latencyPlugin(plugin, mode);
  957. }
  958. }
  959. #endif
  960. #ifndef BUILD_BRIDGE
  961. void handleJackClientRegistrationCallback(const char* name, bool reg)
  962. {
  963. if (reg)
  964. {
  965. GroupNameToId groupNameToId;
  966. groupNameToId.id = fLastGroupId;
  967. groupNameToId.name = name;
  968. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, fLastGroupId, 0, 0.0f, name);
  969. fUsedGroupNames.append(groupNameToId);
  970. fLastGroupId++;
  971. }
  972. else
  973. {
  974. for (int i=0, count=fUsedGroupNames.count(); i < count; ++i)
  975. {
  976. if (fUsedGroupNames[i].name == name)
  977. {
  978. callback(CALLBACK_PATCHBAY_CLIENT_REMOVED, 0, fUsedGroupNames[i].id, 0, 0.0f, nullptr);
  979. fUsedGroupNames.takeAt(i);
  980. break;
  981. }
  982. }
  983. }
  984. }
  985. void handleJackPortRegistrationCallback(jack_port_id_t port, bool reg)
  986. {
  987. jack_port_t* jackPort = jack_port_by_id(fClient, port);
  988. QString fullName(jack_port_name(jackPort));
  989. QString groupName = fullName.split(":").at(0);
  990. int groupId = getGroupId(groupName);
  991. const char* portName = jack_port_short_name(jackPort);
  992. if (reg)
  993. {
  994. bool portIsInput = (jack_port_flags(jackPort) & JackPortIsInput);
  995. bool portIsAudio = (std::strcmp(jack_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
  996. unsigned int portFlags = 0x0;
  997. portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
  998. portFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
  999. PortNameToId portNameToId;
  1000. portNameToId.groupId = groupId;
  1001. portNameToId.portId = fLastPortId;
  1002. portNameToId.name = portName;
  1003. portNameToId.fullName = fullName;
  1004. fUsedPortNames.append(portNameToId);
  1005. callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, fLastPortId, portFlags, portName);
  1006. fLastPortId++;
  1007. }
  1008. else
  1009. {
  1010. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1011. {
  1012. if (fUsedPortNames[i].groupId == groupId && fUsedPortNames[i].name == portName)
  1013. {
  1014. callback(CALLBACK_PATCHBAY_PORT_REMOVED, 0, fUsedPortNames[i].portId, 0, 0.0f, nullptr);
  1015. fUsedPortNames.takeAt(i);
  1016. break;
  1017. }
  1018. }
  1019. }
  1020. }
  1021. void handleJackPortConnectCallback(jack_port_id_t a, jack_port_id_t b, bool connect)
  1022. {
  1023. jack_port_t* jackPortA = jack_port_by_id(fClient, a);
  1024. jack_port_t* jackPortB = jack_port_by_id(fClient, b);
  1025. int portIdA = getPortId(QString(jack_port_name(jackPortA)));
  1026. int portIdB = getPortId(QString(jack_port_name(jackPortB)));
  1027. if (connect)
  1028. {
  1029. ConnectionToId connectionToId;
  1030. connectionToId.id = fLastConnectionId;
  1031. connectionToId.portOut = portIdA;
  1032. connectionToId.portIn = portIdB;
  1033. fUsedConnections.append(connectionToId);
  1034. callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, portIdA, portIdB, nullptr);
  1035. fLastConnectionId++;
  1036. }
  1037. else
  1038. {
  1039. for (int i=0, count=fUsedConnections.count(); i < count; ++i)
  1040. {
  1041. if (fUsedConnections[i].portOut == portIdA && fUsedConnections[i].portIn == portIdB)
  1042. {
  1043. callback(CALLBACK_PATCHBAY_CONNECTION_REMOVED, 0, fUsedConnections[i].id, 0, 0.0f, nullptr);
  1044. fUsedConnections.takeAt(i);
  1045. break;
  1046. }
  1047. }
  1048. }
  1049. }
  1050. void handleJackPortRenameCallback(jack_port_id_t port, const char* oldName, const char* newName)
  1051. {
  1052. jack_port_t* jackPort = jack_port_by_id(fClient, port);
  1053. QString fullName(oldName);
  1054. QString groupName = fullName.split(":").at(0);
  1055. int groupId = getGroupId(groupName);
  1056. const char* portName = jack_port_short_name(jackPort);
  1057. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1058. {
  1059. if (fUsedPortNames[i].groupId == groupId && fUsedPortNames[i].name == portName)
  1060. {
  1061. callback(CALLBACK_PATCHBAY_PORT_RENAMED, 0, fUsedPortNames[i].portId, 0, 0.0f, newName);
  1062. fUsedPortNames[i].name = newName;
  1063. break;
  1064. }
  1065. }
  1066. }
  1067. #endif
  1068. void handleJackShutdownCallback()
  1069. {
  1070. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  1071. {
  1072. //CarlaPlugin* const plugin = getPluginUnchecked(i);
  1073. //if (plugin)
  1074. // plugin->x_client = nullptr;
  1075. }
  1076. fClient = nullptr;
  1077. callback(CALLBACK_QUIT, 0, 0, 0, 0.0f, nullptr);
  1078. }
  1079. // -------------------------------------
  1080. private:
  1081. jack_client_t* fClient;
  1082. jack_position_t fTransportPos;
  1083. jack_transport_state_t fTransportState;
  1084. bool fFreewheel;
  1085. // -------------------------------------
  1086. #ifdef BUILD_BRIDGE
  1087. bool fHasQuit;
  1088. #else
  1089. enum RackPorts {
  1090. rackPortAudioIn1 = 0,
  1091. rackPortAudioIn2 = 1,
  1092. rackPortAudioOut1 = 2,
  1093. rackPortAudioOut2 = 3,
  1094. rackPortEventIn = 4,
  1095. rackPortEventOut = 5,
  1096. rackPortCount = 8
  1097. };
  1098. jack_port_t* fRackPorts[rackPortCount];
  1099. struct GroupNameToId {
  1100. int id;
  1101. QString name;
  1102. };
  1103. struct PortNameToId {
  1104. int groupId;
  1105. int portId;
  1106. QString name;
  1107. QString fullName;
  1108. };
  1109. struct ConnectionToId {
  1110. int id;
  1111. int portOut;
  1112. int portIn;
  1113. };
  1114. int fLastGroupId;
  1115. int fLastPortId;
  1116. int fLastConnectionId;
  1117. QList<GroupNameToId> fUsedGroupNames;
  1118. QList<PortNameToId> fUsedPortNames;
  1119. QList<ConnectionToId> fUsedConnections;
  1120. int getGroupId(QString groupName)
  1121. {
  1122. for (int i=0, count=fUsedGroupNames.count(); i < count; ++i)
  1123. {
  1124. if (fUsedGroupNames[i].name == groupName)
  1125. {
  1126. return fUsedGroupNames[i].id;
  1127. }
  1128. }
  1129. return -1;
  1130. }
  1131. int getPortId(QString fullPortName)
  1132. {
  1133. QString groupName = fullPortName.split(":").at(0);
  1134. QString portName = fullPortName.replace(groupName+":", "");
  1135. int groupId = getGroupId(groupName);
  1136. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1137. {
  1138. if (fUsedPortNames[i].groupId == groupId && fUsedPortNames[i].name == portName)
  1139. {
  1140. return fUsedPortNames[i].portId;
  1141. }
  1142. }
  1143. return -1;
  1144. }
  1145. QString& getFullPortName(int portId)
  1146. {
  1147. static QString fallbackString;
  1148. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1149. {
  1150. if (fUsedPortNames[i].portId == portId)
  1151. {
  1152. return fUsedPortNames[i].fullName;
  1153. }
  1154. }
  1155. return fallbackString;
  1156. }
  1157. void initJackPatchbay(const char* const ourName)
  1158. {
  1159. // query initial jack ports
  1160. QList<QString> parsedGroups;
  1161. // our client
  1162. {
  1163. GroupNameToId groupNameToId;
  1164. groupNameToId.id = fLastGroupId;
  1165. groupNameToId.name = ourName;
  1166. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, fLastGroupId, 0, 0.0f, ourName);
  1167. fUsedGroupNames.append(groupNameToId);
  1168. fLastGroupId++;
  1169. parsedGroups.append(QString(ourName));
  1170. }
  1171. if (const char** ports = jack_get_ports(fClient, nullptr, nullptr, 0))
  1172. {
  1173. for (int i=0; ports[i] != nullptr; ++i)
  1174. {
  1175. jack_port_t* jackPort = jack_port_by_name(fClient, ports[i]);
  1176. const char* portName = jack_port_short_name(jackPort);
  1177. QString fullName(ports[i]);
  1178. QString groupName(fullName.split(":").at(0));
  1179. int groupId = -1;
  1180. if (groupName == ourName)
  1181. continue;
  1182. if (parsedGroups.contains(groupName))
  1183. {
  1184. groupId = getGroupId(groupName);
  1185. }
  1186. else
  1187. {
  1188. groupId = fLastGroupId++;
  1189. GroupNameToId groupNameToId;
  1190. groupNameToId.id = groupId;
  1191. groupNameToId.name = groupName;
  1192. fUsedGroupNames.append(groupNameToId);
  1193. parsedGroups.append(groupName);
  1194. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, 0, 0.0f, groupName.toUtf8().constData());
  1195. }
  1196. bool portIsInput = (jack_port_flags(jackPort) & JackPortIsInput);
  1197. bool portIsAudio = (std::strcmp(jack_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
  1198. unsigned int portFlags = 0x0;
  1199. portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
  1200. portFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
  1201. PortNameToId portNameToId;
  1202. portNameToId.groupId = groupId;
  1203. portNameToId.portId = fLastPortId;
  1204. portNameToId.name = portName;
  1205. portNameToId.fullName = fullName;
  1206. fUsedPortNames.append(portNameToId);
  1207. callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, fLastPortId, portFlags, portName);
  1208. fLastPortId++;
  1209. }
  1210. jack_free(ports);
  1211. }
  1212. // query connections, after all ports are in place
  1213. if (const char** ports = jack_get_ports(fClient, nullptr, nullptr, JackPortIsOutput))
  1214. {
  1215. for (int i=0; ports[i] != nullptr; ++i)
  1216. {
  1217. jack_port_t* jackPort = jack_port_by_name(fClient, ports[i]);
  1218. int thisPortId = getPortId(QString(ports[i]));
  1219. if (const char** jackConnections = jack_port_get_connections(jackPort))
  1220. {
  1221. for (int j=0; jackConnections[j] != nullptr; ++j)
  1222. {
  1223. int targetPortId = getPortId(QString(jackConnections[j]));
  1224. ConnectionToId connectionToId;
  1225. connectionToId.id = fLastConnectionId;
  1226. connectionToId.portOut = thisPortId;
  1227. connectionToId.portIn = targetPortId;
  1228. fUsedConnections.append(connectionToId);
  1229. callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, thisPortId, targetPortId, nullptr);
  1230. fLastConnectionId++;
  1231. }
  1232. jack_free(jackConnections);
  1233. }
  1234. }
  1235. jack_free(ports);
  1236. }
  1237. }
  1238. #endif
  1239. // -------------------------------------
  1240. void processPlugin(CarlaPlugin* const plugin, const uint32_t nframes)
  1241. {
  1242. const uint32_t inCount = plugin->audioInCount();
  1243. const uint32_t outCount = plugin->audioOutCount();
  1244. float* inBuffer[inCount];
  1245. float* outBuffer[outCount];
  1246. float inPeaks[inCount];
  1247. float outPeaks[outCount];
  1248. if (inCount > 0)
  1249. carla_zeroFloat(inPeaks, inCount);
  1250. if (outCount > 0)
  1251. carla_zeroFloat(outPeaks, outCount);
  1252. for (uint32_t i=0; i < inCount; ++i)
  1253. {
  1254. CarlaEngineAudioPort* const port = CarlaPluginGetAudioInPort(plugin, i);
  1255. inBuffer[i] = port->getBuffer();
  1256. }
  1257. for (uint32_t i=0; i < outCount; ++i)
  1258. {
  1259. CarlaEngineAudioPort* const port = CarlaPluginGetAudioOutPort(plugin, i);
  1260. outBuffer[i] = port->getBuffer();
  1261. }
  1262. for (uint32_t i=0; i < inCount; ++i)
  1263. {
  1264. for (uint32_t j=0; j < nframes; ++j)
  1265. {
  1266. const float absV = std::fabs(inBuffer[i][j]);
  1267. if (absV > inPeaks[i])
  1268. inPeaks[i] = absV;
  1269. }
  1270. }
  1271. plugin->process(inBuffer, outBuffer, nframes);
  1272. for (uint32_t i=0; i < outCount; ++i)
  1273. {
  1274. for (uint32_t j=0; j < nframes; ++j)
  1275. {
  1276. const float absV = std::fabs(outBuffer[i][j]);
  1277. if (absV > outPeaks[i])
  1278. outPeaks[i] = absV;
  1279. }
  1280. }
  1281. setPeaks(plugin->id(), inPeaks, outPeaks);
  1282. }
  1283. #if WANT_JACK_LATENCY
  1284. void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode)
  1285. {
  1286. const uint32_t inCount = plugin->audioInCount();
  1287. const uint32_t outCount = plugin->audioOutCount();
  1288. jack_latency_range_t range;
  1289. uint32_t pluginLatency = plugin->latency();
  1290. if (pluginLatency == 0)
  1291. return;
  1292. if (mode == JackCaptureLatency)
  1293. {
  1294. for (uint32_t i=0; i < inCount; ++i)
  1295. {
  1296. uint32_t aOutI = (i >= outCount) ? outCount : i;
  1297. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, i))->kPort;
  1298. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, aOutI))->kPort;
  1299. jackbridge_port_get_latency_range(portIn, mode, &range);
  1300. range.min += pluginLatency;
  1301. range.max += pluginLatency;
  1302. jackbridge_port_set_latency_range(portOut, mode, &range);
  1303. }
  1304. }
  1305. else
  1306. {
  1307. for (uint32_t i=0; i < outCount; ++i)
  1308. {
  1309. uint32_t aInI = (i >= inCount) ? inCount : i;
  1310. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, aInI))->kPort;
  1311. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, i))->kPort;
  1312. jackbridge_port_get_latency_range(portOut, mode, &range);
  1313. range.min += pluginLatency;
  1314. range.max += pluginLatency;
  1315. jackbridge_port_set_latency_range(portIn, mode, &range);
  1316. }
  1317. }
  1318. }
  1319. #endif
  1320. // -------------------------------------
  1321. #define handlePtr ((CarlaEngineJack*)arg)
  1322. static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg)
  1323. {
  1324. handlePtr->handleJackSampleRateCallback(newSampleRate);
  1325. return 0;
  1326. }
  1327. static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg)
  1328. {
  1329. handlePtr->handleJackBufferSizeCallback(newBufferSize);
  1330. return 0;
  1331. }
  1332. static void carla_jack_freewheel_callback(int starting, void* arg)
  1333. {
  1334. handlePtr->handleJackFreewheelCallback(bool(starting));
  1335. }
  1336. static int carla_jack_process_callback(jack_nframes_t nframes, void* arg)
  1337. {
  1338. handlePtr->handleJackProcessCallback(nframes);
  1339. return 0;
  1340. }
  1341. #if WANT_JACK_LATENCY
  1342. static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg)
  1343. {
  1344. handlePtr->handleJackLatencyCallback(mode);
  1345. }
  1346. #endif
  1347. #ifndef BUILD_BRIDGE
  1348. static void carla_jack_client_registration_callback(const char* name, int reg, void* arg)
  1349. {
  1350. handlePtr->handleJackClientRegistrationCallback(name, (reg != 0));
  1351. }
  1352. static void carla_jack_port_registration_callback(jack_port_id_t port, int reg, void* arg)
  1353. {
  1354. handlePtr->handleJackPortRegistrationCallback(port, (reg != 0));
  1355. }
  1356. static void carla_jack_port_connect_callback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg)
  1357. {
  1358. handlePtr->handleJackPortConnectCallback(a, b, (connect != 0));
  1359. }
  1360. static int carla_jack_port_rename_callback(jack_port_id_t port, const char* oldName, const char* newName, void* arg)
  1361. {
  1362. handlePtr->handleJackPortRenameCallback(port, oldName, newName);
  1363. return 0;
  1364. }
  1365. #endif
  1366. static void carla_jack_shutdown_callback(void* arg)
  1367. {
  1368. handlePtr->handleJackShutdownCallback();
  1369. }
  1370. #undef handlePtr
  1371. // -------------------------------------
  1372. #ifndef BUILD_BRIDGE
  1373. static int carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg)
  1374. {
  1375. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  1376. if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
  1377. {
  1378. CarlaEngineJack* const engine = (CarlaEngineJack*)CarlaPluginGetEngine(plugin);
  1379. plugin->initBuffers();
  1380. engine->saveTransportInfo();
  1381. engine->processPlugin(plugin, nframes);
  1382. plugin->unlock();
  1383. }
  1384. else
  1385. carla_stdout("Plugin not enabled or locked");
  1386. return 0;
  1387. }
  1388. # if WANT_JACK_LATENCY
  1389. static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg)
  1390. {
  1391. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  1392. if (plugin != nullptr && plugin->enabled())
  1393. {
  1394. CarlaEngineJack* const engine = (CarlaEngineJack*)CarlaPluginGetEngine(plugin);
  1395. engine->latencyPlugin(plugin, mode);
  1396. }
  1397. }
  1398. # endif
  1399. #endif
  1400. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJack)
  1401. };
  1402. // -----------------------------------------
  1403. CarlaEngine* CarlaEngine::newJack()
  1404. {
  1405. return new CarlaEngineJack();
  1406. }
  1407. // -----------------------------------------
  1408. CARLA_BACKEND_END_NAMESPACE
  1409. #endif // CARLA_ENGINE_JACK