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.

592 lines
21KB

  1. /*
  2. * Carla Backend
  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.h"
  19. #include "carla_plugin.h"
  20. CARLA_BACKEND_START_NAMESPACE
  21. // -----------------------------------------
  22. class CarlaEngineJack : public CarlaEngine
  23. {
  24. public:
  25. CarlaEngineJack()
  26. : CarlaEngine()
  27. #ifndef BUILD_BRIDGE
  28. # ifdef Q_COMPILER_INITIALIZER_LISTS
  29. , rackJackPorts{nullptr}
  30. # endif
  31. #endif
  32. {
  33. qDebug("CarlaEngineJack::CarlaEngineJack()");
  34. type = CarlaEngineTypeJack;
  35. client = nullptr;
  36. state = JackTransportStopped;
  37. freewheel = false;
  38. memset(&pos, 0, sizeof(jack_position_t));
  39. #ifndef BUILD_BRIDGE
  40. # ifndef Q_COMPILER_INITIALIZER_LISTS
  41. for (unsigned short i=0; i < rackPortCount; i++)
  42. rackJackPorts[i] = nullptr;
  43. # endif
  44. #endif
  45. }
  46. ~CarlaEngineJack()
  47. {
  48. qDebug("CarlaEngineJack::~CarlaEngineJack()");
  49. }
  50. // -------------------------------------
  51. bool init(const char* const clientName)
  52. {
  53. qDebug("CarlaEngineJack::init(\"%s\")", clientName);
  54. freewheel = false;
  55. state = JackTransportStopped;
  56. #ifndef BUILD_BRIDGE
  57. client = jackbridge_client_open(clientName, JackNullOption, nullptr);
  58. if (client)
  59. {
  60. sampleRate = jackbridge_get_sample_rate(client);
  61. bufferSize = jackbridge_get_buffer_size(client);
  62. jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
  63. jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
  64. jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
  65. jackbridge_set_process_callback(client, carla_jack_process_callback, this);
  66. jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
  67. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  68. {
  69. rackJackPorts[rackPortAudioIn1] = jackbridge_port_register(client, "in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  70. rackJackPorts[rackPortAudioIn2] = jackbridge_port_register(client, "in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  71. rackJackPorts[rackPortAudioOut1] = jackbridge_port_register(client, "out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  72. rackJackPorts[rackPortAudioOut2] = jackbridge_port_register(client, "out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  73. rackJackPorts[rackPortControlIn] = jackbridge_port_register(client, "control-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  74. rackJackPorts[rackPortControlOut] = jackbridge_port_register(client, "control-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  75. rackJackPorts[rackPortMidiIn] = jackbridge_port_register(client, "midi-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  76. rackJackPorts[rackPortMidiOut] = jackbridge_port_register(client, "midi-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  77. }
  78. if (jackbridge_activate(client) == 0)
  79. {
  80. name = getFixedClientName(jackbridge_get_client_name(client));
  81. CarlaEngine::init(name);
  82. return true;
  83. }
  84. else
  85. {
  86. setLastError("Failed to activate the JACK client");
  87. client = nullptr;
  88. }
  89. }
  90. else
  91. setLastError("Failed to create new JACK client");
  92. return false;
  93. #else
  94. name = getFixedClientName(clientName);
  95. CarlaEngine::init(name);
  96. return true;
  97. #endif
  98. }
  99. bool close()
  100. {
  101. qDebug("CarlaEngineJack::close()");
  102. CarlaEngine::close();
  103. if (name)
  104. {
  105. free((void*)name);
  106. name = nullptr;
  107. }
  108. #ifdef BUILD_BRIDGE
  109. client = nullptr;
  110. return true;
  111. #else
  112. if (jackbridge_deactivate(client) == 0)
  113. {
  114. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  115. {
  116. jackbridge_port_unregister(client, rackJackPorts[rackPortAudioIn1]);
  117. jackbridge_port_unregister(client, rackJackPorts[rackPortAudioIn2]);
  118. jackbridge_port_unregister(client, rackJackPorts[rackPortAudioOut1]);
  119. jackbridge_port_unregister(client, rackJackPorts[rackPortAudioOut2]);
  120. jackbridge_port_unregister(client, rackJackPorts[rackPortControlIn]);
  121. jackbridge_port_unregister(client, rackJackPorts[rackPortControlOut]);
  122. jackbridge_port_unregister(client, rackJackPorts[rackPortMidiIn]);
  123. jackbridge_port_unregister(client, rackJackPorts[rackPortMidiOut]);
  124. }
  125. if (jackbridge_client_close(client) == 0)
  126. {
  127. client = nullptr;
  128. return true;
  129. }
  130. else
  131. setLastError("Failed to close the JACK client");
  132. }
  133. else
  134. setLastError("Failed to deactivate the JACK client");
  135. client = nullptr;
  136. #endif
  137. return false;
  138. }
  139. bool isOffline()
  140. {
  141. return freewheel;
  142. }
  143. bool isRunning()
  144. {
  145. return bool(client);
  146. }
  147. CarlaEngineClient* addClient(CarlaPlugin* const plugin)
  148. {
  149. CarlaEngineClientNativeHandle handle;
  150. handle.type = CarlaEngineTypeJack;
  151. #ifdef BUILD_BRIDGE
  152. client = handle.jackClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  153. sampleRate = jackbridge_get_sample_rate(client);
  154. bufferSize = jackbridge_get_buffer_size(client);
  155. jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
  156. jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
  157. jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
  158. jackbridge_set_process_callback(handle.jackClient, carla_jack_process_callback, this);
  159. jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
  160. #else
  161. if (carlaOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  162. {
  163. handle.jackClient = client;
  164. }
  165. else if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  166. {
  167. handle.jackClient = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
  168. jackbridge_set_process_callback(handle.jackClient, carla_jack_process_callback_plugin, plugin);
  169. }
  170. #endif
  171. return new CarlaEngineClient(handle);
  172. }
  173. // -------------------------------------
  174. protected:
  175. void handleSampleRateCallback(double newSampleRate)
  176. {
  177. sampleRate = newSampleRate;
  178. }
  179. void handleBufferSizeCallback(uint32_t newBufferSize)
  180. {
  181. #ifndef BUILD_BRIDGE
  182. if (carlaOptions.processHighPrecision)
  183. return;
  184. #endif
  185. bufferSizeChanged(newBufferSize);
  186. }
  187. void handleFreewheelCallback(bool isFreewheel)
  188. {
  189. freewheel = isFreewheel;
  190. }
  191. void handleProcessCallback(uint32_t nframes)
  192. {
  193. #ifndef BUILD_BRIDGE
  194. if (maxPluginNumber() == 0)
  195. return;
  196. #endif
  197. state = jackbridge_transport_query(client, &pos);
  198. timeInfo.playing = (state != JackTransportStopped);
  199. if (pos.unique_1 == pos.unique_2)
  200. {
  201. timeInfo.frame = pos.frame;
  202. timeInfo.time = pos.usecs;
  203. if (pos.valid & JackPositionBBT)
  204. {
  205. timeInfo.valid = CarlaEngineTimeBBT;
  206. timeInfo.bbt.bar = pos.bar;
  207. timeInfo.bbt.beat = pos.beat;
  208. timeInfo.bbt.tick = pos.tick;
  209. timeInfo.bbt.bar_start_tick = pos.bar_start_tick;
  210. timeInfo.bbt.beats_per_bar = pos.beats_per_bar;
  211. timeInfo.bbt.beat_type = pos.beat_type;
  212. timeInfo.bbt.ticks_per_beat = pos.ticks_per_beat;
  213. timeInfo.bbt.beats_per_minute = pos.beats_per_minute;
  214. }
  215. else
  216. timeInfo.valid = 0;
  217. }
  218. else
  219. {
  220. timeInfo.frame = 0;
  221. timeInfo.valid = 0;
  222. }
  223. #ifndef BUILD_BRIDGE
  224. if (carlaOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  225. {
  226. for (unsigned short i=0, max=maxPluginNumber(); i < max; i++)
  227. {
  228. CarlaPlugin* const plugin = getPluginUnchecked(i);
  229. if (plugin && plugin->enabled())
  230. {
  231. plugin->engineProcessLock();
  232. plugin->initBuffers();
  233. processPlugin(plugin, nframes);
  234. plugin->engineProcessUnlock();
  235. }
  236. }
  237. }
  238. else if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  239. {
  240. // get buffers from jack
  241. float* audioIn1 = (float*)jackbridge_port_get_buffer(rackJackPorts[rackPortAudioIn1], nframes);
  242. float* audioIn2 = (float*)jackbridge_port_get_buffer(rackJackPorts[rackPortAudioIn2], nframes);
  243. float* audioOut1 = (float*)jackbridge_port_get_buffer(rackJackPorts[rackPortAudioOut1], nframes);
  244. float* audioOut2 = (float*)jackbridge_port_get_buffer(rackJackPorts[rackPortAudioOut2], nframes);
  245. void* controlIn = jackbridge_port_get_buffer(rackJackPorts[rackPortControlIn], nframes);
  246. void* controlOut = jackbridge_port_get_buffer(rackJackPorts[rackPortControlOut], nframes);
  247. void* midiIn = jackbridge_port_get_buffer(rackJackPorts[rackPortMidiIn], nframes);
  248. void* midiOut = jackbridge_port_get_buffer(rackJackPorts[rackPortMidiOut], nframes);
  249. // assert buffers
  250. CARLA_ASSERT(audioIn1);
  251. CARLA_ASSERT(audioIn2);
  252. CARLA_ASSERT(audioOut1);
  253. CARLA_ASSERT(audioOut2);
  254. CARLA_ASSERT(controlIn);
  255. CARLA_ASSERT(controlOut);
  256. CARLA_ASSERT(midiIn);
  257. CARLA_ASSERT(midiOut);
  258. // create audio buffers
  259. float* inBuf[2] = { audioIn1, audioIn2 };
  260. float* outBuf[2] = { audioOut1, audioOut2 };
  261. // initialize control input
  262. memset(rackControlEventsIn, 0, sizeof(CarlaEngineControlEvent)*MAX_ENGINE_CONTROL_EVENTS);
  263. {
  264. jackbridge_midi_event_t jackEvent;
  265. const uint32_t jackEventCount = jackbridge_midi_get_event_count(controlIn);
  266. uint32_t carlaEventIndex = 0;
  267. for (uint32_t jackEventIndex=0; jackEventIndex < jackEventCount; jackEventIndex++)
  268. {
  269. if (jackbridge_midi_event_get(&jackEvent, controlIn, jackEventIndex) != 0)
  270. continue;
  271. CarlaEngineControlEvent* const carlaEvent = &rackControlEventsIn[carlaEventIndex++];
  272. uint8_t midiStatus = jackEvent.buffer[0];
  273. uint8_t midiChannel = midiStatus & 0x0F;
  274. carlaEvent->time = jackEvent.time;
  275. carlaEvent->channel = midiChannel;
  276. if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus))
  277. {
  278. uint8_t midiControl = jackEvent.buffer[1];
  279. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  280. {
  281. uint8_t midiBank = jackEvent.buffer[2];
  282. carlaEvent->type = CarlaEngineEventMidiBankChange;
  283. carlaEvent->value = midiBank;
  284. }
  285. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  286. {
  287. carlaEvent->type = CarlaEngineEventAllSoundOff;
  288. }
  289. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  290. {
  291. carlaEvent->type = CarlaEngineEventAllNotesOff;
  292. }
  293. else
  294. {
  295. uint8_t midiValue = jackEvent.buffer[2];
  296. carlaEvent->type = CarlaEngineEventControlChange;
  297. carlaEvent->controller = midiControl;
  298. carlaEvent->value = double(midiValue)/127;
  299. }
  300. }
  301. else if (MIDI_IS_STATUS_PROGRAM_CHANGE(midiStatus))
  302. {
  303. uint8_t midiProgram = jackEvent.buffer[1];
  304. carlaEvent->type = CarlaEngineEventMidiProgramChange;
  305. carlaEvent->value = midiProgram;
  306. }
  307. }
  308. }
  309. // initialize midi input
  310. memset(rackMidiEventsIn, 0, sizeof(CarlaEngineMidiEvent)*MAX_ENGINE_MIDI_EVENTS);
  311. {
  312. uint32_t i = 0, j = 0;
  313. jackbridge_midi_event_t jackEvent;
  314. while (jackbridge_midi_event_get(&jackEvent, midiIn, j++) == 0)
  315. {
  316. if (i == MAX_ENGINE_MIDI_EVENTS)
  317. break;
  318. if (jackEvent.size < 4)
  319. {
  320. rackMidiEventsIn[i].time = jackEvent.time;
  321. rackMidiEventsIn[i].size = jackEvent.size;
  322. memcpy(rackMidiEventsIn[i].data, jackEvent.buffer, jackEvent.size);
  323. i += 1;
  324. }
  325. }
  326. }
  327. // process rack
  328. processRack(inBuf, outBuf, nframes);
  329. // output control
  330. {
  331. jackbridge_midi_clear_buffer(controlOut);
  332. for (unsigned short i=0; i < MAX_ENGINE_CONTROL_EVENTS; i++)
  333. {
  334. CarlaEngineControlEvent* const event = &rackControlEventsOut[i];
  335. if (event->type == CarlaEngineEventControlChange && MIDI_IS_CONTROL_BANK_SELECT(event->controller))
  336. event->type = CarlaEngineEventMidiBankChange;
  337. uint8_t data[4] = { 0 };
  338. switch (event->type)
  339. {
  340. case CarlaEngineEventNull:
  341. break;
  342. case CarlaEngineEventControlChange:
  343. data[0] = MIDI_STATUS_CONTROL_CHANGE + event->channel;
  344. data[1] = event->controller;
  345. data[2] = event->value * 127;
  346. jackbridge_midi_event_write(controlOut, event->time, data, 3);
  347. break;
  348. case CarlaEngineEventMidiBankChange:
  349. data[0] = MIDI_STATUS_CONTROL_CHANGE + event->channel;
  350. data[1] = MIDI_CONTROL_BANK_SELECT;
  351. data[2] = event->value;
  352. jackbridge_midi_event_write(controlOut, event->time, data, 3);
  353. break;
  354. case CarlaEngineEventMidiProgramChange:
  355. data[0] = MIDI_STATUS_PROGRAM_CHANGE + event->channel;
  356. data[1] = event->value;
  357. jackbridge_midi_event_write(controlOut, event->time, data, 2);
  358. break;
  359. case CarlaEngineEventAllSoundOff:
  360. data[0] = MIDI_STATUS_CONTROL_CHANGE + event->channel;
  361. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  362. jackbridge_midi_event_write(controlOut, event->time, data, 2);
  363. break;
  364. case CarlaEngineEventAllNotesOff:
  365. data[0] = MIDI_STATUS_CONTROL_CHANGE + event->channel;
  366. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  367. jackbridge_midi_event_write(controlOut, event->time, data, 2);
  368. break;
  369. }
  370. }
  371. }
  372. // output midi
  373. {
  374. jackbridge_midi_clear_buffer(midiOut);
  375. for (unsigned short i=0; i < MAX_ENGINE_MIDI_EVENTS; i++)
  376. {
  377. if (rackMidiEventsOut[i].size == 0)
  378. break;
  379. jackbridge_midi_event_write(midiOut, rackMidiEventsOut[i].time, rackMidiEventsOut[i].data, rackMidiEventsOut[i].size);
  380. }
  381. }
  382. }
  383. #else
  384. CarlaPlugin* const plugin = getPluginUnchecked(0);
  385. if (plugin && plugin->enabled())
  386. {
  387. plugin->engineProcessLock();
  388. plugin->initBuffers();
  389. processPlugin(plugin, nframes);
  390. plugin->engineProcessUnlock();
  391. }
  392. #endif
  393. }
  394. void handleShutdownCallback()
  395. {
  396. for (unsigned short i=0, max=maxPluginNumber(); i < max; i++)
  397. {
  398. CarlaPlugin* const plugin = getPluginUnchecked(i);
  399. plugin->x_client = nullptr;
  400. }
  401. client = nullptr;
  402. callback(CALLBACK_QUIT, 0, 0, 0, 0.0);
  403. }
  404. // -------------------------------------
  405. private:
  406. jack_client_t* client;
  407. jack_transport_state_t state;
  408. jack_position_t pos;
  409. bool freewheel;
  410. // -------------------------------------
  411. #ifndef BUILD_BRIDGE
  412. enum RackPorts {
  413. rackPortAudioIn1 = 0,
  414. rackPortAudioIn2 = 1,
  415. rackPortAudioOut1 = 2,
  416. rackPortAudioOut2 = 3,
  417. rackPortControlIn = 4,
  418. rackPortControlOut = 5,
  419. rackPortMidiIn = 6,
  420. rackPortMidiOut = 7,
  421. rackPortCount = 8
  422. };
  423. jack_port_t* rackJackPorts[rackPortCount];
  424. #endif
  425. static void processPlugin(CarlaPlugin* const p, const uint32_t nframes)
  426. {
  427. float* inBuffer[p->aIn.count];
  428. float* outBuffer[p->aOut.count];
  429. for (uint32_t i=0; i < p->aIn.count; i++)
  430. inBuffer[i] = p->aIn.ports[i]->getJackAudioBuffer(nframes);
  431. for (uint32_t i=0; i < p->aOut.count; i++)
  432. outBuffer[i] = p->aOut.ports[i]->getJackAudioBuffer(nframes);
  433. #ifndef BUILD_BRIDGE
  434. if (carlaOptions.processHighPrecision)
  435. {
  436. float* inBuffer2[p->aIn.count];
  437. float* outBuffer2[p->aOut.count];
  438. for (uint32_t i=0, j; i < nframes; i += 8)
  439. {
  440. for (j=0; j < p->aIn.count; j++)
  441. inBuffer2[j] = inBuffer[j] + i;
  442. for (j=0; j < p->aOut.count; j++)
  443. outBuffer2[j] = outBuffer[j] + i;
  444. p->process(inBuffer2, outBuffer2, 8, i);
  445. }
  446. }
  447. else
  448. #endif
  449. p->process(inBuffer, outBuffer, nframes);
  450. }
  451. static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg)
  452. {
  453. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  454. _this_->handleSampleRateCallback(newSampleRate);
  455. return 0;
  456. }
  457. static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg)
  458. {
  459. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  460. _this_->handleBufferSizeCallback(newBufferSize);
  461. return 0;
  462. }
  463. static void carla_jack_freewheel_callback(int starting, void* arg)
  464. {
  465. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  466. _this_->handleFreewheelCallback(bool(starting));
  467. }
  468. static int carla_jack_process_callback(jack_nframes_t nframes, void* arg)
  469. {
  470. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  471. _this_->handleProcessCallback(nframes);
  472. return 0;
  473. }
  474. static int carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg)
  475. {
  476. CarlaPlugin* const plugin = (CarlaPlugin*)arg;
  477. if (plugin && plugin->enabled())
  478. {
  479. plugin->engineProcessLock();
  480. plugin->initBuffers();
  481. processPlugin(plugin, nframes);
  482. plugin->engineProcessUnlock();
  483. }
  484. return 0;
  485. }
  486. static void carla_jack_shutdown_callback(void* arg)
  487. {
  488. CarlaEngineJack* const _this_ = (CarlaEngineJack*)arg;
  489. _this_->handleShutdownCallback();
  490. }
  491. };
  492. // -----------------------------------------
  493. CarlaEngine* CarlaEngine::newJack()
  494. {
  495. return new CarlaEngineJack();
  496. }
  497. // -----------------------------------------
  498. CARLA_BACKEND_END_NAMESPACE
  499. #endif // CARLA_ENGINE_JACK