Browse Source

Fallback to maxBlockLength if host doesn't support nominal

pull/6/head
falkTX 9 years ago
parent
commit
d0179ed308
1 changed files with 36 additions and 11 deletions
  1. +36
    -11
      distrho/src/DistrhoPluginLV2.cpp

+ 36
- 11
distrho/src/DistrhoPluginLV2.cpp View File

@@ -52,8 +52,9 @@ typedef std::map<const String, String> StringMap;
class PluginLv2 class PluginLv2
{ {
public: public:
PluginLv2(const double sampleRate, const LV2_URID_Map* const uridMap, const LV2_Worker_Schedule* const worker)
: fPortControls(nullptr),
PluginLv2(const double sampleRate, const LV2_URID_Map* const uridMap, const LV2_Worker_Schedule* const worker, const bool usingNominal)
: fUsingNominal(usingNominal),
fPortControls(nullptr),
fLastControlValues(nullptr), fLastControlValues(nullptr),
fSampleRate(sampleRate), fSampleRate(sampleRate),
#if DISTRHO_LV2_USE_EVENTS_IN || DISTRHO_LV2_USE_EVENTS_OUT #if DISTRHO_LV2_USE_EVENTS_IN || DISTRHO_LV2_USE_EVENTS_OUT
@@ -663,31 +664,39 @@ public:
{ {
if (options[i].key == fUridMap->map(fUridMap->handle, LV2_BUF_SIZE__nominalBlockLength)) if (options[i].key == fUridMap->map(fUridMap->handle, LV2_BUF_SIZE__nominalBlockLength))
{ {
if (options[i].type == fUridMap->map(fUridMap->handle, LV2_ATOM__Int))
if (options[i].type == fURIDs.atomInt)
{ {
const int bufferSize(*(const int*)options[i].value); const int bufferSize(*(const int*)options[i].value);
fPlugin.setBufferSize(bufferSize); fPlugin.setBufferSize(bufferSize);
continue;
} }
else else
{ {
d_stderr("Host changed nominalBlockLength but with wrong value type"); d_stderr("Host changed nominalBlockLength but with wrong value type");
continue;
}
}
else if (options[i].key == fUridMap->map(fUridMap->handle, LV2_BUF_SIZE__maxBlockLength) && ! fUsingNominal)
{
if (options[i].type == fURIDs.atomInt)
{
const int bufferSize(*(const int*)options[i].value);
fPlugin.setBufferSize(bufferSize);
}
else
{
d_stderr("Host changed maxBlockLength but with wrong value type");
} }
} }
else if (options[i].key == fUridMap->map(fUridMap->handle, LV2_CORE__sampleRate)) else if (options[i].key == fUridMap->map(fUridMap->handle, LV2_CORE__sampleRate))
{ {
if (options[i].type == fUridMap->map(fUridMap->handle, LV2_ATOM__Double))
if (options[i].type == fURIDs.atomDouble)
{ {
const double sampleRate(*(const double*)options[i].value); const double sampleRate(*(const double*)options[i].value);
fSampleRate = sampleRate; fSampleRate = sampleRate;
fPlugin.setSampleRate(sampleRate); fPlugin.setSampleRate(sampleRate);
continue;
} }
else else
{ {
d_stderr("Host changed sampleRate but with wrong value type"); d_stderr("Host changed sampleRate but with wrong value type");
continue;
} }
} }
} }
@@ -815,6 +824,7 @@ public:


private: private:
PluginExporter fPlugin; PluginExporter fPlugin;
const bool fUsingNominal; // if false use maxBlockLength


// LV2 ports // LV2 ports
#if DISTRHO_PLUGIN_NUM_INPUTS > 0 #if DISTRHO_PLUGIN_NUM_INPUTS > 0
@@ -1007,29 +1017,44 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons
#endif #endif


d_lastBufferSize = 0; d_lastBufferSize = 0;
usingNominal = false;


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

if (options[i].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength))
{
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");

// no break, continue in case host supports nominalBlockLength
}
} }


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


d_lastSampleRate = sampleRate; d_lastSampleRate = sampleRate;


return new PluginLv2(sampleRate, uridMap, worker);
return new PluginLv2(sampleRate, uridMap, worker, usingNominal);
} }


#define instancePtr ((PluginLv2*)instance) #define instancePtr ((PluginLv2*)instance)


Loading…
Cancel
Save