Browse Source

libjack: use empty buffers for ports needed by clients but missing

tags/1.9.8
falkTX 7 years ago
parent
commit
8c07b827d6
1 changed files with 83 additions and 11 deletions
  1. +83
    -11
      source/libjack/libjack.cpp

+ 83
- 11
source/libjack/libjack.cpp View File

@@ -35,6 +35,7 @@ public:
: Thread("CarlaJackAppClient"),
fServer(this),
fAudioPoolCopy(nullptr),
fAudioTmpBuf(nullptr),
fIsValid(false),
fIsOffline(false),
fLastPingTime(-1)
@@ -95,6 +96,18 @@ public:
delete jclient;
}

if (fAudioPoolCopy != nullptr)
{
delete[] fAudioPoolCopy;
fAudioPoolCopy = nullptr;
}

if (fAudioTmpBuf != nullptr)
{
delete[] fAudioTmpBuf;
fAudioTmpBuf = nullptr;
}

fClients.clear();
}

@@ -135,6 +148,7 @@ private:
BridgeNonRtServerControl fShmNonRtServerControl;

float* fAudioPoolCopy;
float* fAudioTmpBuf;

char fBaseNameAudioPool[6+1];
char fBaseNameRtClientControl[6+1];
@@ -230,21 +244,57 @@ void CarlaJackAppClient::handleNonRtData()
break;

case kPluginBridgeNonRtClientSetBufferSize:
fShmNonRtClientControl.readUInt();
//bufferSizeChanged();
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:
fShmNonRtClientControl.readDouble();
//sampleRateChanged();
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);
break;
@@ -390,6 +440,9 @@ void CarlaJackAppClient::run()
return;
}

fAudioTmpBuf = new float[fServer.bufferSize];
FloatVectorOperations::clear(fAudioTmpBuf, fServer.bufferSize);

// tell backend we're live
{
const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);
@@ -508,6 +561,9 @@ void CarlaJackAppClient::run()
fServer.position.valid = static_cast<jack_position_bits_t>(0);
}

// clear audio buffer for unused ports
FloatVectorOperations::clear(fAudioTmpBuf, fServer.bufferSize);

// now go through each client
for (LinkedList<JackClientState*>::Itenerator it = fClients.begin2(); it.valid(); it.next())
{
@@ -538,11 +594,19 @@ void CarlaJackAppClient::run()
i = 0;
for (LinkedList<JackPortState*>::Itenerator it = jclient->audioIns.begin2(); it.valid(); it.next())
{
CARLA_SAFE_ASSERT_BREAK(i++ < fNumPorts.audioIns);
if (JackPortState* const jport = it.getValue(nullptr))
jport->buffer = fdataReal;
fdataReal += fServer.bufferSize;
fdataCopy += fServer.bufferSize;
{
if (i++ < fNumPorts.audioIns)
{
jport->buffer = fdataReal;
fdataReal += fServer.bufferSize;
fdataCopy += fServer.bufferSize;
}
else
{
jport->buffer = fAudioTmpBuf;
}
}
}
// FIXME one single "if"
for (; i++ < fNumPorts.audioIns;)
@@ -558,10 +622,18 @@ void CarlaJackAppClient::run()
i = 0;
for (LinkedList<JackPortState*>::Itenerator it = jclient->audioOuts.begin2(); it.valid(); it.next())
{
CARLA_SAFE_ASSERT_BREAK(i++ < fNumPorts.audioOuts);
if (JackPortState* const jport = it.getValue(nullptr))
jport->buffer = fdataCopy;
fdataCopy += fServer.bufferSize;
{
if (i++ < fNumPorts.audioOuts)
{
jport->buffer = fdataCopy;
fdataCopy += fServer.bufferSize;
}
else
{
jport->buffer = fAudioTmpBuf;
}
}
}
// FIXME one single "if"
for (; i++ < fNumPorts.audioOuts;)


Loading…
Cancel
Save