Collection of tools useful for audio production
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1183 lines
38KB

  1. /*
  2. * Carla Backend
  3. * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the COPYING file
  16. */
  17. #include "carla_plugin.h"
  18. #ifdef WANT_LADSPA
  19. #include "carla_ladspa.h"
  20. CARLA_BACKEND_START_NAMESPACE
  21. /*!
  22. * @defgroup CarlaBackendLadspaPlugin Carla Backend LADSPA Plugin
  23. *
  24. * The Carla Backend LADSPA Plugin.\n
  25. * http://www.ladspa.org/
  26. * @{
  27. */
  28. class LadspaPlugin : public CarlaPlugin
  29. {
  30. public:
  31. LadspaPlugin(CarlaEngine* const engine, const unsigned short id)
  32. : CarlaPlugin(engine, id)
  33. {
  34. qDebug("LadspaPlugin::LadspaPlugin()");
  35. m_type = PLUGIN_LADSPA;
  36. handle = h2 = nullptr;
  37. descriptor = nullptr;
  38. rdf_descriptor = nullptr;
  39. paramBuffers = nullptr;
  40. }
  41. ~LadspaPlugin()
  42. {
  43. qDebug("LadspaPlugin::~LadspaPlugin()");
  44. if (descriptor)
  45. {
  46. if (descriptor->deactivate && m_activeBefore)
  47. {
  48. if (handle)
  49. descriptor->deactivate(handle);
  50. if (h2)
  51. descriptor->deactivate(h2);
  52. }
  53. if (descriptor->cleanup)
  54. {
  55. if (handle)
  56. descriptor->cleanup(handle);
  57. if (h2)
  58. descriptor->cleanup(h2);
  59. }
  60. }
  61. if (rdf_descriptor)
  62. ladspa_rdf_free(rdf_descriptor);
  63. }
  64. // -------------------------------------------------------------------
  65. // Information (base)
  66. PluginCategory category()
  67. {
  68. if (rdf_descriptor)
  69. {
  70. const LADSPA_Properties category = rdf_descriptor->Type;
  71. // Specific Types
  72. if (category & (LADSPA_CLASS_DELAY|LADSPA_CLASS_REVERB))
  73. return PLUGIN_CATEGORY_DELAY;
  74. if (category & (LADSPA_CLASS_PHASER|LADSPA_CLASS_FLANGER|LADSPA_CLASS_CHORUS))
  75. return PLUGIN_CATEGORY_MODULATOR;
  76. if (category & (LADSPA_CLASS_AMPLIFIER))
  77. return PLUGIN_CATEGORY_DYNAMICS;
  78. if (category & (LADSPA_CLASS_UTILITY|LADSPA_CLASS_SPECTRAL|LADSPA_CLASS_FREQUENCY_METER))
  79. return PLUGIN_CATEGORY_UTILITY;
  80. // Pre-set LADSPA Types
  81. if (LADSPA_IS_PLUGIN_DYNAMICS(category))
  82. return PLUGIN_CATEGORY_DYNAMICS;
  83. if (LADSPA_IS_PLUGIN_AMPLITUDE(category))
  84. return PLUGIN_CATEGORY_MODULATOR;
  85. if (LADSPA_IS_PLUGIN_EQ(category))
  86. return PLUGIN_CATEGORY_EQ;
  87. if (LADSPA_IS_PLUGIN_FILTER(category))
  88. return PLUGIN_CATEGORY_FILTER;
  89. if (LADSPA_IS_PLUGIN_FREQUENCY(category))
  90. return PLUGIN_CATEGORY_UTILITY;
  91. if (LADSPA_IS_PLUGIN_SIMULATOR(category))
  92. return PLUGIN_CATEGORY_OTHER;
  93. if (LADSPA_IS_PLUGIN_TIME(category))
  94. return PLUGIN_CATEGORY_DELAY;
  95. if (LADSPA_IS_PLUGIN_GENERATOR(category))
  96. return PLUGIN_CATEGORY_SYNTH;
  97. }
  98. return getPluginCategoryFromName(m_name);
  99. }
  100. long uniqueId()
  101. {
  102. Q_ASSERT(descriptor);
  103. return descriptor->UniqueID;
  104. }
  105. // -------------------------------------------------------------------
  106. // Information (count)
  107. uint32_t parameterScalePointCount(const uint32_t parameterId)
  108. {
  109. Q_ASSERT(parameterId < param.count);
  110. int32_t rindex = param.data[parameterId].rindex;
  111. if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
  112. {
  113. const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];
  114. if (port)
  115. return port->ScalePointCount;
  116. }
  117. return 0;
  118. }
  119. // -------------------------------------------------------------------
  120. // Information (per-plugin data)
  121. double getParameterValue(const uint32_t parameterId)
  122. {
  123. Q_ASSERT(parameterId < param.count);
  124. return paramBuffers[parameterId];
  125. }
  126. double getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId)
  127. {
  128. Q_ASSERT(parameterId < param.count);
  129. Q_ASSERT(scalePointId < parameterScalePointCount(parameterId));
  130. int32_t rindex = param.data[parameterId].rindex;
  131. if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
  132. {
  133. const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];
  134. if (port && scalePointId < port->ScalePointCount)
  135. {
  136. const LADSPA_RDF_ScalePoint* const scalePoint = &port->ScalePoints[scalePointId];
  137. if (scalePoint)
  138. return scalePoint->Value;
  139. }
  140. }
  141. return 0.0;
  142. }
  143. void getLabel(char* const strBuf)
  144. {
  145. Q_ASSERT(descriptor);
  146. if (descriptor && descriptor->Label)
  147. strncpy(strBuf, descriptor->Label, STR_MAX);
  148. else
  149. CarlaPlugin::getLabel(strBuf);
  150. }
  151. void getMaker(char* const strBuf)
  152. {
  153. Q_ASSERT(descriptor);
  154. if (rdf_descriptor && rdf_descriptor->Creator)
  155. strncpy(strBuf, rdf_descriptor->Creator, STR_MAX);
  156. else if (descriptor && descriptor->Maker)
  157. strncpy(strBuf, descriptor->Maker, STR_MAX);
  158. else
  159. CarlaPlugin::getMaker(strBuf);
  160. }
  161. void getCopyright(char* const strBuf)
  162. {
  163. Q_ASSERT(descriptor);
  164. if (descriptor && descriptor->Copyright)
  165. strncpy(strBuf, descriptor->Copyright, STR_MAX);
  166. else
  167. CarlaPlugin::getCopyright(strBuf);
  168. }
  169. void getRealName(char* const strBuf)
  170. {
  171. Q_ASSERT(descriptor);
  172. if (rdf_descriptor && rdf_descriptor->Title)
  173. strncpy(strBuf, rdf_descriptor->Title, STR_MAX);
  174. else if (descriptor && descriptor->Name)
  175. strncpy(strBuf, descriptor->Name, STR_MAX);
  176. else
  177. CarlaPlugin::getRealName(strBuf);
  178. }
  179. void getParameterName(const uint32_t parameterId, char* const strBuf)
  180. {
  181. Q_ASSERT(descriptor);
  182. Q_ASSERT(parameterId < param.count);
  183. int32_t rindex = param.data[parameterId].rindex;
  184. if (descriptor && rindex < (int32_t)descriptor->PortCount)
  185. strncpy(strBuf, descriptor->PortNames[rindex], STR_MAX);
  186. else
  187. CarlaPlugin::getParameterName(parameterId, strBuf);
  188. }
  189. void getParameterSymbol(const uint32_t parameterId, char* const strBuf)
  190. {
  191. Q_ASSERT(parameterId < param.count);
  192. int32_t rindex = param.data[parameterId].rindex;
  193. if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
  194. {
  195. const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];
  196. if (LADSPA_PORT_HAS_LABEL(port->Hints) && port->Label)
  197. {
  198. strncpy(strBuf, port->Label, STR_MAX);
  199. return;
  200. }
  201. }
  202. CarlaPlugin::getParameterSymbol(parameterId, strBuf);
  203. }
  204. void getParameterUnit(const uint32_t parameterId, char* const strBuf)
  205. {
  206. Q_ASSERT(parameterId < param.count);
  207. int32_t rindex = param.data[parameterId].rindex;
  208. if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
  209. {
  210. const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];
  211. if (LADSPA_PORT_HAS_UNIT(port->Hints))
  212. {
  213. switch (port->Unit)
  214. {
  215. case LADSPA_UNIT_DB:
  216. strncpy(strBuf, "dB", STR_MAX);
  217. return;
  218. case LADSPA_UNIT_COEF:
  219. strncpy(strBuf, "(coef)", STR_MAX);
  220. return;
  221. case LADSPA_UNIT_HZ:
  222. strncpy(strBuf, "Hz", STR_MAX);
  223. return;
  224. case LADSPA_UNIT_S:
  225. strncpy(strBuf, "s", STR_MAX);
  226. return;
  227. case LADSPA_UNIT_MS:
  228. strncpy(strBuf, "ms", STR_MAX);
  229. return;
  230. case LADSPA_UNIT_MIN:
  231. strncpy(strBuf, "min", STR_MAX);
  232. return;
  233. }
  234. }
  235. }
  236. CarlaPlugin::getParameterUnit(parameterId, strBuf);
  237. }
  238. void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf)
  239. {
  240. Q_ASSERT(parameterId < param.count);
  241. Q_ASSERT(scalePointId < parameterScalePointCount(parameterId));
  242. int32_t rindex = param.data[parameterId].rindex;
  243. if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
  244. {
  245. const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];
  246. if (port && scalePointId < port->ScalePointCount)
  247. {
  248. const LADSPA_RDF_ScalePoint* const scalePoint = &port->ScalePoints[scalePointId];
  249. if (scalePoint && scalePoint->Label)
  250. {
  251. strncpy(strBuf, scalePoint->Label, STR_MAX);
  252. return;
  253. }
  254. }
  255. }
  256. CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf);
  257. }
  258. // -------------------------------------------------------------------
  259. // Set data (plugin-specific stuff)
  260. void setParameterValue(const uint32_t parameterId, double value, const bool sendGui, const bool sendOsc, const bool sendCallback)
  261. {
  262. Q_ASSERT(parameterId < param.count);
  263. paramBuffers[parameterId] = fixParameterValue(value, param.ranges[parameterId]);
  264. CarlaPlugin::setParameterValue(parameterId, value, sendGui, sendOsc, sendCallback);
  265. }
  266. // -------------------------------------------------------------------
  267. // Plugin state
  268. void reload()
  269. {
  270. qDebug("LadspaPlugin::reload() - start");
  271. Q_ASSERT(descriptor);
  272. // Safely disable plugin for reload
  273. const ScopedDisabler m(this);
  274. if (x_client->isActive())
  275. x_client->deactivate();
  276. // Remove client ports
  277. removeClientPorts();
  278. // Delete old data
  279. deleteBuffers();
  280. uint32_t aIns, aOuts, params, j;
  281. aIns = aOuts = params = 0;
  282. const double sampleRate = x_engine->getSampleRate();
  283. const unsigned long portCount = descriptor->PortCount;
  284. bool forcedStereoIn, forcedStereoOut;
  285. forcedStereoIn = forcedStereoOut = false;
  286. for (unsigned long i=0; i < portCount; i++)
  287. {
  288. const LADSPA_PortDescriptor portType = descriptor->PortDescriptors[i];
  289. if (LADSPA_IS_PORT_AUDIO(portType))
  290. {
  291. if (LADSPA_IS_PORT_INPUT(portType))
  292. aIns += 1;
  293. else if (LADSPA_IS_PORT_OUTPUT(portType))
  294. aOuts += 1;
  295. }
  296. else if (LADSPA_IS_PORT_CONTROL(portType))
  297. params += 1;
  298. }
  299. #ifndef BUILD_BRIDGE
  300. if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2)
  301. {
  302. h2 = descriptor->instantiate(descriptor, sampleRate);
  303. if (aIns == 1)
  304. {
  305. aIns = 2;
  306. forcedStereoIn = true;
  307. }
  308. if (aOuts == 1)
  309. {
  310. aOuts = 2;
  311. forcedStereoOut = true;
  312. }
  313. }
  314. #endif
  315. if (aIns > 0)
  316. {
  317. aIn.ports = new CarlaEngineAudioPort*[aIns];
  318. aIn.rindexes = new uint32_t[aIns];
  319. }
  320. if (aOuts > 0)
  321. {
  322. aOut.ports = new CarlaEngineAudioPort*[aOuts];
  323. aOut.rindexes = new uint32_t[aOuts];
  324. }
  325. if (params > 0)
  326. {
  327. param.data = new ParameterData[params];
  328. param.ranges = new ParameterRanges[params];
  329. paramBuffers = new float[params];
  330. }
  331. const int portNameSize = CarlaEngine::maxPortNameSize() - 2;
  332. char portName[portNameSize];
  333. bool needsCtrlIn = false;
  334. bool needsCtrlOut = false;
  335. for (unsigned long i=0; i < portCount; i++)
  336. {
  337. const LADSPA_PortDescriptor portType = descriptor->PortDescriptors[i];
  338. const LADSPA_PortRangeHint portHints = descriptor->PortRangeHints[i];
  339. const bool hasPortRDF = (rdf_descriptor && i < rdf_descriptor->PortCount);
  340. if (LADSPA_IS_PORT_AUDIO(portType))
  341. {
  342. #ifndef BUILD_BRIDGE
  343. if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
  344. {
  345. strcpy(portName, m_name);
  346. strcat(portName, ":");
  347. strncat(portName, descriptor->PortNames[i], portNameSize/2);
  348. }
  349. else
  350. #endif
  351. strncpy(portName, descriptor->PortNames[i], portNameSize);
  352. if (LADSPA_IS_PORT_INPUT(portType))
  353. {
  354. j = aIn.count++;
  355. aIn.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
  356. aIn.rindexes[j] = i;
  357. if (forcedStereoIn)
  358. {
  359. strcat(portName, "_");
  360. aIn.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
  361. aIn.rindexes[1] = i;
  362. }
  363. }
  364. else if (LADSPA_IS_PORT_OUTPUT(portType))
  365. {
  366. j = aOut.count++;
  367. aOut.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
  368. aOut.rindexes[j] = i;
  369. needsCtrlIn = true;
  370. if (forcedStereoOut)
  371. {
  372. strcat(portName, "_");
  373. aOut.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
  374. aOut.rindexes[1] = i;
  375. }
  376. }
  377. else
  378. qWarning("WARNING - Got a broken Port (Audio, but not input or output)");
  379. }
  380. else if (LADSPA_IS_PORT_CONTROL(portType))
  381. {
  382. j = param.count++;
  383. param.data[j].index = j;
  384. param.data[j].rindex = i;
  385. param.data[j].hints = 0;
  386. param.data[j].midiChannel = 0;
  387. param.data[j].midiCC = -1;
  388. double min, max, def, step, stepSmall, stepLarge;
  389. // min value
  390. if (LADSPA_IS_HINT_BOUNDED_BELOW(portHints.HintDescriptor))
  391. min = portHints.LowerBound;
  392. else
  393. min = 0.0;
  394. // max value
  395. if (LADSPA_IS_HINT_BOUNDED_ABOVE(portHints.HintDescriptor))
  396. max = portHints.UpperBound;
  397. else
  398. max = 1.0;
  399. if (min > max)
  400. max = min;
  401. else if (max < min)
  402. min = max;
  403. if (max - min == 0.0)
  404. {
  405. qWarning("Broken plugin parameter: max - min == 0");
  406. max = min + 0.1;
  407. }
  408. // default value
  409. if (hasPortRDF && LADSPA_PORT_HAS_DEFAULT(rdf_descriptor->Ports[i].Hints))
  410. def = rdf_descriptor->Ports[i].Default;
  411. else
  412. def = get_default_ladspa_port_value(portHints.HintDescriptor, min, max);
  413. if (def < min)
  414. def = min;
  415. else if (def > max)
  416. def = max;
  417. if (LADSPA_IS_HINT_SAMPLE_RATE(portHints.HintDescriptor))
  418. {
  419. min *= sampleRate;
  420. max *= sampleRate;
  421. def *= sampleRate;
  422. param.data[j].hints |= PARAMETER_USES_SAMPLERATE;
  423. }
  424. if (LADSPA_IS_HINT_TOGGLED(portHints.HintDescriptor))
  425. {
  426. step = max - min;
  427. stepSmall = step;
  428. stepLarge = step;
  429. param.data[j].hints |= PARAMETER_IS_BOOLEAN;
  430. }
  431. else if (LADSPA_IS_HINT_INTEGER(portHints.HintDescriptor))
  432. {
  433. step = 1.0;
  434. stepSmall = 1.0;
  435. stepLarge = 10.0;
  436. param.data[j].hints |= PARAMETER_IS_INTEGER;
  437. }
  438. else
  439. {
  440. double range = max - min;
  441. step = range/100.0;
  442. stepSmall = range/1000.0;
  443. stepLarge = range/10.0;
  444. }
  445. if (LADSPA_IS_PORT_INPUT(portType))
  446. {
  447. param.data[j].type = PARAMETER_INPUT;
  448. param.data[j].hints |= PARAMETER_IS_ENABLED;
  449. param.data[j].hints |= PARAMETER_IS_AUTOMABLE;
  450. needsCtrlIn = true;
  451. }
  452. else if (LADSPA_IS_PORT_OUTPUT(portType))
  453. {
  454. if (strcmp(descriptor->PortNames[i], "latency") == 0 || strcmp(descriptor->PortNames[i], "_latency") == 0)
  455. {
  456. min = 0.0;
  457. max = sampleRate;
  458. def = 0.0;
  459. step = 1.0;
  460. stepSmall = 1.0;
  461. stepLarge = 1.0;
  462. param.data[j].type = PARAMETER_LATENCY;
  463. param.data[j].hints = 0;
  464. }
  465. else if (strcmp(descriptor->PortNames[i], "_sample-rate") == 0)
  466. {
  467. def = sampleRate;
  468. step = 1.0;
  469. stepSmall = 1.0;
  470. stepLarge = 1.0;
  471. param.data[j].type = PARAMETER_SAMPLE_RATE;
  472. param.data[j].hints = 0;
  473. }
  474. else
  475. {
  476. param.data[j].type = PARAMETER_OUTPUT;
  477. param.data[j].hints |= PARAMETER_IS_ENABLED;
  478. param.data[j].hints |= PARAMETER_IS_AUTOMABLE;
  479. needsCtrlOut = true;
  480. }
  481. }
  482. else
  483. {
  484. param.data[j].type = PARAMETER_UNKNOWN;
  485. qWarning("WARNING - Got a broken Port (Control, but not input or output)");
  486. }
  487. // extra parameter hints
  488. if (LADSPA_IS_HINT_LOGARITHMIC(portHints.HintDescriptor))
  489. param.data[j].hints |= PARAMETER_IS_LOGARITHMIC;
  490. // check for scalepoints, require at least 2 to make it useful
  491. if (hasPortRDF && rdf_descriptor->Ports[i].ScalePointCount > 1)
  492. param.data[j].hints |= PARAMETER_USES_SCALEPOINTS;
  493. param.ranges[j].min = min;
  494. param.ranges[j].max = max;
  495. param.ranges[j].def = def;
  496. param.ranges[j].step = step;
  497. param.ranges[j].stepSmall = stepSmall;
  498. param.ranges[j].stepLarge = stepLarge;
  499. // Start parameters in their default values
  500. paramBuffers[j] = def;
  501. descriptor->connect_port(handle, i, &paramBuffers[j]);
  502. if (h2) descriptor->connect_port(h2, i, &paramBuffers[j]);
  503. }
  504. else
  505. {
  506. // Not Audio or Control
  507. qCritical("ERROR - Got a broken Port (neither Audio or Control)");
  508. descriptor->connect_port(handle, i, nullptr);
  509. if (h2) descriptor->connect_port(h2, i, nullptr);
  510. }
  511. }
  512. if (needsCtrlIn)
  513. {
  514. #ifndef BUILD_BRIDGE
  515. if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
  516. {
  517. strcpy(portName, m_name);
  518. strcat(portName, ":control-in");
  519. }
  520. else
  521. #endif
  522. strcpy(portName, "control-in");
  523. param.portCin = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, true);
  524. }
  525. if (needsCtrlOut)
  526. {
  527. #ifndef BUILD_BRIDGE
  528. if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
  529. {
  530. strcpy(portName, m_name);
  531. strcat(portName, ":control-out");
  532. }
  533. else
  534. #endif
  535. strcpy(portName, "control-out");
  536. param.portCout = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, false);
  537. }
  538. aIn.count = aIns;
  539. aOut.count = aOuts;
  540. param.count = params;
  541. // plugin checks
  542. m_hints &= ~(PLUGIN_IS_SYNTH | PLUGIN_USES_CHUNKS | PLUGIN_CAN_DRYWET | PLUGIN_CAN_VOLUME | PLUGIN_CAN_BALANCE);
  543. if (aOuts > 0 && (aIns == aOuts || aIns == 1))
  544. m_hints |= PLUGIN_CAN_DRYWET;
  545. if (aOuts > 0)
  546. m_hints |= PLUGIN_CAN_VOLUME;
  547. if (aOuts >= 2 && aOuts%2 == 0)
  548. m_hints |= PLUGIN_CAN_BALANCE;
  549. x_client->activate();
  550. qDebug("LadspaPlugin::reload() - end");
  551. }
  552. // -------------------------------------------------------------------
  553. // Plugin processing
  554. void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t framesOffset)
  555. {
  556. uint32_t i, k;
  557. double aInsPeak[2] = { 0.0 };
  558. double aOutsPeak[2] = { 0.0 };
  559. CARLA_PROCESS_CONTINUE_CHECK;
  560. // --------------------------------------------------------------------------------------------------------
  561. // Input VU
  562. if (aIn.count > 0)
  563. {
  564. if (aIn.count == 1)
  565. {
  566. for (k=0; k < frames; k++)
  567. {
  568. if (abs(inBuffer[0][k]) > aInsPeak[0])
  569. aInsPeak[0] = abs(inBuffer[0][k]);
  570. }
  571. }
  572. else if (aIn.count > 1)
  573. {
  574. for (k=0; k < frames; k++)
  575. {
  576. if (abs(inBuffer[0][k]) > aInsPeak[0])
  577. aInsPeak[0] = abs(inBuffer[0][k]);
  578. if (abs(inBuffer[1][k]) > aInsPeak[1])
  579. aInsPeak[1] = abs(inBuffer[1][k]);
  580. }
  581. }
  582. }
  583. CARLA_PROCESS_CONTINUE_CHECK;
  584. // --------------------------------------------------------------------------------------------------------
  585. // Parameters Input [Automation]
  586. if (param.portCin && m_active && m_activeBefore)
  587. {
  588. const CarlaEngineControlEvent* cinEvent;
  589. uint32_t time, nEvents = param.portCin->getEventCount();
  590. for (i=0; i < nEvents; i++)
  591. {
  592. cinEvent = param.portCin->getEvent(i);
  593. if (! cinEvent)
  594. continue;
  595. time = cinEvent->time - framesOffset;
  596. if (time >= frames)
  597. continue;
  598. // Control change
  599. switch (cinEvent->type)
  600. {
  601. case CarlaEngineEventNull:
  602. break;
  603. case CarlaEngineEventControlChange:
  604. {
  605. double value;
  606. // Control backend stuff
  607. if (cinEvent->channel == m_ctrlInChannel)
  608. {
  609. if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0)
  610. {
  611. value = cinEvent->value;
  612. setDryWet(value, false, false);
  613. postponeEvent(PluginPostEventParameterChange, PARAMETER_DRYWET, 0, value);
  614. continue;
  615. }
  616. if (MIDI_IS_CONTROL_CHANNEL_VOLUME(cinEvent->controller) && (m_hints & PLUGIN_CAN_VOLUME) > 0)
  617. {
  618. value = cinEvent->value*127/100;
  619. setVolume(value, false, false);
  620. postponeEvent(PluginPostEventParameterChange, PARAMETER_VOLUME, 0, value);
  621. continue;
  622. }
  623. if (MIDI_IS_CONTROL_BALANCE(cinEvent->controller) && (m_hints & PLUGIN_CAN_BALANCE) > 0)
  624. {
  625. double left, right;
  626. value = cinEvent->value/0.5 - 1.0;
  627. if (value < 0.0)
  628. {
  629. left = -1.0;
  630. right = (value*2)+1.0;
  631. }
  632. else if (value > 0.0)
  633. {
  634. left = (value*2)-1.0;
  635. right = 1.0;
  636. }
  637. else
  638. {
  639. left = -1.0;
  640. right = 1.0;
  641. }
  642. setBalanceLeft(left, false, false);
  643. setBalanceRight(right, false, false);
  644. postponeEvent(PluginPostEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left);
  645. postponeEvent(PluginPostEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right);
  646. continue;
  647. }
  648. }
  649. // Control plugin parameters
  650. for (k=0; k < param.count; k++)
  651. {
  652. if (param.data[k].midiChannel != cinEvent->channel)
  653. continue;
  654. if (param.data[k].midiCC != cinEvent->controller)
  655. continue;
  656. if (param.data[k].type != PARAMETER_INPUT)
  657. continue;
  658. if (param.data[k].hints & PARAMETER_IS_AUTOMABLE)
  659. {
  660. if (param.data[k].hints & PARAMETER_IS_BOOLEAN)
  661. {
  662. value = cinEvent->value < 0.5 ? param.ranges[k].min : param.ranges[k].max;
  663. }
  664. else
  665. {
  666. value = cinEvent->value * (param.ranges[k].max - param.ranges[k].min) + param.ranges[k].min;
  667. if (param.data[k].hints & PARAMETER_IS_INTEGER)
  668. value = rint(value);
  669. }
  670. setParameterValue(k, value, false, false, false);
  671. postponeEvent(PluginPostEventParameterChange, k, 0, value);
  672. }
  673. }
  674. break;
  675. }
  676. case CarlaEngineEventMidiBankChange:
  677. case CarlaEngineEventMidiProgramChange:
  678. break;
  679. case CarlaEngineEventAllSoundOff:
  680. if (cinEvent->channel == m_ctrlInChannel)
  681. {
  682. if (descriptor->deactivate)
  683. {
  684. descriptor->deactivate(handle);
  685. if (h2) descriptor->deactivate(h2);
  686. }
  687. if (descriptor->activate)
  688. {
  689. descriptor->activate(handle);
  690. if (h2) descriptor->activate(h2);
  691. }
  692. }
  693. break;
  694. case CarlaEngineEventAllNotesOff:
  695. break;
  696. }
  697. }
  698. } // End of Parameters Input
  699. CARLA_PROCESS_CONTINUE_CHECK;
  700. // --------------------------------------------------------------------------------------------------------
  701. // Special Parameters
  702. #if 0
  703. for (k=0; k < param.count; k++)
  704. {
  705. if (param.data[k].type == PARAMETER_LATENCY)
  706. {
  707. // TODO: ladspa special params
  708. }
  709. }
  710. CARLA_PROCESS_CONTINUE_CHECK;
  711. #endif
  712. // --------------------------------------------------------------------------------------------------------
  713. // Plugin processing
  714. if (m_active)
  715. {
  716. if (! m_activeBefore)
  717. {
  718. if (descriptor->activate)
  719. {
  720. descriptor->activate(handle);
  721. if (h2) descriptor->activate(h2);
  722. }
  723. }
  724. for (i=0; i < aIn.count; i++)
  725. {
  726. if (i == 0 || ! h2) descriptor->connect_port(handle, aIn.rindexes[i], inBuffer[i]);
  727. if (i == 1 && h2) descriptor->connect_port(h2, aIn.rindexes[i], inBuffer[i]);
  728. }
  729. for (i=0; i < aOut.count; i++)
  730. {
  731. if (i == 0 || ! h2) descriptor->connect_port(handle, aOut.rindexes[i], outBuffer[i]);
  732. if (i == 1 && h2) descriptor->connect_port(h2, aOut.rindexes[i], outBuffer[i]);
  733. }
  734. descriptor->run(handle, frames);
  735. if (h2) descriptor->run(h2, frames);
  736. }
  737. else
  738. {
  739. if (m_activeBefore)
  740. {
  741. if (descriptor->deactivate)
  742. {
  743. descriptor->deactivate(handle);
  744. if (h2) descriptor->deactivate(h2);
  745. }
  746. }
  747. }
  748. CARLA_PROCESS_CONTINUE_CHECK;
  749. // --------------------------------------------------------------------------------------------------------
  750. // Post-processing (dry/wet, volume and balance)
  751. if (m_active)
  752. {
  753. bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_dryWet != 1.0;
  754. bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_volume != 1.0;
  755. bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_balanceLeft != -1.0 || x_balanceRight != 1.0);
  756. double bal_rangeL, bal_rangeR;
  757. float oldBufLeft[do_balance ? frames : 0];
  758. for (i=0; i < aOut.count; i++)
  759. {
  760. // Dry/Wet
  761. if (do_drywet)
  762. {
  763. for (k=0; k < frames; k++)
  764. {
  765. if (aOut.count == 1)
  766. outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[0][k]*(1.0-x_dryWet));
  767. else
  768. outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[i][k]*(1.0-x_dryWet));
  769. }
  770. }
  771. // Balance
  772. if (do_balance)
  773. {
  774. if (i%2 == 0)
  775. memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames);
  776. bal_rangeL = (x_balanceLeft+1.0)/2;
  777. bal_rangeR = (x_balanceRight+1.0)/2;
  778. for (k=0; k < frames; k++)
  779. {
  780. if (i%2 == 0)
  781. {
  782. // left output
  783. outBuffer[i][k] = oldBufLeft[k]*(1.0-bal_rangeL);
  784. outBuffer[i][k] += outBuffer[i+1][k]*(1.0-bal_rangeR);
  785. }
  786. else
  787. {
  788. // right
  789. outBuffer[i][k] = outBuffer[i][k]*bal_rangeR;
  790. outBuffer[i][k] += oldBufLeft[k]*bal_rangeL;
  791. }
  792. }
  793. }
  794. // Volume
  795. if (do_volume)
  796. {
  797. for (k=0; k < frames; k++)
  798. outBuffer[i][k] *= x_volume;
  799. }
  800. // Output VU
  801. for (k=0; i < 2 && k < frames; k++)
  802. {
  803. if (abs(outBuffer[i][k]) > aOutsPeak[i])
  804. aOutsPeak[i] = abs(outBuffer[i][k]);
  805. }
  806. }
  807. }
  808. else
  809. {
  810. // disable any output sound if not active
  811. for (i=0; i < aOut.count; i++)
  812. memset(outBuffer[i], 0.0f, sizeof(float)*frames);
  813. aOutsPeak[0] = 0.0;
  814. aOutsPeak[1] = 0.0;
  815. } // End of Post-processing
  816. CARLA_PROCESS_CONTINUE_CHECK;
  817. // --------------------------------------------------------------------------------------------------------
  818. // Control Output
  819. if (param.portCout && m_active)
  820. {
  821. double value;
  822. for (k=0; k < param.count; k++)
  823. {
  824. if (param.data[k].type == PARAMETER_OUTPUT)
  825. {
  826. fixParameterValue(paramBuffers[k], param.ranges[k]);
  827. if (param.data[k].midiCC > 0)
  828. {
  829. value = (paramBuffers[k] - param.ranges[k].min) / (param.ranges[k].max - param.ranges[k].min);
  830. param.portCout->writeEvent(CarlaEngineEventControlChange, framesOffset, param.data[k].midiChannel, param.data[k].midiCC, value);
  831. }
  832. }
  833. }
  834. } // End of Control Output
  835. CARLA_PROCESS_CONTINUE_CHECK;
  836. // --------------------------------------------------------------------------------------------------------
  837. // Peak Values
  838. x_engine->setInputPeak(m_id, 0, aInsPeak[0]);
  839. x_engine->setInputPeak(m_id, 1, aInsPeak[1]);
  840. x_engine->setOutputPeak(m_id, 0, aOutsPeak[0]);
  841. x_engine->setOutputPeak(m_id, 1, aOutsPeak[1]);
  842. m_activeBefore = m_active;
  843. }
  844. // -------------------------------------------------------------------
  845. // Cleanup
  846. void deleteBuffers()
  847. {
  848. qDebug("LadspaPlugin::deleteBuffers() - start");
  849. if (param.count > 0)
  850. delete[] paramBuffers;
  851. paramBuffers = nullptr;
  852. qDebug("LadspaPlugin::deleteBuffers() - end");
  853. }
  854. // -------------------------------------------------------------------
  855. bool init(const char* const filename, const char* const name, const char* const label, const LADSPA_RDF_Descriptor* const rdf_descriptor_)
  856. {
  857. // ---------------------------------------------------------------
  858. // open DLL
  859. if (! libOpen(filename))
  860. {
  861. setLastError(libError(filename));
  862. return false;
  863. }
  864. // ---------------------------------------------------------------
  865. // get DLL main entry
  866. const LADSPA_Descriptor_Function descFn = (LADSPA_Descriptor_Function)libSymbol("ladspa_descriptor");
  867. if (! descFn)
  868. {
  869. setLastError("Could not find the LASDPA Descriptor in the plugin library");
  870. return false;
  871. }
  872. // ---------------------------------------------------------------
  873. // get descriptor that matches label
  874. unsigned long i = 0;
  875. while ((descriptor = descFn(i++)))
  876. {
  877. if (strcmp(descriptor->Label, label) == 0)
  878. break;
  879. }
  880. if (! descriptor)
  881. {
  882. setLastError("Could not find the requested plugin Label in the plugin library");
  883. return false;
  884. }
  885. // ---------------------------------------------------------------
  886. // initialize plugin
  887. handle = descriptor->instantiate(descriptor, x_engine->getSampleRate());
  888. if (! handle)
  889. {
  890. setLastError("Plugin failed to initialize");
  891. return false;
  892. }
  893. // ---------------------------------------------------------------
  894. // get info
  895. m_filename = strdup(filename);
  896. if (is_ladspa_rdf_descriptor_valid(rdf_descriptor_, descriptor))
  897. rdf_descriptor = ladspa_rdf_dup(rdf_descriptor_);
  898. if (name)
  899. m_name = x_engine->getUniqueName(name);
  900. else if (rdf_descriptor && rdf_descriptor->Title)
  901. m_name = x_engine->getUniqueName(rdf_descriptor->Title);
  902. else
  903. m_name = x_engine->getUniqueName(descriptor->Name);
  904. // ---------------------------------------------------------------
  905. // register client
  906. x_client = x_engine->addClient(this);
  907. if (! x_client->isOk())
  908. {
  909. setLastError("Failed to register plugin client");
  910. return false;
  911. }
  912. return true;
  913. }
  914. private:
  915. LADSPA_Handle handle, h2;
  916. const LADSPA_Descriptor* descriptor;
  917. const LADSPA_RDF_Descriptor* rdf_descriptor;
  918. float* paramBuffers;
  919. };
  920. /**@}*/
  921. CARLA_BACKEND_END_NAMESPACE
  922. #else // WANT_LADSPA
  923. # warning Building without LADSPA support
  924. #endif
  925. CARLA_BACKEND_START_NAMESPACE
  926. CarlaPlugin* CarlaPlugin::newLADSPA(const initializer& init, const void* const extra)
  927. {
  928. qDebug("CarlaPlugin::newLADSPA(%p, \"%s\", \"%s\", \"%s\", %p)", init.engine, init.filename, init.name, init.label, extra);
  929. #ifdef WANT_LADSPA
  930. short id = init.engine->getNewPluginId();
  931. if (id < 0 || id > CarlaEngine::maxPluginNumber())
  932. {
  933. setLastError("Maximum number of plugins reached");
  934. return nullptr;
  935. }
  936. LadspaPlugin* const plugin = new LadspaPlugin(init.engine, id);
  937. if (! plugin->init(init.filename, init.name, init.label, (const LADSPA_RDF_Descriptor*)extra))
  938. {
  939. delete plugin;
  940. return nullptr;
  941. }
  942. plugin->reload();
  943. #ifndef BUILD_BRIDGE
  944. if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
  945. {
  946. const uint32_t ins = plugin->audioInCount();
  947. const uint32_t outs = plugin->audioOutCount();
  948. if (ins > 2 || outs > 2 || (ins != outs && ins != 0 && outs != 0))
  949. {
  950. setLastError("Carla's rack mode can only work with Mono or Stereo LADSPA plugins, sorry!");
  951. delete plugin;
  952. return nullptr;
  953. }
  954. }
  955. #endif
  956. plugin->registerToOsc();
  957. return plugin;
  958. #else
  959. setLastError("LADSPA support not available");
  960. return nullptr;
  961. #endif
  962. }
  963. CARLA_BACKEND_END_NAMESPACE