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.

503 lines
14KB

  1. /*
  2. * Carla Backend
  3. * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.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. #ifndef CARLA_BACKEND_UTILS_HPP
  18. #define CARLA_BACKEND_UTILS_HPP
  19. #include "carla_backend.hpp"
  20. #include <QtCore/QString>
  21. CARLA_BACKEND_START_NAMESPACE
  22. class CarlaEngine;
  23. class CarlaPlugin;
  24. static inline
  25. const char* BinaryType2Str(const BinaryType type)
  26. {
  27. switch (type)
  28. {
  29. case BINARY_NONE:
  30. return "BINARY_NONE";
  31. case BINARY_POSIX32:
  32. return "BINARY_POSIX32";
  33. case BINARY_POSIX64:
  34. return "BINARY_POSIX64";
  35. case BINARY_WIN32:
  36. return "BINARY_WIN32";
  37. case BINARY_WIN64:
  38. return "BINARY_WIN64";
  39. case BINARY_OTHER:
  40. return "BINARY_OTHER";
  41. }
  42. qWarning("CarlaBackend::BinaryType2str(%i) - invalid type", type);
  43. return nullptr;
  44. }
  45. static inline
  46. const char* PluginType2Str(const PluginType type)
  47. {
  48. switch (type)
  49. {
  50. case PLUGIN_NONE:
  51. return "PLUGIN_NONE";
  52. case PLUGIN_INTERNAL:
  53. return "PLUGIN_INTERNAL";
  54. case PLUGIN_LADSPA:
  55. return "PLUGIN_LADSPA";
  56. case PLUGIN_DSSI:
  57. return "PLUGIN_DSSI";
  58. case PLUGIN_LV2:
  59. return "PLUGIN_LV2";
  60. case PLUGIN_VST:
  61. return "PLUGIN_VST";
  62. case PLUGIN_GIG:
  63. return "PLUGIN_GIG";
  64. case PLUGIN_SF2:
  65. return "PLUGIN_SF2";
  66. case PLUGIN_SFZ:
  67. return "PLUGIN_SFZ";
  68. }
  69. qWarning("CarlaBackend::PluginType2str(%i) - invalid type", type);
  70. return nullptr;
  71. }
  72. static inline
  73. const char* PluginCategory2Str(const PluginCategory category)
  74. {
  75. switch (category)
  76. {
  77. case PLUGIN_CATEGORY_NONE:
  78. return "PLUGIN_CATEGORY_NONE";
  79. case PLUGIN_CATEGORY_SYNTH:
  80. return "PLUGIN_CATEGORY_SYNTH";
  81. case PLUGIN_CATEGORY_DELAY:
  82. return "PLUGIN_CATEGORY_DELAY";
  83. case PLUGIN_CATEGORY_EQ:
  84. return "PLUGIN_CATEGORY_EQ";
  85. case PLUGIN_CATEGORY_FILTER:
  86. return "PLUGIN_CATEGORY_FILTER";
  87. case PLUGIN_CATEGORY_DYNAMICS:
  88. return "PLUGIN_CATEGORY_DYNAMICS";
  89. case PLUGIN_CATEGORY_MODULATOR:
  90. return "PLUGIN_CATEGORY_MODULATOR";
  91. case PLUGIN_CATEGORY_UTILITY:
  92. return "PLUGIN_CATEGORY_UTILITY";
  93. case PLUGIN_CATEGORY_OTHER:
  94. return "PLUGIN_CATEGORY_OTHER";
  95. }
  96. qWarning("CarlaBackend::PluginCategory2str(%i) - invalid category", category);
  97. return nullptr;
  98. }
  99. static inline
  100. const char* ParameterType2Str(const ParameterType type)
  101. {
  102. switch (type)
  103. {
  104. case PARAMETER_UNKNOWN:
  105. return "PARAMETER_UNKNOWN";
  106. case PARAMETER_INPUT:
  107. return "PARAMETER_INPUT";
  108. case PARAMETER_OUTPUT:
  109. return "PARAMETER_OUTPUT";
  110. case PARAMETER_LATENCY:
  111. return "PARAMETER_LATENCY";
  112. case PARAMETER_SAMPLE_RATE:
  113. return "PARAMETER_SAMPLE_RATE";
  114. case PARAMETER_LV2_FREEWHEEL:
  115. return "PARAMETER_LV2_FREEWHEEL";
  116. case PARAMETER_LV2_TIME:
  117. return "PARAMETER_LV2_TIME";
  118. }
  119. qWarning("CarlaBackend::ParameterType2str(%i) - invalid type", type);
  120. return nullptr;
  121. }
  122. static inline
  123. const char* InternalParametersIndex2Str(const InternalParametersIndex index)
  124. {
  125. switch (index)
  126. {
  127. case PARAMETER_NULL:
  128. return "PARAMETER_NULL";
  129. case PARAMETER_ACTIVE:
  130. return "PARAMETER_ACTIVE";
  131. case PARAMETER_DRYWET:
  132. return "PARAMETER_DRYWET";
  133. case PARAMETER_VOLUME:
  134. return "PARAMETER_VOLUME";
  135. case PARAMETER_BALANCE_LEFT:
  136. return "PARAMETER_BALANCE_LEFT";
  137. case PARAMETER_BALANCE_RIGHT:
  138. return "PARAMETER_BALANCE_RIGHT";
  139. }
  140. qWarning("CarlaBackend::InternalParametersIndex2str(%i) - invalid index", index);
  141. return nullptr;
  142. }
  143. static inline
  144. const char* CustomDataType2Str(const CustomDataType type)
  145. {
  146. switch (type)
  147. {
  148. case CUSTOM_DATA_INVALID:
  149. return "CUSTOM_DATA_INVALID";
  150. case CUSTOM_DATA_STRING:
  151. return "CUSTOM_DATA_STRING";
  152. case CUSTOM_DATA_PATH:
  153. return "CUSTOM_DATA_PATH";
  154. case CUSTOM_DATA_CHUNK:
  155. return "CUSTOM_DATA_CHUNK";
  156. case CUSTOM_DATA_BINARY:
  157. return "CUSTOM_DATA_BINARY";
  158. }
  159. qWarning("CarlaBackend::CustomDataType2str(%i) - invalid type", type);
  160. return nullptr;
  161. }
  162. static inline
  163. const char* GuiType2Str(const GuiType type)
  164. {
  165. switch (type)
  166. {
  167. case GUI_NONE:
  168. return "GUI_NONE";
  169. case GUI_INTERNAL_QT4:
  170. return "GUI_INTERNAL_QT4";
  171. case GUI_INTERNAL_COCOA:
  172. return "GUI_INTERNAL_COCOA";
  173. case GUI_INTERNAL_HWND:
  174. return "GUI_INTERNAL_HWND";
  175. case GUI_INTERNAL_X11:
  176. return "GUI_INTERNAL_X11";
  177. case GUI_EXTERNAL_LV2:
  178. return "GUI_EXTERNAL_LV2";
  179. case GUI_EXTERNAL_SUIL:
  180. return "GUI_EXTERNAL_SUIL";
  181. case GUI_EXTERNAL_OSC:
  182. return "GUI_EXTERNAL_OSC";
  183. }
  184. qWarning("CarlaBackend::GuiType2str(%i) - invalid type", type);
  185. return nullptr;
  186. }
  187. static inline
  188. const char* OptionsType2Str(const OptionsType type)
  189. {
  190. switch (type)
  191. {
  192. case OPTION_PROCESS_NAME:
  193. return "OPTION_PROCESS_NAME";
  194. case OPTION_PROCESS_MODE:
  195. return "OPTION_PROCESS_MODE";
  196. case OPTION_PROCESS_HIGH_PRECISION:
  197. return "OPTION_PROCESS_HIGH_PRECISION";
  198. case OPTION_MAX_PARAMETERS:
  199. return "OPTION_MAX_PARAMETERS";
  200. case OPTION_PREFERRED_BUFFER_SIZE:
  201. return "OPTION_PREFERRED_BUFFER_SIZE";
  202. case OPTION_PREFERRED_SAMPLE_RATE:
  203. return "OPTION_PREFERRED_SAMPLE_RATE";
  204. case OPTION_FORCE_STEREO:
  205. return "OPTION_FORCE_STEREO";
  206. case OPTION_USE_DSSI_VST_CHUNKS:
  207. return "OPTION_USE_DSSI_VST_CHUNKS";
  208. case OPTION_PREFER_PLUGIN_BRIDGES:
  209. return "OPTION_PREFER_PLUGIN_BRIDGES";
  210. case OPTION_PREFER_UI_BRIDGES:
  211. return "OPTION_PREFER_UI_BRIDGES";
  212. case OPTION_OSC_UI_TIMEOUT:
  213. return "OPTION_OSC_UI_TIMEOUT";
  214. case OPTION_PATH_LADSPA:
  215. return "OPTION_PATH_LADSPA";
  216. case OPTION_PATH_DSSI:
  217. return "OPTION_PATH_DSSI";
  218. case OPTION_PATH_LV2:
  219. return "OPTION_PATH_LV2";
  220. case OPTION_PATH_VST:
  221. return "OPTION_PATH_VST";
  222. case OPTION_PATH_GIG:
  223. return "OPTION_PATH_GIG";
  224. case OPTION_PATH_SF2:
  225. return "OPTION_PATH_SF2";
  226. case OPTION_PATH_SFZ:
  227. return "OPTION_PATH_SFZ";
  228. case OPTION_PATH_BRIDGE_POSIX32:
  229. return "OPTION_PATH_BRIDGE_POSIX32";
  230. case OPTION_PATH_BRIDGE_POSIX64:
  231. return "OPTION_PATH_BRIDGE_POSIX64";
  232. case OPTION_PATH_BRIDGE_WIN32:
  233. return "OPTION_PATH_BRIDGE_WIN32";
  234. case OPTION_PATH_BRIDGE_WIN64:
  235. return "OPTION_PATH_BRIDGE_WIN64";
  236. case OPTION_PATH_BRIDGE_LV2_GTK2:
  237. return "OPTION_PATH_BRIDGE_LV2_GTK2";
  238. case OPTION_PATH_BRIDGE_LV2_GTK3:
  239. return "OPTION_PATH_BRIDGE_LV2_GTK3";
  240. case OPTION_PATH_BRIDGE_LV2_QT4:
  241. return "OPTION_PATH_BRIDGE_LV2_QT4";
  242. case OPTION_PATH_BRIDGE_LV2_X11:
  243. return "OPTION_PATH_BRIDGE_LV2_X11";
  244. case OPTION_PATH_BRIDGE_VST_HWND:
  245. return "OPTION_PATH_BRIDGE_VST_HWND";
  246. case OPTION_PATH_BRIDGE_VST_X11:
  247. return "OPTION_PATH_BRIDGE_VST_X11";
  248. }
  249. qWarning("CarlaBackend::OptionsType2str(%i) - invalid type", type);
  250. return nullptr;
  251. }
  252. static inline
  253. const char* CallbackType2Str(const CallbackType type)
  254. {
  255. switch (type)
  256. {
  257. case CALLBACK_DEBUG:
  258. return "CALLBACK_DEBUG";
  259. case CALLBACK_PARAMETER_VALUE_CHANGED:
  260. return "CALLBACK_PARAMETER_VALUE_CHANGED";
  261. case CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED:
  262. return "CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED";
  263. case CALLBACK_PARAMETER_MIDI_CC_CHANGED:
  264. return "CALLBACK_PARAMETER_MIDI_CC_CHANGED";
  265. case CALLBACK_PROGRAM_CHANGED:
  266. return "CALLBACK_PROGRAM_CHANGED";
  267. case CALLBACK_MIDI_PROGRAM_CHANGED:
  268. return "CALLBACK_MIDI_PROGRAM_CHANGED";
  269. case CALLBACK_NOTE_ON:
  270. return "CALLBACK_NOTE_ON";
  271. case CALLBACK_NOTE_OFF:
  272. return "CALLBACK_NOTE_OFF";
  273. case CALLBACK_SHOW_GUI:
  274. return "CALLBACK_SHOW_GUI";
  275. case CALLBACK_RESIZE_GUI:
  276. return "CALLBACK_RESIZE_GUI";
  277. case CALLBACK_UPDATE:
  278. return "CALLBACK_UPDATE";
  279. case CALLBACK_RELOAD_INFO:
  280. return "CALLBACK_RELOAD_INFO";
  281. case CALLBACK_RELOAD_PARAMETERS:
  282. return "CALLBACK_RELOAD_PARAMETERS";
  283. case CALLBACK_RELOAD_PROGRAMS:
  284. return "CALLBACK_RELOAD_PROGRAMS";
  285. case CALLBACK_RELOAD_ALL:
  286. return "CALLBACK_RELOAD_ALL";
  287. case CALLBACK_NSM_ANNOUNCE:
  288. return "CALLBACK_NSM_ANNOUNCE";
  289. case CALLBACK_NSM_OPEN1:
  290. return "CALLBACK_NSM_OPEN1";
  291. case CALLBACK_NSM_OPEN2:
  292. return "CALLBACK_NSM_OPEN2";
  293. case CALLBACK_NSM_SAVE:
  294. return "CALLBACK_NSM_SAVE";
  295. case CALLBACK_ERROR:
  296. return "CALLBACK_ERROR";
  297. case CALLBACK_QUIT:
  298. return "CALLBACK_QUIT";
  299. }
  300. qWarning("CarlaBackend::CallbackType2str(%i) - invalid type", type);
  301. return nullptr;
  302. }
  303. static inline
  304. const char* ProcessModeType2Str(const ProcessModeType type)
  305. {
  306. switch (type)
  307. {
  308. case PROCESS_MODE_SINGLE_CLIENT:
  309. return "PROCESS_MODE_SINGLE_CLIENT";
  310. case PROCESS_MODE_MULTIPLE_CLIENTS:
  311. return "PROCESS_MODE_MULTIPLE_CLIENTS";
  312. case PROCESS_MODE_CONTINUOUS_RACK:
  313. return "PROCESS_MODE_CONTINUOUS_RACK";
  314. }
  315. qWarning("CarlaBackend::ProcessModeType2str(%i) - invalid type", type);
  316. return nullptr;
  317. }
  318. // -------------------------------------------------------------------------------------------------------------------
  319. static inline
  320. CustomDataType getCustomDataStringType(const char* const stype)
  321. {
  322. qDebug("CarlaBackend::getCustomDataStringType(\"%s\")", stype);
  323. if (strcmp(stype, "string") == 0)
  324. return CUSTOM_DATA_STRING;
  325. if (strcmp(stype, "path") == 0)
  326. return CUSTOM_DATA_PATH;
  327. if (strcmp(stype, "chunk") == 0)
  328. return CUSTOM_DATA_CHUNK;
  329. if (strcmp(stype, "binary") == 0)
  330. return CUSTOM_DATA_BINARY;
  331. return CUSTOM_DATA_INVALID;
  332. }
  333. static inline
  334. const char* getCustomDataTypeString(const CustomDataType type)
  335. {
  336. qDebug("CarlaBackend::getCustomDataTypeString(%s)", CustomDataType2Str(type));
  337. switch (type)
  338. {
  339. case CUSTOM_DATA_STRING:
  340. return "string";
  341. case CUSTOM_DATA_PATH:
  342. return "path";
  343. case CUSTOM_DATA_CHUNK:
  344. return "chunk";
  345. case CUSTOM_DATA_BINARY:
  346. return "binary";
  347. default:
  348. return "invalid";
  349. }
  350. }
  351. static inline
  352. const char* getPluginTypeString(const PluginType type)
  353. {
  354. qDebug("CarlaBackend::getPluginTypeString(%s)", PluginType2Str(type));
  355. switch (type)
  356. {
  357. case PLUGIN_NONE:
  358. return "NONE";
  359. case PLUGIN_INTERNAL:
  360. return "INTERNAL";
  361. case PLUGIN_LADSPA:
  362. return "LADSPA";
  363. case PLUGIN_DSSI:
  364. return "DSSI";
  365. case PLUGIN_LV2:
  366. return "LV2";
  367. case PLUGIN_VST:
  368. return "VST";
  369. case PLUGIN_GIG:
  370. return "GIG";
  371. case PLUGIN_SF2:
  372. return "SF2";
  373. case PLUGIN_SFZ:
  374. return "SFZ";
  375. }
  376. return "NONE";
  377. }
  378. // -------------------------------------------------------------------------------------------------------------------
  379. static inline
  380. void* getPointer(const uintptr_t addr)
  381. {
  382. CARLA_ASSERT(addr != 0);
  383. qDebug("CarlaBackend::getPointer(" P_UINTPTR ")", addr);
  384. uintptr_t* const ptr = (uintptr_t*)addr;
  385. return (void*)ptr;
  386. }
  387. static inline
  388. PluginCategory getPluginCategoryFromName(const char* const name)
  389. {
  390. CARLA_ASSERT(name);
  391. qDebug("CarlaBackend::getPluginCategoryFromName(\"%s\")", name);
  392. QString qname(name);
  393. if (qname.isEmpty())
  394. return PLUGIN_CATEGORY_NONE;
  395. qname = qname.toLower();
  396. // generic tags first
  397. if (qname.contains("delay", Qt::CaseSensitive))
  398. return PLUGIN_CATEGORY_DELAY;
  399. if (qname.contains("reverb", Qt::CaseSensitive))
  400. return PLUGIN_CATEGORY_DELAY;
  401. // filter
  402. if (qname.contains("filter", Qt::CaseSensitive))
  403. return PLUGIN_CATEGORY_FILTER;
  404. // dynamics
  405. if (qname.contains("dynamics", Qt::CaseSensitive))
  406. return PLUGIN_CATEGORY_DYNAMICS;
  407. if (qname.contains("amplifier", Qt::CaseSensitive))
  408. return PLUGIN_CATEGORY_DYNAMICS;
  409. if (qname.contains("compressor", Qt::CaseSensitive))
  410. return PLUGIN_CATEGORY_DYNAMICS;
  411. if (qname.contains("enhancer", Qt::CaseSensitive))
  412. return PLUGIN_CATEGORY_DYNAMICS;
  413. if (qname.contains("exciter", Qt::CaseSensitive))
  414. return PLUGIN_CATEGORY_DYNAMICS;
  415. if (qname.contains("gate", Qt::CaseSensitive))
  416. return PLUGIN_CATEGORY_DYNAMICS;
  417. if (qname.contains("limiter", Qt::CaseSensitive))
  418. return PLUGIN_CATEGORY_DYNAMICS;
  419. // modulator
  420. if (qname.contains("modulator", Qt::CaseSensitive))
  421. return PLUGIN_CATEGORY_MODULATOR;
  422. if (qname.contains("chorus", Qt::CaseSensitive))
  423. return PLUGIN_CATEGORY_MODULATOR;
  424. if (qname.contains("flanger", Qt::CaseSensitive))
  425. return PLUGIN_CATEGORY_MODULATOR;
  426. if (qname.contains("phaser", Qt::CaseSensitive))
  427. return PLUGIN_CATEGORY_MODULATOR;
  428. if (qname.contains("saturator", Qt::CaseSensitive))
  429. return PLUGIN_CATEGORY_MODULATOR;
  430. // unitily
  431. if (qname.contains("utility", Qt::CaseSensitive))
  432. return PLUGIN_CATEGORY_UTILITY;
  433. if (qname.contains("analyzer", Qt::CaseSensitive))
  434. return PLUGIN_CATEGORY_UTILITY;
  435. if (qname.contains("converter", Qt::CaseSensitive))
  436. return PLUGIN_CATEGORY_UTILITY;
  437. if (qname.contains("deesser", Qt::CaseSensitive))
  438. return PLUGIN_CATEGORY_UTILITY;
  439. if (qname.contains("mixer", Qt::CaseSensitive))
  440. return PLUGIN_CATEGORY_UTILITY;
  441. // common tags
  442. if (qname.contains("verb", Qt::CaseSensitive))
  443. return PLUGIN_CATEGORY_DELAY;
  444. if (qname.contains("eq", Qt::CaseSensitive))
  445. return PLUGIN_CATEGORY_EQ;
  446. if (qname.contains("tool", Qt::CaseSensitive))
  447. return PLUGIN_CATEGORY_UTILITY;
  448. return PLUGIN_CATEGORY_NONE;
  449. }
  450. CARLA_BACKEND_END_NAMESPACE
  451. #endif // CARLA_BACKEND_UTILS_HPP