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.

1092 lines
36KB

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