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.

636 lines
18KB

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