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.

1313 lines
38KB

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