| @@ -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); | |||
| @@ -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<uint32_t>(sizeof(BridgeNonRtClientData))); | |||
| fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtServerData))); | |||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetBufferSize); | |||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientInitialSetup); | |||
| fShmNonRtClientControl.writeUInt(pData->engine->getBufferSize()); | |||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetSampleRate); | |||
| fShmNonRtClientControl.writeDouble(pData->engine->getSampleRate()); | |||
| fShmNonRtClientControl.commitWrite(); | |||
| @@ -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<uint32_t>(sizeof(BridgeNonRtClientData))); | |||
| fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtServerData))); | |||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetBufferSize); | |||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientInitialSetup); | |||
| fShmNonRtClientControl.writeUInt(pData->engine->getBufferSize()); | |||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetSampleRate); | |||
| fShmNonRtClientControl.writeDouble(pData->engine->getSampleRate()); | |||
| fShmNonRtClientControl.commitWrite(); | |||
| @@ -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<JackClientState*>::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<JackClientState*>::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<JackClientState*>::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<JackClientState*>::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: | |||
| @@ -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 | |||
| @@ -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: | |||