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.

551 lines
31KB

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