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.

531 lines
16KB

  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. #define RING_BUFFER_SIZE 48
  20. // includes
  21. #include "CarlaDefines.hpp"
  22. #include "CarlaMIDI.h"
  23. #include "ladspa_rdf.hpp"
  24. #include "lv2_rdf.hpp"
  25. // Carla Backend API
  26. #include "CarlaBackend.hpp"
  27. // Carla utils (part 1/4)
  28. #include "CarlaUtils.hpp"
  29. #include "CarlaJuceUtils.hpp"
  30. // Carla utils (part 2/4)
  31. #include "CarlaMutex.hpp"
  32. #include "CarlaRingBuffer.hpp"
  33. #include "CarlaString.hpp"
  34. #include "RtList.hpp"
  35. // Carla utils (part 3/4)
  36. #include "CarlaBackendUtils.hpp"
  37. #include "CarlaBridgeUtils.hpp"
  38. // #include "CarlaLadspaUtils.hpp"
  39. // #include "CarlaLibUtils.hpp"
  40. // #include "CarlaLv2Utils.hpp"
  41. // #include "CarlaOscUtils.hpp"
  42. // #include "CarlaShmUtils.hpp"
  43. // #include "CarlaStateUtils.hpp"
  44. // #include "CarlaVstUtils.hpp"
  45. // Carla utils (part 4/4)
  46. // #include "Lv2AtomQueue.hpp"
  47. // Carla Native Plugin API
  48. #include "CarlaNative.h"
  49. // Carla Native Plugin API (C++)
  50. #include "CarlaNative.hpp"
  51. // Carla Plugin API
  52. #include "CarlaPlugin.hpp"
  53. // Carla Engine API
  54. #include "CarlaEngine.hpp"
  55. // Carla Standalone API
  56. #include "CarlaStandalone.hpp"
  57. // // Carla Plugin
  58. // #include "plugin/CarlaPluginThread.hpp"
  59. // #include "plugin/CarlaPluginInternal.hpp"
  60. // #include "standalone/CarlaStandalone.cpp"
  61. namespace CB = CarlaBackend;
  62. int safe_assert_return_test(bool test)
  63. {
  64. CARLA_SAFE_ASSERT_RETURN(test, 1);
  65. return 0;
  66. }
  67. int main()
  68. {
  69. #if 0
  70. // ladspa rdf
  71. {
  72. LADSPA_RDF_ScalePoint a;
  73. LADSPA_RDF_Port b;
  74. LADSPA_RDF_Descriptor c;
  75. }
  76. // lv2 rdf
  77. {
  78. LV2_RDF_PortMidiMap a;
  79. LV2_RDF_PortPoints b;
  80. LV2_RDF_PortUnit c;
  81. LV2_RDF_PortScalePoint d;
  82. LV2_RDF_Port e;
  83. LV2_RDF_Preset f;
  84. LV2_RDF_Feature g;
  85. LV2_RDF_UI h;
  86. LV2_RDF_Descriptor i;
  87. }
  88. // Carla Backend API
  89. {
  90. CB::BinaryType a = CB::BINARY_NONE;
  91. CB::PluginType b = CB::PLUGIN_NONE;
  92. CB::PluginCategory c = CB::PLUGIN_CATEGORY_NONE;
  93. CB::ParameterType d = CB::PARAMETER_UNKNOWN;
  94. CB::InternalParametersIndex e = CB::PARAMETER_NULL;
  95. CB::PatchbayIconType f = CB::PATCHBAY_ICON_APPLICATION;
  96. CB::OptionsType g = CB::OPTION_PROCESS_NAME;
  97. CB::CallbackType h = CB::CALLBACK_DEBUG;
  98. CB::ProcessMode i = CB::PROCESS_MODE_SINGLE_CLIENT;
  99. CB::TransportMode j = CB::TRANSPORT_MODE_INTERNAL;
  100. CB::CallbackFunc k = nullptr;
  101. CB::ParameterData l;
  102. CB::ParameterRanges m;
  103. CB::MidiProgramData n;
  104. CB::CustomData o;
  105. 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;
  106. }
  107. // Carla Native Plugin API
  108. {
  109. HostHandle a = nullptr;
  110. PluginHandle b = nullptr;
  111. PluginCategory c = PLUGIN_CATEGORY_NONE;
  112. PluginHints d = static_cast<PluginHints>(0x0);
  113. PluginSupports e = static_cast<PluginSupports>(0x0);
  114. ParameterHints f = static_cast<ParameterHints>(0x0);
  115. PluginDispatcherOpcode g = PLUGIN_OPCODE_NULL;
  116. HostDispatcherOpcode h = HOST_OPCODE_NULL;
  117. ParameterScalePoint i;
  118. ParameterRanges j;
  119. Parameter k;
  120. MidiEvent l;
  121. MidiProgram m;
  122. TimeInfoBBT n;
  123. TimeInfo o;
  124. HostDescriptor p;
  125. PluginDescriptor q = { c, d, e,
  126. 0, 0, 0, 0, 0, 0,
  127. nullptr, nullptr, nullptr, nullptr,
  128. nullptr, nullptr,
  129. nullptr, nullptr, nullptr, nullptr,
  130. nullptr, nullptr,
  131. nullptr, nullptr, nullptr,
  132. nullptr, nullptr,
  133. nullptr, nullptr, nullptr,
  134. nullptr, nullptr, nullptr,
  135. nullptr, nullptr,
  136. nullptr };
  137. 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;
  138. (void)q;
  139. }
  140. // Carla common utils
  141. {
  142. bool2str(true);
  143. pass();
  144. carla_debug("DEBUG");
  145. carla_stdout("OUT");
  146. carla_stderr("ERR");
  147. carla_stderr2("ERR2");
  148. carla_sleep(1);
  149. carla_msleep(1);
  150. carla_setenv("x", "y");
  151. carla_setprocname("ANSI-Test");
  152. assert(safe_assert_return_test(true) == 0);
  153. assert(safe_assert_return_test(false) == 1);
  154. // carla_strdup
  155. {
  156. const char* s1 = carla_strdup("s1");
  157. const char* s2 = carla_strdup_free(strdup("s2"));
  158. delete[] s1;
  159. delete[] s2;
  160. }
  161. // carla_min
  162. {
  163. assert(carla_min<int>( 1, 2, -1) == 1);
  164. assert(carla_min<int>( 1, 2, 0) == 1);
  165. assert(carla_min<int>( 1, 2, 1) == 1);
  166. assert(carla_min<int>( 1, 2, 2) == 2);
  167. assert(carla_min<int>( 1, 2, 3) == 3);
  168. assert(carla_min<int>( 2, 2, -1) == 2);
  169. assert(carla_min<int>( 1, 2, -1) == 1);
  170. assert(carla_min<int>( 0, 2, -1) == 0);
  171. assert(carla_min<int>(-1, 2, -1) == -1);
  172. assert(carla_min<int>(-2, 2, -1) == -1);
  173. assert(carla_min<int>(-1, 2, 0) == 0);
  174. assert(carla_min<int>(-1, 1, 0) == 0);
  175. assert(carla_min<int>(-1, 0, 0) == 0);
  176. assert(carla_min<int>(-1, -1, 0) == 0);
  177. assert(carla_min<int>(-1, -2, 0) == 0);
  178. unsigned u1 = static_cast<unsigned>(-1);
  179. unsigned u2 = static_cast<unsigned>(-2);
  180. assert(carla_min<unsigned>(u1, u2, 0) == u2);
  181. assert(carla_min<unsigned>(u1, u2, u1) == u1);
  182. assert(carla_min<unsigned>(u1, u2, u2) == u2);
  183. assert(carla_min<unsigned>(u1, 2, 0) == 2);
  184. assert(carla_min<unsigned>( 2, u1, 0) == 2);
  185. assert(carla_min<unsigned>( 2, 2, u1) == u1);
  186. }
  187. // carla_max (same as min)
  188. {
  189. assert(carla_max<int>( 1, 2, -1) == -1);
  190. assert(carla_max<int>( 1, 2, 0) == 0);
  191. assert(carla_max<int>( 1, 2, 1) == 1);
  192. assert(carla_max<int>( 1, 2, 2) == 2);
  193. assert(carla_max<int>( 1, 2, 3) == 2);
  194. assert(carla_max<int>( 2, 2, -1) == -1);
  195. assert(carla_max<int>( 1, 2, -1) == -1);
  196. assert(carla_max<int>( 0, 2, -1) == -1);
  197. assert(carla_max<int>(-1, 2, -1) == -1);
  198. assert(carla_max<int>(-2, 2, -1) == -1);
  199. assert(carla_max<int>(-1, 2, 0) == 0);
  200. assert(carla_max<int>(-1, 1, 0) == 0);
  201. assert(carla_max<int>(-1, 0, 0) == 0);
  202. assert(carla_max<int>(-1, -1, 0) == -1);
  203. assert(carla_max<int>(-1, -2, 0) == -1);
  204. unsigned u1 = static_cast<unsigned>(-1);
  205. unsigned u2 = static_cast<unsigned>(-2);
  206. assert(carla_max<unsigned>(u1, u2, 0) == 0);
  207. assert(carla_max<unsigned>(u1, u2, u1) == u1);
  208. assert(carla_max<unsigned>(u1, u2, u2) == u2);
  209. assert(carla_max<unsigned>(u1, 2, 0) == 0);
  210. assert(carla_max<unsigned>( 2, u1, 0) == 0);
  211. assert(carla_max<unsigned>( 2, 2, u1) == 2);
  212. }
  213. // carla_fixValue (same as min)
  214. {
  215. assert(carla_fixValue<int>( 1, 2, -1) == 1);
  216. assert(carla_fixValue<int>( 1, 2, 0) == 1);
  217. assert(carla_fixValue<int>( 1, 2, 1) == 1);
  218. assert(carla_fixValue<int>( 1, 2, 2) == 2);
  219. assert(carla_fixValue<int>( 1, 2, 3) == 2);
  220. assert(carla_fixValue<int>( 1, 2, -1) == 1);
  221. assert(carla_fixValue<int>( 0, 2, -1) == 0);
  222. assert(carla_fixValue<int>(-1, 2, -1) == -1);
  223. assert(carla_fixValue<int>(-2, 2, -1) == -1);
  224. assert(carla_fixValue<int>(-1, 2, 0) == 0);
  225. assert(carla_fixValue<int>(-1, 1, 0) == 0);
  226. assert(carla_fixValue<int>(-1, 0, 0) == 0);
  227. unsigned u1 = static_cast<unsigned>(-1);
  228. unsigned u2 = static_cast<unsigned>(-2);
  229. assert(carla_fixValue<unsigned>(u2, u1, 0) == u2);
  230. assert(carla_fixValue<unsigned>(u2, u1, u1) == u1);
  231. assert(carla_fixValue<unsigned>(u2, u1, u2) == u2);
  232. }
  233. // carla_add (copy and fill are very similar, so they are ignored here)
  234. {
  235. int a = 0;
  236. int b = 1;
  237. int c = 2;
  238. carla_add<int>(&a, &a, 1);
  239. assert(a == 0);
  240. carla_add<int>(&a, &b, 1);
  241. assert(a == 1);
  242. carla_add<int>(&a, &c, 1);
  243. assert(a == 3);
  244. float d = 10.0f;
  245. float e = 0.11f;
  246. carla_add<float>(&d, &e, 1);
  247. assert(d == 10.11f);
  248. float f[5] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
  249. float g[5] = { 0.1f, 0.1f, 0.1f, 0.1f, 0.1f };
  250. carla_add<float>(f, g, 5);
  251. assert(f[0] == f[0]);
  252. assert(f[1] == f[1]);
  253. assert(f[2] == f[2]);
  254. assert(f[3] == f[3]);
  255. assert(f[4] == f[4]);
  256. assert(f[0] == g[0]);
  257. assert(f[1] == g[1]);
  258. assert(f[2] == g[2]);
  259. assert(f[3] == g[3]);
  260. assert(f[4] == g[4]);
  261. carla_add<float>(g, f, 1);
  262. carla_add<float>(g, f, 2);
  263. carla_addFloat(g, f, 3);
  264. carla_add(g, f, 4);
  265. carla_add(g, f, 5);
  266. assert(g[0] == f[0]*6);
  267. assert(g[1] == f[1]*5);
  268. assert(g[2] == f[2]*4);
  269. assert(g[3] == f[3]*3);
  270. assert(g[4] == f[4]*2);
  271. carla_stdout("f: %f,%f,%f,%f,%f", f[0], f[1], f[2], f[3], f[4]);
  272. assert(f[0] != g[0]);
  273. assert(f[1] != g[1]);
  274. assert(f[2] != g[2]);
  275. assert(f[3] != g[3]);
  276. assert(f[4] != g[4]);
  277. carla_copy(f, g, 3);
  278. assert(f[0] == g[0]);
  279. assert(f[1] == g[1]);
  280. assert(f[2] == g[2]);
  281. assert(f[3] != g[3]);
  282. assert(f[4] != g[4]);
  283. carla_stdout("f: %f,%f,%f,%f,%f", f[0], f[1], f[2], f[3], f[4]);
  284. }
  285. // memory functions
  286. {
  287. uint64_t a[100];
  288. uint64_t at = 9999;
  289. carla_fill<uint64_t>(a, 100, 1);
  290. assert(a[99] == 1);
  291. assert(at == 9999);
  292. carla_zeroMem(a, sizeof(uint64_t)*100);
  293. assert(a[0] == 0);
  294. assert(a[99] == 0);
  295. assert(at == 9999);
  296. uint64_t b[100];
  297. uint64_t bt = 9999;
  298. carla_fill<uint64_t>(b, 100, 2);
  299. assert(b[99] == 2);
  300. assert(at == 9999);
  301. carla_zeroStruct(b);
  302. assert(b[0] == 0);
  303. assert(b[99] == 0);
  304. assert(bt == 9999);
  305. uint64_t c[100];
  306. uint64_t ct = 9999;
  307. carla_fill<uint64_t>(c, 100, 3);
  308. assert(c[99] == 3);
  309. assert(at == 9999);
  310. carla_zeroStruct(c, 100);
  311. assert(c[0] == 0);
  312. assert(c[99] == 0);
  313. assert(ct == 9999);
  314. struct Test { bool b; void* p; int i; };
  315. Test d, e[11], f[9];
  316. carla_zeroStruct<Test>(d);
  317. carla_zeroStruct<Test>(e, 11);
  318. carla_zeroStruct<Test>(f, 9);
  319. Test* h(new Test);
  320. h->i = 9;
  321. carla_zeroStruct<Test>(h, 1);
  322. assert(h->i == 0);
  323. delete h;
  324. Test* i(new Test[2]);
  325. carla_zeroStruct<Test>(i, 2);
  326. delete[] i;
  327. }
  328. }
  329. // Carla misc utils imported from Juce source code
  330. {
  331. struct Test { char s[24]; void* p; };
  332. ScopedPointer<int> a(new int);
  333. ScopedPointer<long long> b(new long long);
  334. ScopedPointer<Test> c(new Test);
  335. ScopedPointer<Test> d(new Test);
  336. ScopedPointer<Test> e(new Test);
  337. e = nullptr;
  338. delete d.release();
  339. delete e.release();
  340. ScopedPointer<Test> f(nullptr);
  341. }
  342. // Carla Native Plugin API (C++)
  343. {
  344. class PluginDescriptorClassTest : public PluginDescriptorClass
  345. {
  346. public:
  347. PluginDescriptorClassTest(const HostDescriptor* const host)
  348. : PluginDescriptorClass(host) {}
  349. protected:
  350. void process(float** const, float** const, const uint32_t, const uint32_t, const MidiEvent* const) {}
  351. PluginDescriptorClassEND(PluginDescriptorClassTest)
  352. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginDescriptorClassTest)
  353. };
  354. const HostDescriptor a = { nullptr, nullptr, nullptr,
  355. nullptr, nullptr, nullptr,
  356. nullptr, nullptr,
  357. nullptr, nullptr, nullptr, nullptr,
  358. nullptr, nullptr,
  359. nullptr };
  360. PluginDescriptor b = { PLUGIN_CATEGORY_NONE, PLUGIN_IS_RTSAFE, PLUGIN_SUPPORTS_EVERYTHING,
  361. 0, 0, 0, 0, 0, 0,
  362. nullptr, nullptr, nullptr, nullptr,
  363. PluginDescriptorFILL(PluginDescriptorClassTest) };
  364. (void)b;
  365. ScopedPointer<PluginDescriptorClassTest> c;
  366. c = new PluginDescriptorClassTest(&a);
  367. }
  368. // Carla Backend utils
  369. {
  370. class TestClass { public: int i; char pad[50]; };
  371. TestClass a, b, c;
  372. uintptr_t ad = CarlaBackend::getAddressFromPointer(&a);
  373. uintptr_t bd = CarlaBackend::getAddressFromPointer(&b);
  374. uintptr_t cd = CarlaBackend::getAddressFromPointer(&c);
  375. assert(bd > ad);
  376. assert(cd > bd);
  377. TestClass* ap = CarlaBackend::getPointerFromAddress<TestClass>(ad);
  378. TestClass* bp = CarlaBackend::getPointerFromAddress<TestClass>(bd);
  379. TestClass* cp = CarlaBackend::getPointerFromAddress<TestClass>(cd);
  380. assert(ap == &a);
  381. assert(bp == &b);
  382. assert(cp == &c);
  383. ap->i = 4;
  384. bp->i = 5;
  385. cp->i = 6;
  386. assert(a.i == 4);
  387. assert(b.i == 5);
  388. assert(c.i == 6);
  389. }
  390. // Carla Mutex
  391. {
  392. CarlaMutex m;
  393. m.tryLock();
  394. m.unlock();
  395. const CarlaMutex::ScopedLocker sl(m);
  396. }
  397. #endif
  398. // RingBuffer
  399. {
  400. RingBuffer buf;
  401. RingBufferControl ctrl(&buf);
  402. assert(! ctrl.dataAvailable());
  403. assert(ctrl.readInt() == 0);
  404. assert(ctrl.readFloat() == 0.0f);
  405. assert(! ctrl.dataAvailable());
  406. ctrl.writeChar('z');
  407. ctrl.commitWrite();
  408. assert(ctrl.dataAvailable());
  409. const char c = ctrl.readChar();
  410. carla_stdout("BufRead c = \"%c\"", c);
  411. assert(c != '\0');
  412. assert(c == 'z');
  413. assert(! ctrl.dataAvailable());
  414. ctrl.writeInt(9999);
  415. ctrl.commitWrite();
  416. const int i = ctrl.readInt();
  417. carla_stdout("BufRead i = \"%i\"", i);
  418. assert(i != 0);
  419. assert(i == 9999);
  420. ctrl.writeLong(-88088);
  421. ctrl.commitWrite();
  422. const long l = ctrl.readLong();
  423. carla_stdout("BufRead l = \"%li\"", l);
  424. assert(l != 0);
  425. assert(l == -88088);
  426. ctrl.writeFloat(5.6789f);
  427. ctrl.commitWrite();
  428. const float f = ctrl.readFloat();
  429. carla_stdout("BufRead f = \"%f\"", f);
  430. assert(f != 0.0f);
  431. assert(f == 5.6789f);
  432. assert(! ctrl.dataAvailable());
  433. for (char i='1'; i <= 'z'; ++i)
  434. {
  435. ctrl.writeChar(char(i));
  436. ctrl.commitWrite();
  437. }
  438. assert(ctrl.dataAvailable());
  439. printf("CHAR DUMP:\n");
  440. while (ctrl.dataAvailable())
  441. printf("%c", ctrl.readChar());
  442. assert(! ctrl.dataAvailable());
  443. printf("\nDUMP FINISHED");
  444. }
  445. return 0;
  446. }