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.

456 lines
26KB

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