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; | ||||
| } | } | ||||
| } | } | ||||