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.

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