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.

2220 lines
74KB

  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 doc/GPL.txt file.
  16. */
  17. #include "CarlaEngineInternal.hpp"
  18. #include "CarlaBackendUtils.hpp"
  19. #include "CarlaMIDI.h"
  20. #define JACKBRIDGE_DIRECT 1
  21. #ifdef JACKBRIDGE_EXPORT
  22. # include "jackbridge/JackBridge.hpp"
  23. #else
  24. # include "jackbridge/JackBridge1.cpp"
  25. # include "jackbridge/JackBridge2.cpp"
  26. #endif
  27. #include "juce_audio_basics.h"
  28. #define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon"
  29. using juce::FloatVectorOperations;
  30. CARLA_BACKEND_START_NAMESPACE
  31. #if 0
  32. } // Fix editor indentation
  33. #endif
  34. // -----------------------------------------------------------------------
  35. // Fallback data
  36. static const EngineEvent kFallbackJackEngineEvent;
  37. // -----------------------------------------------------------------------
  38. // Carla Engine JACK-Audio port
  39. class CarlaEngineJackAudioPort : public CarlaEngineAudioPort
  40. {
  41. public:
  42. CarlaEngineJackAudioPort(const CarlaEngine& engine, const bool isInput, jack_client_t* const client, jack_port_t* const port)
  43. : CarlaEngineAudioPort(engine, isInput),
  44. fClient(client),
  45. fPort(port)
  46. {
  47. carla_debug("CarlaEngineJackAudioPort::CarlaEngineJackAudioPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port);
  48. if (fEngine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  49. {
  50. CARLA_ASSERT(client != nullptr && port != nullptr);
  51. }
  52. else
  53. {
  54. CARLA_ASSERT(client == nullptr && port == nullptr);
  55. }
  56. }
  57. ~CarlaEngineJackAudioPort() override
  58. {
  59. carla_debug("CarlaEngineJackAudioPort::~CarlaEngineJackAudioPort()");
  60. if (fClient != nullptr && fPort != nullptr)
  61. jackbridge_port_unregister(fClient, fPort);
  62. }
  63. void initBuffer() override
  64. {
  65. if (fPort == nullptr)
  66. return CarlaEngineAudioPort::initBuffer();
  67. const uint32_t bufferSize(fEngine.getBufferSize());
  68. fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize);
  69. if (! fIsInput)
  70. FloatVectorOperations::clear(fBuffer, bufferSize);
  71. }
  72. private:
  73. jack_client_t* fClient;
  74. jack_port_t* fPort;
  75. friend class CarlaEngineJack;
  76. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackAudioPort)
  77. };
  78. // -----------------------------------------------------------------------
  79. // Carla Engine JACK-CV port
  80. class CarlaEngineJackCVPort : public CarlaEngineCVPort
  81. {
  82. public:
  83. CarlaEngineJackCVPort(const CarlaEngine& engine, const bool isInput, jack_client_t* const client, jack_port_t* const port)
  84. : CarlaEngineCVPort(engine, isInput),
  85. fClient(client),
  86. fPort(port)
  87. {
  88. carla_debug("CarlaEngineJackCVPort::CarlaEngineJackCVPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port);
  89. if (fEngine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  90. {
  91. CARLA_ASSERT(client != nullptr && port != nullptr);
  92. }
  93. else
  94. {
  95. CARLA_ASSERT(client == nullptr && port == nullptr);
  96. }
  97. }
  98. ~CarlaEngineJackCVPort() override
  99. {
  100. carla_debug("CarlaEngineJackCVPort::~CarlaEngineJackCVPort()");
  101. if (fClient != nullptr && fPort != nullptr)
  102. jackbridge_port_unregister(fClient, fPort);
  103. }
  104. void initBuffer() override
  105. {
  106. if (fPort == nullptr)
  107. return CarlaEngineCVPort::initBuffer();
  108. const uint32_t bufferSize(fEngine.getBufferSize());
  109. if (fIsInput)
  110. {
  111. float* const jackBuffer((float*)jackbridge_port_get_buffer(fPort, bufferSize));
  112. FloatVectorOperations::copy(fBuffer, jackBuffer, bufferSize);
  113. }
  114. else
  115. {
  116. FloatVectorOperations::clear(fBuffer, bufferSize);
  117. }
  118. }
  119. void writeBuffer(const uint32_t frames, const uint32_t timeOffset) override
  120. {
  121. CARLA_SAFE_ASSERT_RETURN(! fIsInput,);
  122. float* const jackBuffer((float*)jackbridge_port_get_buffer(fPort, fEngine.getBufferSize()));
  123. FloatVectorOperations::copy(jackBuffer+timeOffset, fBuffer, frames);
  124. }
  125. private:
  126. jack_client_t* fClient;
  127. jack_port_t* fPort;
  128. friend class CarlaEngineJack;
  129. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackCVPort)
  130. };
  131. // -----------------------------------------------------------------------
  132. // Carla Engine JACK-Event port
  133. class CarlaEngineJackEventPort : public CarlaEngineEventPort
  134. {
  135. public:
  136. CarlaEngineJackEventPort(const CarlaEngine& engine, const bool isInput, jack_client_t* const client, jack_port_t* const port)
  137. : CarlaEngineEventPort(engine, isInput),
  138. fClient(client),
  139. fPort(port),
  140. fJackBuffer(nullptr)
  141. {
  142. carla_debug("CarlaEngineJackEventPort::CarlaEngineJackEventPort(name:\"%s\", %s, %p, %p)", engine.getName(), bool2str(isInput), client, port);
  143. if (fEngine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  144. {
  145. CARLA_ASSERT(client != nullptr && port != nullptr);
  146. }
  147. else
  148. {
  149. CARLA_ASSERT(client == nullptr && port == nullptr);
  150. }
  151. }
  152. ~CarlaEngineJackEventPort() override
  153. {
  154. carla_debug("CarlaEngineJackEventPort::~CarlaEngineJackEventPort()");
  155. if (fClient != nullptr && fPort != nullptr)
  156. jackbridge_port_unregister(fClient, fPort);
  157. }
  158. void initBuffer() override
  159. {
  160. if (fPort == nullptr)
  161. return CarlaEngineEventPort::initBuffer();
  162. fJackBuffer = jackbridge_port_get_buffer(fPort, fEngine.getBufferSize());
  163. if (! fIsInput)
  164. jackbridge_midi_clear_buffer(fJackBuffer);
  165. }
  166. uint32_t getEventCount() const override
  167. {
  168. if (fPort == nullptr)
  169. return CarlaEngineEventPort::getEventCount();
  170. CARLA_SAFE_ASSERT_RETURN(fIsInput, 0);
  171. CARLA_SAFE_ASSERT_RETURN(fJackBuffer != nullptr, 0);
  172. return jackbridge_midi_get_event_count(fJackBuffer);
  173. }
  174. const EngineEvent& getEvent(const uint32_t index) override
  175. {
  176. if (fPort == nullptr)
  177. return CarlaEngineEventPort::getEvent(index);
  178. CARLA_SAFE_ASSERT_RETURN(fIsInput, kFallbackJackEngineEvent);
  179. CARLA_SAFE_ASSERT_RETURN(fJackBuffer != nullptr, kFallbackJackEngineEvent);
  180. return getEventUnchecked(index);
  181. }
  182. const EngineEvent& getEventUnchecked(const uint32_t index) override
  183. {
  184. jack_midi_event_t jackEvent;
  185. carla_zeroStruct<jack_midi_event_t>(jackEvent);
  186. if (! jackbridge_midi_event_get(&jackEvent, fJackBuffer, index))
  187. return kFallbackJackEngineEvent;
  188. if (jackEvent.size == 0 || jackEvent.size > 4)
  189. return kFallbackJackEngineEvent;
  190. fRetEvent.clear();
  191. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  192. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  193. fRetEvent.time = jackEvent.time;
  194. fRetEvent.channel = midiChannel;
  195. if (midiStatus == MIDI_STATUS_CONTROL_CHANGE)
  196. {
  197. CARLA_ASSERT(jackEvent.size == 2 || jackEvent.size == 3);
  198. const uint8_t midiControl = jackEvent.buffer[1];
  199. fRetEvent.type = kEngineEventTypeControl;
  200. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  201. {
  202. const uint8_t midiBank = jackEvent.buffer[2];
  203. fRetEvent.ctrl.type = kEngineControlEventTypeMidiBank;
  204. fRetEvent.ctrl.param = midiBank;
  205. fRetEvent.ctrl.value = 0.0f;
  206. }
  207. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  208. {
  209. fRetEvent.ctrl.type = kEngineControlEventTypeAllSoundOff;
  210. fRetEvent.ctrl.param = 0;
  211. fRetEvent.ctrl.value = 0.0f;
  212. }
  213. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  214. {
  215. fRetEvent.ctrl.type = kEngineControlEventTypeAllNotesOff;
  216. fRetEvent.ctrl.param = 0;
  217. fRetEvent.ctrl.value = 0.0f;
  218. }
  219. else
  220. {
  221. CARLA_ASSERT(jackEvent.size == 3);
  222. const uint8_t midiValue = jackEvent.buffer[2];
  223. fRetEvent.ctrl.type = kEngineControlEventTypeParameter;
  224. fRetEvent.ctrl.param = midiControl;
  225. fRetEvent.ctrl.value = float(midiValue)/127.0f;
  226. }
  227. }
  228. else if (midiStatus == MIDI_STATUS_PROGRAM_CHANGE)
  229. {
  230. CARLA_SAFE_ASSERT_INT2(jackEvent.size == 2, jackEvent.size, jackEvent.buffer[1]);
  231. const uint8_t midiProgram = jackEvent.buffer[1];
  232. fRetEvent.type = kEngineEventTypeControl;
  233. fRetEvent.ctrl.type = kEngineControlEventTypeMidiProgram;
  234. fRetEvent.ctrl.param = midiProgram;
  235. fRetEvent.ctrl.value = 0.0f;
  236. }
  237. else
  238. {
  239. fRetEvent.type = kEngineEventTypeMidi;
  240. fRetEvent.midi.port = 0;
  241. fRetEvent.midi.size = static_cast<uint8_t>(jackEvent.size);
  242. fRetEvent.midi.data[0] = midiStatus;
  243. for (uint8_t i=1; i < fRetEvent.midi.size; ++i)
  244. fRetEvent.midi.data[i] = jackEvent.buffer[i];
  245. }
  246. return fRetEvent;
  247. }
  248. void writeControlEvent(const uint32_t time, const uint8_t channel, const EngineControlEventType type, const uint16_t param, const float value) override
  249. {
  250. if (fPort == nullptr)
  251. return CarlaEngineEventPort::writeControlEvent(time, channel, type, param, value);
  252. CARLA_SAFE_ASSERT_RETURN(! fIsInput,);
  253. CARLA_SAFE_ASSERT_RETURN(fJackBuffer != nullptr,);
  254. CARLA_SAFE_ASSERT_RETURN(type != kEngineControlEventTypeNull,);
  255. CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,);
  256. CARLA_SAFE_ASSERT_RETURN(param < 0x5F,);
  257. CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f);
  258. if (type == kEngineControlEventTypeParameter)
  259. {
  260. CARLA_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(param));
  261. }
  262. const float fixedValue(carla_fixValue<float>(0.0f, 1.0f, value));
  263. size_t size = 0;
  264. jack_midi_data_t data[4] = { 0, 0, 0, 0 };
  265. switch (type)
  266. {
  267. case kEngineControlEventTypeNull:
  268. break;
  269. case kEngineControlEventTypeParameter:
  270. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  271. data[1] = param;
  272. data[2] = jack_midi_data_t(fixedValue * 127.0f);
  273. size = 3;
  274. break;
  275. case kEngineControlEventTypeMidiBank:
  276. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  277. data[1] = MIDI_CONTROL_BANK_SELECT;
  278. data[2] = param;
  279. size = 3;
  280. break;
  281. case kEngineControlEventTypeMidiProgram:
  282. data[0] = MIDI_STATUS_PROGRAM_CHANGE + channel;
  283. data[1] = param;
  284. size = 2;
  285. break;
  286. case kEngineControlEventTypeAllSoundOff:
  287. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  288. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  289. data[2] = 0;
  290. size = 3;
  291. break;
  292. case kEngineControlEventTypeAllNotesOff:
  293. data[0] = MIDI_STATUS_CONTROL_CHANGE + channel;
  294. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  295. data[2] = 0;
  296. size = 3;
  297. break;
  298. }
  299. if (size > 0)
  300. jackbridge_midi_event_write(fJackBuffer, time, data, size);
  301. }
  302. void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t port, const uint8_t* const data, const uint8_t size) override
  303. {
  304. if (fPort == nullptr)
  305. return CarlaEngineEventPort::writeMidiEvent(time, channel, port, data, size);
  306. CARLA_SAFE_ASSERT_RETURN(! fIsInput,);
  307. CARLA_SAFE_ASSERT_RETURN(fJackBuffer != nullptr,);
  308. CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,);
  309. CARLA_SAFE_ASSERT_RETURN(data != nullptr,);
  310. CARLA_SAFE_ASSERT_RETURN(size > 0,);
  311. jack_midi_data_t jdata[size];
  312. std::memset(jdata, 0, sizeof(jack_midi_data_t)*size);
  313. jdata[0] = MIDI_GET_STATUS_FROM_DATA(data);
  314. jdata[0] += channel;
  315. for (uint8_t i=1; i < size; ++i)
  316. jdata[i] = data[i];
  317. jackbridge_midi_event_write(fJackBuffer, time, jdata, size);
  318. }
  319. private:
  320. jack_client_t* fClient;
  321. jack_port_t* fPort;
  322. void* fJackBuffer;
  323. EngineEvent fRetEvent;
  324. friend class CarlaEngineJack;
  325. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackEventPort)
  326. };
  327. // -----------------------------------------------------------------------
  328. // Jack Engine client
  329. class CarlaEngineJackClient : public CarlaEngineClient
  330. {
  331. public:
  332. CarlaEngineJackClient(const CarlaEngine& engine, jack_client_t* const client)
  333. : CarlaEngineClient(engine),
  334. fClient(client),
  335. fUseClient(engine.getProccessMode() == PROCESS_MODE_SINGLE_CLIENT || engine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  336. {
  337. carla_debug("CarlaEngineJackClient::CarlaEngineJackClient(name:\"%s\", %p)", engine.getName(), client);
  338. if (fUseClient)
  339. {
  340. CARLA_ASSERT(fClient != nullptr);
  341. }
  342. else
  343. {
  344. CARLA_ASSERT(fClient == nullptr);
  345. }
  346. }
  347. ~CarlaEngineJackClient() override
  348. {
  349. carla_debug("CarlaEngineClient::~CarlaEngineClient()");
  350. if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS && fClient != nullptr)
  351. jackbridge_client_close(fClient);
  352. }
  353. void activate() override
  354. {
  355. carla_debug("CarlaEngineJackClient::activate()");
  356. if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  357. {
  358. CARLA_SAFE_ASSERT_RETURN(fClient != nullptr && ! fActive,);
  359. jackbridge_activate(fClient);
  360. }
  361. CarlaEngineClient::activate();
  362. }
  363. void deactivate() override
  364. {
  365. carla_debug("CarlaEngineJackClient::deactivate()");
  366. if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
  367. {
  368. CARLA_SAFE_ASSERT_RETURN(fClient != nullptr && fActive,);
  369. jackbridge_deactivate(fClient);
  370. }
  371. CarlaEngineClient::deactivate();
  372. }
  373. bool isOk() const override
  374. {
  375. carla_debug("CarlaEngineJackClient::isOk()");
  376. if (fUseClient)
  377. return (fClient != nullptr);
  378. return CarlaEngineClient::isOk();
  379. }
  380. #if 0
  381. void setLatency(const uint32_t samples) override
  382. {
  383. CarlaEngineClient::setLatency(samples);
  384. if (fUseClient && fClient != nullptr)
  385. jackbridge_recompute_total_latencies(fClient);
  386. }
  387. #endif
  388. CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) override
  389. {
  390. carla_debug("CarlaEngineJackClient::addPort(%s, \"%s\", %s)", EnginePortType2Str(portType), name, bool2str(isInput));
  391. jack_port_t* port = nullptr;
  392. // Create JACK port first, if needed
  393. if (fUseClient && fClient != nullptr)
  394. {
  395. switch (portType)
  396. {
  397. case kEnginePortTypeNull:
  398. break;
  399. case kEnginePortTypeAudio:
  400. port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  401. break;
  402. case kEnginePortTypeCV:
  403. port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsControlVoltage | (isInput ? JackPortIsInput : JackPortIsOutput), 0);
  404. break;
  405. case kEnginePortTypeEvent:
  406. port = jackbridge_port_register(fClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
  407. break;
  408. case kEnginePortTypeOSC:
  409. break;
  410. }
  411. }
  412. // Create Engine port
  413. switch (portType)
  414. {
  415. case kEnginePortTypeNull:
  416. break;
  417. case kEnginePortTypeAudio:
  418. return new CarlaEngineJackAudioPort(fEngine, isInput, fClient, port);
  419. case kEnginePortTypeCV:
  420. return new CarlaEngineJackCVPort(fEngine, isInput, fClient, port);
  421. case kEnginePortTypeEvent:
  422. return new CarlaEngineJackEventPort(fEngine, isInput, fClient, port);
  423. case kEnginePortTypeOSC:
  424. break;
  425. }
  426. carla_stderr("CarlaEngineJackClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput));
  427. return nullptr;
  428. }
  429. private:
  430. jack_client_t* fClient;
  431. const bool fUseClient;
  432. friend class CarlaEngineJack;
  433. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackClient)
  434. };
  435. // -----------------------------------------------------------------------
  436. // Jack Engine
  437. class CarlaEngineJack : public CarlaEngine
  438. {
  439. public:
  440. CarlaEngineJack()
  441. : CarlaEngine(),
  442. fClient(nullptr),
  443. fTransportState(JackTransportStopped),
  444. fFreewheel(false),
  445. #ifdef BUILD_BRIDGE
  446. fHasQuit(false)
  447. #else
  448. fLastGroupId(0),
  449. fLastPortId(0),
  450. fLastConnectionId(0)
  451. #endif
  452. {
  453. carla_debug("CarlaEngineJack::CarlaEngineJack()");
  454. #ifdef BUILD_BRIDGE
  455. fOptions.processMode = PROCESS_MODE_MULTIPLE_CLIENTS;
  456. #else
  457. carla_fill<jack_port_t*>(fRackPorts, kRackPortCount, nullptr);
  458. #endif
  459. // FIXME: Always enable JACK transport for now
  460. fOptions.transportMode = TRANSPORT_MODE_JACK;
  461. carla_zeroStruct<jack_position_t>(fTransportPos);
  462. }
  463. ~CarlaEngineJack() override
  464. {
  465. carla_debug("CarlaEngineJack::~CarlaEngineJack()");
  466. CARLA_ASSERT(fClient == nullptr);
  467. #ifndef BUILD_BRIDGE
  468. fUsedGroupNames.clear();
  469. fUsedPortNames.clear();
  470. fUsedConnections.clear();
  471. fGroupIconsChanged.clear();
  472. #endif
  473. }
  474. // -------------------------------------------------------------------
  475. // Maximum values
  476. unsigned int getMaxClientNameSize() const noexcept override
  477. {
  478. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  479. return static_cast<unsigned int>(jackbridge_client_name_size());
  480. return CarlaEngine::getMaxClientNameSize();
  481. }
  482. unsigned int getMaxPortNameSize() const noexcept override
  483. {
  484. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  485. return static_cast<unsigned int>(jackbridge_port_name_size());
  486. return CarlaEngine::getMaxPortNameSize();
  487. }
  488. // -------------------------------------------------------------------
  489. // Virtual, per-engine type calls
  490. bool init(const char* const clientName) override
  491. {
  492. carla_debug("CarlaEngineJack::init(\"%s\")", clientName);
  493. fFreewheel = false;
  494. fTransportState = JackTransportStopped;
  495. carla_zeroStruct<jack_position_t>(fTransportPos);
  496. #ifndef BUILD_BRIDGE
  497. fLastGroupId = 0;
  498. fLastPortId = 0;
  499. fLastConnectionId = 0;
  500. fUsedGroupNames.clear();
  501. fUsedPortNames.clear();
  502. fUsedConnections.clear();
  503. fGroupIconsChanged.clear();
  504. fClient = jackbridge_client_open(clientName, JackNullOption, nullptr);
  505. if (fClient != nullptr)
  506. {
  507. fBufferSize = jackbridge_get_buffer_size(fClient);
  508. fSampleRate = jackbridge_get_sample_rate(fClient);
  509. jackbridge_custom_publish_data(fClient, URI_CANVAS_ICON, "carla", 6);
  510. jackbridge_custom_set_data_appearance_callback(fClient, carla_jack_custom_appearance_callback, this);
  511. jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback, this);
  512. jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback, this);
  513. jackbridge_set_freewheel_callback(fClient, carla_jack_freewheel_callback, this);
  514. jackbridge_set_latency_callback(fClient, carla_jack_latency_callback, this);
  515. jackbridge_set_process_callback(fClient, carla_jack_process_callback, this);
  516. jackbridge_on_shutdown(fClient, carla_jack_shutdown_callback, this);
  517. const char* const jackClientName(jackbridge_get_client_name(fClient));
  518. initJackPatchbay(jackClientName);
  519. jackbridge_set_client_registration_callback(fClient, carla_jack_client_registration_callback, this);
  520. jackbridge_set_port_registration_callback(fClient, carla_jack_port_registration_callback, this);
  521. jackbridge_set_port_connect_callback(fClient, carla_jack_port_connect_callback, this);
  522. jackbridge_set_port_rename_callback(fClient, carla_jack_port_rename_callback, this);
  523. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  524. {
  525. fRackPorts[kRackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  526. fRackPorts[kRackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
  527. fRackPorts[kRackPortAudioOut1] = jackbridge_port_register(fClient, "audio-out1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  528. fRackPorts[kRackPortAudioOut2] = jackbridge_port_register(fClient, "audio-out2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
  529. fRackPorts[kRackPortEventIn] = jackbridge_port_register(fClient, "events-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  530. fRackPorts[kRackPortEventOut] = jackbridge_port_register(fClient, "events-out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
  531. }
  532. if (jackbridge_activate(fClient))
  533. {
  534. CarlaEngine::init(jackClientName);
  535. return true;
  536. }
  537. else
  538. {
  539. setLastError("Failed to activate the JACK client");
  540. jackbridge_client_close(fClient);
  541. fClient = nullptr;
  542. }
  543. }
  544. else
  545. setLastError("Failed to create new JACK client");
  546. return false;
  547. #else
  548. if (fBufferSize == 0 || fSampleRate == 0.0)
  549. {
  550. // open temp client to get initial buffer-size and sample-rate values
  551. if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr))
  552. {
  553. fBufferSize = jackbridge_get_buffer_size(tmpClient);
  554. fSampleRate = jackbridge_get_sample_rate(tmpClient);
  555. jackbridge_client_close(tmpClient);
  556. }
  557. }
  558. return CarlaEngine::init(clientName);
  559. #endif
  560. }
  561. bool close() override
  562. {
  563. carla_debug("CarlaEngineJack::close()");
  564. CarlaEngine::close();
  565. #ifdef BUILD_BRIDGE
  566. fClient = nullptr;
  567. fHasQuit = true;
  568. return true;
  569. #else
  570. if (jackbridge_deactivate(fClient))
  571. {
  572. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  573. {
  574. jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn1]);
  575. jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn2]);
  576. jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioOut1]);
  577. jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioOut2]);
  578. jackbridge_port_unregister(fClient, fRackPorts[kRackPortEventIn]);
  579. jackbridge_port_unregister(fClient, fRackPorts[kRackPortEventOut]);
  580. carla_fill<jack_port_t*>(fRackPorts, kRackPortCount, nullptr);
  581. }
  582. if (jackbridge_client_close(fClient))
  583. {
  584. fClient = nullptr;
  585. return true;
  586. }
  587. else
  588. setLastError("Failed to close the JACK client");
  589. }
  590. else
  591. setLastError("Failed to deactivate the JACK client");
  592. fClient = nullptr;
  593. fUsedGroupNames.clear();
  594. fUsedPortNames.clear();
  595. fUsedConnections.clear();
  596. fGroupIconsChanged.clear();
  597. #endif
  598. return false;
  599. }
  600. #ifndef BUILD_BRIDGE
  601. void idle() override
  602. {
  603. CarlaEngine::idle();
  604. if (fGroupIconsChanged.count() == 0)
  605. return;
  606. static bool checkIcons = false;
  607. if (! checkIcons)
  608. {
  609. checkIcons = true; // check them next time
  610. return;
  611. }
  612. checkIcons = false;
  613. void* data;
  614. size_t dataSize;
  615. NonRtList<int> groupIconsCopy;
  616. fGroupIconsChanged.spliceAppend(groupIconsCopy, true);
  617. for (NonRtList<int>::Itenerator it = groupIconsCopy.begin(); it.valid(); it.next())
  618. {
  619. const int& groupId(*it);
  620. const char* const groupName(getGroupName(groupId));
  621. data = nullptr;
  622. dataSize = 0;
  623. if (jackbridge_custom_get_data(fClient, groupName, URI_CANVAS_ICON, &data, &dataSize) && data != nullptr && dataSize != 0)
  624. {
  625. const char* const icon((const char*)data);
  626. CARLA_ASSERT(std::strlen(icon)+1 == dataSize);
  627. PatchbayIconType groupIcon;
  628. if (std::strcmp(icon, "app") == 0 || std::strcmp(icon, "application") == 0)
  629. groupIcon = PATCHBAY_ICON_APPLICATION;
  630. else if (std::strcmp(icon, "hardware") == 0)
  631. groupIcon = PATCHBAY_ICON_HARDWARE;
  632. else if (std::strcmp(icon, "carla") == 0)
  633. groupIcon = PATCHBAY_ICON_CARLA;
  634. else if (std::strcmp(icon, "distrho") == 0)
  635. groupIcon = PATCHBAY_ICON_DISTRHO;
  636. else if (std::strcmp(icon, "file") == 0)
  637. groupIcon = PATCHBAY_ICON_FILE;
  638. else if (std::strcmp(icon, "plugin") == 0)
  639. groupIcon = PATCHBAY_ICON_PLUGIN;
  640. else
  641. groupIcon = PATCHBAY_ICON_APPLICATION;
  642. callback(CALLBACK_PATCHBAY_ICON_CHANGED, 0, groupId, groupIcon, 0.0f, groupName);
  643. jackbridge_free(data);
  644. }
  645. }
  646. groupIconsCopy.clear();
  647. }
  648. #endif
  649. bool isRunning() const noexcept override
  650. {
  651. #ifdef BUILD_BRIDGE
  652. return (fClient != nullptr || ! fHasQuit);
  653. #else
  654. return (fClient != nullptr);
  655. #endif
  656. }
  657. bool isOffline() const noexcept override
  658. {
  659. return fFreewheel;
  660. }
  661. EngineType getType() const noexcept override
  662. {
  663. return kEngineTypeJack;
  664. }
  665. CarlaEngineClient* addClient(CarlaPlugin* const plugin) override
  666. {
  667. const char* const iconName(plugin->getIconName());
  668. jack_client_t* client = nullptr;
  669. #ifdef BUILD_BRIDGE
  670. client = fClient = jackbridge_client_open(plugin->getName(), JackNullOption, nullptr);
  671. CARLA_ASSERT(client != nullptr);
  672. if (client == nullptr)
  673. return nullptr;
  674. fBufferSize = jackbridge_get_buffer_size(client);
  675. fSampleRate = jackbridge_get_sample_rate(client);
  676. jackbridge_custom_publish_data(client, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1);
  677. jackbridge_set_buffer_size_callback(client, carla_jack_bufsize_callback, this);
  678. jackbridge_set_sample_rate_callback(client, carla_jack_srate_callback, this);
  679. jackbridge_set_freewheel_callback(client, carla_jack_freewheel_callback, this);
  680. jackbridge_set_latency_callback(client, carla_jack_latency_callback, this);
  681. jackbridge_set_process_callback(client, carla_jack_process_callback, this);
  682. jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this);
  683. #else
  684. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  685. {
  686. client = fClient;
  687. }
  688. else if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  689. {
  690. client = jackbridge_client_open(plugin->getName(), JackNullOption, nullptr);
  691. CARLA_ASSERT(client != nullptr);
  692. if (client == nullptr)
  693. return nullptr;
  694. jackbridge_custom_publish_data(client, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1);
  695. jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin);
  696. jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin);
  697. }
  698. #endif
  699. return new CarlaEngineJackClient(*this, client);
  700. }
  701. #ifndef BUILD_BRIDGE
  702. const char* renamePlugin(const unsigned int id, const char* const newName) override
  703. {
  704. CARLA_ASSERT(pData->curPluginCount > 0);
  705. CARLA_ASSERT(id < pData->curPluginCount);
  706. CARLA_ASSERT(pData->plugins != nullptr);
  707. CARLA_ASSERT(newName != nullptr);
  708. if (pData->plugins == nullptr)
  709. {
  710. setLastError("Critical error: no plugins are currently loaded!");
  711. return nullptr;
  712. }
  713. CarlaPlugin* const plugin(pData->plugins[id].plugin);
  714. if (plugin == nullptr)
  715. {
  716. carla_stderr("CarlaEngine::clonePlugin(%i) - could not find plugin", id);
  717. return nullptr;
  718. }
  719. CARLA_ASSERT(plugin->getId() == id);
  720. bool needsReinit = (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT);
  721. const char* name = getUniquePluginName(newName);
  722. // TODO - use rename port if single-client
  723. // JACK client rename
  724. if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
  725. {
  726. CarlaEngineJackClient* const client((CarlaEngineJackClient*)plugin->getEngineClient());
  727. if (bridge.client_rename_ptr != nullptr)
  728. {
  729. name = bridge.client_rename_ptr(client->fClient, name);
  730. }
  731. else
  732. {
  733. // we should not be able to do this, jack really needs to allow client rename
  734. needsReinit = true;
  735. if (jack_client_t* jclient = jackbridge_client_open(name, JackNullOption, nullptr))
  736. {
  737. const char* const iconName(plugin->getIconName());
  738. jackbridge_custom_publish_data(jclient, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1);
  739. // close old client
  740. plugin->setEnabled(false);
  741. if (client->isActive())
  742. client->deactivate();
  743. plugin->clearBuffers();
  744. jackbridge_client_close(client->fClient);
  745. // set new client data
  746. name = jackbridge_get_client_name(jclient);
  747. jackbridge_set_process_callback(jclient, carla_jack_process_callback_plugin, plugin);
  748. jackbridge_set_latency_callback(jclient, carla_jack_latency_callback_plugin, plugin);
  749. client->fClient = jclient;
  750. }
  751. }
  752. }
  753. if (name == nullptr)
  754. return nullptr;
  755. // Rename
  756. plugin->setName(name);
  757. if (needsReinit)
  758. {
  759. // reload plugin to recreate its ports
  760. const SaveState& saveState(plugin->getSaveState());
  761. plugin->reload();
  762. plugin->loadSaveState(saveState);
  763. }
  764. return name;
  765. }
  766. // -------------------------------------------------------------------
  767. // Patchbay
  768. bool patchbayConnect(int portA, int portB) override
  769. {
  770. CARLA_ASSERT(fClient != nullptr);
  771. if (fClient == nullptr)
  772. {
  773. setLastError("Invalid JACK client");
  774. return false;
  775. }
  776. char portNameA[STR_MAX+1];
  777. char portNameB[STR_MAX+1];
  778. getFullPortName(portA, portNameA);
  779. getFullPortName(portB, portNameB);
  780. if (! jackbridge_connect(fClient, portNameA, portNameB))
  781. {
  782. setLastError("JACK operation failed");
  783. return false;
  784. }
  785. return true;
  786. }
  787. bool patchbayDisconnect(int connectionId) override
  788. {
  789. CARLA_ASSERT(fClient != nullptr);
  790. if (fClient == nullptr)
  791. {
  792. setLastError("Invalid JACK client");
  793. return false;
  794. }
  795. for (NonRtList<ConnectionToId>::Itenerator it = fUsedConnections.begin(); it.valid(); it.next())
  796. {
  797. const ConnectionToId& connectionToId(*it);
  798. if (connectionToId.id == connectionId)
  799. {
  800. char portNameOut[STR_MAX+1];
  801. char portNameIn[STR_MAX+1];
  802. getFullPortName(connectionToId.portOut, portNameOut);
  803. getFullPortName(connectionToId.portIn, portNameIn);
  804. if (! jackbridge_disconnect(fClient, portNameOut, portNameIn))
  805. {
  806. setLastError("JACK operation failed");
  807. return false;
  808. }
  809. return true;
  810. }
  811. }
  812. setLastError("Failed to find the requested connection");
  813. return false;
  814. }
  815. void patchbayRefresh() override
  816. {
  817. CARLA_SAFE_ASSERT_RETURN(fClient != nullptr,);
  818. fLastGroupId = 0;
  819. fLastPortId = 0;
  820. fLastConnectionId = 0;
  821. fUsedGroupNames.clear();
  822. fUsedPortNames.clear();
  823. fUsedConnections.clear();
  824. fGroupIconsChanged.clear();
  825. initJackPatchbay(jackbridge_get_client_name(fClient));
  826. }
  827. #endif
  828. // -------------------------------------------------------------------
  829. // Transport
  830. void transportPlay() override
  831. {
  832. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  833. CarlaEngine::transportPlay();
  834. else if (fClient != nullptr)
  835. jackbridge_transport_start(fClient);
  836. }
  837. void transportPause() override
  838. {
  839. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  840. CarlaEngine::transportPause();
  841. else if (fClient != nullptr)
  842. jackbridge_transport_stop(fClient);
  843. }
  844. void transportRelocate(const uint32_t frame) override
  845. {
  846. if (fOptions.transportMode == TRANSPORT_MODE_INTERNAL)
  847. CarlaEngine::transportRelocate(frame);
  848. else if (fClient != nullptr)
  849. jackbridge_transport_locate(fClient, frame);
  850. }
  851. // -------------------------------------------------------------------
  852. protected:
  853. void handleJackBufferSizeCallback(const uint32_t newBufferSize)
  854. {
  855. if (fBufferSize == newBufferSize)
  856. return;
  857. fBufferSize = newBufferSize;
  858. bufferSizeChanged(newBufferSize);
  859. }
  860. void handleJackSampleRateCallback(const double newSampleRate)
  861. {
  862. if (fSampleRate == newSampleRate)
  863. return;
  864. fSampleRate = newSampleRate;
  865. sampleRateChanged(newSampleRate);
  866. }
  867. void handleJackFreewheelCallback(const bool isFreewheel)
  868. {
  869. if (fFreewheel == isFreewheel)
  870. return;
  871. fFreewheel = isFreewheel;
  872. offlineModeChanged(isFreewheel);
  873. }
  874. void saveTransportInfo()
  875. {
  876. if (fOptions.transportMode != TRANSPORT_MODE_JACK)
  877. return;
  878. fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate
  879. fTransportState = jackbridge_transport_query(fClient, &fTransportPos);
  880. fTimeInfo.playing = (fTransportState == JackTransportRolling);
  881. if (fTransportPos.unique_1 == fTransportPos.unique_2)
  882. {
  883. fTimeInfo.frame = fTransportPos.frame;
  884. fTimeInfo.usecs = fTransportPos.usecs;
  885. if (fTransportPos.valid & JackPositionBBT)
  886. {
  887. fTimeInfo.valid = EngineTimeInfo::ValidBBT;
  888. fTimeInfo.bbt.bar = fTransportPos.bar;
  889. fTimeInfo.bbt.beat = fTransportPos.beat;
  890. fTimeInfo.bbt.tick = fTransportPos.tick;
  891. fTimeInfo.bbt.barStartTick = fTransportPos.bar_start_tick;
  892. fTimeInfo.bbt.beatsPerBar = fTransportPos.beats_per_bar;
  893. fTimeInfo.bbt.beatType = fTransportPos.beat_type;
  894. fTimeInfo.bbt.ticksPerBeat = fTransportPos.ticks_per_beat;
  895. fTimeInfo.bbt.beatsPerMinute = fTransportPos.beats_per_minute;
  896. }
  897. else
  898. fTimeInfo.valid = 0x0;
  899. }
  900. else
  901. {
  902. fTimeInfo.frame = 0;
  903. fTimeInfo.valid = 0x0;
  904. }
  905. }
  906. void handleJackProcessCallback(const uint32_t nframes)
  907. {
  908. saveTransportInfo();
  909. if (pData->curPluginCount == 0)
  910. {
  911. #ifndef BUILD_BRIDGE
  912. // pass-through
  913. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  914. {
  915. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes);
  916. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes);
  917. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut1], nframes);
  918. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes);
  919. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes);
  920. FloatVectorOperations::copy(audioOut1, audioIn1, nframes);
  921. FloatVectorOperations::copy(audioOut2, audioIn2, nframes);
  922. jackbridge_midi_clear_buffer(eventOut);
  923. }
  924. #endif
  925. return runPendingRtEvents();
  926. }
  927. #ifdef BUILD_BRIDGE
  928. CarlaPlugin* const plugin(pData->plugins[0].plugin);
  929. if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock())
  930. {
  931. plugin->initBuffers();
  932. processPlugin(plugin, nframes);
  933. plugin->unlock();
  934. }
  935. return runPendingRtEvents();
  936. #else
  937. if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
  938. {
  939. for (unsigned int i=0; i < pData->curPluginCount; ++i)
  940. {
  941. CarlaPlugin* const plugin(pData->plugins[i].plugin);
  942. if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock())
  943. {
  944. plugin->initBuffers();
  945. processPlugin(plugin, nframes);
  946. plugin->unlock();
  947. }
  948. }
  949. return runPendingRtEvents();
  950. }
  951. if (fOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  952. {
  953. // get buffers from jack
  954. float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes);
  955. float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes);
  956. float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut1], nframes);
  957. float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes);
  958. void* const eventIn = jackbridge_port_get_buffer(fRackPorts[kRackPortEventIn], nframes);
  959. void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes);
  960. // assert buffers
  961. CARLA_ASSERT(audioIn1 != nullptr);
  962. CARLA_ASSERT(audioIn2 != nullptr);
  963. CARLA_ASSERT(audioOut1 != nullptr);
  964. CARLA_ASSERT(audioOut2 != nullptr);
  965. CARLA_ASSERT(eventIn != nullptr);
  966. CARLA_ASSERT(eventOut != nullptr);
  967. // create audio buffers
  968. float* inBuf[2] = { audioIn1, audioIn2 };
  969. float* outBuf[2] = { audioOut1, audioOut2 };
  970. // initialize input events
  971. carla_zeroStruct<EngineEvent>(pData->bufEvents.in, kEngineMaxInternalEventCount);
  972. {
  973. uint32_t engineEventIndex = 0;
  974. jack_midi_event_t jackEvent;
  975. const uint32_t jackEventCount(jackbridge_midi_get_event_count(eventIn));
  976. for (uint32_t jackEventIndex=0; jackEventIndex < jackEventCount; ++jackEventIndex)
  977. {
  978. if (! jackbridge_midi_event_get(&jackEvent, eventIn, jackEventIndex))
  979. continue;
  980. EngineEvent* const engineEvent(&pData->bufEvents.in[engineEventIndex++]);
  981. engineEvent->clear();
  982. const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
  983. const uint8_t midiChannel = MIDI_GET_CHANNEL_FROM_DATA(jackEvent.buffer);
  984. engineEvent->time = jackEvent.time;
  985. engineEvent->channel = midiChannel;
  986. if (midiStatus == MIDI_STATUS_CONTROL_CHANGE)
  987. {
  988. CARLA_ASSERT(jackEvent.size == 2 || jackEvent.size == 3);
  989. const uint8_t midiControl = jackEvent.buffer[1];
  990. engineEvent->type = kEngineEventTypeControl;
  991. if (MIDI_IS_CONTROL_BANK_SELECT(midiControl))
  992. {
  993. const uint8_t midiBank = jackEvent.buffer[2];
  994. engineEvent->ctrl.type = kEngineControlEventTypeMidiBank;
  995. engineEvent->ctrl.param = midiBank;
  996. engineEvent->ctrl.value = 0.0f;
  997. }
  998. else if (midiControl == MIDI_CONTROL_ALL_SOUND_OFF)
  999. {
  1000. engineEvent->ctrl.type = kEngineControlEventTypeAllSoundOff;
  1001. engineEvent->ctrl.param = 0;
  1002. engineEvent->ctrl.value = 0.0f;
  1003. }
  1004. else if (midiControl == MIDI_CONTROL_ALL_NOTES_OFF)
  1005. {
  1006. engineEvent->ctrl.type = kEngineControlEventTypeAllNotesOff;
  1007. engineEvent->ctrl.param = 0;
  1008. engineEvent->ctrl.value = 0.0f;
  1009. }
  1010. else
  1011. {
  1012. CARLA_ASSERT(jackEvent.size == 3);
  1013. const uint8_t midiValue = jackEvent.buffer[2];
  1014. engineEvent->ctrl.type = kEngineControlEventTypeParameter;
  1015. engineEvent->ctrl.param = midiControl;
  1016. engineEvent->ctrl.value = float(midiValue)/127.0f;
  1017. }
  1018. }
  1019. else if (midiStatus == MIDI_STATUS_PROGRAM_CHANGE)
  1020. {
  1021. CARLA_ASSERT(jackEvent.size == 2);
  1022. const uint8_t midiProgram = jackEvent.buffer[1];
  1023. engineEvent->type = kEngineEventTypeControl;
  1024. engineEvent->ctrl.type = kEngineControlEventTypeMidiProgram;
  1025. engineEvent->ctrl.param = midiProgram;
  1026. engineEvent->ctrl.value = 0.0f;
  1027. }
  1028. else if (jackEvent.size <= 4)
  1029. {
  1030. engineEvent->type = kEngineEventTypeMidi;
  1031. engineEvent->midi.data[0] = midiStatus;
  1032. engineEvent->midi.size = static_cast<uint8_t>(jackEvent.size);
  1033. if (jackEvent.size > 1)
  1034. carla_copy<uint8_t>(engineEvent->midi.data+1, jackEvent.buffer+1, jackEvent.size-1);
  1035. }
  1036. if (engineEventIndex >= kEngineMaxInternalEventCount)
  1037. break;
  1038. }
  1039. }
  1040. // process rack
  1041. processRack(inBuf, outBuf, nframes);
  1042. // output control
  1043. {
  1044. jackbridge_midi_clear_buffer(eventOut);
  1045. for (unsigned short i=0; i < kEngineMaxInternalEventCount; ++i)
  1046. {
  1047. EngineEvent* const engineEvent = &pData->bufEvents.out[i];
  1048. uint8_t data[3] = { 0 };
  1049. uint8_t size = 0;
  1050. switch (engineEvent->type)
  1051. {
  1052. case kEngineEventTypeNull:
  1053. break;
  1054. case kEngineEventTypeControl:
  1055. {
  1056. EngineControlEvent* const ctrlEvent = &engineEvent->ctrl;
  1057. if (ctrlEvent->type == kEngineControlEventTypeParameter && MIDI_IS_CONTROL_BANK_SELECT(ctrlEvent->param))
  1058. {
  1059. // FIXME?
  1060. ctrlEvent->type = kEngineControlEventTypeMidiBank;
  1061. ctrlEvent->param = ctrlEvent->value;
  1062. ctrlEvent->value = 0.0f;
  1063. }
  1064. switch (ctrlEvent->type)
  1065. {
  1066. case kEngineControlEventTypeNull:
  1067. break;
  1068. case kEngineControlEventTypeParameter:
  1069. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1070. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  1071. data[2] = uint8_t(ctrlEvent->value * 127.0f);
  1072. size = 3;
  1073. break;
  1074. case kEngineControlEventTypeMidiBank:
  1075. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1076. data[1] = MIDI_CONTROL_BANK_SELECT;
  1077. data[2] = static_cast<uint8_t>(ctrlEvent->param);
  1078. size = 3;
  1079. break;
  1080. case kEngineControlEventTypeMidiProgram:
  1081. data[0] = MIDI_STATUS_PROGRAM_CHANGE + engineEvent->channel;
  1082. data[1] = static_cast<uint8_t>(ctrlEvent->param);
  1083. size = 2;
  1084. break;
  1085. case kEngineControlEventTypeAllSoundOff:
  1086. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1087. data[1] = MIDI_CONTROL_ALL_SOUND_OFF;
  1088. size = 2;
  1089. break;
  1090. case kEngineControlEventTypeAllNotesOff:
  1091. data[0] = MIDI_STATUS_CONTROL_CHANGE + engineEvent->channel;
  1092. data[1] = MIDI_CONTROL_ALL_NOTES_OFF;
  1093. size = 2;
  1094. break;
  1095. }
  1096. break;
  1097. }
  1098. case kEngineEventTypeMidi:
  1099. {
  1100. EngineMidiEvent* const midiEvent = &engineEvent->midi;
  1101. data[0] = midiEvent->data[0];
  1102. data[1] = midiEvent->data[1];
  1103. data[2] = midiEvent->data[2];
  1104. size = midiEvent->size;
  1105. break;
  1106. }
  1107. }
  1108. if (size > 0)
  1109. jackbridge_midi_event_write(eventOut, engineEvent->time, data, size);
  1110. }
  1111. }
  1112. return runPendingRtEvents();
  1113. }
  1114. #endif // ! BUILD_BRIDGE
  1115. runPendingRtEvents();
  1116. }
  1117. void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
  1118. {
  1119. if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
  1120. return;
  1121. for (unsigned int i=0; i < pData->curPluginCount; ++i)
  1122. {
  1123. CarlaPlugin* const plugin(pData->plugins[i].plugin);
  1124. if (plugin != nullptr && plugin->isEnabled())
  1125. latencyPlugin(plugin, mode);
  1126. }
  1127. }
  1128. #ifndef BUILD_BRIDGE
  1129. void handleCustomAppearanceCallback(const char* client_name, const char* key, jack_custom_change_t change)
  1130. {
  1131. if ((change == JackCustomAdded || change == JackCustomReplaced) && std::strcmp(key, URI_CANVAS_ICON) == 0)
  1132. {
  1133. const int groupId (getGroupId(client_name));
  1134. if (groupId == -1)
  1135. return;
  1136. fGroupIconsChanged.append(groupId);
  1137. }
  1138. }
  1139. void handleJackClientRegistrationCallback(const char* const name, const bool reg)
  1140. {
  1141. // do nothing on client registration, wait for first port
  1142. if (reg) return;
  1143. const int id(getGroupId(name)); // also checks name nullness
  1144. if (id == -1)
  1145. return;
  1146. GroupNameToId groupNameId(id, name);
  1147. fUsedGroupNames.removeAll(groupNameId);
  1148. callback(CALLBACK_PATCHBAY_CLIENT_REMOVED, 0, id, 0, 0.0f, name);
  1149. }
  1150. void handleJackPortRegistrationCallback(const jack_port_id_t port, const bool reg)
  1151. {
  1152. jack_port_t* const jackPort(jackbridge_port_by_id(fClient, port));
  1153. const char* const portName(jackbridge_port_short_name(jackPort));
  1154. const char* const fullPortName(jackbridge_port_name(jackPort));
  1155. CARLA_ASSERT(jackPort != nullptr);
  1156. CARLA_ASSERT(portName != nullptr);
  1157. CARLA_ASSERT(fullPortName != nullptr);
  1158. if (jackPort == nullptr)
  1159. return;
  1160. if (portName == nullptr)
  1161. return;
  1162. if (fullPortName == nullptr)
  1163. return;
  1164. CarlaString groupName(fullPortName);
  1165. groupName.truncate(groupName.rfind(portName)-1);
  1166. int groupId = getGroupId(groupName);
  1167. if (reg)
  1168. {
  1169. const int jackPortFlags(jackbridge_port_flags(jackPort));
  1170. if (groupId == -1)
  1171. {
  1172. groupId = fLastGroupId++;
  1173. GroupNameToId groupNameToId(groupId, groupName);
  1174. fUsedGroupNames.append(groupNameToId);
  1175. if (jackPortFlags & JackPortIsPhysical)
  1176. {
  1177. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, PATCHBAY_ICON_HARDWARE, 0.0f, groupName);
  1178. }
  1179. else
  1180. {
  1181. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, PATCHBAY_ICON_APPLICATION, 0.0f, groupName);
  1182. fGroupIconsChanged.append(groupId);
  1183. }
  1184. }
  1185. bool portIsInput = (jackPortFlags & JackPortIsInput);
  1186. bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
  1187. bool portIsCV = (jackPortFlags & JackPortIsControlVoltage);
  1188. unsigned int canvasPortFlags = 0x0;
  1189. canvasPortFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
  1190. canvasPortFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
  1191. if (portIsAudio && portIsCV)
  1192. canvasPortFlags |= PATCHBAY_PORT_IS_CV;
  1193. PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName);
  1194. fUsedPortNames.append(portNameToId);
  1195. callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, portNameToId.portId, canvasPortFlags, portName);
  1196. }
  1197. else
  1198. {
  1199. const int portId(getPortId(fullPortName));
  1200. CARLA_ASSERT(groupId != -1);
  1201. CARLA_ASSERT(portId != -1);
  1202. if (groupId == -1 || portId == -1)
  1203. return;
  1204. PortNameToId portNameId(groupId, portId, portName, fullPortName);
  1205. fUsedPortNames.removeOne(portNameId);
  1206. callback(CALLBACK_PATCHBAY_PORT_REMOVED, 0, groupId, portId, 0.0f, portName);
  1207. }
  1208. }
  1209. void handleJackPortConnectCallback(const jack_port_id_t a, const jack_port_id_t b, const bool connect)
  1210. {
  1211. jack_port_t* const jackPortA(jackbridge_port_by_id(fClient, a));
  1212. jack_port_t* const jackPortB(jackbridge_port_by_id(fClient, b));
  1213. const char* const fullPortNameA(jackbridge_port_name(jackPortA));
  1214. const char* const fullPortNameB(jackbridge_port_name(jackPortB));
  1215. CARLA_ASSERT(jackPortA != nullptr);
  1216. CARLA_ASSERT(jackPortB != nullptr);
  1217. CARLA_ASSERT(fullPortNameA != nullptr);
  1218. CARLA_ASSERT(fullPortNameB != nullptr);
  1219. if (jackPortA == nullptr)
  1220. return;
  1221. if (jackPortB == nullptr)
  1222. return;
  1223. if (fullPortNameA == nullptr)
  1224. return;
  1225. if (fullPortNameB == nullptr)
  1226. return;
  1227. const int portIdA(getPortId(fullPortNameA));
  1228. const int portIdB(getPortId(fullPortNameB));
  1229. if (portIdA == -1 || portIdB == -1)
  1230. return;
  1231. if (connect)
  1232. {
  1233. ConnectionToId connectionToId(fLastConnectionId++, portIdA, portIdB);
  1234. fUsedConnections.append(connectionToId);
  1235. callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, connectionToId.id, portIdA, portIdB, nullptr);
  1236. }
  1237. else
  1238. {
  1239. for (NonRtList<ConnectionToId>::Itenerator it = fUsedConnections.begin(); it.valid(); it.next())
  1240. {
  1241. const ConnectionToId& connectionToId(*it);
  1242. if (connectionToId.portOut == portIdA && connectionToId.portIn == portIdB)
  1243. {
  1244. callback(CALLBACK_PATCHBAY_CONNECTION_REMOVED, 0, connectionToId.id, 0, 0.0f, nullptr);
  1245. fUsedConnections.remove(it);
  1246. break;
  1247. }
  1248. }
  1249. }
  1250. }
  1251. void handleJackClientRenameCallback(const char* const oldName, const char* const newName)
  1252. {
  1253. for (NonRtList<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
  1254. {
  1255. GroupNameToId& groupNameToId(*it);
  1256. if (std::strcmp(groupNameToId.name, oldName) == 0)
  1257. {
  1258. groupNameToId.rename(newName);
  1259. callback(CALLBACK_PATCHBAY_CLIENT_RENAMED, 0, groupNameToId.id, 0, 0.0f, newName);
  1260. break;
  1261. }
  1262. }
  1263. }
  1264. void handleJackPortRenameCallback(const jack_port_id_t port, const char* const oldName, const char* const newName)
  1265. {
  1266. jack_port_t* const jackPort(jackbridge_port_by_id(fClient, port));
  1267. const char* const portName(jackbridge_port_short_name(jackPort));
  1268. CARLA_ASSERT(jackPort != nullptr);
  1269. CARLA_ASSERT(portName != nullptr);
  1270. if (jackPort == nullptr)
  1271. return;
  1272. if (portName == nullptr)
  1273. return;
  1274. CarlaString groupName(newName);
  1275. groupName.truncate(groupName.rfind(portName)-1);
  1276. const int groupId(getGroupId(groupName));
  1277. CARLA_ASSERT(groupId != -1);
  1278. if (groupId == -1)
  1279. return;
  1280. for (NonRtList<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
  1281. {
  1282. PortNameToId& portNameId(*it);
  1283. if (std::strcmp(portNameId.fullName, oldName) == 0)
  1284. {
  1285. CARLA_ASSERT(portNameId.groupId == groupId);
  1286. portNameId.rename(portName, newName);
  1287. callback(CALLBACK_PATCHBAY_PORT_RENAMED, 0, groupId, portNameId.portId, 0.0f, newName);
  1288. break;
  1289. }
  1290. }
  1291. }
  1292. #endif
  1293. void handleJackShutdownCallback()
  1294. {
  1295. for (unsigned int i=0; i < pData->curPluginCount; ++i)
  1296. {
  1297. //CarlaPlugin* const plugin(pData->plugins[i].plugin);
  1298. //if (plugin)
  1299. // plugin->x_client = nullptr;
  1300. }
  1301. fClient = nullptr;
  1302. callback(CALLBACK_QUIT, 0, 0, 0, 0.0f, nullptr);
  1303. }
  1304. // -------------------------------------------------------------------
  1305. private:
  1306. jack_client_t* fClient;
  1307. jack_position_t fTransportPos;
  1308. jack_transport_state_t fTransportState;
  1309. bool fFreewheel;
  1310. // -------------------------------------------------------------------
  1311. #ifdef BUILD_BRIDGE
  1312. bool fHasQuit;
  1313. #else
  1314. enum RackPorts {
  1315. kRackPortAudioIn1 = 0,
  1316. kRackPortAudioIn2 = 1,
  1317. kRackPortAudioOut1 = 2,
  1318. kRackPortAudioOut2 = 3,
  1319. kRackPortEventIn = 4,
  1320. kRackPortEventOut = 5,
  1321. kRackPortCount = 6
  1322. };
  1323. jack_port_t* fRackPorts[kRackPortCount];
  1324. struct GroupNameToId {
  1325. int id;
  1326. char name[STR_MAX+1];
  1327. GroupNameToId()
  1328. {
  1329. id = -1;
  1330. name[0] = '\0';
  1331. }
  1332. GroupNameToId(const int id, const char name[])
  1333. {
  1334. this->id = id;
  1335. std::strncpy(this->name, name, STR_MAX);
  1336. this->name[STR_MAX] = '\0';
  1337. }
  1338. void rename(const char name[])
  1339. {
  1340. std::strncpy(this->name, name, STR_MAX);
  1341. this->name[STR_MAX] = '\0';
  1342. }
  1343. bool operator==(const GroupNameToId& groupNameId)
  1344. {
  1345. if (groupNameId.id != id)
  1346. return false;
  1347. if (std::strcmp(groupNameId.name, name) != 0)
  1348. return false;
  1349. return true;
  1350. }
  1351. };
  1352. struct PortNameToId {
  1353. int groupId;
  1354. int portId;
  1355. char name[STR_MAX+1];
  1356. char fullName[STR_MAX+1]; // unique
  1357. PortNameToId()
  1358. {
  1359. groupId = -1;
  1360. portId = -1;
  1361. name[0] = '\0';
  1362. fullName[0] = '\0';
  1363. }
  1364. PortNameToId(const int groupId, const int portId, const char name[], const char fullName[])
  1365. {
  1366. this->groupId = groupId;
  1367. this->portId = portId;
  1368. std::strncpy(this->name, name, STR_MAX);
  1369. this->name[STR_MAX] = '\0';
  1370. std::strncpy(this->fullName, fullName, STR_MAX);
  1371. this->fullName[STR_MAX] = '\0';
  1372. }
  1373. void rename(const char name[], const char fullName[])
  1374. {
  1375. std::strncpy(this->name, name, STR_MAX);
  1376. this->name[STR_MAX] = '\0';
  1377. std::strncpy(this->fullName, fullName, STR_MAX);
  1378. this->fullName[STR_MAX] = '\0';
  1379. }
  1380. bool operator==(const PortNameToId& portNameId)
  1381. {
  1382. if (portNameId.groupId != groupId)
  1383. return false;
  1384. if (portNameId.portId != portId)
  1385. return false;
  1386. if (std::strcmp(portNameId.name, name) != 0)
  1387. return false;
  1388. if (std::strcmp(portNameId.fullName, fullName) != 0)
  1389. return false;
  1390. return true;
  1391. }
  1392. };
  1393. struct ConnectionToId {
  1394. int id;
  1395. int portOut;
  1396. int portIn;
  1397. ConnectionToId()
  1398. {
  1399. id = -1;
  1400. portOut = -1;
  1401. portIn = -1;
  1402. }
  1403. ConnectionToId(const int id, const int portOut, const int portIn)
  1404. {
  1405. this->id = id;
  1406. this->portOut = portOut;
  1407. this->portIn = portIn;
  1408. }
  1409. bool operator==(const ConnectionToId& connectionId)
  1410. {
  1411. if (connectionId.id != id)
  1412. return false;
  1413. if (connectionId.portOut != portOut)
  1414. return false;
  1415. if (connectionId.portIn != portIn)
  1416. return false;
  1417. return true;
  1418. }
  1419. };
  1420. int fLastGroupId;
  1421. int fLastPortId;
  1422. int fLastConnectionId;
  1423. NonRtList<GroupNameToId> fUsedGroupNames;
  1424. NonRtList<PortNameToId> fUsedPortNames;
  1425. NonRtList<ConnectionToId> fUsedConnections;
  1426. NonRtList<int> fGroupIconsChanged;
  1427. int getGroupId(const char* const name)
  1428. {
  1429. CARLA_ASSERT(name != nullptr);
  1430. if (name == nullptr)
  1431. return -1;
  1432. for (NonRtList<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
  1433. {
  1434. const GroupNameToId& groupNameId(*it);
  1435. if (std::strcmp(groupNameId.name, name) == 0)
  1436. return groupNameId.id;
  1437. }
  1438. return -1;
  1439. }
  1440. const char* getGroupName(const int groupId)
  1441. {
  1442. CARLA_ASSERT(groupId >= 0);
  1443. static const char fallback[1] = { '\0' };
  1444. if (groupId < 0)
  1445. return fallback;
  1446. for (NonRtList<GroupNameToId>::Itenerator it = fUsedGroupNames.begin(); it.valid(); it.next())
  1447. {
  1448. const GroupNameToId& groupNameId(*it);
  1449. if (groupNameId.id == groupId)
  1450. return groupNameId.name;
  1451. }
  1452. return fallback;
  1453. }
  1454. int getPortId(const char* const fullName)
  1455. {
  1456. CARLA_ASSERT(fullName != nullptr);
  1457. if (fullName == nullptr)
  1458. return -1;
  1459. for (NonRtList<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
  1460. {
  1461. const PortNameToId& portNameId(*it);
  1462. if (std::strcmp(portNameId.fullName, fullName) == 0)
  1463. return portNameId.portId;
  1464. }
  1465. return -1;
  1466. }
  1467. void getFullPortName(const int portId, char nameBuf[STR_MAX+1])
  1468. {
  1469. for (NonRtList<PortNameToId>::Itenerator it = fUsedPortNames.begin(); it.valid(); it.next())
  1470. {
  1471. const PortNameToId& portNameId(*it);
  1472. if (portNameId.portId == portId)
  1473. {
  1474. std::strncpy(nameBuf, portNameId.fullName, STR_MAX);
  1475. nameBuf[STR_MAX] = '\0';
  1476. return;
  1477. }
  1478. }
  1479. nameBuf[0] = '\0';
  1480. }
  1481. void initJackPatchbay(const char* const ourName)
  1482. {
  1483. CARLA_ASSERT(fLastGroupId == 0);
  1484. CARLA_ASSERT(fLastPortId == 0);
  1485. CARLA_ASSERT(fLastConnectionId == 0);
  1486. CARLA_ASSERT(ourName != nullptr);
  1487. using namespace juce;
  1488. // query initial jack ports
  1489. StringArray parsedGroups;
  1490. // our client
  1491. if (ourName != nullptr)
  1492. {
  1493. parsedGroups.add(String(ourName));
  1494. GroupNameToId groupNameToId(fLastGroupId++, ourName);
  1495. fUsedGroupNames.append(groupNameToId);
  1496. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupNameToId.id, PATCHBAY_ICON_CARLA, 0.0f, ourName);
  1497. }
  1498. if (const char** ports = jackbridge_get_ports(fClient, nullptr, nullptr, 0))
  1499. {
  1500. for (int i=0; ports[i] != nullptr; ++i)
  1501. {
  1502. jack_port_t* const jackPort(jackbridge_port_by_name(fClient, ports[i]));
  1503. const char* const portName(jackbridge_port_short_name(jackPort));
  1504. const char* const fullPortName(ports[i]);
  1505. CARLA_SAFE_ASSERT_CONTINUE(jackPort != nullptr);
  1506. CARLA_SAFE_ASSERT_CONTINUE(portName != nullptr);
  1507. const int jackPortFlags(jackbridge_port_flags(jackPort));
  1508. int groupId = -1;
  1509. CarlaString groupName(fullPortName);
  1510. groupName.truncate(groupName.rfind(portName)-1);
  1511. String qGroupName(groupName);
  1512. if (parsedGroups.contains(qGroupName))
  1513. {
  1514. groupId = getGroupId(groupName);
  1515. CARLA_ASSERT(groupId != -1);
  1516. }
  1517. else
  1518. {
  1519. groupId = fLastGroupId++;
  1520. parsedGroups.add(qGroupName);
  1521. GroupNameToId groupNameToId(groupId, groupName);
  1522. fUsedGroupNames.append(groupNameToId);
  1523. PatchbayIconType groupIcon = PATCHBAY_ICON_APPLICATION;
  1524. void* data = nullptr;
  1525. size_t dataSize = 0;
  1526. if (jackPortFlags & JackPortIsPhysical)
  1527. {
  1528. groupIcon = PATCHBAY_ICON_HARDWARE;
  1529. }
  1530. else if (jackbridge_custom_get_data(fClient, groupName, URI_CANVAS_ICON, &data, &dataSize) && data != nullptr && dataSize != 0)
  1531. {
  1532. const char* const icon((const char*)data);
  1533. CARLA_ASSERT(std::strlen(icon)+1 == dataSize);
  1534. if (std::strcmp(icon, "app") == 0 || std::strcmp(icon, "application") == 0)
  1535. groupIcon = PATCHBAY_ICON_APPLICATION;
  1536. else if (std::strcmp(icon, "hardware") == 0)
  1537. groupIcon = PATCHBAY_ICON_HARDWARE;
  1538. else if (std::strcmp(icon, "carla") == 0)
  1539. groupIcon = PATCHBAY_ICON_CARLA;
  1540. else if (std::strcmp(icon, "distrho") == 0)
  1541. groupIcon = PATCHBAY_ICON_DISTRHO;
  1542. else if (std::strcmp(icon, "file") == 0)
  1543. groupIcon = PATCHBAY_ICON_FILE;
  1544. else if (std::strcmp(icon, "plugin") == 0)
  1545. groupIcon = PATCHBAY_ICON_PLUGIN;
  1546. }
  1547. callback(CALLBACK_PATCHBAY_CLIENT_ADDED, 0, groupId, groupIcon, 0.0f, groupName);
  1548. }
  1549. bool portIsInput = (jackPortFlags & JackPortIsInput);
  1550. bool portIsAudio = (std::strcmp(jackbridge_port_type(jackPort), JACK_DEFAULT_AUDIO_TYPE) == 0);
  1551. bool portIsCV = (jackPortFlags & JackPortIsControlVoltage);
  1552. unsigned int canvasPortFlags = 0x0;
  1553. canvasPortFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
  1554. canvasPortFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
  1555. if (portIsAudio && portIsCV)
  1556. canvasPortFlags |= PATCHBAY_PORT_IS_CV;
  1557. PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName);
  1558. fUsedPortNames.append(portNameToId);
  1559. callback(CALLBACK_PATCHBAY_PORT_ADDED, 0, groupId, portNameToId.portId, canvasPortFlags, portName);
  1560. }
  1561. #if 0
  1562. jackbridge_free(ports);
  1563. }
  1564. // query connections, after all ports are in place
  1565. if (const char** ports = jackbridge_get_ports(fClient, nullptr, nullptr, JackPortIsOutput))
  1566. {
  1567. #endif
  1568. for (int i=0; ports[i] != nullptr; ++i)
  1569. {
  1570. jack_port_t* const jackPort(jackbridge_port_by_name(fClient, ports[i]));
  1571. const char* const fullPortName(ports[i]);
  1572. CARLA_SAFE_ASSERT_CONTINUE(jackPort != nullptr);
  1573. #if 1
  1574. const int jackPortFlags(jackbridge_port_flags(jackPort));
  1575. if (jackPortFlags & JackPortIsInput)
  1576. continue;
  1577. #endif
  1578. const int thisPortId(getPortId(fullPortName));
  1579. if (thisPortId == -1)
  1580. continue;
  1581. if (const char** connections = jackbridge_port_get_connections(jackPort))
  1582. {
  1583. for (int j=0; connections[j] != nullptr; ++j)
  1584. {
  1585. const int targetPortId(getPortId(connections[j]));
  1586. ConnectionToId connectionToId(fLastConnectionId++, thisPortId, targetPortId);
  1587. fUsedConnections.append(connectionToId);
  1588. callback(CALLBACK_PATCHBAY_CONNECTION_ADDED, 0, connectionToId.id, thisPortId, targetPortId, nullptr);
  1589. }
  1590. jackbridge_free(connections);
  1591. }
  1592. else
  1593. carla_stderr("jack_port_get_connections failed for port %s", fullPortName);
  1594. }
  1595. jackbridge_free(ports);
  1596. }
  1597. }
  1598. #endif
  1599. // -------------------------------------
  1600. void processPlugin(CarlaPlugin* const plugin, const uint32_t nframes)
  1601. {
  1602. const uint32_t inCount(plugin->getAudioInCount());
  1603. const uint32_t outCount(plugin->getAudioOutCount());
  1604. float* inBuffer[inCount];
  1605. float* outBuffer[outCount];
  1606. float inPeaks[2] = { 0.0f };
  1607. float outPeaks[2] = { 0.0f };
  1608. for (uint32_t i=0; i < inCount; ++i)
  1609. {
  1610. CarlaEngineAudioPort* const port(plugin->getAudioInPort(i));
  1611. inBuffer[i] = port->getBuffer();
  1612. }
  1613. for (uint32_t i=0; i < outCount; ++i)
  1614. {
  1615. CarlaEngineAudioPort* const port(plugin->getAudioOutPort(i));
  1616. outBuffer[i] = port->getBuffer();
  1617. }
  1618. for (uint32_t i=0; i < inCount && i < 2; ++i)
  1619. {
  1620. for (uint32_t j=0; j < nframes; ++j)
  1621. {
  1622. const float absV(std::abs(inBuffer[i][j]));
  1623. if (absV > inPeaks[i])
  1624. inPeaks[i] = absV;
  1625. }
  1626. }
  1627. plugin->process(inBuffer, outBuffer, nframes);
  1628. for (uint32_t i=0; i < outCount && i < 2; ++i)
  1629. {
  1630. for (uint32_t j=0; j < nframes; ++j)
  1631. {
  1632. const float absV(std::abs(outBuffer[i][j]));
  1633. if (absV > outPeaks[i])
  1634. outPeaks[i] = absV;
  1635. }
  1636. }
  1637. setPluginPeaks(plugin->getId(), inPeaks, outPeaks);
  1638. }
  1639. void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode)
  1640. {
  1641. //const uint32_t inCount(plugin->audioInCount());
  1642. //const uint32_t outCount(plugin->audioOutCount());
  1643. const uint32_t latency(plugin->getLatencyInFrames());
  1644. if (latency == 0)
  1645. return;
  1646. //jack_latency_range_t range;
  1647. // TODO
  1648. if (mode == JackCaptureLatency)
  1649. {
  1650. #if 0
  1651. for (uint32_t i=0; i < inCount; ++i)
  1652. {
  1653. uint32_t aOutI = (i >= outCount) ? outCount : i;
  1654. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, i))->kPort;
  1655. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, aOutI))->kPort;
  1656. jackbridge_port_get_latency_range(portIn, mode, &range);
  1657. range.min += latency;
  1658. range.max += latency;
  1659. jackbridge_port_set_latency_range(portOut, mode, &range);
  1660. }
  1661. #endif
  1662. }
  1663. else
  1664. {
  1665. #if 0
  1666. for (uint32_t i=0; i < outCount; ++i)
  1667. {
  1668. uint32_t aInI = (i >= inCount) ? inCount : i;
  1669. jack_port_t* const portIn = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioInPort(plugin, aInI))->kPort;
  1670. jack_port_t* const portOut = ((CarlaEngineJackAudioPort*)CarlaPluginGetAudioOutPort(plugin, i))->kPort;
  1671. jackbridge_port_get_latency_range(portOut, mode, &range);
  1672. range.min += latency;
  1673. range.max += latency;
  1674. jackbridge_port_set_latency_range(portIn, mode, &range);
  1675. }
  1676. #endif
  1677. }
  1678. }
  1679. // -------------------------------------
  1680. #define handlePtr ((CarlaEngineJack*)arg)
  1681. static int carla_jack_bufsize_callback(jack_nframes_t newBufferSize, void* arg)
  1682. {
  1683. handlePtr->handleJackBufferSizeCallback(newBufferSize);
  1684. return 0;
  1685. }
  1686. static int carla_jack_srate_callback(jack_nframes_t newSampleRate, void* arg)
  1687. {
  1688. handlePtr->handleJackSampleRateCallback(newSampleRate);
  1689. return 0;
  1690. }
  1691. static void carla_jack_freewheel_callback(int starting, void* arg)
  1692. {
  1693. handlePtr->handleJackFreewheelCallback(bool(starting));
  1694. }
  1695. static int carla_jack_process_callback(jack_nframes_t nframes, void* arg)
  1696. {
  1697. handlePtr->handleJackProcessCallback(nframes);
  1698. return 0;
  1699. }
  1700. static void carla_jack_latency_callback(jack_latency_callback_mode_t mode, void* arg)
  1701. {
  1702. handlePtr->handleJackLatencyCallback(mode);
  1703. }
  1704. #ifndef BUILD_BRIDGE
  1705. static void carla_jack_custom_appearance_callback(const char* client_name, const char* key, jack_custom_change_t change, void* arg)
  1706. {
  1707. handlePtr->handleCustomAppearanceCallback(client_name, key, change);
  1708. }
  1709. static void carla_jack_client_registration_callback(const char* name, int reg, void* arg)
  1710. {
  1711. handlePtr->handleJackClientRegistrationCallback(name, (reg != 0));
  1712. }
  1713. static void carla_jack_port_registration_callback(jack_port_id_t port, int reg, void* arg)
  1714. {
  1715. handlePtr->handleJackPortRegistrationCallback(port, (reg != 0));
  1716. }
  1717. static void carla_jack_port_connect_callback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg)
  1718. {
  1719. handlePtr->handleJackPortConnectCallback(a, b, (connect != 0));
  1720. }
  1721. static int carla_jack_client_rename_callback(const char* oldName, const char* newName, void* arg)
  1722. {
  1723. handlePtr->handleJackClientRenameCallback(oldName, newName);
  1724. return 0;
  1725. }
  1726. static int carla_jack_port_rename_callback(jack_port_id_t port, const char* oldName, const char* newName, void* arg)
  1727. {
  1728. handlePtr->handleJackPortRenameCallback(port, oldName, newName);
  1729. return 0;
  1730. }
  1731. #endif
  1732. static void carla_jack_shutdown_callback(void* arg)
  1733. {
  1734. handlePtr->handleJackShutdownCallback();
  1735. }
  1736. #undef handlePtr
  1737. // -------------------------------------------------------------------
  1738. #ifndef BUILD_BRIDGE
  1739. static int carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg)
  1740. {
  1741. CarlaPlugin* const plugin((CarlaPlugin*)arg);
  1742. if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock())
  1743. {
  1744. CarlaEngineJack* const engine((CarlaEngineJack*)plugin->getEngine());
  1745. CARLA_SAFE_ASSERT_RETURN(engine != nullptr,0);
  1746. plugin->initBuffers();
  1747. engine->saveTransportInfo();
  1748. engine->processPlugin(plugin, nframes);
  1749. plugin->unlock();
  1750. }
  1751. return 0;
  1752. }
  1753. static void carla_jack_latency_callback_plugin(jack_latency_callback_mode_t mode, void* arg)
  1754. {
  1755. CarlaPlugin* const plugin((CarlaPlugin*)arg);
  1756. if (plugin != nullptr && plugin->isEnabled())
  1757. {
  1758. CarlaEngineJack* const engine((CarlaEngineJack*)plugin->getEngine());
  1759. CARLA_SAFE_ASSERT_RETURN(engine != nullptr,);
  1760. engine->latencyPlugin(plugin, mode);
  1761. }
  1762. }
  1763. #endif
  1764. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJack)
  1765. };
  1766. // -----------------------------------------------------------------------
  1767. CarlaEngine* CarlaEngine::newJack()
  1768. {
  1769. carla_debug("CarlaEngine::newJack()");
  1770. return new CarlaEngineJack();
  1771. }
  1772. // -----------------------------------------------------------------------
  1773. CARLA_BACKEND_END_NAMESPACE