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.

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