Signed-off-by: falkTX <falktx@falktx.com>pull/421/head
@@ -506,93 +506,11 @@ struct ParameterEnumerationValue { | |||||
#endif | #endif | ||||
}; | }; | ||||
/** | |||||
Collection of parameter enumeration values.@n | |||||
Handy class to handle the lifetime and count of all enumeration values. | |||||
*/ | |||||
struct ParameterEnumerationValues { | |||||
uint8_t count; | |||||
bool deleteLater; | |||||
const ParameterEnumerationValue* ptr; | |||||
constexpr ParameterEnumerationValues() noexcept | |||||
: count(0), | |||||
deleteLater(false), | |||||
ptr(nullptr) {} | |||||
constexpr ParameterEnumerationValues(uint32_t c, const ParameterEnumerationValue* v) noexcept | |||||
: count(c), | |||||
deleteLater(false), | |||||
ptr(v) {} | |||||
// constexpr | |||||
~ParameterEnumerationValues() noexcept | |||||
{ | |||||
if (deleteLater) | |||||
delete[] ptr; | |||||
} | |||||
const ParameterEnumerationValue& operator[](const uint8_t index) const noexcept | |||||
{ | |||||
return ptr[index]; | |||||
} | |||||
template<uint8_t numValues> | |||||
ParameterEnumerationValues& operator=(const ParameterEnumerationValue values[numValues]) noexcept | |||||
{ | |||||
if (deleteLater) | |||||
delete[] ptr; | |||||
count = numValues; | |||||
ptr = values; | |||||
deleteLater = true; | |||||
return *this; | |||||
} | |||||
ParameterEnumerationValues& operator=(const ParameterEnumerationValues& other) noexcept | |||||
{ | |||||
if (deleteLater) | |||||
delete[] ptr; | |||||
count = 0; | |||||
ptr = nullptr; | |||||
deleteLater = false; | |||||
if (other.ptr != nullptr && other.count != 0) | |||||
{ | |||||
ParameterEnumerationValue* ptr2; | |||||
try { | |||||
ptr2 = new ParameterEnumerationValue[other.count]; | |||||
} DISTRHO_SAFE_EXCEPTION_RETURN("ParameterEnumerationValues::recreate", *this); | |||||
for (uint8_t i=0; i<other.count; ++i) | |||||
{ | |||||
ptr2[i].value = other.ptr[i].value; | |||||
ptr2[i].label = other.ptr[i].label; | |||||
} | |||||
count = other.count; | |||||
ptr = ptr2; | |||||
deleteLater = true; | |||||
} | |||||
return *this; | |||||
} | |||||
private: | |||||
#ifdef DISTRHO_PROPER_CPP11_SUPPORT | |||||
ParameterEnumerationValues(const ParameterEnumerationValues&) = delete; | |||||
#else | |||||
ParameterEnumerationValues(const ParameterEnumerationValues&); | |||||
#endif | |||||
}; | |||||
/** | /** | ||||
Details around parameter enumeration values.@n | Details around parameter enumeration values.@n | ||||
Wraps ParameterEnumerationValues and provides a few extra details to the host about these values. | Wraps ParameterEnumerationValues and provides a few extra details to the host about these values. | ||||
*/ | */ | ||||
struct ParameterEnumerationDetails { | |||||
struct ParameterEnumerationValues { | |||||
/** | /** | ||||
Number of elements allocated in @values. | Number of elements allocated in @values. | ||||
*/ | */ | ||||
@@ -609,24 +527,36 @@ struct ParameterEnumerationDetails { | |||||
Array of @ParameterEnumerationValue items.@n | Array of @ParameterEnumerationValue items.@n | ||||
This pointer must be null or have been allocated on the heap with `new ParameterEnumerationValue[count]`. | This pointer must be null or have been allocated on the heap with `new ParameterEnumerationValue[count]`. | ||||
*/ | */ | ||||
ParameterEnumerationValues values; | |||||
const ParameterEnumerationValue* values; | |||||
/** | /** | ||||
Default constructor, for zero enumeration values. | Default constructor, for zero enumeration values. | ||||
*/ | */ | ||||
constexpr ParameterEnumerationDetails() noexcept | |||||
constexpr ParameterEnumerationValues() noexcept | |||||
: count(0), | : count(0), | ||||
restrictedMode(false), | restrictedMode(false), | ||||
values() {} | |||||
values(nullptr), | |||||
deleteLater(true) {} | |||||
/** | /** | ||||
Constructor using custom values.@n | Constructor using custom values.@n | ||||
The pointer to @values must have been allocated on the heap with `new`. | The pointer to @values must have been allocated on the heap with `new`. | ||||
*/ | */ | ||||
constexpr ParameterEnumerationDetails(uint32_t c, bool r, const ParameterEnumerationValue* v) noexcept | |||||
constexpr ParameterEnumerationValues(uint32_t c, bool r, const ParameterEnumerationValue* v) noexcept | |||||
: count(c), | : count(c), | ||||
restrictedMode(r), | restrictedMode(r), | ||||
values(c, v) {} | |||||
values(v), | |||||
deleteLater(false) {} | |||||
// constexpr | |||||
~ParameterEnumerationValues() noexcept | |||||
{ | |||||
if (deleteLater) | |||||
delete[] values; | |||||
} | |||||
private: | |||||
bool deleteLater; | |||||
}; | }; | ||||
/** | /** | ||||
@@ -683,9 +613,8 @@ struct Parameter { | |||||
/** | /** | ||||
Enumeration details.@n | Enumeration details.@n | ||||
Can be used to give meaning to parameter values, working as an enumeration. | Can be used to give meaning to parameter values, working as an enumeration. | ||||
@todo rename to enumDetails | |||||
*/ | */ | ||||
ParameterEnumerationDetails enumValues; | |||||
ParameterEnumerationValues enumValues; | |||||
/** | /** | ||||
Designation for this parameter. | Designation for this parameter. | ||||
@@ -31,12 +31,11 @@ bool d_nextCanRequestParameterValueChanges = false; | |||||
/* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
* Static fallback data, see DistrhoPluginInternal.hpp */ | * Static fallback data, see DistrhoPluginInternal.hpp */ | ||||
const String PluginExporter::sFallbackString; | |||||
/* */ AudioPortWithBusId PluginExporter::sFallbackAudioPort; | |||||
const ParameterRanges PluginExporter::sFallbackRanges; | |||||
const ParameterEnumerationDetails PluginExporter::sFallbackEnumDetails; | |||||
const ParameterEnumerationValues PluginExporter::sFallbackEnumValues; | |||||
const PortGroupWithId PluginExporter::sFallbackPortGroup; | |||||
const String PluginExporter::sFallbackString; | |||||
/* */ AudioPortWithBusId PluginExporter::sFallbackAudioPort; | |||||
const ParameterRanges PluginExporter::sFallbackRanges; | |||||
const ParameterEnumerationValues PluginExporter::sFallbackEnumValues; | |||||
const PortGroupWithId PluginExporter::sFallbackPortGroup; | |||||
/* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
* Plugin */ | * Plugin */ | ||||
@@ -1181,9 +1181,9 @@ public: | |||||
for (uint32_t i=0; i < enumValues.count; ++i) | for (uint32_t i=0; i < enumValues.count; ++i) | ||||
{ | { | ||||
if (d_isEqual(static_cast<double>(enumValues.ptr[i].value), value)) | |||||
if (d_isEqual(static_cast<double>(enumValues.values[i].value), value)) | |||||
{ | { | ||||
d_strncpy(display, enumValues.ptr[i].label, size); | |||||
d_strncpy(display, enumValues.values[i].label, size); | |||||
return true; | return true; | ||||
} | } | ||||
} | } | ||||
@@ -1203,9 +1203,9 @@ public: | |||||
for (uint32_t i=0; i < enumValues.count; ++i) | for (uint32_t i=0; i < enumValues.count; ++i) | ||||
{ | { | ||||
if (std::strcmp(display, enumValues.ptr[i].label) == 0) | |||||
if (std::strcmp(display, enumValues.values[i].label) == 0) | |||||
{ | { | ||||
*value = enumValues.ptr[i].value; | |||||
*value = enumValues.values[i].value; | |||||
return true; | return true; | ||||
} | } | ||||
} | } | ||||
@@ -704,18 +704,11 @@ public: | |||||
return fData->parameters[index].description; | return fData->parameters[index].description; | ||||
} | } | ||||
const ParameterEnumerationDetails& getParameterEnumDetails(const uint32_t index) const noexcept | |||||
{ | |||||
DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackEnumDetails); | |||||
return fData->parameters[index].enumValues; | |||||
} | |||||
const ParameterEnumerationValues& getParameterEnumValues(const uint32_t index) const noexcept | const ParameterEnumerationValues& getParameterEnumValues(const uint32_t index) const noexcept | ||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackEnumValues); | DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackEnumValues); | ||||
return fData->parameters[index].enumValues.values; | |||||
return fData->parameters[index].enumValues; | |||||
} | } | ||||
const ParameterRanges& getParameterRanges(const uint32_t index) const noexcept | const ParameterRanges& getParameterRanges(const uint32_t index) const noexcept | ||||
@@ -1052,12 +1045,11 @@ private: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Static fallback data, see DistrhoPlugin.cpp | // Static fallback data, see DistrhoPlugin.cpp | ||||
static const String sFallbackString; | |||||
static /* */ AudioPortWithBusId sFallbackAudioPort; | |||||
static const ParameterRanges sFallbackRanges; | |||||
static const ParameterEnumerationDetails sFallbackEnumDetails; | |||||
static const ParameterEnumerationValues sFallbackEnumValues; | |||||
static const PortGroupWithId sFallbackPortGroup; | |||||
static const String sFallbackString; | |||||
static /* */ AudioPortWithBusId sFallbackAudioPort; | |||||
static const ParameterRanges sFallbackRanges; | |||||
static const ParameterEnumerationValues sFallbackEnumValues; | |||||
static const PortGroupWithId sFallbackPortGroup; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginExporter) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginExporter) | ||||
}; | }; | ||||
@@ -820,16 +820,16 @@ void lv2_generate_ttl(const char* const basename) | |||||
} | } | ||||
// enumeration | // enumeration | ||||
const ParameterEnumerationDetails& enumDetails(plugin.getParameterEnumDetails(i)); | |||||
const ParameterEnumerationValues& enumValues(plugin.getParameterEnumValues(i)); | |||||
if (enumDetails.count > 0) | |||||
if (enumValues.count > 0) | |||||
{ | { | ||||
if (enumDetails.count >= 2 && enumDetails.restrictedMode) | |||||
if (enumValues.count >= 2 && enumValues.restrictedMode) | |||||
pluginString += " lv2:portProperty lv2:enumeration ;\n"; | pluginString += " lv2:portProperty lv2:enumeration ;\n"; | ||||
for (uint8_t j=0; j < enumDetails.count; ++j) | |||||
for (uint8_t j=0; j < enumValues.count; ++j) | |||||
{ | { | ||||
const ParameterEnumerationValue& enumValue(enumDetails.values[j]); | |||||
const ParameterEnumerationValue& enumValue(enumValues.values[j]); | |||||
if (j == 0) | if (j == 0) | ||||
pluginString += " lv2:scalePoint [\n"; | pluginString += " lv2:scalePoint [\n"; | ||||
@@ -851,7 +851,7 @@ void lv2_generate_ttl(const char* const basename) | |||||
pluginString += " rdf:value " + String(enumValue.value) + " ;\n"; | pluginString += " rdf:value " + String(enumValue.value) + " ;\n"; | ||||
} | } | ||||
if (j+1 == enumDetails.count) | |||||
if (j+1 == enumValues.count) | |||||
pluginString += " ] ;\n"; | pluginString += " ] ;\n"; | ||||
else | else | ||||
pluginString += " ] ,\n"; | pluginString += " ] ,\n"; | ||||
@@ -527,10 +527,10 @@ public: | |||||
for (uint8_t i = 0; i < enumValues.count; ++i) | for (uint8_t i = 0; i < enumValues.count; ++i) | ||||
{ | { | ||||
if (d_isNotEqual(value, enumValues.ptr[i].value)) | |||||
if (d_isNotEqual(value, enumValues.values[i].value)) | |||||
continue; | continue; | ||||
strncpy((char*)ptr, enumValues.ptr[i].label.buffer(), 24); | |||||
strncpy((char*)ptr, enumValues.values[i].label.buffer(), 24); | |||||
return 1; | return 1; | ||||
} | } | ||||
@@ -1711,7 +1711,7 @@ public: | |||||
// set up flags | // set up flags | ||||
int32_t flags = 0; | int32_t flags = 0; | ||||
const ParameterEnumerationDetails& enumDetails(fPlugin.getParameterEnumDetails(index)); | |||||
const ParameterEnumerationValues& enumValues(fPlugin.getParameterEnumValues(index)); | |||||
const ParameterRanges& ranges(fPlugin.getParameterRanges(index)); | const ParameterRanges& ranges(fPlugin.getParameterRanges(index)); | ||||
const uint32_t hints = fPlugin.getParameterHints(index); | const uint32_t hints = fPlugin.getParameterHints(index); | ||||
@@ -1737,10 +1737,10 @@ public: | |||||
else if (hints & kParameterIsInteger) | else if (hints & kParameterIsInteger) | ||||
step_count = ranges.max - ranges.min; | step_count = ranges.max - ranges.min; | ||||
if (enumDetails.count >= 2 && enumDetails.restrictedMode) | |||||
if (enumValues.count >= 2 && enumValues.restrictedMode) | |||||
{ | { | ||||
flags |= V3_PARAM_IS_LIST; | flags |= V3_PARAM_IS_LIST; | ||||
step_count = enumDetails.count - 1; | |||||
step_count = enumValues.count - 1; | |||||
} | } | ||||
info->flags = flags; | info->flags = flags; | ||||
@@ -1810,9 +1810,9 @@ public: | |||||
for (uint32_t i=0; i < enumValues.count; ++i) | for (uint32_t i=0; i < enumValues.count; ++i) | ||||
{ | { | ||||
if (d_isEqual(enumValues.ptr[i].value, value)) | |||||
if (d_isEqual(enumValues.values[i].value, value)) | |||||
{ | { | ||||
strncpy_utf16(output, enumValues.ptr[i].label, 128); | |||||
strncpy_utf16(output, enumValues.values[i].label, 128); | |||||
return V3_OK; | return V3_OK; | ||||
} | } | ||||
} | } | ||||
@@ -1874,9 +1874,9 @@ public: | |||||
for (uint32_t i=0; i < enumValues.count; ++i) | for (uint32_t i=0; i < enumValues.count; ++i) | ||||
{ | { | ||||
if (strcmp_utf16(input, enumValues.ptr[i].label)) | |||||
if (strcmp_utf16(input, enumValues.values[i].label)) | |||||
{ | { | ||||
*output = ranges.getNormalizedValue(enumValues.ptr[i].value); | |||||
*output = ranges.getNormalizedValue(enumValues.values[i].value); | |||||
return V3_OK; | return V3_OK; | ||||
} | } | ||||
} | } | ||||