DPF

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

commit 0a6162cd425457e6e7401982ae4677951953448c
parent 9bcb41e04ebb532221807933a6054bea5953caf8
Author: falkTX <falktx@falktx.com>
Date:   Wed, 21 Feb 2024 20:44:29 +0100

Add more AU stubs, a little custom things in place, WIP

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

Diffstat:
Mdistrho/src/DistrhoPluginAU.cpp | 496++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 351 insertions(+), 145 deletions(-)

diff --git a/distrho/src/DistrhoPluginAU.cpp b/distrho/src/DistrhoPluginAU.cpp @@ -39,6 +39,10 @@ static const char* AudioUnitPropertyID2Str(const AudioUnitPropertyID prop) noexc PROP(kAudioUnitProperty_SampleRate) PROP(kAudioUnitProperty_ParameterList) PROP(kAudioUnitProperty_ParameterInfo) + #if !TARGET_OS_IPHONE + PROP(kAudioUnitProperty_FastDispatch) + #endif + PROP(kAudioUnitProperty_CPULoad) PROP(kAudioUnitProperty_StreamFormat) PROP(kAudioUnitProperty_ElementCount) PROP(kAudioUnitProperty_Latency) @@ -77,7 +81,6 @@ static const char* AudioUnitPropertyID2Str(const AudioUnitPropertyID prop) noexc PROP(kAudioUnitProperty_LastRenderSampleTime) PROP(kAudioUnitProperty_LoadedOutOfProcess) #if !TARGET_OS_IPHONE - PROP(kAudioUnitProperty_FastDispatch) PROP(kAudioUnitProperty_SetExternalBuffer) PROP(kAudioUnitProperty_GetUIComponentList) PROP(kAudioUnitProperty_CocoaUI) @@ -172,29 +175,14 @@ public: { TRACE -#if 0 if (fParameterCount != 0) { - CreateElements(); - fCachedParameterValues = new float[fParameterCount]; std::memset(fCachedParameterValues, 0, sizeof(float) * fParameterCount); - AUElement* const globals = GlobalScope().GetElement(0); - DISTRHO_SAFE_ASSERT_RETURN(globals != nullptr,); - - globals->UseIndexedParameters(fParameterCount); - for (uint32_t i=0; i<fParameterCount; ++i) - { fCachedParameterValues[i] = fPlugin.getParameterValue(i); - globals->SetParameter(i, fCachedParameterValues[i]); - } } - - // static - SupportedNumChannels(nullptr); - #endif } ~PluginAU() @@ -213,13 +201,13 @@ public: return noErr; } - OSStatus auGetPropertyInfo(const AudioUnitPropertyID inID, + OSStatus auGetPropertyInfo(const AudioUnitPropertyID prop, const AudioUnitScope inScope, const AudioUnitElement inElement, UInt32& outDataSize, Boolean& outWritable) { - switch (inID) + switch (prop) { case kAudioUnitProperty_ClassInfo: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); @@ -228,6 +216,22 @@ public: outWritable = true; */ break; + case kAudioUnitProperty_SampleRate: + break; + case kAudioUnitProperty_ParameterList: + outDataSize = inScope == kAudioUnitScope_Global ? sizeof(AudioUnitParameterID) * fParameterCount : 0; + outWritable = false; + return noErr; + case kAudioUnitProperty_ParameterInfo: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + outDataSize = sizeof(AudioUnitParameterInfo); + outWritable = false; + return noErr; + case kAudioUnitProperty_StreamFormat: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); + outDataSize = sizeof(AudioStreamBasicDescription); + outWritable = true; + return noErr; case kAudioUnitProperty_ElementCount: outDataSize = sizeof(UInt32); outWritable = false; @@ -260,18 +264,126 @@ public: return kAudioUnitErr_InvalidProperty; } - OSStatus auGetProperty(const AudioUnitPropertyID inID, + OSStatus auGetProperty(const AudioUnitPropertyID prop, const AudioUnitScope inScope, const AudioUnitElement inElement, void* const outData) { - switch (inID) + switch (prop) { case kAudioUnitProperty_ClassInfo: /* TODO used for storing plugin state *static_cast<CFPropertyListRef*>(outData) = nullptr; */ break; + case kAudioUnitProperty_SampleRate: + break; + case kAudioUnitProperty_ParameterList: + { + AudioUnitParameterID* const paramList = static_cast<AudioUnitParameterID*>(outData); + + for (uint32_t i=0; i<fParameterCount; ++i) + paramList[i] = i; + } + return noErr; + case kAudioUnitProperty_ParameterInfo: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fParameterCount, inElement, kAudioUnitErr_InvalidElement); + { + AudioUnitParameterInfo* const info = static_cast<AudioUnitParameterInfo*>(outData); + std::memset(info, 0, sizeof(*info)); + + const ParameterRanges& ranges(fPlugin.getParameterRanges(inElement)); + + info->flags = kAudioUnitParameterFlag_IsHighResolution + | kAudioUnitParameterFlag_IsReadable + | kAudioUnitParameterFlag_HasCFNameString; + + if (fPlugin.getParameterDesignation(inElement) == kParameterDesignationBypass) + { + info->flags |= kAudioUnitParameterFlag_IsWritable|kAudioUnitParameterFlag_NonRealTime; + info->unit = kAudioUnitParameterUnit_Generic; + + d_strncpy(info->name, "Bypass", sizeof(info->name)); + info->cfNameString = CFSTR("Bypass"); + } + else + { + const uint32_t hints = fPlugin.getParameterHints(inElement); + + info->flags |= kAudioUnitParameterFlag_CFNameRelease; + + if (hints & kParameterIsOutput) + { + info->flags |= kAudioUnitParameterFlag_MeterReadOnly; + } + else + { + info->flags |= kAudioUnitParameterFlag_IsWritable; + + if ((hints & kParameterIsAutomatable) == 0x0) + info->flags |= kAudioUnitParameterFlag_NonRealTime; + } + + if (hints & kParameterIsBoolean) + info->unit = kAudioUnitParameterUnit_Boolean; + else if (hints & kParameterIsInteger) + info->unit = kAudioUnitParameterUnit_Indexed; + else + info->unit = kAudioUnitParameterUnit_Generic; + + // | kAudioUnitParameterFlag_ValuesHaveStrings; + + const String& name(fPlugin.getParameterName(inElement)); + d_strncpy(info->name, name, sizeof(info->name)); + info->cfNameString = static_cast<CFStringRef>([[NSString stringWithUTF8String:name] retain]); + } + + info->minValue = ranges.min; + info->maxValue = ranges.max; + info->defaultValue = ranges.def; + } + return noErr; + case kAudioUnitProperty_StreamFormat: + { + AudioStreamBasicDescription* const desc = static_cast<AudioStreamBasicDescription*>(outData); + std::memset(desc, 0, sizeof(*desc)); + + if (inElement != 0) + return kAudioUnitErr_InvalidElement; + + if (inScope == kAudioUnitScope_Input) + desc->mChannelsPerFrame = DISTRHO_PLUGIN_NUM_INPUTS; + else if (inScope == kAudioUnitScope_Output) + desc->mChannelsPerFrame = DISTRHO_PLUGIN_NUM_OUTPUTS; + else + return kAudioUnitErr_InvalidScope; + + desc->mFormatID = kAudioFormatLinearPCM; + desc->mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved; + desc->mSampleRate = fPlugin.getSampleRate(); + desc->mBitsPerChannel = 32; + desc->mBytesPerFrame = sizeof(float); + desc->mBytesPerPacket = sizeof(float); + desc->mFramesPerPacket = 1; + } + return noErr; + case kAudioUnitProperty_ElementCount: + switch (inScope) + { + case kAudioUnitScope_Global: + *static_cast<UInt32*>(outData) = 1; + break; + case kAudioUnitScope_Input: + *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; + break; + default: + *static_cast<UInt32*>(outData) = 0; + break; + } + return noErr; #if DISTRHO_PLUGIN_WANT_LATENCY case kAudioUnitProperty_Latency: *static_cast<Float64*>(outData) = static_cast<double>(fPlugin.getLatency()) / fPlugin.getSampleRate(); @@ -287,6 +399,7 @@ public: case kAudioUnitProperty_CocoaUI: { AudioUnitCocoaViewInfo* const info = static_cast<AudioUnitCocoaViewInfo*>(outData); + std::memset(info, 0, sizeof(*info)); NSString* const bundlePathString = [[NSString alloc] initWithBytes:d_nextBundlePath @@ -305,13 +418,13 @@ public: return kAudioUnitErr_InvalidProperty; } - OSStatus auSetProperty(const AudioUnitPropertyID inID, + OSStatus auSetProperty(const AudioUnitPropertyID prop, const AudioUnitScope inScope, const AudioUnitElement inElement, const void* const inData, const UInt32 inDataSize) { - switch (inID) + switch (prop) { case kAudioUnitProperty_ClassInfo: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); @@ -320,6 +433,31 @@ public: *static_cast<CFPropertyListRef*>(inData); */ break; + case kAudioUnitProperty_StreamFormat: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(AudioStreamBasicDescription), inDataSize, kAudioUnitErr_InvalidPropertyValue); + { + const AudioStreamBasicDescription* const desc = static_cast<const AudioStreamBasicDescription*>(inData); + + const uint flags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved; + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc->mFormatID == kAudioFormatLinearPCM, desc->mFormatID, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_UINT_RETURN((desc->mFormatFlags & flags) == flags, desc->mFormatFlags, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc->mBitsPerChannel == 32, desc->mBitsPerChannel, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc->mBytesPerFrame == sizeof(float), desc->mBytesPerFrame, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc->mBytesPerPacket == sizeof(float), desc->mBytesPerPacket, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc->mFramesPerPacket == 1, desc->mFramesPerPacket, kAudioUnitErr_FormatNotSupported); + + if (inScope == kAudioUnitScope_Input) { + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc->mChannelsPerFrame == DISTRHO_PLUGIN_NUM_INPUTS, desc->mChannelsPerFrame, kAudioUnitErr_FormatNotSupported); + } + else { + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc->mChannelsPerFrame == DISTRHO_PLUGIN_NUM_OUTPUTS, desc->mChannelsPerFrame, kAudioUnitErr_FormatNotSupported); + } + + fPlugin.setSampleRate(desc->mSampleRate, true); + } + return noErr; case kAudioUnitProperty_MaximumFramesPerSlice: DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(UInt32), inDataSize, kAudioUnitErr_InvalidPropertyValue); @@ -330,6 +468,72 @@ public: return kAudioUnitErr_InvalidProperty; } + OSStatus auAddPropertyListener(const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc, + void* const userData) + { + return noErr; + } + + OSStatus auRemovePropertyListener(const AudioUnitPropertyID prop, const AudioUnitPropertyListenerProc proc) + { + return noErr; + } + + OSStatus auRemovePropertyListenerWithUserData(const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc, + void* const userData) + { + return noErr; + } + + OSStatus auAddRenderNotify(const AURenderCallback proc, void* const userData) + { + return noErr; + } + + OSStatus auRemoveRenderNotify(const AURenderCallback proc, void* const userData) + { + return noErr; + } + + OSStatus auGetParameter(const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + AudioUnitParameterValue* const value) + { + DISTRHO_SAFE_ASSERT_UINT_RETURN(scope == kAudioUnitScope_Global, scope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(param < fParameterCount, param, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(elem == 0, elem, kAudioUnitErr_InvalidElement); + + *value = fPlugin.getParameterValue(param); + return noErr; + } + + OSStatus auSetParameter(const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + const AudioUnitParameterValue value, + const UInt32 bufferOffset) + { + DISTRHO_SAFE_ASSERT_UINT_RETURN(scope == kAudioUnitScope_Global, scope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(param < fParameterCount, param, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(elem == 0, elem, kAudioUnitErr_InvalidElement); + + fPlugin.setParameterValue(param, value); + return noErr; + } + + OSStatus auScheduleParameters(const AudioUnitParameterEvent* const events, const UInt32 numEvents) + { + return noErr; + } + + OSStatus auReset(const AudioUnitScope scope, const AudioUnitElement elem) + { + return noErr; + } + #if 0 protected: // ---------------------------------------------------------------------------------------------------------------- @@ -383,100 +587,9 @@ protected: return noErr; } +#endif // ---------------------------------------------------------------------------------------------------------------- - // ComponentBase Property Dispatch - - OSStatus GetParameterInfo(const AudioUnitScope inScope, - const AudioUnitParameterID inParameterID, - AudioUnitParameterInfo& outParameterInfo) override - { - TRACE - DISTRHO_SAFE_ASSERT_INT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); - DISTRHO_SAFE_ASSERT_UINT_RETURN(inParameterID < fParameterCount, inParameterID, kAudioUnitErr_InvalidParameter); - - const uint32_t index = inParameterID; - const ParameterRanges& ranges(fPlugin.getParameterRanges(index)); - - outParameterInfo.flags = kAudioUnitParameterFlag_IsHighResolution - | kAudioUnitParameterFlag_IsReadable - | kAudioUnitParameterFlag_HasCFNameString; - - if (fPlugin.getParameterDesignation(index) == kParameterDesignationBypass) - { - outParameterInfo.flags |= kAudioUnitParameterFlag_IsWritable|kAudioUnitParameterFlag_NonRealTime; - outParameterInfo.unit = kAudioUnitParameterUnit_Generic; - - d_strncpy(outParameterInfo.name, "Bypass", sizeof(outParameterInfo.name)); - outParameterInfo.cfNameString = CFSTR("Bypass"); - } - else - { - const uint32_t hints = fPlugin.getParameterHints(index); - - outParameterInfo.flags |= kAudioUnitParameterFlag_CFNameRelease; - - if (hints & kParameterIsOutput) - { - outParameterInfo.flags |= kAudioUnitParameterFlag_MeterReadOnly; - } - else - { - outParameterInfo.flags |= kAudioUnitParameterFlag_IsWritable; - - if ((hints & kParameterIsAutomatable) == 0x0) - outParameterInfo.flags |= kAudioUnitParameterFlag_NonRealTime; - } - - if (hints & kParameterIsBoolean) - outParameterInfo.unit = kAudioUnitParameterUnit_Boolean; - else if (hints & kParameterIsInteger) - outParameterInfo.unit = kAudioUnitParameterUnit_Indexed; - else - outParameterInfo.unit = kAudioUnitParameterUnit_Generic; - - // | kAudioUnitParameterFlag_ValuesHaveStrings; - - const String& name(fPlugin.getParameterName(index)); - d_strncpy(outParameterInfo.name, name, sizeof(outParameterInfo.name)); - outParameterInfo.cfNameString = static_cast<CFStringRef>([[NSString stringWithUTF8String:name] retain]); - } - - outParameterInfo.minValue = ranges.min; - outParameterInfo.maxValue = ranges.max; - outParameterInfo.defaultValue = ranges.def; - - return noErr; - } - -private: - double getSampleRate() - { - #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 && 0 - if (AUOutputElement* const output = GetOutput(0)) - { - const double sampleRate = d_nextSampleRate = output->GetStreamFormat().mSampleRate; - return sampleRate; - } - #endif - - #if DISTRHO_PLUGIN_NUM_INPUTS != 0 && 0 - if (AUInputElement* const input = GetInput(0)) - { - const double sampleRate = d_nextSampleRate = input->GetStreamFormat().mSampleRate; - return sampleRate; - } - #endif - - return d_nextSampleRate; - } - - void setBufferSizeAndSampleRate() - { - fPlugin.setSampleRate(getSampleRate(), true); - fPlugin.setBufferSize(GetMaxFramesPerSlice(), true); - } -#endif private: PluginExporter fPlugin; @@ -576,34 +689,36 @@ struct AudioComponentPlugInInstance { return reinterpret_cast<AudioComponentMethod>(GetProperty); case kAudioUnitSetPropertySelect: return reinterpret_cast<AudioComponentMethod>(SetProperty); - #if 0 case kAudioUnitAddPropertyListenerSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(AddPropertyListener); case kAudioUnitRemovePropertyListenerSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(RemovePropertyListener); case kAudioUnitRemovePropertyListenerWithUserDataSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(RemovePropertyListenerWithUserData); case kAudioUnitAddRenderNotifySelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(AddRenderNotify); case kAudioUnitRemoveRenderNotifySelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(RemoveRenderNotify); case kAudioUnitGetParameterSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(GetParameter); case kAudioUnitSetParameterSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(SetParameter); case kAudioUnitScheduleParametersSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(ScheduleParameters); + /* case kAudioUnitRenderSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); - case kAudioUnitResetSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(Render); case kAudioUnitComplexRenderSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(ComplexRender); + */ + case kAudioUnitResetSelect: + return reinterpret_cast<AudioComponentMethod>(Reset); + /* case kAudioUnitProcessSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); + return reinterpret_cast<AudioComponentMethod>(Process); case kAudioUnitProcessMultipleSelect: - return reinterpret_cast<AudioComponentMethod>(Uninitialize); - #endif + return reinterpret_cast<AudioComponentMethod>(ProcessMultiple); + */ } return nullptr; @@ -622,18 +737,18 @@ struct AudioComponentPlugInInstance { } static OSStatus GetPropertyInfo(AudioComponentPlugInInstance* const self, - const AudioUnitPropertyID inID, + const AudioUnitPropertyID prop, const AudioUnitScope inScope, const AudioUnitElement inElement, UInt32* const outDataSize, Boolean* const outWritable) { - d_stdout("AudioComponentPlugInInstance::GetPropertyInfo(%p, %2d:%s, %d:%s, %d, %p, ...)", - self, inID, AudioUnitPropertyID2Str(inID), inScope, AudioUnitScope2Str(inScope), inElement); + d_stdout("AudioComponentPlugInInstance::GetPropertyInfo(%p, %2d:%s, %d:%s, %d, 0x%x, ...)", + self, prop, AudioUnitPropertyID2Str(prop), inScope, AudioUnitScope2Str(inScope), inElement); UInt32 dataSize = 0; Boolean writable = false; - const OSStatus res = self->plugin->auGetPropertyInfo(inID, inScope, inElement, dataSize, writable); + const OSStatus res = self->plugin->auGetPropertyInfo(prop, inScope, inElement, dataSize, writable); if (outDataSize != nullptr) *outDataSize = dataSize; @@ -645,14 +760,14 @@ struct AudioComponentPlugInInstance { } static OSStatus GetProperty(AudioComponentPlugInInstance* const self, - const AudioUnitPropertyID inID, + const AudioUnitPropertyID prop, const AudioUnitScope inScope, const AudioUnitElement inElement, void* const outData, UInt32* const ioDataSize) { - d_stdout("AudioComponentPlugInInstance::GetProperty (%p, %2d:%s, %d:%s, %d, %p, ...)", - self, inID, AudioUnitPropertyID2Str(inID), inScope, AudioUnitScope2Str(inScope), inElement); + d_stdout("AudioComponentPlugInInstance::GetProperty (%p, %2d:%s, %d:%s, %d, 0x%x, ...)", + self, prop, AudioUnitPropertyID2Str(prop), inScope, AudioUnitScope2Str(inScope), inElement); DISTRHO_SAFE_ASSERT_RETURN(ioDataSize != nullptr, kAudio_ParamError); Boolean writable; @@ -661,15 +776,16 @@ struct AudioComponentPlugInInstance { if (outData == nullptr) { - res = self->plugin->auGetPropertyInfo(inID, inScope, inElement, outDataSize, writable); + res = self->plugin->auGetPropertyInfo(prop, inScope, inElement, outDataSize, writable); *ioDataSize = outDataSize; return res; } const UInt32 inDataSize = *ioDataSize; - DISTRHO_SAFE_ASSERT_RETURN(inDataSize != 0, kAudio_ParamError); + if (inDataSize == 0) + return kAudio_ParamError; - res = self->plugin->auGetPropertyInfo(inID, inScope, inElement, outDataSize, writable); + res = self->plugin->auGetPropertyInfo(prop, inScope, inElement, outDataSize, writable); if (res != noErr) return res; @@ -687,7 +803,7 @@ struct AudioComponentPlugInInstance { outBuffer = outData; } - res = self->plugin->auGetProperty(inID, inScope, inElement, outBuffer); + res = self->plugin->auGetProperty(prop, inScope, inElement, outBuffer); if (res != noErr) { @@ -709,16 +825,106 @@ struct AudioComponentPlugInInstance { } static OSStatus SetProperty(AudioComponentPlugInInstance* const self, - const AudioUnitPropertyID inID, + const AudioUnitPropertyID prop, const AudioUnitScope inScope, const AudioUnitElement inElement, const void* const inData, const UInt32 inDataSize) { - d_stdout("AudioComponentPlugInInstance::SetProperty(%p, %d:%s, %d:%s, %d, %d, %p, %u)", - self, inID, AudioUnitPropertyID2Str(inID), inScope, AudioUnitScope2Str(inScope), inElement, inData, inDataSize); - return self->plugin->auSetProperty(inID, inScope, inElement, inData, inDataSize); + d_stdout("AudioComponentPlugInInstance::SetProperty(%p, %d:%s, %d:%s, %d, 0x%x, %p, %u)", + self, prop, AudioUnitPropertyID2Str(prop), inScope, AudioUnitScope2Str(inScope), inElement, inData, inDataSize); + return self->plugin->auSetProperty(prop, inScope, inElement, inData, inDataSize); + } + + static OSStatus AddPropertyListener(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc, + void* const userData) + { + d_stdout("AudioComponentPlugInInstance::AddPropertyListener(%p, %d:%s, %p, %p)", + self, prop, AudioUnitPropertyID2Str(prop), proc, userData); + return self->plugin->auAddPropertyListener(prop, proc, userData); + } + + static OSStatus RemovePropertyListener(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc) + { + d_stdout("AudioComponentPlugInInstance::RemovePropertyListener(%p, %d:%s, %p)", + self, prop, AudioUnitPropertyID2Str(prop), proc); + return self->plugin->auRemovePropertyListener(prop, proc); + } + + static OSStatus RemovePropertyListenerWithUserData(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc, + void* const userData) + { + d_stdout("AudioComponentPlugInInstance::RemovePropertyListenerWithUserData(%p, %d:%s, %p, %p)", + self, prop, AudioUnitPropertyID2Str(prop), proc, userData); + return self->plugin->auRemovePropertyListenerWithUserData(prop, proc, userData); + } + + static OSStatus AddRenderNotify(AudioComponentPlugInInstance* const self, + const AURenderCallback proc, + void* const userData) + { + d_stdout("AudioComponentPlugInInstance::AddRenderNotify(%p, %p, %p)", + self, proc, userData); + return self->plugin->auAddRenderNotify(proc, userData); + } + + static OSStatus RemoveRenderNotify(AudioComponentPlugInInstance* const self, + const AURenderCallback proc, + void* const userData) + { + d_stdout("AudioComponentPlugInInstance::RemoveRenderNotify(%p, %p, %p)", + self, proc, userData); + return self->plugin->auRemoveRenderNotify(proc, userData); + } + + static OSStatus GetParameter(AudioComponentPlugInInstance* const self, + const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + AudioUnitParameterValue* const value) + { + d_stdout("AudioComponentPlugInInstance::GetParameter(%p, %d, %d:%s, 0x%x, %p)", + self, param, scope, AudioUnitScope2Str(scope), elem, value); + return self->plugin->auGetParameter(param, scope, elem, value); } + + static OSStatus SetParameter(AudioComponentPlugInInstance* const self, + const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + const AudioUnitParameterValue value, + const UInt32 bufferOffset) + { + d_stdout("AudioComponentPlugInInstance::SetParameter(%p, %d %d:%s, 0x%x, %f, %u)", + self, param, scope, AudioUnitScope2Str(scope), elem, value, bufferOffset); + return self->plugin->auSetParameter(param, scope, elem, value, bufferOffset); + } + + static OSStatus ScheduleParameters(AudioComponentPlugInInstance* const self, + const AudioUnitParameterEvent* const events, + const UInt32 numEvents) + { + d_stdout("AudioComponentPlugInInstance::ScheduleParameters(%p, %p, %u)", + self, events, numEvents); + return self->plugin->auScheduleParameters(events, numEvents); + } + + static OSStatus Reset(AudioComponentPlugInInstance* const self, + const AudioUnitScope scope, + const AudioUnitElement elem) + { + d_stdout("AudioComponentPlugInInstance::Reset(%p, %d:%s, 0x%x)", + self, scope, AudioUnitScope2Str(scope), elem); + return self->plugin->auReset(scope, elem); + } + + DISTRHO_DECLARE_NON_COPYABLE(AudioComponentPlugInInstance) }; // --------------------------------------------------------------------------------------------------------------------