expo-juce 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1611) hide show
  1. package/README.md +34 -0
  2. package/build/index.d.ts +21 -24
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +44 -48
  5. package/build/index.js.map +1 -1
  6. package/ios/BeeperAudioEngine.h +45 -0
  7. package/ios/BeeperAudioEngine.mm +352 -0
  8. package/ios/ExpoJuce.podspec +31 -8
  9. package/ios/ExpoJuceBridge.h +12 -12
  10. package/ios/ExpoJuceBridge.m +35 -100
  11. package/ios/ExpoJuceModule.swift +63 -85
  12. package/ios/JuceConfig.h +49 -14
  13. package/ios/JuceModule_audio_basics.mm +2 -0
  14. package/ios/JuceModule_audio_devices.mm +2 -0
  15. package/ios/JuceModule_audio_formats.mm +2 -0
  16. package/ios/JuceModule_audio_processors.mm +2 -0
  17. package/ios/JuceModule_core.mm +5 -0
  18. package/ios/JuceModule_data_structures.mm +2 -0
  19. package/ios/JuceModule_dsp.mm +2 -0
  20. package/ios/JuceModule_events.mm +2 -0
  21. package/ios/JuceModule_graphics.mm +2 -0
  22. package/ios/JuceModule_gui_basics.mm +2 -0
  23. package/ios/JuceModule_gui_extra.mm +2 -0
  24. package/ios/JuceModule_harfbuzz.mm +4 -0
  25. package/ios/PolySynthProcessor.h +83 -0
  26. package/ios/PolySynthProcessor.mm +164 -0
  27. package/ios/TransportEngine.h +35 -0
  28. package/ios/TransportEngine.mm +50 -0
  29. package/ios/Voice.h +59 -0
  30. package/ios/Voice.mm +157 -0
  31. package/ios/VoiceAllocator.h +22 -0
  32. package/ios/VoiceAllocator.mm +88 -0
  33. package/ios/juce_modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp +1957 -0
  34. package/ios/juce_modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h +586 -0
  35. package/ios/juce_modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp +65 -0
  36. package/ios/juce_modules/juce_audio_devices/audio_io/juce_AudioIODevice.h +368 -0
  37. package/ios/juce_modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp +152 -0
  38. package/ios/juce_modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h +200 -0
  39. package/ios/juce_modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp +57 -0
  40. package/ios/juce_modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h +71 -0
  41. package/ios/juce_modules/juce_audio_devices/juce_audio_devices.cpp +277 -0
  42. package/ios/juce_modules/juce_audio_devices/juce_audio_devices.h +201 -0
  43. package/ios/juce_modules/juce_audio_devices/juce_audio_devices.mm +35 -0
  44. package/ios/juce_modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp +246 -0
  45. package/ios/juce_modules/juce_audio_devices/midi_io/juce_MidiDevices.h +482 -0
  46. package/ios/juce_modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp +170 -0
  47. package/ios/juce_modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h +125 -0
  48. package/ios/juce_modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h +153 -0
  49. package/ios/juce_modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h +165 -0
  50. package/ios/juce_modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java +1121 -0
  51. package/ios/juce_modules/juce_audio_devices/native/juce_ALSA_linux.cpp +1313 -0
  52. package/ios/juce_modules/juce_audio_devices/native/juce_ASIO_windows.cpp +1654 -0
  53. package/ios/juce_modules/juce_audio_devices/native/juce_Audio_android.cpp +482 -0
  54. package/ios/juce_modules/juce_audio_devices/native/juce_Audio_ios.cpp +1508 -0
  55. package/ios/juce_modules/juce_audio_devices/native/juce_Audio_ios.h +106 -0
  56. package/ios/juce_modules/juce_audio_devices/native/juce_Bela_linux.cpp +612 -0
  57. package/ios/juce_modules/juce_audio_devices/native/juce_CoreAudio_mac.cpp +2315 -0
  58. package/ios/juce_modules/juce_audio_devices/native/juce_CoreMidi_mac.mm +1280 -0
  59. package/ios/juce_modules/juce_audio_devices/native/juce_DirectSound_windows.cpp +1304 -0
  60. package/ios/juce_modules/juce_audio_devices/native/juce_HighPerformanceAudioHelpers_android.h +137 -0
  61. package/ios/juce_modules/juce_audio_devices/native/juce_JackAudio_linux.cpp +681 -0
  62. package/ios/juce_modules/juce_audio_devices/native/juce_Midi_android.cpp +1183 -0
  63. package/ios/juce_modules/juce_audio_devices/native/juce_Midi_linux.cpp +788 -0
  64. package/ios/juce_modules/juce_audio_devices/native/juce_Midi_windows.cpp +2038 -0
  65. package/ios/juce_modules/juce_audio_devices/native/juce_Oboe_android.cpp +1440 -0
  66. package/ios/juce_modules/juce_audio_devices/native/juce_OpenSL_android.cpp +1306 -0
  67. package/ios/juce_modules/juce_audio_devices/native/juce_WASAPI_windows.cpp +2032 -0
  68. package/ios/juce_modules/juce_audio_devices/native/oboe/.clang-tidy +3 -0
  69. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h +706 -0
  70. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h +343 -0
  71. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h +670 -0
  72. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h +193 -0
  73. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h +897 -0
  74. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/FifoBuffer.h +164 -0
  75. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/FifoControllerBase.h +112 -0
  76. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/FullDuplexStream.h +324 -0
  77. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h +150 -0
  78. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h +40 -0
  79. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/OboeExtensions.h +64 -0
  80. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h +155 -0
  81. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h +75 -0
  82. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h +99 -0
  83. package/ios/juce_modules/juce_audio_devices/native/oboe/include/oboe/Version.h +92 -0
  84. package/ios/juce_modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h +180 -0
  85. package/ios/juce_modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp +506 -0
  86. package/ios/juce_modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h +299 -0
  87. package/ios/juce_modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp +868 -0
  88. package/ios/juce_modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h +152 -0
  89. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/AdpfWrapper.cpp +124 -0
  90. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/AdpfWrapper.h +85 -0
  91. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/AudioClock.h +75 -0
  92. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp +38 -0
  93. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h +83 -0
  94. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp +222 -0
  95. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp +224 -0
  96. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp +266 -0
  97. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h +86 -0
  98. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp +106 -0
  99. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h +227 -0
  100. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp +38 -0
  101. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h +67 -0
  102. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp +73 -0
  103. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h +60 -0
  104. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp +73 -0
  105. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h +54 -0
  106. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp +108 -0
  107. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h +112 -0
  108. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h +41 -0
  109. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/OboeExtensions.cpp +36 -0
  110. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp +311 -0
  111. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h +134 -0
  112. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp +30 -0
  113. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h +44 -0
  114. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp +47 -0
  115. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h +49 -0
  116. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp +56 -0
  117. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h +53 -0
  118. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp +47 -0
  119. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h +53 -0
  120. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp +112 -0
  121. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/Trace.cpp +75 -0
  122. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/Trace.h +31 -0
  123. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp +333 -0
  124. package/ios/juce_modules/juce_audio_devices/native/oboe/src/common/Version.cpp +28 -0
  125. package/ios/juce_modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp +178 -0
  126. package/ios/juce_modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp +30 -0
  127. package/ios/juce_modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h +62 -0
  128. package/ios/juce_modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp +68 -0
  129. package/ios/juce_modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp +32 -0
  130. package/ios/juce_modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h +66 -0
  131. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp +52 -0
  132. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h +52 -0
  133. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp +38 -0
  134. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h +68 -0
  135. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp +114 -0
  136. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h +450 -0
  137. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h +55 -0
  138. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/Limiter.cpp +67 -0
  139. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/Limiter.h +64 -0
  140. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp +47 -0
  141. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h +53 -0
  142. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/MonoBlend.cpp +46 -0
  143. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/MonoBlend.h +48 -0
  144. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp +41 -0
  145. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h +49 -0
  146. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToManyConverter.cpp +47 -0
  147. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToManyConverter.h +49 -0
  148. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp +41 -0
  149. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h +49 -0
  150. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp +81 -0
  151. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h +96 -0
  152. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp +71 -0
  153. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h +63 -0
  154. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp +46 -0
  155. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h +45 -0
  156. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp +57 -0
  157. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h +43 -0
  158. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp +66 -0
  159. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h +44 -0
  160. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp +55 -0
  161. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h +40 -0
  162. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp +42 -0
  163. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h +44 -0
  164. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp +54 -0
  165. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h +42 -0
  166. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp +65 -0
  167. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h +43 -0
  168. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp +54 -0
  169. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h +42 -0
  170. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h +71 -0
  171. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp +50 -0
  172. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h +54 -0
  173. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h +90 -0
  174. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp +42 -0
  175. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h +47 -0
  176. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp +171 -0
  177. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h +281 -0
  178. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp +61 -0
  179. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h +53 -0
  180. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp +63 -0
  181. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h +41 -0
  182. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp +79 -0
  183. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h +41 -0
  184. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/ResamplerDefinitions.h +27 -0
  185. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp +72 -0
  186. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h +50 -0
  187. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp +81 -0
  188. package/ios/juce_modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h +42 -0
  189. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp +360 -0
  190. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h +66 -0
  191. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp +462 -0
  192. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h +80 -0
  193. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp +285 -0
  194. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h +96 -0
  195. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp +499 -0
  196. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h +148 -0
  197. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp +141 -0
  198. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h +65 -0
  199. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp +96 -0
  200. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h +44 -0
  201. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp +74 -0
  202. package/ios/juce_modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h +58 -0
  203. package/ios/juce_modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp +193 -0
  204. package/ios/juce_modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h +127 -0
  205. package/ios/juce_modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp +295 -0
  206. package/ios/juce_modules/juce_audio_devices/sources/juce_AudioTransportSource.h +192 -0
  207. package/ios/juce_modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp +107 -0
  208. package/ios/juce_modules/juce_audio_processors/format/juce_AudioPluginFormat.h +183 -0
  209. package/ios/juce_modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp +212 -0
  210. package/ios/juce_modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h +151 -0
  211. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py +175 -0
  212. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h +87 -0
  213. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING +13 -0
  214. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h +2117 -0
  215. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp +440 -0
  216. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c +240 -0
  217. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c +564 -0
  218. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h +182 -0
  219. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c +115 -0
  220. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c +127 -0
  221. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h +477 -0
  222. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c +413 -0
  223. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c +1140 -0
  224. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c +91 -0
  225. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c +272 -0
  226. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c +144 -0
  227. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c +53 -0
  228. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c +1541 -0
  229. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c +115 -0
  230. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c +291 -0
  231. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c +1249 -0
  232. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h +138 -0
  233. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c +727 -0
  234. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h +164 -0
  235. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h +42 -0
  236. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING +16 -0
  237. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c +73 -0
  238. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c +367 -0
  239. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h +260 -0
  240. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl +542 -0
  241. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl +247 -0
  242. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c +235 -0
  243. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h +683 -0
  244. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl +9 -0
  245. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h +523 -0
  246. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h +51 -0
  247. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl +157 -0
  248. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl +67 -0
  249. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl +9 -0
  250. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h +59 -0
  251. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h +484 -0
  252. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h +103 -0
  253. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl +905 -0
  254. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl +674 -0
  255. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl +15 -0
  256. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl +199 -0
  257. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl +51 -0
  258. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h +73 -0
  259. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl +77 -0
  260. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl +11 -0
  261. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl +9 -0
  262. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h +160 -0
  263. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl +131 -0
  264. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl +25 -0
  265. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl +9 -0
  266. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h +255 -0
  267. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h +306 -0
  268. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl +246 -0
  269. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl +86 -0
  270. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl +9 -0
  271. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h +41 -0
  272. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl +75 -0
  273. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl +11 -0
  274. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl +9 -0
  275. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h +113 -0
  276. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl +126 -0
  277. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl +48 -0
  278. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h +157 -0
  279. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl +9 -0
  280. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl +9 -0
  281. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h +248 -0
  282. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl +153 -0
  283. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl +366 -0
  284. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl +9 -0
  285. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h +48 -0
  286. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl +90 -0
  287. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl +46 -0
  288. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl +9 -0
  289. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h +149 -0
  290. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl +129 -0
  291. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl +44 -0
  292. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl +9 -0
  293. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h +68 -0
  294. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl +75 -0
  295. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl +202 -0
  296. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl +9 -0
  297. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h +73 -0
  298. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl +374 -0
  299. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl +251 -0
  300. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl +9 -0
  301. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h +77 -0
  302. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl +144 -0
  303. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl +807 -0
  304. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl +9 -0
  305. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h +53 -0
  306. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl +202 -0
  307. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl +79 -0
  308. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl +9 -0
  309. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h +48 -0
  310. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl +132 -0
  311. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl +60 -0
  312. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl +9 -0
  313. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h +89 -0
  314. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl +74 -0
  315. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl +36 -0
  316. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl +9 -0
  317. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h +392 -0
  318. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl +467 -0
  319. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl +60 -0
  320. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl +9 -0
  321. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h +59 -0
  322. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl +112 -0
  323. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl +122 -0
  324. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl +9 -0
  325. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h +543 -0
  326. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl +627 -0
  327. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl +248 -0
  328. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl +9 -0
  329. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h +75 -0
  330. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl +154 -0
  331. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl +379 -0
  332. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl +9 -0
  333. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h +121 -0
  334. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl +72 -0
  335. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl +14 -0
  336. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl +9 -0
  337. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h +140 -0
  338. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl +84 -0
  339. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl +22 -0
  340. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl +9 -0
  341. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h +183 -0
  342. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl +82 -0
  343. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl +25 -0
  344. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING +13 -0
  345. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h +1059 -0
  346. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy +18 -0
  347. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h +26 -0
  348. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c +132 -0
  349. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h +48 -0
  350. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h +98 -0
  351. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c +112 -0
  352. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h +120 -0
  353. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c +256 -0
  354. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c +1720 -0
  355. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c +393 -0
  356. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h +48 -0
  357. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c +425 -0
  358. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h +196 -0
  359. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h +98 -0
  360. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h +46 -0
  361. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c +377 -0
  362. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h +119 -0
  363. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c +179 -0
  364. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h +173 -0
  365. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c +82 -0
  366. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h +40 -0
  367. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c +506 -0
  368. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h +110 -0
  369. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c +1114 -0
  370. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h +42 -0
  371. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING +13 -0
  372. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h +642 -0
  373. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp +720 -0
  374. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c +1368 -0
  375. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h +61 -0
  376. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h +53 -0
  377. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c +767 -0
  378. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c +804 -0
  379. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c +216 -0
  380. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp +25 -0
  381. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c +203 -0
  382. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c +936 -0
  383. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h +187 -0
  384. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h +138 -0
  385. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c +141 -0
  386. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h +67 -0
  387. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c +230 -0
  388. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h +138 -0
  389. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h +42 -0
  390. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING +13 -0
  391. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h +220 -0
  392. package/ios/juce_modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c +919 -0
  393. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/VST3_License_Agreement.pdf +0 -0
  394. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/VST3_Usage_Guidelines.pdf +0 -0
  395. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp +52 -0
  396. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h +87 -0
  397. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp +641 -0
  398. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h +306 -0
  399. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fcommandline.h +392 -0
  400. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp +340 -0
  401. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h +246 -0
  402. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp +271 -0
  403. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h +577 -0
  404. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp +756 -0
  405. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h +242 -0
  406. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp +3962 -0
  407. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h +767 -0
  408. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp +737 -0
  409. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h +150 -0
  410. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h +184 -0
  411. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp +146 -0
  412. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/helper.manifest +10 -0
  413. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp +106 -0
  414. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h +44 -0
  415. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp +40 -0
  416. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h +25 -0
  417. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h +40 -0
  418. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h +333 -0
  419. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h +291 -0
  420. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h +176 -0
  421. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp +502 -0
  422. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h +564 -0
  423. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h +107 -0
  424. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h +297 -0
  425. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h +87 -0
  426. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h +41 -0
  427. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h +160 -0
  428. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h +520 -0
  429. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iplugincompatibility.h +122 -0
  430. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h +80 -0
  431. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h +98 -0
  432. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h +386 -0
  433. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h +55 -0
  434. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp +275 -0
  435. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h +116 -0
  436. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h +287 -0
  437. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h +75 -0
  438. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h +150 -0
  439. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h +434 -0
  440. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h +67 -0
  441. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h +238 -0
  442. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h +205 -0
  443. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h +219 -0
  444. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstdataexchange.h +221 -0
  445. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h +657 -0
  446. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h +221 -0
  447. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h +163 -0
  448. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h +142 -0
  449. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h +97 -0
  450. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h +118 -0
  451. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h +106 -0
  452. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h +255 -0
  453. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h +145 -0
  454. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h +151 -0
  455. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h +169 -0
  456. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h +67 -0
  457. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h +62 -0
  458. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h +99 -0
  459. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h +153 -0
  460. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstremapparamid.h +75 -0
  461. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h +364 -0
  462. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h +109 -0
  463. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h +271 -0
  464. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h +30 -0
  465. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h +1318 -0
  466. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h +157 -0
  467. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp +441 -0
  468. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp +319 -0
  469. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h +79 -0
  470. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp +100 -0
  471. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h +116 -0
  472. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp +81 -0
  473. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h +54 -0
  474. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp +342 -0
  475. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h +120 -0
  476. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp +340 -0
  477. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.h +214 -0
  478. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp +369 -0
  479. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm +395 -0
  480. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp +647 -0
  481. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp +134 -0
  482. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h +70 -0
  483. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/json.h +3403 -0
  484. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/jsoncxx.h +427 -0
  485. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfo.h +100 -0
  486. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.cpp +309 -0
  487. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.h +67 -0
  488. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.cpp +537 -0
  489. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.h +68 -0
  490. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/optional.h +135 -0
  491. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp +148 -0
  492. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h +147 -0
  493. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/uid.h +286 -0
  494. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp +99 -0
  495. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h +172 -0
  496. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp +216 -0
  497. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h +118 -0
  498. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp +180 -0
  499. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h +110 -0
  500. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp +701 -0
  501. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h +374 -0
  502. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp +154 -0
  503. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp +454 -0
  504. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h +240 -0
  505. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp +927 -0
  506. package/ios/juce_modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h +306 -0
  507. package/ios/juce_modules/juce_audio_processors/format_types/juce_ARACommon.cpp +99 -0
  508. package/ios/juce_modules/juce_audio_processors/format_types/juce_ARACommon.h +98 -0
  509. package/ios/juce_modules/juce_audio_processors/format_types/juce_ARAHosting.cpp +490 -0
  510. package/ios/juce_modules/juce_audio_processors/format_types/juce_ARAHosting.h +786 -0
  511. package/ios/juce_modules/juce_audio_processors/format_types/juce_AU_Shared.h +588 -0
  512. package/ios/juce_modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h +79 -0
  513. package/ios/juce_modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +2947 -0
  514. package/ios/juce_modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp +728 -0
  515. package/ios/juce_modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h +79 -0
  516. package/ios/juce_modules/juce_audio_processors/format_types/juce_LV2Common.h +676 -0
  517. package/ios/juce_modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp +5654 -0
  518. package/ios/juce_modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h +87 -0
  519. package/ios/juce_modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp +281 -0
  520. package/ios/juce_modules/juce_audio_processors/format_types/juce_LV2Resources.h +10241 -0
  521. package/ios/juce_modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp +117 -0
  522. package/ios/juce_modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp +225 -0
  523. package/ios/juce_modules/juce_audio_processors/format_types/juce_VST3Common.h +1851 -0
  524. package/ios/juce_modules/juce_audio_processors/format_types/juce_VST3Headers.h +280 -0
  525. package/ios/juce_modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +4086 -0
  526. package/ios/juce_modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h +95 -0
  527. package/ios/juce_modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp +740 -0
  528. package/ios/juce_modules/juce_audio_processors/format_types/juce_VSTCommon.h +315 -0
  529. package/ios/juce_modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h +229 -0
  530. package/ios/juce_modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +3764 -0
  531. package/ios/juce_modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h +141 -0
  532. package/ios/juce_modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h +190 -0
  533. package/ios/juce_modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h +108 -0
  534. package/ios/juce_modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h +53 -0
  535. package/ios/juce_modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h +121 -0
  536. package/ios/juce_modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h +53 -0
  537. package/ios/juce_modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h +67 -0
  538. package/ios/juce_modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h +57 -0
  539. package/ios/juce_modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h +111 -0
  540. package/ios/juce_modules/juce_audio_processors/juce_audio_processors.cpp +246 -0
  541. package/ios/juce_modules/juce_audio_processors/juce_audio_processors.h +195 -0
  542. package/ios/juce_modules/juce_audio_processors/juce_audio_processors.mm +35 -0
  543. package/ios/juce_modules/juce_audio_processors/juce_audio_processors_ara.cpp +51 -0
  544. package/ios/juce_modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp +44 -0
  545. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp +294 -0
  546. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioPluginInstance.h +191 -0
  547. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessor.cpp +1655 -0
  548. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessor.h +1587 -0
  549. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp +230 -0
  550. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h +272 -0
  551. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h +98 -0
  552. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +2375 -0
  553. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +453 -0
  554. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorListener.h +198 -0
  555. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h +370 -0
  556. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp +330 -0
  557. package/ios/juce_modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h +263 -0
  558. package/ios/juce_modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp +633 -0
  559. package/ios/juce_modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h +74 -0
  560. package/ios/juce_modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h +61 -0
  561. package/ios/juce_modules/juce_audio_processors/processors/juce_PluginDescription.cpp +126 -0
  562. package/ios/juce_modules/juce_audio_processors/processors/juce_PluginDescription.h +189 -0
  563. package/ios/juce_modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp +651 -0
  564. package/ios/juce_modules/juce_audio_processors/scanning/juce_KnownPluginList.h +249 -0
  565. package/ios/juce_modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp +148 -0
  566. package/ios/juce_modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h +147 -0
  567. package/ios/juce_modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp +690 -0
  568. package/ios/juce_modules/juce_audio_processors/scanning/juce_PluginListComponent.h +156 -0
  569. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARADebug.h +76 -0
  570. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp +985 -0
  571. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h +538 -0
  572. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp +80 -0
  573. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp +302 -0
  574. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h +983 -0
  575. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp +123 -0
  576. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h +263 -0
  577. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp +65 -0
  578. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h +95 -0
  579. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp +163 -0
  580. package/ios/juce_modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h +213 -0
  581. package/ios/juce_modules/juce_audio_processors/utilities/juce_AAXClientExtensions.cpp +308 -0
  582. package/ios/juce_modules/juce_audio_processors/utilities/juce_AAXClientExtensions.h +92 -0
  583. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp +104 -0
  584. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioParameterBool.h +149 -0
  585. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp +145 -0
  586. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h +162 -0
  587. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp +113 -0
  588. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h +169 -0
  589. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp +146 -0
  590. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioParameterInt.h +163 -0
  591. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp +56 -0
  592. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h +200 -0
  593. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp +997 -0
  594. package/ios/juce_modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h +669 -0
  595. package/ios/juce_modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h +155 -0
  596. package/ios/juce_modules/juce_audio_processors/utilities/juce_FlagCache.h +191 -0
  597. package/ios/juce_modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp +442 -0
  598. package/ios/juce_modules/juce_audio_processors/utilities/juce_ParameterAttachments.h +400 -0
  599. package/ios/juce_modules/juce_audio_processors/utilities/juce_PluginHostType.cpp +328 -0
  600. package/ios/juce_modules/juce_audio_processors/utilities/juce_PluginHostType.h +265 -0
  601. package/ios/juce_modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp +60 -0
  602. package/ios/juce_modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h +129 -0
  603. package/ios/juce_modules/juce_audio_processors/utilities/juce_VST2ClientExtensions.cpp +48 -0
  604. package/ios/juce_modules/juce_audio_processors/utilities/juce_VST2ClientExtensions.h +83 -0
  605. package/ios/juce_modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h +119 -0
  606. package/ios/juce_modules/juce_core/native/juce_BasicNativeHeaders.h +6 -1
  607. package/ios/juce_modules/juce_graphics/colour/juce_Colour.cpp +726 -0
  608. package/ios/juce_modules/juce_graphics/colour/juce_Colour.h +429 -0
  609. package/ios/juce_modules/juce_graphics/colour/juce_ColourGradient.cpp +294 -0
  610. package/ios/juce_modules/juce_graphics/colour/juce_ColourGradient.h +255 -0
  611. package/ios/juce_modules/juce_graphics/colour/juce_Colours.cpp +205 -0
  612. package/ios/juce_modules/juce_graphics/colour/juce_Colours.h +200 -0
  613. package/ios/juce_modules/juce_graphics/colour/juce_FillType.cpp +166 -0
  614. package/ios/juce_modules/juce_graphics/colour/juce_FillType.h +165 -0
  615. package/ios/juce_modules/juce_graphics/colour/juce_PixelFormats.h +749 -0
  616. package/ios/juce_modules/juce_graphics/contexts/juce_GraphicsContext.cpp +857 -0
  617. package/ios/juce_modules/juce_graphics/contexts/juce_GraphicsContext.h +758 -0
  618. package/ios/juce_modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h +186 -0
  619. package/ios/juce_modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp +59 -0
  620. package/ios/juce_modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h +66 -0
  621. package/ios/juce_modules/juce_graphics/detail/juce_Ranges.cpp +793 -0
  622. package/ios/juce_modules/juce_graphics/detail/juce_Ranges.h +1014 -0
  623. package/ios/juce_modules/juce_graphics/effects/juce_DropShadowEffect.cpp +152 -0
  624. package/ios/juce_modules/juce_graphics/effects/juce_DropShadowEffect.h +122 -0
  625. package/ios/juce_modules/juce_graphics/effects/juce_GlowEffect.cpp +59 -0
  626. package/ios/juce_modules/juce_graphics/effects/juce_GlowEffect.h +86 -0
  627. package/ios/juce_modules/juce_graphics/effects/juce_ImageEffectFilter.h +80 -0
  628. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Color/CBDT/CBDT.hh +1031 -0
  629. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Color/COLR/COLR.hh +2745 -0
  630. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Color/COLR/colrv1-closure.hh +137 -0
  631. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Color/CPAL/CPAL.hh +358 -0
  632. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Color/sbix/sbix.hh +448 -0
  633. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Color/svg/svg.hh +152 -0
  634. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/Common/Coverage.hh +352 -0
  635. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/Common/CoverageFormat1.hh +133 -0
  636. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/Common/CoverageFormat2.hh +239 -0
  637. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/Common/RangeRecord.hh +97 -0
  638. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GDEF/GDEF.hh +1044 -0
  639. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/Anchor.hh +84 -0
  640. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/AnchorFormat1.hh +46 -0
  641. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/AnchorFormat2.hh +58 -0
  642. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/AnchorFormat3.hh +120 -0
  643. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/AnchorMatrix.hh +87 -0
  644. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/ChainContextPos.hh +14 -0
  645. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/Common.hh +33 -0
  646. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/ContextPos.hh +14 -0
  647. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/CursivePos.hh +35 -0
  648. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh +311 -0
  649. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/ExtensionPos.hh +17 -0
  650. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/GPOS.hh +171 -0
  651. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/LigatureArray.hh +57 -0
  652. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/MarkArray.hh +128 -0
  653. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/MarkBasePos.hh +41 -0
  654. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/MarkBasePosFormat1.hh +243 -0
  655. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/MarkLigPos.hh +41 -0
  656. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/MarkLigPosFormat1.hh +224 -0
  657. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/MarkMarkPos.hh +42 -0
  658. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/MarkMarkPosFormat1.hh +231 -0
  659. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/MarkRecord.hh +51 -0
  660. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/PairPos.hh +46 -0
  661. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/PairPosFormat1.hh +233 -0
  662. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/PairPosFormat2.hh +365 -0
  663. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/PairSet.hh +210 -0
  664. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/PairValueRecord.hh +99 -0
  665. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/PosLookup.hh +79 -0
  666. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/PosLookupSubTable.hh +79 -0
  667. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/SinglePos.hh +98 -0
  668. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/SinglePosFormat1.hh +190 -0
  669. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/SinglePosFormat2.hh +213 -0
  670. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GPOS/ValueFormat.hh +441 -0
  671. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/AlternateSet.hh +126 -0
  672. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/AlternateSubst.hh +62 -0
  673. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/AlternateSubstFormat1.hh +128 -0
  674. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/ChainContextSubst.hh +18 -0
  675. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/Common.hh +19 -0
  676. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/ContextSubst.hh +18 -0
  677. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/ExtensionSubst.hh +22 -0
  678. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/GSUB.hh +61 -0
  679. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/Ligature.hh +203 -0
  680. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/LigatureSet.hh +188 -0
  681. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/LigatureSubst.hh +71 -0
  682. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/LigatureSubstFormat1.hh +166 -0
  683. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/MultipleSubst.hh +62 -0
  684. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/MultipleSubstFormat1.hh +130 -0
  685. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/ReverseChainSingleSubst.hh +36 -0
  686. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh +245 -0
  687. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/Sequence.hh +165 -0
  688. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/SingleSubst.hh +103 -0
  689. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/SingleSubstFormat1.hh +204 -0
  690. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/SingleSubstFormat2.hh +176 -0
  691. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/SubstLookup.hh +220 -0
  692. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/GSUB/SubstLookupSubTable.hh +77 -0
  693. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Layout/types.hh +66 -0
  694. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Var/VARC/VARC.cc +346 -0
  695. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Var/VARC/VARC.hh +193 -0
  696. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/Var/VARC/coord-setter.hh +37 -0
  697. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/CompositeGlyph.hh +435 -0
  698. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/Glyph.hh +556 -0
  699. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/GlyphHeader.hh +52 -0
  700. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/SimpleGlyph.hh +348 -0
  701. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/SubsetGlyph.hh +141 -0
  702. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/composite-iter.hh +68 -0
  703. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/glyf-helpers.hh +127 -0
  704. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/glyf.hh +513 -0
  705. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/loca.hh +43 -0
  706. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/glyf/path-builder.hh +190 -0
  707. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/OT/name/name.hh +589 -0
  708. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/failing-alloc.c +65 -0
  709. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/harfbuzz-subset.cc +64 -0
  710. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/harfbuzz.cc +63 -0
  711. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-ankr-table.hh +99 -0
  712. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-bsln-table.hh +159 -0
  713. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-common.hh +1076 -0
  714. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-feat-table.hh +224 -0
  715. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-just-table.hh +420 -0
  716. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-kerx-table.hh +1191 -0
  717. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-morx-table.hh +1443 -0
  718. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-opbd-table.hh +174 -0
  719. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout-trak-table.hh +232 -0
  720. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout.cc +449 -0
  721. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout.h +795 -0
  722. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-layout.hh +77 -0
  723. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-ltag-table.hh +95 -0
  724. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-map.cc +172 -0
  725. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat-map.hh +123 -0
  726. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-aat.h +38 -0
  727. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-algs.hh +1558 -0
  728. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-array.hh +504 -0
  729. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-atomic.hh +228 -0
  730. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-bimap.hh +205 -0
  731. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-bit-page.hh +352 -0
  732. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-bit-set-invertible.hh +379 -0
  733. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-bit-set.hh +982 -0
  734. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-blob.cc +794 -0
  735. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-blob.h +160 -0
  736. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-blob.hh +98 -0
  737. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-buffer-deserialize-json.hh +795 -0
  738. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-buffer-deserialize-text-glyphs.hh +692 -0
  739. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-buffer-deserialize-text-unicode.hh +332 -0
  740. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-buffer-serialize.cc +872 -0
  741. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-buffer-verify.cc +423 -0
  742. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-buffer.cc +2266 -0
  743. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-buffer.h +805 -0
  744. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-buffer.hh +682 -0
  745. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-cache.hh +99 -0
  746. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-cff-interp-common.hh +642 -0
  747. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-cff-interp-cs-common.hh +905 -0
  748. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-cff-interp-dict-common.hh +201 -0
  749. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-cff1-interp-cs.hh +160 -0
  750. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-cff2-interp-cs.hh +278 -0
  751. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-common.cc +1220 -0
  752. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-common.h +935 -0
  753. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-config.hh +212 -0
  754. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-coretext.cc +1197 -0
  755. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-coretext.h +96 -0
  756. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-cplusplus.hh +220 -0
  757. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-debug.hh +491 -0
  758. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-deprecated.h +318 -0
  759. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-directwrite.cc +884 -0
  760. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-directwrite.h +40 -0
  761. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-dispatch.hh +60 -0
  762. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-draw.cc +458 -0
  763. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-draw.h +340 -0
  764. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-draw.hh +243 -0
  765. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-face-builder.cc +246 -0
  766. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-face.cc +664 -0
  767. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-face.h +187 -0
  768. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-face.hh +111 -0
  769. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-fallback-shape.cc +115 -0
  770. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-font.cc +3069 -0
  771. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-font.h +1153 -0
  772. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-font.hh +720 -0
  773. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ft-colr.hh +601 -0
  774. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ft.cc +1500 -0
  775. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ft.h +145 -0
  776. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-gdi.cc +85 -0
  777. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-gdi.h +39 -0
  778. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-geometry.hh +284 -0
  779. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-glib.cc +232 -0
  780. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-glib.h +56 -0
  781. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-gobject-structs.cc +116 -0
  782. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-gobject-structs.h +136 -0
  783. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-gobject.h +40 -0
  784. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-graphite2.cc +455 -0
  785. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-graphite2.h +61 -0
  786. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-icu.cc +291 -0
  787. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-icu.h +52 -0
  788. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-iter.hh +1037 -0
  789. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-kern.hh +145 -0
  790. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-limits.hh +112 -0
  791. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-machinery.hh +332 -0
  792. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-map.cc +419 -0
  793. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-map.h +143 -0
  794. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-map.hh +568 -0
  795. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-meta.hh +238 -0
  796. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ms-feature-ranges.hh +232 -0
  797. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-multimap.hh +96 -0
  798. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-mutex.hh +122 -0
  799. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-null.hh +226 -0
  800. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-number-parser.hh +237 -0
  801. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-number.cc +79 -0
  802. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-number.hh +41 -0
  803. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-object.hh +357 -0
  804. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-open-file.hh +543 -0
  805. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-open-type.hh +1886 -0
  806. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-cff-common.hh +374 -0
  807. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-cff1-std-str.hh +425 -0
  808. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-cff1-table.cc +620 -0
  809. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-cff1-table.hh +1539 -0
  810. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-cff2-table.cc +227 -0
  811. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-cff2-table.hh +564 -0
  812. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-cmap-table.hh +2154 -0
  813. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-color.cc +363 -0
  814. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-color.h +155 -0
  815. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-deprecated.h +147 -0
  816. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-face-table-list.hh +155 -0
  817. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-face.cc +60 -0
  818. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-face.hh +77 -0
  819. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-font.cc +662 -0
  820. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-font.h +45 -0
  821. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-gasp-table.hh +84 -0
  822. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-glyf-table.hh +35 -0
  823. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-hdmx-table.hh +177 -0
  824. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-head-table.hh +204 -0
  825. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-hhea-table.hh +106 -0
  826. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-hmtx-table.hh +502 -0
  827. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-kern-table.hh +425 -0
  828. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout-base-table.hh +849 -0
  829. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout-common.hh +4953 -0
  830. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout-gdef-table.hh +34 -0
  831. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout-gpos-table.hh +81 -0
  832. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout-gsub-table.hh +94 -0
  833. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout-gsubgpos.hh +4887 -0
  834. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout-jstf-table.hh +236 -0
  835. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout.cc +2705 -0
  836. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout.h +549 -0
  837. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-layout.hh +611 -0
  838. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-map.cc +394 -0
  839. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-map.hh +298 -0
  840. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-math-table.hh +1132 -0
  841. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-math.cc +338 -0
  842. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-math.h +333 -0
  843. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-maxp-table.hh +156 -0
  844. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-meta-table.hh +131 -0
  845. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-meta.cc +79 -0
  846. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-meta.h +72 -0
  847. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-metrics.cc +436 -0
  848. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-metrics.h +129 -0
  849. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-metrics.hh +35 -0
  850. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-name-language-static.hh +456 -0
  851. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-name-language.hh +40 -0
  852. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-name-table.hh +32 -0
  853. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-name.cc +184 -0
  854. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-name.h +164 -0
  855. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-os2-table.hh +405 -0
  856. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-os2-unicode-ranges.hh +231 -0
  857. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-post-macroman.hh +294 -0
  858. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-post-table-v2subset.hh +142 -0
  859. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-post-table.hh +352 -0
  860. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shape-fallback.cc +615 -0
  861. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shape-fallback.hh +54 -0
  862. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shape-normalize.cc +470 -0
  863. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shape-normalize.hh +104 -0
  864. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shape.cc +1319 -0
  865. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shape.h +53 -0
  866. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shape.hh +171 -0
  867. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-arabic-fallback.hh +383 -0
  868. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-arabic-joining-list.hh +47 -0
  869. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-arabic-pua.hh +118 -0
  870. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-arabic-table.hh +556 -0
  871. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-arabic-win1256.hh +349 -0
  872. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-arabic.cc +774 -0
  873. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-arabic.hh +50 -0
  874. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-default.cc +75 -0
  875. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-hangul.cc +436 -0
  876. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-hebrew.cc +211 -0
  877. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-indic-machine.hh +627 -0
  878. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-indic-table.cc +561 -0
  879. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-indic.cc +1578 -0
  880. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-indic.hh +66 -0
  881. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-khmer-machine.hh +428 -0
  882. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-khmer.cc +387 -0
  883. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-myanmar-machine.hh +553 -0
  884. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-myanmar.cc +390 -0
  885. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-syllabic.cc +112 -0
  886. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-syllabic.hh +47 -0
  887. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-thai.cc +393 -0
  888. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-use-machine.hh +1079 -0
  889. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-use-table.hh +690 -0
  890. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-use.cc +514 -0
  891. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-vowel-constraints.cc +477 -0
  892. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper-vowel-constraints.hh +39 -0
  893. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-shaper.hh +404 -0
  894. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-stat-table.hh +619 -0
  895. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-tag-table.hh +3009 -0
  896. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-tag.cc +658 -0
  897. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var-avar-table.hh +411 -0
  898. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var-common.hh +1985 -0
  899. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var-cvar-table.hh +220 -0
  900. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var-fvar-table.hh +505 -0
  901. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var-gvar-table.hh +890 -0
  902. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var-hvar-table.hh +478 -0
  903. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var-mvar-table.hh +184 -0
  904. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var-varc-table.hh +32 -0
  905. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var.cc +328 -0
  906. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-var.h +191 -0
  907. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot-vorg-table.hh +137 -0
  908. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ot.h +49 -0
  909. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-outline.cc +321 -0
  910. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-outline.hh +83 -0
  911. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-paint-extents.cc +330 -0
  912. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-paint-extents.hh +132 -0
  913. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-paint.cc +728 -0
  914. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-paint.h +1029 -0
  915. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-paint.hh +236 -0
  916. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-pool.hh +107 -0
  917. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-priority-queue.hh +174 -0
  918. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-repacker.hh +476 -0
  919. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-sanitize.hh +530 -0
  920. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-serialize.hh +832 -0
  921. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-set-digest.hh +227 -0
  922. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-set.cc +673 -0
  923. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-set.h +203 -0
  924. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-set.hh +186 -0
  925. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shape-plan.cc +581 -0
  926. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shape-plan.h +122 -0
  927. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shape-plan.hh +77 -0
  928. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shape.cc +445 -0
  929. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shape.h +74 -0
  930. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shaper-impl.hh +38 -0
  931. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shaper-list.hh +65 -0
  932. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shaper.cc +102 -0
  933. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-shaper.hh +134 -0
  934. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-static.cc +138 -0
  935. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-string-array.hh +85 -0
  936. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-style.cc +134 -0
  937. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-style.h +81 -0
  938. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-accelerator.hh +141 -0
  939. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-cff-common.cc +231 -0
  940. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-cff-common.hh +1228 -0
  941. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-cff1.cc +1001 -0
  942. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-cff2.cc +679 -0
  943. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-input.cc +748 -0
  944. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-input.hh +155 -0
  945. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-instancer-iup.cc +532 -0
  946. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-instancer-iup.hh +37 -0
  947. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-instancer-solver.cc +434 -0
  948. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-instancer-solver.hh +114 -0
  949. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-plan-member-list.hh +164 -0
  950. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-plan.cc +1570 -0
  951. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-plan.hh +302 -0
  952. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-repacker.cc +58 -0
  953. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset-repacker.h +81 -0
  954. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset.cc +704 -0
  955. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset.h +260 -0
  956. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-subset.hh +74 -0
  957. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ucd-table.hh +5637 -0
  958. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-ucd.cc +258 -0
  959. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-unicode-emoji-table.hh +79 -0
  960. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-unicode.cc +625 -0
  961. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-unicode.h +643 -0
  962. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-unicode.hh +403 -0
  963. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-uniscribe.cc +889 -0
  964. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-uniscribe.h +46 -0
  965. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-utf.hh +481 -0
  966. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-vector.hh +539 -0
  967. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-version.h +95 -0
  968. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api-blob.hh +50 -0
  969. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api-buffer.hh +217 -0
  970. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api-common.hh +44 -0
  971. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api-face.hh +109 -0
  972. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api-font.hh +263 -0
  973. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api-list.hh +109 -0
  974. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api-shape.hh +70 -0
  975. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api.cc +46 -0
  976. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api.h +322 -0
  977. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-api.hh +117 -0
  978. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb-wasm-shape.cc +470 -0
  979. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb.h +51 -0
  980. package/ios/juce_modules/juce_graphics/fonts/harfbuzz/hb.hh +555 -0
  981. package/ios/juce_modules/juce_graphics/fonts/juce_AttributedString.cpp +288 -0
  982. package/ios/juce_modules/juce_graphics/fonts/juce_AttributedString.h +219 -0
  983. package/ios/juce_modules/juce_graphics/fonts/juce_Font.cpp +1036 -0
  984. package/ios/juce_modules/juce_graphics/fonts/juce_Font.h +571 -0
  985. package/ios/juce_modules/juce_graphics/fonts/juce_FontOptions.cpp +111 -0
  986. package/ios/juce_modules/juce_graphics/fonts/juce_FontOptions.h +218 -0
  987. package/ios/juce_modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h +53 -0
  988. package/ios/juce_modules/juce_graphics/fonts/juce_GlyphArrangement.cpp +657 -0
  989. package/ios/juce_modules/juce_graphics/fonts/juce_GlyphArrangement.h +324 -0
  990. package/ios/juce_modules/juce_graphics/fonts/juce_JustifiedText.cpp +580 -0
  991. package/ios/juce_modules/juce_graphics/fonts/juce_LruCache.h +88 -0
  992. package/ios/juce_modules/juce_graphics/fonts/juce_ShapedText.cpp +210 -0
  993. package/ios/juce_modules/juce_graphics/fonts/juce_SimpleShapedText.cpp +1279 -0
  994. package/ios/juce_modules/juce_graphics/fonts/juce_TextLayout.cpp +512 -0
  995. package/ios/juce_modules/juce_graphics/fonts/juce_TextLayout.h +278 -0
  996. package/ios/juce_modules/juce_graphics/fonts/juce_Typeface.cpp +983 -0
  997. package/ios/juce_modules/juce_graphics/fonts/juce_Typeface.h +396 -0
  998. package/ios/juce_modules/juce_graphics/fonts/juce_TypefaceFileCache.h +74 -0
  999. package/ios/juce_modules/juce_graphics/fonts/juce_TypefaceTestData.cpp +6051 -0
  1000. package/ios/juce_modules/juce_graphics/geometry/juce_AffineTransform.cpp +307 -0
  1001. package/ios/juce_modules/juce_graphics/geometry/juce_AffineTransform.h +314 -0
  1002. package/ios/juce_modules/juce_graphics/geometry/juce_BorderSize.h +176 -0
  1003. package/ios/juce_modules/juce_graphics/geometry/juce_EdgeTable.cpp +848 -0
  1004. package/ios/juce_modules/juce_graphics/geometry/juce_EdgeTable.h +225 -0
  1005. package/ios/juce_modules/juce_graphics/geometry/juce_Line.h +454 -0
  1006. package/ios/juce_modules/juce_graphics/geometry/juce_Parallelogram.h +194 -0
  1007. package/ios/juce_modules/juce_graphics/geometry/juce_Parallelogram_test.cpp +75 -0
  1008. package/ios/juce_modules/juce_graphics/geometry/juce_Path.cpp +1531 -0
  1009. package/ios/juce_modules/juce_graphics/geometry/juce_Path.h +846 -0
  1010. package/ios/juce_modules/juce_graphics/geometry/juce_PathIterator.cpp +304 -0
  1011. package/ios/juce_modules/juce_graphics/geometry/juce_PathIterator.h +120 -0
  1012. package/ios/juce_modules/juce_graphics/geometry/juce_PathStrokeType.cpp +756 -0
  1013. package/ios/juce_modules/juce_graphics/geometry/juce_PathStrokeType.h +215 -0
  1014. package/ios/juce_modules/juce_graphics/geometry/juce_Point.h +269 -0
  1015. package/ios/juce_modules/juce_graphics/geometry/juce_Rectangle.h +1032 -0
  1016. package/ios/juce_modules/juce_graphics/geometry/juce_RectangleList.h +694 -0
  1017. package/ios/juce_modules/juce_graphics/geometry/juce_Rectangle_test.cpp +60 -0
  1018. package/ios/juce_modules/juce_graphics/image_formats/jpglib/README +385 -0
  1019. package/ios/juce_modules/juce_graphics/image_formats/jpglib/cderror.h +132 -0
  1020. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcapimin.c +280 -0
  1021. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcapistd.c +161 -0
  1022. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jccoefct.c +449 -0
  1023. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jccolor.c +459 -0
  1024. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcdctmgr.c +387 -0
  1025. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jchuff.c +909 -0
  1026. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jchuff.h +52 -0
  1027. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcinit.c +72 -0
  1028. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcmainct.c +293 -0
  1029. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcmarker.c +597 -0
  1030. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcmaster.c +590 -0
  1031. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcomapi.c +106 -0
  1032. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jconfig.h +59 -0
  1033. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcparam.c +610 -0
  1034. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcphuff.c +833 -0
  1035. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcprepct.c +354 -0
  1036. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jcsample.c +519 -0
  1037. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jctrans.c +388 -0
  1038. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdapimin.c +395 -0
  1039. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdapistd.c +275 -0
  1040. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdatasrc.c +212 -0
  1041. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdcoefct.c +736 -0
  1042. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdcolor.c +396 -0
  1043. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdct.h +182 -0
  1044. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jddctmgr.c +269 -0
  1045. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdhuff.c +625 -0
  1046. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdhuff.h +206 -0
  1047. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdinput.c +381 -0
  1048. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdmainct.c +512 -0
  1049. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdmarker.c +1292 -0
  1050. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdmaster.c +557 -0
  1051. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdmerge.c +400 -0
  1052. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdphuff.c +642 -0
  1053. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdpostct.c +290 -0
  1054. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdsample.c +478 -0
  1055. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jdtrans.c +143 -0
  1056. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jerror.c +252 -0
  1057. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jerror.h +291 -0
  1058. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jfdctflt.c +168 -0
  1059. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jfdctfst.c +224 -0
  1060. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jfdctint.c +283 -0
  1061. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jidctflt.c +242 -0
  1062. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jidctfst.c +368 -0
  1063. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jidctint.c +389 -0
  1064. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jidctred.c +398 -0
  1065. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jinclude.h +197 -0
  1066. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jmemmgr.c +1118 -0
  1067. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jmemnobs.c +109 -0
  1068. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jmemsys.h +203 -0
  1069. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jmorecfg.h +363 -0
  1070. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jpegint.h +392 -0
  1071. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jpeglib.h +1096 -0
  1072. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jquant1.c +856 -0
  1073. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jquant2.c +1310 -0
  1074. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jutils.c +179 -0
  1075. package/ios/juce_modules/juce_graphics/image_formats/jpglib/jversion.h +14 -0
  1076. package/ios/juce_modules/juce_graphics/image_formats/jpglib/transupp.c +928 -0
  1077. package/ios/juce_modules/juce_graphics/image_formats/jpglib/transupp.h +135 -0
  1078. package/ios/juce_modules/juce_graphics/image_formats/juce_GIFLoader.cpp +464 -0
  1079. package/ios/juce_modules/juce_graphics/image_formats/juce_JPEGLoader.cpp +456 -0
  1080. package/ios/juce_modules/juce_graphics/image_formats/juce_PNGLoader.cpp +635 -0
  1081. package/ios/juce_modules/juce_graphics/image_formats/pnglib/png.c +4607 -0
  1082. package/ios/juce_modules/juce_graphics/image_formats/pnglib/png.h +3251 -0
  1083. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngconf.h +623 -0
  1084. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngdebug.h +153 -0
  1085. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngerror.c +963 -0
  1086. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngget.c +1249 -0
  1087. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pnginfo.h +267 -0
  1088. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngmem.c +284 -0
  1089. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngpread.c +1096 -0
  1090. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngpriv.h +2156 -0
  1091. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngread.c +4225 -0
  1092. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngrio.c +120 -0
  1093. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngrtran.c +5102 -0
  1094. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngrutil.c +4681 -0
  1095. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngset.c +1802 -0
  1096. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngstruct.h +491 -0
  1097. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngtrans.c +864 -0
  1098. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngwio.c +168 -0
  1099. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngwrite.c +2395 -0
  1100. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngwtran.c +587 -0
  1101. package/ios/juce_modules/juce_graphics/image_formats/pnglib/pngwutil.c +2781 -0
  1102. package/ios/juce_modules/juce_graphics/images/juce_Image.cpp +851 -0
  1103. package/ios/juce_modules/juce_graphics/images/juce_Image.h +630 -0
  1104. package/ios/juce_modules/juce_graphics/images/juce_ImageCache.cpp +183 -0
  1105. package/ios/juce_modules/juce_graphics/images/juce_ImageCache.h +136 -0
  1106. package/ios/juce_modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp +209 -0
  1107. package/ios/juce_modules/juce_graphics/images/juce_ImageConvolutionKernel.h +121 -0
  1108. package/ios/juce_modules/juce_graphics/images/juce_ImageFileFormat.cpp +120 -0
  1109. package/ios/juce_modules/juce_graphics/images/juce_ImageFileFormat.h +232 -0
  1110. package/ios/juce_modules/juce_graphics/images/juce_ScaledImage.h +93 -0
  1111. package/ios/juce_modules/juce_graphics/juce_graphics.cpp +230 -0
  1112. package/ios/juce_modules/juce_graphics/juce_graphics.h +162 -0
  1113. package/ios/juce_modules/juce_graphics/juce_graphics.mm +35 -0
  1114. package/ios/juce_modules/juce_graphics/juce_graphics_Harfbuzz.cpp +100 -0
  1115. package/ios/juce_modules/juce_graphics/native/juce_CoreGraphicsContext_mac.h +153 -0
  1116. package/ios/juce_modules/juce_graphics/native/juce_CoreGraphicsContext_mac.mm +969 -0
  1117. package/ios/juce_modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h +117 -0
  1118. package/ios/juce_modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp +1807 -0
  1119. package/ios/juce_modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h +174 -0
  1120. package/ios/juce_modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp +456 -0
  1121. package/ios/juce_modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp +784 -0
  1122. package/ios/juce_modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h +73 -0
  1123. package/ios/juce_modules/juce_graphics/native/juce_Direct2DImageContext_windows.cpp +124 -0
  1124. package/ios/juce_modules/juce_graphics/native/juce_Direct2DImageContext_windows.h +55 -0
  1125. package/ios/juce_modules/juce_graphics/native/juce_Direct2DImage_windows.cpp +732 -0
  1126. package/ios/juce_modules/juce_graphics/native/juce_Direct2DImage_windows.h +94 -0
  1127. package/ios/juce_modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp +132 -0
  1128. package/ios/juce_modules/juce_graphics/native/juce_Direct2DMetrics_windows.h +320 -0
  1129. package/ios/juce_modules/juce_graphics/native/juce_Direct2DResources_windows.cpp +661 -0
  1130. package/ios/juce_modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp +920 -0
  1131. package/ios/juce_modules/juce_graphics/native/juce_DirectX_windows.h +330 -0
  1132. package/ios/juce_modules/juce_graphics/native/juce_EventTracing.h +310 -0
  1133. package/ios/juce_modules/juce_graphics/native/juce_Fonts_android.cpp +636 -0
  1134. package/ios/juce_modules/juce_graphics/native/juce_Fonts_freetype.cpp +589 -0
  1135. package/ios/juce_modules/juce_graphics/native/juce_Fonts_linux.cpp +208 -0
  1136. package/ios/juce_modules/juce_graphics/native/juce_Fonts_mac.mm +416 -0
  1137. package/ios/juce_modules/juce_graphics/native/juce_GraphicsContext_android.cpp +43 -0
  1138. package/ios/juce_modules/juce_graphics/native/juce_IconHelpers_android.cpp +39 -0
  1139. package/ios/juce_modules/juce_graphics/native/juce_IconHelpers_linux.cpp +39 -0
  1140. package/ios/juce_modules/juce_graphics/native/juce_IconHelpers_mac.cpp +150 -0
  1141. package/ios/juce_modules/juce_graphics/native/juce_IconHelpers_windows.cpp +39 -0
  1142. package/ios/juce_modules/juce_graphics/native/juce_RenderingHelpers.h +2696 -0
  1143. package/ios/juce_modules/juce_graphics/placement/juce_Justification.h +196 -0
  1144. package/ios/juce_modules/juce_graphics/placement/juce_RectanglePlacement.cpp +131 -0
  1145. package/ios/juce_modules/juce_graphics/placement/juce_RectanglePlacement.h +183 -0
  1146. package/ios/juce_modules/juce_graphics/unicode/juce_Unicode.cpp +331 -0
  1147. package/ios/juce_modules/juce_graphics/unicode/juce_UnicodeBidi.cpp +1139 -0
  1148. package/ios/juce_modules/juce_graphics/unicode/juce_UnicodeBrackets.cpp +142 -0
  1149. package/ios/juce_modules/juce_graphics/unicode/juce_UnicodeGenerated.cpp +1380 -0
  1150. package/ios/juce_modules/juce_graphics/unicode/juce_UnicodeLine.cpp +273 -0
  1151. package/ios/juce_modules/juce_graphics/unicode/juce_UnicodeScript.cpp +235 -0
  1152. package/ios/juce_modules/juce_graphics/unicode/juce_UnicodeUtils.cpp +104 -0
  1153. package/ios/juce_modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h +128 -0
  1154. package/ios/juce_modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h +90 -0
  1155. package/ios/juce_modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h +80 -0
  1156. package/ios/juce_modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h +61 -0
  1157. package/ios/juce_modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h +106 -0
  1158. package/ios/juce_modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h +93 -0
  1159. package/ios/juce_modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h +231 -0
  1160. package/ios/juce_modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp +412 -0
  1161. package/ios/juce_modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h +354 -0
  1162. package/ios/juce_modules/juce_gui_basics/accessibility/juce_AccessibilityState.h +236 -0
  1163. package/ios/juce_modules/juce_gui_basics/application/juce_Application.cpp +109 -0
  1164. package/ios/juce_modules/juce_gui_basics/application/juce_Application.h +202 -0
  1165. package/ios/juce_modules/juce_gui_basics/buttons/juce_ArrowButton.cpp +60 -0
  1166. package/ios/juce_modules/juce_gui_basics/buttons/juce_ArrowButton.h +74 -0
  1167. package/ios/juce_modules/juce_gui_basics/buttons/juce_Button.cpp +730 -0
  1168. package/ios/juce_modules/juce_gui_basics/buttons/juce_Button.h +559 -0
  1169. package/ios/juce_modules/juce_gui_basics/buttons/juce_DrawableButton.cpp +250 -0
  1170. package/ios/juce_modules/juce_gui_basics/buttons/juce_DrawableButton.h +206 -0
  1171. package/ios/juce_modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp +138 -0
  1172. package/ios/juce_modules/juce_gui_basics/buttons/juce_HyperlinkButton.h +139 -0
  1173. package/ios/juce_modules/juce_gui_basics/buttons/juce_ImageButton.cpp +207 -0
  1174. package/ios/juce_modules/juce_gui_basics/buttons/juce_ImageButton.h +170 -0
  1175. package/ios/juce_modules/juce_gui_basics/buttons/juce_ShapeButton.cpp +146 -0
  1176. package/ios/juce_modules/juce_gui_basics/buttons/juce_ShapeButton.h +135 -0
  1177. package/ios/juce_modules/juce_gui_basics/buttons/juce_TextButton.cpp +86 -0
  1178. package/ios/juce_modules/juce_gui_basics/buttons/juce_TextButton.h +118 -0
  1179. package/ios/juce_modules/juce_gui_basics/buttons/juce_ToggleButton.cpp +74 -0
  1180. package/ios/juce_modules/juce_gui_basics/buttons/juce_ToggleButton.h +102 -0
  1181. package/ios/juce_modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp +122 -0
  1182. package/ios/juce_modules/juce_gui_basics/buttons/juce_ToolbarButton.h +107 -0
  1183. package/ios/juce_modules/juce_gui_basics/commands/juce_ApplicationCommandID.h +99 -0
  1184. package/ios/juce_modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp +75 -0
  1185. package/ios/juce_modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h +199 -0
  1186. package/ios/juce_modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp +331 -0
  1187. package/ios/juce_modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h +358 -0
  1188. package/ios/juce_modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp +195 -0
  1189. package/ios/juce_modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h +253 -0
  1190. package/ios/juce_modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp +427 -0
  1191. package/ios/juce_modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h +253 -0
  1192. package/ios/juce_modules/juce_gui_basics/components/juce_CachedComponentImage.h +81 -0
  1193. package/ios/juce_modules/juce_gui_basics/components/juce_Component.cpp +3013 -0
  1194. package/ios/juce_modules/juce_gui_basics/components/juce_Component.h +2716 -0
  1195. package/ios/juce_modules/juce_gui_basics/components/juce_ComponentListener.cpp +47 -0
  1196. package/ios/juce_modules/juce_gui_basics/components/juce_ComponentListener.h +131 -0
  1197. package/ios/juce_modules/juce_gui_basics/components/juce_ComponentTraverser.h +81 -0
  1198. package/ios/juce_modules/juce_gui_basics/components/juce_FocusTraverser.cpp +283 -0
  1199. package/ios/juce_modules/juce_gui_basics/components/juce_FocusTraverser.h +102 -0
  1200. package/ios/juce_modules/juce_gui_basics/components/juce_ModalComponentManager.cpp +295 -0
  1201. package/ios/juce_modules/juce_gui_basics/components/juce_ModalComponentManager.h +340 -0
  1202. package/ios/juce_modules/juce_gui_basics/desktop/juce_Desktop.cpp +386 -0
  1203. package/ios/juce_modules/juce_gui_basics/desktop/juce_Desktop.h +502 -0
  1204. package/ios/juce_modules/juce_gui_basics/desktop/juce_Displays.cpp +447 -0
  1205. package/ios/juce_modules/juce_gui_basics/desktop/juce_Displays.h +218 -0
  1206. package/ios/juce_modules/juce_gui_basics/detail/juce_AccessibilityHelpers.cpp +42 -0
  1207. package/ios/juce_modules/juce_gui_basics/detail/juce_AccessibilityHelpers.h +79 -0
  1208. package/ios/juce_modules/juce_gui_basics/detail/juce_AlertWindowHelpers.h +124 -0
  1209. package/ios/juce_modules/juce_gui_basics/detail/juce_ButtonAccessibilityHandler.h +134 -0
  1210. package/ios/juce_modules/juce_gui_basics/detail/juce_ComponentHelpers.h +291 -0
  1211. package/ios/juce_modules/juce_gui_basics/detail/juce_CustomMouseCursorInfo.h +44 -0
  1212. package/ios/juce_modules/juce_gui_basics/detail/juce_FocusHelpers.h +126 -0
  1213. package/ios/juce_modules/juce_gui_basics/detail/juce_FocusRestorer.h +55 -0
  1214. package/ios/juce_modules/juce_gui_basics/detail/juce_LookAndFeelHelpers.h +71 -0
  1215. package/ios/juce_modules/juce_gui_basics/detail/juce_MouseInputSourceImpl.h +597 -0
  1216. package/ios/juce_modules/juce_gui_basics/detail/juce_MouseInputSourceList.h +163 -0
  1217. package/ios/juce_modules/juce_gui_basics/detail/juce_PointerState.h +113 -0
  1218. package/ios/juce_modules/juce_gui_basics/detail/juce_ScalingHelpers.h +132 -0
  1219. package/ios/juce_modules/juce_gui_basics/detail/juce_ScopedContentSharerImpl.h +107 -0
  1220. package/ios/juce_modules/juce_gui_basics/detail/juce_ScopedContentSharerInterface.h +224 -0
  1221. package/ios/juce_modules/juce_gui_basics/detail/juce_ScopedMessageBoxImpl.h +141 -0
  1222. package/ios/juce_modules/juce_gui_basics/detail/juce_ScopedMessageBoxInterface.h +69 -0
  1223. package/ios/juce_modules/juce_gui_basics/detail/juce_StandardCachedComponentImage.h +102 -0
  1224. package/ios/juce_modules/juce_gui_basics/detail/juce_ToolbarItemDragAndDropOverlayComponent.h +127 -0
  1225. package/ios/juce_modules/juce_gui_basics/detail/juce_TopLevelWindowManager.h +145 -0
  1226. package/ios/juce_modules/juce_gui_basics/detail/juce_ViewportHelpers.h +58 -0
  1227. package/ios/juce_modules/juce_gui_basics/detail/juce_WindowingHelpers.h +70 -0
  1228. package/ios/juce_modules/juce_gui_basics/drawables/juce_Drawable.cpp +228 -0
  1229. package/ios/juce_modules/juce_gui_basics/drawables/juce_Drawable.h +271 -0
  1230. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp +173 -0
  1231. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableComposite.h +126 -0
  1232. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableImage.cpp +165 -0
  1233. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableImage.h +126 -0
  1234. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawablePath.cpp +66 -0
  1235. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawablePath.h +86 -0
  1236. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp +96 -0
  1237. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableRectangle.h +85 -0
  1238. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableShape.cpp +190 -0
  1239. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableShape.h +135 -0
  1240. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableText.cpp +241 -0
  1241. package/ios/juce_modules/juce_gui_basics/drawables/juce_DrawableText.h +130 -0
  1242. package/ios/juce_modules/juce_gui_basics/drawables/juce_SVGParser.cpp +1903 -0
  1243. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp +83 -0
  1244. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_ContentSharer.h +154 -0
  1245. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp +79 -0
  1246. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h +125 -0
  1247. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp +279 -0
  1248. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h +235 -0
  1249. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp +633 -0
  1250. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h +306 -0
  1251. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h +67 -0
  1252. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp +292 -0
  1253. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileChooser.h +358 -0
  1254. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp +272 -0
  1255. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h +177 -0
  1256. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp +295 -0
  1257. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileListComponent.h +104 -0
  1258. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h +75 -0
  1259. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp +280 -0
  1260. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h +126 -0
  1261. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp +690 -0
  1262. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h +117 -0
  1263. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp +277 -0
  1264. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h +245 -0
  1265. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp +135 -0
  1266. package/ios/juce_modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h +77 -0
  1267. package/ios/juce_modules/juce_gui_basics/juce_gui_basics.cpp +370 -0
  1268. package/ios/juce_modules/juce_gui_basics/juce_gui_basics.h +403 -0
  1269. package/ios/juce_modules/juce_gui_basics/juce_gui_basics.mm +35 -0
  1270. package/ios/juce_modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp +73 -0
  1271. package/ios/juce_modules/juce_gui_basics/keyboard/juce_CaretComponent.h +90 -0
  1272. package/ios/juce_modules/juce_gui_basics/keyboard/juce_KeyListener.cpp +43 -0
  1273. package/ios/juce_modules/juce_gui_basics/keyboard/juce_KeyListener.h +86 -0
  1274. package/ios/juce_modules/juce_gui_basics/keyboard/juce_KeyPress.cpp +298 -0
  1275. package/ios/juce_modules/juce_gui_basics/keyboard/juce_KeyPress.h +286 -0
  1276. package/ios/juce_modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp +283 -0
  1277. package/ios/juce_modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h +96 -0
  1278. package/ios/juce_modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp +58 -0
  1279. package/ios/juce_modules/juce_gui_basics/keyboard/juce_ModifierKeys.h +220 -0
  1280. package/ios/juce_modules/juce_gui_basics/keyboard/juce_SystemClipboard.h +58 -0
  1281. package/ios/juce_modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h +132 -0
  1282. package/ios/juce_modules/juce_gui_basics/keyboard/juce_TextInputTarget.h +129 -0
  1283. package/ios/juce_modules/juce_gui_basics/layout/juce_AnimatedPosition.h +216 -0
  1284. package/ios/juce_modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h +162 -0
  1285. package/ios/juce_modules/juce_gui_basics/layout/juce_BorderedComponentBoundsConstrainer.cpp +86 -0
  1286. package/ios/juce_modules/juce_gui_basics/layout/juce_BorderedComponentBoundsConstrainer.h +78 -0
  1287. package/ios/juce_modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp +363 -0
  1288. package/ios/juce_modules/juce_gui_basics/layout/juce_ComponentAnimator.h +174 -0
  1289. package/ios/juce_modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp +314 -0
  1290. package/ios/juce_modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h +206 -0
  1291. package/ios/juce_modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp +295 -0
  1292. package/ios/juce_modules/juce_gui_basics/layout/juce_ComponentBuilder.h +256 -0
  1293. package/ios/juce_modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp +151 -0
  1294. package/ios/juce_modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h +105 -0
  1295. package/ios/juce_modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp +512 -0
  1296. package/ios/juce_modules/juce_gui_basics/layout/juce_ConcertinaPanel.h +153 -0
  1297. package/ios/juce_modules/juce_gui_basics/layout/juce_FlexBox.cpp +1158 -0
  1298. package/ios/juce_modules/juce_gui_basics/layout/juce_FlexBox.h +152 -0
  1299. package/ios/juce_modules/juce_gui_basics/layout/juce_FlexItem.h +186 -0
  1300. package/ios/juce_modules/juce_gui_basics/layout/juce_Grid.cpp +1651 -0
  1301. package/ios/juce_modules/juce_gui_basics/layout/juce_Grid.h +232 -0
  1302. package/ios/juce_modules/juce_gui_basics/layout/juce_GridItem.cpp +188 -0
  1303. package/ios/juce_modules/juce_gui_basics/layout/juce_GridItem.h +249 -0
  1304. package/ios/juce_modules/juce_gui_basics/layout/juce_GroupComponent.cpp +87 -0
  1305. package/ios/juce_modules/juce_gui_basics/layout/juce_GroupComponent.h +120 -0
  1306. package/ios/juce_modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp +641 -0
  1307. package/ios/juce_modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h +390 -0
  1308. package/ios/juce_modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp +208 -0
  1309. package/ios/juce_modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h +205 -0
  1310. package/ios/juce_modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp +112 -0
  1311. package/ios/juce_modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h +101 -0
  1312. package/ios/juce_modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp +139 -0
  1313. package/ios/juce_modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h +109 -0
  1314. package/ios/juce_modules/juce_gui_basics/layout/juce_ScrollBar.cpp +486 -0
  1315. package/ios/juce_modules/juce_gui_basics/layout/juce_ScrollBar.h +450 -0
  1316. package/ios/juce_modules/juce_gui_basics/layout/juce_SidePanel.cpp +309 -0
  1317. package/ios/juce_modules/juce_gui_basics/layout/juce_SidePanel.h +248 -0
  1318. package/ios/juce_modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp +351 -0
  1319. package/ios/juce_modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h +270 -0
  1320. package/ios/juce_modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp +88 -0
  1321. package/ios/juce_modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h +114 -0
  1322. package/ios/juce_modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp +131 -0
  1323. package/ios/juce_modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h +111 -0
  1324. package/ios/juce_modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp +592 -0
  1325. package/ios/juce_modules/juce_gui_basics/layout/juce_TabbedButtonBar.h +382 -0
  1326. package/ios/juce_modules/juce_gui_basics/layout/juce_TabbedComponent.cpp +328 -0
  1327. package/ios/juce_modules/juce_gui_basics/layout/juce_TabbedComponent.h +236 -0
  1328. package/ios/juce_modules/juce_gui_basics/layout/juce_Viewport.cpp +649 -0
  1329. package/ios/juce_modules/juce_gui_basics/layout/juce_Viewport.h +383 -0
  1330. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp +201 -0
  1331. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h +301 -0
  1332. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp +599 -0
  1333. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h +114 -0
  1334. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp +3200 -0
  1335. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h +443 -0
  1336. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp +655 -0
  1337. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h +107 -0
  1338. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp +1516 -0
  1339. package/ios/juce_modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h +269 -0
  1340. package/ios/juce_modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp +311 -0
  1341. package/ios/juce_modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h +120 -0
  1342. package/ios/juce_modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp +472 -0
  1343. package/ios/juce_modules/juce_gui_basics/menus/juce_MenuBarComponent.h +138 -0
  1344. package/ios/juce_modules/juce_gui_basics/menus/juce_MenuBarModel.cpp +108 -0
  1345. package/ios/juce_modules/juce_gui_basics/menus/juce_MenuBarModel.h +201 -0
  1346. package/ios/juce_modules/juce_gui_basics/menus/juce_PopupMenu.cpp +2401 -0
  1347. package/ios/juce_modules/juce_gui_basics/menus/juce_PopupMenu.h +1070 -0
  1348. package/ios/juce_modules/juce_gui_basics/misc/juce_BubbleComponent.cpp +162 -0
  1349. package/ios/juce_modules/juce_gui_basics/misc/juce_BubbleComponent.h +213 -0
  1350. package/ios/juce_modules/juce_gui_basics/misc/juce_DropShadower.cpp +408 -0
  1351. package/ios/juce_modules/juce_gui_basics/misc/juce_DropShadower.h +96 -0
  1352. package/ios/juce_modules/juce_gui_basics/misc/juce_FocusOutline.cpp +194 -0
  1353. package/ios/juce_modules/juce_gui_basics/misc/juce_FocusOutline.h +109 -0
  1354. package/ios/juce_modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp +76 -0
  1355. package/ios/juce_modules/juce_gui_basics/mouse/juce_ComponentDragger.h +110 -0
  1356. package/ios/juce_modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp +646 -0
  1357. package/ios/juce_modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h +275 -0
  1358. package/ios/juce_modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h +149 -0
  1359. package/ios/juce_modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h +115 -0
  1360. package/ios/juce_modules/juce_gui_basics/mouse/juce_LassoComponent.h +233 -0
  1361. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseCursor.cpp +162 -0
  1362. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseCursor.h +199 -0
  1363. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseEvent.cpp +147 -0
  1364. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseEvent.h +463 -0
  1365. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp +86 -0
  1366. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h +121 -0
  1367. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp +114 -0
  1368. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseInputSource.h +315 -0
  1369. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseListener.cpp +48 -0
  1370. package/ios/juce_modules/juce_gui_basics/mouse/juce_MouseListener.h +180 -0
  1371. package/ios/juce_modules/juce_gui_basics/mouse/juce_SelectedItemSet.h +336 -0
  1372. package/ios/juce_modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h +115 -0
  1373. package/ios/juce_modules/juce_gui_basics/mouse/juce_TooltipClient.h +98 -0
  1374. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_Accessibility.cpp +46 -0
  1375. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_AccessibilityElement_windows.cpp +660 -0
  1376. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_AccessibilityElement_windows.h +89 -0
  1377. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_AccessibilitySharedCode_mac.mm +283 -0
  1378. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h +311 -0
  1379. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp +164 -0
  1380. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_Accessibility_android.cpp +1058 -0
  1381. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_Accessibility_ios.mm +669 -0
  1382. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_Accessibility_mac.mm +942 -0
  1383. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_Accessibility_windows.cpp +336 -0
  1384. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAExpandCollapseProvider_windows.h +92 -0
  1385. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAGridItemProvider_windows.h +162 -0
  1386. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAGridProvider_windows.h +160 -0
  1387. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAHelpers_windows.h +128 -0
  1388. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAInvokeProvider_windows.h +68 -0
  1389. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAProviderBase_windows.h +67 -0
  1390. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAProviders_windows.h +52 -0
  1391. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIARangeValueProvider_windows.h +146 -0
  1392. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIASelectionProvider_windows.h +254 -0
  1393. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIATextProvider_windows.h +626 -0
  1394. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAToggleProvider_windows.h +87 -0
  1395. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIATransformProvider_windows.h +131 -0
  1396. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAValueProvider_windows.h +92 -0
  1397. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_UIAWindowProvider_windows.h +203 -0
  1398. package/ios/juce_modules/juce_gui_basics/native/accessibility/juce_WindowsUIAWrapper_windows.h +169 -0
  1399. package/ios/juce_modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java +987 -0
  1400. package/ios/juce_modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java +62 -0
  1401. package/ios/juce_modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java +57 -0
  1402. package/ios/juce_modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java +63 -0
  1403. package/ios/juce_modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java +128 -0
  1404. package/ios/juce_modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/Receiver.java +51 -0
  1405. package/ios/juce_modules/juce_gui_basics/native/juce_CGMetalLayerRenderer_mac.h +384 -0
  1406. package/ios/juce_modules/juce_gui_basics/native/juce_ContentSharer_android.cpp +963 -0
  1407. package/ios/juce_modules/juce_gui_basics/native/juce_ContentSharer_ios.cpp +134 -0
  1408. package/ios/juce_modules/juce_gui_basics/native/juce_DragAndDrop_linux.cpp +618 -0
  1409. package/ios/juce_modules/juce_gui_basics/native/juce_DragAndDrop_windows.cpp +377 -0
  1410. package/ios/juce_modules/juce_gui_basics/native/juce_FileChooser_android.cpp +276 -0
  1411. package/ios/juce_modules/juce_gui_basics/native/juce_FileChooser_ios.mm +379 -0
  1412. package/ios/juce_modules/juce_gui_basics/native/juce_FileChooser_linux.cpp +296 -0
  1413. package/ios/juce_modules/juce_gui_basics/native/juce_FileChooser_mac.mm +414 -0
  1414. package/ios/juce_modules/juce_gui_basics/native/juce_FileChooser_windows.cpp +908 -0
  1415. package/ios/juce_modules/juce_gui_basics/native/juce_MainMenu_mac.mm +848 -0
  1416. package/ios/juce_modules/juce_gui_basics/native/juce_MouseCursor_mac.mm +205 -0
  1417. package/ios/juce_modules/juce_gui_basics/native/juce_MultiTouchMapper.h +116 -0
  1418. package/ios/juce_modules/juce_gui_basics/native/juce_NSViewComponentPeer_mac.mm +3053 -0
  1419. package/ios/juce_modules/juce_gui_basics/native/juce_NativeMessageBox_android.cpp +124 -0
  1420. package/ios/juce_modules/juce_gui_basics/native/juce_NativeMessageBox_ios.mm +119 -0
  1421. package/ios/juce_modules/juce_gui_basics/native/juce_NativeMessageBox_linux.cpp +78 -0
  1422. package/ios/juce_modules/juce_gui_basics/native/juce_NativeMessageBox_mac.mm +140 -0
  1423. package/ios/juce_modules/juce_gui_basics/native/juce_NativeMessageBox_windows.cpp +354 -0
  1424. package/ios/juce_modules/juce_gui_basics/native/juce_NativeModalWrapperComponent_ios.h +141 -0
  1425. package/ios/juce_modules/juce_gui_basics/native/juce_PerScreenDisplayLinks_mac.h +313 -0
  1426. package/ios/juce_modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.cpp +43 -0
  1427. package/ios/juce_modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h +63 -0
  1428. package/ios/juce_modules/juce_gui_basics/native/juce_ScopedThreadDPIAwarenessSetter_windows.h +52 -0
  1429. package/ios/juce_modules/juce_gui_basics/native/juce_ScopedWindowAssociation_linux.h +127 -0
  1430. package/ios/juce_modules/juce_gui_basics/native/juce_UIViewComponentPeer_ios.mm +2376 -0
  1431. package/ios/juce_modules/juce_gui_basics/native/juce_VBlank_windows.cpp +302 -0
  1432. package/ios/juce_modules/juce_gui_basics/native/juce_WindowUtils_android.cpp +43 -0
  1433. package/ios/juce_modules/juce_gui_basics/native/juce_WindowUtils_ios.mm +43 -0
  1434. package/ios/juce_modules/juce_gui_basics/native/juce_WindowUtils_linux.cpp +48 -0
  1435. package/ios/juce_modules/juce_gui_basics/native/juce_WindowUtils_mac.mm +47 -0
  1436. package/ios/juce_modules/juce_gui_basics/native/juce_WindowUtils_windows.cpp +68 -0
  1437. package/ios/juce_modules/juce_gui_basics/native/juce_Windowing_android.cpp +2903 -0
  1438. package/ios/juce_modules/juce_gui_basics/native/juce_Windowing_ios.mm +629 -0
  1439. package/ios/juce_modules/juce_gui_basics/native/juce_Windowing_linux.cpp +863 -0
  1440. package/ios/juce_modules/juce_gui_basics/native/juce_Windowing_mac.mm +588 -0
  1441. package/ios/juce_modules/juce_gui_basics/native/juce_Windowing_windows.cpp +5549 -0
  1442. package/ios/juce_modules/juce_gui_basics/native/juce_WindowsHooks_windows.cpp +118 -0
  1443. package/ios/juce_modules/juce_gui_basics/native/juce_WindowsHooks_windows.h +55 -0
  1444. package/ios/juce_modules/juce_gui_basics/native/juce_XSymbols_linux.cpp +249 -0
  1445. package/ios/juce_modules/juce_gui_basics/native/juce_XSymbols_linux.h +629 -0
  1446. package/ios/juce_modules/juce_gui_basics/native/juce_XWindowSystem_linux.cpp +4036 -0
  1447. package/ios/juce_modules/juce_gui_basics/native/juce_XWindowSystem_linux.h +364 -0
  1448. package/ios/juce_modules/juce_gui_basics/positioning/juce_MarkerList.cpp +293 -0
  1449. package/ios/juce_modules/juce_gui_basics/positioning/juce_MarkerList.h +204 -0
  1450. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp +162 -0
  1451. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h +190 -0
  1452. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp +344 -0
  1453. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h +99 -0
  1454. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp +149 -0
  1455. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h +75 -0
  1456. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativePoint.cpp +110 -0
  1457. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativePoint.h +100 -0
  1458. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp +271 -0
  1459. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativePointPath.h +202 -0
  1460. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp +286 -0
  1461. package/ios/juce_modules/juce_gui_basics/positioning/juce_RelativeRectangle.h +117 -0
  1462. package/ios/juce_modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp +95 -0
  1463. package/ios/juce_modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h +118 -0
  1464. package/ios/juce_modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp +55 -0
  1465. package/ios/juce_modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h +85 -0
  1466. package/ios/juce_modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp +284 -0
  1467. package/ios/juce_modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h +162 -0
  1468. package/ios/juce_modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp +367 -0
  1469. package/ios/juce_modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h +150 -0
  1470. package/ios/juce_modules/juce_gui_basics/properties/juce_PropertyComponent.cpp +65 -0
  1471. package/ios/juce_modules/juce_gui_basics/properties/juce_PropertyComponent.h +154 -0
  1472. package/ios/juce_modules/juce_gui_basics/properties/juce_PropertyPanel.cpp +405 -0
  1473. package/ios/juce_modules/juce_gui_basics/properties/juce_PropertyPanel.h +186 -0
  1474. package/ios/juce_modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp +95 -0
  1475. package/ios/juce_modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h +116 -0
  1476. package/ios/juce_modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp +271 -0
  1477. package/ios/juce_modules/juce_gui_basics/properties/juce_TextPropertyComponent.h +196 -0
  1478. package/ios/juce_modules/juce_gui_basics/widgets/juce_ComboBox.cpp +721 -0
  1479. package/ios/juce_modules/juce_gui_basics/widgets/juce_ComboBox.h +473 -0
  1480. package/ios/juce_modules/juce_gui_basics/widgets/juce_ImageComponent.cpp +116 -0
  1481. package/ios/juce_modules/juce_gui_basics/widgets/juce_ImageComponent.h +90 -0
  1482. package/ios/juce_modules/juce_gui_basics/widgets/juce_Label.cpp +592 -0
  1483. package/ios/juce_modules/juce_gui_basics/widgets/juce_Label.h +377 -0
  1484. package/ios/juce_modules/juce_gui_basics/widgets/juce_ListBox.cpp +1263 -0
  1485. package/ios/juce_modules/juce_gui_basics/widgets/juce_ListBox.h +656 -0
  1486. package/ios/juce_modules/juce_gui_basics/widgets/juce_ProgressBar.cpp +189 -0
  1487. package/ios/juce_modules/juce_gui_basics/widgets/juce_ProgressBar.h +215 -0
  1488. package/ios/juce_modules/juce_gui_basics/widgets/juce_Slider.cpp +1839 -0
  1489. package/ios/juce_modules/juce_gui_basics/widgets/juce_Slider.h +1048 -0
  1490. package/ios/juce_modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp +935 -0
  1491. package/ios/juce_modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h +472 -0
  1492. package/ios/juce_modules/juce_gui_basics/widgets/juce_TableListBox.cpp +688 -0
  1493. package/ios/juce_modules/juce_gui_basics/widgets/juce_TableListBox.h +365 -0
  1494. package/ios/juce_modules/juce_gui_basics/widgets/juce_TextEditor.cpp +2786 -0
  1495. package/ios/juce_modules/juce_gui_basics/widgets/juce_TextEditor.h +888 -0
  1496. package/ios/juce_modules/juce_gui_basics/widgets/juce_Toolbar.cpp +838 -0
  1497. package/ios/juce_modules/juce_gui_basics/widgets/juce_Toolbar.h +347 -0
  1498. package/ios/juce_modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp +173 -0
  1499. package/ios/juce_modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h +217 -0
  1500. package/ios/juce_modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h +118 -0
  1501. package/ios/juce_modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp +125 -0
  1502. package/ios/juce_modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h +88 -0
  1503. package/ios/juce_modules/juce_gui_basics/widgets/juce_TreeView.cpp +2286 -0
  1504. package/ios/juce_modules/juce_gui_basics/widgets/juce_TreeView.h +969 -0
  1505. package/ios/juce_modules/juce_gui_basics/windows/juce_AlertWindow.cpp +712 -0
  1506. package/ios/juce_modules/juce_gui_basics/windows/juce_AlertWindow.h +600 -0
  1507. package/ios/juce_modules/juce_gui_basics/windows/juce_CallOutBox.cpp +279 -0
  1508. package/ios/juce_modules/juce_gui_basics/windows/juce_CallOutBox.h +197 -0
  1509. package/ios/juce_modules/juce_gui_basics/windows/juce_ComponentPeer.cpp +625 -0
  1510. package/ios/juce_modules/juce_gui_basics/windows/juce_ComponentPeer.h +623 -0
  1511. package/ios/juce_modules/juce_gui_basics/windows/juce_DialogWindow.cpp +190 -0
  1512. package/ios/juce_modules/juce_gui_basics/windows/juce_DialogWindow.h +286 -0
  1513. package/ios/juce_modules/juce_gui_basics/windows/juce_DocumentWindow.cpp +423 -0
  1514. package/ios/juce_modules/juce_gui_basics/windows/juce_DocumentWindow.h +316 -0
  1515. package/ios/juce_modules/juce_gui_basics/windows/juce_MessageBoxOptions.cpp +102 -0
  1516. package/ios/juce_modules/juce_gui_basics/windows/juce_MessageBoxOptions.h +202 -0
  1517. package/ios/juce_modules/juce_gui_basics/windows/juce_NativeMessageBox.cpp +167 -0
  1518. package/ios/juce_modules/juce_gui_basics/windows/juce_NativeMessageBox.h +311 -0
  1519. package/ios/juce_modules/juce_gui_basics/windows/juce_NativeScaleFactorNotifier.cpp +75 -0
  1520. package/ios/juce_modules/juce_gui_basics/windows/juce_NativeScaleFactorNotifier.h +78 -0
  1521. package/ios/juce_modules/juce_gui_basics/windows/juce_ResizableWindow.cpp +679 -0
  1522. package/ios/juce_modules/juce_gui_basics/windows/juce_ResizableWindow.h +427 -0
  1523. package/ios/juce_modules/juce_gui_basics/windows/juce_ScopedMessageBox.cpp +67 -0
  1524. package/ios/juce_modules/juce_gui_basics/windows/juce_ScopedMessageBox.h +78 -0
  1525. package/ios/juce_modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp +128 -0
  1526. package/ios/juce_modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h +184 -0
  1527. package/ios/juce_modules/juce_gui_basics/windows/juce_TooltipWindow.cpp +264 -0
  1528. package/ios/juce_modules/juce_gui_basics/windows/juce_TooltipWindow.h +169 -0
  1529. package/ios/juce_modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp +264 -0
  1530. package/ios/juce_modules/juce_gui_basics/windows/juce_TopLevelWindow.h +176 -0
  1531. package/ios/juce_modules/juce_gui_basics/windows/juce_VBlankAttachment.cpp +122 -0
  1532. package/ios/juce_modules/juce_gui_basics/windows/juce_VBlankAttachment.h +85 -0
  1533. package/ios/juce_modules/juce_gui_basics/windows/juce_WindowUtils.h +51 -0
  1534. package/ios/juce_modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp +83 -0
  1535. package/ios/juce_modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h +81 -0
  1536. package/ios/juce_modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h +683 -0
  1537. package/ios/juce_modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp +1306 -0
  1538. package/ios/juce_modules/juce_gui_extra/code_editor/juce_CodeDocument.h +459 -0
  1539. package/ios/juce_modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp +1857 -0
  1540. package/ios/juce_modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h +486 -0
  1541. package/ios/juce_modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h +68 -0
  1542. package/ios/juce_modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp +248 -0
  1543. package/ios/juce_modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h +74 -0
  1544. package/ios/juce_modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp +181 -0
  1545. package/ios/juce_modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h +72 -0
  1546. package/ios/juce_modules/juce_gui_extra/detail/juce_WebControlRelayEvents.h +255 -0
  1547. package/ios/juce_modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp +1124 -0
  1548. package/ios/juce_modules/juce_gui_extra/documents/juce_FileBasedDocument.h +440 -0
  1549. package/ios/juce_modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h +142 -0
  1550. package/ios/juce_modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h +91 -0
  1551. package/ios/juce_modules/juce_gui_extra/embedding/juce_HWNDComponent.h +98 -0
  1552. package/ios/juce_modules/juce_gui_extra/embedding/juce_NSViewComponent.h +107 -0
  1553. package/ios/juce_modules/juce_gui_extra/embedding/juce_UIViewComponent.h +99 -0
  1554. package/ios/juce_modules/juce_gui_extra/embedding/juce_XEmbedComponent.h +129 -0
  1555. package/ios/juce_modules/juce_gui_extra/juce_gui_extra.cpp +210 -0
  1556. package/ios/juce_modules/juce_gui_extra/juce_gui_extra.h +161 -0
  1557. package/ios/juce_modules/juce_gui_extra/juce_gui_extra.mm +35 -0
  1558. package/ios/juce_modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp +89 -0
  1559. package/ios/juce_modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h +96 -0
  1560. package/ios/juce_modules/juce_gui_extra/misc/juce_AppleRemote.h +126 -0
  1561. package/ios/juce_modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp +133 -0
  1562. package/ios/juce_modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h +134 -0
  1563. package/ios/juce_modules/juce_gui_extra/misc/juce_ColourSelector.cpp +656 -0
  1564. package/ios/juce_modules/juce_gui_extra/misc/juce_ColourSelector.h +173 -0
  1565. package/ios/juce_modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp +486 -0
  1566. package/ios/juce_modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h +142 -0
  1567. package/ios/juce_modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp +501 -0
  1568. package/ios/juce_modules/juce_gui_extra/misc/juce_LiveConstantEditor.h +310 -0
  1569. package/ios/juce_modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp +165 -0
  1570. package/ios/juce_modules/juce_gui_extra/misc/juce_PreferencesPanel.h +156 -0
  1571. package/ios/juce_modules/juce_gui_extra/misc/juce_PushNotifications.cpp +239 -0
  1572. package/ios/juce_modules/juce_gui_extra/misc/juce_PushNotifications.h +714 -0
  1573. package/ios/juce_modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp +189 -0
  1574. package/ios/juce_modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h +186 -0
  1575. package/ios/juce_modules/juce_gui_extra/misc/juce_SplashScreen.cpp +110 -0
  1576. package/ios/juce_modules/juce_gui_extra/misc/juce_SplashScreen.h +165 -0
  1577. package/ios/juce_modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp +51 -0
  1578. package/ios/juce_modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h +125 -0
  1579. package/ios/juce_modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp +722 -0
  1580. package/ios/juce_modules/juce_gui_extra/misc/juce_WebBrowserComponent.h +626 -0
  1581. package/ios/juce_modules/juce_gui_extra/misc/juce_WebControlParameterIndexReceiver.h +76 -0
  1582. package/ios/juce_modules/juce_gui_extra/misc/juce_WebControlRelays.cpp +256 -0
  1583. package/ios/juce_modules/juce_gui_extra/misc/juce_WebControlRelays.h +254 -0
  1584. package/ios/juce_modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebViewClasses.java +356 -0
  1585. package/ios/juce_modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java +50 -0
  1586. package/ios/juce_modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java +69 -0
  1587. package/ios/juce_modules/juce_gui_extra/native/javascript/check_native_interop.js +146 -0
  1588. package/ios/juce_modules/juce_gui_extra/native/javascript/index.js +577 -0
  1589. package/ios/juce_modules/juce_gui_extra/native/javascript/package.json +4 -0
  1590. package/ios/juce_modules/juce_gui_extra/native/juce_ActiveXComponent_windows.cpp +553 -0
  1591. package/ios/juce_modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp +199 -0
  1592. package/ios/juce_modules/juce_gui_extra/native/juce_AppleRemote_mac.mm +285 -0
  1593. package/ios/juce_modules/juce_gui_extra/native/juce_HWNDComponent_windows.cpp +203 -0
  1594. package/ios/juce_modules/juce_gui_extra/native/juce_NSViewComponent_mac.mm +203 -0
  1595. package/ios/juce_modules/juce_gui_extra/native/juce_NSViewFrameWatcher_mac.h +120 -0
  1596. package/ios/juce_modules/juce_gui_extra/native/juce_PushNotifications_android.cpp +1607 -0
  1597. package/ios/juce_modules/juce_gui_extra/native/juce_PushNotifications_ios.cpp +620 -0
  1598. package/ios/juce_modules/juce_gui_extra/native/juce_PushNotifications_mac.cpp +535 -0
  1599. package/ios/juce_modules/juce_gui_extra/native/juce_SystemTrayIcon_linux.cpp +160 -0
  1600. package/ios/juce_modules/juce_gui_extra/native/juce_SystemTrayIcon_mac.cpp +451 -0
  1601. package/ios/juce_modules/juce_gui_extra/native/juce_SystemTrayIcon_windows.cpp +251 -0
  1602. package/ios/juce_modules/juce_gui_extra/native/juce_UIViewComponent_ios.mm +151 -0
  1603. package/ios/juce_modules/juce_gui_extra/native/juce_WebBrowserComponent_android.cpp +953 -0
  1604. package/ios/juce_modules/juce_gui_extra/native/juce_WebBrowserComponent_linux.cpp +1659 -0
  1605. package/ios/juce_modules/juce_gui_extra/native/juce_WebBrowserComponent_mac.mm +1113 -0
  1606. package/ios/juce_modules/juce_gui_extra/native/juce_WebBrowserComponent_windows.cpp +1298 -0
  1607. package/ios/juce_modules/juce_gui_extra/native/juce_XEmbedComponent_linux.cpp +739 -0
  1608. package/package.json +1 -1
  1609. package/ios/JuceModules.mm +0 -14
  1610. package/ios/JuceToneGenerator.h +0 -39
  1611. package/ios/JuceToneGenerator.mm +0 -613
@@ -0,0 +1,4086 @@
1
+ /*
2
+ ==============================================================================
3
+
4
+ This file is part of the JUCE framework.
5
+ Copyright (c) Raw Material Software Limited
6
+
7
+ JUCE is an open source framework subject to commercial or open source
8
+ licensing.
9
+
10
+ By downloading, installing, or using the JUCE framework, or combining the
11
+ JUCE framework with any other source code, object code, content or any other
12
+ copyrightable work, you agree to the terms of the JUCE End User Licence
13
+ Agreement, and all incorporated terms including the JUCE Privacy Policy and
14
+ the JUCE Website Terms of Service, as applicable, which will bind you. If you
15
+ do not agree to the terms of these agreements, we will not license the JUCE
16
+ framework to you, and you must discontinue the installation or download
17
+ process and cease use of the JUCE framework.
18
+
19
+ JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
20
+ JUCE Privacy Policy: https://juce.com/juce-privacy-policy
21
+ JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
22
+
23
+ Or:
24
+
25
+ You may also use this code under the terms of the AGPLv3:
26
+ https://www.gnu.org/licenses/agpl-3.0.en.html
27
+
28
+ THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
29
+ WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
30
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
31
+
32
+ ==============================================================================
33
+ */
34
+
35
+ #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD)
36
+
37
+ #include "juce_VST3Headers.h"
38
+ #include "juce_VST3Common.h"
39
+ #include "juce_ARACommon.h"
40
+
41
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)
42
+ #include <ARA_API/ARAVST3.h>
43
+
44
+ namespace ARA
45
+ {
46
+ DEF_CLASS_IID (IMainFactory)
47
+ DEF_CLASS_IID (IPlugInEntryPoint)
48
+ DEF_CLASS_IID (IPlugInEntryPoint2)
49
+ }
50
+ #endif
51
+
52
+ namespace juce
53
+ {
54
+
55
+ // UB Sanitizer doesn't necessarily have instrumentation for loaded plugins, so
56
+ // it won't recognize the dynamic types of pointers to the plugin's interfaces.
57
+ JUCE_BEGIN_NO_SANITIZE ("vptr")
58
+
59
+ using namespace Steinberg;
60
+
61
+ //==============================================================================
62
+ #ifndef JUCE_VST3_DEBUGGING
63
+ #define JUCE_VST3_DEBUGGING 0
64
+ #endif
65
+
66
+ #if JUCE_VST3_DEBUGGING
67
+ #define VST3_DBG(a) Logger::writeToLog (a);
68
+ #else
69
+ #define VST3_DBG(a)
70
+ #endif
71
+
72
+ #if JUCE_DEBUG
73
+ static int warnOnFailure (int result) noexcept
74
+ {
75
+ const char* message = "Unknown result!";
76
+
77
+ switch (result)
78
+ {
79
+ case kResultOk: return result;
80
+ case kNotImplemented: message = "kNotImplemented"; break;
81
+ case kNoInterface: message = "kNoInterface"; break;
82
+ case kResultFalse: message = "kResultFalse"; break;
83
+ case kInvalidArgument: message = "kInvalidArgument"; break;
84
+ case kInternalError: message = "kInternalError"; break;
85
+ case kNotInitialized: message = "kNotInitialized"; break;
86
+ case kOutOfMemory: message = "kOutOfMemory"; break;
87
+ default: break;
88
+ }
89
+
90
+ DBG (message);
91
+ return result;
92
+ }
93
+
94
+ static int warnOnFailureIfImplemented (int result) noexcept
95
+ {
96
+ if (result != kResultOk && result != kNotImplemented)
97
+ return warnOnFailure (result);
98
+
99
+ return result;
100
+ }
101
+ #else
102
+ #define warnOnFailure(x) x
103
+ #define warnOnFailureIfImplemented(x) x
104
+ #endif
105
+
106
+ enum class MediaKind { audio, event };
107
+
108
+ static Vst::MediaType toVstType (MediaKind x) { return x == MediaKind::audio ? Vst::kAudio : Vst::kEvent; }
109
+ static Vst::BusDirection toVstType (Direction x) { return x == Direction::input ? Vst::kInput : Vst::kOutput; }
110
+
111
+ static std::vector<Vst::ParamID> getAllParamIDs (Vst::IEditController& controller)
112
+ {
113
+ std::vector<Vst::ParamID> result;
114
+
115
+ auto count = controller.getParameterCount();
116
+
117
+ for (decltype (count) i = 0; i < count; ++i)
118
+ {
119
+ Vst::ParameterInfo info{};
120
+ controller.getParameterInfo (i, info);
121
+ result.push_back (info.id);
122
+ }
123
+
124
+ return result;
125
+ }
126
+
127
+ //==============================================================================
128
+ /* Allows parameter updates to be queued up without blocking,
129
+ and automatically dispatches these updates on the main thread.
130
+ */
131
+ class EditControllerParameterDispatcher final : private Timer
132
+ {
133
+ public:
134
+ ~EditControllerParameterDispatcher() override { stopTimer(); }
135
+
136
+ void push (Steinberg::int32 index, float value)
137
+ {
138
+ if (controller == nullptr)
139
+ return;
140
+
141
+ if (MessageManager::getInstance()->isThisTheMessageThread())
142
+ controller->setParamNormalized (cache.getParamID (index), value);
143
+ else
144
+ cache.set (index, value);
145
+ }
146
+
147
+ void start (Vst::IEditController& controllerIn)
148
+ {
149
+ controller = &controllerIn;
150
+ cache = CachedParamValues { getAllParamIDs (controllerIn) };
151
+ startTimerHz (60);
152
+ }
153
+
154
+ void flush()
155
+ {
156
+ cache.ifSet ([this] (Steinberg::int32 index, float value)
157
+ {
158
+ controller->setParamNormalized (cache.getParamID (index), value);
159
+ });
160
+ }
161
+
162
+ private:
163
+ void timerCallback() override
164
+ {
165
+ flush();
166
+ }
167
+
168
+ CachedParamValues cache;
169
+ Vst::IEditController* controller = nullptr;
170
+ };
171
+
172
+ //==============================================================================
173
+ static std::array<uint32, 4> getNormalisedTUID (const TUID& tuid) noexcept
174
+ {
175
+ const FUID fuid { tuid };
176
+ return { { fuid.getLong1(), fuid.getLong2(), fuid.getLong3(), fuid.getLong4() } };
177
+ }
178
+
179
+ template <typename Range>
180
+ static int getHashForRange (Range&& range) noexcept
181
+ {
182
+ uint32 value = 0;
183
+
184
+ for (const auto& item : range)
185
+ value = (value * 31) + (uint32) item;
186
+
187
+ return (int) value;
188
+ }
189
+
190
+ template <typename ObjectType>
191
+ static void fillDescriptionWith (PluginDescription& description, ObjectType& object)
192
+ {
193
+ description.version = toString (object.version).trim();
194
+ description.category = toString (object.subCategories).trim();
195
+
196
+ if (description.manufacturerName.trim().isEmpty())
197
+ description.manufacturerName = toString (object.vendor).trim();
198
+ }
199
+
200
+ static std::vector<PluginDescription> createPluginDescriptions (const File& pluginFile, const Steinberg::ModuleInfo& info)
201
+ {
202
+ std::vector<PluginDescription> result;
203
+
204
+ const auto araMainFactoryClassNames = [&]
205
+ {
206
+ std::unordered_set<String> factories;
207
+
208
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)
209
+ for (const auto& c : info.classes)
210
+ if (c.category == kARAMainFactoryClass)
211
+ factories.insert (CharPointer_UTF8 (c.name.c_str()));
212
+ #endif
213
+
214
+ return factories;
215
+ }();
216
+
217
+ for (const auto& c : info.classes)
218
+ {
219
+ if (c.category != kVstAudioEffectClass)
220
+ continue;
221
+
222
+ PluginDescription description;
223
+
224
+ description.fileOrIdentifier = pluginFile.getFullPathName();
225
+ description.lastFileModTime = pluginFile.getLastModificationTime();
226
+ description.lastInfoUpdateTime = Time::getCurrentTime();
227
+ description.manufacturerName = CharPointer_UTF8 (info.factoryInfo.vendor.c_str());
228
+ description.name = CharPointer_UTF8 (c.name.c_str());
229
+ description.descriptiveName = CharPointer_UTF8 (c.name.c_str());
230
+ description.pluginFormatName = "VST3";
231
+ description.numInputChannels = 0;
232
+ description.numOutputChannels = 0;
233
+ description.hasARAExtension = araMainFactoryClassNames.find (description.name) != araMainFactoryClassNames.end();
234
+ description.version = CharPointer_UTF8 (c.version.c_str());
235
+
236
+ const auto uid = VST3::UID::fromString (c.cid);
237
+
238
+ if (! uid)
239
+ continue;
240
+
241
+ description.deprecatedUid = getHashForRange (uid->data());
242
+ description.uniqueId = getHashForRange (getNormalisedTUID (uid->data()));
243
+
244
+ StringArray categories;
245
+
246
+ for (const auto& category : c.subCategories)
247
+ categories.add (CharPointer_UTF8 (category.c_str()));
248
+
249
+ description.category = categories.joinIntoString ("|");
250
+
251
+ description.isInstrument = std::any_of (c.subCategories.begin(),
252
+ c.subCategories.end(),
253
+ [] (const auto& subcategory) { return subcategory == "Instrument"; });
254
+
255
+ result.push_back (description);
256
+ }
257
+
258
+ return result;
259
+ }
260
+
261
+ static void createPluginDescription (PluginDescription& description,
262
+ const File& pluginFile, const String& company, const String& name,
263
+ const PClassInfo& info, PClassInfo2* info2, PClassInfoW* infoW,
264
+ int numInputs, int numOutputs)
265
+ {
266
+ description.fileOrIdentifier = pluginFile.getFullPathName();
267
+ description.lastFileModTime = pluginFile.getLastModificationTime();
268
+ description.lastInfoUpdateTime = Time::getCurrentTime();
269
+ description.manufacturerName = company;
270
+ description.name = name;
271
+ description.descriptiveName = name;
272
+ description.pluginFormatName = "VST3";
273
+ description.numInputChannels = numInputs;
274
+ description.numOutputChannels = numOutputs;
275
+
276
+ description.deprecatedUid = getHashForRange (info.cid);
277
+ description.uniqueId = getHashForRange (getNormalisedTUID (info.cid));
278
+
279
+ if (infoW != nullptr) fillDescriptionWith (description, *infoW);
280
+ else if (info2 != nullptr) fillDescriptionWith (description, *info2);
281
+
282
+ if (description.category.isEmpty())
283
+ description.category = toString (info.category).trim();
284
+
285
+ description.isInstrument = description.category.containsIgnoreCase ("Instrument"); // This seems to be the only way to find that out! ARGH!
286
+ }
287
+
288
+ static int getNumSingleDirectionBusesFor (Vst::IComponent* component,
289
+ MediaKind kind,
290
+ Direction direction)
291
+ {
292
+ jassert (component != nullptr);
293
+ JUCE_ASSERT_MESSAGE_THREAD
294
+ return (int) component->getBusCount (toVstType (kind), toVstType (direction));
295
+ }
296
+
297
+ /** Gives the total number of channels for a particular type of bus direction and media type */
298
+ static int getNumSingleDirectionChannelsFor (Vst::IComponent* component, Direction busDirection)
299
+ {
300
+ jassert (component != nullptr);
301
+ JUCE_ASSERT_MESSAGE_THREAD
302
+
303
+ const auto direction = toVstType (busDirection);
304
+ const Steinberg::int32 numBuses = component->getBusCount (Vst::kAudio, direction);
305
+
306
+ int numChannels = 0;
307
+
308
+ for (Steinberg::int32 i = numBuses; --i >= 0;)
309
+ {
310
+ Vst::BusInfo busInfo;
311
+ warnOnFailure (component->getBusInfo (Vst::kAudio, direction, i, busInfo));
312
+ numChannels += ((busInfo.flags & Vst::BusInfo::kDefaultActive) != 0 ? (int) busInfo.channelCount : 0);
313
+ }
314
+
315
+ return numChannels;
316
+ }
317
+
318
+ static void setStateForAllEventBuses (Vst::IComponent* component,
319
+ bool state,
320
+ Direction busDirection)
321
+ {
322
+ jassert (component != nullptr);
323
+ JUCE_ASSERT_MESSAGE_THREAD
324
+
325
+ const auto direction = toVstType (busDirection);
326
+ const Steinberg::int32 numBuses = component->getBusCount (Vst::kEvent, direction);
327
+
328
+ for (Steinberg::int32 i = numBuses; --i >= 0;)
329
+ warnOnFailure (component->activateBus (Vst::kEvent, direction, i, state));
330
+ }
331
+
332
+ //==============================================================================
333
+ static void toProcessContext (Vst::ProcessContext& context,
334
+ AudioPlayHead* playHead,
335
+ double sampleRate)
336
+ {
337
+ jassert (sampleRate > 0.0); //Must always be valid, as stated by the VST3 SDK
338
+
339
+ using namespace Vst;
340
+
341
+ zerostruct (context);
342
+ context.sampleRate = sampleRate;
343
+
344
+ const auto position = playHead != nullptr ? playHead->getPosition()
345
+ : nullopt;
346
+
347
+ if (position.hasValue())
348
+ {
349
+ if (const auto timeInSamples = position->getTimeInSamples())
350
+ context.projectTimeSamples = *timeInSamples;
351
+ else
352
+ jassertfalse; // The time in samples *must* be valid.
353
+
354
+ if (const auto tempo = position->getBpm())
355
+ {
356
+ context.state |= ProcessContext::kTempoValid;
357
+ context.tempo = *tempo;
358
+ }
359
+
360
+ if (const auto loop = position->getLoopPoints())
361
+ {
362
+ context.state |= ProcessContext::kCycleValid;
363
+ context.cycleStartMusic = loop->ppqStart;
364
+ context.cycleEndMusic = loop->ppqEnd;
365
+ }
366
+
367
+ if (const auto sig = position->getTimeSignature())
368
+ {
369
+ context.state |= ProcessContext::kTimeSigValid;
370
+ context.timeSigNumerator = sig->numerator;
371
+ context.timeSigDenominator = sig->denominator;
372
+ }
373
+
374
+ if (const auto pos = position->getPpqPosition())
375
+ {
376
+ context.state |= ProcessContext::kProjectTimeMusicValid;
377
+ context.projectTimeMusic = *pos;
378
+ }
379
+
380
+ if (const auto barStart = position->getPpqPositionOfLastBarStart())
381
+ {
382
+ context.state |= ProcessContext::kBarPositionValid;
383
+ context.barPositionMusic = *barStart;
384
+ }
385
+
386
+ if (const auto frameRate = position->getFrameRate())
387
+ {
388
+ if (const auto offset = position->getEditOriginTime())
389
+ {
390
+ context.state |= ProcessContext::kSmpteValid;
391
+ context.smpteOffsetSubframes = (Steinberg::int32) (80.0 * *offset * frameRate->getEffectiveRate());
392
+ context.frameRate.framesPerSecond = (Steinberg::uint32) frameRate->getBaseRate();
393
+ context.frameRate.flags = (Steinberg::uint32) ((frameRate->isDrop() ? FrameRate::kDropRate : 0)
394
+ | (frameRate->isPullDown() ? FrameRate::kPullDownRate : 0));
395
+ }
396
+ }
397
+
398
+ if (const auto hostTime = position->getHostTimeNs())
399
+ {
400
+ context.state |= ProcessContext::kSystemTimeValid;
401
+ context.systemTime = (int64_t) *hostTime;
402
+ jassert (context.systemTime >= 0);
403
+ }
404
+
405
+ if (position->getIsPlaying()) context.state |= ProcessContext::kPlaying;
406
+ if (position->getIsRecording()) context.state |= ProcessContext::kRecording;
407
+ if (position->getIsLooping()) context.state |= ProcessContext::kCycleActive;
408
+ }
409
+ }
410
+
411
+ //==============================================================================
412
+ class VST3PluginInstance;
413
+
414
+ struct VST3HostContext final : public Vst::IComponentHandler, // From VST V3.0.0
415
+ public Vst::IComponentHandler2, // From VST V3.1.0 (a very well named class, of course!)
416
+ public Vst::IComponentHandler3, // From VST V3.5.0 (also very well named!)
417
+ public Vst::IContextMenuTarget,
418
+ public Vst::IHostApplication,
419
+ public Vst::IUnitHandler,
420
+ private ComponentRestarter::Listener
421
+ {
422
+ VST3HostContext()
423
+ {
424
+ appName = File::getSpecialLocation (File::currentApplicationFile).getFileNameWithoutExtension();
425
+ }
426
+
427
+ ~VST3HostContext() override = default;
428
+
429
+ JUCE_DECLARE_VST3_COM_REF_METHODS
430
+
431
+ FUnknown* getFUnknown() { return static_cast<Vst::IComponentHandler*> (this); }
432
+
433
+ static bool hasFlag (Steinberg::int32 source, Steinberg::int32 flag) noexcept
434
+ {
435
+ return (source & flag) == flag;
436
+ }
437
+
438
+ //==============================================================================
439
+ tresult PLUGIN_API beginEdit (Vst::ParamID paramID) override;
440
+ tresult PLUGIN_API performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized) override;
441
+ tresult PLUGIN_API endEdit (Vst::ParamID paramID) override;
442
+
443
+ tresult PLUGIN_API restartComponent (Steinberg::int32 flags) override;
444
+ tresult PLUGIN_API setDirty (TBool) override;
445
+
446
+ //==============================================================================
447
+ tresult PLUGIN_API requestOpenEditor ([[maybe_unused]] FIDString name) override
448
+ {
449
+ // This request cannot currently be surfaced in the JUCE public API
450
+ return kResultFalse;
451
+ }
452
+
453
+ tresult PLUGIN_API startGroupEdit() override
454
+ {
455
+ jassertfalse;
456
+ return kResultFalse;
457
+ }
458
+
459
+ tresult PLUGIN_API finishGroupEdit() override
460
+ {
461
+ jassertfalse;
462
+ return kResultFalse;
463
+ }
464
+
465
+ void setPlugin (VST3PluginInstance* instance)
466
+ {
467
+ jassert (plugin == nullptr);
468
+ plugin = instance;
469
+ }
470
+
471
+ //==============================================================================
472
+ struct ContextMenu final : public Vst::IContextMenu
473
+ {
474
+ ContextMenu (VST3PluginInstance& pluginInstance) : owner (pluginInstance) {}
475
+ virtual ~ContextMenu() {}
476
+
477
+ JUCE_DECLARE_VST3_COM_REF_METHODS
478
+ JUCE_DECLARE_VST3_COM_QUERY_METHODS
479
+
480
+ Steinberg::int32 PLUGIN_API getItemCount() override { return (Steinberg::int32) items.size(); }
481
+
482
+ tresult PLUGIN_API addItem (const Item& item, IContextMenuTarget* target) override
483
+ {
484
+ jassert (target != nullptr);
485
+
486
+ ItemAndTarget newItem;
487
+ newItem.item = item;
488
+ newItem.target = addVSTComSmartPtrOwner (target);
489
+
490
+ items.add (newItem);
491
+ return kResultOk;
492
+ }
493
+
494
+ tresult PLUGIN_API removeItem (const Item& toRemove, IContextMenuTarget* target) override
495
+ {
496
+ for (int i = items.size(); --i >= 0;)
497
+ {
498
+ auto& item = items.getReference (i);
499
+
500
+ if (item.item.tag == toRemove.tag && item.target.get() == target)
501
+ items.remove (i);
502
+ }
503
+
504
+ return kResultOk;
505
+ }
506
+
507
+ tresult PLUGIN_API getItem (Steinberg::int32 tag, Item& result, IContextMenuTarget** target) override
508
+ {
509
+ for (int i = 0; i < items.size(); ++i)
510
+ {
511
+ auto& item = items.getReference (i);
512
+
513
+ if (item.item.tag == tag)
514
+ {
515
+ result = item.item;
516
+
517
+ if (target != nullptr)
518
+ *target = item.target.get();
519
+
520
+ return kResultTrue;
521
+ }
522
+ }
523
+
524
+ zerostruct (result);
525
+ return kResultFalse;
526
+ }
527
+
528
+ tresult PLUGIN_API popup (Steinberg::UCoord x, Steinberg::UCoord y) override;
529
+
530
+ #if ! JUCE_MODAL_LOOPS_PERMITTED
531
+ static void menuFinished (int modalResult, VSTComSmartPtr<ContextMenu> menu) { menu->handleResult (modalResult); }
532
+ #endif
533
+
534
+ private:
535
+ enum { zeroTagReplacement = 0x7fffffff };
536
+
537
+ Atomic<int> refCount;
538
+ VST3PluginInstance& owner;
539
+
540
+ struct ItemAndTarget
541
+ {
542
+ Item item;
543
+ VSTComSmartPtr<IContextMenuTarget> target;
544
+ };
545
+
546
+ Array<ItemAndTarget> items;
547
+
548
+ void handleResult (int result)
549
+ {
550
+ if (result == 0)
551
+ return;
552
+
553
+ if (result == zeroTagReplacement)
554
+ result = 0;
555
+
556
+ for (int i = 0; i < items.size(); ++i)
557
+ {
558
+ auto& item = items.getReference (i);
559
+
560
+ if ((int) item.item.tag == result)
561
+ {
562
+ if (item.target != nullptr)
563
+ item.target->executeMenuItem ((Steinberg::int32) result);
564
+
565
+ break;
566
+ }
567
+ }
568
+ }
569
+
570
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContextMenu)
571
+ };
572
+
573
+ Vst::IContextMenu* PLUGIN_API createContextMenu (IPlugView*, const Vst::ParamID*) override
574
+ {
575
+ if (plugin == nullptr)
576
+ return nullptr;
577
+
578
+ auto* result = new ContextMenu (*plugin);
579
+ result->addRef();
580
+ return result;
581
+ }
582
+
583
+ tresult PLUGIN_API executeMenuItem (Steinberg::int32) override
584
+ {
585
+ jassertfalse;
586
+ return kResultFalse;
587
+ }
588
+
589
+ //==============================================================================
590
+ tresult PLUGIN_API getName (Vst::String128 name) override
591
+ {
592
+ Steinberg::String str (appName.toUTF8());
593
+ str.copyTo (name, 0, 127);
594
+ return kResultOk;
595
+ }
596
+
597
+ tresult PLUGIN_API createInstance (TUID cid, TUID iid, void** obj) override
598
+ {
599
+ *obj = nullptr;
600
+
601
+ if (! doUIDsMatch (cid, iid))
602
+ {
603
+ jassertfalse;
604
+ return kInvalidArgument;
605
+ }
606
+
607
+ if (doUIDsMatch (cid, Vst::IMessage::iid) && doUIDsMatch (iid, Vst::IMessage::iid))
608
+ {
609
+ *obj = new Message;
610
+ return kResultOk;
611
+ }
612
+
613
+ if (doUIDsMatch (cid, Vst::IAttributeList::iid) && doUIDsMatch (iid, Vst::IAttributeList::iid))
614
+ {
615
+ *obj = new AttributeList;
616
+ return kResultOk;
617
+ }
618
+
619
+ jassertfalse;
620
+ return kNotImplemented;
621
+ }
622
+
623
+ //==============================================================================
624
+ tresult PLUGIN_API notifyUnitSelection (Vst::UnitID) override
625
+ {
626
+ jassertfalse;
627
+ return kResultFalse;
628
+ }
629
+
630
+ tresult PLUGIN_API notifyProgramListChange (Vst::ProgramListID, Steinberg::int32) override;
631
+
632
+ //==============================================================================
633
+ tresult PLUGIN_API queryInterface (const TUID iid, void** obj) override
634
+ {
635
+ return testForMultiple (*this,
636
+ iid,
637
+ UniqueBase<Vst::IComponentHandler>{},
638
+ UniqueBase<Vst::IComponentHandler2>{},
639
+ UniqueBase<Vst::IComponentHandler3>{},
640
+ UniqueBase<Vst::IContextMenuTarget>{},
641
+ UniqueBase<Vst::IHostApplication>{},
642
+ UniqueBase<Vst::IUnitHandler>{},
643
+ SharedBase<FUnknown, Vst::IComponentHandler>{}).extract (obj);
644
+ }
645
+
646
+ private:
647
+ //==============================================================================
648
+ VST3PluginInstance* plugin = nullptr;
649
+ Atomic<int> refCount;
650
+ String appName;
651
+
652
+ ComponentRestarter componentRestarter { *this };
653
+
654
+ void restartComponentOnMessageThread (int32 flags) override;
655
+
656
+ //==============================================================================
657
+ class Attribute
658
+ {
659
+ public:
660
+ using Int = Steinberg::int64;
661
+ using Float = double;
662
+ using String = std::vector<Vst::TChar>;
663
+ using Binary = std::vector<char>;
664
+
665
+ explicit Attribute (Int x) noexcept { constructFrom (std::move (x)); }
666
+ explicit Attribute (Float x) noexcept { constructFrom (std::move (x)); }
667
+ explicit Attribute (String x) noexcept { constructFrom (std::move (x)); }
668
+ explicit Attribute (Binary x) noexcept { constructFrom (std::move (x)); }
669
+
670
+ Attribute (Attribute&& other) noexcept
671
+ {
672
+ moveFrom (std::move (other));
673
+ }
674
+
675
+ Attribute& operator= (Attribute&& other) noexcept
676
+ {
677
+ reset();
678
+ moveFrom (std::move (other));
679
+ return *this;
680
+ }
681
+
682
+ ~Attribute() noexcept
683
+ {
684
+ reset();
685
+ }
686
+
687
+ tresult getInt (Steinberg::int64& result) const
688
+ {
689
+ if (kind != Kind::tagInt)
690
+ return kResultFalse;
691
+
692
+ result = storage.storedInt;
693
+ return kResultTrue;
694
+ }
695
+
696
+ tresult getFloat (double& result) const
697
+ {
698
+ if (kind != Kind::tagFloat)
699
+ return kResultFalse;
700
+
701
+ result = storage.storedFloat;
702
+ return kResultTrue;
703
+ }
704
+
705
+ tresult getString (Vst::TChar* data, Steinberg::uint32 numBytes) const
706
+ {
707
+ if (kind != Kind::tagString)
708
+ return kResultFalse;
709
+
710
+ std::memcpy (data,
711
+ storage.storedString.data(),
712
+ jmin (sizeof (Vst::TChar) * storage.storedString.size(), (size_t) numBytes));
713
+ return kResultTrue;
714
+ }
715
+
716
+ tresult getBinary (const void*& data, Steinberg::uint32& numBytes) const
717
+ {
718
+ if (kind != Kind::tagBinary)
719
+ return kResultFalse;
720
+
721
+ data = storage.storedBinary.data();
722
+ numBytes = (Steinberg::uint32) storage.storedBinary.size();
723
+ return kResultTrue;
724
+ }
725
+
726
+ private:
727
+ void constructFrom (Int x) noexcept { kind = Kind::tagInt; new (&storage.storedInt) Int (std::move (x)); }
728
+ void constructFrom (Float x) noexcept { kind = Kind::tagFloat; new (&storage.storedFloat) Float (std::move (x)); }
729
+ void constructFrom (String x) noexcept { kind = Kind::tagString; new (&storage.storedString) String (std::move (x)); }
730
+ void constructFrom (Binary x) noexcept { kind = Kind::tagBinary; new (&storage.storedBinary) Binary (std::move (x)); }
731
+
732
+ void reset() noexcept
733
+ {
734
+ switch (kind)
735
+ {
736
+ case Kind::tagInt: break;
737
+ case Kind::tagFloat: break;
738
+ case Kind::tagString: storage.storedString.~vector(); break;
739
+ case Kind::tagBinary: storage.storedBinary.~vector(); break;
740
+ }
741
+ }
742
+
743
+ void moveFrom (Attribute&& other) noexcept
744
+ {
745
+ switch (other.kind)
746
+ {
747
+ case Kind::tagInt: constructFrom (std::move (other.storage.storedInt)); break;
748
+ case Kind::tagFloat: constructFrom (std::move (other.storage.storedFloat)); break;
749
+ case Kind::tagString: constructFrom (std::move (other.storage.storedString)); break;
750
+ case Kind::tagBinary: constructFrom (std::move (other.storage.storedBinary)); break;
751
+ }
752
+ }
753
+
754
+ enum class Kind { tagInt, tagFloat, tagString, tagBinary };
755
+
756
+ union Storage
757
+ {
758
+ Storage() {}
759
+ ~Storage() {}
760
+
761
+ Steinberg::int64 storedInt;
762
+ double storedFloat;
763
+ std::vector<Vst::TChar> storedString;
764
+ std::vector<char> storedBinary;
765
+ };
766
+
767
+ Storage storage;
768
+ Kind kind;
769
+
770
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Attribute)
771
+ };
772
+
773
+ //==============================================================================
774
+ class AttributeList final : public Vst::IAttributeList
775
+ {
776
+ public:
777
+ AttributeList() = default;
778
+ virtual ~AttributeList() = default;
779
+
780
+ JUCE_DECLARE_VST3_COM_REF_METHODS
781
+ JUCE_DECLARE_VST3_COM_QUERY_METHODS
782
+
783
+ //==============================================================================
784
+ tresult PLUGIN_API setInt (AttrID attr, Steinberg::int64 value) override
785
+ {
786
+ return set (attr, value);
787
+ }
788
+
789
+ tresult PLUGIN_API setFloat (AttrID attr, double value) override
790
+ {
791
+ return set (attr, value);
792
+ }
793
+
794
+ tresult PLUGIN_API setString (AttrID attr, const Vst::TChar* string) override
795
+ {
796
+ return set (attr, std::vector<Vst::TChar> (string, string + 1 + tstrlen (string)));
797
+ }
798
+
799
+ tresult PLUGIN_API setBinary (AttrID attr, const void* data, Steinberg::uint32 size) override
800
+ {
801
+ const auto* ptr = static_cast<const char*> (data);
802
+ return set (attr, std::vector<char> (ptr, ptr + size));
803
+ }
804
+
805
+ tresult PLUGIN_API getInt (AttrID attr, Steinberg::int64& result) override
806
+ {
807
+ return get (attr, [&] (const auto& x) { return x.getInt (result); });
808
+ }
809
+
810
+ tresult PLUGIN_API getFloat (AttrID attr, double& result) override
811
+ {
812
+ return get (attr, [&] (const auto& x) { return x.getFloat (result); });
813
+ }
814
+
815
+ tresult PLUGIN_API getString (AttrID attr, Vst::TChar* result, Steinberg::uint32 length) override
816
+ {
817
+ return get (attr, [&] (const auto& x) { return x.getString (result, length); });
818
+ }
819
+
820
+ tresult PLUGIN_API getBinary (AttrID attr, const void*& data, Steinberg::uint32& size) override
821
+ {
822
+ return get (attr, [&] (const auto& x) { return x.getBinary (data, size); });
823
+ }
824
+
825
+ private:
826
+ template <typename Value>
827
+ tresult set (AttrID attr, Value&& value)
828
+ {
829
+ if (attr == nullptr)
830
+ return kInvalidArgument;
831
+
832
+ const auto iter = attributes.find (attr);
833
+
834
+ if (iter != attributes.end())
835
+ iter->second = Attribute (std::forward<Value> (value));
836
+ else
837
+ attributes.emplace (attr, Attribute (std::forward<Value> (value)));
838
+
839
+ return kResultTrue;
840
+ }
841
+
842
+ template <typename Visitor>
843
+ tresult get (AttrID attr, Visitor&& visitor)
844
+ {
845
+ if (attr == nullptr)
846
+ return kInvalidArgument;
847
+
848
+ const auto iter = attributes.find (attr);
849
+
850
+ if (iter == attributes.cend())
851
+ return kResultFalse;
852
+
853
+ return visitor (iter->second);
854
+ }
855
+
856
+ std::map<std::string, Attribute> attributes;
857
+ Atomic<int> refCount { 1 };
858
+
859
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AttributeList)
860
+ };
861
+
862
+ struct Message final : public Vst::IMessage
863
+ {
864
+ Message() = default;
865
+ virtual ~Message() = default;
866
+
867
+ JUCE_DECLARE_VST3_COM_REF_METHODS
868
+ JUCE_DECLARE_VST3_COM_QUERY_METHODS
869
+
870
+ FIDString PLUGIN_API getMessageID() override { return messageId.toRawUTF8(); }
871
+ void PLUGIN_API setMessageID (FIDString id) override { messageId = toString (id); }
872
+ Vst::IAttributeList* PLUGIN_API getAttributes() override { return &attributeList; }
873
+
874
+ private:
875
+ AttributeList attributeList;
876
+ String messageId;
877
+ Atomic<int> refCount { 1 };
878
+
879
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Message)
880
+ };
881
+
882
+ VSTComSmartPtr<AttributeList> attributeList;
883
+
884
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3HostContext)
885
+ };
886
+
887
+ //==============================================================================
888
+ struct DescriptionLister
889
+ {
890
+ static std::vector<PluginDescription> tryLoadFast (const File& file, const File& moduleinfo)
891
+ {
892
+ if (! moduleinfo.existsAsFile())
893
+ return {};
894
+
895
+ MemoryBlock mb;
896
+
897
+ if (! moduleinfo.loadFileAsData (mb))
898
+ return {};
899
+
900
+ const std::string_view blockAsStringView (static_cast<const char*> (mb.getData()), mb.getSize());
901
+ const auto parsed = Steinberg::ModuleInfoLib::parseJson (blockAsStringView, nullptr);
902
+
903
+ if (! parsed)
904
+ return {};
905
+
906
+ return createPluginDescriptions (file, *parsed);
907
+ }
908
+
909
+ static std::vector<PluginDescription> findDescriptionsFast (const File& file)
910
+ {
911
+ const auto moduleinfoNewLocation = file.getChildFile ("Contents").getChildFile ("Resources").getChildFile ("moduleinfo.json");
912
+
913
+ if (const auto loaded = tryLoadFast (file, moduleinfoNewLocation); ! loaded.empty())
914
+ return loaded;
915
+
916
+ return tryLoadFast (file, file.getChildFile ("Contents").getChildFile ("moduleinfo.json"));
917
+ }
918
+
919
+ static std::vector<PluginDescription> findDescriptionsSlow (VST3HostContext& host,
920
+ IPluginFactory& factory,
921
+ const File& file)
922
+ {
923
+ std::vector<PluginDescription> result;
924
+
925
+ StringArray foundNames;
926
+ PFactoryInfo factoryInfo;
927
+ factory.getFactoryInfo (&factoryInfo);
928
+ auto companyName = toString (factoryInfo.vendor).trim();
929
+
930
+ auto numClasses = factory.countClasses();
931
+
932
+ // Every ARA::IMainFactory must have a matching Steinberg::IComponent.
933
+ // The match is determined by the two classes having the same name.
934
+ std::unordered_set<String> araMainFactoryClassNames;
935
+
936
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)
937
+ for (Steinberg::int32 i = 0; i < numClasses; ++i)
938
+ {
939
+ PClassInfo info;
940
+ factory.getClassInfo (i, &info);
941
+ if (std::strcmp (info.category, kARAMainFactoryClass) == 0)
942
+ araMainFactoryClassNames.insert (info.name);
943
+ }
944
+ #endif
945
+
946
+ for (Steinberg::int32 i = 0; i < numClasses; ++i)
947
+ {
948
+ PClassInfo info;
949
+ factory.getClassInfo (i, &info);
950
+
951
+ if (std::strcmp (info.category, kVstAudioEffectClass) != 0)
952
+ continue;
953
+
954
+ const String name (toString (info.name).trim());
955
+
956
+ if (foundNames.contains (name, true))
957
+ continue;
958
+
959
+ std::unique_ptr<PClassInfo2> info2;
960
+ std::unique_ptr<PClassInfoW> infoW;
961
+
962
+ {
963
+ VSTComSmartPtr<IPluginFactory2> pf2;
964
+ VSTComSmartPtr<IPluginFactory3> pf3;
965
+
966
+ if (pf2.loadFrom (&factory))
967
+ {
968
+ info2.reset (new PClassInfo2());
969
+ pf2->getClassInfo2 (i, info2.get());
970
+ }
971
+
972
+ if (pf3.loadFrom (&factory))
973
+ {
974
+ infoW.reset (new PClassInfoW());
975
+ pf3->getClassInfoUnicode (i, infoW.get());
976
+ }
977
+ }
978
+
979
+ foundNames.add (name);
980
+
981
+ PluginDescription desc;
982
+
983
+ {
984
+ VSTComSmartPtr<Vst::IComponent> component;
985
+
986
+ if (component.loadFrom (&factory, info.cid))
987
+ {
988
+ if (component->initialize (host.getFUnknown()) == kResultOk)
989
+ {
990
+ auto numInputs = getNumSingleDirectionChannelsFor (component.get(), Direction::input);
991
+ auto numOutputs = getNumSingleDirectionChannelsFor (component.get(), Direction::output);
992
+
993
+ createPluginDescription (desc, file, companyName, name,
994
+ info, info2.get(), infoW.get(), numInputs, numOutputs);
995
+
996
+ component->terminate();
997
+ }
998
+ else
999
+ {
1000
+ jassertfalse;
1001
+ }
1002
+ }
1003
+ else
1004
+ {
1005
+ jassertfalse;
1006
+ }
1007
+ }
1008
+
1009
+ if (araMainFactoryClassNames.find (name) != araMainFactoryClassNames.end())
1010
+ desc.hasARAExtension = true;
1011
+
1012
+ if (desc.uniqueId != 0)
1013
+ result.push_back (desc);
1014
+ }
1015
+
1016
+ return result;
1017
+ }
1018
+ };
1019
+
1020
+ //==============================================================================
1021
+ struct DLLHandle
1022
+ {
1023
+ DLLHandle (const File& fileToOpen)
1024
+ : dllFile (fileToOpen)
1025
+ {
1026
+ open();
1027
+ }
1028
+
1029
+ ~DLLHandle()
1030
+ {
1031
+ #if JUCE_MAC
1032
+ if (bundleRef != nullptr)
1033
+ #endif
1034
+ {
1035
+ if (factory != nullptr)
1036
+ factory->release();
1037
+
1038
+ using ExitModuleFn = bool (PLUGIN_API*)();
1039
+
1040
+ if (auto* exitFn = (ExitModuleFn) getFunction (exitFnName))
1041
+ exitFn();
1042
+
1043
+ #if JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD
1044
+ library.close();
1045
+ #endif
1046
+ }
1047
+ }
1048
+
1049
+ //==============================================================================
1050
+ /** The factory should begin with a refCount of 1, so don't increment the reference count
1051
+ (ie: don't use a VSTComSmartPtr in here)! Its lifetime will be handled by this DLLHandle.
1052
+ */
1053
+ IPluginFactory* JUCE_CALLTYPE getPluginFactory()
1054
+ {
1055
+ if (factory == nullptr)
1056
+ if (auto* proc = (GetFactoryProc) getFunction (factoryFnName))
1057
+ factory = proc();
1058
+
1059
+ // The plugin NEEDS to provide a factory to be able to be called a VST3!
1060
+ // Most likely you are trying to load a 32-bit VST3 from a 64-bit host
1061
+ // or vice versa.
1062
+ jassert (factory != nullptr);
1063
+ return factory;
1064
+ }
1065
+
1066
+ void* getFunction (const char* functionName)
1067
+ {
1068
+ #if JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD
1069
+ return library.getFunction (functionName);
1070
+ #elif JUCE_MAC
1071
+ if (bundleRef == nullptr)
1072
+ return nullptr;
1073
+
1074
+ CFUniquePtr<CFStringRef> name (String (functionName).toCFString());
1075
+ return CFBundleGetFunctionPointerForName (bundleRef.get(), name.get());
1076
+ #endif
1077
+ }
1078
+
1079
+ File getFile() const noexcept { return dllFile; }
1080
+
1081
+ private:
1082
+ File dllFile;
1083
+ IPluginFactory* factory = nullptr;
1084
+
1085
+ static constexpr const char* factoryFnName = "GetPluginFactory";
1086
+
1087
+ #if JUCE_WINDOWS
1088
+ static constexpr const char* entryFnName = "InitDll";
1089
+ static constexpr const char* exitFnName = "ExitDll";
1090
+
1091
+ using EntryProc = bool (PLUGIN_API*)();
1092
+ #elif JUCE_LINUX || JUCE_BSD
1093
+ static constexpr const char* entryFnName = "ModuleEntry";
1094
+ static constexpr const char* exitFnName = "ModuleExit";
1095
+
1096
+ using EntryProc = bool (PLUGIN_API*) (void*);
1097
+ #elif JUCE_MAC
1098
+ static constexpr const char* entryFnName = "bundleEntry";
1099
+ static constexpr const char* exitFnName = "bundleExit";
1100
+
1101
+ using EntryProc = bool (*) (CFBundleRef);
1102
+ #endif
1103
+
1104
+ //==============================================================================
1105
+ #if JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD
1106
+ DynamicLibrary library;
1107
+
1108
+ bool open()
1109
+ {
1110
+ if (library.open (dllFile.getFullPathName()))
1111
+ {
1112
+ if (auto* proc = (EntryProc) getFunction (entryFnName))
1113
+ {
1114
+ #if JUCE_WINDOWS
1115
+ if (proc())
1116
+ #else
1117
+ if (proc (library.getNativeHandle()))
1118
+ #endif
1119
+ return true;
1120
+ }
1121
+ else
1122
+ {
1123
+ // this is required for some plug-ins which don't export the dll entry point function
1124
+ return true;
1125
+ }
1126
+
1127
+ library.close();
1128
+ }
1129
+
1130
+ return false;
1131
+ }
1132
+ #elif JUCE_MAC
1133
+ CFUniquePtr<CFBundleRef> bundleRef;
1134
+
1135
+ bool open()
1136
+ {
1137
+ auto* utf8 = dllFile.getFullPathName().toRawUTF8();
1138
+
1139
+ if (auto url = CFUniquePtr<CFURLRef> (CFURLCreateFromFileSystemRepresentation (nullptr,
1140
+ (const UInt8*) utf8,
1141
+ (CFIndex) std::strlen (utf8),
1142
+ dllFile.isDirectory())))
1143
+ {
1144
+ bundleRef.reset (CFBundleCreate (kCFAllocatorDefault, url.get()));
1145
+
1146
+ if (bundleRef != nullptr)
1147
+ {
1148
+ CFObjectHolder<CFErrorRef> error;
1149
+
1150
+ if (CFBundleLoadExecutableAndReturnError (bundleRef.get(), &error.object))
1151
+ if (auto* proc = (EntryProc) getFunction (entryFnName))
1152
+ if (proc (bundleRef.get()))
1153
+ return true;
1154
+
1155
+ if (error.object != nullptr)
1156
+ if (auto failureMessage = CFUniquePtr<CFStringRef> (CFErrorCopyFailureReason (error.object)))
1157
+ DBG (String::fromCFString (failureMessage.get()));
1158
+
1159
+ bundleRef = nullptr;
1160
+ }
1161
+ }
1162
+
1163
+ return false;
1164
+ }
1165
+ #endif
1166
+
1167
+ //==============================================================================
1168
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DLLHandle)
1169
+ };
1170
+
1171
+ struct DLLHandleCache final : public DeletedAtShutdown
1172
+ {
1173
+ DLLHandleCache() = default;
1174
+ ~DLLHandleCache() override { clearSingletonInstance(); }
1175
+
1176
+ JUCE_DECLARE_SINGLETON (DLLHandleCache, false)
1177
+
1178
+ DLLHandle& findOrCreateHandle (const String& modulePath)
1179
+ {
1180
+ #if JUCE_LINUX || JUCE_BSD
1181
+ File file (getDLLFileFromBundle (modulePath));
1182
+ #else
1183
+ File file (modulePath);
1184
+ #endif
1185
+
1186
+ auto it = std::find_if (openHandles.begin(), openHandles.end(),
1187
+ [&] (const std::unique_ptr<DLLHandle>& handle)
1188
+ {
1189
+ return file == handle->getFile();
1190
+ });
1191
+
1192
+ if (it != openHandles.end())
1193
+ return *it->get();
1194
+
1195
+ openHandles.push_back (std::make_unique<DLLHandle> (file));
1196
+ return *openHandles.back().get();
1197
+ }
1198
+
1199
+ private:
1200
+ #if JUCE_LINUX || JUCE_BSD
1201
+ File getDLLFileFromBundle (const String& bundlePath) const
1202
+ {
1203
+ auto machineName = []() -> String
1204
+ {
1205
+ struct utsname unameData;
1206
+ auto res = uname (&unameData);
1207
+
1208
+ if (res != 0)
1209
+ return {};
1210
+
1211
+ return unameData.machine;
1212
+ }();
1213
+
1214
+ File file (bundlePath);
1215
+
1216
+ return file.getChildFile ("Contents")
1217
+ .getChildFile (machineName + "-linux")
1218
+ .getChildFile (file.getFileNameWithoutExtension() + ".so");
1219
+ }
1220
+ #endif
1221
+
1222
+ std::vector<std::unique_ptr<DLLHandle>> openHandles;
1223
+
1224
+ //==============================================================================
1225
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DLLHandleCache)
1226
+ };
1227
+
1228
+
1229
+ JUCE_IMPLEMENT_SINGLETON (DLLHandleCache)
1230
+
1231
+ //==============================================================================
1232
+ #if JUCE_LINUX || JUCE_BSD
1233
+
1234
+ class RunLoop final : public Steinberg::Linux::IRunLoop
1235
+ {
1236
+ public:
1237
+ RunLoop() = default;
1238
+
1239
+ ~RunLoop()
1240
+ {
1241
+ for (const auto& h : eventHandlerMap)
1242
+ LinuxEventLoop::unregisterFdCallback (h.first);
1243
+ }
1244
+
1245
+ //==============================================================================
1246
+ tresult PLUGIN_API registerEventHandler (Linux::IEventHandler* handler,
1247
+ Linux::FileDescriptor fd) override
1248
+ {
1249
+ if (handler == nullptr)
1250
+ return kInvalidArgument;
1251
+
1252
+ auto& handlers = eventHandlerMap[fd];
1253
+
1254
+ if (handlers.empty())
1255
+ {
1256
+ LinuxEventLoop::registerFdCallback (fd, [this] (int descriptor)
1257
+ {
1258
+ for (auto* h : eventHandlerMap[descriptor])
1259
+ h->onFDIsSet (descriptor);
1260
+
1261
+ return true;
1262
+ });
1263
+ }
1264
+
1265
+ handlers.push_back (handler);
1266
+
1267
+ return kResultTrue;
1268
+ }
1269
+
1270
+ tresult PLUGIN_API unregisterEventHandler (Linux::IEventHandler* handler) override
1271
+ {
1272
+ if (handler == nullptr)
1273
+ return kInvalidArgument;
1274
+
1275
+ for (auto iter = eventHandlerMap.begin(), end = eventHandlerMap.end(); iter != end;)
1276
+ {
1277
+ auto& handlers = iter->second;
1278
+
1279
+ auto handlersIter = std::find (std::begin (handlers), std::end (handlers), handler);
1280
+
1281
+ if (handlersIter != std::end (handlers))
1282
+ {
1283
+ handlers.erase (handlersIter);
1284
+
1285
+ if (handlers.empty())
1286
+ {
1287
+ LinuxEventLoop::unregisterFdCallback (iter->first);
1288
+ iter = eventHandlerMap.erase (iter);
1289
+ continue;
1290
+ }
1291
+ }
1292
+
1293
+ ++iter;
1294
+ }
1295
+
1296
+ return kResultTrue;
1297
+ }
1298
+
1299
+ //==============================================================================
1300
+ tresult PLUGIN_API registerTimer (Linux::ITimerHandler* handler, Linux::TimerInterval milliseconds) override
1301
+ {
1302
+ if (handler == nullptr || milliseconds <= 0)
1303
+ return kInvalidArgument;
1304
+
1305
+ timerCallers.emplace_back (handler, (int) milliseconds);
1306
+ return kResultTrue;
1307
+ }
1308
+
1309
+ tresult PLUGIN_API unregisterTimer (Linux::ITimerHandler* handler) override
1310
+ {
1311
+ auto iter = std::find (timerCallers.begin(), timerCallers.end(), handler);
1312
+
1313
+ if (iter == timerCallers.end())
1314
+ return kInvalidArgument;
1315
+
1316
+ timerCallers.erase (iter);
1317
+ return kResultTrue;
1318
+ }
1319
+
1320
+ //==============================================================================
1321
+ uint32 PLUGIN_API addRef() override { return 1000; }
1322
+ uint32 PLUGIN_API release() override { return 1000; }
1323
+ tresult PLUGIN_API queryInterface (const TUID, void**) override { return kNoInterface; }
1324
+
1325
+ private:
1326
+ //==============================================================================
1327
+ struct TimerCaller final : private Timer
1328
+ {
1329
+ TimerCaller (Linux::ITimerHandler* h, int interval) : handler (h) { startTimer (interval); }
1330
+ ~TimerCaller() override { stopTimer(); }
1331
+
1332
+ void timerCallback() override { handler->onTimer(); }
1333
+
1334
+ bool operator== (Linux::ITimerHandler* other) const noexcept { return handler == other; }
1335
+
1336
+ Linux::ITimerHandler* handler = nullptr;
1337
+ };
1338
+
1339
+ std::unordered_map<Linux::FileDescriptor, std::vector<Linux::IEventHandler*>> eventHandlerMap;
1340
+ std::list<TimerCaller> timerCallers;
1341
+
1342
+ //==============================================================================
1343
+ JUCE_DECLARE_NON_MOVEABLE (RunLoop)
1344
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RunLoop)
1345
+ };
1346
+
1347
+ #endif
1348
+
1349
+ //==============================================================================
1350
+ struct VST3ModuleHandle final : public ReferenceCountedObject
1351
+ {
1352
+ explicit VST3ModuleHandle (const File& pluginFile, const PluginDescription& pluginDesc)
1353
+ : file (pluginFile)
1354
+ {
1355
+ if (open (pluginDesc))
1356
+ {
1357
+ isOpen = true;
1358
+ getActiveModules().add (this);
1359
+ }
1360
+ }
1361
+
1362
+ ~VST3ModuleHandle()
1363
+ {
1364
+ if (isOpen)
1365
+ getActiveModules().removeFirstMatchingValue (this);
1366
+ }
1367
+
1368
+ //==============================================================================
1369
+ using Ptr = ReferenceCountedObjectPtr<VST3ModuleHandle>;
1370
+
1371
+ static VST3ModuleHandle::Ptr findOrCreateModule (const File& file,
1372
+ const PluginDescription& description)
1373
+ {
1374
+ for (auto* module : getActiveModules())
1375
+ {
1376
+ // VST3s are basically shells, you must therefore check their name along with their file:
1377
+ if (module->file == file && module->name == description.name)
1378
+ return module;
1379
+ }
1380
+
1381
+ VST3ModuleHandle::Ptr modulePtr (new VST3ModuleHandle (file, description));
1382
+
1383
+ if (! modulePtr->isOpen)
1384
+ modulePtr = nullptr;
1385
+
1386
+ return modulePtr;
1387
+ }
1388
+
1389
+ //==============================================================================
1390
+ IPluginFactory* getPluginFactory()
1391
+ {
1392
+ return DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName()).getPluginFactory();
1393
+ }
1394
+
1395
+ File getFile() const noexcept { return file; }
1396
+ String getName() const noexcept { return name; }
1397
+
1398
+ private:
1399
+ //==============================================================================
1400
+ static Array<VST3ModuleHandle*>& getActiveModules()
1401
+ {
1402
+ static Array<VST3ModuleHandle*> activeModules;
1403
+ return activeModules;
1404
+ }
1405
+
1406
+ //==============================================================================
1407
+ bool open (const PluginDescription& description)
1408
+ {
1409
+ auto pluginFactory = addVSTComSmartPtrOwner (DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName()).getPluginFactory());
1410
+
1411
+ if (pluginFactory != nullptr)
1412
+ {
1413
+ auto numClasses = pluginFactory->countClasses();
1414
+
1415
+ for (Steinberg::int32 i = 0; i < numClasses; ++i)
1416
+ {
1417
+ PClassInfo info;
1418
+ pluginFactory->getClassInfo (i, &info);
1419
+
1420
+ if (std::strcmp (info.category, kVstAudioEffectClass) != 0)
1421
+ continue;
1422
+
1423
+ const auto uniqueId = getHashForRange (getNormalisedTUID (info.cid));
1424
+ const auto deprecatedUid = getHashForRange (info.cid);
1425
+
1426
+ if (toString (info.name).trim() == description.name
1427
+ && (uniqueId == description.uniqueId || deprecatedUid == description.deprecatedUid))
1428
+ {
1429
+ name = description.name;
1430
+ return true;
1431
+ }
1432
+ }
1433
+ }
1434
+
1435
+ return false;
1436
+ }
1437
+
1438
+ File file;
1439
+ String name;
1440
+ bool isOpen = false;
1441
+
1442
+ //==============================================================================
1443
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3ModuleHandle)
1444
+ };
1445
+
1446
+ template <typename Type, size_t N>
1447
+ static int compareWithString (Type (&charArray)[N], const String& str)
1448
+ {
1449
+ return std::strncmp (str.toRawUTF8(),
1450
+ charArray,
1451
+ std::min (str.getNumBytesAsUTF8(), (size_t) numElementsInArray (charArray)));
1452
+ }
1453
+
1454
+ template <typename Callback>
1455
+ static void forEachARAFactory ([[maybe_unused]] IPluginFactory* pluginFactory, [[maybe_unused]] Callback&& cb)
1456
+ {
1457
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)
1458
+ const auto numClasses = pluginFactory->countClasses();
1459
+ for (Steinberg::int32 i = 0; i < numClasses; ++i)
1460
+ {
1461
+ PClassInfo info;
1462
+ pluginFactory->getClassInfo (i, &info);
1463
+
1464
+ if (std::strcmp (info.category, kARAMainFactoryClass) == 0)
1465
+ {
1466
+ const bool keepGoing = cb (info);
1467
+ if (! keepGoing)
1468
+ break;
1469
+ }
1470
+ }
1471
+ #endif
1472
+ }
1473
+
1474
+ static std::shared_ptr<const ARA::ARAFactory> getARAFactory ([[maybe_unused]] Steinberg::IPluginFactory* pluginFactory,
1475
+ [[maybe_unused]] const String& pluginName)
1476
+ {
1477
+ std::shared_ptr<const ARA::ARAFactory> factory;
1478
+
1479
+ #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)
1480
+ forEachARAFactory (pluginFactory,
1481
+ [&pluginFactory, &pluginName, &factory] (const auto& pcClassInfo)
1482
+ {
1483
+ if (compareWithString (pcClassInfo.name, pluginName) == 0)
1484
+ {
1485
+ ARA::IMainFactory* source;
1486
+ if (pluginFactory->createInstance (pcClassInfo.cid, ARA::IMainFactory::iid, (void**) &source)
1487
+ == Steinberg::kResultOk)
1488
+ {
1489
+ factory = getOrCreateARAFactory (source->getFactory(),
1490
+ [source]() { source->release(); });
1491
+ return false;
1492
+ }
1493
+ jassert (source == nullptr);
1494
+ }
1495
+
1496
+ return true;
1497
+ });
1498
+ #endif
1499
+
1500
+ return factory;
1501
+ }
1502
+
1503
+ static std::shared_ptr<const ARA::ARAFactory> getARAFactory (VST3ModuleHandle& module)
1504
+ {
1505
+ auto* pluginFactory = module.getPluginFactory();
1506
+ return getARAFactory (pluginFactory, module.getName());
1507
+ }
1508
+
1509
+ //==============================================================================
1510
+ struct VST3PluginWindow final : public AudioProcessorEditor,
1511
+ private ComponentMovementWatcher,
1512
+ private ComponentBoundsConstrainer,
1513
+ private IPlugFrame
1514
+ {
1515
+ VST3PluginWindow (AudioPluginInstance* owner, VSTComSmartPtr<IPlugView> pluginView)
1516
+ : AudioProcessorEditor (owner),
1517
+ ComponentMovementWatcher (this),
1518
+ view (pluginView)
1519
+ #if JUCE_MAC
1520
+ , embeddedComponent (*owner)
1521
+ #endif
1522
+ {
1523
+ setSize (10, 10);
1524
+ setOpaque (true);
1525
+ setVisible (true);
1526
+ setConstrainer (this);
1527
+
1528
+ warnOnFailure (view->setFrame (this));
1529
+ view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface);
1530
+
1531
+ setContentScaleFactor();
1532
+ resizeToFit();
1533
+
1534
+ setResizable (view->canResize() == kResultTrue, false);
1535
+ }
1536
+
1537
+ ~VST3PluginWindow() override
1538
+ {
1539
+ if (scaleInterface != nullptr)
1540
+ scaleInterface->release();
1541
+
1542
+ #if JUCE_LINUX || JUCE_BSD
1543
+ embeddedComponent.removeClient();
1544
+ #endif
1545
+
1546
+ if (attachedCalled)
1547
+ warnOnFailure (view->removed());
1548
+
1549
+ warnOnFailure (view->setFrame (nullptr));
1550
+
1551
+ processor.editorBeingDeleted (this);
1552
+
1553
+ #if JUCE_MAC
1554
+ embeddedComponent.setView (nullptr);
1555
+ #endif
1556
+
1557
+ view = nullptr;
1558
+ }
1559
+
1560
+ #if JUCE_LINUX || JUCE_BSD
1561
+ Steinberg::tresult PLUGIN_API queryInterface (const Steinberg::TUID queryIid, void** obj) override
1562
+ {
1563
+ if (doUIDsMatch (queryIid, Steinberg::Linux::IRunLoop::iid))
1564
+ {
1565
+ *obj = &runLoop.get();
1566
+ return kResultTrue;
1567
+ }
1568
+
1569
+ jassertfalse;
1570
+ *obj = nullptr;
1571
+
1572
+ return Steinberg::kNotImplemented;
1573
+ }
1574
+ #else
1575
+ JUCE_DECLARE_VST3_COM_QUERY_METHODS
1576
+ #endif
1577
+
1578
+ JUCE_DECLARE_VST3_COM_REF_METHODS
1579
+
1580
+ void paint (Graphics& g) override
1581
+ {
1582
+ g.fillAll (Colours::black);
1583
+ }
1584
+
1585
+ void mouseWheelMove (const MouseEvent&, const MouseWheelDetails& wheel) override
1586
+ {
1587
+ view->onWheel (wheel.deltaY);
1588
+ }
1589
+
1590
+ void focusGained (FocusChangeType) override { view->onFocus (true); }
1591
+ void focusLost (FocusChangeType) override { view->onFocus (false); }
1592
+
1593
+ /** It seems that most, if not all, plugins do their own keyboard hooks,
1594
+ but IPlugView does have a set of keyboard related methods...
1595
+ */
1596
+ bool keyStateChanged (bool /*isKeyDown*/) override { return true; }
1597
+ bool keyPressed (const KeyPress& /*key*/) override { return true; }
1598
+
1599
+ private:
1600
+ void checkBounds (Rectangle<int>& bounds,
1601
+ const Rectangle<int>&,
1602
+ const Rectangle<int>&,
1603
+ bool,
1604
+ bool,
1605
+ bool,
1606
+ bool) override
1607
+ {
1608
+ auto rect = componentToVST3Rect (bounds);
1609
+ auto constrainedRect = rect;
1610
+ view->checkSizeConstraint (&constrainedRect);
1611
+
1612
+ // Prevent inadvertent window growth while dragging; see componentMovedOrResized below
1613
+ if (constrainedRect.getWidth() != rect.getWidth() || constrainedRect.getHeight() != rect.getHeight())
1614
+ bounds = vst3ToComponentRect (constrainedRect);
1615
+ }
1616
+
1617
+ //==============================================================================
1618
+ void componentPeerChanged() override {}
1619
+
1620
+ /* Convert from the component's coordinate system to the hosted VST3's coordinate system. */
1621
+ ViewRect componentToVST3Rect (Rectangle<int> r) const
1622
+ {
1623
+ const auto physical = localAreaToGlobal (r) * nativeScaleFactor * getDesktopScaleFactor();
1624
+ return { 0, 0, physical.getWidth(), physical.getHeight() };
1625
+ }
1626
+
1627
+ /* Convert from the hosted VST3's coordinate system to the component's coordinate system. */
1628
+ Rectangle<int> vst3ToComponentRect (const ViewRect& vr) const
1629
+ {
1630
+ return getLocalArea (nullptr, Rectangle<int> { vr.right, vr.bottom } / (nativeScaleFactor * getDesktopScaleFactor()));
1631
+ }
1632
+
1633
+ void componentMovedOrResized (bool, bool wasResized) override
1634
+ {
1635
+ if (recursiveResize || ! wasResized || getTopLevelComponent()->getPeer() == nullptr)
1636
+ return;
1637
+
1638
+ if (view->canResize() == kResultTrue)
1639
+ {
1640
+ // componentToVST3Rect will apply DPI scaling and round to the nearest integer; vst3ToComponentRect
1641
+ // will invert the DPI scaling, but the logical size returned by vst3ToComponentRect may be
1642
+ // different from the original size due to floating point rounding if the scale factor is > 100%.
1643
+ // This can cause the window to unexpectedly grow while it's moving.
1644
+ auto scaledRect = componentToVST3Rect (getLocalBounds());
1645
+
1646
+ auto constrainedRect = scaledRect;
1647
+ view->checkSizeConstraint (&constrainedRect);
1648
+
1649
+ const auto tieRect = [] (const auto& x) { return std::tuple (x.getWidth(), x.getHeight()); };
1650
+
1651
+ // Only update the size if the constrained size is actually different
1652
+ if (tieRect (constrainedRect) != tieRect (scaledRect))
1653
+ {
1654
+ const ScopedValueSetter recursiveResizeSetter (recursiveResize, true);
1655
+
1656
+ const auto logicalSize = vst3ToComponentRect (constrainedRect);
1657
+ setSize (logicalSize.getWidth(), logicalSize.getHeight());
1658
+ }
1659
+
1660
+ embeddedComponent.setBounds (getLocalBounds());
1661
+
1662
+ view->onSize (&constrainedRect);
1663
+ }
1664
+ else
1665
+ {
1666
+ ViewRect rect;
1667
+ warnOnFailure (view->getSize (&rect));
1668
+
1669
+ resizeWithRect (embeddedComponent, rect);
1670
+ }
1671
+
1672
+ // Some plugins don't update their cursor correctly when mousing out the window
1673
+ Desktop::getInstance().getMainMouseSource().forceMouseCursorUpdate();
1674
+ }
1675
+
1676
+ using ComponentMovementWatcher::componentMovedOrResized;
1677
+
1678
+ void componentVisibilityChanged() override
1679
+ {
1680
+ attachPluginWindow();
1681
+ resizeToFit();
1682
+ componentMovedOrResized (true, true);
1683
+ }
1684
+
1685
+ using ComponentMovementWatcher::componentVisibilityChanged;
1686
+
1687
+ void resizeToFit()
1688
+ {
1689
+ ViewRect rect;
1690
+ warnOnFailure (view->getSize (&rect));
1691
+ resizeWithRect (*this, rect);
1692
+ }
1693
+
1694
+ tresult PLUGIN_API resizeView (IPlugView* incomingView, ViewRect* newSize) override
1695
+ {
1696
+ const ScopedValueSetter<bool> recursiveResizeSetter (recursiveResize, true);
1697
+
1698
+ if (incomingView != nullptr && newSize != nullptr && incomingView == view.get())
1699
+ {
1700
+ const auto oldPhysicalSize = componentToVST3Rect (getLocalBounds());
1701
+ const auto logicalSize = vst3ToComponentRect (*newSize);
1702
+ setSize (logicalSize.getWidth(), logicalSize.getHeight());
1703
+ embeddedComponent.setSize (logicalSize.getWidth(), logicalSize.getHeight());
1704
+
1705
+ #if JUCE_WINDOWS
1706
+ embeddedComponent.updateHWNDBounds();
1707
+ #elif JUCE_LINUX || JUCE_BSD
1708
+ embeddedComponent.updateEmbeddedBounds();
1709
+ #endif
1710
+
1711
+ // According to the VST3 Workflow Diagrams, a resizeView from the plugin should
1712
+ // always trigger a response from the host which confirms the new size.
1713
+ auto currentPhysicalSize = componentToVST3Rect (getLocalBounds());
1714
+
1715
+ if (currentPhysicalSize.getWidth() != oldPhysicalSize.getWidth()
1716
+ || currentPhysicalSize.getHeight() != oldPhysicalSize.getHeight()
1717
+ || ! isInOnSize)
1718
+ {
1719
+ // Guard against plug-ins immediately calling resizeView() with the same size
1720
+ const ScopedValueSetter<bool> inOnSizeSetter (isInOnSize, true);
1721
+ view->onSize (&currentPhysicalSize);
1722
+ }
1723
+
1724
+ return kResultTrue;
1725
+ }
1726
+
1727
+ jassertfalse;
1728
+ return kInvalidArgument;
1729
+ }
1730
+
1731
+ //==============================================================================
1732
+ void resizeWithRect (Component& comp, const ViewRect& rect) const
1733
+ {
1734
+ const auto logicalSize = vst3ToComponentRect (rect);
1735
+ comp.setSize (jmax (10, logicalSize.getWidth()),
1736
+ jmax (10, logicalSize.getHeight()));
1737
+ }
1738
+
1739
+ void attachPluginWindow()
1740
+ {
1741
+ if (pluginHandle == HandleFormat{})
1742
+ {
1743
+ #if JUCE_WINDOWS
1744
+ pluginHandle = static_cast<HWND> (embeddedComponent.getHWND());
1745
+ #endif
1746
+
1747
+ embeddedComponent.setBounds (getLocalBounds());
1748
+ addAndMakeVisible (embeddedComponent);
1749
+
1750
+ #if JUCE_MAC
1751
+ pluginHandle = (HandleFormat) embeddedComponent.getView();
1752
+ #elif JUCE_LINUX || JUCE_BSD
1753
+ pluginHandle = (HandleFormat) embeddedComponent.getHostWindowID();
1754
+ #endif
1755
+
1756
+ if (pluginHandle == HandleFormat{})
1757
+ {
1758
+ jassertfalse;
1759
+ return;
1760
+ }
1761
+
1762
+ [[maybe_unused]] const auto attachedResult = view->attached ((void*) pluginHandle, defaultVST3WindowType);
1763
+ [[maybe_unused]] const auto warning = warnOnFailure (attachedResult);
1764
+
1765
+ if (attachedResult == kResultOk)
1766
+ attachedCalled = true;
1767
+
1768
+ updatePluginScale();
1769
+
1770
+ #if JUCE_WINDOWS
1771
+ // Make sure the embedded component window is the right size
1772
+ // and invalidate the embedded HWND and any child windows
1773
+ embeddedComponent.updateHWNDBounds();
1774
+ #endif
1775
+ }
1776
+ }
1777
+
1778
+ void updatePluginScale()
1779
+ {
1780
+ if (scaleInterface != nullptr)
1781
+ setContentScaleFactor();
1782
+ else
1783
+ resizeToFit();
1784
+ }
1785
+
1786
+ void setContentScaleFactor()
1787
+ {
1788
+ if (scaleInterface != nullptr)
1789
+ {
1790
+ [[maybe_unused]] const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) getEffectiveScale());
1791
+
1792
+ #if ! JUCE_MAC
1793
+ [[maybe_unused]] const auto warning = warnOnFailure (result);
1794
+ #endif
1795
+ }
1796
+ }
1797
+
1798
+ void setScaleFactor (float s) override
1799
+ {
1800
+ userScaleFactor = s;
1801
+ setContentScaleFactor();
1802
+ resizeToFit();
1803
+ }
1804
+
1805
+ float getEffectiveScale() const
1806
+ {
1807
+ return nativeScaleFactor * userScaleFactor;
1808
+ }
1809
+
1810
+ //==============================================================================
1811
+ Atomic<int> refCount { 1 };
1812
+ VSTComSmartPtr<IPlugView> view;
1813
+
1814
+ #if JUCE_WINDOWS
1815
+ using HandleFormat = HWND;
1816
+
1817
+ struct ViewComponent final : public HWNDComponent
1818
+ {
1819
+ ViewComponent()
1820
+ {
1821
+ setOpaque (true);
1822
+ inner.addToDesktop (0);
1823
+
1824
+ if (auto* peer = inner.getPeer())
1825
+ setHWND (peer->getNativeHandle());
1826
+ }
1827
+
1828
+ void paint (Graphics& g) override { g.fillAll (Colours::black); }
1829
+
1830
+ private:
1831
+ struct Inner final : public Component
1832
+ {
1833
+ Inner() { setOpaque (true); }
1834
+ void paint (Graphics& g) override { g.fillAll (Colours::black); }
1835
+ };
1836
+
1837
+ Inner inner;
1838
+ };
1839
+
1840
+ ViewComponent embeddedComponent;
1841
+ #elif JUCE_MAC
1842
+ NSViewComponentWithParent embeddedComponent;
1843
+ using HandleFormat = NSView*;
1844
+ #elif JUCE_LINUX || JUCE_BSD
1845
+ SharedResourcePointer<RunLoop> runLoop;
1846
+ XEmbedComponent embeddedComponent { true, false };
1847
+ using HandleFormat = Window;
1848
+ #else
1849
+ Component embeddedComponent;
1850
+ using HandleFormat = void*;
1851
+ #endif
1852
+
1853
+ HandleFormat pluginHandle = {};
1854
+ bool recursiveResize = false, isInOnSize = false, attachedCalled = false;
1855
+
1856
+ Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr;
1857
+ float nativeScaleFactor = 1.0f;
1858
+ float userScaleFactor = 1.0f;
1859
+
1860
+ struct ScaleNotifierCallback
1861
+ {
1862
+ VST3PluginWindow& window;
1863
+
1864
+ void operator() (float platformScale) const
1865
+ {
1866
+ MessageManager::callAsync ([ref = Component::SafePointer<VST3PluginWindow> (&window), platformScale]
1867
+ {
1868
+ if (auto* r = ref.getComponent())
1869
+ {
1870
+ r->nativeScaleFactor = platformScale;
1871
+ r->setContentScaleFactor();
1872
+ r->resizeToFit();
1873
+
1874
+ #if JUCE_WINDOWS
1875
+ r->embeddedComponent.updateHWNDBounds();
1876
+ #elif JUCE_LINUX || JUCE_BSD
1877
+ r->embeddedComponent.updateEmbeddedBounds();
1878
+ #endif
1879
+ }
1880
+ });
1881
+ }
1882
+ };
1883
+
1884
+ NativeScaleFactorNotifier scaleNotifier { this, ScaleNotifierCallback { *this } };
1885
+
1886
+ //==============================================================================
1887
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginWindow)
1888
+ };
1889
+
1890
+ JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996) // warning about overriding deprecated methods
1891
+
1892
+ //==============================================================================
1893
+ static bool hasARAExtension (IPluginFactory* pluginFactory, const String& pluginClassName)
1894
+ {
1895
+ bool result = false;
1896
+
1897
+ forEachARAFactory (pluginFactory,
1898
+ [&pluginClassName, &result] (const auto& pcClassInfo)
1899
+ {
1900
+ if (compareWithString (pcClassInfo.name, pluginClassName) == 0)
1901
+ {
1902
+ result = true;
1903
+
1904
+ return false;
1905
+ }
1906
+
1907
+ return true;
1908
+ });
1909
+
1910
+ return result;
1911
+ }
1912
+
1913
+ //==============================================================================
1914
+ struct VST3ComponentHolder
1915
+ {
1916
+ VST3ComponentHolder (const VST3ModuleHandle::Ptr& m) : module (m)
1917
+ {
1918
+ host = addVSTComSmartPtrOwner (new VST3HostContext());
1919
+ }
1920
+
1921
+ ~VST3ComponentHolder()
1922
+ {
1923
+ terminate();
1924
+ }
1925
+
1926
+ bool isIComponentAlsoIEditController() const
1927
+ {
1928
+ if (component == nullptr)
1929
+ {
1930
+ jassertfalse;
1931
+ return false;
1932
+ }
1933
+
1934
+ return VSTComSmartPtr<Vst::IEditController>().loadFrom (component.get());
1935
+ }
1936
+
1937
+ bool fetchController (VSTComSmartPtr<Vst::IEditController>& editController)
1938
+ {
1939
+ if (! isComponentInitialised && ! initialise())
1940
+ return false;
1941
+
1942
+ editController.loadFrom (component.get());
1943
+
1944
+ // Get the IEditController:
1945
+ TUID controllerCID = { 0 };
1946
+
1947
+ if (editController == nullptr
1948
+ && component->getControllerClassId (controllerCID) == kResultTrue
1949
+ && FUID (controllerCID).isValid())
1950
+ {
1951
+ editController.loadFrom (factory.get(), controllerCID);
1952
+ }
1953
+
1954
+ if (editController == nullptr)
1955
+ {
1956
+ // Try finding the IEditController the long way around:
1957
+ auto numClasses = factory->countClasses();
1958
+
1959
+ for (Steinberg::int32 i = 0; i < numClasses; ++i)
1960
+ {
1961
+ PClassInfo classInfo;
1962
+ factory->getClassInfo (i, &classInfo);
1963
+
1964
+ if (std::strcmp (classInfo.category, kVstComponentControllerClass) == 0)
1965
+ editController.loadFrom (factory.get(), classInfo.cid);
1966
+ }
1967
+ }
1968
+
1969
+ return (editController != nullptr);
1970
+ }
1971
+
1972
+ //==============================================================================
1973
+ void fillInPluginDescription (PluginDescription& description) const
1974
+ {
1975
+ jassert (module != nullptr && isComponentInitialised);
1976
+
1977
+ PFactoryInfo factoryInfo;
1978
+ factory->getFactoryInfo (&factoryInfo);
1979
+
1980
+ auto classIdx = getClassIndex (module->getName());
1981
+
1982
+ if (classIdx >= 0)
1983
+ {
1984
+ PClassInfo info;
1985
+ [[maybe_unused]] bool success = (factory->getClassInfo (classIdx, &info) == kResultOk);
1986
+ jassert (success);
1987
+
1988
+ VSTComSmartPtr<IPluginFactory2> pf2;
1989
+ VSTComSmartPtr<IPluginFactory3> pf3;
1990
+
1991
+ std::unique_ptr<PClassInfo2> info2;
1992
+ std::unique_ptr<PClassInfoW> infoW;
1993
+
1994
+ if (pf2.loadFrom (factory.get()))
1995
+ {
1996
+ info2.reset (new PClassInfo2());
1997
+ pf2->getClassInfo2 (classIdx, info2.get());
1998
+ }
1999
+ else
2000
+ {
2001
+ info2.reset();
2002
+ }
2003
+
2004
+ if (pf3.loadFrom (factory.get()))
2005
+ {
2006
+ pf3->setHostContext (host->getFUnknown());
2007
+ infoW.reset (new PClassInfoW());
2008
+ pf3->getClassInfoUnicode (classIdx, infoW.get());
2009
+ }
2010
+ else
2011
+ {
2012
+ infoW.reset();
2013
+ }
2014
+
2015
+ Vst::BusInfo bus;
2016
+ int totalNumInputChannels = 0, totalNumOutputChannels = 0;
2017
+
2018
+ int n = component->getBusCount (Vst::kAudio, Vst::kInput);
2019
+ for (int i = 0; i < n; ++i)
2020
+ if (component->getBusInfo (Vst::kAudio, Vst::kInput, i, bus) == kResultOk)
2021
+ totalNumInputChannels += ((bus.flags & Vst::BusInfo::kDefaultActive) != 0 ? bus.channelCount : 0);
2022
+
2023
+ n = component->getBusCount (Vst::kAudio, Vst::kOutput);
2024
+ for (int i = 0; i < n; ++i)
2025
+ if (component->getBusInfo (Vst::kAudio, Vst::kOutput, i, bus) == kResultOk)
2026
+ totalNumOutputChannels += ((bus.flags & Vst::BusInfo::kDefaultActive) != 0 ? bus.channelCount : 0);
2027
+
2028
+ createPluginDescription (description, module->getFile(),
2029
+ factoryInfo.vendor, module->getName(),
2030
+ info, info2.get(), infoW.get(),
2031
+ totalNumInputChannels,
2032
+ totalNumOutputChannels);
2033
+
2034
+ description.hasARAExtension = hasARAExtension (factory.get(), description.name);
2035
+
2036
+ return;
2037
+ }
2038
+
2039
+ jassertfalse;
2040
+ }
2041
+
2042
+ //==============================================================================
2043
+ bool initialise()
2044
+ {
2045
+ if (isComponentInitialised)
2046
+ return true;
2047
+
2048
+ // It's highly advisable to create your plugins using the message thread.
2049
+ // The VST3 spec requires that many of the functions called during
2050
+ // initialisation are only called from the message thread.
2051
+ JUCE_ASSERT_MESSAGE_THREAD
2052
+
2053
+ factory = addVSTComSmartPtrOwner (module->getPluginFactory());
2054
+
2055
+ int classIdx;
2056
+ if ((classIdx = getClassIndex (module->getName())) < 0)
2057
+ return false;
2058
+
2059
+ PClassInfo info;
2060
+ if (factory->getClassInfo (classIdx, &info) != kResultOk)
2061
+ return false;
2062
+
2063
+ if (! component.loadFrom (factory.get(), info.cid) || component == nullptr)
2064
+ return false;
2065
+
2066
+ cidOfComponent = FUID (info.cid);
2067
+
2068
+ if (warnOnFailure (component->initialize (host->getFUnknown())) != kResultOk)
2069
+ return false;
2070
+
2071
+ isComponentInitialised = true;
2072
+
2073
+ return true;
2074
+ }
2075
+
2076
+ void terminate()
2077
+ {
2078
+ if (isComponentInitialised)
2079
+ {
2080
+ component->terminate();
2081
+ isComponentInitialised = false;
2082
+ }
2083
+
2084
+ component = nullptr;
2085
+ }
2086
+
2087
+ //==============================================================================
2088
+ int getClassIndex (const String& className) const
2089
+ {
2090
+ PClassInfo info;
2091
+ const Steinberg::int32 numClasses = factory->countClasses();
2092
+
2093
+ for (Steinberg::int32 j = 0; j < numClasses; ++j)
2094
+ if (factory->getClassInfo (j, &info) == kResultOk
2095
+ && std::strcmp (info.category, kVstAudioEffectClass) == 0
2096
+ && toString (info.name).trim() == className)
2097
+ return j;
2098
+
2099
+ return -1;
2100
+ }
2101
+
2102
+ //==============================================================================
2103
+ VST3ModuleHandle::Ptr module;
2104
+ VSTComSmartPtr<IPluginFactory> factory;
2105
+ VSTComSmartPtr<VST3HostContext> host;
2106
+ VSTComSmartPtr<Vst::IComponent> component;
2107
+ FUID cidOfComponent;
2108
+
2109
+ bool isComponentInitialised = false;
2110
+ };
2111
+
2112
+ //==============================================================================
2113
+ /* A queue which can store up to one element.
2114
+
2115
+ This is more memory-efficient than storing large vectors of
2116
+ parameter changes that we'll just throw away.
2117
+ */
2118
+ class ParamValueQueue final : public Vst::IParamValueQueue
2119
+ {
2120
+ public:
2121
+ ParamValueQueue (Vst::ParamID idIn, Steinberg::int32 parameterIndexIn)
2122
+ : paramId (idIn), parameterIndex (parameterIndexIn) {}
2123
+
2124
+ virtual ~ParamValueQueue() = default;
2125
+
2126
+ JUCE_DECLARE_VST3_COM_REF_METHODS
2127
+ JUCE_DECLARE_VST3_COM_QUERY_METHODS
2128
+
2129
+ Vst::ParamID PLUGIN_API getParameterId() override { return paramId; }
2130
+
2131
+ Steinberg::int32 getParameterIndex() const noexcept { return parameterIndex; }
2132
+
2133
+ Steinberg::int32 PLUGIN_API getPointCount() override { return size; }
2134
+
2135
+ tresult PLUGIN_API getPoint (Steinberg::int32 index,
2136
+ Steinberg::int32& sampleOffset,
2137
+ Vst::ParamValue& value) override
2138
+ {
2139
+ if (! isPositiveAndBelow (index, size))
2140
+ return kResultFalse;
2141
+
2142
+ sampleOffset = 0;
2143
+ value = cachedValue;
2144
+
2145
+ return kResultTrue;
2146
+ }
2147
+
2148
+ tresult PLUGIN_API addPoint (Steinberg::int32,
2149
+ Vst::ParamValue value,
2150
+ Steinberg::int32& index) override
2151
+ {
2152
+ index = size++;
2153
+ set ((float) value);
2154
+
2155
+ return kResultTrue;
2156
+ }
2157
+
2158
+ void set (float valueIn)
2159
+ {
2160
+ cachedValue = valueIn;
2161
+ size = 1;
2162
+ }
2163
+
2164
+ void clear() { size = 0; }
2165
+
2166
+ float get() const noexcept
2167
+ {
2168
+ jassert (size > 0);
2169
+ return cachedValue;
2170
+ }
2171
+
2172
+ private:
2173
+ const Vst::ParamID paramId;
2174
+ const Steinberg::int32 parameterIndex;
2175
+ float cachedValue;
2176
+ Steinberg::int32 size = 0;
2177
+ Atomic<int> refCount;
2178
+ };
2179
+
2180
+ //==============================================================================
2181
+ /* An implementation of IParameterChanges with some important characteristics:
2182
+ - Lookup by index is O(1)
2183
+ - Lookup by paramID is also O(1)
2184
+ - addParameterData never allocates, as long you pass a paramID already passed to initialise
2185
+ */
2186
+ class ParameterChanges final : public Vst::IParameterChanges
2187
+ {
2188
+ static constexpr Steinberg::int32 notInVector = -1;
2189
+
2190
+ struct Entry
2191
+ {
2192
+ explicit Entry (std::unique_ptr<ParamValueQueue> queue) : ptr (addVSTComSmartPtrOwner (queue.release())) {}
2193
+
2194
+ VSTComSmartPtr<ParamValueQueue> ptr;
2195
+ Steinberg::int32 index = notInVector;
2196
+ };
2197
+
2198
+ using Map = std::unordered_map<Vst::ParamID, Entry>;
2199
+ using Queues = std::vector<Entry*>;
2200
+
2201
+ public:
2202
+ virtual ~ParameterChanges() = default;
2203
+
2204
+ JUCE_DECLARE_VST3_COM_REF_METHODS
2205
+ JUCE_DECLARE_VST3_COM_QUERY_METHODS
2206
+
2207
+ Steinberg::int32 PLUGIN_API getParameterCount() override
2208
+ {
2209
+ return (Steinberg::int32) queues.size();
2210
+ }
2211
+
2212
+ ParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override
2213
+ {
2214
+ if (isPositiveAndBelow (index, queues.size()))
2215
+ {
2216
+ auto& entry = queues[(size_t) index];
2217
+ // If this fails, our container has become internally inconsistent
2218
+ jassert (entry->index == index);
2219
+ return entry->ptr.get();
2220
+ }
2221
+
2222
+ return nullptr;
2223
+ }
2224
+
2225
+ ParamValueQueue* PLUGIN_API addParameterData (const Vst::ParamID& id,
2226
+ Steinberg::int32& index) override
2227
+ {
2228
+ const auto it = map.find (id);
2229
+
2230
+ if (it == map.end())
2231
+ return nullptr;
2232
+
2233
+ auto& result = it->second;
2234
+
2235
+ if (result.index == notInVector)
2236
+ {
2237
+ result.index = (Steinberg::int32) queues.size();
2238
+ queues.push_back (&result);
2239
+ }
2240
+
2241
+ index = result.index;
2242
+ return result.ptr.get();
2243
+ }
2244
+
2245
+ void set (Vst::ParamID id, float value)
2246
+ {
2247
+ Steinberg::int32 indexOut = notInVector;
2248
+
2249
+ if (auto* queue = addParameterData (id, indexOut))
2250
+ queue->set (value);
2251
+ }
2252
+
2253
+ void clear()
2254
+ {
2255
+ for (auto* item : queues)
2256
+ item->index = notInVector;
2257
+
2258
+ queues.clear();
2259
+ }
2260
+
2261
+ void initialise (const std::vector<Vst::ParamID>& idsIn)
2262
+ {
2263
+ for (const auto [index, id] : enumerate (idsIn))
2264
+ map.emplace (id, Entry { std::make_unique<ParamValueQueue> (id, (Steinberg::int32) index) });
2265
+
2266
+ queues.reserve (map.size());
2267
+ queues.clear();
2268
+ }
2269
+
2270
+ template <typename Callback>
2271
+ void forEach (Callback&& callback) const
2272
+ {
2273
+ for (const auto* item : queues)
2274
+ {
2275
+ auto* ptr = item->ptr.get();
2276
+ callback (ptr->getParameterIndex(), ptr->getParameterId(), ptr->get());
2277
+ }
2278
+ }
2279
+
2280
+ private:
2281
+ Map map;
2282
+ Queues queues;
2283
+ Atomic<int> refCount;
2284
+ };
2285
+
2286
+ //==============================================================================
2287
+ class VST3PluginInstance final : public AudioPluginInstance
2288
+ {
2289
+ public:
2290
+ //==============================================================================
2291
+ struct VST3Parameter final : public Parameter
2292
+ {
2293
+ VST3Parameter (VST3PluginInstance& parent, Steinberg::int32 vstParameterIndex)
2294
+ : pluginInstance (parent),
2295
+ vstParamIndex (vstParameterIndex)
2296
+ {
2297
+ }
2298
+
2299
+ float getValue() const override
2300
+ {
2301
+ return pluginInstance.cachedParamValues.get (vstParamIndex);
2302
+ }
2303
+
2304
+ /* The 'normal' setValue call, which will update both the processor and editor.
2305
+ */
2306
+ void setValue (float newValue) override
2307
+ {
2308
+ pluginInstance.cachedParamValues.set (vstParamIndex, newValue);
2309
+ pluginInstance.parameterDispatcher.push (vstParamIndex, newValue);
2310
+ }
2311
+
2312
+ /* If we're syncing the editor to the processor, the processor won't need to
2313
+ be notified about the parameter updates, so we can avoid flagging the
2314
+ change when updating the float cache.
2315
+ */
2316
+ void setValueWithoutUpdatingProcessor (float newValue)
2317
+ {
2318
+ if (! exactlyEqual (pluginInstance.cachedParamValues.exchangeWithoutNotifying (vstParamIndex, newValue), newValue))
2319
+ sendValueChangedMessageToListeners (newValue);
2320
+ }
2321
+
2322
+ String getText (float value, int maximumLength) const override
2323
+ {
2324
+ MessageManagerLock lock;
2325
+
2326
+ if (pluginInstance.editController != nullptr)
2327
+ {
2328
+ Vst::String128 result;
2329
+
2330
+ if (pluginInstance.editController->getParamStringByValue (cachedInfo.id, value, result) == kResultOk)
2331
+ return toString (result).substring (0, maximumLength);
2332
+ }
2333
+
2334
+ return Parameter::getText (value, maximumLength);
2335
+ }
2336
+
2337
+ float getValueForText (const String& text) const override
2338
+ {
2339
+ MessageManagerLock lock;
2340
+
2341
+ if (pluginInstance.editController != nullptr)
2342
+ {
2343
+ Vst::ParamValue result;
2344
+
2345
+ if (pluginInstance.editController->getParamValueByString (cachedInfo.id, toString (text), result) == kResultOk)
2346
+ return (float) result;
2347
+ }
2348
+
2349
+ return Parameter::getValueForText (text);
2350
+ }
2351
+
2352
+ float getDefaultValue() const override
2353
+ {
2354
+ return (float) cachedInfo.defaultNormalizedValue;
2355
+ }
2356
+
2357
+ String getName (int /*maximumStringLength*/) const override
2358
+ {
2359
+ return toString (cachedInfo.title);
2360
+ }
2361
+
2362
+ String getLabel() const override
2363
+ {
2364
+ return toString (cachedInfo.units);
2365
+ }
2366
+
2367
+ bool isAutomatable() const override
2368
+ {
2369
+ return (cachedInfo.flags & Vst::ParameterInfo::kCanAutomate) != 0;
2370
+ }
2371
+
2372
+ bool isDiscrete() const override
2373
+ {
2374
+ return getNumSteps() != AudioProcessor::getDefaultNumParameterSteps();
2375
+ }
2376
+
2377
+ int getNumSteps() const override
2378
+ {
2379
+ const auto stepCount = cachedInfo.stepCount;
2380
+ return stepCount == 0 ? AudioProcessor::getDefaultNumParameterSteps()
2381
+ : stepCount + 1;
2382
+ }
2383
+
2384
+ StringArray getAllValueStrings() const override
2385
+ {
2386
+ return {};
2387
+ }
2388
+
2389
+ String getParameterID() const override
2390
+ {
2391
+ return String (cachedInfo.id);
2392
+ }
2393
+
2394
+ Steinberg::Vst::ParamID getParamID() const noexcept { return cachedInfo.id; }
2395
+
2396
+ void updateCachedInfo()
2397
+ {
2398
+ cachedInfo = fetchParameterInfo();
2399
+ }
2400
+
2401
+ Vst::ParameterInfo getParameterInfo() const
2402
+ {
2403
+ return cachedInfo;
2404
+ }
2405
+
2406
+ private:
2407
+ Vst::ParameterInfo fetchParameterInfo() const
2408
+ {
2409
+ JUCE_ASSERT_MESSAGE_THREAD
2410
+ return pluginInstance.getParameterInfoForIndex (vstParamIndex);
2411
+ }
2412
+
2413
+ VST3PluginInstance& pluginInstance;
2414
+ const Steinberg::int32 vstParamIndex;
2415
+ Vst::ParameterInfo cachedInfo = fetchParameterInfo();
2416
+ };
2417
+
2418
+ //==============================================================================
2419
+ explicit VST3PluginInstance (std::unique_ptr<VST3ComponentHolder> componentHolder)
2420
+ : AudioPluginInstance (getBusProperties (componentHolder->component)),
2421
+ holder (std::move (componentHolder))
2422
+ {
2423
+ jassert (holder->isComponentInitialised);
2424
+ holder->host->setPlugin (this);
2425
+ }
2426
+
2427
+ ~VST3PluginInstance() override
2428
+ {
2429
+ callOnMessageThread ([this] { cleanup(); });
2430
+ }
2431
+
2432
+ void cleanup()
2433
+ {
2434
+ jassert (getActiveEditor() == nullptr); // You must delete any editors before deleting the plugin instance!
2435
+
2436
+ releaseResources();
2437
+
2438
+ if (editControllerConnection != nullptr && componentConnection != nullptr)
2439
+ {
2440
+ editControllerConnection->disconnect (componentConnection.get());
2441
+ componentConnection->disconnect (editControllerConnection.get());
2442
+ }
2443
+
2444
+ editController->setComponentHandler (nullptr);
2445
+
2446
+ if (isControllerInitialised && ! holder->isIComponentAlsoIEditController())
2447
+ editController->terminate();
2448
+
2449
+ holder->terminate();
2450
+
2451
+ componentConnection = nullptr;
2452
+ editControllerConnection = nullptr;
2453
+ unitData = nullptr;
2454
+ unitInfo = nullptr;
2455
+ programListData = nullptr;
2456
+ componentHandler2 = nullptr;
2457
+ componentHandler = nullptr;
2458
+ processor = nullptr;
2459
+ midiMapping = nullptr;
2460
+ editController2 = nullptr;
2461
+ editController = nullptr;
2462
+ }
2463
+
2464
+ //==============================================================================
2465
+ bool initialise()
2466
+ {
2467
+ // It's highly advisable to create your plugins using the message thread.
2468
+ // The VST3 spec requires that many of the functions called during
2469
+ // initialisation are only called from the message thread.
2470
+ JUCE_ASSERT_MESSAGE_THREAD
2471
+
2472
+ if (! holder->initialise())
2473
+ return false;
2474
+
2475
+ if (! (isControllerInitialised || holder->fetchController (editController)))
2476
+ return false;
2477
+
2478
+ // If the IComponent and IEditController are the same, we will have
2479
+ // already initialized the object at this point and should avoid doing so again.
2480
+ if (! holder->isIComponentAlsoIEditController())
2481
+ editController->initialize (holder->host->getFUnknown());
2482
+
2483
+ isControllerInitialised = true;
2484
+ editController->setComponentHandler (holder->host.get());
2485
+ grabInformationObjects();
2486
+ interconnectComponentAndController();
2487
+
2488
+ auto configureParameters = [this]
2489
+ {
2490
+ initialiseParameterList();
2491
+ synchroniseStates();
2492
+ syncProgramNames();
2493
+ };
2494
+
2495
+ configureParameters();
2496
+ setupIO();
2497
+
2498
+ // Some plug-ins don't present their parameters until after the IO has been
2499
+ // configured, so we need to jump though all these hoops again
2500
+ if (getParameters().isEmpty() && editController->getParameterCount() > 0)
2501
+ configureParameters();
2502
+
2503
+ updateMidiMappings();
2504
+
2505
+ parameterDispatcher.start (*editController);
2506
+
2507
+ return true;
2508
+ }
2509
+
2510
+ void getExtensions (ExtensionsVisitor& visitor) const override
2511
+ {
2512
+ struct Extensions final : public ExtensionsVisitor::VST3Client,
2513
+ public ExtensionsVisitor::ARAClient
2514
+ {
2515
+ explicit Extensions (const VST3PluginInstance* instanceIn) : instance (instanceIn) {}
2516
+
2517
+ Steinberg::Vst::IComponent* getIComponentPtr() const noexcept override { return instance->holder->component.get(); }
2518
+
2519
+ MemoryBlock getPreset() const override { return instance->getStateForPresetFile(); }
2520
+
2521
+ bool setPreset (const MemoryBlock& rawData) const override
2522
+ {
2523
+ return instance->setStateFromPresetFile (rawData);
2524
+ }
2525
+
2526
+ void createARAFactoryAsync (std::function<void (ARAFactoryWrapper)> cb) const noexcept override
2527
+ {
2528
+ cb (ARAFactoryWrapper { ::juce::getARAFactory (*(instance->holder->module)) });
2529
+ }
2530
+
2531
+ const VST3PluginInstance* instance = nullptr;
2532
+ };
2533
+
2534
+ Extensions extensions { this };
2535
+ visitor.visitVST3Client (extensions);
2536
+
2537
+ if (::juce::getARAFactory (*(holder->module)))
2538
+ {
2539
+ visitor.visitARAClient (extensions);
2540
+ }
2541
+ }
2542
+
2543
+ void* getPlatformSpecificData() override { return holder->component.get(); }
2544
+
2545
+ void updateMidiMappings()
2546
+ {
2547
+ // MIDI mappings will always be updated on the main thread, but we need to ensure
2548
+ // that we're not simultaneously reading them on the audio thread.
2549
+ const SpinLock::ScopedLockType processLock (processMutex);
2550
+
2551
+ if (midiMapping != nullptr)
2552
+ storedMidiMapping.storeMappings (*midiMapping);
2553
+ }
2554
+
2555
+ //==============================================================================
2556
+ const String getName() const override
2557
+ {
2558
+ auto& module = holder->module;
2559
+ return module != nullptr ? module->getName() : String();
2560
+ }
2561
+
2562
+ std::vector<Vst::SpeakerArrangement> getActualArrangements (bool isInput) const
2563
+ {
2564
+ std::vector<Vst::SpeakerArrangement> result;
2565
+
2566
+ const auto numBuses = getBusCount (isInput);
2567
+
2568
+ for (auto i = 0; i < numBuses; ++i)
2569
+ result.push_back (getArrangementForBus (processor.get(), isInput, i));
2570
+
2571
+ return result;
2572
+ }
2573
+
2574
+ std::optional<std::vector<Vst::SpeakerArrangement>> busLayoutsToArrangements (bool isInput) const
2575
+ {
2576
+ std::vector<Vst::SpeakerArrangement> result;
2577
+
2578
+ const auto numBuses = getBusCount (isInput);
2579
+
2580
+ for (auto i = 0; i < numBuses; ++i)
2581
+ {
2582
+ if (const auto arr = getVst3SpeakerArrangement (getBus (isInput, i)->getLastEnabledLayout()))
2583
+ result.push_back (*arr);
2584
+ else
2585
+ return {};
2586
+ }
2587
+
2588
+ return result;
2589
+ }
2590
+
2591
+ void prepareToPlay (double newSampleRate, int estimatedSamplesPerBlock) override
2592
+ {
2593
+ // The VST3 spec requires that IComponent::setupProcessing() is called on the message
2594
+ // thread. If you call it from a different thread, some plugins may break.
2595
+ JUCE_ASSERT_MESSAGE_THREAD
2596
+ MessageManagerLock lock;
2597
+
2598
+ const SpinLock::ScopedLockType processLock (processMutex);
2599
+
2600
+ // Avoid redundantly calling things like setActive, which can be a heavy-duty call for some plugins:
2601
+ if (isActive
2602
+ && approximatelyEqual (getSampleRate(), newSampleRate)
2603
+ && getBlockSize() == estimatedSamplesPerBlock)
2604
+ return;
2605
+
2606
+ using namespace Vst;
2607
+
2608
+ // If the plugin has already been activated (prepareToPlay has been called twice without
2609
+ // a matching releaseResources call) deactivate it so that the speaker layout and bus
2610
+ // activation can be updated safely.
2611
+ deactivate();
2612
+
2613
+ ProcessSetup setup;
2614
+ setup.symbolicSampleSize = isUsingDoublePrecision() ? kSample64 : kSample32;
2615
+ setup.maxSamplesPerBlock = estimatedSamplesPerBlock;
2616
+ setup.sampleRate = newSampleRate;
2617
+ setup.processMode = isNonRealtime() ? kOffline : kRealtime;
2618
+
2619
+ warnOnFailure (processor->setupProcessing (setup));
2620
+
2621
+ holder->initialise();
2622
+
2623
+ auto inArrangements = busLayoutsToArrangements (true) .value_or (std::vector<SpeakerArrangement>{});
2624
+ auto outArrangements = busLayoutsToArrangements (false).value_or (std::vector<SpeakerArrangement>{});
2625
+
2626
+ // Some plug-ins will crash if you pass a nullptr to setBusArrangements!
2627
+ SpeakerArrangement nullArrangement = {};
2628
+ auto* inData = inArrangements .empty() ? &nullArrangement : inArrangements .data();
2629
+ auto* outData = outArrangements.empty() ? &nullArrangement : outArrangements.data();
2630
+
2631
+ warnOnFailure (processor->setBusArrangements (inData, static_cast<int32> (inArrangements .size()),
2632
+ outData, static_cast<int32> (outArrangements.size())));
2633
+
2634
+ const auto inArrActual = getActualArrangements (true);
2635
+ const auto outArrActual = getActualArrangements (false);
2636
+
2637
+ jassert (inArrActual == inArrangements && outArrActual == outArrangements);
2638
+
2639
+ // Needed for having the same sample rate in processBlock(); some plugins need this!
2640
+ setRateAndBufferSizeDetails (newSampleRate, estimatedSamplesPerBlock);
2641
+
2642
+ auto numInputBuses = getBusCount (true);
2643
+ auto numOutputBuses = getBusCount (false);
2644
+
2645
+ for (int i = 0; i < numInputBuses; ++i)
2646
+ warnOnFailure (holder->component->activateBus (Vst::kAudio, Vst::kInput, i, getBus (true, i)->isEnabled() ? 1 : 0));
2647
+
2648
+ for (int i = 0; i < numOutputBuses; ++i)
2649
+ warnOnFailure (holder->component->activateBus (Vst::kAudio, Vst::kOutput, i, getBus (false, i)->isEnabled() ? 1 : 0));
2650
+
2651
+ setLatencySamples (jmax (0, (int) processor->getLatencySamples()));
2652
+
2653
+ inputBusMap .prepare (createChannelMappings (true));
2654
+ outputBusMap.prepare (createChannelMappings (false));
2655
+
2656
+ setStateForAllMidiBuses (true);
2657
+
2658
+ warnOnFailure (holder->component->setActive (true));
2659
+ warnOnFailureIfImplemented (processor->setProcessing (true));
2660
+
2661
+ isActive = true;
2662
+ }
2663
+
2664
+ void releaseResources() override
2665
+ {
2666
+ const SpinLock::ScopedLockType lock (processMutex);
2667
+ deactivate();
2668
+ }
2669
+
2670
+ bool supportsDoublePrecisionProcessing() const override
2671
+ {
2672
+ return (processor->canProcessSampleSize (Vst::kSample64) == kResultTrue);
2673
+ }
2674
+
2675
+ //==============================================================================
2676
+ /* Important: It is strongly recommended to use this function if you need to
2677
+ find the JUCE parameter corresponding to a particular IEditController
2678
+ parameter.
2679
+
2680
+ Note that a parameter at a given index in the IEditController does not
2681
+ necessarily correspond to the parameter at the same index in
2682
+ AudioProcessor::getParameters().
2683
+ */
2684
+ VST3Parameter* getParameterForID (Vst::ParamID paramID) const
2685
+ {
2686
+ const auto it = idToParamMap.find (paramID);
2687
+ return it != idToParamMap.end() ? it->second : nullptr;
2688
+ }
2689
+
2690
+ //==============================================================================
2691
+ void processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages) override
2692
+ {
2693
+ jassert (! isUsingDoublePrecision());
2694
+
2695
+ const SpinLock::ScopedLockType processLock (processMutex);
2696
+
2697
+ if (isActive && processor != nullptr)
2698
+ processAudio (buffer, midiMessages, Vst::kSample32, false);
2699
+ }
2700
+
2701
+ void processBlock (AudioBuffer<double>& buffer, MidiBuffer& midiMessages) override
2702
+ {
2703
+ jassert (isUsingDoublePrecision());
2704
+
2705
+ const SpinLock::ScopedLockType processLock (processMutex);
2706
+
2707
+ if (isActive && processor != nullptr)
2708
+ processAudio (buffer, midiMessages, Vst::kSample64, false);
2709
+ }
2710
+
2711
+ void processBlockBypassed (AudioBuffer<float>& buffer, MidiBuffer& midiMessages) override
2712
+ {
2713
+ jassert (! isUsingDoublePrecision());
2714
+
2715
+ const SpinLock::ScopedLockType processLock (processMutex);
2716
+
2717
+ if (bypassParam != nullptr)
2718
+ {
2719
+ if (isActive && processor != nullptr)
2720
+ processAudio (buffer, midiMessages, Vst::kSample32, true);
2721
+ }
2722
+ else
2723
+ {
2724
+ AudioProcessor::processBlockBypassed (buffer, midiMessages);
2725
+ }
2726
+ }
2727
+
2728
+ void processBlockBypassed (AudioBuffer<double>& buffer, MidiBuffer& midiMessages) override
2729
+ {
2730
+ jassert (isUsingDoublePrecision());
2731
+
2732
+ const SpinLock::ScopedLockType processLock (processMutex);
2733
+
2734
+ if (bypassParam != nullptr)
2735
+ {
2736
+ if (isActive && processor != nullptr)
2737
+ processAudio (buffer, midiMessages, Vst::kSample64, true);
2738
+ }
2739
+ else
2740
+ {
2741
+ AudioProcessor::processBlockBypassed (buffer, midiMessages);
2742
+ }
2743
+ }
2744
+
2745
+ //==============================================================================
2746
+ template <typename FloatType>
2747
+ void processAudio (AudioBuffer<FloatType>& buffer, MidiBuffer& midiMessages,
2748
+ Vst::SymbolicSampleSizes sampleSize, bool isProcessBlockBypassedCall)
2749
+ {
2750
+ using namespace Vst;
2751
+ auto numSamples = buffer.getNumSamples();
2752
+
2753
+ auto numInputAudioBuses = getBusCount (true);
2754
+ auto numOutputAudioBuses = getBusCount (false);
2755
+
2756
+ updateBypass (isProcessBlockBypassedCall);
2757
+
2758
+ ProcessData data;
2759
+ data.processMode = isNonRealtime() ? kOffline : kRealtime;
2760
+ data.symbolicSampleSize = sampleSize;
2761
+ data.numInputs = numInputAudioBuses;
2762
+ data.numOutputs = numOutputAudioBuses;
2763
+ data.inputParameterChanges = inputParameterChanges.get();
2764
+ data.outputParameterChanges = outputParameterChanges.get();
2765
+ data.numSamples = (Steinberg::int32) numSamples;
2766
+
2767
+ updateTimingInformation (data, getSampleRate());
2768
+
2769
+ for (int i = getTotalNumInputChannels(); i < buffer.getNumChannels(); ++i)
2770
+ buffer.clear (i, 0, numSamples);
2771
+
2772
+ inputParameterChanges->clear();
2773
+ outputParameterChanges->clear();
2774
+
2775
+ associateWith (data, buffer);
2776
+ associateWith (data, midiMessages);
2777
+
2778
+ cachedParamValues.ifSet ([&] (Steinberg::int32 index, float value)
2779
+ {
2780
+ inputParameterChanges->set (cachedParamValues.getParamID (index), value);
2781
+ });
2782
+
2783
+ processor->process (data);
2784
+
2785
+ outputParameterChanges->forEach ([&] (Steinberg::int32 vstParamIndex, Vst::ParamID id, float value)
2786
+ {
2787
+ // Send the parameter value from the processor to the editor
2788
+ parameterDispatcher.push (vstParamIndex, value);
2789
+
2790
+ // Update the host's parameter value
2791
+ if (auto* param = getParameterForID (id))
2792
+ param->setValueWithoutUpdatingProcessor (value);
2793
+ });
2794
+
2795
+ midiMessages.clear();
2796
+ MidiEventList::toMidiBuffer (midiMessages, *midiOutputs);
2797
+ }
2798
+
2799
+ //==============================================================================
2800
+ bool canAddBus (bool) const override { return false; }
2801
+ bool canRemoveBus (bool) const override { return false; }
2802
+
2803
+ bool isBusesLayoutSupported (const BusesLayout& layouts) const override
2804
+ {
2805
+ const SpinLock::ScopedLockType processLock (processMutex);
2806
+
2807
+ // if the processor is not active, we ask the underlying plug-in if the
2808
+ // layout is actually supported
2809
+ if (! isActive)
2810
+ return canApplyBusesLayout (layouts);
2811
+
2812
+ // not much we can do to check the layout while the audio processor is running
2813
+ // Let's at least check if it is a VST3 compatible layout
2814
+ for (const auto isInput : { true, false })
2815
+ {
2816
+ auto n = getBusCount (isInput);
2817
+
2818
+ for (int i = 0; i < n; ++i)
2819
+ if (getChannelLayoutOfBus (isInput, i).isDiscreteLayout())
2820
+ return false;
2821
+ }
2822
+
2823
+ return true;
2824
+ }
2825
+
2826
+ bool syncBusLayouts (const BusesLayout& layouts) const
2827
+ {
2828
+ for (const auto isInput : { true, false })
2829
+ {
2830
+ auto n = getBusCount (isInput);
2831
+ const Vst::BusDirection vstDir = (isInput ? Vst::kInput : Vst::kOutput);
2832
+
2833
+ for (int busIdx = 0; busIdx < n; ++busIdx)
2834
+ {
2835
+ const bool isEnabled = (! layouts.getChannelSet (isInput, busIdx).isDisabled());
2836
+
2837
+ if (holder->component->activateBus (Vst::kAudio, vstDir, busIdx, (isEnabled ? 1 : 0)) != kResultOk)
2838
+ return false;
2839
+ }
2840
+ }
2841
+
2842
+ const auto getPotentialArrangements = [&] (bool isInput) -> std::optional<std::vector<Vst::SpeakerArrangement>>
2843
+ {
2844
+ std::vector<Vst::SpeakerArrangement> result;
2845
+
2846
+ for (int i = 0; i < layouts.getBuses (isInput).size(); ++i)
2847
+ {
2848
+ const auto& requested = layouts.getChannelSet (isInput, i);
2849
+
2850
+ if (const auto arr = getVst3SpeakerArrangement (requested.isDisabled() ? getBus (isInput, i)->getLastEnabledLayout() : requested))
2851
+ result.push_back (*arr);
2852
+ else
2853
+ return {};
2854
+ }
2855
+
2856
+ return result;
2857
+ };
2858
+
2859
+ auto inArrangements = getPotentialArrangements (true);
2860
+ auto outArrangements = getPotentialArrangements (false);
2861
+
2862
+ if (! inArrangements.has_value() || ! outArrangements.has_value())
2863
+ {
2864
+ // This bus layout can't be represented as a VST3 speaker arrangement
2865
+ return false;
2866
+ }
2867
+
2868
+ auto& inputArrangements = *inArrangements;
2869
+ auto& outputArrangements = *outArrangements;
2870
+
2871
+ // Some plug-ins will crash if you pass a nullptr to setBusArrangements!
2872
+ Vst::SpeakerArrangement nullArrangement = {};
2873
+ auto* inputArrangementData = inputArrangements .empty() ? &nullArrangement : inputArrangements .data();
2874
+ auto* outputArrangementData = outputArrangements.empty() ? &nullArrangement : outputArrangements.data();
2875
+
2876
+ if (processor->setBusArrangements (inputArrangementData, static_cast<int32> (inputArrangements .size()),
2877
+ outputArrangementData, static_cast<int32> (outputArrangements.size())) != kResultTrue)
2878
+ return false;
2879
+
2880
+ // check if the layout matches the request
2881
+ const auto inArrActual = getActualArrangements (true);
2882
+ const auto outArrActual = getActualArrangements (false);
2883
+
2884
+ return (inArrActual == inputArrangements && outArrActual == outputArrangements);
2885
+ }
2886
+
2887
+ bool canApplyBusesLayout (const BusesLayout& layouts) const override
2888
+ {
2889
+ // someone tried to change the layout while the AudioProcessor is running
2890
+ // call releaseResources first!
2891
+ jassert (! isActive);
2892
+
2893
+ const auto previousLayout = getBusesLayout();
2894
+ const auto result = syncBusLayouts (layouts);
2895
+ syncBusLayouts (previousLayout);
2896
+ return result;
2897
+ }
2898
+
2899
+ //==============================================================================
2900
+ void updateTrackProperties (const TrackProperties& properties) override
2901
+ {
2902
+ if (trackInfoListener != nullptr)
2903
+ {
2904
+ auto l = addVSTComSmartPtrOwner (new TrackPropertiesAttributeList (properties));
2905
+ trackInfoListener->setChannelContextInfos (l.get());
2906
+ }
2907
+ }
2908
+
2909
+ struct TrackPropertiesAttributeList final : public Vst::IAttributeList
2910
+ {
2911
+ TrackPropertiesAttributeList (const TrackProperties& properties) : props (properties) {}
2912
+ virtual ~TrackPropertiesAttributeList() {}
2913
+
2914
+ JUCE_DECLARE_VST3_COM_REF_METHODS
2915
+
2916
+ tresult PLUGIN_API queryInterface (const TUID queryIid, void** obj) override
2917
+ {
2918
+ return testForMultiple (*this,
2919
+ queryIid,
2920
+ UniqueBase<Vst::IAttributeList>{},
2921
+ SharedBase<FUnknown, Vst::IAttributeList>{}).extract (obj);
2922
+ }
2923
+
2924
+ tresult PLUGIN_API setInt (AttrID, Steinberg::int64) override { return kOutOfMemory; }
2925
+ tresult PLUGIN_API setFloat (AttrID, double) override { return kOutOfMemory; }
2926
+ tresult PLUGIN_API setString (AttrID, const Vst::TChar*) override { return kOutOfMemory; }
2927
+ tresult PLUGIN_API setBinary (AttrID, const void*, Steinberg::uint32) override { return kOutOfMemory; }
2928
+ tresult PLUGIN_API getFloat (AttrID, double&) override { return kResultFalse; }
2929
+ tresult PLUGIN_API getBinary (AttrID, const void*&, Steinberg::uint32&) override { return kResultFalse; }
2930
+
2931
+ tresult PLUGIN_API getString (AttrID id, Vst::TChar* string, Steinberg::uint32 size) override
2932
+ {
2933
+ if (! std::strcmp (id, Vst::ChannelContext::kChannelNameKey))
2934
+ {
2935
+ Steinberg::String str (props.name.toRawUTF8());
2936
+ str.copyTo (string, 0, (Steinberg::int32) jmin (size, (Steinberg::uint32) std::numeric_limits<Steinberg::int32>::max()));
2937
+
2938
+ return kResultTrue;
2939
+ }
2940
+
2941
+ return kResultFalse;
2942
+ }
2943
+
2944
+ tresult PLUGIN_API getInt (AttrID id, Steinberg::int64& value) override
2945
+ {
2946
+ if (! std::strcmp (Vst::ChannelContext::kChannelNameLengthKey, id)) value = props.name.length();
2947
+ else if (! std::strcmp (Vst::ChannelContext::kChannelColorKey, id)) value = static_cast<Steinberg::int64> (props.colour.getARGB());
2948
+ else return kResultFalse;
2949
+
2950
+ return kResultTrue;
2951
+ }
2952
+
2953
+ Atomic<int> refCount;
2954
+ TrackProperties props;
2955
+
2956
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TrackPropertiesAttributeList)
2957
+ };
2958
+
2959
+ //==============================================================================
2960
+ String getChannelName (int channelIndex, Direction direction) const
2961
+ {
2962
+ auto numBuses = getNumSingleDirectionBusesFor (holder->component.get(), MediaKind::audio, direction);
2963
+
2964
+ int numCountedChannels = 0;
2965
+
2966
+ for (int i = 0; i < numBuses; ++i)
2967
+ {
2968
+ auto busInfo = getBusInfo (MediaKind::audio, direction, i);
2969
+
2970
+ numCountedChannels += busInfo.channelCount;
2971
+
2972
+ if (channelIndex < numCountedChannels)
2973
+ return toString (busInfo.name);
2974
+ }
2975
+
2976
+ return {};
2977
+ }
2978
+
2979
+ const String getInputChannelName (int channelIndex) const override { return getChannelName (channelIndex, Direction::input); }
2980
+ const String getOutputChannelName (int channelIndex) const override { return getChannelName (channelIndex, Direction::output); }
2981
+
2982
+ bool isInputChannelStereoPair (int channelIndex) const override
2983
+ {
2984
+ int busIdx;
2985
+ return getOffsetInBusBufferForAbsoluteChannelIndex (true, channelIndex, busIdx) >= 0
2986
+ && getBusInfo (MediaKind::audio, Direction::input, busIdx).channelCount == 2;
2987
+ }
2988
+
2989
+ bool isOutputChannelStereoPair (int channelIndex) const override
2990
+ {
2991
+ int busIdx;
2992
+ return getOffsetInBusBufferForAbsoluteChannelIndex (false, channelIndex, busIdx) >= 0
2993
+ && getBusInfo (MediaKind::audio, Direction::output, busIdx).channelCount == 2;
2994
+ }
2995
+
2996
+ bool acceptsMidi() const override { return hasMidiInput; }
2997
+ bool producesMidi() const override { return hasMidiOutput; }
2998
+
2999
+ //==============================================================================
3000
+ AudioProcessorParameter* getBypassParameter() const override { return bypassParam; }
3001
+
3002
+ //==============================================================================
3003
+ /** May return a negative value as a means of informing us that the plugin has "infinite tail," or 0 for "no tail." */
3004
+ double getTailLengthSeconds() const override
3005
+ {
3006
+ if (processor != nullptr)
3007
+ {
3008
+ auto sampleRate = getSampleRate();
3009
+
3010
+ if (sampleRate > 0.0)
3011
+ {
3012
+ auto tailSamples = processor->getTailSamples();
3013
+
3014
+ if (tailSamples == Vst::kInfiniteTail)
3015
+ return std::numeric_limits<double>::infinity();
3016
+
3017
+ return jlimit (0, 0x7fffffff, (int) processor->getTailSamples()) / sampleRate;
3018
+ }
3019
+ }
3020
+
3021
+ return 0.0;
3022
+ }
3023
+
3024
+ //==============================================================================
3025
+ AudioProcessorEditor* createEditor() override
3026
+ {
3027
+ if (auto view = becomeVSTComSmartPtrOwner (tryCreatingView()))
3028
+ return new VST3PluginWindow (this, view);
3029
+
3030
+ return nullptr;
3031
+ }
3032
+
3033
+ bool hasEditor() const override
3034
+ {
3035
+ // (if possible, avoid creating a second instance of the editor, because that crashes some plugins)
3036
+ if (getActiveEditor() != nullptr)
3037
+ return true;
3038
+
3039
+ auto view = becomeVSTComSmartPtrOwner (tryCreatingView());
3040
+ return view != nullptr;
3041
+ }
3042
+
3043
+ //==============================================================================
3044
+ int getNumPrograms() override { return programNames.size(); }
3045
+ const String getProgramName (int index) override { return index >= 0 ? programNames[index] : String(); }
3046
+ void changeProgramName (int, const String&) override {}
3047
+
3048
+ int getCurrentProgram() override
3049
+ {
3050
+ if (programNames.size() > 0 && editController != nullptr)
3051
+ if (auto* param = getParameterForID (programParameterID))
3052
+ return jmax (0, roundToInt (param->getValue() * (float) (programNames.size() - 1)));
3053
+
3054
+ return 0;
3055
+ }
3056
+
3057
+ void setCurrentProgram (int program) override
3058
+ {
3059
+ if (programNames.size() > 0 && editController != nullptr)
3060
+ {
3061
+ auto value = static_cast<Vst::ParamValue> (program) / static_cast<Vst::ParamValue> (jmax (1, programNames.size() - 1));
3062
+
3063
+ if (auto* param = getParameterForID (programParameterID))
3064
+ param->setValueNotifyingHost ((float) value);
3065
+ }
3066
+ }
3067
+
3068
+ //==============================================================================
3069
+ void reset() override
3070
+ {
3071
+ const SpinLock::ScopedLockType lock (processMutex);
3072
+
3073
+ if (holder->component != nullptr && processor != nullptr)
3074
+ {
3075
+ processor->setProcessing (false);
3076
+ holder->component->setActive (false);
3077
+
3078
+ holder->component->setActive (true);
3079
+ processor->setProcessing (true);
3080
+ }
3081
+ }
3082
+
3083
+ //==============================================================================
3084
+ void getStateInformation (MemoryBlock& destData) override
3085
+ {
3086
+ // The VST3 plugin format requires that get/set state calls are made
3087
+ // from the message thread.
3088
+ // We'll lock the message manager here as a safety precaution, but some
3089
+ // plugins may still misbehave!
3090
+
3091
+ JUCE_ASSERT_MESSAGE_THREAD
3092
+ MessageManagerLock lock;
3093
+
3094
+ parameterDispatcher.flush();
3095
+
3096
+ XmlElement state ("VST3PluginState");
3097
+
3098
+ appendStateFrom (state, holder->component, "IComponent");
3099
+ appendStateFrom (state, editController, "IEditController");
3100
+
3101
+ AudioProcessor::copyXmlToBinary (state, destData);
3102
+ }
3103
+
3104
+ void setStateInformation (const void* data, int sizeInBytes) override
3105
+ {
3106
+ // The VST3 plugin format requires that get/set state calls are made
3107
+ // from the message thread.
3108
+ // We'll lock the message manager here as a safety precaution, but some
3109
+ // plugins may still misbehave!
3110
+
3111
+ JUCE_ASSERT_MESSAGE_THREAD
3112
+ MessageManagerLock lock;
3113
+
3114
+ parameterDispatcher.flush();
3115
+
3116
+ if (auto head = AudioProcessor::getXmlFromBinary (data, sizeInBytes))
3117
+ {
3118
+ auto componentStream (createMemoryStreamForState (*head, "IComponent"));
3119
+
3120
+ if (componentStream != nullptr && holder->component != nullptr)
3121
+ holder->component->setState (componentStream.get());
3122
+
3123
+ if (editController != nullptr)
3124
+ {
3125
+ if (componentStream != nullptr)
3126
+ {
3127
+ Steinberg::int64 result;
3128
+ componentStream->seek (0, IBStream::kIBSeekSet, &result);
3129
+ setComponentStateAndResetParameters (*componentStream);
3130
+ }
3131
+
3132
+ auto controllerStream (createMemoryStreamForState (*head, "IEditController"));
3133
+
3134
+ if (controllerStream != nullptr)
3135
+ editController->setState (controllerStream.get());
3136
+ }
3137
+ }
3138
+ }
3139
+
3140
+ void setComponentStateAndResetParameters (Steinberg::MemoryStream& stream)
3141
+ {
3142
+ jassert (editController != nullptr);
3143
+
3144
+ warnOnFailureIfImplemented (editController->setComponentState (&stream));
3145
+ resetParameters();
3146
+ }
3147
+
3148
+ void resetParameters()
3149
+ {
3150
+ for (auto* parameter : getParameters())
3151
+ {
3152
+ auto* vst3Param = static_cast<VST3Parameter*> (parameter);
3153
+ const auto value = (float) editController->getParamNormalized (vst3Param->getParamID());
3154
+ vst3Param->setValueWithoutUpdatingProcessor (value);
3155
+ }
3156
+ }
3157
+
3158
+ MemoryBlock getStateForPresetFile() const
3159
+ {
3160
+ auto memoryStream = becomeVSTComSmartPtrOwner (new Steinberg::MemoryStream());
3161
+
3162
+ if (memoryStream == nullptr || holder->component == nullptr)
3163
+ return {};
3164
+
3165
+ const auto saved = Steinberg::Vst::PresetFile::savePreset (memoryStream.get(),
3166
+ holder->cidOfComponent,
3167
+ holder->component.get(),
3168
+ editController.get());
3169
+
3170
+ if (saved)
3171
+ return { memoryStream->getData(), static_cast<size_t> (memoryStream->getSize()) };
3172
+
3173
+ return {};
3174
+ }
3175
+
3176
+ bool setStateFromPresetFile (const MemoryBlock& rawData) const
3177
+ {
3178
+ auto rawDataCopy = rawData;
3179
+ auto memoryStream = becomeVSTComSmartPtrOwner (new Steinberg::MemoryStream (rawDataCopy.getData(), (int) rawDataCopy.getSize()));
3180
+
3181
+ if (memoryStream == nullptr || holder->component == nullptr)
3182
+ return false;
3183
+
3184
+ return Steinberg::Vst::PresetFile::loadPreset (memoryStream.get(), holder->cidOfComponent,
3185
+ holder->component.get(), editController.get(), nullptr);
3186
+ }
3187
+
3188
+ //==============================================================================
3189
+ void fillInPluginDescription (PluginDescription& description) const override
3190
+ {
3191
+ holder->fillInPluginDescription (description);
3192
+ }
3193
+
3194
+ /** @note Not applicable to VST3 */
3195
+ void getCurrentProgramStateInformation (MemoryBlock& destData) override
3196
+ {
3197
+ destData.setSize (0, true);
3198
+ }
3199
+
3200
+ /** @note Not applicable to VST3 */
3201
+ void setCurrentProgramStateInformation ([[maybe_unused]] const void* data,
3202
+ [[maybe_unused]] int sizeInBytes) override
3203
+ {
3204
+ }
3205
+
3206
+ void updateParameterInfo()
3207
+ {
3208
+ for (auto& pair : idToParamMap)
3209
+ if (auto* param = pair.second)
3210
+ param->updateCachedInfo();
3211
+ }
3212
+
3213
+ private:
3214
+ void deactivate()
3215
+ {
3216
+ if (! isActive)
3217
+ return;
3218
+
3219
+ isActive = false;
3220
+
3221
+ if (processor != nullptr)
3222
+ warnOnFailureIfImplemented (processor->setProcessing (false));
3223
+
3224
+ if (holder->component != nullptr)
3225
+ warnOnFailure (holder->component->setActive (false));
3226
+
3227
+ setStateForAllMidiBuses (false);
3228
+ }
3229
+
3230
+ //==============================================================================
3231
+ #if JUCE_LINUX || JUCE_BSD
3232
+ SharedResourcePointer<RunLoop> runLoop;
3233
+ #endif
3234
+
3235
+ std::unique_ptr<VST3ComponentHolder> holder;
3236
+
3237
+ friend VST3HostContext;
3238
+
3239
+ // Information objects:
3240
+ String company;
3241
+ std::unique_ptr<PClassInfo> info;
3242
+ std::unique_ptr<PClassInfo2> info2;
3243
+ std::unique_ptr<PClassInfoW> infoW;
3244
+
3245
+ // Rudimentary interfaces:
3246
+ VSTComSmartPtr<Vst::IEditController> editController;
3247
+ VSTComSmartPtr<Vst::IEditController2> editController2;
3248
+ VSTComSmartPtr<Vst::IMidiMapping> midiMapping;
3249
+ VSTComSmartPtr<Vst::IAudioProcessor> processor;
3250
+ VSTComSmartPtr<Vst::IComponentHandler> componentHandler;
3251
+ VSTComSmartPtr<Vst::IComponentHandler2> componentHandler2;
3252
+ VSTComSmartPtr<Vst::IUnitInfo> unitInfo;
3253
+ VSTComSmartPtr<Vst::IUnitData> unitData;
3254
+ VSTComSmartPtr<Vst::IProgramListData> programListData;
3255
+ VSTComSmartPtr<Vst::IConnectionPoint> componentConnection, editControllerConnection;
3256
+ VSTComSmartPtr<Vst::ChannelContext::IInfoListener> trackInfoListener;
3257
+
3258
+ /** The number of IO buses MUST match that of the plugin,
3259
+ even if there aren't enough channels to process,
3260
+ as very poorly specified by the Steinberg SDK
3261
+ */
3262
+ HostBufferMapper inputBusMap, outputBusMap;
3263
+
3264
+ StringArray programNames;
3265
+ Vst::ParamID programParameterID = (Vst::ParamID) -1;
3266
+
3267
+ std::map<Vst::ParamID, VST3Parameter*> idToParamMap;
3268
+ EditControllerParameterDispatcher parameterDispatcher;
3269
+ StoredMidiMapping storedMidiMapping;
3270
+
3271
+ /* The plugin may request a restart during playback, which may in turn
3272
+ attempt to call functions such as setProcessing and setActive. It is an
3273
+ error to call these functions simultaneously with
3274
+ IAudioProcessor::process, so we use this mutex to ensure that this
3275
+ scenario is impossible.
3276
+ */
3277
+ SpinLock processMutex;
3278
+
3279
+ //==============================================================================
3280
+ template <typename Type>
3281
+ static void appendStateFrom (XmlElement& head, VSTComSmartPtr<Type>& object, const String& identifier)
3282
+ {
3283
+ if (object != nullptr)
3284
+ {
3285
+ Steinberg::MemoryStream stream;
3286
+
3287
+ const auto result = object->getState (&stream);
3288
+
3289
+ if (result == kResultTrue)
3290
+ {
3291
+ MemoryBlock info (stream.getData(), (size_t) stream.getSize());
3292
+ head.createNewChildElement (identifier)->addTextElement (info.toBase64Encoding());
3293
+ }
3294
+ }
3295
+ }
3296
+
3297
+ static VSTComSmartPtr<Steinberg::MemoryStream> createMemoryStreamForState (XmlElement& head, StringRef identifier)
3298
+ {
3299
+ if (auto* state = head.getChildByName (identifier))
3300
+ {
3301
+ MemoryBlock mem;
3302
+
3303
+ if (mem.fromBase64Encoding (state->getAllSubText()))
3304
+ {
3305
+ auto stream = becomeVSTComSmartPtrOwner (new Steinberg::MemoryStream());
3306
+ stream->setSize ((TSize) mem.getSize());
3307
+ mem.copyTo (stream->getData(), 0, mem.getSize());
3308
+ return stream;
3309
+ }
3310
+ }
3311
+
3312
+ return {};
3313
+ }
3314
+
3315
+ CachedParamValues cachedParamValues;
3316
+ VSTComSmartPtr<ParameterChanges> inputParameterChanges = addVSTComSmartPtrOwner (new ParameterChanges);
3317
+ VSTComSmartPtr<ParameterChanges> outputParameterChanges = addVSTComSmartPtrOwner (new ParameterChanges);
3318
+ VSTComSmartPtr<MidiEventList> midiInputs = addVSTComSmartPtrOwner (new MidiEventList);
3319
+ VSTComSmartPtr<MidiEventList> midiOutputs = addVSTComSmartPtrOwner (new MidiEventList);
3320
+ Vst::ProcessContext timingInfo; //< Only use this in processBlock()!
3321
+ bool isControllerInitialised = false, isActive = false, lastProcessBlockCallWasBypass = false;
3322
+ const bool hasMidiInput = getNumSingleDirectionBusesFor (holder->component.get(), MediaKind::event, Direction::input) > 0,
3323
+ hasMidiOutput = getNumSingleDirectionBusesFor (holder->component.get(), MediaKind::event, Direction::output) > 0;
3324
+ VST3Parameter* bypassParam = nullptr;
3325
+
3326
+ //==============================================================================
3327
+ /** Some plugins need to be "connected" to intercommunicate between their implemented classes */
3328
+ void interconnectComponentAndController()
3329
+ {
3330
+ componentConnection.loadFrom (holder->component.get());
3331
+ editControllerConnection.loadFrom (editController.get());
3332
+
3333
+ if (componentConnection != nullptr && editControllerConnection != nullptr)
3334
+ {
3335
+ warnOnFailure (componentConnection->connect (editControllerConnection.get()));
3336
+ warnOnFailure (editControllerConnection->connect (componentConnection.get()));
3337
+ }
3338
+ }
3339
+
3340
+ void initialiseParameterList()
3341
+ {
3342
+ AudioProcessorParameterGroup newParameterTree;
3343
+
3344
+ // We're going to add parameter groups to the tree recursively in the same order as the
3345
+ // first parameters contained within them.
3346
+ std::map<Vst::UnitID, Vst::UnitInfo> infoMap;
3347
+ std::map<Vst::UnitID, AudioProcessorParameterGroup*> groupMap;
3348
+ groupMap[Vst::kRootUnitId] = &newParameterTree;
3349
+
3350
+ if (unitInfo != nullptr)
3351
+ {
3352
+ const auto numUnits = unitInfo->getUnitCount();
3353
+
3354
+ for (int i = 1; i < numUnits; ++i)
3355
+ {
3356
+ Vst::UnitInfo ui{};
3357
+ unitInfo->getUnitInfo (i, ui);
3358
+ infoMap[ui.id] = std::move (ui);
3359
+ }
3360
+ }
3361
+
3362
+ {
3363
+ auto allIds = getAllParamIDs (*editController);
3364
+ inputParameterChanges ->initialise (allIds);
3365
+ outputParameterChanges->initialise (allIds);
3366
+ cachedParamValues = CachedParamValues { std::move (allIds) };
3367
+ }
3368
+
3369
+ for (int i = 0; i < editController->getParameterCount(); ++i)
3370
+ {
3371
+ auto* param = new VST3Parameter (*this, i);
3372
+ const auto paramInfo = param->getParameterInfo();
3373
+
3374
+ if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0)
3375
+ bypassParam = param;
3376
+
3377
+ std::function<AudioProcessorParameterGroup* (Vst::UnitID)> findOrCreateGroup;
3378
+ findOrCreateGroup = [&groupMap, &infoMap, &findOrCreateGroup] (Vst::UnitID groupID)
3379
+ {
3380
+ auto existingGroup = groupMap.find (groupID);
3381
+
3382
+ if (existingGroup != groupMap.end())
3383
+ return existingGroup->second;
3384
+
3385
+ auto groupInfo = infoMap.find (groupID);
3386
+
3387
+ if (groupInfo == infoMap.end())
3388
+ return groupMap[Vst::kRootUnitId];
3389
+
3390
+ auto* group = new AudioProcessorParameterGroup (String (groupInfo->first),
3391
+ toString (groupInfo->second.name),
3392
+ {});
3393
+ groupMap[groupInfo->first] = group;
3394
+
3395
+ auto* parentGroup = findOrCreateGroup (groupInfo->second.parentUnitId);
3396
+ parentGroup->addChild (std::unique_ptr<AudioProcessorParameterGroup> (group));
3397
+
3398
+ return group;
3399
+ };
3400
+
3401
+ auto* group = findOrCreateGroup (paramInfo.unitId);
3402
+ group->addChild (std::unique_ptr<AudioProcessorParameter> (param));
3403
+ }
3404
+
3405
+ setHostedParameterTree (std::move (newParameterTree));
3406
+
3407
+ idToParamMap = [this]
3408
+ {
3409
+ std::map<Vst::ParamID, VST3Parameter*> result;
3410
+
3411
+ for (auto* parameter : getParameters())
3412
+ {
3413
+ auto* vst3Param = static_cast<VST3Parameter*> (parameter);
3414
+ result.emplace (vst3Param->getParamID(), vst3Param);
3415
+ }
3416
+
3417
+ return result;
3418
+ }();
3419
+ }
3420
+
3421
+ void synchroniseStates()
3422
+ {
3423
+ Steinberg::MemoryStream stream;
3424
+
3425
+ if (holder->component->getState (&stream) == kResultTrue)
3426
+ if (stream.seek (0, Steinberg::IBStream::kIBSeekSet, nullptr) == kResultTrue)
3427
+ setComponentStateAndResetParameters (stream);
3428
+ }
3429
+
3430
+ void grabInformationObjects()
3431
+ {
3432
+ processor.loadFrom (holder->component.get());
3433
+ unitInfo.loadFrom (holder->component.get());
3434
+ programListData.loadFrom (holder->component.get());
3435
+ unitData.loadFrom (holder->component.get());
3436
+ editController2.loadFrom (holder->component.get());
3437
+ midiMapping.loadFrom (holder->component.get());
3438
+ componentHandler.loadFrom (holder->component.get());
3439
+ componentHandler2.loadFrom (holder->component.get());
3440
+ trackInfoListener.loadFrom (holder->component.get());
3441
+
3442
+ if (processor == nullptr) processor.loadFrom (editController.get());
3443
+ if (unitInfo == nullptr) unitInfo.loadFrom (editController.get());
3444
+ if (programListData == nullptr) programListData.loadFrom (editController.get());
3445
+ if (unitData == nullptr) unitData.loadFrom (editController.get());
3446
+ if (editController2 == nullptr) editController2.loadFrom (editController.get());
3447
+ if (midiMapping == nullptr) midiMapping.loadFrom (editController.get());
3448
+ if (componentHandler == nullptr) componentHandler.loadFrom (editController.get());
3449
+ if (componentHandler2 == nullptr) componentHandler2.loadFrom (editController.get());
3450
+ if (trackInfoListener == nullptr) trackInfoListener.loadFrom (editController.get());
3451
+ }
3452
+
3453
+ void setStateForAllMidiBuses (bool newState)
3454
+ {
3455
+ setStateForAllEventBuses (holder->component.get(), newState, Direction::input);
3456
+ setStateForAllEventBuses (holder->component.get(), newState, Direction::output);
3457
+ }
3458
+
3459
+ std::vector<ChannelMapping> createChannelMappings (bool isInput) const
3460
+ {
3461
+ std::vector<ChannelMapping> result;
3462
+ result.reserve ((size_t) getBusCount (isInput));
3463
+
3464
+ for (auto i = 0; i < getBusCount (isInput); ++i)
3465
+ result.emplace_back (*getBus (isInput, i));
3466
+
3467
+ return result;
3468
+ }
3469
+
3470
+ void setupIO()
3471
+ {
3472
+ setStateForAllMidiBuses (true);
3473
+
3474
+ Vst::ProcessSetup setup;
3475
+ setup.symbolicSampleSize = Vst::kSample32;
3476
+ setup.maxSamplesPerBlock = 1024;
3477
+ setup.sampleRate = 44100.0;
3478
+ setup.processMode = Vst::kRealtime;
3479
+
3480
+ warnOnFailure (processor->setupProcessing (setup));
3481
+
3482
+ inputBusMap .prepare (createChannelMappings (true));
3483
+ outputBusMap.prepare (createChannelMappings (false));
3484
+ setRateAndBufferSizeDetails (setup.sampleRate, (int) setup.maxSamplesPerBlock);
3485
+ }
3486
+
3487
+ static AudioProcessor::BusesProperties getBusProperties (VSTComSmartPtr<Vst::IComponent>& component)
3488
+ {
3489
+ AudioProcessor::BusesProperties busProperties;
3490
+ VSTComSmartPtr<Vst::IAudioProcessor> processor;
3491
+ processor.loadFrom (component.get());
3492
+
3493
+ for (const auto isInput : { true, false })
3494
+ {
3495
+ const Vst::BusDirection dir = (isInput ? Vst::kInput : Vst::kOutput);
3496
+ const int numBuses = component->getBusCount (Vst::kAudio, dir);
3497
+
3498
+ for (int i = 0; i < numBuses; ++i)
3499
+ {
3500
+ Vst::BusInfo info;
3501
+
3502
+ if (component->getBusInfo (Vst::kAudio, dir, (Steinberg::int32) i, info) != kResultOk)
3503
+ continue;
3504
+
3505
+ AudioChannelSet layout = (info.channelCount == 0 ? AudioChannelSet::disabled()
3506
+ : AudioChannelSet::discreteChannels (info.channelCount));
3507
+
3508
+ Vst::SpeakerArrangement arr;
3509
+ if (processor != nullptr && processor->getBusArrangement (dir, i, arr) == kResultOk)
3510
+ if (const auto set = getChannelSetForSpeakerArrangement (arr))
3511
+ layout = *set;
3512
+
3513
+ busProperties.addBus (isInput, toString (info.name), layout,
3514
+ (info.flags & Vst::BusInfo::kDefaultActive) != 0);
3515
+ }
3516
+ }
3517
+
3518
+ return busProperties;
3519
+ }
3520
+
3521
+ //==============================================================================
3522
+ Vst::BusInfo getBusInfo (MediaKind kind, Direction direction, int index = 0) const
3523
+ {
3524
+ Vst::BusInfo busInfo;
3525
+ busInfo.mediaType = toVstType (kind);
3526
+ busInfo.direction = toVstType (direction);
3527
+ busInfo.channelCount = 0;
3528
+
3529
+ holder->component->getBusInfo (busInfo.mediaType, busInfo.direction,
3530
+ (Steinberg::int32) index, busInfo);
3531
+ return busInfo;
3532
+ }
3533
+
3534
+ //==============================================================================
3535
+ void updateBypass (bool processBlockBypassedCalled)
3536
+ {
3537
+ // to remain backward compatible, the logic needs to be the following:
3538
+ // - if processBlockBypassed was called then definitely bypass the VST3
3539
+ // - if processBlock was called then only un-bypass the VST3 if the previous
3540
+ // call was processBlockBypassed, otherwise do nothing
3541
+ if (processBlockBypassedCalled)
3542
+ {
3543
+ if (bypassParam != nullptr && (approximatelyEqual (bypassParam->getValue(), 0.0f) || ! lastProcessBlockCallWasBypass))
3544
+ bypassParam->setValue (1.0f);
3545
+ }
3546
+ else
3547
+ {
3548
+ if (lastProcessBlockCallWasBypass && bypassParam != nullptr)
3549
+ bypassParam->setValue (0.0f);
3550
+
3551
+ }
3552
+
3553
+ lastProcessBlockCallWasBypass = processBlockBypassedCalled;
3554
+ }
3555
+
3556
+ //==============================================================================
3557
+ /** @note An IPlugView, when first created, should start with a ref-count of 1! */
3558
+ IPlugView* tryCreatingView() const
3559
+ {
3560
+ JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
3561
+
3562
+ IPlugView* v = editController->createView (Vst::ViewType::kEditor);
3563
+
3564
+ if (v == nullptr) v = editController->createView (nullptr);
3565
+ if (v == nullptr) editController->queryInterface (IPlugView::iid, (void**) &v);
3566
+
3567
+ return v;
3568
+ }
3569
+
3570
+ //==============================================================================
3571
+ template <typename FloatType>
3572
+ void associateWith (Vst::ProcessData& destination, AudioBuffer<FloatType>& buffer)
3573
+ {
3574
+ destination.inputs = inputBusMap .getVst3LayoutForJuceBuffer (buffer);
3575
+ destination.outputs = outputBusMap.getVst3LayoutForJuceBuffer (buffer);
3576
+ }
3577
+
3578
+ void associateWith (Vst::ProcessData& destination, MidiBuffer& midiBuffer)
3579
+ {
3580
+ midiInputs->clear();
3581
+ midiOutputs->clear();
3582
+
3583
+ if (acceptsMidi())
3584
+ {
3585
+ MidiEventList::hostToPluginEventList (*midiInputs,
3586
+ midiBuffer,
3587
+ storedMidiMapping,
3588
+ [this] (const auto controlID, const auto paramValue)
3589
+ {
3590
+ if (auto* param = this->getParameterForID (controlID))
3591
+ param->setValueNotifyingHost ((float) paramValue);
3592
+ });
3593
+ }
3594
+
3595
+ destination.inputEvents = midiInputs.get();
3596
+ destination.outputEvents = midiOutputs.get();
3597
+ }
3598
+
3599
+ void updateTimingInformation (Vst::ProcessData& destination, double processSampleRate)
3600
+ {
3601
+ toProcessContext (timingInfo, getPlayHead(), processSampleRate);
3602
+ destination.processContext = &timingInfo;
3603
+ }
3604
+
3605
+ Vst::ParameterInfo getParameterInfoForIndex (Steinberg::int32 index) const
3606
+ {
3607
+ Vst::ParameterInfo paramInfo{};
3608
+
3609
+ if (editController != nullptr)
3610
+ editController->getParameterInfo ((int32) index, paramInfo);
3611
+
3612
+ return paramInfo;
3613
+ }
3614
+
3615
+ Vst::ProgramListInfo getProgramListInfo (int index) const
3616
+ {
3617
+ Vst::ProgramListInfo paramInfo{};
3618
+
3619
+ if (unitInfo != nullptr)
3620
+ unitInfo->getProgramListInfo (index, paramInfo);
3621
+
3622
+ return paramInfo;
3623
+ }
3624
+
3625
+ void syncProgramNames()
3626
+ {
3627
+ programNames.clear();
3628
+
3629
+ if (processor == nullptr || editController == nullptr)
3630
+ return;
3631
+
3632
+ Vst::UnitID programUnitID;
3633
+ Vst::ParameterInfo paramInfo{};
3634
+
3635
+ {
3636
+ int idx, num = editController->getParameterCount();
3637
+
3638
+ for (idx = 0; idx < num; ++idx)
3639
+ if (editController->getParameterInfo (idx, paramInfo) == kResultOk
3640
+ && (paramInfo.flags & Steinberg::Vst::ParameterInfo::kIsProgramChange) != 0)
3641
+ break;
3642
+
3643
+ if (idx >= num)
3644
+ return;
3645
+
3646
+ programParameterID = paramInfo.id;
3647
+ programUnitID = paramInfo.unitId;
3648
+ }
3649
+
3650
+ if (unitInfo != nullptr)
3651
+ {
3652
+ Vst::UnitInfo uInfo{};
3653
+ const int unitCount = unitInfo->getUnitCount();
3654
+
3655
+ for (int idx = 0; idx < unitCount; ++idx)
3656
+ {
3657
+ if (unitInfo->getUnitInfo (idx, uInfo) == kResultOk
3658
+ && uInfo.id == programUnitID)
3659
+ {
3660
+ const int programListCount = unitInfo->getProgramListCount();
3661
+
3662
+ for (int j = 0; j < programListCount; ++j)
3663
+ {
3664
+ Vst::ProgramListInfo programListInfo{};
3665
+
3666
+ if (unitInfo->getProgramListInfo (j, programListInfo) == kResultOk
3667
+ && programListInfo.id == uInfo.programListId)
3668
+ {
3669
+ Vst::String128 name;
3670
+
3671
+ for (int k = 0; k < programListInfo.programCount; ++k)
3672
+ if (unitInfo->getProgramName (programListInfo.id, k, name) == kResultOk)
3673
+ programNames.add (toString (name));
3674
+
3675
+ return;
3676
+ }
3677
+ }
3678
+
3679
+ break;
3680
+ }
3681
+ }
3682
+ }
3683
+
3684
+ if (editController != nullptr && paramInfo.stepCount > 0)
3685
+ {
3686
+ auto numPrograms = paramInfo.stepCount + 1;
3687
+
3688
+ for (int i = 0; i < numPrograms; ++i)
3689
+ {
3690
+ auto valueNormalized = static_cast<Vst::ParamValue> (i) / static_cast<Vst::ParamValue> (paramInfo.stepCount);
3691
+
3692
+ Vst::String128 programName;
3693
+ if (editController->getParamStringByValue (paramInfo.id, valueNormalized, programName) == kResultOk)
3694
+ programNames.add (toString (programName));
3695
+ }
3696
+ }
3697
+ }
3698
+
3699
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginInstance)
3700
+ };
3701
+
3702
+ JUCE_END_IGNORE_WARNINGS_MSVC
3703
+
3704
+ //==============================================================================
3705
+ tresult VST3HostContext::beginEdit (Vst::ParamID paramID)
3706
+ {
3707
+ if (plugin == nullptr)
3708
+ return kResultTrue;
3709
+
3710
+ if (auto* param = plugin->getParameterForID (paramID))
3711
+ {
3712
+ param->beginChangeGesture();
3713
+ return kResultTrue;
3714
+ }
3715
+
3716
+ return kResultFalse;
3717
+ }
3718
+
3719
+ tresult VST3HostContext::performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalised)
3720
+ {
3721
+ if (plugin == nullptr)
3722
+ return kResultTrue;
3723
+
3724
+ if (auto* param = plugin->getParameterForID (paramID))
3725
+ {
3726
+ param->setValueNotifyingHost ((float) valueNormalised);
3727
+
3728
+ // did the plug-in already update the parameter internally
3729
+ if (! approximatelyEqual (plugin->editController->getParamNormalized (paramID), valueNormalised))
3730
+ return plugin->editController->setParamNormalized (paramID, valueNormalised);
3731
+
3732
+ return kResultTrue;
3733
+ }
3734
+
3735
+ return kResultFalse;
3736
+ }
3737
+
3738
+ tresult VST3HostContext::endEdit (Vst::ParamID paramID)
3739
+ {
3740
+ if (plugin == nullptr)
3741
+ return kResultTrue;
3742
+
3743
+ if (auto* param = plugin->getParameterForID (paramID))
3744
+ {
3745
+ param->endChangeGesture();
3746
+ return kResultTrue;
3747
+ }
3748
+
3749
+ return kResultFalse;
3750
+ }
3751
+
3752
+ tresult VST3HostContext::restartComponent (Steinberg::int32 flags)
3753
+ {
3754
+ // If you hit this, the plugin has requested a restart from a thread other than
3755
+ // the UI thread. JUCE should be able to cope, but you should consider filing a bug
3756
+ // report against the plugin.
3757
+ JUCE_ASSERT_MESSAGE_THREAD
3758
+
3759
+ componentRestarter.restart (flags);
3760
+ return kResultTrue;
3761
+ }
3762
+
3763
+ tresult PLUGIN_API VST3HostContext::setDirty (TBool needsSave)
3764
+ {
3765
+ if (needsSave)
3766
+ plugin->updateHostDisplay (AudioPluginInstance::ChangeDetails{}.withNonParameterStateChanged (true));
3767
+
3768
+ return kResultOk;
3769
+ }
3770
+
3771
+ void VST3HostContext::restartComponentOnMessageThread (int32 flags)
3772
+ {
3773
+ if (plugin == nullptr)
3774
+ {
3775
+ jassertfalse;
3776
+ return;
3777
+ }
3778
+
3779
+ if (hasFlag (flags, Vst::kReloadComponent))
3780
+ plugin->reset();
3781
+
3782
+ if (hasFlag (flags, Vst::kIoChanged))
3783
+ {
3784
+ auto sampleRate = plugin->getSampleRate();
3785
+ auto blockSize = plugin->getBlockSize();
3786
+
3787
+ // Have to deactivate here, otherwise prepareToPlay might not pick up the new bus layouts
3788
+ plugin->releaseResources();
3789
+ plugin->prepareToPlay (sampleRate >= 8000 ? sampleRate : 44100.0,
3790
+ blockSize > 0 ? blockSize : 1024);
3791
+ }
3792
+
3793
+ if (hasFlag (flags, Vst::kLatencyChanged))
3794
+ if (plugin->processor != nullptr)
3795
+ plugin->setLatencySamples (jmax (0, (int) plugin->processor->getLatencySamples()));
3796
+
3797
+ if (hasFlag (flags, Vst::kMidiCCAssignmentChanged))
3798
+ plugin->updateMidiMappings();
3799
+
3800
+ if (hasFlag (flags, Vst::kParamValuesChanged))
3801
+ plugin->resetParameters();
3802
+
3803
+ if (hasFlag (flags, Vst::kParamTitlesChanged))
3804
+ plugin->updateParameterInfo();
3805
+
3806
+ plugin->updateHostDisplay (AudioProcessorListener::ChangeDetails().withProgramChanged (true)
3807
+ .withParameterInfoChanged (true));
3808
+ }
3809
+
3810
+ //==============================================================================
3811
+ tresult VST3HostContext::ContextMenu::popup (Steinberg::UCoord x, Steinberg::UCoord y)
3812
+ {
3813
+ Array<const Item*> subItemStack;
3814
+ OwnedArray<PopupMenu> menuStack;
3815
+ PopupMenu* topLevelMenu = menuStack.add (new PopupMenu());
3816
+
3817
+ for (int i = 0; i < items.size(); ++i)
3818
+ {
3819
+ auto& item = items.getReference (i).item;
3820
+ auto* menuToUse = menuStack.getLast();
3821
+
3822
+ if (hasFlag (item.flags, Item::kIsGroupStart & ~Item::kIsDisabled))
3823
+ {
3824
+ subItemStack.add (&item);
3825
+ menuStack.add (new PopupMenu());
3826
+ }
3827
+ else if (hasFlag (item.flags, Item::kIsGroupEnd))
3828
+ {
3829
+ if (auto* subItem = subItemStack.getLast())
3830
+ {
3831
+ if (auto* m = menuStack [menuStack.size() - 2])
3832
+ m->addSubMenu (toString (subItem->name), *menuToUse,
3833
+ ! hasFlag (subItem->flags, Item::kIsDisabled),
3834
+ nullptr,
3835
+ hasFlag (subItem->flags, Item::kIsChecked));
3836
+
3837
+ menuStack.removeLast (1);
3838
+ subItemStack.removeLast (1);
3839
+ }
3840
+ }
3841
+ else if (hasFlag (item.flags, Item::kIsSeparator))
3842
+ {
3843
+ menuToUse->addSeparator();
3844
+ }
3845
+ else
3846
+ {
3847
+ menuToUse->addItem (item.tag != 0 ? (int) item.tag : (int) zeroTagReplacement,
3848
+ toString (item.name),
3849
+ ! hasFlag (item.flags, Item::kIsDisabled),
3850
+ hasFlag (item.flags, Item::kIsChecked));
3851
+ }
3852
+ }
3853
+
3854
+ PopupMenu::Options options;
3855
+
3856
+ if (auto* ed = owner.getActiveEditor())
3857
+ {
3858
+ #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE
3859
+ if (auto* peer = ed->getPeer())
3860
+ {
3861
+ auto scale = peer->getPlatformScaleFactor();
3862
+
3863
+ x = roundToInt (x / scale);
3864
+ y = roundToInt (y / scale);
3865
+ }
3866
+ #endif
3867
+
3868
+ options = options.withTargetScreenArea (ed->getScreenBounds().translated ((int) x, (int) y).withSize (1, 1));
3869
+ }
3870
+
3871
+ #if JUCE_MODAL_LOOPS_PERMITTED
3872
+ // Unfortunately, Steinberg's docs explicitly say this should be modal..
3873
+ handleResult (topLevelMenu->showMenu (options));
3874
+ #else
3875
+ topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, addVSTComSmartPtrOwner (this)));
3876
+ #endif
3877
+
3878
+ return kResultOk;
3879
+ }
3880
+
3881
+ //==============================================================================
3882
+ tresult VST3HostContext::notifyProgramListChange (Vst::ProgramListID, Steinberg::int32)
3883
+ {
3884
+ if (plugin != nullptr)
3885
+ plugin->syncProgramNames();
3886
+
3887
+ return kResultTrue;
3888
+ }
3889
+
3890
+ //==============================================================================
3891
+ //==============================================================================
3892
+ VST3PluginFormat::VST3PluginFormat() = default;
3893
+ VST3PluginFormat::~VST3PluginFormat() = default;
3894
+
3895
+ bool VST3PluginFormat::setStateFromVSTPresetFile (AudioPluginInstance* api, const MemoryBlock& rawData)
3896
+ {
3897
+ if (auto vst3 = dynamic_cast<VST3PluginInstance*> (api))
3898
+ return vst3->setStateFromPresetFile (rawData);
3899
+
3900
+ return false;
3901
+ }
3902
+
3903
+ void VST3PluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& results, const String& fileOrIdentifier)
3904
+ {
3905
+ if (! fileMightContainThisPluginType (fileOrIdentifier))
3906
+ return;
3907
+
3908
+ if (const auto fast = DescriptionLister::findDescriptionsFast (File (fileOrIdentifier)); ! fast.empty())
3909
+ {
3910
+ for (const auto& d : fast)
3911
+ results.add (new PluginDescription (d));
3912
+
3913
+ return;
3914
+ }
3915
+
3916
+ for (const auto& file : getLibraryPaths (fileOrIdentifier))
3917
+ {
3918
+ /**
3919
+ Since there is no apparent indication if a VST3 plugin is a shell or not,
3920
+ we're stuck iterating through a VST3's factory, creating a description
3921
+ for every housed plugin.
3922
+ */
3923
+
3924
+ auto pluginFactory = addVSTComSmartPtrOwner (DLLHandleCache::getInstance()->findOrCreateHandle (file).getPluginFactory());
3925
+
3926
+ if (pluginFactory == nullptr)
3927
+ continue;
3928
+
3929
+ auto host = addVSTComSmartPtrOwner (new VST3HostContext());
3930
+
3931
+ for (const auto& d : DescriptionLister::findDescriptionsSlow (*host, *pluginFactory, File (file)))
3932
+ results.add (new PluginDescription (d));
3933
+ }
3934
+ }
3935
+
3936
+ void VST3PluginFormat::createARAFactoryAsync (const PluginDescription& description, ARAFactoryCreationCallback callback)
3937
+ {
3938
+ if (! description.hasARAExtension)
3939
+ {
3940
+ jassertfalse;
3941
+ callback ({ {}, "The provided plugin does not support ARA features" });
3942
+ }
3943
+
3944
+ File file (description.fileOrIdentifier);
3945
+ auto pluginFactory = addVSTComSmartPtrOwner (DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName()).getPluginFactory());
3946
+ const auto* pluginName = description.name.toRawUTF8();
3947
+
3948
+ callback ({ ARAFactoryWrapper { ::juce::getARAFactory (pluginFactory.get(), pluginName) }, {} });
3949
+ }
3950
+
3951
+ static std::unique_ptr<AudioPluginInstance> createVST3Instance (VST3PluginFormat& format,
3952
+ const PluginDescription& description,
3953
+ const File& file)
3954
+ {
3955
+ if (! format.fileMightContainThisPluginType (description.fileOrIdentifier))
3956
+ return nullptr;
3957
+
3958
+ struct ScopedWorkingDirectory
3959
+ {
3960
+ ~ScopedWorkingDirectory() { previousWorkingDirectory.setAsCurrentWorkingDirectory(); }
3961
+ File previousWorkingDirectory = File::getCurrentWorkingDirectory();
3962
+ };
3963
+
3964
+ const ScopedWorkingDirectory scope;
3965
+ file.getParentDirectory().setAsCurrentWorkingDirectory();
3966
+
3967
+ const VST3ModuleHandle::Ptr module { VST3ModuleHandle::findOrCreateModule (file, description) };
3968
+
3969
+ if (module == nullptr)
3970
+ return nullptr;
3971
+
3972
+ auto holder = std::make_unique<VST3ComponentHolder> (module);
3973
+
3974
+ if (! holder->initialise())
3975
+ return nullptr;
3976
+
3977
+ auto instance = std::make_unique<VST3PluginInstance> (std::move (holder));
3978
+
3979
+ if (! instance->initialise())
3980
+ return nullptr;
3981
+
3982
+ return instance;
3983
+ }
3984
+
3985
+ StringArray VST3PluginFormat::getLibraryPaths (const String& fileOrIdentifier)
3986
+ {
3987
+ #if JUCE_WINDOWS
3988
+ if (! File (fileOrIdentifier).existsAsFile())
3989
+ {
3990
+ StringArray files;
3991
+ recursiveFileSearch (files, fileOrIdentifier, true);
3992
+ return files;
3993
+ }
3994
+ #endif
3995
+
3996
+ return { fileOrIdentifier };
3997
+ }
3998
+
3999
+ void VST3PluginFormat::createPluginInstance (const PluginDescription& description,
4000
+ double, int, PluginCreationCallback callback)
4001
+ {
4002
+ for (const auto& file : getLibraryPaths (description.fileOrIdentifier))
4003
+ {
4004
+ if (auto result = createVST3Instance (*this, description, file))
4005
+ {
4006
+ callback (std::move (result), {});
4007
+ return;
4008
+ }
4009
+ }
4010
+
4011
+ callback (nullptr, TRANS ("Unable to load XXX plug-in file").replace ("XXX", "VST-3"));
4012
+ }
4013
+
4014
+ bool VST3PluginFormat::requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const
4015
+ {
4016
+ return false;
4017
+ }
4018
+
4019
+ bool VST3PluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier)
4020
+ {
4021
+ auto f = File::createFileWithoutCheckingPath (fileOrIdentifier);
4022
+
4023
+ return f.hasFileExtension (".vst3") && f.exists();
4024
+ }
4025
+
4026
+ String VST3PluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier)
4027
+ {
4028
+ return fileOrIdentifier; //Impossible to tell because every VST3 is a type of shell...
4029
+ }
4030
+
4031
+ bool VST3PluginFormat::pluginNeedsRescanning (const PluginDescription& description)
4032
+ {
4033
+ return File (description.fileOrIdentifier).getLastModificationTime() != description.lastFileModTime;
4034
+ }
4035
+
4036
+ bool VST3PluginFormat::doesPluginStillExist (const PluginDescription& description)
4037
+ {
4038
+ return File (description.fileOrIdentifier).exists();
4039
+ }
4040
+
4041
+ StringArray VST3PluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, const bool recursive, bool)
4042
+ {
4043
+ StringArray results;
4044
+
4045
+ for (int i = 0; i < directoriesToSearch.getNumPaths(); ++i)
4046
+ recursiveFileSearch (results, directoriesToSearch[i], recursive);
4047
+
4048
+ return results;
4049
+ }
4050
+
4051
+ void VST3PluginFormat::recursiveFileSearch (StringArray& results, const File& directory, const bool recursive)
4052
+ {
4053
+ for (const auto& iter : RangedDirectoryIterator (directory, false, "*", File::findFilesAndDirectories))
4054
+ {
4055
+ auto f = iter.getFile();
4056
+ bool isPlugin = false;
4057
+
4058
+ if (fileMightContainThisPluginType (f.getFullPathName()))
4059
+ {
4060
+ isPlugin = true;
4061
+ results.add (f.getFullPathName());
4062
+ }
4063
+
4064
+ if (recursive && (! isPlugin) && f.isDirectory())
4065
+ recursiveFileSearch (results, f, true);
4066
+ }
4067
+ }
4068
+
4069
+ FileSearchPath VST3PluginFormat::getDefaultLocationsToSearch()
4070
+ {
4071
+ #if JUCE_WINDOWS
4072
+ const auto localAppData = File::getSpecialLocation (File::windowsLocalAppData) .getFullPathName();
4073
+ const auto programFiles = File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName();
4074
+ return FileSearchPath (localAppData + "\\Programs\\Common\\VST3;" + programFiles + "\\Common Files\\VST3");
4075
+ #elif JUCE_MAC
4076
+ return FileSearchPath ("~/Library/Audio/Plug-Ins/VST3;/Library/Audio/Plug-Ins/VST3");
4077
+ #else
4078
+ return FileSearchPath ("~/.vst3/;/usr/lib/vst3/;/usr/local/lib/vst3/");
4079
+ #endif
4080
+ }
4081
+
4082
+ JUCE_END_NO_SANITIZE
4083
+
4084
+ } // namespace juce
4085
+
4086
+ #endif // JUCE_PLUGINHOST_VST3