Browse Source

Add support for LV2 nominalBlockLength

tags/1.9.7
falkTX 10 years ago
parent
commit
1610970283
5 changed files with 101 additions and 62 deletions
  1. +49
    -28
      source/backend/plugin/CarlaPluginLV2.cpp
  2. +42
    -25
      source/bridges-ui/CarlaBridgeUI-LV2.cpp
  3. +1
    -0
      source/includes/lv2/buf-size.h
  4. +5
    -5
      source/modules/distrho/src/DistrhoPluginLV2.cpp
  5. +4
    -4
      source/plugin/carla-lv2.cpp

+ 49
- 28
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -95,28 +95,29 @@ const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM = 22;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT = 23;
const uint32_t CARLA_URI_MAP_ID_BUF_MAX_LENGTH = 24;
const uint32_t CARLA_URI_MAP_ID_BUF_MIN_LENGTH = 25;
const uint32_t CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE = 26;
const uint32_t CARLA_URI_MAP_ID_LOG_ERROR = 27;
const uint32_t CARLA_URI_MAP_ID_LOG_NOTE = 28;
const uint32_t CARLA_URI_MAP_ID_LOG_TRACE = 29;
const uint32_t CARLA_URI_MAP_ID_LOG_WARNING = 30;
const uint32_t CARLA_URI_MAP_ID_TIME_POSITION = 31; // base type
const uint32_t CARLA_URI_MAP_ID_TIME_BAR = 32; // values
const uint32_t CARLA_URI_MAP_ID_TIME_BAR_BEAT = 33;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT = 34;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT_UNIT = 35;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_BAR = 36;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE = 37;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 38;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 39;
const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 40;
const uint32_t CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT = 41;
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 42;
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 43;
const uint32_t CARLA_URI_MAP_ID_UI_WINDOW_TITLE = 44;
const uint32_t CARLA_URI_MAP_ID_CARLA_ATOM_WORKER = 45;
const uint32_t CARLA_URI_MAP_ID_CARLA_TRANSIENT_WIN_ID = 46;
const uint32_t CARLA_URI_MAP_ID_COUNT = 47;
const uint32_t CARLA_URI_MAP_ID_BUF_NOMINAL_LENGTH = 26;
const uint32_t CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE = 27;
const uint32_t CARLA_URI_MAP_ID_LOG_ERROR = 28;
const uint32_t CARLA_URI_MAP_ID_LOG_NOTE = 29;
const uint32_t CARLA_URI_MAP_ID_LOG_TRACE = 30;
const uint32_t CARLA_URI_MAP_ID_LOG_WARNING = 31;
const uint32_t CARLA_URI_MAP_ID_TIME_POSITION = 32; // base type
const uint32_t CARLA_URI_MAP_ID_TIME_BAR = 33; // values
const uint32_t CARLA_URI_MAP_ID_TIME_BAR_BEAT = 34;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT = 35;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT_UNIT = 36;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_BAR = 37;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE = 38;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 39;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 40;
const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 41;
const uint32_t CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT = 42;
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 43;
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 44;
const uint32_t CARLA_URI_MAP_ID_UI_WINDOW_TITLE = 45;
const uint32_t CARLA_URI_MAP_ID_CARLA_ATOM_WORKER = 46;
const uint32_t CARLA_URI_MAP_ID_CARLA_TRANSIENT_WIN_ID = 47;
const uint32_t CARLA_URI_MAP_ID_COUNT = 48;

// LV2 Feature Ids
const uint32_t kFeatureIdBufSizeBounded = 0;
@@ -283,6 +284,7 @@ struct CarlaPluginLV2Options {
enum OptIndex {
MaxBlockLenth = 0,
MinBlockLenth,
NominalBlockLenth,
SequenceSize,
SampleRate,
FrontendWinId,
@@ -293,6 +295,7 @@ struct CarlaPluginLV2Options {

int maxBufferSize;
int minBufferSize;
int nominalBufferSize;
int sequenceSize;
double sampleRate;
int64_t frontendWinId;
@@ -323,6 +326,14 @@ struct CarlaPluginLV2Options {
optMinBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optMinBlockLenth.value = &minBufferSize;

LV2_Options_Option& optNominalBlockLenth(opts[NominalBlockLenth]);
optNominalBlockLenth.context = LV2_OPTIONS_INSTANCE;
optNominalBlockLenth.subject = 0;
optNominalBlockLenth.key = CARLA_URI_MAP_ID_BUF_NOMINAL_LENGTH;
optNominalBlockLenth.size = sizeof(int);
optNominalBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optNominalBlockLenth.value = &nominalBufferSize;

LV2_Options_Option& optSequenceSize(opts[SequenceSize]);
optSequenceSize.context = LV2_OPTIONS_INSTANCE;
optSequenceSize.subject = 0;
@@ -3782,7 +3793,7 @@ public:

if (fLv2Options.maxBufferSize != newBufferSizeInt || (fLv2Options.minBufferSize != 1 && fLv2Options.minBufferSize != newBufferSizeInt))
{
fLv2Options.maxBufferSize = newBufferSizeInt;
fLv2Options.maxBufferSize = fLv2Options.nominalBufferSize = newBufferSizeInt;

if (fLv2Options.minBufferSize != 1)
fLv2Options.minBufferSize = newBufferSizeInt;
@@ -3790,7 +3801,10 @@ public:
if (fExt.options != nullptr && fExt.options->set != nullptr)
{
fExt.options->set(fHandle, &fLv2Options.opts[CarlaPluginLV2Options::MaxBlockLenth]);
fExt.options->set(fHandle, &fLv2Options.opts[CarlaPluginLV2Options::MinBlockLenth]);
fExt.options->set(fHandle, &fLv2Options.opts[CarlaPluginLV2Options::NominalBlockLenth]);

if (fLv2Options.minBufferSize != 1)
fExt.options->set(fHandle, &fLv2Options.opts[CarlaPluginLV2Options::MinBlockLenth]);
}
}

@@ -4855,10 +4869,11 @@ public:
// ---------------------------------------------------------------
// initialize options

fLv2Options.minBufferSize = 1;
fLv2Options.maxBufferSize = static_cast<int>(pData->engine->getBufferSize());
fLv2Options.sampleRate = pData->engine->getSampleRate();
fLv2Options.frontendWinId = static_cast<int64_t>(pData->engine->getOptions().frontendWinId);
fLv2Options.minBufferSize = 1;
fLv2Options.maxBufferSize = static_cast<int>(pData->engine->getBufferSize());
fLv2Options.nominalBufferSize = fLv2Options.maxBufferSize;
fLv2Options.sampleRate = pData->engine->getSampleRate();
fLv2Options.frontendWinId = static_cast<int64_t>(pData->engine->getOptions().frontendWinId);

uint32_t eventBufferSize = MAX_DEFAULT_BUFFER_SIZE;

@@ -4996,6 +5011,8 @@ public:
// if a fixed buffer is not needed, skip its feature
if (! needsFixedBuffer())
fFeatures[kFeatureIdBufSizeFixed]->URI = LV2_BUF_SIZE__boundedBlockLength;
else
fLv2Options.minBufferSize = fLv2Options.maxBufferSize;

// if power of 2 is not possible, skip its feature FIXME
//if (fLv2Options.maxBufferSize)
@@ -5841,6 +5858,8 @@ private:
return CARLA_URI_MAP_ID_BUF_MAX_LENGTH;
if (std::strcmp(uri, LV2_BUF_SIZE__minBlockLength) == 0)
return CARLA_URI_MAP_ID_BUF_MIN_LENGTH;
if (std::strcmp(uri, LV2_BUF_SIZE__nominalBlockLength) == 0)
return CARLA_URI_MAP_ID_BUF_NOMINAL_LENGTH;
if (std::strcmp(uri, LV2_BUF_SIZE__sequenceSize) == 0)
return CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE;

@@ -5955,6 +5974,8 @@ private:
return LV2_BUF_SIZE__maxBlockLength;
if (urid == CARLA_URI_MAP_ID_BUF_MIN_LENGTH)
return LV2_BUF_SIZE__minBlockLength;
if (urid == CARLA_URI_MAP_ID_BUF_NOMINAL_LENGTH)
return LV2_BUF_SIZE__nominalBlockLength;
if (urid == CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE)
return LV2_BUF_SIZE__sequenceSize;



+ 42
- 25
source/bridges-ui/CarlaBridgeUI-LV2.cpp View File

@@ -64,28 +64,29 @@ const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM = 22;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT = 23;
const uint32_t CARLA_URI_MAP_ID_BUF_MAX_LENGTH = 24;
const uint32_t CARLA_URI_MAP_ID_BUF_MIN_LENGTH = 25;
const uint32_t CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE = 26;
const uint32_t CARLA_URI_MAP_ID_LOG_ERROR = 27;
const uint32_t CARLA_URI_MAP_ID_LOG_NOTE = 28;
const uint32_t CARLA_URI_MAP_ID_LOG_TRACE = 29;
const uint32_t CARLA_URI_MAP_ID_LOG_WARNING = 30;
const uint32_t CARLA_URI_MAP_ID_TIME_POSITION = 31; // base type
const uint32_t CARLA_URI_MAP_ID_TIME_BAR = 32; // values
const uint32_t CARLA_URI_MAP_ID_TIME_BAR_BEAT = 33;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT = 34;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT_UNIT = 35;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_BAR = 36;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE = 37;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 38;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 39;
const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 40;
const uint32_t CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT = 41;
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 42;
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 43;
const uint32_t CARLA_URI_MAP_ID_UI_WINDOW_TITLE = 44;
const uint32_t CARLA_URI_MAP_ID_CARLA_ATOM_WORKER = 45;
const uint32_t CARLA_URI_MAP_ID_CARLA_TRANSIENT_WIN_ID = 46;
const uint32_t CARLA_URI_MAP_ID_COUNT = 47;
const uint32_t CARLA_URI_MAP_ID_BUF_NOMINAL_LENGTH = 26;
const uint32_t CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE = 27;
const uint32_t CARLA_URI_MAP_ID_LOG_ERROR = 28;
const uint32_t CARLA_URI_MAP_ID_LOG_NOTE = 29;
const uint32_t CARLA_URI_MAP_ID_LOG_TRACE = 30;
const uint32_t CARLA_URI_MAP_ID_LOG_WARNING = 31;
const uint32_t CARLA_URI_MAP_ID_TIME_POSITION = 32; // base type
const uint32_t CARLA_URI_MAP_ID_TIME_BAR = 33; // values
const uint32_t CARLA_URI_MAP_ID_TIME_BAR_BEAT = 34;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT = 35;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT_UNIT = 36;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_BAR = 37;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE = 38;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 39;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 40;
const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 41;
const uint32_t CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT = 42;
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 43;
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 44;
const uint32_t CARLA_URI_MAP_ID_UI_WINDOW_TITLE = 45;
const uint32_t CARLA_URI_MAP_ID_CARLA_ATOM_WORKER = 46;
const uint32_t CARLA_URI_MAP_ID_CARLA_TRANSIENT_WIN_ID = 47;
const uint32_t CARLA_URI_MAP_ID_COUNT = 48;

// LV2 Feature Ids
const uint32_t kFeatureIdLogs = 0;
@@ -113,6 +114,7 @@ struct Lv2PluginOptions {
enum OptIndex {
MaxBlockLenth = 0,
MinBlockLenth,
NominalBlockLenth,
SequenceSize,
SampleRate,
FrontendWinId,
@@ -123,6 +125,7 @@ struct Lv2PluginOptions {

int maxBufferSize;
int minBufferSize;
int nominalBufferSize;
int sequenceSize;
double sampleRate;
int64_t frontendWinId;
@@ -132,6 +135,7 @@ struct Lv2PluginOptions {
Lv2PluginOptions() noexcept
: maxBufferSize(0),
minBufferSize(0),
nominalBufferSize(0),
sequenceSize(MAX_DEFAULT_BUFFER_SIZE),
sampleRate(0.0),
frontendWinId(0),
@@ -153,6 +157,14 @@ struct Lv2PluginOptions {
optMinBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optMinBlockLenth.value = &minBufferSize;

LV2_Options_Option& optNominalBlockLenth(opts[NominalBlockLenth]);
optNominalBlockLenth.context = LV2_OPTIONS_INSTANCE;
optNominalBlockLenth.subject = 0;
optNominalBlockLenth.key = CARLA_URI_MAP_ID_BUF_NOMINAL_LENGTH;
optNominalBlockLenth.size = sizeof(int);
optNominalBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optNominalBlockLenth.value = &nominalBufferSize;

LV2_Options_Option& optSequenceSize(opts[SequenceSize]);
optSequenceSize.context = LV2_OPTIONS_INSTANCE;
optSequenceSize.subject = 0;
@@ -222,9 +234,10 @@ public:
// ---------------------------------------------------------------
// initialize options

fLv2Options.minBufferSize = gBufferSize;
fLv2Options.maxBufferSize = gBufferSize;
fLv2Options.sampleRate = gSampleRate;
fLv2Options.minBufferSize = gBufferSize;
fLv2Options.maxBufferSize = gBufferSize;
fLv2Options.nominalBufferSize = gBufferSize;
fLv2Options.sampleRate = gSampleRate;

// ---------------------------------------------------------------
// initialize features (part 1)
@@ -961,6 +974,8 @@ private:
return CARLA_URI_MAP_ID_BUF_MAX_LENGTH;
if (std::strcmp(uri, LV2_BUF_SIZE__minBlockLength) == 0)
return CARLA_URI_MAP_ID_BUF_MIN_LENGTH;
if (std::strcmp(uri, LV2_BUF_SIZE__nominalBlockLength) == 0)
return CARLA_URI_MAP_ID_BUF_NOMINAL_LENGTH;
if (std::strcmp(uri, LV2_BUF_SIZE__sequenceSize) == 0)
return CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE;

@@ -1075,6 +1090,8 @@ private:
return LV2_BUF_SIZE__maxBlockLength;
if (urid == CARLA_URI_MAP_ID_BUF_MIN_LENGTH)
return LV2_BUF_SIZE__minBlockLength;
if (urid == CARLA_URI_MAP_ID_BUF_NOMINAL_LENGTH)
return LV2_BUF_SIZE__nominalBlockLength;
if (urid == CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE)
return LV2_BUF_SIZE__sequenceSize;



+ 1
- 0
source/includes/lv2/buf-size.h View File

@@ -33,6 +33,7 @@
#define LV2_BUF_SIZE__fixedBlockLength LV2_BUF_SIZE_PREFIX "fixedBlockLength"
#define LV2_BUF_SIZE__maxBlockLength LV2_BUF_SIZE_PREFIX "maxBlockLength"
#define LV2_BUF_SIZE__minBlockLength LV2_BUF_SIZE_PREFIX "minBlockLength"
#define LV2_BUF_SIZE__nominalBlockLength LV2_BUF_SIZE_PREFIX "nominalBlockLength"
#define LV2_BUF_SIZE__powerOf2BlockLength LV2_BUF_SIZE_PREFIX "powerOf2BlockLength"
#define LV2_BUF_SIZE__sequenceSize LV2_BUF_SIZE_PREFIX "sequenceSize"



+ 5
- 5
source/modules/distrho/src/DistrhoPluginLV2.cpp View File

@@ -658,7 +658,7 @@ public:
{
for (int i=0; options[i].key != 0; ++i)
{
if (options[i].key == fUridMap->map(fUridMap->handle, LV2_BUF_SIZE__maxBlockLength))
if (options[i].key == fUridMap->map(fUridMap->handle, LV2_BUF_SIZE__nominalBlockLength))
{
if (options[i].type == fUridMap->map(fUridMap->handle, LV2_ATOM__Int))
{
@@ -668,7 +668,7 @@ public:
}
else
{
d_stderr("Host changed maxBlockLength but with wrong value type");
d_stderr("Host changed nominalBlockLength but with wrong value type");
continue;
}
}
@@ -1007,12 +1007,12 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons

for (int i=0; options[i].key != 0; ++i)
{
if (options[i].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength))
if (options[i].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__nominalBlockLength))
{
if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__Int))
d_lastBufferSize = *(const int*)options[i].value;
else
d_stderr("Host provides maxBlockLength but has wrong value type");
d_stderr("Host provides nominalBlockLength but has wrong value type");

break;
}
@@ -1020,7 +1020,7 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons

if (d_lastBufferSize == 0)
{
d_stderr("Host does not provide maxBlockLength option");
d_stderr("Host does not provide nominalBlockLength option");
d_lastBufferSize = 2048;
}



+ 4
- 4
source/plugin/carla-lv2.cpp View File

@@ -142,7 +142,7 @@ public:
carla_debug("Host option %i:\"%s\"", i, uridUnmap->unmap(uridUnmap->handle, options[i].key));
}

if (options[i].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength))
if (options[i].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__nominalBlockLength))
{
if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__Int))
{
@@ -152,7 +152,7 @@ public:
fBufferSize = static_cast<uint32_t>(value);
}
else
carla_stderr("Host provides maxBlockLength but has wrong value type");
carla_stderr("Host provides nominalBlockLength but has wrong value type");

break;
}
@@ -594,7 +594,7 @@ public:
{
for (int i=0; options[i].key != 0; ++i)
{
if (options[i].key == fUridMap->map(fUridMap->handle, LV2_BUF_SIZE__maxBlockLength))
if (options[i].key == fUridMap->map(fUridMap->handle, LV2_BUF_SIZE__nominalBlockLength))
{
if (options[i].type == fUridMap->map(fUridMap->handle, LV2_ATOM__Int))
{
@@ -607,7 +607,7 @@ public:
fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_BUFFER_SIZE_CHANGED, 0, value, nullptr, 0.0f);
}
else
carla_stderr("Host changed maxBlockLength but with wrong value type");
carla_stderr("Host changed nominalBlockLength but with wrong value type");
}
else if (options[i].key == fUridMap->map(fUridMap->handle, LV2_CORE__sampleRate))
{


Loading…
Cancel
Save