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.

1817 lines
60KB

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