@@ -6,8 +6,8 @@ | |||
<rect> | |||
<x>0</x> | |||
<y>0</y> | |||
<width>505</width> | |||
<height>436</height> | |||
<width>537</width> | |||
<height>535</height> | |||
</rect> | |||
</property> | |||
<property name="windowTitle"> | |||
@@ -170,7 +170,16 @@ | |||
<property name="spacing"> | |||
<number>0</number> | |||
</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> | |||
</property> | |||
<item> | |||
@@ -224,7 +233,16 @@ | |||
<property name="spacing"> | |||
<number>0</number> | |||
</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> | |||
</property> | |||
<item> | |||
@@ -499,7 +517,16 @@ Plugin Name | |||
</property> | |||
<widget class="QWidget" name="sww_programs"> | |||
<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> | |||
</property> | |||
<item> | |||
@@ -542,7 +569,16 @@ Plugin Name | |||
</widget> | |||
<widget class="QWidget" name="sww_midiPrograms"> | |||
<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> | |||
</property> | |||
<item> | |||
@@ -597,7 +633,7 @@ Plugin Name | |||
<string>Save State</string> | |||
</property> | |||
<property name="icon"> | |||
<iconset resource="../resources.qrc"> | |||
<iconset> | |||
<normaloff>:/16x16/document-save.png</normaloff>:/16x16/document-save.png</iconset> | |||
</property> | |||
</widget> | |||
@@ -611,7 +647,7 @@ Plugin Name | |||
<string>Load State</string> | |||
</property> | |||
<property name="icon"> | |||
<iconset resource="../resources.qrc"> | |||
<iconset> | |||
<normaloff>:/16x16/document-open.png</normaloff>:/16x16/document-open.png</iconset> | |||
</property> | |||
</widget> | |||
@@ -182,6 +182,16 @@ typedef struct _CarlaParameterInfo { | |||
*/ | |||
const char* unit; | |||
/*! | |||
* Parameter comment / documentation. | |||
*/ | |||
const char* comment; | |||
/*! | |||
* Parameter group name. | |||
*/ | |||
const char* groupName; | |||
/*! | |||
* Number of scale points. | |||
* @see CarlaScalePointInfo | |||
@@ -66,6 +66,8 @@ _CarlaParameterInfo::_CarlaParameterInfo() noexcept | |||
: name(gNullCharPtr), | |||
symbol(gNullCharPtr), | |||
unit(gNullCharPtr), | |||
comment(gNullCharPtr), | |||
groupName(gNullCharPtr), | |||
scalePointCount(0) {} | |||
_CarlaParameterInfo::~_CarlaParameterInfo() noexcept | |||
@@ -76,6 +78,10 @@ _CarlaParameterInfo::~_CarlaParameterInfo() noexcept | |||
delete[] symbol; | |||
if (unit != gNullCharPtr) | |||
delete[] unit; | |||
if (comment != gNullCharPtr) | |||
delete[] comment; | |||
if (groupName != gNullCharPtr) | |||
delete[] groupName; | |||
} | |||
_CarlaScalePointInfo::_CarlaScalePointInfo() noexcept | |||
@@ -296,50 +296,60 @@ public: | |||
/*! | |||
* 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. | |||
*/ | |||
virtual void getMaker(char* const strBuf) const noexcept; | |||
virtual bool getMaker(char* const strBuf) const noexcept; | |||
/*! | |||
* 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. | |||
* | |||
* @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. | |||
*/ | |||
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. | |||
*/ | |||
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. | |||
* @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. | |||
*/ | |||
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. | |||
*/ | |||
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. | |||
@@ -351,14 +361,14 @@ public: | |||
/*! | |||
* 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. | |||
* | |||
* @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. | |||
@@ -1300,6 +1300,18 @@ const CarlaParameterInfo* carla_get_parameter_info(uint pluginId, uint32_t param | |||
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); | |||
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); | |||
char strBuf[STR_MAX+1]; | |||
carla_zeroChars(strBuf, STR_MAX+1); | |||
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.symbol); | |||
checkStringPtr(retInfo.unit); | |||
checkStringPtr(retInfo.comment); | |||
checkStringPtr(retInfo.groupName); | |||
return &retInfo; | |||
} | |||
@@ -1358,8 +1391,8 @@ const CarlaScalePointInfo* carla_get_parameter_scalepoint_info(uint pluginId, ui | |||
retInfo.value = plugin->getParameterScalePointValue(parameterId, scalePointId); | |||
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); | |||
@@ -300,58 +300,81 @@ float CarlaPlugin::getParameterScalePointValue(const uint32_t parameterId, const | |||
return 0.0f; | |||
} | |||
void CarlaPlugin::getLabel(char* const strBuf) const noexcept | |||
bool CarlaPlugin::getLabel(char* const strBuf) const noexcept | |||
{ | |||
strBuf[0] = '\0'; | |||
return false; | |||
} | |||
void CarlaPlugin::getMaker(char* const strBuf) const noexcept | |||
bool CarlaPlugin::getMaker(char* const strBuf) const noexcept | |||
{ | |||
strBuf[0] = '\0'; | |||
return false; | |||
} | |||
void CarlaPlugin::getCopyright(char* const strBuf) const noexcept | |||
bool CarlaPlugin::getCopyright(char* const strBuf) const noexcept | |||
{ | |||
strBuf[0] = '\0'; | |||
return false; | |||
} | |||
void CarlaPlugin::getRealName(char* const strBuf) const noexcept | |||
bool CarlaPlugin::getRealName(char* const strBuf) const noexcept | |||
{ | |||
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 | |||
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'; | |||
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 | |||
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'; | |||
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 | |||
strBuf[0] = '\0'; | |||
return false; | |||
} | |||
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)); | |||
} | |||
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); | |||
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); | |||
return false; | |||
} | |||
void CarlaPlugin::getParameterCountInfo(uint32_t& ins, uint32_t& outs) const noexcept | |||
@@ -530,37 +530,42 @@ public: | |||
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); | |||
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); | |||
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); | |||
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); | |||
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); | |||
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); | |||
fReceivingParamText.setTargetData(parameterIdi, strBuf); | |||
@@ -573,22 +578,27 @@ public: | |||
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); | |||
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); | |||
return true; | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -468,68 +468,69 @@ public: | |||
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); | |||
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); | |||
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); | |||
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); | |||
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); | |||
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); | |||
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) | |||
{ | |||
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); | |||
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); | |||
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) | |||
{ | |||
case FluidSynthReverbOnOff: | |||
std::strncpy(strBuf, "Reverb On/Off", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthReverbRoomSize: | |||
std::strncpy(strBuf, "Reverb Room Size", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthReverbDamp: | |||
std::strncpy(strBuf, "Reverb Damp", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthReverbLevel: | |||
std::strncpy(strBuf, "Reverb Level", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthReverbWidth: | |||
std::strncpy(strBuf, "Reverb Width", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthChorusOnOff: | |||
std::strncpy(strBuf, "Chorus On/Off", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthChorusNr: | |||
std::strncpy(strBuf, "Chorus Voice Count", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthChorusLevel: | |||
std::strncpy(strBuf, "Chorus Level", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthChorusSpeedHz: | |||
std::strncpy(strBuf, "Chorus Speed", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthChorusDepthMs: | |||
std::strncpy(strBuf, "Chorus Depth", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthChorusType: | |||
std::strncpy(strBuf, "Chorus Type", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthPolyphony: | |||
std::strncpy(strBuf, "Polyphony", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthInterpolation: | |||
std::strncpy(strBuf, "Interpolation", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthVoiceCount: | |||
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) | |||
{ | |||
case FluidSynthChorusSpeedHz: | |||
std::strncpy(strBuf, "Hz", STR_MAX); | |||
return; | |||
return true; | |||
case FluidSynthChorusDepthMs: | |||
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) | |||
{ | |||
@@ -335,10 +337,10 @@ public: | |||
{ | |||
case 0: | |||
std::strncpy(strBuf, "Sine wave", STR_MAX); | |||
return; | |||
return true; | |||
case 1: | |||
std::strncpy(strBuf, "Triangle wave", STR_MAX); | |||
return; | |||
return true; | |||
} | |||
break; | |||
case FluidSynthInterpolation: | |||
@@ -346,21 +348,21 @@ public: | |||
{ | |||
case 0: | |||
std::strncpy(strBuf, "None", STR_MAX); | |||
return; | |||
return true; | |||
case 1: | |||
std::strncpy(strBuf, "Straight-line", STR_MAX); | |||
return; | |||
return true; | |||
case 2: | |||
std::strncpy(strBuf, "Fourth-order", STR_MAX); | |||
return; | |||
return true; | |||
case 3: | |||
std::strncpy(strBuf, "Seventh-order", STR_MAX); | |||
return; | |||
return true; | |||
} | |||
break; | |||
} | |||
CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||
return CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -572,25 +572,27 @@ public: | |||
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); | |||
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 | |||
std::strncpy(strBuf, "Carla's libjack", STR_MAX); | |||
return true; | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -201,51 +201,58 @@ public: | |||
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") | |||
std::strncpy(strBuf, fDesc.fileOrIdentifier.toRawUTF8(), STR_MAX); | |||
else | |||
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); | |||
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); | |||
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); | |||
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); | |||
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); | |||
return true; | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
* 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 | |||
* 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); | |||
} | |||
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); | |||
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) | |||
{ | |||
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); | |||
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) | |||
{ | |||
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); | |||
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); | |||
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)) | |||
{ | |||
@@ -307,74 +307,73 @@ public: | |||
{ | |||
case LADSPA_UNIT_DB: | |||
std::strncpy(strBuf, "dB", STR_MAX); | |||
return; | |||
return true; | |||
case LADSPA_UNIT_COEF: | |||
std::strncpy(strBuf, "(coef)", STR_MAX); | |||
return; | |||
return true; | |||
case LADSPA_UNIT_HZ: | |||
std::strncpy(strBuf, "Hz", STR_MAX); | |||
return; | |||
return true; | |||
case LADSPA_UNIT_S: | |||
std::strncpy(strBuf, "s", STR_MAX); | |||
return; | |||
return true; | |||
case LADSPA_UNIT_MS: | |||
std::strncpy(strBuf, "ms", STR_MAX); | |||
return; | |||
return true; | |||
case LADSPA_UNIT_MIN: | |||
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) | |||
return nullStrBuf(strBuf); | |||
return false; | |||
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)) | |||
return nullStrBuf(strBuf); | |||
return false; | |||
const LADSPA_RDF_Port& port(fRdfDescriptor->Ports[rindex]); | |||
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); | |||
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); | |||
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]); | |||
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]); | |||
CARLA_SAFE_ASSERT_RETURN(scalePoint.Label != nullptr, nullStrBuf(strBuf)); | |||
CARLA_SAFE_ASSERT_RETURN(scalePoint.Label != nullptr, false); | |||
std::strncpy(strBuf, scalePoint.Label, STR_MAX); | |||
return true; | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -934,55 +934,65 @@ public: | |||
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); | |||
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) | |||
{ | |||
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) | |||
{ | |||
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) | |||
{ | |||
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; | |||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | |||
{ | |||
std::strncpy(strBuf, fRdfDescriptor->Ports[rindex].Name, STR_MAX); | |||
return; | |||
return true; | |||
} | |||
rindex -= static_cast<int32_t>(fRdfDescriptor->PortCount); | |||
@@ -990,23 +1000,23 @@ public: | |||
if (rindex < static_cast<int32_t>(fRdfDescriptor->ParameterCount)) | |||
{ | |||
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; | |||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | |||
{ | |||
std::strncpy(strBuf, fRdfDescriptor->Ports[rindex].Symbol, STR_MAX); | |||
return; | |||
return true; | |||
} | |||
rindex -= static_cast<int32_t>(fRdfDescriptor->PortCount); | |||
@@ -1014,16 +1024,16 @@ public: | |||
if (rindex < static_cast<int32_t>(fRdfDescriptor->ParameterCount)) | |||
{ | |||
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; | |||
@@ -1048,7 +1058,7 @@ public: | |||
if (LV2_HAVE_PORT_UNIT_SYMBOL(portUnit->Hints) && portUnit->Symbol != nullptr) | |||
{ | |||
std::strncpy(strBuf, portUnit->Symbol, STR_MAX); | |||
return; | |||
return true; | |||
} | |||
if (LV2_HAVE_PORT_UNIT_UNIT(portUnit->Hints)) | |||
@@ -1057,105 +1067,176 @@ public: | |||
{ | |||
case LV2_PORT_UNIT_BAR: | |||
std::strncpy(strBuf, "bars", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_BEAT: | |||
std::strncpy(strBuf, "beats", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_BPM: | |||
std::strncpy(strBuf, "BPM", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_CENT: | |||
std::strncpy(strBuf, "ct", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_CM: | |||
std::strncpy(strBuf, "cm", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_COEF: | |||
std::strncpy(strBuf, "(coef)", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_DB: | |||
std::strncpy(strBuf, "dB", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_DEGREE: | |||
std::strncpy(strBuf, "deg", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_FRAME: | |||
std::strncpy(strBuf, "frames", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_HZ: | |||
std::strncpy(strBuf, "Hz", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_INCH: | |||
std::strncpy(strBuf, "in", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_KHZ: | |||
std::strncpy(strBuf, "kHz", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_KM: | |||
std::strncpy(strBuf, "km", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_M: | |||
std::strncpy(strBuf, "m", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_MHZ: | |||
std::strncpy(strBuf, "MHz", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_MIDINOTE: | |||
std::strncpy(strBuf, "note", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_MILE: | |||
std::strncpy(strBuf, "mi", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_MIN: | |||
std::strncpy(strBuf, "min", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_MM: | |||
std::strncpy(strBuf, "mm", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_MS: | |||
std::strncpy(strBuf, "ms", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_OCT: | |||
std::strncpy(strBuf, "oct", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_PC: | |||
std::strncpy(strBuf, "%", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_S: | |||
std::strncpy(strBuf, "s", STR_MAX); | |||
return; | |||
return true; | |||
case LV2_PORT_UNIT_SEMITONE: | |||
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); | |||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | |||
{ | |||
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]); | |||
if (portScalePoint->Label != nullptr) | |||
{ | |||
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; | |||
} | |||
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) | |||
{ | |||
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) | |||
{ | |||
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) | |||
{ | |||
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) | |||
{ | |||
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 | |||
if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | |||
@@ -543,7 +543,7 @@ public: | |||
if (param->name != nullptr) | |||
{ | |||
std::strncpy(strBuf, param->name, STR_MAX); | |||
return; | |||
return true; | |||
} | |||
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__); | |||
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 | |||
if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | |||
@@ -567,34 +567,34 @@ public: | |||
if (param->unit != nullptr) | |||
{ | |||
std::strncpy(strBuf, param->unit, STR_MAX); | |||
return; | |||
return true; | |||
} | |||
return CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||
} | |||
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 | |||
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]); | |||
if (scalePoint->label != nullptr) | |||
{ | |||
std::strncpy(strBuf, scalePoint->label, STR_MAX); | |||
return; | |||
return true; | |||
} | |||
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__); | |||
CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||
return CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -136,43 +136,46 @@ public: | |||
return fNumVoices; | |||
} | |||
void getLabel(char* const strBuf) const noexcept override | |||
bool getLabel(char* const strBuf) const noexcept override | |||
{ | |||
if (fLabel != nullptr) | |||
{ | |||
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); | |||
return true; | |||
} | |||
void getCopyright(char* const strBuf) const noexcept override | |||
bool getCopyright(char* const strBuf) const noexcept override | |||
{ | |||
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) | |||
{ | |||
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); | |||
return true; | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -276,39 +276,42 @@ public: | |||
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'; | |||
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'; | |||
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'; | |||
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'; | |||
@@ -319,32 +322,36 @@ public: | |||
{ | |||
std::strncpy(strBuf, prop.label, 64); | |||
strBuf[64] = '\0'; | |||
return; | |||
return true; | |||
} | |||
strBuf[0] = '\0'; | |||
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'; | |||
dispatcher(effGetParamDisplay, static_cast<int32_t>(parameterId), 0, strBuf); | |||
if (strBuf[0] == '\0') | |||
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'; | |||
dispatcher(effGetParamLabel, static_cast<int32_t>(parameterId), 0, strBuf); | |||
return true; | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -1246,6 +1246,12 @@ class CarlaParameterInfo(Structure): | |||
# Parameter unit. | |||
("unit", c_char_p), | |||
# Parameter comment / documentation. | |||
("comment", c_char_p), | |||
# Parameter group name. | |||
("groupName", c_char_p), | |||
# Number of scale points. | |||
# @see CarlaScalePointInfo | |||
("scalePointCount", c_uint32) | |||
@@ -1360,6 +1366,8 @@ PyCarlaParameterInfo = { | |||
'name': "", | |||
'symbol': "", | |||
'unit': "", | |||
'comment': "", | |||
'groupName': "", | |||
'scalePointCount': 0, | |||
} | |||
@@ -21,7 +21,7 @@ | |||
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QByteArray, QSettings, QTimer | |||
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) | |||
@@ -435,9 +435,6 @@ class PluginEditParentMeta(): | |||
# Plugin Editor (Built-in) | |||
class PluginEdit(QDialog): | |||
# settings | |||
kParamsPerPage = 17 | |||
# signals | |||
SIGTERM = pyqtSignal() | |||
SIGUSR1 = pyqtSignal() | |||
@@ -720,18 +717,6 @@ class PluginEdit(QDialog): | |||
if not self.ui.scrollArea.isEnabled(): | |||
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): | |||
@@ -893,11 +878,6 @@ class PluginEdit(QDialog): | |||
paramInputList.append(parameter) | |||
if len(paramInputList) == self.kParamsPerPage: | |||
paramInputListFull.append((paramInputList, paramInputWidth)) | |||
paramInputList = [] | |||
paramInputWidth = 0 | |||
else: | |||
paramOutputWidthTMP = self.fontMetrics().width(parameter['name']) | |||
@@ -906,19 +886,8 @@ class PluginEdit(QDialog): | |||
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 | |||
self._createParameterWidgets(PARAMETER_INPUT, paramInputListFull, self.tr("Parameters")) | |||
@@ -1490,21 +1459,27 @@ class PluginEdit(QDialog): | |||
#------------------------------------------------------------------ | |||
def _createParameterWidgets(self, paramType, paramListFull, tabPageName): | |||
i = 1 | |||
for paramList, width in paramListFull: | |||
if len(paramList) == 0: | |||
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: | |||
paramWidget = PluginParameter(tabPageContainer, self.host, paramInfo, self.fPluginId, tabIndex) | |||
paramWidget = PluginParameter(scrollAreaWidget, self.host, paramInfo, self.fPluginId, tabIndex) | |||
paramWidget.setLabelWidth(width) | |||
tabPageLayout.addWidget(paramWidget) | |||
scrollAreaLayout.addWidget(paramWidget) | |||
self.fParameterList.append((paramType, paramInfo['index'], paramWidget)) | |||
@@ -1514,10 +1489,12 @@ class PluginEdit(QDialog): | |||
paramWidget.midiControlChanged.connect(self.slot_parameterMidiControlChanged) | |||
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: | |||
self.ui.tabWidget.setTabIcon(tabIndex, self.fTabIconOff) | |||
@@ -404,6 +404,7 @@ struct LV2_RDF_Port { | |||
const char* Name; | |||
const char* Symbol; | |||
const char* Comment; | |||
const char* GroupURI; | |||
LV2_RDF_PortMidiMap MidiMap; | |||
LV2_RDF_PortPoints Points; | |||
@@ -421,6 +422,7 @@ struct LV2_RDF_Port { | |||
Name(nullptr), | |||
Symbol(nullptr), | |||
Comment(nullptr), | |||
GroupURI(nullptr), | |||
MidiMap(), | |||
Points(), | |||
Unit(), | |||
@@ -445,6 +447,11 @@ struct LV2_RDF_Port { | |||
delete[] Comment; | |||
Comment = nullptr; | |||
} | |||
if (GroupURI != nullptr) | |||
{ | |||
delete[] GroupURI; | |||
GroupURI = nullptr; | |||
} | |||
if (ScalePoints != nullptr) | |||
{ | |||
delete[] ScalePoints; | |||
@@ -455,6 +462,34 @@ 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 | |||
struct LV2_RDF_Parameter { | |||
LV2_URI URI; | |||
@@ -462,6 +497,7 @@ struct LV2_RDF_Parameter { | |||
bool Input; | |||
const char* Label; | |||
const char* Comment; | |||
const char* GroupURI; | |||
LV2_RDF_PortMidiMap MidiMap; | |||
LV2_RDF_PortPoints Points; | |||
@@ -473,6 +509,7 @@ struct LV2_RDF_Parameter { | |||
Input(true), | |||
Label(nullptr), | |||
Comment(nullptr), | |||
GroupURI(nullptr), | |||
MidiMap(), | |||
Points(), | |||
Unit() {} | |||
@@ -494,6 +531,11 @@ struct LV2_RDF_Parameter { | |||
delete[] Comment; | |||
Comment = nullptr; | |||
} | |||
if (GroupURI != nullptr) | |||
{ | |||
delete[] GroupURI; | |||
GroupURI = nullptr; | |||
} | |||
} | |||
CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_Parameter) | |||
@@ -656,6 +698,9 @@ struct LV2_RDF_Descriptor { | |||
uint32_t PortCount; | |||
LV2_RDF_Port* Ports; | |||
uint32_t PortGroupCount; | |||
LV2_RDF_PortGroup* PortGroups; | |||
uint32_t ParameterCount; | |||
LV2_RDF_Parameter* Parameters; | |||
@@ -681,6 +726,8 @@ struct LV2_RDF_Descriptor { | |||
UniqueID(0), | |||
PortCount(0), | |||
Ports(nullptr), | |||
PortGroupCount(0), | |||
PortGroups(nullptr), | |||
ParameterCount(0), | |||
Parameters(nullptr), | |||
PresetCount(0), | |||
@@ -732,6 +779,11 @@ struct LV2_RDF_Descriptor { | |||
delete[] Ports; | |||
Ports = nullptr; | |||
} | |||
if (PortGroups != nullptr) | |||
{ | |||
delete[] PortGroups; | |||
PortGroups = nullptr; | |||
} | |||
if (Parameters != nullptr) | |||
{ | |||
delete[] Parameters; | |||
@@ -187,6 +187,7 @@ struct Port { | |||
#define LILV_PORT_WRAP1(RT, name, T1, 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_WRAP0(LilvNodes*, get_properties) | |||
LILV_PORT_WRAP1(bool, has_property, LilvNode*, property_uri); | |||
@@ -19,6 +19,7 @@ | |||
#define CARLA_LV2_UTILS_HPP_INCLUDED | |||
#include "CarlaMathUtils.hpp" | |||
#include "CarlaStringList.hpp" | |||
#ifndef nullptr | |||
# undef NULL | |||
@@ -248,6 +249,7 @@ public: | |||
Lilv::Node patch_writable; | |||
Lilv::Node parameter; | |||
Lilv::Node pg_group; | |||
Lilv::Node preset_preset; | |||
@@ -383,6 +385,7 @@ public: | |||
patch_writable (new_uri(LV2_PATCH__writable)), | |||
parameter (new_uri(LV2_CORE__Parameter)), | |||
pg_group (new_uri(LV2_PORT_GROUPS__group)), | |||
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); | |||
LV2_RDF_Descriptor* const rdfDescriptor(new LV2_RDF_Descriptor()); | |||
CarlaStringList portGroups(false); // does not allocate own elements | |||
// ---------------------------------------------------------------------------------------------------------------- | |||
// 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())) | |||
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, | |||
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); | |||
} | |||
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 | |||
@@ -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)); | |||
} | |||
// ---------------------------------------------------------------------------------------------------------------- | |||
// 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 | |||
@@ -156,11 +156,13 @@ private: | |||
class CarlaStringList : public LinkedList<const char*> | |||
{ | |||
public: | |||
CarlaStringList() noexcept | |||
: LinkedList<const char*>() {} | |||
CarlaStringList(bool allocateElements = true) noexcept | |||
: LinkedList<const char*>(), | |||
fAllocateElements(allocateElements) {} | |||
CarlaStringList(const CarlaStringList& list) noexcept | |||
: LinkedList<const char*>() | |||
: LinkedList<const char*>(), | |||
fAllocateElements(list.fAllocateElements) | |||
{ | |||
for (Itenerator it = list.begin2(); it.valid(); it.next()) | |||
LinkedList<const char*>::append(carla_strdup_safe(it.getValue(nullptr))); | |||
@@ -175,10 +177,13 @@ public: | |||
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(); | |||
@@ -190,7 +195,7 @@ public: | |||
{ | |||
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)) | |||
return true; | |||
@@ -200,11 +205,21 @@ public: | |||
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 | |||
{ | |||
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)) | |||
return true; | |||
@@ -218,7 +233,7 @@ public: | |||
{ | |||
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)) | |||
return true; | |||
@@ -232,7 +247,7 @@ public: | |||
{ | |||
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)) | |||
return true; | |||
@@ -392,6 +407,8 @@ public: | |||
CarlaStringList& operator=(const char* const* const charStringList) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(! fAllocateElements, *this); | |||
clear(); | |||
CARLA_SAFE_ASSERT_RETURN(charStringList != nullptr, *this); | |||
@@ -407,6 +424,8 @@ public: | |||
CarlaStringList& operator=(const CarlaStringList& list) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(! fAllocateElements, *this); | |||
clear(); | |||
for (Itenerator it = list.begin2(); it.valid(); it.next()) | |||
@@ -418,6 +437,9 @@ public: | |||
return *this; | |||
} | |||
private: | |||
const bool fAllocateElements; | |||
CARLA_PREVENT_VIRTUAL_HEAP_ALLOCATION | |||
}; | |||