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.

1157 lines
38KB

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