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.

1217 lines
40KB

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