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.

1207 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. , m_rackPorts{nullptr}
  410. #endif
  411. {
  412. qDebug("CarlaEngineJack::CarlaEngineJack()");
  413. m_client = nullptr;
  414. m_state = JackTransportStopped;
  415. m_freewheel = false;
  416. memset(&m_pos, 0, sizeof(jack_position_t));
  417. #ifdef BUILD_BRIDGE
  418. hasQuit = false;
  419. #endif
  420. }
  421. ~CarlaEngineJack()
  422. {
  423. qDebug("CarlaEngineJack::~CarlaEngineJack()");
  424. CARLA_ASSERT(! m_client);
  425. }
  426. // -------------------------------------------------------------------
  427. // Maximum values
  428. int maxClientNameSize()
  429. {
  430. #ifndef BUILD_BRIDGE
  431. if (options.processMode == PROCESS_MODE_SINGLE_CLIENT || options.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  432. #endif
  433. return jackbridge_client_name_size() - 3; // reserve space for "_2" forced-stereo ports
  434. return CarlaEngine::maxClientNameSize();
  435. }
  436. int maxPortNameSize()
  437. {
  438. #ifndef BUILD_BRIDGE
  439. if (options.processMode == PROCESS_MODE_SINGLE_CLIENT || options.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  440. #endif
  441. return jackbridge_port_name_size();
  442. return CarlaEngine::maxPortNameSize();
  443. }
  444. // -------------------------------------------------------------------
  445. // Virtual, per-engine type calls
  446. bool init(const char* const clientName)
  447. {
  448. qDebug("CarlaEngineJack::init(\"%s\")", clientName);
  449. m_state = JackTransportStopped;
  450. m_freewheel = false;
  451. #ifndef BUILD_BRIDGE
  452. m_client = jackbridge_client_open(clientName, JackNullOption, nullptr);
  453. if (m_client)
  454. {
  455. bufferSize = jackbridge_get_buffer_size(m_client);
  456. sampleRate = jackbridge_get_sample_rate(m_client);
  457. jackbridge_set_buffer_size_callback(m_client, carla_jack_bufsize_callback, this);
  458. jackbridge_set_sample_rate_callback(m_client, carla_jack_srate_callback, this);
  459. jackbridge_set_freewheel_callback(m_client, carla_jack_freewheel_callback, this);
  460. jackbridge_set_process_callback(m_client, carla_jack_process_callback, this);
  461. jackbridge_set_latency_callback(m_client, carla_jack_latency_callback, this);
  462. jackbridge_on_shutdown(m_client, carla_jack_shutdown_callback, this);
  463. if (options.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  464. {
  465. m_rackPorts[rackPortAudioIn1] = jackbridge_port_register(m_client, "in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  466. m_rackPorts[rackPortAudioIn2] = jackbridge_port_register(m_client, "in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  467. m_rackPorts[rackPortAudioOut1] = jackbridge_port_register(m_client, "out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  468. m_rackPorts[rackPortAudioOut2] = jackbridge_port_register(m_client, "out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  469. m_rackPorts[rackPortControlIn] = jackbridge_port_register(m_client, "control-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  470. m_rackPorts[rackPortControlOut] = jackbridge_port_register(m_client, "control-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  471. m_rackPorts[rackPortMidiIn] = jackbridge_port_register(m_client, "midi-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  472. m_rackPorts[rackPortMidiOut] = jackbridge_port_register(m_client, "midi-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  473. }
  474. if (jackbridge_activate(m_client) == 0)
  475. {
  476. name = jackbridge_get_client_name(m_client);
  477. name.toBasic();
  478. CarlaEngine::init(name);
  479. return true;
  480. }
  481. else
  482. {
  483. setLastError("Failed to activate the JACK client");
  484. m_client = nullptr;
  485. }
  486. }
  487. else
  488. setLastError("Failed to create new JACK client");
  489. return false;
  490. #else
  491. // open temp client to get initial buffer-size and sample-rate values
  492. if (bufferSize == 0 || sampleRate == 0.0)
  493. {
  494. m_client = jackbridge_client_open(clientName, JackNullOption, nullptr);
  495. if (m_client)
  496. {
  497. bufferSize = jackbridge_get_buffer_size(m_client);
  498. sampleRate = jackbridge_get_sample_rate(m_client);
  499. jackbridge_client_close(m_client);
  500. m_client = nullptr;
  501. }
  502. }
  503. name = clientName;
  504. name.toBasic();
  505. CarlaEngine::init(name);
  506. return true;
  507. #endif
  508. }
  509. bool close()
  510. {
  511. qDebug("CarlaEngineJack::close()");
  512. CarlaEngine::close();
  513. #ifdef BUILD_BRIDGE
  514. hasQuit = true;
  515. m_client = nullptr;
  516. return true;
  517. #else
  518. if (jackbridge_deactivate(m_client) == 0)
  519. {
  520. if (options.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  521. {
  522. jackbridge_port_unregister(m_client, m_rackPorts[rackPortAudioIn1]);
  523. jackbridge_port_unregister(m_client, m_rackPorts[rackPortAudioIn2]);
  524. jackbridge_port_unregister(m_client, m_rackPorts[rackPortAudioOut1]);
  525. jackbridge_port_unregister(m_client, m_rackPorts[rackPortAudioOut2]);
  526. jackbridge_port_unregister(m_client, m_rackPorts[rackPortControlIn]);
  527. jackbridge_port_unregister(m_client, m_rackPorts[rackPortControlOut]);
  528. jackbridge_port_unregister(m_client, m_rackPorts[rackPortMidiIn]);
  529. jackbridge_port_unregister(m_client, m_rackPorts[rackPortMidiOut]);
  530. }
  531. if (jackbridge_client_close(m_client) == 0)
  532. {
  533. m_client = nullptr;
  534. return true;
  535. }
  536. else
  537. setLastError("Failed to close the JACK client");
  538. }
  539. else
  540. setLastError("Failed to deactivate the JACK client");
  541. m_client = nullptr;
  542. #endif
  543. return false;
  544. }
  545. bool isRunning() const
  546. {
  547. #ifdef BUILD_BRIDGE
  548. return bool(m_client || ! hasQuit);
  549. #else
  550. return bool(m_client);
  551. #endif
  552. }
  553. bool isOffline() const
  554. {
  555. return m_freewheel;
  556. }
  557. CarlaEngineType type() const
  558. {
  559. return CarlaEngineTypeJack;
  560. }
  561. CarlaEngineClient* addClient(CarlaPlugin* const plugin)
  562. {
  563. jack_client_t* client = nullptr;
  564. #ifdef BUILD_BRIDGE
  565. client = m_client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  566. bufferSize = jackbridge_get_buffer_size(client);
  567. sampleRate = jackbridge_get_sample_rate(client);
  568. jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
  569. jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
  570. jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
  571. jackbridge_set_process_callback(client, carla_jack_process_callback, this);
  572. jackbridge_set_latency_callback(client, carla_jack_latency_callback, this);
  573. jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
  574. #else
  575. if (options.processMode == PROCESS_MODE_SINGLE_CLIENT)
  576. {
  577. client = m_client;
  578. }
  579. else if (options.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  580. {
  581. client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  582. jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin);
  583. jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin);
  584. }
  585. #endif
  586. #ifdef BUILD_BRIDGE
  587. return new CarlaEngineJackClient(client, CarlaEngineTypeJack, PROCESS_MODE_MULTIPLE_CLIENTS);
  588. #else
  589. return new CarlaEngineJackClient(client, CarlaEngineTypeJack, options.processMode);
  590. #endif
  591. }
  592. #if 0
  593. // -------------------------------------
  594. protected:
  595. void handleJackBufferSizeCallback(const uint32_t newBufferSize)
  596. {
  597. bufferSize = newBufferSize;
  598. #ifndef BUILD_BRIDGE
  599. if (options.processHighPrecision)
  600. return;
  601. #endif
  602. bufferSizeChanged(newBufferSize);
  603. }
  604. void handleJackSampleRateCallback(const double newSampleRate)
  605. {
  606. sampleRate = newSampleRate;
  607. }
  608. void handleJackFreewheelCallback(const bool isFreewheel)
  609. {
  610. m_freewheel = isFreewheel;
  611. }
  612. void handleJackProcessCallback(const uint32_t nframes)
  613. {
  614. #ifndef BUILD_BRIDGE
  615. if (maxPluginNumber() == 0)
  616. return;
  617. #endif
  618. m_pos.unique_1 = m_pos.unique_2 + 1; // invalidate
  619. m_state = jackbridge_transport_query(m_client, &m_pos);
  620. timeInfo.playing = (m_state != JackTransportStopped);
  621. if (m_pos.unique_1 == m_pos.unique_2)
  622. {
  623. timeInfo.frame = m_pos.frame;
  624. timeInfo.time = m_pos.usecs;
  625. if (m_pos.valid & JackPositionBBT)
  626. {
  627. timeInfo.valid = timeInfo.ValidBBT;
  628. timeInfo.bbt.bar = m_pos.bar;
  629. timeInfo.bbt.beat = m_pos.beat;
  630. timeInfo.bbt.tick = m_pos.tick;
  631. timeInfo.bbt.barStartTick = m_pos.bar_start_tick;
  632. timeInfo.bbt.beatsPerBar = m_pos.beats_per_bar;
  633. timeInfo.bbt.beatType = m_pos.beat_type;
  634. timeInfo.bbt.ticksPerBeat = m_pos.ticks_per_beat;
  635. timeInfo.bbt.beatsPerMinute = m_pos.beats_per_minute;
  636. }
  637. else
  638. timeInfo.valid = 0;
  639. }
  640. else
  641. {
  642. timeInfo.frame = 0;
  643. timeInfo.valid = 0;
  644. }
  645. #ifndef BUILD_BRIDGE
  646. if (options.processMode == PROCESS_MODE_SINGLE_CLIENT)
  647. {
  648. for (unsigned short i=0, max=maxPluginNumber(); i < max; i++)
  649. {
  650. CarlaPlugin* const plugin = getPluginUnchecked(i);
  651. #else
  652. CarlaPlugin* const plugin = getPluginUnchecked(0);
  653. #endif
  654. if (plugin && plugin->enabled())
  655. {
  656. processLock();
  657. plugin->initBuffers();
  658. processPlugin(plugin, nframes);
  659. processUnlock();
  660. }
  661. #ifndef BUILD_BRIDGE
  662. }
  663. }
  664. else if (options.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  665. {
  666. // get buffers from jack
  667. float* audioIn1 = (float*)jackbridge_port_get_buffer(m_rackPorts[rackPortAudioIn1], nframes);
  668. float* audioIn2 = (float*)jackbridge_port_get_buffer(m_rackPorts[rackPortAudioIn2], nframes);
  669. float* audioOut1 = (float*)jackbridge_port_get_buffer(m_rackPorts[rackPortAudioOut1], nframes);
  670. float* audioOut2 = (float*)jackbridge_port_get_buffer(m_rackPorts[rackPortAudioOut2], nframes);
  671. void* controlIn = jackbridge_port_get_buffer(m_rackPorts[rackPortControlIn], nframes);
  672. void* controlOut = jackbridge_port_get_buffer(m_rackPorts[rackPortControlOut], nframes);
  673. void* midiIn = jackbridge_port_get_buffer(m_rackPorts[rackPortMidiIn], nframes);
  674. void* midiOut = jackbridge_port_get_buffer(m_rackPorts[rackPortMidiOut], nframes);
  675. // assert buffers
  676. CARLA_ASSERT(audioIn1);
  677. CARLA_ASSERT(audioIn2);
  678. CARLA_ASSERT(audioOut1);
  679. CARLA_ASSERT(audioOut2);
  680. CARLA_ASSERT(controlIn);
  681. CARLA_ASSERT(controlOut);
  682. CARLA_ASSERT(midiIn);
  683. CARLA_ASSERT(midiOut);
  684. // create audio buffers
  685. float* inBuf[2] = { audioIn1, audioIn2 };
  686. float* outBuf[2] = { audioOut1, audioOut2 };
  687. // initialize control input
  688. memset(rackControlEventsIn, 0, sizeof(CarlaEngineControlEvent)*MAX_CONTROL_EVENTS);
  689. {
  690. jack_midi_event_t jackEvent;
  691. const uint32_t jackEventCount = jackbridge_midi_get_event_count(controlIn);
  692. uint32_t carlaEventIndex = 0;
  693. for (uint32_t jackEventIndex=0; jackEventIndex < jackEventCount; jackEventIndex++)
  694. {
  695. if (jackbridge_midi_event_get(&jackEvent, controlIn, jackEventIndex) != 0)
  696. continue;
  697. CarlaEngineControlEvent* const carlaEvent = &rackControlEventsIn[carlaEventIndex++];
  698. const uint8_t midiStatus = jackEvent.buffer[0];
  699. const uint8_t midiChannel = midiStatus & 0x0F;
  700. carlaEvent->time = jackEvent.time;
  701. carlaEvent->channel = midiChannel;
  702. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  703. {
  704. const uint8_t midiControl = jackEvent.buffer[1];
  705. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  706. {
  707. const uint8_t midiBank = jackEvent.buffer[2];
  708. carlaEvent->type = CarlaEngineMidiBankChangeEvent;
  709. carlaEvent->value = midiBank;
  710. }
  711. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  712. {
  713. carlaEvent->type = CarlaEngineAllSoundOffEvent;
  714. }
  715. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  716. {
  717. carlaEvent->type = CarlaEngineAllNotesOffEvent;
  718. }
  719. else
  720. {
  721. const uint8_t midiValue = jackEvent.buffer[2];
  722. carlaEvent->type = CarlaEngineParameterChangeEvent;
  723. carlaEvent->parameter = midiControl;
  724. carlaEvent->value = double(midiValue)/127;
  725. }
  726. }
  727. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  728. {
  729. const uint8_t midiProgram = jackEvent.buffer[1];
  730. carlaEvent->type = CarlaEngineMidiProgramChangeEvent;
  731. carlaEvent->value = midiProgram;
  732. }
  733. }
  734. }
  735. // initialize midi input
  736. memset(rackMidiEventsIn, 0, sizeof(CarlaEngineMidiEvent)*MAX_MIDI_EVENTS);
  737. {
  738. uint32_t i = 0, j = 0;
  739. jack_midi_event_t jackEvent;
  740. while (jackbridge_midi_event_get(&jackEvent, midiIn, j++) == 0)
  741. {
  742. if (i == MAX_MIDI_EVENTS)
  743. break;
  744. if (jackEvent.size < 4)
  745. {
  746. rackMidiEventsIn[i].time = jackEvent.time;
  747. rackMidiEventsIn[i].size = jackEvent.size;
  748. memcpy(rackMidiEventsIn[i].data, jackEvent.buffer, jackEvent.size);
  749. i += 1;
  750. }
  751. }
  752. }
  753. // process rack
  754. processRack(inBuf, outBuf, nframes);
  755. // output control
  756. {
  757. jackbridge_midi_clear_buffer(controlOut);
  758. for (unsigned short i=0; i < MAX_CONTROL_EVENTS; i++)
  759. {
  760. CarlaEngineControlEvent* const event = &rackControlEventsOut[i];
  761. if (event->type == CarlaEngineParameterChangeEvent && MIDI_IS_CONTROL_BANK_SELECT(event->parameter))
  762. event->type = CarlaEngineMidiBankChangeEvent;
  763. uint8_t data[4] = { 0 };
  764. switch (event->type)
  765. {
  766. case CarlaEngineNullEvent:
  767. break;
  768. case CarlaEngineParameterChangeEvent:
  769. data[0] = MIDI_STATUS_CONTROL_CHANGE + event->channel;
  770. data[1] = event->parameter;
  771. data[2] = event->value * 127;
  772. jackbridge_midi_event_write(controlOut, event->time, data, 3);
  773. break;
  774. case CarlaEngineMidiBankChangeEvent:
  775. data[0] = MIDI_STATUS_CONTROL_CHANGE + event->channel;
  776. data[1] = MIDI_CONTROL_BANK_SELECT;
  777. data[2] = event->value;
  778. jackbridge_midi_event_write(controlOut, event->time, data, 3);
  779. break;
  780. case CarlaEngineMidiProgramChangeEvent:
  781. data[0] = MIDI_STATUS_PROGRAM_CHANGE + event->channel;
  782. data[1] = event->value;
  783. jackbridge_midi_event_write(controlOut, event->time, data, 2);
  784. break;
  785. case CarlaEngineAllSoundOffEvent:
  786. data[0] = MIDI_STATUS_CONTROL_CHANGE + event->channel;
  787. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  788. jackbridge_midi_event_write(controlOut, event->time, data, 2);
  789. break;
  790. case CarlaEngineAllNotesOffEvent:
  791. data[0] = MIDI_STATUS_CONTROL_CHANGE + event->channel;
  792. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  793. jackbridge_midi_event_write(controlOut, event->time, data, 2);
  794. break;
  795. }
  796. }
  797. }
  798. // output midi
  799. {
  800. jackbridge_midi_clear_buffer(midiOut);
  801. for (unsigned short i=0; i < MAX_MIDI_EVENTS; i++)
  802. {
  803. if (rackMidiEventsOut[i].size == 0)
  804. break;
  805. jackbridge_midi_event_write(midiOut, rackMidiEventsOut[i].time, rackMidiEventsOut[i].data, rackMidiEventsOut[i].size);
  806. }
  807. }
  808. }
  809. #endif
  810. }
  811. void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
  812. {
  813. #ifndef BUILD_BRIDGE
  814. if (options.processMode != PROCESS_MODE_SINGLE_CLIENT)
  815. return;
  816. #endif
  817. for (unsigned short i=0, max=maxPluginNumber(); i < max; i++)
  818. {
  819. CarlaPlugin* const plugin = getPluginUnchecked(i);
  820. if (plugin && plugin->enabled())
  821. latencyPlugin(plugin, mode);
  822. }
  823. }
  824. void handleJackShutdownCallback()
  825. {
  826. for (unsigned short i=0, max=maxPluginNumber(); i < max; i++)
  827. {
  828. //CarlaPlugin* const plugin = getPluginUnchecked(i);
  829. //if (plugin)
  830. // plugin->x_client = nullptr;
  831. }
  832. m_client = nullptr;
  833. callback(CALLBACK_QUIT, 0, 0, 0, 0.0, nullptr);
  834. }
  835. // -------------------------------------
  836. #endif
  837. private:
  838. jack_client_t* m_client;
  839. jack_transport_state_t m_state;
  840. jack_position_t m_pos;
  841. bool m_freewheel;
  842. // -------------------------------------
  843. #ifdef BUILD_BRIDGE
  844. bool hasQuit;
  845. #else
  846. enum RackPorts {
  847. rackPortAudioIn1 = 0,
  848. rackPortAudioIn2 = 1,
  849. rackPortAudioOut1 = 2,
  850. rackPortAudioOut2 = 3,
  851. rackPortControlIn = 4,
  852. rackPortControlOut = 5,
  853. rackPortMidiIn = 6,
  854. rackPortMidiOut = 7,
  855. rackPortCount = 8
  856. };
  857. jack_port_t* m_rackPorts[rackPortCount];
  858. #endif
  859. #if 0
  860. // -------------------------------------
  861. static void processPlugin(CarlaPlugin* const p, const uint32_t nframes)
  862. {
  863. #if 0
  864. float* inBuffer[p->aIn.count];
  865. float* outBuffer[p->aOut.count];
  866. for (uint32_t i=0; i < p->aIn.count; i++)
  867. inBuffer[i] = ((CarlaEngineJackAudioPort*)p->aIn.ports[i])->getBuffer();
  868. for (uint32_t i=0; i < p->aOut.count; i++)
  869. outBuffer[i] = ((CarlaEngineJackAudioPort*)p->aOut.ports[i])->getBuffer();
  870. if (p->m_processHighPrecision)
  871. {
  872. float* inBuffer2[p->aIn.count];
  873. float* outBuffer2[p->aOut.count];
  874. for (uint32_t i=0, j; i < nframes; i += 8)
  875. {
  876. for (j=0; j < p->aIn.count; j++)
  877. inBuffer2[j] = inBuffer[j] + i;
  878. for (j=0; j < p->aOut.count; j++)
  879. outBuffer2[j] = outBuffer[j] + i;
  880. p->process(inBuffer2, outBuffer2, 8, i);
  881. }
  882. }
  883. else
  884. p->process(inBuffer, outBuffer, nframes);
  885. #endif
  886. }
  887. static void latencyPlugin(CarlaPlugin* const p, jack_latency_callback_mode_t mode)
  888. {
  889. #if 0
  890. jack_latency_range_t range;
  891. uint32_t pluginLatency = p->x_client->getLatency();
  892. if (pluginLatency == 0)
  893. return;
  894. if (mode == JackCaptureLatency)
  895. {
  896. for (uint32_t i=0; i < p->aIn.count; i++)
  897. {
  898. uint aOutI = (i >= p->aOut.count) ? p->aOut.count : i;
  899. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)p->aIn.ports[i])->m_port;
  900. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)p->aOut.ports[aOutI])->m_port;
  901. jackbridge_port_get_latency_range(portIn, mode, &range);
  902. range.min += pluginLatency;
  903. range.max += pluginLatency;
  904. jackbridge_port_set_latency_range(portOut, mode, &range);
  905. }
  906. }
  907. else
  908. {
  909. for (uint32_t i=0; i < p->aOut.count; i++)
  910. {
  911. uint aInI = (i >= p->aIn.count) ? p->aIn.count : i;
  912. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)p->aIn.ports[aInI])->m_port;
  913. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)p->aOut.ports[i])->m_port;
  914. jackbridge_port_get_latency_range(portOut, mode, &range);
  915. range.min += pluginLatency;
  916. range.max += pluginLatency;
  917. jackbridge_port_set_latency_range(portIn, mode, &range);
  918. }
  919. }
  920. #endif
  921. }
  922. // -------------------------------------
  923. static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg)
  924. {
  925. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  926. _this_->handleJackSampleRateCallback(newSampleRate);
  927. return 0;
  928. }
  929. static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg)
  930. {
  931. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  932. _this_->handleJackBufferSizeCallback(newBufferSize);
  933. return 0;
  934. }
  935. static void carla_jack_freewheel_callback(int starting, void* arg)
  936. {
  937. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  938. _this_->handleJackFreewheelCallback(bool(starting));
  939. }
  940. static int carla_jack_process_callback(jack_nframes_t nframes, void* arg)
  941. {
  942. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  943. _this_->handleJackProcessCallback(nframes);
  944. return 0;
  945. }
  946. static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg)
  947. {
  948. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  949. _this_->handleJackLatencyCallback(mode);
  950. }
  951. static void carla_jack_shutdown_callback(void* arg)
  952. {
  953. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  954. _this_->handleJackShutdownCallback();
  955. }
  956. // -------------------------------------
  957. static int carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg)
  958. {
  959. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  960. if (plugin && plugin->enabled())
  961. {
  962. plugin->engineProcessLock();
  963. plugin->initBuffers();
  964. processPlugin(plugin, nframes);
  965. plugin->engineProcessUnlock();
  966. }
  967. return 0;
  968. }
  969. static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg)
  970. {
  971. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  972. if (plugin && plugin->enabled())
  973. latencyPlugin(plugin, mode);
  974. }
  975. #endif
  976. };
  977. // -----------------------------------------
  978. CarlaEngine* CarlaEngine::newJack()
  979. {
  980. return new CarlaEngineJack();
  981. }
  982. // -----------------------------------------
  983. CARLA_BACKEND_END_NAMESPACE
  984. #endif // CARLA_ENGINE_JACK