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