Audio plugin host https://kx.studio/carla
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.

1132 lines
37KB

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