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.

1360 lines
43KB

  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_backend_standalone.h"
  18. #include "carla_plugin.h"
  19. // Single, standalone engine
  20. static CarlaBackend::CarlaEngine* carla_engine = nullptr;
  21. static CarlaBackend::CallbackFunc carla_func = nullptr;
  22. // -------------------------------------------------------------------------------------------------------------------
  23. unsigned int get_engine_driver_count()
  24. {
  25. qDebug("CarlaBackendStandalone::get_engine_driver_count()");
  26. unsigned int count = 0;
  27. #ifdef CARLA_ENGINE_JACK
  28. count += 1;
  29. #endif
  30. #ifdef CARLA_ENGINE_RTAUDIO
  31. std::vector<RtAudio::Api> apis;
  32. RtAudio::getCompiledApi(apis);
  33. count += apis.size();
  34. #endif
  35. return count;
  36. }
  37. const char* get_engine_driver_name(unsigned int index)
  38. {
  39. qDebug("CarlaBackendStandalone::get_engine_driver_name(%i)", index);
  40. #ifdef CARLA_ENGINE_JACK
  41. if (index == 0)
  42. return "JACK";
  43. index -= 1;
  44. #endif
  45. #ifdef CARLA_ENGINE_RTAUDIO
  46. std::vector<RtAudio::Api> apis;
  47. RtAudio::getCompiledApi(apis);
  48. if (index < apis.size())
  49. {
  50. RtAudio::Api api = apis[index];
  51. switch (api)
  52. {
  53. case RtAudio::UNSPECIFIED:
  54. return "Unspecified";
  55. case RtAudio::LINUX_ALSA:
  56. return "ALSA";
  57. case RtAudio::LINUX_PULSE:
  58. return "PulseAudio";
  59. case RtAudio::LINUX_OSS:
  60. return "OSS";
  61. case RtAudio::UNIX_JACK:
  62. return "JACK (RtAudio)";
  63. case RtAudio::MACOSX_CORE:
  64. return "CoreAudio";
  65. case RtAudio::WINDOWS_ASIO:
  66. return "ASIO";
  67. case RtAudio::WINDOWS_DS:
  68. return "DirectSound";
  69. case RtAudio::RTAUDIO_DUMMY:
  70. return "Dummy";
  71. }
  72. }
  73. #endif
  74. qDebug("CarlaBackendStandalone::get_engine_driver_name(%i) - invalid index", index);
  75. return nullptr;
  76. }
  77. // -------------------------------------------------------------------------------------------------------------------
  78. bool engine_init(const char* driver_name, const char* client_name)
  79. {
  80. qDebug("CarlaBackendStandalone::engine_init(\"%s\", \"%s\")", driver_name, client_name);
  81. #ifdef CARLA_ENGINE_JACK
  82. if (strcmp(driver_name, "JACK") == 0)
  83. carla_engine = new CarlaBackend::CarlaEngineJack;
  84. #endif
  85. #ifdef CARLA_ENGINE_RTAUDIO
  86. #ifdef __LINUX_ALSA__
  87. if (strcmp(driver_name, "ALSA") == 0)
  88. carla_engine = new CarlaBackend::CarlaEngineRtAudio(RtAudio::LINUX_ALSA);
  89. #endif
  90. #ifdef __LINUX_PULSE__
  91. if (strcmp(driver_name, "PulseAudio") == 0)
  92. carla_engine = new CarlaBackend::CarlaEngineRtAudio(RtAudio::LINUX_PULSE);
  93. #endif
  94. #ifdef __LINUX_OSS__
  95. if (strcmp(driver_name, "OSS") == 0)
  96. carla_engine = new CarlaBackend::CarlaEngineRtAudio(RtAudio::LINUX_OSS);
  97. #endif
  98. #ifdef __UNIX_JACK__
  99. if (strcmp(driver_name, "JACK (RtAudio)") == 0)
  100. carla_engine = new CarlaBackend::CarlaEngineRtAudio(RtAudio::UNIX_JACK);
  101. #endif
  102. #ifdef __MACOSX_CORE__
  103. if (strcmp(driver_name, "CoreAudio") == 0)
  104. carla_engine = new CarlaBackend::CarlaEngineRtAudio(RtAudio::MACOSX_CORE);
  105. #endif
  106. #ifdef __WINDOWS_ASIO__
  107. if (strcmp(driver_name, "ASIO") == 0)
  108. carla_engine = new CarlaBackend::CarlaEngineRtAudio(RtAudio::WINDOWS_ASIO);
  109. #endif
  110. #ifdef __WINDOWS_DS__
  111. else if (strcmp(driver_name, "DirectSound") == 0)
  112. carla_engine = new CarlaBackend::CarlaEngineRtAudio(RtAudio::WINDOWS_DS);
  113. #endif
  114. #ifdef __RTAUDIO_DUMMY__
  115. else if (strcmp(driver_name, "Dummy") == 0)
  116. carla_engine = new CarlaBackend::CarlaEngineRtAudio(RtAudio::RTAUDIO_DUMMY);
  117. #endif
  118. #endif
  119. if (! carla_engine)
  120. {
  121. CarlaBackend::setLastError("The seleted audio driver is not available!");
  122. return false;
  123. }
  124. #ifndef Q_OS_WIN
  125. // TODO: make this an option, put somewhere else
  126. if (! getenv("WINE_RT"))
  127. {
  128. carla_setenv("WINE_RT", "15");
  129. carla_setenv("WINE_SVR_RT", "10");
  130. }
  131. #endif
  132. carla_engine->setCallback(carla_func);
  133. bool started = carla_engine->init(client_name);
  134. if (started)
  135. CarlaBackend::setLastError("no error");
  136. return started;
  137. }
  138. bool engine_close()
  139. {
  140. qDebug("CarlaBackendStandalone::engine_close()");
  141. if (! carla_engine)
  142. {
  143. CarlaBackend::setLastError("Engine is not started");
  144. return false;
  145. }
  146. bool closed = carla_engine->close();
  147. carla_engine->removeAllPlugins();
  148. // cleanup static data
  149. get_plugin_info(0);
  150. get_parameter_info(0, 0);
  151. get_parameter_scalepoint_info(0, 0, 0);
  152. get_chunk_data(0);
  153. get_parameter_text(0, 0);
  154. get_program_name(0, 0);
  155. get_midi_program_name(0, 0);
  156. get_real_plugin_name(0);
  157. CarlaBackend::resetOptions();
  158. CarlaBackend::setLastError(nullptr);
  159. delete carla_engine;
  160. carla_engine = nullptr;
  161. return closed;
  162. }
  163. bool is_engine_running()
  164. {
  165. qDebug("CarlaBackendStandalone::is_engine_running()");
  166. return carla_engine && carla_engine->isRunning();
  167. }
  168. // -------------------------------------------------------------------------------------------------------------------
  169. short add_plugin(CarlaBackend::BinaryType btype, CarlaBackend::PluginType ptype, const char* filename, const char* const name, const char* label, void* extra_stuff)
  170. {
  171. qDebug("CarlaBackendStandalone::add_plugin(%s, %s, \"%s\", \"%s\", \"%s\", %p)", CarlaBackend::BinaryType2str(btype), CarlaBackend::PluginType2str(ptype), filename, name, label, extra_stuff);
  172. return carla_engine->addPlugin(btype, ptype, filename, name, label, extra_stuff);
  173. }
  174. bool remove_plugin(unsigned short plugin_id)
  175. {
  176. qDebug("CarlaBackendStandalone::remove_plugin(%i)", plugin_id);
  177. return carla_engine->removePlugin(plugin_id);
  178. }
  179. // -------------------------------------------------------------------------------------------------------------------
  180. const PluginInfo* get_plugin_info(unsigned short plugin_id)
  181. {
  182. qDebug("CarlaBackendStandalone::get_plugin_info(%i)", plugin_id);
  183. static PluginInfo info;
  184. if (info.label)
  185. {
  186. free((void*)info.label);
  187. info.label = nullptr;
  188. }
  189. if (info.maker)
  190. {
  191. free((void*)info.maker);
  192. info.maker = nullptr;
  193. }
  194. if (info.copyright)
  195. {
  196. free((void*)info.copyright);
  197. info.copyright = nullptr;
  198. }
  199. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  200. if (plugin)
  201. {
  202. char buf_str[STR_MAX] = { 0 };
  203. info.type = plugin->type();
  204. info.category = plugin->category();
  205. info.hints = plugin->hints();
  206. info.binary = plugin->filename();
  207. info.name = plugin->name();
  208. info.uniqueId = plugin->uniqueId();
  209. plugin->getLabel(buf_str);
  210. info.label = strdup(buf_str);
  211. plugin->getMaker(buf_str);
  212. info.maker = strdup(buf_str);
  213. plugin->getCopyright(buf_str);
  214. info.copyright = strdup(buf_str);
  215. return &info;
  216. }
  217. if (carla_engine->isRunning())
  218. qCritical("CarlaBackendStandalone::get_plugin_info(%i) - could not find plugin", plugin_id);
  219. return &info;
  220. }
  221. const PortCountInfo* get_audio_port_count_info(unsigned short plugin_id)
  222. {
  223. qDebug("CarlaBackendStandalone::get_audio_port_count_info(%i)", plugin_id);
  224. static PortCountInfo info;
  225. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  226. if (plugin)
  227. {
  228. info.ins = plugin->audioInCount();
  229. info.outs = plugin->audioOutCount();
  230. info.total = info.ins + info.outs;
  231. return &info;
  232. }
  233. qCritical("CarlaBackendStandalone::get_audio_port_count_info(%i) - could not find plugin", plugin_id);
  234. return &info;
  235. }
  236. const PortCountInfo* get_midi_port_count_info(unsigned short plugin_id)
  237. {
  238. qDebug("CarlaBackendStandalone::get_midi_port_count_info(%i)", plugin_id);
  239. static PortCountInfo info;
  240. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  241. if (plugin)
  242. {
  243. info.ins = plugin->midiInCount();
  244. info.outs = plugin->midiOutCount();
  245. info.total = info.ins + info.outs;
  246. return &info;
  247. }
  248. qCritical("CarlaBackendStandalone::get_midi_port_count_info(%i) - could not find plugin", plugin_id);
  249. return &info;
  250. }
  251. const PortCountInfo* get_parameter_count_info(unsigned short plugin_id)
  252. {
  253. qDebug("CarlaBackendStandalone::get_parameter_port_count_info(%i)", plugin_id);
  254. static PortCountInfo info;
  255. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  256. if (plugin)
  257. {
  258. plugin->getParameterCountInfo(&info.ins, &info.outs, &info.total);
  259. return &info;
  260. }
  261. qCritical("CarlaBackendStandalone::get_parameter_port_count_info(%i) - could not find plugin", plugin_id);
  262. return &info;
  263. }
  264. const ParameterInfo* get_parameter_info(unsigned short plugin_id, quint32 parameter_id)
  265. {
  266. qDebug("CarlaBackendStandalone::get_parameter_info(%i, %i)", plugin_id, parameter_id);
  267. static ParameterInfo info;
  268. if (info.name)
  269. {
  270. free((void*)info.name);
  271. info.name = nullptr;
  272. }
  273. if (info.symbol)
  274. {
  275. free((void*)info.symbol);
  276. info.symbol = nullptr;
  277. }
  278. if (info.unit)
  279. {
  280. free((void*)info.unit);
  281. info.unit = nullptr;
  282. }
  283. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  284. if (plugin)
  285. {
  286. if (parameter_id < plugin->parameterCount())
  287. {
  288. char buf_str[STR_MAX] = { 0 };
  289. info.scalePointCount = plugin->parameterScalePointCount(parameter_id);
  290. plugin->getParameterName(parameter_id, buf_str);
  291. info.name = strdup(buf_str);
  292. plugin->getParameterSymbol(parameter_id, buf_str);
  293. info.symbol = strdup(buf_str);
  294. plugin->getParameterUnit(parameter_id, buf_str);
  295. info.unit = strdup(buf_str);
  296. }
  297. else
  298. qCritical("CarlaBackendStandalone::get_parameter_info(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  299. return &info;
  300. }
  301. if (carla_engine->isRunning())
  302. qCritical("CarlaBackendStandalone::get_parameter_info(%i, %i) - could not find plugin", plugin_id, parameter_id);
  303. return &info;
  304. }
  305. const ScalePointInfo* get_parameter_scalepoint_info(unsigned short plugin_id, quint32 parameter_id, quint32 scalepoint_id)
  306. {
  307. qDebug("CarlaBackendStandalone::get_parameter_scalepoint_info(%i, %i, %i)", plugin_id, parameter_id, scalepoint_id);
  308. static ScalePointInfo info;
  309. if (info.label)
  310. {
  311. free((void*)info.label);
  312. info.label = nullptr;
  313. }
  314. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  315. if (plugin)
  316. {
  317. if (parameter_id < plugin->parameterCount())
  318. {
  319. if (scalepoint_id < plugin->parameterScalePointCount(parameter_id))
  320. {
  321. char buf_str[STR_MAX] = { 0 };
  322. info.value = plugin->getParameterScalePointValue(parameter_id, scalepoint_id);
  323. plugin->getParameterScalePointLabel(parameter_id, scalepoint_id, buf_str);
  324. info.label = strdup(buf_str);
  325. }
  326. else
  327. qCritical("CarlaBackendStandalone::get_parameter_scalepoint_info(%i, %i, %i) - scalepoint_id out of bounds", plugin_id, parameter_id, scalepoint_id);
  328. }
  329. else
  330. qCritical("CarlaBackendStandalone::get_parameter_scalepoint_info(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, parameter_id);
  331. return &info;
  332. }
  333. if (carla_engine->isRunning())
  334. qCritical("CarlaBackendStandalone::get_parameter_scalepoint_info(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, scalepoint_id);
  335. return &info;
  336. }
  337. const GuiInfo* get_gui_info(unsigned short plugin_id)
  338. {
  339. qDebug("CarlaBackendStandalone::get_gui_info(%i)", plugin_id);
  340. static GuiInfo info;
  341. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  342. if (plugin)
  343. {
  344. plugin->getGuiInfo(&info.type, &info.resizable);
  345. return &info;
  346. }
  347. qCritical("CarlaBackendStandalone::get_gui_info(%i) - could not find plugin", plugin_id);
  348. return &info;
  349. }
  350. // -------------------------------------------------------------------------------------------------------------------
  351. const CarlaBackend::ParameterData* get_parameter_data(unsigned short plugin_id, quint32 parameter_id)
  352. {
  353. qDebug("CarlaBackendStandalone::get_parameter_data(%i, %i)", plugin_id, parameter_id);
  354. static CarlaBackend::ParameterData data;
  355. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  356. if (plugin)
  357. {
  358. if (parameter_id < plugin->parameterCount())
  359. return plugin->parameterData(parameter_id);
  360. qCritical("CarlaBackendStandalone::get_parameter_data(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  361. return &data;
  362. }
  363. qCritical("CarlaBackendStandalone::get_parameter_data(%i, %i) - could not find plugin", plugin_id, parameter_id);
  364. return &data;
  365. }
  366. const CarlaBackend::ParameterRanges* get_parameter_ranges(unsigned short plugin_id, quint32 parameter_id)
  367. {
  368. qDebug("CarlaBackendStandalone::get_parameter_ranges(%i, %i)", plugin_id, parameter_id);
  369. static CarlaBackend::ParameterRanges ranges;
  370. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  371. if (plugin)
  372. {
  373. if (parameter_id < plugin->parameterCount())
  374. return plugin->parameterRanges(parameter_id);
  375. qCritical("CarlaBackendStandalone::get_parameter_ranges(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  376. return &ranges;
  377. }
  378. qCritical("CarlaBackendStandalone::get_parameter_ranges(%i, %i) - could not find plugin", plugin_id, parameter_id);
  379. return &ranges;
  380. }
  381. const CarlaBackend::midi_program_t* get_midi_program_data(unsigned short plugin_id, quint32 midi_program_id)
  382. {
  383. qDebug("CarlaBackendStandalone::get_midi_program_data(%i, %i)", plugin_id, midi_program_id);
  384. static CarlaBackend::midi_program_t data;
  385. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  386. if (plugin)
  387. {
  388. if (midi_program_id < plugin->midiProgramCount())
  389. return plugin->midiProgramData(midi_program_id);
  390. qCritical("CarlaBackendStandalone::get_midi_program_data(%i, %i) - midi_program_id out of bounds", plugin_id, midi_program_id);
  391. return &data;
  392. }
  393. qCritical("CarlaBackendStandalone::get_midi_program_data(%i, %i) - could not find plugin", plugin_id, midi_program_id);
  394. return &data;
  395. }
  396. const CarlaBackend::CustomData* get_custom_data(unsigned short plugin_id, quint32 custom_data_id)
  397. {
  398. qDebug("CarlaBackendStandalone::get_custom_data(%i, %i)", plugin_id, custom_data_id);
  399. static CarlaBackend::CustomData data;
  400. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  401. if (plugin)
  402. {
  403. if (custom_data_id < plugin->customDataCount())
  404. return plugin->customData(custom_data_id);
  405. qCritical("CarlaBackendStandalone::get_custom_data(%i, %i) - custom_data_id out of bounds", plugin_id, custom_data_id);
  406. return &data;
  407. }
  408. qCritical("CarlaBackendStandalone::get_custom_data(%i, %i) - could not find plugin", plugin_id, custom_data_id);
  409. return &data;
  410. }
  411. const char* get_chunk_data(unsigned short plugin_id)
  412. {
  413. qDebug("CarlaBackendStandalone::get_chunk_data(%i)", plugin_id);
  414. static const char* chunk_data = nullptr;
  415. if (chunk_data)
  416. {
  417. free((void*)chunk_data);
  418. chunk_data = nullptr;
  419. }
  420. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  421. if (plugin)
  422. {
  423. if (plugin->hints() & CarlaBackend::PLUGIN_USES_CHUNKS)
  424. {
  425. void* data = nullptr;
  426. int32_t data_size = plugin->chunkData(&data);
  427. if (data && data_size >= 4)
  428. {
  429. QByteArray chunk((const char*)data, data_size);
  430. chunk_data = strdup(chunk.toBase64().data());
  431. }
  432. else
  433. qCritical("CarlaBackendStandalone::get_chunk_data(%i) - got invalid chunk data", plugin_id);
  434. }
  435. else
  436. qCritical("CarlaBackendStandalone::get_chunk_data(%i) - plugin does not support chunks", plugin_id);
  437. return chunk_data;
  438. }
  439. if (carla_engine->isRunning())
  440. qCritical("CarlaBackendStandalone::get_chunk_data(%i) - could not find plugin", plugin_id);
  441. return nullptr;
  442. }
  443. // -------------------------------------------------------------------------------------------------------------------
  444. uint32_t get_parameter_count(unsigned short plugin_id)
  445. {
  446. qDebug("CarlaBackendStandalone::get_parameter_count(%i)", plugin_id);
  447. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  448. if (plugin)
  449. return plugin->parameterCount();
  450. qCritical("CarlaBackendStandalone::get_parameter_count(%i) - could not find plugin", plugin_id);
  451. return 0;
  452. }
  453. uint32_t get_program_count(unsigned short plugin_id)
  454. {
  455. qDebug("CarlaBackendStandalone::get_program_count(%i)", plugin_id);
  456. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  457. if (plugin)
  458. return plugin->programCount();
  459. qCritical("CarlaBackendStandalone::get_program_count(%i) - could not find plugin", plugin_id);
  460. return 0;
  461. }
  462. uint32_t get_midi_program_count(unsigned short plugin_id)
  463. {
  464. qDebug("CarlaBackendStandalone::get_midi_program_count(%i)", plugin_id);
  465. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  466. if (plugin)
  467. return plugin->midiProgramCount();
  468. qCritical("CarlaBackendStandalone::get_midi_program_count(%i) - could not find plugin", plugin_id);
  469. return 0;
  470. }
  471. uint32_t get_custom_data_count(unsigned short plugin_id)
  472. {
  473. qDebug("CarlaBackendStandalone::get_custom_data_count(%i)", plugin_id);
  474. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  475. if (plugin)
  476. return plugin->customDataCount();
  477. qCritical("CarlaBackendStandalone::get_custom_data_count(%i) - could not find plugin", plugin_id);
  478. return 0;
  479. }
  480. // -------------------------------------------------------------------------------------------------------------------
  481. const char* get_parameter_text(unsigned short plugin_id, quint32 parameter_id)
  482. {
  483. qDebug("CarlaBackendStandalone::get_parameter_text(%i, %i)", plugin_id, parameter_id);
  484. static char buf_text[STR_MAX] = { 0 };
  485. memset(buf_text, 0, sizeof(char)*STR_MAX);
  486. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  487. if (plugin)
  488. {
  489. if (parameter_id < plugin->parameterCount())
  490. {
  491. plugin->getParameterText(parameter_id, buf_text);
  492. return buf_text;
  493. }
  494. qCritical("CarlaBackendStandalone::get_parameter_text(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  495. return nullptr;
  496. }
  497. if (carla_engine->isRunning())
  498. qCritical("CarlaBackendStandalone::get_parameter_text(%i, %i) - could not find plugin", plugin_id, parameter_id);
  499. return nullptr;
  500. }
  501. const char* get_program_name(unsigned short plugin_id, quint32 program_id)
  502. {
  503. qDebug("CarlaBackendStandalone::get_program_name(%i, %i)", plugin_id, program_id);
  504. static const char* program_name = nullptr;
  505. if (program_name)
  506. {
  507. free((void*)program_name);
  508. program_name = nullptr;
  509. }
  510. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  511. if (plugin)
  512. {
  513. if (program_id < plugin->programCount())
  514. {
  515. char buf_str[STR_MAX] = { 0 };
  516. plugin->getProgramName(program_id, buf_str);
  517. program_name = strdup(buf_str);
  518. return program_name;
  519. }
  520. qCritical("CarlaBackendStandalone::get_program_name(%i, %i) - program_id out of bounds", plugin_id, program_id);
  521. return nullptr;
  522. }
  523. if (carla_engine->isRunning())
  524. qCritical("CarlaBackendStandalone::get_program_name(%i, %i) - could not find plugin", plugin_id, program_id);
  525. return nullptr;
  526. }
  527. const char* get_midi_program_name(unsigned short plugin_id, quint32 midi_program_id)
  528. {
  529. qDebug("CarlaBackendStandalone::get_midi_program_name(%i, %i)", plugin_id, midi_program_id);
  530. static const char* midi_program_name = nullptr;
  531. if (midi_program_name)
  532. free((void*)midi_program_name);
  533. midi_program_name = nullptr;
  534. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  535. if (plugin)
  536. {
  537. if (midi_program_id < plugin->midiProgramCount())
  538. {
  539. char buf_str[STR_MAX] = { 0 };
  540. plugin->getMidiProgramName(midi_program_id, buf_str);
  541. midi_program_name = strdup(buf_str);
  542. return midi_program_name;
  543. }
  544. qCritical("CarlaBackendStandalone::get_midi_program_name(%i, %i) - program_id out of bounds", plugin_id, midi_program_id);
  545. return nullptr;
  546. }
  547. if (carla_engine->isRunning())
  548. qCritical("CarlaBackendStandalone::get_midi_program_name(%i, %i) - could not find plugin", plugin_id, midi_program_id);
  549. return nullptr;
  550. }
  551. const char* get_real_plugin_name(unsigned short plugin_id)
  552. {
  553. qDebug("CarlaBackendStandalone::get_real_plugin_name(%i)", plugin_id);
  554. static const char* real_plugin_name = nullptr;
  555. if (real_plugin_name)
  556. {
  557. free((void*)real_plugin_name);
  558. real_plugin_name = nullptr;
  559. }
  560. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  561. if (plugin)
  562. {
  563. char buf_str[STR_MAX] = { 0 };
  564. plugin->getRealName(buf_str);
  565. real_plugin_name = strdup(buf_str);
  566. return real_plugin_name;
  567. }
  568. if (carla_engine->isRunning())
  569. qCritical("CarlaBackendStandalone::get_real_plugin_name(%i) - could not find plugin", plugin_id);
  570. return real_plugin_name;
  571. }
  572. // -------------------------------------------------------------------------------------------------------------------
  573. qint32 get_current_program_index(unsigned short plugin_id)
  574. {
  575. qDebug("CarlaBackendStandalone::get_current_program_index(%i)", plugin_id);
  576. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  577. if (plugin)
  578. return plugin->currentProgram();
  579. qCritical("CarlaBackendStandalone::get_current_program_index(%i) - could not find plugin", plugin_id);
  580. return -1;
  581. }
  582. qint32 get_current_midi_program_index(unsigned short plugin_id)
  583. {
  584. qDebug("CarlaBackendStandalone::get_current_midi_program_index(%i)", plugin_id);
  585. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  586. if (plugin)
  587. return plugin->currentMidiProgram();
  588. qCritical("CarlaBackendStandalone::get_current_midi_program_index(%i) - could not find plugin", plugin_id);
  589. return -1;
  590. }
  591. // -------------------------------------------------------------------------------------------------------------------
  592. double get_default_parameter_value(unsigned short plugin_id, quint32 parameter_id)
  593. {
  594. qDebug("CarlaBackendStandalone::get_default_parameter_value(%i, %i)", plugin_id, parameter_id);
  595. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  596. if (plugin)
  597. {
  598. if (parameter_id < plugin->parameterCount())
  599. return plugin->parameterRanges(parameter_id)->def;
  600. qCritical("CarlaBackendStandalone::get_default_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  601. return 0.0;
  602. }
  603. qCritical("CarlaBackendStandalone::get_default_parameter_value(%i, %i) - could not find plugin", plugin_id, parameter_id);
  604. return 0.0;
  605. }
  606. double get_current_parameter_value(unsigned short plugin_id, quint32 parameter_id)
  607. {
  608. qDebug("CarlaBackendStandalone::get_current_parameter_value(%i, %i)", plugin_id, parameter_id);
  609. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  610. if (plugin)
  611. {
  612. if (parameter_id < plugin->parameterCount())
  613. return plugin->getParameterValue(parameter_id);
  614. qCritical("CarlaBackendStandalone::get_current_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  615. return 0.0;
  616. }
  617. qCritical("CarlaBackendStandalone::get_current_parameter_value(%i, %i) - could not find plugin", plugin_id, parameter_id);
  618. return 0.0;
  619. }
  620. // -------------------------------------------------------------------------------------------------------------------
  621. double get_input_peak_value(unsigned short plugin_id, unsigned short port_id)
  622. {
  623. if (plugin_id < CarlaBackend::MAX_PLUGINS && (port_id == 1 || port_id == 2))
  624. return carla_engine->getInputPeak(plugin_id, port_id-1);
  625. qCritical("CarlaBackendStandalone::get_input_peak_value(%i, %i) - invalid plugin or port value", plugin_id, port_id);
  626. return 0.0;
  627. }
  628. double get_output_peak_value(unsigned short plugin_id, unsigned short port_id)
  629. {
  630. if (plugin_id < CarlaBackend::MAX_PLUGINS && (port_id == 1 || port_id == 2))
  631. return carla_engine->getOutputPeak(plugin_id, port_id-1);
  632. qCritical("CarlaBackendStandalone::get_output_peak_value(%i, %i) - invalid plugin or port value", plugin_id, port_id);
  633. return 0.0;
  634. }
  635. // -------------------------------------------------------------------------------------------------------------------
  636. void set_active(unsigned short plugin_id, bool onoff)
  637. {
  638. qDebug("CarlaBackendStandalone::set_active(%i, %s)", plugin_id, bool2str(onoff));
  639. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  640. if (plugin)
  641. return plugin->setActive(onoff, true, false);
  642. qCritical("CarlaBackendStandalone::set_active(%i, %s) - could not find plugin", plugin_id, bool2str(onoff));
  643. }
  644. void set_drywet(unsigned short plugin_id, double value)
  645. {
  646. qDebug("CarlaBackendStandalone::set_drywet(%i, %g)", plugin_id, value);
  647. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  648. if (plugin)
  649. return plugin->setDryWet(value, true, false);
  650. qCritical("CarlaBackendStandalone::set_drywet(%i, %g) - could not find plugin", plugin_id, value);
  651. }
  652. void set_volume(unsigned short plugin_id, double value)
  653. {
  654. qDebug("CarlaBackendStandalone::set_volume(%i, %g)", plugin_id, value);
  655. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  656. if (plugin)
  657. return plugin->setVolume(value, true, false);
  658. qCritical("CarlaBackendStandalone::set_volume(%i, %g) - could not find plugin", plugin_id, value);
  659. }
  660. void set_balance_left(unsigned short plugin_id, double value)
  661. {
  662. qDebug("CarlaBackendStandalone::set_balance_left(%i, %g)", plugin_id, value);
  663. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  664. if (plugin)
  665. return plugin->setBalanceLeft(value, true, false);
  666. qCritical("CarlaBackendStandalone::set_balance_left(%i, %g) - could not find plugin", plugin_id, value);
  667. }
  668. void set_balance_right(unsigned short plugin_id, double value)
  669. {
  670. qDebug("CarlaBackendStandalone::set_balance_right(%i, %g)", plugin_id, value);
  671. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  672. if (plugin)
  673. return plugin->setBalanceRight(value, true, false);
  674. qCritical("CarlaBackendStandalone::set_balance_right(%i, %g) - could not find plugin", plugin_id, value);
  675. }
  676. // -------------------------------------------------------------------------------------------------------------------
  677. void set_parameter_value(unsigned short plugin_id, quint32 parameter_id, double value)
  678. {
  679. qDebug("CarlaBackendStandalone::set_parameter_value(%i, %i, %g)", plugin_id, parameter_id, value);
  680. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  681. if (plugin)
  682. {
  683. if (parameter_id < plugin->parameterCount())
  684. return plugin->setParameterValue(parameter_id, value, true, true, false);
  685. qCritical("CarlaBackendStandalone::set_parameter_value(%i, %i, %g) - parameter_id out of bounds", plugin_id, parameter_id, value);
  686. return;
  687. }
  688. qCritical("CarlaBackendStandalone::set_parameter_value(%i, %i, %g) - could not find plugin", plugin_id, parameter_id, value);
  689. }
  690. void set_parameter_midi_channel(unsigned short plugin_id, quint32 parameter_id, quint8 channel)
  691. {
  692. qDebug("CarlaBackendStandalone::set_parameter_midi_channel(%i, %i, %i)", plugin_id, parameter_id, channel);
  693. if (channel > 15)
  694. {
  695. qCritical("CarlaBackendStandalone::set_parameter_midi_channel(%i, %i, %i) - invalid channel number", plugin_id, parameter_id, channel);
  696. return;
  697. }
  698. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  699. if (plugin)
  700. {
  701. if (parameter_id < plugin->parameterCount())
  702. return plugin->setParameterMidiChannel(parameter_id, channel);
  703. qCritical("CarlaBackendStandalone::set_parameter_midi_channel(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, channel);
  704. return;
  705. }
  706. qCritical("CarlaBackendStandalone::set_parameter_midi_channel(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, channel);
  707. }
  708. void set_parameter_midi_cc(unsigned short plugin_id, quint32 parameter_id, int16_t midi_cc)
  709. {
  710. qDebug("CarlaBackendStandalone::set_parameter_midi_cc(%i, %i, %i)", plugin_id, parameter_id, midi_cc);
  711. if (midi_cc < -1)
  712. {
  713. midi_cc = -1;
  714. }
  715. else if (midi_cc > 0x5F) // 95
  716. {
  717. qCritical("CarlaBackendStandalone::set_parameter_midi_cc(%i, %i, %i) - invalid midi_cc number", plugin_id, parameter_id, midi_cc);
  718. return;
  719. }
  720. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  721. if (plugin)
  722. {
  723. if (parameter_id < plugin->parameterCount())
  724. return plugin->setParameterMidiCC(parameter_id, midi_cc);
  725. qCritical("CarlaBackendStandalone::set_parameter_midi_cc(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, midi_cc);
  726. return;
  727. }
  728. qCritical("CarlaBackendStandalone::set_parameter_midi_cc(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, midi_cc);
  729. }
  730. void set_program(unsigned short plugin_id, quint32 program_id)
  731. {
  732. qDebug("CarlaBackendStandalone::set_program(%i, %i)", plugin_id, program_id);
  733. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  734. if (plugin)
  735. {
  736. if (program_id < plugin->programCount())
  737. return plugin->setProgram(program_id, true, true, false, true);
  738. qCritical("CarlaBackendStandalone::set_program(%i, %i) - program_id out of bounds", plugin_id, program_id);
  739. return;
  740. }
  741. qCritical("CarlaBackendStandalone::set_program(%i, %i) - could not find plugin", plugin_id, program_id);
  742. }
  743. void set_midi_program(unsigned short plugin_id, quint32 midi_program_id)
  744. {
  745. qDebug("CarlaBackendStandalone::set_midi_program(%i, %i)", plugin_id, midi_program_id);
  746. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  747. if (plugin)
  748. {
  749. if (midi_program_id < plugin->midiProgramCount())
  750. return plugin->setMidiProgram(midi_program_id, true, true, false, true);
  751. qCritical("CarlaBackendStandalone::set_midi_program(%i, %i) - midi_program_id out of bounds", plugin_id, midi_program_id);
  752. return;
  753. }
  754. qCritical("CarlaBackendStandalone::set_midi_program(%i, %i) - could not find plugin", plugin_id, midi_program_id);
  755. }
  756. // -------------------------------------------------------------------------------------------------------------------
  757. void set_custom_data(unsigned short plugin_id, CarlaBackend::CustomDataType type, const char* key, const char* value)
  758. {
  759. qDebug("CarlaBackendStandalone::set_custom_data(%i, %i, \"%s\", \"%s\")", plugin_id, type, key, value);
  760. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  761. if (plugin)
  762. return plugin->setCustomData(type, key, value, true);
  763. qCritical("CarlaBackendStandalone::set_custom_data(%i, %i, \"%s\", \"%s\") - could not find plugin", plugin_id, type, key, value);
  764. }
  765. void set_chunk_data(unsigned short plugin_id, const char* chunk_data)
  766. {
  767. qDebug("CarlaBackendStandalone::set_chunk_data(%i, \"%s\")", plugin_id, chunk_data);
  768. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  769. if (plugin)
  770. {
  771. if (plugin->hints() & CarlaBackend::PLUGIN_USES_CHUNKS)
  772. return plugin->setChunkData(chunk_data);
  773. qCritical("CarlaBackendStandalone::set_chunk_data(%i, \"%s\") - plugin does not support chunks", plugin_id, chunk_data);
  774. return;
  775. }
  776. qCritical("CarlaBackendStandalone::set_chunk_data(%i, \"%s\") - could not find plugin", plugin_id, chunk_data);
  777. }
  778. void set_gui_data(unsigned short plugin_id, int data, quintptr gui_addr)
  779. {
  780. qDebug("CarlaBackendStandalone::set_gui_data(%i, %i, " P_UINTPTR ")", plugin_id, data, gui_addr);
  781. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  782. if (plugin)
  783. {
  784. #ifdef __WINE__
  785. plugin->setGuiData(data, (HWND)gui_addr);
  786. #else
  787. plugin->setGuiData(data, (QDialog*)CarlaBackend::getPointer(gui_addr));
  788. #endif
  789. return;
  790. }
  791. qCritical("CarlaBackendStandalone::set_gui_data(%i, %i, " P_UINTPTR ") - could not find plugin", plugin_id, data, gui_addr);
  792. }
  793. // -------------------------------------------------------------------------------------------------------------------
  794. void show_gui(unsigned short plugin_id, bool yesno)
  795. {
  796. qDebug("CarlaBackendStandalone::show_gui(%i, %s)", plugin_id, bool2str(yesno));
  797. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  798. if (plugin)
  799. return plugin->showGui(yesno);
  800. qCritical("CarlaBackendStandalone::show_gui(%i, %s) - could not find plugin", plugin_id, bool2str(yesno));
  801. }
  802. void idle_guis()
  803. {
  804. carla_engine->idlePluginGuis();
  805. }
  806. // -------------------------------------------------------------------------------------------------------------------
  807. void send_midi_note(unsigned short plugin_id, quint8 channel, quint8 note, quint8 velocity)
  808. {
  809. qDebug("CarlaBackendStandalone::send_midi_note(%i, %i, %i, %i)", plugin_id, channel, note, velocity);
  810. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  811. if (plugin)
  812. return plugin->sendMidiSingleNote(channel, note, velocity, true, true, false);
  813. qCritical("CarlaBackendStandalone::send_midi_note(%i, %i, %i, %i) - could not find plugin", plugin_id, channel, note, velocity);
  814. }
  815. void prepare_for_save(unsigned short plugin_id)
  816. {
  817. qDebug("CarlaBackendStandalone::prepare_for_save(%i)", plugin_id);
  818. CarlaBackend::CarlaPlugin* const plugin = carla_engine->getPlugin(plugin_id);
  819. if (plugin)
  820. return plugin->prepareForSave();
  821. qCritical("CarlaBackendStandalone::prepare_for_save(%i) - could not find plugin", plugin_id);
  822. }
  823. // -------------------------------------------------------------------------------------------------------------------
  824. quint32 get_buffer_size()
  825. {
  826. qDebug("CarlaBackendStandalone::get_buffer_size()");
  827. return carla_engine->getBufferSize();
  828. }
  829. double get_sample_rate()
  830. {
  831. qDebug("CarlaBackendStandalone::get_sample_rate()");
  832. return carla_engine->getSampleRate();
  833. }
  834. // -------------------------------------------------------------------------------------------------------------------
  835. const char* get_last_error()
  836. {
  837. return CarlaBackend::getLastError();
  838. }
  839. const char* get_host_osc_url()
  840. {
  841. qDebug("CarlaBackendStandalone::get_host_osc_url()");
  842. return carla_engine->getOscServerPath();
  843. }
  844. // -------------------------------------------------------------------------------------------------------------------
  845. void set_callback_function(CarlaBackend::CallbackFunc func)
  846. {
  847. qDebug("CarlaBackendStandalone::set_callback_function(%p)", func);
  848. carla_func = func;
  849. if (carla_engine)
  850. carla_engine->setCallback(func);
  851. }
  852. void set_option(CarlaBackend::OptionsType option, int value, const char* valueStr)
  853. {
  854. qDebug("CarlaBackendStandalone::set_option(%s, %i, \"%s\")", CarlaBackend::OptionsType2str(option), value, valueStr);
  855. CarlaBackend::setOption(option, value, valueStr);
  856. }
  857. // -------------------------------------------------------------------------------------------------------------------
  858. #ifdef QTCREATOR_TEST
  859. #include <QtGui/QApplication>
  860. #include <QtGui/QDialog>
  861. QDialog* vstGui = nullptr;
  862. void main_callback(CarlaBackend::CallbackType action, unsigned short pluginId, int value1, int value2, double value3)
  863. {
  864. switch (action)
  865. {
  866. case CarlaBackend::CALLBACK_SHOW_GUI:
  867. if (vstGui && ! value1)
  868. vstGui->close();
  869. break;
  870. case CarlaBackend::CALLBACK_RESIZE_GUI:
  871. vstGui->setFixedSize(value1, value2);
  872. break;
  873. default:
  874. break;
  875. }
  876. Q_UNUSED(pluginId);
  877. Q_UNUSED(value3);
  878. }
  879. void run_tests_standalone(short idMax)
  880. {
  881. for (short id = 0; id <= idMax; id++)
  882. {
  883. qDebug("------------------- TEST @%i: non-parameter calls --------------------", id);
  884. get_plugin_info(id);
  885. get_audio_port_count_info(id);
  886. get_midi_port_count_info(id);
  887. get_parameter_count_info(id);
  888. get_gui_info(id);
  889. get_chunk_data(id);
  890. get_parameter_count(id);
  891. get_program_count(id);
  892. get_midi_program_count(id);
  893. get_custom_data_count(id);
  894. get_real_plugin_name(id);
  895. get_current_program_index(id);
  896. get_current_midi_program_index(id);
  897. qDebug("------------------- TEST @%i: parameter calls [-1] --------------------", id);
  898. get_parameter_info(id, -1);
  899. get_parameter_scalepoint_info(id, -1, -1);
  900. get_parameter_data(id, -1);
  901. get_parameter_ranges(id, -1);
  902. get_midi_program_data(id, -1);
  903. get_custom_data(id, -1);
  904. get_parameter_text(id, -1);
  905. get_program_name(id, -1);
  906. get_midi_program_name(id, -1);
  907. get_default_parameter_value(id, -1);
  908. get_current_parameter_value(id, -1);
  909. get_input_peak_value(id, -1);
  910. get_output_peak_value(id, -1);
  911. qDebug("------------------- TEST @%i: parameter calls [0] --------------------", id);
  912. get_parameter_info(id, 0);
  913. get_parameter_scalepoint_info(id, 0, -1);
  914. get_parameter_scalepoint_info(id, 0, 0);
  915. get_parameter_data(id, 0);
  916. get_parameter_ranges(id, 0);
  917. get_midi_program_data(id, 0);
  918. get_custom_data(id, 0);
  919. get_parameter_text(id, 0);
  920. get_program_name(id, 0);
  921. get_midi_program_name(id, 0);
  922. get_default_parameter_value(id, 0);
  923. get_current_parameter_value(id, 0);
  924. get_input_peak_value(id, 0);
  925. get_input_peak_value(id, 1);
  926. get_input_peak_value(id, 2);
  927. get_output_peak_value(id, 0);
  928. get_output_peak_value(id, 1);
  929. get_output_peak_value(id, 2);
  930. qDebug("------------------- TEST @%i: set internal data --------------------", id);
  931. set_active(id, false);
  932. set_active(id, true);
  933. set_active(id, true);
  934. set_drywet(id, -999);
  935. set_volume(id, -999);
  936. set_balance_left(id, -999);
  937. set_balance_right(id, 999);
  938. qDebug("------------------- TEST @%i: set parameter data [-1] --------------------", id);
  939. set_parameter_value(id, -1, -999);
  940. set_parameter_midi_channel(id, -1, -1);
  941. set_parameter_midi_cc(id, -1, -1);
  942. set_program(id, -1);
  943. set_midi_program(id, -1);
  944. qDebug("------------------- TEST @%i: set parameter data [0] --------------------", id);
  945. set_parameter_value(id, 0, -999);
  946. set_parameter_midi_channel(id, 0, -1);
  947. set_parameter_midi_channel(id, 0, 0);
  948. set_parameter_midi_cc(id, 0, -1);
  949. set_parameter_midi_cc(id, 0, 0);
  950. set_program(id, 0);
  951. set_midi_program(id, 0);
  952. qDebug("------------------- TEST @%i: set extra data --------------------", id);
  953. set_custom_data(id, CarlaBackend::CUSTOM_DATA_INVALID, nullptr, nullptr);
  954. set_custom_data(id, CarlaBackend::CUSTOM_DATA_INVALID, "", "");
  955. set_chunk_data(id, nullptr);
  956. set_gui_data(id, 0, 0);
  957. qDebug("------------------- TEST @%i: gui stuff --------------------", id);
  958. show_gui(id, false);
  959. show_gui(id, true);
  960. show_gui(id, true);
  961. idle_guis();
  962. idle_guis();
  963. idle_guis();
  964. qDebug("------------------- TEST @%i: other --------------------", id);
  965. send_midi_note(id, -1, 0, 0);
  966. send_midi_note(id, 0, 0, 0);
  967. prepare_for_save(id);
  968. prepare_for_save(id);
  969. prepare_for_save(id);
  970. }
  971. }
  972. int main(int argc, char* argv[])
  973. {
  974. using namespace CarlaBackend;
  975. // Qt app
  976. QApplication app(argc, argv);
  977. // Qt gui (for vst)
  978. vstGui = new QDialog(nullptr);
  979. // set callback and options
  980. set_callback_function(main_callback);
  981. set_option(OPTION_PREFER_UI_BRIDGES, 0, nullptr);
  982. //set_option(OPTION_PROCESS_MODE, PROCESS_MODE_CONTINUOUS_RACK, nullptr);
  983. // start engine
  984. if (! engine_init("JACK", "carla_demo"))
  985. {
  986. qCritical("failed to start backend engine, reason:\n%s", get_last_error());
  987. delete vstGui;
  988. return 1;
  989. }
  990. short id_ladspa = add_plugin(BINARY_NATIVE, PLUGIN_LADSPA, "/usr/lib/ladspa/LEET_eqbw2x2.so", "LADSPA plug name, test long name - "
  991. "------- name ------------ name2 ----------- name3 ------------ name4 ------------ name5 ---------- name6", "leet_equalizer_bw2x2", nullptr);
  992. short id_dssi = add_plugin(BINARY_NATIVE, PLUGIN_DSSI, "/usr/lib/dssi/fluidsynth-dssi.so", "DSSI pname, short-utf8 _ \xAE", "FluidSynth-DSSI", (void*)"/usr/lib/dssi/fluidsynth-dssi/FluidSynth-DSSI_gtk");
  993. //short id_lv2 = add_plugin(BINARY_NATIVE, PLUGIN_LV2, "FILENAME", "HAHA name!!!", "http://studionumbersix.com/foo/lv2/yc20", nullptr);
  994. //short id_vst = add_plugin(BINARY_NATIVE, PLUGIN_LV2, "FILENAME", "HAHA name!!!", "http://studionumbersix.com/foo/lv2/yc20", nullptr);
  995. if (id_ladspa < 0 || id_dssi < 0)
  996. {
  997. qCritical("failed to start load plugins, reason:\n%s", get_last_error());
  998. delete vstGui;
  999. return 1;
  1000. }
  1001. //const GuiInfo* const guiInfo = get_gui_info(id);
  1002. //if (guiInfo->type == CarlaBackend::GUI_INTERNAL_QT4 || guiInfo->type == CarlaBackend::GUI_INTERNAL_X11)
  1003. //{
  1004. // set_gui_data(id, 0, (quintptr)gui);
  1005. //gui->show();
  1006. //}
  1007. // activate
  1008. set_active(id_ladspa, true);
  1009. set_active(id_dssi, true);
  1010. // start guis
  1011. show_gui(id_dssi, true);
  1012. carla_sleep(1);
  1013. // do tests
  1014. run_tests_standalone(id_dssi+1);
  1015. // lock
  1016. app.exec();
  1017. remove_plugin(id_ladspa);
  1018. remove_plugin(id_dssi);
  1019. engine_close();
  1020. return 0;
  1021. }
  1022. #endif