Audio plugin host https://kx.studio/carla
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.

1630 lines
45KB

  1. /*
  2. * Carla Plugin
  3. * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or 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 GPL.txt file
  16. */
  17. #include "CarlaPluginInternal.hpp"
  18. #include "CarlaLibUtils.hpp"
  19. #include "CarlaMIDI.h"
  20. //#include <QtGui/QtEvents>
  21. // TODO - save&load options
  22. CARLA_BACKEND_START_NAMESPACE
  23. // -------------------------------------------------------------------
  24. // fallback data
  25. static const ParameterData kParameterDataNull;
  26. static const ParameterRanges kParameterRangesNull;
  27. static const MidiProgramData kMidiProgramDataNull;
  28. static const CustomData kCustomDataNull;
  29. // -------------------------------------------------------------------
  30. // Helpers
  31. CarlaEngine* CarlaPluginGetEngine(CarlaPlugin* const plugin)
  32. {
  33. return CarlaPluginProtectedData::getEngine(plugin);
  34. }
  35. CarlaEngineAudioPort* CarlaPluginGetAudioInPort(CarlaPlugin* const plugin, uint32_t index)
  36. {
  37. return CarlaPluginProtectedData::getAudioInPort(plugin, index);
  38. }
  39. CarlaEngineAudioPort* CarlaPluginGetAudioOutPort(CarlaPlugin* const plugin, uint32_t index)
  40. {
  41. return CarlaPluginProtectedData::getAudioOutPort(plugin, index);
  42. }
  43. // -------------------------------------------------------------------
  44. // Constructor and destructor
  45. CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id)
  46. : fId(id),
  47. fHints(0x0),
  48. fOptions(0x0),
  49. fEnabled(false),
  50. kData(new CarlaPluginProtectedData(engine, this, CarlaPluginThread::PLUGIN_THREAD_NULL))
  51. {
  52. CARLA_ASSERT(kData != nullptr);
  53. CARLA_ASSERT(engine != nullptr);
  54. CARLA_ASSERT(id < engine->maxPluginNumber());
  55. carla_debug("CarlaPlugin::CarlaPlugin(%p, %i)", engine, id);
  56. switch (engine->getProccessMode())
  57. {
  58. case PROCESS_MODE_SINGLE_CLIENT:
  59. case PROCESS_MODE_MULTIPLE_CLIENTS:
  60. kData->ctrlChannel = 0;
  61. break;
  62. case PROCESS_MODE_CONTINUOUS_RACK:
  63. CARLA_ASSERT(id < MAX_RACK_PLUGINS && id < MAX_MIDI_CHANNELS);
  64. if (id < MAX_RACK_PLUGINS && id < MAX_MIDI_CHANNELS)
  65. kData->ctrlChannel = id;
  66. break;
  67. case PROCESS_MODE_PATCHBAY:
  68. case PROCESS_MODE_BRIDGE:
  69. break;
  70. }
  71. if (engine->getOptions().forceStereo)
  72. fOptions |= PLUGIN_OPTION_FORCE_STEREO;
  73. }
  74. CarlaPlugin::~CarlaPlugin()
  75. {
  76. carla_debug("CarlaPlugin::~CarlaPlugin()");
  77. // Remove client and ports
  78. if (kData->client != nullptr)
  79. {
  80. if (kData->client->isActive())
  81. kData->client->deactivate();
  82. // can't call virtual functions in destructor
  83. CarlaPlugin::deleteBuffers();
  84. delete kData->client;
  85. }
  86. if (kData->latencyBuffers != nullptr)
  87. {
  88. for (uint32_t i=0; i < kData->audioIn.count; i++)
  89. delete[] kData->latencyBuffers[i];
  90. delete[] kData->latencyBuffers;
  91. }
  92. kData->prog.clear();
  93. kData->midiprog.clear();
  94. kData->custom.clear();
  95. libClose();
  96. delete kData;
  97. }
  98. // -------------------------------------------------------------------
  99. // Information (base)
  100. uint32_t CarlaPlugin::latency() const
  101. {
  102. return kData->latency;
  103. }
  104. // -------------------------------------------------------------------
  105. // Information (count)
  106. uint32_t CarlaPlugin::audioInCount() const
  107. {
  108. return kData->audioIn.count;
  109. }
  110. uint32_t CarlaPlugin::audioOutCount() const
  111. {
  112. return kData->audioOut.count;
  113. }
  114. uint32_t CarlaPlugin::midiInCount() const
  115. {
  116. return (kData->extraHints & PLUGIN_HINT_HAS_MIDI_IN) ? 1 : 0;
  117. }
  118. uint32_t CarlaPlugin::midiOutCount() const
  119. {
  120. return (kData->extraHints & PLUGIN_HINT_HAS_MIDI_OUT) ? 1 : 0;
  121. }
  122. uint32_t CarlaPlugin::parameterCount() const
  123. {
  124. return kData->param.count;
  125. }
  126. uint32_t CarlaPlugin::parameterScalePointCount(const uint32_t parameterId) const
  127. {
  128. CARLA_ASSERT(parameterId < kData->param.count);
  129. return 0;
  130. // unused
  131. (void)parameterId;
  132. }
  133. uint32_t CarlaPlugin::programCount() const
  134. {
  135. return kData->prog.count;
  136. }
  137. uint32_t CarlaPlugin::midiProgramCount() const
  138. {
  139. return kData->midiprog.count;
  140. }
  141. uint32_t CarlaPlugin::customDataCount() const
  142. {
  143. return kData->custom.count();
  144. }
  145. // -------------------------------------------------------------------
  146. // Information (current data)
  147. int32_t CarlaPlugin::currentProgram() const
  148. {
  149. return kData->prog.current;
  150. }
  151. int32_t CarlaPlugin::currentMidiProgram() const
  152. {
  153. return kData->midiprog.current;
  154. }
  155. const ParameterData& CarlaPlugin::parameterData(const uint32_t parameterId) const
  156. {
  157. CARLA_ASSERT(parameterId < kData->param.count);
  158. return (parameterId < kData->param.count) ? kData->param.data[parameterId] : kParameterDataNull;
  159. }
  160. const ParameterRanges& CarlaPlugin::parameterRanges(const uint32_t parameterId) const
  161. {
  162. CARLA_ASSERT(parameterId < kData->param.count);
  163. return (parameterId < kData->param.count) ? kData->param.ranges[parameterId] : kParameterRangesNull;
  164. }
  165. bool CarlaPlugin::parameterIsOutput(const uint32_t parameterId) const
  166. {
  167. CARLA_ASSERT(parameterId < kData->param.count);
  168. return (parameterId < kData->param.count) ? (kData->param.data[parameterId].type == PARAMETER_OUTPUT) : false;
  169. }
  170. const MidiProgramData& CarlaPlugin::midiProgramData(const uint32_t index) const
  171. {
  172. CARLA_ASSERT(index < kData->midiprog.count);
  173. return (index < kData->midiprog.count) ? kData->midiprog.data[index] : kMidiProgramDataNull;
  174. }
  175. const CustomData& CarlaPlugin::customData(const size_t index) const
  176. {
  177. CARLA_ASSERT(index < kData->custom.count());
  178. return (index < kData->custom.count()) ? kData->custom.getAt(index) : kCustomDataNull;
  179. }
  180. int32_t CarlaPlugin::chunkData(void** const dataPtr)
  181. {
  182. CARLA_ASSERT(dataPtr != nullptr);
  183. return 0;
  184. // unused
  185. (void)dataPtr;
  186. }
  187. // -------------------------------------------------------------------
  188. // Information (per-plugin data)
  189. unsigned int CarlaPlugin::availableOptions()
  190. {
  191. return kData->availOptions;
  192. }
  193. float CarlaPlugin::getParameterValue(const uint32_t parameterId)
  194. {
  195. CARLA_ASSERT(parameterId < parameterCount());
  196. return 0.0f;
  197. // unused
  198. (void)parameterId;
  199. }
  200. float CarlaPlugin::getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId)
  201. {
  202. CARLA_ASSERT(parameterId < parameterCount());
  203. CARLA_ASSERT(scalePointId < parameterScalePointCount(parameterId));
  204. return 0.0f;
  205. // unused
  206. (void)parameterId;
  207. (void)scalePointId;
  208. }
  209. void CarlaPlugin::getLabel(char* const strBuf)
  210. {
  211. *strBuf = 0;
  212. }
  213. void CarlaPlugin::getMaker(char* const strBuf)
  214. {
  215. *strBuf = 0;
  216. }
  217. void CarlaPlugin::getCopyright(char* const strBuf)
  218. {
  219. *strBuf = 0;
  220. }
  221. void CarlaPlugin::getRealName(char* const strBuf)
  222. {
  223. *strBuf = 0;
  224. }
  225. void CarlaPlugin::getParameterName(const uint32_t parameterId, char* const strBuf)
  226. {
  227. CARLA_ASSERT(parameterId < parameterCount());
  228. *strBuf = 0;
  229. return;
  230. // unused
  231. (void)parameterId;
  232. }
  233. void CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const strBuf)
  234. {
  235. CARLA_ASSERT(parameterId < parameterCount());
  236. *strBuf = 0;
  237. return;
  238. // unused
  239. (void)parameterId;
  240. }
  241. void CarlaPlugin::getParameterText(const uint32_t parameterId, char* const strBuf)
  242. {
  243. CARLA_ASSERT(parameterId < parameterCount());
  244. *strBuf = 0;
  245. return;
  246. // unused
  247. (void)parameterId;
  248. }
  249. void CarlaPlugin::getParameterUnit(const uint32_t parameterId, char* const strBuf)
  250. {
  251. CARLA_ASSERT(parameterId < parameterCount());
  252. *strBuf = 0;
  253. return;
  254. // unused
  255. (void)parameterId;
  256. }
  257. void CarlaPlugin::getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf)
  258. {
  259. CARLA_ASSERT(parameterId < parameterCount());
  260. CARLA_ASSERT(scalePointId < parameterScalePointCount(parameterId));
  261. *strBuf = 0;
  262. return;
  263. // unused
  264. (void)parameterId;
  265. (void)scalePointId;
  266. }
  267. void CarlaPlugin::getProgramName(const uint32_t index, char* const strBuf)
  268. {
  269. CARLA_ASSERT(index < kData->prog.count);
  270. CARLA_ASSERT(kData->prog.names[index] != nullptr);
  271. if (index < kData->prog.count && kData->prog.names[index])
  272. std::strncpy(strBuf, kData->prog.names[index], STR_MAX);
  273. else
  274. *strBuf = 0;
  275. }
  276. void CarlaPlugin::getMidiProgramName(const uint32_t index, char* const strBuf)
  277. {
  278. CARLA_ASSERT(index < kData->midiprog.count);
  279. CARLA_ASSERT(kData->midiprog.data[index].name != nullptr);
  280. if (index < kData->midiprog.count && kData->midiprog.data[index].name)
  281. std::strncpy(strBuf, kData->midiprog.data[index].name, STR_MAX);
  282. else
  283. *strBuf = 0;
  284. }
  285. void CarlaPlugin::getParameterCountInfo(uint32_t* const ins, uint32_t* const outs, uint32_t* const total)
  286. {
  287. CARLA_ASSERT(ins != nullptr);
  288. CARLA_ASSERT(outs != nullptr);
  289. CARLA_ASSERT(total != nullptr);
  290. if (ins == nullptr || outs == nullptr || total == nullptr)
  291. return;
  292. *ins = 0;
  293. *outs = 0;
  294. *total = kData->param.count;
  295. for (uint32_t i=0; i < kData->param.count; i++)
  296. {
  297. if (kData->param.data[i].type == PARAMETER_INPUT)
  298. *ins += 1;
  299. else if (kData->param.data[i].type == PARAMETER_OUTPUT)
  300. *outs += 1;
  301. }
  302. }
  303. // -------------------------------------------------------------------
  304. // Set data (state)
  305. #if 0
  306. const SaveState& CarlaPlugin::getSaveState()
  307. {
  308. static SaveState saveState;
  309. // TODO
  310. return saveState;
  311. }
  312. void CarlaPlugin::loadSaveState(const SaveState& saveState)
  313. {
  314. // TODO
  315. Q_UNUSED(saveState);
  316. }
  317. #endif
  318. // -------------------------------------------------------------------
  319. // Set data (internal stuff)
  320. void CarlaPlugin::setId(const unsigned int id)
  321. {
  322. fId = id;
  323. if (kData->engine->getProccessMode() == PROCESS_MODE_CONTINUOUS_RACK)
  324. {
  325. CARLA_ASSERT(id < MAX_RACK_PLUGINS);
  326. if (id >= MAX_RACK_PLUGINS || kData->ctrlChannel == static_cast<int8_t>(id))
  327. return;
  328. kData->ctrlChannel = id;
  329. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_CTRL_CHANNEL, 0, id, nullptr);
  330. }
  331. }
  332. void CarlaPlugin::setOption(const unsigned int option, const bool yesNo)
  333. {
  334. if (yesNo)
  335. fOptions |= option;
  336. else
  337. fOptions &= ~option;
  338. }
  339. void CarlaPlugin::setEnabled(const bool yesNo)
  340. {
  341. fEnabled = yesNo;
  342. }
  343. void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool sendCallback)
  344. {
  345. kData->active = active;
  346. const float value = active ? 1.0f : 0.0f;
  347. #ifndef BUILD_BRIDGE
  348. if (sendOsc)
  349. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, value);
  350. #else
  351. // unused
  352. (void)sendOsc;
  353. #endif
  354. if (sendCallback)
  355. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_ACTIVE, 0, value, nullptr);
  356. #ifndef BUILD_BRIDGE
  357. else if (fHints & PLUGIN_IS_BRIDGE)
  358. osc_send_control(&kData->osc.data, PARAMETER_ACTIVE, value);
  359. #endif
  360. }
  361. void CarlaPlugin::setDryWet(const float value, const bool sendOsc, const bool sendCallback)
  362. {
  363. CARLA_ASSERT(value >= 0.0f && value <= 1.0f);
  364. const float fixedValue = carla_fixValue<float>(0.0f, 1.0f, value);
  365. kData->postProc.dryWet = fixedValue;
  366. #ifndef BUILD_BRIDGE
  367. if (sendOsc)
  368. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, fixedValue);
  369. #else
  370. // unused
  371. (void)sendOsc;
  372. #endif
  373. if (sendCallback)
  374. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_DRYWET, 0, fixedValue, nullptr);
  375. #ifndef BUILD_BRIDGE
  376. else if (fHints & PLUGIN_IS_BRIDGE)
  377. osc_send_control(&kData->osc.data, PARAMETER_DRYWET, fixedValue);
  378. #endif
  379. }
  380. void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool sendCallback)
  381. {
  382. CARLA_ASSERT(value >= 0.0f && value <= 1.27f);
  383. const float fixedValue = carla_fixValue<float>(0.0f, 1.27f, value);
  384. kData->postProc.volume = fixedValue;
  385. #ifndef BUILD_BRIDGE
  386. if (sendOsc)
  387. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, fixedValue);
  388. #else
  389. // unused
  390. (void)sendOsc;
  391. #endif
  392. if (sendCallback)
  393. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_VOLUME, 0, fixedValue, nullptr);
  394. #ifndef BUILD_BRIDGE
  395. else if (fHints & PLUGIN_IS_BRIDGE)
  396. osc_send_control(&kData->osc.data, PARAMETER_VOLUME, fixedValue);
  397. #endif
  398. }
  399. void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bool sendCallback)
  400. {
  401. CARLA_ASSERT(value >= -1.0f && value <= 1.0f);
  402. const float fixedValue = carla_fixValue<float>(-1.0f, 1.0f, value);
  403. kData->postProc.balanceLeft = fixedValue;
  404. #ifndef BUILD_BRIDGE
  405. if (sendOsc)
  406. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, fixedValue);
  407. #else
  408. // unused
  409. (void)sendOsc;
  410. #endif
  411. if (sendCallback)
  412. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_BALANCE_LEFT, 0, fixedValue, nullptr);
  413. #ifndef BUILD_BRIDGE
  414. else if (fHints & PLUGIN_IS_BRIDGE)
  415. osc_send_control(&kData->osc.data, PARAMETER_BALANCE_LEFT, fixedValue);
  416. #endif
  417. }
  418. void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const bool sendCallback)
  419. {
  420. CARLA_ASSERT(value >= -1.0f && value <= 1.0f);
  421. const float fixedValue = carla_fixValue<float>(-1.0f, 1.0f, value);
  422. kData->postProc.balanceRight = fixedValue;
  423. #ifndef BUILD_BRIDGE
  424. if (sendOsc)
  425. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, fixedValue);
  426. #else
  427. // unused
  428. (void)sendOsc;
  429. #endif
  430. if (sendCallback)
  431. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_BALANCE_RIGHT, 0, fixedValue, nullptr);
  432. #ifndef BUILD_BRIDGE
  433. else if (fHints & PLUGIN_IS_BRIDGE)
  434. osc_send_control(&kData->osc.data, PARAMETER_BALANCE_RIGHT, fixedValue);
  435. #endif
  436. }
  437. void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool sendCallback)
  438. {
  439. CARLA_ASSERT(value >= -1.0f && value <= 1.0f);
  440. const float fixedValue = carla_fixValue<float>(-1.0f, 1.0f, value);
  441. kData->postProc.panning = fixedValue;
  442. #ifndef BUILD_BRIDGE
  443. if (sendOsc)
  444. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, fixedValue);
  445. #else
  446. // unused
  447. (void)sendOsc;
  448. #endif
  449. if (sendCallback)
  450. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_PANNING, 0, fixedValue, nullptr);
  451. #ifndef BUILD_BRIDGE
  452. else if (fHints & PLUGIN_IS_BRIDGE)
  453. osc_send_control(&kData->osc.data, PARAMETER_PANNING, fixedValue);
  454. #endif
  455. }
  456. void CarlaPlugin::setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback)
  457. {
  458. CARLA_SAFE_ASSERT(kData->engine->getProccessMode() != PROCESS_MODE_CONTINUOUS_RACK);
  459. if (kData->engine->getProccessMode() == PROCESS_MODE_CONTINUOUS_RACK)
  460. return;
  461. if (kData->ctrlChannel != channel)
  462. {
  463. kData->ctrlChannel = channel;
  464. #ifndef BUILD_BRIDGE
  465. const float ctrlf = channel;
  466. if (sendOsc)
  467. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, ctrlf);
  468. #else
  469. // unused
  470. (void)sendOsc;
  471. #endif
  472. if (sendCallback)
  473. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_CTRL_CHANNEL, 0, channel, nullptr);
  474. #ifndef BUILD_BRIDGE
  475. else if (fHints & PLUGIN_IS_BRIDGE)
  476. osc_send_control(&kData->osc.data, PARAMETER_CTRL_CHANNEL, ctrlf);
  477. #endif
  478. }
  479. }
  480. // -------------------------------------------------------------------
  481. // Set data (plugin-specific stuff)
  482. void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback)
  483. {
  484. CARLA_ASSERT(parameterId < kData->param.count);
  485. if (sendGui)
  486. uiParameterChange(parameterId, value);
  487. #ifndef BUILD_BRIDGE
  488. if (sendOsc)
  489. kData->engine->osc_send_control_set_parameter_value(fId, parameterId, value);
  490. #else
  491. // unused
  492. (void)sendOsc;
  493. #endif
  494. if (sendCallback)
  495. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, parameterId, 0, value, nullptr);
  496. }
  497. void CarlaPlugin::setParameterValueByRIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback)
  498. {
  499. CARLA_ASSERT(rindex > PARAMETER_MAX && rindex != PARAMETER_NULL);
  500. if (rindex <= PARAMETER_MAX)
  501. return;
  502. if (rindex == PARAMETER_NULL)
  503. return;
  504. if (rindex == PARAMETER_ACTIVE)
  505. return setActive(value > 0.0, sendOsc, sendCallback);
  506. if (rindex == PARAMETER_DRYWET)
  507. return setDryWet(value, sendOsc, sendCallback);
  508. if (rindex == PARAMETER_VOLUME)
  509. return setVolume(value, sendOsc, sendCallback);
  510. if (rindex == PARAMETER_BALANCE_LEFT)
  511. return setBalanceLeft(value, sendOsc, sendCallback);
  512. if (rindex == PARAMETER_BALANCE_RIGHT)
  513. return setBalanceRight(value, sendOsc, sendCallback);
  514. if (rindex == PARAMETER_PANNING)
  515. return setPanning(value, sendOsc, sendCallback);
  516. if (rindex == PARAMETER_CTRL_CHANNEL)
  517. return setCtrlChannel(int8_t(value), sendOsc, sendCallback);
  518. for (uint32_t i=0; i < kData->param.count; i++)
  519. {
  520. if (kData->param.data[i].rindex == rindex)
  521. return setParameterValue(i, value, sendGui, sendOsc, sendCallback);
  522. }
  523. }
  524. void CarlaPlugin::setParameterMidiChannel(const uint32_t parameterId, uint8_t channel, const bool sendOsc, const bool sendCallback)
  525. {
  526. CARLA_ASSERT(parameterId < kData->param.count);
  527. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  528. if (channel >= MAX_MIDI_CHANNELS)
  529. channel = MAX_MIDI_CHANNELS;
  530. kData->param.data[parameterId].midiChannel = channel;
  531. #ifndef BUILD_BRIDGE
  532. if (sendOsc)
  533. kData->engine->osc_send_control_set_parameter_midi_channel(fId, parameterId, channel);
  534. #else
  535. // unused
  536. (void)sendOsc;
  537. #endif
  538. if (sendCallback)
  539. kData->engine->callback(CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED, fId, parameterId, channel, 0.0f, nullptr);
  540. }
  541. void CarlaPlugin::setParameterMidiCC(const uint32_t parameterId, int16_t cc, const bool sendOsc, const bool sendCallback)
  542. {
  543. CARLA_ASSERT(parameterId < kData->param.count);
  544. CARLA_ASSERT(cc >= -1);
  545. if (cc < -1 || cc > 0x5F)
  546. cc = -1;
  547. kData->param.data[parameterId].midiCC = cc;
  548. #ifndef BUILD_BRIDGE
  549. if (sendOsc)
  550. kData->engine->osc_send_control_set_parameter_midi_cc(fId, parameterId, cc);
  551. #else
  552. // unused
  553. (void)sendOsc;
  554. #endif
  555. if (sendCallback)
  556. kData->engine->callback(CALLBACK_PARAMETER_MIDI_CC_CHANGED, fId, parameterId, cc, 0.0f, nullptr);
  557. }
  558. void CarlaPlugin::setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui)
  559. {
  560. CARLA_ASSERT(type != nullptr);
  561. CARLA_ASSERT(key != nullptr);
  562. CARLA_ASSERT(value != nullptr);
  563. if (type == nullptr)
  564. return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - type is invalid", type, key, value, bool2str(sendGui));
  565. if (key == nullptr)
  566. return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - key is null", type, key, value, bool2str(sendGui));
  567. if (value == nullptr)
  568. return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - value is null", type, key, value, bool2str(sendGui));
  569. bool saveData = true;
  570. if (std::strcmp(type, CUSTOM_DATA_STRING) == 0)
  571. {
  572. // Ignore some keys
  573. if (std::strncmp(key, "OSC:", 4) == 0 || std::strcmp(key, "guiVisible") == 0)
  574. saveData = false;
  575. //else if (strcmp(key, CARLA_BRIDGE_MSG_SAVE_NOW) == 0 || strcmp(key, CARLA_BRIDGE_MSG_SET_CHUNK) == 0 || strcmp(key, CARLA_BRIDGE_MSG_SET_CUSTOM) == 0)
  576. // saveData = false;
  577. }
  578. if (saveData)
  579. {
  580. #if 0
  581. // Check if we already have this key
  582. for (size_t i=0; i < kData->custom.count(); i++)
  583. {
  584. if (strcmp(custom[i].key, key) == 0)
  585. {
  586. delete[] custom[i].value;
  587. custom[i].value = carla_strdup(value);
  588. return;
  589. }
  590. }
  591. #endif
  592. // Otherwise store it
  593. CustomData newData;
  594. newData.type = carla_strdup(type);
  595. newData.key = carla_strdup(key);
  596. newData.value = carla_strdup(value);
  597. kData->custom.append(newData);
  598. }
  599. }
  600. void CarlaPlugin::setChunkData(const char* const stringData)
  601. {
  602. CARLA_ASSERT(stringData != nullptr);
  603. return;
  604. // unused
  605. (void)stringData;
  606. }
  607. void CarlaPlugin::setProgram(const int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback, const bool)
  608. {
  609. CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(kData->prog.count));
  610. if (index > static_cast<int32_t>(kData->prog.count))
  611. return;
  612. const int32_t fixedIndex = carla_fixValue<int32_t>(-1, kData->prog.count, index);
  613. kData->prog.current = fixedIndex;
  614. // Change default parameter values
  615. if (fixedIndex >= 0)
  616. {
  617. if (sendGui)
  618. uiProgramChange(fixedIndex);
  619. for (uint32_t i=0; i < kData->param.count; i++)
  620. {
  621. // FIXME?
  622. kData->param.ranges[i].def = getParameterValue(i);
  623. kData->param.ranges[i].fixDefault();
  624. if (sendOsc)
  625. {
  626. #ifndef BUILD_BRIDGE
  627. kData->engine->osc_send_control_set_default_value(fId, i, kData->param.ranges[i].def);
  628. kData->engine->osc_send_control_set_parameter_value(fId, i, kData->param.ranges[i].def);
  629. #endif
  630. }
  631. }
  632. }
  633. #ifndef BUILD_BRIDGE
  634. if (sendOsc)
  635. kData->engine->osc_send_control_set_program(fId, fixedIndex);
  636. #endif
  637. if (sendCallback)
  638. kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr);
  639. }
  640. void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback, const bool)
  641. {
  642. CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(kData->midiprog.count));
  643. if (index > static_cast<int32_t>(kData->midiprog.count))
  644. return;
  645. const int32_t fixedIndex = carla_fixValue<int32_t>(-1, kData->midiprog.count, index);
  646. kData->midiprog.current = fixedIndex;
  647. if (fixedIndex >= 0)
  648. {
  649. if (sendGui)
  650. uiMidiProgramChange(fixedIndex);
  651. // Change default parameter values (sound banks never change defaults)
  652. #ifndef BUILD_BRIDGE // FIXME
  653. if (type() != PLUGIN_GIG && type() != PLUGIN_SF2 && type() != PLUGIN_SFZ)
  654. #endif
  655. {
  656. for (uint32_t i=0; i < kData->param.count; i++)
  657. {
  658. // FIXME?
  659. kData->param.ranges[i].def = getParameterValue(i);
  660. kData->param.ranges[i].fixDefault();
  661. if (sendOsc)
  662. {
  663. #ifndef BUILD_BRIDGE
  664. kData->engine->osc_send_control_set_default_value(fId, i, kData->param.ranges[i].def);
  665. kData->engine->osc_send_control_set_parameter_value(fId, i, kData->param.ranges[i].def);
  666. #endif
  667. }
  668. }
  669. }
  670. }
  671. #ifndef BUILD_BRIDGE
  672. if (sendOsc)
  673. kData->engine->osc_send_control_set_midi_program(fId, fixedIndex);
  674. #endif
  675. if (sendCallback)
  676. kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr);
  677. }
  678. void CarlaPlugin::setMidiProgramById(const uint32_t bank, const uint32_t program, const bool sendGui, const bool sendOsc, const bool sendCallback, const bool block)
  679. {
  680. for (uint32_t i=0; i < kData->midiprog.count; i++)
  681. {
  682. if (kData->midiprog.data[i].bank == bank && kData->midiprog.data[i].program == program)
  683. return setMidiProgram(i, sendGui, sendOsc, sendCallback, block);
  684. }
  685. }
  686. // -------------------------------------------------------------------
  687. // Set gui stuff
  688. void CarlaPlugin::showGui(const bool yesNo)
  689. {
  690. return;
  691. // unused
  692. (void)yesNo;
  693. }
  694. void CarlaPlugin::idleGui()
  695. {
  696. if (! fEnabled)
  697. return;
  698. if (fHints & PLUGIN_USES_SINGLE_THREAD)
  699. {
  700. // Process postponed events
  701. postRtEventsRun();
  702. // Update parameter outputs
  703. for (uint32_t i=0; i < kData->param.count; i++)
  704. {
  705. if (kData->param.data[i].type == PARAMETER_OUTPUT)
  706. uiParameterChange(i, getParameterValue(i));
  707. }
  708. }
  709. }
  710. // -------------------------------------------------------------------
  711. // Plugin state
  712. void CarlaPlugin::reload()
  713. {
  714. }
  715. void CarlaPlugin::reloadPrograms(const bool)
  716. {
  717. }
  718. void CarlaPlugin::prepareForSave()
  719. {
  720. }
  721. // -------------------------------------------------------------------
  722. // Plugin processing
  723. void CarlaPlugin::process(float** const, float** const, const uint32_t)
  724. {
  725. }
  726. void CarlaPlugin::bufferSizeChanged(const uint32_t)
  727. {
  728. }
  729. void CarlaPlugin::sampleRateChanged(const double)
  730. {
  731. }
  732. void CarlaPlugin::recreateLatencyBuffers()
  733. {
  734. #if 0
  735. if (kData->latencyBuffers)
  736. {
  737. for (uint32_t i=0; i < kData->audioIn.count; i++)
  738. delete[] kData->latencyBuffers[i];
  739. delete[] kData->latencyBuffers;
  740. }
  741. if (kData->audioIn.count > 0 && kData->latency > 0)
  742. {
  743. kData->latencyBuffers = new float*[kData->audioIn.count];
  744. for (uint32_t i=0; i < kData->audioIn.count; i++)
  745. kData->latencyBuffers[i] = new float[kData->latency];
  746. }
  747. else
  748. kData->latencyBuffers = nullptr;
  749. #endif
  750. }
  751. // -------------------------------------------------------------------
  752. // OSC stuff
  753. void CarlaPlugin::registerToOscClient()
  754. {
  755. #ifdef BUILD_BRIDGE
  756. if (! kData->engine->isOscBridgeRegistered())
  757. return;
  758. #else
  759. if (! kData->engine->isOscControlRegistered())
  760. return;
  761. #endif
  762. #ifndef BUILD_BRIDGE
  763. kData->engine->osc_send_control_add_plugin_start(fId, fName);
  764. #endif
  765. // Base data
  766. {
  767. char bufName[STR_MAX] = { 0 };
  768. char bufLabel[STR_MAX] = { 0 };
  769. char bufMaker[STR_MAX] = { 0 };
  770. char bufCopyright[STR_MAX] = { 0 };
  771. getRealName(bufName);
  772. getLabel(bufLabel);
  773. getMaker(bufMaker);
  774. getCopyright(bufCopyright);
  775. #ifdef BUILD_BRIDGE
  776. kData->engine->osc_send_bridge_plugin_info(category(), fHints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId());
  777. #else
  778. kData->engine->osc_send_control_set_plugin_data(fId, type(), category(), fHints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId());
  779. #endif
  780. }
  781. // Base count
  782. {
  783. uint32_t cIns, cOuts, cTotals;
  784. getParameterCountInfo(&cIns, &cOuts, &cTotals);
  785. #ifdef BUILD_BRIDGE
  786. kData->engine->osc_send_bridge_audio_count(audioInCount(), audioOutCount(), audioInCount() + audioOutCount());
  787. kData->engine->osc_send_bridge_midi_count(midiInCount(), midiOutCount(), midiInCount() + midiOutCount());
  788. kData->engine->osc_send_bridge_parameter_count(cIns, cOuts, cTotals);
  789. #else
  790. kData->engine->osc_send_control_set_plugin_ports(fId, audioInCount(), audioOutCount(), midiInCount(), midiOutCount(), cIns, cOuts, cTotals);
  791. #endif
  792. }
  793. // Plugin Parameters
  794. if (kData->param.count > 0 && kData->param.count < kData->engine->getOptions().maxParameters)
  795. {
  796. char bufName[STR_MAX], bufUnit[STR_MAX];
  797. for (uint32_t i=0; i < kData->param.count; i++)
  798. {
  799. getParameterName(i, bufName);
  800. getParameterUnit(i, bufUnit);
  801. const ParameterData& paramData(kData->param.data[i]);
  802. const ParameterRanges& paramRanges(kData->param.ranges[i]);
  803. #ifdef BUILD_BRIDGE
  804. kData->engine->osc_send_bridge_parameter_info(i, bufName, bufUnit);
  805. kData->engine->osc_send_bridge_parameter_data(i, paramData.type, paramData.rindex, paramData.hints, paramData.midiChannel, paramData.midiCC);
  806. kData->engine->osc_send_bridge_parameter_ranges(i, paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
  807. kData->engine->osc_send_bridge_set_parameter_value(i, getParameterValue(i));
  808. #else
  809. kData->engine->osc_send_control_set_parameter_data(fId, i, paramData.type, paramData.hints, bufName, bufUnit, getParameterValue(i));
  810. kData->engine->osc_send_control_set_parameter_ranges(fId, i, paramRanges.min, paramRanges.max, paramRanges.def, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
  811. kData->engine->osc_send_control_set_parameter_midi_cc(fId, i, paramData.midiCC);
  812. kData->engine->osc_send_control_set_parameter_midi_channel(fId, i, paramData.midiChannel);
  813. kData->engine->osc_send_control_set_parameter_value(fId, i, getParameterValue(i));
  814. #endif
  815. }
  816. }
  817. // Programs
  818. if (kData->prog.count > 0)
  819. {
  820. #ifdef BUILD_BRIDGE
  821. kData->engine->osc_send_bridge_program_count(kData->prog.count);
  822. for (uint32_t i=0; i < kData->prog.count; i++)
  823. kData->engine->osc_send_bridge_program_info(i, kData->prog.names[i]);
  824. kData->engine->osc_send_bridge_set_program(kData->prog.current);
  825. #else
  826. kData->engine->osc_send_control_set_program_count(fId, kData->prog.count);
  827. for (uint32_t i=0; i < kData->prog.count; i++)
  828. kData->engine->osc_send_control_set_program_name(fId, i, kData->prog.names[i]);
  829. kData->engine->osc_send_control_set_program(fId, kData->prog.current);
  830. #endif
  831. }
  832. // MIDI Programs
  833. if (kData->midiprog.count > 0)
  834. {
  835. #ifdef BUILD_BRIDGE
  836. kData->engine->osc_send_bridge_midi_program_count(kData->midiprog.count);
  837. for (uint32_t i=0; i < kData->midiprog.count; i++)
  838. {
  839. const MidiProgramData& mpData(kData->midiprog.data[i]);
  840. kData->engine->osc_send_bridge_midi_program_info(i, mpData.bank, mpData.program, mpData.name);
  841. }
  842. kData->engine->osc_send_bridge_set_midi_program(kData->midiprog.current);
  843. #else
  844. kData->engine->osc_send_control_set_midi_program_count(fId, kData->midiprog.count);
  845. for (uint32_t i=0; i < kData->midiprog.count; i++)
  846. {
  847. const MidiProgramData& mpData(kData->midiprog.data[i]);
  848. kData->engine->osc_send_control_set_midi_program_data(fId, i, mpData.bank, mpData.program, mpData.name);
  849. }
  850. kData->engine->osc_send_control_set_midi_program(fId, kData->midiprog.current);
  851. #endif
  852. }
  853. #ifndef BUILD_BRIDGE
  854. kData->engine->osc_send_control_add_plugin_end(fId);
  855. // Internal Parameters
  856. {
  857. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, kData->active ? 1.0 : 0.0);
  858. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, kData->postProc.dryWet);
  859. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, kData->postProc.volume);
  860. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, kData->postProc.balanceLeft);
  861. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, kData->postProc.balanceRight);
  862. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, kData->postProc.panning);
  863. }
  864. #endif
  865. }
  866. void CarlaPlugin::updateOscData(const lo_address& source, const char* const url)
  867. {
  868. // FIXME - remove debug prints later
  869. carla_stdout("CarlaPlugin::updateOscData(%p, \"%s\")", source, url);
  870. kData->osc.data.free();
  871. const int proto = lo_address_get_protocol(source);
  872. {
  873. const char* host = lo_address_get_hostname(source);
  874. const char* port = lo_address_get_port(source);
  875. kData->osc.data.source = lo_address_new_with_proto(proto, host, port);
  876. carla_stdout("CarlaPlugin::updateOscData() - source: host \"%s\", port \"%s\"", host, port);
  877. }
  878. {
  879. char* host = lo_url_get_hostname(url);
  880. char* port = lo_url_get_port(url);
  881. kData->osc.data.path = carla_strdup_free(lo_url_get_path(url));
  882. kData->osc.data.target = lo_address_new_with_proto(proto, host, port);
  883. carla_stdout("CarlaPlugin::updateOscData() - target: host \"%s\", port \"%s\", path \"%s\"", host, port, kData->osc.data.path);
  884. std::free(host);
  885. std::free(port);
  886. }
  887. #ifndef BUILD_BRIDGE
  888. if (fHints & PLUGIN_IS_BRIDGE)
  889. return;
  890. #endif
  891. osc_send_sample_rate(&kData->osc.data, kData->engine->getSampleRate());
  892. #if 0
  893. for (size_t i=0; i < kData->custom.count(); i++)
  894. {
  895. // TODO
  896. //if (m_type == PLUGIN_LV2)
  897. //osc_send_lv2_transfer_event(&osc.data, getCustomDataTypeString(custom[i].type), /*custom[i].key,*/ custom[i].value);
  898. //else
  899. if (custom[i].type == CUSTOM_DATA_STRING)
  900. osc_send_configure(&osc.data, custom[i].key, custom[i].value);
  901. }
  902. #endif
  903. if (kData->prog.current >= 0)
  904. osc_send_program(&kData->osc.data, kData->prog.current);
  905. if (kData->midiprog.current >= 0)
  906. {
  907. const MidiProgramData& curMidiProg(kData->midiprog.getCurrent());
  908. if (type() == PLUGIN_DSSI)
  909. osc_send_program(&kData->osc.data, curMidiProg.bank, curMidiProg.program);
  910. else
  911. osc_send_midi_program(&kData->osc.data, curMidiProg.bank, curMidiProg.program);
  912. }
  913. for (uint32_t i=0; i < kData->param.count; i++)
  914. osc_send_control(&kData->osc.data, kData->param.data[i].rindex, getParameterValue(i));
  915. carla_stdout("CarlaPlugin::updateOscData() - done");
  916. }
  917. void CarlaPlugin::freeOscData()
  918. {
  919. kData->osc.data.free();
  920. }
  921. bool CarlaPlugin::waitForOscGuiShow()
  922. {
  923. carla_stdout("CarlaPlugin::waitForOscGuiShow()");
  924. // wait for UI 'update' call
  925. for (uint i=0, oscUiTimeout = kData->engine->getOptions().oscUiTimeout; i < oscUiTimeout; i++)
  926. {
  927. if (kData->osc.data.target)
  928. {
  929. carla_stdout("CarlaPlugin::waitForOscGuiShow() - got response, asking UI to show itself now");
  930. osc_send_show(&kData->osc.data);
  931. return true;
  932. }
  933. else
  934. carla_msleep(100);
  935. }
  936. carla_stdout("CarlaPlugin::waitForOscGuiShow() - Timeout while waiting for UI to respond (waited %u msecs)", kData->engine->getOptions().oscUiTimeout);
  937. return false;
  938. }
  939. // -------------------------------------------------------------------
  940. // MIDI events
  941. void CarlaPlugin::sendMidiSingleNote(const uint8_t channel, const uint8_t note, const uint8_t velo, const bool sendGui, const bool sendOsc, const bool sendCallback)
  942. {
  943. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  944. CARLA_ASSERT(note < MAX_MIDI_NOTE);
  945. CARLA_ASSERT(velo < MAX_MIDI_VALUE);
  946. if (! kData->active)
  947. return;
  948. ExternalMidiNote extNote;
  949. extNote.channel = channel;
  950. extNote.note = note;
  951. extNote.velo = velo;
  952. kData->extNotes.mutex.lock();
  953. kData->extNotes.append(extNote);
  954. kData->extNotes.mutex.unlock();
  955. if (sendGui)
  956. {
  957. if (velo > 0)
  958. uiNoteOn(channel, note, velo);
  959. else
  960. uiNoteOff(channel, note);
  961. }
  962. #ifndef BUILD_BRIDGE
  963. if (sendOsc)
  964. {
  965. if (velo > 0)
  966. kData->engine->osc_send_control_note_on(fId, channel, note, velo);
  967. else
  968. kData->engine->osc_send_control_note_off(fId, channel, note);
  969. }
  970. #else
  971. // unused
  972. (void)sendOsc;
  973. #endif
  974. if (sendCallback)
  975. kData->engine->callback(velo ? CALLBACK_NOTE_ON : CALLBACK_NOTE_OFF, fId, channel, note, velo, nullptr);
  976. }
  977. void CarlaPlugin::sendMidiAllNotesOff()
  978. {
  979. kData->postRtEvents.mutex.lock();
  980. PluginPostRtEvent postEvent;
  981. postEvent.type = kPluginPostRtEventNoteOff;
  982. postEvent.value1 = kData->ctrlChannel;
  983. postEvent.value2 = 0;
  984. postEvent.value3 = 0.0;
  985. for (unsigned short i=0; i < MAX_MIDI_NOTE; i++)
  986. {
  987. postEvent.value2 = i;
  988. kData->postRtEvents.data.append(postEvent);
  989. }
  990. kData->postRtEvents.mutex.unlock();
  991. }
  992. // -------------------------------------------------------------------
  993. // Post-poned events
  994. void CarlaPlugin::postponeRtEvent(const PluginPostRtEventType type, const int32_t value1, const int32_t value2, const double value3)
  995. {
  996. PluginPostRtEvent event;
  997. event.type = type;
  998. event.value1 = value1;
  999. event.value2 = value2;
  1000. event.value3 = value3;
  1001. kData->postRtEvents.appendRT(event);
  1002. }
  1003. void CarlaPlugin::postRtEventsRun()
  1004. {
  1005. unsigned short k = 0;
  1006. PluginPostRtEvent listData[MAX_RT_EVENTS];
  1007. // Make a safe copy of events while clearing them
  1008. kData->postRtEvents.mutex.lock();
  1009. while (! kData->postRtEvents.data.isEmpty())
  1010. {
  1011. PluginPostRtEvent& event = kData->postRtEvents.data.getFirst(true);
  1012. listData[k++] = event;
  1013. //std::memcpy(&listData[k++], &event, sizeof(PluginPostRtEvent));
  1014. }
  1015. kData->postRtEvents.mutex.unlock();
  1016. // Handle events now
  1017. for (unsigned short i=0; i < k; i++)
  1018. {
  1019. const PluginPostRtEvent& event = listData[i];
  1020. switch (event.type)
  1021. {
  1022. case kPluginPostRtEventNull:
  1023. break;
  1024. case kPluginPostRtEventDebug:
  1025. kData->engine->callback(CALLBACK_DEBUG, fId, event.value1, event.value2, event.value3, nullptr);
  1026. break;
  1027. case kPluginPostRtEventParameterChange:
  1028. // Update UI
  1029. if (event.value1 >= 0)
  1030. uiParameterChange(event.value1, event.value3);
  1031. #ifndef BUILD_BRIDGE
  1032. // Update OSC control client
  1033. if (kData->engine->isOscControlRegistered())
  1034. kData->engine->osc_send_control_set_parameter_value(fId, event.value1, event.value3);
  1035. #endif
  1036. // Update Host
  1037. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, event.value1, 0, event.value3, nullptr);
  1038. break;
  1039. case kPluginPostRtEventProgramChange:
  1040. // Update UI
  1041. if (event.value1 >= 0)
  1042. uiProgramChange(event.value1);
  1043. #ifndef BUILD_BRIDGE
  1044. // Update OSC control client
  1045. if (kData->engine->isOscControlRegistered())
  1046. {
  1047. kData->engine->osc_send_control_set_program(fId, event.value1);
  1048. for (uint32_t j=0; j < kData->param.count; j++)
  1049. kData->engine->osc_send_control_set_default_value(fId, j, kData->param.ranges[j].def);
  1050. }
  1051. #endif
  1052. // Update Host
  1053. kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, event.value1, 0, 0.0, nullptr);
  1054. break;
  1055. case kPluginPostRtEventMidiProgramChange:
  1056. // Update UI
  1057. if (event.value1 >= 0)
  1058. uiMidiProgramChange(event.value1);
  1059. #ifndef BUILD_BRIDGE
  1060. // Update OSC control client
  1061. if (kData->engine->isOscControlRegistered())
  1062. {
  1063. kData->engine->osc_send_control_set_midi_program(fId, event.value1);
  1064. for (uint32_t j=0; j < kData->param.count; j++)
  1065. kData->engine->osc_send_control_set_default_value(fId, j, kData->param.ranges[j].def);
  1066. }
  1067. #endif
  1068. // Update Host
  1069. kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, event.value1, 0, 0.0, nullptr);
  1070. break;
  1071. case kPluginPostRtEventNoteOn:
  1072. // Update UI
  1073. uiNoteOn(event.value1, event.value2, int(event.value3));
  1074. #ifndef BUILD_BRIDGE
  1075. // Update OSC control client
  1076. if (kData->engine->isOscControlRegistered())
  1077. kData->engine->osc_send_control_note_on(fId, event.value1, event.value2, int(event.value3));
  1078. #endif
  1079. // Update Host
  1080. kData->engine->callback(CALLBACK_NOTE_ON, fId, event.value1, event.value2, int(event.value3), nullptr);
  1081. break;
  1082. case kPluginPostRtEventNoteOff:
  1083. // Update UI
  1084. uiNoteOff(event.value1, event.value2);
  1085. #ifndef BUILD_BRIDGE
  1086. // Update OSC control client
  1087. if (kData->engine->isOscControlRegistered())
  1088. kData->engine->osc_send_control_note_off(fId, event.value1, event.value2);
  1089. #endif
  1090. // Update Host
  1091. kData->engine->callback(CALLBACK_NOTE_OFF, fId, event.value1, event.value2, 0.0, nullptr);
  1092. break;
  1093. }
  1094. }
  1095. }
  1096. void CarlaPlugin::uiParameterChange(const uint32_t index, const float value)
  1097. {
  1098. CARLA_ASSERT(index < parameterCount());
  1099. return;
  1100. // unused
  1101. (void)index;
  1102. (void)value;
  1103. }
  1104. void CarlaPlugin::uiProgramChange(const uint32_t index)
  1105. {
  1106. CARLA_ASSERT(index < programCount());
  1107. return;
  1108. // unused
  1109. (void)index;
  1110. }
  1111. void CarlaPlugin::uiMidiProgramChange(const uint32_t index)
  1112. {
  1113. CARLA_ASSERT(index < midiProgramCount());
  1114. return;
  1115. // unused
  1116. (void)index;
  1117. }
  1118. void CarlaPlugin::uiNoteOn(const uint8_t channel, const uint8_t note, const uint8_t velo)
  1119. {
  1120. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  1121. CARLA_ASSERT(note < MAX_MIDI_NOTE);
  1122. CARLA_ASSERT(velo > 0 && velo < MAX_MIDI_VALUE);
  1123. return;
  1124. // unused
  1125. (void)channel;
  1126. (void)note;
  1127. (void)velo;
  1128. }
  1129. void CarlaPlugin::uiNoteOff(const uint8_t channel, const uint8_t note)
  1130. {
  1131. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  1132. CARLA_ASSERT(note < MAX_MIDI_NOTE);
  1133. return;
  1134. // unused
  1135. (void)channel;
  1136. (void)note;
  1137. }
  1138. // -------------------------------------------------------------------
  1139. // Cleanup
  1140. void CarlaPlugin::initBuffers()
  1141. {
  1142. kData->audioIn.initBuffers(kData->engine);
  1143. kData->audioOut.initBuffers(kData->engine);
  1144. kData->event.initBuffers(kData->engine);
  1145. }
  1146. void CarlaPlugin::deleteBuffers()
  1147. {
  1148. carla_debug("CarlaPlugin::deleteBuffers() - start");
  1149. kData->audioIn.clear();
  1150. kData->audioOut.clear();
  1151. kData->param.clear();
  1152. kData->event.clear();
  1153. carla_debug("CarlaPlugin::deleteBuffers() - end");
  1154. }
  1155. // -------------------------------------------------------------------
  1156. // Library functions
  1157. bool CarlaPlugin::libOpen(const char* const filename)
  1158. {
  1159. kData->lib = lib_open(filename);
  1160. return bool(kData->lib);
  1161. }
  1162. bool CarlaPlugin::libClose()
  1163. {
  1164. if (kData->lib == nullptr)
  1165. return false;
  1166. const bool ret = lib_close(kData->lib);
  1167. kData->lib = nullptr;
  1168. return ret;
  1169. }
  1170. void* CarlaPlugin::libSymbol(const char* const symbol)
  1171. {
  1172. return lib_symbol(kData->lib, symbol);
  1173. }
  1174. const char* CarlaPlugin::libError(const char* const filename)
  1175. {
  1176. return lib_error(filename);
  1177. }
  1178. // -------------------------------------------------------------------
  1179. // Scoped Disabler
  1180. CarlaPlugin::ScopedDisabler::ScopedDisabler(CarlaPlugin* const plugin)
  1181. : kPlugin(plugin)
  1182. {
  1183. if (plugin->fEnabled)
  1184. {
  1185. plugin->fEnabled = false;
  1186. plugin->kData->engine->waitForProccessEnd();
  1187. }
  1188. }
  1189. CarlaPlugin::ScopedDisabler::~ScopedDisabler()
  1190. {
  1191. kPlugin->fEnabled = true;
  1192. }
  1193. // -------------------------------------------------------------------
  1194. // CarlaPluginGUI
  1195. #if 0
  1196. CarlaPluginGUI::CarlaPluginGUI(QWidget* const parent, Callback* const callback)
  1197. : QMainWindow(parent),
  1198. kCallback(callback)
  1199. {
  1200. carla_debug("CarlaPluginGUI::CarlaPluginGUI(%p)", parent);
  1201. //CARLA_ASSERT(callback);
  1202. //m_container = new GuiContainer(this);
  1203. //setCentralWidget(m_container);
  1204. //adjustSize();
  1205. //m_container->setParent(this);
  1206. //m_container->show();
  1207. //m_resizable = true;
  1208. //setNewSize(50, 50);
  1209. QMainWindow::setVisible(false);
  1210. }
  1211. CarlaPluginGUI::~CarlaPluginGUI()
  1212. {
  1213. carla_debug("CarlaPluginGUI::~CarlaPluginGUI()");
  1214. //CARLA_ASSERT(m_container);
  1215. // FIXME, automatically deleted by parent ?
  1216. //delete m_container;
  1217. }
  1218. #endif
  1219. #if 0
  1220. // -------------------------------------------------------------------
  1221. GuiContainer* CarlaPluginGUI::getContainer() const
  1222. {
  1223. return m_container;
  1224. }
  1225. WId CarlaPluginGUI::getWinId() const
  1226. {
  1227. return m_container->winId();
  1228. }
  1229. // -------------------------------------------------------------------
  1230. void CarlaPluginGUI::setNewSize(int width, int height)
  1231. {
  1232. carla_debug("CarlaPluginGUI::setNewSize(%i, %i)", width, height);
  1233. if (width < 30)
  1234. width = 30;
  1235. if (height < 30)
  1236. height = 30;
  1237. if (m_resizable)
  1238. {
  1239. resize(width, height);
  1240. }
  1241. else
  1242. {
  1243. setFixedSize(width, height);
  1244. m_container->setFixedSize(width, height);
  1245. }
  1246. }
  1247. void CarlaPluginGUI::setResizable(bool resizable)
  1248. {
  1249. m_resizable = resizable;
  1250. setNewSize(width(), height());
  1251. #ifdef Q_OS_WIN
  1252. if (! resizable)
  1253. setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint);
  1254. #endif
  1255. }
  1256. void CarlaPluginGUI::setTitle(const char* const title)
  1257. {
  1258. CARLA_ASSERT(title);
  1259. setWindowTitle(QString("%1 (GUI)").arg(title));
  1260. }
  1261. void CarlaPluginGUI::setVisible(const bool yesNo)
  1262. {
  1263. carla_debug("CarlaPluginGUI::setVisible(%s)", bool2str(yesNo));
  1264. if (yesNo)
  1265. {
  1266. if (! m_geometry.isNull())
  1267. restoreGeometry(m_geometry);
  1268. }
  1269. else
  1270. m_geometry = saveGeometry();
  1271. QMainWindow::setVisible(yesNo);
  1272. }
  1273. // -------------------------------------------------------------------
  1274. void CarlaPluginGUI::hideEvent(QHideEvent* const event)
  1275. {
  1276. carla_debug("CarlaPluginGUI::hideEvent(%p)", event);
  1277. CARLA_ASSERT(event);
  1278. event->accept();
  1279. close();
  1280. }
  1281. void CarlaPluginGUI::closeEvent(QCloseEvent* const event)
  1282. {
  1283. carla_debug("CarlaPluginGUI::closeEvent(%p)", event);
  1284. CARLA_ASSERT(event);
  1285. if (event->spontaneous())
  1286. {
  1287. if (m_callback)
  1288. m_callback->guiClosedCallback();
  1289. QMainWindow::closeEvent(event);
  1290. return;
  1291. }
  1292. event->ignore();
  1293. }
  1294. #endif
  1295. // -------------------------------------------------------------------
  1296. CARLA_BACKEND_END_NAMESPACE