@@ -6,8 +6,8 @@ | |||||
<rect> | <rect> | ||||
<x>0</x> | <x>0</x> | ||||
<y>0</y> | <y>0</y> | ||||
<width>505</width> | |||||
<height>436</height> | |||||
<width>537</width> | |||||
<height>535</height> | |||||
</rect> | </rect> | ||||
</property> | </property> | ||||
<property name="windowTitle"> | <property name="windowTitle"> | ||||
@@ -170,7 +170,16 @@ | |||||
<property name="spacing"> | <property name="spacing"> | ||||
<number>0</number> | <number>0</number> | ||||
</property> | </property> | ||||
<property name="margin"> | |||||
<property name="leftMargin"> | |||||
<number>0</number> | |||||
</property> | |||||
<property name="topMargin"> | |||||
<number>0</number> | |||||
</property> | |||||
<property name="rightMargin"> | |||||
<number>0</number> | |||||
</property> | |||||
<property name="bottomMargin"> | |||||
<number>0</number> | <number>0</number> | ||||
</property> | </property> | ||||
<item> | <item> | ||||
@@ -224,7 +233,16 @@ | |||||
<property name="spacing"> | <property name="spacing"> | ||||
<number>0</number> | <number>0</number> | ||||
</property> | </property> | ||||
<property name="margin"> | |||||
<property name="leftMargin"> | |||||
<number>0</number> | |||||
</property> | |||||
<property name="topMargin"> | |||||
<number>0</number> | |||||
</property> | |||||
<property name="rightMargin"> | |||||
<number>0</number> | |||||
</property> | |||||
<property name="bottomMargin"> | |||||
<number>0</number> | <number>0</number> | ||||
</property> | </property> | ||||
<item> | <item> | ||||
@@ -499,7 +517,16 @@ Plugin Name | |||||
</property> | </property> | ||||
<widget class="QWidget" name="sww_programs"> | <widget class="QWidget" name="sww_programs"> | ||||
<layout class="QHBoxLayout" name="horizontalLayout_3"> | <layout class="QHBoxLayout" name="horizontalLayout_3"> | ||||
<property name="margin"> | |||||
<property name="leftMargin"> | |||||
<number>2</number> | |||||
</property> | |||||
<property name="topMargin"> | |||||
<number>2</number> | |||||
</property> | |||||
<property name="rightMargin"> | |||||
<number>2</number> | |||||
</property> | |||||
<property name="bottomMargin"> | |||||
<number>2</number> | <number>2</number> | ||||
</property> | </property> | ||||
<item> | <item> | ||||
@@ -542,7 +569,16 @@ Plugin Name | |||||
</widget> | </widget> | ||||
<widget class="QWidget" name="sww_midiPrograms"> | <widget class="QWidget" name="sww_midiPrograms"> | ||||
<layout class="QHBoxLayout" name="horizontalLayout_4"> | <layout class="QHBoxLayout" name="horizontalLayout_4"> | ||||
<property name="margin"> | |||||
<property name="leftMargin"> | |||||
<number>2</number> | |||||
</property> | |||||
<property name="topMargin"> | |||||
<number>2</number> | |||||
</property> | |||||
<property name="rightMargin"> | |||||
<number>2</number> | |||||
</property> | |||||
<property name="bottomMargin"> | |||||
<number>2</number> | <number>2</number> | ||||
</property> | </property> | ||||
<item> | <item> | ||||
@@ -597,7 +633,7 @@ Plugin Name | |||||
<string>Save State</string> | <string>Save State</string> | ||||
</property> | </property> | ||||
<property name="icon"> | <property name="icon"> | ||||
<iconset resource="../resources.qrc"> | |||||
<iconset> | |||||
<normaloff>:/16x16/document-save.png</normaloff>:/16x16/document-save.png</iconset> | <normaloff>:/16x16/document-save.png</normaloff>:/16x16/document-save.png</iconset> | ||||
</property> | </property> | ||||
</widget> | </widget> | ||||
@@ -611,7 +647,7 @@ Plugin Name | |||||
<string>Load State</string> | <string>Load State</string> | ||||
</property> | </property> | ||||
<property name="icon"> | <property name="icon"> | ||||
<iconset resource="../resources.qrc"> | |||||
<iconset> | |||||
<normaloff>:/16x16/document-open.png</normaloff>:/16x16/document-open.png</iconset> | <normaloff>:/16x16/document-open.png</normaloff>:/16x16/document-open.png</iconset> | ||||
</property> | </property> | ||||
</widget> | </widget> | ||||
@@ -182,6 +182,16 @@ typedef struct _CarlaParameterInfo { | |||||
*/ | */ | ||||
const char* unit; | const char* unit; | ||||
/*! | |||||
* Parameter comment / documentation. | |||||
*/ | |||||
const char* comment; | |||||
/*! | |||||
* Parameter group name. | |||||
*/ | |||||
const char* groupName; | |||||
/*! | /*! | ||||
* Number of scale points. | * Number of scale points. | ||||
* @see CarlaScalePointInfo | * @see CarlaScalePointInfo | ||||
@@ -66,6 +66,8 @@ _CarlaParameterInfo::_CarlaParameterInfo() noexcept | |||||
: name(gNullCharPtr), | : name(gNullCharPtr), | ||||
symbol(gNullCharPtr), | symbol(gNullCharPtr), | ||||
unit(gNullCharPtr), | unit(gNullCharPtr), | ||||
comment(gNullCharPtr), | |||||
groupName(gNullCharPtr), | |||||
scalePointCount(0) {} | scalePointCount(0) {} | ||||
_CarlaParameterInfo::~_CarlaParameterInfo() noexcept | _CarlaParameterInfo::~_CarlaParameterInfo() noexcept | ||||
@@ -76,6 +78,10 @@ _CarlaParameterInfo::~_CarlaParameterInfo() noexcept | |||||
delete[] symbol; | delete[] symbol; | ||||
if (unit != gNullCharPtr) | if (unit != gNullCharPtr) | ||||
delete[] unit; | delete[] unit; | ||||
if (comment != gNullCharPtr) | |||||
delete[] comment; | |||||
if (groupName != gNullCharPtr) | |||||
delete[] groupName; | |||||
} | } | ||||
_CarlaScalePointInfo::_CarlaScalePointInfo() noexcept | _CarlaScalePointInfo::_CarlaScalePointInfo() noexcept | ||||
@@ -296,50 +296,60 @@ public: | |||||
/*! | /*! | ||||
* Get the plugin's label (URI for LV2 plugins). | * Get the plugin's label (URI for LV2 plugins). | ||||
*/ | */ | ||||
virtual void getLabel(char* const strBuf) const noexcept; | |||||
virtual bool getLabel(char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the plugin's maker. | * Get the plugin's maker. | ||||
*/ | */ | ||||
virtual void getMaker(char* const strBuf) const noexcept; | |||||
virtual bool getMaker(char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the plugin's copyright/license. | * Get the plugin's copyright/license. | ||||
*/ | */ | ||||
virtual void getCopyright(char* const strBuf) const noexcept; | |||||
virtual bool getCopyright(char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the plugin's (real) name. | * Get the plugin's (real) name. | ||||
* | * | ||||
* @see getName() and setName() | * @see getName() and setName() | ||||
*/ | */ | ||||
virtual void getRealName(char* const strBuf) const noexcept; | |||||
virtual bool getRealName(char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the name of the parameter @a parameterId. | * Get the name of the parameter @a parameterId. | ||||
*/ | */ | ||||
virtual void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept; | |||||
virtual bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the symbol of the parameter @a parameterId. | * Get the symbol of the parameter @a parameterId. | ||||
*/ | */ | ||||
virtual void getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept; | |||||
virtual bool getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the custom text of the parameter @a parameterId. | * Get the custom text of the parameter @a parameterId. | ||||
* @see PARAMETER_USES_CUSTOM_TEXT | * @see PARAMETER_USES_CUSTOM_TEXT | ||||
*/ | */ | ||||
virtual void getParameterText(const uint32_t parameterId, char* const strBuf) noexcept; | |||||
virtual bool getParameterText(const uint32_t parameterId, char* const strBuf) noexcept; | |||||
/*! | /*! | ||||
* Get the unit of the parameter @a parameterId. | * Get the unit of the parameter @a parameterId. | ||||
*/ | */ | ||||
virtual void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept; | |||||
virtual bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept; | |||||
/*! | |||||
* Get the comment (documentation) of the parameter @a parameterId. | |||||
*/ | |||||
virtual bool getParameterComment(const uint32_t parameterId, char* const strBuf) const noexcept; | |||||
/*! | |||||
* Get the group name of the parameter @a parameterId. | |||||
*/ | |||||
virtual bool getParameterGroupName(const uint32_t parameterId, char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the scalepoint @a scalePointId label of the parameter @a parameterId. | * Get the scalepoint @a scalePointId label of the parameter @a parameterId. | ||||
*/ | */ | ||||
virtual void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept; | |||||
virtual bool getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the current parameter value of @a parameterId. | * Get the current parameter value of @a parameterId. | ||||
@@ -351,14 +361,14 @@ public: | |||||
/*! | /*! | ||||
* Get the name of the program at @a index. | * Get the name of the program at @a index. | ||||
*/ | */ | ||||
void getProgramName(const uint32_t index, char* const strBuf) const noexcept; | |||||
bool getProgramName(const uint32_t index, char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get the name of the MIDI program at @a index. | * Get the name of the MIDI program at @a index. | ||||
* | * | ||||
* @see getMidiProgramInfo() | * @see getMidiProgramInfo() | ||||
*/ | */ | ||||
void getMidiProgramName(const uint32_t index, char* const strBuf) const noexcept; | |||||
bool getMidiProgramName(const uint32_t index, char* const strBuf) const noexcept; | |||||
/*! | /*! | ||||
* Get information about the plugin's parameter count. | * Get information about the plugin's parameter count. | ||||
@@ -1300,6 +1300,18 @@ const CarlaParameterInfo* carla_get_parameter_info(uint pluginId, uint32_t param | |||||
retInfo.unit = gNullCharPtr; | retInfo.unit = gNullCharPtr; | ||||
} | } | ||||
if (retInfo.comment != gNullCharPtr) | |||||
{ | |||||
delete[] retInfo.comment; | |||||
retInfo.comment = gNullCharPtr; | |||||
} | |||||
if (retInfo.groupName != gNullCharPtr) | |||||
{ | |||||
delete[] retInfo.groupName; | |||||
retInfo.groupName = gNullCharPtr; | |||||
} | |||||
CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &retInfo); | ||||
CarlaPlugin* const plugin(gStandalone.engine->getPlugin(pluginId)); | CarlaPlugin* const plugin(gStandalone.engine->getPlugin(pluginId)); | ||||
@@ -1308,24 +1320,45 @@ const CarlaParameterInfo* carla_get_parameter_info(uint pluginId, uint32_t param | |||||
carla_debug("carla_get_parameter_info(%i, %i)", pluginId, parameterId); | carla_debug("carla_get_parameter_info(%i, %i)", pluginId, parameterId); | ||||
char strBuf[STR_MAX+1]; | char strBuf[STR_MAX+1]; | ||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
retInfo.scalePointCount = plugin->getParameterScalePointCount(parameterId); | retInfo.scalePointCount = plugin->getParameterScalePointCount(parameterId); | ||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
plugin->getParameterName(parameterId, strBuf); | |||||
retInfo.name = carla_strdup_safe(strBuf); | |||||
if (plugin->getParameterName(parameterId, strBuf)) | |||||
{ | |||||
retInfo.name = carla_strdup_safe(strBuf); | |||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
} | |||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
plugin->getParameterSymbol(parameterId, strBuf); | |||||
retInfo.symbol = carla_strdup_safe(strBuf); | |||||
if (plugin->getParameterSymbol(parameterId, strBuf)) | |||||
{ | |||||
retInfo.symbol = carla_strdup_safe(strBuf); | |||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
} | |||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
plugin->getParameterUnit(parameterId, strBuf); | |||||
retInfo.unit = carla_strdup_safe(strBuf); | |||||
if (plugin->getParameterUnit(parameterId, strBuf)) | |||||
{ | |||||
retInfo.unit = carla_strdup_safe(strBuf); | |||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
} | |||||
if (plugin->getParameterComment(parameterId, strBuf)) | |||||
{ | |||||
retInfo.comment = carla_strdup_safe(strBuf); | |||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
} | |||||
if (plugin->getParameterGroupName(parameterId, strBuf)) | |||||
{ | |||||
retInfo.groupName = carla_strdup_safe(strBuf); | |||||
carla_zeroChars(strBuf, STR_MAX+1); | |||||
} | |||||
checkStringPtr(retInfo.name); | checkStringPtr(retInfo.name); | ||||
checkStringPtr(retInfo.symbol); | checkStringPtr(retInfo.symbol); | ||||
checkStringPtr(retInfo.unit); | checkStringPtr(retInfo.unit); | ||||
checkStringPtr(retInfo.comment); | |||||
checkStringPtr(retInfo.groupName); | |||||
return &retInfo; | return &retInfo; | ||||
} | } | ||||
@@ -1358,8 +1391,8 @@ const CarlaScalePointInfo* carla_get_parameter_scalepoint_info(uint pluginId, ui | |||||
retInfo.value = plugin->getParameterScalePointValue(parameterId, scalePointId); | retInfo.value = plugin->getParameterScalePointValue(parameterId, scalePointId); | ||||
carla_zeroChars(strBuf, STR_MAX+1); | carla_zeroChars(strBuf, STR_MAX+1); | ||||
plugin->getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||||
retInfo.label = carla_strdup_safe(strBuf); | |||||
if (plugin->getParameterScalePointLabel(parameterId, scalePointId, strBuf)) | |||||
retInfo.label = carla_strdup_safe(strBuf); | |||||
checkStringPtr(retInfo.label); | checkStringPtr(retInfo.label); | ||||
@@ -300,58 +300,81 @@ float CarlaPlugin::getParameterScalePointValue(const uint32_t parameterId, const | |||||
return 0.0f; | return 0.0f; | ||||
} | } | ||||
void CarlaPlugin::getLabel(char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getLabel(char* const strBuf) const noexcept | |||||
{ | { | ||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getMaker(char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getMaker(char* const strBuf) const noexcept | |||||
{ | { | ||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getCopyright(char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getCopyright(char* const strBuf) const noexcept | |||||
{ | { | ||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getRealName(char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getRealName(char* const strBuf) const noexcept | |||||
{ | { | ||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(),); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), false); | |||||
CARLA_SAFE_ASSERT(false); // this should never happen | CARLA_SAFE_ASSERT(false); // this should never happen | ||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(),); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), false); | |||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getParameterText(const uint32_t parameterId, char* const strBuf) noexcept | |||||
bool CarlaPlugin::getParameterText(const uint32_t parameterId, char* const strBuf) noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(),); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), false); | |||||
CARLA_SAFE_ASSERT(false); // this should never happen | CARLA_SAFE_ASSERT(false); // this should never happen | ||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(),); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), false); | |||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getParameterComment(const uint32_t parameterId, char* const strBuf) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(),); | |||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId),); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), false); | |||||
strBuf[0] = '\0'; | |||||
return false; | |||||
} | |||||
bool CarlaPlugin::getParameterGroupName(const uint32_t parameterId, char* const strBuf) const noexcept | |||||
{ | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), false); | |||||
strBuf[0] = '\0'; | |||||
return false; | |||||
} | |||||
bool CarlaPlugin::getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept | |||||
{ | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), false); | |||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId), false); | |||||
CARLA_SAFE_ASSERT(false); // this should never happen | CARLA_SAFE_ASSERT(false); // this should never happen | ||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
return false; | |||||
} | } | ||||
float CarlaPlugin::getInternalParameterValue(const int32_t parameterId) const noexcept | float CarlaPlugin::getInternalParameterValue(const int32_t parameterId) const noexcept | ||||
@@ -382,18 +405,20 @@ float CarlaPlugin::getInternalParameterValue(const int32_t parameterId) const no | |||||
return getParameterValue(static_cast<uint32_t>(parameterId)); | return getParameterValue(static_cast<uint32_t>(parameterId)); | ||||
} | } | ||||
void CarlaPlugin::getProgramName(const uint32_t index, char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getProgramName(const uint32_t index, char* const strBuf) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(index < pData->prog.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(pData->prog.names[index] != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(index < pData->prog.count, false); | |||||
CARLA_SAFE_ASSERT_RETURN(pData->prog.names[index] != nullptr, false); | |||||
std::strncpy(strBuf, pData->prog.names[index], STR_MAX); | std::strncpy(strBuf, pData->prog.names[index], STR_MAX); | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getMidiProgramName(const uint32_t index, char* const strBuf) const noexcept | |||||
bool CarlaPlugin::getMidiProgramName(const uint32_t index, char* const strBuf) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(index < pData->midiprog.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(pData->midiprog.data[index].name != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(index < pData->midiprog.count, false); | |||||
CARLA_SAFE_ASSERT_RETURN(pData->midiprog.data[index].name != nullptr, false); | |||||
std::strncpy(strBuf, pData->midiprog.data[index].name, STR_MAX); | std::strncpy(strBuf, pData->midiprog.data[index].name, STR_MAX); | ||||
return false; | |||||
} | } | ||||
void CarlaPlugin::getParameterCountInfo(uint32_t& ins, uint32_t& outs) const noexcept | void CarlaPlugin::getParameterCountInfo(uint32_t& ins, uint32_t& outs) const noexcept | ||||
@@ -530,37 +530,42 @@ public: | |||||
return fParams[parameterId].value; | return fParams[parameterId].value; | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, fInfo.label, STR_MAX); | std::strncpy(strBuf, fInfo.label, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, fInfo.maker, STR_MAX); | std::strncpy(strBuf, fInfo.maker, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, fInfo.copyright, STR_MAX); | std::strncpy(strBuf, fInfo.copyright, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, fInfo.name, STR_MAX); | std::strncpy(strBuf, fInfo.name, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
std::strncpy(strBuf, fParams[parameterId].name.buffer(), STR_MAX); | std::strncpy(strBuf, fParams[parameterId].name.buffer(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getParameterText(const uint32_t parameterId, char* const strBuf) noexcept override | |||||
bool getParameterText(const uint32_t parameterId, char* const strBuf) noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(! fReceivingParamText.isCurrentlyWaitingData(), nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
CARLA_SAFE_ASSERT_RETURN(! fReceivingParamText.isCurrentlyWaitingData(), false); | |||||
const int32_t parameterIdi = static_cast<int32_t>(parameterId); | const int32_t parameterIdi = static_cast<int32_t>(parameterId); | ||||
fReceivingParamText.setTargetData(parameterIdi, strBuf); | fReceivingParamText.setTargetData(parameterIdi, strBuf); | ||||
@@ -573,22 +578,27 @@ public: | |||||
fShmNonRtClientControl.commitWrite(); | fShmNonRtClientControl.commitWrite(); | ||||
} | } | ||||
if (! waitForParameterText()) | |||||
std::snprintf(strBuf, STR_MAX, "%f", static_cast<double>(fParams[parameterId].value)); | |||||
if (waitForParameterText()) | |||||
return true; | |||||
std::snprintf(strBuf, STR_MAX, "%f", static_cast<double>(fParams[parameterId].value)); | |||||
return false; | |||||
} | } | ||||
void getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
std::strncpy(strBuf, fParams[parameterId].symbol.buffer(), STR_MAX); | std::strncpy(strBuf, fParams[parameterId].symbol.buffer(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
std::strncpy(strBuf, fParams[parameterId].unit.buffer(), STR_MAX); | std::strncpy(strBuf, fParams[parameterId].unit.buffer(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -468,68 +468,69 @@ public: | |||||
return fParamBuffers[parameterId]; | return fParamBuffers[parameterId]; | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Label != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Label != nullptr, false); | |||||
std::strncpy(strBuf, fDescriptor->Label, STR_MAX); | std::strncpy(strBuf, fDescriptor->Label, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Maker != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Maker != nullptr, false); | |||||
std::strncpy(strBuf, fDescriptor->Maker, STR_MAX); | std::strncpy(strBuf, fDescriptor->Maker, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Copyright != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Copyright != nullptr, false); | |||||
std::strncpy(strBuf, fDescriptor->Copyright, STR_MAX); | std::strncpy(strBuf, fDescriptor->Copyright, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Name != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Name != nullptr, false); | |||||
std::strncpy(strBuf, fDescriptor->Name, STR_MAX); | std::strncpy(strBuf, fDescriptor->Name, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fDescriptor->PortCount), nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->PortNames[rindex] != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, false); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fDescriptor->PortCount), false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->PortNames[rindex] != nullptr, false); | |||||
if (getSeparatedParameterNameOrUnit(fDescriptor->PortNames[rindex], strBuf, true)) | |||||
return; | |||||
if (! getSeparatedParameterNameOrUnit(fDescriptor->PortNames[rindex], strBuf, true)) | |||||
std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX); | |||||
std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX); | |||||
return true; | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, false); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fDescriptor->PortCount), nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->PortNames[rindex] != nullptr, nullStrBuf(strBuf)); | |||||
if (getSeparatedParameterNameOrUnit(fDescriptor->PortNames[rindex], strBuf, false)) | |||||
return; | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fDescriptor->PortCount), false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->PortNames[rindex] != nullptr, false); | |||||
nullStrBuf(strBuf); | |||||
return getSeparatedParameterNameOrUnit(fDescriptor->PortNames[rindex], strBuf, false); | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -227,106 +227,108 @@ public: | |||||
} | } | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
if (fLabel != nullptr) | if (fLabel != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, fLabel, STR_MAX); | std::strncpy(strBuf, fLabel, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getLabel(strBuf); | |||||
return CarlaPlugin::getLabel(strBuf); | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, "FluidSynth SF2 engine", STR_MAX); | std::strncpy(strBuf, "FluidSynth SF2 engine", STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, "GNU GPL v2+", STR_MAX); | std::strncpy(strBuf, "GNU GPL v2+", STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
getLabel(strBuf); | |||||
return getLabel(strBuf); | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
switch (parameterId) | switch (parameterId) | ||||
{ | { | ||||
case FluidSynthReverbOnOff: | case FluidSynthReverbOnOff: | ||||
std::strncpy(strBuf, "Reverb On/Off", STR_MAX); | std::strncpy(strBuf, "Reverb On/Off", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthReverbRoomSize: | case FluidSynthReverbRoomSize: | ||||
std::strncpy(strBuf, "Reverb Room Size", STR_MAX); | std::strncpy(strBuf, "Reverb Room Size", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthReverbDamp: | case FluidSynthReverbDamp: | ||||
std::strncpy(strBuf, "Reverb Damp", STR_MAX); | std::strncpy(strBuf, "Reverb Damp", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthReverbLevel: | case FluidSynthReverbLevel: | ||||
std::strncpy(strBuf, "Reverb Level", STR_MAX); | std::strncpy(strBuf, "Reverb Level", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthReverbWidth: | case FluidSynthReverbWidth: | ||||
std::strncpy(strBuf, "Reverb Width", STR_MAX); | std::strncpy(strBuf, "Reverb Width", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthChorusOnOff: | case FluidSynthChorusOnOff: | ||||
std::strncpy(strBuf, "Chorus On/Off", STR_MAX); | std::strncpy(strBuf, "Chorus On/Off", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthChorusNr: | case FluidSynthChorusNr: | ||||
std::strncpy(strBuf, "Chorus Voice Count", STR_MAX); | std::strncpy(strBuf, "Chorus Voice Count", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthChorusLevel: | case FluidSynthChorusLevel: | ||||
std::strncpy(strBuf, "Chorus Level", STR_MAX); | std::strncpy(strBuf, "Chorus Level", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthChorusSpeedHz: | case FluidSynthChorusSpeedHz: | ||||
std::strncpy(strBuf, "Chorus Speed", STR_MAX); | std::strncpy(strBuf, "Chorus Speed", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthChorusDepthMs: | case FluidSynthChorusDepthMs: | ||||
std::strncpy(strBuf, "Chorus Depth", STR_MAX); | std::strncpy(strBuf, "Chorus Depth", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthChorusType: | case FluidSynthChorusType: | ||||
std::strncpy(strBuf, "Chorus Type", STR_MAX); | std::strncpy(strBuf, "Chorus Type", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthPolyphony: | case FluidSynthPolyphony: | ||||
std::strncpy(strBuf, "Polyphony", STR_MAX); | std::strncpy(strBuf, "Polyphony", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthInterpolation: | case FluidSynthInterpolation: | ||||
std::strncpy(strBuf, "Interpolation", STR_MAX); | std::strncpy(strBuf, "Interpolation", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthVoiceCount: | case FluidSynthVoiceCount: | ||||
std::strncpy(strBuf, "Voice Count", STR_MAX); | std::strncpy(strBuf, "Voice Count", STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
return CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
switch (parameterId) | switch (parameterId) | ||||
{ | { | ||||
case FluidSynthChorusSpeedHz: | case FluidSynthChorusSpeedHz: | ||||
std::strncpy(strBuf, "Hz", STR_MAX); | std::strncpy(strBuf, "Hz", STR_MAX); | ||||
return; | |||||
return true; | |||||
case FluidSynthChorusDepthMs: | case FluidSynthChorusDepthMs: | ||||
std::strncpy(strBuf, "ms", STR_MAX); | std::strncpy(strBuf, "ms", STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||||
return CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||||
} | } | ||||
void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | |||||
bool getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId),); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId), false); | |||||
switch (parameterId) | switch (parameterId) | ||||
{ | { | ||||
@@ -335,10 +337,10 @@ public: | |||||
{ | { | ||||
case 0: | case 0: | ||||
std::strncpy(strBuf, "Sine wave", STR_MAX); | std::strncpy(strBuf, "Sine wave", STR_MAX); | ||||
return; | |||||
return true; | |||||
case 1: | case 1: | ||||
std::strncpy(strBuf, "Triangle wave", STR_MAX); | std::strncpy(strBuf, "Triangle wave", STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
break; | break; | ||||
case FluidSynthInterpolation: | case FluidSynthInterpolation: | ||||
@@ -346,21 +348,21 @@ public: | |||||
{ | { | ||||
case 0: | case 0: | ||||
std::strncpy(strBuf, "None", STR_MAX); | std::strncpy(strBuf, "None", STR_MAX); | ||||
return; | |||||
return true; | |||||
case 1: | case 1: | ||||
std::strncpy(strBuf, "Straight-line", STR_MAX); | std::strncpy(strBuf, "Straight-line", STR_MAX); | ||||
return; | |||||
return true; | |||||
case 2: | case 2: | ||||
std::strncpy(strBuf, "Fourth-order", STR_MAX); | std::strncpy(strBuf, "Fourth-order", STR_MAX); | ||||
return; | |||||
return true; | |||||
case 3: | case 3: | ||||
std::strncpy(strBuf, "Seventh-order", STR_MAX); | std::strncpy(strBuf, "Seventh-order", STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
break; | break; | ||||
} | } | ||||
CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||||
return CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -572,25 +572,27 @@ public: | |||||
return fInfo.optionsAvailable; | return fInfo.optionsAvailable; | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, fInfo.setupLabel, STR_MAX); | std::strncpy(strBuf, fInfo.setupLabel, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const) const noexcept override | |||||
{ | { | ||||
nullStrBuf(strBuf); | |||||
return false; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const) const noexcept override | |||||
{ | { | ||||
nullStrBuf(strBuf); | |||||
return false; | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
// FIXME | // FIXME | ||||
std::strncpy(strBuf, "Carla's libjack", STR_MAX); | std::strncpy(strBuf, "Carla's libjack", STR_MAX); | ||||
return true; | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -201,51 +201,58 @@ public: | |||||
return fInstance->getParameter(static_cast<int>(parameterId)); | return fInstance->getParameter(static_cast<int>(parameterId)); | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
if (fDesc.pluginFormatName == "AU" || fDesc.pluginFormatName == "AudioUnit") | if (fDesc.pluginFormatName == "AU" || fDesc.pluginFormatName == "AudioUnit") | ||||
std::strncpy(strBuf, fDesc.fileOrIdentifier.toRawUTF8(), STR_MAX); | std::strncpy(strBuf, fDesc.fileOrIdentifier.toRawUTF8(), STR_MAX); | ||||
else | else | ||||
std::strncpy(strBuf, fDesc.name.toRawUTF8(), STR_MAX); | std::strncpy(strBuf, fDesc.name.toRawUTF8(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, fDesc.manufacturerName.toRawUTF8(), STR_MAX); | std::strncpy(strBuf, fDesc.manufacturerName.toRawUTF8(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
getMaker(strBuf); | |||||
return getMaker(strBuf); | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, fDesc.descriptiveName.toRawUTF8(), STR_MAX); | std::strncpy(strBuf, fDesc.descriptiveName.toRawUTF8(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fInstance != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fInstance != nullptr, false); | |||||
std::strncpy(strBuf, fInstance->getParameterName(static_cast<int>(parameterId), STR_MAX).toRawUTF8(), STR_MAX); | std::strncpy(strBuf, fInstance->getParameterName(static_cast<int>(parameterId), STR_MAX).toRawUTF8(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getParameterText(const uint32_t parameterId, char* const strBuf) noexcept override | |||||
bool getParameterText(const uint32_t parameterId, char* const strBuf) noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fInstance != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fInstance != nullptr, false); | |||||
std::strncpy(strBuf, fInstance->getParameterText(static_cast<int>(parameterId), STR_MAX).toRawUTF8(), STR_MAX); | std::strncpy(strBuf, fInstance->getParameterText(static_cast<int>(parameterId), STR_MAX).toRawUTF8(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fInstance != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fInstance != nullptr, false); | |||||
std::strncpy(strBuf, fInstance->getParameterLabel(static_cast<int>(parameterId)).toRawUTF8(), STR_MAX); | std::strncpy(strBuf, fInstance->getParameterLabel(static_cast<int>(parameterId)).toRawUTF8(), STR_MAX); | ||||
return true; | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Plugin, LADSPA implementation | * Carla Plugin, LADSPA implementation | ||||
* Copyright (C) 2011-2018 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -230,72 +230,72 @@ public: | |||||
return pData->param.ranges[parameterId].getFixedValue(scalePoint.Value); | return pData->param.ranges[parameterId].getFixedValue(scalePoint.Value); | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Label != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Label != nullptr, false); | |||||
std::strncpy(strBuf, fDescriptor->Label, STR_MAX); | std::strncpy(strBuf, fDescriptor->Label, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Maker != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Maker != nullptr, false); | |||||
if (fRdfDescriptor != nullptr && fRdfDescriptor->Creator != nullptr) | if (fRdfDescriptor != nullptr && fRdfDescriptor->Creator != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fRdfDescriptor->Creator, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->Creator, STR_MAX); | ||||
return; | |||||
} | |||||
else | |||||
std::strncpy(strBuf, fDescriptor->Maker, STR_MAX); | |||||
std::strncpy(strBuf, fDescriptor->Maker, STR_MAX); | |||||
return true; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Copyright != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Copyright != nullptr, false); | |||||
std::strncpy(strBuf, fDescriptor->Copyright, STR_MAX); | std::strncpy(strBuf, fDescriptor->Copyright, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Name != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->Name != nullptr, false); | |||||
if (fRdfDescriptor != nullptr && fRdfDescriptor->Title != nullptr) | if (fRdfDescriptor != nullptr && fRdfDescriptor->Title != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fRdfDescriptor->Title, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->Title, STR_MAX); | ||||
return; | |||||
} | |||||
else | |||||
std::strncpy(strBuf, fDescriptor->Name, STR_MAX); | |||||
std::strncpy(strBuf, fDescriptor->Name, STR_MAX); | |||||
return true; | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fDescriptor->PortCount), nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->PortNames[rindex] != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, false); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fDescriptor->PortCount), false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->PortNames[rindex] != nullptr, false); | |||||
if (getSeparatedParameterNameOrUnit(fDescriptor->PortNames[rindex], strBuf, true)) | |||||
return; | |||||
if (! getSeparatedParameterNameOrUnit(fDescriptor->PortNames[rindex], strBuf, true)) | |||||
std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX); | |||||
std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX); | |||||
return true; | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, false); | |||||
if (fRdfDescriptor != nullptr && rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | if (fRdfDescriptor != nullptr && rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | ||||
{ | { | ||||
@@ -307,74 +307,73 @@ public: | |||||
{ | { | ||||
case LADSPA_UNIT_DB: | case LADSPA_UNIT_DB: | ||||
std::strncpy(strBuf, "dB", STR_MAX); | std::strncpy(strBuf, "dB", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LADSPA_UNIT_COEF: | case LADSPA_UNIT_COEF: | ||||
std::strncpy(strBuf, "(coef)", STR_MAX); | std::strncpy(strBuf, "(coef)", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LADSPA_UNIT_HZ: | case LADSPA_UNIT_HZ: | ||||
std::strncpy(strBuf, "Hz", STR_MAX); | std::strncpy(strBuf, "Hz", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LADSPA_UNIT_S: | case LADSPA_UNIT_S: | ||||
std::strncpy(strBuf, "s", STR_MAX); | std::strncpy(strBuf, "s", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LADSPA_UNIT_MS: | case LADSPA_UNIT_MS: | ||||
std::strncpy(strBuf, "ms", STR_MAX); | std::strncpy(strBuf, "ms", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LADSPA_UNIT_MIN: | case LADSPA_UNIT_MIN: | ||||
std::strncpy(strBuf, "min", STR_MAX); | std::strncpy(strBuf, "min", STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fDescriptor->PortCount), nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->PortNames[rindex] != nullptr, nullStrBuf(strBuf)); | |||||
if (getSeparatedParameterNameOrUnit(fDescriptor->PortNames[rindex], strBuf, false)) | |||||
return; | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fDescriptor->PortCount), false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->PortNames[rindex] != nullptr, false); | |||||
nullStrBuf(strBuf); | |||||
return getSeparatedParameterNameOrUnit(fDescriptor->PortNames[rindex], strBuf, false); | |||||
} | } | ||||
void getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
if (fRdfDescriptor == nullptr) | if (fRdfDescriptor == nullptr) | ||||
return nullStrBuf(strBuf); | |||||
return false; | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, false); | |||||
if (rindex >= static_cast<int32_t>(fRdfDescriptor->PortCount)) | if (rindex >= static_cast<int32_t>(fRdfDescriptor->PortCount)) | ||||
return nullStrBuf(strBuf); | |||||
return false; | |||||
const LADSPA_RDF_Port& port(fRdfDescriptor->Ports[rindex]); | const LADSPA_RDF_Port& port(fRdfDescriptor->Ports[rindex]); | ||||
if (! LADSPA_PORT_HAS_LABEL(port.Hints)) | if (! LADSPA_PORT_HAS_LABEL(port.Hints)) | ||||
return nullStrBuf(strBuf); | |||||
return false; | |||||
CARLA_SAFE_ASSERT_RETURN(port.Label != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(port.Label != nullptr, false); | |||||
std::strncpy(strBuf, port.Label, STR_MAX); | std::strncpy(strBuf, port.Label, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | |||||
bool getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fRdfDescriptor->PortCount), nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex >= 0, false); | |||||
CARLA_SAFE_ASSERT_RETURN(rindex < static_cast<int32_t>(fRdfDescriptor->PortCount), false); | |||||
const LADSPA_RDF_Port& port(fRdfDescriptor->Ports[rindex]); | const LADSPA_RDF_Port& port(fRdfDescriptor->Ports[rindex]); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < port.ScalePointCount, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < port.ScalePointCount, false); | |||||
const LADSPA_RDF_ScalePoint& scalePoint(port.ScalePoints[scalePointId]); | const LADSPA_RDF_ScalePoint& scalePoint(port.ScalePoints[scalePointId]); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePoint.Label != nullptr, nullStrBuf(strBuf)); | |||||
CARLA_SAFE_ASSERT_RETURN(scalePoint.Label != nullptr, false); | |||||
std::strncpy(strBuf, scalePoint.Label, STR_MAX); | std::strncpy(strBuf, scalePoint.Label, STR_MAX); | ||||
return true; | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -934,55 +934,65 @@ public: | |||||
return 0.0f; | return 0.0f; | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor->URI != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor->URI != nullptr, false); | |||||
std::strncpy(strBuf, fRdfDescriptor->URI, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->URI, STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
if (fRdfDescriptor->Author != nullptr) | if (fRdfDescriptor->Author != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fRdfDescriptor->Author, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->Author, STR_MAX); | ||||
else | |||||
CarlaPlugin::getMaker(strBuf); | |||||
return true; | |||||
} | |||||
return false; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
if (fRdfDescriptor->License != nullptr) | if (fRdfDescriptor->License != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fRdfDescriptor->License, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->License, STR_MAX); | ||||
else | |||||
CarlaPlugin::getCopyright(strBuf); | |||||
return true; | |||||
} | |||||
return false; | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
if (fRdfDescriptor->Name != nullptr) | if (fRdfDescriptor->Name != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fRdfDescriptor->Name, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->Name, STR_MAX); | ||||
else | |||||
CarlaPlugin::getRealName(strBuf); | |||||
return true; | |||||
} | |||||
return false; | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
int32_t rindex = pData->param.data[parameterId].rindex; | int32_t rindex = pData->param.data[parameterId].rindex; | ||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | ||||
{ | { | ||||
std::strncpy(strBuf, fRdfDescriptor->Ports[rindex].Name, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->Ports[rindex].Name, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
rindex -= static_cast<int32_t>(fRdfDescriptor->PortCount); | rindex -= static_cast<int32_t>(fRdfDescriptor->PortCount); | ||||
@@ -990,23 +1000,23 @@ public: | |||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->ParameterCount)) | if (rindex < static_cast<int32_t>(fRdfDescriptor->ParameterCount)) | ||||
{ | { | ||||
std::strncpy(strBuf, fRdfDescriptor->Parameters[rindex].Label, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->Parameters[rindex].Label, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
return CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
} | } | ||||
void getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
int32_t rindex = pData->param.data[parameterId].rindex; | int32_t rindex = pData->param.data[parameterId].rindex; | ||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | ||||
{ | { | ||||
std::strncpy(strBuf, fRdfDescriptor->Ports[rindex].Symbol, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->Ports[rindex].Symbol, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
rindex -= static_cast<int32_t>(fRdfDescriptor->PortCount); | rindex -= static_cast<int32_t>(fRdfDescriptor->PortCount); | ||||
@@ -1014,16 +1024,16 @@ public: | |||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->ParameterCount)) | if (rindex < static_cast<int32_t>(fRdfDescriptor->ParameterCount)) | ||||
{ | { | ||||
std::strncpy(strBuf, fRdfDescriptor->Parameters[rindex].URI, STR_MAX); | std::strncpy(strBuf, fRdfDescriptor->Parameters[rindex].URI, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getParameterSymbol(parameterId, strBuf); | |||||
return CarlaPlugin::getParameterSymbol(parameterId, strBuf); | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
LV2_RDF_PortUnit* portUnit = nullptr; | LV2_RDF_PortUnit* portUnit = nullptr; | ||||
@@ -1048,7 +1058,7 @@ public: | |||||
if (LV2_HAVE_PORT_UNIT_SYMBOL(portUnit->Hints) && portUnit->Symbol != nullptr) | if (LV2_HAVE_PORT_UNIT_SYMBOL(portUnit->Hints) && portUnit->Symbol != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, portUnit->Symbol, STR_MAX); | std::strncpy(strBuf, portUnit->Symbol, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
if (LV2_HAVE_PORT_UNIT_UNIT(portUnit->Hints)) | if (LV2_HAVE_PORT_UNIT_UNIT(portUnit->Hints)) | ||||
@@ -1057,105 +1067,176 @@ public: | |||||
{ | { | ||||
case LV2_PORT_UNIT_BAR: | case LV2_PORT_UNIT_BAR: | ||||
std::strncpy(strBuf, "bars", STR_MAX); | std::strncpy(strBuf, "bars", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_BEAT: | case LV2_PORT_UNIT_BEAT: | ||||
std::strncpy(strBuf, "beats", STR_MAX); | std::strncpy(strBuf, "beats", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_BPM: | case LV2_PORT_UNIT_BPM: | ||||
std::strncpy(strBuf, "BPM", STR_MAX); | std::strncpy(strBuf, "BPM", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_CENT: | case LV2_PORT_UNIT_CENT: | ||||
std::strncpy(strBuf, "ct", STR_MAX); | std::strncpy(strBuf, "ct", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_CM: | case LV2_PORT_UNIT_CM: | ||||
std::strncpy(strBuf, "cm", STR_MAX); | std::strncpy(strBuf, "cm", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_COEF: | case LV2_PORT_UNIT_COEF: | ||||
std::strncpy(strBuf, "(coef)", STR_MAX); | std::strncpy(strBuf, "(coef)", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_DB: | case LV2_PORT_UNIT_DB: | ||||
std::strncpy(strBuf, "dB", STR_MAX); | std::strncpy(strBuf, "dB", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_DEGREE: | case LV2_PORT_UNIT_DEGREE: | ||||
std::strncpy(strBuf, "deg", STR_MAX); | std::strncpy(strBuf, "deg", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_FRAME: | case LV2_PORT_UNIT_FRAME: | ||||
std::strncpy(strBuf, "frames", STR_MAX); | std::strncpy(strBuf, "frames", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_HZ: | case LV2_PORT_UNIT_HZ: | ||||
std::strncpy(strBuf, "Hz", STR_MAX); | std::strncpy(strBuf, "Hz", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_INCH: | case LV2_PORT_UNIT_INCH: | ||||
std::strncpy(strBuf, "in", STR_MAX); | std::strncpy(strBuf, "in", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_KHZ: | case LV2_PORT_UNIT_KHZ: | ||||
std::strncpy(strBuf, "kHz", STR_MAX); | std::strncpy(strBuf, "kHz", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_KM: | case LV2_PORT_UNIT_KM: | ||||
std::strncpy(strBuf, "km", STR_MAX); | std::strncpy(strBuf, "km", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_M: | case LV2_PORT_UNIT_M: | ||||
std::strncpy(strBuf, "m", STR_MAX); | std::strncpy(strBuf, "m", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_MHZ: | case LV2_PORT_UNIT_MHZ: | ||||
std::strncpy(strBuf, "MHz", STR_MAX); | std::strncpy(strBuf, "MHz", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_MIDINOTE: | case LV2_PORT_UNIT_MIDINOTE: | ||||
std::strncpy(strBuf, "note", STR_MAX); | std::strncpy(strBuf, "note", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_MILE: | case LV2_PORT_UNIT_MILE: | ||||
std::strncpy(strBuf, "mi", STR_MAX); | std::strncpy(strBuf, "mi", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_MIN: | case LV2_PORT_UNIT_MIN: | ||||
std::strncpy(strBuf, "min", STR_MAX); | std::strncpy(strBuf, "min", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_MM: | case LV2_PORT_UNIT_MM: | ||||
std::strncpy(strBuf, "mm", STR_MAX); | std::strncpy(strBuf, "mm", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_MS: | case LV2_PORT_UNIT_MS: | ||||
std::strncpy(strBuf, "ms", STR_MAX); | std::strncpy(strBuf, "ms", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_OCT: | case LV2_PORT_UNIT_OCT: | ||||
std::strncpy(strBuf, "oct", STR_MAX); | std::strncpy(strBuf, "oct", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_PC: | case LV2_PORT_UNIT_PC: | ||||
std::strncpy(strBuf, "%", STR_MAX); | std::strncpy(strBuf, "%", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_S: | case LV2_PORT_UNIT_S: | ||||
std::strncpy(strBuf, "s", STR_MAX); | std::strncpy(strBuf, "s", STR_MAX); | ||||
return; | |||||
return true; | |||||
case LV2_PORT_UNIT_SEMITONE: | case LV2_PORT_UNIT_SEMITONE: | ||||
std::strncpy(strBuf, "semi", STR_MAX); | std::strncpy(strBuf, "semi", STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||||
return CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||||
} | } | ||||
void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | |||||
bool getParameterComment(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
int32_t rindex = pData->param.data[parameterId].rindex; | |||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | |||||
{ | |||||
if (const char* const comment = fRdfDescriptor->Ports[rindex].Comment) | |||||
{ | |||||
std::strncpy(strBuf, comment, STR_MAX); | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
rindex -= static_cast<int32_t>(fRdfDescriptor->PortCount); | |||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->ParameterCount)) | |||||
{ | |||||
if (const char* const comment = fRdfDescriptor->Parameters[rindex].Comment) | |||||
{ | |||||
std::strncpy(strBuf, comment, STR_MAX); | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
return CarlaPlugin::getParameterComment(parameterId, strBuf); | |||||
} | |||||
bool getParameterGroupName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
int32_t rindex = pData->param.data[parameterId].rindex; | |||||
const char* uri = nullptr; | |||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | |||||
{ | |||||
uri = fRdfDescriptor->Ports[rindex].GroupURI; | |||||
} | |||||
else | |||||
{ | |||||
rindex -= static_cast<int32_t>(fRdfDescriptor->PortCount); | |||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->ParameterCount)) | |||||
uri = fRdfDescriptor->Parameters[rindex].GroupURI; | |||||
} | |||||
if (uri == nullptr) | |||||
return false; | |||||
for (uint32_t i=0; i<fRdfDescriptor->PortGroupCount; ++i) | |||||
{ | |||||
if (std::strcmp(fRdfDescriptor->PortGroups[i].URI, uri) == 0) | |||||
{ | |||||
if (const char* const label = fRdfDescriptor->PortGroups[i].Label) | |||||
{ | |||||
std::strncpy(strBuf, label, STR_MAX); | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
bool getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | |||||
{ | |||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | ||||
{ | { | ||||
const LV2_RDF_Port* const port(&fRdfDescriptor->Ports[rindex]); | const LV2_RDF_Port* const port(&fRdfDescriptor->Ports[rindex]); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < port->ScalePointCount,); | |||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < port->ScalePointCount, false); | |||||
const LV2_RDF_PortScalePoint* const portScalePoint(&port->ScalePoints[scalePointId]); | const LV2_RDF_PortScalePoint* const portScalePoint(&port->ScalePoints[scalePointId]); | ||||
if (portScalePoint->Label != nullptr) | if (portScalePoint->Label != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, portScalePoint->Label, STR_MAX); | std::strncpy(strBuf, portScalePoint->Label, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
} | } | ||||
CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||||
return CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -478,64 +478,64 @@ public: | |||||
return 0.0f; | return 0.0f; | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
if (fDescriptor->label != nullptr) | if (fDescriptor->label != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, fDescriptor->label, STR_MAX); | std::strncpy(strBuf, fDescriptor->label, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getLabel(strBuf); | |||||
return CarlaPlugin::getLabel(strBuf); | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
if (fDescriptor->maker != nullptr) | if (fDescriptor->maker != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, fDescriptor->maker, STR_MAX); | std::strncpy(strBuf, fDescriptor->maker, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getMaker(strBuf); | |||||
return CarlaPlugin::getMaker(strBuf); | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
if (fDescriptor->copyright != nullptr) | if (fDescriptor->copyright != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, fDescriptor->copyright, STR_MAX); | std::strncpy(strBuf, fDescriptor->copyright, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getCopyright(strBuf); | |||||
return CarlaPlugin::getCopyright(strBuf); | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
if (fDescriptor->name != nullptr) | if (fDescriptor->name != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, fDescriptor->name, STR_MAX); | std::strncpy(strBuf, fDescriptor->name, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getRealName(strBuf); | |||||
return CarlaPlugin::getRealName(strBuf); | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
// FIXME - try | // FIXME - try | ||||
if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | ||||
@@ -543,7 +543,7 @@ public: | |||||
if (param->name != nullptr) | if (param->name != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, param->name, STR_MAX); | std::strncpy(strBuf, param->name, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
carla_safe_assert("param->name != nullptr", __FILE__, __LINE__); | carla_safe_assert("param->name != nullptr", __FILE__, __LINE__); | ||||
@@ -551,15 +551,15 @@ public: | |||||
} | } | ||||
carla_safe_assert("const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)", __FILE__, __LINE__); | carla_safe_assert("const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)", __FILE__, __LINE__); | ||||
CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
return CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
// FIXME - try | // FIXME - try | ||||
if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | ||||
@@ -567,34 +567,34 @@ public: | |||||
if (param->unit != nullptr) | if (param->unit != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, param->unit, STR_MAX); | std::strncpy(strBuf, param->unit, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
return CarlaPlugin::getParameterUnit(parameterId, strBuf); | return CarlaPlugin::getParameterUnit(parameterId, strBuf); | ||||
} | } | ||||
carla_safe_assert("const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)", __FILE__, __LINE__); | carla_safe_assert("const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)", __FILE__, __LINE__); | ||||
CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||||
return CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||||
} | } | ||||
void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | |||||
bool getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
// FIXME - try | // FIXME - try | ||||
if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < param->scalePointCount,); | |||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < param->scalePointCount, false); | |||||
const NativeParameterScalePoint* scalePoint(¶m->scalePoints[scalePointId]); | const NativeParameterScalePoint* scalePoint(¶m->scalePoints[scalePointId]); | ||||
if (scalePoint->label != nullptr) | if (scalePoint->label != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, scalePoint->label, STR_MAX); | std::strncpy(strBuf, scalePoint->label, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
carla_safe_assert("scalePoint->label != nullptr", __FILE__, __LINE__); | carla_safe_assert("scalePoint->label != nullptr", __FILE__, __LINE__); | ||||
@@ -602,7 +602,7 @@ public: | |||||
} | } | ||||
carla_safe_assert("const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)", __FILE__, __LINE__); | carla_safe_assert("const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)", __FILE__, __LINE__); | ||||
CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||||
return CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -136,43 +136,46 @@ public: | |||||
return fNumVoices; | return fNumVoices; | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
if (fLabel != nullptr) | if (fLabel != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, fLabel, STR_MAX); | std::strncpy(strBuf, fLabel, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getLabel(strBuf); | |||||
return CarlaPlugin::getLabel(strBuf); | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, "SFZero engine", STR_MAX); | std::strncpy(strBuf, "SFZero engine", STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
std::strncpy(strBuf, "ISC", STR_MAX); | std::strncpy(strBuf, "ISC", STR_MAX); | ||||
return true; | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
if (fRealName != nullptr) | if (fRealName != nullptr) | ||||
{ | { | ||||
std::strncpy(strBuf, fRealName, STR_MAX); | std::strncpy(strBuf, fRealName, STR_MAX); | ||||
return; | |||||
return true; | |||||
} | } | ||||
CarlaPlugin::getRealName(strBuf); | |||||
return CarlaPlugin::getRealName(strBuf); | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId == 0,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId == 0, false); | |||||
std::strncpy(strBuf, "Voice Count", STR_MAX); | std::strncpy(strBuf, "Voice Count", STR_MAX); | ||||
return true; | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -276,39 +276,42 @@ public: | |||||
return fEffect->getParameter(fEffect, static_cast<int32_t>(parameterId)); | return fEffect->getParameter(fEffect, static_cast<int32_t>(parameterId)); | ||||
} | } | ||||
void getLabel(char* const strBuf) const noexcept override | |||||
bool getLabel(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, false); | |||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
dispatcher(effGetProductString, 0, 0, strBuf); | dispatcher(effGetProductString, 0, 0, strBuf); | ||||
return true; | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | |||||
bool getMaker(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, false); | |||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
dispatcher(effGetVendorString, 0, 0, strBuf); | dispatcher(effGetVendorString, 0, 0, strBuf); | ||||
return true; | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | |||||
bool getCopyright(char* const strBuf) const noexcept override | |||||
{ | { | ||||
getMaker(strBuf); | |||||
return getMaker(strBuf); | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | |||||
bool getRealName(char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, false); | |||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
dispatcher(effGetEffectName, 0, 0, strBuf); | dispatcher(effGetEffectName, 0, 0, strBuf); | ||||
return true; | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
@@ -319,32 +322,36 @@ public: | |||||
{ | { | ||||
std::strncpy(strBuf, prop.label, 64); | std::strncpy(strBuf, prop.label, 64); | ||||
strBuf[64] = '\0'; | strBuf[64] = '\0'; | ||||
return; | |||||
return true; | |||||
} | } | ||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
dispatcher(effGetParamName, static_cast<int32_t>(parameterId), 0, strBuf); | dispatcher(effGetParamName, static_cast<int32_t>(parameterId), 0, strBuf); | ||||
return true; | |||||
} | } | ||||
void getParameterText(const uint32_t parameterId, char* const strBuf) noexcept override | |||||
bool getParameterText(const uint32_t parameterId, char* const strBuf) noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
dispatcher(effGetParamDisplay, static_cast<int32_t>(parameterId), 0, strBuf); | dispatcher(effGetParamDisplay, static_cast<int32_t>(parameterId), 0, strBuf); | ||||
if (strBuf[0] == '\0') | if (strBuf[0] == '\0') | ||||
std::snprintf(strBuf, STR_MAX, "%f", static_cast<double>(getParameterValue(parameterId))); | std::snprintf(strBuf, STR_MAX, "%f", static_cast<double>(getParameterValue(parameterId))); | ||||
return true; | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, false); | |||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||||
strBuf[0] = '\0'; | strBuf[0] = '\0'; | ||||
dispatcher(effGetParamLabel, static_cast<int32_t>(parameterId), 0, strBuf); | dispatcher(effGetParamLabel, static_cast<int32_t>(parameterId), 0, strBuf); | ||||
return true; | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -1246,6 +1246,12 @@ class CarlaParameterInfo(Structure): | |||||
# Parameter unit. | # Parameter unit. | ||||
("unit", c_char_p), | ("unit", c_char_p), | ||||
# Parameter comment / documentation. | |||||
("comment", c_char_p), | |||||
# Parameter group name. | |||||
("groupName", c_char_p), | |||||
# Number of scale points. | # Number of scale points. | ||||
# @see CarlaScalePointInfo | # @see CarlaScalePointInfo | ||||
("scalePointCount", c_uint32) | ("scalePointCount", c_uint32) | ||||
@@ -1360,6 +1366,8 @@ PyCarlaParameterInfo = { | |||||
'name': "", | 'name': "", | ||||
'symbol': "", | 'symbol': "", | ||||
'unit': "", | 'unit': "", | ||||
'comment': "", | |||||
'groupName': "", | |||||
'scalePointCount': 0, | 'scalePointCount': 0, | ||||
} | } | ||||
@@ -21,7 +21,7 @@ | |||||
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QByteArray, QSettings, QTimer | from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QByteArray, QSettings, QTimer | ||||
from PyQt5.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath, QPalette, QPixmap | from PyQt5.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath, QPalette, QPixmap | ||||
from PyQt5.QtWidgets import QDialog, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget | |||||
from PyQt5.QtWidgets import QDialog, QInputDialog, QLineEdit, QMenu, QScrollArea, QVBoxLayout, QWidget | |||||
# ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
# Imports (Custom) | # Imports (Custom) | ||||
@@ -435,9 +435,6 @@ class PluginEditParentMeta(): | |||||
# Plugin Editor (Built-in) | # Plugin Editor (Built-in) | ||||
class PluginEdit(QDialog): | class PluginEdit(QDialog): | ||||
# settings | |||||
kParamsPerPage = 17 | |||||
# signals | # signals | ||||
SIGTERM = pyqtSignal() | SIGTERM = pyqtSignal() | ||||
SIGUSR1 = pyqtSignal() | SIGUSR1 = pyqtSignal() | ||||
@@ -720,18 +717,6 @@ class PluginEdit(QDialog): | |||||
if not self.ui.scrollArea.isEnabled(): | if not self.ui.scrollArea.isEnabled(): | ||||
self.resize(self.width(), self.height()-self.ui.scrollArea.height()) | self.resize(self.width(), self.height()-self.ui.scrollArea.height()) | ||||
# FIXME: See if this is still needed | |||||
# Workaround for a Qt4 bug, see https://bugreports.qt-project.org/browse/QTBUG-7792 | |||||
if LINUX: QTimer.singleShot(0, self.slot_fixNameWordWrap) | |||||
@pyqtSlot() | |||||
def slot_fixNameWordWrap(self): | |||||
if self.ui.tabWidget.count() > 0: | |||||
self.ui.tabWidget.setCurrentIndex(1) | |||||
self.adjustSize() | |||||
self.ui.tabWidget.setCurrentIndex(0) | |||||
self.setMinimumSize(self.width(), self.height()) | |||||
#------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
def reloadInfo(self): | def reloadInfo(self): | ||||
@@ -893,11 +878,6 @@ class PluginEdit(QDialog): | |||||
paramInputList.append(parameter) | paramInputList.append(parameter) | ||||
if len(paramInputList) == self.kParamsPerPage: | |||||
paramInputListFull.append((paramInputList, paramInputWidth)) | |||||
paramInputList = [] | |||||
paramInputWidth = 0 | |||||
else: | else: | ||||
paramOutputWidthTMP = self.fontMetrics().width(parameter['name']) | paramOutputWidthTMP = self.fontMetrics().width(parameter['name']) | ||||
@@ -906,19 +886,8 @@ class PluginEdit(QDialog): | |||||
paramOutputList.append(parameter) | paramOutputList.append(parameter) | ||||
if len(paramOutputList) == self.kParamsPerPage: | |||||
paramOutputListFull.append((paramOutputList, paramOutputWidth)) | |||||
paramOutputList = [] | |||||
paramOutputWidth = 0 | |||||
# for i in range(parameterCount) | |||||
else: | |||||
# Final page width values | |||||
if 0 < len(paramInputList) < self.kParamsPerPage: | |||||
paramInputListFull.append((paramInputList, paramInputWidth)) | |||||
if 0 < len(paramOutputList) < self.kParamsPerPage: | |||||
paramOutputListFull.append((paramOutputList, paramOutputWidth)) | |||||
paramInputListFull.append((paramInputList, paramInputWidth)) | |||||
paramOutputListFull.append((paramOutputList, paramOutputWidth)) | |||||
# Create parameter tabs + widgets | # Create parameter tabs + widgets | ||||
self._createParameterWidgets(PARAMETER_INPUT, paramInputListFull, self.tr("Parameters")) | self._createParameterWidgets(PARAMETER_INPUT, paramInputListFull, self.tr("Parameters")) | ||||
@@ -1490,21 +1459,27 @@ class PluginEdit(QDialog): | |||||
#------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
def _createParameterWidgets(self, paramType, paramListFull, tabPageName): | def _createParameterWidgets(self, paramType, paramListFull, tabPageName): | ||||
i = 1 | |||||
for paramList, width in paramListFull: | for paramList, width in paramListFull: | ||||
if len(paramList) == 0: | if len(paramList) == 0: | ||||
break | break | ||||
tabIndex = self.ui.tabWidget.count() | |||||
tabPageContainer = QWidget(self.ui.tabWidget) | |||||
tabPageLayout = QVBoxLayout(tabPageContainer) | |||||
tabPageLayout.setSpacing(1) | |||||
tabPageContainer.setLayout(tabPageLayout) | |||||
tabIndex = self.ui.tabWidget.count() | |||||
tabPageLayout = QVBoxLayout(self.ui.tabWidget) | |||||
tabPageLayout.setSpacing(0) | |||||
scrollArea = QScrollArea(self.ui.tabWidget) | |||||
scrollArea.setWidgetResizable(True) | |||||
scrollArea.setFrameStyle(0) | |||||
scrollAreaWidget = QWidget(scrollArea) | |||||
scrollAreaLayout = QVBoxLayout(scrollAreaWidget) | |||||
scrollAreaLayout.setSpacing(1) | |||||
for paramInfo in paramList: | for paramInfo in paramList: | ||||
paramWidget = PluginParameter(tabPageContainer, self.host, paramInfo, self.fPluginId, tabIndex) | |||||
paramWidget = PluginParameter(scrollAreaWidget, self.host, paramInfo, self.fPluginId, tabIndex) | |||||
paramWidget.setLabelWidth(width) | paramWidget.setLabelWidth(width) | ||||
tabPageLayout.addWidget(paramWidget) | |||||
scrollAreaLayout.addWidget(paramWidget) | |||||
self.fParameterList.append((paramType, paramInfo['index'], paramWidget)) | self.fParameterList.append((paramType, paramInfo['index'], paramWidget)) | ||||
@@ -1514,10 +1489,12 @@ class PluginEdit(QDialog): | |||||
paramWidget.midiControlChanged.connect(self.slot_parameterMidiControlChanged) | paramWidget.midiControlChanged.connect(self.slot_parameterMidiControlChanged) | ||||
paramWidget.midiChannelChanged.connect(self.slot_parameterMidiChannelChanged) | paramWidget.midiChannelChanged.connect(self.slot_parameterMidiChannelChanged) | ||||
tabPageLayout.addStretch() | |||||
scrollAreaLayout.addStretch() | |||||
scrollArea.setWidget(scrollAreaWidget) | |||||
tabPageLayout.addWidget(scrollArea) | |||||
self.ui.tabWidget.addTab(tabPageContainer, "%s (%i)" % (tabPageName, i)) | |||||
i += 1 | |||||
self.ui.tabWidget.addTab(scrollArea, tabPageName) | |||||
if paramType == PARAMETER_INPUT: | if paramType == PARAMETER_INPUT: | ||||
self.ui.tabWidget.setTabIcon(tabIndex, self.fTabIconOff) | self.ui.tabWidget.setTabIcon(tabIndex, self.fTabIconOff) | ||||
@@ -404,6 +404,7 @@ struct LV2_RDF_Port { | |||||
const char* Name; | const char* Name; | ||||
const char* Symbol; | const char* Symbol; | ||||
const char* Comment; | const char* Comment; | ||||
const char* GroupURI; | |||||
LV2_RDF_PortMidiMap MidiMap; | LV2_RDF_PortMidiMap MidiMap; | ||||
LV2_RDF_PortPoints Points; | LV2_RDF_PortPoints Points; | ||||
@@ -421,6 +422,7 @@ struct LV2_RDF_Port { | |||||
Name(nullptr), | Name(nullptr), | ||||
Symbol(nullptr), | Symbol(nullptr), | ||||
Comment(nullptr), | Comment(nullptr), | ||||
GroupURI(nullptr), | |||||
MidiMap(), | MidiMap(), | ||||
Points(), | Points(), | ||||
Unit(), | Unit(), | ||||
@@ -445,6 +447,11 @@ struct LV2_RDF_Port { | |||||
delete[] Comment; | delete[] Comment; | ||||
Comment = nullptr; | Comment = nullptr; | ||||
} | } | ||||
if (GroupURI != nullptr) | |||||
{ | |||||
delete[] GroupURI; | |||||
GroupURI = nullptr; | |||||
} | |||||
if (ScalePoints != nullptr) | if (ScalePoints != nullptr) | ||||
{ | { | ||||
delete[] ScalePoints; | delete[] ScalePoints; | ||||
@@ -455,6 +462,34 @@ struct LV2_RDF_Port { | |||||
CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_Port) | CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_Port) | ||||
}; | }; | ||||
// Port | |||||
struct LV2_RDF_PortGroup { | |||||
LV2_URI URI; // shared value, do not deallocate | |||||
const char* Label; | |||||
const char* Symbol; | |||||
LV2_RDF_PortGroup() noexcept | |||||
: URI(nullptr), | |||||
Label(nullptr), | |||||
Symbol(nullptr) {} | |||||
~LV2_RDF_PortGroup() noexcept | |||||
{ | |||||
if (Label != nullptr) | |||||
{ | |||||
delete[] Label; | |||||
Label = nullptr; | |||||
} | |||||
if (Symbol != nullptr) | |||||
{ | |||||
delete[] Symbol; | |||||
Symbol = nullptr; | |||||
} | |||||
} | |||||
CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_PortGroup) | |||||
}; | |||||
// Parameter | // Parameter | ||||
struct LV2_RDF_Parameter { | struct LV2_RDF_Parameter { | ||||
LV2_URI URI; | LV2_URI URI; | ||||
@@ -462,6 +497,7 @@ struct LV2_RDF_Parameter { | |||||
bool Input; | bool Input; | ||||
const char* Label; | const char* Label; | ||||
const char* Comment; | const char* Comment; | ||||
const char* GroupURI; | |||||
LV2_RDF_PortMidiMap MidiMap; | LV2_RDF_PortMidiMap MidiMap; | ||||
LV2_RDF_PortPoints Points; | LV2_RDF_PortPoints Points; | ||||
@@ -473,6 +509,7 @@ struct LV2_RDF_Parameter { | |||||
Input(true), | Input(true), | ||||
Label(nullptr), | Label(nullptr), | ||||
Comment(nullptr), | Comment(nullptr), | ||||
GroupURI(nullptr), | |||||
MidiMap(), | MidiMap(), | ||||
Points(), | Points(), | ||||
Unit() {} | Unit() {} | ||||
@@ -494,6 +531,11 @@ struct LV2_RDF_Parameter { | |||||
delete[] Comment; | delete[] Comment; | ||||
Comment = nullptr; | Comment = nullptr; | ||||
} | } | ||||
if (GroupURI != nullptr) | |||||
{ | |||||
delete[] GroupURI; | |||||
GroupURI = nullptr; | |||||
} | |||||
} | } | ||||
CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_Parameter) | CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_Parameter) | ||||
@@ -656,6 +698,9 @@ struct LV2_RDF_Descriptor { | |||||
uint32_t PortCount; | uint32_t PortCount; | ||||
LV2_RDF_Port* Ports; | LV2_RDF_Port* Ports; | ||||
uint32_t PortGroupCount; | |||||
LV2_RDF_PortGroup* PortGroups; | |||||
uint32_t ParameterCount; | uint32_t ParameterCount; | ||||
LV2_RDF_Parameter* Parameters; | LV2_RDF_Parameter* Parameters; | ||||
@@ -681,6 +726,8 @@ struct LV2_RDF_Descriptor { | |||||
UniqueID(0), | UniqueID(0), | ||||
PortCount(0), | PortCount(0), | ||||
Ports(nullptr), | Ports(nullptr), | ||||
PortGroupCount(0), | |||||
PortGroups(nullptr), | |||||
ParameterCount(0), | ParameterCount(0), | ||||
Parameters(nullptr), | Parameters(nullptr), | ||||
PresetCount(0), | PresetCount(0), | ||||
@@ -732,6 +779,11 @@ struct LV2_RDF_Descriptor { | |||||
delete[] Ports; | delete[] Ports; | ||||
Ports = nullptr; | Ports = nullptr; | ||||
} | } | ||||
if (PortGroups != nullptr) | |||||
{ | |||||
delete[] PortGroups; | |||||
PortGroups = nullptr; | |||||
} | |||||
if (Parameters != nullptr) | if (Parameters != nullptr) | ||||
{ | { | ||||
delete[] Parameters; | delete[] Parameters; | ||||
@@ -187,6 +187,7 @@ struct Port { | |||||
#define LILV_PORT_WRAP1(RT, name, T1, a1) \ | #define LILV_PORT_WRAP1(RT, name, T1, a1) \ | ||||
inline RT name (T1 a1) { return lilv_port_ ## name (parent, me, a1); } | inline RT name (T1 a1) { return lilv_port_ ## name (parent, me, a1); } | ||||
LILV_PORT_WRAP1(LilvNode*, get, LilvNode*, predicate); | |||||
LILV_PORT_WRAP1(LilvNodes*, get_value, LilvNode*, predicate); | LILV_PORT_WRAP1(LilvNodes*, get_value, LilvNode*, predicate); | ||||
LILV_PORT_WRAP0(LilvNodes*, get_properties) | LILV_PORT_WRAP0(LilvNodes*, get_properties) | ||||
LILV_PORT_WRAP1(bool, has_property, LilvNode*, property_uri); | LILV_PORT_WRAP1(bool, has_property, LilvNode*, property_uri); | ||||
@@ -19,6 +19,7 @@ | |||||
#define CARLA_LV2_UTILS_HPP_INCLUDED | #define CARLA_LV2_UTILS_HPP_INCLUDED | ||||
#include "CarlaMathUtils.hpp" | #include "CarlaMathUtils.hpp" | ||||
#include "CarlaStringList.hpp" | |||||
#ifndef nullptr | #ifndef nullptr | ||||
# undef NULL | # undef NULL | ||||
@@ -248,6 +249,7 @@ public: | |||||
Lilv::Node patch_writable; | Lilv::Node patch_writable; | ||||
Lilv::Node parameter; | Lilv::Node parameter; | ||||
Lilv::Node pg_group; | |||||
Lilv::Node preset_preset; | Lilv::Node preset_preset; | ||||
@@ -383,6 +385,7 @@ public: | |||||
patch_writable (new_uri(LV2_PATCH__writable)), | patch_writable (new_uri(LV2_PATCH__writable)), | ||||
parameter (new_uri(LV2_CORE__Parameter)), | parameter (new_uri(LV2_CORE__Parameter)), | ||||
pg_group (new_uri(LV2_PORT_GROUPS__group)), | |||||
preset_preset (new_uri(LV2_PRESETS__Preset)), | preset_preset (new_uri(LV2_PRESETS__Preset)), | ||||
@@ -1643,6 +1646,8 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||||
Lilv::Plugin lilvPlugin(cPlugin); | Lilv::Plugin lilvPlugin(cPlugin); | ||||
LV2_RDF_Descriptor* const rdfDescriptor(new LV2_RDF_Descriptor()); | LV2_RDF_Descriptor* const rdfDescriptor(new LV2_RDF_Descriptor()); | ||||
CarlaStringList portGroups(false); // does not allocate own elements | |||||
// ---------------------------------------------------------------------------------------------------------------- | // ---------------------------------------------------------------------------------------------------------------- | ||||
// Set Plugin Type | // Set Plugin Type | ||||
{ | { | ||||
@@ -1827,6 +1832,19 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||||
if (const char* const symbol = lilv_node_as_string(lilvPort.get_symbol())) | if (const char* const symbol = lilv_node_as_string(lilvPort.get_symbol())) | ||||
rdfPort->Symbol = carla_strdup(symbol); | rdfPort->Symbol = carla_strdup(symbol); | ||||
if (LilvNode* const commentNode = lilvPort.get(lv2World.rdfs_comment.me)) | |||||
{ | |||||
rdfPort->Comment = carla_strdup(lilv_node_as_string(commentNode)); | |||||
lilv_node_free(commentNode); | |||||
} | |||||
if (LilvNode* const groupNode = lilvPort.get(lv2World.pg_group.me)) | |||||
{ | |||||
rdfPort->GroupURI = carla_strdup(lilv_node_as_uri(groupNode)); | |||||
lilv_node_free(groupNode); | |||||
portGroups.appendUnique(rdfPort->GroupURI); | |||||
} | |||||
} | } | ||||
// -------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------- | ||||
@@ -2358,10 +2376,18 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||||
if (LilvNode* const commentNode = lilv_world_get(lv2World.me, patchWritableNode, | if (LilvNode* const commentNode = lilv_world_get(lv2World.me, patchWritableNode, | ||||
lv2World.rdfs_comment.me, nullptr)) | lv2World.rdfs_comment.me, nullptr)) | ||||
{ | { | ||||
rdfParam.Comment = carla_strdup(lilv_node_as_string(commentNode)); | |||||
rdfParam.Comment = carla_strdup_safe(lilv_node_as_string(commentNode)); | |||||
lilv_node_free(commentNode); | lilv_node_free(commentNode); | ||||
} | } | ||||
if (LilvNode* const groupNode = lilv_world_get(lv2World.me, patchWritableNode, | |||||
lv2World.pg_group.me, nullptr)) | |||||
{ | |||||
rdfParam.GroupURI = carla_strdup_safe(lilv_node_as_uri(groupNode)); | |||||
lilv_node_free(groupNode); | |||||
portGroups.appendUnique(rdfParam.GroupURI); | |||||
} | |||||
// ---------------------------------------------------------------------------------------------------- | // ---------------------------------------------------------------------------------------------------- | ||||
// Set Port Points | // Set Port Points | ||||
@@ -2497,6 +2523,26 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||||
lilv_nodes_free(const_cast<LilvNodes*>(patchWritableNodes.me)); | lilv_nodes_free(const_cast<LilvNodes*>(patchWritableNodes.me)); | ||||
} | } | ||||
// ---------------------------------------------------------------------------------------------------------------- | |||||
// Set Plugin Port Groups | |||||
if (const size_t portGroupCount = portGroups.count()) | |||||
{ | |||||
rdfDescriptor->PortGroupCount = static_cast<uint32_t>(portGroupCount); | |||||
rdfDescriptor->PortGroups = new LV2_RDF_PortGroup[portGroupCount]; | |||||
std::size_t i=0; | |||||
for (LinkedList<const char*>::Itenerator it = portGroups.begin2(); it.valid(); it.next(), ++i) | |||||
{ | |||||
LV2_RDF_PortGroup& portGroup(rdfDescriptor->PortGroups[i]); | |||||
portGroup.URI = portGroups.getAt(i); | |||||
// TODO | |||||
portGroup.Label = carla_strdup_safe("test 1"); | |||||
} | |||||
} | |||||
// ---------------------------------------------------------------------------------------------------------------- | // ---------------------------------------------------------------------------------------------------------------- | ||||
// Set Plugin Presets | // Set Plugin Presets | ||||
@@ -156,11 +156,13 @@ private: | |||||
class CarlaStringList : public LinkedList<const char*> | class CarlaStringList : public LinkedList<const char*> | ||||
{ | { | ||||
public: | public: | ||||
CarlaStringList() noexcept | |||||
: LinkedList<const char*>() {} | |||||
CarlaStringList(bool allocateElements = true) noexcept | |||||
: LinkedList<const char*>(), | |||||
fAllocateElements(allocateElements) {} | |||||
CarlaStringList(const CarlaStringList& list) noexcept | CarlaStringList(const CarlaStringList& list) noexcept | ||||
: LinkedList<const char*>() | |||||
: LinkedList<const char*>(), | |||||
fAllocateElements(list.fAllocateElements) | |||||
{ | { | ||||
for (Itenerator it = list.begin2(); it.valid(); it.next()) | for (Itenerator it = list.begin2(); it.valid(); it.next()) | ||||
LinkedList<const char*>::append(carla_strdup_safe(it.getValue(nullptr))); | LinkedList<const char*>::append(carla_strdup_safe(it.getValue(nullptr))); | ||||
@@ -175,10 +177,13 @@ public: | |||||
void clear() noexcept | void clear() noexcept | ||||
{ | { | ||||
for (Itenerator it = begin2(); it.valid(); it.next()) | |||||
if (fAllocateElements) | |||||
{ | { | ||||
if (const char* const string = it.getValue(nullptr)) | |||||
delete[] string; | |||||
for (Itenerator it = begin2(); it.valid(); it.next()) | |||||
{ | |||||
if (const char* const string = it.getValue(nullptr)) | |||||
delete[] string; | |||||
} | |||||
} | } | ||||
LinkedList<const char*>::clear(); | LinkedList<const char*>::clear(); | ||||
@@ -190,7 +195,7 @@ public: | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | ||||
if (const char* const stringDup = carla_strdup_safe(string)) | |||||
if (const char* const stringDup = fAllocateElements ? carla_strdup_safe(string) : string) | |||||
{ | { | ||||
if (LinkedList<const char*>::append(stringDup)) | if (LinkedList<const char*>::append(stringDup)) | ||||
return true; | return true; | ||||
@@ -200,11 +205,21 @@ public: | |||||
return false; | return false; | ||||
} | } | ||||
bool appendUnique(const char* const string) noexcept | |||||
{ | |||||
CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | |||||
if (contains(string)) | |||||
return false; | |||||
return append(string); | |||||
} | |||||
bool appendAt(const char* const string, const Itenerator& it) noexcept | bool appendAt(const char* const string, const Itenerator& it) noexcept | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | ||||
if (const char* const stringDup = carla_strdup_safe(string)) | |||||
if (const char* const stringDup = fAllocateElements ? carla_strdup_safe(string) : string) | |||||
{ | { | ||||
if (LinkedList<const char*>::appendAt(stringDup, it)) | if (LinkedList<const char*>::appendAt(stringDup, it)) | ||||
return true; | return true; | ||||
@@ -218,7 +233,7 @@ public: | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | ||||
if (const char* const stringDup = carla_strdup_safe(string)) | |||||
if (const char* const stringDup = fAllocateElements ? carla_strdup_safe(string) : string) | |||||
{ | { | ||||
if (LinkedList<const char*>::insert(stringDup)) | if (LinkedList<const char*>::insert(stringDup)) | ||||
return true; | return true; | ||||
@@ -232,7 +247,7 @@ public: | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | ||||
if (const char* const stringDup = carla_strdup_safe(string)) | |||||
if (const char* const stringDup = fAllocateElements ? carla_strdup_safe(string) : string) | |||||
{ | { | ||||
if (LinkedList<const char*>::insertAt(stringDup, it)) | if (LinkedList<const char*>::insertAt(stringDup, it)) | ||||
return true; | return true; | ||||
@@ -392,6 +407,8 @@ public: | |||||
CarlaStringList& operator=(const char* const* const charStringList) noexcept | CarlaStringList& operator=(const char* const* const charStringList) noexcept | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(! fAllocateElements, *this); | |||||
clear(); | clear(); | ||||
CARLA_SAFE_ASSERT_RETURN(charStringList != nullptr, *this); | CARLA_SAFE_ASSERT_RETURN(charStringList != nullptr, *this); | ||||
@@ -407,6 +424,8 @@ public: | |||||
CarlaStringList& operator=(const CarlaStringList& list) noexcept | CarlaStringList& operator=(const CarlaStringList& list) noexcept | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(! fAllocateElements, *this); | |||||
clear(); | clear(); | ||||
for (Itenerator it = list.begin2(); it.valid(); it.next()) | for (Itenerator it = list.begin2(); it.valid(); it.next()) | ||||
@@ -418,6 +437,9 @@ public: | |||||
return *this; | return *this; | ||||
} | } | ||||
private: | |||||
const bool fAllocateElements; | |||||
CARLA_PREVENT_VIRTUAL_HEAP_ALLOCATION | CARLA_PREVENT_VIRTUAL_HEAP_ALLOCATION | ||||
}; | }; | ||||