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));

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);



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

@@ -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();


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

@@ -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();


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

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


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

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


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

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


Loading…
Cancel
Save