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.

1685 lines
56KB

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