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.

1177 lines
38KB

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