DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit bbc59691fcbd968514d72da7d88499e0bde1379a
parent 03ddba518eebedc08710123e3e3a83b18662da15
Author: falkTX <falktx@gmail.com>
Date:   Mon, 25 Aug 2014 23:44:08 +0100

Allow LV2 UIs to skip options if not using show-interface

Diffstat:
Mdistrho/src/DistrhoUILV2.cpp | 36+++++++++++++++++++++++-------------
1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/distrho/src/DistrhoUILV2.cpp b/distrho/src/DistrhoUILV2.cpp @@ -58,6 +58,9 @@ public: if (winId != 0) return; + // if winId != 0 then options must not be null + DISTRHO_SAFE_ASSERT_RETURN(options != nullptr,); + const LV2_URID uridWindowTitle(uridMap->map(uridMap->handle, LV2_UI__windowTitle)); const LV2_URID uridFrontendWinId(uridMap->map(uridMap->handle, "http://kxstudio.sf.net/ns/carla/frontendWinId")); @@ -351,9 +354,9 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, #endif } - if (options == nullptr) + if (options == nullptr && parentId == nullptr) { - d_stderr("Options feature missing, cannot continue!"); + d_stderr("Options feature missing (needed for show-interface), cannot continue!"); return nullptr; } @@ -376,10 +379,11 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, } if (const LV2_DirectAccess_Interface* const directAccess = (const LV2_DirectAccess_Interface*)extData->data_access(DISTRHO_DIRECT_ACCESS_URI)) - { instance = directAccess->get_instance_pointer(instance); - } else + instance = nullptr; + + if (instance == nullptr) { d_stderr("Failed to get direct access, cannot continue!"); return nullptr; @@ -390,23 +394,29 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, const intptr_t winId((intptr_t)parentId); - const LV2_URID uridSampleRate(uridMap->map(uridMap->handle, LV2_CORE__sampleRate)); - - for (int i=0; options[i].key != 0; ++i) + if (options != nullptr) { - if (options[i].key == uridSampleRate) + const LV2_URID uridSampleRate(uridMap->map(uridMap->handle, LV2_CORE__sampleRate)); + + for (int i=0; options[i].key != 0; ++i) { - if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__Double)) - d_lastUiSampleRate = *(const double*)options[i].value; - else - d_stderr("Host provides sampleRate but has wrong value type"); + if (options[i].key == uridSampleRate) + { + if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__Double)) + d_lastUiSampleRate = *(const double*)options[i].value; + else + d_stderr("Host provides sampleRate but has wrong value type"); - break; + break; + } } } if (d_lastUiSampleRate == 0.0) + { + d_stdout("WARNING: this host does not send sample-rate information for LV2 UIs, using 44100 as fallback (this could be wrong)"); d_lastUiSampleRate = 44100.0; + } return new UiLv2(winId, options, uridMap, uiResize, uiTouch, controller, writeFunction, instance); }