| @@ -620,7 +620,7 @@ enum ProcessMode { | |||||
| */ | */ | ||||
| enum TransportMode { | enum TransportMode { | ||||
| TRANSPORT_MODE_INTERNAL = 0, //!< Internal transport mode. | TRANSPORT_MODE_INTERNAL = 0, //!< Internal transport mode. | ||||
| TRANSPORT_MODE_JACK = 1, //!< JACK transport, only available if driver name is "JACK" | |||||
| TRANSPORT_MODE_JACK = 1 //!< JACK transport, only available if driver name is "JACK" | |||||
| }; | }; | ||||
| /*! | /*! | ||||
| @@ -107,7 +107,7 @@ INCLUDEPATH = .. \ | |||||
| # ----------------------------------------------------------- | # ----------------------------------------------------------- | ||||
| DEFINES = QTCREATOR_TEST | |||||
| DEFINES = QTCREATOR_TEST HAVE_CPP11_SUPPORT | |||||
| DEFINES += DEBUG | DEFINES += DEBUG | ||||
| #DEFINES += VESTIGE_HEADER | #DEFINES += VESTIGE_HEADER | ||||
| DEFINES += BUILD_BRIDGE BUILD_BRIDGE_PLUGIN BRIDGE_PLUGIN | DEFINES += BUILD_BRIDGE BUILD_BRIDGE_PLUGIN BRIDGE_PLUGIN | ||||
| @@ -316,6 +316,7 @@ PROCESS_MODE_SINGLE_CLIENT = 0 | |||||
| PROCESS_MODE_MULTIPLE_CLIENTS = 1 | PROCESS_MODE_MULTIPLE_CLIENTS = 1 | ||||
| PROCESS_MODE_CONTINUOUS_RACK = 2 | PROCESS_MODE_CONTINUOUS_RACK = 2 | ||||
| PROCESS_MODE_PATCHBAY = 3 | PROCESS_MODE_PATCHBAY = 3 | ||||
| PROCESS_MODE_BRIDGE = 4 | |||||
| # Transport Mode | # Transport Mode | ||||
| TRANSPORT_MODE_INTERNAL = 0 | TRANSPORT_MODE_INTERNAL = 0 | ||||
| @@ -23,7 +23,7 @@ | |||||
| # define CARLA_OS_MAC | # define CARLA_OS_MAC | ||||
| #elif defined(__HAIKU__) | #elif defined(__HAIKU__) | ||||
| # define CARLA_OS_HAIKU | # define CARLA_OS_HAIKU | ||||
| #elif defined(__linux__) || defined(__linux) || defined(QTCREATOR_TEST) | |||||
| #elif defined(__linux__) || defined(__linux) | |||||
| # define CARLA_OS_LINUX | # define CARLA_OS_LINUX | ||||
| #elif defined(WIN64) || defined(_WIN64) || defined(__WIN64__) | #elif defined(WIN64) || defined(_WIN64) || defined(__WIN64__) | ||||
| # define CARLA_OS_WIN64 | # define CARLA_OS_WIN64 | ||||
| @@ -40,7 +40,7 @@ | |||||
| #endif | #endif | ||||
| // Check for C++11 support | // Check for C++11 support | ||||
| #if defined(HAVE_CPP11_SUPPORT) || defined(QTCREATOR_TEST) | |||||
| #if defined(HAVE_CPP11_SUPPORT) | |||||
| # define CARLA_PROPER_CPP11_SUPPORT | # define CARLA_PROPER_CPP11_SUPPORT | ||||
| #elif defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) | #elif defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) | ||||
| # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 | # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 | ||||
| @@ -25,7 +25,9 @@ | |||||
| #define __LINUX_LIST_H__ | #define __LINUX_LIST_H__ | ||||
| /* This file is from Linux Kernel (include/linux/list.h) | /* This file is from Linux Kernel (include/linux/list.h) | ||||
| * and modified by simply removing hardware prefetching of list items. | |||||
| * and modified by removing hardware prefetching of list items | |||||
| * and added list_split_tail* functions. | |||||
| * | |||||
| * Here by copyright, credits attributed to wherever they belong. | * Here by copyright, credits attributed to wherever they belong. | ||||
| * Filipe Coelho (aka falkTX <falktx@falktx.com>) | * Filipe Coelho (aka falkTX <falktx@falktx.com>) | ||||
| */ | */ | ||||
| @@ -224,6 +226,19 @@ static inline void __list_splice(struct list_head *list, struct list_head *head) | |||||
| at->prev = last; | at->prev = last; | ||||
| } | } | ||||
| static inline void __list_splice_tail(struct list_head *list, struct list_head *head) | |||||
| { | |||||
| struct list_head *first = list->next; | |||||
| struct list_head *last = list->prev; | |||||
| struct list_head *at = head->prev; | |||||
| first->prev = at; | |||||
| at->next = first; | |||||
| last->next = head; | |||||
| head->prev = last; | |||||
| } | |||||
| /** | /** | ||||
| * list_splice - join two lists | * list_splice - join two lists | ||||
| * @list: the new list to add. | * @list: the new list to add. | ||||
| @@ -235,6 +250,19 @@ static inline void list_splice(struct list_head *list, struct list_head *head) | |||||
| __list_splice(list, head); | __list_splice(list, head); | ||||
| } | } | ||||
| /** | |||||
| * list_splice_tail - join two lists | |||||
| * @list: the new list to add. | |||||
| * @head: the place to add it in the first list. | |||||
| * | |||||
| * @list goes to the end (at head->prev) | |||||
| */ | |||||
| static inline void list_splice_tail(struct list_head *list, struct list_head *head) | |||||
| { | |||||
| if (!list_empty(list)) | |||||
| __list_splice_tail(list, head); | |||||
| } | |||||
| /** | /** | ||||
| * list_splice_init - join two lists and reinitialise the emptied list. | * list_splice_init - join two lists and reinitialise the emptied list. | ||||
| * @list: the new list to add. | * @list: the new list to add. | ||||
| @@ -250,6 +278,22 @@ static inline void list_splice_init(struct list_head *list, struct list_head *he | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * list_splice_init - join two lists and reinitialise the emptied list. | |||||
| * @list: the new list to add. | |||||
| * @head: the place to add it in the first list. | |||||
| * | |||||
| * The list at @list is reinitialised | |||||
| * @list goes to the end (at head->prev) | |||||
| */ | |||||
| static inline void list_splice_tail_init(struct list_head *list, struct list_head *head) | |||||
| { | |||||
| if (!list_empty(list)) { | |||||
| __list_splice_tail(list, head); | |||||
| INIT_LIST_HEAD(list); | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * list_entry - get the struct for this entry | * list_entry - get the struct for this entry | ||||
| * @ptr: the &struct list_head pointer. | * @ptr: the &struct list_head pointer. | ||||
| @@ -17,7 +17,7 @@ | |||||
| // still need qt classes check | // still need qt classes check | ||||
| //#include "CarlaPlugin.hpp" | //#include "CarlaPlugin.hpp" | ||||
| #include "plugin/DssiPlugin.cpp" | |||||
| //#include "plugin/DssiPlugin.cpp" | |||||
| #if 0 | #if 0 | ||||
| #include "CarlaDefines.hpp" | #include "CarlaDefines.hpp" | ||||
| @@ -71,7 +71,7 @@ struct PostRtEvents { | |||||
| { | { | ||||
| if (mutex.tryLock()) | if (mutex.tryLock()) | ||||
| { | { | ||||
| dataPendingRT.splice(data, true); | |||||
| dataPendingRT.spliceAppend(data, true); | |||||
| mutex.unlock(); | mutex.unlock(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -145,6 +145,13 @@ int main() | |||||
| assert(postRtEvents.data.count() == 4); | assert(postRtEvents.data.count() == 4); | ||||
| assert(postRtEvents.dataPendingRT.count() == 0); | assert(postRtEvents.dataPendingRT.count() == 0); | ||||
| for (auto it = postRtEvents.data.begin(); it.valid(); it.next()) | |||||
| { | |||||
| MyData& my = *it; | |||||
| printf("FOR DATA!!!: %i %s\n", my.idStr, (const char*)my.str); | |||||
| } | |||||
| run4Tests(); | run4Tests(); | ||||
| // reset | // reset | ||||
| @@ -26,9 +26,9 @@ extern "C" { | |||||
| } | } | ||||
| // Declare non copyable and prevent heap allocation | // Declare non copyable and prevent heap allocation | ||||
| #define LIST_DECLARATIONS(className) \ | |||||
| className(const className&); \ | |||||
| className& operator= (const className&); \ | |||||
| #define LIST_DECLARATIONS(className) \ | |||||
| className(const className&); \ | |||||
| className& operator= (const className&); \ | |||||
| static void* operator new (size_t) { return nullptr; } \ | static void* operator new (size_t) { return nullptr; } \ | ||||
| static void operator delete (void*) {} | static void operator delete (void*) {} | ||||
| @@ -42,6 +42,46 @@ template<typename T> | |||||
| class List | class List | ||||
| { | { | ||||
| protected: | protected: | ||||
| struct Data { | |||||
| T value; | |||||
| k_list_head siblings; | |||||
| }; | |||||
| class Itenerator { | |||||
| public: | |||||
| Itenerator(k_list_head* queue) | |||||
| : kQueue(queue), | |||||
| fEntry(queue->next), | |||||
| fData(nullptr) | |||||
| { | |||||
| CARLA_ASSERT(kQueue != nullptr); | |||||
| CARLA_ASSERT(fEntry != nullptr); | |||||
| } | |||||
| bool valid() | |||||
| { | |||||
| prefetch(fEntry->next); | |||||
| return (fEntry != kQueue); | |||||
| } | |||||
| void next() | |||||
| { | |||||
| fEntry = fEntry->next; | |||||
| } | |||||
| T& operator*() | |||||
| { | |||||
| fData = list_entry(fEntry, Data, siblings); | |||||
| CARLA_ASSERT(fData != nullptr); | |||||
| return fData->value; | |||||
| } | |||||
| private: | |||||
| k_list_head* const kQueue; | |||||
| k_list_head* fEntry; | |||||
| Data* fData; | |||||
| }; | |||||
| List() | List() | ||||
| : kDataSize(sizeof(Data)), | : kDataSize(sizeof(Data)), | ||||
| fCount(0) | fCount(0) | ||||
| @@ -55,6 +95,11 @@ public: | |||||
| CARLA_ASSERT(fCount == 0); | CARLA_ASSERT(fCount == 0); | ||||
| } | } | ||||
| Itenerator begin() | |||||
| { | |||||
| return Itenerator(&fQueue); | |||||
| } | |||||
| void clear() | void clear() | ||||
| { | { | ||||
| if (fCount != 0) | if (fCount != 0) | ||||
| @@ -110,7 +155,7 @@ public: | |||||
| T& getAt(const size_t index, const bool remove = false) | T& getAt(const size_t index, const bool remove = false) | ||||
| { | { | ||||
| if (fCount == 0 || index >= fCount) | if (fCount == 0 || index >= fCount) | ||||
| return _retEmpty(); | |||||
| return _getEmpty(); | |||||
| size_t i = 0; | size_t i = 0; | ||||
| Data* data = nullptr; | Data* data = nullptr; | ||||
| @@ -137,7 +182,7 @@ public: | |||||
| CARLA_ASSERT(data != nullptr); | CARLA_ASSERT(data != nullptr); | ||||
| return (data != nullptr) ? data->value : _retEmpty(); | |||||
| return (data != nullptr) ? data->value : _getEmpty(); | |||||
| } | } | ||||
| T& getFirst(const bool remove = false) | T& getFirst(const bool remove = false) | ||||
| @@ -194,7 +239,22 @@ public: | |||||
| } | } | ||||
| } | } | ||||
| virtual void splice(List& list, const bool init = false) | |||||
| virtual void spliceAppend(List& list, const bool init = false) | |||||
| { | |||||
| if (init) | |||||
| { | |||||
| list_splice_tail_init(&fQueue, &list.fQueue); | |||||
| list.fCount += fCount; | |||||
| fCount = 0; | |||||
| } | |||||
| else | |||||
| { | |||||
| list_splice_tail(&fQueue, &list.fQueue); | |||||
| list.fCount += fCount; | |||||
| } | |||||
| } | |||||
| virtual void spliceInsert(List& list, const bool init = false) | |||||
| { | { | ||||
| if (init) | if (init) | ||||
| { | { | ||||
| @@ -214,11 +274,6 @@ protected: | |||||
| size_t fCount; | size_t fCount; | ||||
| k_list_head fQueue; | k_list_head fQueue; | ||||
| struct Data { | |||||
| T value; | |||||
| k_list_head siblings; | |||||
| }; | |||||
| virtual Data* _allocate() = 0; | virtual Data* _allocate() = 0; | ||||
| virtual void _deallocate(Data* const dataPtr) = 0; | virtual void _deallocate(Data* const dataPtr) = 0; | ||||
| @@ -232,7 +287,7 @@ private: | |||||
| T& _getFirstOrLast(const bool first, const bool remove) | T& _getFirstOrLast(const bool first, const bool remove) | ||||
| { | { | ||||
| if (fCount == 0) | if (fCount == 0) | ||||
| return _retEmpty(); | |||||
| return _getEmpty(); | |||||
| k_list_head* const entry = first ? fQueue.next : fQueue.prev; | k_list_head* const entry = first ? fQueue.next : fQueue.prev; | ||||
| Data* const data = list_entry(entry, Data, siblings); | Data* const data = list_entry(entry, Data, siblings); | ||||
| @@ -240,7 +295,7 @@ private: | |||||
| CARLA_ASSERT(data != nullptr); | CARLA_ASSERT(data != nullptr); | ||||
| if (data == nullptr) | if (data == nullptr) | ||||
| return _retEmpty(); | |||||
| return _getEmpty(); | |||||
| T& ret = data->value; | T& ret = data->value; | ||||
| @@ -254,7 +309,7 @@ private: | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| T& _retEmpty() | |||||
| T& _getEmpty() | |||||
| { | { | ||||
| // FIXME ? | // FIXME ? | ||||
| static T value; | static T value; | ||||
| @@ -371,11 +426,18 @@ public: | |||||
| kMemPool->resize(minPreallocated, maxPreallocated); | kMemPool->resize(minPreallocated, maxPreallocated); | ||||
| } | } | ||||
| void splice(RtList& list, const bool init = false) | |||||
| void spliceAppend(RtList& list, const bool init = false) | |||||
| { | |||||
| CARLA_ASSERT(kMemPool == list.kMemPool); | |||||
| List<T>::spliceAppend(list, init); | |||||
| } | |||||
| void spliceInsert(RtList& list, const bool init = false) | |||||
| { | { | ||||
| CARLA_ASSERT(kMemPool == list.kMemPool); | CARLA_ASSERT(kMemPool == list.kMemPool); | ||||
| List<T>::splice(list, init); | |||||
| List<T>::spliceInsert(list, init); | |||||
| } | } | ||||
| private: | private: | ||||