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.

1154 lines
37KB

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