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.

1209 lines
39KB

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