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.

1653 lines
49KB

  1. /*
  2. * Carla JACK API for external applications
  3. * Copyright (C) 2016-2017 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. // need to include this first
  18. #include "CarlaDefines.h"
  19. // then define this for bridge utils
  20. #define BUILD_BRIDGE 1
  21. // now include a bunch of stuff
  22. #include "CarlaBackendUtils.hpp"
  23. #include "CarlaBridgeUtils.hpp"
  24. #include "CarlaMIDI.h"
  25. #include "CarlaMutex.hpp"
  26. #include "LinkedList.hpp"
  27. #include "AppConfig.h"
  28. #include "juce_core/juce_core.h"
  29. #ifdef __SSE2_MATH__
  30. # include <xmmintrin.h>
  31. #endif
  32. #if 0
  33. #include <jack/jack.h>
  34. #include <jack/midiport.h>
  35. #include <jack/transport.h>
  36. #include <jack/session.h>
  37. #include <jack/metadata.h>
  38. #endif
  39. // must be last
  40. #include "jackbridge/JackBridge.hpp"
  41. // small check to not hurt myself
  42. #ifdef JACKBRIDGE_DIRECT
  43. # error "Cannot create custom jack server while linking to libjack directly"
  44. #endif
  45. using juce::File;
  46. using juce::MemoryBlock;
  47. using juce::String;
  48. using juce::Time;
  49. using juce::Thread;
  50. CARLA_BACKEND_START_NAMESPACE
  51. // --------------------------------------------------------------------------------------------------------------------
  52. struct JackPortState {
  53. char* name;
  54. char* fullname;
  55. void* buffer;
  56. uint index;
  57. uint flags;
  58. bool isSystem;
  59. JackPortState()
  60. : name(nullptr),
  61. fullname(nullptr),
  62. buffer(nullptr),
  63. index(0),
  64. flags(0),
  65. isSystem(false) {}
  66. JackPortState(const char* const cn, const char* const pn, const uint i, const uint f, const bool sys)
  67. : name(strdup(pn)),
  68. fullname(nullptr),
  69. buffer(nullptr),
  70. index(i),
  71. flags(f),
  72. isSystem(sys)
  73. {
  74. char strBuf[STR_MAX+1];
  75. snprintf(strBuf, STR_MAX, "%s:%s", cn, pn);
  76. strBuf[STR_MAX] = '\0';
  77. fullname = strdup(strBuf);
  78. }
  79. ~JackPortState()
  80. {
  81. free(name);
  82. free(fullname);
  83. }
  84. };
  85. struct JackClientState {
  86. bool activated;
  87. bool prematurelyActivated;
  88. char* name;
  89. uint32_t bufferSize;
  90. double sampleRate;
  91. bool playing;
  92. jack_position_t position;
  93. LinkedList<JackPortState*> audioIns;
  94. LinkedList<JackPortState*> audioOuts;
  95. uint32_t fakeIns, fakeOuts;
  96. LinkedList<JackPortState> midiIns;
  97. LinkedList<JackPortState> midiOuts;
  98. JackProcessCallback process;
  99. void* processPtr;
  100. JackShutdownCallback shutdown;
  101. void* shutdownPtr;
  102. JackClientState()
  103. : activated(false),
  104. prematurelyActivated(false),
  105. name(nullptr),
  106. bufferSize(0),
  107. sampleRate(0.0),
  108. playing(false),
  109. audioIns(),
  110. audioOuts(),
  111. fakeIns(0),
  112. fakeOuts(0),
  113. midiIns(),
  114. midiOuts(),
  115. process(nullptr),
  116. processPtr(nullptr),
  117. shutdown(nullptr),
  118. shutdownPtr(nullptr)
  119. {
  120. carla_zeroStruct(position);
  121. }
  122. ~JackClientState()
  123. {
  124. free(name);
  125. }
  126. };
  127. class CarlaJackClient : public Thread
  128. {
  129. public:
  130. JackClientState fState;
  131. CarlaJackClient(const char* const audioPoolBaseName, const char* const rtClientBaseName, const char* const nonRtClientBaseName, const char* const nonRtServerBaseName)
  132. : Thread("CarlaJackClient"),
  133. fState(),
  134. fShmAudioPool(),
  135. fShmRtClientControl(),
  136. fShmNonRtClientControl(),
  137. fShmNonRtServerControl(),
  138. fBaseNameAudioPool(audioPoolBaseName),
  139. fBaseNameRtClientControl(rtClientBaseName),
  140. fBaseNameNonRtClientControl(nonRtClientBaseName),
  141. fBaseNameNonRtServerControl(nonRtServerBaseName),
  142. fIsOffline(false),
  143. fFirstIdle(true),
  144. fLastPingTime(-1),
  145. fAudioIns(0),
  146. fAudioOuts(0)
  147. {
  148. carla_debug("CarlaJackClient::CarlaJackClient(\"%s\", \"%s\", \"%s\", \"%s\")", audioPoolBaseName, rtClientBaseName, nonRtClientBaseName, nonRtServerBaseName);
  149. }
  150. ~CarlaJackClient() noexcept override
  151. {
  152. carla_debug("CarlaJackClient::~CarlaJackClient()");
  153. clear();
  154. }
  155. bool init(const char* const clientName)
  156. {
  157. carla_debug("CarlaJackClient::init(\"%s\")", clientName);
  158. if (! fShmAudioPool.attachClient(fBaseNameAudioPool))
  159. {
  160. carla_stderr("Failed to attach to audio pool shared memory");
  161. return false;
  162. }
  163. if (! fShmRtClientControl.attachClient(fBaseNameRtClientControl))
  164. {
  165. clear();
  166. carla_stderr("Failed to attach to rt client control shared memory");
  167. return false;
  168. }
  169. if (! fShmRtClientControl.mapData())
  170. {
  171. clear();
  172. carla_stderr("Failed to map rt client control shared memory");
  173. return false;
  174. }
  175. if (! fShmNonRtClientControl.attachClient(fBaseNameNonRtClientControl))
  176. {
  177. clear();
  178. carla_stderr("Failed to attach to non-rt client control shared memory");
  179. return false;
  180. }
  181. if (! fShmNonRtClientControl.mapData())
  182. {
  183. clear();
  184. carla_stderr("Failed to map non-rt control client shared memory");
  185. return false;
  186. }
  187. if (! fShmNonRtServerControl.attachClient(fBaseNameNonRtServerControl))
  188. {
  189. clear();
  190. carla_stderr("Failed to attach to non-rt server control shared memory");
  191. return false;
  192. }
  193. if (! fShmNonRtServerControl.mapData())
  194. {
  195. clear();
  196. carla_stderr("Failed to map non-rt control server shared memory");
  197. return false;
  198. }
  199. PluginBridgeNonRtClientOpcode opcode;
  200. opcode = fShmNonRtClientControl.readOpcode();
  201. CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientNull, opcode);
  202. const uint32_t shmRtClientDataSize = fShmNonRtClientControl.readUInt();
  203. CARLA_SAFE_ASSERT_INT2(shmRtClientDataSize == sizeof(BridgeRtClientData), shmRtClientDataSize, sizeof(BridgeRtClientData));
  204. const uint32_t shmNonRtClientDataSize = fShmNonRtClientControl.readUInt();
  205. CARLA_SAFE_ASSERT_INT2(shmNonRtClientDataSize == sizeof(BridgeNonRtClientData), shmNonRtClientDataSize, sizeof(BridgeNonRtClientData));
  206. const uint32_t shmNonRtServerDataSize = fShmNonRtClientControl.readUInt();
  207. CARLA_SAFE_ASSERT_INT2(shmNonRtServerDataSize == sizeof(BridgeNonRtServerData), shmNonRtServerDataSize, sizeof(BridgeNonRtServerData));
  208. if (shmRtClientDataSize != sizeof(BridgeRtClientData) || shmNonRtClientDataSize != sizeof(BridgeNonRtClientData) || shmNonRtServerDataSize != sizeof(BridgeNonRtServerData))
  209. {
  210. carla_stderr2("CarlaJackClient: data size mismatch");
  211. return false;
  212. }
  213. opcode = fShmNonRtClientControl.readOpcode();
  214. CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetBufferSize, opcode);
  215. fState.bufferSize = fShmNonRtClientControl.readUInt();
  216. opcode = fShmNonRtClientControl.readOpcode();
  217. CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetSampleRate, opcode);
  218. fState.sampleRate = fShmNonRtClientControl.readDouble();
  219. if (fState.bufferSize == 0 || carla_isZero(fState.sampleRate))
  220. {
  221. carla_stderr2("CarlaJackClient: invalid empty state");
  222. return false;
  223. }
  224. fState.name = strdup(clientName);
  225. // tell backend we're live
  226. {
  227. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  228. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPong);
  229. fShmNonRtServerControl.commitWrite();
  230. }
  231. startThread(10);
  232. return true;
  233. }
  234. bool close()
  235. {
  236. carla_debug("CarlaEnginePlugin::close()");
  237. fLastPingTime = -1;
  238. stopThread(5000);
  239. clear();
  240. for (LinkedList<JackPortState*>::Itenerator it = fState.audioIns.begin2(); it.valid(); it.next())
  241. {
  242. if (JackPortState* const jport = it.getValue(nullptr))
  243. delete jport;
  244. }
  245. for (LinkedList<JackPortState*>::Itenerator it = fState.audioOuts.begin2(); it.valid(); it.next())
  246. {
  247. if (JackPortState* const jport = it.getValue(nullptr))
  248. delete jport;
  249. }
  250. fState.audioIns.clear();
  251. fState.audioOuts.clear();
  252. return true;
  253. }
  254. void clear() noexcept
  255. {
  256. fShmAudioPool.clear();
  257. fShmRtClientControl.clear();
  258. fShmNonRtClientControl.clear();
  259. fShmNonRtServerControl.clear();
  260. }
  261. void activate()
  262. {
  263. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  264. const bool wasFirstIdle(fFirstIdle);
  265. if (wasFirstIdle)
  266. {
  267. fFirstIdle = false;
  268. fLastPingTime = Time::currentTimeMillis();
  269. CARLA_SAFE_ASSERT(fLastPingTime > 0);
  270. if (fState.audioIns.count() == 0 && fState.audioOuts.count() == 0)
  271. {
  272. carla_stderr("Create 2 ins, 2 outs prematurely for the client");
  273. fState.audioIns.append(new JackPortState(fState.name, "in_1", 0, JackPortIsOutput, false));
  274. fState.audioIns.append(new JackPortState(fState.name, "in_2", 1, JackPortIsOutput, false));
  275. fState.fakeIns = 2;
  276. fState.audioOuts.append(new JackPortState(fState.name, "out_1", 0, JackPortIsInput, false));
  277. fState.audioOuts.append(new JackPortState(fState.name, "out_2", 1, JackPortIsInput, false));
  278. fState.fakeOuts = 2;
  279. fState.prematurelyActivated = true;
  280. }
  281. char bufStr[STR_MAX+1];
  282. uint32_t bufStrSize;
  283. // kPluginBridgeNonRtServerPluginInfo1
  284. {
  285. // uint/category, uint/hints, uint/optionsAvailable, uint/optionsEnabled, long/uniqueId
  286. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPluginInfo1);
  287. fShmNonRtServerControl.writeUInt(PLUGIN_CATEGORY_NONE);
  288. fShmNonRtServerControl.writeUInt(0x0);
  289. fShmNonRtServerControl.writeUInt(0x0);
  290. fShmNonRtServerControl.writeUInt(0x0);
  291. fShmNonRtServerControl.writeLong(0);
  292. fShmNonRtServerControl.commitWrite();
  293. }
  294. // kPluginBridgeNonRtServerPluginInfo2
  295. {
  296. // uint/size, str[] (realName), uint/size, str[] (label), uint/size, str[] (maker), uint/size, str[] (copyright)
  297. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPluginInfo2);
  298. carla_zeroChars(bufStr, STR_MAX);
  299. std::strncpy(bufStr, fState.name, 64);
  300. bufStrSize = carla_fixedValue(1U, 64U, static_cast<uint32_t>(std::strlen(bufStr)));
  301. fShmNonRtServerControl.writeUInt(bufStrSize);
  302. fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);
  303. carla_zeroChars(bufStr, STR_MAX);
  304. bufStrSize = 1;
  305. fShmNonRtServerControl.writeUInt(bufStrSize);
  306. fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);
  307. fShmNonRtServerControl.writeUInt(bufStrSize);
  308. fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);
  309. fShmNonRtServerControl.writeUInt(bufStrSize);
  310. fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);
  311. fShmNonRtServerControl.commitWrite();
  312. }
  313. // kPluginBridgeNonRtServerAudioCount
  314. {
  315. const uint32_t aIns = fState.audioIns.count();
  316. const uint32_t aOuts = fState.audioOuts.count();
  317. // uint/ins, uint/outs
  318. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerAudioCount);
  319. fShmNonRtServerControl.writeUInt(aIns);
  320. fShmNonRtServerControl.writeUInt(aOuts);
  321. fShmNonRtServerControl.commitWrite();
  322. // kPluginBridgeNonRtServerPortName
  323. for (uint32_t i=0; i<aIns; ++i)
  324. {
  325. const JackPortState* const jport(fState.audioIns.getAt(i, nullptr));
  326. CARLA_SAFE_ASSERT_CONTINUE(jport != nullptr);
  327. const char* const portName(jport->name);
  328. CARLA_SAFE_ASSERT_CONTINUE(portName != nullptr && portName[0] != '\0');
  329. // byte/type, uint/index, uint/size, str[] (name)
  330. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPortName);
  331. fShmNonRtServerControl.writeByte(kPluginBridgePortAudioInput);
  332. fShmNonRtServerControl.writeUInt(i);
  333. bufStrSize = static_cast<uint32_t>(std::strlen(portName));
  334. fShmNonRtServerControl.writeUInt(bufStrSize);
  335. fShmNonRtServerControl.writeCustomData(portName, bufStrSize);
  336. }
  337. // kPluginBridgeNonRtServerPortName
  338. for (uint32_t i=0; i<aOuts; ++i)
  339. {
  340. const JackPortState* const jport(fState.audioOuts.getAt(i, nullptr));
  341. CARLA_SAFE_ASSERT_CONTINUE(jport != nullptr);
  342. const char* const portName(jport->name);
  343. CARLA_SAFE_ASSERT_CONTINUE(portName != nullptr && portName[0] != '\0');
  344. // byte/type, uint/index, uint/size, str[] (name)
  345. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPortName);
  346. fShmNonRtServerControl.writeByte(kPluginBridgePortAudioOutput);
  347. fShmNonRtServerControl.writeUInt(i);
  348. bufStrSize = static_cast<uint32_t>(std::strlen(portName));
  349. fShmNonRtServerControl.writeUInt(bufStrSize);
  350. fShmNonRtServerControl.writeCustomData(portName, bufStrSize);
  351. }
  352. }
  353. fShmNonRtServerControl.waitIfDataIsReachingLimit();
  354. // kPluginBridgeNonRtServerMidiCount
  355. {
  356. const uint32_t mIns = fState.midiIns.count();
  357. const uint32_t mOuts = fState.midiOuts.count();
  358. // uint/ins, uint/outs
  359. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerMidiCount);
  360. fShmNonRtServerControl.writeUInt(mIns);
  361. fShmNonRtServerControl.writeUInt(mOuts);
  362. fShmNonRtServerControl.commitWrite();
  363. }
  364. fShmNonRtServerControl.waitIfDataIsReachingLimit();
  365. // ready!
  366. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerReady);
  367. fShmNonRtServerControl.commitWrite();
  368. fShmNonRtServerControl.waitIfDataIsReachingLimit();
  369. // must be static
  370. fAudioIns = fState.audioIns.count();
  371. fAudioOuts = fState.audioOuts.count();
  372. carla_stdout("Carla Jack Client Ready!");
  373. fLastPingTime = Time::currentTimeMillis();
  374. }
  375. fState.activated = true;
  376. }
  377. void deactivate()
  378. {
  379. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  380. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerUiClosed);
  381. fShmNonRtServerControl.commitWrite();
  382. fState.activated = false;
  383. fState.prematurelyActivated = false;
  384. for (LinkedList<JackPortState*>::Itenerator it = fState.audioIns.begin2(); it.valid(); it.next())
  385. {
  386. if (JackPortState* const jport = it.getValue(nullptr))
  387. delete jport;
  388. }
  389. for (LinkedList<JackPortState*>::Itenerator it = fState.audioOuts.begin2(); it.valid(); it.next())
  390. {
  391. if (JackPortState* const jport = it.getValue(nullptr))
  392. delete jport;
  393. }
  394. fState.audioIns.clear();
  395. fState.audioOuts.clear();
  396. }
  397. void handleNonRtData()
  398. {
  399. for (; fShmNonRtClientControl.isDataAvailableForReading();)
  400. {
  401. const PluginBridgeNonRtClientOpcode opcode(fShmNonRtClientControl.readOpcode());
  402. // #ifdef DEBUG
  403. if (opcode != kPluginBridgeNonRtClientPing)
  404. {
  405. static int shownNull = 0;
  406. if (opcode == kPluginBridgeNonRtClientNull)
  407. {
  408. if (shownNull > 5)
  409. continue;
  410. ++shownNull;
  411. }
  412. carla_stdout("CarlaJackClient::handleNonRtData() - got opcode: %s", PluginBridgeNonRtClientOpcode2str(opcode));
  413. }
  414. // #endif
  415. if (opcode != kPluginBridgeNonRtClientNull && opcode != kPluginBridgeNonRtClientPingOnOff && fLastPingTime > 0)
  416. fLastPingTime = Time::currentTimeMillis();
  417. switch (opcode)
  418. {
  419. case kPluginBridgeNonRtClientNull:
  420. break;
  421. case kPluginBridgeNonRtClientPing: {
  422. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  423. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPong);
  424. fShmNonRtServerControl.commitWrite();
  425. } break;
  426. case kPluginBridgeNonRtClientPingOnOff: {
  427. const uint32_t onOff(fShmNonRtClientControl.readBool());
  428. fLastPingTime = onOff ? Time::currentTimeMillis() : -1;
  429. } break;
  430. case kPluginBridgeNonRtClientActivate:
  431. case kPluginBridgeNonRtClientDeactivate:
  432. break;
  433. case kPluginBridgeNonRtClientSetBufferSize:
  434. fShmNonRtClientControl.readUInt();
  435. //bufferSizeChanged();
  436. break;
  437. case kPluginBridgeNonRtClientSetSampleRate:
  438. fShmNonRtClientControl.readDouble();
  439. //sampleRateChanged();
  440. break;
  441. case kPluginBridgeNonRtClientSetOffline:
  442. fIsOffline = true;
  443. //offlineModeChanged(true);
  444. break;
  445. case kPluginBridgeNonRtClientSetOnline:
  446. fIsOffline = false;
  447. //offlineModeChanged(false);
  448. break;
  449. case kPluginBridgeNonRtClientSetParameterValue:
  450. case kPluginBridgeNonRtClientSetParameterMidiChannel:
  451. case kPluginBridgeNonRtClientSetParameterMidiCC:
  452. case kPluginBridgeNonRtClientSetProgram:
  453. case kPluginBridgeNonRtClientSetMidiProgram:
  454. case kPluginBridgeNonRtClientSetCustomData:
  455. case kPluginBridgeNonRtClientSetChunkDataFile:
  456. break;
  457. case kPluginBridgeNonRtClientSetOption:
  458. fShmNonRtClientControl.readUInt();
  459. fShmNonRtClientControl.readBool();
  460. break;
  461. case kPluginBridgeNonRtClientSetCtrlChannel:
  462. fShmNonRtClientControl.readShort();
  463. break;
  464. case kPluginBridgeNonRtClientPrepareForSave:
  465. {
  466. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  467. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerSaved);
  468. fShmNonRtServerControl.commitWrite();
  469. }
  470. break;
  471. case kPluginBridgeNonRtClientShowUI:
  472. case kPluginBridgeNonRtClientHideUI:
  473. case kPluginBridgeNonRtClientUiParameterChange:
  474. case kPluginBridgeNonRtClientUiProgramChange:
  475. case kPluginBridgeNonRtClientUiMidiProgramChange:
  476. case kPluginBridgeNonRtClientUiNoteOn:
  477. case kPluginBridgeNonRtClientUiNoteOff:
  478. break;
  479. case kPluginBridgeNonRtClientQuit:
  480. signalThreadShouldExit();
  481. break;
  482. }
  483. }
  484. }
  485. // -------------------------------------------------------------------
  486. protected:
  487. void run() override
  488. {
  489. carla_stderr("CarlaJackClient run START");
  490. #ifdef __SSE2_MATH__
  491. // Set FTZ and DAZ flags
  492. _mm_setcsr(_mm_getcsr() | 0x8040);
  493. #endif
  494. bool quitReceived = false;
  495. for (; ! quitReceived && ! threadShouldExit();)
  496. {
  497. handleNonRtData();
  498. const BridgeRtClientControl::WaitHelper helper(fShmRtClientControl);
  499. if (! helper.ok)
  500. continue;
  501. for (; fShmRtClientControl.isDataAvailableForReading();)
  502. {
  503. const PluginBridgeRtClientOpcode opcode(fShmRtClientControl.readOpcode());
  504. //#ifdef DEBUG
  505. if (opcode != kPluginBridgeRtClientProcess && opcode != kPluginBridgeRtClientMidiEvent)
  506. {
  507. carla_stdout("CarlaJackClientRtThread::run() - got opcode: %s", PluginBridgeRtClientOpcode2str(opcode));
  508. }
  509. //#endif
  510. switch (opcode)
  511. {
  512. case kPluginBridgeRtClientNull:
  513. break;
  514. case kPluginBridgeRtClientSetAudioPool: {
  515. if (fShmAudioPool.data != nullptr)
  516. {
  517. jackbridge_shm_unmap(fShmAudioPool.shm, fShmAudioPool.data);
  518. fShmAudioPool.data = nullptr;
  519. }
  520. const uint64_t poolSize(fShmRtClientControl.readULong());
  521. CARLA_SAFE_ASSERT_BREAK(poolSize > 0);
  522. fShmAudioPool.data = (float*)jackbridge_shm_map(fShmAudioPool.shm, static_cast<size_t>(poolSize));
  523. break;
  524. }
  525. case kPluginBridgeRtClientControlEventParameter:
  526. case kPluginBridgeRtClientControlEventMidiBank:
  527. case kPluginBridgeRtClientControlEventMidiProgram:
  528. case kPluginBridgeRtClientControlEventAllSoundOff:
  529. case kPluginBridgeRtClientControlEventAllNotesOff:
  530. case kPluginBridgeRtClientMidiEvent:
  531. break;
  532. case kPluginBridgeRtClientProcess: {
  533. CARLA_SAFE_ASSERT_BREAK(fShmAudioPool.data != nullptr);
  534. const CarlaMutexTryLocker cmtl(fRealtimeThreadMutex);
  535. if (cmtl.wasLocked())
  536. {
  537. float* fdata = fShmAudioPool.data;
  538. if (fState.process == nullptr || ! fState.activated)
  539. {
  540. for (uint32_t i=0; i<fAudioIns; ++i)
  541. fdata += fState.bufferSize*fAudioIns;
  542. if (fAudioOuts > 0)
  543. carla_zeroFloats(fdata, fState.bufferSize*fAudioOuts);
  544. if (! fState.activated)
  545. {
  546. fShmRtClientControl.data->procFlags = 1;
  547. }
  548. }
  549. else
  550. {
  551. const BridgeTimeInfo& bridgeTimeInfo(fShmRtClientControl.data->timeInfo);
  552. uint32_t i = 0;
  553. for (LinkedList<JackPortState*>::Itenerator it = fState.audioIns.begin2(); it.valid(); it.next())
  554. {
  555. CARLA_SAFE_ASSERT_BREAK(i++ < fAudioIns);
  556. if (JackPortState* const jport = it.getValue(nullptr))
  557. jport->buffer = fdata;
  558. fdata += fState.bufferSize;
  559. }
  560. i=0;
  561. for (LinkedList<JackPortState*>::Itenerator it = fState.audioOuts.begin2(); it.valid(); it.next())
  562. {
  563. CARLA_SAFE_ASSERT_BREAK(i++ < fAudioOuts);
  564. if (JackPortState* const jport = it.getValue(nullptr))
  565. jport->buffer = fdata;
  566. fdata += fState.bufferSize;
  567. }
  568. fState.playing = bridgeTimeInfo.playing;
  569. fState.position.frame = bridgeTimeInfo.frame;
  570. fState.position.usecs = bridgeTimeInfo.usecs;
  571. if (bridgeTimeInfo.valid & 0x1 /* kValidBBT */)
  572. {
  573. fState.position.valid = JackPositionBBT;
  574. fState.position.bar = bridgeTimeInfo.bar;
  575. fState.position.beat = bridgeTimeInfo.beat;
  576. fState.position.tick = bridgeTimeInfo.tick;
  577. fState.position.beats_per_bar = bridgeTimeInfo.beatsPerBar;
  578. fState.position.beat_type = bridgeTimeInfo.beatType;
  579. fState.position.ticks_per_beat = bridgeTimeInfo.ticksPerBeat;
  580. fState.position.beats_per_minute = bridgeTimeInfo.beatsPerMinute;
  581. fState.position.bar_start_tick = bridgeTimeInfo.barStartTick;
  582. }
  583. else
  584. {
  585. fState.position.valid = static_cast<jack_position_bits_t>(0);
  586. }
  587. fState.process(fState.bufferSize, fState.processPtr);
  588. }
  589. }
  590. else
  591. {
  592. carla_stderr2("CarlaJackClient: fRealtimeThreadMutex tryLock failed");
  593. }
  594. carla_zeroBytes(fShmRtClientControl.data->midiOut, kBridgeRtClientDataMidiOutSize);
  595. break;
  596. }
  597. case kPluginBridgeRtClientQuit:
  598. quitReceived = true;
  599. signalThreadShouldExit();
  600. break;
  601. }
  602. }
  603. }
  604. //callback(ENGINE_CALLBACK_ENGINE_STOPPED, 0, 0, 0, 0.0f, nullptr);
  605. if (quitReceived)
  606. {
  607. carla_stderr("CarlaJackClient run END - quit by carla");
  608. ::kill(::getpid(), SIGTERM);
  609. }
  610. else
  611. {
  612. const char* const message("Plugin bridge error, process thread has stopped");
  613. const std::size_t messageSize(std::strlen(message));
  614. bool activated;
  615. {
  616. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  617. activated = fState.activated;
  618. if (activated)
  619. {
  620. carla_stderr("CarlaJackClient run END - quit error");
  621. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerError);
  622. fShmNonRtServerControl.writeUInt(messageSize);
  623. fShmNonRtServerControl.writeCustomData(message, messageSize);
  624. fShmNonRtServerControl.commitWrite();
  625. }
  626. else
  627. {
  628. carla_stderr("CarlaJackClient run END - quit itself");
  629. }
  630. }
  631. if (activated && fState.shutdown != nullptr)
  632. fState.shutdown(fState.shutdownPtr);
  633. }
  634. }
  635. private:
  636. BridgeAudioPool fShmAudioPool;
  637. BridgeRtClientControl fShmRtClientControl;
  638. BridgeNonRtClientControl fShmNonRtClientControl;
  639. BridgeNonRtServerControl fShmNonRtServerControl;
  640. CarlaString fBaseNameAudioPool;
  641. CarlaString fBaseNameRtClientControl;
  642. CarlaString fBaseNameNonRtClientControl;
  643. CarlaString fBaseNameNonRtServerControl;
  644. bool fIsOffline;
  645. bool fFirstIdle;
  646. int64_t fLastPingTime;
  647. uint32_t fAudioIns;
  648. uint32_t fAudioOuts;
  649. CarlaMutex fRealtimeThreadMutex;
  650. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaJackClient)
  651. };
  652. CARLA_BACKEND_END_NAMESPACE
  653. // --------------------------------------------------------------------------------------------------------------------
  654. CARLA_BACKEND_USE_NAMESPACE
  655. static CarlaJackClient* gClient = nullptr;
  656. static int gClientRefCount = 0;
  657. CARLA_EXPORT
  658. jack_client_t* jack_client_open(const char* client_name, jack_options_t /*options*/, jack_status_t* status, ...)
  659. {
  660. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  661. if (gClient != nullptr)
  662. {
  663. ++gClientRefCount;
  664. return (jack_client_t*)gClient;
  665. }
  666. const char* const shmIds(std::getenv("CARLA_SHM_IDS"));
  667. if (shmIds == nullptr || std::strlen(shmIds) != 6*4)
  668. {
  669. if (status != nullptr)
  670. *status = JackFailure;
  671. return nullptr;
  672. }
  673. char audioPoolBaseName[6+1];
  674. char rtClientBaseName[6+1];
  675. char nonRtClientBaseName[6+1];
  676. char nonRtServerBaseName[6+1];
  677. std::memcpy(audioPoolBaseName, shmIds+6*0, 6);
  678. std::memcpy(rtClientBaseName, shmIds+6*1, 6);
  679. std::memcpy(nonRtClientBaseName, shmIds+6*2, 6);
  680. std::memcpy(nonRtServerBaseName, shmIds+6*3, 6);
  681. audioPoolBaseName[6] = '\0';
  682. rtClientBaseName[6] = '\0';
  683. nonRtClientBaseName[6] = '\0';
  684. nonRtServerBaseName[6] = '\0';
  685. CarlaJackClient* const client = new CarlaJackClient(audioPoolBaseName, rtClientBaseName,
  686. nonRtClientBaseName, nonRtServerBaseName);
  687. if (! client->init(client_name))
  688. {
  689. if (status != nullptr)
  690. *status = JackServerError;
  691. return nullptr;
  692. }
  693. gClient = client;
  694. ++gClientRefCount;
  695. return (jack_client_t*)client;
  696. }
  697. CARLA_EXPORT
  698. jack_client_t* jack_client_new(const char* client_name)
  699. {
  700. return jack_client_open(client_name, JackNullOption, nullptr);
  701. }
  702. CARLA_EXPORT
  703. int jack_client_close(jack_client_t* client)
  704. {
  705. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  706. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  707. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  708. JackClientState& jstate(jclient->fState);
  709. if (jstate.activated)
  710. jclient->deactivate();
  711. if (--gClientRefCount == 0)
  712. {
  713. jclient->close();
  714. delete jclient;
  715. gClient = nullptr;
  716. }
  717. return 0;
  718. }
  719. CARLA_EXPORT
  720. jack_port_t* jack_port_register(jack_client_t* client, const char* port_name, const char* port_type,
  721. unsigned long flags, unsigned long /*buffer_size*/)
  722. {
  723. carla_stdout("CarlaJackClient :: %s | %s %s %lu", __FUNCTION__, port_name, port_type, flags);
  724. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  725. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, nullptr);
  726. JackClientState& jstate(jclient->fState);
  727. CARLA_SAFE_ASSERT_RETURN(port_name != nullptr && port_name[0] != '\0', nullptr);
  728. CARLA_SAFE_ASSERT_RETURN(port_type != nullptr && port_type[0] != '\0', nullptr);
  729. if (std::strcmp(port_type, JACK_DEFAULT_AUDIO_TYPE) == 0)
  730. {
  731. uint32_t index;
  732. /**/ if (flags & JackPortIsInput)
  733. {
  734. if (jstate.prematurelyActivated)
  735. {
  736. CARLA_SAFE_ASSERT_RETURN(jstate.fakeIns > 0, nullptr);
  737. jstate.fakeIns -= 1;
  738. index = jstate.audioIns.count() - jstate.fakeIns - 1;
  739. }
  740. else
  741. {
  742. index = jstate.audioIns.count();
  743. jstate.audioIns.append(new JackPortState(jstate.name, port_name, index, flags, false));
  744. }
  745. return (jack_port_t*)jstate.audioIns.getAt(index, nullptr);
  746. }
  747. else if (flags & JackPortIsOutput)
  748. {
  749. if (jstate.prematurelyActivated)
  750. {
  751. CARLA_SAFE_ASSERT_RETURN(jstate.fakeOuts > 0, nullptr);
  752. jstate.fakeOuts -= 1;
  753. index = jstate.audioOuts.count() - jstate.fakeOuts - 1;
  754. }
  755. else
  756. {
  757. index = jstate.audioOuts.count();
  758. jstate.audioOuts.append(new JackPortState(jstate.name, port_name, index, flags, false));
  759. }
  760. return (jack_port_t*)jstate.audioOuts.getAt(index, nullptr);
  761. }
  762. carla_stderr2("Invalid port flags '%x'", flags);
  763. return nullptr;
  764. }
  765. carla_stderr2("Invalid port type '%s'", port_type);
  766. return nullptr;
  767. }
  768. CARLA_EXPORT
  769. int jack_port_unregister(jack_client_t* client, jack_port_t* port)
  770. {
  771. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  772. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  773. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  774. JackPortState* const jport = (JackPortState*)port;
  775. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 1);
  776. CARLA_SAFE_ASSERT_RETURN(! jport->isSystem, 1);
  777. JackClientState& jstate(jclient->fState);
  778. //CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  779. if (jport->flags & JackPortIsOutput)
  780. {
  781. if (jstate.prematurelyActivated)
  782. {
  783. CARLA_SAFE_ASSERT_RETURN(jstate.fakeIns < 2, 1);
  784. jstate.fakeIns += 1;
  785. }
  786. else
  787. {
  788. CARLA_SAFE_ASSERT_RETURN(jstate.audioIns.removeOne(jport), 1);
  789. }
  790. }
  791. else
  792. {
  793. if (jstate.prematurelyActivated)
  794. {
  795. CARLA_SAFE_ASSERT_RETURN(jstate.fakeOuts < 2, 1);
  796. jstate.fakeOuts += 1;
  797. }
  798. else
  799. {
  800. CARLA_SAFE_ASSERT_RETURN(jstate.audioOuts.removeOne(jport), 1);
  801. }
  802. }
  803. return 0;
  804. }
  805. CARLA_EXPORT
  806. void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t)
  807. {
  808. JackPortState* const jport = (JackPortState*)port;
  809. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  810. return jport->buffer;
  811. }
  812. CARLA_EXPORT
  813. int jack_set_process_callback(jack_client_t* client, JackProcessCallback callback, void* arg)
  814. {
  815. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  816. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  817. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  818. JackClientState& jstate(jclient->fState);
  819. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  820. jstate.process = callback;
  821. jstate.processPtr = arg;
  822. return 0;
  823. }
  824. CARLA_EXPORT
  825. void jack_on_shutdown(jack_client_t* client, JackShutdownCallback callback, void* arg)
  826. {
  827. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  828. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  829. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr,);
  830. JackClientState& jstate(jclient->fState);
  831. CARLA_SAFE_ASSERT_RETURN(! jstate.activated,);
  832. jstate.shutdown = callback;
  833. jstate.shutdownPtr = arg;
  834. }
  835. CARLA_EXPORT
  836. int jack_activate(jack_client_t* client)
  837. {
  838. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  839. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  840. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  841. const JackClientState& jstate(jclient->fState);
  842. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  843. #if 0
  844. // needed for pulseaudio
  845. static bool skipFirstActivate = true;
  846. if (skipFirstActivate) {
  847. skipFirstActivate = false;
  848. return 0;
  849. }
  850. #endif
  851. jclient->activate();
  852. return 0;
  853. }
  854. CARLA_EXPORT
  855. int jack_deactivate(jack_client_t* /*client*/)
  856. {
  857. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  858. //CarlaJackClient* const jclient = (CarlaJackClient*)client;
  859. //CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  860. //JackClientState& jstate(jclient->fState);
  861. //CARLA_SAFE_ASSERT_RETURN(jstate.activated, 1);
  862. //jclient->deactivate();
  863. return 0;
  864. }
  865. CARLA_EXPORT
  866. char* jack_get_client_name(jack_client_t* client)
  867. {
  868. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  869. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  870. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, nullptr);
  871. const JackClientState& jstate(jclient->fState);
  872. return jstate.name;
  873. }
  874. CARLA_EXPORT
  875. jack_nframes_t jack_get_buffer_size(jack_client_t* client)
  876. {
  877. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  878. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  879. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  880. const JackClientState& jstate(jclient->fState);
  881. return jstate.bufferSize;
  882. }
  883. CARLA_EXPORT
  884. jack_nframes_t jack_get_sample_rate(jack_client_t* client)
  885. {
  886. carla_debug("CarlaJackClient :: %s", __FUNCTION__);
  887. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  888. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  889. const JackClientState& jstate(jclient->fState);
  890. return jstate.sampleRate;
  891. }
  892. // --------------------------------------------------------------------------------------------------------------------
  893. CARLA_EXPORT
  894. void jack_set_error_function(void (*func)(const char *))
  895. {
  896. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  897. (void)func;
  898. }
  899. CARLA_EXPORT
  900. int jack_set_sync_callback(jack_client_t* client, JackSyncCallback /*callback*/, void* /*arg*/)
  901. {
  902. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  903. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  904. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  905. const JackClientState& jstate(jclient->fState);
  906. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  907. // TODO
  908. return 0;
  909. }
  910. CARLA_EXPORT
  911. int jack_set_timebase_callback(jack_client_t* client, int, JackTimebaseCallback, void*)
  912. {
  913. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  914. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  915. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  916. const JackClientState& jstate(jclient->fState);
  917. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  918. // TODO
  919. return EBUSY;
  920. }
  921. CARLA_EXPORT
  922. int jack_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback /*callback*/, void* /*arg*/)
  923. {
  924. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  925. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  926. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  927. const JackClientState& jstate(jclient->fState);
  928. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  929. // TODO
  930. return 0;
  931. }
  932. CARLA_EXPORT
  933. int jack_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback /*callback*/, void* /*arg*/)
  934. {
  935. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  936. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  937. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  938. const JackClientState& jstate(jclient->fState);
  939. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  940. // TODO
  941. return 0;
  942. }
  943. CARLA_EXPORT
  944. int jack_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback, void*)
  945. {
  946. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  947. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  948. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  949. const JackClientState& jstate(jclient->fState);
  950. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  951. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  952. return 0;
  953. }
  954. CARLA_EXPORT
  955. int jack_set_port_registration_callback(jack_client_t* client, JackPortRegistrationCallback, void*)
  956. {
  957. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  958. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  959. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  960. const JackClientState& jstate(jclient->fState);
  961. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  962. return 0;
  963. }
  964. CARLA_EXPORT
  965. int jack_set_port_connect_callback(jack_client_t* client, JackPortConnectCallback, void*)
  966. {
  967. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  968. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  969. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  970. const JackClientState& jstate(jclient->fState);
  971. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  972. return 0;
  973. }
  974. CARLA_EXPORT
  975. int jack_set_graph_order_callback(jack_client_t* client, JackGraphOrderCallback, void*)
  976. {
  977. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  978. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  979. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  980. const JackClientState& jstate(jclient->fState);
  981. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  982. return 0;
  983. }
  984. CARLA_EXPORT
  985. int jack_is_realtime(jack_client_t*)
  986. {
  987. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  988. return 0;
  989. }
  990. CARLA_EXPORT
  991. int jack_transport_locate(jack_client_t*, jack_nframes_t)
  992. {
  993. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  994. return 1;
  995. }
  996. CARLA_EXPORT
  997. jack_transport_state_t jack_transport_query(const jack_client_t* client, jack_position_t* pos)
  998. {
  999. carla_debug("CarlaJackClient :: %s", __FUNCTION__);
  1000. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  1001. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, JackTransportStopped);
  1002. const JackClientState& jstate(jclient->fState);
  1003. CARLA_SAFE_ASSERT_RETURN(jstate.activated, JackTransportStopped);
  1004. if (pos != nullptr)
  1005. std::memcpy(pos, &jstate.position, sizeof(jack_position_t));
  1006. return jstate.playing ? JackTransportRolling : JackTransportStopped;
  1007. }
  1008. CARLA_EXPORT
  1009. int jack_transport_reposition(jack_client_t*, const jack_position_t*)
  1010. {
  1011. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1012. return EINVAL;
  1013. }
  1014. CARLA_EXPORT
  1015. void jack_transport_start(jack_client_t*)
  1016. {
  1017. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1018. }
  1019. CARLA_EXPORT
  1020. void jack_transport_stop (jack_client_t*)
  1021. {
  1022. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1023. }
  1024. CARLA_EXPORT
  1025. pthread_t jack_client_thread_id(jack_client_t* client)
  1026. {
  1027. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1028. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  1029. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  1030. const JackClientState& jstate(jclient->fState);
  1031. CARLA_SAFE_ASSERT_RETURN(jstate.activated, 0);
  1032. return (pthread_t)jclient->getThreadId();
  1033. }
  1034. CARLA_EXPORT
  1035. jack_nframes_t jack_frame_time(const jack_client_t* client)
  1036. {
  1037. carla_debug("CarlaJackClient :: %s", __FUNCTION__);
  1038. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  1039. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  1040. const JackClientState& jstate(jclient->fState);
  1041. CARLA_SAFE_ASSERT_RETURN(jstate.activated, 0);
  1042. return jstate.position.usecs;
  1043. }
  1044. CARLA_EXPORT
  1045. void jack_free(void* ptr)
  1046. {
  1047. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1048. free(ptr);
  1049. }
  1050. CARLA_EXPORT
  1051. jack_nframes_t jack_midi_get_event_count(void*)
  1052. {
  1053. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1054. return 0;
  1055. }
  1056. CARLA_EXPORT
  1057. int jack_midi_event_get(jack_midi_event_t*, void*, uint32_t)
  1058. {
  1059. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1060. return ENODATA;
  1061. }
  1062. CARLA_EXPORT
  1063. const char* jack_port_short_name(const jack_port_t* port)
  1064. {
  1065. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1066. JackPortState* const jport = (JackPortState*)port;
  1067. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  1068. return jport->name;
  1069. }
  1070. CARLA_EXPORT
  1071. const char* jack_port_name(const jack_port_t* port)
  1072. {
  1073. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1074. JackPortState* const jport = (JackPortState*)port;
  1075. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  1076. return jport->fullname;
  1077. }
  1078. CARLA_EXPORT
  1079. int jack_port_flags(const jack_port_t* port)
  1080. {
  1081. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1082. JackPortState* const jport = (JackPortState*)port;
  1083. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 0);
  1084. return jport->flags;
  1085. }
  1086. CARLA_EXPORT
  1087. const char* jack_port_type(const jack_port_t* port)
  1088. {
  1089. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1090. JackPortState* const jport = (JackPortState*)port;
  1091. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  1092. // TODO
  1093. return JACK_DEFAULT_AUDIO_TYPE;
  1094. }
  1095. CARLA_EXPORT
  1096. jack_uuid_t jack_port_uuid(const jack_port_t*)
  1097. {
  1098. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1099. return 0;
  1100. }
  1101. CARLA_EXPORT
  1102. int jack_client_real_time_priority(jack_client_t*)
  1103. {
  1104. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1105. return -1;
  1106. }
  1107. CARLA_EXPORT
  1108. int jack_connect(jack_client_t*, const char*, const char*)
  1109. {
  1110. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1111. return 0;
  1112. }
  1113. CARLA_EXPORT
  1114. int jack_disconnect(jack_client_t*, const char*, const char*)
  1115. {
  1116. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1117. return 0;
  1118. }
  1119. CARLA_EXPORT
  1120. int jack_port_disconnect(jack_client_t*, jack_port_t*)
  1121. {
  1122. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1123. return 0;
  1124. }
  1125. CARLA_EXPORT
  1126. const char** jack_get_ports(jack_client_t*, const char* a, const char* b, unsigned long flags)
  1127. {
  1128. carla_stdout("CarlaJackClient :: %s | %s %s %li", __FUNCTION__, a, b, flags);
  1129. static const char* capture_1 = "system:capture_1";
  1130. static const char* capture_2 = "system:capture_2";
  1131. static const char* playback_1 = "system:playback_1";
  1132. static const char* playback_2 = "system:playback_2";
  1133. if (flags == 0 || (flags & (JackPortIsInput|JackPortIsOutput)) == (JackPortIsInput|JackPortIsOutput))
  1134. {
  1135. if (const char** const ret = (const char**)calloc(5, sizeof(const char*)))
  1136. {
  1137. ret[0] = capture_1;
  1138. ret[1] = capture_2;
  1139. ret[2] = playback_1;
  1140. ret[3] = playback_2;
  1141. ret[4] = nullptr;
  1142. return ret;
  1143. }
  1144. }
  1145. if (flags & JackPortIsInput)
  1146. {
  1147. if (const char** const ret = (const char**)calloc(3, sizeof(const char*)))
  1148. {
  1149. ret[0] = playback_1;
  1150. ret[1] = playback_2;
  1151. ret[2] = nullptr;
  1152. return ret;
  1153. }
  1154. }
  1155. if (flags & JackPortIsOutput)
  1156. {
  1157. if (const char** const ret = (const char**)calloc(3, sizeof(const char*)))
  1158. {
  1159. ret[0] = capture_1;
  1160. ret[1] = capture_2;
  1161. ret[2] = nullptr;
  1162. return ret;
  1163. }
  1164. }
  1165. return nullptr;
  1166. }
  1167. CARLA_EXPORT
  1168. jack_port_t* jack_port_by_name(jack_client_t* /*client*/, const char* name)
  1169. {
  1170. carla_stdout("CarlaJackClient :: %s | %s", __FUNCTION__, name);
  1171. // CarlaJackClient* const jclient = (CarlaJackClient*)client;
  1172. // CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  1173. // const JackClientState& jstate(jclient->fState);
  1174. //CARLA_SAFE_ASSERT_RETURN(jstate.activated, 0);
  1175. static const JackPortState capturePorts[] = {
  1176. JackPortState("system", "capture_1", 0, JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal, true),
  1177. JackPortState("system", "capture_2", 1, JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal, true),
  1178. };
  1179. static const JackPortState playbackPorts[] = {
  1180. JackPortState("system", "playback_1", 3, JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal, true),
  1181. JackPortState("system", "playback_2", 4, JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal, true),
  1182. };
  1183. if (std::strncmp(name, "system:", 7) == 0)
  1184. {
  1185. name += 7;
  1186. /**/ if (std::strncmp(name, "capture_", 8) == 0)
  1187. {
  1188. name += 8;
  1189. const int index = std::atoi(name);
  1190. CARLA_SAFE_ASSERT_RETURN(index >= 0 && index < 2, nullptr);
  1191. return (jack_port_t*)&capturePorts[index];
  1192. }
  1193. else if (std::strncmp(name, "playback_", 9) == 0)
  1194. {
  1195. name += 9;
  1196. const int index = std::atoi(name);
  1197. CARLA_SAFE_ASSERT_RETURN(index >= 0, nullptr);
  1198. return (jack_port_t*)&playbackPorts[index];
  1199. }
  1200. else
  1201. {
  1202. carla_stderr2("Invalid port short name: '%s'", name);
  1203. return nullptr;
  1204. }
  1205. }
  1206. carla_stderr2("Invalid port name: '%s'", name);
  1207. return nullptr;
  1208. }
  1209. CARLA_EXPORT
  1210. jack_port_t* jack_port_by_id(jack_client_t*, jack_port_id_t)
  1211. {
  1212. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1213. return nullptr;
  1214. }
  1215. CARLA_EXPORT
  1216. void jack_set_info_function(void (*func)(const char *))
  1217. {
  1218. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1219. (void)func;
  1220. }
  1221. CARLA_EXPORT
  1222. int jack_set_freewheel(jack_client_t*, int)
  1223. {
  1224. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1225. return 1;
  1226. }
  1227. CARLA_EXPORT
  1228. int jack_set_buffer_size(jack_client_t*, jack_nframes_t)
  1229. {
  1230. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1231. return 1;
  1232. }
  1233. CARLA_EXPORT
  1234. int jack_engine_takeover_timebase(jack_client_t*)
  1235. {
  1236. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1237. return ENOSYS;
  1238. }
  1239. CARLA_EXPORT
  1240. float jack_cpu_load(jack_client_t*)
  1241. {
  1242. return 0.0f;
  1243. }
  1244. CARLA_EXPORT
  1245. int jack_client_name_size(void)
  1246. {
  1247. return STR_MAX;
  1248. }
  1249. CARLA_EXPORT
  1250. void jack_port_get_latency_range(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t* range)
  1251. {
  1252. range->min = range->max = 0;
  1253. }
  1254. CARLA_EXPORT
  1255. jack_nframes_t jack_port_get_latency(jack_port_t*)
  1256. {
  1257. return 0;
  1258. }
  1259. CARLA_EXPORT
  1260. int jack_set_xrun_callback(jack_client_t*, JackXRunCallback, void*)
  1261. {
  1262. return 0;
  1263. }
  1264. CARLA_EXPORT
  1265. int jack_set_thread_init_callback(jack_client_t*, JackThreadInitCallback, void*)
  1266. {
  1267. return 0;
  1268. }
  1269. CARLA_EXPORT
  1270. int jack_port_name_size(void)
  1271. {
  1272. return STR_MAX;
  1273. }
  1274. CARLA_EXPORT
  1275. int jack_port_connected(const jack_port_t*)
  1276. {
  1277. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1278. return 1;
  1279. }
  1280. CARLA_EXPORT
  1281. const char* JACK_METADATA_PRETTY_NAME;
  1282. const char* JACK_METADATA_PRETTY_NAME = "http://jackaudio.org/metadata/pretty-name";
  1283. // jack_ringbuffer_create
  1284. // jack_port_is_mine
  1285. // jack_port_set_name
  1286. // jack_port_get_all_connections
  1287. // jack_port_uuid
  1288. // --------------------------------------------------------------------------------------------------------------------
  1289. #include "jackbridge/JackBridge2.cpp"
  1290. #include "CarlaBridgeUtils.cpp"
  1291. // --------------------------------------------------------------------------------------------------------------------