diff --git a/source/backend/engine/CarlaEngineBridge.cpp b/source/backend/engine/CarlaEngineBridge.cpp index eefa8d0c6..4e8cc63e2 100644 --- a/source/backend/engine/CarlaEngineBridge.cpp +++ b/source/backend/engine/CarlaEngineBridge.cpp @@ -181,13 +181,16 @@ public: CARLA_SAFE_ASSERT_INT2(shmNonRtServerDataSize == sizeof(BridgeNonRtServerData), shmNonRtServerDataSize, sizeof(BridgeNonRtServerData)); opcode = fShmNonRtClientControl.readOpcode(); - CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetBufferSize, opcode); + CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientInitialSetup, opcode); pData->bufferSize = fShmNonRtClientControl.readUInt(); - - opcode = fShmNonRtClientControl.readOpcode(); - CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetSampleRate, opcode); pData->sampleRate = fShmNonRtClientControl.readDouble(); + if (pData->bufferSize == 0 || carla_isZero(pData->sampleRate)) + { + carla_stderr2("CarlaEngineBridge: invalid empty state"); + return false; + } + pData->initTime(nullptr); if (shmRtClientDataSize != sizeof(BridgeRtClientData) || shmNonRtClientDataSize != sizeof(BridgeNonRtClientData) || shmNonRtServerDataSize != sizeof(BridgeNonRtServerData)) @@ -208,7 +211,7 @@ public: bool close() override { - carla_debug("CarlaEnginePlugin::close()"); + carla_debug("CarlaEngineBridge::close()"); fLastPingTime = -1; CarlaEngine::close(); @@ -678,28 +681,10 @@ public: plugin->setActive(false, false, false); break; - case kPluginBridgeNonRtClientSetBufferSize: { - const uint32_t bufferSize(fShmNonRtClientControl.readUInt()); - pData->bufferSize = bufferSize; - bufferSizeChanged(bufferSize); - break; - } - - case kPluginBridgeNonRtClientSetSampleRate: { - const double sampleRate(fShmNonRtClientControl.readDouble()); - pData->sampleRate = sampleRate; - sampleRateChanged(sampleRate); - break; - } - - case kPluginBridgeNonRtClientSetOffline: - fIsOffline = true; - offlineModeChanged(true); - break; - - case kPluginBridgeNonRtClientSetOnline: - fIsOffline = false; - offlineModeChanged(false); + case kPluginBridgeNonRtClientInitialSetup: + // should never happen!! + fShmNonRtServerControl.readUInt(); + fShmNonRtServerControl.readDouble(); break; case kPluginBridgeNonRtClientSetParameterValue: { @@ -1002,6 +987,25 @@ protected: break; } + case kPluginBridgeRtClientSetBufferSize: { + const uint32_t bufferSize(fShmRtClientControl.readUInt()); + pData->bufferSize = bufferSize; + bufferSizeChanged(bufferSize); + break; + } + + case kPluginBridgeRtClientSetSampleRate: { + const double sampleRate(fShmRtClientControl.readDouble()); + pData->sampleRate = sampleRate; + sampleRateChanged(sampleRate); + break; + } + + case kPluginBridgeRtClientSetOnline: + fIsOffline = fShmRtClientControl.readBool(); + offlineModeChanged(fIsOffline); + break; + case kPluginBridgeRtClientControlEventParameter: { const uint32_t time(fShmRtClientControl.readUInt()); const uint8_t channel(fShmRtClientControl.readByte()); @@ -1128,7 +1132,7 @@ protected: case kPluginBridgeRtClientProcess: { CARLA_SAFE_ASSERT_BREAK(fShmAudioPool.data != nullptr); - if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(false)) + if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(fIsOffline)) { const BridgeTimeInfo& bridgeTimeInfo(fShmRtClientControl.data->timeInfo); diff --git a/source/backend/plugin/CarlaPluginBridge.cpp b/source/backend/plugin/CarlaPluginBridge.cpp index 511db8804..d0c4e8774 100644 --- a/source/backend/plugin/CarlaPluginBridge.cpp +++ b/source/backend/plugin/CarlaPluginBridge.cpp @@ -1482,10 +1482,9 @@ public: resizeAudioPool(newBufferSize); { - const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); - fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetBufferSize); - fShmNonRtClientControl.writeUInt(newBufferSize); - fShmNonRtClientControl.commitWrite(); + fShmRtClientControl.writeOpcode(kPluginBridgeRtClientSetBufferSize); + fShmRtClientControl.writeUInt(newBufferSize); + fShmRtClientControl.commitWrite(); } //fProcWaitTime = newBufferSize*1000/pData->engine->getSampleRate(); @@ -1497,10 +1496,9 @@ public: void sampleRateChanged(const double newSampleRate) override { { - const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); - fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetSampleRate); - fShmNonRtClientControl.writeDouble(newSampleRate); - fShmNonRtClientControl.commitWrite(); + fShmRtClientControl.writeOpcode(kPluginBridgeRtClientSetSampleRate); + fShmRtClientControl.writeDouble(newSampleRate); + fShmRtClientControl.commitWrite(); } //fProcWaitTime = pData->engine->getBufferSize()*1000/newSampleRate; @@ -1512,9 +1510,9 @@ public: void offlineModeChanged(const bool isOffline) override { { - const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); - fShmNonRtClientControl.writeOpcode(isOffline ? kPluginBridgeNonRtClientSetOffline : kPluginBridgeNonRtClientSetOnline); - fShmNonRtClientControl.commitWrite(); + fShmRtClientControl.writeOpcode(kPluginBridgeRtClientSetOnline); + fShmRtClientControl.writeBool(isOffline); + fShmRtClientControl.commitWrite(); } waitForClient("offline", 1000); @@ -2168,10 +2166,8 @@ public: fShmNonRtClientControl.writeUInt(static_cast(sizeof(BridgeNonRtClientData))); fShmNonRtClientControl.writeUInt(static_cast(sizeof(BridgeNonRtServerData))); - fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetBufferSize); + fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientInitialSetup); fShmNonRtClientControl.writeUInt(pData->engine->getBufferSize()); - - fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetSampleRate); fShmNonRtClientControl.writeDouble(pData->engine->getSampleRate()); fShmNonRtClientControl.commitWrite(); diff --git a/source/backend/plugin/CarlaPluginJack.cpp b/source/backend/plugin/CarlaPluginJack.cpp index 2d4039c52..383bb7298 100644 --- a/source/backend/plugin/CarlaPluginJack.cpp +++ b/source/backend/plugin/CarlaPluginJack.cpp @@ -1034,10 +1034,9 @@ public: resizeAudioPool(newBufferSize); { - const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); - fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetBufferSize); - fShmNonRtClientControl.writeUInt(newBufferSize); - fShmNonRtClientControl.commitWrite(); + fShmRtClientControl.writeOpcode(kPluginBridgeRtClientSetBufferSize); + fShmRtClientControl.writeUInt(newBufferSize); + fShmRtClientControl.commitWrite(); } //fProcWaitTime = newBufferSize*1000/pData->engine->getSampleRate(); @@ -1049,10 +1048,9 @@ public: void sampleRateChanged(const double newSampleRate) override { { - const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); - fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetSampleRate); - fShmNonRtClientControl.writeDouble(newSampleRate); - fShmNonRtClientControl.commitWrite(); + fShmRtClientControl.writeOpcode(kPluginBridgeRtClientSetSampleRate); + fShmRtClientControl.writeDouble(newSampleRate); + fShmRtClientControl.commitWrite(); } //fProcWaitTime = pData->engine->getBufferSize()*1000/newSampleRate; @@ -1064,9 +1062,9 @@ public: void offlineModeChanged(const bool isOffline) override { { - const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); - fShmNonRtClientControl.writeOpcode(isOffline ? kPluginBridgeNonRtClientSetOffline : kPluginBridgeNonRtClientSetOnline); - fShmNonRtClientControl.commitWrite(); + fShmRtClientControl.writeOpcode(kPluginBridgeRtClientSetOnline); + fShmRtClientControl.writeBool(isOffline); + fShmRtClientControl.commitWrite(); } waitForClient("offline", 1000); @@ -1398,10 +1396,8 @@ private: fShmNonRtClientControl.writeUInt(static_cast(sizeof(BridgeNonRtClientData))); fShmNonRtClientControl.writeUInt(static_cast(sizeof(BridgeNonRtServerData))); - fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetBufferSize); + fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientInitialSetup); fShmNonRtClientControl.writeUInt(pData->engine->getBufferSize()); - - fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetSampleRate); fShmNonRtClientControl.writeDouble(pData->engine->getSampleRate()); fShmNonRtClientControl.commitWrite(); diff --git a/source/libjack/libjack.cpp b/source/libjack/libjack.cpp index 82b534fd6..2e235ae75 100644 --- a/source/libjack/libjack.cpp +++ b/source/libjack/libjack.cpp @@ -300,11 +300,8 @@ bool CarlaJackAppClient::initSharedMemmory() } opcode = fShmNonRtClientControl.readOpcode(); - CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetBufferSize, opcode); + CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientInitialSetup, opcode); fServer.bufferSize = fShmNonRtClientControl.readUInt(); - - opcode = fShmNonRtClientControl.readOpcode(); - CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetSampleRate, opcode); fServer.sampleRate = fShmNonRtClientControl.readDouble(); if (fServer.bufferSize == 0 || carla_isZero(fServer.sampleRate)) @@ -396,6 +393,56 @@ bool CarlaJackAppClient::handleRtData() break; } + case kPluginBridgeRtClientSetBufferSize: + if (const uint32_t newBufferSize = fShmRtClientControl.readUInt()) + { + if (fServer.bufferSize != newBufferSize) + { + const CarlaMutexLocker cml(fRealtimeThreadMutex); + + fServer.bufferSize = newBufferSize; + + for (LinkedList::Itenerator it = fClients.begin2(); it.valid(); it.next()) + { + JackClientState* const jclient(it.getValue(nullptr)); + CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr); + + jclient->bufferSizeCb(fServer.bufferSize, jclient->bufferSizeCbPtr); + } + + delete[] fAudioTmpBuf; + fAudioTmpBuf = new float[fServer.bufferSize]; + FloatVectorOperations::clear(fAudioTmpBuf, fServer.bufferSize); + } + } + break; + + case kPluginBridgeRtClientSetSampleRate: + if (const double newSampleRate = fShmRtClientControl.readDouble()) + { + if (fServer.sampleRate != newSampleRate) + { + const CarlaMutexLocker cml(fRealtimeThreadMutex); + + fServer.sampleRate = newSampleRate; + + for (LinkedList::Itenerator it = fClients.begin2(); it.valid(); it.next()) + { + JackClientState* const jclient(it.getValue(nullptr)); + CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr); + + jclient->sampleRateCb(fServer.sampleRate, jclient->sampleRateCbPtr); + } + } + } + break; + + case kPluginBridgeRtClientSetOnline: + // TODO inform changes + fIsOffline = fShmRtClientControl.readBool(); + //offlineModeChanged(fIsOffline); + break; + case kPluginBridgeRtClientControlEventParameter: case kPluginBridgeRtClientControlEventMidiBank: case kPluginBridgeRtClientControlEventMidiProgram: @@ -405,6 +452,7 @@ bool CarlaJackAppClient::handleRtData() break; case kPluginBridgeRtClientProcess: { + // FIXME - lock if offline const CarlaMutexTryLocker cmtl(fRealtimeThreadMutex); if (cmtl.wasLocked()) @@ -451,6 +499,7 @@ bool CarlaJackAppClient::handleRtData() JackClientState* const jclient(it.getValue(nullptr)); CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr); + // FIXME - lock if offline const CarlaMutexTryLocker cmtl2(jclient->mutex); // check if we can process @@ -636,60 +685,10 @@ bool CarlaJackAppClient::handleNonRtData() case kPluginBridgeNonRtClientDeactivate: break; - case kPluginBridgeNonRtClientSetBufferSize: - if (const uint32_t newBufferSize = fShmNonRtClientControl.readUInt()) - { - if (fServer.bufferSize != newBufferSize) - { - const CarlaMutexLocker cml(fRealtimeThreadMutex); - - fServer.bufferSize = newBufferSize; - - for (LinkedList::Itenerator it = fClients.begin2(); it.valid(); it.next()) - { - JackClientState* const jclient(it.getValue(nullptr)); - CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr); - - jclient->bufferSizeCb(fServer.bufferSize, jclient->bufferSizeCbPtr); - } - - delete[] fAudioTmpBuf; - fAudioTmpBuf = new float[fServer.bufferSize]; - FloatVectorOperations::clear(fAudioTmpBuf, fServer.bufferSize); - } - } - break; - - case kPluginBridgeNonRtClientSetSampleRate: - if (const double newSampleRate = fShmNonRtClientControl.readDouble()) - { - if (fServer.sampleRate != newSampleRate) - { - const CarlaMutexLocker cml(fRealtimeThreadMutex); - - fServer.sampleRate = newSampleRate; - - for (LinkedList::Itenerator it = fClients.begin2(); it.valid(); it.next()) - { - JackClientState* const jclient(it.getValue(nullptr)); - CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr); - - jclient->sampleRateCb(fServer.sampleRate, jclient->sampleRateCbPtr); - } - } - } - break; - - case kPluginBridgeNonRtClientSetOffline: - // TODO inform changes - fIsOffline = true; - //offlineModeChanged(true); - break; - - case kPluginBridgeNonRtClientSetOnline: - // TODO inform changes - fIsOffline = false; - //offlineModeChanged(false); + case kPluginBridgeNonRtClientInitialSetup: + // should never happen!! + fShmNonRtServerControl.readUInt(); + fShmNonRtServerControl.readDouble(); break; case kPluginBridgeNonRtClientSetParameterValue: diff --git a/source/utils/CarlaBridgeDefines.hpp b/source/utils/CarlaBridgeDefines.hpp index f7de62770..ecfe971a5 100644 --- a/source/utils/CarlaBridgeDefines.hpp +++ b/source/utils/CarlaBridgeDefines.hpp @@ -26,6 +26,9 @@ enum PluginBridgeRtClientOpcode { kPluginBridgeRtClientNull = 0, kPluginBridgeRtClientSetAudioPool, // ulong/ptr + kPluginBridgeRtClientSetBufferSize, // uint + kPluginBridgeRtClientSetSampleRate, // double + kPluginBridgeRtClientSetOnline, // bool kPluginBridgeRtClientControlEventParameter, // uint/frame, byte/chan, ushort, float kPluginBridgeRtClientControlEventMidiBank, // uint/frame, byte/chan, ushort kPluginBridgeRtClientControlEventMidiProgram, // uint/frame, byte/chan, ushort @@ -43,10 +46,7 @@ enum PluginBridgeNonRtClientOpcode { kPluginBridgeNonRtClientPingOnOff, // bool kPluginBridgeNonRtClientActivate, kPluginBridgeNonRtClientDeactivate, - kPluginBridgeNonRtClientSetBufferSize, // uint - kPluginBridgeNonRtClientSetSampleRate, // double - kPluginBridgeNonRtClientSetOffline, - kPluginBridgeNonRtClientSetOnline, + kPluginBridgeNonRtClientInitialSetup, // uint, double kPluginBridgeNonRtClientSetParameterValue, // uint, float kPluginBridgeNonRtClientSetParameterMidiChannel, // uint, byte kPluginBridgeNonRtClientSetParameterMidiCC, // uint, short diff --git a/source/utils/CarlaBridgeUtils.hpp b/source/utils/CarlaBridgeUtils.hpp index 615b12aff..fba3baeb7 100644 --- a/source/utils/CarlaBridgeUtils.hpp +++ b/source/utils/CarlaBridgeUtils.hpp @@ -43,6 +43,12 @@ const char* PluginBridgeRtClientOpcode2str(const PluginBridgeRtClientOpcode opco return "kPluginBridgeRtClientNull"; case kPluginBridgeRtClientSetAudioPool: return "kPluginBridgeRtClientSetAudioPool"; + case kPluginBridgeRtClientSetBufferSize: + return "kPluginBridgeRtClientSetBufferSize"; + case kPluginBridgeRtClientSetSampleRate: + return "kPluginBridgeRtClientSetSampleRate"; + case kPluginBridgeRtClientSetOnline: + return "kPluginBridgeRtClientSetOnline"; case kPluginBridgeRtClientControlEventParameter: return "kPluginBridgeRtClientControlEventParameter"; case kPluginBridgeRtClientControlEventMidiBank: @@ -80,14 +86,8 @@ const char* PluginBridgeNonRtClientOpcode2str(const PluginBridgeNonRtClientOpcod return "kPluginBridgeNonRtClientActivate"; case kPluginBridgeNonRtClientDeactivate: return "kPluginBridgeNonRtClientDeactivate"; - case kPluginBridgeNonRtClientSetBufferSize: - return "kPluginBridgeNonRtClientSetBufferSize"; - case kPluginBridgeNonRtClientSetSampleRate: - return "kPluginBridgeNonRtClientSetSampleRate"; - case kPluginBridgeNonRtClientSetOffline: - return "kPluginBridgeNonRtClientSetOffline"; - case kPluginBridgeNonRtClientSetOnline: - return "kPluginBridgeNonRtClientSetOnline"; + case kPluginBridgeNonRtClientInitialSetup: + return "kPluginBridgeNonRtClientInitialSetup"; case kPluginBridgeNonRtClientSetParameterValue: return "kPluginBridgeNonRtClientSetParameterValue"; case kPluginBridgeNonRtClientSetParameterMidiChannel: