The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

409 lines
25KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library - "Jules' Utility Class Extensions"
  4. Copyright 2004-11 by Raw Material Software Ltd.
  5. ------------------------------------------------------------------------------
  6. JUCE can be redistributed and/or modified under the terms of the GNU General
  7. Public License (Version 2), as published by the Free Software Foundation.
  8. A copy of the license is included in the JUCE distribution, or can be found
  9. online at www.gnu.org/licenses.
  10. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
  11. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  12. A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  13. ------------------------------------------------------------------------------
  14. To release a closed-source product which uses JUCE, commercial licenses are
  15. available: visit www.rawmaterialsoftware.com/juce for more information.
  16. ==============================================================================
  17. */
  18. #ifndef __JUCER_AUDIOPLUGINMODULE_JUCEHEADER__
  19. #define __JUCER_AUDIOPLUGINMODULE_JUCEHEADER__
  20. //==============================================================================
  21. namespace
  22. {
  23. Value shouldBuildVST (const Project& project) { return project.getProjectValue ("buildVST"); }
  24. Value shouldBuildRTAS (const Project& project) { return project.getProjectValue ("buildRTAS"); }
  25. Value shouldBuildAU (const Project& project) { return project.getProjectValue ("buildAU"); }
  26. Value getPluginName (const Project& project) { return project.getProjectValue ("pluginName"); }
  27. Value getPluginDesc (const Project& project) { return project.getProjectValue ("pluginDesc"); }
  28. Value getPluginManufacturer (const Project& project) { return project.getProjectValue ("pluginManufacturer"); }
  29. Value getPluginManufacturerCode (const Project& project) { return project.getProjectValue ("pluginManufacturerCode"); }
  30. Value getPluginCode (const Project& project) { return project.getProjectValue ("pluginCode"); }
  31. Value getPluginChannelConfigs (const Project& project) { return project.getProjectValue ("pluginChannelConfigs"); }
  32. Value getPluginIsSynth (const Project& project) { return project.getProjectValue ("pluginIsSynth"); }
  33. Value getPluginWantsMidiInput (const Project& project) { return project.getProjectValue ("pluginWantsMidiIn"); }
  34. Value getPluginProducesMidiOut (const Project& project) { return project.getProjectValue ("pluginProducesMidiOut"); }
  35. Value getPluginSilenceInProducesSilenceOut (const Project& project) { return project.getProjectValue ("pluginSilenceInIsSilenceOut"); }
  36. Value getPluginTailLengthSeconds (const Project& project) { return project.getProjectValue ("pluginTailLength"); }
  37. Value getPluginEditorNeedsKeyFocus (const Project& project) { return project.getProjectValue ("pluginEditorRequiresKeys"); }
  38. Value getPluginAUExportPrefix (const Project& project) { return project.getProjectValue ("pluginAUExportPrefix"); }
  39. Value getPluginAUCocoaViewClassName (const Project& project) { return project.getProjectValue ("pluginAUViewClass"); }
  40. Value getPluginRTASCategory (const Project& project) { return project.getProjectValue ("pluginRTASCategory"); }
  41. String getPluginRTASCategoryCode (const Project& project)
  42. {
  43. if (static_cast <bool> (getPluginIsSynth (project).getValue()))
  44. return "ePlugInCategory_SWGenerators";
  45. String s (getPluginRTASCategory (project).toString());
  46. if (s.isEmpty())
  47. s = "ePlugInCategory_None";
  48. return s;
  49. }
  50. int countMaxPluginChannels (const String& configString, bool isInput)
  51. {
  52. StringArray configs;
  53. configs.addTokens (configString, ", {}", String::empty);
  54. configs.trim();
  55. configs.removeEmptyStrings();
  56. jassert ((configs.size() & 1) == 0); // looks like a syntax error in the configs?
  57. int maxVal = 0;
  58. for (int i = (isInput ? 0 : 1); i < configs.size(); i += 2)
  59. maxVal = jmax (maxVal, configs[i].getIntValue());
  60. return maxVal;
  61. }
  62. void writePluginCharacteristicsFile (ProjectSaver& projectSaver)
  63. {
  64. Project& project = projectSaver.getProject();
  65. MemoryOutputStream mem;
  66. mem << "//==============================================================================" << newLine
  67. << "// Audio plugin settings.." << newLine
  68. << newLine
  69. << "#define JucePlugin_Build_VST " << ((bool) shouldBuildVST (project).getValue() ? 1 : 0) << newLine
  70. << "#define JucePlugin_Build_AU " << ((bool) shouldBuildAU (project).getValue() ? 1 : 0) << newLine
  71. << "#define JucePlugin_Build_RTAS " << ((bool) shouldBuildRTAS (project).getValue() ? 1 : 0) << newLine
  72. << newLine
  73. << "#define JucePlugin_Name " << getPluginName (project).toString().quoted() << newLine
  74. << "#define JucePlugin_Desc " << getPluginDesc (project).toString().quoted() << newLine
  75. << "#define JucePlugin_Manufacturer " << getPluginManufacturer (project).toString().quoted() << newLine
  76. << "#define JucePlugin_ManufacturerCode '" << getPluginManufacturerCode (project).toString().trim().substring (0, 4) << "'" << newLine
  77. << "#define JucePlugin_PluginCode '" << getPluginCode (project).toString().trim().substring (0, 4) << "'" << newLine
  78. << "#define JucePlugin_MaxNumInputChannels " << countMaxPluginChannels (getPluginChannelConfigs (project).toString(), true) << newLine
  79. << "#define JucePlugin_MaxNumOutputChannels " << countMaxPluginChannels (getPluginChannelConfigs (project).toString(), false) << newLine
  80. << "#define JucePlugin_PreferredChannelConfigurations " << getPluginChannelConfigs (project).toString() << newLine
  81. << "#define JucePlugin_IsSynth " << ((bool) getPluginIsSynth (project).getValue() ? 1 : 0) << newLine
  82. << "#define JucePlugin_WantsMidiInput " << ((bool) getPluginWantsMidiInput (project).getValue() ? 1 : 0) << newLine
  83. << "#define JucePlugin_ProducesMidiOutput " << ((bool) getPluginProducesMidiOut (project).getValue() ? 1 : 0) << newLine
  84. << "#define JucePlugin_SilenceInProducesSilenceOut " << ((bool) getPluginSilenceInProducesSilenceOut (project).getValue() ? 1 : 0) << newLine
  85. << "#define JucePlugin_TailLengthSeconds " << (double) getPluginTailLengthSeconds (project).getValue() << newLine
  86. << "#define JucePlugin_EditorRequiresKeyboardFocus " << ((bool) getPluginEditorNeedsKeyFocus (project).getValue() ? 1 : 0) << newLine
  87. << "#define JucePlugin_VersionCode " << project.getVersionAsHex() << newLine
  88. << "#define JucePlugin_VersionString " << project.getVersion().toString().quoted() << newLine
  89. << "#define JucePlugin_VSTUniqueID JucePlugin_PluginCode" << newLine
  90. << "#define JucePlugin_VSTCategory " << ((bool) getPluginIsSynth (project).getValue() ? "kPlugCategSynth" : "kPlugCategEffect") << newLine
  91. << "#define JucePlugin_AUMainType " << ((bool) getPluginIsSynth (project).getValue() ? "kAudioUnitType_MusicDevice" : "kAudioUnitType_Effect") << newLine
  92. << "#define JucePlugin_AUSubType JucePlugin_PluginCode" << newLine
  93. << "#define JucePlugin_AUExportPrefix " << getPluginAUExportPrefix (project).toString() << newLine
  94. << "#define JucePlugin_AUExportPrefixQuoted " << getPluginAUExportPrefix (project).toString().quoted() << newLine
  95. << "#define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode" << newLine
  96. << "#define JucePlugin_CFBundleIdentifier " << project.getBundleIdentifier().toString() << newLine
  97. << "#define JucePlugin_AUCocoaViewClassName " << getPluginAUCocoaViewClassName (project).toString() << newLine
  98. << "#define JucePlugin_RTASCategory " << getPluginRTASCategoryCode (project) << newLine
  99. << "#define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode" << newLine
  100. << "#define JucePlugin_RTASProductId JucePlugin_PluginCode" << newLine
  101. << newLine;
  102. projectSaver.setExtraAppConfigFileContent (mem.toString());
  103. }
  104. }
  105. //==============================================================================
  106. namespace VSTHelpers
  107. {
  108. static Value getVSTFolder (const ProjectExporter& exporter) { return exporter.getSetting (Ids::vstFolder); }
  109. static void addVSTFolderToPath (const ProjectExporter& exporter, StringArray& searchPaths)
  110. {
  111. const String vstFolder (getVSTFolder (exporter).toString());
  112. if (vstFolder.isNotEmpty())
  113. {
  114. RelativePath path (exporter.rebaseFromProjectFolderToBuildTarget (RelativePath (vstFolder, RelativePath::projectFolder)));
  115. if (exporter.isVisualStudio())
  116. searchPaths.add (path.toWindowsStyle());
  117. else if (exporter.isLinux() || exporter.isXcode())
  118. searchPaths.insert (0, path.toUnixStyle());
  119. }
  120. }
  121. static void createVSTPathEditor (const ProjectExporter& exporter, Array <PropertyComponent*>& props)
  122. {
  123. props.add (new TextPropertyComponent (getVSTFolder (exporter), "VST Folder", 1024, false));
  124. props.getLast()->setTooltip ("If you're building a VST, this must be the folder containing the VST SDK. This should be an absolute path.");
  125. }
  126. static void fixMissingVSTValues (const ProjectExporter& exporter)
  127. {
  128. if (getVSTFolder(exporter).toString().isEmpty())
  129. getVSTFolder(exporter) = (exporter.isVisualStudio() ? "c:\\SDKs\\vstsdk2.4"
  130. : "~/SDKs/vstsdk2.4");
  131. }
  132. static void prepareExporter (ProjectExporter& exporter, ProjectSaver& projectSaver)
  133. {
  134. fixMissingVSTValues (exporter);
  135. writePluginCharacteristicsFile (projectSaver);
  136. exporter.makefileTargetSuffix = ".so";
  137. Project::Item group (Project::Item::createGroup (const_cast<ProjectExporter&> (exporter).getProject(),
  138. "Juce VST Wrapper", "__jucevstfiles"));
  139. RelativePath juceWrapperFolder (exporter.getProject().getGeneratedCodeFolder(),
  140. exporter.getTargetFolder(), RelativePath::buildTargetFolder);
  141. addVSTFolderToPath (exporter, exporter.extraSearchPaths);
  142. if (exporter.isVisualStudio())
  143. exporter.extraSearchPaths.add (juceWrapperFolder.toWindowsStyle());
  144. else if (exporter.isLinux())
  145. exporter.extraSearchPaths.add (juceWrapperFolder.toUnixStyle());
  146. }
  147. static void createPropertyEditors (const ProjectExporter& exporter, Array <PropertyComponent*>& props)
  148. {
  149. fixMissingVSTValues (exporter);
  150. createVSTPathEditor (exporter, props);
  151. }
  152. }
  153. //==============================================================================
  154. namespace RTASHelpers
  155. {
  156. static Value getRTASFolder (const ProjectExporter& exporter) { return exporter.getSetting (Ids::rtasFolder); }
  157. static void fixMissingRTASValues (const ProjectExporter& exporter)
  158. {
  159. if (getRTASFolder (exporter).toString().isEmpty())
  160. {
  161. if (exporter.isVisualStudio())
  162. getRTASFolder (exporter) = "c:\\SDKs\\PT_80_SDK";
  163. else
  164. getRTASFolder (exporter) = "~/SDKs/PT_80_SDK";
  165. }
  166. }
  167. static void addExtraSearchPaths (ProjectExporter& exporter)
  168. {
  169. RelativePath rtasFolder (getRTASFolder (exporter).toString(), RelativePath::projectFolder);
  170. if (exporter.isVisualStudio())
  171. {
  172. RelativePath juceWrapperFolder (exporter.getProject().getGeneratedCodeFolder(),
  173. exporter.getTargetFolder(), RelativePath::buildTargetFolder);
  174. exporter.extraSearchPaths.add (juceWrapperFolder.toWindowsStyle());
  175. const char* p[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses",
  176. "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses",
  177. "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses/Interfaces",
  178. "AlturaPorts/TDMPlugins/PluginLibrary/Utilities",
  179. "AlturaPorts/TDMPlugins/PluginLibrary/RTASP_Adapt",
  180. "AlturaPorts/TDMPlugins/PluginLibrary/CoreClasses",
  181. "AlturaPorts/TDMPlugins/PluginLibrary/Controls",
  182. "AlturaPorts/TDMPlugins/PluginLibrary/Meters",
  183. "AlturaPorts/TDMPlugins/PluginLibrary/ViewClasses",
  184. "AlturaPorts/TDMPlugins/PluginLibrary/DSPClasses",
  185. "AlturaPorts/TDMPlugins/PluginLibrary/Interfaces",
  186. "AlturaPorts/TDMPlugins/common",
  187. "AlturaPorts/TDMPlugins/common/Platform",
  188. "AlturaPorts/TDMPlugins/SignalProcessing/Public",
  189. "AlturaPorts/TDMPlugIns/DSPManager/Interfaces",
  190. "AlturaPorts/SADriver/Interfaces",
  191. "AlturaPorts/DigiPublic/Interfaces",
  192. "AlturaPorts/Fic/Interfaces/DAEClient",
  193. "AlturaPorts/NewFileLibs/Cmn",
  194. "AlturaPorts/NewFileLibs/DOA",
  195. "AlturaPorts/AlturaSource/PPC_H",
  196. "AlturaPorts/AlturaSource/AppSupport",
  197. "AvidCode/AVX2sdk/AVX/avx2/avx2sdk/inc",
  198. "xplat/AVX/avx2/avx2sdk/inc" };
  199. for (int i = 0; i < numElementsInArray (p); ++i)
  200. exporter.addToExtraSearchPaths (rtasFolder.getChildFile (p[i]));
  201. }
  202. else if (exporter.isXcode())
  203. {
  204. exporter.extraSearchPaths.add ("/Developer/Headers/FlatCarbon");
  205. const char* p[] = { "AlturaPorts/TDMPlugIns/PlugInLibrary/Controls",
  206. "AlturaPorts/TDMPlugIns/PlugInLibrary/CoreClasses",
  207. "AlturaPorts/TDMPlugIns/PlugInLibrary/DSPClasses",
  208. "AlturaPorts/TDMPlugIns/PlugInLibrary/EffectClasses",
  209. "AlturaPorts/TDMPlugIns/PlugInLibrary/MacBuild",
  210. "AlturaPorts/TDMPlugIns/PlugInLibrary/Meters",
  211. "AlturaPorts/TDMPlugIns/PlugInLibrary/ProcessClasses",
  212. "AlturaPorts/TDMPlugIns/PlugInLibrary/ProcessClasses/Interfaces",
  213. "AlturaPorts/TDMPlugIns/PlugInLibrary/RTASP_Adapt",
  214. "AlturaPorts/TDMPlugIns/PlugInLibrary/Utilities",
  215. "AlturaPorts/TDMPlugIns/PlugInLibrary/ViewClasses",
  216. "AlturaPorts/TDMPlugIns/DSPManager/**",
  217. "AlturaPorts/TDMPlugIns/SupplementalPlugInLib/Encryption",
  218. "AlturaPorts/TDMPlugIns/SupplementalPlugInLib/GraphicsExtensions",
  219. "AlturaPorts/TDMPlugIns/common/**",
  220. "AlturaPorts/TDMPlugIns/common/PI_LibInterface",
  221. "AlturaPorts/TDMPlugIns/PACEProtection/**",
  222. "AlturaPorts/TDMPlugIns/SignalProcessing/**",
  223. "AlturaPorts/OMS/Headers",
  224. "AlturaPorts/Fic/Interfaces/**",
  225. "AlturaPorts/Fic/Source/SignalNets",
  226. "AlturaPorts/DSIPublicInterface/PublicHeaders",
  227. "DAEWin/Include",
  228. "AlturaPorts/DigiPublic/Interfaces",
  229. "AlturaPorts/DigiPublic",
  230. "AlturaPorts/NewFileLibs/DOA",
  231. "AlturaPorts/NewFileLibs/Cmn",
  232. "xplat/AVX/avx2/avx2sdk/inc",
  233. "xplat/AVX/avx2/avx2sdk/utils" };
  234. for (int i = 0; i < numElementsInArray (p); ++i)
  235. exporter.addToExtraSearchPaths (rtasFolder.getChildFile (p[i]));
  236. }
  237. }
  238. static void prepareExporter (ProjectExporter& exporter, ProjectSaver& projectSaver, const File& moduleFolder)
  239. {
  240. fixMissingRTASValues (exporter);
  241. exporter.xcodeCanUseDwarf = false;
  242. exporter.msvcTargetSuffix = ".dpm";
  243. exporter.msvcNeedsDLLRuntimeLib = true;
  244. RelativePath rtasFolder (getRTASFolder (exporter).toString(), RelativePath::projectFolder);
  245. exporter.msvcExtraPreprocessorDefs.set ("JucePlugin_WinBag_path", CodeHelpers::addEscapeChars (rtasFolder.getChildFile ("WinBag")
  246. .toWindowsStyle().quoted()));
  247. String msvcPathToRTASFolder (exporter.getJucePathFromTargetFolder()
  248. .getChildFile ("modules/juce_audio_plugin_client/RTAS")
  249. .toWindowsStyle() + "\\");
  250. exporter.msvcExtraLinkerOptions = "/FORCE:multiple";
  251. exporter.msvcDelayLoadedDLLs = "DAE.dll; DigiExt.dll; DSI.dll; PluginLib.dll; DSPManager.dll";
  252. exporter.msvcModuleDefinitionFile = msvcPathToRTASFolder + "juce_RTAS_WinExports.def";
  253. exporter.msvcPostBuildOutputs = "\"$(TargetPath)\".rsr";
  254. exporter.msvcPostBuildCommand = "copy /Y \"" + msvcPathToRTASFolder + "juce_RTAS_WinResources.rsr"
  255. + "\" \"$(TargetPath)\".rsr";
  256. exporter.xcodeExtraLibrariesDebug.add (rtasFolder.getChildFile ("MacBag/Libs/Debug/libPluginLibrary.a"));
  257. exporter.xcodeExtraLibrariesRelease.add (rtasFolder.getChildFile ("MacBag/Libs/Release/libPluginLibrary.a"));
  258. writePluginCharacteristicsFile (projectSaver);
  259. addExtraSearchPaths (exporter);
  260. }
  261. static void createPropertyEditors (const ProjectExporter& exporter, Array <PropertyComponent*>& props)
  262. {
  263. if (exporter.isXcode() || exporter.isVisualStudio())
  264. {
  265. fixMissingRTASValues (exporter);
  266. props.add (new TextPropertyComponent (getRTASFolder (exporter), "RTAS Folder", 1024, false));
  267. props.getLast()->setTooltip ("If you're building an RTAS, this must be the folder containing the RTAS SDK. This should be an absolute path.");
  268. }
  269. }
  270. }
  271. //==============================================================================
  272. namespace AUHelpers
  273. {
  274. static void prepareExporter (ProjectExporter& exporter, ProjectSaver& projectSaver)
  275. {
  276. writePluginCharacteristicsFile (projectSaver);
  277. if (exporter.isXcode())
  278. {
  279. exporter.extraSearchPaths.add ("$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility");
  280. exporter.extraSearchPaths.add ("$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility");
  281. exporter.xcodeFrameworks.addTokens ("AudioUnit CoreAudioKit", false);
  282. Project::Item subGroup (projectSaver.getGeneratedCodeGroup().addNewSubGroup ("Juce AU Wrapper", -1));
  283. subGroup.setID ("__juceappleaufiles");
  284. {
  285. #define JUCE_AU_PUBLICUTILITY "${DEVELOPER_DIR}/Extras/CoreAudio/PublicUtility/"
  286. #define JUCE_AU_PUBLIC "${DEVELOPER_DIR}/Extras/CoreAudio/AudioUnits/AUPublic/"
  287. const char* appleAUFiles[] = { JUCE_AU_PUBLICUTILITY "CADebugMacros.h",
  288. JUCE_AU_PUBLICUTILITY "CAAUParameter.cpp",
  289. JUCE_AU_PUBLICUTILITY "CAAUParameter.h",
  290. JUCE_AU_PUBLICUTILITY "CAAudioChannelLayout.cpp",
  291. JUCE_AU_PUBLICUTILITY "CAAudioChannelLayout.h",
  292. JUCE_AU_PUBLICUTILITY "CAMutex.cpp",
  293. JUCE_AU_PUBLICUTILITY "CAMutex.h",
  294. JUCE_AU_PUBLICUTILITY "CAStreamBasicDescription.cpp",
  295. JUCE_AU_PUBLICUTILITY "CAStreamBasicDescription.h",
  296. JUCE_AU_PUBLICUTILITY "CAVectorUnitTypes.h",
  297. JUCE_AU_PUBLICUTILITY "CAVectorUnit.cpp",
  298. JUCE_AU_PUBLICUTILITY "CAVectorUnit.h",
  299. JUCE_AU_PUBLIC "AUViewBase/AUViewLocalizedStringKeys.h",
  300. JUCE_AU_PUBLIC "AUCarbonViewBase/AUCarbonViewDispatch.cpp",
  301. JUCE_AU_PUBLIC "AUCarbonViewBase/AUCarbonViewControl.cpp",
  302. JUCE_AU_PUBLIC "AUCarbonViewBase/AUCarbonViewControl.h",
  303. JUCE_AU_PUBLIC "AUCarbonViewBase/CarbonEventHandler.cpp",
  304. JUCE_AU_PUBLIC "AUCarbonViewBase/CarbonEventHandler.h",
  305. JUCE_AU_PUBLIC "AUCarbonViewBase/AUCarbonViewBase.cpp",
  306. JUCE_AU_PUBLIC "AUCarbonViewBase/AUCarbonViewBase.h",
  307. JUCE_AU_PUBLIC "AUBase/AUBase.cpp",
  308. JUCE_AU_PUBLIC "AUBase/AUBase.h",
  309. JUCE_AU_PUBLIC "AUBase/AUDispatch.cpp",
  310. JUCE_AU_PUBLIC "AUBase/AUDispatch.h",
  311. JUCE_AU_PUBLIC "AUBase/AUInputElement.cpp",
  312. JUCE_AU_PUBLIC "AUBase/AUInputElement.h",
  313. JUCE_AU_PUBLIC "AUBase/AUOutputElement.cpp",
  314. JUCE_AU_PUBLIC "AUBase/AUOutputElement.h",
  315. JUCE_AU_PUBLIC "AUBase/AUResources.r",
  316. JUCE_AU_PUBLIC "AUBase/AUScopeElement.cpp",
  317. JUCE_AU_PUBLIC "AUBase/AUScopeElement.h",
  318. JUCE_AU_PUBLIC "AUBase/ComponentBase.cpp",
  319. JUCE_AU_PUBLIC "AUBase/ComponentBase.h",
  320. JUCE_AU_PUBLIC "OtherBases/AUMIDIBase.cpp",
  321. JUCE_AU_PUBLIC "OtherBases/AUMIDIBase.h",
  322. JUCE_AU_PUBLIC "OtherBases/AUMIDIEffectBase.cpp",
  323. JUCE_AU_PUBLIC "OtherBases/AUMIDIEffectBase.h",
  324. JUCE_AU_PUBLIC "OtherBases/AUOutputBase.cpp",
  325. JUCE_AU_PUBLIC "OtherBases/AUOutputBase.h",
  326. JUCE_AU_PUBLIC "OtherBases/MusicDeviceBase.cpp",
  327. JUCE_AU_PUBLIC "OtherBases/MusicDeviceBase.h",
  328. JUCE_AU_PUBLIC "OtherBases/AUEffectBase.cpp",
  329. JUCE_AU_PUBLIC "OtherBases/AUEffectBase.h",
  330. JUCE_AU_PUBLIC "Utility/AUBuffer.cpp",
  331. JUCE_AU_PUBLIC "Utility/AUBuffer.h",
  332. JUCE_AU_PUBLIC "Utility/AUInputFormatConverter.h",
  333. JUCE_AU_PUBLIC "Utility/AUSilentTimeout.h",
  334. JUCE_AU_PUBLIC "Utility/AUTimestampGenerator.h", 0 };
  335. for (const char** f = appleAUFiles; *f != 0; ++f)
  336. {
  337. const RelativePath file (*f, RelativePath::projectFolder);
  338. subGroup.addRelativeFile (file, -1, file.hasFileExtension ("cpp;mm"));
  339. subGroup.getChild (subGroup.getNumChildren() - 1).getShouldInhibitWarningsValue() = true;
  340. }
  341. }
  342. }
  343. }
  344. }
  345. #endif // __JUCER_AUDIOPLUGINMODULE_JUCEHEADER__