| @@ -310,13 +310,13 @@ protected: | |||
| * Param \a isInputPort defines wherever this is an input port or not (output otherwise).\n | |||
| * Input/output and process mode are constant for the lifetime of the port. | |||
| */ | |||
| CarlaEnginePort(const CarlaEngine& engine, const bool isInputPort); | |||
| CarlaEnginePort(const CarlaEngine& engine, const bool isInputPort) noexcept; | |||
| public: | |||
| /*! | |||
| * The destructor. | |||
| */ | |||
| virtual ~CarlaEnginePort(); | |||
| virtual ~CarlaEnginePort() noexcept; | |||
| /*! | |||
| * Get the type of the port, as provided by the respective subclasses. | |||
| @@ -355,12 +355,12 @@ public: | |||
| * The constructor.\n | |||
| * All constructor parameters are constant and will never change in the lifetime of the port. | |||
| */ | |||
| CarlaEngineAudioPort(const CarlaEngine& engine, const bool isInputPort); | |||
| CarlaEngineAudioPort(const CarlaEngine& engine, const bool isInputPort) noexcept; | |||
| /*! | |||
| * The destructor. | |||
| */ | |||
| ~CarlaEngineAudioPort() override; | |||
| ~CarlaEngineAudioPort() noexcept override; | |||
| /*! | |||
| * Get the type of the port, in this case kEnginePortTypeAudio. | |||
| @@ -377,6 +377,7 @@ public: | |||
| /*! | |||
| * Direct access to the port's audio buffer. | |||
| * May return null. | |||
| */ | |||
| float* getBuffer() const noexcept | |||
| { | |||
| @@ -401,12 +402,12 @@ public: | |||
| * The constructor.\n | |||
| * All constructor parameters are constant and will never change in the lifetime of the port. | |||
| */ | |||
| CarlaEngineCVPort(const CarlaEngine& engine, const bool isInputPort); | |||
| CarlaEngineCVPort(const CarlaEngine& engine, const bool isInputPort) noexcept; | |||
| /*! | |||
| * The destructor. | |||
| */ | |||
| ~CarlaEngineCVPort() override; | |||
| ~CarlaEngineCVPort() noexcept override; | |||
| /*! | |||
| * Get the type of the port, in this case kEnginePortTypeCV. | |||
| @@ -422,12 +423,8 @@ public: | |||
| void initBuffer() noexcept override; | |||
| /*! | |||
| * Set a new buffer size. | |||
| */ | |||
| void setBufferSize(const uint32_t bufferSize); | |||
| /*! | |||
| * Direct access to the port's buffer. | |||
| * Direct access to the port's CV buffer. | |||
| * May return null. | |||
| */ | |||
| float* getBuffer() const noexcept | |||
| { | |||
| @@ -437,7 +434,6 @@ public: | |||
| #ifndef DOXYGEN | |||
| protected: | |||
| float* fBuffer; | |||
| const EngineProcessMode fProcessMode; | |||
| CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineCVPort) | |||
| #endif | |||
| @@ -453,12 +449,12 @@ public: | |||
| * The constructor.\n | |||
| * All constructor parameters are constant and will never change in the lifetime of the port. | |||
| */ | |||
| CarlaEngineEventPort(const CarlaEngine& engine, const bool isInputPort); | |||
| CarlaEngineEventPort(const CarlaEngine& engine, const bool isInputPort) noexcept; | |||
| /*! | |||
| * The destructor. | |||
| */ | |||
| ~CarlaEngineEventPort() override; | |||
| ~CarlaEngineEventPort() noexcept override; | |||
| /*! | |||
| * Get the type of the port, in this case kEnginePortTypeEvent. | |||
| @@ -588,7 +584,7 @@ public: | |||
| * Add a new port of type \a portType. | |||
| * \note This function does nothing in rack processing mode since ports are static there (2 audio + 1 event for both input and output). | |||
| */ | |||
| virtual CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput); | |||
| virtual CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) /*noexcept*/; | |||
| #ifndef DOXYGEN | |||
| protected: | |||
| @@ -972,6 +968,11 @@ public: | |||
| bool isOscControlRegistered() const noexcept; | |||
| #endif | |||
| /*! | |||
| * Idle OSC. | |||
| */ | |||
| void idleOsc() const noexcept; | |||
| /*! | |||
| * Get OSC TCP server path. | |||
| */ | |||
| @@ -56,14 +56,14 @@ static const EngineEvent kFallbackEngineEvent = { kEngineEventTypeNull, 0, 0, {{ | |||
| // ----------------------------------------------------------------------- | |||
| // Carla Engine port (Abstract) | |||
| CarlaEnginePort::CarlaEnginePort(const CarlaEngine& engine, const bool isInputPort) | |||
| CarlaEnginePort::CarlaEnginePort(const CarlaEngine& engine, const bool isInputPort) noexcept | |||
| : fEngine(engine), | |||
| fIsInput(isInputPort) | |||
| { | |||
| carla_debug("CarlaEnginePort::CarlaEnginePort(%s)", bool2str(isInputPort)); | |||
| } | |||
| CarlaEnginePort::~CarlaEnginePort() | |||
| CarlaEnginePort::~CarlaEnginePort() noexcept | |||
| { | |||
| carla_debug("CarlaEnginePort::~CarlaEnginePort()"); | |||
| } | |||
| @@ -71,14 +71,14 @@ CarlaEnginePort::~CarlaEnginePort() | |||
| // ----------------------------------------------------------------------- | |||
| // Carla Engine Audio port | |||
| CarlaEngineAudioPort::CarlaEngineAudioPort(const CarlaEngine& engine, const bool isInputPort) | |||
| CarlaEngineAudioPort::CarlaEngineAudioPort(const CarlaEngine& engine, const bool isInputPort) noexcept | |||
| : CarlaEnginePort(engine, isInputPort), | |||
| fBuffer(nullptr) | |||
| { | |||
| carla_debug("CarlaEngineAudioPort::CarlaEngineAudioPort(%s)", bool2str(isInputPort)); | |||
| } | |||
| CarlaEngineAudioPort::~CarlaEngineAudioPort() | |||
| CarlaEngineAudioPort::~CarlaEngineAudioPort() noexcept | |||
| { | |||
| carla_debug("CarlaEngineAudioPort::~CarlaEngineAudioPort()"); | |||
| } | |||
| @@ -90,51 +90,26 @@ void CarlaEngineAudioPort::initBuffer() noexcept | |||
| // ----------------------------------------------------------------------- | |||
| // Carla Engine CV port | |||
| CarlaEngineCVPort::CarlaEngineCVPort(const CarlaEngine& engine, const bool isInputPort) | |||
| CarlaEngineCVPort::CarlaEngineCVPort(const CarlaEngine& engine, const bool isInputPort) noexcept | |||
| : CarlaEnginePort(engine, isInputPort), | |||
| fBuffer(nullptr), | |||
| fProcessMode(engine.getProccessMode()) | |||
| fBuffer(nullptr) | |||
| { | |||
| carla_debug("CarlaEngineCVPort::CarlaEngineCVPort(%s)", bool2str(isInputPort)); | |||
| if (fProcessMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT && fProcessMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||
| fBuffer = new float[engine.getBufferSize()]; | |||
| } | |||
| CarlaEngineCVPort::~CarlaEngineCVPort() | |||
| CarlaEngineCVPort::~CarlaEngineCVPort() noexcept | |||
| { | |||
| carla_debug("CarlaEngineCVPort::~CarlaEngineCVPort()"); | |||
| if (fProcessMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT && fProcessMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); | |||
| delete[] fBuffer; | |||
| fBuffer = nullptr; | |||
| } | |||
| } | |||
| void CarlaEngineCVPort::initBuffer() noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(fProcessMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT && fProcessMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS,); | |||
| carla_zeroFloat(fBuffer, fEngine.getBufferSize()); | |||
| } | |||
| void CarlaEngineCVPort::setBufferSize(const uint32_t bufferSize) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(fProcessMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT && fProcessMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS,); | |||
| delete[] fBuffer; | |||
| fBuffer = new float[bufferSize]; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Carla Engine Event port | |||
| CarlaEngineEventPort::CarlaEngineEventPort(const CarlaEngine& engine, const bool isInputPort) | |||
| CarlaEngineEventPort::CarlaEngineEventPort(const CarlaEngine& engine, const bool isInputPort) noexcept | |||
| : CarlaEnginePort(engine, isInputPort), | |||
| fBuffer(nullptr), | |||
| fProcessMode(engine.getProccessMode()) | |||
| @@ -145,7 +120,7 @@ CarlaEngineEventPort::CarlaEngineEventPort(const CarlaEngine& engine, const bool | |||
| fBuffer = new EngineEvent[kMaxEngineEventInternalCount]; | |||
| } | |||
| CarlaEngineEventPort::~CarlaEngineEventPort() | |||
| CarlaEngineEventPort::~CarlaEngineEventPort() noexcept | |||
| { | |||
| carla_debug("CarlaEngineEventPort::~CarlaEngineEventPort()"); | |||
| @@ -302,13 +277,13 @@ CarlaEngineClient::CarlaEngineClient(const CarlaEngine& engine) | |||
| CarlaEngineClient::~CarlaEngineClient() | |||
| { | |||
| CARLA_ASSERT(! fActive); | |||
| CARLA_SAFE_ASSERT(! fActive); | |||
| carla_debug("CarlaEngineClient::~CarlaEngineClient()"); | |||
| } | |||
| void CarlaEngineClient::activate() noexcept | |||
| { | |||
| CARLA_ASSERT(! fActive); | |||
| CARLA_SAFE_ASSERT(! fActive); | |||
| carla_debug("CarlaEngineClient::activate()"); | |||
| fActive = true; | |||
| @@ -316,7 +291,7 @@ void CarlaEngineClient::activate() noexcept | |||
| void CarlaEngineClient::deactivate() noexcept | |||
| { | |||
| CARLA_ASSERT(fActive); | |||
| CARLA_SAFE_ASSERT(fActive); | |||
| carla_debug("CarlaEngineClient::deactivate()"); | |||
| fActive = false; | |||
| @@ -342,23 +317,33 @@ void CarlaEngineClient::setLatency(const uint32_t samples) noexcept | |||
| fLatency = samples; | |||
| } | |||
| CarlaEnginePort* CarlaEngineClient::addPort(const EnginePortType portType, const char* const name, const bool isInput) | |||
| CarlaEnginePort* CarlaEngineClient::addPort(const EnginePortType portType, const char* const name, const bool isInput) /*noexcept*/ | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr); | |||
| carla_debug("CarlaEngineClient::addPort(%i:%s, \"%s\", %s)", portType, EnginePortType2Str(portType), name, bool2str(isInput)); | |||
| switch (portType) | |||
| { | |||
| case kEnginePortTypeNull: | |||
| break; | |||
| case kEnginePortTypeAudio: | |||
| return new CarlaEngineAudioPort(fEngine, isInput); | |||
| case kEnginePortTypeCV: | |||
| return new CarlaEngineCVPort(fEngine, isInput); | |||
| case kEnginePortTypeEvent: | |||
| return new CarlaEngineEventPort(fEngine, isInput); | |||
| CarlaEnginePort* ret = nullptr; | |||
| try { | |||
| switch (portType) | |||
| { | |||
| case kEnginePortTypeNull: | |||
| break; | |||
| case kEnginePortTypeAudio: | |||
| ret = new CarlaEngineAudioPort(fEngine, isInput); | |||
| case kEnginePortTypeCV: | |||
| ret = new CarlaEngineCVPort(fEngine, isInput); | |||
| case kEnginePortTypeEvent: | |||
| ret = new CarlaEngineEventPort(fEngine, isInput); | |||
| } | |||
| } | |||
| catch(...) { | |||
| return nullptr; | |||
| } | |||
| if (ret != nullptr) | |||
| return ret; | |||
| carla_stderr("CarlaEngineClient::addPort(%i, \"%s\", %s) - invalid type", portType, name, bool2str(isInput)); | |||
| return nullptr; | |||
| } | |||
| @@ -569,7 +554,6 @@ bool CarlaEngine::init(const char* const clientName) | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->bufEvents.out == nullptr, "Invalid engine internal data (err #5)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(clientName != nullptr && clientName[0] != '\0', "Invalid client name"); | |||
| carla_debug("CarlaEngine::init(\"%s\")", clientName); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| pData->aboutToClose = false; | |||
| pData->curPluginCount = 0; | |||
| @@ -620,7 +604,7 @@ bool CarlaEngine::init(const char* const clientName) | |||
| #endif | |||
| pData->nextAction.ready(); | |||
| pData->thread.start(); | |||
| pData->thread.startThread(); | |||
| callback(ENGINE_CALLBACK_ENGINE_STARTED, 0, 0, 0, 0.0f, getCurrentDriverName()); | |||
| @@ -634,14 +618,13 @@ bool CarlaEngine::close() | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextPluginId == pData->maxPluginNumber, "Invalid engine internal data (err #8)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #9)"); | |||
| carla_debug("CarlaEngine::close()"); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| pData->aboutToClose = true; | |||
| if (pData->curPluginCount != 0) | |||
| removeAllPlugins(); | |||
| pData->thread.stop(500); | |||
| pData->thread.stopThread(500); | |||
| pData->nextAction.ready(); | |||
| #ifndef BUILD_BRIDGE | |||
| @@ -682,10 +665,9 @@ bool CarlaEngine::close() | |||
| void CarlaEngine::idle() | |||
| { | |||
| CARLA_ASSERT(pData->nextAction.opcode == kEnginePostActionNull); // TESTING, remove later | |||
| CARLA_ASSERT(pData->nextPluginId == pData->maxPluginNumber); // TESTING, remove later | |||
| CARLA_ASSERT(pData->plugins != nullptr); // this one too maybe | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| CARLA_SAFE_ASSERT_RETURN(pData->nextAction.opcode == kEnginePostActionNull,); // TESTING, remove later | |||
| CARLA_SAFE_ASSERT_RETURN(pData->nextPluginId == pData->maxPluginNumber,); // TESTING, remove later | |||
| CARLA_SAFE_ASSERT_RETURN(pData->plugins != nullptr,); // this one too maybe | |||
| for (unsigned int i=0; i < pData->curPluginCount; ++i) | |||
| { | |||
| @@ -694,6 +676,8 @@ void CarlaEngine::idle() | |||
| if (plugin != nullptr && plugin->isEnabled()) | |||
| plugin->idle(); | |||
| } | |||
| idleOsc(); | |||
| } | |||
| CarlaEngineClient* CarlaEngine::addClient(CarlaPlugin* const) | |||
| @@ -713,7 +697,6 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(ptype != PLUGIN_NONE, "Invalid plugin params (err #2)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR((filename != nullptr && filename[0] != '\0') || (label != nullptr && label[0] != '\0'), "Invalid plugin params (err #3)"); | |||
| carla_debug("CarlaEngine::addPlugin(%i:%s, %i:%s, \"%s\", \"%s\", \"%s\", " P_INT64 ", %p)", btype, BinaryType2Str(btype), ptype, PluginType2Str(ptype), filename, name, label, uniqueId, extra); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| unsigned int id; | |||
| CarlaPlugin* oldPlugin = nullptr; | |||
| @@ -973,14 +956,13 @@ bool CarlaEngine::removePlugin(const unsigned int id) | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #16)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(id < pData->curPluginCount, "Invalid plugin Id (err #1)"); | |||
| carla_debug("CarlaEngine::removePlugin(%i)", id); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to remove"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data (err #17)"); | |||
| pData->thread.stop(500); | |||
| pData->thread.stopThread(500); | |||
| const bool lockWait(isRunning() && pData->options.processMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS); | |||
| const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionRemovePlugin, id, 0, lockWait); | |||
| @@ -993,7 +975,7 @@ bool CarlaEngine::removePlugin(const unsigned int id) | |||
| delete plugin; | |||
| if (isRunning() && ! pData->aboutToClose) | |||
| pData->thread.start(); | |||
| pData->thread.startThread(); | |||
| callback(ENGINE_CALLBACK_PLUGIN_REMOVED, id, 0, 0, 0.0f, nullptr); | |||
| return true; | |||
| @@ -1005,12 +987,11 @@ bool CarlaEngine::removeAllPlugins() | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextPluginId == pData->maxPluginNumber, "Invalid engine internal data (err #19)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #20)"); | |||
| carla_debug("CarlaEngine::removeAllPlugins()"); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| if (pData->curPluginCount == 0) | |||
| return true; | |||
| pData->thread.stop(500); | |||
| pData->thread.stopThread(500); | |||
| const bool lockWait(isRunning()); | |||
| const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionZeroCount, 0, 0, lockWait); | |||
| @@ -1036,7 +1017,7 @@ bool CarlaEngine::removeAllPlugins() | |||
| } | |||
| if (isRunning() && ! pData->aboutToClose) | |||
| pData->thread.start(); | |||
| pData->thread.startThread(); | |||
| return true; | |||
| } | |||
| @@ -1049,7 +1030,6 @@ const char* CarlaEngine::renamePlugin(const unsigned int id, const char* const n | |||
| CARLA_SAFE_ASSERT_RETURN_ERRN(id < pData->curPluginCount, "Invalid plugin Id (err #2)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERRN(newName != nullptr && newName[0] != '\0', "Invalid plugin name"); | |||
| carla_debug("CarlaEngine::renamePlugin(%i, \"%s\")", id, newName); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||
| @@ -1073,7 +1053,6 @@ bool CarlaEngine::clonePlugin(const unsigned int id) | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #27)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(id < pData->curPluginCount, "Invalid plugin Id (err #3)"); | |||
| carla_debug("CarlaEngine::clonePlugin(%i)", id); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||
| @@ -1089,7 +1068,7 @@ bool CarlaEngine::clonePlugin(const unsigned int id) | |||
| if (! addPlugin(plugin->getBinaryType(), plugin->getType(), plugin->getFilename(), plugin->getName(), label, plugin->getUniqueId(), plugin->getExtraStuff())) | |||
| return false; | |||
| CARLA_ASSERT(pluginCountBefore+1 == pData->curPluginCount); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pluginCountBefore+1 == pData->curPluginCount, "No new plugin found"); | |||
| if (CarlaPlugin* const newPlugin = pData->plugins[pluginCountBefore].plugin) | |||
| newPlugin->loadSaveState(plugin->getSaveState()); | |||
| @@ -1103,7 +1082,6 @@ bool CarlaEngine::replacePlugin(const unsigned int id) | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data (err #30)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #31)"); | |||
| carla_debug("CarlaEngine::replacePlugin(%i)", id); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| // might use this to reset | |||
| if (id == pData->curPluginCount || id == pData->maxPluginNumber) | |||
| @@ -1133,7 +1111,6 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB) | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(idA < pData->curPluginCount, "Invalid plugin Id (err #5)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(idB < pData->curPluginCount, "Invalid plugin Id (err #6)"); | |||
| carla_debug("CarlaEngine::switchPlugins(%i)", idA, idB); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| CarlaPlugin* const pluginA(pData->plugins[idA].plugin); | |||
| CarlaPlugin* const pluginB(pData->plugins[idB].plugin); | |||
| @@ -1143,7 +1120,7 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB) | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pluginA->getId() == idA, "Invalid engine internal data (err #36)"); | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pluginB->getId() == idB, "Invalid engine internal data (err #37)"); | |||
| pData->thread.stop(500); | |||
| pData->thread.stopThread(500); | |||
| const bool lockWait(isRunning() && pData->options.processMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS); | |||
| const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionSwitchPlugins, idA, idB, lockWait); | |||
| @@ -1154,7 +1131,7 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB) | |||
| #endif | |||
| if (isRunning() && ! pData->aboutToClose) | |||
| pData->thread.start(); | |||
| pData->thread.startThread(); | |||
| return true; | |||
| } | |||
| @@ -1266,7 +1243,6 @@ bool CarlaEngine::loadFile(const char* const filename) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #1)"); | |||
| carla_debug("CarlaEngine::loadFile(\"%s\")", filename); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| QFileInfo fileInfo(filename); | |||
| @@ -1398,7 +1374,6 @@ bool CarlaEngine::loadProject(const char* const filename) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #2)"); | |||
| carla_debug("CarlaEngine::loadProject(\"%s\")", filename); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| QFile file(filename); | |||
| @@ -1501,7 +1476,6 @@ bool CarlaEngine::saveProject(const char* const filename) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #3)"); | |||
| carla_debug("CarlaEngine::saveProject(\"%s\")", filename); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| QFile file(filename); | |||
| @@ -1651,7 +1625,6 @@ void CarlaEngine::callback(const EngineCallbackOpcode action, const unsigned int | |||
| void CarlaEngine::setCallback(const EngineCallbackFunc func, void* const ptr) noexcept | |||
| { | |||
| carla_debug("CarlaEngine::setCallback(%p, %p)", func, ptr); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| pData->callback = func; | |||
| pData->callbackPtr = ptr; | |||
| @@ -1665,7 +1638,6 @@ const char* CarlaEngine::runFileCallback(const FileCallbackOpcode action, const | |||
| CARLA_SAFE_ASSERT_RETURN(title != nullptr && title[0] != '\0', nullptr); | |||
| CARLA_SAFE_ASSERT_RETURN(filter != nullptr, nullptr); | |||
| carla_debug("CarlaEngine::runFileCallback(%i:%s, %s, \"%s\", \"%s\")", action, FileCallbackOpcode2Str(action), bool2str(isDir), title, filter); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| const char* ret = nullptr; | |||
| @@ -1681,7 +1653,6 @@ const char* CarlaEngine::runFileCallback(const FileCallbackOpcode action, const | |||
| void CarlaEngine::setFileCallback(const FileCallbackFunc func, void* const ptr) noexcept | |||
| { | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| pData->fileCallback = func; | |||
| pData->fileCallbackPtr = ptr; | |||
| @@ -1696,7 +1667,6 @@ bool CarlaEngine::patchbayConnect(const int portA, const int portB) | |||
| CARLA_SAFE_ASSERT_RETURN(pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK || pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY, false); | |||
| CARLA_SAFE_ASSERT_RETURN(pData->bufAudio.isReady, false); | |||
| carla_debug("CarlaEngineRtAudio::patchbayConnect(%i, %i)", portA, portB); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| if (pData->bufAudio.usePatchbay) | |||
| { | |||
| @@ -1800,7 +1770,6 @@ bool CarlaEngine::patchbayDisconnect(const uint connectionId) | |||
| CARLA_SAFE_ASSERT_RETURN(pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK || pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY, false); | |||
| CARLA_SAFE_ASSERT_RETURN(pData->bufAudio.isReady, false); | |||
| carla_debug("CarlaEngineRtAudio::patchbayDisconnect(%i)", connectionId); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| if (pData->bufAudio.usePatchbay) | |||
| { | |||
| @@ -1916,7 +1885,6 @@ const char* CarlaEngine::getLastError() const noexcept | |||
| void CarlaEngine::setLastError(const char* const error) const | |||
| { | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| pData->lastError = error; | |||
| } | |||
| @@ -1934,7 +1902,6 @@ void CarlaEngine::setAboutToClose() noexcept | |||
| void CarlaEngine::setOption(const EngineOption option, const int value, const char* const valueStr) | |||
| { | |||
| carla_debug("CarlaEngine::setOption(%i:%s, %i, \"%s\")", option, EngineOption2Str(option), value, valueStr); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| if (isRunning() && (option == ENGINE_OPTION_PROCESS_MODE || option == ENGINE_OPTION_AUDIO_NUM_PERIODS || option == ENGINE_OPTION_AUDIO_DEVICE)) | |||
| return carla_stderr("CarlaEngine::setOption(%i:%s, %i, \"%s\") - Cannot set this option while engine is running!", option, EngineOption2Str(option), value, valueStr); | |||
| @@ -2050,6 +2017,14 @@ bool CarlaEngine::isOscControlRegistered() const noexcept | |||
| } | |||
| #endif | |||
| void CarlaEngine::idleOsc() const noexcept | |||
| { | |||
| try { | |||
| pData->osc.idle(); | |||
| } catch(...) {} | |||
| } | |||
| const char* CarlaEngine::getOscServerPathTCP() const noexcept | |||
| { | |||
| return pData->osc.getServerPathTCP(); | |||
| @@ -2063,7 +2038,6 @@ const char* CarlaEngine::getOscServerPathUDP() const noexcept | |||
| #ifdef BUILD_BRIDGE | |||
| void CarlaEngine::setOscBridgeData(const CarlaOscData* const oscData) const noexcept | |||
| { | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| pData->oscData = oscData; | |||
| } | |||
| @@ -297,7 +297,7 @@ public: | |||
| pData->sampleRate = fShmControl.readFloat(); | |||
| carla_stderr("SampleRate: %f", pData->sampleRate); | |||
| CarlaThread::start(); | |||
| CarlaThread::startThread(); | |||
| CarlaEngine::init(clientName); | |||
| return true; | |||
| } | |||
| @@ -307,7 +307,7 @@ public: | |||
| carla_debug("CarlaEnginePlugin::close()"); | |||
| CarlaEngine::close(); | |||
| CarlaThread::stop(6000); | |||
| CarlaThread::stopThread(6000); | |||
| fShmTime.clear(); | |||
| fShmControl.clear(); | |||
| @@ -346,14 +346,14 @@ public: | |||
| // TODO - set RT permissions | |||
| carla_debug("CarlaEngineBridge::run()"); | |||
| for (; ! shouldExit();) | |||
| for (; ! shouldThreadExit();) | |||
| { | |||
| if (! jackbridge_sem_timedwait(&fShmControl.data->runServer, 5)) | |||
| { | |||
| if (errno == ETIMEDOUT) | |||
| { | |||
| fIsRunning = false; | |||
| signalShouldExit(); | |||
| signalThreadShouldExit(); | |||
| return; | |||
| } | |||
| } | |||
| @@ -516,7 +516,7 @@ public: | |||
| } | |||
| case kPluginBridgeOpcodeQuit: | |||
| signalShouldExit(); | |||
| signalThreadShouldExit(); | |||
| fIsRunning = false; | |||
| break; | |||
| } | |||
| @@ -549,8 +549,8 @@ EngineInternalEvents::EngineInternalEvents() noexcept | |||
| EngineInternalEvents::~EngineInternalEvents() noexcept | |||
| { | |||
| CARLA_ASSERT(in == nullptr); | |||
| CARLA_ASSERT(out == nullptr); | |||
| CARLA_SAFE_ASSERT(in == nullptr); | |||
| CARLA_SAFE_ASSERT(out == nullptr); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -570,7 +570,7 @@ EngineNextAction::EngineNextAction() noexcept | |||
| EngineNextAction::~EngineNextAction() noexcept | |||
| { | |||
| CARLA_ASSERT(opcode == kEnginePostActionNull); | |||
| CARLA_SAFE_ASSERT(opcode == kEnginePostActionNull); | |||
| } | |||
| void EngineNextAction::ready() noexcept | |||
| @@ -31,15 +31,6 @@ | |||
| #define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; } | |||
| #define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; } | |||
| // ----------------------------------------------------------------------- | |||
| // Global action lock for UI operations, used for osc only | |||
| #ifndef BUILD_BRIDGE | |||
| # define CARLA_ENGINE_THREAD_SAFE_SECTION const CarlaCriticalSection::Scope _ccsl(pData->_cs); | |||
| #else | |||
| # define CARLA_ENGINE_THREAD_SAFE_SECTION | |||
| #endif | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_BACKEND_START_NAMESPACE | |||
| @@ -248,10 +239,6 @@ struct CarlaEngineProtectedData { | |||
| EngineInternalTime time; | |||
| EngineNextAction nextAction; | |||
| #ifndef BUILD_BRIDGE | |||
| CarlaCriticalSection _cs; // for handling requests from multiple threads | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| CarlaEngineProtectedData(CarlaEngine* const engine); | |||
| @@ -36,6 +36,7 @@ CARLA_BACKEND_START_NAMESPACE | |||
| #endif | |||
| class CarlaEngineJack; | |||
| class CarlaEngineJackClient; | |||
| // ----------------------------------------------------------------------- | |||
| // Fallback data | |||
| @@ -48,7 +49,7 @@ static const EngineEvent kFallbackJackEngineEvent = { kEngineEventTypeNull, 0, 0 | |||
| class CarlaEngineJackAudioPort : public CarlaEngineAudioPort | |||
| { | |||
| public: | |||
| CarlaEngineJackAudioPort(const CarlaEngine& engine, const bool isInputPort, jack_client_t* const client, jack_port_t* const port) | |||
| CarlaEngineJackAudioPort(const CarlaEngine& engine, const bool isInputPort, jack_client_t* const client, jack_port_t* const port) noexcept | |||
| : CarlaEngineAudioPort(engine, isInputPort), | |||
| fClient(client), | |||
| fPort(port) | |||
| @@ -57,24 +58,28 @@ public: | |||
| if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||
| { | |||
| CARLA_ASSERT(client != nullptr && port != nullptr); | |||
| //if (jack_uuid_t uuid = jackbridge_port_uuid(port)) | |||
| // jackbridge_set_property(client, uuid, "urn:jack:IsControlVoltage", "NO", "text/plain"); | |||
| CARLA_SAFE_ASSERT(client != nullptr && port != nullptr); | |||
| #if 0 | |||
| if (jack_uuid_t uuid = jackbridge_port_uuid(port)) | |||
| jackbridge_set_property(client, uuid, "urn:jack:IsControlVoltage", "NO", "text/plain"); | |||
| #endif | |||
| } | |||
| else | |||
| { | |||
| CARLA_ASSERT(client == nullptr && port == nullptr); | |||
| CARLA_SAFE_ASSERT(client == nullptr && port == nullptr); | |||
| } | |||
| } | |||
| ~CarlaEngineJackAudioPort() override | |||
| ~CarlaEngineJackAudioPort() noexcept override | |||
| { | |||
| carla_debug("CarlaEngineJackAudioPort::~CarlaEngineJackAudioPort()"); | |||
| if (fClient != nullptr && fPort != nullptr) | |||
| { | |||
| jackbridge_port_unregister(fClient, fPort); | |||
| try { | |||
| jackbridge_port_unregister(fClient, fPort); | |||
| } catch(...) {} | |||
| fClient = nullptr; | |||
| fPort = nullptr; | |||
| } | |||
| @@ -87,7 +92,13 @@ public: | |||
| const uint32_t bufferSize(fEngine.getBufferSize()); | |||
| fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize); | |||
| try { | |||
| fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize); | |||
| } | |||
| catch(...) { | |||
| fBuffer = nullptr; | |||
| return; | |||
| } | |||
| if (! fIsInput) | |||
| FLOAT_CLEAR(fBuffer, bufferSize); | |||
| @@ -109,7 +120,7 @@ private: | |||
| class CarlaEngineJackCVPort : public CarlaEngineCVPort | |||
| { | |||
| public: | |||
| CarlaEngineJackCVPort(const CarlaEngine& engine, const bool isInputPort, jack_client_t* const client, jack_port_t* const port) | |||
| CarlaEngineJackCVPort(const CarlaEngine& engine, const bool isInputPort, jack_client_t* const client, jack_port_t* const port) noexcept | |||
| : CarlaEngineCVPort(engine, isInputPort), | |||
| fClient(client), | |||
| fPort(port) | |||
| @@ -118,24 +129,28 @@ public: | |||
| if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||
| { | |||
| CARLA_ASSERT(client != nullptr && port != nullptr); | |||
| //if (jack_uuid_t uuid = jackbridge_port_uuid(port)) | |||
| // jackbridge_set_property(client, uuid, "urn:jack:IsControlVoltage", "YES", "text/plain"); | |||
| CARLA_SAFE_ASSERT(client != nullptr && port != nullptr); | |||
| #if 0 | |||
| if (jack_uuid_t uuid = jackbridge_port_uuid(port)) | |||
| jackbridge_set_property(client, uuid, "urn:jack:IsControlVoltage", "YES", "text/plain"); | |||
| #endif | |||
| } | |||
| else | |||
| { | |||
| CARLA_ASSERT(client == nullptr && port == nullptr); | |||
| CARLA_SAFE_ASSERT(client == nullptr && port == nullptr); | |||
| } | |||
| } | |||
| ~CarlaEngineJackCVPort() override | |||
| ~CarlaEngineJackCVPort() noexcept override | |||
| { | |||
| carla_debug("CarlaEngineJackCVPort::~CarlaEngineJackCVPort()"); | |||
| if (fClient != nullptr && fPort != nullptr) | |||
| { | |||
| jackbridge_port_unregister(fClient, fPort); | |||
| try { | |||
| jackbridge_port_unregister(fClient, fPort); | |||
| } catch(...) {} | |||
| fClient = nullptr; | |||
| fPort = nullptr; | |||
| } | |||
| @@ -148,7 +163,13 @@ public: | |||
| const uint32_t bufferSize(fEngine.getBufferSize()); | |||
| fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize); | |||
| try { | |||
| fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize); | |||
| } | |||
| catch(...) { | |||
| fBuffer = nullptr; | |||
| return; | |||
| } | |||
| if (! fIsInput) | |||
| FLOAT_CLEAR(fBuffer, bufferSize); | |||
| @@ -170,7 +191,7 @@ private: | |||
| class CarlaEngineJackEventPort : public CarlaEngineEventPort | |||
| { | |||
| public: | |||
| CarlaEngineJackEventPort(const CarlaEngine& engine, const bool isInputPort, jack_client_t* const client, jack_port_t* const port) | |||
| CarlaEngineJackEventPort(const CarlaEngine& engine, const bool isInputPort, jack_client_t* const client, jack_port_t* const port) noexcept | |||
| : CarlaEngineEventPort(engine, isInputPort), | |||
| fClient(client), | |||
| fPort(port), | |||
| @@ -180,21 +201,24 @@ public: | |||
| if (fEngine.getProccessMode() == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fEngine.getProccessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||
| { | |||
| CARLA_ASSERT(client != nullptr && port != nullptr); | |||
| CARLA_SAFE_ASSERT(client != nullptr && port != nullptr); | |||
| } | |||
| else | |||
| { | |||
| CARLA_ASSERT(client == nullptr && port == nullptr); | |||
| CARLA_SAFE_ASSERT(client == nullptr && port == nullptr); | |||
| } | |||
| } | |||
| ~CarlaEngineJackEventPort() override | |||
| ~CarlaEngineJackEventPort() noexcept override | |||
| { | |||
| carla_debug("CarlaEngineJackEventPort::~CarlaEngineJackEventPort()"); | |||
| if (fClient != nullptr && fPort != nullptr) | |||
| { | |||
| jackbridge_port_unregister(fClient, fPort); | |||
| try { | |||
| jackbridge_port_unregister(fClient, fPort); | |||
| } catch(...) {} | |||
| fClient = nullptr; | |||
| fPort = nullptr; | |||
| } | |||
| @@ -205,7 +229,13 @@ public: | |||
| if (fPort == nullptr) | |||
| return CarlaEngineEventPort::initBuffer(); | |||
| fJackBuffer = jackbridge_port_get_buffer(fPort, fEngine.getBufferSize()); | |||
| try { | |||
| fJackBuffer = jackbridge_port_get_buffer(fPort, fEngine.getBufferSize()); | |||
| } | |||
| catch(...) { | |||
| fJackBuffer = nullptr; | |||
| return; | |||
| } | |||
| if (! fIsInput) | |||
| jackbridge_midi_clear_buffer(fJackBuffer); | |||
| @@ -219,7 +249,13 @@ public: | |||
| CARLA_SAFE_ASSERT_RETURN(fIsInput, 0); | |||
| CARLA_SAFE_ASSERT_RETURN(fJackBuffer != nullptr, 0); | |||
| return jackbridge_midi_get_event_count(fJackBuffer); | |||
| uint32_t count = 0; | |||
| try { | |||
| count = jackbridge_midi_get_event_count(fJackBuffer); | |||
| } catch(...) {} | |||
| return count; | |||
| } | |||
| const EngineEvent& getEvent(const uint32_t index) const noexcept override | |||
| @@ -237,7 +273,13 @@ public: | |||
| { | |||
| jack_midi_event_t jackEvent; | |||
| if (! jackbridge_midi_event_get(&jackEvent, fJackBuffer, index)) | |||
| bool test = false; | |||
| try { | |||
| test = jackbridge_midi_event_get(&jackEvent, fJackBuffer, index); | |||
| } catch(...) {} | |||
| if (! test) | |||
| return kFallbackJackEngineEvent; | |||
| CARLA_SAFE_ASSERT_RETURN(jackEvent.size <= 0xFF /* uint8_t max */, kFallbackJackEngineEvent); | |||
| @@ -273,7 +315,13 @@ public: | |||
| if (size == 0) | |||
| return false; | |||
| return jackbridge_midi_event_write(fJackBuffer, time, data, size); | |||
| bool ret = false; | |||
| try { | |||
| ret = jackbridge_midi_event_write(fJackBuffer, time, data, size); | |||
| } catch(...) {} | |||
| return ret; | |||
| } | |||
| bool writeMidiEvent(const uint32_t time, const uint8_t channel, const uint8_t port, const uint8_t size, const uint8_t* const data) noexcept override | |||
| @@ -294,7 +342,13 @@ public: | |||
| for (uint8_t i=1; i < size; ++i) | |||
| jdata[i] = data[i]; | |||
| return jackbridge_midi_event_write(fJackBuffer, time, jdata, size); | |||
| bool ret = false; | |||
| try { | |||
| ret = jackbridge_midi_event_write(fJackBuffer, time, jdata, size); | |||
| } catch(...) {} | |||
| return ret; | |||
| } | |||
| private: | |||
| @@ -325,11 +379,11 @@ public: | |||
| if (fUseClient) | |||
| { | |||
| CARLA_ASSERT(fClient != nullptr); | |||
| CARLA_SAFE_ASSERT(fClient != nullptr); | |||
| } | |||
| else | |||
| { | |||
| CARLA_ASSERT(fClient == nullptr); | |||
| CARLA_SAFE_ASSERT(fClient == nullptr); | |||
| } | |||
| } | |||
| @@ -398,7 +452,7 @@ public: | |||
| } | |||
| #endif | |||
| CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) override | |||
| CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) /*noexcept*/ override | |||
| { | |||
| carla_debug("CarlaEngineJackClient::addPort(%s, \"%s\", %s)", EnginePortType2Str(portType), name, bool2str(isInput)); | |||
| @@ -407,20 +461,22 @@ public: | |||
| // Create JACK port first, if needed | |||
| if (fUseClient && fClient != nullptr) | |||
| { | |||
| switch (portType) | |||
| { | |||
| case kEnginePortTypeNull: | |||
| break; | |||
| case kEnginePortTypeAudio: | |||
| port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); | |||
| break; | |||
| case kEnginePortTypeCV: | |||
| port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); | |||
| break; | |||
| case kEnginePortTypeEvent: | |||
| port = jackbridge_port_register(fClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); | |||
| break; | |||
| } | |||
| try { | |||
| switch (portType) | |||
| { | |||
| case kEnginePortTypeNull: | |||
| break; | |||
| case kEnginePortTypeAudio: | |||
| port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); | |||
| break; | |||
| case kEnginePortTypeCV: | |||
| port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); | |||
| break; | |||
| case kEnginePortTypeEvent: | |||
| port = jackbridge_port_register(fClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); | |||
| break; | |||
| } | |||
| } catch(...) {} | |||
| if (port == nullptr) | |||
| { | |||
| @@ -530,7 +586,7 @@ public: | |||
| ~CarlaEngineJack() override | |||
| { | |||
| carla_debug("CarlaEngineJack::~CarlaEngineJack()"); | |||
| CARLA_ASSERT(fClient == nullptr); | |||
| CARLA_SAFE_ASSERT(fClient == nullptr); | |||
| #ifndef BUILD_BRIDGE | |||
| fUsedGroupNames.clear(); | |||
| @@ -583,7 +639,6 @@ public: | |||
| bool init(const char* const clientName) override | |||
| { | |||
| carla_debug("CarlaEngineJack::init(\"%s\")", clientName); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| fFreewheel = false; | |||
| fTransportState = JackTransportStopped; | |||
| @@ -671,7 +726,6 @@ public: | |||
| bool close() override | |||
| { | |||
| carla_debug("CarlaEngineJack::close()"); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| CarlaEngine::close(); | |||
| @@ -718,7 +772,6 @@ public: | |||
| #ifndef BUILD_BRIDGE | |||
| void idle() override | |||
| { | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| CarlaEngine::idle(); | |||
| @@ -771,7 +824,6 @@ public: | |||
| CarlaEngineClient* addClient(CarlaPlugin* const plugin) override | |||
| { | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| jack_client_t* client = nullptr; | |||
| @@ -815,7 +867,6 @@ public: | |||
| CARLA_SAFE_ASSERT_RETURN(id < pData->curPluginCount, nullptr); | |||
| CARLA_SAFE_ASSERT_RETURN(pData->plugins != nullptr, nullptr); | |||
| CARLA_SAFE_ASSERT_RETURN(newName != nullptr && newName[0] != '\0', nullptr); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||
| @@ -895,7 +946,6 @@ public: | |||
| bool patchbayConnect(int portA, int portB) override | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, false); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| if (fClient == nullptr) | |||
| { | |||
| @@ -920,7 +970,6 @@ public: | |||
| bool patchbayDisconnect(uint connectionId) override | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, false); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| for (LinkedList<ConnectionToId>::Itenerator it = fUsedConnections.begin(); it.valid(); it.next()) | |||
| { | |||
| @@ -951,7 +1000,6 @@ public: | |||
| bool patchbayRefresh() override | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, false); | |||
| CARLA_ENGINE_THREAD_SAFE_SECTION; | |||
| fLastGroupId = 0; | |||
| fLastPortId = 0; | |||
| @@ -1210,13 +1258,15 @@ protected: | |||
| void* const eventIn = jackbridge_port_get_buffer(fRackPorts[kRackPortEventIn], nframes); | |||
| void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes); | |||
| #if 0 | |||
| // assert buffers | |||
| CARLA_ASSERT(audioIn1 != nullptr); | |||
| CARLA_ASSERT(audioIn2 != nullptr); | |||
| CARLA_ASSERT(audioOut1 != nullptr); | |||
| CARLA_ASSERT(audioOut2 != nullptr); | |||
| CARLA_ASSERT(eventIn != nullptr); | |||
| CARLA_ASSERT(eventOut != nullptr); | |||
| CARLA_SAFE_ASSERT(audioIn1 != nullptr); | |||
| CARLA_SAFE_ASSERT(audioIn2 != nullptr); | |||
| CARLA_SAFE_ASSERT(audioOut1 != nullptr); | |||
| CARLA_SAFE_ASSERT(audioOut2 != nullptr); | |||
| CARLA_SAFE_ASSERT(eventIn != nullptr); | |||
| CARLA_SAFE_ASSERT(eventOut != nullptr); | |||
| #endif | |||
| // create audio buffers | |||
| float* inBuf[2] = { audioIn1, audioIn2 }; | |||
| @@ -155,7 +155,7 @@ public: | |||
| pData->bufAudio.inCount = static_cast<uint32_t>(inputChannels.countNumberOfSetBits()); | |||
| pData->bufAudio.outCount = static_cast<uint32_t>(outputChannels.countNumberOfSetBits()); | |||
| CARLA_ASSERT(pData->bufAudio.outCount > 0); | |||
| CARLA_SAFE_ASSERT(pData->bufAudio.outCount > 0); | |||
| pData->bufAudio.create(pData->bufferSize); | |||
| @@ -255,7 +255,7 @@ public: | |||
| callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_AUDIO_IN, PATCHBAY_ICON_HARDWARE, -1, 0.0f, strBuf); | |||
| StringArray inputNames(fDevice->getInputChannelNames()); | |||
| CARLA_ASSERT(inputNames.size() == static_cast<int>(pData->bufAudio.inCount)); | |||
| CARLA_SAFE_ASSERT(inputNames.size() == static_cast<int>(pData->bufAudio.inCount)); | |||
| for (uint i=0; i < pData->bufAudio.inCount; ++i) | |||
| { | |||
| @@ -280,7 +280,7 @@ public: | |||
| callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_AUDIO_OUT, PATCHBAY_ICON_HARDWARE, -1, 0.0f, strBuf); | |||
| StringArray outputNames(fDevice->getOutputChannelNames()); | |||
| CARLA_ASSERT(outputNames.size() == static_cast<int>(pData->bufAudio.outCount)); | |||
| CARLA_SAFE_ASSERT(outputNames.size() == static_cast<int>(pData->bufAudio.outCount)); | |||
| for (uint i=0; i < pData->bufAudio.outCount; ++i) | |||
| { | |||
| @@ -546,7 +546,7 @@ public: | |||
| ~CarlaEngineNative() override | |||
| { | |||
| CARLA_ASSERT(! fIsActive); | |||
| CARLA_SAFE_ASSERT(! fIsActive); | |||
| carla_debug("CarlaEngineNative::~CarlaEngineNative() - START"); | |||
| pData->aboutToClose = true; | |||
| @@ -42,17 +42,17 @@ CarlaEngineOsc::CarlaEngineOsc(CarlaEngine* const engine) | |||
| fServerTCP(nullptr), | |||
| fServerUDP(nullptr) | |||
| { | |||
| CARLA_ASSERT(engine != nullptr); | |||
| CARLA_SAFE_ASSERT(engine != nullptr); | |||
| carla_debug("CarlaEngineOsc::CarlaEngineOsc(%p)", engine); | |||
| } | |||
| CarlaEngineOsc::~CarlaEngineOsc() | |||
| { | |||
| CARLA_ASSERT(fName.isEmpty()); | |||
| CARLA_ASSERT(fServerPathTCP.isEmpty()); | |||
| CARLA_ASSERT(fServerPathUDP.isEmpty()); | |||
| CARLA_ASSERT(fServerTCP == nullptr); | |||
| CARLA_ASSERT(fServerUDP == nullptr); | |||
| CARLA_SAFE_ASSERT(fName.isEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerPathTCP.isEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerPathUDP.isEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerTCP == nullptr); | |||
| CARLA_SAFE_ASSERT(fServerUDP == nullptr); | |||
| carla_debug("CarlaEngineOsc::~CarlaEngineOsc()"); | |||
| } | |||
| @@ -71,48 +71,55 @@ void CarlaEngineOsc::init(const char* const name) | |||
| fName = name; | |||
| fName.toBasic(); | |||
| fServerTCP = lo_server_thread_new_with_proto(nullptr, LO_TCP, osc_error_handler_TCP); | |||
| fServerTCP = lo_server_new_with_proto(nullptr, LO_TCP, osc_error_handler_TCP); | |||
| if (fServerTCP != nullptr) | |||
| { | |||
| if (char* const tmpServerPathTCP = lo_server_thread_get_url(fServerTCP)) | |||
| if (char* const tmpServerPathTCP = lo_server_get_url(fServerTCP)) | |||
| { | |||
| fServerPathTCP = tmpServerPathTCP; | |||
| fServerPathTCP += fName; | |||
| std::free(tmpServerPathTCP); | |||
| } | |||
| lo_server_thread_add_method(fServerTCP, nullptr, nullptr, osc_message_handler_TCP, this); | |||
| int ret = lo_server_thread_start(fServerTCP); | |||
| CARLA_SAFE_ASSERT(ret == 0); | |||
| lo_server_add_method(fServerTCP, nullptr, nullptr, osc_message_handler_TCP, this); | |||
| } | |||
| fServerUDP = lo_server_thread_new_with_proto(nullptr, LO_UDP, osc_error_handler_UDP); | |||
| fServerUDP = lo_server_new_with_proto(nullptr, LO_UDP, osc_error_handler_UDP); | |||
| if (fServerUDP != nullptr) | |||
| { | |||
| if (char* const tmpServerPathUDP = lo_server_thread_get_url(fServerUDP)) | |||
| if (char* const tmpServerPathUDP = lo_server_get_url(fServerUDP)) | |||
| { | |||
| fServerPathUDP = tmpServerPathUDP; | |||
| fServerPathUDP += fName; | |||
| std::free(tmpServerPathUDP); | |||
| } | |||
| lo_server_thread_add_method(fServerUDP, nullptr, nullptr, osc_message_handler_UDP, this); | |||
| int ret = lo_server_thread_start(fServerUDP); | |||
| CARLA_SAFE_ASSERT(ret == 0); | |||
| lo_server_add_method(fServerUDP, nullptr, nullptr, osc_message_handler_UDP, this); | |||
| } | |||
| CARLA_ASSERT(fName.isNotEmpty()); | |||
| CARLA_SAFE_ASSERT(fName.isNotEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerPathTCP.isNotEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerPathUDP.isNotEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerTCP != nullptr); | |||
| CARLA_SAFE_ASSERT(fServerUDP != nullptr); | |||
| } | |||
| void CarlaEngineOsc::idle() const | |||
| { | |||
| if (fServerTCP != nullptr) { | |||
| while (lo_server_recv_noblock(fServerTCP, 0) != 0) {} | |||
| } | |||
| if (fServerUDP != nullptr) { | |||
| while (lo_server_recv_noblock(fServerUDP, 0) != 0) {} | |||
| } | |||
| } | |||
| void CarlaEngineOsc::close() | |||
| { | |||
| CARLA_ASSERT(fName.isNotEmpty()); | |||
| CARLA_SAFE_ASSERT(fName.isNotEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerPathTCP.isNotEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerPathUDP.isNotEmpty()); | |||
| CARLA_SAFE_ASSERT(fServerTCP != nullptr); | |||
| @@ -123,17 +130,15 @@ void CarlaEngineOsc::close() | |||
| if (fServerTCP != nullptr) | |||
| { | |||
| lo_server_thread_stop(fServerTCP); | |||
| lo_server_thread_del_method(fServerTCP, nullptr, nullptr); | |||
| lo_server_thread_free(fServerTCP); | |||
| lo_server_del_method(fServerTCP, nullptr, nullptr); | |||
| lo_server_free(fServerTCP); | |||
| fServerTCP = nullptr; | |||
| } | |||
| if (fServerUDP != nullptr) | |||
| { | |||
| lo_server_thread_stop(fServerUDP); | |||
| lo_server_thread_del_method(fServerUDP, nullptr, nullptr); | |||
| lo_server_thread_free(fServerUDP); | |||
| lo_server_del_method(fServerUDP, nullptr, nullptr); | |||
| lo_server_free(fServerUDP); | |||
| fServerUDP = nullptr; | |||
| } | |||
| @@ -157,16 +162,13 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, cons | |||
| CARLA_SAFE_ASSERT_RETURN(fName.isNotEmpty(), 1); | |||
| CARLA_SAFE_ASSERT_RETURN(path != nullptr && path[0] != '\0', 1); | |||
| carla_debug("CarlaEngineOsc::handleMessage(%s, \"%s\", %i, %p, \"%s\", %p)", bool2str(isTCP), path, argc, argv, types, msg); | |||
| #ifndef BUILD_BRIDGE | |||
| const CarlaCriticalSection::Scope _ccsl(_cs); | |||
| #endif | |||
| if (isTCP) | |||
| //if (isTCP) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fServerPathTCP.isNotEmpty(), 1); | |||
| CARLA_SAFE_ASSERT_RETURN(fServerTCP != nullptr, 1); | |||
| } | |||
| else | |||
| //else | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fServerPathUDP.isNotEmpty(), 1); | |||
| CARLA_SAFE_ASSERT_RETURN(fServerUDP != nullptr, 1); | |||
| @@ -20,7 +20,6 @@ | |||
| #include "CarlaBackend.h" | |||
| #include "CarlaOscUtils.hpp" | |||
| #include "CarlaMutex.hpp" | |||
| #include "CarlaString.hpp" | |||
| #define CARLA_ENGINE_OSC_HANDLE_ARGS1 CarlaPlugin* const plugin | |||
| @@ -62,6 +61,7 @@ public: | |||
| ~CarlaEngineOsc(); | |||
| void init(const char* const name); | |||
| void idle() const; | |||
| void close(); | |||
| // ------------------------------------------------------------------- | |||
| @@ -99,12 +99,11 @@ private: | |||
| CarlaString fServerPathTCP; | |||
| CarlaString fServerPathUDP; | |||
| lo_server_thread fServerTCP; | |||
| lo_server_thread fServerUDP; | |||
| lo_server fServerTCP; | |||
| lo_server fServerUDP; | |||
| #ifndef BUILD_BRIDGE | |||
| CarlaOscData fControlData; // for carla-control | |||
| CarlaCriticalSection _cs; | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| @@ -176,8 +176,8 @@ public: | |||
| ~CarlaEngineRtAudio() override | |||
| { | |||
| CARLA_ASSERT(fAudioBufIn == nullptr); | |||
| CARLA_ASSERT(fAudioBufOut == nullptr); | |||
| CARLA_SAFE_ASSERT(fAudioBufIn == nullptr); | |||
| CARLA_SAFE_ASSERT(fAudioBufOut == nullptr); | |||
| carla_debug("CarlaEngineRtAudio::~CarlaEngineRtAudio()"); | |||
| fUsedMidiIns.clear(); | |||
| @@ -274,7 +274,7 @@ public: | |||
| pData->bufAudio.inCount = iParams.nChannels; | |||
| pData->bufAudio.outCount = oParams.nChannels; | |||
| CARLA_ASSERT(pData->bufAudio.outCount > 0); | |||
| CARLA_SAFE_ASSERT(pData->bufAudio.outCount > 0); | |||
| if (pData->bufAudio.inCount > 0) | |||
| { | |||
| @@ -312,7 +312,7 @@ public: | |||
| bool close() override | |||
| { | |||
| CARLA_ASSERT(fAudioBufOut != nullptr); | |||
| CARLA_SAFE_ASSERT(fAudioBufOut != nullptr); | |||
| carla_debug("CarlaEngineRtAudio::close()"); | |||
| pData->bufAudio.isReady = false; | |||
| @@ -27,7 +27,7 @@ CarlaEngineThread::CarlaEngineThread(CarlaEngine* const engine) | |||
| : CarlaThread("CarlaEngineThread"), | |||
| fEngine(engine) | |||
| { | |||
| CARLA_ASSERT(engine != nullptr); | |||
| CARLA_SAFE_ASSERT(engine != nullptr); | |||
| carla_debug("CarlaEngineThread::CarlaEngineThread(%p)", engine); | |||
| } | |||
| @@ -47,7 +47,7 @@ void CarlaEngineThread::run() | |||
| bool hasUi, oscRegisted, needsSingleThread; | |||
| float value; | |||
| for (; fEngine->isRunning() && ! shouldExit();) | |||
| for (; fEngine->isRunning() && ! shouldThreadExit();) | |||
| { | |||
| #ifdef BUILD_BRIDGE | |||
| oscRegisted = fEngine->isOscBridgeRegistered(); | |||
| @@ -8,7 +8,7 @@ include ../Makefile.mk | |||
| # ---------------------------------------------------------------------------------------------------------------------------- | |||
| CARLA_ENGINE_OSC_HPP = CarlaEngineOsc.hpp $(CARLA_BACKEND_H) $(CARLA_OSC_UTILS_HPP) $(CARLA_MUTEX_HPP) $(CARLA_STRING_HPP) | |||
| CARLA_ENGINE_OSC_HPP = CarlaEngineOsc.hpp $(CARLA_BACKEND_H) $(CARLA_OSC_UTILS_HPP) $(CARLA_STRING_HPP) | |||
| CARLA_ENGINE_THREAD_HPP = CarlaEngineThread.hpp $(CARLA_BACKEND_H) $(CARLA_THREAD_HPP) | |||
| CARLA_ENGINE_INTERNAL_HPP = CarlaEngineInternal.hpp $(CARLA_ENGINE_OSC_HPP) $(CARLA_ENGINE_THREAD_HPP) $(CARLA_ENGINE_HPP) $(CARLA_MUTEX_HPP) $(LINKED_LIST_HPP) | |||
| @@ -335,7 +335,7 @@ public: | |||
| pData->active = false; | |||
| } | |||
| if (pData->osc.thread.isRunning()) | |||
| if (pData->osc.thread.isThreadRunning()) | |||
| { | |||
| fShmControl.writeOpcode(kPluginBridgeOpcodeQuit); | |||
| fShmControl.commitWrite(); | |||
| @@ -351,7 +351,7 @@ public: | |||
| } | |||
| pData->osc.data.free(); | |||
| pData->osc.thread.stop(3000); | |||
| pData->osc.thread.stopThread(3000); | |||
| if (fNeedsSemDestroy) | |||
| { | |||
| @@ -623,7 +623,7 @@ public: | |||
| void idle() override | |||
| { | |||
| if (! pData->osc.thread.isRunning()) | |||
| if (! pData->osc.thread.isThreadRunning()) | |||
| carla_stderr2("TESTING: Bridge has closed!"); | |||
| CarlaPlugin::idle(); | |||
| @@ -1912,25 +1912,26 @@ public: | |||
| std::strncat(shmIdStr, &fShmTime.filename[fShmTime.filename.length()-6], 6); | |||
| pData->osc.thread.setOscData(bridgeBinary, label, getPluginTypeAsString(fPluginType), shmIdStr); | |||
| pData->osc.thread.start(); | |||
| pData->osc.thread.startThread(); | |||
| } | |||
| fInitiated = false; | |||
| fLastPongCounter = 0; | |||
| for (; fLastPongCounter < 100; ++fLastPongCounter) | |||
| for (; fLastPongCounter < 200; ++fLastPongCounter) | |||
| { | |||
| if (fInitiated || ! pData->osc.thread.isRunning()) | |||
| if (fInitiated || ! pData->osc.thread.isThreadRunning()) | |||
| break; | |||
| carla_msleep(50); | |||
| carla_msleep(30); | |||
| pData->engine->callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); | |||
| pData->engine->idle(); | |||
| } | |||
| fLastPongCounter = -1; | |||
| if (fInitError || ! fInitiated) | |||
| { | |||
| pData->osc.thread.stop(6000); | |||
| pData->osc.thread.stopThread(6000); | |||
| if (! fInitError) | |||
| pData->engine->setLastError("Timeout while waiting for a response from plugin-bridge\n(or the plugin crashed on initialization?)"); | |||
| @@ -121,26 +121,26 @@ CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id) | |||
| : pData(new CarlaPluginProtectedData(engine, id, this)) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(engine != nullptr,); | |||
| CARLA_ASSERT(id < engine->getMaxPluginNumber()); | |||
| CARLA_SAFE_ASSERT(id < engine->getMaxPluginNumber()); | |||
| carla_debug("CarlaPlugin::CarlaPlugin(%p, %i)", engine, id); | |||
| switch (engine->getProccessMode()) | |||
| { | |||
| case ENGINE_PROCESS_MODE_SINGLE_CLIENT: | |||
| case ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS: | |||
| CARLA_ASSERT(id < MAX_DEFAULT_PLUGINS); | |||
| CARLA_SAFE_ASSERT(id < MAX_DEFAULT_PLUGINS); | |||
| break; | |||
| case ENGINE_PROCESS_MODE_CONTINUOUS_RACK: | |||
| CARLA_ASSERT(id < MAX_RACK_PLUGINS); | |||
| CARLA_SAFE_ASSERT(id < MAX_RACK_PLUGINS); | |||
| break; | |||
| case ENGINE_PROCESS_MODE_PATCHBAY: | |||
| CARLA_ASSERT(id < MAX_PATCHBAY_PLUGINS); | |||
| CARLA_SAFE_ASSERT(id < MAX_PATCHBAY_PLUGINS); | |||
| break; | |||
| case ENGINE_PROCESS_MODE_BRIDGE: | |||
| CARLA_ASSERT(id == 0); | |||
| CARLA_SAFE_ASSERT(id == 0); | |||
| break; | |||
| } | |||
| } | |||
| @@ -306,7 +306,7 @@ const CustomData& CarlaPlugin::getCustomData(const uint32_t index) const noexcep | |||
| int32_t CarlaPlugin::getChunkData(void** const dataPtr) const noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataPtr != nullptr, 0); | |||
| CARLA_ASSERT(false); // this should never happen | |||
| CARLA_SAFE_ASSERT(false); // this should never happen | |||
| return 0; | |||
| } | |||
| @@ -315,14 +315,14 @@ int32_t CarlaPlugin::getChunkData(void** const dataPtr) const noexcept | |||
| unsigned int CarlaPlugin::getOptionsAvailable() const noexcept | |||
| { | |||
| CARLA_ASSERT(false); // this should never happen | |||
| CARLA_SAFE_ASSERT(false); // this should never happen | |||
| return 0x0; | |||
| } | |||
| float CarlaPlugin::getParameterValue(const uint32_t parameterId) const noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), 0.0f); | |||
| CARLA_ASSERT(false); // this should never happen | |||
| CARLA_SAFE_ASSERT(false); // this should never happen | |||
| return 0.0f; | |||
| } | |||
| @@ -330,7 +330,7 @@ float CarlaPlugin::getParameterScalePointValue(const uint32_t parameterId, const | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(), 0.0f); | |||
| CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId), 0.0f); | |||
| CARLA_ASSERT(false); // this should never happen | |||
| CARLA_SAFE_ASSERT(false); // this should never happen | |||
| return 0.0f; | |||
| } | |||
| @@ -357,7 +357,7 @@ void CarlaPlugin::getRealName(char* const strBuf) const noexcept | |||
| void CarlaPlugin::getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(),); | |||
| CARLA_ASSERT(false); // this should never happen | |||
| CARLA_SAFE_ASSERT(false); // this should never happen | |||
| strBuf[0] = '\0'; | |||
| } | |||
| @@ -370,7 +370,7 @@ void CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const str | |||
| void CarlaPlugin::getParameterText(const uint32_t parameterId, const float, char* const strBuf) const noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(),); | |||
| CARLA_ASSERT(false); // this should never happen | |||
| CARLA_SAFE_ASSERT(false); // this should never happen | |||
| strBuf[0] = '\0'; | |||
| } | |||
| @@ -384,7 +384,7 @@ void CarlaPlugin::getParameterScalePointLabel(const uint32_t parameterId, const | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < getParameterCount(),); | |||
| CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId),); | |||
| CARLA_ASSERT(false); // this should never happen | |||
| CARLA_SAFE_ASSERT(false); // this should never happen | |||
| strBuf[0] = '\0'; | |||
| } | |||
| @@ -828,7 +828,7 @@ void CarlaPlugin::setId(const unsigned int newId) noexcept | |||
| void CarlaPlugin::setName(const char* const newName) | |||
| { | |||
| CARLA_ASSERT(newName != nullptr && newName[0] != '\0'); | |||
| CARLA_SAFE_ASSERT_RETURN(newName != nullptr && newName[0] != '\0',); | |||
| if (pData->name != nullptr) | |||
| delete[] pData->name; | |||
| @@ -838,7 +838,7 @@ void CarlaPlugin::setName(const char* const newName) | |||
| void CarlaPlugin::setOption(const unsigned int option, const bool yesNo) | |||
| { | |||
| CARLA_ASSERT(getOptionsAvailable() & option); | |||
| CARLA_SAFE_ASSERT_RETURN(getOptionsAvailable() & option,); | |||
| if (yesNo) | |||
| pData->options |= option; | |||
| @@ -865,7 +865,7 @@ void CarlaPlugin::setEnabled(const bool yesNo) noexcept | |||
| void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| #ifndef BUILD_BRIDGE | |||
| CARLA_ASSERT(sendOsc || sendCallback); // never call this from RT | |||
| CARLA_SAFE_ASSERT_RETURN(sendOsc || sendCallback,); // never call this from RT | |||
| #endif | |||
| if (pData->active == active) | |||
| @@ -902,7 +902,7 @@ void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool se | |||
| #ifndef BUILD_BRIDGE | |||
| void CarlaPlugin::setDryWet(const float value, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(value >= 0.0f && value <= 1.0f); | |||
| CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f); | |||
| const float fixedValue(carla_fixValue<float>(0.0f, 1.0f, value)); | |||
| @@ -920,7 +920,7 @@ void CarlaPlugin::setDryWet(const float value, const bool sendOsc, const bool se | |||
| void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(value >= 0.0f && value <= 1.27f); | |||
| CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.27f); | |||
| const float fixedValue(carla_fixValue<float>(0.0f, 1.27f, value)); | |||
| @@ -938,7 +938,7 @@ void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool se | |||
| void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(value >= -1.0f && value <= 1.0f); | |||
| CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); | |||
| const float fixedValue(carla_fixValue<float>(-1.0f, 1.0f, value)); | |||
| @@ -956,7 +956,7 @@ void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bo | |||
| void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(value >= -1.0f && value <= 1.0f); | |||
| CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); | |||
| const float fixedValue(carla_fixValue<float>(-1.0f, 1.0f, value)); | |||
| @@ -974,7 +974,7 @@ void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const b | |||
| void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(value >= -1.0f && value <= 1.0f); | |||
| CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); | |||
| const float fixedValue(carla_fixValue<float>(-1.0f, 1.0f, value)); | |||
| @@ -994,9 +994,9 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s | |||
| void CarlaPlugin::setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| #ifndef BUILD_BRIDGE | |||
| CARLA_ASSERT(sendOsc || sendCallback); // never call this from RT | |||
| CARLA_SAFE_ASSERT_RETURN(sendOsc || sendCallback,); // never call this from RT | |||
| #endif | |||
| CARLA_ASSERT_INT(channel >= -1 && channel < MAX_MIDI_CHANNELS, channel); | |||
| CARLA_SAFE_ASSERT_RETURN(channel >= -1 && channel < MAX_MIDI_CHANNELS,); | |||
| if (pData->ctrlChannel == channel) | |||
| return; | |||
| @@ -1028,7 +1028,7 @@ void CarlaPlugin::setCtrlChannel(const int8_t channel, const bool sendOsc, const | |||
| void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(parameterId < pData->param.count); | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||
| #ifdef BUILD_BRIDGE | |||
| if (! gIsLoadingProject) | |||
| { | |||
| @@ -1058,12 +1058,8 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu | |||
| void CarlaPlugin::setParameterValueByRealIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(rindex > PARAMETER_MAX && rindex != PARAMETER_NULL); | |||
| CARLA_SAFE_ASSERT_RETURN(rindex > PARAMETER_MAX && rindex != PARAMETER_NULL,); | |||
| if (rindex <= PARAMETER_MAX) | |||
| return; | |||
| if (rindex == PARAMETER_NULL) | |||
| return; | |||
| if (rindex == PARAMETER_ACTIVE) | |||
| return setActive((value > 0.0f), sendOsc, sendCallback); | |||
| if (rindex == PARAMETER_CTRL_CHANNEL) | |||
| @@ -1095,12 +1091,9 @@ void CarlaPlugin::setParameterValueByRealIndex(const int32_t rindex, const float | |||
| void CarlaPlugin::setParameterMidiChannel(const uint32_t parameterId, uint8_t channel, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(sendOsc || sendCallback); // never call this from RT | |||
| CARLA_ASSERT(parameterId < pData->param.count); | |||
| CARLA_ASSERT_INT(channel < MAX_MIDI_CHANNELS, channel); | |||
| if (channel >= MAX_MIDI_CHANNELS) | |||
| channel = MAX_MIDI_CHANNELS; | |||
| CARLA_SAFE_ASSERT_RETURN(sendOsc || sendCallback,); // never call this from RT | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||
| CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); | |||
| pData->param.data[parameterId].midiChannel = channel; | |||
| @@ -1124,12 +1117,9 @@ void CarlaPlugin::setParameterMidiChannel(const uint32_t parameterId, uint8_t ch | |||
| void CarlaPlugin::setParameterMidiCC(const uint32_t parameterId, int16_t cc, const bool sendOsc, const bool sendCallback) noexcept | |||
| { | |||
| CARLA_ASSERT(sendOsc || sendCallback); // never call this from RT | |||
| CARLA_ASSERT(parameterId < pData->param.count); | |||
| CARLA_ASSERT_INT(cc >= -1 && cc <= 0x5F, cc); | |||
| if (cc < -1 || cc > 0x5F) | |||
| cc = -1; | |||
| CARLA_SAFE_ASSERT_RETURN(sendOsc || sendCallback,); // never call this from RT | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||
| CARLA_SAFE_ASSERT_RETURN(cc >= -1 && cc <= 0x5F,); | |||
| pData->param.data[parameterId].midiCC = cc; | |||
| @@ -1184,9 +1174,9 @@ void CarlaPlugin::setCustomData(const char* const type, const char* const key, c | |||
| { | |||
| CustomData& cData(it.getValue()); | |||
| CARLA_SAFE_ASSERT_RETURN(cData.type != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(cData.key != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(cData.value != nullptr,); | |||
| CARLA_SAFE_ASSERT_CONTINUE(cData.type != nullptr && cData.type[0] != '\0'); | |||
| CARLA_SAFE_ASSERT_CONTINUE(cData.key != nullptr && cData.key[0] != '\0'); | |||
| CARLA_SAFE_ASSERT_CONTINUE(cData.value != nullptr); | |||
| if (std::strcmp(cData.key, key) == 0) | |||
| { | |||
| @@ -1208,12 +1198,8 @@ void CarlaPlugin::setCustomData(const char* const type, const char* const key, c | |||
| void CarlaPlugin::setChunkData(const char* const stringData) | |||
| { | |||
| CARLA_ASSERT(stringData != nullptr); | |||
| CARLA_ASSERT(false); // this should never happen | |||
| return; | |||
| // unused | |||
| (void)stringData; | |||
| CARLA_SAFE_ASSERT_RETURN(stringData != nullptr && stringData[0] != '\0',); | |||
| CARLA_SAFE_ASSERT(false); // this should never happen | |||
| } | |||
| void CarlaPlugin::setProgram(const int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept | |||
| @@ -1387,7 +1373,7 @@ void CarlaPlugin::idle() | |||
| void CarlaPlugin::showCustomUI(const bool yesNo) | |||
| { | |||
| CARLA_ASSERT(false); | |||
| CARLA_SAFE_ASSERT(false); | |||
| return; | |||
| // unused | |||
| @@ -1406,12 +1392,12 @@ void CarlaPlugin::reloadPrograms(const bool) | |||
| void CarlaPlugin::activate() noexcept | |||
| { | |||
| CARLA_ASSERT(! pData->active); | |||
| CARLA_SAFE_ASSERT(! pData->active); | |||
| } | |||
| void CarlaPlugin::deactivate() noexcept | |||
| { | |||
| CARLA_ASSERT(pData->active); | |||
| CARLA_SAFE_ASSERT(pData->active); | |||
| } | |||
| void CarlaPlugin::bufferSizeChanged(const uint32_t) | |||
| @@ -1651,9 +1637,9 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url) | |||
| { | |||
| const CustomData& cData(it.getValue()); | |||
| CARLA_ASSERT(cData.type != nullptr); | |||
| CARLA_ASSERT(cData.key != nullptr); | |||
| CARLA_ASSERT(cData.value != nullptr); | |||
| CARLA_SAFE_ASSERT_CONTINUE(cData.type != nullptr && cData.type[0] != '\0'); | |||
| CARLA_SAFE_ASSERT_CONTINUE(cData.key != nullptr && cData.key[0] != '\0'); | |||
| CARLA_SAFE_ASSERT_CONTINUE(cData.value != nullptr); | |||
| if (std::strcmp(cData.type, CUSTOM_DATA_TYPE_STRING) == 0) | |||
| osc_send_configure(pData->osc.data, cData.key, cData.value); | |||
| @@ -1701,7 +1687,7 @@ bool CarlaPlugin::waitForOscGuiShow() | |||
| return true; | |||
| } | |||
| if (pData->osc.thread.isRunning()) | |||
| if (pData->osc.thread.isThreadRunning()) | |||
| carla_msleep(100); | |||
| else | |||
| return false; | |||
| @@ -1717,9 +1703,9 @@ bool CarlaPlugin::waitForOscGuiShow() | |||
| #ifndef BUILD_BRIDGE | |||
| void CarlaPlugin::sendMidiSingleNote(const uint8_t channel, const uint8_t note, const uint8_t velo, const bool sendGui, const bool sendOsc, const bool sendCallback) | |||
| { | |||
| CARLA_ASSERT(channel < MAX_MIDI_CHANNELS); | |||
| CARLA_ASSERT(note < MAX_MIDI_NOTE); | |||
| CARLA_ASSERT(velo < MAX_MIDI_VALUE); | |||
| CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); | |||
| CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_NOTE,); | |||
| CARLA_SAFE_ASSERT_RETURN(velo < MAX_MIDI_VALUE,); | |||
| if (! pData->active) | |||
| return; | |||
| @@ -1929,54 +1915,34 @@ void CarlaPlugin::postRtEventsRun() | |||
| void CarlaPlugin::uiParameterChange(const uint32_t index, const float value) noexcept | |||
| { | |||
| CARLA_ASSERT(index < getParameterCount()); | |||
| CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(),); | |||
| return; | |||
| // unused | |||
| (void)index; | |||
| (void)value; | |||
| } | |||
| void CarlaPlugin::uiProgramChange(const uint32_t index) noexcept | |||
| { | |||
| CARLA_ASSERT(index < getProgramCount()); | |||
| return; | |||
| // unused | |||
| (void)index; | |||
| CARLA_SAFE_ASSERT_RETURN(index < getProgramCount(),); | |||
| } | |||
| void CarlaPlugin::uiMidiProgramChange(const uint32_t index) noexcept | |||
| { | |||
| CARLA_ASSERT(index < getMidiProgramCount()); | |||
| return; | |||
| // unused | |||
| (void)index; | |||
| CARLA_SAFE_ASSERT_RETURN(index < getMidiProgramCount(),); | |||
| } | |||
| void CarlaPlugin::uiNoteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) noexcept | |||
| { | |||
| CARLA_ASSERT(channel < MAX_MIDI_CHANNELS); | |||
| CARLA_ASSERT(note < MAX_MIDI_NOTE); | |||
| CARLA_ASSERT(velo > 0 && velo < MAX_MIDI_VALUE); | |||
| return; | |||
| // unused | |||
| (void)channel; | |||
| (void)note; | |||
| (void)velo; | |||
| CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); | |||
| CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_NOTE,); | |||
| CARLA_SAFE_ASSERT_RETURN(velo > 0 && velo < MAX_MIDI_VALUE,); | |||
| } | |||
| void CarlaPlugin::uiNoteOff(const uint8_t channel, const uint8_t note) noexcept | |||
| { | |||
| CARLA_ASSERT(channel < MAX_MIDI_CHANNELS); | |||
| CARLA_ASSERT(note < MAX_MIDI_NOTE); | |||
| return; | |||
| // unused | |||
| (void)channel; | |||
| (void)note; | |||
| CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); | |||
| CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_NOTE,); | |||
| } | |||
| bool CarlaPlugin::canRunInRack() const noexcept | |||
| @@ -68,7 +68,7 @@ CarlaPluginThread::~CarlaPluginThread() | |||
| void CarlaPluginThread::setMode(const CarlaPluginThread::Mode mode) | |||
| { | |||
| CARLA_ASSERT(! isRunning()); | |||
| CARLA_SAFE_ASSERT(! isThreadRunning()); | |||
| carla_debug("CarlaPluginThread::setMode(%s)", PluginThreadMode2str(mode)); | |||
| fMode = mode; | |||
| @@ -76,7 +76,7 @@ void CarlaPluginThread::setMode(const CarlaPluginThread::Mode mode) | |||
| void CarlaPluginThread::setOscData(const char* const binary, const char* const label, const char* const extra1, const char* const extra2) | |||
| { | |||
| CARLA_ASSERT(! isRunning()); | |||
| CARLA_SAFE_ASSERT(! isThreadRunning()); | |||
| carla_debug("CarlaPluginThread::setOscData(\"%s\", \"%s\", \"%s\", \"%s\")", binary, label, extra1, extra2); | |||
| fBinary = binary; | |||
| @@ -226,12 +226,12 @@ void CarlaPluginThread::run() | |||
| { | |||
| //fProcess->waitForFinished(-1); | |||
| while (fProcess->state() != QProcess::NotRunning && ! shouldExit()) | |||
| while (fProcess->state() != QProcess::NotRunning && ! shouldThreadExit()) | |||
| carla_sleep(1); | |||
| // we only get here if UI was closed or thread asked to exit | |||
| if (fProcess->state() != QProcess::NotRunning && shouldExit()) | |||
| if (fProcess->state() != QProcess::NotRunning && shouldThreadExit()) | |||
| { | |||
| fProcess->waitForFinished(static_cast<int>(fEngine->getOptions().uiBridgesTimeout)); | |||
| @@ -255,7 +255,7 @@ void CarlaPluginThread::run() | |||
| else | |||
| { | |||
| fProcess->close(); | |||
| CARLA_ASSERT(fProcess->state() == QProcess::NotRunning); | |||
| CARLA_SAFE_ASSERT(fProcess->state() == QProcess::NotRunning); | |||
| if (fProcess->exitCode() != 0 || fProcess->exitStatus() == QProcess::CrashExit) | |||
| carla_stderr("CarlaPluginThread::run() - GUI crashed while opening"); | |||
| @@ -269,12 +269,12 @@ void CarlaPluginThread::run() | |||
| case PLUGIN_THREAD_BRIDGE: | |||
| //fProcess->waitForFinished(-1); | |||
| while (fProcess->state() != QProcess::NotRunning && ! shouldExit()) | |||
| while (fProcess->state() != QProcess::NotRunning && ! shouldThreadExit()) | |||
| carla_sleep(1); | |||
| // we only get here if bridge crashed or thread asked to exit | |||
| if (shouldExit()) | |||
| if (shouldThreadExit()) | |||
| { | |||
| fProcess->waitForFinished(500); | |||
| @@ -64,7 +64,7 @@ public: | |||
| { | |||
| showCustomUI(false); | |||
| pData->osc.thread.stop(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| pData->osc.thread.stopThread(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| } | |||
| pData->singleMutex.lock(); | |||
| @@ -386,7 +386,7 @@ public: | |||
| if (yesNo) | |||
| { | |||
| pData->osc.data.free(); | |||
| pData->osc.thread.start(); | |||
| pData->osc.thread.startThread(); | |||
| } | |||
| else | |||
| { | |||
| @@ -399,7 +399,7 @@ public: | |||
| pData->osc.data.free(); | |||
| } | |||
| pData->osc.thread.stop(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| pData->osc.thread.stopThread(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| } | |||
| } | |||
| @@ -403,7 +403,7 @@ public: | |||
| if (fUi.type == UI::TYPE_OSC) | |||
| { | |||
| pData->osc.thread.stop(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| pData->osc.thread.stopThread(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| } | |||
| else | |||
| { | |||
| @@ -1077,7 +1077,7 @@ public: | |||
| if (yesNo) | |||
| { | |||
| pData->osc.data.free(); | |||
| pData->osc.thread.start(); | |||
| pData->osc.thread.startThread(); | |||
| } | |||
| else | |||
| { | |||
| @@ -1088,7 +1088,7 @@ public: | |||
| pData->osc.data.free(); | |||
| } | |||
| pData->osc.thread.stop(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| pData->osc.thread.stopThread(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| } | |||
| return; | |||
| } | |||
| @@ -91,7 +91,7 @@ public: | |||
| showCustomUI(false); | |||
| if (fUi.isOsc) | |||
| pData->osc.thread.stop(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| pData->osc.thread.stopThread(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| } | |||
| pData->singleMutex.lock(); | |||
| @@ -391,7 +391,7 @@ public: | |||
| if (yesNo) | |||
| { | |||
| pData->osc.data.free(); | |||
| pData->osc.thread.start(); | |||
| pData->osc.thread.startThread(); | |||
| } | |||
| else | |||
| { | |||
| @@ -404,7 +404,7 @@ public: | |||
| pData->osc.data.free(); | |||
| } | |||
| pData->osc.thread.stop(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| pData->osc.thread.stopThread(static_cast<int>(pData->engine->getOptions().uiBridgesTimeout * 2)); | |||
| } | |||
| return; | |||
| } | |||
| @@ -36,7 +36,7 @@ public: | |||
| NativePluginClass(const NativeHostDescriptor* const host) | |||
| : pHost(host) | |||
| { | |||
| CARLA_ASSERT(host != nullptr); | |||
| CARLA_SAFE_ASSERT(host != nullptr); | |||
| } | |||
| virtual ~NativePluginClass() | |||
| @@ -129,7 +129,7 @@ public: | |||
| ~AudioFileThread() override | |||
| { | |||
| CARLA_ASSERT(! isRunning()); | |||
| CARLA_ASSERT(! isThreadRunning()); | |||
| if (fFilePtr != nullptr) | |||
| ad_close(fFilePtr); | |||
| @@ -140,13 +140,13 @@ public: | |||
| void startNow() | |||
| { | |||
| fNeedsRead = true; | |||
| start(); | |||
| startThread(); | |||
| } | |||
| void stopNow() | |||
| { | |||
| fNeedsRead = false; | |||
| stop(1000); | |||
| stopThread(1000); | |||
| const CarlaMutex::ScopedLocker sl(fMutex); | |||
| fPool.reset(); | |||
| @@ -164,7 +164,7 @@ public: | |||
| bool loadFilename(const char* const filename) | |||
| { | |||
| CARLA_ASSERT(! isRunning()); | |||
| CARLA_ASSERT(! isThreadRunning()); | |||
| CARLA_ASSERT(filename != nullptr); | |||
| fPool.startFrame = 0; | |||
| @@ -351,7 +351,7 @@ public: | |||
| protected: | |||
| void run() override | |||
| { | |||
| while (! shouldExit()) | |||
| while (! shouldThreadExit()) | |||
| { | |||
| const uint64_t lastFrame(kPlayer->getLastFrame()); | |||
| @@ -412,7 +412,7 @@ public: | |||
| protected: | |||
| void run() override | |||
| { | |||
| while (! shouldExit()) | |||
| while (! shouldThreadExit()) | |||
| { | |||
| #ifdef WANT_ZYNADDSUBFX_UI | |||
| Fl::lock(); | |||
| @@ -511,7 +511,7 @@ protected: | |||
| } | |||
| #ifdef WANT_ZYNADDSUBFX_UI | |||
| if (shouldExit() || fUi != nullptr) | |||
| if (shouldThreadExit() || fUi != nullptr) | |||
| { | |||
| Fl::lock(); | |||
| delete fUi; | |||
| @@ -550,7 +550,7 @@ public: | |||
| fIsActive(false), | |||
| fThread(fMaster, host) | |||
| { | |||
| fThread.start(); | |||
| fThread.startThread(); | |||
| for (int i = 0; i < NUM_MIDI_PARTS; ++i) | |||
| fMaster->partonoff(i, 1); | |||
| @@ -736,7 +736,7 @@ protected: | |||
| { | |||
| fMaster = new Master(); | |||
| fThread.setMaster(fMaster); | |||
| fThread.start(); | |||
| fThread.startThread(); | |||
| for (int i = 0; i < NUM_MIDI_PARTS; ++i) | |||
| fMaster->partonoff(i, 1); | |||
| @@ -747,7 +747,7 @@ protected: | |||
| //ensure that everything has stopped | |||
| pthread_mutex_lock(&fMaster->mutex); | |||
| pthread_mutex_unlock(&fMaster->mutex); | |||
| fThread.stop(-1); | |||
| fThread.stopThread(-1); | |||
| delete fMaster; | |||
| fMaster = nullptr; | |||
| @@ -24,6 +24,7 @@ | |||
| #include "CarlaLadspaUtils.hpp" | |||
| // #include "CarlaLibUtils.hpp" | |||
| // #include "CarlaLv2Utils.hpp" | |||
| #include "CarlaMathUtils.hpp" | |||
| #include "CarlaOscUtils.hpp" | |||
| #include "CarlaPipeUtils.hpp" | |||
| // #include "CarlaShmUtils.hpp" | |||
| @@ -431,7 +431,7 @@ const char* getPluginTypeAsString(const PluginType type) noexcept | |||
| } | |||
| static inline | |||
| PluginType getPluginTypeFromString(const char* const ctype) | |||
| PluginType getPluginTypeFromString(const char* const ctype) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(ctype != nullptr && ctype[0] != '\0', PLUGIN_NONE); | |||
| carla_debug("CarlaBackend::getPluginTypeFromString(\"%s\")", ctype); | |||
| @@ -475,7 +475,7 @@ PluginType getPluginTypeFromString(const char* const ctype) | |||
| // ----------------------------------------------------------------------- | |||
| static inline | |||
| PluginCategory getPluginCategoryFromName(const char* const name) | |||
| PluginCategory getPluginCategoryFromName(const char* const name) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', PLUGIN_CATEGORY_NONE); | |||
| carla_debug("CarlaBackend::getPluginCategoryFromName(\"%s\")", name); | |||
| @@ -39,7 +39,7 @@ public: | |||
| ~CarlaExternalUI() override | |||
| { | |||
| CARLA_ASSERT_INT(fUiState == UiNone, fUiState); | |||
| CARLA_SAFE_ASSERT_INT(fUiState == UiNone, fUiState); | |||
| } | |||
| UiState getAndResetUiState() noexcept | |||
| @@ -1,7 +1,7 @@ | |||
| /* | |||
| * Carla misc utils based on Juce | |||
| * Copyright (C) 2013 Raw Material Software Ltd. | |||
| * Copyright (C) 2013 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2013-2014 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -71,7 +71,7 @@ public: | |||
| LeakedObjectDetector() noexcept { ++(getCounter().numObjects); } | |||
| LeakedObjectDetector(const LeakedObjectDetector&) noexcept { ++(getCounter().numObjects); } | |||
| ~LeakedObjectDetector() | |||
| ~LeakedObjectDetector() noexcept | |||
| { | |||
| if (--(getCounter().numObjects) < 0) | |||
| { | |||
| @@ -100,7 +100,7 @@ private: | |||
| numObjects = 0; | |||
| } | |||
| ~LeakCounter() | |||
| ~LeakCounter() noexcept | |||
| { | |||
| if (numObjects > 0) | |||
| { | |||
| @@ -115,10 +115,11 @@ private: | |||
| } | |||
| } | |||
| // this should be an atomic... | |||
| volatile int numObjects; | |||
| }; | |||
| static const char* getLeakedObjectClassName() | |||
| static const char* getLeakedObjectClassName() noexcept | |||
| { | |||
| return OwnerClass::getLeakedObjectClassName(); | |||
| } | |||
| @@ -161,8 +162,9 @@ class ScopedValueSetter | |||
| public: | |||
| /** Creates a ScopedValueSetter that will immediately change the specified value to the | |||
| given new value, and will then reset it to its original value when this object is deleted. | |||
| Must be used only for 'noexcept' compatible types. | |||
| */ | |||
| ScopedValueSetter(ValueType& valueToSet, ValueType newValue) | |||
| ScopedValueSetter(ValueType& valueToSet, ValueType newValue) noexcept | |||
| : value(valueToSet), | |||
| originalValue(valueToSet) | |||
| { | |||
| @@ -172,14 +174,14 @@ public: | |||
| /** Creates a ScopedValueSetter that will immediately change the specified value to the | |||
| given new value, and will then reset it to be valueWhenDeleted when this object is deleted. | |||
| */ | |||
| ScopedValueSetter(ValueType& valueToSet, ValueType newValue, ValueType valueWhenDeleted) | |||
| ScopedValueSetter(ValueType& valueToSet, ValueType newValue, ValueType valueWhenDeleted) noexcept | |||
| : value(valueToSet), | |||
| originalValue(valueWhenDeleted) | |||
| { | |||
| valueToSet = newValue; | |||
| } | |||
| ~ScopedValueSetter() | |||
| ~ScopedValueSetter() noexcept | |||
| { | |||
| value = originalValue; | |||
| } | |||
| @@ -64,7 +64,7 @@ const T& carla_max(const T& v1, const T& v2, const T& max) noexcept | |||
| } | |||
| /* | |||
| * Fix bounds of 'value', between 'min' and 'max'. | |||
| * Fix bounds of 'value' between 'min' and 'max'. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| @@ -79,64 +79,6 @@ const T& carla_fixValue(const T& min, const T& max, const T& value) noexcept | |||
| return value; | |||
| } | |||
| /* | |||
| * Add array values to another array. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| void carla_add(T* dataDst, T* dataSrc, const size_t size) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(size > 0,); | |||
| for (size_t i=0; i < size; ++i) | |||
| *dataDst++ += *dataSrc++; | |||
| } | |||
| /* | |||
| * Add array values to another array. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| void carla_add(T* dataDst, const T* dataSrc, const size_t size) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(size > 0,); | |||
| for (size_t i=0; i < size; ++i) | |||
| *dataDst++ += *dataSrc++; | |||
| } | |||
| /* | |||
| * Copy array values to another array. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| void carla_copy(T* dataDst, T* dataSrc, const size_t size) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(size > 0,); | |||
| std::memcpy(dataDst, dataSrc, size*sizeof(T)); | |||
| } | |||
| /* | |||
| * Copy array values to another array. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| void carla_copy(T* dataDst, const T* dataSrc, const size_t size) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(size > 0,); | |||
| std::memcpy(dataDst, dataSrc, size*sizeof(T)); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // math functions (extended) | |||
| @@ -567,6 +567,7 @@ public: | |||
| /* | |||
| * Return a duplicate string buffer. | |||
| * May throw. | |||
| */ | |||
| const char* dup() const | |||
| { | |||
| @@ -30,7 +30,7 @@ protected: | |||
| /* | |||
| * Constructor. | |||
| */ | |||
| CarlaThread(const char* const threadName = nullptr) | |||
| CarlaThread(const char* const threadName = nullptr) noexcept | |||
| : fName(threadName), | |||
| fShouldExit(false) | |||
| { | |||
| @@ -40,11 +40,11 @@ protected: | |||
| /* | |||
| * Destructor. | |||
| */ | |||
| virtual ~CarlaThread() | |||
| virtual ~CarlaThread() noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT(! isRunning()); | |||
| CARLA_SAFE_ASSERT(! isThreadRunning()); | |||
| stop(-1); | |||
| stopThread(-1); | |||
| } | |||
| /* | |||
| @@ -56,7 +56,7 @@ public: | |||
| /* | |||
| * Check if the thread is running. | |||
| */ | |||
| bool isRunning() const noexcept | |||
| bool isThreadRunning() const noexcept | |||
| { | |||
| #ifdef CARLA_OS_WIN | |||
| return (fHandle.p != nullptr); | |||
| @@ -68,7 +68,7 @@ public: | |||
| /* | |||
| * Check if the thread should exit. | |||
| */ | |||
| bool shouldExit() const noexcept | |||
| bool shouldThreadExit() const noexcept | |||
| { | |||
| return fShouldExit; | |||
| } | |||
| @@ -76,9 +76,9 @@ public: | |||
| /* | |||
| * Start the thread. | |||
| */ | |||
| void start() | |||
| void startThread() noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(! isRunning(),); | |||
| CARLA_SAFE_ASSERT_RETURN(! isThreadRunning(),); | |||
| const CarlaMutex::ScopedLocker sl(fLock); | |||
| @@ -108,24 +108,24 @@ public: | |||
| /* | |||
| * Stop the thread. | |||
| * In the 'timeOutMilliseconds': | |||
| * =0 -> no wait | |||
| * >0 -> wait timeout value | |||
| * <0 -> wait forever | |||
| * = 0 -> no wait | |||
| * > 0 -> wait timeout value | |||
| * < 0 -> wait forever | |||
| */ | |||
| bool stop(const int timeOutMilliseconds) | |||
| bool stopThread(const int timeOutMilliseconds) noexcept | |||
| { | |||
| const CarlaMutex::ScopedLocker sl(fLock); | |||
| if (isRunning()) | |||
| if (isThreadRunning()) | |||
| { | |||
| signalShouldExit(); | |||
| signalThreadShouldExit(); | |||
| if (timeOutMilliseconds != 0) | |||
| { | |||
| // Wait for the thread to stop | |||
| int timeOutCheck = (timeOutMilliseconds == 1 || timeOutMilliseconds == -1) ? timeOutMilliseconds : timeOutMilliseconds/2; | |||
| while (isRunning()) | |||
| while (isThreadRunning()) | |||
| { | |||
| carla_msleep(2); | |||
| @@ -139,7 +139,7 @@ public: | |||
| } | |||
| } | |||
| if (isRunning()) | |||
| if (isThreadRunning()) | |||
| { | |||
| // should never happen! | |||
| carla_stderr2("Carla assertion failure: \"! isRunning()\" in file %s, line %i", __FILE__, __LINE__); | |||
| @@ -147,7 +147,10 @@ public: | |||
| pthread_t threadId = *(const_cast<pthread_t*>(&fHandle)); | |||
| _init(); | |||
| pthread_cancel(threadId); | |||
| try { | |||
| pthread_cancel(threadId); | |||
| } catch(...) {} | |||
| return false; | |||
| } | |||
| } | |||
| @@ -158,7 +161,7 @@ public: | |||
| /* | |||
| * Tell the thread to stop as soon as possible. | |||
| */ | |||
| void signalShouldExit() noexcept | |||
| void signalThreadShouldExit() noexcept | |||
| { | |||
| fShouldExit = true; | |||
| } | |||
| @@ -179,18 +182,20 @@ private: | |||
| #endif | |||
| } | |||
| void _runEntryPoint() | |||
| void _runEntryPoint() noexcept | |||
| { | |||
| // report ready | |||
| fLock.unlock(); | |||
| run(); | |||
| try { | |||
| run(); | |||
| } catch(...) {} | |||
| // done | |||
| _init(); | |||
| } | |||
| static void* _entryPoint(void* userData) | |||
| static void* _entryPoint(void* userData) noexcept | |||
| { | |||
| static_cast<CarlaThread*>(userData)->_runEntryPoint(); | |||
| return nullptr; | |||
| @@ -174,30 +174,34 @@ void carla_safe_assert_uint2(const char* const assertion, const char* const file | |||
| * Sleep for 'secs' seconds. | |||
| */ | |||
| static inline | |||
| void carla_sleep(const unsigned int secs) | |||
| void carla_sleep(const unsigned int secs) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(secs > 0,); | |||
| try { | |||
| #ifdef CARLA_OS_WIN | |||
| ::Sleep(secs * 1000); | |||
| #else | |||
| ::sleep(secs); | |||
| #endif | |||
| } catch(...) {} | |||
| } | |||
| /* | |||
| * Sleep for 'msecs' milliseconds. | |||
| */ | |||
| static inline | |||
| void carla_msleep(const unsigned int msecs) | |||
| void carla_msleep(const unsigned int msecs) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(msecs > 0,); | |||
| try { | |||
| #ifdef CARLA_OS_WIN | |||
| ::Sleep(msecs); | |||
| #else | |||
| ::usleep(msecs * 1000); | |||
| #endif | |||
| } catch(...) {} | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -213,7 +217,9 @@ void carla_setenv(const char* const key, const char* const value) noexcept | |||
| CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | |||
| #ifdef CARLA_OS_WIN | |||
| ::SetEnvironmentVariableA(key, value); | |||
| try { | |||
| ::SetEnvironmentVariableA(key, value); | |||
| } catch(...) {} | |||
| #else | |||
| ::setenv(key, value, 1); | |||
| #endif | |||
| @@ -225,6 +231,7 @@ void carla_setenv(const char* const key, const char* const value) noexcept | |||
| /* | |||
| * Custom 'strdup' function. | |||
| * Return value is always valid, and must be freed with "delete[] var". | |||
| * May throw. | |||
| */ | |||
| static inline | |||
| const char* carla_strdup(const char* const strBuf) | |||
| @@ -246,6 +253,7 @@ const char* carla_strdup(const char* const strBuf) | |||
| * Custom 'strdup' function. | |||
| * Calls "std::free(strBuf)". | |||
| * Return value is always valid, and must be freed with "delete[] var". | |||
| * May throw. | |||
| */ | |||
| static inline | |||
| const char* carla_strdup_free(char* const strBuf) | |||
| @@ -258,6 +266,68 @@ const char* carla_strdup_free(char* const strBuf) | |||
| // ----------------------------------------------------------------------- | |||
| // memory functions | |||
| #if 0 | |||
| /* | |||
| * Add array values to another array. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| void carla_add(T* dataDst, T* dataSrc, const size_t size) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(size > 0,); | |||
| for (size_t i=0; i < size; ++i) | |||
| *dataDst++ += *dataSrc++; | |||
| } | |||
| #endif | |||
| /* | |||
| * Add array values to another array. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| void carla_add(T* dataDst, const T* dataSrc, const size_t size) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(size > 0,); | |||
| for (size_t i=0; i < size; ++i) | |||
| *dataDst++ += *dataSrc++; | |||
| } | |||
| #if 0 | |||
| /* | |||
| * Copy array values to another array. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| void carla_copy(T* dataDst, T* dataSrc, const size_t size) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(size > 0,); | |||
| std::memcpy(dataDst, dataSrc, size*sizeof(T)); | |||
| } | |||
| #endif | |||
| /* | |||
| * Copy array values to another array. | |||
| */ | |||
| template<typename T> | |||
| static inline | |||
| void carla_copy(T* dataDst, const T* dataSrc, const size_t size) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(dataDst != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(dataSrc != nullptr,); | |||
| CARLA_SAFE_ASSERT_RETURN(size > 0,); | |||
| std::memcpy(dataDst, dataSrc, size*sizeof(T)); | |||
| } | |||
| /* | |||
| * Fill an array with a fixed value. | |||
| */ | |||
| @@ -326,7 +396,7 @@ void carla_zeroStruct(T& structure) noexcept | |||
| } | |||
| /* | |||
| * Clear an array of struct/class. | |||
| * Clear an array of struct/classes. | |||
| */ | |||
| template <typename T> | |||
| static inline | |||
| @@ -349,7 +419,7 @@ void carla_copyStruct(T& struct1, const T& struct2) noexcept | |||
| } | |||
| /* | |||
| * Copy an array of struct/class. | |||
| * Copy an array of struct/classes. | |||
| */ | |||
| template <typename T> | |||
| static inline | |||
| @@ -65,7 +65,7 @@ protected: | |||
| public: | |||
| virtual ~AbstractLinkedList() | |||
| { | |||
| CARLA_ASSERT(fCount == 0); | |||
| CARLA_SAFE_ASSERT(fCount == 0); | |||
| } | |||
| class Itenerator { | |||
| @@ -76,9 +76,9 @@ public: | |||
| fEntry2(fEntry->next), | |||
| fQueue(queue) | |||
| { | |||
| CARLA_ASSERT(fEntry != nullptr); | |||
| CARLA_ASSERT(fEntry2 != nullptr); | |||
| CARLA_ASSERT(fQueue != nullptr); | |||
| CARLA_SAFE_ASSERT(fEntry != nullptr); | |||
| CARLA_SAFE_ASSERT(fEntry2 != nullptr); | |||
| CARLA_SAFE_ASSERT(fQueue != nullptr); | |||
| } | |||
| bool valid() const noexcept | |||
| @@ -95,7 +95,7 @@ public: | |||
| T& getValue() noexcept | |||
| { | |||
| fData = list_entry(fEntry, Data, siblings); | |||
| CARLA_ASSERT(fData != nullptr); | |||
| CARLA_SAFE_ASSERT(fData != nullptr); | |||
| return fData->value; | |||
| } | |||
| @@ -77,7 +77,7 @@ public: | |||
| } | |||
| rtsafe_memory_pool_create(&fHandle, nullptr, fDataSize, minPreallocated, maxPreallocated); | |||
| CARLA_ASSERT(fHandle != nullptr); | |||
| CARLA_SAFE_ASSERT(fHandle != nullptr); | |||
| } | |||
| bool operator==(const Pool& pool) const noexcept | |||
| @@ -132,14 +132,14 @@ public: | |||
| void spliceAppend(RtLinkedList& list, const bool init = true) | |||
| { | |||
| CARLA_ASSERT(fMemPool == list.fMemPool); | |||
| CARLA_SAFE_ASSERT_RETURN(fMemPool == list.fMemPool,); | |||
| AbstractLinkedList<T>::spliceAppend(list, init); | |||
| } | |||
| void spliceInsert(RtLinkedList& list, const bool init = true) | |||
| { | |||
| CARLA_ASSERT(fMemPool == list.fMemPool); | |||
| CARLA_SAFE_ASSERT_RETURN(fMemPool == list.fMemPool,); | |||
| AbstractLinkedList<T>::spliceInsert(list, init); | |||
| } | |||