commit f581a3d44421664b5b1ae5164fd7f5bec399aeb6
parent f1366080a7090a87ab5dddd71168af25b4072861
Author: falkTX <falktx@falktx.com>
Date: Tue, 20 Feb 2024 00:33:28 +0100
Initial handling of AU parameters
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
6 files changed, 147 insertions(+), 101 deletions(-)
diff --git a/Makefile.plugins.mk b/Makefile.plugins.mk
@@ -462,25 +462,13 @@ $(BUILD_DIR)/DistrhoUI_macOS_%.mm.o: $(DPF_PATH)/distrho/DistrhoUI_macOS.mm $(EX
@echo "Compiling DistrhoUI_macOS.mm ($*)"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@
-$(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o: $(DPF_PATH)/distrho/DistrhoPluginMain.cpp $(EXTRA_DEPENDENCIES) $(EXTRA_DSP_DEPENDENCIES)
- -@mkdir -p $(BUILD_DIR)
- @echo "Compiling DistrhoPluginMain.cpp (JACK)"
- $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_JACK $(JACK_FLAGS) -c -o $@
+$(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o: BUILD_CXX_FLAGS += $(JACK_FLAGS)
-$(BUILD_DIR)/DistrhoPluginMain_AU.cpp.o: $(DPF_PATH)/distrho/DistrhoPluginMain.cpp $(EXTRA_DEPENDENCIES) $(EXTRA_DSP_DEPENDENCIES)
- -@mkdir -p $(BUILD_DIR)
- @echo "Compiling DistrhoPluginMain.cpp (AU)"
- $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_AU -ObjC++ -c -o $@
+$(BUILD_DIR)/DistrhoPluginMain_AU.cpp.o: BUILD_CXX_FLAGS += -ObjC++
-$(BUILD_DIR)/DistrhoUIMain_AU.cpp.o: $(DPF_PATH)/distrho/DistrhoUIMain.cpp $(EXTRA_DEPENDENCIES) $(EXTRA_UI_DEPENDENCIES)
- -@mkdir -p $(BUILD_DIR)
- @echo "Compiling DistrhoUIMain.cpp (AU)"
- $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_AU -ObjC++ -c -o $@
+$(BUILD_DIR)/DistrhoUIMain_AU.cpp.o: BUILD_CXX_FLAGS += -ObjC++
-$(BUILD_DIR)/DistrhoUIMain_DSSI.cpp.o: $(DPF_PATH)/distrho/DistrhoUIMain.cpp $(EXTRA_DEPENDENCIES) $(EXTRA_UI_DEPENDENCIES)
- -@mkdir -p $(BUILD_DIR)
- @echo "Compiling DistrhoUIMain.cpp (DSSI)"
- $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_DSSI $(LIBLO_FLAGS) -c -o $@
+$(BUILD_DIR)/DistrhoUIMain_DSSI.cpp.o: BUILD_CXX_FLAGS += $(LIBLO_FLAGS)
# ---------------------------------------------------------------------------------------------------------------------
# JACK
@@ -705,7 +693,7 @@ $(au): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_AU.cpp.o
endif
-@mkdir -p $(shell dirname $@)
@echo "Creating AU component for $(NAME)"
- $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(EXTRA_LIBS) $(EXTRA_DSP_LIBS) $(EXTRA_UI_LIBS) $(DGL_LIBS) -framework AudioToolbox -framework AudioUnit $(SHARED) $(SYMBOLS_AU) -o $@
+ $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(EXTRA_LIBS) $(EXTRA_DSP_LIBS) $(EXTRA_UI_LIBS) $(DGL_LIBS) -framework AudioToolbox -framework AudioUnit -framework Foundation $(SHARED) $(SYMBOLS_AU) -o $@
# ---------------------------------------------------------------------------------------------------------------------
# Export
diff --git a/distrho/src/DistrhoPluginAU.cpp b/distrho/src/DistrhoPluginAU.cpp
@@ -14,6 +14,10 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+// TODO
+// - g_nextBundlePath vs d_nextBundlePath cleanup
+// - scale points to kAudioUnitParameterFlag_ValuesHaveStrings
+
#include "DistrhoPluginInternal.hpp"
#include "../DistrhoPluginUtils.hpp"
@@ -268,7 +272,7 @@ private:
// ----------------------------------------------------------------------------------------------------------------
// DPF callbacks
- #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT && 0
+ #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
bool writeMidi(const MidiEvent&)
{
return true;
@@ -280,8 +284,7 @@ private:
}
#endif
-
- #if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST && 0
+ #if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
bool requestParameterValueChange(uint32_t, float)
{
return true;
@@ -293,7 +296,7 @@ private:
}
#endif
- #if DISTRHO_PLUGIN_WANT_STATE && 0
+ #if DISTRHO_PLUGIN_WANT_STATE
bool updateState(const char*, const char*)
{
return true;
@@ -310,20 +313,47 @@ class PluginAU : public PluginHolder,
public PluginBase
{
public:
- PluginAU(AudioUnit component)
+ PluginAU(const AudioUnit component)
: PluginHolder(),
- PluginBase(component, getPluginBusCount(true), getPluginBusCount(false))
+ PluginBase(component, getPluginBusCount(true), getPluginBusCount(false)),
+ fParameterCount(fPlugin.getParameterCount()),
+ fCachedParameterValues(nullptr)
{
TRACE
+
+ 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);
}
~PluginAU() override
{
TRACE
+ delete[] fCachedParameterValues;
}
protected:
-#if 0
+ // ----------------------------------------------------------------------------------------------------------------
+ // ComponentBase AU dispatch
+
OSStatus Initialize() override
{
TRACE
@@ -333,6 +363,8 @@ protected:
DISTRHO_SAFE_ASSERT_INT_RETURN(res == noErr, res, res);
setBufferSizeAndSampleRate();
+ fPlugin.activate();
+
return noErr;
}
@@ -342,18 +374,19 @@ protected:
fPlugin.deactivate();
PluginBase::Cleanup();
}
-#endif
OSStatus Reset(AudioUnitScope inScope, AudioUnitElement inElement) override
{
TRACE
fPlugin.deactivateIfNeeded();
- setBufferSizeAndSampleRate();
const OSStatus res = PluginBase::Reset(inScope, inElement);
if (res == noErr)
+ {
+ setBufferSizeAndSampleRate();
fPlugin.activate();
+ }
return res;
}
@@ -418,37 +451,31 @@ protected:
}
#if 0
- OSStatus SetProperty(AudioUnitPropertyID inID,
- AudioUnitScope inScope,
- AudioUnitElement inElement,
- const void* inData,
- UInt32 inDataSize) override
+ OSStatus GetParameter(const AudioUnitParameterID inParameterID,
+ const AudioUnitScope inScope,
+ const AudioUnitElement inElement,
+ AudioUnitParameterValue& outValue) override
{
- TRACE
- return PluginBase::SetProperty(inID, inScope, inElement, inData, inDataSize);
- }
+ DISTRHO_SAFE_ASSERT_INT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
+ DISTRHO_SAFE_ASSERT_UINT_RETURN(inParameterID < fParameterCount, inParameterID, kAudioUnitErr_InvalidParameter);
- OSStatus GetParameter(AudioUnitParameterID inID,
- AudioUnitScope inScope,
- AudioUnitElement inElement,
- Float32& outValue) override
- {
- TRACE
- return kAudioUnitErr_InvalidProperty;
- // return PluginBase::GetParameter(inID, inScope, inElement, outValue);
+ return fPlugin.getParameterValue(inParameterID);
}
+#endif
- OSStatus SetParameter(AudioUnitParameterID inID,
- AudioUnitScope inScope,
- AudioUnitElement inElement,
- Float32 inValue,
- UInt32 inBufferOffsetInFrames) override
+ OSStatus SetParameter(AudioUnitParameterID inParameterID,
+ const AudioUnitScope inScope,
+ const AudioUnitElement inElement,
+ const AudioUnitParameterValue inValue,
+ const UInt32 inBufferOffsetInFrames) override
{
- TRACE
- return kAudioUnitErr_InvalidProperty;
- // return PluginBase::SetParameter(inID, inScope, inElement, inValue, inBufferOffsetInFrames);
+ DISTRHO_SAFE_ASSERT_INT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
+ DISTRHO_SAFE_ASSERT_UINT_RETURN(inParameterID < fParameterCount, inParameterID, kAudioUnitErr_InvalidParameter);
+
+ PluginBase::SetParameter(inParameterID, inScope, inElement, inValue, inBufferOffsetInFrames);
+ fPlugin.setParameterValue(inParameterID, inValue);
+ return noErr;
}
-#endif
bool CanScheduleParameters() const override
{
@@ -460,63 +487,90 @@ protected:
const AudioTimeStamp& inTimeStamp,
const UInt32 nFrames) override
{
- TRACE
- return noErr;
- }
+ float value;
+ for (uint32_t i=0; i<fParameterCount; ++i)
+ {
+ if (fPlugin.isParameterOutputOrTrigger(i))
+ {
+ value = fPlugin.getParameterValue(i);
-#if 0
- bool BusCountWritable(AudioUnitScope scope) override
- {
- TRACE
- return false;
- }
+ if (d_isEqual(fCachedParameterValues[i], value))
+ continue;
+
+ fCachedParameterValues[i] = value;
+
+ if (AUElement* const elem = GlobalScope().GetElement(0))
+ elem->SetParameter(i, value);
+ }
+ }
- OSStatus SetBusCount(AudioUnitScope scope, UInt32 count) override
- {
- TRACE
return noErr;
}
- OSStatus GetParameterInfo(AudioUnitScope inScope,
- AudioUnitParameterID inParameterID,
- AudioUnitParameterInfo& outParameterInfo) override
- {
- TRACE
- return kAudioUnitErr_InvalidProperty;
- }
+ // ----------------------------------------------------------------------------------------------------------------
+ // ComponentBase Property Dispatch
- OSStatus SaveState(CFPropertyListRef* outData) override
+ OSStatus GetParameterInfo(const AudioUnitScope inScope,
+ const AudioUnitParameterID inParameterID,
+ AudioUnitParameterInfo& outParameterInfo) override
{
TRACE
- return PluginBase::SaveState(outData);
- }
+ DISTRHO_SAFE_ASSERT_INT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
+ DISTRHO_SAFE_ASSERT_UINT_RETURN(inParameterID < fParameterCount, inParameterID, kAudioUnitErr_InvalidParameter);
- OSStatus RestoreState(CFPropertyListRef inData) override
- {
- TRACE
- return noErr;
- }
+ const uint32_t index = inParameterID;
+ const ParameterRanges& ranges(fPlugin.getParameterRanges(index));
- OSStatus GetParameterValueStrings(AudioUnitScope inScope,
- AudioUnitParameterID inParameterID,
- CFArrayRef *outStrings) override
- {
- TRACE
- return kAudioUnitErr_InvalidProperty;
- }
+ outParameterInfo.flags = kAudioUnitParameterFlag_IsHighResolution
+ | kAudioUnitParameterFlag_IsReadable
+ | kAudioUnitParameterFlag_HasCFNameString;
- OSStatus GetPresets(CFArrayRef* outData) const override
- {
- TRACE
- return noErr;
- }
+ 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;
- OSStatus NewFactoryPresetSet(const AUPreset& inNewFactoryPreset) override
- {
- TRACE
return noErr;
}
-#endif
#if DISTRHO_PLUGIN_WANT_LATENCY
Float64 GetLatency() override
@@ -565,8 +619,9 @@ protected:
OSStatus StopNote(MusicDeviceGroupID, NoteInstanceID, UInt32) override
{
TRACE
- return noErr;
+ return noErr;
}
+#endif
void SetMaxFramesPerSlice(const UInt32 nFrames) override
{
@@ -576,6 +631,7 @@ protected:
fPlugin.setBufferSize(nFrames, true);
}
+#if 0
UInt32 GetChannelLayoutTags(const AudioUnitScope scope,
const AudioUnitElement element,
AudioChannelLayoutTag* const outLayoutTags) override
@@ -626,6 +682,10 @@ private:
fPlugin.setBufferSize(GetMaxFramesPerSlice(), true);
}
+private:
+ const uint32_t fParameterCount;
+ float* fCachedParameterValues;
+
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginAU)
};
diff --git a/distrho/src/DistrhoPluginExport.cpp b/distrho/src/DistrhoPluginExport.cpp
@@ -89,7 +89,7 @@ void generate_au_plist(const PluginExporter& plugin,
outputFile << " <string>aufx</string>\n"; // kAudioUnitType_Effect
#endif
outputFile << " <key>subtype</key>\n";
- outputFile << " <string>ParM</string>\n";
+ outputFile << " <string>Cair</string>\n";
outputFile << " <key>version</key>\n";
outputFile << " <integer>" << version << "</integer>\n";
outputFile << " <key>resourceUsage</key>\n";
diff --git a/distrho/src/DistrhoUIAU.mm b/distrho/src/DistrhoUIAU.mm
@@ -14,9 +14,6 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-// TODO
-// - g_nextBundlePath vs d_nextBundlePath cleanup
-
#include "DistrhoUIInternal.hpp"
#define Point AudioUnitPoint
@@ -179,7 +176,7 @@ END_NAMESPACE_DISTRHO
- (NSString*) description
{
- return [NSString stringWithUTF8String:DISTRHO_PLUGIN_NAME];
+ return @DISTRHO_PLUGIN_NAME;
}
- (unsigned) interfaceVersion
diff --git a/examples/CairoUI/Makefile b/examples/CairoUI/Makefile
@@ -28,7 +28,7 @@ include ../../Makefile.plugins.mk
# --------------------------------------------------------------
# Enable all possible plugin types
-TARGETS = clap dssi jack lv2_sep vst2 vst3
+TARGETS = clap dssi jack lv2_sep vst2 vst3 au
all: $(TARGETS)
diff --git a/examples/Info/Makefile b/examples/Info/Makefile
@@ -37,6 +37,7 @@ TARGETS += lv2_sep
TARGETS += vst2
TARGETS += vst3
TARGETS += clap
+TARGETS += au
all: $(TARGETS)