@@ -83,7 +83,7 @@ const T& carla_fixValue(const T& min, const T& max, const T& value) noexcept | |||||
* Get next power of 2. | * Get next power of 2. | ||||
*/ | */ | ||||
static inline | static inline | ||||
uint32_t carla_nextPowerOf2(uint32_t size) | |||||
uint32_t carla_nextPowerOf2(uint32_t size) noexcept | |||||
{ | { | ||||
// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 | // http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 | ||||
--size; | --size; | ||||
@@ -128,8 +128,10 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); | ||||
#ifdef CARLA_OS_WIN | #ifdef CARLA_OS_WIN | ||||
::VirtualLock(fBuffer, sizeof(BufferStruct)); | |||||
::VirtualLock(fBuffer->buf, fBuffer->size); | |||||
try { | |||||
::VirtualLock(fBuffer, sizeof(BufferStruct)); | |||||
::VirtualLock(fBuffer->buf, fBuffer->size); | |||||
} CARLA_SAFE_EXCEPTION("RingBufferControl::lockMemory"); | |||||
#else | #else | ||||
::mlock(fBuffer, sizeof(BufferStruct)); | ::mlock(fBuffer, sizeof(BufferStruct)); | ||||
::mlock(fBuffer->buf, fBuffer->size); | ::mlock(fBuffer->buf, fBuffer->size); | ||||
@@ -290,15 +292,17 @@ protected: | |||||
private: | private: | ||||
BufferStruct* fBuffer; | BufferStruct* fBuffer; | ||||
static void memoryBarrier() | |||||
static void memoryBarrier() noexcept | |||||
{ | { | ||||
try { | |||||
#if defined(CARLA_OS_MAC) | #if defined(CARLA_OS_MAC) | ||||
::OSMemoryBarrier(); | |||||
::OSMemoryBarrier(); | |||||
#elif defined(CARLA_OS_WIN) | #elif defined(CARLA_OS_WIN) | ||||
::MemoryBarrier(); | |||||
::MemoryBarrier(); | |||||
#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 401 | #elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 401 | ||||
::__sync_synchronize(); | |||||
::__sync_synchronize(); | |||||
#endif | #endif | ||||
} CARLA_SAFE_EXCEPTION("RingBufferControl::memoryBarrier"); | |||||
} | } | ||||
CARLA_PREVENT_HEAP_ALLOCATION | CARLA_PREVENT_HEAP_ALLOCATION | ||||
@@ -160,7 +160,7 @@ public: | |||||
try { | try { | ||||
pthread_cancel(threadId); | pthread_cancel(threadId); | ||||
} catch(...) {} | |||||
} CARLA_SAFE_EXCEPTION("pthread_cancel"); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -147,7 +147,7 @@ bool vstPluginCanDo(AEffect* const effect, const char* const feature) noexcept | |||||
try { | try { | ||||
ret = (effect->dispatcher(effect, effCanDo, 0, 0, const_cast<char*>(feature), 0.0f) == 1); | ret = (effect->dispatcher(effect, effCanDo, 0, 0, const_cast<char*>(feature), 0.0f) == 1); | ||||
} catch(...) {} | |||||
} CARLA_SAFE_EXCEPTION("vstPluginCanDo"); | |||||
return ret; | return ret; | ||||
} | } | ||||
@@ -63,8 +63,13 @@ public: | |||||
// shouldn't really happen please... | // shouldn't really happen please... | ||||
CARLA_SAFE_ASSERT_RETURN(size > 0,); | CARLA_SAFE_ASSERT_RETURN(size > 0,); | ||||
fLv2Buffer.size = carla_nextPowerOf2(size); | |||||
fLv2Buffer.buf = new char[fLv2Buffer.size]; | |||||
const uint32_t p2size(carla_nextPowerOf2(size)); | |||||
try { | |||||
fLv2Buffer.buf = new char[p2size]; | |||||
} CARLA_SAFE_EXCEPTION_RETURN("Lv2AtomRingBufferControl::createBuffer",); | |||||
fLv2Buffer.size = p2size; | |||||
setRingBuffer(&fLv2Buffer, true); | setRingBuffer(&fLv2Buffer, true); | ||||
lockMemory(); | lockMemory(); | ||||
} | } | ||||
@@ -251,6 +256,7 @@ public: | |||||
queue.fRingBufferCtrl.clear(); | queue.fRingBufferCtrl.clear(); | ||||
} | } | ||||
// used for tmp buffers only | |||||
void copyAndDumpDataFromQueue(Lv2AtomQueue& queue, char dumpBuf[]) noexcept | void copyAndDumpDataFromQueue(Lv2AtomQueue& queue, char dumpBuf[]) noexcept | ||||
{ | { | ||||
// lock source | // lock source | ||||