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.

1533 lines
45KB

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