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.

1298 lines
37KB

  1. /*
  2. * JACK Backend code for Carla
  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.h"
  18. #include "carla_engine.h"
  19. #include "carla_plugin.h"
  20. #include "carla_threads.h"
  21. // plugin specific
  22. short add_plugin_ladspa(const char* filename, const char* label, const void* extra_stuff);
  23. short add_plugin_dssi(const char* filename, const char* label, const void* extra_stuff);
  24. short add_plugin_lv2(const char* filename, const char* label);
  25. short add_plugin_vst(const char* filename, const char* label);
  26. short add_plugin_sf2(const char* filename, const char* label);
  27. #ifndef BUILD_BRIDGE
  28. //short add_plugin_bridge(CarlaBackend::BinaryType btype, CarlaBackend::PluginType ptype, const char* filename, const char* label, void* extra_stuff);
  29. #endif
  30. CarlaEngine carla_engine;
  31. CarlaCheckThread carla_check_thread;
  32. // -------------------------------------------------------------------------------------------------------------------
  33. // Exported symbols (API)
  34. CARLA_BACKEND_START_NAMESPACE
  35. bool engine_init(const char* client_name)
  36. {
  37. qDebug("carla_backend_init(%s)", client_name);
  38. bool started = carla_engine.init(client_name);
  39. if (started)
  40. {
  41. osc_init(nullptr);
  42. carla_check_thread.start(QThread::HighPriority);
  43. set_last_error("no error");
  44. }
  45. return started;
  46. }
  47. bool engine_close()
  48. {
  49. qDebug("carla_backend_close()");
  50. bool closed = carla_engine.close();
  51. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  52. {
  53. if (CarlaPlugins[i])
  54. remove_plugin(i);
  55. }
  56. carla_check_thread.stopNow();
  57. carla_check_thread.quit();
  58. if (carla_check_thread.wait(500) == false)
  59. {
  60. qWarning("Failed to properly stop global check thread");
  61. carla_check_thread.terminate();
  62. }
  63. osc_global_send_exit();
  64. osc_close();
  65. // cleanup static data
  66. get_plugin_info(0);
  67. get_parameter_info(0, 0);
  68. get_scalepoint_info(0, 0, 0);
  69. get_chunk_data(0);
  70. get_program_name(0, 0);
  71. get_midi_program_name(0, 0);
  72. get_real_plugin_name(0);
  73. set_last_error(nullptr);
  74. if (carla_options.bridge_unix32)
  75. free((void*)carla_options.bridge_unix32);
  76. if (carla_options.bridge_unix64)
  77. free((void*)carla_options.bridge_unix64);
  78. if (carla_options.bridge_win32)
  79. free((void*)carla_options.bridge_win32);
  80. if (carla_options.bridge_win64)
  81. free((void*)carla_options.bridge_win64);
  82. if (carla_options.bridge_lv2gtk2)
  83. free((void*)carla_options.bridge_lv2gtk2);
  84. if (carla_options.bridge_lv2qt4)
  85. free((void*)carla_options.bridge_lv2qt4);
  86. if (carla_options.bridge_lv2x11)
  87. free((void*)carla_options.bridge_lv2x11);
  88. carla_options.bridge_unix32 = nullptr;
  89. carla_options.bridge_unix64 = nullptr;
  90. carla_options.bridge_win32 = nullptr;
  91. carla_options.bridge_win64 = nullptr;
  92. carla_options.bridge_lv2gtk2 = nullptr;
  93. carla_options.bridge_lv2qt4 = nullptr;
  94. carla_options.bridge_lv2x11 = nullptr;
  95. return closed;
  96. }
  97. short add_plugin(BinaryType btype, PluginType ptype, const char* filename, const char* label, void* extra_stuff)
  98. {
  99. qDebug("add_plugin(%i, %i, %s, %s, %p)", btype, ptype, filename, label, extra_stuff);
  100. #if 0 //ndef BUILD_BRIDGE
  101. if (btype != BINARY_NATIVE)
  102. {
  103. if (carla_options.global_jack_client)
  104. {
  105. set_last_error("Cannot use bridged plugins while in global client mode");
  106. return -1;
  107. }
  108. else
  109. return add_plugin_bridge(btype, ptype, filename, label, extra_stuff);
  110. }
  111. #endif
  112. switch (ptype)
  113. {
  114. case PLUGIN_LADSPA:
  115. return add_plugin_ladspa(filename, label, extra_stuff);
  116. case PLUGIN_DSSI:
  117. return add_plugin_dssi(filename, label, extra_stuff);
  118. case PLUGIN_LV2:
  119. return add_plugin_lv2(filename, label);
  120. case PLUGIN_VST:
  121. return add_plugin_vst(filename, label);
  122. case PLUGIN_SF2:
  123. return add_plugin_sf2(filename, label);
  124. default:
  125. set_last_error("Unknown plugin type");
  126. return -1;
  127. }
  128. }
  129. bool remove_plugin(unsigned short plugin_id)
  130. {
  131. qDebug("remove_plugin(%i)", plugin_id);
  132. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  133. {
  134. CarlaPlugin* plugin = CarlaPlugins[i];
  135. if (plugin && plugin->id() == plugin_id)
  136. {
  137. osc_global_send_remove_plugin(plugin->id());
  138. carla_proc_lock();
  139. plugin->set_enabled(false);
  140. carla_proc_unlock();
  141. if (is_engine_running() && carla_check_thread.isRunning())
  142. carla_check_thread.stopNow();
  143. delete plugin;
  144. CarlaPlugins[i] = nullptr;
  145. unique_names[i] = nullptr;
  146. if (is_engine_running())
  147. carla_check_thread.start(QThread::HighPriority);
  148. return true;
  149. }
  150. }
  151. qCritical("remove_plugin(%i) - could not find plugin", plugin_id);
  152. set_last_error("Could not find plugin to remove");
  153. return false;
  154. }
  155. PluginInfo* get_plugin_info(unsigned short plugin_id)
  156. {
  157. qDebug("get_plugin_info(%i)", plugin_id);
  158. static PluginInfo info = { false, PLUGIN_NONE, PLUGIN_CATEGORY_NONE, 0x0, nullptr, nullptr, nullptr, nullptr, nullptr, 0 };
  159. if (info.valid)
  160. {
  161. free((void*)info.label);
  162. free((void*)info.maker);
  163. free((void*)info.copyright);
  164. }
  165. info.valid = false;
  166. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  167. {
  168. CarlaPlugin* plugin = CarlaPlugins[i];
  169. if (plugin && plugin->id() == plugin_id)
  170. {
  171. char buf_str[STR_MAX] = { 0 };
  172. info.valid = true;
  173. info.type = plugin->type();
  174. info.category = plugin->category();
  175. info.hints = plugin->hints();
  176. info.binary = plugin->filename();
  177. info.name = plugin->name();
  178. info.unique_id = plugin->unique_id();
  179. plugin->get_label(buf_str);
  180. info.label = strdup(buf_str);
  181. plugin->get_maker(buf_str);
  182. info.maker = strdup(buf_str);
  183. plugin->get_copyright(buf_str);
  184. info.copyright = strdup(buf_str);
  185. return &info;
  186. }
  187. }
  188. if (is_engine_running())
  189. qCritical("get_plugin_info(%i) - could not find plugin", plugin_id);
  190. return &info;
  191. }
  192. PortCountInfo* get_audio_port_count_info(unsigned short plugin_id)
  193. {
  194. qDebug("get_audio_port_count_info(%i)", plugin_id);
  195. static PortCountInfo info = { false, 0, 0, 0 };
  196. info.valid = false;
  197. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  198. {
  199. CarlaPlugin* plugin = CarlaPlugins[i];
  200. if (plugin && plugin->id() == plugin_id)
  201. {
  202. info.valid = true;
  203. info.ins = plugin->ain_count();
  204. info.outs = plugin->aout_count();
  205. info.total = info.ins + info.outs;
  206. return &info;
  207. }
  208. }
  209. qCritical("get_audio_port_count_info(%i) - could not find plugin", plugin_id);
  210. return &info;
  211. }
  212. PortCountInfo* get_midi_port_count_info(unsigned short plugin_id)
  213. {
  214. qDebug("get_midi_port_count_info(%i)", plugin_id);
  215. static PortCountInfo info = { false, 0, 0, 0 };
  216. info.valid = false;
  217. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  218. {
  219. CarlaPlugin* plugin = CarlaPlugins[i];
  220. if (plugin && plugin->id() == plugin_id)
  221. {
  222. info.valid = true;
  223. info.ins = plugin->min_count();
  224. info.outs = plugin->mout_count();
  225. info.total = info.ins + info.outs;
  226. return &info;
  227. }
  228. }
  229. qCritical("get_midi_port_count_info(%i) - could not find plugin", plugin_id);
  230. return &info;
  231. }
  232. PortCountInfo* get_parameter_count_info(unsigned short plugin_id)
  233. {
  234. qDebug("get_parameter_port_count_info(%i)", plugin_id);
  235. static PortCountInfo info = { false, 0, 0, 0 };
  236. info.valid = false;
  237. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  238. {
  239. CarlaPlugin* plugin = CarlaPlugins[i];
  240. if (plugin && plugin->id() == plugin_id)
  241. {
  242. info.valid = true;
  243. plugin->get_parameter_count_info(&info);
  244. return &info;
  245. }
  246. }
  247. qCritical("get_parameter_port_count_info(%i) - could not find plugin", plugin_id);
  248. return &info;
  249. }
  250. ParameterInfo* get_parameter_info(unsigned short plugin_id, uint32_t parameter_id)
  251. {
  252. qDebug("get_parameter_info(%i, %i)", plugin_id, parameter_id);
  253. static ParameterInfo info = { false, nullptr, nullptr, nullptr, 0 };
  254. if (info.valid)
  255. {
  256. free((void*)info.name);
  257. free((void*)info.symbol);
  258. free((void*)info.unit);
  259. }
  260. info.valid = false;
  261. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  262. {
  263. CarlaPlugin* plugin = CarlaPlugins[i];
  264. if (plugin && plugin->id() == plugin_id)
  265. {
  266. if (parameter_id < plugin->param_count())
  267. {
  268. char buf_str[STR_MAX] = { 0 };
  269. info.valid = true;
  270. info.scalepoint_count = plugin->param_scalepoint_count(parameter_id);
  271. plugin->get_parameter_name(parameter_id, buf_str);
  272. info.name = strdup(buf_str);
  273. plugin->get_parameter_symbol(parameter_id, buf_str);
  274. info.symbol = strdup(buf_str);
  275. plugin->get_parameter_unit(parameter_id, buf_str);
  276. info.unit = strdup(buf_str);
  277. }
  278. else
  279. qCritical("get_parameter_info(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  280. return &info;
  281. }
  282. }
  283. if (is_engine_running())
  284. qCritical("get_parameter_info(%i, %i) - could not find plugin", plugin_id, parameter_id);
  285. return &info;
  286. }
  287. ScalePointInfo* get_scalepoint_info(unsigned short plugin_id, uint32_t parameter_id, uint32_t scalepoint_id)
  288. {
  289. qDebug("get_scalepoint_info(%i, %i, %i)", plugin_id, parameter_id, scalepoint_id);
  290. static ScalePointInfo info = { false, 0.0, nullptr };
  291. if (info.valid)
  292. free((void*)info.label);
  293. info.valid = false;
  294. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  295. {
  296. CarlaPlugin* plugin = CarlaPlugins[i];
  297. if (plugin && plugin->id() == plugin_id)
  298. {
  299. if (parameter_id < plugin->param_count())
  300. {
  301. if (scalepoint_id < plugin->param_scalepoint_count(parameter_id))
  302. {
  303. char buf_str[STR_MAX] = { 0 };
  304. info.valid = true;
  305. info.value = plugin->get_parameter_scalepoint_value(parameter_id, scalepoint_id);
  306. plugin->get_parameter_scalepoint_label(parameter_id, scalepoint_id, buf_str);
  307. info.label = strdup(buf_str);
  308. }
  309. else
  310. qCritical("get_scalepoint_info(%i, %i, %i) - scalepoint_id out of bounds", plugin_id, parameter_id, scalepoint_id);
  311. }
  312. else
  313. qCritical("get_scalepoint_info(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, parameter_id);
  314. return &info;
  315. }
  316. }
  317. if (is_engine_running())
  318. qCritical("get_scalepoint_info(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, scalepoint_id);
  319. return &info;
  320. }
  321. MidiProgramInfo* get_midi_program_info(unsigned short plugin_id, uint32_t midi_program_id)
  322. {
  323. qDebug("get_midi_program_info(%i, %i)", plugin_id, midi_program_id);
  324. static MidiProgramInfo info = { false, 0, 0, nullptr };
  325. info.valid = false;
  326. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  327. {
  328. CarlaPlugin* plugin = CarlaPlugins[i];
  329. if (plugin && plugin->id() == plugin_id)
  330. {
  331. if (midi_program_id < plugin->midiprog_count())
  332. {
  333. info.valid = true;
  334. plugin->get_midi_program_info(&info, midi_program_id);
  335. }
  336. else
  337. qCritical("get_midi_program_info(%i, %i) - midi_program_id out of bounds", plugin_id, midi_program_id);
  338. return &info;
  339. }
  340. }
  341. qCritical("get_midi_program_info(%i, %i) - could not find plugin", plugin_id, midi_program_id);
  342. return &info;
  343. }
  344. GuiInfo* get_gui_info(unsigned short plugin_id)
  345. {
  346. qDebug("get_gui_info(%i)", plugin_id);
  347. static GuiInfo info = { GUI_NONE, false };
  348. info.type = GUI_NONE;
  349. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  350. {
  351. CarlaPlugin* plugin = CarlaPlugins[i];
  352. if (plugin && plugin->id() == plugin_id)
  353. {
  354. plugin->get_gui_info(&info);
  355. return &info;
  356. }
  357. }
  358. qCritical("get_gui_info(%i) - could not find plugin", plugin_id);
  359. return &info;
  360. }
  361. const ParameterData* get_parameter_data(unsigned short plugin_id, uint32_t parameter_id)
  362. {
  363. qDebug("get_parameter_data(%i, %i)", plugin_id, parameter_id);
  364. static ParameterData data = { PARAMETER_UNKNOWN, -1, -1, 0, 0, -1 };
  365. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  366. {
  367. CarlaPlugin* plugin = CarlaPlugins[i];
  368. if (plugin && plugin->id() == plugin_id)
  369. {
  370. if (parameter_id < plugin->param_count())
  371. return plugin->param_data(parameter_id);
  372. else
  373. qCritical("get_parameter_data(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  374. return &data;
  375. }
  376. }
  377. qCritical("get_parameter_data(%i, %i) - could not find plugin", plugin_id, parameter_id);
  378. return &data;
  379. }
  380. const ParameterRanges* get_parameter_ranges(unsigned short plugin_id, uint32_t parameter_id)
  381. {
  382. qDebug("get_parameter_ranges(%i, %i)", plugin_id, parameter_id);
  383. static ParameterRanges ranges = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
  384. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  385. {
  386. CarlaPlugin* plugin = CarlaPlugins[i];
  387. if (plugin && plugin->id() == plugin_id)
  388. {
  389. if (parameter_id < plugin->param_count())
  390. return plugin->param_ranges(parameter_id);
  391. else
  392. qCritical("get_parameter_ranges(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  393. return &ranges;
  394. }
  395. }
  396. qCritical("get_parameter_ranges(%i, %i) - could not find plugin", plugin_id, parameter_id);
  397. return &ranges;
  398. }
  399. const CustomData* get_custom_data(unsigned short plugin_id, uint32_t custom_data_id)
  400. {
  401. qDebug("get_custom_data(%i, %i)", plugin_id, custom_data_id);
  402. static CustomData data = { CUSTOM_DATA_INVALID, nullptr, nullptr };
  403. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  404. {
  405. CarlaPlugin* plugin = CarlaPlugins[i];
  406. if (plugin && plugin->id() == plugin_id)
  407. {
  408. if (custom_data_id < plugin->custom_count())
  409. return plugin->custom_data(custom_data_id);
  410. else
  411. qCritical("get_custom_data(%i, %i) - custom_data_id out of bounds", plugin_id, custom_data_id);
  412. return &data;
  413. }
  414. }
  415. qCritical("get_custom_data(%i, %i) - could not find plugin", plugin_id, custom_data_id);
  416. return &data;
  417. }
  418. const char* get_chunk_data(unsigned short plugin_id)
  419. {
  420. qDebug("get_chunk_data(%i)", plugin_id);
  421. static const char* chunk_data = nullptr;
  422. if (chunk_data)
  423. free((void*)chunk_data);
  424. chunk_data = nullptr;
  425. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  426. {
  427. CarlaPlugin* plugin = CarlaPlugins[i];
  428. if (plugin && plugin->id() == plugin_id)
  429. {
  430. if (plugin->hints() & PLUGIN_USES_CHUNKS)
  431. {
  432. void* data = nullptr;
  433. int32_t data_size = plugin->chunk_data(&data);
  434. if (data && data_size >= 4)
  435. {
  436. QByteArray chunk((const char*)data, data_size);
  437. chunk_data = strdup(chunk.toBase64().data());
  438. }
  439. else
  440. qCritical("get_chunk_data(%i) - got invalid chunk data", plugin_id);
  441. }
  442. else
  443. qCritical("get_chunk_data(%i) - plugin does not support chunks", plugin_id);
  444. return chunk_data;
  445. }
  446. }
  447. if (is_engine_running())
  448. qCritical("get_chunk_data(%i) - could not find plugin", plugin_id);
  449. return chunk_data;
  450. }
  451. uint32_t get_parameter_count(unsigned short plugin_id)
  452. {
  453. qDebug("get_parameter_count(%i)", plugin_id);
  454. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  455. {
  456. CarlaPlugin* plugin = CarlaPlugins[i];
  457. if (plugin && plugin->id() == plugin_id)
  458. return plugin->param_count();
  459. }
  460. qCritical("get_parameter_count(%i) - could not find plugin", plugin_id);
  461. return 0;
  462. }
  463. uint32_t get_program_count(unsigned short plugin_id)
  464. {
  465. qDebug("get_program_count(%i)", plugin_id);
  466. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  467. {
  468. CarlaPlugin* plugin = CarlaPlugins[i];
  469. if (plugin && plugin->id() == plugin_id)
  470. return plugin->prog_count();
  471. }
  472. qCritical("get_program_count(%i) - could not find plugin", plugin_id);
  473. return 0;
  474. }
  475. uint32_t get_midi_program_count(unsigned short plugin_id)
  476. {
  477. qDebug("get_midi_program_count(%i)", plugin_id);
  478. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  479. {
  480. CarlaPlugin* plugin = CarlaPlugins[i];
  481. if (plugin && plugin->id() == plugin_id)
  482. return plugin->midiprog_count();
  483. }
  484. qCritical("get_midi_program_count(%i) - could not find plugin", plugin_id);
  485. return 0;
  486. }
  487. uint32_t get_custom_data_count(unsigned short plugin_id)
  488. {
  489. qDebug("get_custom_data_count(%i)", plugin_id);
  490. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  491. {
  492. CarlaPlugin* plugin = CarlaPlugins[i];
  493. if (plugin && plugin->id() == plugin_id)
  494. return plugin->custom_count();
  495. }
  496. qCritical("get_custom_data_count(%i) - could not find plugin", plugin_id);
  497. return 0;
  498. }
  499. const char* get_parameter_text(unsigned short plugin_id, quint32 parameter_id)
  500. {
  501. qDebug("get_parameter_text(%i, %i)", plugin_id, parameter_id);
  502. static char buf_text[STR_MAX] = { 0 };
  503. memset(buf_text, 0, sizeof(char)*STR_MAX);
  504. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  505. {
  506. CarlaPlugin* plugin = CarlaPlugins[i];
  507. if (plugin && plugin->id() == plugin_id)
  508. {
  509. if (parameter_id < plugin->param_count())
  510. plugin->get_parameter_text(parameter_id, buf_text);
  511. else
  512. qCritical("get_parameter_text(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  513. break;
  514. }
  515. }
  516. return buf_text;
  517. }
  518. const char* get_program_name(unsigned short plugin_id, uint32_t program_id)
  519. {
  520. qDebug("get_program_name(%i, %i)", plugin_id, program_id);
  521. static const char* program_name = nullptr;
  522. if (program_name)
  523. free((void*)program_name);
  524. program_name = nullptr;
  525. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  526. {
  527. CarlaPlugin* plugin = CarlaPlugins[i];
  528. if (plugin && plugin->id() == plugin_id)
  529. {
  530. if (program_id < plugin->prog_count())
  531. {
  532. char buf_str[STR_MAX] = { 0 };
  533. plugin->get_program_name(program_id, buf_str);
  534. program_name = strdup(buf_str);
  535. return program_name;
  536. }
  537. else
  538. qCritical("get_program_name(%i, %i) - program_id out of bounds", plugin_id, program_id);
  539. return nullptr;
  540. }
  541. }
  542. if (is_engine_running())
  543. qCritical("get_program_name(%i, %i) - could not find plugin", plugin_id, program_id);
  544. return nullptr;
  545. }
  546. const char* get_midi_program_name(unsigned short plugin_id, uint32_t midi_program_id)
  547. {
  548. qDebug("get_midi_program_name(%i, %i)", plugin_id, midi_program_id);
  549. static const char* midi_program_name = nullptr;
  550. if (midi_program_name)
  551. free((void*)midi_program_name);
  552. midi_program_name = nullptr;
  553. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  554. {
  555. CarlaPlugin* plugin = CarlaPlugins[i];
  556. if (plugin && plugin->id() == plugin_id)
  557. {
  558. if (midi_program_id < plugin->midiprog_count())
  559. {
  560. char buf_str[STR_MAX] = { 0 };
  561. plugin->get_midi_program_name(midi_program_id, buf_str);
  562. midi_program_name = strdup(buf_str);
  563. return midi_program_name;
  564. }
  565. else
  566. qCritical("get_midi_program_name(%i, %i) - program_id out of bounds", plugin_id, midi_program_id);
  567. return nullptr;
  568. }
  569. }
  570. if (is_engine_running())
  571. qCritical("get_midi_program_name(%i, %i) - could not find plugin", plugin_id, midi_program_id);
  572. return nullptr;
  573. }
  574. const char* get_real_plugin_name(unsigned short plugin_id)
  575. {
  576. qDebug("get_real_plugin_name(%i)", plugin_id);
  577. static const char* real_plugin_name = nullptr;
  578. if (real_plugin_name)
  579. free((void*)real_plugin_name);
  580. real_plugin_name = nullptr;
  581. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  582. {
  583. CarlaPlugin* plugin = CarlaPlugins[i];
  584. if (plugin && plugin->id() == plugin_id)
  585. {
  586. char buf_str[STR_MAX] = { 0 };
  587. plugin->get_real_name(buf_str);
  588. real_plugin_name = strdup(buf_str);
  589. return real_plugin_name;
  590. }
  591. }
  592. if (is_engine_running())
  593. qCritical("get_real_plugin_name(%i) - could not find plugin", plugin_id);
  594. return real_plugin_name;
  595. }
  596. qint32 get_current_program_index(unsigned short plugin_id)
  597. {
  598. qDebug("get_current_program_index(%i)", plugin_id);
  599. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  600. {
  601. CarlaPlugin* plugin = CarlaPlugins[i];
  602. if (plugin && plugin->id() == plugin_id)
  603. return plugin->prog_current();
  604. }
  605. qCritical("get_current_program_index(%i) - could not find plugin", plugin_id);
  606. return -1;
  607. }
  608. qint32 get_current_midi_program_index(unsigned short plugin_id)
  609. {
  610. qDebug("get_current_midi_program_index(%i)", plugin_id);
  611. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  612. {
  613. CarlaPlugin* plugin = CarlaPlugins[i];
  614. if (plugin && plugin->id() == plugin_id)
  615. return plugin->midiprog_current();
  616. }
  617. qCritical("get_current_midi_program_index(%i) - could not find plugin", plugin_id);
  618. return -1;
  619. }
  620. double get_default_parameter_value(unsigned short plugin_id, uint32_t parameter_id)
  621. {
  622. qDebug("get_default_parameter_value(%i, %i)", plugin_id, parameter_id);
  623. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  624. {
  625. CarlaPlugin* plugin = CarlaPlugins[i];
  626. if (plugin && plugin->id() == plugin_id)
  627. {
  628. if (parameter_id < plugin->param_count())
  629. return plugin->param_ranges(parameter_id)->def;
  630. //return plugin->get_default_parameter_value(parameter_id);
  631. else
  632. qCritical("get_default_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  633. return 0.0;
  634. }
  635. }
  636. qCritical("get_default_parameter_value(%i, %i) - could not find plugin", plugin_id, parameter_id);
  637. return 0.0;
  638. }
  639. double get_current_parameter_value(unsigned short plugin_id, uint32_t parameter_id)
  640. {
  641. //qDebug("get_current_parameter_value(%i, %i)", plugin_id, parameter_id);
  642. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  643. {
  644. CarlaPlugin* plugin = CarlaPlugins[i];
  645. if (plugin && plugin->id() == plugin_id)
  646. {
  647. if (parameter_id < plugin->param_count())
  648. return plugin->get_parameter_value(parameter_id);
  649. else
  650. qCritical("get_current_parameter_value(%i, %i) - parameter_id out of bounds", plugin_id, parameter_id);
  651. return 0.0;
  652. }
  653. }
  654. qCritical("get_current_parameter_value(%i, %i) - could not find plugin", plugin_id, parameter_id);
  655. return 0.0;
  656. }
  657. double get_input_peak_value(unsigned short plugin_id, unsigned short port_id)
  658. {
  659. if (port_id == 1 || port_id == 2)
  660. return ains_peak[(plugin_id*2)+port_id-1];
  661. else
  662. return 0.0;
  663. }
  664. double get_output_peak_value(unsigned short plugin_id, unsigned short port_id)
  665. {
  666. if (port_id == 1 || port_id == 2)
  667. return aouts_peak[(plugin_id*2)+port_id-1];
  668. else
  669. return 0.0;
  670. }
  671. void set_active(unsigned short plugin_id, bool onoff)
  672. {
  673. qDebug("set_active(%i, %s)", plugin_id, bool2str(onoff));
  674. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  675. {
  676. CarlaPlugin* plugin = CarlaPlugins[i];
  677. if (plugin && plugin->id() == plugin_id)
  678. return plugin->set_active(onoff, true, false);
  679. }
  680. qCritical("set_active(%i, %s) - could not find plugin", plugin_id, bool2str(onoff));
  681. }
  682. void set_drywet(unsigned short plugin_id, double value)
  683. {
  684. qDebug("set_drywet(%i, %f)", plugin_id, value);
  685. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  686. {
  687. CarlaPlugin* plugin = CarlaPlugins[i];
  688. if (plugin && plugin->id() == plugin_id)
  689. return plugin->set_drywet(value, true, false);
  690. }
  691. qCritical("set_drywet(%i, %f) - could not find plugin", plugin_id, value);
  692. }
  693. void set_volume(unsigned short plugin_id, double value)
  694. {
  695. qDebug("set_vol(%i, %f)", plugin_id, value);
  696. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  697. {
  698. CarlaPlugin* plugin = CarlaPlugins[i];
  699. if (plugin && plugin->id() == plugin_id)
  700. return plugin->set_volume(value, true, false);
  701. }
  702. qCritical("set_vol(%i, %f) - could not find plugin", plugin_id, value);
  703. }
  704. void set_balance_left(unsigned short plugin_id, double value)
  705. {
  706. qDebug("set_balance_left(%i, %f)", plugin_id, value);
  707. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  708. {
  709. CarlaPlugin* plugin = CarlaPlugins[i];
  710. if (plugin && plugin->id() == plugin_id)
  711. return plugin->set_balance_left(value, true, false);
  712. }
  713. qCritical("set_balance_left(%i, %f) - could not find plugin", plugin_id, value);
  714. }
  715. void set_balance_right(unsigned short plugin_id, double value)
  716. {
  717. qDebug("set_balance_right(%i, %f)", plugin_id, value);
  718. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  719. {
  720. CarlaPlugin* plugin = CarlaPlugins[i];
  721. if (plugin && plugin->id() == plugin_id)
  722. return plugin->set_balance_right(value, true, false);
  723. }
  724. qCritical("set_balance_right(%i, %f) - could not find plugin", plugin_id, value);
  725. }
  726. void set_parameter_value(unsigned short plugin_id, uint32_t parameter_id, double value)
  727. {
  728. qDebug("set_parameter_value(%i, %i, %f)", plugin_id, parameter_id, value);
  729. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  730. {
  731. CarlaPlugin* plugin = CarlaPlugins[i];
  732. if (plugin && plugin->id() == plugin_id)
  733. {
  734. if (parameter_id < plugin->param_count())
  735. plugin->set_parameter_value(parameter_id, value, true, true, false);
  736. else
  737. qCritical("set_parameter_value(%i, %i, %f) - parameter_id out of bounds", plugin_id, parameter_id, value);
  738. return;
  739. }
  740. }
  741. qCritical("set_parameter_value(%i, %i, %f) - could not find plugin", plugin_id, parameter_id, value);
  742. }
  743. void set_parameter_midi_channel(unsigned short plugin_id, uint32_t parameter_id, uint8_t channel)
  744. {
  745. qDebug("set_parameter_midi_channel(%i, %i, %i)", plugin_id, parameter_id, channel);
  746. if (channel > 15)
  747. {
  748. qCritical("set_parameter_midi_channel(%i, %i, %i) - invalid channel number", plugin_id, parameter_id, channel);
  749. return;
  750. }
  751. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  752. {
  753. CarlaPlugin* plugin = CarlaPlugins[i];
  754. if (plugin && plugin->id() == plugin_id)
  755. {
  756. if (parameter_id < plugin->param_count())
  757. plugin->set_parameter_midi_channel(parameter_id, channel);
  758. else
  759. qCritical("set_parameter_midi_channel(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, channel);
  760. return;
  761. }
  762. }
  763. qCritical("set_parameter_midi_channel(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, channel);
  764. }
  765. void set_parameter_midi_cc(unsigned short plugin_id, uint32_t parameter_id, int16_t midi_cc)
  766. {
  767. qDebug("set_parameter_midi_cc(%i, %i, %i)", plugin_id, parameter_id, midi_cc);
  768. if (midi_cc < -1)
  769. {
  770. midi_cc = -1;
  771. }
  772. else if (midi_cc > 0x5F) // 95
  773. {
  774. qCritical("set_parameter_midi_cc(%i, %i, %i) - invalid midi_cc number", plugin_id, parameter_id, midi_cc);
  775. return;
  776. }
  777. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  778. {
  779. CarlaPlugin* plugin = CarlaPlugins[i];
  780. if (plugin && plugin->id() == plugin_id)
  781. {
  782. if (parameter_id < plugin->param_count())
  783. plugin->set_parameter_midi_cc(parameter_id, midi_cc);
  784. else
  785. qCritical("set_parameter_midi_cc(%i, %i, %i) - parameter_id out of bounds", plugin_id, parameter_id, midi_cc);
  786. return;
  787. }
  788. }
  789. qCritical("set_parameter_midi_cc(%i, %i, %i) - could not find plugin", plugin_id, parameter_id, midi_cc);
  790. }
  791. void set_program(unsigned short plugin_id, uint32_t program_id)
  792. {
  793. qDebug("set_program(%i, %i)", plugin_id, program_id);
  794. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  795. {
  796. CarlaPlugin* plugin = CarlaPlugins[i];
  797. if (plugin && plugin->id() == plugin_id)
  798. {
  799. if (program_id < plugin->prog_count())
  800. plugin->set_program(program_id, true, true, false, true);
  801. else
  802. qCritical("set_program(%i, %i) - program_id out of bounds", plugin_id, program_id);
  803. return;
  804. }
  805. }
  806. qCritical("set_program(%i, %i) - could not find plugin", plugin_id, program_id);
  807. }
  808. void set_midi_program(unsigned short plugin_id, uint32_t midi_program_id)
  809. {
  810. qDebug("set_midi_program(%i, %i)", plugin_id, midi_program_id);
  811. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  812. {
  813. CarlaPlugin* plugin = CarlaPlugins[i];
  814. if (plugin && plugin->id() == plugin_id)
  815. {
  816. if (midi_program_id < plugin->midiprog_count())
  817. plugin->set_midi_program(midi_program_id, true, true, false, true);
  818. else
  819. qCritical("set_midi_program(%i, %i) - program_id out of bounds", plugin_id, midi_program_id);
  820. return;
  821. }
  822. }
  823. qCritical("set_midi_program(%i, %i) - could not find plugin", plugin_id, midi_program_id);
  824. }
  825. void set_custom_data(unsigned short plugin_id, CustomDataType type, const char* key, const char* value)
  826. {
  827. qDebug("set_custom_data(%i, %i, %s, %s)", plugin_id, type, key, value);
  828. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  829. {
  830. CarlaPlugin* plugin = CarlaPlugins[i];
  831. if (plugin && plugin->id() == plugin_id)
  832. return plugin->set_custom_data(type, key, value, true);
  833. }
  834. qCritical("set_custom_data(%i, %i, %s, %s) - could not find plugin", plugin_id, type, key, value);
  835. }
  836. void set_chunk_data(unsigned short plugin_id, const char* chunk_data)
  837. {
  838. qDebug("set_chunk_data(%i, %s)", plugin_id, chunk_data);
  839. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  840. {
  841. CarlaPlugin* plugin = CarlaPlugins[i];
  842. if (plugin && plugin->id() == plugin_id)
  843. {
  844. if (plugin->hints() & PLUGIN_USES_CHUNKS)
  845. plugin->set_chunk_data(chunk_data);
  846. else
  847. qCritical("set_chunk_data(%i, %s) - plugin does not support chunks", plugin_id, chunk_data);
  848. return;
  849. }
  850. }
  851. qCritical("set_chunk_data(%i, %s) - could not find plugin", plugin_id, chunk_data);
  852. }
  853. void set_gui_data(unsigned short plugin_id, int data, quintptr gui_addr)
  854. {
  855. qDebug("set_gui_data(%i, %i, " P_UINTPTR ")", plugin_id, data, gui_addr);
  856. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  857. {
  858. CarlaPlugin* plugin = CarlaPlugins[i];
  859. if (plugin && plugin->id() == plugin_id)
  860. {
  861. //if (plugin->gui.type != GUI_NONE)
  862. //#ifdef Q_OS_WIN
  863. //plugin->set_gui_data(data, (void*)gui_addr);
  864. //#else
  865. plugin->set_gui_data(data, get_pointer(gui_addr));
  866. //#endif
  867. //else
  868. // qCritical("set_gui_data(%i, %i, " P_INTPTR ") - plugin has no UI", plugin_id, data, gui_addr);
  869. return;
  870. }
  871. }
  872. qCritical("set_gui_data(%i, %i, " P_UINTPTR ") - could not find plugin", plugin_id, data, gui_addr);
  873. }
  874. // TESTING
  875. //void set_name(unsigned short plugin_id, const char* name)
  876. //{
  877. // for (unsigned short i=0; i<MAX_PLUGINS; i++)
  878. // {
  879. // CarlaPlugin* plugin = CarlaPlugins[i];
  880. // if (plugin && plugin->id() == plugin_id)
  881. // {
  882. // plugin->set_name(name);
  883. // }
  884. // }
  885. //}
  886. void show_gui(unsigned short plugin_id, bool yesno)
  887. {
  888. qDebug("show_gui(%i, %s)", plugin_id, bool2str(yesno));
  889. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  890. {
  891. CarlaPlugin* plugin = CarlaPlugins[i];
  892. if (plugin && plugin->id() == plugin_id)
  893. {
  894. plugin->show_gui(yesno);
  895. return;
  896. }
  897. }
  898. qCritical("show_gui(%i, %s) - could not find plugin", plugin_id, bool2str(yesno));
  899. }
  900. void idle_guis()
  901. {
  902. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  903. {
  904. CarlaPlugin* plugin = CarlaPlugins[i];
  905. if (plugin && plugin->enabled())
  906. plugin->idle_gui();
  907. }
  908. }
  909. void send_midi_note(unsigned short plugin_id, bool onoff, uint8_t note, uint8_t velocity)
  910. {
  911. qDebug("send_midi_note(%i, %s, %i, %i)", plugin_id, bool2str(onoff), note, velocity);
  912. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  913. {
  914. CarlaPlugin* plugin = CarlaPlugins[i];
  915. if (plugin && plugin->id() == plugin_id)
  916. {
  917. plugin->send_midi_note(onoff, note, velocity, true, true, false);
  918. return;
  919. }
  920. }
  921. qCritical("send_midi_note(%i, %s, %i, %i) - could not find plugin", plugin_id, bool2str(onoff), note, velocity);
  922. }
  923. void prepare_for_save(unsigned short plugin_id)
  924. {
  925. qDebug("prepare_for_save(%i)", plugin_id);
  926. for (unsigned short i=0; i<MAX_PLUGINS; i++)
  927. {
  928. CarlaPlugin* plugin = CarlaPlugins[i];
  929. if (plugin && plugin->id() == plugin_id)
  930. return plugin->prepare_for_save();
  931. }
  932. qCritical("prepare_for_save(%i) - could not find plugin", plugin_id);
  933. }
  934. void set_option(OptionsType option, int value, const char* value_str)
  935. {
  936. qDebug("set_option(%i, %i, %s)", option, value, value_str);
  937. // TODO
  938. switch(option)
  939. {
  940. case OPTION_PREFER_UI_BRIDGES:
  941. carla_options.prefer_ui_bridges = value;
  942. break;
  943. case OPTION_PATH_LADSPA:
  944. carla_setenv("LADSPA_PATH", value_str);
  945. break;
  946. case OPTION_PATH_DSSI:
  947. carla_setenv("DSSI_PATH", value_str);
  948. break;
  949. case OPTION_PATH_LV2:
  950. carla_setenv("LV2_PATH", value_str);
  951. break;
  952. case OPTION_PATH_VST:
  953. carla_setenv("VST_PATH", value_str);
  954. break;
  955. case OPTION_PATH_SF2:
  956. carla_setenv("SF2_PATH", value_str);
  957. break;
  958. case OPTION_PATH_BRIDGE_UNIX32:
  959. carla_options.bridge_unix32 = strdup(value_str);
  960. break;
  961. case OPTION_PATH_BRIDGE_UNIX64:
  962. carla_options.bridge_unix64 = strdup(value_str);
  963. break;
  964. case OPTION_PATH_BRIDGE_WIN32:
  965. carla_options.bridge_win32 = strdup(value_str);
  966. break;
  967. case OPTION_PATH_BRIDGE_WIN64:
  968. carla_options.bridge_win64 = strdup(value_str);
  969. break;
  970. case OPTION_PATH_BRIDGE_LV2_GTK2:
  971. carla_options.bridge_lv2gtk2 = strdup(value_str);
  972. break;
  973. case OPTION_PATH_BRIDGE_LV2_QT4:
  974. carla_options.bridge_lv2qt4 = strdup(value_str);
  975. break;
  976. case OPTION_PATH_BRIDGE_LV2_X11:
  977. carla_options.bridge_lv2x11 = strdup(value_str);
  978. break;
  979. default:
  980. break;
  981. }
  982. }
  983. CARLA_BACKEND_END_NAMESPACE
  984. // End of exported symbols (API)
  985. // -------------------------------------------------------------------------------------------------------------------
  986. #ifdef QTCREATOR_TEST
  987. #include <QtGui/QApplication>
  988. #include <QtGui/QDialog>
  989. QDialog* gui;
  990. #ifndef CARLA_BACKEND_NO_NAMESPACE
  991. using namespace CarlaBackend;
  992. #endif
  993. void main_callback(CallbackType action, unsigned short plugin_id, int value1, int value2, double value3)
  994. {
  995. qDebug("Callback(%i, %u, %i, %i, %f)", action, plugin_id, value1, value2, value3);
  996. switch (action)
  997. {
  998. case CALLBACK_SHOW_GUI:
  999. if (! value1)
  1000. gui->close();
  1001. break;
  1002. case CALLBACK_RESIZE_GUI:
  1003. gui->setFixedSize(value1, value2);
  1004. break;
  1005. default:
  1006. break;
  1007. }
  1008. }
  1009. int main(int argc, char* argv[])
  1010. {
  1011. QApplication app(argc, argv);
  1012. gui = new QDialog(nullptr);
  1013. if (engine_init("carla_demo"))
  1014. {
  1015. set_callback_function(main_callback);
  1016. short id = add_plugin_dssi("/usr/lib/dssi/horgand.so", "horgand", "/usr/lib/dssi/horgand/horgand_fltk");
  1017. if (id >= 0)
  1018. {
  1019. qDebug("Main Initiated, id = %u", id);
  1020. //const char* test_name = strdup("test reloaded named");
  1021. //set_name(id, test_name);
  1022. const GuiInfo* guiInfo = get_gui_info(id);
  1023. if (guiInfo->type == GUI_INTERNAL_QT4 || guiInfo->type == GUI_INTERNAL_X11)
  1024. {
  1025. set_gui_data(id, 0, (quintptr)gui);
  1026. gui->show();
  1027. }
  1028. show_gui(id, true);
  1029. app.exec();
  1030. remove_plugin(id);
  1031. }
  1032. else
  1033. qCritical("failed: %s", get_last_error());
  1034. engine_close();
  1035. }
  1036. else
  1037. qCritical("failed to start backend engine");
  1038. delete gui;
  1039. return 0;
  1040. }
  1041. #endif