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.

1167 lines
34KB

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