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.

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