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.

425 lines
14KB

  1. /*
  2. * Carla Tests
  3. * Copyright (C) 2013 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #undef NDEBUG
  18. #define DEBUG
  19. // includes (part1)
  20. #include "CarlaDefines.hpp"
  21. #include "CarlaMIDI.h"
  22. // Carla common utils
  23. #include "CarlaUtils.hpp"
  24. // Carla misc utils imported from Juce source code
  25. #include "CarlaJuceUtils.hpp"
  26. // includes (part2)
  27. #include "ladspa_rdf.hpp"
  28. #include "lv2_rdf.hpp"
  29. // Carla Backend API
  30. #include "CarlaBackend.hpp"
  31. // Carla Native Plugin API
  32. #include "CarlaNative.h"
  33. // Carla Native Plugin API (C++)
  34. #include "CarlaNative.hpp"
  35. // Carla String
  36. #include "CarlaString.hpp"
  37. // Carla Plugin API
  38. #include "CarlaPlugin.hpp"
  39. // Carla Engine API
  40. #include "CarlaEngine.hpp"
  41. //#include "standalone/CarlaStandalone.cpp"
  42. // #include "CarlaMutex.hpp"
  43. // #include "CarlaBackendUtils.hpp"
  44. // #include "CarlaBridgeUtils.hpp"
  45. // #include "CarlaLadspaUtils.hpp"
  46. // #include "CarlaLibUtils.hpp"
  47. // #include "CarlaLv2Utils.hpp"
  48. // #include "CarlaOscUtils.hpp"
  49. // #include "CarlaShmUtils.hpp"
  50. // #include "CarlaStateUtils.hpp"
  51. // #include "CarlaVstUtils.hpp"
  52. // #include "RtList.hpp"
  53. int safe_assert_return_test(bool test)
  54. {
  55. CARLA_SAFE_ASSERT_RETURN(test, 1);
  56. return 0;
  57. }
  58. int main()
  59. {
  60. // ladspa rdf
  61. {
  62. LADSPA_RDF_ScalePoint a;
  63. LADSPA_RDF_Port b;
  64. LADSPA_RDF_Descriptor c;
  65. }
  66. // lv2 rdf
  67. {
  68. LV2_RDF_PortMidiMap a;
  69. LV2_RDF_PortPoints b;
  70. LV2_RDF_PortUnit c;
  71. LV2_RDF_PortScalePoint d;
  72. LV2_RDF_Port e;
  73. LV2_RDF_Preset f;
  74. LV2_RDF_Feature g;
  75. LV2_RDF_UI h;
  76. LV2_RDF_Descriptor i;
  77. }
  78. // Carla Backend API
  79. {
  80. namespace CB = CarlaBackend;
  81. CB::BinaryType a = CB::BINARY_NONE;
  82. CB::PluginType b = CB::PLUGIN_NONE;
  83. CB::PluginCategory c = CB::PLUGIN_CATEGORY_NONE;
  84. CB::ParameterType d = CB::PARAMETER_UNKNOWN;
  85. CB::InternalParametersIndex e = CB::PARAMETER_NULL;
  86. CB::PatchbayIconType f = CB::PATCHBAY_ICON_APPLICATION;
  87. CB::OptionsType g = CB::OPTION_PROCESS_NAME;
  88. CB::CallbackType h = CB::CALLBACK_DEBUG;
  89. CB::ProcessMode i = CB::PROCESS_MODE_SINGLE_CLIENT;
  90. CB::TransportMode j = CB::TRANSPORT_MODE_INTERNAL;
  91. CB::CallbackFunc k = nullptr;
  92. CB::ParameterData l;
  93. CB::ParameterRanges m;
  94. CB::MidiProgramData n;
  95. CB::CustomData o;
  96. a=a;b=b;c=c;d=d;e=e;f=f;g=g;h=h;i=i;j=j;k=k;l=l;m=m;n=n;o=o;
  97. }
  98. // Carla Native Plugin API
  99. {
  100. HostHandle a = nullptr;
  101. PluginHandle b = nullptr;
  102. PluginCategory c = PLUGIN_CATEGORY_NONE;
  103. PluginHints d = static_cast<PluginHints>(0x0);
  104. PluginSupports e = static_cast<PluginSupports>(0x0);
  105. ParameterHints f = static_cast<ParameterHints>(0x0);
  106. PluginDispatcherOpcode g = PLUGIN_OPCODE_NULL;
  107. HostDispatcherOpcode h = HOST_OPCODE_NULL;
  108. ParameterScalePoint i;
  109. ParameterRanges j;
  110. Parameter k;
  111. MidiEvent l;
  112. MidiProgram m;
  113. TimeInfoBBT n;
  114. TimeInfo o;
  115. HostDescriptor p;
  116. PluginDescriptor q = { c, d, e,
  117. 0, 0, 0, 0, 0, 0,
  118. nullptr, nullptr, nullptr, nullptr,
  119. nullptr, nullptr,
  120. nullptr, nullptr, nullptr, nullptr,
  121. nullptr, nullptr,
  122. nullptr, nullptr, nullptr,
  123. nullptr, nullptr,
  124. nullptr, nullptr, nullptr,
  125. nullptr, nullptr, nullptr,
  126. nullptr, nullptr,
  127. nullptr };
  128. a=a;b=b;c=c;d=d;e=e;f=f;g=g;h=h;i=i;j=j;k=k;l=l;m=m;n=n;o=o;p=p;
  129. (void)q;
  130. }
  131. // Carla common utils
  132. {
  133. bool2str(true);
  134. pass();
  135. carla_debug("DEBUG");
  136. carla_stdout("OUT");
  137. carla_stderr("ERR");
  138. carla_stderr2("ERR2");
  139. carla_sleep(1);
  140. carla_msleep(1);
  141. carla_setenv("x", "y");
  142. carla_setprocname("ANSI-Test");
  143. assert(safe_assert_return_test(true) == 0);
  144. assert(safe_assert_return_test(false) == 1);
  145. // carla_strdup
  146. {
  147. const char* s1 = carla_strdup("s1");
  148. const char* s2 = carla_strdup_free(strdup("s2"));
  149. delete[] s1;
  150. delete[] s2;
  151. }
  152. // carla_min
  153. {
  154. assert(carla_min<int>( 1, 2, -1) == 1);
  155. assert(carla_min<int>( 1, 2, 0) == 1);
  156. assert(carla_min<int>( 1, 2, 1) == 1);
  157. assert(carla_min<int>( 1, 2, 2) == 2);
  158. assert(carla_min<int>( 1, 2, 3) == 3);
  159. assert(carla_min<int>( 2, 2, -1) == 2);
  160. assert(carla_min<int>( 1, 2, -1) == 1);
  161. assert(carla_min<int>( 0, 2, -1) == 0);
  162. assert(carla_min<int>(-1, 2, -1) == -1);
  163. assert(carla_min<int>(-2, 2, -1) == -1);
  164. assert(carla_min<int>(-1, 2, 0) == 0);
  165. assert(carla_min<int>(-1, 1, 0) == 0);
  166. assert(carla_min<int>(-1, 0, 0) == 0);
  167. assert(carla_min<int>(-1, -1, 0) == 0);
  168. assert(carla_min<int>(-1, -2, 0) == 0);
  169. unsigned u1 = static_cast<unsigned>(-1);
  170. unsigned u2 = static_cast<unsigned>(-2);
  171. assert(carla_min<unsigned>(u1, u2, 0) == u2);
  172. assert(carla_min<unsigned>(u1, u2, u1) == u1);
  173. assert(carla_min<unsigned>(u1, u2, u2) == u2);
  174. assert(carla_min<unsigned>(u1, 2, 0) == 2);
  175. assert(carla_min<unsigned>( 2, u1, 0) == 2);
  176. assert(carla_min<unsigned>( 2, 2, u1) == u1);
  177. }
  178. // carla_max (same as min)
  179. {
  180. assert(carla_max<int>( 1, 2, -1) == -1);
  181. assert(carla_max<int>( 1, 2, 0) == 0);
  182. assert(carla_max<int>( 1, 2, 1) == 1);
  183. assert(carla_max<int>( 1, 2, 2) == 2);
  184. assert(carla_max<int>( 1, 2, 3) == 2);
  185. assert(carla_max<int>( 2, 2, -1) == -1);
  186. assert(carla_max<int>( 1, 2, -1) == -1);
  187. assert(carla_max<int>( 0, 2, -1) == -1);
  188. assert(carla_max<int>(-1, 2, -1) == -1);
  189. assert(carla_max<int>(-2, 2, -1) == -1);
  190. assert(carla_max<int>(-1, 2, 0) == 0);
  191. assert(carla_max<int>(-1, 1, 0) == 0);
  192. assert(carla_max<int>(-1, 0, 0) == 0);
  193. assert(carla_max<int>(-1, -1, 0) == -1);
  194. assert(carla_max<int>(-1, -2, 0) == -1);
  195. unsigned u1 = static_cast<unsigned>(-1);
  196. unsigned u2 = static_cast<unsigned>(-2);
  197. assert(carla_max<unsigned>(u1, u2, 0) == 0);
  198. assert(carla_max<unsigned>(u1, u2, u1) == u1);
  199. assert(carla_max<unsigned>(u1, u2, u2) == u2);
  200. assert(carla_max<unsigned>(u1, 2, 0) == 0);
  201. assert(carla_max<unsigned>( 2, u1, 0) == 0);
  202. assert(carla_max<unsigned>( 2, 2, u1) == 2);
  203. }
  204. // carla_fixValue (same as min)
  205. {
  206. assert(carla_fixValue<int>( 1, 2, -1) == 1);
  207. assert(carla_fixValue<int>( 1, 2, 0) == 1);
  208. assert(carla_fixValue<int>( 1, 2, 1) == 1);
  209. assert(carla_fixValue<int>( 1, 2, 2) == 2);
  210. assert(carla_fixValue<int>( 1, 2, 3) == 2);
  211. assert(carla_fixValue<int>( 1, 2, -1) == 1);
  212. assert(carla_fixValue<int>( 0, 2, -1) == 0);
  213. assert(carla_fixValue<int>(-1, 2, -1) == -1);
  214. assert(carla_fixValue<int>(-2, 2, -1) == -1);
  215. assert(carla_fixValue<int>(-1, 2, 0) == 0);
  216. assert(carla_fixValue<int>(-1, 1, 0) == 0);
  217. assert(carla_fixValue<int>(-1, 0, 0) == 0);
  218. unsigned u1 = static_cast<unsigned>(-1);
  219. unsigned u2 = static_cast<unsigned>(-2);
  220. assert(carla_fixValue<unsigned>(u2, u1, 0) == u2);
  221. assert(carla_fixValue<unsigned>(u2, u1, u1) == u1);
  222. assert(carla_fixValue<unsigned>(u2, u1, u2) == u2);
  223. }
  224. // carla_add (copy and fill are very similar, so they are ignored here)
  225. {
  226. int a = 0;
  227. int b = 1;
  228. int c = 2;
  229. carla_add<int>(&a, &a, 1);
  230. assert(a == 0);
  231. carla_add<int>(&a, &b, 1);
  232. assert(a == 1);
  233. carla_add<int>(&a, &c, 1);
  234. assert(a == 3);
  235. float d = 10.0f;
  236. float e = 0.11f;
  237. carla_add<float>(&d, &e, 1);
  238. assert(d == 10.11f);
  239. float f[5] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
  240. float g[5] = { 0.1f, 0.1f, 0.1f, 0.1f, 0.1f };
  241. carla_add<float>(f, g, 5);
  242. assert(f[0] == f[0]);
  243. assert(f[1] == f[1]);
  244. assert(f[2] == f[2]);
  245. assert(f[3] == f[3]);
  246. assert(f[4] == f[4]);
  247. assert(f[0] == g[0]);
  248. assert(f[1] == g[1]);
  249. assert(f[2] == g[2]);
  250. assert(f[3] == g[3]);
  251. assert(f[4] == g[4]);
  252. carla_add<float>(g, f, 1);
  253. carla_add<float>(g, f, 2);
  254. carla_addFloat(g, f, 3);
  255. carla_add(g, f, 4);
  256. carla_add(g, f, 5);
  257. assert(g[0] == f[0]*6);
  258. assert(g[1] == f[1]*5);
  259. assert(g[2] == f[2]*4);
  260. assert(g[3] == f[3]*3);
  261. assert(g[4] == f[4]*2);
  262. carla_stdout("f: %f,%f,%f,%f,%f", f[0], f[1], f[2], f[3], f[4]);
  263. assert(f[0] != g[0]);
  264. assert(f[1] != g[1]);
  265. assert(f[2] != g[2]);
  266. assert(f[3] != g[3]);
  267. assert(f[4] != g[4]);
  268. carla_copy(f, g, 3);
  269. assert(f[0] == g[0]);
  270. assert(f[1] == g[1]);
  271. assert(f[2] == g[2]);
  272. assert(f[3] != g[3]);
  273. assert(f[4] != g[4]);
  274. carla_stdout("f: %f,%f,%f,%f,%f", f[0], f[1], f[2], f[3], f[4]);
  275. }
  276. // memory functions
  277. {
  278. uint64_t a[100];
  279. uint64_t at = 9999;
  280. carla_fill<uint64_t>(a, 100, 1);
  281. assert(a[99] == 1);
  282. assert(at == 9999);
  283. carla_zeroMem(a, sizeof(uint64_t)*100);
  284. assert(a[0] == 0);
  285. assert(a[99] == 0);
  286. assert(at == 9999);
  287. uint64_t b[100];
  288. uint64_t bt = 9999;
  289. carla_fill<uint64_t>(b, 100, 2);
  290. assert(b[99] == 2);
  291. assert(at == 9999);
  292. carla_zeroStruct(b);
  293. assert(b[0] == 0);
  294. assert(b[99] == 0);
  295. assert(bt == 9999);
  296. uint64_t c[100];
  297. uint64_t ct = 9999;
  298. carla_fill<uint64_t>(c, 100, 3);
  299. assert(c[99] == 3);
  300. assert(at == 9999);
  301. carla_zeroStruct(c, 100);
  302. assert(c[0] == 0);
  303. assert(c[99] == 0);
  304. assert(ct == 9999);
  305. struct Test { bool b; void* p; int i; };
  306. Test d, e[11], f[9];
  307. carla_zeroStruct<Test>(d);
  308. carla_zeroStruct<Test>(e, 11);
  309. carla_zeroStruct<Test>(f, 9);
  310. Test* h(new Test);
  311. h->i = 9;
  312. carla_zeroStruct<Test>(h, 1);
  313. assert(h->i == 0);
  314. delete h;
  315. Test* i(new Test[2]);
  316. carla_zeroStruct<Test>(i, 2);
  317. delete[] i;
  318. }
  319. }
  320. // Carla misc utils imported from Juce source code
  321. {
  322. struct Test { char s[24]; void* p; };
  323. ScopedPointer<int> a(new int);
  324. ScopedPointer<long long> b(new long long);
  325. ScopedPointer<Test> c(new Test);
  326. ScopedPointer<Test> d(new Test);
  327. ScopedPointer<Test> e(new Test);
  328. e = nullptr;
  329. delete d.release();
  330. delete e.release();
  331. ScopedPointer<Test> f(nullptr);
  332. }
  333. // Carla Native Plugin API (C++)
  334. {
  335. class PluginDescriptorClassTest : public PluginDescriptorClass
  336. {
  337. public:
  338. PluginDescriptorClassTest(const HostDescriptor* const host)
  339. : PluginDescriptorClass(host) {}
  340. protected:
  341. void process(float** const, float** const, const uint32_t, const uint32_t, const MidiEvent* const) {}
  342. PluginDescriptorClassEND(PluginDescriptorClassTest)
  343. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginDescriptorClassTest)
  344. };
  345. const HostDescriptor a = { nullptr, nullptr, nullptr,
  346. nullptr, nullptr, nullptr,
  347. nullptr, nullptr,
  348. nullptr, nullptr, nullptr, nullptr,
  349. nullptr, nullptr,
  350. nullptr };
  351. PluginDescriptor b = { PLUGIN_CATEGORY_NONE, PLUGIN_IS_RTSAFE, PLUGIN_SUPPORTS_EVERYTHING,
  352. 0, 0, 0, 0, 0, 0,
  353. nullptr, nullptr, nullptr, nullptr,
  354. PluginDescriptorFILL(PluginDescriptorClassTest) };
  355. (void)b;
  356. ScopedPointer<PluginDescriptorClassTest> c;
  357. c = new PluginDescriptorClassTest(&a);
  358. }
  359. return 0;
  360. }