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.

1661 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. #if 0
  714. static bool ignoreFirstClientClose = true;
  715. if (ignoreFirstClientClose)
  716. {
  717. ignoreFirstClientClose = false;
  718. return 0;
  719. }
  720. #endif
  721. jclient->close();
  722. delete jclient;
  723. gClient = nullptr;
  724. }
  725. return 0;
  726. }
  727. CARLA_EXPORT
  728. jack_port_t* jack_port_register(jack_client_t* client, const char* port_name, const char* port_type,
  729. unsigned long flags, unsigned long /*buffer_size*/)
  730. {
  731. carla_stdout("CarlaJackClient :: %s | %s %s %lu", __FUNCTION__, port_name, port_type, flags);
  732. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  733. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, nullptr);
  734. JackClientState& jstate(jclient->fState);
  735. CARLA_SAFE_ASSERT_RETURN(port_name != nullptr && port_name[0] != '\0', nullptr);
  736. CARLA_SAFE_ASSERT_RETURN(port_type != nullptr && port_type[0] != '\0', nullptr);
  737. if (std::strcmp(port_type, JACK_DEFAULT_AUDIO_TYPE) == 0)
  738. {
  739. uint32_t index;
  740. /**/ if (flags & JackPortIsInput)
  741. {
  742. if (jstate.prematurelyActivated)
  743. {
  744. CARLA_SAFE_ASSERT_RETURN(jstate.fakeIns > 0, nullptr);
  745. jstate.fakeIns -= 1;
  746. index = jstate.audioIns.count() - jstate.fakeIns - 1;
  747. }
  748. else
  749. {
  750. index = jstate.audioIns.count();
  751. jstate.audioIns.append(new JackPortState(jstate.name, port_name, index, flags, false));
  752. }
  753. return (jack_port_t*)jstate.audioIns.getAt(index, nullptr);
  754. }
  755. else if (flags & JackPortIsOutput)
  756. {
  757. if (jstate.prematurelyActivated)
  758. {
  759. CARLA_SAFE_ASSERT_RETURN(jstate.fakeOuts > 0, nullptr);
  760. jstate.fakeOuts -= 1;
  761. index = jstate.audioOuts.count() - jstate.fakeOuts - 1;
  762. }
  763. else
  764. {
  765. index = jstate.audioOuts.count();
  766. jstate.audioOuts.append(new JackPortState(jstate.name, port_name, index, flags, false));
  767. }
  768. return (jack_port_t*)jstate.audioOuts.getAt(index, nullptr);
  769. }
  770. carla_stderr2("Invalid port flags '%x'", flags);
  771. return nullptr;
  772. }
  773. carla_stderr2("Invalid port type '%s'", port_type);
  774. return nullptr;
  775. }
  776. CARLA_EXPORT
  777. int jack_port_unregister(jack_client_t* client, jack_port_t* port)
  778. {
  779. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  780. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  781. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  782. JackPortState* const jport = (JackPortState*)port;
  783. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 1);
  784. CARLA_SAFE_ASSERT_RETURN(! jport->isSystem, 1);
  785. JackClientState& jstate(jclient->fState);
  786. //CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  787. if (jport->flags & JackPortIsOutput)
  788. {
  789. if (jstate.prematurelyActivated)
  790. {
  791. CARLA_SAFE_ASSERT_RETURN(jstate.fakeIns < 2, 1);
  792. jstate.fakeIns += 1;
  793. }
  794. else
  795. {
  796. CARLA_SAFE_ASSERT_RETURN(jstate.audioIns.removeOne(jport), 1);
  797. }
  798. }
  799. else
  800. {
  801. if (jstate.prematurelyActivated)
  802. {
  803. CARLA_SAFE_ASSERT_RETURN(jstate.fakeOuts < 2, 1);
  804. jstate.fakeOuts += 1;
  805. }
  806. else
  807. {
  808. CARLA_SAFE_ASSERT_RETURN(jstate.audioOuts.removeOne(jport), 1);
  809. }
  810. }
  811. return 0;
  812. }
  813. CARLA_EXPORT
  814. void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t)
  815. {
  816. JackPortState* const jport = (JackPortState*)port;
  817. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  818. return jport->buffer;
  819. }
  820. CARLA_EXPORT
  821. int jack_set_process_callback(jack_client_t* client, JackProcessCallback callback, void* arg)
  822. {
  823. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  824. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  825. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  826. JackClientState& jstate(jclient->fState);
  827. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  828. jstate.process = callback;
  829. jstate.processPtr = arg;
  830. return 0;
  831. }
  832. CARLA_EXPORT
  833. void jack_on_shutdown(jack_client_t* client, JackShutdownCallback callback, void* arg)
  834. {
  835. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  836. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  837. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr,);
  838. JackClientState& jstate(jclient->fState);
  839. CARLA_SAFE_ASSERT_RETURN(! jstate.activated,);
  840. jstate.shutdown = callback;
  841. jstate.shutdownPtr = arg;
  842. }
  843. CARLA_EXPORT
  844. int jack_activate(jack_client_t* client)
  845. {
  846. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  847. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  848. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  849. const JackClientState& jstate(jclient->fState);
  850. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  851. #if 0
  852. // needed for pulseaudio
  853. static bool skipFirstActivate = true;
  854. if (skipFirstActivate) {
  855. skipFirstActivate = false;
  856. return 0;
  857. }
  858. #endif
  859. jclient->activate();
  860. return 0;
  861. }
  862. CARLA_EXPORT
  863. int jack_deactivate(jack_client_t* /*client*/)
  864. {
  865. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  866. //CarlaJackClient* const jclient = (CarlaJackClient*)client;
  867. //CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  868. //JackClientState& jstate(jclient->fState);
  869. //CARLA_SAFE_ASSERT_RETURN(jstate.activated, 1);
  870. //jclient->deactivate();
  871. return 0;
  872. }
  873. CARLA_EXPORT
  874. char* jack_get_client_name(jack_client_t* client)
  875. {
  876. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  877. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  878. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, nullptr);
  879. const JackClientState& jstate(jclient->fState);
  880. return jstate.name;
  881. }
  882. CARLA_EXPORT
  883. jack_nframes_t jack_get_buffer_size(jack_client_t* client)
  884. {
  885. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  886. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  887. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  888. const JackClientState& jstate(jclient->fState);
  889. return jstate.bufferSize;
  890. }
  891. CARLA_EXPORT
  892. jack_nframes_t jack_get_sample_rate(jack_client_t* client)
  893. {
  894. carla_debug("CarlaJackClient :: %s", __FUNCTION__);
  895. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  896. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  897. const JackClientState& jstate(jclient->fState);
  898. return jstate.sampleRate;
  899. }
  900. // --------------------------------------------------------------------------------------------------------------------
  901. CARLA_EXPORT
  902. void jack_set_error_function(void (*func)(const char *))
  903. {
  904. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  905. (void)func;
  906. }
  907. CARLA_EXPORT
  908. int jack_set_sync_callback(jack_client_t* client, JackSyncCallback /*callback*/, void* /*arg*/)
  909. {
  910. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  911. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  912. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  913. const JackClientState& jstate(jclient->fState);
  914. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  915. // TODO
  916. return 0;
  917. }
  918. CARLA_EXPORT
  919. int jack_set_timebase_callback(jack_client_t* client, int, JackTimebaseCallback, void*)
  920. {
  921. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  922. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  923. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  924. const JackClientState& jstate(jclient->fState);
  925. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  926. // TODO
  927. return EBUSY;
  928. }
  929. CARLA_EXPORT
  930. int jack_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback /*callback*/, void* /*arg*/)
  931. {
  932. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  933. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  934. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  935. const JackClientState& jstate(jclient->fState);
  936. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  937. // TODO
  938. return 0;
  939. }
  940. CARLA_EXPORT
  941. int jack_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback /*callback*/, void* /*arg*/)
  942. {
  943. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  944. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  945. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  946. const JackClientState& jstate(jclient->fState);
  947. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  948. // TODO
  949. return 0;
  950. }
  951. CARLA_EXPORT
  952. int jack_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback, void*)
  953. {
  954. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  955. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  956. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  957. const JackClientState& jstate(jclient->fState);
  958. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  959. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  960. return 0;
  961. }
  962. CARLA_EXPORT
  963. int jack_set_port_registration_callback(jack_client_t* client, JackPortRegistrationCallback, void*)
  964. {
  965. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  966. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  967. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  968. const JackClientState& jstate(jclient->fState);
  969. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  970. return 0;
  971. }
  972. CARLA_EXPORT
  973. int jack_set_port_connect_callback(jack_client_t* client, JackPortConnectCallback, void*)
  974. {
  975. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  976. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  977. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  978. const JackClientState& jstate(jclient->fState);
  979. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  980. return 0;
  981. }
  982. CARLA_EXPORT
  983. int jack_set_graph_order_callback(jack_client_t* client, JackGraphOrderCallback, void*)
  984. {
  985. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  986. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  987. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  988. const JackClientState& jstate(jclient->fState);
  989. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  990. return 0;
  991. }
  992. CARLA_EXPORT
  993. int jack_is_realtime(jack_client_t*)
  994. {
  995. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  996. return 0;
  997. }
  998. CARLA_EXPORT
  999. int jack_transport_locate(jack_client_t*, jack_nframes_t)
  1000. {
  1001. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1002. return 1;
  1003. }
  1004. CARLA_EXPORT
  1005. jack_transport_state_t jack_transport_query(const jack_client_t* client, jack_position_t* pos)
  1006. {
  1007. carla_debug("CarlaJackClient :: %s", __FUNCTION__);
  1008. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  1009. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, JackTransportStopped);
  1010. const JackClientState& jstate(jclient->fState);
  1011. CARLA_SAFE_ASSERT_RETURN(jstate.activated, JackTransportStopped);
  1012. if (pos != nullptr)
  1013. std::memcpy(pos, &jstate.position, sizeof(jack_position_t));
  1014. return jstate.playing ? JackTransportRolling : JackTransportStopped;
  1015. }
  1016. CARLA_EXPORT
  1017. int jack_transport_reposition(jack_client_t*, const jack_position_t*)
  1018. {
  1019. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1020. return EINVAL;
  1021. }
  1022. CARLA_EXPORT
  1023. void jack_transport_start(jack_client_t*)
  1024. {
  1025. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1026. }
  1027. CARLA_EXPORT
  1028. void jack_transport_stop (jack_client_t*)
  1029. {
  1030. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1031. }
  1032. CARLA_EXPORT
  1033. pthread_t jack_client_thread_id(jack_client_t* client)
  1034. {
  1035. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1036. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  1037. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  1038. const JackClientState& jstate(jclient->fState);
  1039. CARLA_SAFE_ASSERT_RETURN(jstate.activated, 0);
  1040. return (pthread_t)jclient->getThreadId();
  1041. }
  1042. CARLA_EXPORT
  1043. jack_nframes_t jack_frame_time(const jack_client_t* client)
  1044. {
  1045. carla_debug("CarlaJackClient :: %s", __FUNCTION__);
  1046. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  1047. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  1048. const JackClientState& jstate(jclient->fState);
  1049. CARLA_SAFE_ASSERT_RETURN(jstate.activated, 0);
  1050. return jstate.position.usecs;
  1051. }
  1052. CARLA_EXPORT
  1053. void jack_free(void* ptr)
  1054. {
  1055. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1056. free(ptr);
  1057. }
  1058. CARLA_EXPORT
  1059. jack_nframes_t jack_midi_get_event_count(void*)
  1060. {
  1061. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1062. return 0;
  1063. }
  1064. CARLA_EXPORT
  1065. int jack_midi_event_get(jack_midi_event_t*, void*, uint32_t)
  1066. {
  1067. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1068. return ENODATA;
  1069. }
  1070. CARLA_EXPORT
  1071. const char* jack_port_short_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->name;
  1077. }
  1078. CARLA_EXPORT
  1079. const char* jack_port_name(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, nullptr);
  1084. return jport->fullname;
  1085. }
  1086. CARLA_EXPORT
  1087. int jack_port_flags(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, 0);
  1092. return jport->flags;
  1093. }
  1094. CARLA_EXPORT
  1095. const char* jack_port_type(const jack_port_t* port)
  1096. {
  1097. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1098. JackPortState* const jport = (JackPortState*)port;
  1099. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  1100. // TODO
  1101. return JACK_DEFAULT_AUDIO_TYPE;
  1102. }
  1103. CARLA_EXPORT
  1104. jack_uuid_t jack_port_uuid(const jack_port_t*)
  1105. {
  1106. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1107. return 0;
  1108. }
  1109. CARLA_EXPORT
  1110. int jack_client_real_time_priority(jack_client_t*)
  1111. {
  1112. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1113. return -1;
  1114. }
  1115. CARLA_EXPORT
  1116. int jack_connect(jack_client_t*, const char*, const char*)
  1117. {
  1118. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1119. return 0;
  1120. }
  1121. CARLA_EXPORT
  1122. int jack_disconnect(jack_client_t*, const char*, const char*)
  1123. {
  1124. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1125. return 0;
  1126. }
  1127. CARLA_EXPORT
  1128. int jack_port_disconnect(jack_client_t*, jack_port_t*)
  1129. {
  1130. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1131. return 0;
  1132. }
  1133. CARLA_EXPORT
  1134. const char** jack_get_ports(jack_client_t*, const char* a, const char* b, unsigned long flags)
  1135. {
  1136. carla_stdout("CarlaJackClient :: %s | %s %s %li", __FUNCTION__, a, b, flags);
  1137. static const char* capture_1 = "system:capture_1";
  1138. static const char* capture_2 = "system:capture_2";
  1139. static const char* playback_1 = "system:playback_1";
  1140. static const char* playback_2 = "system:playback_2";
  1141. if (flags == 0 || (flags & (JackPortIsInput|JackPortIsOutput)) == (JackPortIsInput|JackPortIsOutput))
  1142. {
  1143. if (const char** const ret = (const char**)calloc(5, sizeof(const char*)))
  1144. {
  1145. ret[0] = capture_1;
  1146. ret[1] = capture_2;
  1147. ret[2] = playback_1;
  1148. ret[3] = playback_2;
  1149. ret[4] = nullptr;
  1150. return ret;
  1151. }
  1152. }
  1153. if (flags & JackPortIsInput)
  1154. {
  1155. if (const char** const ret = (const char**)calloc(3, sizeof(const char*)))
  1156. {
  1157. ret[0] = playback_1;
  1158. ret[1] = playback_2;
  1159. ret[2] = nullptr;
  1160. return ret;
  1161. }
  1162. }
  1163. if (flags & JackPortIsOutput)
  1164. {
  1165. if (const char** const ret = (const char**)calloc(3, sizeof(const char*)))
  1166. {
  1167. ret[0] = capture_1;
  1168. ret[1] = capture_2;
  1169. ret[2] = nullptr;
  1170. return ret;
  1171. }
  1172. }
  1173. return nullptr;
  1174. }
  1175. CARLA_EXPORT
  1176. jack_port_t* jack_port_by_name(jack_client_t* /*client*/, const char* name)
  1177. {
  1178. carla_stdout("CarlaJackClient :: %s | %s", __FUNCTION__, name);
  1179. // CarlaJackClient* const jclient = (CarlaJackClient*)client;
  1180. // CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  1181. // const JackClientState& jstate(jclient->fState);
  1182. //CARLA_SAFE_ASSERT_RETURN(jstate.activated, 0);
  1183. static const JackPortState capturePorts[] = {
  1184. JackPortState("system", "capture_1", 0, JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal, true),
  1185. JackPortState("system", "capture_2", 1, JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal, true),
  1186. };
  1187. static const JackPortState playbackPorts[] = {
  1188. JackPortState("system", "playback_1", 3, JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal, true),
  1189. JackPortState("system", "playback_2", 4, JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal, true),
  1190. };
  1191. if (std::strncmp(name, "system:", 7) == 0)
  1192. {
  1193. name += 7;
  1194. /**/ if (std::strncmp(name, "capture_", 8) == 0)
  1195. {
  1196. name += 8;
  1197. const int index = std::atoi(name);
  1198. CARLA_SAFE_ASSERT_RETURN(index >= 0 && index < 2, nullptr);
  1199. return (jack_port_t*)&capturePorts[index];
  1200. }
  1201. else if (std::strncmp(name, "playback_", 9) == 0)
  1202. {
  1203. name += 9;
  1204. const int index = std::atoi(name);
  1205. CARLA_SAFE_ASSERT_RETURN(index >= 0, nullptr);
  1206. return (jack_port_t*)&playbackPorts[index];
  1207. }
  1208. else
  1209. {
  1210. carla_stderr2("Invalid port short name: '%s'", name);
  1211. return nullptr;
  1212. }
  1213. }
  1214. carla_stderr2("Invalid port name: '%s'", name);
  1215. return nullptr;
  1216. }
  1217. CARLA_EXPORT
  1218. jack_port_t* jack_port_by_id(jack_client_t*, jack_port_id_t)
  1219. {
  1220. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1221. return nullptr;
  1222. }
  1223. CARLA_EXPORT
  1224. void jack_set_info_function(void (*func)(const char *))
  1225. {
  1226. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1227. (void)func;
  1228. }
  1229. CARLA_EXPORT
  1230. int jack_set_freewheel(jack_client_t*, int)
  1231. {
  1232. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1233. return 1;
  1234. }
  1235. CARLA_EXPORT
  1236. int jack_set_buffer_size(jack_client_t*, jack_nframes_t)
  1237. {
  1238. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1239. return 1;
  1240. }
  1241. CARLA_EXPORT
  1242. int jack_engine_takeover_timebase(jack_client_t*)
  1243. {
  1244. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1245. return ENOSYS;
  1246. }
  1247. CARLA_EXPORT
  1248. float jack_cpu_load(jack_client_t*)
  1249. {
  1250. return 0.0f;
  1251. }
  1252. CARLA_EXPORT
  1253. int jack_client_name_size(void)
  1254. {
  1255. return STR_MAX;
  1256. }
  1257. CARLA_EXPORT
  1258. void jack_port_get_latency_range(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t* range)
  1259. {
  1260. range->min = range->max = 0;
  1261. }
  1262. CARLA_EXPORT
  1263. jack_nframes_t jack_port_get_latency(jack_port_t*)
  1264. {
  1265. return 0;
  1266. }
  1267. CARLA_EXPORT
  1268. int jack_set_xrun_callback(jack_client_t*, JackXRunCallback, void*)
  1269. {
  1270. return 0;
  1271. }
  1272. CARLA_EXPORT
  1273. int jack_set_thread_init_callback(jack_client_t*, JackThreadInitCallback, void*)
  1274. {
  1275. return 0;
  1276. }
  1277. CARLA_EXPORT
  1278. int jack_port_name_size(void)
  1279. {
  1280. return STR_MAX;
  1281. }
  1282. CARLA_EXPORT
  1283. int jack_port_connected(const jack_port_t*)
  1284. {
  1285. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1286. return 1;
  1287. }
  1288. CARLA_EXPORT
  1289. const char* JACK_METADATA_PRETTY_NAME;
  1290. const char* JACK_METADATA_PRETTY_NAME = "http://jackaudio.org/metadata/pretty-name";
  1291. // jack_ringbuffer_create
  1292. // jack_port_is_mine
  1293. // jack_port_set_name
  1294. // jack_port_get_all_connections
  1295. // jack_port_uuid
  1296. // --------------------------------------------------------------------------------------------------------------------
  1297. #include "jackbridge/JackBridge2.cpp"
  1298. #include "CarlaBridgeUtils.cpp"
  1299. // --------------------------------------------------------------------------------------------------------------------