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.

519 lines
16KB

  1. /*
  2. * Carla Plugin Host
  3. * Copyright (C) 2011-2019 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 doc/GPL.txt file.
  16. */
  17. #include "CarlaEngineInternal.hpp"
  18. #include "CarlaEngineUtils.hpp"
  19. #include "CarlaMathUtils.hpp"
  20. #include "CarlaMIDI.h"
  21. #include "lv2/lv2.h"
  22. CARLA_BACKEND_START_NAMESPACE
  23. // -----------------------------------------------------------------------
  24. // Fallback data
  25. static const EngineEvent kFallbackEngineEvent = { kEngineEventTypeNull, 0, 0, {{ kEngineControlEventTypeNull, 0, 0.0f }} };
  26. //static CarlaEngineEventCV kFallbackEngineEventCV = { nullptr, (uint32_t)-1, 0.0f };
  27. // -----------------------------------------------------------------------
  28. // Carla Engine port (Abstract)
  29. CarlaEnginePort::CarlaEnginePort(const CarlaEngineClient& client, const bool isInputPort, const uint32_t indexOffset) noexcept
  30. : kClient(client),
  31. kIsInput(isInputPort),
  32. kIndexOffset(indexOffset)
  33. {
  34. carla_debug("CarlaEnginePort::CarlaEnginePort(%s)", bool2str(isInputPort));
  35. }
  36. CarlaEnginePort::~CarlaEnginePort() noexcept
  37. {
  38. carla_debug("CarlaEnginePort::~CarlaEnginePort()");
  39. }
  40. void CarlaEnginePort::setMetaData(const char*, const char*, const char*)
  41. {
  42. }
  43. // -----------------------------------------------------------------------
  44. // Carla Engine Audio port
  45. CarlaEngineAudioPort::CarlaEngineAudioPort(const CarlaEngineClient& client, const bool isInputPort, const uint32_t indexOffset) noexcept
  46. : CarlaEnginePort(client, isInputPort, indexOffset),
  47. fBuffer(nullptr)
  48. {
  49. carla_debug("CarlaEngineAudioPort::CarlaEngineAudioPort(%s)", bool2str(isInputPort));
  50. }
  51. CarlaEngineAudioPort::~CarlaEngineAudioPort() noexcept
  52. {
  53. carla_debug("CarlaEngineAudioPort::~CarlaEngineAudioPort()");
  54. }
  55. void CarlaEngineAudioPort::initBuffer() noexcept
  56. {
  57. }
  58. // -----------------------------------------------------------------------
  59. // Carla Engine CV port
  60. CarlaEngineCVPort::CarlaEngineCVPort(const CarlaEngineClient& client, const bool isInputPort, const uint32_t indexOffset) noexcept
  61. : CarlaEnginePort(client, isInputPort, indexOffset),
  62. fBuffer(nullptr),
  63. fMinimum(-1.0f),
  64. fMaximum(1.0f)
  65. {
  66. carla_debug("CarlaEngineCVPort::CarlaEngineCVPort(%s)", bool2str(isInputPort));
  67. }
  68. CarlaEngineCVPort::~CarlaEngineCVPort() noexcept
  69. {
  70. carla_debug("CarlaEngineCVPort::~CarlaEngineCVPort()");
  71. }
  72. void CarlaEngineCVPort::initBuffer() noexcept
  73. {
  74. }
  75. void CarlaEngineCVPort::setRange(const float min, const float max) noexcept
  76. {
  77. fMinimum = min;
  78. fMaximum = max;
  79. char strBufMin[STR_MAX];
  80. char strBufMax[STR_MAX];
  81. carla_zeroChars(strBufMin, STR_MAX);
  82. carla_zeroChars(strBufMax, STR_MAX);
  83. {
  84. const CarlaScopedLocale csl;
  85. std::snprintf(strBufMin, STR_MAX-1, "%.12g", static_cast<double>(min));
  86. std::snprintf(strBufMax, STR_MAX-1, "%.12g", static_cast<double>(max));
  87. }
  88. setMetaData(LV2_CORE__minimum, strBufMin, "");
  89. setMetaData(LV2_CORE__maximum, strBufMax, "");
  90. }
  91. // -----------------------------------------------------------------------
  92. // Carla Engine Event port
  93. CarlaEngineEventPort::CarlaEngineEventPort(const CarlaEngineClient& client, const bool isInputPort, const uint32_t indexOffset) noexcept
  94. : CarlaEnginePort(client, isInputPort, indexOffset),
  95. kProcessMode(client.getEngine().getProccessMode()),
  96. fBuffer(nullptr)
  97. {
  98. carla_debug("CarlaEngineEventPort::CarlaEngineEventPort(%s)", bool2str(isInputPort));
  99. if (kProcessMode == ENGINE_PROCESS_MODE_PATCHBAY)
  100. {
  101. fBuffer = new EngineEvent[kMaxEngineEventInternalCount];
  102. carla_zeroStructs(fBuffer, kMaxEngineEventInternalCount);
  103. }
  104. }
  105. CarlaEngineEventPort::~CarlaEngineEventPort() noexcept
  106. {
  107. carla_debug("CarlaEngineEventPort::~CarlaEngineEventPort()");
  108. if (kProcessMode == ENGINE_PROCESS_MODE_PATCHBAY)
  109. {
  110. CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,);
  111. delete[] fBuffer;
  112. fBuffer = nullptr;
  113. }
  114. }
  115. void CarlaEngineEventPort::initBuffer() noexcept
  116. {
  117. if (kProcessMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK || kProcessMode == ENGINE_PROCESS_MODE_BRIDGE)
  118. fBuffer = kClient.getEngine().getInternalEventBuffer(kIsInput);
  119. else if (kProcessMode == ENGINE_PROCESS_MODE_PATCHBAY && ! kIsInput)
  120. carla_zeroStructs(fBuffer, kMaxEngineEventInternalCount);
  121. }
  122. uint32_t CarlaEngineEventPort::getEventCount() const noexcept
  123. {
  124. CARLA_SAFE_ASSERT_RETURN(kIsInput, 0);
  125. CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, 0);
  126. CARLA_SAFE_ASSERT_RETURN(kProcessMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT && kProcessMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, 0);
  127. uint32_t i=0;
  128. for (; i < kMaxEngineEventInternalCount; ++i)
  129. {
  130. if (fBuffer[i].type == kEngineEventTypeNull)
  131. break;
  132. }
  133. return i;
  134. }
  135. const EngineEvent& CarlaEngineEventPort::getEvent(const uint32_t index) const noexcept
  136. {
  137. CARLA_SAFE_ASSERT_RETURN(kIsInput, kFallbackEngineEvent);
  138. CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, kFallbackEngineEvent);
  139. CARLA_SAFE_ASSERT_RETURN(kProcessMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT && kProcessMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, kFallbackEngineEvent);
  140. CARLA_SAFE_ASSERT_RETURN(index < kMaxEngineEventInternalCount, kFallbackEngineEvent);
  141. return fBuffer[index];
  142. }
  143. const EngineEvent& CarlaEngineEventPort::getEventUnchecked(const uint32_t index) const noexcept
  144. {
  145. return fBuffer[index];
  146. }
  147. bool CarlaEngineEventPort::writeControlEvent(const uint32_t time, const uint8_t channel, const EngineControlEvent& ctrl) noexcept
  148. {
  149. return writeControlEvent(time, channel, ctrl.type, ctrl.param, ctrl.value);
  150. }
  151. bool CarlaEngineEventPort::writeControlEvent(const uint32_t time, const uint8_t channel, const EngineControlEventType type, const uint16_t param, const float value) noexcept
  152. {
  153. CARLA_SAFE_ASSERT_RETURN(! kIsInput, false);
  154. CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, false);
  155. CARLA_SAFE_ASSERT_RETURN(kProcessMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT && kProcessMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, false);
  156. CARLA_SAFE_ASSERT_RETURN(type != kEngineControlEventTypeNull, false);
  157. CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, false);
  158. CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f);
  159. if (type == kEngineControlEventTypeParameter) {
  160. CARLA_SAFE_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(param));
  161. }
  162. for (uint32_t i=0; i < kMaxEngineEventInternalCount; ++i)
  163. {
  164. EngineEvent& event(fBuffer[i]);
  165. if (event.type != kEngineEventTypeNull)
  166. continue;
  167. event.type = kEngineEventTypeControl;
  168. event.time = time;
  169. event.channel = channel;
  170. event.ctrl.type = type;
  171. event.ctrl.param = param;
  172. event.ctrl.value = carla_fixedValue<float>(0.0f, 1.0f, value);
  173. return true;
  174. }
  175. carla_stderr2("CarlaEngineEventPort::writeControlEvent() - buffer full");
  176. return false;
  177. }
  178. bool CarlaEngineEventPort::writeMidiEvent(const uint32_t time, const uint8_t size, const uint8_t* const data) noexcept
  179. {
  180. return writeMidiEvent(time, uint8_t(MIDI_GET_CHANNEL_FROM_DATA(data)), size, data);
  181. }
  182. bool CarlaEngineEventPort::writeMidiEvent(const uint32_t time, const uint8_t channel, const EngineMidiEvent& midi) noexcept
  183. {
  184. CARLA_SAFE_ASSERT(midi.port == kIndexOffset);
  185. return writeMidiEvent(time, channel, midi.size, midi.data);
  186. }
  187. bool CarlaEngineEventPort::writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t size, const uint8_t* const data) noexcept
  188. {
  189. CARLA_SAFE_ASSERT_RETURN(! kIsInput, false);
  190. CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr, false);
  191. CARLA_SAFE_ASSERT_RETURN(kProcessMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT && kProcessMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, false);
  192. CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, false);
  193. CARLA_SAFE_ASSERT_RETURN(size > 0 && size <= EngineMidiEvent::kDataSize, false);
  194. CARLA_SAFE_ASSERT_RETURN(data != nullptr, false);
  195. for (uint32_t i=0; i < kMaxEngineEventInternalCount; ++i)
  196. {
  197. EngineEvent& event(fBuffer[i]);
  198. if (event.type != kEngineEventTypeNull)
  199. continue;
  200. event.time = time;
  201. event.channel = channel;
  202. const uint8_t status(uint8_t(MIDI_GET_STATUS_FROM_DATA(data)));
  203. if (status == MIDI_STATUS_CONTROL_CHANGE)
  204. {
  205. CARLA_SAFE_ASSERT_RETURN(size >= 2, true);
  206. switch (data[1])
  207. {
  208. case MIDI_CONTROL_BANK_SELECT:
  209. case MIDI_CONTROL_BANK_SELECT__LSB:
  210. CARLA_SAFE_ASSERT_RETURN(size >= 3, true);
  211. event.type = kEngineEventTypeControl;
  212. event.ctrl.type = kEngineControlEventTypeMidiBank;
  213. event.ctrl.param = data[2];
  214. event.ctrl.value = 0.0f;
  215. return true;
  216. case MIDI_CONTROL_ALL_SOUND_OFF:
  217. event.type = kEngineEventTypeControl;
  218. event.ctrl.type = kEngineControlEventTypeAllSoundOff;
  219. event.ctrl.param = 0;
  220. event.ctrl.value = 0.0f;
  221. return true;
  222. case MIDI_CONTROL_ALL_NOTES_OFF:
  223. event.type = kEngineEventTypeControl;
  224. event.ctrl.type = kEngineControlEventTypeAllNotesOff;
  225. event.ctrl.param = 0;
  226. event.ctrl.value = 0.0f;
  227. return true;
  228. }
  229. }
  230. if (status == MIDI_STATUS_PROGRAM_CHANGE)
  231. {
  232. CARLA_SAFE_ASSERT_RETURN(size >= 2, true);
  233. event.type = kEngineEventTypeControl;
  234. event.ctrl.type = kEngineControlEventTypeMidiProgram;
  235. event.ctrl.param = data[1];
  236. event.ctrl.value = 0.0f;
  237. return true;
  238. }
  239. event.type = kEngineEventTypeMidi;
  240. event.midi.size = size;
  241. if (kIndexOffset < 0xFF /* uint8_t max */)
  242. {
  243. event.midi.port = static_cast<uint8_t>(kIndexOffset);
  244. }
  245. else
  246. {
  247. event.midi.port = 0;
  248. carla_safe_assert_uint("kIndexOffset < 0xFF", __FILE__, __LINE__, kIndexOffset);
  249. }
  250. event.midi.data[0] = status;
  251. uint8_t j=1;
  252. for (; j < size; ++j)
  253. event.midi.data[j] = data[j];
  254. for (; j < EngineMidiEvent::kDataSize; ++j)
  255. event.midi.data[j] = 0;
  256. return true;
  257. }
  258. carla_stderr2("CarlaEngineEventPort::writeMidiEvent() - buffer full");
  259. return false;
  260. }
  261. #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH
  262. // -----------------------------------------------------------------------
  263. // Carla Engine Meta CV port
  264. CarlaEngineCVSourcePorts::ProtectedData::ProtectedData()
  265. : rmutex(),
  266. buffer(nullptr),
  267. cvs()
  268. {
  269. }
  270. CarlaEngineCVSourcePorts::ProtectedData::~ProtectedData()
  271. {
  272. const CarlaRecursiveMutexLocker crml(rmutex);
  273. for (int i = cvs.size(); --i >= 0;)
  274. delete cvs[i].cvPort;
  275. cvs.clear();
  276. if (buffer != nullptr)
  277. {
  278. delete[] buffer;
  279. buffer = nullptr;
  280. }
  281. }
  282. CarlaEngineCVSourcePorts::CarlaEngineCVSourcePorts(/*const CarlaEngineClient& client*/)
  283. : pData(new ProtectedData())
  284. {
  285. carla_debug("CarlaEngineCVSourcePorts::CarlaEngineCVSourcePorts()");
  286. }
  287. CarlaEngineCVSourcePorts::~CarlaEngineCVSourcePorts()
  288. {
  289. carla_debug("CarlaEngineCVSourcePorts::~CarlaEngineCVSourcePorts()");
  290. }
  291. bool CarlaEngineCVSourcePorts::addCVSource(CarlaEngineCVPort* const port, const uint32_t portIndexOffset)
  292. {
  293. CARLA_SAFE_ASSERT_RETURN(port != nullptr, false);
  294. CARLA_SAFE_ASSERT_RETURN(port->isInput(), false);
  295. carla_debug("CarlaEngineCVSourcePorts::addCVSource(%p)", port);
  296. const CarlaRecursiveMutexLocker crml(pData->rmutex);
  297. const CarlaEngineEventCV ecv = { port, portIndexOffset, 0.0f };
  298. if (! pData->cvs.add(ecv))
  299. return false;
  300. /*
  301. if (pData->buffer == nullptr)
  302. pData->buffer = new EngineEvent[kMaxEngineEventInternalCount];
  303. */
  304. return true;
  305. }
  306. bool CarlaEngineCVSourcePorts::removeCVSource(const uint32_t portIndexOffset) noexcept
  307. {
  308. carla_debug("CarlaEngineCVSourcePorts::removeCVSource(%u)", portIndexOffset);
  309. const CarlaRecursiveMutexLocker crml(pData->rmutex);
  310. for (int i = pData->cvs.size(); --i >= 0;)
  311. {
  312. const CarlaEngineEventCV& ecv(pData->cvs[i]);
  313. if (ecv.indexOffset == portIndexOffset)
  314. {
  315. pData->cvs.remove(i);
  316. break;
  317. }
  318. }
  319. if (pData->buffer != nullptr)
  320. {
  321. delete[] pData->buffer;
  322. pData->buffer = nullptr;
  323. }
  324. return true;
  325. }
  326. void CarlaEngineCVSourcePorts::initPortBuffers(const float* const* const buffers,
  327. const uint32_t frames,
  328. const bool sampleAccurate,
  329. CarlaEngineEventPort* const eventPort)
  330. {
  331. CARLA_SAFE_ASSERT_RETURN(buffers != nullptr,);
  332. CARLA_SAFE_ASSERT_RETURN(eventPort != nullptr,);
  333. const CarlaRecursiveMutexTryLocker crmtl(pData->rmutex);
  334. if (! crmtl.wasLocked())
  335. return;
  336. EngineEvent* const buffer = eventPort->fBuffer;
  337. CARLA_SAFE_ASSERT_RETURN(buffer != nullptr,);
  338. /*
  339. if (buffer == nullptr)
  340. return;
  341. */
  342. uint32_t eventCount = 0;
  343. float v, min, max;
  344. for (; eventCount < kMaxEngineEventInternalCount; ++eventCount)
  345. {
  346. if (buffer[eventCount].type == kEngineEventTypeNull)
  347. break;
  348. }
  349. if (eventCount == kMaxEngineEventInternalCount)
  350. return;
  351. if (sampleAccurate || true)
  352. {
  353. for (int i = 0; i < pData->cvs.size() && eventCount < kMaxEngineEventInternalCount; ++i)
  354. {
  355. CarlaEngineEventCV& ecv(pData->cvs.getReference(i));
  356. CARLA_SAFE_ASSERT_CONTINUE(ecv.cvPort != nullptr);
  357. float previousValue = ecv.previousValue;
  358. ecv.cvPort->getRange(min, max);
  359. v = buffers[i][frames-1U];
  360. if (carla_isNotEqual(v, previousValue))
  361. {
  362. previousValue = v;
  363. EngineEvent& event(buffer[eventCount++]);
  364. event.type = kEngineEventTypeControl;
  365. event.time = frames-1U;
  366. event.channel = kEngineEventNonMidiChannel;
  367. event.ctrl.type = kEngineControlEventTypeParameter;
  368. event.ctrl.param = static_cast<uint16_t>(i);
  369. event.ctrl.value = carla_fixedValue(0.0f, 1.0f, (v - min) / (max - min));
  370. }
  371. ecv.previousValue = previousValue;
  372. }
  373. }
  374. }
  375. /*
  376. void CarlaEngineCVSourcePorts::mixWithCvBuffer(const float* const buffer,
  377. const uint32_t frames,
  378. const uint32_t indexOffset) noexcept
  379. {
  380. for (LinkedList<CarlaEngineEventCV>::Itenerator it = pData->cvs.begin2(); it.valid(); it.next())
  381. {
  382. CarlaEngineEventCV& ecv(it.getValue(kFallbackEngineEventCV));
  383. if (ecv.indexOffset != indexOffset)
  384. continue;
  385. CARLA_SAFE_ASSERT_RETURN(ecv.cvPort != nullptr,);
  386. float previousValue = ecv.previousValue;
  387. ecv.cvPort->getRange(min, max);
  388. for (uint32_t i=0; i<frames; i+=32)
  389. {
  390. v = buffer[i];
  391. if (carla_isNotEqual(v, previousValue))
  392. {
  393. previousValue = v;
  394. EngineEvent& event(pData->buffer[eventIndex++]);
  395. event.type = kEngineEventTypeControl;
  396. event.time = i;
  397. event.channel = kEngineEventNonMidiChannel;
  398. event.ctrl.type = kEngineControlEventTypeParameter;
  399. event.ctrl.param = static_cast<uint16_t>(indexOffset);
  400. event.ctrl.value = carla_fixedValue(0.0f, 1.0f, (v - min) / (max - min));
  401. }
  402. }
  403. ecv.previousValue = previousValue;
  404. break;
  405. }
  406. }
  407. */
  408. #endif
  409. // -----------------------------------------------------------------------
  410. CARLA_BACKEND_END_NAMESPACE