Browse Source

Android mono audio device fix. More introjucer work.

tags/2021-05-28
Julian Storer 14 years ago
parent
commit
bf68f7932e
12 changed files with 347 additions and 180 deletions
  1. +5
    -84
      extras/Introjucer/Source/Project/jucer_Project.cpp
  2. +0
    -20
      extras/Introjucer/Source/Project/jucer_Project.h
  3. +0
    -6
      extras/Introjucer/Source/Project/jucer_ProjectExport_MSVC.h
  4. +0
    -3
      extras/Introjucer/Source/Project/jucer_ProjectExport_Make.h
  5. +0
    -6
      extras/Introjucer/Source/Project/jucer_ProjectExport_XCode.h
  6. +0
    -4
      extras/Introjucer/Source/Project/jucer_ProjectExporter.h
  7. +303
    -40
      extras/Introjucer/Source/Project/jucer_ProjectType.cpp
  8. +9
    -7
      extras/Introjucer/Source/Project/jucer_ProjectType.h
  9. +14
    -4
      juce_amalgamated.cpp
  10. +1
    -1
      juce_amalgamated.h
  11. +1
    -1
      src/core/juce_StandardHeader.h
  12. +14
    -4
      src/native/android/juce_android_Audio.cpp

+ 5
- 84
extras/Introjucer/Source/Project/jucer_Project.cpp View File

@@ -126,30 +126,7 @@ void Project::setMissingDefaultValues()
if (! projectRoot.getChildWithName (Tags::exporters).isValid())
createDefaultExporters();
const String sanitisedProjectName (CodeHelpers::makeValidIdentifier (getProjectName().toString(), false, true, false));
if (! projectRoot.hasProperty (Ids::buildVST))
{
shouldBuildVST() = true;
shouldBuildRTAS() = false;
shouldBuildAU() = true;
getPluginName() = getProjectName().toString();
getPluginDesc() = getProjectName().toString();
getPluginManufacturer() = "yourcompany";
getPluginManufacturerCode() = "Manu";
getPluginCode() = "Plug";
getPluginChannelConfigs() = "{1, 1}, {2, 2}";
getPluginIsSynth() = false;
getPluginWantsMidiInput() = false;
getPluginProducesMidiOut() = false;
getPluginSilenceInProducesSilenceOut() = false;
getPluginTailLengthSeconds() = 0;
getPluginEditorNeedsKeyFocus() = false;
getPluginAUExportPrefix() = sanitisedProjectName + "AU";
getPluginAUCocoaViewClassName() = sanitisedProjectName + "AU_V1";
getPluginRTASCategory() = String::empty;
}
getProjectType().setMissingProjectProperties (*this);
if (! projectRoot.hasProperty (Ids::bundleIdentifier))
setBundleIdentifierToDefault();
@@ -212,6 +189,9 @@ void Project::setLastDocumentOpened (const File& file)
//==============================================================================
void Project::valueTreePropertyChanged (ValueTree& tree, const Identifier& property)
{
if (property == Ids::projectType)
setMissingDefaultValues();
if (getProjectType().isLibrary())
getJuceLinkageModeValue() = notLinkedToJuce;
@@ -369,66 +349,7 @@ void Project::createPropertyEditors (Array <PropertyComponent*>& props)
props.getLast()->setTooltip ("Sets an icon to use for the executable.");
}
if (getProjectType().isAudioPlugin())
{
props.add (new BooleanPropertyComponent (shouldBuildVST(), "Build VST", "Enabled"));
props.getLast()->setTooltip ("Whether the project should produce a VST plugin.");
props.add (new BooleanPropertyComponent (shouldBuildAU(), "Build AudioUnit", "Enabled"));
props.getLast()->setTooltip ("Whether the project should produce an AudioUnit plugin.");
props.add (new BooleanPropertyComponent (shouldBuildRTAS(), "Build RTAS", "Enabled"));
props.getLast()->setTooltip ("Whether the project should produce an RTAS plugin.");
}
if (getProjectType().isAudioPlugin())
{
props.add (new TextPropertyComponent (getPluginName(), "Plugin Name", 128, false));
props.getLast()->setTooltip ("The name of your plugin (keep it short!)");
props.add (new TextPropertyComponent (getPluginDesc(), "Plugin Description", 256, false));
props.getLast()->setTooltip ("A short description of your plugin.");
props.add (new TextPropertyComponent (getPluginManufacturer(), "Plugin Manufacturer", 256, false));
props.getLast()->setTooltip ("The name of your company (cannot be blank).");
props.add (new TextPropertyComponent (getPluginManufacturerCode(), "Plugin Manufacturer Code", 4, false));
props.getLast()->setTooltip ("A four-character unique ID for your company. Note that for AU compatibility, this must contain at least one upper-case letter!");
props.add (new TextPropertyComponent (getPluginCode(), "Plugin Code", 4, false));
props.getLast()->setTooltip ("A four-character unique ID for your plugin. Note that for AU compatibility, this must contain at least one upper-case letter!");
props.add (new TextPropertyComponent (getPluginChannelConfigs(), "Plugin Channel Configurations", 256, false));
props.getLast()->setTooltip ("This is the set of input/output channel configurations that your plugin can handle. The list is a comma-separated set of pairs of values in the form { numInputs, numOutputs }, and each "
"pair indicates a valid configuration that the plugin can handle. So for example, {1, 1}, {2, 2} means that the plugin can be used in just two configurations: either with 1 input "
"and 1 output, or with 2 inputs and 2 outputs.");
props.add (new BooleanPropertyComponent (getPluginIsSynth(), "Plugin is a Synth", "Is a Synth"));
props.getLast()->setTooltip ("Enable this if you want your plugin to be treated as a synth or generator. It doesn't make much difference to the plugin itself, but some hosts treat synths differently to other plugins.");
props.add (new BooleanPropertyComponent (getPluginWantsMidiInput(), "Plugin Midi Input", "Plugin wants midi input"));
props.getLast()->setTooltip ("Enable this if you want your plugin to accept midi messages.");
props.add (new BooleanPropertyComponent (getPluginProducesMidiOut(), "Plugin Midi Output", "Plugin produces midi output"));
props.getLast()->setTooltip ("Enable this if your plugin is going to produce midi messages.");
props.add (new BooleanPropertyComponent (getPluginSilenceInProducesSilenceOut(), "Silence", "Silence in produces silence out"));
props.getLast()->setTooltip ("Enable this if your plugin has no tail - i.e. if passing a silent buffer to it will always result in a silent buffer being produced.");
props.add (new TextPropertyComponent (getPluginTailLengthSeconds(), "Tail Length (in seconds)", 12, false));
props.getLast()->setTooltip ("This indicates the length, in seconds, of the plugin's tail. This information may or may not be used by the host.");
props.add (new BooleanPropertyComponent (getPluginEditorNeedsKeyFocus(), "Key Focus", "Plugin editor requires keyboard focus"));
props.getLast()->setTooltip ("Enable this if your plugin needs keyboard input - some hosts can be a bit funny about keyboard focus..");
props.add (new TextPropertyComponent (getPluginAUExportPrefix(), "Plugin AU Export Prefix", 64, false));
props.getLast()->setTooltip ("A prefix for the names of exported entry-point functions that the component exposes - typically this will be a version of your plugin's name that can be used as part of a C++ token.");
props.add (new TextPropertyComponent (getPluginAUCocoaViewClassName(), "Plugin AU Cocoa View Name", 64, false));
props.getLast()->setTooltip ("In an AU, this is the name of Cocoa class that creates the UI. Some hosts bizarrely display the class-name, so you might want to make it reflect your plugin. But the name must be "
"UNIQUE to this exact version of your plugin, to avoid objective-C linkage mix-ups that happen when different plugins containing the same class-name are loaded simultaneously.");
props.add (new TextPropertyComponent (getPluginRTASCategory(), "Plugin RTAS Category", 64, false));
props.getLast()->setTooltip ("(Leave this blank if your plugin is a synth). This is one of the RTAS categories from FicPluginEnums.h, such as: ePlugInCategory_None, ePlugInCategory_EQ, ePlugInCategory_Dynamics, "
"ePlugInCategory_PitchShift, ePlugInCategory_Reverb, ePlugInCategory_Delay, "
"ePlugInCategory_Modulation, ePlugInCategory_Harmonic, ePlugInCategory_NoiseReduction, "
"ePlugInCategory_Dither, ePlugInCategory_SoundField");
}
getProjectType().createPropertyEditors(*this, props);
props.add (new TextPropertyComponent (getProjectPreprocessorDefs(), "Preprocessor definitions", 32768, false));
props.getLast()->setTooltip ("Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash.");


+ 0
- 20
extras/Introjucer/Source/Project/jucer_Project.h View File

@@ -106,26 +106,6 @@ public:
Image getBigIcon();
Image getSmallIcon();
Value shouldBuildVST() const { return getProjectValue ("buildVST"); }
Value shouldBuildRTAS() const { return getProjectValue ("buildRTAS"); }
Value shouldBuildAU() const { return getProjectValue ("buildAU"); }
Value getPluginName() const { return getProjectValue ("pluginName"); }
Value getPluginDesc() const { return getProjectValue ("pluginDesc"); }
Value getPluginManufacturer() const { return getProjectValue ("pluginManufacturer"); }
Value getPluginManufacturerCode() const { return getProjectValue ("pluginManufacturerCode"); }
Value getPluginCode() const { return getProjectValue ("pluginCode"); }
Value getPluginChannelConfigs() const { return getProjectValue ("pluginChannelConfigs"); }
Value getPluginIsSynth() const { return getProjectValue ("pluginIsSynth"); }
Value getPluginWantsMidiInput() const { return getProjectValue ("pluginWantsMidiIn"); }
Value getPluginProducesMidiOut() const { return getProjectValue ("pluginProducesMidiOut"); }
Value getPluginSilenceInProducesSilenceOut() const { return getProjectValue ("pluginSilenceInIsSilenceOut"); }
Value getPluginTailLengthSeconds() const { return getProjectValue ("pluginTailLength"); }
Value getPluginEditorNeedsKeyFocus() const { return getProjectValue ("pluginEditorRequiresKeys"); }
Value getPluginAUExportPrefix() const { return getProjectValue ("pluginAUExportPrefix"); }
Value getPluginAUCocoaViewClassName() const { return getProjectValue ("pluginAUViewClass"); }
Value getPluginRTASCategory() const { return getProjectValue ("pluginRTASCategory"); }
//==============================================================================
File getAppIncludeFile() const { return getGeneratedCodeFolder().getChildFile (getJuceSourceHFilename()); }
File getGeneratedCodeFolder() const { return getFile().getSiblingFile ("JuceLibraryCode"); }


+ 0
- 6
extras/Introjucer/Source/Project/jucer_ProjectExport_MSVC.h View File

@@ -40,12 +40,6 @@ public:
if (getTargetLocation().toString().isEmpty())
getTargetLocation() = getDefaultBuildsRootFolder() + folderName;
if (getVSTFolder().toString().isEmpty())
getVSTFolder() = "c:\\SDKs\\vstsdk2.4";
if (getRTASFolder().toString().isEmpty())
getRTASFolder() = "c:\\SDKs\\PT_80_SDK";
if ((int) getLibraryType().getValue() <= 0)
getLibraryType() = 1;


+ 0
- 3
extras/Introjucer/Source/Project/jucer_ProjectExport_Make.h View File

@@ -54,9 +54,6 @@ public:
if (getTargetLocation().toString().isEmpty())
getTargetLocation() = getDefaultBuildsRootFolder() + "Linux";
if (getVSTFolder().toString().isEmpty())
getVSTFolder() = "~/SDKs/vstsdk2.4";
}
//==============================================================================


+ 0
- 6
extras/Introjucer/Source/Project/jucer_ProjectExport_XCode.h View File

@@ -50,12 +50,6 @@ public:
if (getTargetLocation().toString().isEmpty())
getTargetLocation() = getDefaultBuildsRootFolder() + (iPhone ? "iOS" : "MacOSX");
if (getVSTFolder().toString().isEmpty())
getVSTFolder() = "~/SDKs/vstsdk2.4";
if (getRTASFolder().toString().isEmpty())
getRTASFolder() = "~/SDKs/PT_80_SDK";
if (getSettings() ["objCExtraSuffix"].isVoid())
getObjCSuffix() = createAlphaNumericUID();
}


+ 0
- 4
extras/Introjucer/Source/Project/jucer_ProjectExporter.h View File

@@ -75,10 +75,6 @@ public:
Value getJuceFolder() const { return getSetting (Ids::juceFolder); }
Value getTargetLocation() const { return getSetting (Ids::targetFolder); }
Value getVSTFolder() const { return getSetting (Ids::vstFolder); }
Value getRTASFolder() const { return getSetting (Ids::rtasFolder); }
Value getAUFolder() const { return getSetting (Ids::auFolder); }
Value getExtraCompilerFlags() const { return getSetting (Ids::extraCompilerFlags); }
Value getExtraLinkerFlags() const { return getSetting (Ids::extraLinkerFlags); }


+ 303
- 40
extras/Introjucer/Source/Project/jucer_ProjectType.cpp View File

@@ -27,6 +27,104 @@
#include "jucer_ProjectExporter.h"
#include "jucer_ProjectSaver.h"
//==============================================================================
class JuceModule
{
public:
JuceModule (const File& file)
: moduleInfo (JSON::parse (file)),
moduleFolder (file.getParentDirectory())
{
}
static StringArray findAllModuleIDs()
{
StringArray ids;
DirectoryIterator iter (getModulesFolder(), false, "*", File::findDirectories);
while (iter.next())
{
const File moduleDef (iter.getFile().getChildFile ("juce_module.txt"));
if (moduleDef.exists())
{
ScopedPointer<JuceModule> m (new JuceModule (moduleDef));
jassert (m->isValid());
if (m->isValid())
ids.add (m->getID());
}
}
return ids;
}
static JuceModule* createModuleForID (const String& moduleID)
{
DirectoryIterator iter (getModulesFolder(), false, "*", File::findDirectories);
while (iter.next())
{
const File moduleDef (iter.getFile().getChildFile ("juce_module.txt"));
if (moduleDef.exists())
{
ScopedPointer<JuceModule> m (new JuceModule (moduleDef));
if (m->getID() == moduleID)
return m.release();
}
}
return nullptr;
}
String getID() const { return moduleInfo ["id"]; }
bool isValid() const { return getID().isNotEmpty(); }
void getDependencies (OwnedArray<JuceModule>& dependencies) const
{
const Array<var>* const deps = moduleInfo ["dependencies"].getArray();
if (deps != nullptr)
{
for (int i = 0; i < deps->size(); ++i)
{
const String requiredID (deps->getUnchecked(i) ["id"].toString());
if (requiredID.isNotEmpty()
&& ! containsModule (dependencies, requiredID))
{
JuceModule* const m = createModuleForID (requiredID);
if (m != nullptr)
dependencies.add (m);
}
}
}
}
var moduleInfo;
File moduleFolder;
private:
static bool containsModule (const OwnedArray<JuceModule>& modules, const String& requiredID)
{
for (int i = modules.size(); --i >= 0;)
if (modules.getUnchecked(i)->getID() == requiredID)
return true;
return false;
}
static File getModulesFolder()
{
return StoredSettings::getInstance()->getLastKnownJuceFolder().getChildFile ("modules");
}
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceModule);
};
//==============================================================================
LibraryModule::LibraryModule()
@@ -36,9 +134,11 @@ LibraryModule::LibraryModule()
//==============================================================================
namespace
{
Value getVSTFolder (const ProjectExporter& exporter) { return exporter.getSetting (Ids::vstFolder); }
void addVSTFolderToPath (const ProjectExporter& exporter, StringArray& searchPaths)
{
const String vstFolder (exporter.getVSTFolder().toString());
const String vstFolder (getVSTFolder (exporter).toString());
if (vstFolder.isNotEmpty())
{
@@ -53,7 +153,7 @@ namespace
void createVSTPathEditor (const ProjectExporter& exporter, Array <PropertyComponent*>& props)
{
props.add (new TextPropertyComponent (exporter.getVSTFolder(), "VST Folder", 1024, false));
props.add (new TextPropertyComponent (getVSTFolder (exporter), "VST Folder", 1024, false));
props.getLast()->setTooltip ("If you're building a VST, this must be the folder containing the VST SDK. This should be an absolute path.");
}
@@ -72,7 +172,27 @@ namespace
return maxVal;
}
static void writePluginCharacteristics (Project& project, OutputStream& out)
Value shouldBuildVST (const Project& project) { return project.getProjectValue ("buildVST"); }
Value shouldBuildRTAS (const Project& project) { return project.getProjectValue ("buildRTAS"); }
Value shouldBuildAU (const Project& project) { return project.getProjectValue ("buildAU"); }
Value getPluginName (const Project& project) { return project.getProjectValue ("pluginName"); }
Value getPluginDesc (const Project& project) { return project.getProjectValue ("pluginDesc"); }
Value getPluginManufacturer (const Project& project) { return project.getProjectValue ("pluginManufacturer"); }
Value getPluginManufacturerCode (const Project& project) { return project.getProjectValue ("pluginManufacturerCode"); }
Value getPluginCode (const Project& project) { return project.getProjectValue ("pluginCode"); }
Value getPluginChannelConfigs (const Project& project) { return project.getProjectValue ("pluginChannelConfigs"); }
Value getPluginIsSynth (const Project& project) { return project.getProjectValue ("pluginIsSynth"); }
Value getPluginWantsMidiInput (const Project& project) { return project.getProjectValue ("pluginWantsMidiIn"); }
Value getPluginProducesMidiOut (const Project& project) { return project.getProjectValue ("pluginProducesMidiOut"); }
Value getPluginSilenceInProducesSilenceOut (const Project& project) { return project.getProjectValue ("pluginSilenceInIsSilenceOut"); }
Value getPluginTailLengthSeconds (const Project& project) { return project.getProjectValue ("pluginTailLength"); }
Value getPluginEditorNeedsKeyFocus (const Project& project) { return project.getProjectValue ("pluginEditorRequiresKeys"); }
Value getPluginAUExportPrefix (const Project& project) { return project.getProjectValue ("pluginAUExportPrefix"); }
Value getPluginAUCocoaViewClassName (const Project& project) { return project.getProjectValue ("pluginAUViewClass"); }
Value getPluginRTASCategory (const Project& project) { return project.getProjectValue ("pluginRTASCategory"); }
void writePluginCharacteristics (Project& project, OutputStream& out)
{
String headerGuard ("__PLUGINCHARACTERISTICS_" + project.getProjectUID().toUpperCase() + "__");
@@ -86,36 +206,36 @@ namespace
<< "#ifndef " << headerGuard << newLine
<< "#define " << headerGuard << newLine
<< newLine
<< "#define JucePlugin_Build_VST " << ((bool) project.shouldBuildVST().getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine
<< "#define JucePlugin_Build_AU " << ((bool) project.shouldBuildAU().getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine
<< "#define JucePlugin_Build_RTAS " << ((bool) project.shouldBuildRTAS().getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine
<< "#define JucePlugin_Build_VST " << ((bool) shouldBuildVST (project).getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine
<< "#define JucePlugin_Build_AU " << ((bool) shouldBuildAU (project).getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine
<< "#define JucePlugin_Build_RTAS " << ((bool) shouldBuildRTAS (project).getValue() ? 1 : 0) << " // (If you change this value, you'll also need to re-export the projects using the Jucer)" << newLine
<< newLine
<< "#define JucePlugin_Name " << project.getPluginName().toString().quoted() << newLine
<< "#define JucePlugin_Desc " << project.getPluginDesc().toString().quoted() << newLine
<< "#define JucePlugin_Manufacturer " << project.getPluginManufacturer().toString().quoted() << newLine
<< "#define JucePlugin_ManufacturerCode '" << project.getPluginManufacturerCode().toString().trim().substring (0, 4) << "'" << newLine
<< "#define JucePlugin_PluginCode '" << project.getPluginCode().toString().trim().substring (0, 4) << "'" << newLine
<< "#define JucePlugin_MaxNumInputChannels " << countMaxPluginChannels (project.getPluginChannelConfigs().toString(), true) << newLine
<< "#define JucePlugin_MaxNumOutputChannels " << countMaxPluginChannels (project.getPluginChannelConfigs().toString(), false) << newLine
<< "#define JucePlugin_PreferredChannelConfigurations " << project.getPluginChannelConfigs().toString() << newLine
<< "#define JucePlugin_IsSynth " << ((bool) project.getPluginIsSynth().getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_WantsMidiInput " << ((bool) project.getPluginWantsMidiInput().getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_ProducesMidiOutput " << ((bool) project.getPluginProducesMidiOut().getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_SilenceInProducesSilenceOut " << ((bool) project.getPluginSilenceInProducesSilenceOut().getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_TailLengthSeconds " << (double) project.getPluginTailLengthSeconds().getValue() << newLine
<< "#define JucePlugin_EditorRequiresKeyboardFocus " << ((bool) project.getPluginEditorNeedsKeyFocus().getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_VersionCode " << project.getVersionAsHex() << newLine
<< "#define JucePlugin_VersionString " << project.getVersion().toString().quoted() << newLine
<< "#define JucePlugin_Name " << getPluginName (project).toString().quoted() << newLine
<< "#define JucePlugin_Desc " << getPluginDesc (project).toString().quoted() << newLine
<< "#define JucePlugin_Manufacturer " << getPluginManufacturer (project).toString().quoted() << newLine
<< "#define JucePlugin_ManufacturerCode '" << getPluginManufacturerCode (project).toString().trim().substring (0, 4) << "'" << newLine
<< "#define JucePlugin_PluginCode '" << getPluginCode (project).toString().trim().substring (0, 4) << "'" << newLine
<< "#define JucePlugin_MaxNumInputChannels " << countMaxPluginChannels (getPluginChannelConfigs (project).toString(), true) << newLine
<< "#define JucePlugin_MaxNumOutputChannels " << countMaxPluginChannels (getPluginChannelConfigs (project).toString(), false) << newLine
<< "#define JucePlugin_PreferredChannelConfigurations " << getPluginChannelConfigs (project).toString() << newLine
<< "#define JucePlugin_IsSynth " << ((bool) getPluginIsSynth (project).getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_WantsMidiInput " << ((bool) getPluginWantsMidiInput (project).getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_ProducesMidiOutput " << ((bool) getPluginProducesMidiOut (project).getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_SilenceInProducesSilenceOut " << ((bool) getPluginSilenceInProducesSilenceOut (project).getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_TailLengthSeconds " << (double) getPluginTailLengthSeconds (project).getValue() << newLine
<< "#define JucePlugin_EditorRequiresKeyboardFocus " << ((bool) getPluginEditorNeedsKeyFocus (project).getValue() ? 1 : 0) << newLine
<< "#define JucePlugin_VersionCode " << project.getVersionAsHex() << newLine
<< "#define JucePlugin_VersionString " << project.getVersion().toString().quoted() << newLine
<< "#define JucePlugin_VSTUniqueID JucePlugin_PluginCode" << newLine
<< "#define JucePlugin_VSTCategory " << ((bool) project.getPluginIsSynth().getValue() ? "kPlugCategSynth" : "kPlugCategEffect") << newLine
<< "#define JucePlugin_AUMainType " << ((bool) project.getPluginIsSynth().getValue() ? "kAudioUnitType_MusicDevice" : "kAudioUnitType_Effect") << newLine
<< "#define JucePlugin_VSTCategory " << ((bool) getPluginIsSynth (project).getValue() ? "kPlugCategSynth" : "kPlugCategEffect") << newLine
<< "#define JucePlugin_AUMainType " << ((bool) getPluginIsSynth (project).getValue() ? "kAudioUnitType_MusicDevice" : "kAudioUnitType_Effect") << newLine
<< "#define JucePlugin_AUSubType JucePlugin_PluginCode" << newLine
<< "#define JucePlugin_AUExportPrefix " << project.getPluginAUExportPrefix().toString() << newLine
<< "#define JucePlugin_AUExportPrefixQuoted " << project.getPluginAUExportPrefix().toString().quoted() << newLine
<< "#define JucePlugin_AUExportPrefix " << getPluginAUExportPrefix (project).toString() << newLine
<< "#define JucePlugin_AUExportPrefixQuoted " << getPluginAUExportPrefix (project).toString().quoted() << newLine
<< "#define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode" << newLine
<< "#define JucePlugin_CFBundleIdentifier " << project.getBundleIdentifier().toString() << newLine
<< "#define JucePlugin_AUCocoaViewClassName " << project.getPluginAUCocoaViewClassName().toString() << newLine
<< "#define JucePlugin_RTASCategory " << ((bool) project.getPluginIsSynth().getValue() ? "ePlugInCategory_SWGenerators" : "ePlugInCategory_None") << newLine
<< "#define JucePlugin_CFBundleIdentifier " << project.getBundleIdentifier().toString() << newLine
<< "#define JucePlugin_AUCocoaViewClassName " << getPluginAUCocoaViewClassName (project).toString() << newLine
<< "#define JucePlugin_RTASCategory " << ((bool) getPluginIsSynth (project).getValue() ? "ePlugInCategory_SWGenerators" : "ePlugInCategory_None") << newLine
<< "#define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode" << newLine
<< "#define JucePlugin_RTASProductId JucePlugin_PluginCode" << newLine;
@@ -344,6 +464,7 @@ public:
void prepareExporter (ProjectExporter& exporter, ProjectSaver& projectSaver) const
{
fixMissingValues (exporter);
writePluginCharacteristicsFile (projectSaver);
exporter.makefileTargetSuffix = ".so";
@@ -377,12 +498,24 @@ public:
void createPropertyEditors (const ProjectExporter& exporter, Array <PropertyComponent*>& props) const
{
fixMissingValues (exporter);
createVSTPathEditor (exporter, props);
}
void getConfigFlags (Project& project, OwnedArray<Project::ConfigFlag>& flags) const
{
}
static void fixMissingValues (const ProjectExporter& exporter)
{
if (getVSTFolder (exporter).toString().isEmpty())
{
if (exporter.isVisualStudio())
getVSTFolder (exporter) = "c:\\SDKs\\vstsdk2.4";
else
getVSTFolder (exporter) = "~/SDKs/vstsdk2.4";
}
}
};
//==============================================================================
@@ -397,12 +530,14 @@ public:
void prepareExporter (ProjectExporter& exporter, ProjectSaver& projectSaver) const
{
fixMissingValues (exporter);
exporter.xcodeCanUseDwarf = false;
exporter.msvcTargetSuffix = ".dpm";
exporter.msvcNeedsDLLRuntimeLib = true;
RelativePath rtasFolder (exporter.getRTASFolder().toString(), RelativePath::projectFolder);
RelativePath rtasFolder (getRTASFolder (exporter).toString(), RelativePath::projectFolder);
exporter.msvcExtraPreprocessorDefs.set ("JucePlugin_WinBag_path", CodeHelpers::addEscapeChars (rtasFolder.getChildFile ("WinBag")
.toWindowsStyle().quoted()));
@@ -457,7 +592,7 @@ public:
void addExtraSearchPaths (const ProjectExporter& exporter, StringArray& paths) const
{
RelativePath rtasFolder (exporter.getRTASFolder().toString(), RelativePath::projectFolder);
RelativePath rtasFolder (getRTASFolder (exporter).toString(), RelativePath::projectFolder);
if (exporter.isVisualStudio())
{
@@ -537,7 +672,9 @@ public:
{
if (exporter.isXcode() || exporter.isVisualStudio())
{
props.add (new TextPropertyComponent (exporter.getRTASFolder(), "RTAS Folder", 1024, false));
fixMissingValues (exporter);
props.add (new TextPropertyComponent (getRTASFolder (exporter), "RTAS Folder", 1024, false));
props.getLast()->setTooltip ("If you're building an RTAS, this must be the folder containing the RTAS SDK. This should be an absolute path.");
}
}
@@ -545,6 +682,19 @@ public:
void getConfigFlags (Project& project, OwnedArray<Project::ConfigFlag>& flags) const
{
}
static void fixMissingValues (const ProjectExporter& exporter)
{
if (getRTASFolder (exporter).toString().isEmpty())
{
if (exporter.isVisualStudio())
getRTASFolder (exporter) = "c:\\SDKs\\PT_80_SDK";
else
getRTASFolder (exporter) = "~/SDKs/PT_80_SDK";
}
}
static Value getRTASFolder (const ProjectExporter& exporter) { return exporter.getSetting (Ids::rtasFolder); }
};
//==============================================================================
@@ -696,6 +846,14 @@ const ProjectType* ProjectType::findType (const String& typeCode)
return nullptr;
}
void ProjectType::setMissingProjectProperties (Project&) const
{
}
void ProjectType::createPropertyEditors (const Project& project, Array <PropertyComponent*>& props) const
{
}
void ProjectType::prepareExporter (ProjectExporter& exporter) const
{
}
@@ -714,6 +872,14 @@ public:
static const char* getTypeName() noexcept { return "guiapp"; }
bool isGUIApplication() const { return true; }
void setMissingProjectProperties (Project&) const
{
}
void createPropertyEditors (const Project& project, Array <PropertyComponent*>& props) const
{
}
void prepareExporter (ProjectExporter& exporter) const
{
exporter.xcodePackageType = "APPL";
@@ -743,6 +909,14 @@ public:
static const char* getTypeName() noexcept { return "consoleapp"; }
bool isCommandLineApp() const { return true; }
void setMissingProjectProperties (Project&) const
{
}
void createPropertyEditors (const Project& project, Array <PropertyComponent*>& props) const
{
}
void prepareExporter (ProjectExporter& exporter) const
{
exporter.xcodeCreatePList = false;
@@ -771,6 +945,14 @@ public:
static const char* getTypeName() noexcept { return "library"; }
bool isLibrary() const { return true; }
void setMissingProjectProperties (Project&) const
{
}
void createPropertyEditors (const Project& project, Array <PropertyComponent*>& props) const
{
}
void prepareExporter (ProjectExporter& exporter) const
{
exporter.xcodeCreatePList = false;
@@ -799,6 +981,92 @@ public:
static const char* getTypeName() noexcept { return "audioplug"; }
bool isAudioPlugin() const { return true; }
void setMissingProjectProperties (Project& project) const
{
if (! project.getProjectRoot().hasProperty (Ids::buildVST))
{
const String sanitisedProjectName (CodeHelpers::makeValidIdentifier (project.getProjectName().toString(), false, true, false));
shouldBuildVST (project) = true;
shouldBuildRTAS (project) = false;
shouldBuildAU (project) = true;
getPluginName (project) = project.getProjectName().toString();
getPluginDesc (project) = project.getProjectName().toString();
getPluginManufacturer (project) = "yourcompany";
getPluginManufacturerCode (project) = "Manu";
getPluginCode (project) = "Plug";
getPluginChannelConfigs (project) = "{1, 1}, {2, 2}";
getPluginIsSynth (project) = false;
getPluginWantsMidiInput (project) = false;
getPluginProducesMidiOut (project) = false;
getPluginSilenceInProducesSilenceOut (project) = false;
getPluginTailLengthSeconds (project) = 0;
getPluginEditorNeedsKeyFocus (project) = false;
getPluginAUExportPrefix (project) = sanitisedProjectName + "AU";
getPluginAUCocoaViewClassName (project) = sanitisedProjectName + "AU_V1";
getPluginRTASCategory (project) = String::empty;
}
}
void createPropertyEditors (const Project& project, Array <PropertyComponent*>& props) const
{
props.add (new BooleanPropertyComponent (shouldBuildVST (project), "Build VST", "Enabled"));
props.getLast()->setTooltip ("Whether the project should produce a VST plugin.");
props.add (new BooleanPropertyComponent (shouldBuildAU (project), "Build AudioUnit", "Enabled"));
props.getLast()->setTooltip ("Whether the project should produce an AudioUnit plugin.");
props.add (new BooleanPropertyComponent (shouldBuildRTAS (project), "Build RTAS", "Enabled"));
props.getLast()->setTooltip ("Whether the project should produce an RTAS plugin.");
props.add (new TextPropertyComponent (getPluginName (project), "Plugin Name", 128, false));
props.getLast()->setTooltip ("The name of your plugin (keep it short!)");
props.add (new TextPropertyComponent (getPluginDesc (project), "Plugin Description", 256, false));
props.getLast()->setTooltip ("A short description of your plugin.");
props.add (new TextPropertyComponent (getPluginManufacturer (project), "Plugin Manufacturer", 256, false));
props.getLast()->setTooltip ("The name of your company (cannot be blank).");
props.add (new TextPropertyComponent (getPluginManufacturerCode (project), "Plugin Manufacturer Code", 4, false));
props.getLast()->setTooltip ("A four-character unique ID for your company. Note that for AU compatibility, this must contain at least one upper-case letter!");
props.add (new TextPropertyComponent (getPluginCode (project), "Plugin Code", 4, false));
props.getLast()->setTooltip ("A four-character unique ID for your plugin. Note that for AU compatibility, this must contain at least one upper-case letter!");
props.add (new TextPropertyComponent (getPluginChannelConfigs (project), "Plugin Channel Configurations", 256, false));
props.getLast()->setTooltip ("This is the set of input/output channel configurations that your plugin can handle. The list is a comma-separated set of pairs of values in the form { numInputs, numOutputs }, and each "
"pair indicates a valid configuration that the plugin can handle. So for example, {1, 1}, {2, 2} means that the plugin can be used in just two configurations: either with 1 input "
"and 1 output, or with 2 inputs and 2 outputs.");
props.add (new BooleanPropertyComponent (getPluginIsSynth (project), "Plugin is a Synth", "Is a Synth"));
props.getLast()->setTooltip ("Enable this if you want your plugin to be treated as a synth or generator. It doesn't make much difference to the plugin itself, but some hosts treat synths differently to other plugins.");
props.add (new BooleanPropertyComponent (getPluginWantsMidiInput (project), "Plugin Midi Input", "Plugin wants midi input"));
props.getLast()->setTooltip ("Enable this if you want your plugin to accept midi messages.");
props.add (new BooleanPropertyComponent (getPluginProducesMidiOut (project), "Plugin Midi Output", "Plugin produces midi output"));
props.getLast()->setTooltip ("Enable this if your plugin is going to produce midi messages.");
props.add (new BooleanPropertyComponent (getPluginSilenceInProducesSilenceOut (project), "Silence", "Silence in produces silence out"));
props.getLast()->setTooltip ("Enable this if your plugin has no tail - i.e. if passing a silent buffer to it will always result in a silent buffer being produced.");
props.add (new TextPropertyComponent (getPluginTailLengthSeconds (project), "Tail Length (in seconds)", 12, false));
props.getLast()->setTooltip ("This indicates the length, in seconds, of the plugin's tail. This information may or may not be used by the host.");
props.add (new BooleanPropertyComponent (getPluginEditorNeedsKeyFocus (project), "Key Focus", "Plugin editor requires keyboard focus"));
props.getLast()->setTooltip ("Enable this if your plugin needs keyboard input - some hosts can be a bit funny about keyboard focus..");
props.add (new TextPropertyComponent (getPluginAUExportPrefix (project), "Plugin AU Export Prefix", 64, false));
props.getLast()->setTooltip ("A prefix for the names of exported entry-point functions that the component exposes - typically this will be a version of your plugin's name that can be used as part of a C++ token.");
props.add (new TextPropertyComponent (getPluginAUCocoaViewClassName (project), "Plugin AU Cocoa View Name", 64, false));
props.getLast()->setTooltip ("In an AU, this is the name of Cocoa class that creates the UI. Some hosts bizarrely display the class-name, so you might want to make it reflect your plugin. But the name must be "
"UNIQUE to this exact version of your plugin, to avoid objective-C linkage mix-ups that happen when different plugins containing the same class-name are loaded simultaneously.");
props.add (new TextPropertyComponent (getPluginRTASCategory (project), "Plugin RTAS Category", 64, false));
props.getLast()->setTooltip ("(Leave this blank if your plugin is a synth). This is one of the RTAS categories from FicPluginEnums.h, such as: ePlugInCategory_None, ePlugInCategory_EQ, ePlugInCategory_Dynamics, "
"ePlugInCategory_PitchShift, ePlugInCategory_Reverb, ePlugInCategory_Delay, "
"ePlugInCategory_Modulation, ePlugInCategory_Harmonic, ePlugInCategory_NoiseReduction, "
"ePlugInCategory_Dither, ePlugInCategory_SoundField");
}
void prepareExporter (ProjectExporter& exporter) const
{
exporter.xcodeIsBundle = true;
@@ -827,14 +1095,9 @@ public:
{
ProjectType::createRequiredModules (project, modules);
if (project.shouldBuildVST().getValue())
modules.add (new VSTLibraryModule());
if (project.shouldBuildRTAS().getValue())
modules.add (new RTASLibraryModule());
if (project.shouldBuildAU().getValue())
modules.add (new AULibraryModule());
if (shouldBuildVST (project).getValue()) modules.add (new VSTLibraryModule());
if (shouldBuildRTAS (project).getValue()) modules.add (new RTASLibraryModule());
if (shouldBuildAU (project).getValue()) modules.add (new AULibraryModule());
}
};


+ 9
- 7
extras/Introjucer/Source/Project/jucer_ProjectType.h View File

@@ -38,11 +38,11 @@ public:
LibraryModule();
virtual ~LibraryModule() {}
virtual void prepareExporter (ProjectExporter& exporter, ProjectSaver& projectSaver) const = 0;
virtual void getHeaderFiles (Project& project, StringArray& includePaths, StringArray& headerGuards) = 0;
virtual void addExtraSearchPaths (const ProjectExporter& exporter, StringArray& paths) const = 0;
virtual void createPropertyEditors (const ProjectExporter& exporter, Array <PropertyComponent*>& props) const = 0;
virtual void getConfigFlags (Project& project, OwnedArray<Project::ConfigFlag>& flags) const = 0;
virtual void prepareExporter (ProjectExporter&, ProjectSaver&) const = 0;
virtual void getHeaderFiles (Project&, StringArray& includePaths, StringArray& headerGuards) = 0;
virtual void addExtraSearchPaths (const ProjectExporter&, StringArray& paths) const = 0;
virtual void createPropertyEditors (const ProjectExporter&, Array <PropertyComponent*>&) const = 0;
virtual void getConfigFlags (Project&, OwnedArray<Project::ConfigFlag>&) const = 0;
};
@@ -71,8 +71,10 @@ public:
static const char* getConsoleAppTypeName();
static const char* getAudioPluginTypeName();
virtual void prepareExporter (ProjectExporter& exporter) const;
virtual void createRequiredModules (Project& project, OwnedArray<LibraryModule>& modules) const;
virtual void setMissingProjectProperties (Project&) const;
virtual void createPropertyEditors (const Project&, Array <PropertyComponent*>&) const;
virtual void prepareExporter (ProjectExporter&) const;
virtual void createRequiredModules (Project&, OwnedArray<LibraryModule>& modules) const;
protected:
ProjectType (const String& type, const String& desc);


+ 14
- 4
juce_amalgamated.cpp View File

@@ -293216,11 +293216,19 @@ public:

jshort* const src = env->GetShortArrayElements (audioBuffer, 0);

for (int chan = 0; chan < numDeviceInputChannels; ++chan)
for (int chan = 0; chan < inputChannelBuffer.getNumChannels(); ++chan)
{
AudioData::Pointer <AudioData::Int16, AudioData::NativeEndian, AudioData::Interleaved, AudioData::Const> s (src + chan, numDeviceInputChannels);
AudioData::Pointer <AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::NonConst> d (inputChannelBuffer.getSampleData (chan));
d.convertSamples (s, actualBufferSize);

if (chan < numDeviceInputChannels)
{
AudioData::Pointer <AudioData::Int16, AudioData::NativeEndian, AudioData::Interleaved, AudioData::Const> s (src + chan, numDeviceInputChannels);
d.convertSamples (s, actualBufferSize);
}
else
{
d.clearSamples (actualBufferSize);
}
}

env->ReleaseShortArrayElements (audioBuffer, src, 0);
@@ -293254,7 +293262,9 @@ public:
for (int chan = 0; chan < numDeviceOutputChannels; ++chan)
{
AudioData::Pointer <AudioData::Int16, AudioData::NativeEndian, AudioData::Interleaved, AudioData::NonConst> d (dest + chan, numDeviceOutputChannels);
AudioData::Pointer <AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::Const> s (outputChannelBuffer.getSampleData (chan));

const float* const sourceChanData = outputChannelBuffer.getSampleData (jmin (chan, outputChannelBuffer.getNumChannels() - 1));
AudioData::Pointer <AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::Const> s (sourceChanData);
d.convertSamples (s, actualBufferSize);
}



+ 1
- 1
juce_amalgamated.h View File

@@ -73,7 +73,7 @@ namespace JuceDummyNamespace {}
*/
#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 54
#define JUCE_BUILDNUMBER 23
#define JUCE_BUILDNUMBER 24

/** Current Juce version number.



+ 1
- 1
src/core/juce_StandardHeader.h View File

@@ -33,7 +33,7 @@
*/
#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 54
#define JUCE_BUILDNUMBER 23
#define JUCE_BUILDNUMBER 24
/** Current Juce version number.


+ 14
- 4
src/native/android/juce_android_Audio.cpp View File

@@ -275,11 +275,19 @@ public:
jshort* const src = env->GetShortArrayElements (audioBuffer, 0);
for (int chan = 0; chan < numDeviceInputChannels; ++chan)
for (int chan = 0; chan < inputChannelBuffer.getNumChannels(); ++chan)
{
AudioData::Pointer <AudioData::Int16, AudioData::NativeEndian, AudioData::Interleaved, AudioData::Const> s (src + chan, numDeviceInputChannels);
AudioData::Pointer <AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::NonConst> d (inputChannelBuffer.getSampleData (chan));
d.convertSamples (s, actualBufferSize);
if (chan < numDeviceInputChannels)
{
AudioData::Pointer <AudioData::Int16, AudioData::NativeEndian, AudioData::Interleaved, AudioData::Const> s (src + chan, numDeviceInputChannels);
d.convertSamples (s, actualBufferSize);
}
else
{
d.clearSamples (actualBufferSize);
}
}
env->ReleaseShortArrayElements (audioBuffer, src, 0);
@@ -313,7 +321,9 @@ public:
for (int chan = 0; chan < numDeviceOutputChannels; ++chan)
{
AudioData::Pointer <AudioData::Int16, AudioData::NativeEndian, AudioData::Interleaved, AudioData::NonConst> d (dest + chan, numDeviceOutputChannels);
AudioData::Pointer <AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::Const> s (outputChannelBuffer.getSampleData (chan));
const float* const sourceChanData = outputChannelBuffer.getSampleData (jmin (chan, outputChannelBuffer.getNumChannels() - 1));
AudioData::Pointer <AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::Const> s (sourceChanData);
d.convertSamples (s, actualBufferSize);
}


Loading…
Cancel
Save