mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
AU Client: Order parameters according to version hint
This commit is contained in:
parent
3d38ca764e
commit
bb0a40e009
1 changed files with 40 additions and 3 deletions
|
|
@ -1816,6 +1816,9 @@ private:
|
|||
Array<AudioUnitParameterID> auParamIDs;
|
||||
Array<const AudioProcessorParameterGroup*> parameterGroups;
|
||||
|
||||
// Stores the parameter IDs in the order that they will be reported to the host.
|
||||
std::vector<AudioUnitParameterID> cachedParameterList;
|
||||
|
||||
//==============================================================================
|
||||
// According to the docs, this is the maximum size of a MIDIPacketList.
|
||||
static constexpr UInt32 packetListBytes = 65536;
|
||||
|
|
@ -2037,6 +2040,40 @@ private:
|
|||
return { {}, {}, {}, kAudioUnitErr_InvalidElement };
|
||||
}
|
||||
|
||||
OSStatus GetParameterList (AudioUnitScope inScope, AudioUnitParameterID* outParameterList, UInt32& outNumParameters) override
|
||||
{
|
||||
if (forceUseLegacyParamIDs || inScope != kAudioUnitScope_Global)
|
||||
return MusicDeviceBase::GetParameterList (inScope, outParameterList, outNumParameters);
|
||||
|
||||
outNumParameters = (UInt32) juceParameters.size();
|
||||
|
||||
if (outParameterList == nullptr)
|
||||
return noErr;
|
||||
|
||||
if (cachedParameterList.empty())
|
||||
{
|
||||
struct ParamInfo
|
||||
{
|
||||
AudioUnitParameterID identifier;
|
||||
int versionHint;
|
||||
};
|
||||
|
||||
std::vector<ParamInfo> vec;
|
||||
vec.reserve (juceParameters.size());
|
||||
|
||||
for (const auto* param : juceParameters)
|
||||
vec.push_back ({ generateAUParameterID (*param), param->getVersionHint() });
|
||||
|
||||
std::sort (vec.begin(), vec.end(), [] (auto a, auto b) { return a.identifier < b.identifier; });
|
||||
std::stable_sort (vec.begin(), vec.end(), [] (auto a, auto b) { return a.versionHint < b.versionHint; });
|
||||
std::transform (vec.begin(), vec.end(), std::back_inserter (cachedParameterList), [] (auto x) { return x.identifier; });
|
||||
}
|
||||
|
||||
std::copy (cachedParameterList.begin(), cachedParameterList.end(), outParameterList);
|
||||
|
||||
return noErr;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void addParameters()
|
||||
{
|
||||
|
|
@ -2053,7 +2090,7 @@ private:
|
|||
{
|
||||
for (auto* param : juceParameters)
|
||||
{
|
||||
const AudioUnitParameterID auParamID = generateAUParameterID (param);
|
||||
const AudioUnitParameterID auParamID = generateAUParameterID (*param);
|
||||
|
||||
// Consider yourself very unlucky if you hit this assertion. The hash codes of your
|
||||
// parameter ids are not unique.
|
||||
|
|
@ -2119,9 +2156,9 @@ private:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
AudioUnitParameterID generateAUParameterID (AudioProcessorParameter* param) const
|
||||
static AudioUnitParameterID generateAUParameterID (const AudioProcessorParameter& param)
|
||||
{
|
||||
const String& juceParamID = LegacyAudioParameter::getParamID (param, forceUseLegacyParamIDs);
|
||||
const String& juceParamID = LegacyAudioParameter::getParamID (¶m, forceUseLegacyParamIDs);
|
||||
AudioUnitParameterID paramHash = static_cast<AudioUnitParameterID> (juceParamID.hashCode());
|
||||
|
||||
#if JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue