| @@ -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 | ||||
| } | } | ||||