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.

1491 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. carla_stdout("CarlaJackClient::handleNonRtData() - got opcode: %s", PluginBridgeNonRtClientOpcode2str(opcode));
  397. }
  398. // #endif
  399. if (opcode != kPluginBridgeNonRtClientNull && opcode != kPluginBridgeNonRtClientPingOnOff && fLastPingTime > 0)
  400. fLastPingTime = Time::currentTimeMillis();
  401. switch (opcode)
  402. {
  403. case kPluginBridgeNonRtClientNull:
  404. break;
  405. case kPluginBridgeNonRtClientPing: {
  406. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  407. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPong);
  408. fShmNonRtServerControl.commitWrite();
  409. } break;
  410. case kPluginBridgeNonRtClientPingOnOff: {
  411. const uint32_t onOff(fShmNonRtClientControl.readBool());
  412. fLastPingTime = onOff ? Time::currentTimeMillis() : -1;
  413. } break;
  414. case kPluginBridgeNonRtClientActivate:
  415. case kPluginBridgeNonRtClientDeactivate:
  416. break;
  417. case kPluginBridgeNonRtClientSetBufferSize:
  418. fShmNonRtClientControl.readUInt();
  419. //bufferSizeChanged();
  420. break;
  421. case kPluginBridgeNonRtClientSetSampleRate:
  422. fShmNonRtClientControl.readDouble();
  423. //sampleRateChanged();
  424. break;
  425. case kPluginBridgeNonRtClientSetOffline:
  426. fIsOffline = true;
  427. //offlineModeChanged(true);
  428. break;
  429. case kPluginBridgeNonRtClientSetOnline:
  430. fIsOffline = false;
  431. //offlineModeChanged(false);
  432. break;
  433. case kPluginBridgeNonRtClientSetParameterValue:
  434. case kPluginBridgeNonRtClientSetParameterMidiChannel:
  435. case kPluginBridgeNonRtClientSetParameterMidiCC:
  436. case kPluginBridgeNonRtClientSetProgram:
  437. case kPluginBridgeNonRtClientSetMidiProgram:
  438. case kPluginBridgeNonRtClientSetCustomData:
  439. case kPluginBridgeNonRtClientSetChunkDataFile:
  440. case kPluginBridgeNonRtClientSetCtrlChannel:
  441. case kPluginBridgeNonRtClientSetOption:
  442. break;
  443. case kPluginBridgeNonRtClientPrepareForSave:
  444. {
  445. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  446. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerSaved);
  447. fShmNonRtServerControl.commitWrite();
  448. }
  449. break;
  450. case kPluginBridgeNonRtClientShowUI:
  451. case kPluginBridgeNonRtClientHideUI:
  452. case kPluginBridgeNonRtClientUiParameterChange:
  453. case kPluginBridgeNonRtClientUiProgramChange:
  454. case kPluginBridgeNonRtClientUiMidiProgramChange:
  455. case kPluginBridgeNonRtClientUiNoteOn:
  456. case kPluginBridgeNonRtClientUiNoteOff:
  457. break;
  458. case kPluginBridgeNonRtClientQuit:
  459. signalThreadShouldExit();
  460. break;
  461. }
  462. }
  463. }
  464. // -------------------------------------------------------------------
  465. protected:
  466. void run() override
  467. {
  468. carla_stderr("CarlaJackClient run START");
  469. #ifdef __SSE2_MATH__
  470. // Set FTZ and DAZ flags
  471. _mm_setcsr(_mm_getcsr() | 0x8040);
  472. #endif
  473. bool quitReceived = false;
  474. for (; ! quitReceived && ! threadShouldExit();)
  475. {
  476. handleNonRtData();
  477. const BridgeRtClientControl::WaitHelper helper(fShmRtClientControl);
  478. if (! helper.ok)
  479. continue;
  480. for (; fShmRtClientControl.isDataAvailableForReading();)
  481. {
  482. const PluginBridgeRtClientOpcode opcode(fShmRtClientControl.readOpcode());
  483. //#ifdef DEBUG
  484. if (opcode != kPluginBridgeRtClientProcess && opcode != kPluginBridgeRtClientMidiEvent)
  485. {
  486. carla_stdout("CarlaJackClientRtThread::run() - got opcode: %s", PluginBridgeRtClientOpcode2str(opcode));
  487. }
  488. //#endif
  489. switch (opcode)
  490. {
  491. case kPluginBridgeRtClientNull:
  492. break;
  493. case kPluginBridgeRtClientSetAudioPool: {
  494. if (fShmAudioPool.data != nullptr)
  495. {
  496. jackbridge_shm_unmap(fShmAudioPool.shm, fShmAudioPool.data);
  497. fShmAudioPool.data = nullptr;
  498. }
  499. const uint64_t poolSize(fShmRtClientControl.readULong());
  500. CARLA_SAFE_ASSERT_BREAK(poolSize > 0);
  501. fShmAudioPool.data = (float*)jackbridge_shm_map(fShmAudioPool.shm, static_cast<size_t>(poolSize));
  502. break;
  503. }
  504. case kPluginBridgeRtClientControlEventParameter:
  505. case kPluginBridgeRtClientControlEventMidiBank:
  506. case kPluginBridgeRtClientControlEventMidiProgram:
  507. case kPluginBridgeRtClientControlEventAllSoundOff:
  508. case kPluginBridgeRtClientControlEventAllNotesOff:
  509. case kPluginBridgeRtClientMidiEvent:
  510. break;
  511. case kPluginBridgeRtClientProcess: {
  512. CARLA_SAFE_ASSERT_BREAK(fShmAudioPool.data != nullptr);
  513. const CarlaMutexTryLocker cmtl(fRealtimeThreadMutex);
  514. if (cmtl.wasLocked())
  515. {
  516. float* fdata = fShmAudioPool.data;
  517. if (fState.process == nullptr || ! fState.activated)
  518. {
  519. for (uint32_t i=0; i<fAudioIns; ++i)
  520. fdata += fState.bufferSize*fAudioIns;
  521. if (fAudioOuts > 0)
  522. carla_zeroFloats(fdata, fState.bufferSize*fAudioOuts);
  523. }
  524. else
  525. {
  526. const BridgeTimeInfo& bridgeTimeInfo(fShmRtClientControl.data->timeInfo);
  527. uint32_t i = 0;
  528. for (LinkedList<JackPortState*>::Itenerator it = fState.audioIns.begin2(); it.valid(); it.next())
  529. {
  530. CARLA_SAFE_ASSERT_BREAK(i++ < fAudioIns);
  531. if (JackPortState* const jport = it.getValue(nullptr))
  532. jport->buffer = fdata;
  533. fdata += fState.bufferSize;
  534. }
  535. i=0;
  536. for (LinkedList<JackPortState*>::Itenerator it = fState.audioOuts.begin2(); it.valid(); it.next())
  537. {
  538. CARLA_SAFE_ASSERT_BREAK(i++ < fAudioOuts);
  539. if (JackPortState* const jport = it.getValue(nullptr))
  540. jport->buffer = fdata;
  541. fdata += fState.bufferSize;
  542. }
  543. fState.playing = bridgeTimeInfo.playing;
  544. fState.position.frame = bridgeTimeInfo.frame;
  545. fState.position.usecs = bridgeTimeInfo.usecs;
  546. if (bridgeTimeInfo.valid & 0x1 /* kValidBBT */)
  547. {
  548. fState.position.valid = JackPositionBBT;
  549. fState.position.bar = bridgeTimeInfo.bar;
  550. fState.position.beat = bridgeTimeInfo.beat;
  551. fState.position.tick = bridgeTimeInfo.tick;
  552. fState.position.beats_per_bar = bridgeTimeInfo.beatsPerBar;
  553. fState.position.beat_type = bridgeTimeInfo.beatType;
  554. fState.position.ticks_per_beat = bridgeTimeInfo.ticksPerBeat;
  555. fState.position.beats_per_minute = bridgeTimeInfo.beatsPerMinute;
  556. fState.position.bar_start_tick = bridgeTimeInfo.barStartTick;
  557. }
  558. else
  559. {
  560. fState.position.valid = static_cast<jack_position_bits_t>(0);
  561. }
  562. fState.process(fState.bufferSize, fState.processPtr);
  563. }
  564. }
  565. else
  566. {
  567. carla_stderr2("CarlaJackClient: fRealtimeThreadMutex tryLock failed");
  568. }
  569. carla_zeroBytes(fShmRtClientControl.data->midiOut, kBridgeRtClientDataMidiOutSize);
  570. break;
  571. }
  572. case kPluginBridgeRtClientQuit:
  573. quitReceived = true;
  574. signalThreadShouldExit();
  575. break;
  576. }
  577. }
  578. }
  579. carla_stderr("CarlaJackClient run END");
  580. //callback(ENGINE_CALLBACK_ENGINE_STOPPED, 0, 0, 0, 0.0f, nullptr);
  581. if (! quitReceived)
  582. {
  583. const char* const message("Plugin bridge error, process thread has stopped");
  584. const std::size_t messageSize(std::strlen(message));
  585. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  586. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerError);
  587. fShmNonRtServerControl.writeUInt(messageSize);
  588. fShmNonRtServerControl.writeCustomData(message, messageSize);
  589. fShmNonRtServerControl.commitWrite();
  590. }
  591. if (fState.shutdown != nullptr)
  592. fState.shutdown(fState.shutdownPtr);
  593. }
  594. private:
  595. BridgeAudioPool fShmAudioPool;
  596. BridgeRtClientControl fShmRtClientControl;
  597. BridgeNonRtClientControl fShmNonRtClientControl;
  598. BridgeNonRtServerControl fShmNonRtServerControl;
  599. CarlaString fBaseNameAudioPool;
  600. CarlaString fBaseNameRtClientControl;
  601. CarlaString fBaseNameNonRtClientControl;
  602. CarlaString fBaseNameNonRtServerControl;
  603. bool fIsOffline;
  604. bool fFirstIdle;
  605. int64_t fLastPingTime;
  606. uint32_t fAudioIns;
  607. uint32_t fAudioOuts;
  608. CarlaMutex fRealtimeThreadMutex;
  609. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaJackClient)
  610. };
  611. CARLA_BACKEND_END_NAMESPACE
  612. // --------------------------------------------------------------------------------------------------------------------
  613. CARLA_BACKEND_USE_NAMESPACE
  614. CarlaJackClient* global_client = nullptr;
  615. CARLA_EXPORT
  616. jack_client_t* jack_client_open(const char* client_name, jack_options_t /*options*/, jack_status_t* status, ...)
  617. {
  618. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  619. if (global_client != nullptr)
  620. return (jack_client_t*)global_client;
  621. const char* const shmIds(std::getenv("CARLA_SHM_IDS"));
  622. if (shmIds == nullptr || std::strlen(shmIds) != 6*4)
  623. {
  624. if (status != nullptr)
  625. *status = JackFailure;
  626. return nullptr;
  627. }
  628. char audioPoolBaseName[6+1];
  629. char rtClientBaseName[6+1];
  630. char nonRtClientBaseName[6+1];
  631. char nonRtServerBaseName[6+1];
  632. std::memcpy(audioPoolBaseName, shmIds+6*0, 6);
  633. std::memcpy(rtClientBaseName, shmIds+6*1, 6);
  634. std::memcpy(nonRtClientBaseName, shmIds+6*2, 6);
  635. std::memcpy(nonRtServerBaseName, shmIds+6*3, 6);
  636. audioPoolBaseName[6] = '\0';
  637. rtClientBaseName[6] = '\0';
  638. nonRtClientBaseName[6] = '\0';
  639. nonRtServerBaseName[6] = '\0';
  640. CarlaJackClient* const client = new CarlaJackClient(audioPoolBaseName, rtClientBaseName,
  641. nonRtClientBaseName, nonRtServerBaseName);
  642. if (! client->init(client_name))
  643. {
  644. if (status != nullptr)
  645. *status = JackServerError;
  646. return nullptr;
  647. }
  648. global_client = client;
  649. return (jack_client_t*)client;
  650. }
  651. CARLA_EXPORT
  652. jack_client_t* jack_client_new(const char* client_name)
  653. {
  654. return jack_client_open(client_name, JackNullOption, nullptr);
  655. }
  656. CARLA_EXPORT
  657. int jack_client_close(jack_client_t* client)
  658. {
  659. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  660. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  661. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  662. JackClientState& jstate(jclient->fState);
  663. if (jstate.activated)
  664. {
  665. jclient->deactivate();
  666. }
  667. return 0;
  668. jclient->close();
  669. delete jclient;
  670. return 0;
  671. }
  672. CARLA_EXPORT
  673. jack_port_t* jack_port_register(jack_client_t* client, const char* port_name, const char* port_type,
  674. unsigned long flags, unsigned long /*buffer_size*/)
  675. {
  676. carla_stdout("CarlaJackClient :: %s | %s %s %lu", __FUNCTION__, port_name, port_type, flags);
  677. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  678. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, nullptr);
  679. JackClientState& jstate(jclient->fState);
  680. const bool isActivated(jstate.activated);
  681. //CARLA_SAFE_ASSERT(! isActivated);
  682. CARLA_SAFE_ASSERT_RETURN(port_name != nullptr && port_name[0] != '\0', nullptr);
  683. CARLA_SAFE_ASSERT_RETURN(port_type != nullptr && port_type[0] != '\0', nullptr);
  684. if (std::strcmp(port_type, JACK_DEFAULT_AUDIO_TYPE) == 0)
  685. {
  686. uint32_t index;
  687. /**/ if (flags & JackPortIsInput)
  688. {
  689. if (isActivated)
  690. {
  691. CARLA_SAFE_ASSERT_RETURN(jstate.fakeIns > 0, nullptr);
  692. jstate.fakeIns -= 1;
  693. index = jstate.audioIns.count() - jstate.fakeIns - 1;
  694. }
  695. else
  696. {
  697. index = jstate.audioIns.count();
  698. jstate.audioIns.append(new JackPortState(port_name, index, flags));
  699. }
  700. return (jack_port_t*)jstate.audioIns.getAt(index, nullptr);
  701. }
  702. else if (flags & JackPortIsOutput)
  703. {
  704. if (isActivated)
  705. {
  706. CARLA_SAFE_ASSERT_RETURN(jstate.fakeOuts > 0, nullptr);
  707. jstate.fakeOuts -= 1;
  708. index = jstate.audioOuts.count() - jstate.fakeOuts - 1;
  709. }
  710. else
  711. {
  712. index = jstate.audioOuts.count();
  713. jstate.audioOuts.append(new JackPortState(port_name, index, flags));
  714. }
  715. return (jack_port_t*)jstate.audioOuts.getAt(index, nullptr);
  716. }
  717. carla_stderr2("Invalid port flags '%x'", flags);
  718. return nullptr;
  719. }
  720. carla_stderr2("Invalid port type '%s'", port_type);
  721. return nullptr;
  722. }
  723. CARLA_EXPORT
  724. int jack_port_unregister(jack_client_t* client, jack_port_t* port)
  725. {
  726. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  727. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  728. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  729. JackPortState* const jport = (JackPortState*)port;
  730. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 1);
  731. JackClientState& jstate(jclient->fState);
  732. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  733. if (jport->flags & JackPortIsOutput)
  734. {
  735. CARLA_SAFE_ASSERT_RETURN(jstate.audioIns.removeOne(jport), 1);
  736. }
  737. else
  738. {
  739. CARLA_SAFE_ASSERT_RETURN(jstate.audioOuts.removeOne(jport), 1);
  740. }
  741. return 0;
  742. }
  743. CARLA_EXPORT
  744. void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t)
  745. {
  746. JackPortState* const jport = (JackPortState*)port;
  747. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  748. return jport->buffer;
  749. }
  750. CARLA_EXPORT
  751. int jack_set_process_callback(jack_client_t* client, JackProcessCallback callback, void* arg)
  752. {
  753. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  754. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  755. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  756. JackClientState& jstate(jclient->fState);
  757. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  758. jstate.process = callback;
  759. jstate.processPtr = arg;
  760. return 0;
  761. }
  762. CARLA_EXPORT
  763. void jack_on_shutdown(jack_client_t* client, JackShutdownCallback callback, void* arg)
  764. {
  765. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  766. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  767. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr,);
  768. JackClientState& jstate(jclient->fState);
  769. CARLA_SAFE_ASSERT_RETURN(! jstate.activated,);
  770. jstate.shutdown = callback;
  771. jstate.shutdownPtr = arg;
  772. }
  773. CARLA_EXPORT
  774. int jack_activate(jack_client_t* client)
  775. {
  776. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  777. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  778. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  779. const JackClientState& jstate(jclient->fState);
  780. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  781. jclient->activate();
  782. return 0;
  783. }
  784. CARLA_EXPORT
  785. int jack_deactivate(jack_client_t* client)
  786. {
  787. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  788. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  789. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  790. const JackClientState& jstate(jclient->fState);
  791. CARLA_SAFE_ASSERT_RETURN(jstate.activated, 1);
  792. jclient->deactivate();
  793. return 0;
  794. }
  795. CARLA_EXPORT
  796. char* jack_get_client_name(jack_client_t* client)
  797. {
  798. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  799. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  800. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, nullptr);
  801. const JackClientState& jstate(jclient->fState);
  802. return jstate.name;
  803. }
  804. CARLA_EXPORT
  805. jack_nframes_t jack_get_buffer_size(jack_client_t* client)
  806. {
  807. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  808. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  809. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  810. const JackClientState& jstate(jclient->fState);
  811. return jstate.bufferSize;
  812. }
  813. CARLA_EXPORT
  814. jack_nframes_t jack_get_sample_rate(jack_client_t* client)
  815. {
  816. carla_debug("CarlaJackClient :: %s", __FUNCTION__);
  817. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  818. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  819. const JackClientState& jstate(jclient->fState);
  820. return jstate.sampleRate;
  821. }
  822. // --------------------------------------------------------------------------------------------------------------------
  823. CARLA_EXPORT
  824. void jack_set_error_function(void (*func)(const char *))
  825. {
  826. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  827. (void)func;
  828. }
  829. CARLA_EXPORT
  830. int jack_set_sync_callback(jack_client_t* client, JackSyncCallback /*callback*/, void* /*arg*/)
  831. {
  832. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  833. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  834. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  835. const JackClientState& jstate(jclient->fState);
  836. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  837. // TODO
  838. return 0;
  839. }
  840. CARLA_EXPORT
  841. int jack_set_timebase_callback(jack_client_t* client, int, JackTimebaseCallback, void*)
  842. {
  843. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  844. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  845. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  846. const JackClientState& jstate(jclient->fState);
  847. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  848. // TODO
  849. return EBUSY;
  850. }
  851. CARLA_EXPORT
  852. int jack_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback /*callback*/, void* /*arg*/)
  853. {
  854. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  855. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  856. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  857. const JackClientState& jstate(jclient->fState);
  858. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  859. // TODO
  860. return 0;
  861. }
  862. CARLA_EXPORT
  863. int jack_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback /*callback*/, void* /*arg*/)
  864. {
  865. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  866. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  867. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  868. const JackClientState& jstate(jclient->fState);
  869. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  870. // TODO
  871. return 0;
  872. }
  873. CARLA_EXPORT
  874. int jack_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback, void*)
  875. {
  876. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  877. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  878. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  879. const JackClientState& jstate(jclient->fState);
  880. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  881. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  882. return 0;
  883. }
  884. CARLA_EXPORT
  885. int jack_set_port_registration_callback(jack_client_t* client, JackPortRegistrationCallback, void*)
  886. {
  887. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  888. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  889. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  890. const JackClientState& jstate(jclient->fState);
  891. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  892. return 0;
  893. }
  894. CARLA_EXPORT
  895. int jack_set_port_connect_callback(jack_client_t* client, JackPortConnectCallback, void*)
  896. {
  897. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  898. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  899. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  900. const JackClientState& jstate(jclient->fState);
  901. CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  902. return 0;
  903. }
  904. CARLA_EXPORT
  905. int jack_set_graph_order_callback(jack_client_t* client, JackGraphOrderCallback, 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_is_realtime(jack_client_t*)
  916. {
  917. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  918. return 0;
  919. }
  920. CARLA_EXPORT
  921. int jack_transport_locate(jack_client_t*, jack_nframes_t)
  922. {
  923. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  924. return 1;
  925. }
  926. CARLA_EXPORT
  927. jack_transport_state_t jack_transport_query(const jack_client_t* client, jack_position_t* pos)
  928. {
  929. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  930. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  931. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, JackTransportStopped);
  932. const JackClientState& jstate(jclient->fState);
  933. CARLA_SAFE_ASSERT_RETURN(jstate.activated, JackTransportStopped);
  934. if (pos != nullptr)
  935. std::memcpy(pos, &jstate.position, sizeof(jack_position_t));
  936. return jstate.playing ? JackTransportRolling : JackTransportStopped;
  937. }
  938. CARLA_EXPORT
  939. int jack_transport_reposition(jack_client_t*, const jack_position_t*)
  940. {
  941. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  942. return EINVAL;
  943. }
  944. CARLA_EXPORT
  945. void jack_transport_start(jack_client_t*)
  946. {
  947. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  948. }
  949. CARLA_EXPORT
  950. void jack_transport_stop (jack_client_t*)
  951. {
  952. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  953. }
  954. CARLA_EXPORT
  955. pthread_t jack_client_thread_id(jack_client_t* client)
  956. {
  957. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  958. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  959. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  960. const JackClientState& jstate(jclient->fState);
  961. CARLA_SAFE_ASSERT_RETURN(jstate.activated, 0);
  962. return (pthread_t)jclient->getThreadId();
  963. }
  964. CARLA_EXPORT
  965. jack_nframes_t jack_frame_time(const jack_client_t* client)
  966. {
  967. carla_debug("CarlaJackClient :: %s", __FUNCTION__);
  968. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  969. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  970. const JackClientState& jstate(jclient->fState);
  971. CARLA_SAFE_ASSERT_RETURN(jstate.activated, 0);
  972. return jstate.position.usecs;
  973. }
  974. CARLA_EXPORT
  975. void jack_free(void* ptr)
  976. {
  977. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  978. free(ptr);
  979. }
  980. CARLA_EXPORT
  981. jack_nframes_t jack_midi_get_event_count(void*)
  982. {
  983. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  984. return 0;
  985. }
  986. CARLA_EXPORT
  987. int jack_midi_event_get(jack_midi_event_t*, void*, uint32_t)
  988. {
  989. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  990. return ENODATA;
  991. }
  992. CARLA_EXPORT
  993. const char* jack_port_short_name(const jack_port_t* port)
  994. {
  995. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  996. JackPortState* const jport = (JackPortState*)port;
  997. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  998. return jport->name;
  999. }
  1000. CARLA_EXPORT
  1001. const char* jack_port_name(const jack_port_t* port)
  1002. {
  1003. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1004. JackPortState* const jport = (JackPortState*)port;
  1005. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  1006. return jport->fullname;
  1007. }
  1008. CARLA_EXPORT
  1009. int jack_port_flags(const jack_port_t* port)
  1010. {
  1011. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1012. JackPortState* const jport = (JackPortState*)port;
  1013. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 0);
  1014. return jport->flags;
  1015. }
  1016. CARLA_EXPORT
  1017. const char* jack_port_type(const jack_port_t* port)
  1018. {
  1019. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1020. JackPortState* const jport = (JackPortState*)port;
  1021. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  1022. // TODO
  1023. return JACK_DEFAULT_AUDIO_TYPE;
  1024. }
  1025. CARLA_EXPORT
  1026. int jack_client_real_time_priority(jack_client_t*)
  1027. {
  1028. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1029. return -1;
  1030. }
  1031. CARLA_EXPORT
  1032. int jack_connect(jack_client_t*, const char*, const char*)
  1033. {
  1034. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1035. return 0;
  1036. }
  1037. CARLA_EXPORT
  1038. int jack_disconnect(jack_client_t*, const char*, const char*)
  1039. {
  1040. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1041. return 0;
  1042. }
  1043. CARLA_EXPORT
  1044. const char** jack_get_ports(jack_client_t*, const char* a, const char* b, unsigned long flags)
  1045. {
  1046. carla_stdout("CarlaJackClient :: %s | %s %s %li", __FUNCTION__, a, b, flags);
  1047. static const char* capture_1 = "system:capture_1";
  1048. static const char* capture_2 = "system:capture_2";
  1049. static const char* playback_1 = "system:playback_1";
  1050. static const char* playback_2 = "system:playback_2";
  1051. if (flags == 0 || (flags & (JackPortIsInput|JackPortIsOutput)) != 0)
  1052. {
  1053. if (const char** const ret = (const char**)calloc(5, sizeof(const char*)))
  1054. {
  1055. ret[0] = capture_1;
  1056. ret[1] = capture_2;
  1057. ret[2] = playback_1;
  1058. ret[3] = playback_2;
  1059. ret[4] = nullptr;
  1060. return ret;
  1061. }
  1062. }
  1063. if (flags & JackPortIsInput)
  1064. {
  1065. if (const char** const ret = (const char**)calloc(3, sizeof(const char*)))
  1066. {
  1067. ret[0] = playback_1;
  1068. ret[1] = playback_2;
  1069. ret[2] = nullptr;
  1070. return ret;
  1071. }
  1072. }
  1073. if (flags & JackPortIsOutput)
  1074. {
  1075. if (const char** const ret = (const char**)calloc(3, sizeof(const char*)))
  1076. {
  1077. ret[0] = capture_1;
  1078. ret[1] = capture_2;
  1079. ret[2] = nullptr;
  1080. return ret;
  1081. }
  1082. }
  1083. return nullptr;
  1084. }
  1085. CARLA_EXPORT
  1086. jack_port_t* jack_port_by_name(jack_client_t*, const char*)
  1087. {
  1088. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1089. return nullptr;
  1090. }
  1091. CARLA_EXPORT
  1092. jack_port_t* jack_port_by_id(jack_client_t*, jack_port_id_t)
  1093. {
  1094. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1095. return nullptr;
  1096. }
  1097. CARLA_EXPORT
  1098. void jack_set_info_function(void (*func)(const char *))
  1099. {
  1100. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1101. (void)func;
  1102. }
  1103. CARLA_EXPORT
  1104. int jack_set_freewheel(jack_client_t*, int)
  1105. {
  1106. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1107. return 1;
  1108. }
  1109. CARLA_EXPORT
  1110. int jack_set_buffer_size(jack_client_t*, jack_nframes_t)
  1111. {
  1112. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1113. return 1;
  1114. }
  1115. CARLA_EXPORT
  1116. int jack_engine_takeover_timebase(jack_client_t*)
  1117. {
  1118. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  1119. return ENOSYS;
  1120. }
  1121. CARLA_EXPORT
  1122. float jack_cpu_load(jack_client_t*)
  1123. {
  1124. return 0.0f;
  1125. }
  1126. CARLA_EXPORT
  1127. int jack_client_name_size(void)
  1128. {
  1129. return STR_MAX;
  1130. }
  1131. CARLA_EXPORT
  1132. void jack_port_get_latency_range(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t* range)
  1133. {
  1134. range->min = range->max = 0;
  1135. }
  1136. CARLA_EXPORT
  1137. jack_nframes_t jack_port_get_latency(jack_port_t*)
  1138. {
  1139. return 0;
  1140. }
  1141. CARLA_EXPORT
  1142. int jack_set_xrun_callback(jack_client_t*, JackXRunCallback, void*)
  1143. {
  1144. return 0;
  1145. }
  1146. CARLA_EXPORT
  1147. int jack_set_thread_init_callback(jack_client_t*, JackThreadInitCallback, void*)
  1148. {
  1149. return 0;
  1150. }
  1151. // --------------------------------------------------------------------------------------------------------------------
  1152. #include "jackbridge/JackBridge2.cpp"
  1153. #include "CarlaBridgeUtils.cpp"
  1154. // --------------------------------------------------------------------------------------------------------------------