Browse Source

bridges: audio setup changes need to happen on audio thread

tags/1.9.8
falkTX 7 years ago
parent
commit
88b7b55b76
6 changed files with 121 additions and 126 deletions
  1. +32
    -28
      source/backend/engine/CarlaEngineBridge.cpp
  2. +10
    -14
      source/backend/plugin/CarlaPluginBridge.cpp
  3. +10
    -14
      source/backend/plugin/CarlaPluginJack.cpp
  4. +57
    -58
      source/libjack/libjack.cpp
  5. +4
    -4
      source/utils/CarlaBridgeDefines.hpp
  6. +8
    -8
      source/utils/CarlaBridgeUtils.hpp

+ 32
- 28
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -181,13 +181,16 @@ public:
CARLA_SAFE_ASSERT_INT2(shmNonRtServerDataSize == sizeof(BridgeNonRtServerData), shmNonRtServerDataSize, sizeof(BridgeNonRtServerData)); CARLA_SAFE_ASSERT_INT2(shmNonRtServerDataSize == sizeof(BridgeNonRtServerData), shmNonRtServerDataSize, sizeof(BridgeNonRtServerData));


opcode = fShmNonRtClientControl.readOpcode(); opcode = fShmNonRtClientControl.readOpcode();
CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetBufferSize, opcode);
CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientInitialSetup, opcode);
pData->bufferSize = fShmNonRtClientControl.readUInt(); pData->bufferSize = fShmNonRtClientControl.readUInt();

opcode = fShmNonRtClientControl.readOpcode();
CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetSampleRate, opcode);
pData->sampleRate = fShmNonRtClientControl.readDouble(); pData->sampleRate = fShmNonRtClientControl.readDouble();


if (pData->bufferSize == 0 || carla_isZero(pData->sampleRate))
{
carla_stderr2("CarlaEngineBridge: invalid empty state");
return false;
}

pData->initTime(nullptr); pData->initTime(nullptr);


if (shmRtClientDataSize != sizeof(BridgeRtClientData) || shmNonRtClientDataSize != sizeof(BridgeNonRtClientData) || shmNonRtServerDataSize != sizeof(BridgeNonRtServerData)) if (shmRtClientDataSize != sizeof(BridgeRtClientData) || shmNonRtClientDataSize != sizeof(BridgeNonRtClientData) || shmNonRtServerDataSize != sizeof(BridgeNonRtServerData))
@@ -208,7 +211,7 @@ public:


bool close() override bool close() override
{ {
carla_debug("CarlaEnginePlugin::close()");
carla_debug("CarlaEngineBridge::close()");
fLastPingTime = -1; fLastPingTime = -1;


CarlaEngine::close(); CarlaEngine::close();
@@ -678,28 +681,10 @@ public:
plugin->setActive(false, false, false); plugin->setActive(false, false, false);
break; 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; break;


case kPluginBridgeNonRtClientSetParameterValue: { case kPluginBridgeNonRtClientSetParameterValue: {
@@ -1002,6 +987,25 @@ protected:
break; 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: { case kPluginBridgeRtClientControlEventParameter: {
const uint32_t time(fShmRtClientControl.readUInt()); const uint32_t time(fShmRtClientControl.readUInt());
const uint8_t channel(fShmRtClientControl.readByte()); const uint8_t channel(fShmRtClientControl.readByte());
@@ -1128,7 +1132,7 @@ protected:
case kPluginBridgeRtClientProcess: { case kPluginBridgeRtClientProcess: {
CARLA_SAFE_ASSERT_BREAK(fShmAudioPool.data != nullptr); 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); const BridgeTimeInfo& bridgeTimeInfo(fShmRtClientControl.data->timeInfo);




+ 10
- 14
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -1482,10 +1482,9 @@ public:
resizeAudioPool(newBufferSize); 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(); //fProcWaitTime = newBufferSize*1000/pData->engine->getSampleRate();
@@ -1497,10 +1496,9 @@ public:
void sampleRateChanged(const double newSampleRate) override 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; //fProcWaitTime = pData->engine->getBufferSize()*1000/newSampleRate;
@@ -1512,9 +1510,9 @@ public:
void offlineModeChanged(const bool isOffline) override 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); waitForClient("offline", 1000);
@@ -2168,10 +2166,8 @@ public:
fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtClientData))); fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtClientData)));
fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtServerData))); fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtServerData)));


fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetBufferSize);
fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientInitialSetup);
fShmNonRtClientControl.writeUInt(pData->engine->getBufferSize()); fShmNonRtClientControl.writeUInt(pData->engine->getBufferSize());

fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetSampleRate);
fShmNonRtClientControl.writeDouble(pData->engine->getSampleRate()); fShmNonRtClientControl.writeDouble(pData->engine->getSampleRate());


fShmNonRtClientControl.commitWrite(); fShmNonRtClientControl.commitWrite();


+ 10
- 14
source/backend/plugin/CarlaPluginJack.cpp View File

@@ -1034,10 +1034,9 @@ public:
resizeAudioPool(newBufferSize); 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(); //fProcWaitTime = newBufferSize*1000/pData->engine->getSampleRate();
@@ -1049,10 +1048,9 @@ public:
void sampleRateChanged(const double newSampleRate) override 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; //fProcWaitTime = pData->engine->getBufferSize()*1000/newSampleRate;
@@ -1064,9 +1062,9 @@ public:
void offlineModeChanged(const bool isOffline) override 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); waitForClient("offline", 1000);
@@ -1398,10 +1396,8 @@ private:
fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtClientData))); fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtClientData)));
fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtServerData))); fShmNonRtClientControl.writeUInt(static_cast<uint32_t>(sizeof(BridgeNonRtServerData)));


fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetBufferSize);
fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientInitialSetup);
fShmNonRtClientControl.writeUInt(pData->engine->getBufferSize()); fShmNonRtClientControl.writeUInt(pData->engine->getBufferSize());

fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetSampleRate);
fShmNonRtClientControl.writeDouble(pData->engine->getSampleRate()); fShmNonRtClientControl.writeDouble(pData->engine->getSampleRate());


fShmNonRtClientControl.commitWrite(); fShmNonRtClientControl.commitWrite();


+ 57
- 58
source/libjack/libjack.cpp View File

@@ -300,11 +300,8 @@ bool CarlaJackAppClient::initSharedMemmory()
} }


opcode = fShmNonRtClientControl.readOpcode(); opcode = fShmNonRtClientControl.readOpcode();
CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetBufferSize, opcode);
CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientInitialSetup, opcode);
fServer.bufferSize = fShmNonRtClientControl.readUInt(); fServer.bufferSize = fShmNonRtClientControl.readUInt();

opcode = fShmNonRtClientControl.readOpcode();
CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetSampleRate, opcode);
fServer.sampleRate = fShmNonRtClientControl.readDouble(); fServer.sampleRate = fShmNonRtClientControl.readDouble();


if (fServer.bufferSize == 0 || carla_isZero(fServer.sampleRate)) if (fServer.bufferSize == 0 || carla_isZero(fServer.sampleRate))
@@ -396,6 +393,56 @@ bool CarlaJackAppClient::handleRtData()
break; 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 kPluginBridgeRtClientControlEventParameter:
case kPluginBridgeRtClientControlEventMidiBank: case kPluginBridgeRtClientControlEventMidiBank:
case kPluginBridgeRtClientControlEventMidiProgram: case kPluginBridgeRtClientControlEventMidiProgram:
@@ -405,6 +452,7 @@ bool CarlaJackAppClient::handleRtData()
break; break;


case kPluginBridgeRtClientProcess: { case kPluginBridgeRtClientProcess: {
// FIXME - lock if offline
const CarlaMutexTryLocker cmtl(fRealtimeThreadMutex); const CarlaMutexTryLocker cmtl(fRealtimeThreadMutex);


if (cmtl.wasLocked()) if (cmtl.wasLocked())
@@ -451,6 +499,7 @@ bool CarlaJackAppClient::handleRtData()
JackClientState* const jclient(it.getValue(nullptr)); JackClientState* const jclient(it.getValue(nullptr));
CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr); CARLA_SAFE_ASSERT_CONTINUE(jclient != nullptr);


// FIXME - lock if offline
const CarlaMutexTryLocker cmtl2(jclient->mutex); const CarlaMutexTryLocker cmtl2(jclient->mutex);


// check if we can process // check if we can process
@@ -636,60 +685,10 @@ bool CarlaJackAppClient::handleNonRtData()
case kPluginBridgeNonRtClientDeactivate: case kPluginBridgeNonRtClientDeactivate:
break; 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; break;


case kPluginBridgeNonRtClientSetParameterValue: case kPluginBridgeNonRtClientSetParameterValue:


+ 4
- 4
source/utils/CarlaBridgeDefines.hpp View File

@@ -26,6 +26,9 @@
enum PluginBridgeRtClientOpcode { enum PluginBridgeRtClientOpcode {
kPluginBridgeRtClientNull = 0, kPluginBridgeRtClientNull = 0,
kPluginBridgeRtClientSetAudioPool, // ulong/ptr kPluginBridgeRtClientSetAudioPool, // ulong/ptr
kPluginBridgeRtClientSetBufferSize, // uint
kPluginBridgeRtClientSetSampleRate, // double
kPluginBridgeRtClientSetOnline, // bool
kPluginBridgeRtClientControlEventParameter, // uint/frame, byte/chan, ushort, float kPluginBridgeRtClientControlEventParameter, // uint/frame, byte/chan, ushort, float
kPluginBridgeRtClientControlEventMidiBank, // uint/frame, byte/chan, ushort kPluginBridgeRtClientControlEventMidiBank, // uint/frame, byte/chan, ushort
kPluginBridgeRtClientControlEventMidiProgram, // uint/frame, byte/chan, ushort kPluginBridgeRtClientControlEventMidiProgram, // uint/frame, byte/chan, ushort
@@ -43,10 +46,7 @@ enum PluginBridgeNonRtClientOpcode {
kPluginBridgeNonRtClientPingOnOff, // bool kPluginBridgeNonRtClientPingOnOff, // bool
kPluginBridgeNonRtClientActivate, kPluginBridgeNonRtClientActivate,
kPluginBridgeNonRtClientDeactivate, kPluginBridgeNonRtClientDeactivate,
kPluginBridgeNonRtClientSetBufferSize, // uint
kPluginBridgeNonRtClientSetSampleRate, // double
kPluginBridgeNonRtClientSetOffline,
kPluginBridgeNonRtClientSetOnline,
kPluginBridgeNonRtClientInitialSetup, // uint, double
kPluginBridgeNonRtClientSetParameterValue, // uint, float kPluginBridgeNonRtClientSetParameterValue, // uint, float
kPluginBridgeNonRtClientSetParameterMidiChannel, // uint, byte kPluginBridgeNonRtClientSetParameterMidiChannel, // uint, byte
kPluginBridgeNonRtClientSetParameterMidiCC, // uint, short kPluginBridgeNonRtClientSetParameterMidiCC, // uint, short


+ 8
- 8
source/utils/CarlaBridgeUtils.hpp View File

@@ -43,6 +43,12 @@ const char* PluginBridgeRtClientOpcode2str(const PluginBridgeRtClientOpcode opco
return "kPluginBridgeRtClientNull"; return "kPluginBridgeRtClientNull";
case kPluginBridgeRtClientSetAudioPool: case kPluginBridgeRtClientSetAudioPool:
return "kPluginBridgeRtClientSetAudioPool"; return "kPluginBridgeRtClientSetAudioPool";
case kPluginBridgeRtClientSetBufferSize:
return "kPluginBridgeRtClientSetBufferSize";
case kPluginBridgeRtClientSetSampleRate:
return "kPluginBridgeRtClientSetSampleRate";
case kPluginBridgeRtClientSetOnline:
return "kPluginBridgeRtClientSetOnline";
case kPluginBridgeRtClientControlEventParameter: case kPluginBridgeRtClientControlEventParameter:
return "kPluginBridgeRtClientControlEventParameter"; return "kPluginBridgeRtClientControlEventParameter";
case kPluginBridgeRtClientControlEventMidiBank: case kPluginBridgeRtClientControlEventMidiBank:
@@ -80,14 +86,8 @@ const char* PluginBridgeNonRtClientOpcode2str(const PluginBridgeNonRtClientOpcod
return "kPluginBridgeNonRtClientActivate"; return "kPluginBridgeNonRtClientActivate";
case kPluginBridgeNonRtClientDeactivate: case kPluginBridgeNonRtClientDeactivate:
return "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: case kPluginBridgeNonRtClientSetParameterValue:
return "kPluginBridgeNonRtClientSetParameterValue"; return "kPluginBridgeNonRtClientSetParameterValue";
case kPluginBridgeNonRtClientSetParameterMidiChannel: case kPluginBridgeNonRtClientSetParameterMidiChannel:


Loading…
Cancel
Save