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.

203 lines
6.0KB

  1. /*
  2. * DISTRHO Plugin Framework (DPF)
  3. * Copyright (C) 2012-2021 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_lastBufferSize = 0;
  21. double d_lastSampleRate = 0.0;
  22. bool d_lastCanRequestParameterValueChanges = false;
  23. /* ------------------------------------------------------------------------------------------------------------
  24. * Static fallback data, see DistrhoPluginInternal.hpp */
  25. const String PluginExporter::sFallbackString;
  26. /* */ AudioPortWithBusId PluginExporter::sFallbackAudioPort;
  27. const ParameterRanges PluginExporter::sFallbackRanges;
  28. const ParameterEnumerationValues PluginExporter::sFallbackEnumValues;
  29. const PortGroupWithId PluginExporter::sFallbackPortGroup;
  30. /* ------------------------------------------------------------------------------------------------------------
  31. * Plugin */
  32. Plugin::Plugin(uint32_t parameterCount, uint32_t programCount, uint32_t stateCount)
  33. : pData(new PrivateData())
  34. {
  35. #if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
  36. pData->audioPorts = new AudioPortWithBusId[DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS];
  37. #endif
  38. #ifdef DPF_ABORT_ON_ERROR
  39. # define DPF_ABORT abort();
  40. #else
  41. # define DPF_ABORT
  42. #endif
  43. if (parameterCount > 0)
  44. {
  45. pData->parameterCount = parameterCount;
  46. pData->parameters = new Parameter[parameterCount];
  47. }
  48. if (programCount > 0)
  49. {
  50. #if DISTRHO_PLUGIN_WANT_PROGRAMS
  51. pData->programCount = programCount;
  52. pData->programNames = new String[programCount];
  53. #else
  54. d_stderr2("DPF warning: Plugins with programs must define `DISTRHO_PLUGIN_WANT_PROGRAMS` to 1");
  55. DPF_ABORT
  56. #endif
  57. }
  58. if (stateCount > 0)
  59. {
  60. #if DISTRHO_PLUGIN_WANT_STATE
  61. pData->stateCount = stateCount;
  62. pData->stateKeys = new String[stateCount];
  63. pData->stateDefValues = new String[stateCount];
  64. #else
  65. d_stderr2("DPF warning: Plugins with state must define `DISTRHO_PLUGIN_WANT_STATE` to 1");
  66. DPF_ABORT
  67. #endif
  68. }
  69. #undef DPF_ABORT
  70. }
  71. Plugin::~Plugin()
  72. {
  73. delete pData;
  74. }
  75. /* ------------------------------------------------------------------------------------------------------------
  76. * Host state */
  77. uint32_t Plugin::getBufferSize() const noexcept
  78. {
  79. return pData->bufferSize;
  80. }
  81. double Plugin::getSampleRate() const noexcept
  82. {
  83. return pData->sampleRate;
  84. }
  85. #if DISTRHO_PLUGIN_WANT_TIMEPOS
  86. const TimePosition& Plugin::getTimePosition() const noexcept
  87. {
  88. return pData->timePosition;
  89. }
  90. #endif
  91. #if DISTRHO_PLUGIN_WANT_LATENCY
  92. void Plugin::setLatency(uint32_t frames) noexcept
  93. {
  94. pData->latency = frames;
  95. }
  96. #endif
  97. #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
  98. bool Plugin::writeMidiEvent(const MidiEvent& midiEvent) noexcept
  99. {
  100. return pData->writeMidiCallback(midiEvent);
  101. }
  102. #endif
  103. #if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
  104. bool Plugin::canRequestParameterValueChanges() const noexcept
  105. {
  106. return pData->canRequestParameterValueChanges;
  107. }
  108. bool Plugin::requestParameterValueChange(const uint32_t index, const float value) noexcept
  109. {
  110. return pData->requestParameterValueChangeCallback(index, value);
  111. }
  112. #endif
  113. /* ------------------------------------------------------------------------------------------------------------
  114. * Init */
  115. void Plugin::initAudioPort(bool input, uint32_t index, AudioPort& port)
  116. {
  117. if (port.hints & kAudioPortIsCV)
  118. {
  119. port.name = input ? "CV Input " : "CV Output ";
  120. port.name += String(index+1);
  121. port.symbol = input ? "cv_in_" : "cv_out_";
  122. port.symbol += String(index+1);
  123. }
  124. else
  125. {
  126. port.name = input ? "Audio Input " : "Audio Output ";
  127. port.name += String(index+1);
  128. port.symbol = input ? "audio_in_" : "audio_out_";
  129. port.symbol += String(index+1);
  130. }
  131. }
  132. void Plugin::initParameter(uint32_t, Parameter&) {}
  133. void Plugin::initPortGroup(const uint32_t groupId, PortGroup& portGroup)
  134. {
  135. fillInPredefinedPortGroupData(groupId, portGroup);
  136. }
  137. #if DISTRHO_PLUGIN_WANT_PROGRAMS
  138. void Plugin::initProgramName(uint32_t, String&) {}
  139. #endif
  140. #if DISTRHO_PLUGIN_WANT_STATE
  141. void Plugin::initState(uint32_t, String&, String&) {}
  142. #endif
  143. #if DISTRHO_PLUGIN_WANT_STATEFILES
  144. bool Plugin::isStateFile(uint32_t) { return false; }
  145. #endif
  146. /* ------------------------------------------------------------------------------------------------------------
  147. * Init */
  148. float Plugin::getParameterValue(uint32_t) const { return 0.0f; }
  149. void Plugin::setParameterValue(uint32_t, float) {}
  150. #if DISTRHO_PLUGIN_WANT_PROGRAMS
  151. void Plugin::loadProgram(uint32_t) {}
  152. #endif
  153. #if DISTRHO_PLUGIN_WANT_FULL_STATE
  154. String Plugin::getState(const char*) const { return String(); }
  155. #endif
  156. #if DISTRHO_PLUGIN_WANT_STATE
  157. void Plugin::setState(const char*, const char*) {}
  158. #endif
  159. /* ------------------------------------------------------------------------------------------------------------
  160. * Callbacks (optional) */
  161. void Plugin::bufferSizeChanged(uint32_t) {}
  162. void Plugin::sampleRateChanged(double) {}
  163. // -----------------------------------------------------------------------------------------------------------
  164. END_NAMESPACE_DISTRHO