DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 3af2221b4c8e12b43382d1ef2be614e2fe0660de
parent db7ee14af9895ac4e878426571c38ab95cb56672
Author: falkTX <falktx@falktx.com>
Date:   Mon, 26 Feb 2024 14:37:31 +0100

Cleanup some AU details, ensure "aumu" has dual IO

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdistrho/src/DistrhoPluginAU.cpp | 109++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Mdistrho/src/DistrhoPluginChecks.h | 79+++++++++++++++++++++++++++++++++++++++++--------------------------------------
2 files changed, 110 insertions(+), 78 deletions(-)

diff --git a/distrho/src/DistrhoPluginAU.cpp b/distrho/src/DistrhoPluginAU.cpp @@ -218,18 +218,24 @@ typedef std::vector<RenderListener> RenderListeners; // -------------------------------------------------------------------------------------------------------------------- -#if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 -# define DPF_AU_NUM_BUFFERS 1 -#elif DISTRHO_PLUGIN_NUM_INPUTS > DISTRHO_PLUGIN_NUM_OUTPUTS -# define DPF_AU_NUM_BUFFERS DISTRHO_PLUGIN_NUM_INPUTS +#if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 +# if DISTRHO_PLUGIN_NUM_INPUTS > DISTRHO_PLUGIN_NUM_OUTPUTS +# define DPF_AU_NUM_BUFFERS DISTRHO_PLUGIN_NUM_INPUTS +# else +# define DPF_AU_NUM_BUFFERS DISTRHO_PLUGIN_NUM_OUTPUTS +# endif #else -# define DPF_AU_NUM_BUFFERS DISTRHO_PLUGIN_NUM_OUTPUTS +# define DPF_AU_NUM_BUFFERS 0 #endif +#if DPF_AU_NUM_BUFFERS != 0 typedef struct { UInt32 mNumberBuffers; AudioBuffer mBuffers[DPF_AU_NUM_BUFFERS]; } d_AudioBufferList; +#endif + +// -------------------------------------------------------------------------------------------------------------------- typedef struct { UInt32 numPackets; @@ -264,13 +270,12 @@ public: fLastRenderError(noErr), fPropertyListeners(), fRenderListeners(), + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 fSampleRateForInput(d_nextSampleRate), + #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 fSampleRateForOutput(d_nextSampleRate), #endif - #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 - fHasWorkingAudio(false), - #endif fUsingRenderListeners(false), fParameterCount(fPlugin.getParameterCount()), fLastParameterValues(nullptr), @@ -304,10 +309,13 @@ public: } } + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 std::memset(&fInputRenderCallback, 0, sizeof(fInputRenderCallback)); fInputRenderCallback.inputProc = nullptr; fInputRenderCallback.inputProcRefCon = nullptr; + #endif + #if DPF_AU_NUM_BUFFERS != 0 fAudioBufferList.mNumberBuffers = DPF_AU_NUM_BUFFERS; for (uint16_t i=0; i<DPF_AU_NUM_BUFFERS; ++i) @@ -316,6 +324,7 @@ public: fAudioBufferList.mBuffers[i].mData = new float[bufferSize]; fAudioBufferList.mBuffers[i].mDataByteSize = sizeof(float) * bufferSize; } + #endif #if DISTRHO_PLUGIN_WANT_MIDI_INPUT std::memset(&fMidiEvents, 0, sizeof(fMidiEvents)); @@ -376,8 +385,10 @@ public: delete[] fLastParameterValues; CFRelease(fUserPresetData.presetName); + #if DPF_AU_NUM_BUFFERS != 0 for (uint16_t i=0; i<DPF_AU_NUM_BUFFERS; ++i) delete[] static_cast<float*>(fAudioBufferList.mBuffers[i].mData); + #endif #if DISTRHO_PLUGIN_WANT_PROGRAMS for (uint32_t i=0; i<fProgramCount; ++i) @@ -432,12 +443,14 @@ public: case kAudioUnitProperty_SampleRate: DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); - if (inScope == kAudioUnitScope_Input) + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (inScope == kAudioUnitScope_Input && 0) { outDataSize = sizeof(Float64); outWritable = true; return noErr; } + #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 if (inScope == kAudioUnitScope_Output) { @@ -471,12 +484,14 @@ public: case kAudioUnitProperty_StreamFormat: DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 if (inScope == kAudioUnitScope_Input) { outDataSize = sizeof(AudioStreamBasicDescription); outWritable = true; return noErr; } + #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 if (inScope == kAudioUnitScope_Output) { @@ -539,9 +554,13 @@ public: case kAudioUnitProperty_SetRenderCallback: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input, inScope, kAudioUnitErr_InvalidScope); DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 outDataSize = sizeof(AURenderCallbackStruct); outWritable = true; return noErr; + #else + return kAudioUnitErr_InvalidProperty; + #endif case kAudioUnitProperty_FactoryPresets: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); @@ -568,9 +587,13 @@ public: case kAudioUnitProperty_InPlaceProcessing: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 outDataSize = sizeof(UInt32); outWritable = false; return noErr; + #else + return kAudioUnitErr_InvalidProperty; + #endif case kAudioUnitProperty_PresentPreset: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); @@ -716,11 +739,13 @@ public: return noErr; case kAudioUnitProperty_SampleRate: + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 if (inScope == kAudioUnitScope_Input) { *static_cast<Float64*>(outData) = fSampleRateForInput; } else + #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 if (inScope == kAudioUnitScope_Output) { @@ -825,11 +850,13 @@ public: if (inElement != 0) return kAudioUnitErr_InvalidElement; + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 if (inScope == kAudioUnitScope_Input) { desc->mChannelsPerFrame = DISTRHO_PLUGIN_NUM_INPUTS; } else + #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 if (inScope == kAudioUnitScope_Output) { @@ -858,8 +885,7 @@ public: *static_cast<UInt32*>(outData) = 1; break; case kAudioUnitScope_Input: - // FIXME seems to be mandatory for Logic Pro - *static_cast<UInt32*>(outData) = 1; // DISTRHO_PLUGIN_NUM_INPUTS != 0 ? 1 : 0; + *static_cast<UInt32*>(outData) = DISTRHO_PLUGIN_NUM_INPUTS != 0 ? 1 : 0; break; case kAudioUnitScope_Output: *static_cast<UInt32*>(outData) = DISTRHO_PLUGIN_NUM_OUTPUTS != 0 ? 1 : 0; @@ -893,9 +919,11 @@ public: *static_cast<OSStatus*>(outData) = fPlugin.getParameterValue(fBypassParameterIndex) > 0.5f ? 1 : 0; return noErr; + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 case kAudioUnitProperty_SetRenderCallback: std::memcpy(outData, &fInputRenderCallback, sizeof(AURenderCallbackStruct)); return noErr; + #endif #if DISTRHO_PLUGIN_WANT_PROGRAMS case kAudioUnitProperty_FactoryPresets: @@ -916,9 +944,11 @@ public: return noErr; #endif + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 case kAudioUnitProperty_InPlaceProcessing: *static_cast<UInt32*>(outData) = 1; return noErr; + #endif case kAudioUnitProperty_PresentPreset: #if DISTRHO_PLUGIN_WANT_PROGRAMS @@ -1069,8 +1099,10 @@ public: return noErr; case kAudioUnitProperty_SampleRate: - #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); + #elif DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); #else DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input, inScope, kAudioUnitErr_InvalidScope); #endif @@ -1079,6 +1111,7 @@ public: { const Float64 sampleRate = *static_cast<const Float64*>(inData); + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 if (inScope == kAudioUnitScope_Input) { if (d_isNotEqual(fSampleRateForInput, sampleRate)) @@ -1097,6 +1130,7 @@ public: } return noErr; } + #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 if (inScope == kAudioUnitScope_Output) @@ -1106,7 +1140,9 @@ public: fSampleRateForOutput = sampleRate; d_nextSampleRate = sampleRate; + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 if (d_isEqual(fSampleRateForInput, sampleRate)) + #endif { fPlugin.setSampleRate(sampleRate, true); } @@ -1120,8 +1156,10 @@ public: return kAudioUnitErr_InvalidScope; case kAudioUnitProperty_StreamFormat: - #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); + #elif DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); #else DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input, inScope, kAudioUnitErr_InvalidScope); #endif @@ -1140,20 +1178,13 @@ public: return kAudioUnitErr_FormatNotSupported; if (desc->mFramesPerPacket != 1) return kAudioUnitErr_FormatNotSupported; - - #if 1 - // dont allow interleaved data if (desc->mFormatFlags != (kAudioFormatFlagsNativeFloatPacked|kAudioFormatFlagIsNonInterleaved)) - #else - // allow interleaved data - if ((desc->mFormatFlags & ~kAudioFormatFlagIsNonInterleaved) != kAudioFormatFlagsNativeFloatPacked) - #endif return kAudioUnitErr_FormatNotSupported; - if (desc->mChannelsPerFrame != (inScope == kAudioUnitScope_Input ? DISTRHO_PLUGIN_NUM_INPUTS : DISTRHO_PLUGIN_NUM_OUTPUTS)) return kAudioUnitErr_FormatNotSupported; + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 if (inScope == kAudioUnitScope_Input) { if (d_isNotEqual(fSampleRateForInput, desc->mSampleRate)) @@ -1170,11 +1201,9 @@ public: notifyPropertyListeners(inProp, inScope, inElement); notifyPropertyListeners(kAudioUnitProperty_SampleRate, inScope, inElement); } - #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 - fHasWorkingAudio = true; - #endif return noErr; } + #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 if (inScope == kAudioUnitScope_Output) @@ -1183,7 +1212,9 @@ public: { fSampleRateForOutput = desc->mSampleRate; + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 if (d_isEqual(fSampleRateForInput, desc->mSampleRate)) + #endif { fPlugin.setSampleRate(desc->mSampleRate, true); } @@ -1208,7 +1239,7 @@ public: { notifyPropertyListeners(inProp, inScope, inElement); - #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + #if DPF_AU_NUM_BUFFERS != 0 for (uint16_t i=0; i<DPF_AU_NUM_BUFFERS; ++i) { delete[] static_cast<float*>(fAudioBufferList.mBuffers[i].mData); @@ -1238,12 +1269,14 @@ public: } return noErr; + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 case kAudioUnitProperty_SetRenderCallback: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input, inScope, kAudioUnitErr_InvalidScope); DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(AURenderCallbackStruct), inDataSize, kAudioUnitErr_InvalidPropertyValue); std::memcpy(&fInputRenderCallback, inData, sizeof(AURenderCallbackStruct)); return noErr; + #endif case kAudioUnitProperty_HostCallbacks: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); @@ -1622,6 +1655,7 @@ public: return kAudioUnitErr_TooManyFramesToProcess; } + #if DPF_AU_NUM_BUFFERS != 0 for (uint16_t i=0; i<DPF_AU_NUM_BUFFERS; ++i) { if (ioData->mBuffers[i].mDataByteSize != sizeof(float) * inFramesToProcess) @@ -1630,6 +1664,7 @@ public: return kAudio_ParamError; } } + #endif } #if DISTRHO_PLUGIN_NUM_INPUTS != 0 @@ -1644,6 +1679,7 @@ public: constexpr float** outputs = nullptr; #endif + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 if (fInputRenderCallback.inputProc != nullptr) { bool adjustDataByteSize, usingHostBuffer = true; @@ -1697,10 +1733,8 @@ public: if (usingHostBuffer) { - #if DISTRHO_PLUGIN_NUM_INPUTS != 0 for (uint16_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i) inputs[i] = static_cast<const float*>(ioData->mBuffers[i].mData); - #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 for (uint16_t i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) @@ -1710,10 +1744,8 @@ public: } else { - #if DISTRHO_PLUGIN_NUM_INPUTS != 0 for (uint16_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i) inputs[i] = static_cast<const float*>(fAudioBufferList.mBuffers[i].mData); - #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 for (uint16_t i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) @@ -1722,12 +1754,16 @@ public: } } else + #endif { #if DISTRHO_PLUGIN_NUM_INPUTS != 0 for (uint16_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i) { if (ioData->mBuffers[i].mData == nullptr) + { ioData->mBuffers[i].mData = fAudioBufferList.mBuffers[i].mData; + std::memset(ioData->mBuffers[i].mData, 0, sizeof(float) * inFramesToProcess); + } inputs[i] = static_cast<const float*>(ioData->mBuffers[i].mData); } @@ -1797,8 +1833,7 @@ public: #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 // handle case of plugin having no working audio, simulate audio-side processing - if (! fHasWorkingAudio) - run(nullptr, nullptr, std::max(1u, inOffsetSampleFrame), nullptr); + run(nullptr, nullptr, std::max(1u, inOffsetSampleFrame), nullptr); #endif return noErr; @@ -1826,8 +1861,7 @@ public: #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 // handle case of plugin having no working audio, simulate audio-side processing - if (! fHasWorkingAudio) - run(nullptr, nullptr, 1, nullptr); + run(nullptr, nullptr, 1, nullptr); #endif return noErr; @@ -1846,15 +1880,14 @@ private: OSStatus fLastRenderError; PropertyListeners fPropertyListeners; RenderListeners fRenderListeners; + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 AURenderCallbackStruct fInputRenderCallback; Float64 fSampleRateForInput; + #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 Float64 fSampleRateForOutput; #endif d_AudioBufferList fAudioBufferList; - #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 - bool fHasWorkingAudio; - #endif bool fUsingRenderListeners; // Caching @@ -2013,10 +2046,6 @@ private: fPlugin.setTimePosition(fTimePosition); } - else - { - d_stdout("no time"); - } #endif #if DISTRHO_PLUGIN_WANT_MIDI_INPUT diff --git a/distrho/src/DistrhoPluginChecks.h b/distrho/src/DistrhoPluginChecks.h @@ -43,25 +43,6 @@ #endif // -------------------------------------------------------------------------------------------------------------------- -// Check that symbol macros are well defined - -#ifdef DISTRHO_PROPER_CPP11_SUPPORT - -#ifdef DISTRHO_PLUGIN_AU_TYPE -static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_AU_TYPE)) == 5, "The macro DISTRHO_PLUGIN_AU_TYPE has incorrect length"); -#endif - -#ifdef DISTRHO_PLUGIN_BRAND_ID -static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_BRAND_ID)) == 5, "The macro DISTRHO_PLUGIN_BRAND_ID has incorrect length"); -#endif - -#ifdef DISTRHO_PLUGIN_UNIQUE_ID -static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID)) == 5, "The macro DISTRHO_PLUGIN_UNIQUE_ID has incorrect length"); -#endif - -#endif - -// -------------------------------------------------------------------------------------------------------------------- // Define optional macros if not done yet #ifndef DISTRHO_PLUGIN_HAS_UI @@ -130,25 +111,6 @@ static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID)) == 5, "The macro DISTR #endif // -------------------------------------------------------------------------------------------------------------------- -// Define DISTRHO_PLUGIN_AU_TYPE if needed - -#ifndef DISTRHO_PLUGIN_AU_TYPE -# if DISTRHO_PLUGIN_IS_SYNTH -# define DISTRHO_PLUGIN_AU_TYPE aumu /* kAudioUnitType_MusicDevice */ -# elif (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) && DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 -# define DISTRHO_PLUGIN_AU_TYPE aumf /* kAudioUnitType_MusicEffect */ -# elif (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) && DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 -# define DISTRHO_PLUGIN_AU_TYPE aumu /* kAudioUnitType_MusicDevice */ -# elif DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT -# define DISTRHO_PLUGIN_AU_TYPE aumi /* kAudioUnitType_MIDIProcessor */ -# elif DISTRHO_PLUGIN_NUM_INPUTS == 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 -# define DISTRHO_PLUGIN_AU_TYPE augn /* kAudioUnitType_Generator */ -# else -# define DISTRHO_PLUGIN_AU_TYPE aufx /* kAudioUnitType_Effect */ -# endif -#endif - -// -------------------------------------------------------------------------------------------------------------------- // Define DISTRHO_PLUGIN_HAS_EMBED_UI if needed #ifndef DISTRHO_PLUGIN_HAS_EMBED_UI @@ -248,6 +210,47 @@ static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID)) == 5, "The macro DISTR #endif // -------------------------------------------------------------------------------------------------------------------- +// Define DISTRHO_PLUGIN_AU_TYPE if needed + +#ifndef DISTRHO_PLUGIN_AU_TYPE +# if (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) && DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 +# define DISTRHO_PLUGIN_AU_TYPE aumf /* kAudioUnitType_MusicEffect */ +# elif (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) && DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 +# define DISTRHO_PLUGIN_AU_TYPE aumu /* kAudioUnitType_MusicDevice */ +# elif DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT +# define DISTRHO_PLUGIN_AU_TYPE aumi /* kAudioUnitType_MIDIProcessor */ +# elif DISTRHO_PLUGIN_NUM_INPUTS == 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 +# define DISTRHO_PLUGIN_AU_TYPE augn /* kAudioUnitType_Generator */ +# else +# define DISTRHO_PLUGIN_AU_TYPE aufx /* kAudioUnitType_Effect */ +# endif +#endif + +// -------------------------------------------------------------------------------------------------------------------- +// Check that symbol macros are well defined + +#ifdef DISTRHO_PROPER_CPP11_SUPPORT + +#ifdef DISTRHO_PLUGIN_AU_TYPE +static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_AU_TYPE)) == 5, "The macro DISTRHO_PLUGIN_AU_TYPE has incorrect length"); +# if DISTRHO_PLUGIN_NUM_INPUTS == 0 || DISTRHO_PLUGIN_NUM_OUTPUTS == 0 +static constexpr const char _aut[5] = STRINGIFY(DISTRHO_PLUGIN_AU_TYPE); +static_assert(_aut[0] != 'a' || _aut[0] != 'u' || _aut[0] != 'm' || _aut[0] != 'u', + "The 'aumu' type requires both audio input and output"); +# endif +#endif + +#ifdef DISTRHO_PLUGIN_BRAND_ID +static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_BRAND_ID)) == 5, "The macro DISTRHO_PLUGIN_BRAND_ID has incorrect length"); +#endif + +#ifdef DISTRHO_PLUGIN_UNIQUE_ID +static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID)) == 5, "The macro DISTRHO_PLUGIN_UNIQUE_ID has incorrect length"); +#endif + +#endif + +// -------------------------------------------------------------------------------------------------------------------- // Prevent users from messing about with DPF internals #ifdef DISTRHO_UI_IS_STANDALONE