Browse Source

More latency related work

tags/1.9.4
falkTX 11 years ago
parent
commit
9a20d97e21
4 changed files with 155 additions and 102 deletions
  1. +52
    -33
      source/backend/plugin/DssiPlugin.cpp
  2. +51
    -34
      source/backend/plugin/LadspaPlugin.cpp
  3. +51
    -33
      source/backend/plugin/Lv2Plugin.cpp
  4. +1
    -2
      source/utils/Lv2AtomQueue.hpp

+ 52
- 33
source/backend/plugin/DssiPlugin.cpp View File

@@ -49,6 +49,7 @@ public:
fAudioInBuffers(nullptr),
fAudioOutBuffers(nullptr),
fParamBuffers(nullptr),
fLatencyChanged(false),
fLatencyIndex(-1)
{
carla_debug("DssiPlugin::DssiPlugin(%p, %i)", engine, id);
@@ -421,6 +422,36 @@ public:
}
}

void idle() override
{
if (fLatencyChanged && fLatencyIndex != -1)
{
fLatencyChanged = false;

const int32_t latency(static_cast<int32_t>(fParamBuffers[fLatencyIndex]));

if (latency >= 0)
{
const uint32_t ulatency(static_cast<uint32_t>(latency));

if (pData->latency != ulatency)
{
carla_stdout("latency changed to %i", latency);

const ScopedSingleProcessLocker sspl(this, true);

pData->latency = ulatency;
pData->client->setLatency(ulatency);
#ifndef BUILD_BRIDGE
pData->recreateLatencyBuffers();
#endif
}
}
else
carla_safe_assert_int("latency >= 0", __FILE__, __LINE__, latency);
}
}

// -------------------------------------------------------------------
// Plugin state

@@ -896,6 +927,8 @@ public:
}
else
carla_safe_assert_int("latency >= 0", __FILE__, __LINE__, latency);

fLatencyChanged = false;
}

bufferSizeChanged(pData->engine->getBufferSize());
@@ -1020,29 +1053,6 @@ public:
} CARLA_SAFE_EXCEPTION("DSSI activate #2");
}
}

if (fLatencyIndex < 0)
return;

const int32_t latency(static_cast<int32_t>(fParamBuffers[fLatencyIndex]));
CARLA_SAFE_ASSERT_RETURN(latency >= 0,);

const uint32_t ulatency(static_cast<uint32_t>(latency));

if (pData->latency != ulatency)
{
carla_stdout("latency changed to %i", latency);

pData->latency = ulatency;
pData->client->setLatency(ulatency);
#ifndef BUILD_BRIDGE
try {
pData->recreateLatencyBuffers(); // FIXME
} CARLA_SAFE_EXCEPTION("DSSI recreateLatencyBuffers()");
#endif
}
else
carla_stdout("latency still the same %i", latency);
}

void deactivate() noexcept override
@@ -1510,21 +1520,28 @@ public:
// --------------------------------------------------------------------------------------------------------
// Latency, save values for next callback

if (pData->latency > 0)
if (fLatencyIndex != -1)
{
if (pData->latency <= frames)
if (pData->latency != static_cast<uint32_t>(fParamBuffers[fLatencyIndex]))
{
for (uint32_t i=0; i < pData->audioIn.count; ++i)
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency);
fLatencyChanged = true;
}
else
else if (pData->latency > 0)
{
for (uint32_t i=0, j, k; i < pData->audioIn.count; ++i)
if (pData->latency <= frames)
{
for (k=0; k < pData->latency-frames; ++k)
pData->latencyBuffers[i][k] = pData->latencyBuffers[i][k+frames];
for (j=0; k < pData->latency; ++j, ++k)
pData->latencyBuffers[i][k] = inBuffer[i][j];
for (uint32_t i=0; i < pData->audioIn.count; ++i)
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency);
}
else
{
for (uint32_t i=0, j, k; i < pData->audioIn.count; ++i)
{
for (k=0; k < pData->latency-frames; ++k)
pData->latencyBuffers[i][k] = pData->latencyBuffers[i][k+frames];
for (j=0; k < pData->latency; ++j, ++k)
pData->latencyBuffers[i][k] = inBuffer[i][j];
}
}
}
}
@@ -2155,6 +2172,8 @@ private:
float** fAudioInBuffers;
float** fAudioOutBuffers;
float* fParamBuffers;

bool fLatencyChanged;
int32_t fLatencyIndex; // -1 if invalid

snd_seq_event_t fMidiEvents[kPluginMaxMidiEvents];


+ 51
- 34
source/backend/plugin/LadspaPlugin.cpp View File

@@ -45,6 +45,7 @@ public:
fAudioInBuffers(nullptr),
fAudioOutBuffers(nullptr),
fParamBuffers(nullptr),
fLatencyChanged(false),
fLatencyIndex(-1)
{
carla_debug("LadspaPlugin::LadspaPlugin(%p, %i)", engine, id);
@@ -407,7 +408,35 @@ public:
// -------------------------------------------------------------------
// Set ui stuff

// nothing
void idle() override
{
if (fLatencyChanged && fLatencyIndex != -1)
{
fLatencyChanged = false;

const int32_t latency(static_cast<int32_t>(fParamBuffers[fLatencyIndex]));

if (latency >= 0)
{
const uint32_t ulatency(static_cast<uint32_t>(latency));

if (pData->latency != ulatency)
{
carla_stdout("latency changed to %i", latency);

const ScopedSingleProcessLocker sspl(this, true);

pData->latency = ulatency;
pData->client->setLatency(ulatency);
#ifndef BUILD_BRIDGE
pData->recreateLatencyBuffers();
#endif
}
}
else
carla_safe_assert_int("latency >= 0", __FILE__, __LINE__, latency);
}
}

// -------------------------------------------------------------------
// Plugin state
@@ -867,6 +896,8 @@ public:
}
else
carla_safe_assert_int("latency >= 0", __FILE__, __LINE__, latency);

fLatencyChanged = false;
}

bufferSizeChanged(pData->engine->getBufferSize());
@@ -898,29 +929,6 @@ public:
} CARLA_SAFE_EXCEPTION("LADSPA activate #2");
}
}

if (fLatencyIndex < 0)
return;

const int32_t latency(static_cast<int32_t>(fParamBuffers[fLatencyIndex]));
CARLA_SAFE_ASSERT_RETURN(latency >= 0,);

const uint32_t ulatency(static_cast<uint32_t>(latency));

if (pData->latency != ulatency)
{
carla_stdout("latency changed to %i", latency);

pData->latency = ulatency;
pData->client->setLatency(ulatency);
#ifndef BUILD_BRIDGE
try {
pData->recreateLatencyBuffers(); // FIXME
} CARLA_SAFE_EXCEPTION("LADSPA recreateLatencyBuffers()");
#endif
}
else
carla_stdout("latency still the same %i", latency);
}

void deactivate() noexcept override
@@ -1134,21 +1142,28 @@ public:
// --------------------------------------------------------------------------------------------------------
// Latency, save values for next callback

if (pData->latency > 0)
if (fLatencyIndex != -1)
{
if (pData->latency <= frames)
if (pData->latency != static_cast<uint32_t>(fParamBuffers[fLatencyIndex]))
{
for (uint32_t i=0; i < pData->audioIn.count; ++i)
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency);
fLatencyChanged = true;
}
else
else if (pData->latency > 0)
{
for (uint32_t i=0, j, k; i < pData->audioIn.count; ++i)
if (pData->latency <= frames)
{
for (k=0; k < pData->latency-frames; ++k)
pData->latencyBuffers[i][k] = pData->latencyBuffers[i][k+frames];
for (j=0; k < pData->latency; ++j, ++k)
pData->latencyBuffers[i][k] = inBuffer[i][j];
for (uint32_t i=0; i < pData->audioIn.count; ++i)
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency);
}
else
{
for (uint32_t i=0, j, k; i < pData->audioIn.count; ++i)
{
for (k=0; k < pData->latency-frames; ++k)
pData->latencyBuffers[i][k] = pData->latencyBuffers[i][k+frames];
for (j=0; k < pData->latency; ++j, ++k)
pData->latencyBuffers[i][k] = inBuffer[i][j];
}
}
}
}
@@ -1638,6 +1653,8 @@ private:
float** fAudioInBuffers;
float** fAudioOutBuffers;
float* fParamBuffers;

bool fLatencyChanged;
int32_t fLatencyIndex; // -1 if invalid

// -------------------------------------------------------------------


+ 51
- 33
source/backend/plugin/Lv2Plugin.cpp View File

@@ -398,6 +398,7 @@ public:
fCvInBuffers(nullptr),
fCvOutBuffers(nullptr),
fParamBuffers(nullptr),
fLatencyChanged(false),
fLatencyIndex(-1),
fFirstActive(true)
{
@@ -1287,11 +1288,13 @@ public:
{
if (! fAtomQueueOut.isEmpty())
{
fAtomQueueOut.lock();
char dumpBuf[fAtomQueueOut.getSize()];

Lv2AtomQueue tmpQueue;
tmpQueue.copyAndDumpDataFromQueue(fAtomQueueOut, dumpBuf);
CARLA_SAFE_ASSERT(! tmpQueue.isEmpty());
fAtomQueueOut.unlock();

uint32_t portIndex;
const LV2_Atom* atom;
@@ -1320,6 +1323,33 @@ public:
}
}

if (fLatencyChanged && fLatencyIndex != -1)
{
fLatencyChanged = false;

const int32_t latency(static_cast<int32_t>(fParamBuffers[fLatencyIndex]));

if (latency >= 0)
{
const uint32_t ulatency(static_cast<uint32_t>(latency));

if (pData->latency != ulatency)
{
carla_stdout("latency changed to %i", latency);

const ScopedSingleProcessLocker sspl(this, true);

pData->latency = ulatency;
pData->client->setLatency(ulatency);
#ifndef BUILD_BRIDGE
pData->recreateLatencyBuffers();
#endif
}
}
else
carla_safe_assert_int("latency >= 0", __FILE__, __LINE__, latency);
}

if (fUi.handle != nullptr && fUi.descriptor != nullptr)
{
if (fUi.type == UI::TYPE_EXTERNAL && fUi.widget != nullptr)
@@ -2218,6 +2248,8 @@ public:
}
else
carla_safe_assert_int("latency >= 0", __FILE__, __LINE__, latency);

fLatencyChanged = false;
}

bufferSizeChanged(pData->engine->getBufferSize());
@@ -2376,29 +2408,6 @@ public:
}

fFirstActive = true;

if (fLatencyIndex < 0)
return;

const int32_t latency(static_cast<int32_t>(fParamBuffers[fLatencyIndex]));
CARLA_SAFE_ASSERT_RETURN(latency >= 0,);

const uint32_t ulatency(static_cast<uint32_t>(latency));

if (pData->latency != ulatency)
{
carla_stdout("latency changed to %i", latency);

pData->latency = ulatency;
pData->client->setLatency(ulatency);
#ifndef BUILD_BRIDGE
try {
pData->recreateLatencyBuffers(); // FIXME
} CARLA_SAFE_EXCEPTION("LADSPA recreateLatencyBuffers()");
#endif
}
else
carla_stdout("latency still the same %i", latency);
}

void deactivate() noexcept override
@@ -3116,21 +3125,28 @@ public:
// --------------------------------------------------------------------------------------------------------
// Latency, save values for next callback

if (pData->latency > 0)
if (fLatencyIndex != -1)
{
if (pData->latency <= frames)
if (pData->latency != static_cast<uint32_t>(fParamBuffers[fLatencyIndex]))
{
for (uint32_t i=0; i < pData->audioIn.count; ++i)
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency);
fLatencyChanged = true;
}
else
else if (pData->latency > 0)
{
for (uint32_t i=0, j, k; i < pData->audioIn.count; ++i)
if (pData->latency <= frames)
{
for (k=0; k < pData->latency-frames; ++k)
pData->latencyBuffers[i][k] = pData->latencyBuffers[i][k+frames];
for (j=0; k < pData->latency; ++j, ++k)
pData->latencyBuffers[i][k] = inBuffer[i][j];
for (uint32_t i=0; i < pData->audioIn.count; ++i)
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency);
}
else
{
for (uint32_t i=0, j, k; i < pData->audioIn.count; ++i)
{
for (k=0; k < pData->latency-frames; ++k)
pData->latencyBuffers[i][k] = pData->latencyBuffers[i][k+frames];
for (j=0; k < pData->latency; ++j, ++k)
pData->latencyBuffers[i][k] = inBuffer[i][j];
}
}
}
}
@@ -5209,6 +5225,8 @@ private:
float** fCvInBuffers;
float** fCvOutBuffers;
float* fParamBuffers;

bool fLatencyChanged;
int32_t fLatencyIndex; // -1 if invalid

Lv2AtomQueue fAtomQueueIn;


+ 1
- 2
source/utils/Lv2AtomQueue.hpp View File

@@ -259,8 +259,7 @@ public:
// used for tmp buffers only
void copyAndDumpDataFromQueue(Lv2AtomQueue& queue, char dumpBuf[]) noexcept
{
// lock source
const CarlaMutexLocker cml1(queue.fMutex);
// source is locked

{
// copy data from source


Loading…
Cancel
Save