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.

1271 lines
43KB

  1. /*
  2. * Carla JACK Engine
  3. * Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the GPL.txt file
  16. */
  17. #if 1//def WANT_JACK
  18. #include "CarlaEngineInternal.hpp"
  19. #include "CarlaBackendUtils.hpp"
  20. #include "CarlaMIDI.h"
  21. #include "jackbridge/jackbridge.h"
  22. #include <cmath>
  23. CARLA_BACKEND_START_NAMESPACE
  24. #if 0
  25. } // Fix editor indentation
  26. #endif
  27. // -------------------------------------------------------------------
  28. // Helpers, defined in CarlaPlugin.cpp
  29. extern CarlaEngine* CarlaPluginGetEngine(CarlaPlugin* const plugin);
  30. extern CarlaEngineAudioPort* CarlaPluginGetAudioInPort(CarlaPlugin* const plugin, uint32_t index);
  31. extern CarlaEngineAudioPort* CarlaPluginGetAudioOutPort(CarlaPlugin* const plugin, uint32_t index);
  32. // -------------------------------------------------------------------------------------------------------------------
  33. // Carla Engine JACK-Audio port
  34. class CarlaEngineJackAudioPort : public CarlaEngineAudioPort
  35. {
  36. public:
  37. CarlaEngineJackAudioPort(const bool isInput, const ProcessMode processMode, jack_client_t* const client, jack_port_t* const port)
  38. : CarlaEngineAudioPort(isInput, processMode),
  39. kClient(client),
  40. kPort(port)
  41. {
  42. carla_debug("CarlaEngineJackAudioPort::CarlaEngineJackAudioPort(%s, %s, %p, %p)", bool2str(isInput), ProcessMode2Str(processMode), client, port);
  43. if (processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  44. {
  45. CARLA_ASSERT(client != nullptr && port != nullptr);
  46. }
  47. else
  48. {
  49. CARLA_ASSERT(client == nullptr && port == nullptr);
  50. }
  51. }
  52. ~CarlaEngineJackAudioPort()
  53. {
  54. carla_debug("CarlaEngineJackAudioPort::~CarlaEngineJackAudioPort()");
  55. if (kClient != nullptr && kPort != nullptr)
  56. jackbridge_port_unregister(kClient, kPort);
  57. }
  58. void initBuffer(CarlaEngine* const engine)
  59. {
  60. CARLA_ASSERT(engine != nullptr);
  61. if (engine == nullptr)
  62. {
  63. fBuffer = nullptr;
  64. return;
  65. }
  66. if (kPort == nullptr)
  67. return CarlaEngineAudioPort::initBuffer(engine);
  68. fBuffer = (float*)jackbridge_port_get_buffer(kPort, engine->getBufferSize());
  69. if (! kIsInput)
  70. carla_zeroFloat(fBuffer, engine->getBufferSize());
  71. }
  72. private:
  73. jack_client_t* const kClient;
  74. jack_port_t* const kPort;
  75. friend class CarlaEngineJack;
  76. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackAudioPort)
  77. };
  78. // -------------------------------------------------------------------------------------------------------------------
  79. // Carla Engine JACK-Event port
  80. static const EngineEvent kFallbackJackEngineEvent;
  81. class CarlaEngineJackEventPort : public CarlaEngineEventPort
  82. {
  83. public:
  84. CarlaEngineJackEventPort(const bool isInput, const ProcessMode processMode, jack_client_t* const client, jack_port_t* const port)
  85. : CarlaEngineEventPort(isInput, processMode),
  86. kClient(client),
  87. kPort(port),
  88. fJackBuffer(nullptr)
  89. {
  90. carla_debug("CarlaEngineJackEventPort::CarlaEngineJackEventPort(%s, %s, %p, %p)", bool2str(isInput), ProcessMode2Str(processMode), client, port);
  91. if (processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  92. {
  93. CARLA_ASSERT(client != nullptr && port != nullptr);
  94. }
  95. else
  96. {
  97. CARLA_ASSERT(client == nullptr && port == nullptr);
  98. }
  99. }
  100. ~CarlaEngineJackEventPort()
  101. {
  102. carla_debug("CarlaEngineJackEventPort::~CarlaEngineJackEventPort()");
  103. if (kClient != nullptr && kPort != nullptr)
  104. jackbridge_port_unregister(kClient, kPort);
  105. }
  106. void initBuffer(CarlaEngine* const engine)
  107. {
  108. CARLA_ASSERT(engine != nullptr);
  109. if (engine == nullptr)
  110. {
  111. fJackBuffer = nullptr;
  112. return;
  113. }
  114. if (kPort == nullptr)
  115. return CarlaEngineEventPort::initBuffer(engine);
  116. fJackBuffer = jackbridge_port_get_buffer(kPort, engine->getBufferSize());
  117. if (! kIsInput)
  118. jackbridge_midi_clear_buffer(fJackBuffer);
  119. }
  120. uint32_t getEventCount()
  121. {
  122. if (kPort == nullptr)
  123. return CarlaEngineEventPort::getEventCount();
  124. CARLA_ASSERT(kIsInput);
  125. CARLA_ASSERT(fJackBuffer != nullptr);
  126. if (! kIsInput)
  127. return 0;
  128. if (fJackBuffer == nullptr)
  129. return 0;
  130. return jackbridge_midi_get_event_count(fJackBuffer);
  131. }
  132. const EngineEvent& getEvent(const uint32_t index)
  133. {
  134. if (kPort == nullptr)
  135. return CarlaEngineEventPort::getEvent(index);
  136. CARLA_ASSERT(kIsInput);
  137. CARLA_ASSERT(fJackBuffer != nullptr);
  138. if (! kIsInput)
  139. return kFallbackJackEngineEvent;
  140. if (fJackBuffer == nullptr)
  141. return kFallbackJackEngineEvent;
  142. jack_midi_event_t jackEvent;
  143. if (jackbridge_midi_event_get(&jackEvent, fJackBuffer, index) != 0 || jackEvent.size > 3)
  144. return kFallbackJackEngineEvent;
  145. fRetEvent.clear();
  146. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  147. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  148. fRetEvent.time = jackEvent.time;
  149. fRetEvent.channel = midiChannel;
  150. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  151. {
  152. const uint8_t midiControl = jackEvent.buffer[1];
  153. fRetEvent.type = kEngineEventTypeControl;
  154. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  155. {
  156. const uint8_t midiBank = jackEvent.buffer[2];
  157. fRetEvent.ctrl.type = kEngineControlEventTypeMidiBank;
  158. fRetEvent.ctrl.param = midiBank;
  159. fRetEvent.ctrl.value = 0.0;
  160. }
  161. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  162. {
  163. fRetEvent.ctrl.type = kEngineControlEventTypeAllSoundOff;
  164. fRetEvent.ctrl.param = 0;
  165. fRetEvent.ctrl.value = 0.0;
  166. }
  167. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  168. {
  169. fRetEvent.ctrl.type = kEngineControlEventTypeAllNotesOff;
  170. fRetEvent.ctrl.param = 0;
  171. fRetEvent.ctrl.value = 0.0;
  172. }
  173. else
  174. {
  175. const uint8_t midiValue = jackEvent.buffer[2];
  176. fRetEvent.ctrl.type = kEngineControlEventTypeParameter;
  177. fRetEvent.ctrl.param = midiControl;
  178. fRetEvent.ctrl.value = double(midiValue)/127.0;
  179. }
  180. }
  181. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  182. {
  183. const uint8_t midiProgram = jackEvent.buffer[1];
  184. fRetEvent.type = kEngineEventTypeControl;
  185. fRetEvent.ctrl.type = kEngineControlEventTypeMidiProgram;
  186. fRetEvent.ctrl.param = midiProgram;
  187. fRetEvent.ctrl.value = 0.0;
  188. }
  189. else
  190. {
  191. fRetEvent.type = kEngineEventTypeMidi;
  192. fRetEvent.midi.data[0] = midiStatus;
  193. fRetEvent.midi.data[1] = jackEvent.buffer[1];
  194. fRetEvent.midi.data[2] = jackEvent.buffer[2];
  195. fRetEvent.midi.size = static_cast<uint8_t>(jackEvent.size);
  196. }
  197. return fRetEvent;
  198. }
  199. void writeControlEvent(const uint32_t time, const uint8_t channel, const EngineControlEventType type, const uint16_t param, const double value)
  200. {
  201. if (kPort == nullptr)
  202. return CarlaEngineEventPort::writeControlEvent(time, channel, type, param, value);
  203. CARLA_ASSERT(! kIsInput);
  204. CARLA_ASSERT(fJackBuffer != nullptr);
  205. CARLA_ASSERT(type != kEngineControlEventTypeNull);
  206. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  207. CARLA_ASSERT(param < MAX_MIDI_VALUE);
  208. CARLA_SAFE_ASSERT(value >= 0.0 && value <= 1.0);
  209. if (kIsInput)
  210. return;
  211. if (fJackBuffer == nullptr)
  212. return;
  213. if (type == kEngineControlEventTypeNull)
  214. return;
  215. if (channel >= MAX_MIDI_CHANNELS)
  216. return;
  217. if (param >= MAX_MIDI_VALUE)
  218. return;
  219. if (type == kEngineControlEventTypeParameter)
  220. {
  221. CARLA_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(param));
  222. }
  223. const double fixedValue = carla_fixValue<double>(0.0, 1.0, value);
  224. uint8_t data[3] = { 0 };
  225. uint8_t size = 0;
  226. switch (type)
  227. {
  228. case kEngineControlEventTypeNull:
  229. break;
  230. case kEngineControlEventTypeParameter:
  231. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  232. data[1] = static_cast<uint8_t>(param);
  233. data[2] = uint8_t(fixedValue * 127.0);
  234. size = 3;
  235. break;
  236. case kEngineControlEventTypeMidiBank:
  237. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  238. data[1] = MIDI_CONTROL_BANK_SELECT;
  239. data[2] = static_cast<uint8_t>(param);
  240. size = 3;
  241. break;
  242. case kEngineControlEventTypeMidiProgram:
  243. data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
  244. data[1] = static_cast<uint8_t>(param);
  245. size = 2;
  246. break;
  247. case kEngineControlEventTypeAllSoundOff:
  248. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  249. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  250. size = 2;
  251. break;
  252. case kEngineControlEventTypeAllNotesOff:
  253. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  254. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  255. size = 2;
  256. break;
  257. }
  258. if (size > 0)
  259. jackbridge_midi_event_write(fJackBuffer, time, data, size);
  260. }
  261. void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t port, const uint8_t* const data, const uint8_t size)
  262. {
  263. if (kPort == nullptr)
  264. return CarlaEngineEventPort::writeMidiEvent(time, channel, port, data, size);
  265. CARLA_ASSERT(! kIsInput);
  266. CARLA_ASSERT(fJackBuffer != nullptr);
  267. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  268. CARLA_ASSERT(data != nullptr);
  269. CARLA_ASSERT(size > 0);
  270. if (kIsInput)
  271. return;
  272. if (fJackBuffer == nullptr)
  273. return;
  274. if (channel >= MAX_MIDI_CHANNELS)
  275. return;
  276. if (data == nullptr)
  277. return;
  278. if (size == 0)
  279. return;
  280. uint8_t jdata[size];
  281. carla_copy<uint8_t>(jdata, data, size);
  282. jdata[0] = data[0] + channel;
  283. jackbridge_midi_event_write(fJackBuffer, time, jdata, size);
  284. }
  285. private:
  286. jack_client_t* const kClient;
  287. jack_port_t* const kPort;
  288. void* fJackBuffer;
  289. EngineEvent fRetEvent;
  290. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackEventPort)
  291. };
  292. // -------------------------------------------------------------------------------------------------------------------
  293. // Jack Engine client
  294. class CarlaEngineJackClient : public CarlaEngineClient
  295. {
  296. public:
  297. CarlaEngineJackClient(const EngineType engineType, const ProcessMode processMode, jack_client_t* const client)
  298. : CarlaEngineClient(engineType, processMode),
  299. kClient(client),
  300. kUseClient(processMode == PROCESS_MODE_SINGLE_CLIENT || processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  301. {
  302. carla_debug("CarlaEngineJackClient::CarlaEngineJackClient(%s, %s, %p)", EngineType2Str(engineType), ProcessMode2Str(processMode), client);
  303. if (kUseClient)
  304. {
  305. CARLA_ASSERT(kClient != nullptr);
  306. }
  307. else
  308. {
  309. CARLA_ASSERT(kClient == nullptr);
  310. }
  311. }
  312. ~CarlaEngineJackClient()
  313. {
  314. carla_debug("CarlaEngineClient::~CarlaEngineClient()");
  315. if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  316. {
  317. if (kClient)
  318. jackbridge_client_close(kClient);
  319. }
  320. }
  321. void activate()
  322. {
  323. carla_debug("CarlaEngineJackClient::activate()");
  324. if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  325. {
  326. CARLA_ASSERT(kClient && ! fActive);
  327. if (kClient && ! fActive)
  328. jackbridge_activate(kClient);
  329. }
  330. CarlaEngineClient::activate();
  331. }
  332. void deactivate()
  333. {
  334. carla_debug("CarlaEngineJackClient::deactivate()");
  335. if (kProcessMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  336. {
  337. CARLA_ASSERT(kClient && fActive);
  338. if (kClient && fActive)
  339. jackbridge_deactivate(kClient);
  340. }
  341. CarlaEngineClient::deactivate();
  342. }
  343. bool isOk() const
  344. {
  345. carla_debug("CarlaEngineJackClient::isOk()");
  346. if (kUseClient)
  347. return bool(kClient);
  348. return CarlaEngineClient::isOk();
  349. }
  350. void setLatency(const uint32_t samples)
  351. {
  352. CarlaEngineClient::setLatency(samples);
  353. if (kUseClient)
  354. jackbridge_recompute_total_latencies(kClient);
  355. }
  356. CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput)
  357. {
  358. carla_debug("CarlaEngineJackClient::addPort(%s, \"%s\", %s)", EnginePortType2Str(portType), name, bool2str(isInput));
  359. jack_port_t* port = nullptr;
  360. // Create JACK port first, if needed
  361. if (kUseClient)
  362. {
  363. switch (portType)
  364. {
  365. case kEnginePortTypeNull:
  366. break;
  367. case kEnginePortTypeAudio:
  368. port = jackbridge_port_register(kClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  369. break;
  370. case kEnginePortTypeEvent:
  371. port = jackbridge_port_register(kClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  372. break;
  373. }
  374. }
  375. // Create Engine port
  376. switch (portType)
  377. {
  378. case kEnginePortTypeNull:
  379. break;
  380. case kEnginePortTypeAudio:
  381. return new CarlaEngineJackAudioPort(isInput, kProcessMode, kClient, port);
  382. case kEnginePortTypeEvent:
  383. return new CarlaEngineJackEventPort(isInput, kProcessMode, kClient, port);
  384. }
  385. carla_stderr("CarlaEngineJackClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput));
  386. return nullptr;
  387. }
  388. private:
  389. jack_client_t* const kClient;
  390. const bool kUseClient;
  391. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackClient)
  392. };
  393. // -------------------------------------------------------------------------------------------------------------------
  394. // Jack Engine
  395. class CarlaEngineJack : public CarlaEngine
  396. {
  397. public:
  398. CarlaEngineJack()
  399. : CarlaEngine(),
  400. fClient(nullptr),
  401. fTransportState(JackTransportStopped),
  402. fFreewheel(false),
  403. #ifdef BUILD_BRIDGE
  404. fHasQuit(false)
  405. #else
  406. fRackPorts{nullptr}
  407. #endif
  408. {
  409. carla_debug("CarlaEngineJack::CarlaEngineJack()");
  410. #ifdef BUILD_BRIDGE
  411. fOptions.processMode = PROCESS_MODE_MULTIPLE_CLIENTS;
  412. #endif
  413. carla_zeroStruct<jack_position_t>(fTransportPos);
  414. }
  415. ~CarlaEngineJack()
  416. {
  417. carla_debug("CarlaEngineJack::~CarlaEngineJack()");
  418. CARLA_ASSERT(fClient == nullptr);
  419. }
  420. // -------------------------------------------------------------------
  421. // Maximum values
  422. unsigned int maxClientNameSize()
  423. {
  424. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  425. return static_cast<unsigned int>(jackbridge_client_name_size());
  426. return CarlaEngine::maxClientNameSize();
  427. }
  428. unsigned int maxPortNameSize()
  429. {
  430. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  431. return static_cast<unsigned int>(jackbridge_port_name_size());
  432. return CarlaEngine::maxPortNameSize();
  433. }
  434. // -------------------------------------------------------------------
  435. // Virtual, per-engine type calls
  436. bool init(const char* const clientName)
  437. {
  438. carla_debug("CarlaEngineJack::init(\"%s\")", clientName);
  439. fFreewheel = false;
  440. fTransportState = JackTransportStopped;
  441. carla_zeroStruct<jack_position_t>(fTransportPos);
  442. #ifndef BUILD_BRIDGE
  443. fClient = jackbridge_client_open(clientName, JackNullOption, nullptr);
  444. if (fClient != nullptr)
  445. {
  446. fBufferSize = jackbridge_get_buffer_size(fClient);
  447. fSampleRate = jackbridge_get_sample_rate(fClient);
  448. jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback, this);
  449. jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback, this);
  450. jackbridge_set_freewheel_callback(fClient, carla_jack_freewheel_callback, this);
  451. jackbridge_set_process_callback(fClient, carla_jack_process_callback, this);
  452. jackbridge_set_latency_callback(fClient, carla_jack_latency_callback, this);
  453. jackbridge_on_shutdown(fClient, carla_jack_shutdown_callback, this);
  454. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  455. {
  456. fRackPorts[rackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  457. fRackPorts[rackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  458. fRackPorts[rackPortAudioOut1] = jackbridge_port_register(fClient, "audio-out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  459. fRackPorts[rackPortAudioOut2] = jackbridge_port_register(fClient, "audio-out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  460. fRackPorts[rackPortEventIn] = jackbridge_port_register(fClient, "events-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  461. fRackPorts[rackPortEventOut] = jackbridge_port_register(fClient, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  462. }
  463. if (jackbridge_activate(fClient) == 0)
  464. {
  465. const char* const jackClientName = jackbridge_get_client_name(fClient);
  466. return CarlaEngine::init(jackClientName);
  467. }
  468. else
  469. {
  470. setLastError("Failed to activate the JACK client");
  471. jackbridge_client_close(fClient);
  472. fClient = nullptr;
  473. }
  474. }
  475. else
  476. setLastError("Failed to create new JACK client");
  477. return false;
  478. #else
  479. if (fBufferSize == 0 || fSampleRate == 0.0)
  480. {
  481. // open temp client to get initial buffer-size and sample-rate values
  482. if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr))
  483. {
  484. fBufferSize = jackbridge_get_buffer_size(tmpClient);
  485. fSampleRate = jackbridge_get_sample_rate(tmpClient);
  486. jackbridge_client_close(tmpClient);
  487. }
  488. }
  489. return CarlaEngine::init(clientName);
  490. #endif
  491. }
  492. bool close()
  493. {
  494. carla_debug("CarlaEngineJack::close()");
  495. CarlaEngine::close();
  496. #ifdef BUILD_BRIDGE
  497. fClient = nullptr;
  498. fHasQuit = true;
  499. return true;
  500. #else
  501. if (jackbridge_deactivate(fClient) == 0)
  502. {
  503. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  504. {
  505. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioIn1]);
  506. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioIn2]);
  507. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioOut1]);
  508. jackbridge_port_unregister(fClient, fRackPorts[rackPortAudioOut2]);
  509. jackbridge_port_unregister(fClient, fRackPorts[rackPortEventIn]);
  510. jackbridge_port_unregister(fClient, fRackPorts[rackPortEventOut]);
  511. }
  512. if (jackbridge_client_close(fClient) == 0)
  513. {
  514. fClient = nullptr;
  515. return true;
  516. }
  517. else
  518. setLastError("Failed to close the JACK client");
  519. }
  520. else
  521. setLastError("Failed to deactivate the JACK client");
  522. fClient = nullptr;
  523. #endif
  524. return false;
  525. }
  526. bool isRunning() const
  527. {
  528. #ifdef BUILD_BRIDGE
  529. return (fClient != nullptr || ! fHasQuit);
  530. #else
  531. return (fClient != nullptr);
  532. #endif
  533. }
  534. bool isOffline() const
  535. {
  536. return fFreewheel;
  537. }
  538. EngineType type() const
  539. {
  540. return kEngineTypeJack;
  541. }
  542. CarlaEngineClient* addClient(CarlaPlugin* const plugin)
  543. {
  544. jack_client_t* client = nullptr;
  545. #ifdef BUILD_BRIDGE
  546. client = fClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  547. fBufferSize = jackbridge_get_buffer_size(client);
  548. fSampleRate = jackbridge_get_sample_rate(client);
  549. jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
  550. jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
  551. jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
  552. jackbridge_set_process_callback(client, carla_jack_process_callback, this);
  553. jackbridge_set_latency_callback(client, carla_jack_latency_callback, this);
  554. jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
  555. #else
  556. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  557. {
  558. client = fClient;
  559. }
  560. else if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  561. {
  562. client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  563. jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin);
  564. jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin);
  565. }
  566. #endif
  567. return new CarlaEngineJackClient(kEngineTypeJack, fOptions.processMode, client);
  568. }
  569. // -------------------------------------------------------------------
  570. // Transport
  571. void transportPlay()
  572. {
  573. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  574. CarlaEngine::transportPlay();
  575. else if (fClient != nullptr)
  576. jackbridge_transport_start(fClient);
  577. }
  578. void transportPause()
  579. {
  580. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  581. CarlaEngine::transportPause();
  582. else if (fClient != nullptr)
  583. jackbridge_transport_stop(fClient);
  584. }
  585. void transportRelocate(const uint32_t frame)
  586. {
  587. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  588. CarlaEngine::transportRelocate(frame);
  589. else if (fClient != nullptr)
  590. jackbridge_transport_locate(fClient, frame);
  591. }
  592. // -------------------------------------
  593. protected:
  594. void handleJackBufferSizeCallback(const uint32_t newBufferSize)
  595. {
  596. if (fBufferSize != newBufferSize)
  597. {
  598. fBufferSize = newBufferSize;
  599. bufferSizeChanged(newBufferSize);
  600. }
  601. }
  602. void handleJackSampleRateCallback(const double newSampleRate)
  603. {
  604. if (fSampleRate != newSampleRate)
  605. {
  606. fSampleRate = newSampleRate;
  607. sampleRateChanged(newSampleRate);
  608. }
  609. }
  610. void handleJackFreewheelCallback(const bool isFreewheel)
  611. {
  612. fFreewheel = isFreewheel;
  613. }
  614. void saveTransportInfo()
  615. {
  616. if (fOptions.transportMode != TRANSPORT_MODE_JACK)
  617. return;
  618. fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate
  619. fTransportState = jackbridge_transport_query(fClient, &fTransportPos);
  620. fTimeInfo.playing = (fTransportState == JackTransportRolling);
  621. if (fTransportPos.unique_1 == fTransportPos.unique_2)
  622. {
  623. fTimeInfo.frame = fTransportPos.frame;
  624. fTimeInfo.time = fTransportPos.usecs;
  625. if (fTransportPos.valid & JackPositionBBT)
  626. {
  627. fTimeInfo.valid = EngineTimeInfo::ValidBBT;
  628. fTimeInfo.bbt.bar = fTransportPos.bar;
  629. fTimeInfo.bbt.beat = fTransportPos.beat;
  630. fTimeInfo.bbt.tick = fTransportPos.tick;
  631. fTimeInfo.bbt.barStartTick = fTransportPos.bar_start_tick;
  632. fTimeInfo.bbt.beatsPerBar = fTransportPos.beats_per_bar;
  633. fTimeInfo.bbt.beatType = fTransportPos.beat_type;
  634. fTimeInfo.bbt.ticksPerBeat = fTransportPos.ticks_per_beat;
  635. fTimeInfo.bbt.beatsPerMinute = fTransportPos.beats_per_minute;
  636. }
  637. else
  638. fTimeInfo.valid = 0x0;
  639. }
  640. else
  641. {
  642. fTimeInfo.frame = 0;
  643. fTimeInfo.valid = 0x0;
  644. }
  645. }
  646. void handleJackProcessCallback(const uint32_t nframes)
  647. {
  648. #ifndef BUILD_BRIDGE
  649. if (kData->curPluginCount == 0)
  650. {
  651. // pass-through
  652. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  653. {
  654. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn1], nframes);
  655. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn2], nframes);
  656. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut1], nframes);
  657. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut2], nframes);
  658. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[rackPortEventOut], nframes);
  659. CARLA_ASSERT(audioIn1 != nullptr);
  660. CARLA_ASSERT(audioIn2 != nullptr);
  661. CARLA_ASSERT(audioOut1 != nullptr);
  662. CARLA_ASSERT(audioOut2 != nullptr);
  663. CARLA_ASSERT(eventOut != nullptr);
  664. carla_copyFloat(audioOut1, audioIn1, nframes);
  665. carla_copyFloat(audioOut2, audioIn2, nframes);
  666. jackbridge_midi_clear_buffer(eventOut);
  667. }
  668. return proccessPendingEvents();
  669. }
  670. #endif
  671. saveTransportInfo();
  672. #ifdef BUILD_BRIDGE
  673. CarlaPlugin* const plugin = getPluginUnchecked(0);
  674. if (plugin && plugin->enabled())
  675. {
  676. plugin->initBuffers();
  677. processPlugin(plugin, nframes);
  678. }
  679. #else
  680. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  681. {
  682. for (unsigned int i=0; i < kData->curPluginCount; i++)
  683. {
  684. CarlaPlugin* const plugin = getPluginUnchecked(i);
  685. if (plugin && plugin->enabled())
  686. {
  687. plugin->initBuffers();
  688. processPlugin(plugin, nframes);
  689. }
  690. }
  691. }
  692. else if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  693. {
  694. // get buffers from jack
  695. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn1], nframes);
  696. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioIn2], nframes);
  697. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut1], nframes);
  698. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[rackPortAudioOut2], nframes);
  699. void* const eventIn = jackbridge_port_get_buffer(fRackPorts[rackPortEventIn], nframes);
  700. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[rackPortEventOut], nframes);
  701. // assert buffers
  702. CARLA_ASSERT(audioIn1 != nullptr);
  703. CARLA_ASSERT(audioIn2 != nullptr);
  704. CARLA_ASSERT(audioOut1 != nullptr);
  705. CARLA_ASSERT(audioOut2 != nullptr);
  706. CARLA_ASSERT(eventIn != nullptr);
  707. CARLA_ASSERT(eventOut != nullptr);
  708. // create audio buffers
  709. float* inBuf[2] = { audioIn1, audioIn2 };
  710. float* outBuf[2] = { audioOut1, audioOut2 };
  711. // initialize input events
  712. carla_zeroMem(kData->rack.in, sizeof(EngineEvent)*RACK_EVENT_COUNT);
  713. {
  714. uint32_t engineEventIndex = 0;
  715. jack_midi_event_t jackEvent;
  716. const uint32_t jackEventCount = jackbridge_midi_get_event_count(eventIn);
  717. for (uint32_t jackEventIndex=0; jackEventIndex < jackEventCount; jackEventIndex++)
  718. {
  719. if (jackbridge_midi_event_get(&jackEvent, eventIn, jackEventIndex) != 0)
  720. continue;
  721. EngineEvent* const engineEvent = &kData->rack.in[engineEventIndex++];
  722. engineEvent->clear();
  723. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  724. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  725. engineEvent->time = jackEvent.time;
  726. engineEvent->channel = midiChannel;
  727. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  728. {
  729. const uint8_t midiControl = jackEvent.buffer[1];
  730. engineEvent->type = kEngineEventTypeControl;
  731. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  732. {
  733. const uint8_t midiBank = jackEvent.buffer[2];
  734. engineEvent->ctrl.type = kEngineControlEventTypeMidiBank;
  735. engineEvent->ctrl.param = midiBank;
  736. engineEvent->ctrl.value = 0.0;
  737. }
  738. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  739. {
  740. engineEvent->ctrl.type = kEngineControlEventTypeAllSoundOff;
  741. engineEvent->ctrl.param = 0;
  742. engineEvent->ctrl.value = 0.0;
  743. }
  744. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  745. {
  746. engineEvent->ctrl.type = kEngineControlEventTypeAllNotesOff;
  747. engineEvent->ctrl.param = 0;
  748. engineEvent->ctrl.value = 0.0;
  749. }
  750. else
  751. {
  752. const uint8_t midiValue = jackEvent.buffer[2];
  753. engineEvent->ctrl.type = kEngineControlEventTypeParameter;
  754. engineEvent->ctrl.param = midiControl;
  755. engineEvent->ctrl.value = double(midiValue)/127.0;
  756. }
  757. }
  758. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  759. {
  760. const uint8_t midiProgram = jackEvent.buffer[1];
  761. engineEvent->type = kEngineEventTypeControl;
  762. engineEvent->ctrl.type = kEngineControlEventTypeMidiProgram;
  763. engineEvent->ctrl.param = midiProgram;
  764. engineEvent->ctrl.value = 0.0;
  765. }
  766. else
  767. {
  768. engineEvent->type = kEngineEventTypeMidi;
  769. engineEvent->midi.data[0] = midiStatus;
  770. engineEvent->midi.data[1] = jackEvent.buffer[1];
  771. engineEvent->midi.data[2] = jackEvent.buffer[2];
  772. engineEvent->midi.size = static_cast<uint8_t>(jackEvent.size);
  773. }
  774. if (engineEventIndex >= RACK_EVENT_COUNT)
  775. break;
  776. }
  777. }
  778. // process rack
  779. processRack(inBuf, outBuf, nframes);
  780. // output control
  781. {
  782. jackbridge_midi_clear_buffer(eventOut);
  783. for (unsigned short i=0; i < RACK_EVENT_COUNT; i++)
  784. {
  785. EngineEvent* const engineEvent = &kData->rack.out[i];
  786. uint8_t data[3] = { 0 };
  787. uint8_t size = 0;
  788. switch (engineEvent->type)
  789. {
  790. case kEngineEventTypeNull:
  791. break;
  792. case kEngineEventTypeControl:
  793. {
  794. EngineControlEvent* const ctrlEvent = &engineEvent->ctrl;
  795. if (ctrlEvent->type == kEngineControlEventTypeParameter && MIDI_IS_CONTROL_BANK_SELECT(ctrlEvent->param))
  796. {
  797. // FIXME?
  798. ctrlEvent->type = kEngineControlEventTypeMidiBank;
  799. ctrlEvent->param = ctrlEvent->value;
  800. ctrlEvent->value = 0.0;
  801. }
  802. switch (ctrlEvent->type)
  803. {
  804. case kEngineControlEventTypeNull:
  805. break;
  806. case kEngineControlEventTypeParameter:
  807. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  808. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  809. data[2] = uint8_t(ctrlEvent->value * 127.0);
  810. size = 3;
  811. break;
  812. case kEngineControlEventTypeMidiBank:
  813. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  814. data[1] = MIDI_CONTROL_BANK_SELECT;
  815. data[2] = static_cast<uint8_t>(ctrlEvent->param);
  816. size = 3;
  817. break;
  818. case kEngineControlEventTypeMidiProgram:
  819. data[0] = MIDI_STATUS_PROGRAM_CHANGE + engineEvent->channel;
  820. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  821. size = 2;
  822. break;
  823. case kEngineControlEventTypeAllSoundOff:
  824. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  825. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  826. size = 2;
  827. break;
  828. case kEngineControlEventTypeAllNotesOff:
  829. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  830. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  831. size = 2;
  832. break;
  833. }
  834. break;
  835. }
  836. case kEngineEventTypeMidi:
  837. {
  838. EngineMidiEvent* const midiEvent = &engineEvent->midi;
  839. data[0] = midiEvent->data[0];
  840. data[1] = midiEvent->data[1];
  841. data[2] = midiEvent->data[2];
  842. size = midiEvent->size;
  843. break;
  844. }
  845. }
  846. if (size > 0)
  847. jackbridge_midi_event_write(eventOut, engineEvent->time, data, size);
  848. }
  849. }
  850. }
  851. #endif // ! BUILD_BRIDGE
  852. proccessPendingEvents();
  853. }
  854. void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
  855. {
  856. if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
  857. return;
  858. for (unsigned int i=0; i < kData->curPluginCount; i++)
  859. {
  860. CarlaPlugin* const plugin = getPluginUnchecked(i);
  861. if (plugin && plugin->enabled())
  862. latencyPlugin(plugin, mode);
  863. }
  864. }
  865. void handleJackShutdownCallback()
  866. {
  867. for (unsigned int i=0; i < kData->curPluginCount; i++)
  868. {
  869. //CarlaPlugin* const plugin = getPluginUnchecked(i);
  870. //if (plugin)
  871. // plugin->x_client = nullptr;
  872. }
  873. fClient = nullptr;
  874. callback(CALLBACK_QUIT, 0, 0, 0, 0.0f, nullptr);
  875. }
  876. // -------------------------------------
  877. private:
  878. jack_client_t* fClient;
  879. jack_position_t fTransportPos;
  880. jack_transport_state_t fTransportState;
  881. bool fFreewheel;
  882. // -------------------------------------
  883. #ifdef BUILD_BRIDGE
  884. bool fHasQuit;
  885. #else
  886. enum RackPorts {
  887. rackPortAudioIn1 = 0,
  888. rackPortAudioIn2 = 1,
  889. rackPortAudioOut1 = 2,
  890. rackPortAudioOut2 = 3,
  891. rackPortEventIn = 4,
  892. rackPortEventOut = 5,
  893. rackPortCount = 8
  894. };
  895. jack_port_t* fRackPorts[rackPortCount];
  896. #endif
  897. // -------------------------------------
  898. void processPlugin(CarlaPlugin* const plugin, const uint32_t nframes)
  899. {
  900. const uint32_t inCount = plugin->audioInCount();
  901. const uint32_t outCount = plugin->audioOutCount();
  902. float* inBuffer[inCount];
  903. float* outBuffer[outCount];
  904. float inPeaks[inCount];
  905. float outPeaks[outCount];
  906. if (inCount > 0)
  907. carla_zeroFloat(inPeaks, inCount);
  908. if (outCount > 0)
  909. carla_zeroFloat(outPeaks, outCount);
  910. for (uint32_t i=0; i < inCount; i++)
  911. {
  912. CarlaEngineAudioPort* const port = CarlaPluginGetAudioInPort(plugin, i);
  913. inBuffer[i] = port->getBuffer();
  914. }
  915. for (uint32_t i=0; i < outCount; i++)
  916. {
  917. CarlaEngineAudioPort* const port = CarlaPluginGetAudioOutPort(plugin, i);
  918. outBuffer[i] = port->getBuffer();
  919. }
  920. for (uint32_t i=0; i < inCount; i++)
  921. {
  922. for (uint32_t j=0; j < nframes; j++)
  923. {
  924. const float absV = std::fabs(inBuffer[i][j]);
  925. if (absV > inPeaks[i])
  926. inPeaks[i] = absV;
  927. }
  928. }
  929. plugin->process(inBuffer, outBuffer, nframes);
  930. for (uint32_t i=0; i < outCount; i++)
  931. {
  932. for (uint32_t j=0; j < nframes; j++)
  933. {
  934. const float absV = std::fabs(outBuffer[i][j]);
  935. if (absV > outPeaks[i])
  936. outPeaks[i] = absV;
  937. }
  938. }
  939. setPeaks(plugin->id(), inPeaks, outPeaks);
  940. }
  941. void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode)
  942. {
  943. const uint32_t inCount = plugin->audioInCount();
  944. const uint32_t outCount = plugin->audioOutCount();
  945. jack_latency_range_t range;
  946. uint32_t pluginLatency = plugin->latency();
  947. if (pluginLatency == 0)
  948. return;
  949. if (mode == JackCaptureLatency)
  950. {
  951. for (uint32_t i=0; i < inCount; i++)
  952. {
  953. uint aOutI = (i >= outCount) ? outCount : i;
  954. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, i))->kPort;
  955. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, aOutI))->kPort;
  956. jackbridge_port_get_latency_range(portIn, mode, &range);
  957. range.min += pluginLatency;
  958. range.max += pluginLatency;
  959. jackbridge_port_set_latency_range(portOut, mode, &range);
  960. }
  961. }
  962. else
  963. {
  964. for (uint32_t i=0; i < outCount; i++)
  965. {
  966. uint aInI = (i >= inCount) ? inCount : i;
  967. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, aInI))->kPort;
  968. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, i))->kPort;
  969. jackbridge_port_get_latency_range(portOut, mode, &range);
  970. range.min += pluginLatency;
  971. range.max += pluginLatency;
  972. jackbridge_port_set_latency_range(portIn, mode, &range);
  973. }
  974. }
  975. }
  976. // -------------------------------------
  977. #define handlePtr ((CarlaEngineJack*)arg)
  978. static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg)
  979. {
  980. handlePtr->handleJackSampleRateCallback(newSampleRate);
  981. return 0;
  982. }
  983. static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg)
  984. {
  985. handlePtr->handleJackBufferSizeCallback(newBufferSize);
  986. return 0;
  987. }
  988. static void carla_jack_freewheel_callback(int starting, void* arg)
  989. {
  990. handlePtr->handleJackFreewheelCallback(bool(starting));
  991. }
  992. static int carla_jack_process_callback(jack_nframes_t nframes, void* arg)
  993. {
  994. handlePtr->handleJackProcessCallback(nframes);
  995. return 0;
  996. }
  997. static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg)
  998. {
  999. handlePtr->handleJackLatencyCallback(mode);
  1000. }
  1001. static void carla_jack_shutdown_callback(void* arg)
  1002. {
  1003. handlePtr->handleJackShutdownCallback();
  1004. }
  1005. #undef handlePtr
  1006. // -------------------------------------
  1007. #ifndef BUILD_BRIDGE
  1008. static int carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg)
  1009. {
  1010. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  1011. if (plugin != nullptr && plugin->enabled())
  1012. {
  1013. CarlaEngineJack* const engine = (CarlaEngineJack*)CarlaPluginGetEngine(plugin);
  1014. plugin->initBuffers();
  1015. engine->saveTransportInfo();
  1016. engine->processPlugin(plugin, nframes);
  1017. }
  1018. return 0;
  1019. }
  1020. static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg)
  1021. {
  1022. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  1023. if (plugin != nullptr && plugin->enabled())
  1024. {
  1025. CarlaEngineJack* const engine = (CarlaEngineJack*)CarlaPluginGetEngine(plugin);
  1026. engine->latencyPlugin(plugin, mode);
  1027. }
  1028. }
  1029. #endif
  1030. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJack)
  1031. };
  1032. // -----------------------------------------
  1033. CarlaEngine* CarlaEngine::newJack()
  1034. {
  1035. return new CarlaEngineJack();
  1036. }
  1037. // -----------------------------------------
  1038. CARLA_BACKEND_END_NAMESPACE
  1039. #endif // CARLA_ENGINE_JACK