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.

CarlaEngine.hpp 33KB

11 years ago
12 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
12 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
12 years ago
11 years ago
12 years ago
11 years ago
11 years ago
11 years ago
12 years ago
11 years ago
12 years ago
11 years ago
12 years ago
11 years ago
12 years ago
11 years ago
12 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255
  1. /*
  2. * Carla Engine API
  3. * Copyright (C) 2012-2013 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. #ifndef CARLA_ENGINE_HPP_INCLUDED
  18. #define CARLA_ENGINE_HPP_INCLUDED
  19. #include "CarlaBackend.hpp"
  20. #include "CarlaMIDI.h"
  21. #include "CarlaString.hpp"
  22. #ifdef BUILD_BRIDGE
  23. struct CarlaOscData;
  24. #endif
  25. CARLA_BACKEND_START_NAMESPACE
  26. #if 0
  27. } // Fix editor indentation
  28. #endif
  29. /*!
  30. * @defgroup CarlaEngineAPI Carla Engine API
  31. *
  32. * The Carla Engine API.
  33. * @{
  34. */
  35. /*!
  36. * The type of an engine.
  37. */
  38. enum EngineType {
  39. /*!
  40. * Null engine type.
  41. */
  42. kEngineTypeNull = 0,
  43. /*!
  44. * JACK engine type.\n
  45. * Provides all processing modes.
  46. */
  47. kEngineTypeJack = 1,
  48. /*!
  49. * Juce engine type, used to provide Native Audio and MIDI support.
  50. */
  51. kEngineTypeJuce = 2,
  52. /*!
  53. * RtAudio engine type, used to provide Native Audio and MIDI support.
  54. */
  55. kEngineTypeRtAudio = 3,
  56. /*!
  57. * Plugin engine type, used to export the engine as a plugin.
  58. */
  59. kEngineTypePlugin = 4,
  60. /*!
  61. * Bridge engine type, used in BridgePlugin class.
  62. */
  63. kEngineTypeBridge = 5
  64. };
  65. /*!
  66. * The type of an engine port.
  67. */
  68. enum EnginePortType {
  69. /*!
  70. * Null port type.
  71. */
  72. kEnginePortTypeNull = 0,
  73. /*!
  74. * Audio port type.
  75. * \see CarlaEngineAudioPort
  76. */
  77. kEnginePortTypeAudio = 1,
  78. /*!
  79. * CV port type.
  80. * \see CarlaEngineCVPort
  81. */
  82. kEnginePortTypeCV = 2,
  83. /*!
  84. * Event port type (Control or MIDI).
  85. ** \see CarlaEngineEventPort
  86. */
  87. kEnginePortTypeEvent = 3,
  88. /*!
  89. * OSC port type.
  90. ** \see CarlaEngineOscPort
  91. */
  92. kEnginePortTypeOSC = 4
  93. };
  94. /*!
  95. * The type of an engine event.
  96. */
  97. enum EngineEventType {
  98. /*!
  99. * Null port type.
  100. */
  101. kEngineEventTypeNull = 0,
  102. /*!
  103. * Control event type.
  104. * \see EngineControlEvent
  105. */
  106. kEngineEventTypeControl = 1,
  107. /*!
  108. * MIDI event type.
  109. * \see EngineMidiEvent
  110. */
  111. kEngineEventTypeMidi = 2
  112. };
  113. /*!
  114. * The type of an engine control event.
  115. */
  116. enum EngineControlEventType {
  117. /*!
  118. * Null event type.
  119. */
  120. kEngineControlEventTypeNull = 0,
  121. /*!
  122. * Parameter event type.\n
  123. * \note Value uses a normalized range of 0.0f<->1.0f.
  124. */
  125. kEngineControlEventTypeParameter = 1,
  126. /*!
  127. * MIDI Bank event type.
  128. */
  129. kEngineControlEventTypeMidiBank = 2,
  130. /*!
  131. * MIDI Program change event type.
  132. */
  133. kEngineControlEventTypeMidiProgram = 3,
  134. /*!
  135. * All sound off event type.
  136. */
  137. kEngineControlEventTypeAllSoundOff = 4,
  138. /*!
  139. * All notes off event type.
  140. */
  141. kEngineControlEventTypeAllNotesOff = 5
  142. };
  143. /*!
  144. * Engine control event.
  145. */
  146. struct EngineControlEvent {
  147. EngineControlEventType type; //!< Control-Event type.
  148. uint16_t param; //!< Parameter Id, midi bank or midi program.
  149. float value; //!< Parameter value, normalized to 0.0f<->1.0f.
  150. void clear() noexcept
  151. {
  152. type = kEngineControlEventTypeNull;
  153. param = 0;
  154. value = 0.0f;
  155. }
  156. };
  157. /*!
  158. * Engine MIDI event.
  159. */
  160. struct EngineMidiEvent {
  161. uint8_t port; //!< Port offset (usually 0)
  162. uint8_t data[4]; //!< MIDI data, without channel bit
  163. uint8_t size; //!< Number of bytes used
  164. void clear() noexcept
  165. {
  166. port = 0;
  167. data[0] = 0;
  168. data[1] = 0;
  169. data[2] = 0;
  170. data[3] = 0;
  171. size = 0;
  172. }
  173. };
  174. /*!
  175. * Engine event.
  176. */
  177. struct EngineEvent {
  178. EngineEventType type; //!< Event Type; either Control or MIDI
  179. uint32_t time; //!< Time offset in frames
  180. uint8_t channel; //!< Channel, used for MIDI-related events
  181. union {
  182. EngineControlEvent ctrl;
  183. EngineMidiEvent midi;
  184. };
  185. EngineEvent() noexcept
  186. {
  187. clear();
  188. }
  189. void clear() noexcept
  190. {
  191. type = kEngineEventTypeNull;
  192. time = 0;
  193. channel = 0;
  194. }
  195. };
  196. /*!
  197. * Engine options.
  198. */
  199. struct EngineOptions {
  200. ProcessMode processMode;
  201. TransportMode transportMode;
  202. bool forceStereo;
  203. bool preferPluginBridges;
  204. bool preferUiBridges;
  205. bool uisAlwaysOnTop;
  206. unsigned int maxParameters;
  207. unsigned int uiBridgesTimeout;
  208. unsigned int audioNumPeriods;
  209. unsigned int audioBufferSize;
  210. unsigned int audioSampleRate;
  211. CarlaString audioDevice;
  212. CarlaString resourceDir;
  213. #ifndef BUILD_BRIDGE
  214. CarlaString bridge_native;
  215. CarlaString bridge_posix32;
  216. CarlaString bridge_posix64;
  217. CarlaString bridge_win32;
  218. CarlaString bridge_win64;
  219. #endif
  220. #ifdef WANT_LV2
  221. CarlaString bridge_lv2Extrn;
  222. CarlaString bridge_lv2Gtk2;
  223. CarlaString bridge_lv2Gtk3;
  224. CarlaString bridge_lv2Qt4;
  225. CarlaString bridge_lv2Qt5;
  226. CarlaString bridge_lv2Cocoa;
  227. CarlaString bridge_lv2Win;
  228. CarlaString bridge_lv2X11;
  229. #endif
  230. #ifdef WANT_VST
  231. CarlaString bridge_vstMac;
  232. CarlaString bridge_vstHWND;
  233. CarlaString bridge_vstX11;
  234. #endif
  235. EngineOptions()
  236. #if defined(CARLA_OS_LINUX)
  237. : processMode(PROCESS_MODE_MULTIPLE_CLIENTS),
  238. transportMode(TRANSPORT_MODE_JACK),
  239. #else
  240. : processMode(PROCESS_MODE_CONTINUOUS_RACK),
  241. transportMode(TRANSPORT_MODE_INTERNAL),
  242. #endif
  243. forceStereo(false),
  244. preferPluginBridges(false),
  245. preferUiBridges(true),
  246. uisAlwaysOnTop(true),
  247. maxParameters(MAX_DEFAULT_PARAMETERS),
  248. uiBridgesTimeout(4000),
  249. audioNumPeriods(2),
  250. audioBufferSize(512),
  251. audioSampleRate(44100) {}
  252. };
  253. /*!
  254. * Engine BBT Time information.
  255. */
  256. struct EngineTimeInfoBBT {
  257. int32_t bar; //!< current bar
  258. int32_t beat; //!< current beat-within-bar
  259. int32_t tick; //!< current tick-within-beat
  260. double barStartTick;
  261. float beatsPerBar; //!< time signature "numerator"
  262. float beatType; //!< time signature "denominator"
  263. double ticksPerBeat;
  264. double beatsPerMinute;
  265. EngineTimeInfoBBT() noexcept
  266. : bar(0),
  267. beat(0),
  268. tick(0),
  269. barStartTick(0.0),
  270. beatsPerBar(0.0f),
  271. beatType(0.0f),
  272. ticksPerBeat(0.0),
  273. beatsPerMinute(0.0) {}
  274. };
  275. /*!
  276. * Engine Time information.
  277. */
  278. struct EngineTimeInfo {
  279. static const uint32_t ValidBBT = 0x1;
  280. bool playing;
  281. uint64_t frame;
  282. uint64_t usecs;
  283. uint32_t valid;
  284. EngineTimeInfoBBT bbt;
  285. EngineTimeInfo() noexcept
  286. {
  287. clear();
  288. }
  289. void clear() noexcept
  290. {
  291. playing = false;
  292. frame = 0;
  293. usecs = 0;
  294. valid = 0x0;
  295. }
  296. // quick operator, doesn't check all values
  297. bool operator==(const EngineTimeInfo& timeInfo) const noexcept
  298. {
  299. if (timeInfo.playing != playing || timeInfo.frame != frame)
  300. return false;
  301. if (timeInfo.valid != valid)
  302. return false;
  303. if (timeInfo.bbt.beatsPerMinute != bbt.beatsPerMinute)
  304. return false;
  305. return true;
  306. }
  307. bool operator!=(const EngineTimeInfo& timeInfo) const noexcept
  308. {
  309. return !operator==(timeInfo);
  310. }
  311. };
  312. // -----------------------------------------------------------------------
  313. /*!
  314. * Carla Engine port (Abstract).\n
  315. * This is the base class for all Carla Engine ports.
  316. */
  317. class CarlaEnginePort
  318. {
  319. public:
  320. /*!
  321. * The constructor.\n
  322. * Param \a isInput defines wherever this is an input port or not (output otherwise).\n
  323. * Input/output and process mode are constant for the lifetime of the port.
  324. */
  325. CarlaEnginePort(const CarlaEngine& engine, const bool isInput);
  326. /*!
  327. * The destructor.
  328. */
  329. virtual ~CarlaEnginePort();
  330. /*!
  331. * Get the type of the port, as provided by the respective subclasses.
  332. */
  333. virtual EnginePortType getType() const noexcept = 0;
  334. /*!
  335. * Initialize the port's internal buffer.
  336. */
  337. virtual void initBuffer() = 0;
  338. /*!
  339. * Check if this port is an input.
  340. */
  341. bool isInput() const noexcept
  342. {
  343. return fIsInput;
  344. }
  345. #ifndef DOXYGEN
  346. protected:
  347. const CarlaEngine& fEngine;
  348. const bool fIsInput;
  349. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEnginePort)
  350. #endif
  351. };
  352. /*!
  353. * Carla Engine Audio port.
  354. */
  355. class CarlaEngineAudioPort : public CarlaEnginePort
  356. {
  357. public:
  358. /*!
  359. * The constructor.\n
  360. * All constructor parameters are constant and will never change in the lifetime of the port.
  361. */
  362. CarlaEngineAudioPort(const CarlaEngine& engine, const bool isInput);
  363. /*!
  364. * The destructor.
  365. */
  366. virtual ~CarlaEngineAudioPort() override;
  367. /*!
  368. * Get the type of the port, in this case kEnginePortTypeAudio.
  369. */
  370. EnginePortType getType() const noexcept override
  371. {
  372. return kEnginePortTypeAudio;
  373. }
  374. /*!
  375. * Initialize the port's internal buffer.
  376. */
  377. virtual void initBuffer() override;
  378. /*!
  379. * Direct access to the port's audio buffer.
  380. */
  381. float* getBuffer() const noexcept
  382. {
  383. return fBuffer;
  384. }
  385. #ifndef DOXYGEN
  386. protected:
  387. float* fBuffer;
  388. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineAudioPort)
  389. #endif
  390. };
  391. /*!
  392. * Carla Engine CV port.
  393. */
  394. class CarlaEngineCVPort : public CarlaEnginePort
  395. {
  396. public:
  397. /*!
  398. * The constructor.\n
  399. * All constructor parameters are constant and will never change in the lifetime of the port.
  400. */
  401. CarlaEngineCVPort(const CarlaEngine& engine, const bool isInput);
  402. /*!
  403. * The destructor.
  404. */
  405. virtual ~CarlaEngineCVPort() override;
  406. /*!
  407. * Get the type of the port, in this case kEnginePortTypeCV.
  408. */
  409. EnginePortType getType() const noexcept override
  410. {
  411. return kEnginePortTypeCV;
  412. }
  413. /*!
  414. * Initialize the port's internal buffer for \a engine.
  415. */
  416. virtual void initBuffer() override;
  417. /*!
  418. * Write buffer back into the engine.
  419. */
  420. virtual void writeBuffer(const uint32_t frames, const uint32_t timeOffset);
  421. /*!
  422. * Set a new buffer size.
  423. */
  424. void setBufferSize(const uint32_t bufferSize);
  425. /*!
  426. * Direct access to the port's buffer.
  427. */
  428. float* getBuffer() const noexcept
  429. {
  430. return fBuffer;
  431. }
  432. #ifndef DOXYGEN
  433. protected:
  434. float* fBuffer;
  435. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineCVPort)
  436. #endif
  437. };
  438. /*!
  439. * Carla Engine Event port.
  440. */
  441. class CarlaEngineEventPort : public CarlaEnginePort
  442. {
  443. public:
  444. /*!
  445. * The constructor.\n
  446. * All constructor parameters are constant and will never change in the lifetime of the port.
  447. */
  448. CarlaEngineEventPort(const CarlaEngine& engine, const bool isInput);
  449. /*!
  450. * The destructor.
  451. */
  452. virtual ~CarlaEngineEventPort() override;
  453. /*!
  454. * Get the type of the port, in this case kEnginePortTypeEvent.
  455. */
  456. EnginePortType getType() const noexcept override
  457. {
  458. return kEnginePortTypeEvent;
  459. }
  460. /*!
  461. * Initialize the port's internal buffer for \a engine.
  462. */
  463. virtual void initBuffer() override;
  464. /*!
  465. * Get the number of events present in the buffer.
  466. * \note You must only call this for input ports.
  467. */
  468. virtual uint32_t getEventCount() const;
  469. /*!
  470. * Get the event at \a index.
  471. * \note You must only call this for input ports.
  472. */
  473. virtual const EngineEvent& getEvent(const uint32_t index);
  474. /*!
  475. * TODO.
  476. */
  477. virtual const EngineEvent& getEventUnchecked(const uint32_t index);
  478. /*!
  479. * Write a control event into the buffer.\n
  480. * Arguments are the same as in the EngineControlEvent struct.
  481. * \note You must only call this for output ports.
  482. */
  483. virtual void writeControlEvent(const uint32_t time, const uint8_t channel, const EngineControlEventType type, const uint16_t param, const float value = 0.0f);
  484. /*!
  485. * Write a control event into the buffer, overloaded call.
  486. */
  487. void writeControlEvent(const uint32_t time, const uint8_t channel, const EngineControlEvent& ctrl)
  488. {
  489. writeControlEvent(time, channel, ctrl.type, ctrl.param, ctrl.value);
  490. }
  491. /*!
  492. * Write a MIDI event into the buffer.\n
  493. * Arguments are the same as in the EngineMidiEvent struct.
  494. * \note You must only call this for output ports.
  495. */
  496. virtual void writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t port, const uint8_t* const data, const uint8_t size);
  497. /*!
  498. * Write a MIDI event into the buffer, overloaded call.
  499. */
  500. void writeMidiEvent(const uint32_t time, const uint8_t* const data, const uint8_t size)
  501. {
  502. writeMidiEvent(time, MIDI_GET_CHANNEL_FROM_DATA(data), 0, data, size);
  503. }
  504. /*!
  505. * Write a MIDI event into the buffer, overloaded call.
  506. */
  507. void writeMidiEvent(const uint32_t time, const uint8_t channel, const EngineMidiEvent& midi)
  508. {
  509. writeMidiEvent(time, channel, midi.port, midi.data, midi.size);
  510. }
  511. #ifndef DOXYGEN
  512. protected:
  513. EngineEvent* fBuffer;
  514. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineEventPort)
  515. #endif
  516. };
  517. // -----------------------------------------------------------------------
  518. /*!
  519. * Carla Engine client.\n
  520. * Each plugin requires one client from the engine (created via CarlaEngine::addPort()).\n
  521. * \note This is a virtual class, each engine type provides its own funtionality.
  522. */
  523. class CarlaEngineClient
  524. {
  525. public:
  526. /*!
  527. * The constructor, protected.\n
  528. * All constructor parameters are constant and will never change in the lifetime of the client.\n
  529. * Client starts in deactivated state.
  530. */
  531. CarlaEngineClient(const CarlaEngine& engine);
  532. /*!
  533. * The destructor.
  534. */
  535. virtual ~CarlaEngineClient();
  536. /*!
  537. * Activate this client.\n
  538. * Client must be deactivated before calling this function.
  539. */
  540. virtual void activate();
  541. /*!
  542. * Deactivate this client.\n
  543. * Client must be activated before calling this function.
  544. */
  545. virtual void deactivate();
  546. /*!
  547. * Check if the client is activated.
  548. */
  549. virtual bool isActive() const;
  550. /*!
  551. * Check if the client is ok.\n
  552. * Plugins will refuse to instantiate if this returns false.
  553. * \note This is always true in rack and patchbay processing modes.
  554. */
  555. virtual bool isOk() const;
  556. /*!
  557. * Get the current latency, in samples.
  558. */
  559. virtual uint32_t getLatency() const;
  560. /*!
  561. * Change the client's latency.
  562. */
  563. virtual void setLatency(const uint32_t samples);
  564. /*!
  565. * Add a new port of type \a portType.
  566. * \note This function does nothing in rack processing mode since ports are static there (2 audio + 1 event for both input and output).
  567. */
  568. virtual CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput);
  569. #ifndef DOXYGEN
  570. protected:
  571. const CarlaEngine& fEngine;
  572. bool fActive;
  573. uint32_t fLatency;
  574. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineClient)
  575. #endif
  576. };
  577. // -----------------------------------------------------------------------
  578. /*!
  579. * Protected data used in CarlaEngine and subclasses.\n
  580. * Non-engine code MUST NEVER have direct access to this.
  581. */
  582. struct CarlaEngineProtectedData;
  583. /*!
  584. * Carla Engine.
  585. * \note This is a virtual class for all available engine types available in Carla.
  586. */
  587. class CarlaEngine
  588. {
  589. protected:
  590. /*!
  591. * The constructor, protected.\n
  592. * \note This only initializes engine data, it doesn't initialize the engine itself.
  593. */
  594. CarlaEngine();
  595. public:
  596. /*!
  597. * The decontructor.
  598. * The engine must have been closed before this happens.
  599. */
  600. virtual ~CarlaEngine();
  601. // -------------------------------------------------------------------
  602. // Static calls
  603. /*!
  604. * Get the number of available engine drivers.
  605. */
  606. static unsigned int getDriverCount();
  607. /*!
  608. * Get the name of the engine driver at \a index.
  609. */
  610. static const char* getDriverName(const unsigned int index);
  611. /*!
  612. * Get the device names of driver at \a index (for use in non-JACK drivers).\n
  613. * May return NULL.
  614. */
  615. static const char** getDriverDeviceNames(const unsigned int index);
  616. /*!
  617. * Create a new engine, using driver \a driverName. \n
  618. * Returned variable must be deleted when no longer needed.
  619. * \note This only initializes engine data, it doesn't initialize the engine itself.
  620. */
  621. static CarlaEngine* newDriverByName(const char* const driverName);
  622. // -------------------------------------------------------------------
  623. // Constant values
  624. /*!
  625. * Maximum client name size.
  626. */
  627. virtual unsigned int getMaxClientNameSize() const;
  628. /*!
  629. * Maximum port name size.
  630. */
  631. virtual unsigned int getMaxPortNameSize() const;
  632. /*!
  633. * Current number of plugins loaded.
  634. */
  635. unsigned int getCurrentPluginCount() const noexcept;
  636. /*!
  637. * Maximum number of loadable plugins allowed.
  638. * \note This function returns 0 if engine is not started.
  639. */
  640. unsigned int getMaxPluginNumber() const noexcept;
  641. // -------------------------------------------------------------------
  642. // Virtual, per-engine type calls
  643. /*!
  644. * Initialize engine, using \a clientName.
  645. */
  646. virtual bool init(const char* const clientName);
  647. /*!
  648. * Close engine.
  649. */
  650. virtual bool close();
  651. /*!
  652. * Idle engine.
  653. */
  654. virtual void idle();
  655. /*!
  656. * Check if engine is running.
  657. */
  658. virtual bool isRunning() const noexcept = 0;
  659. /*!
  660. * Check if engine is running offline (aka freewheel mode).
  661. */
  662. virtual bool isOffline() const noexcept = 0;
  663. /*!
  664. * Get engine type.
  665. */
  666. virtual EngineType getType() const noexcept = 0;
  667. /*!
  668. * Add new engine client.
  669. * \note This function must only be called within a plugin class.
  670. */
  671. virtual CarlaEngineClient* addClient(CarlaPlugin* const plugin);
  672. // -------------------------------------------------------------------
  673. // Plugin management
  674. /*!
  675. * Add new plugin.
  676. */
  677. bool addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, const void* const extra = nullptr);
  678. /*!
  679. * Add new plugin, using native binary type.
  680. */
  681. bool addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, const void* const extra = nullptr)
  682. {
  683. return addPlugin(BINARY_NATIVE, ptype, filename, name, label, extra);
  684. }
  685. /*!
  686. * Remove plugin with id \a id.
  687. */
  688. bool removePlugin(const unsigned int id);
  689. /*!
  690. * Remove all plugins.
  691. */
  692. void removeAllPlugins();
  693. /*!
  694. * Rename plugin with id \a id to \a newName.\n
  695. * Returns the new name, or nullptr if the operation failed.
  696. */
  697. virtual const char* renamePlugin(const unsigned int id, const char* const newName);
  698. /*!
  699. * Clone plugin with id \a id.
  700. */
  701. bool clonePlugin(const unsigned int id);
  702. /*!
  703. * Prepare replace of plugin with id \a id.\n
  704. * The next call to addPlugin() will use this id, replacing the selected plugin.
  705. * \note This function requires addPlugin() to be called afterwards, as soon as possible.
  706. */
  707. bool replacePlugin(const unsigned int id);
  708. /*!
  709. * Switch plugins with id \a idA and \a idB.
  710. */
  711. bool switchPlugins(const unsigned int idA, const unsigned int idB);
  712. /*!
  713. * Get plugin with id \a id.
  714. */
  715. CarlaPlugin* getPlugin(const unsigned int id) const;
  716. /*!
  717. * Get plugin with id \a id, faster unchecked version.
  718. */
  719. CarlaPlugin* getPluginUnchecked(const unsigned int id) const noexcept;
  720. /*!
  721. * Get a unique plugin name within the engine.\n
  722. * Returned variable must NOT be free'd.
  723. */
  724. const char* getUniquePluginName(const char* const name);
  725. // -------------------------------------------------------------------
  726. // Project management
  727. /*!
  728. * Load \a filename of any type.\n
  729. * This will try to load a generic file as a plugin,
  730. * either by direct handling (GIG, SF2 and SFZ) or by using an internal plugin (like Audio and MIDI).
  731. */
  732. bool loadFilename(const char* const filename);
  733. /*!
  734. * Load \a filename project file.\n
  735. * (project files have *.carxp extension)
  736. * \note Already loaded plugins are not removed; call removeAllPlugins() first if needed.
  737. */
  738. bool loadProject(const char* const filename);
  739. /*!
  740. * Save current project to \a filename.\n
  741. * (project files have *.carxp extension)
  742. */
  743. bool saveProject(const char* const filename);
  744. // -------------------------------------------------------------------
  745. // Information (base)
  746. /*!
  747. * Get current buffer size.
  748. */
  749. uint32_t getBufferSize() const noexcept
  750. {
  751. return fBufferSize;
  752. }
  753. /*!
  754. * Get current sample rate.
  755. */
  756. double getSampleRate() const noexcept
  757. {
  758. return fSampleRate;
  759. }
  760. /*!
  761. * Get engine name.
  762. */
  763. const char* getName() const noexcept
  764. {
  765. return (const char*)fName;
  766. }
  767. /*!
  768. * Get the engine options (read-only).
  769. */
  770. const EngineOptions& getOptions() const noexcept
  771. {
  772. return fOptions;
  773. }
  774. /*!
  775. * Get the engine proccess mode.
  776. */
  777. ProcessMode getProccessMode() const noexcept
  778. {
  779. return fOptions.processMode;
  780. }
  781. /*!
  782. * Get current Time information (read-only).
  783. */
  784. const EngineTimeInfo& getTimeInfo() const noexcept
  785. {
  786. return fTimeInfo;
  787. }
  788. // -------------------------------------------------------------------
  789. // Information (peaks)
  790. /*!
  791. * TODO.
  792. * \a id must be either 1 or 2.
  793. */
  794. float getInputPeak(const unsigned int pluginId, const unsigned short id) const;
  795. /*!
  796. * TODO.
  797. * \a id must be either 1 or 2.
  798. */
  799. float getOutputPeak(const unsigned int pluginId, const unsigned short id) const;
  800. // -------------------------------------------------------------------
  801. // Callback
  802. /*!
  803. * TODO.
  804. */
  805. void callback(const CallbackType action, const unsigned int pluginId, const int value1, const int value2, const float value3, const char* const valueStr);
  806. /*!
  807. * TODO.
  808. */
  809. void setCallback(const CallbackFunc func, void* const ptr);
  810. // -------------------------------------------------------------------
  811. // Patchbay
  812. /*!
  813. * Connect patchbay ports \a portA and \a portB.
  814. */
  815. virtual bool patchbayConnect(int portA, int portB);
  816. /*!
  817. * Disconnect patchbay connection \a connectionId.
  818. */
  819. virtual bool patchbayDisconnect(int connectionId);
  820. /*!
  821. * Force the engine to resend all patchbay clients, ports and connections again.
  822. */
  823. virtual void patchbayRefresh();
  824. // -------------------------------------------------------------------
  825. // Transport
  826. /*!
  827. * Start playback of the engine transport.
  828. */
  829. virtual void transportPlay();
  830. /*!
  831. * Pause the engine transport.
  832. */
  833. virtual void transportPause();
  834. /*!
  835. * Relocate the engine transport to \a frames.
  836. */
  837. virtual void transportRelocate(const uint32_t frame);
  838. // -------------------------------------------------------------------
  839. // Error handling
  840. /*!
  841. * Get last error.
  842. */
  843. const char* getLastError() const noexcept;
  844. /*!
  845. * Set last error.
  846. */
  847. void setLastError(const char* const error);
  848. // -------------------------------------------------------------------
  849. // Misc
  850. /*!
  851. * Tell the engine it's about to close.\n
  852. * This is used to prevent the engine thread(s) from reactivating.
  853. */
  854. void setAboutToClose();
  855. // -------------------------------------------------------------------
  856. // Options
  857. /*!
  858. * Set the engine option \a option.
  859. */
  860. void setOption(const OptionsType option, const int value, const char* const valueStr);
  861. // -------------------------------------------------------------------
  862. // OSC Stuff
  863. #ifdef BUILD_BRIDGE
  864. /*!
  865. * Check if OSC bridge is registered.
  866. */
  867. bool isOscBridgeRegistered() const noexcept;
  868. #else
  869. /*!
  870. * Check if OSC controller is registered.
  871. */
  872. bool isOscControlRegistered() const noexcept;
  873. #endif
  874. /*!
  875. * Idle OSC.
  876. */
  877. void idleOsc();
  878. /*!
  879. * Get OSC TCP server path.
  880. */
  881. const char* getOscServerPathTCP() const noexcept;
  882. /*!
  883. * Get OSC UDP server path.
  884. */
  885. const char* getOscServerPathUDP() const noexcept;
  886. #ifdef BUILD_BRIDGE
  887. /*!
  888. * Set OSC bridge data.
  889. */
  890. void setOscBridgeData(const CarlaOscData* const oscData) noexcept;
  891. #endif
  892. // -------------------------------------------------------------------
  893. // Helper functions
  894. /*!
  895. * Return internal data, needed for EventPorts when used in Rack and Bridge modes.
  896. * \note RT call
  897. */
  898. EngineEvent* getInternalEventBuffer(const bool isInput) const noexcept;
  899. /*!
  900. * Force register a plugin into slot \a id. \n
  901. * This is needed so we can receive OSC events for a plugin while it initializes.
  902. */
  903. void registerEnginePlugin(const unsigned int id, CarlaPlugin* const plugin);
  904. // -------------------------------------------------------------------
  905. protected:
  906. /*!
  907. * Current buffer size.
  908. * \see getBufferSize()
  909. */
  910. uint32_t fBufferSize;
  911. /*!
  912. * Current sample rate.
  913. * \see getSampleRate()
  914. */
  915. double fSampleRate;
  916. /*!
  917. * Engine name.
  918. * \see getName()
  919. */
  920. CarlaString fName;
  921. /*!
  922. * Engine options.
  923. * \see getOptions() and setOption()
  924. */
  925. EngineOptions fOptions;
  926. /*!
  927. * Current time-pos information.
  928. * \see getTimeInfo()
  929. */
  930. EngineTimeInfo fTimeInfo;
  931. /*!
  932. * Internal data, for CarlaEngine subclasses only.
  933. */
  934. CarlaEngineProtectedData* const pData;
  935. friend struct CarlaEngineProtectedData;
  936. // -------------------------------------------------------------------
  937. // Internal stuff
  938. /*!
  939. * Report to all plugins about buffer size change.
  940. */
  941. void bufferSizeChanged(const uint32_t newBufferSize);
  942. /*!
  943. * Report to all plugins about sample rate change.\n
  944. * This is not supported on all plugin types, in which case they will have to be re-initiated.
  945. */
  946. void sampleRateChanged(const double newSampleRate);
  947. /*!
  948. * Report to all plugins about offline mode change.
  949. */
  950. void offlineModeChanged(const bool isOffline);
  951. /*!
  952. * Run any pending RT events.\n
  953. * Must always be called at the end of audio processing.
  954. * \note RT call
  955. */
  956. void runPendingRtEvents();
  957. /*!
  958. * Set a plugin (stereo) peak values.
  959. * \note RT call
  960. */
  961. void setPluginPeaks(const unsigned int pluginId, float const inPeaks[2], float const outPeaks[2]) noexcept;
  962. #ifndef BUILD_BRIDGE
  963. /*!
  964. * Proccess audio buffer in rack mode.
  965. * \note RT call
  966. */
  967. void processRack(float* inBuf[2], float* outBuf[2], const uint32_t frames);
  968. /*!
  969. * Proccess audio buffer in patchbay mode.
  970. * In \a bufCount, [0]=inBufCount and [1]=outBufCount
  971. * \note RT call
  972. */
  973. void processPatchbay(float** inBuf, float** outBuf, const uint32_t bufCount[2], const uint32_t frames);
  974. #endif
  975. // -------------------------------------------------------------------
  976. // Engine initializers
  977. #ifdef BUILD_BRIDGE
  978. public:
  979. static CarlaEngine* newBridge(const char* const audioBaseName, const char* const controlBaseName);
  980. #endif
  981. private:
  982. static CarlaEngine* newJack();
  983. #ifndef BUILD_BRIDGE
  984. static CarlaEngine* newJuce();
  985. static size_t getJuceApiCount();
  986. static const char* getJuceApiName(const unsigned int index);
  987. static const char** getJuceApiDeviceNames(const unsigned int index);
  988. enum RtAudioApi {
  989. RTAUDIO_DUMMY = 0,
  990. RTAUDIO_LINUX_ALSA = 1,
  991. RTAUDIO_LINUX_PULSE = 2,
  992. RTAUDIO_LINUX_OSS = 3,
  993. RTAUDIO_UNIX_JACK = 4,
  994. RTAUDIO_MACOSX_CORE = 5,
  995. RTAUDIO_WINDOWS_ASIO = 6,
  996. RTAUDIO_WINDOWS_DS = 7
  997. };
  998. static CarlaEngine* newRtAudio(const RtAudioApi api);
  999. static size_t getRtAudioApiCount();
  1000. static const char* getRtAudioApiName(const unsigned int index);
  1001. static const char** getRtAudioApiDeviceNames(const unsigned int index);
  1002. #endif
  1003. // -------------------------------------------------------------------
  1004. // Bridge/Controller OSC stuff
  1005. public:
  1006. #ifdef BUILD_BRIDGE
  1007. void oscSend_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total);
  1008. void oscSend_bridge_midi_count(const int32_t ins, const int32_t outs, const int32_t total);
  1009. void oscSend_bridge_parameter_count(const int32_t ins, const int32_t outs, const int32_t total);
  1010. void oscSend_bridge_program_count(const int32_t count);
  1011. void oscSend_bridge_midi_program_count(const int32_t count);
  1012. void oscSend_bridge_plugin_info(const int32_t category, const int32_t hints, const char* const name, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId);
  1013. void oscSend_bridge_parameter_info(const int32_t index, const char* const name, const char* const unit);
  1014. void oscSend_bridge_parameter_data(const int32_t index, const int32_t type, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC);
  1015. void oscSend_bridge_parameter_ranges(const int32_t index, const float def, const float min, const float max, const float step, const float stepSmall, const float stepLarge);
  1016. void oscSend_bridge_program_info(const int32_t index, const char* const name);
  1017. void oscSend_bridge_midi_program_info(const int32_t index, const int32_t bank, const int32_t program, const char* const label);
  1018. void oscSend_bridge_configure(const char* const key, const char* const value);
  1019. void oscSend_bridge_set_parameter_value(const int32_t index, const float value);
  1020. void oscSend_bridge_set_default_value(const int32_t index, const float value);
  1021. void oscSend_bridge_set_program(const int32_t index);
  1022. void oscSend_bridge_set_midi_program(const int32_t index);
  1023. void oscSend_bridge_set_custom_data(const char* const type, const char* const key, const char* const value);
  1024. void oscSend_bridge_set_chunk_data(const char* const chunkFile);
  1025. void oscSend_bridge_set_peaks();
  1026. #else
  1027. void oscSend_control_add_plugin_start(const int32_t pluginId, const char* const pluginName);
  1028. void oscSend_control_add_plugin_end(const int32_t pluginId);
  1029. void oscSend_control_remove_plugin(const int32_t pluginId);
  1030. void oscSend_control_set_plugin_data(const int32_t pluginId, const int32_t type, const int32_t category, const int32_t hints, const char* const realName, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId);
  1031. void oscSend_control_set_plugin_ports(const int32_t pluginId, const int32_t audioIns, const int32_t audioOuts, const int32_t midiIns, const int32_t midiOuts, const int32_t cIns, const int32_t cOuts, const int32_t cTotals);
  1032. void oscSend_control_set_parameter_data(const int32_t pluginId, const int32_t index, const int32_t type, const int32_t hints, const char* const name, const char* const label, const float current);
  1033. void oscSend_control_set_parameter_ranges(const int32_t pluginId, const int32_t index, const float min, const float max, const float def, const float step, const float stepSmall, const float stepLarge);
  1034. void oscSend_control_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc);
  1035. void oscSend_control_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel);
  1036. void oscSend_control_set_parameter_value(const int32_t pluginId, const int32_t index, const float value);
  1037. void oscSend_control_set_default_value(const int32_t pluginId, const int32_t index, const float value);
  1038. void oscSend_control_set_program(const int32_t pluginId, const int32_t index);
  1039. void oscSend_control_set_program_count(const int32_t pluginId, const int32_t count);
  1040. void oscSend_control_set_program_name(const int32_t pluginId, const int32_t index, const char* const name);
  1041. void oscSend_control_set_midi_program(const int32_t pluginId, const int32_t index);
  1042. void oscSend_control_set_midi_program_count(const int32_t pluginId, const int32_t count);
  1043. void oscSend_control_set_midi_program_data(const int32_t pluginId, const int32_t index, const int32_t bank, const int32_t program, const char* const name);
  1044. void oscSend_control_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo);
  1045. void oscSend_control_note_off(const int32_t pluginId, const int32_t channel, const int32_t note);
  1046. void oscSend_control_set_peaks(const int32_t pluginId);
  1047. void oscSend_control_exit();
  1048. #endif
  1049. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngine)
  1050. };
  1051. /**@}*/
  1052. CARLA_BACKEND_END_NAMESPACE
  1053. #endif // CARLA_ENGINE_HPP_INCLUDED