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.

566 lines
20KB

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