Collection of tools useful for audio production
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.

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