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.

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