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.

1080 lines
35KB

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