A completely vanilla project builds, and the VST and VST3 work as expected (and pass all tests in pluginval). The AU, however, won’t load into pluginval. Has anyone else experienced this?
Here is the error from auval…
Last login: Sat Jun 30 13:18:05 on ttys000
Anos-iMac:~ anoesisaudio$ cd $HOME/Library/Audio/Plug-ins/Components
Anos-iMac:Components anoesisaudio$ ls
Van.component
Anos-iMac:Components anoesisaudio$ auval -v aufx Ystx Anoe
AU Validation Tool
Version: 1.6.1a1
Copyright 2003-2013, Apple Inc. All Rights Reserved.
Specify -h (-help) for command options
--------------------------------------------------
VALIDATING AUDIO UNIT: 'aufx' - 'Ystx' - 'Anoe'
--------------------------------------------------
ERROR: Cannot get Component's Name strings
ERROR: Error from retrieving Component Version: -50
* * FAIL
--------------------------------------------------
TESTING OPEN TIMES:
FATAL ERROR: didn't find the component
Code:
PluginProcessor.h
/* PluginProcessor.h */
#pragma once
#include "../JuceLibraryCode/JuceHeader.h"
//===========================================================
/**
*/
class VanAudioProcessor : public AudioProcessor
{
public:
//===========================================================
VanAudioProcessor();
~VanAudioProcessor();
//===========================================================
void prepareToPlay (double sampleRate, int samplesPerBlock) override;
void releaseResources() override;
#ifndef JucePlugin_PreferredChannelConfigurations
bool isBusesLayoutSupported (const BusesLayout& layouts) const override;
#endif
void processBlock (AudioBuffer<float>&, MidiBuffer&) override;
//===========================================================
AudioProcessorEditor* createEditor() override;
bool hasEditor() const override;
//===========================================================
const String getName() const override;
bool acceptsMidi() const override;
bool producesMidi() const override;
bool isMidiEffect() const override;
double getTailLengthSeconds() const override;
//===========================================================
int getNumPrograms() override;
int getCurrentProgram() override;
void setCurrentProgram (int index) override;
const String getProgramName (int index) override;
void changeProgramName (int index, const String& newName) override;
//===========================================================
void getStateInformation (MemoryBlock& destData) override;
void setStateInformation (const void* data, int sizeInBytes) override;
private:
//===========================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VanAudioProcessor)
};
PluginProcessor.cpp
/* PluginProcessor.cpp */
#include "PluginProcessor.h"
#include "PluginEditor.h"
//===========================================================
VanAudioProcessor::VanAudioProcessor()
#ifndef JucePlugin_PreferredChannelConfigurations
: AudioProcessor (BusesProperties()
#if ! JucePlugin_IsMidiEffect
#if ! JucePlugin_IsSynth
.withInput ("Input", AudioChannelSet::stereo(), true)
#endif
.withOutput ("Output", AudioChannelSet::stereo(), true)
#endif
)
#endif
{
}
VanAudioProcessor::~VanAudioProcessor()
{
}
//===========================================================
const String VanAudioProcessor::getName() const
{
return JucePlugin_Name;
}
bool VanAudioProcessor::acceptsMidi() const
{
#if JucePlugin_WantsMidiInput
return true;
#else
return false;
#endif
}
bool VanAudioProcessor::producesMidi() const
{
#if JucePlugin_ProducesMidiOutput
return true;
#else
return false;
#endif
}
bool VanAudioProcessor::isMidiEffect() const
{
#if JucePlugin_IsMidiEffect
return true;
#else
return false;
#endif
}
double VanAudioProcessor::getTailLengthSeconds() const
{
return 0.0;
}
int VanAudioProcessor::getNumPrograms()
{
return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs,
// so this should be at least 1, even if you're not really implementing programs.
}
int VanAudioProcessor::getCurrentProgram()
{
return 0;
}
void VanAudioProcessor::setCurrentProgram (int index)
{
}
const String VanAudioProcessor::getProgramName (int index)
{
return {};
}
void VanAudioProcessor::changeProgramName (int index, const String& newName)
{
}
//===========================================================
void VanAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
{
}
void VanAudioProcessor::releaseResources()
{
}
#ifndef JucePlugin_PreferredChannelConfigurations
bool VanAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const
{
#if JucePlugin_IsMidiEffect
ignoreUnused (layouts);
return true;
#else
// This is the place where you check if the layout is supported.
// In this template code we only support mono or stereo.
if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono()
&& layouts.getMainOutputChannelSet() != AudioChannelSet::stereo())
return false;
// This checks if the input layout matches the output layout
#if ! JucePlugin_IsSynth
if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet())
return false;
#endif
return true;
#endif
}
#endif
void VanAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)
{
ScopedNoDenormals noDenormals;
auto totalNumInputChannels = getTotalNumInputChannels();
auto totalNumOutputChannels = getTotalNumOutputChannels();
for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i)
buffer.clear (i, 0, buffer.getNumSamples());
for (int channel = 0; channel < totalNumInputChannels; ++channel)
{
auto* channelData = buffer.getWritePointer (channel);
// ..do something to the data...
}
}
//===========================================================
bool VanAudioProcessor::hasEditor() const
{
return true; // (change this to false if you choose to not supply an editor)
}
AudioProcessorEditor* VanAudioProcessor::createEditor()
{
return new VanAudioProcessorEditor (*this);
}
//===========================================================
void VanAudioProcessor::getStateInformation (MemoryBlock& destData)
{
}
void VanAudioProcessor::setStateInformation (const void* data, int sizeInBytes)
{
}
//===========================================================
// This creates new instances of the plugin..
AudioProcessor* JUCE_CALLTYPE createPluginFilter()
{
return new VanAudioProcessor();
}
PluginEditor.h
/* PluginEditor.h */
#pragma once
#include "../JuceLibraryCode/JuceHeader.h"
#include "PluginProcessor.h"
//===========================================================
/**
*/
class VanAudioProcessorEditor : public AudioProcessorEditor
{
public:
VanAudioProcessorEditor (VanAudioProcessor&);
~VanAudioProcessorEditor();
//===========================================================
void paint (Graphics&) override;
void resized() override;
private:
// This reference is provided as a quick way for your editor to
// access the processor object that created it.
VanAudioProcessor& processor;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VanAudioProcessorEditor)
};
PluginEditor.cpp
/* PluginEditor.cpp */
#include "PluginProcessor.h"
#include "PluginEditor.h"
//===========================================================
VanAudioProcessorEditor::VanAudioProcessorEditor (VanAudioProcessor& p)
: AudioProcessorEditor (&p), processor (p)
{
// Make sure that before the constructor has finished, you've set the
// editor's size to whatever you need it to be.
setSize (400, 300);
}
VanAudioProcessorEditor::~VanAudioProcessorEditor()
{
}
//===========================================================
void VanAudioProcessorEditor::paint (Graphics& g)
{
// (Our component is opaque, so we must completely fill the background with a solid colour)
g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId));
g.setColour (Colours::white);
g.setFont (15.0f);
g.drawFittedText ("Hello World!", getLocalBounds(), Justification::centred, 1);
}
void VanAudioProcessorEditor::resized()
{
// This is generally where you'll want to lay out the positions of any
// subcomponents in your editor..
}