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.

1243 lines
42KB

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