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.

1307 lines
45KB

  1. /*
  2. * Carla JACK API for external applications
  3. * Copyright (C) 2016-2019 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "libjack.hpp"
  18. #include "CarlaThread.hpp"
  19. #include <signal.h>
  20. #include <sys/prctl.h>
  21. #include <sys/time.h>
  22. // ---------------------------------------------------------------------------------------------------------------------
  23. typedef int (*CarlaInterposedCallback)(int, void*);
  24. CARLA_EXPORT
  25. int jack_carla_interposed_action(uint, uint, void*)
  26. {
  27. carla_stderr2("Non-export jack_carla_interposed_action called, this should not happen!!");
  28. return 1337;
  29. }
  30. // ---------------------------------------------------------------------------------------------------------------------
  31. CARLA_BACKEND_START_NAMESPACE
  32. // ---------------------------------------------------------------------------------------------------------------------
  33. static int64_t getCurrentTimeMilliseconds() noexcept
  34. {
  35. struct timeval tv;
  36. gettimeofday (&tv, nullptr);
  37. return ((int64_t) tv.tv_sec) * 1000 + tv.tv_usec / 1000;
  38. }
  39. static int carla_interposed_callback(int, void*);
  40. // ---------------------------------------------------------------------------------------------------------------------
  41. class CarlaJackRealtimeThread : public CarlaThread
  42. {
  43. public:
  44. struct Callback {
  45. Callback() {}
  46. virtual ~Callback() {};
  47. virtual void runRealtimeThread() = 0;
  48. };
  49. CarlaJackRealtimeThread(Callback* const callback)
  50. : CarlaThread("CarlaJackRealtimeThread"),
  51. fCallback(callback) {}
  52. protected:
  53. void run() override
  54. {
  55. fCallback->runRealtimeThread();
  56. }
  57. private:
  58. Callback* const fCallback;
  59. CARLA_DECLARE_NON_COPY_CLASS(CarlaJackRealtimeThread)
  60. };
  61. // --------------------------------------------------------------------------------------------------------------------
  62. class CarlaJackNonRealtimeThread : public CarlaThread
  63. {
  64. public:
  65. struct Callback {
  66. Callback() {}
  67. virtual ~Callback() {};
  68. virtual void runNonRealtimeThread() = 0;
  69. };
  70. CarlaJackNonRealtimeThread(Callback* const callback)
  71. : CarlaThread("CarlaJackNonRealtimeThread"),
  72. fCallback(callback) {}
  73. protected:
  74. void run() override
  75. {
  76. fCallback->runNonRealtimeThread();
  77. }
  78. private:
  79. Callback* const fCallback;
  80. CARLA_DECLARE_NON_COPY_CLASS(CarlaJackNonRealtimeThread)
  81. };
  82. // ---------------------------------------------------------------------------------------------------------------------
  83. class CarlaJackAppClient : public CarlaJackRealtimeThread::Callback,
  84. public CarlaJackNonRealtimeThread::Callback
  85. {
  86. public:
  87. JackServerState fServer;
  88. LinkedList<JackClientState*> fClients;
  89. CarlaJackAppClient()
  90. : fServer(this),
  91. fClients(),
  92. fShmAudioPool(),
  93. fShmRtClientControl(),
  94. fShmNonRtClientControl(),
  95. fShmNonRtServerControl(),
  96. fAudioPoolCopy(nullptr),
  97. fAudioTmpBuf(nullptr),
  98. fDummyMidiInBuffer(true),
  99. fDummyMidiOutBuffer(false),
  100. fMidiInBuffers(nullptr),
  101. fMidiOutBuffers(nullptr),
  102. fIsOffline(false),
  103. fIsReady(false),
  104. fLastPingTime(-1),
  105. fSessionManager(0),
  106. fSetupHints(0),
  107. fRealtimeThread(this),
  108. fNonRealtimeThread(this),
  109. fRealtimeThreadMutex()
  110. {
  111. carla_debug("CarlaJackAppClient::CarlaJackAppClient()");
  112. const char* const shmIds(std::getenv("CARLA_SHM_IDS"));
  113. CARLA_SAFE_ASSERT_INT2_RETURN(shmIds != nullptr && std::strlen(shmIds) == 6*4, std::strlen(shmIds), 6*4,);
  114. const char* const libjackSetup(std::getenv("CARLA_LIBJACK_SETUP"));
  115. CARLA_SAFE_ASSERT_RETURN(libjackSetup != nullptr && std::strlen(libjackSetup) >= 6,);
  116. // make sure we don't get loaded again
  117. carla_unsetenv("CARLA_SHM_IDS");
  118. // kill ourselves if main carla dies
  119. ::prctl(PR_SET_PDEATHSIG, SIGKILL);
  120. for (int i=4; --i >= 0;) {
  121. CARLA_SAFE_ASSERT_RETURN(libjackSetup[i] >= '0' && libjackSetup[i] <= '0'+64,);
  122. }
  123. for (int i=6; --i >= 4;) {
  124. CARLA_SAFE_ASSERT_RETURN(libjackSetup[i] >= '0' && libjackSetup[i] < '0'+0x4f,);
  125. }
  126. std::memcpy(fBaseNameAudioPool, shmIds+6*0, 6);
  127. std::memcpy(fBaseNameRtClientControl, shmIds+6*1, 6);
  128. std::memcpy(fBaseNameNonRtClientControl, shmIds+6*2, 6);
  129. std::memcpy(fBaseNameNonRtServerControl, shmIds+6*3, 6);
  130. fBaseNameAudioPool[6] = '\0';
  131. fBaseNameRtClientControl[6] = '\0';
  132. fBaseNameNonRtClientControl[6] = '\0';
  133. fBaseNameNonRtServerControl[6] = '\0';
  134. fServer.numAudioIns = static_cast<uint8_t>(libjackSetup[0] - '0');
  135. fServer.numAudioOuts = static_cast<uint8_t>(libjackSetup[1] - '0');
  136. fServer.numMidiIns = static_cast<uint8_t>(libjackSetup[2] - '0');
  137. fServer.numMidiOuts = static_cast<uint8_t>(libjackSetup[3] - '0');
  138. fSessionManager = libjackSetup[4] - '0';
  139. fSetupHints = libjackSetup[5] - '0';
  140. jack_carla_interposed_action(LIBJACK_INTERPOSER_ACTION_SET_HINTS_AND_CALLBACK, fSetupHints, (void*)carla_interposed_callback);
  141. jack_carla_interposed_action(LIBJACK_INTERPOSER_ACTION_SET_SESSION_MANAGER, fSessionManager, nullptr);
  142. fNonRealtimeThread.startThread(false);
  143. }
  144. ~CarlaJackAppClient() noexcept override
  145. {
  146. carla_debug("CarlaJackAppClient::~CarlaJackAppClient()");
  147. fLastPingTime = -1;
  148. fNonRealtimeThread.stopThread(5000);
  149. const CarlaMutexLocker cms(fRealtimeThreadMutex);
  150. for (LinkedList<JackClientState*>::Itenerator it = fClients.begin2(); it.valid(); it.next())
  151. {
  152. JackClientState* const jclient(it.getValue(nullptr));
  153. CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr);
  154. delete jclient;
  155. }
  156. fClients.clear();
  157. }
  158. JackClientState* createClient(const char* const name)
  159. {
  160. while (fNonRealtimeThread.isThreadRunning() && ! fIsReady)
  161. carla_sleep(1);
  162. return new JackClientState(fServer, name);
  163. }
  164. void destroyClient(JackClientState* const jclient)
  165. {
  166. {
  167. const CarlaMutexLocker cms(fRealtimeThreadMutex);
  168. fClients.removeOne(jclient);
  169. }
  170. delete jclient;
  171. }
  172. bool activateClient(JackClientState* const jclient)
  173. {
  174. const CarlaMutexLocker cms(fRealtimeThreadMutex);
  175. if (! fClients.append(jclient))
  176. return false;
  177. jclient->activated = true;
  178. jclient->deactivated = false;
  179. return true;
  180. }
  181. bool deactivateClient(JackClientState* const jclient)
  182. {
  183. const CarlaMutexLocker cms(fRealtimeThreadMutex);
  184. if (! fClients.removeOne(jclient))
  185. return false;
  186. jclient->activated = false;
  187. jclient->deactivated = true;
  188. return true;
  189. }
  190. pthread_t getRealtimeThreadId() const noexcept
  191. {
  192. return (pthread_t)fRealtimeThread.getThreadId();
  193. }
  194. int handleInterposerCallback(const int cb_action, void* const ptr)
  195. {
  196. carla_debug("handleInterposerCallback(%o, %p)", cb_action, ptr);
  197. switch (cb_action)
  198. {
  199. case 1: {
  200. const CarlaMutexLocker cml(fShmNonRtServerControl.mutex);
  201. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerUiClosed);
  202. fShmNonRtServerControl.commitWrite();
  203. break;
  204. }
  205. }
  206. return 0;
  207. // maybe unused
  208. (void)ptr;
  209. }
  210. // -------------------------------------------------------------------
  211. protected:
  212. void runRealtimeThread() override;
  213. void runNonRealtimeThread() override;
  214. private:
  215. bool initSharedMemmory();
  216. void clearSharedMemory() noexcept;
  217. bool handleRtData();
  218. bool handleNonRtData();
  219. BridgeAudioPool fShmAudioPool;
  220. BridgeRtClientControl fShmRtClientControl;
  221. BridgeNonRtClientControl fShmNonRtClientControl;
  222. BridgeNonRtServerControl fShmNonRtServerControl;
  223. float* fAudioPoolCopy;
  224. float* fAudioTmpBuf;
  225. JackMidiPortBufferDummy fDummyMidiInBuffer;
  226. JackMidiPortBufferDummy fDummyMidiOutBuffer;
  227. JackMidiPortBufferOnStack* fMidiInBuffers;
  228. JackMidiPortBufferOnStack* fMidiOutBuffers;
  229. char fBaseNameAudioPool[6+1];
  230. char fBaseNameRtClientControl[6+1];
  231. char fBaseNameNonRtClientControl[6+1];
  232. char fBaseNameNonRtServerControl[6+1];
  233. bool fIsOffline;
  234. volatile bool fIsReady;
  235. int64_t fLastPingTime;
  236. int fSessionManager;
  237. int fSetupHints;
  238. CarlaJackRealtimeThread fRealtimeThread;
  239. CarlaJackNonRealtimeThread fNonRealtimeThread;
  240. CarlaMutex fRealtimeThreadMutex;
  241. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaJackAppClient)
  242. };
  243. // ---------------------------------------------------------------------------------------------------------------------
  244. bool CarlaJackAppClient::initSharedMemmory()
  245. {
  246. if (! fShmAudioPool.attachClient(fBaseNameAudioPool))
  247. {
  248. carla_stderr("Failed to attach to audio pool shared memory");
  249. return false;
  250. }
  251. if (! fShmRtClientControl.attachClient(fBaseNameRtClientControl))
  252. {
  253. clearSharedMemory();
  254. carla_stderr("Failed to attach to rt client control shared memory");
  255. return false;
  256. }
  257. if (! fShmRtClientControl.mapData())
  258. {
  259. clearSharedMemory();
  260. carla_stderr("Failed to map rt client control shared memory");
  261. return false;
  262. }
  263. if (! fShmNonRtClientControl.attachClient(fBaseNameNonRtClientControl))
  264. {
  265. clearSharedMemory();
  266. carla_stderr("Failed to attach to non-rt client control shared memory");
  267. return false;
  268. }
  269. if (! fShmNonRtClientControl.mapData())
  270. {
  271. clearSharedMemory();
  272. carla_stderr("Failed to map non-rt control client shared memory");
  273. return false;
  274. }
  275. if (! fShmNonRtServerControl.attachClient(fBaseNameNonRtServerControl))
  276. {
  277. clearSharedMemory();
  278. carla_stderr("Failed to attach to non-rt server control shared memory");
  279. return false;
  280. }
  281. if (! fShmNonRtServerControl.mapData())
  282. {
  283. clearSharedMemory();
  284. carla_stderr("Failed to map non-rt control server shared memory");
  285. return false;
  286. }
  287. PluginBridgeNonRtClientOpcode opcode;
  288. opcode = fShmNonRtClientControl.readOpcode();
  289. CARLA_SAFE_ASSERT_RETURN(opcode == kPluginBridgeNonRtClientVersion, false);
  290. const uint32_t apiVersion = fShmNonRtClientControl.readUInt();
  291. CARLA_SAFE_ASSERT_RETURN(apiVersion == CARLA_PLUGIN_BRIDGE_API_VERSION, false);
  292. const uint32_t shmRtClientDataSize = fShmNonRtClientControl.readUInt();
  293. CARLA_SAFE_ASSERT_INT2(shmRtClientDataSize == sizeof(BridgeRtClientData), shmRtClientDataSize, sizeof(BridgeRtClientData));
  294. const uint32_t shmNonRtClientDataSize = fShmNonRtClientControl.readUInt();
  295. CARLA_SAFE_ASSERT_INT2(shmNonRtClientDataSize == sizeof(BridgeNonRtClientData), shmNonRtClientDataSize, sizeof(BridgeNonRtClientData));
  296. const uint32_t shmNonRtServerDataSize = fShmNonRtClientControl.readUInt();
  297. CARLA_SAFE_ASSERT_INT2(shmNonRtServerDataSize == sizeof(BridgeNonRtServerData), shmNonRtServerDataSize, sizeof(BridgeNonRtServerData));
  298. if (shmRtClientDataSize != sizeof(BridgeRtClientData) ||
  299. shmNonRtClientDataSize != sizeof(BridgeNonRtClientData) ||
  300. shmNonRtServerDataSize != sizeof(BridgeNonRtServerData))
  301. {
  302. carla_stderr2("CarlaJackAppClient: data size mismatch");
  303. return false;
  304. }
  305. opcode = fShmNonRtClientControl.readOpcode();
  306. CARLA_SAFE_ASSERT_RETURN(opcode == kPluginBridgeNonRtClientInitialSetup, false);
  307. fServer.bufferSize = fShmNonRtClientControl.readUInt();
  308. fServer.sampleRate = fShmNonRtClientControl.readDouble();
  309. if (fServer.bufferSize == 0 || carla_isZero(fServer.sampleRate))
  310. {
  311. carla_stderr2("CarlaJackAppClient: invalid empty state");
  312. return false;
  313. }
  314. fAudioTmpBuf = new float[fServer.bufferSize];
  315. carla_zeroFloats(fAudioTmpBuf, fServer.bufferSize);
  316. fLastPingTime = getCurrentTimeMilliseconds();
  317. CARLA_SAFE_ASSERT(fLastPingTime > 0);
  318. {
  319. // tell backend we're live
  320. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  321. // ready!
  322. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerReady);
  323. fShmNonRtServerControl.commitWrite();
  324. fShmNonRtServerControl.waitIfDataIsReachingLimit();
  325. }
  326. fIsReady = true;
  327. return true;
  328. }
  329. void CarlaJackAppClient::clearSharedMemory() noexcept
  330. {
  331. const CarlaMutexLocker cml(fRealtimeThreadMutex);
  332. if (fAudioPoolCopy != nullptr)
  333. {
  334. delete[] fAudioPoolCopy;
  335. fAudioPoolCopy = nullptr;
  336. }
  337. if (fAudioTmpBuf != nullptr)
  338. {
  339. delete[] fAudioTmpBuf;
  340. fAudioTmpBuf = nullptr;
  341. }
  342. if (fMidiInBuffers != nullptr)
  343. {
  344. delete[] fMidiInBuffers;
  345. fMidiInBuffers = nullptr;
  346. }
  347. if (fMidiOutBuffers != nullptr)
  348. {
  349. delete[] fMidiOutBuffers;
  350. fMidiOutBuffers = nullptr;
  351. }
  352. fShmAudioPool.clear();
  353. fShmRtClientControl.clear();
  354. fShmNonRtClientControl.clear();
  355. fShmNonRtServerControl.clear();
  356. }
  357. bool CarlaJackAppClient::handleRtData()
  358. {
  359. const BridgeRtClientControl::WaitHelper helper(fShmRtClientControl);
  360. if (! helper.ok)
  361. return false;
  362. bool ret = false;
  363. for (; fShmRtClientControl.isDataAvailableForReading();)
  364. {
  365. const PluginBridgeRtClientOpcode opcode(fShmRtClientControl.readOpcode());
  366. #ifdef DEBUG
  367. if (opcode != kPluginBridgeRtClientProcess && opcode != kPluginBridgeRtClientMidiEvent) {
  368. carla_debug("CarlaJackAppClientRtThread::run() - got opcode: %s", PluginBridgeRtClientOpcode2str(opcode));
  369. }
  370. #endif
  371. switch (opcode)
  372. {
  373. case kPluginBridgeRtClientNull:
  374. break;
  375. case kPluginBridgeRtClientSetAudioPool: {
  376. const CarlaMutexLocker cml(fRealtimeThreadMutex);
  377. if (fShmAudioPool.data != nullptr)
  378. {
  379. jackbridge_shm_unmap(fShmAudioPool.shm, fShmAudioPool.data);
  380. fShmAudioPool.data = nullptr;
  381. }
  382. if (fAudioPoolCopy != nullptr)
  383. {
  384. delete[] fAudioPoolCopy;
  385. fAudioPoolCopy = nullptr;
  386. }
  387. const uint64_t poolSize(fShmRtClientControl.readULong());
  388. CARLA_SAFE_ASSERT_BREAK(poolSize > 0);
  389. fShmAudioPool.data = (float*)jackbridge_shm_map(fShmAudioPool.shm, static_cast<size_t>(poolSize));
  390. fAudioPoolCopy = new float[poolSize];
  391. break;
  392. }
  393. case kPluginBridgeRtClientSetBufferSize:
  394. if (const uint32_t newBufferSize = fShmRtClientControl.readUInt())
  395. {
  396. if (fServer.bufferSize != newBufferSize)
  397. {
  398. const CarlaMutexLocker cml(fRealtimeThreadMutex);
  399. fServer.bufferSize = newBufferSize;
  400. for (LinkedList<JackClientState*>::Itenerator it = fClients.begin2(); it.valid(); it.next())
  401. {
  402. JackClientState* const jclient(it.getValue(nullptr));
  403. CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr);
  404. jclient->bufferSizeCb(fServer.bufferSize, jclient->bufferSizeCbPtr);
  405. }
  406. delete[] fAudioTmpBuf;
  407. fAudioTmpBuf = new float[fServer.bufferSize];
  408. carla_zeroFloats(fAudioTmpBuf, fServer.bufferSize);
  409. }
  410. }
  411. break;
  412. case kPluginBridgeRtClientSetSampleRate: {
  413. const double newSampleRate = fShmRtClientControl.readDouble();
  414. if (carla_isNotZero(newSampleRate) && carla_isNotEqual(fServer.sampleRate, newSampleRate))
  415. {
  416. const CarlaMutexLocker cml(fRealtimeThreadMutex);
  417. fServer.sampleRate = newSampleRate;
  418. for (LinkedList<JackClientState*>::Itenerator it = fClients.begin2(); it.valid(); it.next())
  419. {
  420. JackClientState* const jclient(it.getValue(nullptr));
  421. CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr);
  422. jclient->sampleRateCb(static_cast<uint32_t>(fServer.sampleRate), jclient->sampleRateCbPtr);
  423. }
  424. }
  425. } break;
  426. case kPluginBridgeRtClientSetOnline:
  427. // TODO inform changes
  428. fIsOffline = fShmRtClientControl.readBool();
  429. //offlineModeChanged(fIsOffline);
  430. break;
  431. case kPluginBridgeRtClientControlEventParameter:
  432. case kPluginBridgeRtClientControlEventMidiBank:
  433. case kPluginBridgeRtClientControlEventMidiProgram:
  434. case kPluginBridgeRtClientControlEventAllSoundOff:
  435. case kPluginBridgeRtClientControlEventAllNotesOff:
  436. break;
  437. case kPluginBridgeRtClientMidiEvent: {
  438. const uint32_t time(fShmRtClientControl.readUInt());
  439. const uint8_t port(fShmRtClientControl.readByte());
  440. const uint8_t size(fShmRtClientControl.readByte());
  441. CARLA_SAFE_ASSERT_BREAK(size > 0);
  442. if (port >= fServer.numMidiIns || size > JackMidiPortBufferBase::kMaxEventSize || ! fRealtimeThreadMutex.tryLock())
  443. {
  444. for (uint8_t i=0; i<size; ++i)
  445. fShmRtClientControl.readByte();
  446. break;
  447. }
  448. JackMidiPortBufferOnStack& midiPortBuf(fMidiInBuffers[port]);
  449. if (midiPortBuf.count < JackMidiPortBufferBase::kMaxEventCount &&
  450. midiPortBuf.bufferPoolPos + size < JackMidiPortBufferBase::kBufferPoolSize)
  451. {
  452. jack_midi_event_t& ev(midiPortBuf.events[midiPortBuf.count++]);
  453. ev.time = time;
  454. ev.size = size;
  455. ev.buffer = midiPortBuf.bufferPool + midiPortBuf.bufferPoolPos;
  456. midiPortBuf.bufferPoolPos += size;
  457. for (uint8_t i=0; i<size; ++i)
  458. ev.buffer[i] = fShmRtClientControl.readByte();
  459. }
  460. fRealtimeThreadMutex.unlock(true);
  461. break;
  462. }
  463. case kPluginBridgeRtClientProcess: {
  464. const uint32_t frames(fShmRtClientControl.readUInt());
  465. CARLA_SAFE_ASSERT_UINT2_BREAK(frames == fServer.bufferSize, frames, fServer.bufferSize);
  466. // TODO tell client of xrun in case buffersize does not match
  467. // FIXME - lock if offline
  468. const CarlaMutexTryLocker cmtl(fRealtimeThreadMutex);
  469. if (cmtl.wasLocked())
  470. {
  471. CARLA_SAFE_ASSERT_BREAK(fShmAudioPool.data != nullptr);
  472. // mixdown is default, do buffer addition (for multiple clients) if requested
  473. const bool doBufferAddition = fSetupHints & 0x10;
  474. // location to start of audio outputs (shm buffer)
  475. float* const fdataRealOuts = fShmAudioPool.data+(fServer.bufferSize*fServer.numAudioIns);
  476. if (doBufferAddition && fServer.numAudioOuts > 0)
  477. carla_zeroFloats(fdataRealOuts, fServer.bufferSize*fServer.numAudioOuts);
  478. if (! fClients.isEmpty())
  479. {
  480. // save tranport for all clients
  481. const BridgeTimeInfo& bridgeTimeInfo(fShmRtClientControl.data->timeInfo);
  482. fServer.playing = bridgeTimeInfo.playing;
  483. fServer.position.frame = static_cast<jack_nframes_t>(bridgeTimeInfo.frame);
  484. fServer.position.usecs = bridgeTimeInfo.usecs;
  485. if (bridgeTimeInfo.validFlags & kPluginBridgeTimeInfoValidBBT)
  486. {
  487. fServer.position.valid = JackPositionBBT;
  488. fServer.position.bar = bridgeTimeInfo.bar;
  489. fServer.position.beat = bridgeTimeInfo.beat;
  490. fServer.position.tick = static_cast<int32_t>(bridgeTimeInfo.tick + 0.5);
  491. fServer.position.beats_per_bar = bridgeTimeInfo.beatsPerBar;
  492. fServer.position.beat_type = bridgeTimeInfo.beatType;
  493. fServer.position.ticks_per_beat = bridgeTimeInfo.ticksPerBeat;
  494. fServer.position.beats_per_minute = bridgeTimeInfo.beatsPerMinute;
  495. fServer.position.bar_start_tick = bridgeTimeInfo.barStartTick;
  496. }
  497. else
  498. {
  499. fServer.position.valid = static_cast<jack_position_bits_t>(0x0);
  500. }
  501. int numClientOutputsProcessed = 0;
  502. // now go through each client
  503. for (LinkedList<JackClientState*>::Itenerator it = fClients.begin2(); it.valid(); it.next())
  504. {
  505. JackClientState* const jclient(it.getValue(nullptr));
  506. CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr);
  507. // FIXME - lock if offline
  508. const CarlaMutexTryLocker cmtl2(jclient->mutex);
  509. // check if we can process
  510. if (cmtl2.wasNotLocked() || jclient->processCb == nullptr || ! jclient->activated)
  511. {
  512. if (fServer.numAudioOuts > 0)
  513. carla_zeroFloats(fdataRealOuts, fServer.bufferSize*fServer.numAudioOuts);
  514. if (jclient->deactivated)
  515. fShmRtClientControl.data->procFlags = 1;
  516. }
  517. else
  518. {
  519. uint8_t i;
  520. // direct access to shm buffer, used only for inputs
  521. float* fdataReal = fShmAudioPool.data;
  522. // safe temp location for output, mixed down to shm buffer later on
  523. float* fdataCopy = fAudioPoolCopy;
  524. // wherever we're using fAudioTmpBuf
  525. bool needsTmpBufClear = false;
  526. // set audio inputs
  527. i = 0;
  528. for (LinkedList<JackPortState*>::Itenerator it2 = jclient->audioIns.begin2(); it2.valid(); it2.next())
  529. {
  530. JackPortState* const jport = it2.getValue(nullptr);
  531. CARLA_SAFE_ASSERT_CONTINUE(jport != nullptr);
  532. if (i++ < fServer.numAudioIns)
  533. {
  534. if (numClientOutputsProcessed == 0 || ! doBufferAddition)
  535. jport->buffer = fdataReal;
  536. else
  537. jport->buffer = fdataRealOuts + (i*fServer.bufferSize);
  538. fdataReal += fServer.bufferSize;
  539. fdataCopy += fServer.bufferSize;
  540. }
  541. else
  542. {
  543. jport->buffer = fAudioTmpBuf;
  544. needsTmpBufClear = true;
  545. }
  546. }
  547. if (i < fServer.numAudioIns)
  548. {
  549. const std::size_t remainingBufferSize = fServer.bufferSize * static_cast<uint8_t>(fServer.numAudioIns - i);
  550. //fdataReal += remainingBufferSize;
  551. fdataCopy += remainingBufferSize;
  552. }
  553. // location to start of audio outputs
  554. float* const fdataCopyOuts = fdataCopy;
  555. // set audio ouputs
  556. i = 0;
  557. for (LinkedList<JackPortState*>::Itenerator it2 = jclient->audioOuts.begin2(); it2.valid(); it2.next())
  558. {
  559. JackPortState* const jport = it2.getValue(nullptr);
  560. CARLA_SAFE_ASSERT_CONTINUE(jport != nullptr);
  561. if (i++ < fServer.numAudioOuts)
  562. {
  563. jport->buffer = fdataCopy;
  564. fdataCopy += fServer.bufferSize;
  565. }
  566. else
  567. {
  568. jport->buffer = fAudioTmpBuf;
  569. needsTmpBufClear = true;
  570. }
  571. }
  572. if (i < fServer.numAudioOuts)
  573. {
  574. const std::size_t remainingBufferSize = fServer.bufferSize * static_cast<uint8_t>(fServer.numAudioOuts - i);
  575. carla_zeroFloats(fdataCopy, remainingBufferSize);
  576. //fdataCopy += remainingBufferSize;
  577. }
  578. // set midi inputs
  579. i = 0;
  580. for (LinkedList<JackPortState*>::Itenerator it2 = jclient->midiIns.begin2(); it2.valid(); it2.next())
  581. {
  582. JackPortState* const jport = it2.getValue(nullptr);
  583. CARLA_SAFE_ASSERT_CONTINUE(jport != nullptr);
  584. if (i++ < fServer.numMidiIns)
  585. jport->buffer = &fMidiInBuffers[i-1];
  586. else
  587. jport->buffer = &fDummyMidiInBuffer;
  588. }
  589. // set midi outputs
  590. i = 0;
  591. for (LinkedList<JackPortState*>::Itenerator it2 = jclient->midiOuts.begin2(); it2.valid(); it2.next())
  592. {
  593. JackPortState* const jport = it2.getValue(nullptr);
  594. CARLA_SAFE_ASSERT_CONTINUE(jport != nullptr);
  595. if (i++ < fServer.numMidiOuts)
  596. jport->buffer = &fMidiOutBuffers[i-1];
  597. else
  598. jport->buffer = &fDummyMidiOutBuffer;
  599. }
  600. if (needsTmpBufClear)
  601. carla_zeroFloats(fAudioTmpBuf, fServer.bufferSize);
  602. jclient->processCb(fServer.bufferSize, jclient->processCbPtr);
  603. if (fServer.numAudioOuts > 0)
  604. {
  605. if (++numClientOutputsProcessed == 1)
  606. {
  607. // first client, we can copy stuff over
  608. carla_copyFloats(fdataRealOuts, fdataCopyOuts,
  609. fServer.bufferSize*fServer.numAudioOuts);
  610. }
  611. else
  612. {
  613. // subsequent clients, add data (then divide by number of clients later on)
  614. carla_add(fdataRealOuts, fdataCopyOuts,
  615. fServer.bufferSize*fServer.numAudioOuts);
  616. if (doBufferAddition)
  617. {
  618. // for more than 1 client addition, we need to divide buffers now
  619. carla_multiply(fdataRealOuts,
  620. 1.0f/static_cast<float>(numClientOutputsProcessed),
  621. fServer.bufferSize*fServer.numAudioOuts);
  622. }
  623. }
  624. if (jclient->audioOuts.count() == 1 && fServer.numAudioOuts > 1)
  625. {
  626. for (uint8_t j=1; j<fServer.numAudioOuts; ++j)
  627. {
  628. carla_copyFloats(fdataRealOuts+(fServer.bufferSize*j),
  629. fdataCopyOuts,
  630. fServer.bufferSize);
  631. }
  632. }
  633. }
  634. }
  635. }
  636. if (numClientOutputsProcessed > 1 && ! doBufferAddition)
  637. {
  638. // more than 1 client active, need to divide buffers
  639. carla_multiply(fdataRealOuts,
  640. 1.0f/static_cast<float>(numClientOutputsProcessed),
  641. fServer.bufferSize*fServer.numAudioOuts);
  642. }
  643. }
  644. // fClients.isEmpty()
  645. else if (fServer.numAudioOuts > 0)
  646. {
  647. carla_zeroFloats(fdataRealOuts, fServer.bufferSize*fServer.numAudioOuts);
  648. }
  649. for (uint8_t i=0; i<fServer.numMidiIns; ++i)
  650. {
  651. fMidiInBuffers[i].count = 0;
  652. fMidiInBuffers[i].bufferPoolPos = 0;
  653. }
  654. if (fServer.numMidiOuts > 0)
  655. {
  656. uint8_t* midiData(fShmRtClientControl.data->midiOut);
  657. carla_zeroBytes(midiData, kBridgeBaseMidiOutHeaderSize);
  658. std::size_t curMidiDataPos = 0;
  659. for (uint8_t i=0; i<fServer.numMidiOuts; ++i)
  660. {
  661. JackMidiPortBufferOnStack& midiPortBuf(fMidiOutBuffers[i]);
  662. for (uint16_t j=0; j<midiPortBuf.count; ++j)
  663. {
  664. jack_midi_event_t& jmevent(midiPortBuf.events[j]);
  665. if (curMidiDataPos + kBridgeBaseMidiOutHeaderSize + jmevent.size >= kBridgeRtClientDataMidiOutSize)
  666. break;
  667. // set time
  668. *(uint32_t*)midiData = jmevent.time;
  669. midiData += 4;
  670. // set port
  671. *midiData++ = i;
  672. // set size
  673. *midiData++ = static_cast<uint8_t>(jmevent.size);
  674. // set data
  675. std::memcpy(midiData, jmevent.buffer, jmevent.size);
  676. midiData += jmevent.size;
  677. curMidiDataPos += kBridgeBaseMidiOutHeaderSize + jmevent.size;
  678. }
  679. }
  680. if (curMidiDataPos != 0 &&
  681. curMidiDataPos + kBridgeBaseMidiOutHeaderSize < kBridgeRtClientDataMidiOutSize)
  682. carla_zeroBytes(midiData, kBridgeBaseMidiOutHeaderSize);
  683. }
  684. }
  685. else
  686. {
  687. carla_stderr2("CarlaJackAppClient: fRealtimeThreadMutex tryLock failed");
  688. }
  689. break;
  690. }
  691. case kPluginBridgeRtClientQuit:
  692. ret = true;
  693. break;
  694. }
  695. #ifdef DEBUG
  696. if (opcode != kPluginBridgeRtClientProcess && opcode != kPluginBridgeRtClientMidiEvent) {
  697. carla_debug("CarlaJackAppClientRtThread::run() - opcode %s done", PluginBridgeRtClientOpcode2str(opcode));
  698. }
  699. #endif
  700. }
  701. return ret;
  702. }
  703. bool CarlaJackAppClient::handleNonRtData()
  704. {
  705. bool ret = false;
  706. for (; fShmNonRtClientControl.isDataAvailableForReading();)
  707. {
  708. const PluginBridgeNonRtClientOpcode opcode(fShmNonRtClientControl.readOpcode());
  709. #ifdef DEBUG
  710. if (opcode != kPluginBridgeNonRtClientPing) {
  711. carla_debug("CarlaJackAppClient::handleNonRtData() - got opcode: %s", PluginBridgeNonRtClientOpcode2str(opcode));
  712. }
  713. #endif
  714. if (opcode != kPluginBridgeNonRtClientNull && opcode != kPluginBridgeNonRtClientPingOnOff && fLastPingTime > 0)
  715. fLastPingTime = getCurrentTimeMilliseconds();
  716. switch (opcode)
  717. {
  718. case kPluginBridgeNonRtClientNull:
  719. break;
  720. case kPluginBridgeNonRtClientVersion: {
  721. const uint apiVersion = fShmNonRtServerControl.readUInt();
  722. CARLA_SAFE_ASSERT_UINT2(apiVersion == CARLA_PLUGIN_BRIDGE_API_VERSION, apiVersion, CARLA_PLUGIN_BRIDGE_API_VERSION);
  723. } break;
  724. case kPluginBridgeNonRtClientPing: {
  725. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  726. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPong);
  727. fShmNonRtServerControl.commitWrite();
  728. } break;
  729. case kPluginBridgeNonRtClientPingOnOff: {
  730. const uint32_t onOff(fShmNonRtClientControl.readBool());
  731. fLastPingTime = onOff ? getCurrentTimeMilliseconds() : -1;
  732. } break;
  733. case kPluginBridgeNonRtClientActivate:
  734. case kPluginBridgeNonRtClientDeactivate:
  735. break;
  736. case kPluginBridgeNonRtClientInitialSetup:
  737. // should never happen!!
  738. fShmNonRtServerControl.readUInt();
  739. fShmNonRtServerControl.readDouble();
  740. break;
  741. case kPluginBridgeNonRtClientSetParameterValue:
  742. case kPluginBridgeNonRtClientSetParameterMidiChannel:
  743. case kPluginBridgeNonRtClientSetParameterMidiCC:
  744. case kPluginBridgeNonRtClientSetProgram:
  745. case kPluginBridgeNonRtClientSetMidiProgram:
  746. case kPluginBridgeNonRtClientSetCustomData:
  747. case kPluginBridgeNonRtClientSetChunkDataFile:
  748. break;
  749. case kPluginBridgeNonRtClientSetOption:
  750. fShmNonRtClientControl.readUInt();
  751. fShmNonRtClientControl.readBool();
  752. break;
  753. case kPluginBridgeNonRtClientSetCtrlChannel:
  754. fShmNonRtClientControl.readShort();
  755. break;
  756. case kPluginBridgeNonRtClientGetParameterText:
  757. fShmNonRtClientControl.readUInt();
  758. break;
  759. case kPluginBridgeNonRtClientPrepareForSave:
  760. {
  761. if (fSessionManager == 1 && std::getenv("NSM_URL") == nullptr) // auto
  762. {
  763. struct sigaction sig;
  764. carla_zeroStruct(sig);
  765. sigaction(SIGUSR1, nullptr, &sig);
  766. if (sig.sa_handler != nullptr)
  767. fSessionManager = 3;
  768. }
  769. if (fSessionManager == 3)
  770. ::kill(::getpid(), SIGUSR1);
  771. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  772. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerSaved);
  773. fShmNonRtServerControl.commitWrite();
  774. }
  775. break;
  776. case kPluginBridgeNonRtClientRestoreLV2State:
  777. break;
  778. case kPluginBridgeNonRtClientShowUI:
  779. if (jack_carla_interposed_action(LIBJACK_INTERPOSER_ACTION_SHOW_HIDE_GUI, 1, nullptr) == 1337)
  780. {
  781. // failed, LD_PRELOAD did not work?
  782. const char* const message("Cannot show UI, LD_PRELOAD not working?");
  783. const std::size_t messageSize(std::strlen(message));
  784. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  785. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerUiClosed);
  786. fShmNonRtServerControl.commitWrite();
  787. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerError);
  788. fShmNonRtServerControl.writeUInt(messageSize);
  789. fShmNonRtServerControl.writeCustomData(message, messageSize);
  790. fShmNonRtServerControl.commitWrite();
  791. }
  792. break;
  793. case kPluginBridgeNonRtClientHideUI:
  794. jack_carla_interposed_action(LIBJACK_INTERPOSER_ACTION_SHOW_HIDE_GUI, 0, nullptr);
  795. break;
  796. case kPluginBridgeNonRtClientUiParameterChange:
  797. case kPluginBridgeNonRtClientUiProgramChange:
  798. case kPluginBridgeNonRtClientUiMidiProgramChange:
  799. case kPluginBridgeNonRtClientUiNoteOn:
  800. case kPluginBridgeNonRtClientUiNoteOff:
  801. break;
  802. case kPluginBridgeNonRtClientQuit:
  803. ret = true;
  804. break;
  805. }
  806. #ifdef DEBUG
  807. if (opcode != kPluginBridgeNonRtClientPing) {
  808. carla_debug("CarlaJackAppClient::handleNonRtData() - opcode %s handled", PluginBridgeNonRtClientOpcode2str(opcode));
  809. }
  810. #endif
  811. }
  812. return ret;
  813. }
  814. void CarlaJackAppClient::runRealtimeThread()
  815. {
  816. carla_debug("CarlaJackAppClient runRealtimeThread START");
  817. #ifdef __SSE2_MATH__
  818. // Set FTZ and DAZ flags
  819. _mm_setcsr(_mm_getcsr() | 0x8040);
  820. #endif
  821. bool quitReceived = false;
  822. for (; ! fRealtimeThread.shouldThreadExit();)
  823. {
  824. if (handleRtData())
  825. {
  826. quitReceived = true;
  827. break;
  828. }
  829. }
  830. fNonRealtimeThread.signalThreadShouldExit();
  831. carla_debug("CarlaJackAppClient runRealtimeThread FINISHED");
  832. // TODO
  833. return; (void)quitReceived;
  834. }
  835. void CarlaJackAppClient::runNonRealtimeThread()
  836. {
  837. carla_debug("CarlaJackAppClient runNonRealtimeThread START");
  838. CARLA_SAFE_ASSERT_RETURN(initSharedMemmory(),);
  839. if (fServer.numMidiIns > 0)
  840. {
  841. fMidiInBuffers = new JackMidiPortBufferOnStack[fServer.numMidiIns];
  842. for (uint8_t i=0; i<fServer.numMidiIns; ++i)
  843. fMidiInBuffers[i].isInput = true;
  844. }
  845. if (fServer.numMidiOuts > 0)
  846. {
  847. fMidiOutBuffers = new JackMidiPortBufferOnStack[fServer.numMidiOuts];
  848. for (uint8_t i=0; i<fServer.numMidiOuts; ++i)
  849. fMidiOutBuffers[i].isInput = false;
  850. }
  851. fRealtimeThread.startThread(true);
  852. fLastPingTime = getCurrentTimeMilliseconds();
  853. carla_stdout("Carla Jack Client Ready!");
  854. bool quitReceived = false,
  855. timedOut = false;
  856. for (; ! fNonRealtimeThread.shouldThreadExit();)
  857. {
  858. carla_msleep(50);
  859. try {
  860. quitReceived = handleNonRtData();
  861. } CARLA_SAFE_EXCEPTION("handleNonRtData");
  862. if (quitReceived)
  863. break;
  864. /*
  865. if (fLastPingTime > 0 && getCurrentTimeMilliseconds() > fLastPingTime + 30000)
  866. {
  867. carla_stderr("Did not receive ping message from server for 30 secs, closing...");
  868. timedOut = true;
  869. fRealtimeThread.signalThreadShouldExit();
  870. break;
  871. }
  872. */
  873. }
  874. //callback(ENGINE_CALLBACK_ENGINE_STOPPED, 0, 0, 0, 0.0f, nullptr);
  875. if (quitReceived)
  876. {
  877. ::kill(::getpid(), SIGTERM);
  878. }
  879. else if (timedOut)
  880. {
  881. // TODO send shutdown?
  882. carla_stderr("CarlaJackAppClient error: runNonRealtimeThread ended with time out");
  883. ::kill(::getpid(), SIGTERM);
  884. }
  885. else
  886. {
  887. bool activated;
  888. {
  889. const CarlaMutexLocker cms(fRealtimeThreadMutex);
  890. if (fClients.isEmpty())
  891. {
  892. activated = false;
  893. }
  894. else if (JackClientState* const jclient = fClients.getLast(nullptr))
  895. {
  896. const CarlaMutexLocker cms2(jclient->mutex);
  897. activated = jclient->activated;
  898. }
  899. else
  900. {
  901. activated = true;
  902. }
  903. }
  904. if (activated)
  905. {
  906. carla_stderr("CarlaJackAppClient error: runNonRealtimeThread ended while client is activated");
  907. const char* const message("Plugin bridge error, process thread has stopped");
  908. const std::size_t messageSize(std::strlen(message));
  909. const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
  910. fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerError);
  911. fShmNonRtServerControl.writeUInt(messageSize);
  912. fShmNonRtServerControl.writeCustomData(message, messageSize);
  913. fShmNonRtServerControl.commitWrite();
  914. }
  915. }
  916. if (fRealtimeThread.isThreadRunning())
  917. {
  918. fRealtimeThread.signalThreadShouldExit();
  919. const CarlaMutexLocker cml(fRealtimeThreadMutex);
  920. if (fShmRtClientControl.data != nullptr)
  921. fShmRtClientControl.data->procFlags = 1;
  922. }
  923. clearSharedMemory();
  924. fRealtimeThread.stopThread(5000);
  925. carla_debug("CarlaJackAppClient runNonRealtimeThread FINISHED");
  926. }
  927. CARLA_BACKEND_END_NAMESPACE
  928. // ---------------------------------------------------------------------------------------------------------------------
  929. using CarlaBackend::CarlaJackAppClient;
  930. using CarlaBackend::JackClientState;
  931. static CarlaJackAppClient gClient;
  932. CARLA_BACKEND_START_NAMESPACE
  933. static int carla_interposed_callback(int cb_action, void* ptr)
  934. {
  935. return gClient.handleInterposerCallback(cb_action, ptr);
  936. }
  937. CARLA_BACKEND_END_NAMESPACE
  938. // ---------------------------------------------------------------------------------------------------------------------
  939. CARLA_EXPORT
  940. jack_client_t* jack_client_open(const char* client_name, jack_options_t options, jack_status_t* status, ...)
  941. {
  942. carla_debug("%s(%s, 0x%x, %p)", __FUNCTION__, client_name, options, status);
  943. if (JackClientState* const client = gClient.createClient(client_name))
  944. {
  945. if (status != nullptr)
  946. *status = static_cast<JackStatus>(0x0);
  947. return (jack_client_t*)client;
  948. }
  949. if (status != nullptr)
  950. *status = JackServerError;
  951. return nullptr;
  952. // unused
  953. (void)options;
  954. }
  955. CARLA_EXPORT
  956. jack_client_t* jack_client_new(const char* client_name)
  957. {
  958. return jack_client_open(client_name, JackNullOption, nullptr);
  959. }
  960. CARLA_EXPORT
  961. int jack_client_close(jack_client_t* client)
  962. {
  963. carla_debug("%s(%p)", __FUNCTION__, client);
  964. JackClientState* const jclient = (JackClientState*)client;
  965. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  966. gClient.destroyClient(jclient);
  967. return 0;
  968. }
  969. CARLA_EXPORT
  970. int jack_activate(jack_client_t* client)
  971. {
  972. carla_debug("%s(%p)", __FUNCTION__, client);
  973. JackClientState* const jclient = (JackClientState*)client;
  974. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  975. return gClient.activateClient(jclient) ? 0 : 1;
  976. }
  977. CARLA_EXPORT
  978. int jack_deactivate(jack_client_t* client)
  979. {
  980. carla_debug("%s(%p)", __FUNCTION__, client);
  981. JackClientState* const jclient = (JackClientState*)client;
  982. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  983. return gClient.deactivateClient(jclient) ? 0 : 1;
  984. }
  985. // ---------------------------------------------------------------------------------------------------------------------
  986. CARLA_EXPORT
  987. pthread_t jack_client_thread_id(jack_client_t* client)
  988. {
  989. carla_debug("%s(%p)", __FUNCTION__, client);
  990. JackClientState* const jclient = (JackClientState*)client;
  991. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 0);
  992. CarlaJackAppClient* const jackAppPtr = jclient->server.jackAppPtr;
  993. CARLA_SAFE_ASSERT_RETURN(jackAppPtr != nullptr && jackAppPtr == &gClient, 0);
  994. return jackAppPtr->getRealtimeThreadId();
  995. }
  996. // ---------------------------------------------------------------------------------------------------------------------
  997. #include "jackbridge/JackBridge2.cpp"
  998. #include "CarlaBridgeUtils.cpp"
  999. // ---------------------------------------------------------------------------------------------------------------------
  1000. // TODO
  1001. CARLA_BACKEND_USE_NAMESPACE
  1002. CARLA_EXPORT
  1003. int jack_client_real_time_priority(jack_client_t* client)
  1004. {
  1005. carla_debug("%s(%p)", __FUNCTION__, client);
  1006. // code as used by water
  1007. const int minPriority = sched_get_priority_min(SCHED_RR);
  1008. const int maxPriority = sched_get_priority_max(SCHED_RR);
  1009. return ((maxPriority - minPriority) * 9) / 10 + minPriority;
  1010. // unused
  1011. (void)client;
  1012. }
  1013. int jack_client_create_thread(jack_client_t* client, pthread_t* thread, int priority,
  1014. int realtime, void *(*start_routine)(void*), void* arg)
  1015. {
  1016. carla_stderr2("%s(%p, %p, %i, %i, %p, %p)", __FUNCTION__, client, thread, priority, realtime, start_routine, arg);
  1017. return ENOSYS;
  1018. }
  1019. typedef void (*JackSessionCallback)(jack_session_event_t*, void*);
  1020. CARLA_EXPORT
  1021. int jack_set_session_callback(jack_client_t* client, JackSessionCallback callback, void* arg)
  1022. {
  1023. carla_stderr2("%s(%p, %p, %p)", __FUNCTION__, client, callback, arg);
  1024. return 0;
  1025. }
  1026. // ---------------------------------------------------------------------------------------------------------------------