Browse Source

LV2 latency work; If using Qt5 + Pro theme, skip desktop settings

tags/1.9.4
falkTX 11 years ago
parent
commit
94b01f9c6c
4 changed files with 155 additions and 35 deletions
  1. +2
    -1
      source/backend/plugin/DssiPlugin.cpp
  2. +2
    -1
      source/backend/plugin/LadspaPlugin.cpp
  3. +136
    -21
      source/backend/plugin/Lv2Plugin.cpp
  4. +15
    -12
      source/carla_style.py

+ 2
- 1
source/backend/plugin/DssiPlugin.cpp View File

@@ -706,8 +706,9 @@ public:
step = 1.0f; step = 1.0f;
stepSmall = 1.0f; stepSmall = 1.0f;
stepLarge = 1.0f; stepLarge = 1.0f;
fLatencyIndex = static_cast<int32_t>(j);
pData->param.special[j] = PARAMETER_SPECIAL_LATENCY; pData->param.special[j] = PARAMETER_SPECIAL_LATENCY;
CARLA_SAFE_ASSERT(fLatencyIndex == -1);
fLatencyIndex = static_cast<int32_t>(j);
} }
else else
{ {


+ 2
- 1
source/backend/plugin/LadspaPlugin.cpp View File

@@ -679,8 +679,9 @@ public:
step = 1.0f; step = 1.0f;
stepSmall = 1.0f; stepSmall = 1.0f;
stepLarge = 1.0f; stepLarge = 1.0f;
fLatencyIndex = static_cast<int32_t>(j);
pData->param.special[j] = PARAMETER_SPECIAL_LATENCY; pData->param.special[j] = PARAMETER_SPECIAL_LATENCY;
CARLA_SAFE_ASSERT(fLatencyIndex == -1);
fLatencyIndex = static_cast<int32_t>(j);
} }
else else
{ {


+ 136
- 21
source/backend/plugin/Lv2Plugin.cpp View File

@@ -398,6 +398,7 @@ public:
fCvInBuffers(nullptr), fCvInBuffers(nullptr),
fCvOutBuffers(nullptr), fCvOutBuffers(nullptr),
fParamBuffers(nullptr), fParamBuffers(nullptr),
fLatencyIndex(-1),
fFirstActive(true) fFirstActive(true)
{ {
carla_debug("Lv2Plugin::Lv2Plugin(%p, %i)", engine, id); carla_debug("Lv2Plugin::Lv2Plugin(%p, %i)", engine, id);
@@ -693,7 +694,7 @@ public:


options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;


if (! (hasMidiIn || needsFixedBuffer()))
if (fLatencyIndex == -1 && ! (hasMidiIn || needsFixedBuffer()))
options |= PLUGIN_OPTION_FIXED_BUFFERS; options |= PLUGIN_OPTION_FIXED_BUFFERS;


if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK)
@@ -1984,6 +1985,8 @@ public:
stepSmall = 1.0f; stepSmall = 1.0f;
stepLarge = 1.0f; stepLarge = 1.0f;
pData->param.special[j] = PARAMETER_SPECIAL_LATENCY; pData->param.special[j] = PARAMETER_SPECIAL_LATENCY;
CARLA_SAFE_ASSERT(fLatencyIndex == -1);
fLatencyIndex = static_cast<int32_t>(j);
} }
else if (LV2_IS_PORT_DESIGNATION_SAMPLE_RATE(portDesignation)) else if (LV2_IS_PORT_DESIGNATION_SAMPLE_RATE(portDesignation))
{ {
@@ -2150,12 +2153,76 @@ public:
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK;
} }


// check latency
if (fLatencyIndex >= 0)
{
// we need to pre-run the plugin so it can update its latency control-port

float tmpIn[aIns][2];
float tmpOut[aOuts][2];

for (uint32_t j=0; j < aIns; ++j)
{
tmpIn[j][0] = 0.0f;
tmpIn[j][1] = 0.0f;

try {
fDescriptor->connect_port(fHandle, pData->audioIn.ports[j].rindex, tmpIn[j]);
} CARLA_SAFE_EXCEPTION("LV2 connect_port latency input");
}

for (uint32_t j=0; j < aOuts; ++j)
{
tmpOut[j][0] = 0.0f;
tmpOut[j][1] = 0.0f;

try {
fDescriptor->connect_port(fHandle, pData->audioOut.ports[j].rindex, tmpOut[j]);
} CARLA_SAFE_EXCEPTION("LV2 connect_port latency output");
}

if (fDescriptor->activate != nullptr)
{
try {
fDescriptor->activate(fHandle);
} CARLA_SAFE_EXCEPTION("LV2 latency activate");
}

try {
fDescriptor->run(fHandle, 2);
} CARLA_SAFE_EXCEPTION("LV2 latency run");

if (fDescriptor->deactivate != nullptr)
{
try {
fDescriptor->deactivate(fHandle);
} CARLA_SAFE_EXCEPTION("LV2 latency deactivate");
}

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 = %i", latency);

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

bufferSizeChanged(pData->engine->getBufferSize()); bufferSizeChanged(pData->engine->getBufferSize());
reloadPrograms(true); reloadPrograms(true);


// check latency
// TODO

evIns.clear(); evIns.clear();
evOuts.clear(); evOuts.clear();


@@ -2167,7 +2234,7 @@ public:


void reloadPrograms(const bool doInit) override void reloadPrograms(const bool doInit) override
{ {
carla_debug("DssiPlugin::reloadPrograms(%s)", bool2str(doInit));
carla_debug("Lv2Plugin::reloadPrograms(%s)", bool2str(doInit));
const uint32_t oldCount = pData->midiprog.count; const uint32_t oldCount = pData->midiprog.count;
const int32_t current = pData->midiprog.current; const int32_t current = pData->midiprog.current;


@@ -2298,17 +2365,40 @@ public:
{ {
try { try {
fDescriptor->activate(fHandle); fDescriptor->activate(fHandle);
} catch(...) {}
} CARLA_SAFE_EXCEPTION("LV2 activate");


if (fHandle2 != nullptr) if (fHandle2 != nullptr)
{ {
try { try {
fDescriptor->activate(fHandle2); fDescriptor->activate(fHandle2);
} catch(...) {}
} CARLA_SAFE_EXCEPTION("LV2 activate #2");
} }
} }


fFirstActive = true; 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 void deactivate() noexcept override
@@ -2320,13 +2410,13 @@ public:
{ {
try { try {
fDescriptor->deactivate(fHandle); fDescriptor->deactivate(fHandle);
} catch(...) {}
} CARLA_SAFE_EXCEPTION("LV2 deactivate");


if (fHandle2 != nullptr) if (fHandle2 != nullptr)
{ {
try { try {
fDescriptor->deactivate(fHandle2); fDescriptor->deactivate(fHandle2);
} catch(...) {}
} CARLA_SAFE_EXCEPTION("LV2 deactivate #2");
} }
} }
} }
@@ -3022,7 +3112,27 @@ public:


} // End of Plugin processing (no events) } // End of Plugin processing (no events)


CARLA_PROCESS_CONTINUE_CHECK;
// --------------------------------------------------------------------------------------------------------
// Latency, save values for next callback

if (pData->latency > 0)
{
if (pData->latency <= frames)
{
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];
}
}
}


// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// MIDI Output // MIDI Output
@@ -3141,8 +3251,6 @@ public:
} }
} // End of Control Output } // End of Control Output


CARLA_PROCESS_CONTINUE_CHECK;

// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// Final work // Final work


@@ -3251,6 +3359,7 @@ public:
{ {
const bool doDryWet = (pData->hints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; const bool doDryWet = (pData->hints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f;
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f);
const bool isMono = (pData->audioIn.count == 1);


bool isPair; bool isPair;
float bufValue, oldBufLeft[doBalance ? frames : 1]; float bufValue, oldBufLeft[doBalance ? frames : 1];
@@ -3262,11 +3371,12 @@ public:
{ {
for (uint32_t k=0; k < frames; ++k) for (uint32_t k=0; k < frames; ++k)
{ {
// TODO
//if (k < pData->latency && pData->latency < frames)
// bufValue = (pData->audioIn.count == 1) ? pData->latencyBuffers[0][k] : pData->latencyBuffers[i][k];
//else
// bufValue = (pData->audioIn.count == 1) ? inBuffer[0][k-m_latency] : inBuffer[i][k-m_latency];
if (k < pData->latency)
bufValue = pData->latencyBuffers[isMono ? 0 : i][k];
else if (pData->latency < frames)
bufValue = fAudioInBuffers[isMono ? 0 : i][k-pData->latency];
else
bufValue = fAudioInBuffers[isMono ? 0 : i][k];


bufValue = fAudioInBuffers[(pData->audioIn.count == 1) ? 0 : i][k]; bufValue = fAudioInBuffers[(pData->audioIn.count == 1) ? 0 : i][k];
fAudioOutBuffers[i][k] = (fAudioOutBuffers[i][k] * pData->postProc.dryWet) + (bufValue * (1.0f - pData->postProc.dryWet)); fAudioOutBuffers[i][k] = (fAudioOutBuffers[i][k] * pData->postProc.dryWet) + (bufValue * (1.0f - pData->postProc.dryWet));
@@ -3311,6 +3421,7 @@ public:
} }
} }
} // End of Post-processing } // End of Post-processing

#else // BUILD_BRIDGE #else // BUILD_BRIDGE
for (uint32_t i=0; i < pData->audioOut.count; ++i) for (uint32_t i=0; i < pData->audioOut.count; ++i)
{ {
@@ -3620,7 +3731,7 @@ public:
{ {
if (pData->osc.data.target != nullptr) if (pData->osc.data.target != nullptr)
{ {
uint8_t midiData[4] = { 0 };
uint8_t midiData[4] = { 0, 0, 0, 0 };
midiData[1] = static_cast<uint8_t>(MIDI_STATUS_NOTE_ON + channel); midiData[1] = static_cast<uint8_t>(MIDI_STATUS_NOTE_ON + channel);
midiData[2] = note; midiData[2] = note;
midiData[3] = velo; midiData[3] = velo;
@@ -3654,7 +3765,7 @@ public:
{ {
if (pData->osc.data.target != nullptr) if (pData->osc.data.target != nullptr)
{ {
uint8_t midiData[4] = { 0 };
uint8_t midiData[4] = { 0, 0, 0, 0 };
midiData[1] = static_cast<uint8_t>(MIDI_STATUS_NOTE_OFF + channel); midiData[1] = static_cast<uint8_t>(MIDI_STATUS_NOTE_OFF + channel);
midiData[2] = note; midiData[2] = note;
osc_send_midi(pData->osc.data, midiData); osc_send_midi(pData->osc.data, midiData);
@@ -3814,6 +3925,9 @@ public:
fExt.state = nullptr; fExt.state = nullptr;
fExt.worker = nullptr; fExt.worker = nullptr;


if (fRdfDescriptor->ExtensionCount == 0 || fDescriptor->extension_data == nullptr)
return;

for (uint32_t i=0; i < fRdfDescriptor->ExtensionCount; ++i) for (uint32_t i=0; i < fRdfDescriptor->ExtensionCount; ++i)
{ {
CARLA_SAFE_ASSERT_CONTINUE(fRdfDescriptor->Extensions[i] != nullptr); CARLA_SAFE_ASSERT_CONTINUE(fRdfDescriptor->Extensions[i] != nullptr);
@@ -4620,7 +4734,7 @@ public:


pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;


if (getMidiInCount() > 0 || needsFixedBuffer())
if (fLatencyIndex >= 0 || getMidiInCount() > 0 || needsFixedBuffer())
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; pData->options |= PLUGIN_OPTION_FIXED_BUFFERS;


if (pData->engine->getOptions().forceStereo) if (pData->engine->getOptions().forceStereo)
@@ -4644,7 +4758,7 @@ public:
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); pData->options = pData->loadSettings(pData->options, getOptionsAvailable());


// ignore settings, we need this anyway // ignore settings, we need this anyway
if (getMidiInCount() > 0 || needsFixedBuffer())
if (fLatencyIndex >= 0 || getMidiInCount() > 0 || needsFixedBuffer())
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; pData->options |= PLUGIN_OPTION_FIXED_BUFFERS;
#endif #endif
} }
@@ -5094,6 +5208,7 @@ private:
float** fCvInBuffers; float** fCvInBuffers;
float** fCvOutBuffers; float** fCvOutBuffers;
float* fParamBuffers; float* fParamBuffers;
int32_t fLatencyIndex; // -1 if invalid


Lv2AtomQueue fAtomQueueIn; Lv2AtomQueue fAtomQueueIn;
Lv2AtomQueue fAtomQueueOut; Lv2AtomQueue fAtomQueueOut;


+ 15
- 12
source/carla_style.py View File

@@ -71,18 +71,21 @@ class CarlaApplication(object):
self._createApp(appName) self._createApp(appName)
return return


# set initial Qt stuff
#customFont = QFont("DejaVu Sans [Book]")
#customFont.setBold(False)
#customFont.setItalic(False)
#customFont.setOverline(False)
#customFont.setKerning(True)
#customFont.setHintingPreference(QFont.PreferFullHinting) # TODO - 4.8 only
#customFont.setPixelSize(14)
#customFont.setWeight(QFont.Normal)

#QApplication.setDesktopSettingsAware(False)
#QApplication.setFont(customFont)
if config_UseQt5:
# set initial Qt stuff
customFont = QFont("DejaVu Sans [Book]")
customFont.setBold(False)
customFont.setItalic(False)
customFont.setOverline(False)
customFont.setKerning(True)
customFont.setHintingPreference(QFont.PreferFullHinting) # TODO - 4.8 only
customFont.setPixelSize(12)
customFont.setWeight(QFont.Normal)

QApplication.setDesktopSettingsAware(False)
QApplication.setFont(customFont)

# set style
QApplication.setStyle("carla") QApplication.setStyle("carla")


# create app # create app


Loading…
Cancel
Save