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.

1847 lines
61KB

  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_fill<jack_port_t*>(fRackPorts, rackPortCount, nullptr);
  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. fPluginClientNames.clear();
  446. #endif
  447. }
  448. // -------------------------------------------------------------------
  449. // Maximum values
  450. unsigned int maxClientNameSize() const override
  451. {
  452. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  453. return static_cast<unsigned int>(jackbridge_client_name_size());
  454. return CarlaEngine::maxClientNameSize();
  455. }
  456. unsigned int maxPortNameSize() const override
  457. {
  458. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  459. return static_cast<unsigned int>(jackbridge_port_name_size());
  460. return CarlaEngine::maxPortNameSize();
  461. }
  462. // -------------------------------------------------------------------
  463. // Virtual, per-engine type calls
  464. bool init(const char* const clientName) override
  465. {
  466. carla_debug("CarlaEngineJack::init(\"%s\")", clientName);
  467. fFreewheel = false;
  468. fTransportState = JackTransportStopped;
  469. carla_zeroStruct<jack_position_t>(fTransportPos);
  470. #ifndef BUILD_BRIDGE
  471. fLastGroupId = 0;
  472. fLastPortId = 0;
  473. fLastConnectionId = 0;
  474. fUsedGroupNames.clear();
  475. fUsedPortNames.clear();
  476. fUsedConnections.clear();
  477. fPluginClientNames.clear();
  478. fClient = jackbridge_client_open(clientName, JackNullOption, nullptr);
  479. if (fClient != nullptr)
  480. {
  481. fBufferSize = jackbridge_get_buffer_size(fClient);
  482. fSampleRate = jackbridge_get_sample_rate(fClient);
  483. jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback, this);
  484. jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback, this);
  485. jackbridge_set_freewheel_callback(fClient, carla_jack_freewheel_callback, this);
  486. jackbridge_set_process_callback(fClient, carla_jack_process_callback, this);
  487. jackbridge_on_shutdown(fClient, carla_jack_shutdown_callback, this);
  488. # if 0
  489. jackbridge_set_latency_callback(fClient, carla_jack_latency_callback, this);
  490. # endif
  491. const char* const jackClientName(jackbridge_get_client_name(fClient));
  492. initJackPatchbay(jackClientName);
  493. jackbridge_set_client_registration_callback(fClient, carla_jack_client_registration_callback, this);
  494. jackbridge_set_port_registration_callback(fClient, carla_jack_port_registration_callback, this);
  495. jackbridge_set_port_connect_callback(fClient, carla_jack_port_connect_callback, this);
  496. jackbridge_set_port_rename_callback(fClient, carla_jack_port_rename_callback, this);
  497. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  498. {
  499. fRackPorts[rackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  500. fRackPorts[rackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  501. fRackPorts[rackPortAudioOut1] = jackbridge_port_register(fClient, "audio-out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  502. fRackPorts[rackPortAudioOut2] = jackbridge_port_register(fClient, "audio-out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  503. fRackPorts[rackPortEventIn] = jackbridge_port_register(fClient, "events-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  504. fRackPorts[rackPortEventOut] = jackbridge_port_register(fClient, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  505. }
  506. if (jackbridge_activate(fClient))
  507. {
  508. return CarlaEngine::init(jackClientName);
  509. }
  510. else
  511. {
  512. setLastError("Failed to activate the JACK client");
  513. jackbridge_client_close(fClient);
  514. fClient = nullptr;
  515. }
  516. }
  517. else
  518. setLastError("Failed to create new JACK client");
  519. return false;
  520. #else
  521. if (fBufferSize == 0 || fSampleRate == 0.0)
  522. {
  523. // open temp client to get initial buffer-size and sample-rate values
  524. if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr))
  525. {
  526. fBufferSize = jackbridge_get_buffer_size(tmpClient);
  527. fSampleRate = jackbridge_get_sample_rate(tmpClient);
  528. jackbridge_client_close(tmpClient);
  529. }
  530. }
  531. return CarlaEngine::init(clientName);
  532. #endif
  533. }
  534. bool close() override
  535. {
  536. carla_debug("CarlaEngineJack::close()");
  537. CarlaEngine::close();
  538. #ifdef BUILD_BRIDGE
  539. fClient = nullptr;
  540. fHasQuit = true;
  541. return true;
  542. #else
  543. if (jackbridge_deactivate(fClient))
  544. {
  545. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  546. {
  547. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioIn1]);
  548. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioIn2]);
  549. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioOut1]);
  550. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioOut2]);
  551. jackbridge_port_unregister(fClient, fRackPorts[rackPortEventIn]);
  552. jackbridge_port_unregister(fClient, fRackPorts[rackPortEventOut]);
  553. }
  554. if (jackbridge_client_close(fClient))
  555. {
  556. fClient = nullptr;
  557. return true;
  558. }
  559. else
  560. setLastError("Failed to close the JACK client");
  561. }
  562. else
  563. setLastError("Failed to deactivate the JACK client");
  564. fClient = nullptr;
  565. fUsedGroupNames.clear();
  566. fUsedPortNames.clear();
  567. fUsedConnections.clear();
  568. fPluginClientNames.clear();
  569. #endif
  570. return false;
  571. }
  572. bool isRunning() const override
  573. {
  574. #ifdef BUILD_BRIDGE
  575. return (fClient != nullptr || ! fHasQuit);
  576. #else
  577. return (fClient != nullptr);
  578. #endif
  579. }
  580. bool isOffline() const override
  581. {
  582. return fFreewheel;
  583. }
  584. EngineType type() const override
  585. {
  586. return kEngineTypeJack;
  587. }
  588. CarlaEngineClient* addClient(CarlaPlugin* const plugin) override
  589. {
  590. jack_client_t* client = nullptr;
  591. #ifdef BUILD_BRIDGE
  592. client = fClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  593. fBufferSize = jackbridge_get_buffer_size(client);
  594. fSampleRate = jackbridge_get_sample_rate(client);
  595. jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
  596. jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
  597. jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
  598. jackbridge_set_process_callback(client, carla_jack_process_callback, this);
  599. jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
  600. # if 0
  601. jackbridge_set_latency_callback(client, carla_jack_latency_callback, this);
  602. # endif
  603. #else
  604. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  605. {
  606. client = fClient;
  607. }
  608. else if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  609. {
  610. client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  611. jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin);
  612. # if 0
  613. jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin);
  614. # endif
  615. CARLA_ASSERT(client != nullptr);
  616. if (client == nullptr)
  617. return nullptr;
  618. fPluginClientNames.append(QString(jackbridge_get_client_name(client)));
  619. }
  620. #endif
  621. return new CarlaEngineJackClient(kEngineTypeJack, fOptions.processMode, client);
  622. }
  623. #ifndef BUILD_BRIDGE
  624. const char* renamePlugin(const unsigned int id, const char* const newName) override
  625. {
  626. CARLA_ASSERT(kData->curPluginCount > 0);
  627. CARLA_ASSERT(id < kData->curPluginCount);
  628. CARLA_ASSERT(kData->plugins != nullptr);
  629. CARLA_ASSERT(newName != nullptr);
  630. if (kData->plugins == nullptr)
  631. {
  632. setLastError("Critical error: no plugins are currently loaded!");
  633. return nullptr;
  634. }
  635. CarlaPlugin* const plugin(kData->plugins[id].plugin);
  636. if (plugin == nullptr)
  637. {
  638. carla_stderr("CarlaEngine::clonePlugin(%i) - could not find plugin", id);
  639. return nullptr;
  640. }
  641. CARLA_ASSERT(plugin->id() == id);
  642. bool needsReinit = (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT);
  643. const char* name = getUniquePluginName(newName);
  644. // TODO - use rename port if single-client
  645. // JACK client rename
  646. if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  647. {
  648. CarlaEngineJackClient* const client((CarlaEngineJackClient*)CarlaPluginGetEngineClient(plugin));
  649. if (bridge.client_rename_ptr != nullptr)
  650. {
  651. name = bridge.client_rename_ptr(client->kClient, name);
  652. }
  653. else
  654. {
  655. // we should not be able to do this, jack really needs to allow client rename
  656. needsReinit = true;
  657. if (jack_client_t* jclient = jackbridge_client_open(name, JackNullOption, nullptr))
  658. {
  659. // close old client
  660. plugin->setEnabled(false);
  661. if (client->isActive())
  662. client->deactivate();
  663. plugin->clearBuffers();
  664. jackbridge_client_close(client->kClient);
  665. // set new client data
  666. name = jackbridge_get_client_name(jclient);
  667. jackbridge_set_process_callback(jclient, carla_jack_process_callback_plugin, plugin);
  668. # if 0
  669. jackbridge_set_latency_callback(jclient, carla_jack_latency_callback_plugin, plugin);
  670. # endif
  671. // this is supposed to be constant...
  672. std::memcpy((jack_client_t**)&client->kClient, &jclient, sizeof(jack_client_t**));
  673. }
  674. }
  675. }
  676. if (name == nullptr)
  677. return nullptr;
  678. // Rename
  679. plugin->setName(name);
  680. if (needsReinit)
  681. {
  682. // reload plugin to recreate its ports
  683. const SaveState& saveState(plugin->getSaveState());
  684. plugin->reload();
  685. plugin->loadSaveState(saveState);
  686. }
  687. return name;
  688. }
  689. // -------------------------------------------------------------------
  690. // Patchbay
  691. bool patchbayConnect(int portA, int portB) override
  692. {
  693. CARLA_ASSERT(fClient != nullptr);
  694. if (fClient == nullptr)
  695. {
  696. setLastError("Invalid JACK client");
  697. return false;
  698. }
  699. const char* const portNameA(getFullPortName(portA).toUtf8().constData());
  700. const char* const portNameB(getFullPortName(portB).toUtf8().constData());
  701. if (! jackbridge_connect(fClient, portNameA, portNameB))
  702. {
  703. setLastError("JACK operation failed");
  704. return false;
  705. }
  706. return true;
  707. }
  708. bool patchbayDisconnect(int connectionId) override
  709. {
  710. CARLA_ASSERT(fClient != nullptr);
  711. if (fClient == nullptr)
  712. {
  713. setLastError("Invalid JACK client");
  714. return false;
  715. }
  716. for (int i=0, count=fUsedConnections.count(); i < count; ++i)
  717. {
  718. if (fUsedConnections[i].id == connectionId)
  719. {
  720. const char* const portNameA(getFullPortName(fUsedConnections[i].portOut).toUtf8().constData());
  721. const char* const portNameB(getFullPortName(fUsedConnections[i].portIn).toUtf8().constData());
  722. if (! jackbridge_disconnect(fClient, portNameA, portNameB))
  723. {
  724. setLastError("JACK operation failed");
  725. return false;
  726. }
  727. return true;
  728. }
  729. }
  730. setLastError("Failed to find the requested connection");
  731. return false;
  732. }
  733. void patchbayRefresh() override
  734. {
  735. CARLA_ASSERT(fClient != nullptr);
  736. if (fClient == nullptr)
  737. return;
  738. fLastGroupId = 0;
  739. fLastPortId = 0;
  740. fLastConnectionId = 0;
  741. fUsedGroupNames.clear();
  742. fUsedPortNames.clear();
  743. fUsedConnections.clear();
  744. initJackPatchbay(jackbridge_get_client_name(fClient));
  745. }
  746. #endif
  747. // -------------------------------------------------------------------
  748. // Transport
  749. void transportPlay() override
  750. {
  751. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  752. CarlaEngine::transportPlay();
  753. else if (fClient != nullptr)
  754. jackbridge_transport_start(fClient);
  755. }
  756. void transportPause() override
  757. {
  758. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  759. CarlaEngine::transportPause();
  760. else if (fClient != nullptr)
  761. jackbridge_transport_stop(fClient);
  762. }
  763. void transportRelocate(const uint32_t frame) override
  764. {
  765. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  766. CarlaEngine::transportRelocate(frame);
  767. else if (fClient != nullptr)
  768. jackbridge_transport_locate(fClient, frame);
  769. }
  770. // -------------------------------------
  771. protected:
  772. void handleJackBufferSizeCallback(const uint32_t newBufferSize)
  773. {
  774. if (fBufferSize == newBufferSize)
  775. return;
  776. fBufferSize = newBufferSize;
  777. bufferSizeChanged(newBufferSize);
  778. }
  779. void handleJackSampleRateCallback(const double newSampleRate)
  780. {
  781. if (fSampleRate == newSampleRate)
  782. return;
  783. fSampleRate = newSampleRate;
  784. sampleRateChanged(newSampleRate);
  785. }
  786. void handleJackFreewheelCallback(const bool isFreewheel)
  787. {
  788. fFreewheel = isFreewheel;
  789. }
  790. void saveTransportInfo()
  791. {
  792. if (fOptions.transportMode != TRANSPORT_MODE_JACK)
  793. return;
  794. fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate
  795. fTransportState = jackbridge_transport_query(fClient, &fTransportPos);
  796. fTimeInfo.playing = (fTransportState == JackTransportRolling);
  797. if (fTransportPos.unique_1 == fTransportPos.unique_2)
  798. {
  799. fTimeInfo.frame = fTransportPos.frame;
  800. fTimeInfo.usecs = fTransportPos.usecs;
  801. if (fTransportPos.valid & JackPositionBBT)
  802. {
  803. fTimeInfo.valid = EngineTimeInfo::ValidBBT;
  804. fTimeInfo.bbt.bar = fTransportPos.bar;
  805. fTimeInfo.bbt.beat = fTransportPos.beat;
  806. fTimeInfo.bbt.tick = fTransportPos.tick;
  807. fTimeInfo.bbt.barStartTick = fTransportPos.bar_start_tick;
  808. fTimeInfo.bbt.beatsPerBar = fTransportPos.beats_per_bar;
  809. fTimeInfo.bbt.beatType = fTransportPos.beat_type;
  810. fTimeInfo.bbt.ticksPerBeat = fTransportPos.ticks_per_beat;
  811. fTimeInfo.bbt.beatsPerMinute = fTransportPos.beats_per_minute;
  812. }
  813. else
  814. fTimeInfo.valid = 0x0;
  815. }
  816. else
  817. {
  818. fTimeInfo.frame = 0;
  819. fTimeInfo.valid = 0x0;
  820. }
  821. }
  822. void handleJackProcessCallback(const uint32_t nframes)
  823. {
  824. saveTransportInfo();
  825. #ifndef BUILD_BRIDGE
  826. if (kData->curPluginCount == 0)
  827. {
  828. // pass-through
  829. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  830. {
  831. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn1], nframes);
  832. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn2], nframes);
  833. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut1], nframes);
  834. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut2], nframes);
  835. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[rackPortEventOut], nframes);
  836. CARLA_ASSERT(audioIn1 != nullptr);
  837. CARLA_ASSERT(audioIn2 != nullptr);
  838. CARLA_ASSERT(audioOut1 != nullptr);
  839. CARLA_ASSERT(audioOut2 != nullptr);
  840. CARLA_ASSERT(eventOut != nullptr);
  841. carla_copyFloat(audioOut1, audioIn1, nframes);
  842. carla_copyFloat(audioOut2, audioIn2, nframes);
  843. jackbridge_midi_clear_buffer(eventOut);
  844. }
  845. return proccessPendingEvents();
  846. }
  847. #endif
  848. #ifdef BUILD_BRIDGE
  849. CarlaPlugin* const plugin(getPluginUnchecked(0));
  850. if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
  851. {
  852. plugin->initBuffers();
  853. processPlugin(plugin, nframes);
  854. plugin->unlock();
  855. }
  856. #else
  857. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  858. {
  859. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  860. {
  861. CarlaPlugin* const plugin(getPluginUnchecked(i));
  862. if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
  863. {
  864. plugin->initBuffers();
  865. processPlugin(plugin, nframes);
  866. plugin->unlock();
  867. }
  868. }
  869. }
  870. else if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  871. {
  872. // get buffers from jack
  873. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn1], nframes);
  874. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn2], nframes);
  875. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut1], nframes);
  876. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut2], nframes);
  877. void* const eventIn = jackbridge_port_get_buffer(fRackPorts[rackPortEventIn], nframes);
  878. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[rackPortEventOut], nframes);
  879. // assert buffers
  880. CARLA_ASSERT(audioIn1 != nullptr);
  881. CARLA_ASSERT(audioIn2 != nullptr);
  882. CARLA_ASSERT(audioOut1 != nullptr);
  883. CARLA_ASSERT(audioOut2 != nullptr);
  884. CARLA_ASSERT(eventIn != nullptr);
  885. CARLA_ASSERT(eventOut != nullptr);
  886. // create audio buffers
  887. float* inBuf[2] = { audioIn1, audioIn2 };
  888. float* outBuf[2] = { audioOut1, audioOut2 };
  889. // initialize input events
  890. carla_zeroStruct<EngineEvent>(kData->bufEvents.in, INTERNAL_EVENT_COUNT);
  891. {
  892. uint32_t engineEventIndex = 0;
  893. jack_midi_event_t jackEvent;
  894. const uint32_t jackEventCount = jackbridge_midi_get_event_count(eventIn);
  895. for (uint32_t jackEventIndex=0; jackEventIndex < jackEventCount; ++jackEventIndex)
  896. {
  897. if (jackbridge_midi_event_get(&jackEvent, eventIn, jackEventIndex) != 0)
  898. continue;
  899. EngineEvent* const engineEvent = &kData->bufEvents.in[engineEventIndex++];
  900. engineEvent->clear();
  901. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  902. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  903. engineEvent->time = jackEvent.time;
  904. engineEvent->channel = midiChannel;
  905. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  906. {
  907. const uint8_t midiControl = jackEvent.buffer[1];
  908. engineEvent->type = kEngineEventTypeControl;
  909. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  910. {
  911. const uint8_t midiBank = jackEvent.buffer[2];
  912. engineEvent->ctrl.type = kEngineControlEventTypeMidiBank;
  913. engineEvent->ctrl.param = midiBank;
  914. engineEvent->ctrl.value = 0.0f;
  915. }
  916. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  917. {
  918. engineEvent->ctrl.type = kEngineControlEventTypeAllSoundOff;
  919. engineEvent->ctrl.param = 0;
  920. engineEvent->ctrl.value = 0.0f;
  921. }
  922. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  923. {
  924. engineEvent->ctrl.type = kEngineControlEventTypeAllNotesOff;
  925. engineEvent->ctrl.param = 0;
  926. engineEvent->ctrl.value = 0.0f;
  927. }
  928. else
  929. {
  930. const uint8_t midiValue = jackEvent.buffer[2];
  931. engineEvent->ctrl.type = kEngineControlEventTypeParameter;
  932. engineEvent->ctrl.param = midiControl;
  933. engineEvent->ctrl.value = float(midiValue)/127.0f;
  934. }
  935. }
  936. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  937. {
  938. const uint8_t midiProgram = jackEvent.buffer[1];
  939. engineEvent->type = kEngineEventTypeControl;
  940. engineEvent->ctrl.type = kEngineControlEventTypeMidiProgram;
  941. engineEvent->ctrl.param = midiProgram;
  942. engineEvent->ctrl.value = 0.0f;
  943. }
  944. else if (jackEvent.size <= 4)
  945. {
  946. engineEvent->type = kEngineEventTypeMidi;
  947. carla_copy<uint8_t>(engineEvent->midi.data, jackEvent.buffer, jackEvent.size);
  948. engineEvent->midi.data[0] = midiStatus;
  949. engineEvent->midi.size = static_cast<uint8_t>(jackEvent.size);
  950. }
  951. if (engineEventIndex >= INTERNAL_EVENT_COUNT)
  952. break;
  953. }
  954. }
  955. // process rack
  956. processRack(inBuf, outBuf, nframes);
  957. // output control
  958. {
  959. jackbridge_midi_clear_buffer(eventOut);
  960. for (unsigned short i=0; i < INTERNAL_EVENT_COUNT; ++i)
  961. {
  962. EngineEvent* const engineEvent = &kData->bufEvents.out[i];
  963. uint8_t data[3] = { 0 };
  964. uint8_t size = 0;
  965. switch (engineEvent->type)
  966. {
  967. case kEngineEventTypeNull:
  968. break;
  969. case kEngineEventTypeControl:
  970. {
  971. EngineControlEvent* const ctrlEvent = &engineEvent->ctrl;
  972. if (ctrlEvent->type == kEngineControlEventTypeParameter && MIDI_IS_CONTROL_BANK_SELECT(ctrlEvent->param))
  973. {
  974. // FIXME?
  975. ctrlEvent->type = kEngineControlEventTypeMidiBank;
  976. ctrlEvent->param = ctrlEvent->value;
  977. ctrlEvent->value = 0.0f;
  978. }
  979. switch (ctrlEvent->type)
  980. {
  981. case kEngineControlEventTypeNull:
  982. break;
  983. case kEngineControlEventTypeParameter:
  984. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  985. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  986. data[2] = uint8_t(ctrlEvent->value * 127.0f);
  987. size = 3;
  988. break;
  989. case kEngineControlEventTypeMidiBank:
  990. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  991. data[1] = MIDI_CONTROL_BANK_SELECT;
  992. data[2] = static_cast<uint8_t>(ctrlEvent->param);
  993. size = 3;
  994. break;
  995. case kEngineControlEventTypeMidiProgram:
  996. data[0] = MIDI_STATUS_PROGRAM_CHANGE + engineEvent->channel;
  997. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  998. size = 2;
  999. break;
  1000. case kEngineControlEventTypeAllSoundOff:
  1001. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1002. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  1003. size = 2;
  1004. break;
  1005. case kEngineControlEventTypeAllNotesOff:
  1006. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1007. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  1008. size = 2;
  1009. break;
  1010. }
  1011. break;
  1012. }
  1013. case kEngineEventTypeMidi:
  1014. {
  1015. EngineMidiEvent* const midiEvent = &engineEvent->midi;
  1016. data[0] = midiEvent->data[0];
  1017. data[1] = midiEvent->data[1];
  1018. data[2] = midiEvent->data[2];
  1019. size = midiEvent->size;
  1020. break;
  1021. }
  1022. }
  1023. if (size > 0)
  1024. jackbridge_midi_event_write(eventOut, engineEvent->time, data, size);
  1025. }
  1026. }
  1027. }
  1028. #endif // ! BUILD_BRIDGE
  1029. proccessPendingEvents();
  1030. }
  1031. #if 0
  1032. void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
  1033. {
  1034. if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
  1035. return;
  1036. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  1037. {
  1038. CarlaPlugin* const plugin = getPluginUnchecked(i);
  1039. if (plugin && plugin->enabled())
  1040. latencyPlugin(plugin, mode);
  1041. }
  1042. }
  1043. #endif
  1044. #ifndef BUILD_BRIDGE
  1045. void handleJackClientRegistrationCallback(const char* name, bool reg)
  1046. {
  1047. if (reg)
  1048. {
  1049. GroupNameToId groupNameToId;
  1050. groupNameToId.id = fLastGroupId;
  1051. groupNameToId.name = name;
  1052. PatchbayIconType groupIcon = PATCHBAY_ICON_APPLICATION;
  1053. if (fPluginClientNames.contains(QString(name)))
  1054. {
  1055. // TODO - identify distrho or file icon
  1056. groupIcon = PATCHBAY_ICON_PLUGIN;
  1057. }
  1058. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, groupIcon, fLastGroupId, 0, 0.0f, name);
  1059. fUsedGroupNames.append(groupNameToId);
  1060. fLastGroupId++;
  1061. }
  1062. else
  1063. {
  1064. for (int i=0, count=fUsedGroupNames.count(); i < count; ++i)
  1065. {
  1066. if (fUsedGroupNames[i].name == name)
  1067. {
  1068. callback(CALLBACK_PATCHBAY_CLIENT_REMOVED, 0, fUsedGroupNames[i].id, 0, 0.0f, nullptr);
  1069. fUsedGroupNames.takeAt(i);
  1070. break;
  1071. }
  1072. }
  1073. }
  1074. }
  1075. void handleJackPortRegistrationCallback(jack_port_id_t port, bool reg)
  1076. {
  1077. jack_port_t* jackPort = jackbridge_port_by_id(fClient, port);
  1078. QString fullName(jackbridge_port_name(jackPort));
  1079. QString groupName = fullName.split(":").at(0);
  1080. int groupId = getGroupId(groupName);
  1081. const char* portName = jackbridge_port_short_name(jackPort);
  1082. if (reg)
  1083. {
  1084. bool portIsInput = (jackbridge_port_flags(jackPort) & JackPortIsInput);
  1085. bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
  1086. unsigned int portFlags = 0x0;
  1087. portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
  1088. portFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
  1089. PortNameToId portNameToId;
  1090. portNameToId.groupId = groupId;
  1091. portNameToId.portId = fLastPortId;
  1092. portNameToId.name = portName;
  1093. portNameToId.fullName = fullName;
  1094. fUsedPortNames.append(portNameToId);
  1095. callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, fLastPortId, portFlags, portName);
  1096. fLastPortId++;
  1097. }
  1098. else
  1099. {
  1100. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1101. {
  1102. if (fUsedPortNames[i].groupId == groupId && fUsedPortNames[i].name == portName)
  1103. {
  1104. callback(CALLBACK_PATCHBAY_PORT_REMOVED, 0, fUsedPortNames[i].portId, 0, 0.0f, nullptr);
  1105. fUsedPortNames.takeAt(i);
  1106. break;
  1107. }
  1108. }
  1109. }
  1110. }
  1111. void handleJackPortConnectCallback(jack_port_id_t a, jack_port_id_t b, bool connect)
  1112. {
  1113. jack_port_t* jackPortA = jackbridge_port_by_id(fClient, a);
  1114. jack_port_t* jackPortB = jackbridge_port_by_id(fClient, b);
  1115. int portIdA = getPortId(QString(jackbridge_port_name(jackPortA)));
  1116. int portIdB = getPortId(QString(jackbridge_port_name(jackPortB)));
  1117. if (connect)
  1118. {
  1119. ConnectionToId connectionToId;
  1120. connectionToId.id = fLastConnectionId;
  1121. connectionToId.portOut = portIdA;
  1122. connectionToId.portIn = portIdB;
  1123. fUsedConnections.append(connectionToId);
  1124. callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, portIdA, portIdB, nullptr);
  1125. fLastConnectionId++;
  1126. }
  1127. else
  1128. {
  1129. for (int i=0, count=fUsedConnections.count(); i < count; ++i)
  1130. {
  1131. if (fUsedConnections[i].portOut == portIdA && fUsedConnections[i].portIn == portIdB)
  1132. {
  1133. callback(CALLBACK_PATCHBAY_CONNECTION_REMOVED, 0, fUsedConnections[i].id, 0, 0.0f, nullptr);
  1134. fUsedConnections.takeAt(i);
  1135. break;
  1136. }
  1137. }
  1138. }
  1139. }
  1140. void handleJackPortRenameCallback(jack_port_id_t port, const char* oldName, const char* newName)
  1141. {
  1142. jack_port_t* jackPort = jackbridge_port_by_id(fClient, port);
  1143. QString fullName(oldName);
  1144. QString groupName = fullName.split(":").at(0);
  1145. int groupId = getGroupId(groupName);
  1146. const char* portName = jackbridge_port_short_name(jackPort);
  1147. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1148. {
  1149. if (fUsedPortNames[i].groupId == groupId && fUsedPortNames[i].name == portName)
  1150. {
  1151. callback(CALLBACK_PATCHBAY_PORT_RENAMED, 0, fUsedPortNames[i].portId, 0, 0.0f, newName);
  1152. fUsedPortNames[i].name = newName;
  1153. break;
  1154. }
  1155. }
  1156. }
  1157. #endif
  1158. void handleJackShutdownCallback()
  1159. {
  1160. for (unsigned int i=0; i < kData->curPluginCount; ++i)
  1161. {
  1162. //CarlaPlugin* const plugin = getPluginUnchecked(i);
  1163. //if (plugin)
  1164. // plugin->x_client = nullptr;
  1165. }
  1166. fClient = nullptr;
  1167. callback(CALLBACK_QUIT, 0, 0, 0, 0.0f, nullptr);
  1168. }
  1169. // -------------------------------------
  1170. private:
  1171. jack_client_t* fClient;
  1172. jack_position_t fTransportPos;
  1173. jack_transport_state_t fTransportState;
  1174. bool fFreewheel;
  1175. // -------------------------------------
  1176. #ifdef BUILD_BRIDGE
  1177. bool fHasQuit;
  1178. #else
  1179. enum RackPorts {
  1180. rackPortAudioIn1 = 0,
  1181. rackPortAudioIn2 = 1,
  1182. rackPortAudioOut1 = 2,
  1183. rackPortAudioOut2 = 3,
  1184. rackPortEventIn = 4,
  1185. rackPortEventOut = 5,
  1186. rackPortCount = 8
  1187. };
  1188. jack_port_t* fRackPorts[rackPortCount];
  1189. struct GroupNameToId {
  1190. int id;
  1191. QString name;
  1192. };
  1193. struct PortNameToId {
  1194. int groupId;
  1195. int portId;
  1196. QString name;
  1197. QString fullName;
  1198. };
  1199. struct ConnectionToId {
  1200. int id;
  1201. int portOut;
  1202. int portIn;
  1203. };
  1204. int fLastGroupId;
  1205. int fLastPortId;
  1206. int fLastConnectionId;
  1207. QList<GroupNameToId> fUsedGroupNames;
  1208. QList<PortNameToId> fUsedPortNames;
  1209. QList<ConnectionToId> fUsedConnections;
  1210. QStringList fPluginClientNames;
  1211. int getGroupId(QString groupName)
  1212. {
  1213. for (int i=0, count=fUsedGroupNames.count(); i < count; ++i)
  1214. {
  1215. if (fUsedGroupNames[i].name == groupName)
  1216. {
  1217. return fUsedGroupNames[i].id;
  1218. }
  1219. }
  1220. return -1;
  1221. }
  1222. int getPortId(QString fullPortName)
  1223. {
  1224. QString groupName = fullPortName.split(":").at(0);
  1225. QString portName = fullPortName.replace(groupName+":", "");
  1226. int groupId = getGroupId(groupName);
  1227. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1228. {
  1229. if (fUsedPortNames[i].groupId == groupId && fUsedPortNames[i].name == portName)
  1230. {
  1231. return fUsedPortNames[i].portId;
  1232. }
  1233. }
  1234. return -1;
  1235. }
  1236. QString& getFullPortName(int portId)
  1237. {
  1238. static QString fallbackString;
  1239. for (int i=0, count=fUsedPortNames.count(); i < count; ++i)
  1240. {
  1241. if (fUsedPortNames[i].portId == portId)
  1242. {
  1243. return fUsedPortNames[i].fullName;
  1244. }
  1245. }
  1246. return fallbackString;
  1247. }
  1248. void initJackPatchbay(const char* const ourName)
  1249. {
  1250. // query initial jack ports
  1251. QList<QString> parsedGroups;
  1252. // our client
  1253. {
  1254. GroupNameToId groupNameToId;
  1255. groupNameToId.id = fLastGroupId;
  1256. groupNameToId.name = ourName;
  1257. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, fLastGroupId, 0, 0.0f, ourName);
  1258. fUsedGroupNames.append(groupNameToId);
  1259. fLastGroupId++;
  1260. parsedGroups.append(QString(ourName));
  1261. }
  1262. if (const char** ports = jackbridge_get_ports(fClient, nullptr, nullptr, 0))
  1263. {
  1264. for (int i=0; ports[i] != nullptr; ++i)
  1265. {
  1266. jack_port_t* jackPort = jackbridge_port_by_name(fClient, ports[i]);
  1267. const char* portName = jackbridge_port_short_name(jackPort);
  1268. QString fullName(ports[i]);
  1269. QString groupName(fullName.split(":").at(0));
  1270. int groupId = -1;
  1271. int jackPortFlags = jackbridge_port_flags(jackPort);
  1272. //if (groupName == ourName)
  1273. // continue;
  1274. if (parsedGroups.contains(groupName))
  1275. {
  1276. groupId = getGroupId(groupName);
  1277. }
  1278. else
  1279. {
  1280. groupId = fLastGroupId++;
  1281. GroupNameToId groupNameToId;
  1282. groupNameToId.id = groupId;
  1283. groupNameToId.name = groupName;
  1284. fUsedGroupNames.append(groupNameToId);
  1285. parsedGroups.append(groupName);
  1286. PatchbayIconType groupIcon = PATCHBAY_ICON_APPLICATION;
  1287. if (fPluginClientNames.contains(groupName))
  1288. {
  1289. // TODO - identify distrho or file icon
  1290. groupIcon = PATCHBAY_ICON_PLUGIN;
  1291. }
  1292. else if (jackPortFlags & JackPortIsPhysical)
  1293. groupIcon = PATCHBAY_ICON_HARDWARE;
  1294. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, groupIcon, 0.0f, groupName.toUtf8().constData());
  1295. }
  1296. bool portIsInput = (jackPortFlags & JackPortIsInput);
  1297. bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
  1298. unsigned int portFlags = 0x0;
  1299. portFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
  1300. portFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
  1301. PortNameToId portNameToId;
  1302. portNameToId.groupId = groupId;
  1303. portNameToId.portId = fLastPortId;
  1304. portNameToId.name = portName;
  1305. portNameToId.fullName = fullName;
  1306. fUsedPortNames.append(portNameToId);
  1307. callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, fLastPortId, portFlags, portName);
  1308. fLastPortId++;
  1309. }
  1310. jackbridge_free(ports);
  1311. }
  1312. // query connections, after all ports are in place
  1313. if (const char** ports = jackbridge_get_ports(fClient, nullptr, nullptr, JackPortIsOutput))
  1314. {
  1315. for (int i=0; ports[i] != nullptr; ++i)
  1316. {
  1317. jack_port_t* jackPort = jackbridge_port_by_name(fClient, ports[i]);
  1318. int thisPortId = getPortId(QString(ports[i]));
  1319. if (const char** jackConnections = jackbridge_port_get_connections(jackPort))
  1320. {
  1321. for (int j=0; jackConnections[j] != nullptr; ++j)
  1322. {
  1323. int targetPortId = getPortId(QString(jackConnections[j]));
  1324. ConnectionToId connectionToId;
  1325. connectionToId.id = fLastConnectionId;
  1326. connectionToId.portOut = thisPortId;
  1327. connectionToId.portIn = targetPortId;
  1328. fUsedConnections.append(connectionToId);
  1329. callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, fLastConnectionId, thisPortId, targetPortId, nullptr);
  1330. fLastConnectionId++;
  1331. }
  1332. jackbridge_free(jackConnections);
  1333. }
  1334. }
  1335. jackbridge_free(ports);
  1336. }
  1337. }
  1338. #endif
  1339. // -------------------------------------
  1340. void processPlugin(CarlaPlugin* const plugin, const uint32_t nframes)
  1341. {
  1342. const uint32_t inCount(plugin->audioInCount());
  1343. const uint32_t outCount(plugin->audioOutCount());
  1344. float* inBuffer[inCount];
  1345. float* outBuffer[outCount];
  1346. float inPeaks[2] = { 0.0f };
  1347. float outPeaks[2] = { 0.0f };
  1348. for (uint32_t i=0; i < inCount; ++i)
  1349. {
  1350. CarlaEngineAudioPort* const port(CarlaPluginGetAudioInPort(plugin, i));
  1351. inBuffer[i] = port->getBuffer();
  1352. }
  1353. for (uint32_t i=0; i < outCount; ++i)
  1354. {
  1355. CarlaEngineAudioPort* const port(CarlaPluginGetAudioOutPort(plugin, i));
  1356. outBuffer[i] = port->getBuffer();
  1357. }
  1358. for (uint32_t i=0; i < inCount && i < 2; ++i)
  1359. {
  1360. for (uint32_t j=0; j < nframes; ++j)
  1361. {
  1362. const float absV(std::abs(inBuffer[i][j]));
  1363. if (absV > inPeaks[i])
  1364. inPeaks[i] = absV;
  1365. }
  1366. }
  1367. plugin->process(inBuffer, outBuffer, nframes);
  1368. for (uint32_t i=0; i < outCount && i < 2; ++i)
  1369. {
  1370. for (uint32_t j=0; j < nframes; ++j)
  1371. {
  1372. const float absV(std::abs(outBuffer[i][j]));
  1373. if (absV > outPeaks[i])
  1374. outPeaks[i] = absV;
  1375. }
  1376. }
  1377. setPeaks(plugin->id(), inPeaks, outPeaks);
  1378. }
  1379. #if 0
  1380. void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode)
  1381. {
  1382. const uint32_t inCount = plugin->audioInCount();
  1383. const uint32_t outCount = plugin->audioOutCount();
  1384. jack_latency_range_t range;
  1385. uint32_t pluginLatency = plugin->latency();
  1386. if (pluginLatency == 0)
  1387. return;
  1388. if (mode == JackCaptureLatency)
  1389. {
  1390. for (uint32_t i=0; i < inCount; ++i)
  1391. {
  1392. uint32_t aOutI = (i >= outCount) ? outCount : i;
  1393. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, i))->kPort;
  1394. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, aOutI))->kPort;
  1395. jackbridge_port_get_latency_range(portIn, mode, &range);
  1396. range.min += pluginLatency;
  1397. range.max += pluginLatency;
  1398. jackbridge_port_set_latency_range(portOut, mode, &range);
  1399. }
  1400. }
  1401. else
  1402. {
  1403. for (uint32_t i=0; i < outCount; ++i)
  1404. {
  1405. uint32_t aInI = (i >= inCount) ? inCount : i;
  1406. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, aInI))->kPort;
  1407. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, i))->kPort;
  1408. jackbridge_port_get_latency_range(portOut, mode, &range);
  1409. range.min += pluginLatency;
  1410. range.max += pluginLatency;
  1411. jackbridge_port_set_latency_range(portIn, mode, &range);
  1412. }
  1413. }
  1414. }
  1415. #endif
  1416. // -------------------------------------
  1417. #define handlePtr ((CarlaEngineJack*)arg)
  1418. static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg)
  1419. {
  1420. handlePtr->handleJackSampleRateCallback(newSampleRate);
  1421. return 0;
  1422. }
  1423. static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg)
  1424. {
  1425. handlePtr->handleJackBufferSizeCallback(newBufferSize);
  1426. return 0;
  1427. }
  1428. static void carla_jack_freewheel_callback(int starting, void* arg)
  1429. {
  1430. handlePtr->handleJackFreewheelCallback(bool(starting));
  1431. }
  1432. static int carla_jack_process_callback(jack_nframes_t nframes, void* arg)
  1433. {
  1434. handlePtr->handleJackProcessCallback(nframes);
  1435. return 0;
  1436. }
  1437. #if 0
  1438. static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg)
  1439. {
  1440. handlePtr->handleJackLatencyCallback(mode);
  1441. }
  1442. #endif
  1443. #ifndef BUILD_BRIDGE
  1444. static void carla_jack_client_registration_callback(const char* name, int reg, void* arg)
  1445. {
  1446. handlePtr->handleJackClientRegistrationCallback(name, (reg != 0));
  1447. }
  1448. static void carla_jack_port_registration_callback(jack_port_id_t port, int reg, void* arg)
  1449. {
  1450. handlePtr->handleJackPortRegistrationCallback(port, (reg != 0));
  1451. }
  1452. static void carla_jack_port_connect_callback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg)
  1453. {
  1454. handlePtr->handleJackPortConnectCallback(a, b, (connect != 0));
  1455. }
  1456. static int carla_jack_port_rename_callback(jack_port_id_t port, const char* oldName, const char* newName, void* arg)
  1457. {
  1458. handlePtr->handleJackPortRenameCallback(port, oldName, newName);
  1459. return 0;
  1460. }
  1461. #endif
  1462. static void carla_jack_shutdown_callback(void* arg)
  1463. {
  1464. handlePtr->handleJackShutdownCallback();
  1465. }
  1466. #undef handlePtr
  1467. // -------------------------------------
  1468. #ifndef BUILD_BRIDGE
  1469. static int carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg)
  1470. {
  1471. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  1472. if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
  1473. {
  1474. CarlaEngineJack* const engine = (CarlaEngineJack*)CarlaPluginGetEngine(plugin);
  1475. plugin->initBuffers();
  1476. engine->saveTransportInfo();
  1477. engine->processPlugin(plugin, nframes);
  1478. plugin->unlock();
  1479. }
  1480. else
  1481. carla_stdout("Plugin not enabled or locked");
  1482. return 0;
  1483. }
  1484. # if 0
  1485. static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg)
  1486. {
  1487. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  1488. if (plugin != nullptr && plugin->enabled())
  1489. {
  1490. CarlaEngineJack* const engine = (CarlaEngineJack*)CarlaPluginGetEngine(plugin);
  1491. engine->latencyPlugin(plugin, mode);
  1492. }
  1493. }
  1494. # endif
  1495. #endif
  1496. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJack)
  1497. };
  1498. // -----------------------------------------
  1499. CarlaEngine* CarlaEngine::newJack()
  1500. {
  1501. return new CarlaEngineJack();
  1502. }
  1503. // -----------------------------------------
  1504. CARLA_BACKEND_END_NAMESPACE