DISTRHO Plugin Framework
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.

225 lines
6.4KB

  1. /*
  2. * DISTRHO Plugin Framework (DPF)
  3. * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any purpose with
  6. * or without fee is hereby granted, provided that the above copyright notice and this
  7. * permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  10. * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  11. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  12. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  13. * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include "DistrhoPluginInternal.hpp"
  17. START_NAMESPACE_DISTRHO
  18. /* ------------------------------------------------------------------------------------------------------------
  19. * Static data, see DistrhoPluginInternal.hpp */
  20. uint32_t d_nextBufferSize = 0;
  21. double d_nextSampleRate = 0.0;
  22. const char* d_nextBundlePath = nullptr;
  23. bool d_nextPluginIsDummy = false;
  24. bool d_nextCanRequestParameterValueChanges = false;
  25. /* ------------------------------------------------------------------------------------------------------------
  26. * Static fallback data, see DistrhoPluginInternal.hpp */
  27. const String PluginExporter::sFallbackString;
  28. /* */ AudioPortWithBusId PluginExporter::sFallbackAudioPort;
  29. const ParameterRanges PluginExporter::sFallbackRanges;
  30. const ParameterEnumerationValues PluginExporter::sFallbackEnumValues;
  31. const PortGroupWithId PluginExporter::sFallbackPortGroup;
  32. /* ------------------------------------------------------------------------------------------------------------
  33. * Plugin */
  34. Plugin::Plugin(uint32_t parameterCount, uint32_t programCount, uint32_t stateCount)
  35. : pData(new PrivateData())
  36. {
  37. #if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
  38. pData->audioPorts = new AudioPortWithBusId[DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS];
  39. #endif
  40. #ifdef DPF_ABORT_ON_ERROR
  41. # define DPF_ABORT abort();
  42. #else
  43. # define DPF_ABORT
  44. #endif
  45. if (parameterCount > 0)
  46. {
  47. pData->parameterCount = parameterCount;
  48. pData->parameters = new Parameter[parameterCount];
  49. }
  50. if (programCount > 0)
  51. {
  52. #if DISTRHO_PLUGIN_WANT_PROGRAMS
  53. pData->programCount = programCount;
  54. pData->programNames = new String[programCount];
  55. #else
  56. d_stderr2("DPF warning: Plugins with programs must define `DISTRHO_PLUGIN_WANT_PROGRAMS` to 1");
  57. DPF_ABORT
  58. #endif
  59. }
  60. if (stateCount > 0)
  61. {
  62. #if DISTRHO_PLUGIN_WANT_STATE
  63. pData->stateCount = stateCount;
  64. pData->stateKeys = new String[stateCount];
  65. pData->stateDefValues = new String[stateCount];
  66. #else
  67. d_stderr2("DPF warning: Plugins with state must define `DISTRHO_PLUGIN_WANT_STATE` to 1");
  68. DPF_ABORT
  69. #endif
  70. }
  71. #undef DPF_ABORT
  72. }
  73. Plugin::~Plugin()
  74. {
  75. delete pData;
  76. }
  77. /* ------------------------------------------------------------------------------------------------------------
  78. * Host state */
  79. uint32_t Plugin::getBufferSize() const noexcept
  80. {
  81. return pData->bufferSize;
  82. }
  83. double Plugin::getSampleRate() const noexcept
  84. {
  85. return pData->sampleRate;
  86. }
  87. const char* Plugin::getBundlePath() const noexcept
  88. {
  89. return pData->bundlePath;
  90. }
  91. bool Plugin::isDummyInstance() const noexcept
  92. {
  93. return pData->isDummy;
  94. }
  95. #if DISTRHO_PLUGIN_WANT_TIMEPOS
  96. const TimePosition& Plugin::getTimePosition() const noexcept
  97. {
  98. return pData->timePosition;
  99. }
  100. #endif
  101. #if DISTRHO_PLUGIN_WANT_LATENCY
  102. void Plugin::setLatency(uint32_t frames) noexcept
  103. {
  104. pData->latency = frames;
  105. }
  106. #endif
  107. #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
  108. bool Plugin::writeMidiEvent(const MidiEvent& midiEvent) noexcept
  109. {
  110. return pData->writeMidiCallback(midiEvent);
  111. }
  112. #endif
  113. #if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
  114. bool Plugin::canRequestParameterValueChanges() const noexcept
  115. {
  116. return pData->canRequestParameterValueChanges;
  117. }
  118. bool Plugin::requestParameterValueChange(const uint32_t index, const float value) noexcept
  119. {
  120. return pData->requestParameterValueChangeCallback(index, value);
  121. }
  122. #endif
  123. /* ------------------------------------------------------------------------------------------------------------
  124. * Init */
  125. void Plugin::initAudioPort(bool input, uint32_t index, AudioPort& port)
  126. {
  127. if (port.hints & kAudioPortIsCV)
  128. {
  129. port.name = input ? "CV Input " : "CV Output ";
  130. port.name += String(index+1);
  131. port.symbol = input ? "cv_in_" : "cv_out_";
  132. port.symbol += String(index+1);
  133. }
  134. else
  135. {
  136. port.name = input ? "Audio Input " : "Audio Output ";
  137. port.name += String(index+1);
  138. port.symbol = input ? "audio_in_" : "audio_out_";
  139. port.symbol += String(index+1);
  140. }
  141. }
  142. void Plugin::initParameter(uint32_t, Parameter&) {}
  143. void Plugin::initPortGroup(const uint32_t groupId, PortGroup& portGroup)
  144. {
  145. fillInPredefinedPortGroupData(groupId, portGroup);
  146. }
  147. #if DISTRHO_PLUGIN_WANT_PROGRAMS
  148. void Plugin::initProgramName(uint32_t, String&) {}
  149. #endif
  150. #if DISTRHO_PLUGIN_WANT_STATE
  151. void Plugin::initState(uint32_t, String&, String&) {}
  152. #endif
  153. #if DISTRHO_PLUGIN_WANT_STATEFILES
  154. bool Plugin::isStateFile(uint32_t) { return false; }
  155. #endif
  156. /* ------------------------------------------------------------------------------------------------------------
  157. * Init */
  158. float Plugin::getParameterValue(uint32_t) const { return 0.0f; }
  159. void Plugin::setParameterValue(uint32_t, float) {}
  160. #if DISTRHO_PLUGIN_WANT_PROGRAMS
  161. void Plugin::loadProgram(uint32_t) {}
  162. #endif
  163. #if DISTRHO_PLUGIN_WANT_FULL_STATE
  164. String Plugin::getState(const char*) const { return String(); }
  165. #endif
  166. #if DISTRHO_PLUGIN_WANT_STATE
  167. uint32_t Plugin::getStateHints(const uint32_t index)
  168. {
  169. #if DISTRHO_PLUGIN_WANT_STATEFILES
  170. if isStateFile(index)
  171. return kStateIsFilenamePath;
  172. #endif
  173. return 0x0;
  174. }
  175. void Plugin::setState(const char*, const char*) {}
  176. #endif
  177. /* ------------------------------------------------------------------------------------------------------------
  178. * Callbacks (optional) */
  179. void Plugin::bufferSizeChanged(uint32_t) {}
  180. void Plugin::sampleRateChanged(double) {}
  181. // -----------------------------------------------------------------------------------------------------------
  182. END_NAMESPACE_DISTRHO