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.

251 lines
8.1KB

  1. /*
  2. * DISTRHO Plugin Framework (DPF)
  3. * Copyright (C) 2012-2019 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. #include "CoreAudio106/AudioUnits/AUPublic/OtherBases/AUEffectBase.h"
  18. // -----------------------------------------------------------------------
  19. START_NAMESPACE_DISTRHO
  20. // #if ! DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
  21. static const writeMidiFunc writeMidiCallback = nullptr;
  22. // #endif
  23. // -----------------------------------------------------------------------
  24. struct LastValuesInit {
  25. LastValuesInit()
  26. {
  27. if (d_lastBufferSize == 0)
  28. d_lastBufferSize = kAUDefaultMaxFramesPerSlice;
  29. if (d_isZero(d_lastSampleRate))
  30. d_lastSampleRate = kAUDefaultSampleRate;
  31. };
  32. };
  33. // -----------------------------------------------------------------------
  34. // AU Plugin
  35. class PluginAU : public AUEffectBase
  36. {
  37. public:
  38. PluginAU(AudioUnit component)
  39. : AUEffectBase(component),
  40. fLastValuesInit(),
  41. fPlugin(this, writeMidiCallback)
  42. {
  43. CreateElements();
  44. AUElement* const globals = Globals();
  45. DISTRHO_SAFE_ASSERT_RETURN(globals != nullptr,);
  46. if (const uint32_t paramCount = fPlugin.getParameterCount())
  47. {
  48. globals->UseIndexedParameters(paramCount);
  49. for (uint32_t i=0; i < paramCount; ++i)
  50. globals->SetParameter(i, fPlugin.getParameterValue(i));
  51. }
  52. }
  53. ~PluginAU() override
  54. {
  55. }
  56. AUKernelBase* NewKernel() override
  57. {
  58. return new PluginKernel(this, fPlugin);
  59. }
  60. OSStatus GetParameterValueStrings(AudioUnitScope inScope,
  61. AudioUnitParameterID inParameterID,
  62. CFArrayRef* outStrings) override
  63. {
  64. // TODO scalepoints support via kAudioUnitParameterFlag_ValuesHaveStrings
  65. return kAudioUnitErr_InvalidProperty;
  66. }
  67. OSStatus GetParameterInfo(AudioUnitScope inScope,
  68. AudioUnitParameterID inParameterID,
  69. AudioUnitParameterInfo& outParameterInfo) override
  70. {
  71. DISTRHO_SAFE_ASSERT_RETURN(inScope == kAudioUnitScope_Global, kAudioUnitErr_InvalidParameter);
  72. // Name
  73. {
  74. // FIXME
  75. // const String& name = fPlugin.getParameterUnit(inParameterID);
  76. // AUBase::FillInParameterName(outParameterInfo, name.buffer(), true);
  77. }
  78. // Hints
  79. {
  80. const uint32_t hints(fPlugin.getParameterHints(inParameterID));
  81. outParameterInfo.flags = 0x0;
  82. // other interesting bits:
  83. // kAudioUnitParameterFlag_OmitFromPresets for outputs?
  84. // kAudioUnitParameterFlag_MeterReadOnly for outputs?
  85. // kAudioUnitParameterFlag_CanRamp for log?
  86. // kAudioUnitParameterFlag_IsHighResolution ??
  87. if (hints & kParameterIsOutput)
  88. outParameterInfo.flags = kAudioUnitParameterFlag_IsReadable;
  89. else
  90. outParameterInfo.flags = kAudioUnitParameterFlag_IsWritable;
  91. if ((hints & kParameterIsAutomable) == 0x0)
  92. outParameterInfo.flags |= kAudioUnitParameterFlag_NonRealTime;
  93. /* TODO: there doesn't seem to be a hint for this
  94. if (hints & kParameterIsBoolean)
  95. {}
  96. else if (hints & kParameterIsInteger)
  97. {}
  98. */
  99. if (hints & kParameterIsLogarithmic)
  100. outParameterInfo.flags |= kAudioUnitParameterFlag_DisplayLogarithmic;
  101. }
  102. // Ranges
  103. {
  104. const ParameterRanges& ranges(fPlugin.getParameterRanges(inParameterID));
  105. outParameterInfo.defaultValue = ranges.def;
  106. outParameterInfo.minValue = ranges.min;
  107. outParameterInfo.maxValue = ranges.max;
  108. }
  109. // Unit
  110. {
  111. const String& unit = fPlugin.getParameterUnit(inParameterID);
  112. // TODO: map all AU unit types
  113. if (unit == "dB")
  114. {
  115. outParameterInfo.unit = kAudioUnitParameterUnit_LinearGain;
  116. }
  117. else
  118. {
  119. // FIXME
  120. // outParameterInfo.unit = kAudioUnitParameterUnit_CustomUnit;
  121. // outParameterInfo.unitName = unit.buffer();
  122. }
  123. }
  124. return noErr;
  125. }
  126. OSStatus GetPropertyInfo(AudioUnitPropertyID inID,
  127. AudioUnitScope inScope,
  128. AudioUnitElement inElement,
  129. UInt32& outDataSize,
  130. Boolean& outWritable) override
  131. {
  132. return AUEffectBase::GetPropertyInfo(inID, inScope, inElement, outDataSize, outWritable);
  133. }
  134. OSStatus GetProperty(AudioUnitPropertyID inID,
  135. AudioUnitScope inScope,
  136. AudioUnitElement inElement,
  137. void* outData) override
  138. {
  139. return AUEffectBase::GetProperty (inID, inScope, inElement, outData);
  140. }
  141. bool SupportsTail() override
  142. {
  143. return false;
  144. }
  145. OSStatus Version() override
  146. {
  147. return fPlugin.getVersion();
  148. }
  149. // -------------------------------------------------------------------
  150. private:
  151. LastValuesInit fLastValuesInit;
  152. PluginExporter fPlugin;
  153. // most of the real work happens here
  154. class PluginKernel : public AUKernelBase
  155. {
  156. public:
  157. PluginKernel(AUEffectBase* const inAudioUnit, PluginExporter& plugin)
  158. : AUKernelBase(inAudioUnit),
  159. fPlugin(plugin) {}
  160. // *Required* overides for the process method for this effect
  161. // processes one channel of interleaved samples
  162. void Process(const Float32* const inSourceP,
  163. Float32* const inDestP,
  164. UInt32 inFramesToProcess,
  165. UInt32 inNumChannels,
  166. bool& ioSilence)
  167. {
  168. DISTRHO_SAFE_ASSERT_RETURN(inNumChannels == DISTRHO_PLUGIN_NUM_INPUTS,);
  169. // FIXME
  170. // fPlugin.run(inSourceP, inDestP, inFramesToProcess);
  171. }
  172. void Reset() override
  173. {
  174. }
  175. private:
  176. PluginExporter& fPlugin;
  177. DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginKernel)
  178. };
  179. DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginAU)
  180. };
  181. END_NAMESPACE_DISTRHO
  182. // -----------------------------------------------------------------------
  183. COMPONENT_ENTRY(PluginAU)
  184. // -----------------------------------------------------------------------
  185. #include "CoreAudio106/AudioUnits/AUPublic/AUBase/AUBase.cpp"
  186. #include "CoreAudio106/AudioUnits/AUPublic/AUBase/AUDispatch.cpp"
  187. #include "CoreAudio106/AudioUnits/AUPublic/AUBase/AUInputElement.cpp"
  188. #include "CoreAudio106/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp"
  189. #include "CoreAudio106/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp"
  190. #include "CoreAudio106/AudioUnits/AUPublic/AUBase/ComponentBase.cpp"
  191. #include "CoreAudio106/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp"
  192. #include "CoreAudio106/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp"
  193. #include "CoreAudio106/AudioUnits/AUPublic/Utility/AUBuffer.cpp"
  194. #include "CoreAudio106/PublicUtility/CAAudioChannelLayout.cpp"
  195. #include "CoreAudio106/PublicUtility/CAAUParameter.cpp"
  196. #include "CoreAudio106/PublicUtility/CAMutex.cpp"
  197. #include "CoreAudio106/PublicUtility/CAStreamBasicDescription.cpp"
  198. #include "CoreAudio106/PublicUtility/CAVectorUnit.cpp"
  199. // -----------------------------------------------------------------------