@@ -43,8 +43,8 @@ struct PostRtEvents { | |||
PostRtEvents() | |||
: dataPool(MIN_RT_EVENTS, MAX_RT_EVENTS), | |||
data(dataPool), | |||
dataPendingRT(dataPool) {} | |||
data(dataPool, true), | |||
dataPendingRT(dataPool, true) {} | |||
~PostRtEvents() | |||
{ | |||
@@ -23,38 +23,41 @@ | |||
// ----------------------------------------------------------------------- | |||
const char* find_dssi_ui(const char* const filename, const char* const label) | |||
const char* find_dssi_ui(const char* const filename, const char* const label) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', nullptr); | |||
CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0', nullptr); | |||
carla_debug("find_dssi_ui(\"%s\", \"%s\")", filename, label); | |||
QString guiFilename; | |||
QString pluginDir(filename); | |||
pluginDir.resize(pluginDir.lastIndexOf(".")); | |||
try { | |||
QString guiFilename; | |||
QString pluginDir(filename); | |||
pluginDir.resize(pluginDir.lastIndexOf(".")); | |||
QString checkLabel(label); | |||
QString checkSName(QFileInfo(pluginDir).baseName()); | |||
QString checkLabel(label); | |||
QString checkSName(QFileInfo(pluginDir).baseName()); | |||
if (! checkLabel.endsWith("_")) checkLabel += "_"; | |||
if (! checkSName.endsWith("_")) checkSName += "_"; | |||
if (! checkLabel.endsWith("_")) checkLabel += "_"; | |||
if (! checkSName.endsWith("_")) checkSName += "_"; | |||
QStringList guiFiles(QDir(pluginDir).entryList()); | |||
QStringList guiFiles(QDir(pluginDir).entryList()); | |||
foreach (const QString& gui, guiFiles) | |||
{ | |||
if (gui.startsWith(checkLabel) || gui.startsWith(checkSName)) | |||
foreach (const QString& gui, guiFiles) | |||
{ | |||
QFileInfo finalname(pluginDir + QDir::separator() + gui); | |||
guiFilename = finalname.absoluteFilePath(); | |||
break; | |||
if (gui.startsWith(checkLabel) || gui.startsWith(checkSName)) | |||
{ | |||
QFileInfo finalname(pluginDir + QDir::separator() + gui); | |||
guiFilename = finalname.absoluteFilePath(); | |||
break; | |||
} | |||
} | |||
} | |||
if (guiFilename.isEmpty()) | |||
return nullptr; | |||
if (guiFilename.isEmpty()) | |||
return nullptr; | |||
return carla_strdup(guiFilename.toUtf8().constData()); | |||
return carla_strdup(guiFilename.toUtf8().constData()); | |||
} CARLA_SAFE_EXCEPTION_RETURN("find_dssi_ui", nullptr); | |||
} | |||
// ----------------------------------------------------------------------- |
@@ -24,7 +24,7 @@ | |||
// ----------------------------------------------------------------------- | |||
// Find UI binary for a plugin (returned value must be deleted) | |||
const char* find_dssi_ui(const char* const filename, const char* const label); | |||
const char* find_dssi_ui(const char* const filename, const char* const label) noexcept; | |||
// ----------------------------------------------------------------------- | |||
@@ -49,7 +49,7 @@ const LADSPA_RDF_Descriptor* ladspa_rdf_dup(const LADSPA_RDF_Descriptor* const o | |||
{ | |||
newDescriptor->Ports = new LADSPA_RDF_Port[newDescriptor->PortCount]; | |||
for (unsigned long i=0; i < newDescriptor->PortCount; ++i) | |||
for (ulong i=0; i < newDescriptor->PortCount; ++i) | |||
{ | |||
LADSPA_RDF_Port* const oldPort(&oldDescriptor->Ports[i]); | |||
LADSPA_RDF_Port* const newPort(&newDescriptor->Ports[i]); | |||
@@ -67,7 +67,7 @@ const LADSPA_RDF_Descriptor* ladspa_rdf_dup(const LADSPA_RDF_Descriptor* const o | |||
{ | |||
newPort->ScalePoints = new LADSPA_RDF_ScalePoint[oldPort->ScalePointCount]; | |||
for (unsigned long j=0; j < oldPort->ScalePointCount; ++j) | |||
for (ulong j=0; j < oldPort->ScalePointCount; ++j) | |||
{ | |||
LADSPA_RDF_ScalePoint* const oldScalePoint(&oldPort->ScalePoints[j]); | |||
LADSPA_RDF_ScalePoint* const newScalePoint(&newPort->ScalePoints[j]); | |||
@@ -124,7 +124,7 @@ bool is_ladspa_rdf_descriptor_valid(const LADSPA_RDF_Descriptor* const rdfDescri | |||
return false; | |||
} | |||
for (unsigned long i=0; i < rdfDescriptor->PortCount; ++i) | |||
for (ulong i=0; i < rdfDescriptor->PortCount; ++i) | |||
{ | |||
if (! is_ladspa_port_good(rdfDescriptor->Ports[i].Type, descriptor->PortDescriptors[i])) | |||
{ | |||
@@ -169,7 +169,7 @@ LADSPA_Data get_default_ladspa_port_value(const LADSPA_PortRangeHintDescriptor h | |||
{ | |||
try { | |||
return std::exp((std::log(min)*0.75f) + (std::log(max)*0.25f)); | |||
} catch(...) {} | |||
} CARLA_SAFE_EXCEPTION("exp(log)"); | |||
} | |||
return (min*0.75f) + (max*0.25f); | |||
@@ -178,7 +178,7 @@ LADSPA_Data get_default_ladspa_port_value(const LADSPA_PortRangeHintDescriptor h | |||
{ | |||
try { | |||
return std::sqrt(min*max); | |||
} catch(...) {} | |||
} CARLA_SAFE_EXCEPTION("sqrt"); | |||
} | |||
return (min+max)/2; | |||
@@ -187,7 +187,7 @@ LADSPA_Data get_default_ladspa_port_value(const LADSPA_PortRangeHintDescriptor h | |||
{ | |||
try { | |||
return std::exp((std::log(min)*0.25f) + (std::log(max)*0.75f)); | |||
} catch(...) {} | |||
} CARLA_SAFE_EXCEPTION("exp(log)"); | |||
} | |||
return (min*0.25f) + (max*0.75f); | |||
} | |||
@@ -25,7 +25,7 @@ | |||
#define try_lo_send(...) \ | |||
try { \ | |||
lo_send(__VA_ARGS__); \ | |||
} catch(...) {} | |||
} CARLA_SAFE_EXCEPTION("lo_send"); | |||
// ----------------------------------------------------------------------- | |||
@@ -57,9 +57,10 @@ protected: | |||
k_list_head siblings; | |||
}; | |||
AbstractLinkedList() noexcept | |||
AbstractLinkedList(const bool needsCopyCtr) noexcept | |||
: fDataSize(sizeof(Data)), | |||
fCount(0) | |||
fCount(0), | |||
fNeedsCopyCtr(needsCopyCtr) | |||
{ | |||
_init(); | |||
} | |||
@@ -146,86 +147,22 @@ public: | |||
bool append(const T& value) noexcept | |||
{ | |||
if (Data* const data = _allocate()) | |||
{ | |||
try { | |||
new(data)Data(); | |||
} | |||
catch(...) { | |||
_deallocate(data); | |||
return false; | |||
} | |||
data->value = value; | |||
list_add_tail(&data->siblings, &fQueue); | |||
++fCount; | |||
return true; | |||
} | |||
return false; | |||
return _add(value, true, &fQueue); | |||
} | |||
bool appendAt(const T& value, const Itenerator& it) noexcept | |||
{ | |||
if (Data* const data = _allocate()) | |||
{ | |||
try { | |||
new(data)Data(); | |||
} | |||
catch(...) { | |||
_deallocate(data); | |||
return false; | |||
} | |||
data->value = value; | |||
list_add_tail(&data->siblings, it.fEntry->next); | |||
++fCount; | |||
return true; | |||
} | |||
return false; | |||
return _add(value, true, it.fEntry->next); | |||
} | |||
bool insert(const T& value) noexcept | |||
{ | |||
if (Data* const data = _allocate()) | |||
{ | |||
try { | |||
new(data)Data(); | |||
} | |||
catch(...) { | |||
_deallocate(data); | |||
return false; | |||
} | |||
data->value = value; | |||
list_add(&data->siblings, &fQueue); | |||
++fCount; | |||
return true; | |||
} | |||
return false; | |||
return _add(value, false, &fQueue); | |||
} | |||
bool insertAt(const T& value, const Itenerator& it) noexcept | |||
{ | |||
if (Data* const data = _allocate()) | |||
{ | |||
try { | |||
new(data)Data(); | |||
} | |||
catch(...) { | |||
_deallocate(data); | |||
return false; | |||
} | |||
data->value = value; | |||
list_add(&data->siblings, it.fEntry->prev); | |||
++fCount; | |||
return true; | |||
} | |||
return false; | |||
return _add(value, false, it.fEntry->prev); | |||
} | |||
T& getAt(const size_t index) const noexcept | |||
@@ -399,6 +336,8 @@ protected: | |||
size_t fCount; | |||
k_list_head fQueue; | |||
const bool fNeedsCopyCtr; | |||
virtual Data* _allocate() noexcept = 0; | |||
virtual void _deallocate(Data* const dataPtr) noexcept = 0; | |||
@@ -411,6 +350,46 @@ private: | |||
INIT_LIST_HEAD(&fQueue); | |||
} | |||
bool _add(const T& value, const bool inTail, k_list_head* const queue) noexcept | |||
{ | |||
if (Data* const data = _allocate()) | |||
{ | |||
if (fNeedsCopyCtr) | |||
{ | |||
try { | |||
new(data)Data(); | |||
} | |||
catch(...) { | |||
_deallocate(data); | |||
return false; | |||
} | |||
try { | |||
data->value = value; | |||
} | |||
catch(...) { | |||
data->~Data(); | |||
_deallocate(data); | |||
return false; | |||
} | |||
} | |||
else | |||
{ | |||
std::memcpy(&data->value, &value, fDataSize); | |||
} | |||
if (inTail) | |||
list_add_tail(&data->siblings, queue); | |||
else | |||
list_add(&data->siblings, queue); | |||
++fCount; | |||
return true; | |||
} | |||
return false; | |||
} | |||
T& _getFirstOrLast(const bool first, const bool removeObj) noexcept | |||
{ | |||
if (fCount == 0) | |||
@@ -447,7 +426,8 @@ template<typename T> | |||
class LinkedList : public AbstractLinkedList<T> | |||
{ | |||
public: | |||
LinkedList() noexcept {} | |||
LinkedList(const bool needsCopyCtr = false) noexcept | |||
: AbstractLinkedList<T>(needsCopyCtr) {} | |||
private: | |||
typename AbstractLinkedList<T>::Data* _allocate() noexcept override | |||
@@ -98,51 +98,18 @@ public: | |||
// ------------------------------------------------------------------- | |||
// Now the actual rt-linkedlist code | |||
RtLinkedList(Pool& memPool) noexcept | |||
: fMemPool(memPool) {} | |||
RtLinkedList(Pool& memPool, const bool needsCopyCtr = false) noexcept | |||
: AbstractLinkedList<T>(needsCopyCtr), | |||
fMemPool(memPool) {} | |||
bool append_sleepy(const T& value) noexcept | |||
{ | |||
if (typename AbstractLinkedList<T>::Data* const data = _allocate_sleepy()) | |||
{ | |||
try { | |||
new(data)typename AbstractLinkedList<T>::Data(); | |||
} | |||
catch(...) { | |||
_deallocate(data); | |||
return false; | |||
} | |||
data->value = value; | |||
list_add_tail(&data->siblings, &this->fQueue); | |||
++(this->fCount); | |||
return true; | |||
} | |||
return false; | |||
return _add_sleepy(value, true); | |||
} | |||
bool insert_sleepy(const T& value) noexcept | |||
{ | |||
if (typename AbstractLinkedList<T>::Data* const data = _allocate_sleepy()) | |||
{ | |||
try { | |||
new(data)typename AbstractLinkedList<T>::Data(); | |||
} | |||
catch(...) { | |||
_deallocate(data); | |||
return false; | |||
} | |||
data->value = value; | |||
list_add(&data->siblings, &this->fQueue); | |||
++(this->fCount); | |||
return true; | |||
} | |||
return false; | |||
return _add_sleepy(value, false); | |||
} | |||
void resize(const size_t minPreallocated, const size_t maxPreallocated) noexcept | |||
@@ -186,6 +153,46 @@ private: | |||
fMemPool.deallocate(dataPtr); | |||
} | |||
bool _add_sleepy(const T& value, const bool inTail) noexcept | |||
{ | |||
if (typename AbstractLinkedList<T>::Data* const data = _allocate_sleepy()) | |||
{ | |||
if (this->fNeedsCopyCtr) | |||
{ | |||
try { | |||
new(data)typename AbstractLinkedList<T>::Data(); | |||
} | |||
catch(...) { | |||
_deallocate(data); | |||
return false; | |||
} | |||
try { | |||
data->value = value; | |||
} | |||
catch(...) { | |||
data->~Data(); | |||
_deallocate(data); | |||
return false; | |||
} | |||
} | |||
else | |||
{ | |||
std::memcpy(&data->value, &value, this->fDataSize); | |||
} | |||
if (inTail) | |||
list_add_tail(&data->siblings, &this->fQueue); | |||
else | |||
list_add(&data->siblings, &this->fQueue); | |||
++(this->fCount); | |||
return true; | |||
} | |||
return false; | |||
} | |||
LINKED_LIST_DECLARATIONS(RtLinkedList) | |||
}; | |||