Collection of tools useful for audio production
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.

595 lines
17KB

  1. /*
  2. * Carla Backend
  3. * Copyright (C) 2011-2012 Filipe Coelho <falktx@gmail.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * 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 COPYING file
  16. */
  17. #include "carla_shared.h"
  18. #include <QtCore/QString>
  19. CARLA_BACKEND_START_NAMESPACE
  20. #if 0
  21. } /* adjust editor indent */
  22. #endif
  23. static const char* carlaLastError = nullptr;
  24. #ifndef BUILD_BRIDGE
  25. // Global options
  26. carla_options_t carlaOptions;
  27. #endif
  28. // -------------------------------------------------------------------------------------------------------------------
  29. const char* BinaryType2str(const BinaryType type)
  30. {
  31. switch (type)
  32. {
  33. case BINARY_NONE:
  34. return "BINARY_NONE";
  35. case BINARY_UNIX32:
  36. return "BINARY_UNIX32";
  37. case BINARY_UNIX64:
  38. return "BINARY_UNIX64";
  39. case BINARY_WIN32:
  40. return "BINARY_WIN32";
  41. case BINARY_WIN64:
  42. return "BINARY_WIN64";
  43. }
  44. qWarning("CarlaBackend::BinaryType2str(%i) - invalid type", type);
  45. return nullptr;
  46. }
  47. const char* PluginType2str(const PluginType type)
  48. {
  49. switch (type)
  50. {
  51. case PLUGIN_NONE:
  52. return "PLUGIN_NONE";
  53. case PLUGIN_LADSPA:
  54. return "PLUGIN_LADSPA";
  55. case PLUGIN_DSSI:
  56. return "PLUGIN_DSSI";
  57. case PLUGIN_LV2:
  58. return "PLUGIN_LV2";
  59. case PLUGIN_VST:
  60. return "PLUGIN_VST";
  61. case PLUGIN_GIG:
  62. return "PLUGIN_GIG";
  63. case PLUGIN_SF2:
  64. return "PLUGIN_SF2";
  65. case PLUGIN_SFZ:
  66. return "PLUGIN_SFZ";
  67. }
  68. qWarning("CarlaBackend::PluginType2str(%i) - invalid type", type);
  69. return nullptr;
  70. }
  71. const char* PluginCategory2str(const PluginCategory category)
  72. {
  73. switch (category)
  74. {
  75. case PLUGIN_CATEGORY_NONE:
  76. return "PLUGIN_CATEGORY_NONE";
  77. case PLUGIN_CATEGORY_SYNTH:
  78. return "PLUGIN_CATEGORY_SYNTH";
  79. case PLUGIN_CATEGORY_DELAY:
  80. return "PLUGIN_CATEGORY_DELAY";
  81. case PLUGIN_CATEGORY_EQ:
  82. return "PLUGIN_CATEGORY_EQ";
  83. case PLUGIN_CATEGORY_FILTER:
  84. return "PLUGIN_CATEGORY_FILTER";
  85. case PLUGIN_CATEGORY_DYNAMICS:
  86. return "PLUGIN_CATEGORY_DYNAMICS";
  87. case PLUGIN_CATEGORY_MODULATOR:
  88. return "PLUGIN_CATEGORY_MODULATOR";
  89. case PLUGIN_CATEGORY_UTILITY:
  90. return "PLUGIN_CATEGORY_UTILITY";
  91. case PLUGIN_CATEGORY_OTHER:
  92. return "PLUGIN_CATEGORY_OTHER";
  93. }
  94. qWarning("CarlaBackend::PluginCategory2str(%i) - invalid category", category);
  95. return nullptr;
  96. }
  97. const char* ParameterType2str(const ParameterType type)
  98. {
  99. switch (type)
  100. {
  101. case PARAMETER_UNKNOWN:
  102. return "PARAMETER_UNKNOWN";
  103. case PARAMETER_INPUT:
  104. return "PARAMETER_INPUT";
  105. case PARAMETER_OUTPUT:
  106. return "PARAMETER_OUTPUT";
  107. case PARAMETER_LATENCY:
  108. return "PARAMETER_LATENCY";
  109. }
  110. qWarning("CarlaBackend::ParameterType2str(%i) - invalid type", type);
  111. return nullptr;
  112. }
  113. const char* InternalParametersIndex2str(const InternalParametersIndex index)
  114. {
  115. switch (index)
  116. {
  117. case PARAMETER_ACTIVE:
  118. return "PARAMETER_ACTIVE";
  119. case PARAMETER_DRYWET:
  120. return "PARAMETER_DRYWET";
  121. case PARAMETER_VOLUME:
  122. return "PARAMETER_VOLUME";
  123. case PARAMETER_BALANCE_LEFT:
  124. return "PARAMETER_BALANCE_LEFT";
  125. case PARAMETER_BALANCE_RIGHT:
  126. return "PARAMETER_BALANCE_RIGHT";
  127. }
  128. qWarning("CarlaBackend::InternalParametersIndex2str(%i) - invalid index", index);
  129. return nullptr;
  130. }
  131. const char* CustomDataType2str(const CustomDataType type)
  132. {
  133. switch (type)
  134. {
  135. case CUSTOM_DATA_INVALID:
  136. return "CUSTOM_DATA_INVALID";
  137. case CUSTOM_DATA_STRING:
  138. return "CUSTOM_DATA_STRING";
  139. case CUSTOM_DATA_PATH:
  140. return "CUSTOM_DATA_PATH";
  141. case CUSTOM_DATA_CHUNK:
  142. return "CUSTOM_DATA_CHUNK";
  143. case CUSTOM_DATA_BINARY:
  144. return "CUSTOM_DATA_BINARY";
  145. }
  146. qWarning("CarlaBackend::CustomDataType2str(%i) - invalid type", type);
  147. return nullptr;
  148. }
  149. const char* GuiType2str(const GuiType type)
  150. {
  151. switch (type)
  152. {
  153. case GUI_NONE:
  154. return "GUI_NONE";
  155. case GUI_INTERNAL_QT4:
  156. return "GUI_INTERNAL_QT4";
  157. case GUI_INTERNAL_COCOA:
  158. return "GUI_INTERNAL_COCOA";
  159. case GUI_INTERNAL_HWND:
  160. return "GUI_INTERNAL_HWND";
  161. case GUI_INTERNAL_X11:
  162. return "GUI_INTERNAL_X11";
  163. case GUI_EXTERNAL_LV2:
  164. return "GUI_EXTERNAL_LV2";
  165. case GUI_EXTERNAL_SUIL:
  166. return "GUI_EXTERNAL_SUIL";
  167. case GUI_EXTERNAL_OSC:
  168. return "GUI_EXTERNAL_OSC";
  169. }
  170. qWarning("CarlaBackend::GuiType2str(%i) - invalid type", type);
  171. return nullptr;
  172. }
  173. const char* OptionsType2str(const OptionsType type)
  174. {
  175. switch (type)
  176. {
  177. case OPTION_PROCESS_MODE:
  178. return "OPTION_PROCESS_MODE";
  179. case OPTION_MAX_PARAMETERS:
  180. return "OPTION_MAX_PARAMETERS";
  181. case OPTION_PREFER_UI_BRIDGES:
  182. return "OPTION_PREFER_UI_BRIDGES";
  183. case OPTION_FORCE_STEREO:
  184. return "OPTION_FORCE_STEREO";
  185. case OPTION_PROCESS_HIGH_PRECISION:
  186. return "OPTION_PROCESS_HIGH_PRECISION";
  187. case OPTION_OSC_GUI_TIMEOUT:
  188. return "OPTION_OSC_GUI_TIMEOUT";
  189. case OPTION_USE_DSSI_CHUNKS:
  190. return "OPTION_USE_DSSI_CHUNKS";
  191. case OPTION_PATH_LADSPA:
  192. return "OPTION_PATH_LADSPA";
  193. case OPTION_PATH_DSSI:
  194. return "OPTION_PATH_DSSI";
  195. case OPTION_PATH_LV2:
  196. return "OPTION_PATH_LV2";
  197. case OPTION_PATH_VST:
  198. return "OPTION_PATH_VST";
  199. case OPTION_PATH_GIG:
  200. return "OPTION_PATH_GIG";
  201. case OPTION_PATH_SF2:
  202. return "OPTION_PATH_SF2";
  203. case OPTION_PATH_SFZ:
  204. return "OPTION_PATH_SFZ";
  205. case OPTION_PATH_BRIDGE_UNIX32:
  206. return "OPTION_PATH_BRIDGE_UNIX32";
  207. case OPTION_PATH_BRIDGE_UNIX64:
  208. return "OPTION_PATH_BRIDGE_UNIX64";
  209. case OPTION_PATH_BRIDGE_WIN32:
  210. return "OPTION_PATH_BRIDGE_WIN32";
  211. case OPTION_PATH_BRIDGE_WIN64:
  212. return "OPTION_PATH_BRIDGE_WIN64";
  213. case OPTION_PATH_BRIDGE_LV2_GTK2:
  214. return "OPTION_PATH_BRIDGE_LV2_GTK2";
  215. case OPTION_PATH_BRIDGE_LV2_QT4:
  216. return "OPTION_PATH_BRIDGE_LV2_QT4";
  217. case OPTION_PATH_BRIDGE_LV2_X11:
  218. return "OPTION_PATH_BRIDGE_LV2_X11";
  219. case OPTION_PATH_BRIDGE_VST_X11:
  220. return "OPTION_PATH_BRIDGE_VST_X11";
  221. }
  222. qWarning("CarlaBackend::OptionsType2str(%i) - invalid type", type);
  223. return nullptr;
  224. }
  225. const char* CallbackType2str(const CallbackType type)
  226. {
  227. switch (type)
  228. {
  229. case CALLBACK_DEBUG:
  230. return "CALLBACK_DEBUG";
  231. case CALLBACK_PARAMETER_VALUE_CHANGED:
  232. return "CALLBACK_PARAMETER_VALUE_CHANGED";
  233. case CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED:
  234. return "CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED";
  235. case CALLBACK_PARAMETER_MIDI_CC_CHANGED:
  236. return "CALLBACK_PARAMETER_MIDI_CC_CHANGED";
  237. case CALLBACK_PROGRAM_CHANGED:
  238. return "CALLBACK_PROGRAM_CHANGED";
  239. case CALLBACK_MIDI_PROGRAM_CHANGED:
  240. return "CALLBACK_MIDI_PROGRAM_CHANGED";
  241. case CALLBACK_NOTE_ON:
  242. return "CALLBACK_NOTE_ON";
  243. case CALLBACK_NOTE_OFF:
  244. return "CALLBACK_NOTE_OFF";
  245. case CALLBACK_SHOW_GUI:
  246. return "CALLBACK_SHOW_GUI";
  247. case CALLBACK_RESIZE_GUI:
  248. return "CALLBACK_RESIZE_GUI";
  249. case CALLBACK_UPDATE:
  250. return "CALLBACK_UPDATE";
  251. case CALLBACK_RELOAD_INFO:
  252. return "CALLBACK_RELOAD_INFO";
  253. case CALLBACK_RELOAD_PARAMETERS:
  254. return "CALLBACK_RELOAD_PARAMETERS";
  255. case CALLBACK_RELOAD_PROGRAMS:
  256. return "CALLBACK_RELOAD_PROGRAMS";
  257. case CALLBACK_RELOAD_ALL:
  258. return "CALLBACK_RELOAD_ALL";
  259. case CALLBACK_QUIT:
  260. return "CALLBACK_QUIT";
  261. }
  262. qWarning("CarlaBackend::CallbackType2str(%i) - invalid type", type);
  263. return nullptr;
  264. }
  265. const char* ProcessModeType2str(const ProcessModeType type)
  266. {
  267. switch (type)
  268. {
  269. case PROCESS_MODE_SINGLE_CLIENT:
  270. return "PROCESS_MODE_SINGLE_CLIENT";
  271. case PROCESS_MODE_MULTIPLE_CLIENTS:
  272. return "PROCESS_MODE_MULTIPLE_CLIENTS";
  273. case PROCESS_MODE_CONTINUOUS_RACK:
  274. return "PROCESS_MODE_CONTINUOUS_RACK";
  275. }
  276. qWarning("CarlaBackend::ProcessModeType2str(%i) - invalid type", type);
  277. return nullptr;
  278. }
  279. // -------------------------------------------------------------------------------------------------------------------
  280. CustomDataType getCustomDataStringType(const char* const stype)
  281. {
  282. qDebug("CarlaBackend::getCustomDataStringType(\"%s\")", stype);
  283. if (strcmp(stype, "string") == 0)
  284. return CUSTOM_DATA_STRING;
  285. if (strcmp(stype, "path") == 0)
  286. return CUSTOM_DATA_PATH;
  287. if (strcmp(stype, "chunk") == 0)
  288. return CUSTOM_DATA_CHUNK;
  289. if (strcmp(stype, "binary") == 0)
  290. return CUSTOM_DATA_BINARY;
  291. return CUSTOM_DATA_INVALID;
  292. }
  293. const char* getCustomDataTypeString(const CustomDataType type)
  294. {
  295. qDebug("CarlaBackend::getCustomDataTypeString(%s)", CustomDataType2str(type));
  296. switch (type)
  297. {
  298. case CUSTOM_DATA_STRING:
  299. return "string";
  300. case CUSTOM_DATA_PATH:
  301. return "path";
  302. case CUSTOM_DATA_CHUNK:
  303. return "chunk";
  304. case CUSTOM_DATA_BINARY:
  305. return "binary";
  306. default:
  307. return "invalid";
  308. }
  309. }
  310. const char* getBinaryBidgePath(const BinaryType type)
  311. {
  312. qDebug("CarlaBackend::getBinaryBidgePath(%s)", BinaryType2str(type));
  313. switch (type)
  314. {
  315. #ifndef BUILD_BRIDGE
  316. case BINARY_UNIX32:
  317. return carlaOptions.bridge_unix32;
  318. case BINARY_UNIX64:
  319. return carlaOptions.bridge_unix64;
  320. case BINARY_WIN32:
  321. return carlaOptions.bridge_win32;
  322. case BINARY_WIN64:
  323. return carlaOptions.bridge_win64;
  324. #endif
  325. default:
  326. return nullptr;
  327. }
  328. }
  329. // -------------------------------------------------------------------------------------------------------------------
  330. void* getPointer(const quintptr addr)
  331. {
  332. Q_ASSERT(addr != 0);
  333. qDebug("CarlaBackend::getPointer(" P_UINTPTR ")", addr);
  334. quintptr* const ptr = (quintptr*)addr;
  335. return (void*)ptr;
  336. }
  337. PluginCategory getPluginCategoryFromName(const char* const name)
  338. {
  339. Q_ASSERT(name);
  340. qDebug("CarlaBackend::getPluginCategoryFromName(\"%s\")", name);
  341. QString qname(name);
  342. if (qname.isEmpty())
  343. return PLUGIN_CATEGORY_NONE;
  344. qname = qname.toLower();
  345. // generic tags first
  346. if (qname.contains("delay", Qt::CaseSensitive))
  347. return PLUGIN_CATEGORY_DELAY;
  348. if (qname.contains("reverb", Qt::CaseSensitive))
  349. return PLUGIN_CATEGORY_DELAY;
  350. // filter
  351. if (qname.contains("filter", Qt::CaseSensitive))
  352. return PLUGIN_CATEGORY_FILTER;
  353. // dynamics
  354. if (qname.contains("dynamics", Qt::CaseSensitive))
  355. return PLUGIN_CATEGORY_DYNAMICS;
  356. if (qname.contains("amplifier", Qt::CaseSensitive))
  357. return PLUGIN_CATEGORY_DYNAMICS;
  358. if (qname.contains("compressor", Qt::CaseSensitive))
  359. return PLUGIN_CATEGORY_DYNAMICS;
  360. if (qname.contains("enhancer", Qt::CaseSensitive))
  361. return PLUGIN_CATEGORY_DYNAMICS;
  362. if (qname.contains("exciter", Qt::CaseSensitive))
  363. return PLUGIN_CATEGORY_DYNAMICS;
  364. if (qname.contains("gate", Qt::CaseSensitive))
  365. return PLUGIN_CATEGORY_DYNAMICS;
  366. if (qname.contains("limiter", Qt::CaseSensitive))
  367. return PLUGIN_CATEGORY_DYNAMICS;
  368. // modulator
  369. if (qname.contains("modulator", Qt::CaseSensitive))
  370. return PLUGIN_CATEGORY_MODULATOR;
  371. if (qname.contains("chorus", Qt::CaseSensitive))
  372. return PLUGIN_CATEGORY_MODULATOR;
  373. if (qname.contains("flanger", Qt::CaseSensitive))
  374. return PLUGIN_CATEGORY_MODULATOR;
  375. if (qname.contains("phaser", Qt::CaseSensitive))
  376. return PLUGIN_CATEGORY_MODULATOR;
  377. if (qname.contains("saturator", Qt::CaseSensitive))
  378. return PLUGIN_CATEGORY_MODULATOR;
  379. // unitily
  380. if (qname.contains("utility", Qt::CaseSensitive))
  381. return PLUGIN_CATEGORY_UTILITY;
  382. if (qname.contains("analyzer", Qt::CaseSensitive))
  383. return PLUGIN_CATEGORY_UTILITY;
  384. if (qname.contains("converter", Qt::CaseSensitive))
  385. return PLUGIN_CATEGORY_UTILITY;
  386. if (qname.contains("deesser", Qt::CaseSensitive))
  387. return PLUGIN_CATEGORY_UTILITY;
  388. if (qname.contains("mixer", Qt::CaseSensitive))
  389. return PLUGIN_CATEGORY_UTILITY;
  390. // common tags
  391. if (qname.contains("verb", Qt::CaseSensitive))
  392. return PLUGIN_CATEGORY_DELAY;
  393. if (qname.contains("eq", Qt::CaseSensitive))
  394. return PLUGIN_CATEGORY_EQ;
  395. if (qname.contains("tool", Qt::CaseSensitive))
  396. return PLUGIN_CATEGORY_UTILITY;
  397. return PLUGIN_CATEGORY_NONE;
  398. }
  399. // -------------------------------------------------------------------------------------------------------------------
  400. const char* getLastError()
  401. {
  402. qDebug("CarlaBackend::getLastError()");
  403. return carlaLastError;
  404. }
  405. void setLastError(const char* const error)
  406. {
  407. qDebug("CarlaBackend::setLastError(\"%s\")", error);
  408. if (carlaLastError)
  409. free((void*)carlaLastError);
  410. carlaLastError = error ? strdup(error) : nullptr;
  411. }
  412. // -------------------------------------------------------------------------------------------------------------------
  413. #ifndef BUILD_BRIDGE
  414. void setOption(const OptionsType option, const int value, const char* const valueStr)
  415. {
  416. qDebug("CarlaBackend::setOption(%s, %i, \"%s\")", OptionsType2str(option), value, valueStr);
  417. switch (option)
  418. {
  419. case OPTION_PROCESS_MODE:
  420. if (value < PROCESS_MODE_SINGLE_CLIENT || value > PROCESS_MODE_CONTINUOUS_RACK)
  421. return qCritical("CarlaBackend::setOption(%s, %i, \"%s\") - invalid value", OptionsType2str(option), value, valueStr);
  422. carlaOptions.process_mode = (ProcessModeType)value;
  423. break;
  424. case OPTION_MAX_PARAMETERS:
  425. carlaOptions.max_parameters = (value > 0) ? value : MAX_PARAMETERS;
  426. break;
  427. case OPTION_PREFER_UI_BRIDGES:
  428. carlaOptions.prefer_ui_bridges = value;
  429. break;
  430. case OPTION_FORCE_STEREO:
  431. carlaOptions.force_stereo = value;
  432. break;
  433. case OPTION_PROCESS_HIGH_PRECISION:
  434. carlaOptions.proccess_hp = value;
  435. break;
  436. case OPTION_OSC_GUI_TIMEOUT:
  437. carlaOptions.osc_gui_timeout = value/100;
  438. break;
  439. case OPTION_USE_DSSI_CHUNKS:
  440. carlaOptions.use_dssi_chunks = value;
  441. break;
  442. case OPTION_PATH_LADSPA:
  443. carla_setenv("LADSPA_PATH", valueStr);
  444. break;
  445. case OPTION_PATH_DSSI:
  446. carla_setenv("DSSI_PATH", valueStr);
  447. break;
  448. case OPTION_PATH_LV2:
  449. carla_setenv("LV2_PATH", valueStr);
  450. break;
  451. case OPTION_PATH_VST:
  452. carla_setenv("VST_PATH", valueStr);
  453. break;
  454. case OPTION_PATH_GIG:
  455. carla_setenv("GIG_PATH", valueStr);
  456. break;
  457. case OPTION_PATH_SF2:
  458. carla_setenv("SF2_PATH", valueStr);
  459. break;
  460. case OPTION_PATH_SFZ:
  461. carla_setenv("SFZ_PATH", valueStr);
  462. break;
  463. case OPTION_PATH_BRIDGE_UNIX32:
  464. carlaOptions.bridge_unix32 = strdup(valueStr);
  465. break;
  466. case OPTION_PATH_BRIDGE_UNIX64:
  467. carlaOptions.bridge_unix64 = strdup(valueStr);
  468. break;
  469. case OPTION_PATH_BRIDGE_WIN32:
  470. carlaOptions.bridge_win32 = strdup(valueStr);
  471. break;
  472. case OPTION_PATH_BRIDGE_WIN64:
  473. carlaOptions.bridge_win64 = strdup(valueStr);
  474. break;
  475. case OPTION_PATH_BRIDGE_LV2_GTK2:
  476. carlaOptions.bridge_lv2gtk2 = strdup(valueStr);
  477. break;
  478. case OPTION_PATH_BRIDGE_LV2_QT4:
  479. carlaOptions.bridge_lv2qt4 = strdup(valueStr);
  480. break;
  481. case OPTION_PATH_BRIDGE_LV2_X11:
  482. carlaOptions.bridge_lv2x11 = strdup(valueStr);
  483. break;
  484. case OPTION_PATH_BRIDGE_VST_X11:
  485. carlaOptions.bridge_vstx11 = strdup(valueStr);
  486. break;
  487. }
  488. }
  489. void resetOptions()
  490. {
  491. qDebug("CarlaBackend::resetOptions()");
  492. if (carlaOptions.bridge_unix32)
  493. free((void*)carlaOptions.bridge_unix32);
  494. if (carlaOptions.bridge_unix64)
  495. free((void*)carlaOptions.bridge_unix64);
  496. if (carlaOptions.bridge_win32)
  497. free((void*)carlaOptions.bridge_win32);
  498. if (carlaOptions.bridge_win64)
  499. free((void*)carlaOptions.bridge_win64);
  500. if (carlaOptions.bridge_lv2gtk2)
  501. free((void*)carlaOptions.bridge_lv2gtk2);
  502. if (carlaOptions.bridge_lv2qt4)
  503. free((void*)carlaOptions.bridge_lv2qt4);
  504. if (carlaOptions.bridge_lv2x11)
  505. free((void*)carlaOptions.bridge_lv2x11);
  506. if (carlaOptions.bridge_vstx11)
  507. free((void*)carlaOptions.bridge_vstx11);
  508. carlaOptions.process_mode = PROCESS_MODE_MULTIPLE_CLIENTS;
  509. carlaOptions.max_parameters = MAX_PARAMETERS;
  510. carlaOptions.prefer_ui_bridges = true;
  511. carlaOptions.proccess_hp = false;
  512. carlaOptions.osc_gui_timeout = 4000/100;
  513. carlaOptions.use_dssi_chunks = false;
  514. carlaOptions.bridge_unix32 = nullptr;
  515. carlaOptions.bridge_unix64 = nullptr;
  516. carlaOptions.bridge_win32 = nullptr;
  517. carlaOptions.bridge_win64 = nullptr;
  518. carlaOptions.bridge_lv2gtk2 = nullptr;
  519. carlaOptions.bridge_lv2qt4 = nullptr;
  520. carlaOptions.bridge_lv2x11 = nullptr;
  521. carlaOptions.bridge_vstx11 = nullptr;
  522. }
  523. #endif // BUILD_BRIDGE
  524. CARLA_BACKEND_END_NAMESPACE