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.

149 lines
8.2KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2015 - ROLI Ltd.
  5. Permission is granted to use this software under the terms of either:
  6. a) the GPL v2 (or any later version)
  7. b) the Affero GPL v3
  8. Details of these licenses can be found at: www.gnu.org/licenses
  9. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
  10. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  11. A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  12. ------------------------------------------------------------------------------
  13. To release a closed-source product which uses JUCE, commercial licenses are
  14. available: visit www.juce.com for more information.
  15. ==============================================================================
  16. */
  17. #include "../jucer_Headers.h"
  18. #include "jucer_ProjectExporter.h"
  19. #include "jucer_ProjectSaver.h"
  20. //==============================================================================
  21. namespace
  22. {
  23. inline int countMaxPluginChannels (const String& configString, bool isInput)
  24. {
  25. StringArray configs;
  26. configs.addTokens (configString, ", {}", StringRef());
  27. configs.trim();
  28. configs.removeEmptyStrings();
  29. jassert ((configs.size() & 1) == 0); // looks like a syntax error in the configs?
  30. int maxVal = 0;
  31. for (int i = (isInput ? 0 : 1); i < configs.size(); i += 2)
  32. maxVal = jmax (maxVal, configs[i].getIntValue());
  33. return maxVal;
  34. }
  35. inline String valueToBool (const Value& v)
  36. {
  37. return static_cast<bool> (v.getValue()) ? "1" : "0";
  38. }
  39. inline String valueToStringLiteral (const var& v)
  40. {
  41. return CppTokeniserFunctions::addEscapeChars (v.toString()).quoted();
  42. }
  43. inline String valueToCharLiteral (const var& v)
  44. {
  45. String fourCharCode = v.toString().trim().substring (0, 4);
  46. uint32 hexRepresentation = 0;
  47. for (int i = 0; i < 4; ++i)
  48. hexRepresentation = (hexRepresentation << 8U)
  49. | (static_cast<unsigned int> (fourCharCode[i]) & 0xffU);
  50. return String ("0x") + String::toHexString (static_cast<int> (hexRepresentation))
  51. + String (" // ")
  52. + CppTokeniserFunctions::addEscapeChars (fourCharCode).quoted ('\'');
  53. }
  54. }
  55. //==============================================================================
  56. void ProjectSaver::writePluginCharacteristicsFile()
  57. {
  58. StringPairArray flags;
  59. flags.set ("JucePlugin_Build_VST", valueToBool (project.getShouldBuildVSTAsValue()));
  60. flags.set ("JucePlugin_Build_VST3", valueToBool (project.getShouldBuildVST3AsValue()));
  61. flags.set ("JucePlugin_Build_AU", valueToBool (project.getShouldBuildAUAsValue()));
  62. flags.set ("JucePlugin_Build_AUv3", valueToBool (project.getShouldBuildAUv3AsValue()));
  63. flags.set ("JucePlugin_Build_RTAS", valueToBool (project.getShouldBuildRTASAsValue()));
  64. flags.set ("JucePlugin_Build_AAX", valueToBool (project.getShouldBuildAAXAsValue()));
  65. flags.set ("JucePlugin_Build_STANDALONE", valueToBool (project.getShouldBuildStandalonePluginAsValue()));
  66. flags.set ("JucePlugin_Enable_IAA", valueToBool (project.getShouldEnableIAAAsValue()));
  67. flags.set ("JucePlugin_Name", valueToStringLiteral (project.getPluginName()));
  68. flags.set ("JucePlugin_Desc", valueToStringLiteral (project.getPluginDesc()));
  69. flags.set ("JucePlugin_Manufacturer", valueToStringLiteral (project.getPluginManufacturer()));
  70. flags.set ("JucePlugin_ManufacturerWebsite", valueToStringLiteral (project.getCompanyWebsite()));
  71. flags.set ("JucePlugin_ManufacturerEmail", valueToStringLiteral (project.getCompanyEmail()));
  72. flags.set ("JucePlugin_ManufacturerCode", valueToCharLiteral (project.getPluginManufacturerCode()));
  73. flags.set ("JucePlugin_PluginCode", valueToCharLiteral (project.getPluginCode()));
  74. flags.set ("JucePlugin_IsSynth", valueToBool (project.getPluginIsSynth()));
  75. flags.set ("JucePlugin_WantsMidiInput", valueToBool (project.getPluginWantsMidiInput()));
  76. flags.set ("JucePlugin_ProducesMidiOutput", valueToBool (project.getPluginProducesMidiOut()));
  77. flags.set ("JucePlugin_IsMidiEffect", valueToBool (project.getPluginIsMidiEffectPlugin()));
  78. flags.set ("JucePlugin_EditorRequiresKeyboardFocus", valueToBool (project.getPluginEditorNeedsKeyFocus()));
  79. flags.set ("JucePlugin_Version", project.getVersionString());
  80. flags.set ("JucePlugin_VersionCode", project.getVersionAsHex());
  81. flags.set ("JucePlugin_VersionString", valueToStringLiteral (project.getVersionString()));
  82. flags.set ("JucePlugin_VSTUniqueID", "JucePlugin_PluginCode");
  83. flags.set ("JucePlugin_VSTCategory", project.getPluginVSTCategoryString());
  84. flags.set ("JucePlugin_AUMainType", project.getAUMainTypeString());
  85. flags.set ("JucePlugin_AUSubType", "JucePlugin_PluginCode");
  86. flags.set ("JucePlugin_AUExportPrefix", project.getPluginAUExportPrefix().toString());
  87. flags.set ("JucePlugin_AUExportPrefixQuoted", valueToStringLiteral (project.getPluginAUExportPrefix()));
  88. flags.set ("JucePlugin_AUManufacturerCode", "JucePlugin_ManufacturerCode");
  89. flags.set ("JucePlugin_CFBundleIdentifier", project.getBundleIdentifier().toString());
  90. flags.set ("JucePlugin_RTASCategory", project.getPluginRTASCategoryCode());
  91. flags.set ("JucePlugin_RTASManufacturerCode", "JucePlugin_ManufacturerCode");
  92. flags.set ("JucePlugin_RTASProductId", "JucePlugin_PluginCode");
  93. flags.set ("JucePlugin_RTASDisableBypass", valueToBool (project.getPluginRTASBypassDisabled()));
  94. flags.set ("JucePlugin_RTASDisableMultiMono", valueToBool (project.getPluginRTASMultiMonoDisabled()));
  95. flags.set ("JucePlugin_AAXIdentifier", project.getAAXIdentifier().toString());
  96. flags.set ("JucePlugin_AAXManufacturerCode", "JucePlugin_ManufacturerCode");
  97. flags.set ("JucePlugin_AAXProductId", "JucePlugin_PluginCode");
  98. flags.set ("JucePlugin_AAXCategory", project.getPluginAAXCategory().toString());
  99. flags.set ("JucePlugin_AAXDisableBypass", valueToBool (project.getPluginAAXBypassDisabled()));
  100. flags.set ("JucePlugin_AAXDisableMultiMono", valueToBool (project.getPluginAAXMultiMonoDisabled()));
  101. flags.set ("JucePlugin_IAAType", valueToCharLiteral (project.getIAATypeCode()));
  102. flags.set ("JucePlugin_IAASubType", "JucePlugin_PluginCode");
  103. flags.set ("JucePlugin_IAAName", project.getIAAPluginName().quoted());
  104. {
  105. String plugInChannelConfig = project.getPluginChannelConfigs().toString();
  106. if (plugInChannelConfig.isNotEmpty())
  107. {
  108. flags.set ("JucePlugin_MaxNumInputChannels", String (countMaxPluginChannels (plugInChannelConfig, true)));
  109. flags.set ("JucePlugin_MaxNumOutputChannels", String (countMaxPluginChannels (plugInChannelConfig, false)));
  110. flags.set ("JucePlugin_PreferredChannelConfigurations", plugInChannelConfig);
  111. }
  112. }
  113. MemoryOutputStream mem;
  114. mem << "//==============================================================================" << newLine
  115. << "// Audio plugin settings.." << newLine
  116. << newLine;
  117. for (int i = 0; i < flags.size(); ++i)
  118. {
  119. mem << "#ifndef " << flags.getAllKeys()[i] << newLine
  120. << " #define " << flags.getAllKeys()[i].paddedRight (' ', 32) << " "
  121. << flags.getAllValues()[i] << newLine
  122. << "#endif" << newLine;
  123. }
  124. setExtraAppConfigFileContent (mem.toString());
  125. }