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.

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