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.

1293 lines
44KB

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