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.

1791 lines
49KB

  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, const uint32_t index)
  36. {
  37. return CarlaPluginProtectedData::getAudioInPort(plugin, index);
  38. }
  39. CarlaEngineAudioPort* CarlaPluginGetAudioOutPort(CarlaPlugin* const plugin, const 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))
  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 0x0;
  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. const SaveState& CarlaPlugin::getSaveState()
  306. {
  307. static SaveState saveState;
  308. saveState.reset();
  309. prepareForSave();
  310. char strBuf[STR_MAX];
  311. // ----------------------------
  312. // Basic info
  313. switch (type())
  314. {
  315. case PLUGIN_INTERNAL:
  316. saveState.type = carla_strdup("Internal");
  317. break;
  318. case PLUGIN_LADSPA:
  319. saveState.type = carla_strdup("LADSPA");
  320. break;
  321. case PLUGIN_DSSI:
  322. saveState.type = carla_strdup("DSSI");
  323. break;
  324. case PLUGIN_LV2:
  325. saveState.type = carla_strdup("LV2");
  326. break;
  327. case PLUGIN_VST:
  328. saveState.type = carla_strdup("VST");
  329. break;
  330. case PLUGIN_GIG:
  331. saveState.type = carla_strdup("GIG");
  332. break;
  333. case PLUGIN_SF2:
  334. saveState.type = carla_strdup("SF2");
  335. break;
  336. case PLUGIN_SFZ:
  337. saveState.type = carla_strdup("SFZ");
  338. break;
  339. default:
  340. saveState.type = carla_strdup("Unknown");
  341. break;
  342. }
  343. getLabel(strBuf);
  344. saveState.name = carla_strdup(fName);
  345. saveState.label = carla_strdup(strBuf);
  346. saveState.binary = carla_strdup(fFilename);
  347. saveState.uniqueID = uniqueId();
  348. // ----------------------------
  349. // Internals
  350. saveState.active = kData->active;
  351. saveState.dryWet = kData->postProc.dryWet;
  352. saveState.volume = kData->postProc.volume;
  353. saveState.balanceLeft = kData->postProc.balanceLeft;
  354. saveState.balanceRight = kData->postProc.balanceRight;
  355. saveState.panning = kData->postProc.panning;
  356. // ----------------------------
  357. // Current Program
  358. if (kData->prog.current >= 0)
  359. {
  360. saveState.currentProgramIndex = kData->prog.current;
  361. saveState.currentProgramName = carla_strdup(kData->prog.names[kData->prog.current]);
  362. }
  363. // ----------------------------
  364. // Current MIDI Program
  365. if (kData->midiprog.current >= 0)
  366. {
  367. const MidiProgramData& mpData = kData->midiprog.getCurrent();
  368. saveState.currentMidiBank = mpData.bank;
  369. saveState.currentMidiProgram = mpData.program;
  370. }
  371. // ----------------------------
  372. // Parameters
  373. float sampleRate = kData->engine->getSampleRate();
  374. for (uint32_t i=0, count=kData->param.count; i < count; i++)
  375. {
  376. const ParameterData& paramData = kData->param.data[i];
  377. if (paramData.type != PARAMETER_INPUT)
  378. continue;
  379. StateParameter stateParameter;
  380. stateParameter.index = paramData.index;
  381. stateParameter.midiCC = paramData.midiCC;
  382. stateParameter.midiChannel = paramData.midiChannel + 1;
  383. getParameterName(i, strBuf);
  384. stateParameter.name = carla_strdup(strBuf);
  385. getParameterSymbol(i, strBuf);
  386. stateParameter.symbol = carla_strdup(strBuf);;
  387. stateParameter.value = getParameterValue(i);
  388. if (paramData.hints & PARAMETER_USES_SAMPLERATE)
  389. stateParameter.value /= sampleRate;
  390. saveState.parameters.push_back(stateParameter);
  391. }
  392. // ----------------------------
  393. // Custom Data
  394. for (uint32_t i=0, count=customDataCount(); i < count; i++)
  395. {
  396. const CustomData& cData = customData(i);
  397. if (cData.type == nullptr)
  398. continue;
  399. StateCustomData stateCustomData;
  400. stateCustomData.type = carla_strdup(cData.type);
  401. stateCustomData.key = carla_strdup(cData.key);
  402. stateCustomData.value = carla_strdup(cData.value);
  403. saveState.customData.push_back(stateCustomData);
  404. }
  405. // ----------------------------
  406. // Chunk
  407. if (fOptions & PLUGIN_OPTION_USE_CHUNKS)
  408. {
  409. void* data = nullptr;
  410. const int32_t dataSize = chunkData(&data);
  411. if (data != nullptr && dataSize >= 4)
  412. {
  413. CarlaString chunkStr;
  414. chunkStr.importBinaryAsBase64((const uint8_t*)data, static_cast<size_t>(dataSize));
  415. saveState.chunk = carla_strdup(chunkStr);
  416. }
  417. }
  418. return saveState;
  419. }
  420. void CarlaPlugin::loadSaveState(const SaveState& saveState)
  421. {
  422. // TODO
  423. Q_UNUSED(saveState);
  424. }
  425. // -------------------------------------------------------------------
  426. // Set data (internal stuff)
  427. void CarlaPlugin::setId(const unsigned int id)
  428. {
  429. fId = id;
  430. if (kData->engine->getProccessMode() == PROCESS_MODE_CONTINUOUS_RACK)
  431. {
  432. CARLA_ASSERT(id < MAX_RACK_PLUGINS);
  433. if (id >= MAX_RACK_PLUGINS || kData->ctrlChannel == static_cast<int8_t>(id))
  434. return;
  435. kData->ctrlChannel = id;
  436. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_CTRL_CHANNEL, 0, id, nullptr);
  437. }
  438. }
  439. void CarlaPlugin::setOption(const unsigned int option, const bool yesNo)
  440. {
  441. if (yesNo)
  442. fOptions |= option;
  443. else
  444. fOptions &= ~option;
  445. }
  446. void CarlaPlugin::setEnabled(const bool yesNo)
  447. {
  448. fEnabled = yesNo;
  449. }
  450. void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool sendCallback)
  451. {
  452. kData->active = active;
  453. const float value = active ? 1.0f : 0.0f;
  454. #ifndef BUILD_BRIDGE
  455. if (sendOsc)
  456. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, value);
  457. #else
  458. // unused
  459. (void)sendOsc;
  460. #endif
  461. if (sendCallback)
  462. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_ACTIVE, 0, value, nullptr);
  463. #ifndef BUILD_BRIDGE
  464. else if (fHints & PLUGIN_IS_BRIDGE)
  465. osc_send_control(&kData->osc.data, PARAMETER_ACTIVE, value);
  466. #endif
  467. }
  468. void CarlaPlugin::setDryWet(const float value, const bool sendOsc, const bool sendCallback)
  469. {
  470. CARLA_ASSERT(value >= 0.0f && value <= 1.0f);
  471. const float fixedValue = carla_fixValue<float>(0.0f, 1.0f, value);
  472. kData->postProc.dryWet = fixedValue;
  473. #ifndef BUILD_BRIDGE
  474. if (sendOsc)
  475. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, fixedValue);
  476. #else
  477. // unused
  478. (void)sendOsc;
  479. #endif
  480. if (sendCallback)
  481. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_DRYWET, 0, fixedValue, nullptr);
  482. #ifndef BUILD_BRIDGE
  483. else if (fHints & PLUGIN_IS_BRIDGE)
  484. osc_send_control(&kData->osc.data, PARAMETER_DRYWET, fixedValue);
  485. #endif
  486. }
  487. void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool sendCallback)
  488. {
  489. CARLA_ASSERT(value >= 0.0f && value <= 1.27f);
  490. const float fixedValue = carla_fixValue<float>(0.0f, 1.27f, value);
  491. kData->postProc.volume = fixedValue;
  492. #ifndef BUILD_BRIDGE
  493. if (sendOsc)
  494. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, fixedValue);
  495. #else
  496. // unused
  497. (void)sendOsc;
  498. #endif
  499. if (sendCallback)
  500. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_VOLUME, 0, fixedValue, nullptr);
  501. #ifndef BUILD_BRIDGE
  502. else if (fHints & PLUGIN_IS_BRIDGE)
  503. osc_send_control(&kData->osc.data, PARAMETER_VOLUME, fixedValue);
  504. #endif
  505. }
  506. void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bool sendCallback)
  507. {
  508. CARLA_ASSERT(value >= -1.0f && value <= 1.0f);
  509. const float fixedValue = carla_fixValue<float>(-1.0f, 1.0f, value);
  510. kData->postProc.balanceLeft = fixedValue;
  511. #ifndef BUILD_BRIDGE
  512. if (sendOsc)
  513. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, fixedValue);
  514. #else
  515. // unused
  516. (void)sendOsc;
  517. #endif
  518. if (sendCallback)
  519. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_BALANCE_LEFT, 0, fixedValue, nullptr);
  520. #ifndef BUILD_BRIDGE
  521. else if (fHints & PLUGIN_IS_BRIDGE)
  522. osc_send_control(&kData->osc.data, PARAMETER_BALANCE_LEFT, fixedValue);
  523. #endif
  524. }
  525. void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const bool sendCallback)
  526. {
  527. CARLA_ASSERT(value >= -1.0f && value <= 1.0f);
  528. const float fixedValue = carla_fixValue<float>(-1.0f, 1.0f, value);
  529. kData->postProc.balanceRight = fixedValue;
  530. #ifndef BUILD_BRIDGE
  531. if (sendOsc)
  532. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, fixedValue);
  533. #else
  534. // unused
  535. (void)sendOsc;
  536. #endif
  537. if (sendCallback)
  538. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_BALANCE_RIGHT, 0, fixedValue, nullptr);
  539. #ifndef BUILD_BRIDGE
  540. else if (fHints & PLUGIN_IS_BRIDGE)
  541. osc_send_control(&kData->osc.data, PARAMETER_BALANCE_RIGHT, fixedValue);
  542. #endif
  543. }
  544. void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool sendCallback)
  545. {
  546. CARLA_ASSERT(value >= -1.0f && value <= 1.0f);
  547. const float fixedValue = carla_fixValue<float>(-1.0f, 1.0f, value);
  548. kData->postProc.panning = fixedValue;
  549. #ifndef BUILD_BRIDGE
  550. if (sendOsc)
  551. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, fixedValue);
  552. #else
  553. // unused
  554. (void)sendOsc;
  555. #endif
  556. if (sendCallback)
  557. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_PANNING, 0, fixedValue, nullptr);
  558. #ifndef BUILD_BRIDGE
  559. else if (fHints & PLUGIN_IS_BRIDGE)
  560. osc_send_control(&kData->osc.data, PARAMETER_PANNING, fixedValue);
  561. #endif
  562. }
  563. void CarlaPlugin::setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback)
  564. {
  565. CARLA_SAFE_ASSERT(kData->engine->getProccessMode() != PROCESS_MODE_CONTINUOUS_RACK);
  566. if (kData->engine->getProccessMode() == PROCESS_MODE_CONTINUOUS_RACK)
  567. return;
  568. if (kData->ctrlChannel != channel)
  569. {
  570. {
  571. const ScopedProcessLocker spl(this, true);
  572. kData->ctrlChannel = channel;
  573. }
  574. #ifndef BUILD_BRIDGE
  575. const float ctrlf = channel;
  576. if (sendOsc)
  577. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, ctrlf);
  578. #else
  579. // unused
  580. (void)sendOsc;
  581. #endif
  582. if (sendCallback)
  583. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_CTRL_CHANNEL, 0, channel, nullptr);
  584. #ifndef BUILD_BRIDGE
  585. else if (fHints & PLUGIN_IS_BRIDGE)
  586. osc_send_control(&kData->osc.data, PARAMETER_CTRL_CHANNEL, ctrlf);
  587. #endif
  588. }
  589. }
  590. // -------------------------------------------------------------------
  591. // Set data (plugin-specific stuff)
  592. void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback)
  593. {
  594. CARLA_ASSERT(parameterId < kData->param.count);
  595. if (sendGui)
  596. uiParameterChange(parameterId, value);
  597. #ifndef BUILD_BRIDGE
  598. if (sendOsc)
  599. kData->engine->osc_send_control_set_parameter_value(fId, parameterId, value);
  600. #else
  601. // unused
  602. (void)sendOsc;
  603. #endif
  604. if (sendCallback)
  605. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, parameterId, 0, value, nullptr);
  606. }
  607. void CarlaPlugin::setParameterValueByRIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback)
  608. {
  609. CARLA_ASSERT(rindex > PARAMETER_MAX && rindex != PARAMETER_NULL);
  610. if (rindex <= PARAMETER_MAX)
  611. return;
  612. if (rindex == PARAMETER_NULL)
  613. return;
  614. if (rindex == PARAMETER_ACTIVE)
  615. return setActive(value > 0.0, sendOsc, sendCallback);
  616. if (rindex == PARAMETER_DRYWET)
  617. return setDryWet(value, sendOsc, sendCallback);
  618. if (rindex == PARAMETER_VOLUME)
  619. return setVolume(value, sendOsc, sendCallback);
  620. if (rindex == PARAMETER_BALANCE_LEFT)
  621. return setBalanceLeft(value, sendOsc, sendCallback);
  622. if (rindex == PARAMETER_BALANCE_RIGHT)
  623. return setBalanceRight(value, sendOsc, sendCallback);
  624. if (rindex == PARAMETER_PANNING)
  625. return setPanning(value, sendOsc, sendCallback);
  626. if (rindex == PARAMETER_CTRL_CHANNEL)
  627. return setCtrlChannel(int8_t(value), sendOsc, sendCallback);
  628. for (uint32_t i=0; i < kData->param.count; i++)
  629. {
  630. if (kData->param.data[i].rindex == rindex)
  631. return setParameterValue(i, value, sendGui, sendOsc, sendCallback);
  632. }
  633. }
  634. void CarlaPlugin::setParameterMidiChannel(const uint32_t parameterId, uint8_t channel, const bool sendOsc, const bool sendCallback)
  635. {
  636. CARLA_ASSERT(parameterId < kData->param.count);
  637. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  638. if (channel >= MAX_MIDI_CHANNELS)
  639. channel = MAX_MIDI_CHANNELS;
  640. kData->param.data[parameterId].midiChannel = channel;
  641. #ifndef BUILD_BRIDGE
  642. if (sendOsc)
  643. kData->engine->osc_send_control_set_parameter_midi_channel(fId, parameterId, channel);
  644. #else
  645. // unused
  646. (void)sendOsc;
  647. #endif
  648. if (sendCallback)
  649. kData->engine->callback(CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED, fId, parameterId, channel, 0.0f, nullptr);
  650. }
  651. void CarlaPlugin::setParameterMidiCC(const uint32_t parameterId, int16_t cc, const bool sendOsc, const bool sendCallback)
  652. {
  653. CARLA_ASSERT(parameterId < kData->param.count);
  654. CARLA_ASSERT(cc >= -1);
  655. if (cc < -1 || cc > 0x5F)
  656. cc = -1;
  657. kData->param.data[parameterId].midiCC = cc;
  658. #ifndef BUILD_BRIDGE
  659. if (sendOsc)
  660. kData->engine->osc_send_control_set_parameter_midi_cc(fId, parameterId, cc);
  661. #else
  662. // unused
  663. (void)sendOsc;
  664. #endif
  665. if (sendCallback)
  666. kData->engine->callback(CALLBACK_PARAMETER_MIDI_CC_CHANGED, fId, parameterId, cc, 0.0f, nullptr);
  667. }
  668. void CarlaPlugin::setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui)
  669. {
  670. CARLA_ASSERT(type != nullptr);
  671. CARLA_ASSERT(key != nullptr);
  672. CARLA_ASSERT(value != nullptr);
  673. if (type == nullptr)
  674. return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - type is invalid", type, key, value, bool2str(sendGui));
  675. if (key == nullptr)
  676. return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - key is null", type, key, value, bool2str(sendGui));
  677. if (value == nullptr)
  678. return carla_stderr2("CarlaPlugin::setCustomData(\"%s\", \"%s\", \"%s\", %s) - value is null", type, key, value, bool2str(sendGui));
  679. bool saveData = true;
  680. if (std::strcmp(type, CUSTOM_DATA_STRING) == 0)
  681. {
  682. // Ignore some keys
  683. if (std::strncmp(key, "OSC:", 4) == 0 || std::strcmp(key, "guiVisible") == 0)
  684. saveData = false;
  685. //else if (std::strcmp(key, CARLA_BRIDGE_MSG_SAVE_NOW) == 0 || std::strcmp(key, CARLA_BRIDGE_MSG_SET_CHUNK) == 0 || std::strcmp(key, CARLA_BRIDGE_MSG_SET_CUSTOM) == 0)
  686. // saveData = false;
  687. }
  688. if (saveData)
  689. {
  690. #if 0
  691. // Check if we already have this key
  692. for (size_t i=0; i < kData->custom.count(); i++)
  693. {
  694. if (std::strcmp(custom[i].key, key) == 0)
  695. {
  696. delete[] custom[i].value;
  697. custom[i].value = carla_strdup(value);
  698. return;
  699. }
  700. }
  701. #endif
  702. // Otherwise store it
  703. CustomData newData;
  704. newData.type = carla_strdup(type);
  705. newData.key = carla_strdup(key);
  706. newData.value = carla_strdup(value);
  707. kData->custom.append(newData);
  708. }
  709. }
  710. void CarlaPlugin::setChunkData(const char* const stringData)
  711. {
  712. CARLA_ASSERT(stringData != nullptr);
  713. return;
  714. // unused
  715. (void)stringData;
  716. }
  717. void CarlaPlugin::setProgram(const int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback)
  718. {
  719. CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(kData->prog.count));
  720. if (index > static_cast<int32_t>(kData->prog.count))
  721. return;
  722. const int32_t fixedIndex = carla_fixValue<int32_t>(-1, kData->prog.count, index);
  723. kData->prog.current = fixedIndex;
  724. // Change default parameter values
  725. if (fixedIndex >= 0)
  726. {
  727. if (sendGui)
  728. uiProgramChange(fixedIndex);
  729. for (uint32_t i=0; i < kData->param.count; i++)
  730. {
  731. // FIXME?
  732. kData->param.ranges[i].def = getParameterValue(i);
  733. kData->param.ranges[i].fixDefault();
  734. if (sendOsc)
  735. {
  736. #ifndef BUILD_BRIDGE
  737. kData->engine->osc_send_control_set_default_value(fId, i, kData->param.ranges[i].def);
  738. kData->engine->osc_send_control_set_parameter_value(fId, i, kData->param.ranges[i].def);
  739. #endif
  740. }
  741. }
  742. }
  743. #ifndef BUILD_BRIDGE
  744. if (sendOsc)
  745. kData->engine->osc_send_control_set_program(fId, fixedIndex);
  746. #endif
  747. if (sendCallback)
  748. kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr);
  749. }
  750. void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback)
  751. {
  752. CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(kData->midiprog.count));
  753. if (index > static_cast<int32_t>(kData->midiprog.count))
  754. return;
  755. const int32_t fixedIndex = carla_fixValue<int32_t>(-1, kData->midiprog.count, index);
  756. kData->midiprog.current = fixedIndex;
  757. if (fixedIndex >= 0)
  758. {
  759. if (sendGui)
  760. uiMidiProgramChange(fixedIndex);
  761. // Change default parameter values (sound banks never change defaults)
  762. #ifndef BUILD_BRIDGE // FIXME
  763. if (type() != PLUGIN_GIG && type() != PLUGIN_SF2 && type() != PLUGIN_SFZ)
  764. #endif
  765. {
  766. for (uint32_t i=0; i < kData->param.count; i++)
  767. {
  768. // FIXME?
  769. kData->param.ranges[i].def = getParameterValue(i);
  770. kData->param.ranges[i].fixDefault();
  771. if (sendOsc)
  772. {
  773. #ifndef BUILD_BRIDGE
  774. kData->engine->osc_send_control_set_default_value(fId, i, kData->param.ranges[i].def);
  775. kData->engine->osc_send_control_set_parameter_value(fId, i, kData->param.ranges[i].def);
  776. #endif
  777. }
  778. }
  779. }
  780. }
  781. #ifndef BUILD_BRIDGE
  782. if (sendOsc)
  783. kData->engine->osc_send_control_set_midi_program(fId, fixedIndex);
  784. #endif
  785. if (sendCallback)
  786. kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr);
  787. }
  788. void CarlaPlugin::setMidiProgramById(const uint32_t bank, const uint32_t program, const bool sendGui, const bool sendOsc, const bool sendCallback)
  789. {
  790. for (uint32_t i=0; i < kData->midiprog.count; i++)
  791. {
  792. if (kData->midiprog.data[i].bank == bank && kData->midiprog.data[i].program == program)
  793. return setMidiProgram(i, sendGui, sendOsc, sendCallback);
  794. }
  795. }
  796. // -------------------------------------------------------------------
  797. // Set gui stuff
  798. void CarlaPlugin::showGui(const bool yesNo)
  799. {
  800. return;
  801. // unused
  802. (void)yesNo;
  803. }
  804. void CarlaPlugin::idleGui()
  805. {
  806. if (! fEnabled)
  807. return;
  808. if (fHints & PLUGIN_HAS_SINGLE_THREAD)
  809. {
  810. // Process postponed events
  811. postRtEventsRun();
  812. // Update parameter outputs
  813. for (uint32_t i=0; i < kData->param.count; i++)
  814. {
  815. if (kData->param.data[i].type == PARAMETER_OUTPUT)
  816. uiParameterChange(i, getParameterValue(i));
  817. }
  818. }
  819. }
  820. // -------------------------------------------------------------------
  821. // Plugin state
  822. void CarlaPlugin::reload()
  823. {
  824. }
  825. void CarlaPlugin::reloadPrograms(const bool)
  826. {
  827. }
  828. void CarlaPlugin::prepareForSave()
  829. {
  830. }
  831. // -------------------------------------------------------------------
  832. // Plugin processing
  833. void CarlaPlugin::process(float** const, float** const, const uint32_t)
  834. {
  835. }
  836. void CarlaPlugin::bufferSizeChanged(const uint32_t)
  837. {
  838. }
  839. void CarlaPlugin::sampleRateChanged(const double)
  840. {
  841. }
  842. void CarlaPlugin::recreateLatencyBuffers()
  843. {
  844. #if 0
  845. if (kData->latencyBuffers)
  846. {
  847. for (uint32_t i=0; i < kData->audioIn.count; i++)
  848. delete[] kData->latencyBuffers[i];
  849. delete[] kData->latencyBuffers;
  850. }
  851. if (kData->audioIn.count > 0 && kData->latency > 0)
  852. {
  853. kData->latencyBuffers = new float*[kData->audioIn.count];
  854. for (uint32_t i=0; i < kData->audioIn.count; i++)
  855. kData->latencyBuffers[i] = new float[kData->latency];
  856. }
  857. else
  858. kData->latencyBuffers = nullptr;
  859. #endif
  860. }
  861. // -------------------------------------------------------------------
  862. // OSC stuff
  863. void CarlaPlugin::registerToOscClient()
  864. {
  865. #ifdef BUILD_BRIDGE
  866. if (! kData->engine->isOscBridgeRegistered())
  867. return;
  868. #else
  869. if (! kData->engine->isOscControlRegistered())
  870. return;
  871. #endif
  872. #ifndef BUILD_BRIDGE
  873. kData->engine->osc_send_control_add_plugin_start(fId, fName);
  874. #endif
  875. // Base data
  876. {
  877. char bufName[STR_MAX] = { 0 };
  878. char bufLabel[STR_MAX] = { 0 };
  879. char bufMaker[STR_MAX] = { 0 };
  880. char bufCopyright[STR_MAX] = { 0 };
  881. getRealName(bufName);
  882. getLabel(bufLabel);
  883. getMaker(bufMaker);
  884. getCopyright(bufCopyright);
  885. #ifdef BUILD_BRIDGE
  886. kData->engine->osc_send_bridge_plugin_info(category(), fHints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId());
  887. #else
  888. kData->engine->osc_send_control_set_plugin_data(fId, type(), category(), fHints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId());
  889. #endif
  890. }
  891. // Base count
  892. {
  893. uint32_t cIns, cOuts, cTotals;
  894. getParameterCountInfo(&cIns, &cOuts, &cTotals);
  895. #ifdef BUILD_BRIDGE
  896. kData->engine->osc_send_bridge_audio_count(audioInCount(), audioOutCount(), audioInCount() + audioOutCount());
  897. kData->engine->osc_send_bridge_midi_count(midiInCount(), midiOutCount(), midiInCount() + midiOutCount());
  898. kData->engine->osc_send_bridge_parameter_count(cIns, cOuts, cTotals);
  899. #else
  900. kData->engine->osc_send_control_set_plugin_ports(fId, audioInCount(), audioOutCount(), midiInCount(), midiOutCount(), cIns, cOuts, cTotals);
  901. #endif
  902. }
  903. // Plugin Parameters
  904. if (kData->param.count > 0 && kData->param.count < kData->engine->getOptions().maxParameters)
  905. {
  906. char bufName[STR_MAX], bufUnit[STR_MAX];
  907. for (uint32_t i=0; i < kData->param.count; i++)
  908. {
  909. getParameterName(i, bufName);
  910. getParameterUnit(i, bufUnit);
  911. const ParameterData& paramData(kData->param.data[i]);
  912. const ParameterRanges& paramRanges(kData->param.ranges[i]);
  913. #ifdef BUILD_BRIDGE
  914. kData->engine->osc_send_bridge_parameter_info(i, bufName, bufUnit);
  915. kData->engine->osc_send_bridge_parameter_data(i, paramData.type, paramData.rindex, paramData.hints, paramData.midiChannel, paramData.midiCC);
  916. kData->engine->osc_send_bridge_parameter_ranges(i, paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
  917. kData->engine->osc_send_bridge_set_parameter_value(i, getParameterValue(i));
  918. #else
  919. kData->engine->osc_send_control_set_parameter_data(fId, i, paramData.type, paramData.hints, bufName, bufUnit, getParameterValue(i));
  920. kData->engine->osc_send_control_set_parameter_ranges(fId, i, paramRanges.min, paramRanges.max, paramRanges.def, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
  921. kData->engine->osc_send_control_set_parameter_midi_cc(fId, i, paramData.midiCC);
  922. kData->engine->osc_send_control_set_parameter_midi_channel(fId, i, paramData.midiChannel);
  923. kData->engine->osc_send_control_set_parameter_value(fId, i, getParameterValue(i));
  924. #endif
  925. }
  926. }
  927. // Programs
  928. if (kData->prog.count > 0)
  929. {
  930. #ifdef BUILD_BRIDGE
  931. kData->engine->osc_send_bridge_program_count(kData->prog.count);
  932. for (uint32_t i=0; i < kData->prog.count; i++)
  933. kData->engine->osc_send_bridge_program_info(i, kData->prog.names[i]);
  934. kData->engine->osc_send_bridge_set_program(kData->prog.current);
  935. #else
  936. kData->engine->osc_send_control_set_program_count(fId, kData->prog.count);
  937. for (uint32_t i=0; i < kData->prog.count; i++)
  938. kData->engine->osc_send_control_set_program_name(fId, i, kData->prog.names[i]);
  939. kData->engine->osc_send_control_set_program(fId, kData->prog.current);
  940. #endif
  941. }
  942. // MIDI Programs
  943. if (kData->midiprog.count > 0)
  944. {
  945. #ifdef BUILD_BRIDGE
  946. kData->engine->osc_send_bridge_midi_program_count(kData->midiprog.count);
  947. for (uint32_t i=0; i < kData->midiprog.count; i++)
  948. {
  949. const MidiProgramData& mpData(kData->midiprog.data[i]);
  950. kData->engine->osc_send_bridge_midi_program_info(i, mpData.bank, mpData.program, mpData.name);
  951. }
  952. kData->engine->osc_send_bridge_set_midi_program(kData->midiprog.current);
  953. #else
  954. kData->engine->osc_send_control_set_midi_program_count(fId, kData->midiprog.count);
  955. for (uint32_t i=0; i < kData->midiprog.count; i++)
  956. {
  957. const MidiProgramData& mpData(kData->midiprog.data[i]);
  958. kData->engine->osc_send_control_set_midi_program_data(fId, i, mpData.bank, mpData.program, mpData.name);
  959. }
  960. kData->engine->osc_send_control_set_midi_program(fId, kData->midiprog.current);
  961. #endif
  962. }
  963. #ifndef BUILD_BRIDGE
  964. kData->engine->osc_send_control_add_plugin_end(fId);
  965. // Internal Parameters
  966. {
  967. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, kData->active ? 1.0 : 0.0);
  968. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, kData->postProc.dryWet);
  969. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, kData->postProc.volume);
  970. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, kData->postProc.balanceLeft);
  971. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, kData->postProc.balanceRight);
  972. kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, kData->postProc.panning);
  973. }
  974. #endif
  975. }
  976. void CarlaPlugin::updateOscData(const lo_address& source, const char* const url)
  977. {
  978. // FIXME - remove debug prints later
  979. carla_stdout("CarlaPlugin::updateOscData(%p, \"%s\")", source, url);
  980. kData->osc.data.free();
  981. const int proto = lo_address_get_protocol(source);
  982. {
  983. const char* host = lo_address_get_hostname(source);
  984. const char* port = lo_address_get_port(source);
  985. kData->osc.data.source = lo_address_new_with_proto(proto, host, port);
  986. carla_stdout("CarlaPlugin::updateOscData() - source: host \"%s\", port \"%s\"", host, port);
  987. }
  988. {
  989. char* host = lo_url_get_hostname(url);
  990. char* port = lo_url_get_port(url);
  991. kData->osc.data.path = carla_strdup_free(lo_url_get_path(url));
  992. kData->osc.data.target = lo_address_new_with_proto(proto, host, port);
  993. carla_stdout("CarlaPlugin::updateOscData() - target: host \"%s\", port \"%s\", path \"%s\"", host, port, kData->osc.data.path);
  994. std::free(host);
  995. std::free(port);
  996. }
  997. #ifndef BUILD_BRIDGE
  998. if (fHints & PLUGIN_IS_BRIDGE)
  999. return;
  1000. #endif
  1001. osc_send_sample_rate(&kData->osc.data, kData->engine->getSampleRate());
  1002. #if 0
  1003. for (size_t i=0; i < kData->custom.count(); i++)
  1004. {
  1005. // TODO
  1006. //if (m_type == PLUGIN_LV2)
  1007. //osc_send_lv2_transfer_event(&osc.data, getCustomDataTypeString(custom[i].type), /*custom[i].key,*/ custom[i].value);
  1008. //else
  1009. if (custom[i].type == CUSTOM_DATA_STRING)
  1010. osc_send_configure(&osc.data, custom[i].key, custom[i].value);
  1011. }
  1012. #endif
  1013. if (kData->prog.current >= 0)
  1014. osc_send_program(&kData->osc.data, kData->prog.current);
  1015. if (kData->midiprog.current >= 0)
  1016. {
  1017. const MidiProgramData& curMidiProg(kData->midiprog.getCurrent());
  1018. if (type() == PLUGIN_DSSI)
  1019. osc_send_program(&kData->osc.data, curMidiProg.bank, curMidiProg.program);
  1020. else
  1021. osc_send_midi_program(&kData->osc.data, curMidiProg.bank, curMidiProg.program);
  1022. }
  1023. for (uint32_t i=0; i < kData->param.count; i++)
  1024. osc_send_control(&kData->osc.data, kData->param.data[i].rindex, getParameterValue(i));
  1025. carla_stdout("CarlaPlugin::updateOscData() - done");
  1026. }
  1027. void CarlaPlugin::freeOscData()
  1028. {
  1029. kData->osc.data.free();
  1030. }
  1031. bool CarlaPlugin::waitForOscGuiShow()
  1032. {
  1033. carla_stdout("CarlaPlugin::waitForOscGuiShow()");
  1034. // wait for UI 'update' call
  1035. for (uint i=0, oscUiTimeout = kData->engine->getOptions().oscUiTimeout; i < oscUiTimeout; i++)
  1036. {
  1037. if (kData->osc.data.target)
  1038. {
  1039. carla_stdout("CarlaPlugin::waitForOscGuiShow() - got response, asking UI to show itself now");
  1040. osc_send_show(&kData->osc.data);
  1041. return true;
  1042. }
  1043. else
  1044. carla_msleep(100);
  1045. }
  1046. carla_stdout("CarlaPlugin::waitForOscGuiShow() - Timeout while waiting for UI to respond (waited %u msecs)", kData->engine->getOptions().oscUiTimeout);
  1047. return false;
  1048. }
  1049. // -------------------------------------------------------------------
  1050. // MIDI events
  1051. void CarlaPlugin::sendMidiSingleNote(const uint8_t channel, const uint8_t note, const uint8_t velo, const bool sendGui, const bool sendOsc, const bool sendCallback)
  1052. {
  1053. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  1054. CARLA_ASSERT(note < MAX_MIDI_NOTE);
  1055. CARLA_ASSERT(velo < MAX_MIDI_VALUE);
  1056. if (! kData->active)
  1057. return;
  1058. ExternalMidiNote extNote;
  1059. extNote.channel = channel;
  1060. extNote.note = note;
  1061. extNote.velo = velo;
  1062. kData->extNotes.append(extNote);
  1063. if (sendGui)
  1064. {
  1065. if (velo > 0)
  1066. uiNoteOn(channel, note, velo);
  1067. else
  1068. uiNoteOff(channel, note);
  1069. }
  1070. #ifndef BUILD_BRIDGE
  1071. if (sendOsc)
  1072. {
  1073. if (velo > 0)
  1074. kData->engine->osc_send_control_note_on(fId, channel, note, velo);
  1075. else
  1076. kData->engine->osc_send_control_note_off(fId, channel, note);
  1077. }
  1078. #else
  1079. // unused
  1080. (void)sendOsc;
  1081. #endif
  1082. if (sendCallback)
  1083. kData->engine->callback(velo ? CALLBACK_NOTE_ON : CALLBACK_NOTE_OFF, fId, channel, note, velo, nullptr);
  1084. }
  1085. void CarlaPlugin::sendMidiAllNotesOff()
  1086. {
  1087. kData->postRtEvents.mutex.lock();
  1088. PluginPostRtEvent postEvent;
  1089. postEvent.type = kPluginPostRtEventNoteOff;
  1090. postEvent.value1 = kData->ctrlChannel;
  1091. postEvent.value2 = 0;
  1092. postEvent.value3 = 0.0;
  1093. for (unsigned short i=0; i < MAX_MIDI_NOTE; i++)
  1094. {
  1095. postEvent.value2 = i;
  1096. kData->postRtEvents.data.append(postEvent);
  1097. }
  1098. kData->postRtEvents.mutex.unlock();
  1099. }
  1100. // -------------------------------------------------------------------
  1101. // Post-poned events
  1102. void CarlaPlugin::postponeRtEvent(const PluginPostRtEventType type, const int32_t value1, const int32_t value2, const float value3)
  1103. {
  1104. PluginPostRtEvent event;
  1105. event.type = type;
  1106. event.value1 = value1;
  1107. event.value2 = value2;
  1108. event.value3 = value3;
  1109. kData->postRtEvents.appendRT(event);
  1110. }
  1111. void CarlaPlugin::postRtEventsRun()
  1112. {
  1113. const CarlaMutex::ScopedLocker sl(&kData->postRtEvents.mutex);
  1114. while (! kData->postRtEvents.data.isEmpty())
  1115. {
  1116. const PluginPostRtEvent& event = kData->postRtEvents.data.getFirst(true);
  1117. switch (event.type)
  1118. {
  1119. case kPluginPostRtEventNull:
  1120. break;
  1121. case kPluginPostRtEventDebug:
  1122. kData->engine->callback(CALLBACK_DEBUG, fId, event.value1, event.value2, event.value3, nullptr);
  1123. break;
  1124. case kPluginPostRtEventParameterChange:
  1125. // Update UI
  1126. if (event.value1 >= 0)
  1127. uiParameterChange(event.value1, event.value3);
  1128. #ifndef BUILD_BRIDGE
  1129. // Update OSC control client
  1130. if (kData->engine->isOscControlRegistered())
  1131. kData->engine->osc_send_control_set_parameter_value(fId, event.value1, event.value3);
  1132. #endif
  1133. // Update Host
  1134. kData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, event.value1, 0, event.value3, nullptr);
  1135. break;
  1136. case kPluginPostRtEventProgramChange:
  1137. // Update UI
  1138. if (event.value1 >= 0)
  1139. uiProgramChange(event.value1);
  1140. #ifndef BUILD_BRIDGE
  1141. // Update OSC control client
  1142. if (kData->engine->isOscControlRegistered())
  1143. {
  1144. kData->engine->osc_send_control_set_program(fId, event.value1);
  1145. for (uint32_t j=0; j < kData->param.count; j++)
  1146. kData->engine->osc_send_control_set_default_value(fId, j, kData->param.ranges[j].def);
  1147. }
  1148. #endif
  1149. // Update Host
  1150. kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, event.value1, 0, 0.0, nullptr);
  1151. break;
  1152. case kPluginPostRtEventMidiProgramChange:
  1153. // Update UI
  1154. if (event.value1 >= 0)
  1155. uiMidiProgramChange(event.value1);
  1156. #ifndef BUILD_BRIDGE
  1157. // Update OSC control client
  1158. if (kData->engine->isOscControlRegistered())
  1159. {
  1160. kData->engine->osc_send_control_set_midi_program(fId, event.value1);
  1161. for (uint32_t j=0; j < kData->param.count; j++)
  1162. kData->engine->osc_send_control_set_default_value(fId, j, kData->param.ranges[j].def);
  1163. }
  1164. #endif
  1165. // Update Host
  1166. kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, event.value1, 0, 0.0, nullptr);
  1167. break;
  1168. case kPluginPostRtEventNoteOn:
  1169. // Update UI
  1170. uiNoteOn(event.value1, event.value2, int(event.value3));
  1171. #ifndef BUILD_BRIDGE
  1172. // Update OSC control client
  1173. if (kData->engine->isOscControlRegistered())
  1174. kData->engine->osc_send_control_note_on(fId, event.value1, event.value2, int(event.value3));
  1175. #endif
  1176. // Update Host
  1177. kData->engine->callback(CALLBACK_NOTE_ON, fId, event.value1, event.value2, int(event.value3), nullptr);
  1178. break;
  1179. case kPluginPostRtEventNoteOff:
  1180. // Update UI
  1181. uiNoteOff(event.value1, event.value2);
  1182. #ifndef BUILD_BRIDGE
  1183. // Update OSC control client
  1184. if (kData->engine->isOscControlRegistered())
  1185. kData->engine->osc_send_control_note_off(fId, event.value1, event.value2);
  1186. #endif
  1187. // Update Host
  1188. kData->engine->callback(CALLBACK_NOTE_OFF, fId, event.value1, event.value2, 0.0, nullptr);
  1189. break;
  1190. }
  1191. }
  1192. }
  1193. void CarlaPlugin::uiParameterChange(const uint32_t index, const float value)
  1194. {
  1195. CARLA_ASSERT(index < parameterCount());
  1196. return;
  1197. // unused
  1198. (void)index;
  1199. (void)value;
  1200. }
  1201. void CarlaPlugin::uiProgramChange(const uint32_t index)
  1202. {
  1203. CARLA_ASSERT(index < programCount());
  1204. return;
  1205. // unused
  1206. (void)index;
  1207. }
  1208. void CarlaPlugin::uiMidiProgramChange(const uint32_t index)
  1209. {
  1210. CARLA_ASSERT(index < midiProgramCount());
  1211. return;
  1212. // unused
  1213. (void)index;
  1214. }
  1215. void CarlaPlugin::uiNoteOn(const uint8_t channel, const uint8_t note, const uint8_t velo)
  1216. {
  1217. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  1218. CARLA_ASSERT(note < MAX_MIDI_NOTE);
  1219. CARLA_ASSERT(velo > 0 && velo < MAX_MIDI_VALUE);
  1220. return;
  1221. // unused
  1222. (void)channel;
  1223. (void)note;
  1224. (void)velo;
  1225. }
  1226. void CarlaPlugin::uiNoteOff(const uint8_t channel, const uint8_t note)
  1227. {
  1228. CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
  1229. CARLA_ASSERT(note < MAX_MIDI_NOTE);
  1230. return;
  1231. // unused
  1232. (void)channel;
  1233. (void)note;
  1234. }
  1235. // -------------------------------------------------------------------
  1236. // Cleanup
  1237. void CarlaPlugin::initBuffers()
  1238. {
  1239. kData->audioIn.initBuffers(kData->engine);
  1240. kData->audioOut.initBuffers(kData->engine);
  1241. kData->event.initBuffers(kData->engine);
  1242. }
  1243. void CarlaPlugin::deleteBuffers()
  1244. {
  1245. carla_debug("CarlaPlugin::deleteBuffers() - start");
  1246. kData->audioIn.clear();
  1247. kData->audioOut.clear();
  1248. kData->param.clear();
  1249. kData->event.clear();
  1250. carla_debug("CarlaPlugin::deleteBuffers() - end");
  1251. }
  1252. // -------------------------------------------------------------------
  1253. // Library functions
  1254. bool CarlaPlugin::libOpen(const char* const filename)
  1255. {
  1256. kData->lib = lib_open(filename);
  1257. return bool(kData->lib);
  1258. }
  1259. bool CarlaPlugin::libClose()
  1260. {
  1261. if (kData->lib == nullptr)
  1262. return false;
  1263. const bool ret = lib_close(kData->lib);
  1264. kData->lib = nullptr;
  1265. return ret;
  1266. }
  1267. void* CarlaPlugin::libSymbol(const char* const symbol)
  1268. {
  1269. return lib_symbol(kData->lib, symbol);
  1270. }
  1271. const char* CarlaPlugin::libError(const char* const filename)
  1272. {
  1273. return lib_error(filename);
  1274. }
  1275. // -------------------------------------------------------------------
  1276. // Scoped Disabler
  1277. CarlaPlugin::ScopedDisabler::ScopedDisabler(CarlaPlugin* const plugin)
  1278. : kPlugin(plugin)
  1279. {
  1280. carla_debug("CarlaPlugin::ScopedDisabler(%p)", plugin);
  1281. CARLA_ASSERT(plugin != nullptr);
  1282. if (plugin->fEnabled)
  1283. {
  1284. plugin->fEnabled = false;
  1285. plugin->kData->engine->waitForProccessEnd(plugin->id());
  1286. }
  1287. if (plugin->kData->client->isActive())
  1288. plugin->kData->client->deactivate();
  1289. }
  1290. CarlaPlugin::ScopedDisabler::~ScopedDisabler()
  1291. {
  1292. carla_debug("CarlaPlugin::~ScopedDisabler()");
  1293. kPlugin->fEnabled = true;
  1294. kPlugin->kData->client->activate();
  1295. }
  1296. // -------------------------------------------------------------------
  1297. // Scoped Process Locker
  1298. CarlaPlugin::ScopedProcessLocker::ScopedProcessLocker(CarlaPlugin* const plugin, const bool block)
  1299. : kPlugin(plugin),
  1300. kBlock(block)
  1301. {
  1302. carla_debug("CarlaPlugin::ScopedProcessLocker(%p, %s)", plugin, bool2str(block));
  1303. CARLA_ASSERT(plugin != nullptr);
  1304. if (block)
  1305. plugin->kData->mutex.lock();
  1306. }
  1307. CarlaPlugin::ScopedProcessLocker::~ScopedProcessLocker()
  1308. {
  1309. carla_debug("CarlaPlugin::~ScopedProcessLocker()");
  1310. if (kBlock)
  1311. {
  1312. if (kPlugin->kData->mutex.wasTryLockCalled())
  1313. kPlugin->kData->needsReset = true;
  1314. kPlugin->kData->mutex.unlock();
  1315. }
  1316. }
  1317. // -------------------------------------------------------------------
  1318. // CarlaPluginGUI
  1319. #if 0
  1320. CarlaPluginGUI::CarlaPluginGUI(QWidget* const parent, Callback* const callback)
  1321. : QMainWindow(parent),
  1322. kCallback(callback)
  1323. {
  1324. carla_debug("CarlaPluginGUI::CarlaPluginGUI(%p)", parent);
  1325. //CARLA_ASSERT(callback);
  1326. //m_container = new GuiContainer(this);
  1327. //setCentralWidget(m_container);
  1328. //adjustSize();
  1329. //m_container->setParent(this);
  1330. //m_container->show();
  1331. //m_resizable = true;
  1332. //setNewSize(50, 50);
  1333. QMainWindow::setVisible(false);
  1334. }
  1335. CarlaPluginGUI::~CarlaPluginGUI()
  1336. {
  1337. carla_debug("CarlaPluginGUI::~CarlaPluginGUI()");
  1338. //CARLA_ASSERT(m_container);
  1339. // FIXME, automatically deleted by parent ?
  1340. //delete m_container;
  1341. }
  1342. #endif
  1343. #if 0
  1344. // -------------------------------------------------------------------
  1345. GuiContainer* CarlaPluginGUI::getContainer() const
  1346. {
  1347. return m_container;
  1348. }
  1349. WId CarlaPluginGUI::getWinId() const
  1350. {
  1351. return m_container->winId();
  1352. }
  1353. // -------------------------------------------------------------------
  1354. void CarlaPluginGUI::setNewSize(int width, int height)
  1355. {
  1356. carla_debug("CarlaPluginGUI::setNewSize(%i, %i)", width, height);
  1357. if (width < 30)
  1358. width = 30;
  1359. if (height < 30)
  1360. height = 30;
  1361. if (m_resizable)
  1362. {
  1363. resize(width, height);
  1364. }
  1365. else
  1366. {
  1367. setFixedSize(width, height);
  1368. m_container->setFixedSize(width, height);
  1369. }
  1370. }
  1371. void CarlaPluginGUI::setResizable(bool resizable)
  1372. {
  1373. m_resizable = resizable;
  1374. setNewSize(width(), height());
  1375. #ifdef Q_OS_WIN
  1376. if (! resizable)
  1377. setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint);
  1378. #endif
  1379. }
  1380. void CarlaPluginGUI::setTitle(const char* const title)
  1381. {
  1382. CARLA_ASSERT(title);
  1383. setWindowTitle(QString("%1 (GUI)").arg(title));
  1384. }
  1385. void CarlaPluginGUI::setVisible(const bool yesNo)
  1386. {
  1387. carla_debug("CarlaPluginGUI::setVisible(%s)", bool2str(yesNo));
  1388. if (yesNo)
  1389. {
  1390. if (! m_geometry.isNull())
  1391. restoreGeometry(m_geometry);
  1392. }
  1393. else
  1394. m_geometry = saveGeometry();
  1395. QMainWindow::setVisible(yesNo);
  1396. }
  1397. // -------------------------------------------------------------------
  1398. void CarlaPluginGUI::hideEvent(QHideEvent* const event)
  1399. {
  1400. carla_debug("CarlaPluginGUI::hideEvent(%p)", event);
  1401. CARLA_ASSERT(event);
  1402. event->accept();
  1403. close();
  1404. }
  1405. void CarlaPluginGUI::closeEvent(QCloseEvent* const event)
  1406. {
  1407. carla_debug("CarlaPluginGUI::closeEvent(%p)", event);
  1408. CARLA_ASSERT(event);
  1409. if (event->spontaneous())
  1410. {
  1411. if (m_callback)
  1412. m_callback->guiClosedCallback();
  1413. QMainWindow::closeEvent(event);
  1414. return;
  1415. }
  1416. event->ignore();
  1417. }
  1418. #endif
  1419. // -------------------------------------------------------------------
  1420. CARLA_BACKEND_END_NAMESPACE