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.

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