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.

2000 lines
71KB

  1. /*
  2. * Carla Standalone
  3. * Copyright (C) 2011-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. // TODO:
  18. // Check carla_stderr2("Engine is not running"); <= prepend func name and args
  19. #include "CarlaHost.h"
  20. #include "CarlaMIDI.h"
  21. #include "CarlaEngine.hpp"
  22. #include "CarlaPlugin.hpp"
  23. #include "CarlaBackendUtils.hpp"
  24. #include "CarlaBase64Utils.hpp"
  25. #ifndef BUILD_BRIDGE
  26. # include "CarlaLogThread.hpp"
  27. #endif
  28. #include "AppConfig.h"
  29. #include "juce_audio_formats/juce_audio_formats.h"
  30. #if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)
  31. # include "juce_gui_basics/juce_gui_basics.h"
  32. #else
  33. # include "juce_events/juce_events.h"
  34. #endif
  35. namespace CB = CarlaBackend;
  36. using CB::EngineOptions;
  37. // -------------------------------------------------------------------------------------------------------------------
  38. // Single, standalone engine
  39. struct CarlaBackendStandalone {
  40. CarlaEngine* engine;
  41. EngineCallbackFunc engineCallback;
  42. void* engineCallbackPtr;
  43. #ifndef BUILD_BRIDGE
  44. EngineOptions engineOptions;
  45. CarlaLogThread logThread;
  46. bool logThreadEnabled;
  47. #endif
  48. FileCallbackFunc fileCallback;
  49. void* fileCallbackPtr;
  50. CarlaString lastError;
  51. CarlaBackendStandalone() noexcept
  52. : engine(nullptr),
  53. engineCallback(nullptr),
  54. engineCallbackPtr(nullptr),
  55. #ifndef BUILD_BRIDGE
  56. engineOptions(),
  57. logThread(),
  58. logThreadEnabled(false),
  59. #endif
  60. fileCallback(nullptr),
  61. fileCallbackPtr(nullptr),
  62. lastError() {}
  63. ~CarlaBackendStandalone() noexcept
  64. {
  65. CARLA_SAFE_ASSERT(engine == nullptr);
  66. }
  67. CARLA_PREVENT_HEAP_ALLOCATION
  68. CARLA_DECLARE_NON_COPY_STRUCT(CarlaBackendStandalone)
  69. };
  70. CarlaBackendStandalone gStandalone;
  71. // -------------------------------------------------------------------------------------------------------------------
  72. // API
  73. #define CARLA_COMMON_NEED_CHECKSTRINGPTR
  74. #include "CarlaHostCommon.cpp"
  75. // -------------------------------------------------------------------------------------------------------------------
  76. uint carla_get_engine_driver_count()
  77. {
  78. carla_debug("carla_get_engine_driver_count()");
  79. return CarlaEngine::getDriverCount();
  80. }
  81. const char* carla_get_engine_driver_name(uint index)
  82. {
  83. carla_debug("carla_get_engine_driver_name(%i)", index);
  84. return CarlaEngine::getDriverName(index);
  85. }
  86. const char* const* carla_get_engine_driver_device_names(uint index)
  87. {
  88. carla_debug("carla_get_engine_driver_device_names(%i)", index);
  89. return CarlaEngine::getDriverDeviceNames(index);
  90. }
  91. const EngineDriverDeviceInfo* carla_get_engine_driver_device_info(uint index, const char* name)
  92. {
  93. CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr);
  94. carla_debug("carla_get_engine_driver_device_info(%i, \"%s\")", index, name);
  95. if (const EngineDriverDeviceInfo* const ret = CarlaEngine::getDriverDeviceInfo(index, name))
  96. {
  97. static EngineDriverDeviceInfo devInfo;
  98. static const uint32_t nullBufferSizes[] = { 0 };
  99. static const double nullSampleRates[] = { 0.0 };
  100. devInfo.hints = ret->hints;
  101. devInfo.bufferSizes = (ret->bufferSizes != nullptr) ? ret->bufferSizes : nullBufferSizes;
  102. devInfo.sampleRates = (ret->sampleRates != nullptr) ? ret->sampleRates : nullSampleRates;
  103. return &devInfo;
  104. }
  105. return nullptr;
  106. }
  107. // -------------------------------------------------------------------------------------------------------------------
  108. CarlaEngine* carla_get_engine()
  109. {
  110. carla_debug("carla_get_engine()");
  111. return gStandalone.engine;
  112. }
  113. // -------------------------------------------------------------------------------------------------------------------
  114. static void carla_engine_init_common()
  115. {
  116. gStandalone.engine->setCallback(gStandalone.engineCallback, gStandalone.engineCallbackPtr);
  117. gStandalone.engine->setFileCallback(gStandalone.fileCallback, gStandalone.fileCallbackPtr);
  118. #ifdef BUILD_BRIDGE
  119. using juce::File;
  120. File juceBinaryDir(File::getSpecialLocation(File::currentExecutableFile).getParentDirectory());
  121. /*
  122. if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_FORCE_STEREO"))
  123. gStandalone.engine->setOption(CB::ENGINE_OPTION_FORCE_STEREO, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr);
  124. if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_PREFER_PLUGIN_BRIDGES"))
  125. gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr);
  126. if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_PREFER_UI_BRIDGES"))
  127. gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr);
  128. */
  129. if (const char* const uisAlwaysOnTop = std::getenv("ENGINE_OPTION_UIS_ALWAYS_ON_TOP"))
  130. gStandalone.engine->setOption(CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP, (std::strcmp(uisAlwaysOnTop, "true") == 0) ? 1 : 0, nullptr);
  131. if (const char* const maxParameters = std::getenv("ENGINE_OPTION_MAX_PARAMETERS"))
  132. gStandalone.engine->setOption(CB::ENGINE_OPTION_MAX_PARAMETERS, std::atoi(maxParameters), nullptr);
  133. if (const char* const uiBridgesTimeout = std::getenv("ENGINE_OPTION_UI_BRIDGES_TIMEOUT"))
  134. gStandalone.engine->setOption(CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT, std::atoi(uiBridgesTimeout), nullptr);
  135. if (const char* const pathLADSPA = std::getenv("ENGINE_OPTION_PLUGIN_PATH_LADSPA"))
  136. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_LADSPA, pathLADSPA);
  137. if (const char* const pathDSSI = std::getenv("ENGINE_OPTION_PLUGIN_PATH_DSSI"))
  138. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_DSSI, pathDSSI);
  139. if (const char* const pathLV2 = std::getenv("ENGINE_OPTION_PLUGIN_PATH_LV2"))
  140. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_LV2, pathLV2);
  141. if (const char* const pathVST2 = std::getenv("ENGINE_OPTION_PLUGIN_PATH_VST2"))
  142. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_VST2, pathVST2);
  143. if (const char* const pathVST3 = std::getenv("ENGINE_OPTION_PLUGIN_PATH_VST3"))
  144. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_VST3, pathVST3);
  145. if (const char* const pathGIG = std::getenv("ENGINE_OPTION_PLUGIN_PATH_GIG"))
  146. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_GIG, pathGIG);
  147. if (const char* const pathSF2 = std::getenv("ENGINE_OPTION_PLUGIN_PATH_SF2"))
  148. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_SF2, pathSF2);
  149. if (const char* const pathSFZ = std::getenv("ENGINE_OPTION_PLUGIN_PATH_SFZ"))
  150. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_SFZ, pathSFZ);
  151. if (const char* const binaryDir = std::getenv("ENGINE_OPTION_PATH_BINARIES"))
  152. gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BINARIES, 0, binaryDir);
  153. else
  154. gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BINARIES, 0, juceBinaryDir.getFullPathName().toRawUTF8());
  155. if (const char* const resourceDir = std::getenv("ENGINE_OPTION_PATH_RESOURCES"))
  156. gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_RESOURCES, 0, resourceDir);
  157. else
  158. gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_RESOURCES, 0, juceBinaryDir.getChildFile("resources").getFullPathName().toRawUTF8());
  159. if (const char* const preventBadBehaviour = std::getenv("ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR"))
  160. gStandalone.engine->setOption(CB::ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, (std::strcmp(preventBadBehaviour, "true") == 0) ? 1 : 0, nullptr);
  161. if (const char* const frontendWinId = std::getenv("ENGINE_OPTION_FRONTEND_WIN_ID"))
  162. gStandalone.engine->setOption(CB::ENGINE_OPTION_FRONTEND_WIN_ID, 0, frontendWinId);
  163. #else
  164. gStandalone.engine->setOption(CB::ENGINE_OPTION_FORCE_STEREO, gStandalone.engineOptions.forceStereo ? 1 : 0, nullptr);
  165. gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, gStandalone.engineOptions.preferPluginBridges ? 1 : 0, nullptr);
  166. gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, gStandalone.engineOptions.preferUiBridges ? 1 : 0, nullptr);
  167. gStandalone.engine->setOption(CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP, gStandalone.engineOptions.uisAlwaysOnTop ? 1 : 0, nullptr);
  168. gStandalone.engine->setOption(CB::ENGINE_OPTION_MAX_PARAMETERS, static_cast<int>(gStandalone.engineOptions.maxParameters), nullptr);
  169. gStandalone.engine->setOption(CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT, static_cast<int>(gStandalone.engineOptions.uiBridgesTimeout), nullptr);
  170. gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_NUM_PERIODS, static_cast<int>(gStandalone.engineOptions.audioNumPeriods), nullptr);
  171. gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_BUFFER_SIZE, static_cast<int>(gStandalone.engineOptions.audioBufferSize), nullptr);
  172. gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_SAMPLE_RATE, static_cast<int>(gStandalone.engineOptions.audioSampleRate), nullptr);
  173. gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_SAMPLE_RATE, static_cast<int>(gStandalone.engineOptions.audioSampleRate), nullptr);
  174. if (gStandalone.engineOptions.audioDevice != nullptr)
  175. gStandalone.engine->setOption(CB::ENGINE_OPTION_AUDIO_DEVICE, 0, gStandalone.engineOptions.audioDevice);
  176. if (gStandalone.engineOptions.pathLADSPA != nullptr)
  177. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_LADSPA, gStandalone.engineOptions.pathLADSPA);
  178. if (gStandalone.engineOptions.pathDSSI != nullptr)
  179. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_DSSI, gStandalone.engineOptions.pathDSSI);
  180. if (gStandalone.engineOptions.pathLV2 != nullptr)
  181. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_LV2, gStandalone.engineOptions.pathLV2);
  182. if (gStandalone.engineOptions.pathVST2 != nullptr)
  183. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_VST2, gStandalone.engineOptions.pathVST2);
  184. if (gStandalone.engineOptions.pathVST3 != nullptr)
  185. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_VST3, gStandalone.engineOptions.pathVST3);
  186. if (gStandalone.engineOptions.pathGIG != nullptr)
  187. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_GIG, gStandalone.engineOptions.pathGIG);
  188. if (gStandalone.engineOptions.pathSF2 != nullptr)
  189. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_SF2, gStandalone.engineOptions.pathSF2);
  190. if (gStandalone.engineOptions.pathSFZ != nullptr)
  191. gStandalone.engine->setOption(CB::ENGINE_OPTION_PLUGIN_PATH, CB::PLUGIN_SFZ, gStandalone.engineOptions.pathSFZ);
  192. if (gStandalone.engineOptions.binaryDir != nullptr && gStandalone.engineOptions.binaryDir[0] != '\0')
  193. gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_BINARIES, 0, gStandalone.engineOptions.binaryDir);
  194. if (gStandalone.engineOptions.resourceDir != nullptr && gStandalone.engineOptions.resourceDir[0] != '\0')
  195. gStandalone.engine->setOption(CB::ENGINE_OPTION_PATH_RESOURCES, 0, gStandalone.engineOptions.resourceDir);
  196. gStandalone.engine->setOption(CB::ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, gStandalone.engineOptions.preventBadBehaviour ? 1 : 0, nullptr);
  197. if (gStandalone.engineOptions.frontendWinId != 0)
  198. {
  199. char strBuf[STR_MAX+1];
  200. strBuf[STR_MAX] = '\0';
  201. std::snprintf(strBuf, STR_MAX, P_UINTPTR, gStandalone.engineOptions.frontendWinId);
  202. gStandalone.engine->setOption(CB::ENGINE_OPTION_FRONTEND_WIN_ID, 0, strBuf);
  203. }
  204. else
  205. gStandalone.engine->setOption(CB::ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
  206. #endif
  207. }
  208. bool carla_engine_init(const char* driverName, const char* clientName)
  209. {
  210. CARLA_SAFE_ASSERT_RETURN(driverName != nullptr && driverName[0] != '\0', false);
  211. CARLA_SAFE_ASSERT_RETURN(clientName != nullptr && clientName[0] != '\0', false);
  212. carla_debug("carla_engine_init(\"%s\", \"%s\")", driverName, clientName);
  213. if (gStandalone.engine != nullptr)
  214. {
  215. carla_stderr2("Engine is already running");
  216. gStandalone.lastError = "Engine is already running";
  217. return false;
  218. }
  219. #ifdef CARLA_OS_WIN
  220. carla_setenv("WINEASIO_CLIENT_NAME", clientName);
  221. #endif
  222. // TODO: make this an option, put somewhere else
  223. if (std::getenv("WINE_RT") == nullptr)
  224. {
  225. carla_setenv("WINE_RT", "55");
  226. carla_setenv("WINE_SVR_RT", "70");
  227. }
  228. gStandalone.engine = CarlaEngine::newDriverByName(driverName);
  229. if (gStandalone.engine == nullptr)
  230. {
  231. carla_stderr2("The seleted audio driver is not available");
  232. gStandalone.lastError = "The seleted audio driver is not available";
  233. return false;
  234. }
  235. #ifdef BUILD_BRIDGE
  236. gStandalone.engine->setOption(CB::ENGINE_OPTION_PROCESS_MODE, CB::ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, nullptr);
  237. gStandalone.engine->setOption(CB::ENGINE_OPTION_TRANSPORT_MODE, CB::ENGINE_TRANSPORT_MODE_JACK, nullptr);
  238. gStandalone.engine->setOption(CB::ENGINE_OPTION_FORCE_STEREO, false, nullptr);
  239. gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, false, nullptr);
  240. gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, false, nullptr);
  241. #else
  242. gStandalone.engine->setOption(CB::ENGINE_OPTION_PROCESS_MODE, static_cast<int>(gStandalone.engineOptions.processMode), nullptr);
  243. gStandalone.engine->setOption(CB::ENGINE_OPTION_TRANSPORT_MODE, static_cast<int>(gStandalone.engineOptions.transportMode), gStandalone.engineOptions.transportExtra);
  244. juce::initialiseJuce_GUI();
  245. #endif
  246. carla_engine_init_common();
  247. if (gStandalone.engine->init(clientName))
  248. {
  249. #ifndef BUILD_BRIDGE
  250. if (gStandalone.logThreadEnabled && std::getenv("CARLA_LOGS_DISABLED") == nullptr)
  251. gStandalone.logThread.init();
  252. #endif
  253. gStandalone.lastError = "No error";
  254. return true;
  255. }
  256. else
  257. {
  258. gStandalone.lastError = gStandalone.engine->getLastError();
  259. delete gStandalone.engine;
  260. gStandalone.engine = nullptr;
  261. #ifndef BUILD_BRIDGE
  262. juce::shutdownJuce_GUI();
  263. #endif
  264. return false;
  265. }
  266. }
  267. #ifdef BUILD_BRIDGE
  268. bool carla_engine_init_bridge(const char audioBaseName[6+1], const char rtClientBaseName[6+1], const char nonRtClientBaseName[6+1],
  269. const char nonRtServerBaseName[6+1], const char* clientName)
  270. {
  271. CARLA_SAFE_ASSERT_RETURN(audioBaseName != nullptr && audioBaseName[0] != '\0', false);
  272. CARLA_SAFE_ASSERT_RETURN(rtClientBaseName != nullptr && rtClientBaseName[0] != '\0', false);
  273. CARLA_SAFE_ASSERT_RETURN(nonRtClientBaseName != nullptr && nonRtClientBaseName[0] != '\0', false);
  274. CARLA_SAFE_ASSERT_RETURN(nonRtServerBaseName != nullptr && nonRtServerBaseName[0] != '\0', false);
  275. CARLA_SAFE_ASSERT_RETURN(clientName != nullptr && clientName[0] != '\0', false);
  276. carla_debug("carla_engine_init_bridge(\"%s\", \"%s\", \"%s\", \"%s\", \"%s\")", audioBaseName, rtClientBaseName, nonRtClientBaseName, nonRtServerBaseName, clientName);
  277. if (gStandalone.engine != nullptr)
  278. {
  279. carla_stderr2("Engine is already running");
  280. gStandalone.lastError = "Engine is already running";
  281. return false;
  282. }
  283. // TODO: make this an option, put somewhere else
  284. if (std::getenv("WINE_RT") == nullptr)
  285. {
  286. carla_setenv("WINE_RT", "55");
  287. carla_setenv("WINE_SVR_RT", "70");
  288. }
  289. gStandalone.engine = CarlaEngine::newBridge(audioBaseName, rtClientBaseName, nonRtClientBaseName, nonRtServerBaseName);
  290. if (gStandalone.engine == nullptr)
  291. {
  292. carla_stderr2("The seleted audio driver is not available!");
  293. gStandalone.lastError = "The seleted audio driver is not available!";
  294. return false;
  295. }
  296. carla_engine_init_common();
  297. gStandalone.engine->setOption(CB::ENGINE_OPTION_PROCESS_MODE, CB::ENGINE_PROCESS_MODE_BRIDGE, nullptr);
  298. gStandalone.engine->setOption(CB::ENGINE_OPTION_TRANSPORT_MODE, CB::ENGINE_TRANSPORT_MODE_BRIDGE, nullptr);
  299. if (gStandalone.engine->init(clientName))
  300. {
  301. gStandalone.lastError = "No error";
  302. return true;
  303. }
  304. else
  305. {
  306. gStandalone.lastError = gStandalone.engine->getLastError();
  307. delete gStandalone.engine;
  308. gStandalone.engine = nullptr;
  309. return false;
  310. }
  311. }
  312. #endif
  313. bool carla_engine_close()
  314. {
  315. carla_debug("carla_engine_close()");
  316. if (gStandalone.engine == nullptr)
  317. {
  318. carla_stderr2("Engine is not running");
  319. gStandalone.lastError = "Engine is not running";
  320. return false;
  321. }
  322. gStandalone.engine->setAboutToClose();
  323. gStandalone.engine->removeAllPlugins();
  324. const bool closed(gStandalone.engine->close());
  325. if (! closed)
  326. gStandalone.lastError = gStandalone.engine->getLastError();
  327. delete gStandalone.engine;
  328. gStandalone.engine = nullptr;
  329. #ifndef BUILD_BRIDGE
  330. juce::shutdownJuce_GUI();
  331. gStandalone.logThread.stop();
  332. #endif
  333. return closed;
  334. }
  335. void carla_engine_idle()
  336. {
  337. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  338. gStandalone.engine->idle();
  339. #if ! (defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN))
  340. using juce::MessageManager;
  341. const MessageManager* const msgMgr(MessageManager::getInstanceWithoutCreating());
  342. CARLA_SAFE_ASSERT_RETURN(msgMgr != nullptr,);
  343. for (; msgMgr->dispatchNextMessageOnSystemQueue(true);) {}
  344. #endif
  345. }
  346. bool carla_is_engine_running()
  347. {
  348. return (gStandalone.engine != nullptr && gStandalone.engine->isRunning());
  349. }
  350. bool carla_set_engine_about_to_close()
  351. {
  352. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, true);
  353. carla_debug("carla_set_engine_about_to_close()");
  354. return gStandalone.engine->setAboutToClose();
  355. }
  356. void carla_set_engine_callback(EngineCallbackFunc func, void* ptr)
  357. {
  358. carla_debug("carla_set_engine_callback(%p, %p)", func, ptr);
  359. gStandalone.engineCallback = func;
  360. gStandalone.engineCallbackPtr = ptr;
  361. #ifndef BUILD_BRIDGE
  362. gStandalone.logThread.setCallback(func, ptr);
  363. #endif
  364. if (gStandalone.engine != nullptr)
  365. gStandalone.engine->setCallback(func, ptr);
  366. }
  367. #ifndef BUILD_BRIDGE
  368. void carla_set_engine_option(EngineOption option, int value, const char* valueStr)
  369. {
  370. carla_debug("carla_set_engine_option(%i:%s, %i, \"%s\")", option, CB::EngineOption2Str(option), value, valueStr);
  371. switch (option)
  372. {
  373. case CB::ENGINE_OPTION_DEBUG:
  374. break;
  375. case CB::ENGINE_OPTION_PROCESS_MODE:
  376. CARLA_SAFE_ASSERT_RETURN(value >= CB::ENGINE_PROCESS_MODE_SINGLE_CLIENT && value < CB::ENGINE_PROCESS_MODE_BRIDGE,);
  377. gStandalone.engineOptions.processMode = static_cast<CB::EngineProcessMode>(value);
  378. break;
  379. case CB::ENGINE_OPTION_TRANSPORT_MODE:
  380. CARLA_SAFE_ASSERT_RETURN(value >= CB::ENGINE_TRANSPORT_MODE_INTERNAL && value <= CB::ENGINE_TRANSPORT_MODE_BRIDGE,);
  381. gStandalone.engineOptions.transportMode = static_cast<CB::EngineTransportMode>(value);
  382. delete[] gStandalone.engineOptions.transportExtra;
  383. gStandalone.engineOptions.transportExtra = (valueStr != nullptr) ? carla_strdup_safe(valueStr) : nullptr;
  384. break;
  385. case CB::ENGINE_OPTION_FORCE_STEREO:
  386. CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
  387. gStandalone.engineOptions.forceStereo = (value != 0);
  388. break;
  389. case CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES:
  390. CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
  391. gStandalone.engineOptions.preferPluginBridges = (value != 0);
  392. break;
  393. case CB::ENGINE_OPTION_PREFER_UI_BRIDGES:
  394. CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
  395. gStandalone.engineOptions.preferUiBridges = (value != 0);
  396. break;
  397. case CB::ENGINE_OPTION_UIS_ALWAYS_ON_TOP:
  398. CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
  399. gStandalone.engineOptions.uisAlwaysOnTop = (value != 0);
  400. break;
  401. case CB::ENGINE_OPTION_MAX_PARAMETERS:
  402. CARLA_SAFE_ASSERT_RETURN(value >= 0,);
  403. gStandalone.engineOptions.maxParameters = static_cast<uint>(value);
  404. break;
  405. case CB::ENGINE_OPTION_UI_BRIDGES_TIMEOUT:
  406. CARLA_SAFE_ASSERT_RETURN(value >= 0,);
  407. gStandalone.engineOptions.uiBridgesTimeout = static_cast<uint>(value);
  408. break;
  409. case CB::ENGINE_OPTION_AUDIO_NUM_PERIODS:
  410. CARLA_SAFE_ASSERT_RETURN(value >= 2 && value <= 3,);
  411. gStandalone.engineOptions.audioNumPeriods = static_cast<uint>(value);
  412. break;
  413. case CB::ENGINE_OPTION_AUDIO_BUFFER_SIZE:
  414. CARLA_SAFE_ASSERT_RETURN(value >= 8,);
  415. gStandalone.engineOptions.audioBufferSize = static_cast<uint>(value);
  416. break;
  417. case CB::ENGINE_OPTION_AUDIO_SAMPLE_RATE:
  418. CARLA_SAFE_ASSERT_RETURN(value >= 22050,);
  419. gStandalone.engineOptions.audioSampleRate = static_cast<uint>(value);
  420. break;
  421. case CB::ENGINE_OPTION_AUDIO_DEVICE:
  422. CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr,);
  423. if (gStandalone.engineOptions.audioDevice != nullptr)
  424. delete[] gStandalone.engineOptions.audioDevice;
  425. gStandalone.engineOptions.audioDevice = carla_strdup_safe(valueStr);
  426. break;
  427. case CB::ENGINE_OPTION_PLUGIN_PATH:
  428. CARLA_SAFE_ASSERT_RETURN(value > CB::PLUGIN_NONE,);
  429. CARLA_SAFE_ASSERT_RETURN(value <= CB::PLUGIN_SFZ,);
  430. CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr,);
  431. switch (value)
  432. {
  433. case CB::PLUGIN_LADSPA:
  434. if (gStandalone.engineOptions.pathLADSPA != nullptr)
  435. delete[] gStandalone.engineOptions.pathLADSPA;
  436. gStandalone.engineOptions.pathLADSPA = carla_strdup_safe(valueStr);
  437. break;
  438. case CB::PLUGIN_DSSI:
  439. if (gStandalone.engineOptions.pathDSSI != nullptr)
  440. delete[] gStandalone.engineOptions.pathDSSI;
  441. gStandalone.engineOptions.pathDSSI = carla_strdup_safe(valueStr);
  442. break;
  443. case CB::PLUGIN_LV2:
  444. if (gStandalone.engineOptions.pathLV2 != nullptr)
  445. delete[] gStandalone.engineOptions.pathLV2;
  446. gStandalone.engineOptions.pathLV2 = carla_strdup_safe(valueStr);
  447. break;
  448. case CB::PLUGIN_VST2:
  449. if (gStandalone.engineOptions.pathVST2 != nullptr)
  450. delete[] gStandalone.engineOptions.pathVST2;
  451. gStandalone.engineOptions.pathVST2 = carla_strdup_safe(valueStr);
  452. break;
  453. case CB::PLUGIN_VST3:
  454. if (gStandalone.engineOptions.pathVST3 != nullptr)
  455. delete[] gStandalone.engineOptions.pathVST3;
  456. gStandalone.engineOptions.pathVST3 = carla_strdup_safe(valueStr);
  457. break;
  458. case CB::PLUGIN_GIG:
  459. if (gStandalone.engineOptions.pathGIG != nullptr)
  460. delete[] gStandalone.engineOptions.pathGIG;
  461. gStandalone.engineOptions.pathGIG = carla_strdup_safe(valueStr);
  462. break;
  463. case CB::PLUGIN_SF2:
  464. if (gStandalone.engineOptions.pathSF2 != nullptr)
  465. delete[] gStandalone.engineOptions.pathSF2;
  466. gStandalone.engineOptions.pathSF2 = carla_strdup_safe(valueStr);
  467. break;
  468. case CB::PLUGIN_SFZ:
  469. if (gStandalone.engineOptions.pathSFZ != nullptr)
  470. delete[] gStandalone.engineOptions.pathSFZ;
  471. gStandalone.engineOptions.pathSFZ = carla_strdup_safe(valueStr);
  472. break;
  473. }
  474. break;
  475. case CB::ENGINE_OPTION_PATH_BINARIES:
  476. CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
  477. if (gStandalone.engineOptions.binaryDir != nullptr)
  478. delete[] gStandalone.engineOptions.binaryDir;
  479. gStandalone.engineOptions.binaryDir = carla_strdup_safe(valueStr);
  480. break;
  481. case CB::ENGINE_OPTION_PATH_RESOURCES:
  482. CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
  483. if (gStandalone.engineOptions.resourceDir != nullptr)
  484. delete[] gStandalone.engineOptions.resourceDir;
  485. gStandalone.engineOptions.resourceDir = carla_strdup_safe(valueStr);
  486. break;
  487. case CB::ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR:
  488. CARLA_SAFE_ASSERT_RETURN(value == 0 || value == 1,);
  489. gStandalone.engineOptions.preventBadBehaviour = (value != 0);
  490. break;
  491. case CB::ENGINE_OPTION_FRONTEND_WIN_ID: {
  492. CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',);
  493. const long long winId(std::strtoll(valueStr, nullptr, 16));
  494. CARLA_SAFE_ASSERT_RETURN(winId >= 0,);
  495. gStandalone.engineOptions.frontendWinId = static_cast<uintptr_t>(winId);
  496. } break;
  497. case CB::ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT:
  498. gStandalone.logThreadEnabled = (value != 0);
  499. break;
  500. }
  501. if (gStandalone.engine != nullptr)
  502. gStandalone.engine->setOption(option, value, valueStr);
  503. }
  504. #endif
  505. void carla_set_file_callback(FileCallbackFunc func, void* ptr)
  506. {
  507. carla_debug("carla_set_file_callback(%p, %p)", func, ptr);
  508. gStandalone.fileCallback = func;
  509. gStandalone.fileCallbackPtr = ptr;
  510. if (gStandalone.engine != nullptr)
  511. gStandalone.engine->setFileCallback(func, ptr);
  512. }
  513. // -------------------------------------------------------------------------------------------------------------------
  514. bool carla_load_file(const char* filename)
  515. {
  516. CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
  517. carla_debug("carla_load_file(\"%s\")", filename);
  518. if (gStandalone.engine != nullptr)
  519. return gStandalone.engine->loadFile(filename);
  520. carla_stderr2("Engine is not running");
  521. gStandalone.lastError = "Engine is not running";
  522. return false;
  523. }
  524. bool carla_load_project(const char* filename)
  525. {
  526. CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
  527. carla_debug("carla_load_project(\"%s\")", filename);
  528. if (gStandalone.engine != nullptr)
  529. return gStandalone.engine->loadProject(filename);
  530. carla_stderr2("Engine is not running");
  531. gStandalone.lastError = "Engine is not running";
  532. return false;
  533. }
  534. bool carla_save_project(const char* filename)
  535. {
  536. CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
  537. carla_debug("carla_save_project(\"%s\")", filename);
  538. if (gStandalone.engine != nullptr)
  539. return gStandalone.engine->saveProject(filename);
  540. carla_stderr2("Engine was never initiated");
  541. gStandalone.lastError = "Engine was never initiated";
  542. return false;
  543. }
  544. #ifndef BUILD_BRIDGE
  545. // -------------------------------------------------------------------------------------------------------------------
  546. bool carla_patchbay_connect(uint groupIdA, uint portIdA, uint groupIdB, uint portIdB)
  547. {
  548. carla_debug("carla_patchbay_connect(%u, %u, %u, %u)", groupIdA, portIdA, groupIdB, portIdB);
  549. if (gStandalone.engine != nullptr)
  550. return gStandalone.engine->patchbayConnect(groupIdA, portIdA, groupIdB, portIdB);
  551. carla_stderr2("Engine is not running");
  552. gStandalone.lastError = "Engine is not running";
  553. return false;
  554. }
  555. bool carla_patchbay_disconnect(uint connectionId)
  556. {
  557. carla_debug("carla_patchbay_disconnect(%i)", connectionId);
  558. if (gStandalone.engine != nullptr)
  559. return gStandalone.engine->patchbayDisconnect(connectionId);
  560. carla_stderr2("Engine is not running");
  561. gStandalone.lastError = "Engine is not running";
  562. return false;
  563. }
  564. bool carla_patchbay_refresh(bool external)
  565. {
  566. carla_debug("carla_patchbay_refresh(%s)", bool2str(external));
  567. if (gStandalone.engine != nullptr)
  568. return gStandalone.engine->patchbayRefresh(external);
  569. carla_stderr2("Engine is not running");
  570. gStandalone.lastError = "Engine is not running";
  571. return false;
  572. }
  573. // -------------------------------------------------------------------------------------------------------------------
  574. void carla_transport_play()
  575. {
  576. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr && gStandalone.engine->isRunning(),);
  577. carla_debug("carla_transport_play()");
  578. gStandalone.engine->transportPlay();
  579. }
  580. void carla_transport_pause()
  581. {
  582. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr && gStandalone.engine->isRunning(),);
  583. carla_debug("carla_transport_pause()");
  584. gStandalone.engine->transportPause();
  585. }
  586. void carla_transport_bpm(double bpm)
  587. {
  588. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr && gStandalone.engine->isRunning(),);
  589. carla_debug("carla_transport_bpm(%f)", bpm);
  590. gStandalone.engine->transportBPM(bpm);
  591. }
  592. void carla_transport_relocate(uint64_t frame)
  593. {
  594. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr && gStandalone.engine->isRunning(),);
  595. carla_debug("carla_transport_relocate(%i)", frame);
  596. gStandalone.engine->transportRelocate(frame);
  597. }
  598. uint64_t carla_get_current_transport_frame()
  599. {
  600. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr && gStandalone.engine->isRunning(), 0);
  601. const CB::EngineTimeInfo& timeInfo(gStandalone.engine->getTimeInfo());
  602. return timeInfo.frame;
  603. }
  604. const CarlaTransportInfo* carla_get_transport_info()
  605. {
  606. static CarlaTransportInfo retInfo;
  607. // reset
  608. retInfo.playing = false;
  609. retInfo.frame = 0;
  610. retInfo.bar = 0;
  611. retInfo.beat = 0;
  612. retInfo.tick = 0;
  613. retInfo.bpm = 0.0;
  614. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr && gStandalone.engine->isRunning(), &retInfo);
  615. const CB::EngineTimeInfo& timeInfo(gStandalone.engine->getTimeInfo());
  616. retInfo.playing = timeInfo.playing;
  617. retInfo.frame = timeInfo.frame;
  618. if (timeInfo.valid & CB::EngineTimeInfo::kValidBBT)
  619. {
  620. retInfo.bar = timeInfo.bbt.bar;
  621. retInfo.beat = timeInfo.bbt.beat;
  622. retInfo.tick = timeInfo.bbt.tick;
  623. retInfo.bpm = timeInfo.bbt.beatsPerMinute;
  624. }
  625. return &retInfo;
  626. }
  627. #endif
  628. // -------------------------------------------------------------------------------------------------------------------
  629. uint32_t carla_get_current_plugin_count()
  630. {
  631. if (gStandalone.engine != nullptr)
  632. return gStandalone.engine->getCurrentPluginCount();
  633. return 0;
  634. }
  635. uint32_t carla_get_max_plugin_number()
  636. {
  637. if (gStandalone.engine != nullptr)
  638. return gStandalone.engine->getMaxPluginNumber();
  639. return 0;
  640. }
  641. // -------------------------------------------------------------------------------------------------------------------
  642. bool carla_add_plugin(BinaryType btype, PluginType ptype, const char* filename, const char* name, const char* label, int64_t uniqueId, const void* extraPtr, uint options)
  643. {
  644. carla_debug("carla_add_plugin(%i:%s, %i:%s, \"%s\", \"%s\", \"%s\", " P_INT64 ", %p, %u)", btype, CB::BinaryType2Str(btype), ptype, CB::PluginType2Str(ptype), filename, name, label, uniqueId, extraPtr, options);
  645. if (gStandalone.engine != nullptr)
  646. return gStandalone.engine->addPlugin(btype, ptype, filename, name, label, uniqueId, extraPtr, options);
  647. carla_stderr2("Engine is not running");
  648. gStandalone.lastError = "Engine is not running";
  649. return false;
  650. }
  651. bool carla_remove_plugin(uint pluginId)
  652. {
  653. carla_debug("carla_remove_plugin(%i)", pluginId);
  654. if (gStandalone.engine != nullptr)
  655. return gStandalone.engine->removePlugin(pluginId);
  656. carla_stderr2("Engine is not running");
  657. gStandalone.lastError = "Engine is not running";
  658. return false;
  659. }
  660. bool carla_remove_all_plugins()
  661. {
  662. carla_debug("carla_remove_all_plugins()");
  663. if (gStandalone.engine != nullptr)
  664. return gStandalone.engine->removeAllPlugins();
  665. carla_stderr2("Engine is not running");
  666. gStandalone.lastError = "Engine is not running";
  667. return false;
  668. }
  669. #ifndef BUILD_BRIDGE
  670. const char* carla_rename_plugin(uint pluginId, const char* newName)
  671. {
  672. CARLA_SAFE_ASSERT_RETURN(newName != nullptr && newName[0] != '\0', nullptr);
  673. carla_debug("carla_rename_plugin(%i, \"%s\")", pluginId, newName);
  674. if (gStandalone.engine != nullptr)
  675. return gStandalone.engine->renamePlugin(pluginId, newName);
  676. carla_stderr2("Engine is not running");
  677. gStandalone.lastError = "Engine is not running";
  678. return nullptr;
  679. }
  680. bool carla_clone_plugin(uint pluginId)
  681. {
  682. carla_debug("carla_clone_plugin(%i)", pluginId);
  683. if (gStandalone.engine != nullptr)
  684. return gStandalone.engine->clonePlugin(pluginId);
  685. carla_stderr2("Engine is not running");
  686. gStandalone.lastError = "Engine is not running";
  687. return false;
  688. }
  689. bool carla_replace_plugin(uint pluginId)
  690. {
  691. carla_debug("carla_replace_plugin(%i)", pluginId);
  692. if (gStandalone.engine != nullptr)
  693. return gStandalone.engine->replacePlugin(pluginId);
  694. carla_stderr2("Engine is not running");
  695. gStandalone.lastError = "Engine is not running";
  696. return false;
  697. }
  698. bool carla_switch_plugins(uint pluginIdA, uint pluginIdB)
  699. {
  700. CARLA_SAFE_ASSERT_RETURN(pluginIdA != pluginIdB, false);
  701. carla_debug("carla_switch_plugins(%i, %i)", pluginIdA, pluginIdB);
  702. if (gStandalone.engine != nullptr)
  703. return gStandalone.engine->switchPlugins(pluginIdA, pluginIdB);
  704. carla_stderr2("Engine is not running");
  705. gStandalone.lastError = "Engine is not running";
  706. return false;
  707. }
  708. #endif
  709. // -------------------------------------------------------------------------------------------------------------------
  710. bool carla_load_plugin_state(uint pluginId, const char* filename)
  711. {
  712. CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
  713. carla_debug("carla_load_plugin_state(%i, \"%s\")", pluginId, filename);
  714. if (gStandalone.engine == nullptr || ! gStandalone.engine->isRunning())
  715. {
  716. carla_stderr2("Engine is not running");
  717. gStandalone.lastError = "Engine is not running";
  718. return false;
  719. }
  720. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  721. return plugin->loadStateFromFile(filename);
  722. carla_stderr2("carla_load_plugin_state(%i, \"%s\") - could not find plugin", pluginId, filename);
  723. return false;
  724. }
  725. bool carla_save_plugin_state(uint pluginId, const char* filename)
  726. {
  727. CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
  728. carla_debug("carla_save_plugin_state(%i, \"%s\")", pluginId, filename);
  729. if (gStandalone.engine == nullptr)
  730. {
  731. carla_stderr2("Engine is not running");
  732. gStandalone.lastError = "Engine is not running";
  733. return false;
  734. }
  735. // allow to save even if engine isn't running
  736. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  737. return plugin->saveStateToFile(filename);
  738. carla_stderr2("carla_save_plugin_state(%i, \"%s\") - could not find plugin", pluginId, filename);
  739. return false;
  740. }
  741. bool carla_export_plugin_lv2(uint pluginId, const char* lv2path)
  742. {
  743. CARLA_SAFE_ASSERT_RETURN(lv2path != nullptr && lv2path[0] != '\0', false);
  744. carla_debug("carla_export_plugin_lv2(%i, \"%s\")", pluginId, lv2path);
  745. if (gStandalone.engine == nullptr)
  746. {
  747. carla_stderr2("Engine is not running");
  748. gStandalone.lastError = "Engine is not running";
  749. return false;
  750. }
  751. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  752. return plugin->exportAsLV2(lv2path);
  753. carla_stderr2("carla_export_plugin_lv2(%i, \"%s\") - could not find plugin", pluginId, lv2path);
  754. return false;
  755. }
  756. // -------------------------------------------------------------------------------------------------------------------
  757. const CarlaPluginInfo* carla_get_plugin_info(uint pluginId)
  758. {
  759. carla_debug("carla_get_plugin_info(%i)", pluginId);
  760. static CarlaPluginInfo info;
  761. // reset
  762. info.type = CB::PLUGIN_NONE;
  763. info.category = CB::PLUGIN_CATEGORY_NONE;
  764. info.hints = 0x0;
  765. info.optionsAvailable = 0x0;
  766. info.optionsEnabled = 0x0;
  767. info.filename = gNullCharPtr;
  768. info.name = gNullCharPtr;
  769. info.iconName = gNullCharPtr;
  770. info.uniqueId = 0;
  771. // cleanup
  772. if (info.label != gNullCharPtr)
  773. {
  774. delete[] info.label;
  775. info.label = gNullCharPtr;
  776. }
  777. if (info.maker != gNullCharPtr)
  778. {
  779. delete[] info.maker;
  780. info.maker = gNullCharPtr;
  781. }
  782. if (info.copyright != gNullCharPtr)
  783. {
  784. delete[] info.copyright;
  785. info.copyright = gNullCharPtr;
  786. }
  787. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &info);
  788. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  789. {
  790. char strBufLabel[STR_MAX+1];
  791. char strBufMaker[STR_MAX+1];
  792. char strBufCopyright[STR_MAX+1];
  793. carla_zeroChars(strBufLabel, STR_MAX+1);
  794. carla_zeroChars(strBufMaker, STR_MAX+1);
  795. carla_zeroChars(strBufCopyright, STR_MAX+1);
  796. info.type = plugin->getType();
  797. info.category = plugin->getCategory();
  798. info.hints = plugin->getHints();
  799. info.filename = plugin->getFilename();
  800. info.name = plugin->getName();
  801. info.iconName = plugin->getIconName();
  802. info.uniqueId = plugin->getUniqueId();
  803. info.optionsAvailable = plugin->getOptionsAvailable();
  804. info.optionsEnabled = plugin->getOptionsEnabled();
  805. plugin->getLabel(strBufLabel);
  806. info.label = carla_strdup_safe(strBufLabel);
  807. plugin->getMaker(strBufMaker);
  808. info.maker = carla_strdup_safe(strBufMaker);
  809. plugin->getCopyright(strBufCopyright);
  810. info.copyright = carla_strdup_safe(strBufCopyright);
  811. checkStringPtr(info.filename);
  812. checkStringPtr(info.name);
  813. checkStringPtr(info.iconName);
  814. checkStringPtr(info.label);
  815. checkStringPtr(info.maker);
  816. checkStringPtr(info.copyright);
  817. return &info;
  818. }
  819. carla_stderr2("carla_get_plugin_info(%i) - could not find plugin", pluginId);
  820. return &info;
  821. }
  822. const CarlaPortCountInfo* carla_get_audio_port_count_info(uint pluginId)
  823. {
  824. carla_debug("carla_get_audio_port_count_info(%i)", pluginId);
  825. static CarlaPortCountInfo info;
  826. // reset
  827. info.ins = 0;
  828. info.outs = 0;
  829. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &info);
  830. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  831. {
  832. info.ins = plugin->getAudioInCount();
  833. info.outs = plugin->getAudioOutCount();
  834. return &info;
  835. }
  836. carla_stderr2("carla_get_audio_port_count_info(%i) - could not find plugin", pluginId);
  837. return &info;
  838. }
  839. const CarlaPortCountInfo* carla_get_midi_port_count_info(uint pluginId)
  840. {
  841. carla_debug("carla_get_midi_port_count_info(%i)", pluginId);
  842. static CarlaPortCountInfo info;
  843. // reset
  844. info.ins = 0;
  845. info.outs = 0;
  846. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &info);
  847. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  848. {
  849. info.ins = plugin->getMidiInCount();
  850. info.outs = plugin->getMidiOutCount();
  851. return &info;
  852. }
  853. carla_stderr2("carla_get_midi_port_count_info(%i) - could not find plugin", pluginId);
  854. return &info;
  855. }
  856. const CarlaPortCountInfo* carla_get_parameter_count_info(uint pluginId)
  857. {
  858. carla_debug("carla_get_parameter_count_info(%i)", pluginId);
  859. static CarlaPortCountInfo info;
  860. // reset
  861. info.ins = 0;
  862. info.outs = 0;
  863. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &info);
  864. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  865. {
  866. plugin->getParameterCountInfo(info.ins, info.outs);
  867. return &info;
  868. }
  869. carla_stderr2("carla_get_parameter_count_info(%i) - could not find plugin", pluginId);
  870. return &info;
  871. }
  872. const CarlaParameterInfo* carla_get_parameter_info(uint pluginId, uint32_t parameterId)
  873. {
  874. carla_debug("carla_get_parameter_info(%i, %i)", pluginId, parameterId);
  875. static CarlaParameterInfo info;
  876. // reset
  877. info.scalePointCount = 0;
  878. // cleanup
  879. if (info.name != gNullCharPtr)
  880. {
  881. delete[] info.name;
  882. info.name = gNullCharPtr;
  883. }
  884. if (info.symbol != gNullCharPtr)
  885. {
  886. delete[] info.symbol;
  887. info.symbol = gNullCharPtr;
  888. }
  889. if (info.unit != gNullCharPtr)
  890. {
  891. delete[] info.unit;
  892. info.unit = gNullCharPtr;
  893. }
  894. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &info);
  895. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  896. {
  897. if (parameterId < plugin->getParameterCount())
  898. {
  899. char strBufName[STR_MAX+1];
  900. char strBufSymbol[STR_MAX+1];
  901. char strBufUnit[STR_MAX+1];
  902. carla_zeroChars(strBufName, STR_MAX+1);
  903. carla_zeroChars(strBufSymbol, STR_MAX+1);
  904. carla_zeroChars(strBufUnit, STR_MAX+1);
  905. info.scalePointCount = plugin->getParameterScalePointCount(parameterId);
  906. plugin->getParameterName(parameterId, strBufName);
  907. info.name = carla_strdup_safe(strBufName);
  908. plugin->getParameterSymbol(parameterId, strBufSymbol);
  909. info.symbol = carla_strdup_safe(strBufSymbol);
  910. plugin->getParameterUnit(parameterId, strBufUnit);
  911. info.unit = carla_strdup_safe(strBufUnit);
  912. checkStringPtr(info.name);
  913. checkStringPtr(info.symbol);
  914. checkStringPtr(info.unit);
  915. }
  916. else
  917. carla_stderr2("carla_get_parameter_info(%i, %i) - parameterId out of bounds", pluginId, parameterId);
  918. return &info;
  919. }
  920. carla_stderr2("carla_get_parameter_info(%i, %i) - could not find plugin", pluginId, parameterId);
  921. return &info;
  922. }
  923. const CarlaScalePointInfo* carla_get_parameter_scalepoint_info(uint pluginId, uint32_t parameterId, uint32_t scalePointId)
  924. {
  925. carla_debug("carla_get_parameter_scalepoint_info(%i, %i, %i)", pluginId, parameterId, scalePointId);
  926. CARLA_ASSERT(gStandalone.engine != nullptr);
  927. static CarlaScalePointInfo info;
  928. // reset
  929. info.value = 0.0f;
  930. // cleanup
  931. if (info.label != gNullCharPtr)
  932. {
  933. delete[] info.label;
  934. info.label = gNullCharPtr;
  935. }
  936. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &info);
  937. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  938. {
  939. if (parameterId < plugin->getParameterCount())
  940. {
  941. if (scalePointId < plugin->getParameterScalePointCount(parameterId))
  942. {
  943. char strBufLabel[STR_MAX+1];
  944. carla_zeroChars(strBufLabel, STR_MAX+1);
  945. info.value = plugin->getParameterScalePointValue(parameterId, scalePointId);
  946. plugin->getParameterScalePointLabel(parameterId, scalePointId, strBufLabel);
  947. info.label = carla_strdup_safe(strBufLabel);
  948. checkStringPtr(info.label);
  949. }
  950. else
  951. carla_stderr2("carla_get_parameter_scalepoint_info(%i, %i, %i) - scalePointId out of bounds", pluginId, parameterId, scalePointId);
  952. }
  953. else
  954. carla_stderr2("carla_get_parameter_scalepoint_info(%i, %i, %i) - parameterId out of bounds", pluginId, parameterId, scalePointId);
  955. return &info;
  956. }
  957. carla_stderr2("carla_get_parameter_scalepoint_info(%i, %i, %i) - could not find plugin", pluginId, parameterId, scalePointId);
  958. return &info;
  959. }
  960. // -------------------------------------------------------------------------------------------------------------------
  961. const ParameterData* carla_get_parameter_data(uint pluginId, uint32_t parameterId)
  962. {
  963. carla_debug("carla_get_parameter_data(%i, %i)", pluginId, parameterId);
  964. static const ParameterData fallbackParameterData = { CB::PARAMETER_UNKNOWN, 0x0, CB::PARAMETER_NULL, -1, -1, 0 };
  965. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &fallbackParameterData);
  966. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  967. {
  968. if (parameterId < plugin->getParameterCount())
  969. return &plugin->getParameterData(parameterId);
  970. carla_stderr2("carla_get_parameter_data(%i, %i) - parameterId out of bounds", pluginId, parameterId);
  971. return &fallbackParameterData;
  972. }
  973. carla_stderr2("carla_get_parameter_data(%i, %i) - could not find plugin", pluginId, parameterId);
  974. return &fallbackParameterData;
  975. }
  976. const ParameterRanges* carla_get_parameter_ranges(uint pluginId, uint32_t parameterId)
  977. {
  978. carla_debug("carla_get_parameter_ranges(%i, %i)", pluginId, parameterId);
  979. static const ParameterRanges fallbackParamRanges = { 0.0f, 0.0f, 1.0f, 0.01f, 0.0001f, 0.1f };
  980. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &fallbackParamRanges);
  981. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  982. {
  983. if (parameterId < plugin->getParameterCount())
  984. return &plugin->getParameterRanges(parameterId);
  985. carla_stderr2("carla_get_parameter_ranges(%i, %i) - parameterId out of bounds", pluginId, parameterId);
  986. return &fallbackParamRanges;
  987. }
  988. carla_stderr2("carla_get_parameter_ranges(%i, %i) - could not find plugin", pluginId, parameterId);
  989. return &fallbackParamRanges;
  990. }
  991. const MidiProgramData* carla_get_midi_program_data(uint pluginId, uint32_t midiProgramId)
  992. {
  993. carla_debug("carla_get_midi_program_data(%i, %i)", pluginId, midiProgramId);
  994. static MidiProgramData midiProgData;
  995. // reset
  996. midiProgData.bank = 0;
  997. midiProgData.program = 0;
  998. midiProgData.name = gNullCharPtr;
  999. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &midiProgData);
  1000. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1001. {
  1002. if (midiProgramId < plugin->getMidiProgramCount())
  1003. {
  1004. const MidiProgramData& ret(plugin->getMidiProgramData(midiProgramId));
  1005. carla_copyStruct(midiProgData, ret);
  1006. checkStringPtr(midiProgData.name);
  1007. return &midiProgData;
  1008. }
  1009. carla_stderr2("carla_get_midi_program_data(%i, %i) - midiProgramId out of bounds", pluginId, midiProgramId);
  1010. return &midiProgData;
  1011. }
  1012. carla_stderr2("carla_get_midi_program_data(%i, %i) - could not find plugin", pluginId, midiProgramId);
  1013. return &midiProgData;
  1014. }
  1015. const CustomData* carla_get_custom_data(uint pluginId, uint32_t customDataId)
  1016. {
  1017. carla_debug("carla_get_custom_data(%i, %i)", pluginId, customDataId);
  1018. static CustomData customData;
  1019. // reset
  1020. customData.type = gNullCharPtr;
  1021. customData.key = gNullCharPtr;
  1022. customData.value = gNullCharPtr;
  1023. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &customData);
  1024. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1025. {
  1026. if (customDataId < plugin->getCustomDataCount())
  1027. {
  1028. const CustomData& ret(plugin->getCustomData(customDataId));
  1029. carla_copyStruct(customData, ret);
  1030. checkStringPtr(customData.type);
  1031. checkStringPtr(customData.key);
  1032. checkStringPtr(customData.value);
  1033. return &customData;
  1034. }
  1035. carla_stderr2("carla_get_custom_data(%i, %i) - customDataId out of bounds", pluginId, customDataId);
  1036. return &customData;
  1037. }
  1038. carla_stderr2("carla_get_custom_data(%i, %i) - could not find plugin", pluginId, customDataId);
  1039. return &customData;
  1040. }
  1041. const char* carla_get_chunk_data(uint pluginId)
  1042. {
  1043. carla_debug("carla_get_chunk_data(%i)", pluginId);
  1044. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, nullptr);
  1045. static CarlaString chunkData;
  1046. // cleanup
  1047. chunkData.clear();
  1048. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1049. {
  1050. if (plugin->getOptionsEnabled() & CB::PLUGIN_OPTION_USE_CHUNKS)
  1051. {
  1052. void* data = nullptr;
  1053. const std::size_t dataSize(plugin->getChunkData(&data));
  1054. if (data != nullptr && dataSize > 0)
  1055. {
  1056. chunkData = CarlaString::asBase64(data, static_cast<std::size_t>(dataSize));
  1057. return chunkData;
  1058. }
  1059. else
  1060. carla_stderr2("carla_get_chunk_data(%i) - got invalid chunk data", pluginId);
  1061. }
  1062. else
  1063. carla_stderr2("carla_get_chunk_data(%i) - plugin does not use chunks", pluginId);
  1064. return nullptr;
  1065. }
  1066. carla_stderr2("carla_get_chunk_data(%i) - could not find plugin", pluginId);
  1067. return nullptr;
  1068. }
  1069. // -------------------------------------------------------------------------------------------------------------------
  1070. uint32_t carla_get_parameter_count(uint pluginId)
  1071. {
  1072. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0);
  1073. carla_debug("carla_get_parameter_count(%i)", pluginId);
  1074. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1075. return plugin->getParameterCount();
  1076. carla_stderr2("carla_get_parameter_count(%i) - could not find plugin", pluginId);
  1077. return 0;
  1078. }
  1079. uint32_t carla_get_program_count(uint pluginId)
  1080. {
  1081. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0);
  1082. carla_debug("carla_get_program_count(%i)", pluginId);
  1083. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1084. return plugin->getProgramCount();
  1085. carla_stderr2("carla_get_program_count(%i) - could not find plugin", pluginId);
  1086. return 0;
  1087. }
  1088. uint32_t carla_get_midi_program_count(uint pluginId)
  1089. {
  1090. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0);
  1091. carla_debug("carla_get_midi_program_count(%i)", pluginId);
  1092. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1093. return plugin->getMidiProgramCount();
  1094. carla_stderr2("carla_get_midi_program_count(%i) - could not find plugin", pluginId);
  1095. return 0;
  1096. }
  1097. uint32_t carla_get_custom_data_count(uint pluginId)
  1098. {
  1099. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0);
  1100. carla_debug("carla_get_custom_data_count(%i)", pluginId);
  1101. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1102. return plugin->getCustomDataCount();
  1103. carla_stderr2("carla_get_custom_data_count(%i) - could not find plugin", pluginId);
  1104. return 0;
  1105. }
  1106. // -------------------------------------------------------------------------------------------------------------------
  1107. const char* carla_get_parameter_text(uint pluginId, uint32_t parameterId)
  1108. {
  1109. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, nullptr);
  1110. carla_debug("carla_get_parameter_text(%i, %i)", pluginId, parameterId);
  1111. static char textBuf[STR_MAX+1];
  1112. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1113. {
  1114. if (parameterId < plugin->getParameterCount())
  1115. {
  1116. carla_zeroChars(textBuf, STR_MAX+1);
  1117. plugin->getParameterText(parameterId, textBuf);
  1118. return textBuf;
  1119. }
  1120. carla_stderr2("carla_get_parameter_text(%i, %i) - parameterId out of bounds", pluginId, parameterId);
  1121. return nullptr;
  1122. }
  1123. carla_stderr2("carla_get_parameter_text(%i, %i) - could not find plugin", pluginId, parameterId);
  1124. return nullptr;
  1125. }
  1126. const char* carla_get_program_name(uint pluginId, uint32_t programId)
  1127. {
  1128. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, nullptr);
  1129. carla_debug("carla_get_program_name(%i, %i)", pluginId, programId);
  1130. static char programName[STR_MAX+1];
  1131. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1132. {
  1133. if (programId < plugin->getProgramCount())
  1134. {
  1135. carla_zeroChars(programName, STR_MAX+1);
  1136. plugin->getProgramName(programId, programName);
  1137. return programName;
  1138. }
  1139. carla_stderr2("carla_get_program_name(%i, %i) - programId out of bounds", pluginId, programId);
  1140. return nullptr;
  1141. }
  1142. carla_stderr2("carla_get_program_name(%i, %i) - could not find plugin", pluginId, programId);
  1143. return nullptr;
  1144. }
  1145. const char* carla_get_midi_program_name(uint pluginId, uint32_t midiProgramId)
  1146. {
  1147. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, nullptr);
  1148. carla_debug("carla_get_midi_program_name(%i, %i)", pluginId, midiProgramId);
  1149. static char midiProgramName[STR_MAX+1];
  1150. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1151. {
  1152. if (midiProgramId < plugin->getMidiProgramCount())
  1153. {
  1154. carla_zeroChars(midiProgramName, STR_MAX+1);
  1155. plugin->getMidiProgramName(midiProgramId, midiProgramName);
  1156. return midiProgramName;
  1157. }
  1158. carla_stderr2("carla_get_midi_program_name(%i, %i) - midiProgramId out of bounds", pluginId, midiProgramId);
  1159. return nullptr;
  1160. }
  1161. carla_stderr2("carla_get_midi_program_name(%i, %i) - could not find plugin", pluginId, midiProgramId);
  1162. return nullptr;
  1163. }
  1164. const char* carla_get_real_plugin_name(uint pluginId)
  1165. {
  1166. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, nullptr);
  1167. carla_debug("carla_get_real_plugin_name(%i)", pluginId);
  1168. static char realPluginName[STR_MAX+1];
  1169. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1170. {
  1171. carla_zeroChars(realPluginName, STR_MAX+1);
  1172. plugin->getRealName(realPluginName);
  1173. return realPluginName;
  1174. }
  1175. carla_stderr2("carla_get_real_plugin_name(%i) - could not find plugin", pluginId);
  1176. return nullptr;
  1177. }
  1178. // -------------------------------------------------------------------------------------------------------------------
  1179. int32_t carla_get_current_program_index(uint pluginId)
  1180. {
  1181. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, -1);
  1182. carla_debug("carla_get_current_program_index(%i)", pluginId);
  1183. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1184. return plugin->getCurrentProgram();
  1185. carla_stderr2("carla_get_current_program_index(%i) - could not find plugin", pluginId);
  1186. return -1;
  1187. }
  1188. int32_t carla_get_current_midi_program_index(uint pluginId)
  1189. {
  1190. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, -1);
  1191. carla_debug("carla_get_current_midi_program_index(%i)", pluginId);
  1192. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1193. return plugin->getCurrentMidiProgram();
  1194. carla_stderr2("carla_get_current_midi_program_index(%i) - could not find plugin", pluginId);
  1195. return -1;
  1196. }
  1197. // -------------------------------------------------------------------------------------------------------------------
  1198. float carla_get_default_parameter_value(uint pluginId, uint32_t parameterId)
  1199. {
  1200. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0.0f);
  1201. carla_debug("carla_get_default_parameter_value(%i, %i)", pluginId, parameterId);
  1202. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1203. {
  1204. if (parameterId < plugin->getParameterCount())
  1205. return plugin->getParameterRanges(parameterId).def;
  1206. carla_stderr2("carla_get_default_parameter_value(%i, %i) - parameterId out of bounds", pluginId, parameterId);
  1207. return 0.0f;
  1208. }
  1209. carla_stderr2("carla_get_default_parameter_value(%i, %i) - could not find plugin", pluginId, parameterId);
  1210. return 0.0f;
  1211. }
  1212. float carla_get_current_parameter_value(uint pluginId, uint32_t parameterId)
  1213. {
  1214. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0.0f);
  1215. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1216. {
  1217. if (parameterId < plugin->getParameterCount())
  1218. return plugin->getParameterValue(parameterId);
  1219. carla_stderr2("carla_get_current_parameter_value(%i, %i) - parameterId out of bounds", pluginId, parameterId);
  1220. return 0.0f;
  1221. }
  1222. carla_stderr2("carla_get_current_parameter_value(%i, %i) - could not find plugin", pluginId, parameterId);
  1223. return 0.0f;
  1224. }
  1225. float carla_get_internal_parameter_value(uint pluginId, int32_t parameterId)
  1226. {
  1227. #ifdef BUILD_BRIDGE
  1228. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0.0f);
  1229. #else
  1230. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, (parameterId == CB::PARAMETER_CTRL_CHANNEL) ? -1.0f : 0.0f);
  1231. #endif
  1232. CARLA_SAFE_ASSERT_RETURN(parameterId != CB::PARAMETER_NULL && parameterId > CB::PARAMETER_MAX, 0.0f);
  1233. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1234. return plugin->getInternalParameterValue(parameterId);
  1235. carla_stderr2("carla_get_internal_parameter_value(%i, %i) - could not find plugin", pluginId, parameterId);
  1236. return 0.0f;
  1237. }
  1238. // -------------------------------------------------------------------------------------------------------------------
  1239. float carla_get_input_peak_value(uint pluginId, bool isLeft)
  1240. {
  1241. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0.0f);
  1242. return gStandalone.engine->getInputPeak(pluginId, isLeft);
  1243. }
  1244. float carla_get_output_peak_value(uint pluginId, bool isLeft)
  1245. {
  1246. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0.0f);
  1247. return gStandalone.engine->getOutputPeak(pluginId, isLeft);
  1248. }
  1249. // -------------------------------------------------------------------------------------------------------------------
  1250. CARLA_BACKEND_START_NAMESPACE
  1251. // defined in CarlaPluginLV2.cpp
  1252. void* carla_render_inline_display_lv2(CarlaPlugin* plugin, int width, int height);
  1253. CARLA_BACKEND_END_NAMESPACE
  1254. CarlaInlineDisplayImageSurface* carla_render_inline_display(uint pluginId, int width, int height)
  1255. {
  1256. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, nullptr);
  1257. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1258. {
  1259. CARLA_SAFE_ASSERT_RETURN(plugin->getType() == CB::PLUGIN_LV2, nullptr);
  1260. return (CarlaInlineDisplayImageSurface*)CB::carla_render_inline_display_lv2(plugin, width, height);
  1261. }
  1262. carla_stderr2("carla_render_inline_display(%i, %i, %i) - could not find plugin", pluginId, width, height);
  1263. return nullptr;
  1264. }
  1265. // -------------------------------------------------------------------------------------------------------------------
  1266. void carla_set_active(uint pluginId, bool onOff)
  1267. {
  1268. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1269. carla_debug("carla_set_active(%i, %s)", pluginId, bool2str(onOff));
  1270. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1271. return plugin->setActive(onOff, true, false);
  1272. carla_stderr2("carla_set_active(%i, %s) - could not find plugin", pluginId, bool2str(onOff));
  1273. }
  1274. #ifndef BUILD_BRIDGE
  1275. void carla_set_drywet(uint pluginId, float value)
  1276. {
  1277. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1278. carla_debug("carla_set_drywet(%i, %f)", pluginId, value);
  1279. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1280. return plugin->setDryWet(value, true, false);
  1281. carla_stderr2("carla_set_drywet(%i, %f) - could not find plugin", pluginId, value);
  1282. }
  1283. void carla_set_volume(uint pluginId, float value)
  1284. {
  1285. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1286. carla_debug("carla_set_volume(%i, %f)", pluginId, value);
  1287. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1288. return plugin->setVolume(value, true, false);
  1289. carla_stderr2("carla_set_volume(%i, %f) - could not find plugin", pluginId, value);
  1290. }
  1291. void carla_set_balance_left(uint pluginId, float value)
  1292. {
  1293. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1294. carla_debug("carla_set_balance_left(%i, %f)", pluginId, value);
  1295. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1296. return plugin->setBalanceLeft(value, true, false);
  1297. carla_stderr2("carla_set_balance_left(%i, %f) - could not find plugin", pluginId, value);
  1298. }
  1299. void carla_set_balance_right(uint pluginId, float value)
  1300. {
  1301. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1302. carla_debug("carla_set_balance_right(%i, %f)", pluginId, value);
  1303. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1304. return plugin->setBalanceRight(value, true, false);
  1305. carla_stderr2("carla_set_balance_right(%i, %f) - could not find plugin", pluginId, value);
  1306. }
  1307. void carla_set_panning(uint pluginId, float value)
  1308. {
  1309. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1310. carla_debug("carla_set_panning(%i, %f)", pluginId, value);
  1311. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1312. return plugin->setPanning(value, true, false);
  1313. carla_stderr2("carla_set_panning(%i, %f) - could not find plugin", pluginId, value);
  1314. }
  1315. void carla_set_ctrl_channel(uint pluginId, int8_t channel)
  1316. {
  1317. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1318. CARLA_SAFE_ASSERT_RETURN(channel >= -1 && channel < MAX_MIDI_CHANNELS,);
  1319. carla_debug("carla_set_ctrl_channel(%i, %i)", pluginId, channel);
  1320. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1321. return plugin->setCtrlChannel(channel, true, false);
  1322. carla_stderr2("carla_set_ctrl_channel(%i, %i) - could not find plugin", pluginId, channel);
  1323. }
  1324. void carla_set_option(uint pluginId, uint option, bool yesNo)
  1325. {
  1326. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1327. carla_debug("carla_set_option(%i, %i, %s)", pluginId, option, bool2str(yesNo));
  1328. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1329. return plugin->setOption(option, yesNo, false);
  1330. carla_stderr2("carla_set_option(%i, %i, %s) - could not find plugin", pluginId, option, bool2str(yesNo));
  1331. }
  1332. #endif
  1333. // -------------------------------------------------------------------------------------------------------------------
  1334. void carla_set_parameter_value(uint pluginId, uint32_t parameterId, float value)
  1335. {
  1336. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1337. carla_debug("carla_set_parameter_value(%i, %i, %f)", pluginId, parameterId, value);
  1338. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1339. {
  1340. if (parameterId < plugin->getParameterCount())
  1341. return plugin->setParameterValue(parameterId, value, true, true, false);
  1342. carla_stderr2("carla_set_parameter_value(%i, %i, %f) - parameterId out of bounds", pluginId, parameterId, value);
  1343. return;
  1344. }
  1345. carla_stderr2("carla_set_parameter_value(%i, %i, %f) - could not find plugin", pluginId, parameterId, value);
  1346. }
  1347. #ifndef BUILD_BRIDGE
  1348. void carla_set_parameter_midi_channel(uint pluginId, uint32_t parameterId, uint8_t channel)
  1349. {
  1350. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1351. CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,);
  1352. carla_debug("carla_set_parameter_midi_channel(%i, %i, %i)", pluginId, parameterId, channel);
  1353. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1354. {
  1355. if (parameterId < plugin->getParameterCount())
  1356. return plugin->setParameterMidiChannel(parameterId, channel, true, false);
  1357. carla_stderr2("carla_set_parameter_midi_channel(%i, %i, %i) - parameterId out of bounds", pluginId, parameterId, channel);
  1358. return;
  1359. }
  1360. carla_stderr2("carla_set_parameter_midi_channel(%i, %i, %i) - could not find plugin", pluginId, parameterId, channel);
  1361. }
  1362. void carla_set_parameter_midi_cc(uint pluginId, uint32_t parameterId, int16_t cc)
  1363. {
  1364. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1365. CARLA_SAFE_ASSERT_RETURN(cc >= -1 && cc < MAX_MIDI_CONTROL,);
  1366. carla_debug("carla_set_parameter_midi_cc(%i, %i, %i)", pluginId, parameterId, cc);
  1367. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1368. {
  1369. if (parameterId < plugin->getParameterCount())
  1370. return plugin->setParameterMidiCC(parameterId, cc, true, false);
  1371. carla_stderr2("carla_set_parameter_midi_cc(%i, %i, %i) - parameterId out of bounds", pluginId, parameterId, cc);
  1372. return;
  1373. }
  1374. carla_stderr2("carla_set_parameter_midi_cc(%i, %i, %i) - could not find plugin", pluginId, parameterId, cc);
  1375. }
  1376. #endif
  1377. // -------------------------------------------------------------------------------------------------------------------
  1378. void carla_set_program(uint pluginId, uint32_t programId)
  1379. {
  1380. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1381. carla_debug("carla_set_program(%i, %i)", pluginId, programId);
  1382. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1383. {
  1384. if (programId < plugin->getProgramCount())
  1385. return plugin->setProgram(static_cast<int32_t>(programId), true, true, false);
  1386. carla_stderr2("carla_set_program(%i, %i) - programId out of bounds", pluginId, programId);
  1387. return;
  1388. }
  1389. carla_stderr2("carla_set_program(%i, %i) - could not find plugin", pluginId, programId);
  1390. }
  1391. void carla_set_midi_program(uint pluginId, uint32_t midiProgramId)
  1392. {
  1393. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1394. carla_debug("carla_set_midi_program(%i, %i)", pluginId, midiProgramId);
  1395. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1396. {
  1397. if (midiProgramId < plugin->getMidiProgramCount())
  1398. return plugin->setMidiProgram(static_cast<int32_t>(midiProgramId), true, true, false);
  1399. carla_stderr2("carla_set_midi_program(%i, %i) - midiProgramId out of bounds", pluginId, midiProgramId);
  1400. return;
  1401. }
  1402. carla_stderr2("carla_set_midi_program(%i, %i) - could not find plugin", pluginId, midiProgramId);
  1403. }
  1404. // -------------------------------------------------------------------------------------------------------------------
  1405. void carla_set_custom_data(uint pluginId, const char* type, const char* key, const char* value)
  1406. {
  1407. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1408. CARLA_SAFE_ASSERT_RETURN(type != nullptr && type[0] != '\0',);
  1409. CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',);
  1410. CARLA_SAFE_ASSERT_RETURN(value != nullptr,);
  1411. carla_debug("carla_set_custom_data(%i, \"%s\", \"%s\", \"%s\")", pluginId, type, key, value);
  1412. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1413. return plugin->setCustomData(type, key, value, true);
  1414. carla_stderr2("carla_set_custom_data(%i, \"%s\", \"%s\", \"%s\") - could not find plugin", pluginId, type, key, value);
  1415. }
  1416. void carla_set_chunk_data(uint pluginId, const char* chunkData)
  1417. {
  1418. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1419. CARLA_SAFE_ASSERT_RETURN(chunkData != nullptr && chunkData[0] != '\0',);
  1420. carla_debug("carla_set_chunk_data(%i, \"%s\")", pluginId, chunkData);
  1421. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1422. {
  1423. if (plugin->getOptionsEnabled() & CB::PLUGIN_OPTION_USE_CHUNKS)
  1424. {
  1425. std::vector<uint8_t> chunk(carla_getChunkFromBase64String(chunkData));
  1426. return plugin->setChunkData(chunk.data(), chunk.size());
  1427. }
  1428. carla_stderr2("carla_set_chunk_data(%i, \"%s\") - plugin does not use chunks", pluginId, chunkData);
  1429. return;
  1430. }
  1431. carla_stderr2("carla_set_chunk_data(%i, \"%s\") - could not find plugin", pluginId, chunkData);
  1432. }
  1433. // -------------------------------------------------------------------------------------------------------------------
  1434. void carla_prepare_for_save(uint pluginId)
  1435. {
  1436. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1437. carla_debug("carla_prepare_for_save(%i)", pluginId);
  1438. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1439. return plugin->prepareForSave();
  1440. carla_stderr2("carla_prepare_for_save(%i) - could not find plugin", pluginId);
  1441. }
  1442. void carla_reset_parameters(uint pluginId)
  1443. {
  1444. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1445. carla_debug("carla_reset_parameters(%i)", pluginId);
  1446. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1447. return plugin->resetParameters();
  1448. carla_stderr2("carla_reset_parameters(%i) - could not find plugin", pluginId);
  1449. }
  1450. void carla_randomize_parameters(uint pluginId)
  1451. {
  1452. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1453. carla_debug("carla_randomize_parameters(%i)", pluginId);
  1454. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1455. return plugin->randomizeParameters();
  1456. carla_stderr2("carla_randomize_parameters(%i) - could not find plugin", pluginId);
  1457. }
  1458. #ifndef BUILD_BRIDGE
  1459. void carla_send_midi_note(uint pluginId, uint8_t channel, uint8_t note, uint8_t velocity)
  1460. {
  1461. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr && gStandalone.engine->isRunning(),);
  1462. carla_debug("carla_send_midi_note(%i, %i, %i, %i)", pluginId, channel, note, velocity);
  1463. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1464. return plugin->sendMidiSingleNote(channel, note, velocity, true, true, false);
  1465. carla_stderr2("carla_send_midi_note(%i, %i, %i, %i) - could not find plugin", pluginId, channel, note, velocity);
  1466. }
  1467. #endif
  1468. void carla_show_custom_ui(uint pluginId, bool yesNo)
  1469. {
  1470. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,);
  1471. carla_debug("carla_show_custom_ui(%i, %s)", pluginId, bool2str(yesNo));
  1472. if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId))
  1473. return plugin->showCustomUI(yesNo);
  1474. carla_stderr2("carla_show_custom_ui(%i, %s) - could not find plugin", pluginId, bool2str(yesNo));
  1475. }
  1476. // -------------------------------------------------------------------------------------------------------------------
  1477. uint32_t carla_get_buffer_size()
  1478. {
  1479. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0);
  1480. carla_debug("carla_get_buffer_size()");
  1481. return gStandalone.engine->getBufferSize();
  1482. }
  1483. double carla_get_sample_rate()
  1484. {
  1485. CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, 0.0);
  1486. carla_debug("carla_get_sample_rate()");
  1487. return gStandalone.engine->getSampleRate();
  1488. }
  1489. // -------------------------------------------------------------------------------------------------------------------
  1490. const char* carla_get_last_error()
  1491. {
  1492. carla_debug("carla_get_last_error()");
  1493. if (gStandalone.engine != nullptr)
  1494. return gStandalone.engine->getLastError();
  1495. return gStandalone.lastError;
  1496. }
  1497. const char* carla_get_host_osc_url_tcp()
  1498. {
  1499. carla_debug("carla_get_host_osc_url_tcp()");
  1500. #ifdef HAVE_LIBLO
  1501. if (gStandalone.engine == nullptr)
  1502. {
  1503. carla_stderr2("Engine is not running");
  1504. gStandalone.lastError = "Engine is not running";
  1505. return nullptr;
  1506. }
  1507. return gStandalone.engine->getOscServerPathTCP();
  1508. #else
  1509. return nullptr;
  1510. #endif
  1511. }
  1512. const char* carla_get_host_osc_url_udp()
  1513. {
  1514. carla_debug("carla_get_host_osc_url_udp()");
  1515. #ifdef HAVE_LIBLO
  1516. if (gStandalone.engine == nullptr)
  1517. {
  1518. carla_stderr2("Engine is not running");
  1519. gStandalone.lastError = "Engine is not running";
  1520. return nullptr;
  1521. }
  1522. return gStandalone.engine->getOscServerPathUDP();
  1523. #else
  1524. return nullptr;
  1525. #endif
  1526. }
  1527. // -------------------------------------------------------------------------------------------------------------------
  1528. #include "CarlaPluginUI.cpp"
  1529. #include "CarlaDssiUtils.cpp"
  1530. #include "CarlaPatchbayUtils.cpp"
  1531. #include "CarlaPipeUtils.cpp"
  1532. #include "CarlaStateUtils.cpp"
  1533. #include "CarlaJuceAudioProcessors.cpp"
  1534. // -------------------------------------------------------------------------------------------------------------------