| @@ -52,8 +52,9 @@ typedef std::map<const String, String> StringMap; | |||
| class PluginLv2 | |||
| { | |||
| 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), | |||
| fSampleRate(sampleRate), | |||
| #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].type == fUridMap->map(fUridMap->handle, LV2_ATOM__Int)) | |||
| if (options[i].type == fURIDs.atomInt) | |||
| { | |||
| const int bufferSize(*(const int*)options[i].value); | |||
| fPlugin.setBufferSize(bufferSize); | |||
| continue; | |||
| } | |||
| else | |||
| { | |||
| 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)) | |||
| { | |||
| 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); | |||
| fSampleRate = sampleRate; | |||
| fPlugin.setSampleRate(sampleRate); | |||
| continue; | |||
| } | |||
| else | |||
| { | |||
| d_stderr("Host changed sampleRate but with wrong value type"); | |||
| continue; | |||
| } | |||
| } | |||
| } | |||
| @@ -815,6 +824,7 @@ public: | |||
| private: | |||
| PluginExporter fPlugin; | |||
| const bool fUsingNominal; // if false use maxBlockLength | |||
| // LV2 ports | |||
| #if DISTRHO_PLUGIN_NUM_INPUTS > 0 | |||
| @@ -1007,29 +1017,44 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons | |||
| #endif | |||
| d_lastBufferSize = 0; | |||
| usingNominal = false; | |||
| for (int i=0; options[i].key != 0; ++i) | |||
| { | |||
| 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; | |||
| usingNominal = true; | |||
| } | |||
| else | |||
| { | |||
| d_stderr("Host provides nominalBlockLength but has wrong value type"); | |||
| } | |||
| 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) | |||
| { | |||
| d_stderr("Host does not provide nominalBlockLength option"); | |||
| d_stderr("Host does not provide nominalBlockLength or maxBlockLength options"); | |||
| d_lastBufferSize = 2048; | |||
| } | |||
| d_lastSampleRate = sampleRate; | |||
| return new PluginLv2(sampleRate, uridMap, worker); | |||
| return new PluginLv2(sampleRate, uridMap, worker, usingNominal); | |||
| } | |||
| #define instancePtr ((PluginLv2*)instance) | |||