@@ -1067,7 +1067,10 @@ float CarlaEngine::getOutputPeak(const uint pluginId, const bool isLeft) const n | |||||
void CarlaEngine::callback(const EngineCallbackOpcode action, const uint pluginId, const int value1, const int value2, const float value3, const char* const valueStr) noexcept | void CarlaEngine::callback(const EngineCallbackOpcode action, const uint pluginId, const int value1, const int value2, const float value3, const char* const valueStr) noexcept | ||||
{ | { | ||||
carla_debug("CarlaEngine::callback(%i:%s, %i, %i, %i, %f, \"%s\")", action, EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr); | |||||
#ifdef DEBUG | |||||
if (action != ENGINE_CALLBACK_IDLE) | |||||
carla_debug("CarlaEngine::callback(%i:%s, %i, %i, %i, %f, \"%s\")", action, EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr); | |||||
#endif | |||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
if (pData->isIdling) | if (pData->isIdling) | ||||
@@ -138,6 +138,7 @@ struct BridgeRtControl : public CarlaRingBuffer<StackBuffer> { | |||||
if (jackbridge_shm_map2<BridgeRtData>(shm, data)) | if (jackbridge_shm_map2<BridgeRtData>(shm, data)) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT(data->midiOut[0] == 0); | |||||
setRingBuffer(&data->ringBuffer, false); | setRingBuffer(&data->ringBuffer, false); | ||||
return true; | return true; | ||||
} | } | ||||
@@ -204,6 +204,9 @@ struct BridgeRtControl : public CarlaRingBuffer<StackBuffer> { | |||||
if (carla_shm_map<BridgeRtData>(shm, data)) | if (carla_shm_map<BridgeRtData>(shm, data)) | ||||
{ | { | ||||
carla_zeroStruct(data->sem); | |||||
carla_zeroStruct(data->timeInfo); | |||||
carla_zeroBytes(data->midiOut, kBridgeRtDataMidiOutSize); | |||||
setRingBuffer(&data->ringBuffer, true); | setRingBuffer(&data->ringBuffer, true); | ||||
return true; | return true; | ||||
} | } | ||||
@@ -31,8 +31,9 @@ bool jackbridge_sem_init(void* sem) noexcept | |||||
return false; | return false; | ||||
#else | #else | ||||
sem_t* const sema(carla_sem_create()); | sem_t* const sema(carla_sem_create()); | ||||
std::memcpy(sem, &sema, sizeof(sem_t*)); | |||||
//std::memcpy(sem, sema, sizeof(sem_t*)); | |||||
CARLA_SAFE_ASSERT_RETURN(sema != nullptr, false); | |||||
std::memcpy(sem, sema, sizeof(sem_t)); | |||||
return (sema != nullptr); | return (sema != nullptr); | ||||
#endif | #endif | ||||
} | } | ||||
@@ -102,6 +102,8 @@ enum PluginBridgeNonRtOpcode { | |||||
const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host configure, tells host GUI is now hidden | const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host configure, tells host GUI is now hidden | ||||
const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host configure, tells host state is saved | const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host configure, tells host state is saved | ||||
static const std::size_t kBridgeRtDataMidiOutSize = 512*4; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
struct BridgeSemaphore { | struct BridgeSemaphore { | ||||
@@ -131,6 +133,7 @@ struct BridgeRtData { | |||||
BridgeSemaphore sem; | BridgeSemaphore sem; | ||||
BridgeTimeInfo timeInfo; | BridgeTimeInfo timeInfo; | ||||
StackBuffer ringBuffer; | StackBuffer ringBuffer; | ||||
uint8_t midiOut[kBridgeRtDataMidiOutSize]; | |||||
}; | }; | ||||
struct BridgeNonRtData { | struct BridgeNonRtData { | ||||
@@ -53,16 +53,20 @@ sem_t* carla_sem_create() noexcept | |||||
return ::sem_open(strBuf, O_CREAT, O_RDWR, 0); | return ::sem_open(strBuf, O_CREAT, O_RDWR, 0); | ||||
#else | #else | ||||
sem_t* const sem((sem_t*)std::malloc(sizeof(sem_t))); | |||||
CARLA_SAFE_ASSERT_RETURN(sem != nullptr, nullptr); | |||||
sem_t sem; | |||||
if (::sem_init(sem, 1, 0) != 0) | |||||
{ | |||||
std::free(sem); | |||||
if (::sem_init(&sem, 1, 0) != 0) | |||||
return nullptr; | return nullptr; | ||||
// can't return temporary variable, so allocate a new one | |||||
if (sem_t* const sem2 = (sem_t*)std::malloc(sizeof(sem_t))) | |||||
{ | |||||
std::memcpy(sem2, &sem, sizeof(sem_t)); | |||||
return sem2; | |||||
} | } | ||||
return sem; | |||||
::sem_destroy(&sem); | |||||
return nullptr; | |||||
#endif | #endif | ||||
} | } | ||||
@@ -77,8 +81,19 @@ void carla_sem_destroy(sem_t* const sem) noexcept | |||||
#if defined(CARLA_OS_MAC) | #if defined(CARLA_OS_MAC) | ||||
::sem_close(sem); | ::sem_close(sem); | ||||
#else | #else | ||||
::sem_destroy(sem); | |||||
std::free(sem); | |||||
// we can't call "sem_destroy(sem)" directly because it will free memory which we allocated during carla_sem_create() | |||||
// so we create a temp variable, free our memory, and finally pass the temp variable to sem_destroy() | |||||
// temp var | |||||
sem_t sem2; | |||||
std::memcpy(&sem2, sem, sizeof(sem_t)); | |||||
// free memory allocated in carla_sem_create() | |||||
// FIXME | |||||
//std::free(sem); | |||||
// destroy semaphore | |||||
::sem_destroy(&sem2); | |||||
#endif | #endif | ||||
} | } | ||||