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.

1144 lines
39KB

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