| @@ -837,15 +837,10 @@ public: | |||||
| */ | */ | ||||
| double getSampleRate() const noexcept; | double getSampleRate() const noexcept; | ||||
| /** | |||||
| Get the absolute filename of the plugin binary. | |||||
| Under certain systems or plugin formats the binary will be inside the plugin bundle. | |||||
| */ | |||||
| const char* getBinaryFilename() const noexcept; | |||||
| /** | /** | ||||
| Get the bundle path where the plugin resides. | Get the bundle path where the plugin resides. | ||||
| Can return null if the plugin is not available in a bundle (if it is a single binary). | Can return null if the plugin is not available in a bundle (if it is a single binary). | ||||
| @see getBinaryFilename | |||||
| */ | */ | ||||
| const char* getBundlePath() const noexcept; | const char* getBundlePath() const noexcept; | ||||
| @@ -32,3 +32,10 @@ | |||||
| #else | #else | ||||
| # error unsupported format | # error unsupported format | ||||
| #endif | #endif | ||||
| #if defined(DISTRHO_PLUGIN_TARGET_JACK) | |||||
| # define DISTRHO_IS_STANDALONE 1 | |||||
| #else | |||||
| # define DISTRHO_IS_STANDALONE 0 | |||||
| #endif | |||||
| #include "src/DistrhoUtils.cpp" | |||||
| @@ -22,7 +22,14 @@ | |||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| // ----------------------------------------------------------------------------------------------------------- | // ----------------------------------------------------------------------------------------------------------- | ||||
| // misc functions | |||||
| // plugin related utilities | |||||
| /** | |||||
| Get the absolute filename of the plugin DSP/UI binary.@n | |||||
| Under certain systems or plugin formats the binary will be inside the plugin bundle.@n | |||||
| Also, in some formats or setups, the DSP and UI binaries are in different files. | |||||
| */ | |||||
| const char* getBinaryFilename(); | |||||
| /** | /** | ||||
| Get a string representation of the current plugin format we are building against.@n | Get a string representation of the current plugin format we are building against.@n | ||||
| @@ -131,16 +131,10 @@ public: | |||||
| */ | */ | ||||
| double getSampleRate() const noexcept; | double getSampleRate() const noexcept; | ||||
| /** | |||||
| Get the absolute filename of the UI binary.@n | |||||
| Under certain systems or plugin formats the binary will be inside the plugin bundle.@n | |||||
| Also, in some formats or setups, this file might not be the same as the DSP/plugin side (because of DSP/UI separation). | |||||
| */ | |||||
| const char* getBinaryFilename() const noexcept; | |||||
| /** | /** | ||||
| Get the bundle path where the UI resides.@n | Get the bundle path where the UI resides.@n | ||||
| Can return null if the UI is not available in a bundle (if it is a single binary). | Can return null if the UI is not available in a bundle (if it is a single binary). | ||||
| @see getBinaryFilename | |||||
| */ | */ | ||||
| const char* getBundlePath() const noexcept; | const char* getBundlePath() const noexcept; | ||||
| @@ -31,3 +31,12 @@ | |||||
| #else | #else | ||||
| # error unsupported format | # error unsupported format | ||||
| #endif | #endif | ||||
| #if !DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||||
| # if defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_DSSI) | |||||
| # define DISTRHO_IS_STANDALONE 1 | |||||
| # else | |||||
| # define DISTRHO_IS_STANDALONE 0 | |||||
| # endif | |||||
| # include "src/DistrhoUtils.cpp" | |||||
| #endif | |||||
| @@ -21,9 +21,10 @@ START_NAMESPACE_DISTRHO | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * Static data, see DistrhoPluginInternal.hpp */ | * Static data, see DistrhoPluginInternal.hpp */ | ||||
| uint32_t d_lastBufferSize = 0; | |||||
| double d_lastSampleRate = 0.0; | |||||
| bool d_lastCanRequestParameterValueChanges = false; | |||||
| uint32_t d_nextBufferSize = 0; | |||||
| double d_nextSampleRate = 0.0; | |||||
| const char* d_nextBundlePath = nullptr; | |||||
| bool d_nextCanRequestParameterValueChanges = false; | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * Static fallback data, see DistrhoPluginInternal.hpp */ | * Static fallback data, see DistrhoPluginInternal.hpp */ | ||||
| @@ -100,11 +101,6 @@ double Plugin::getSampleRate() const noexcept | |||||
| return pData->sampleRate; | return pData->sampleRate; | ||||
| } | } | ||||
| const char* Plugin::getBinaryFilename() const noexcept | |||||
| { | |||||
| return pData->binaryFilename; | |||||
| } | |||||
| const char* Plugin::getBundlePath() const noexcept | const char* Plugin::getBundlePath() const noexcept | ||||
| { | { | ||||
| return pData->bundlePath; | return pData->bundlePath; | ||||
| @@ -31,9 +31,10 @@ static const uint32_t kMaxMidiEvents = 512; | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Static data, see DistrhoPlugin.cpp | // Static data, see DistrhoPlugin.cpp | ||||
| extern uint32_t d_lastBufferSize; | |||||
| extern double d_lastSampleRate; | |||||
| extern bool d_lastCanRequestParameterValueChanges; | |||||
| extern uint32_t d_nextBufferSize; | |||||
| extern double d_nextSampleRate; | |||||
| extern const char* d_nextBundlePath; | |||||
| extern bool d_nextCanRequestParameterValueChanges; | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // DSP callbacks | // DSP callbacks | ||||
| @@ -122,7 +123,6 @@ struct Plugin::PrivateData { | |||||
| uint32_t bufferSize; | uint32_t bufferSize; | ||||
| double sampleRate; | double sampleRate; | ||||
| char* binaryFilename; | |||||
| char* bundlePath; | char* bundlePath; | ||||
| bool canRequestParameterValueChanges; | bool canRequestParameterValueChanges; | ||||
| @@ -151,11 +151,10 @@ struct Plugin::PrivateData { | |||||
| callbacksPtr(nullptr), | callbacksPtr(nullptr), | ||||
| writeMidiCallbackFunc(nullptr), | writeMidiCallbackFunc(nullptr), | ||||
| requestParameterValueChangeCallbackFunc(nullptr), | requestParameterValueChangeCallbackFunc(nullptr), | ||||
| bufferSize(d_lastBufferSize), | |||||
| sampleRate(d_lastSampleRate), | |||||
| binaryFilename(nullptr), | |||||
| bundlePath(nullptr), | |||||
| canRequestParameterValueChanges(d_lastCanRequestParameterValueChanges) | |||||
| bufferSize(d_nextBufferSize), | |||||
| sampleRate(d_nextSampleRate), | |||||
| bundlePath(d_nextBundlePath != nullptr ? strdup(d_nextBundlePath) : nullptr), | |||||
| canRequestParameterValueChanges(d_nextCanRequestParameterValueChanges) | |||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT(bufferSize != 0); | DISTRHO_SAFE_ASSERT(bufferSize != 0); | ||||
| DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); | DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); | ||||
| @@ -230,12 +229,6 @@ struct Plugin::PrivateData { | |||||
| } | } | ||||
| #endif | #endif | ||||
| if (binaryFilename != nullptr) | |||||
| { | |||||
| std::free(binaryFilename); | |||||
| binaryFilename = nullptr; | |||||
| } | |||||
| if (bundlePath != nullptr) | if (bundlePath != nullptr) | ||||
| { | { | ||||
| std::free(bundlePath); | std::free(bundlePath); | ||||
| @@ -115,7 +115,7 @@ public: | |||||
| #if DISTRHO_PLUGIN_HAS_UI | #if DISTRHO_PLUGIN_HAS_UI | ||||
| fUI(this, | fUI(this, | ||||
| 0, // winId | 0, // winId | ||||
| d_lastSampleRate, | |||||
| d_nextSampleRate, | |||||
| nullptr, // edit param | nullptr, // edit param | ||||
| setParameterValueCallback, | setParameterValueCallback, | ||||
| setStateCallback, | setStateCallback, | ||||
| @@ -804,9 +804,9 @@ int main() | |||||
| initSignalHandler(); | initSignalHandler(); | ||||
| d_lastBufferSize = jackbridge_get_buffer_size(client); | |||||
| d_lastSampleRate = jackbridge_get_sample_rate(client); | |||||
| d_lastCanRequestParameterValueChanges = true; | |||||
| d_nextBufferSize = jackbridge_get_buffer_size(client); | |||||
| d_nextSampleRate = jackbridge_get_sample_rate(client); | |||||
| d_nextCanRequestParameterValueChanges = true; | |||||
| const PluginJack p(client); | const PluginJack p(client); | ||||
| @@ -418,9 +418,9 @@ private: | |||||
| static LADSPA_Handle ladspa_instantiate(const LADSPA_Descriptor*, ulong sampleRate) | static LADSPA_Handle ladspa_instantiate(const LADSPA_Descriptor*, ulong sampleRate) | ||||
| { | { | ||||
| if (d_lastBufferSize == 0) | |||||
| d_lastBufferSize = 2048; | |||||
| d_lastSampleRate = sampleRate; | |||||
| if (d_nextBufferSize == 0) | |||||
| d_nextBufferSize = 2048; | |||||
| d_nextSampleRate = sampleRate; | |||||
| return new PluginLadspaDssi(); | return new PluginLadspaDssi(); | ||||
| } | } | ||||
| @@ -551,11 +551,11 @@ static const struct DescriptorInitializer | |||||
| DescriptorInitializer() | DescriptorInitializer() | ||||
| { | { | ||||
| // Create dummy plugin to get data from | // Create dummy plugin to get data from | ||||
| d_lastBufferSize = 512; | |||||
| d_lastSampleRate = 44100.0; | |||||
| d_nextBufferSize = 512; | |||||
| d_nextSampleRate = 44100.0; | |||||
| const PluginExporter plugin(nullptr, nullptr, nullptr); | const PluginExporter plugin(nullptr, nullptr, nullptr); | ||||
| d_lastBufferSize = 0; | |||||
| d_lastSampleRate = 0.0; | |||||
| d_nextBufferSize = 0; | |||||
| d_nextSampleRate = 0.0; | |||||
| // Get port count, init | // Get port count, init | ||||
| ulong port = 0; | ulong port = 0; | ||||
| @@ -1296,7 +1296,7 @@ private: | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, const char*, const LV2_Feature* const* features) | |||||
| static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, const char* bundlePath, const LV2_Feature* const* features) | |||||
| { | { | ||||
| const LV2_Options_Option* options = nullptr; | const LV2_Options_Option* options = nullptr; | ||||
| const LV2_URID_Map* uridMap = nullptr; | const LV2_URID_Map* uridMap = nullptr; | ||||
| @@ -1339,7 +1339,7 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons | |||||
| mod_license_check(features, DISTRHO_PLUGIN_URI); | mod_license_check(features, DISTRHO_PLUGIN_URI); | ||||
| #endif | #endif | ||||
| d_lastBufferSize = 0; | |||||
| d_nextBufferSize = 0; | |||||
| bool usingNominal = false; | bool usingNominal = false; | ||||
| for (int i=0; options[i].key != 0; ++i) | for (int i=0; options[i].key != 0; ++i) | ||||
| @@ -1348,7 +1348,7 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons | |||||
| { | { | ||||
| 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_nextBufferSize = *(const int*)options[i].value; | |||||
| usingNominal = true; | usingNominal = true; | ||||
| } | } | ||||
| else | else | ||||
| @@ -1361,7 +1361,7 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons | |||||
| if (options[i].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength)) | if (options[i].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength)) | ||||
| { | { | ||||
| 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_nextBufferSize = *(const int*)options[i].value; | |||||
| else | else | ||||
| d_stderr("Host provides maxBlockLength but has wrong value type"); | d_stderr("Host provides maxBlockLength but has wrong value type"); | ||||
| @@ -1369,14 +1369,15 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons | |||||
| } | } | ||||
| } | } | ||||
| if (d_lastBufferSize == 0) | |||||
| if (d_nextBufferSize == 0) | |||||
| { | { | ||||
| d_stderr("Host does not provide nominalBlockLength or maxBlockLength options"); | d_stderr("Host does not provide nominalBlockLength or maxBlockLength options"); | ||||
| d_lastBufferSize = 2048; | |||||
| d_nextBufferSize = 2048; | |||||
| } | } | ||||
| d_lastSampleRate = sampleRate; | |||||
| d_lastCanRequestParameterValueChanges = ctrlInPortChangeReq != nullptr; | |||||
| d_nextSampleRate = sampleRate; | |||||
| d_nextBundlePath = bundlePath; | |||||
| d_nextCanRequestParameterValueChanges = ctrlInPortChangeReq != nullptr; | |||||
| return new PluginLv2(sampleRate, uridMap, worker, ctrlInPortChangeReq, usingNominal); | return new PluginLv2(sampleRate, uridMap, worker, ctrlInPortChangeReq, usingNominal); | ||||
| } | } | ||||
| @@ -224,11 +224,11 @@ void lv2_generate_ttl(const char* const basename) | |||||
| USE_NAMESPACE_DISTRHO | USE_NAMESPACE_DISTRHO | ||||
| // Dummy plugin to get data from | // Dummy plugin to get data from | ||||
| d_lastBufferSize = 512; | |||||
| d_lastSampleRate = 44100.0; | |||||
| d_nextBufferSize = 512; | |||||
| d_nextSampleRate = 44100.0; | |||||
| PluginExporter plugin(nullptr, nullptr, nullptr); | PluginExporter plugin(nullptr, nullptr, nullptr); | ||||
| d_lastBufferSize = 0; | |||||
| d_lastSampleRate = 0.0; | |||||
| d_nextBufferSize = 0; | |||||
| d_nextSampleRate = 0.0; | |||||
| const String pluginDLL(basename); | const String pluginDLL(basename); | ||||
| const String pluginTTL(pluginDLL + ".ttl"); | const String pluginTTL(pluginDLL + ".ttl"); | ||||
| @@ -1403,9 +1403,9 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t | |||||
| if (doInternalInit) | if (doInternalInit) | ||||
| { | { | ||||
| // set valid but dummy values | // set valid but dummy values | ||||
| d_lastBufferSize = 512; | |||||
| d_lastSampleRate = 44100.0; | |||||
| d_lastCanRequestParameterValueChanges = true; | |||||
| d_nextBufferSize = 512; | |||||
| d_nextSampleRate = 44100.0; | |||||
| d_nextCanRequestParameterValueChanges = true; | |||||
| } | } | ||||
| // Create dummy plugin to get data from | // Create dummy plugin to get data from | ||||
| @@ -1414,9 +1414,9 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t | |||||
| if (doInternalInit) | if (doInternalInit) | ||||
| { | { | ||||
| // unset | // unset | ||||
| d_lastBufferSize = 0; | |||||
| d_lastSampleRate = 0.0; | |||||
| d_lastCanRequestParameterValueChanges = false; | |||||
| d_nextBufferSize = 0; | |||||
| d_nextSampleRate = 0.0; | |||||
| d_nextCanRequestParameterValueChanges = false; | |||||
| *(PluginExporter**)ptr = &plugin; | *(PluginExporter**)ptr = &plugin; | ||||
| return 0; | return 0; | ||||
| @@ -1437,15 +1437,15 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t | |||||
| audioMasterCallback audioMaster = (audioMasterCallback)obj->audioMaster; | audioMasterCallback audioMaster = (audioMasterCallback)obj->audioMaster; | ||||
| d_lastBufferSize = audioMaster(effect, audioMasterGetBlockSize, 0, 0, nullptr, 0.0f); | |||||
| d_lastSampleRate = audioMaster(effect, audioMasterGetSampleRate, 0, 0, nullptr, 0.0f); | |||||
| d_lastCanRequestParameterValueChanges = true; | |||||
| d_nextBufferSize = audioMaster(effect, audioMasterGetBlockSize, 0, 0, nullptr, 0.0f); | |||||
| d_nextSampleRate = audioMaster(effect, audioMasterGetSampleRate, 0, 0, nullptr, 0.0f); | |||||
| d_nextCanRequestParameterValueChanges = true; | |||||
| // some hosts are not ready at this point or return 0 buffersize/samplerate | // some hosts are not ready at this point or return 0 buffersize/samplerate | ||||
| if (d_lastBufferSize == 0) | |||||
| d_lastBufferSize = 2048; | |||||
| if (d_lastSampleRate <= 0.0) | |||||
| d_lastSampleRate = 44100.0; | |||||
| if (d_nextBufferSize == 0) | |||||
| d_nextBufferSize = 2048; | |||||
| if (d_nextSampleRate <= 0.0) | |||||
| d_nextSampleRate = 44100.0; | |||||
| obj->plugin = new PluginVst(audioMaster, effect); | obj->plugin = new PluginVst(audioMaster, effect); | ||||
| return 1; | return 1; | ||||
| @@ -3094,8 +3094,8 @@ struct dpf_audio_processor : v3_audio_processor_cpp { | |||||
| PluginVst3* const vst3 = processor->vst3; | PluginVst3* const vst3 = processor->vst3; | ||||
| DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); | DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); | ||||
| d_lastBufferSize = setup->max_block_size; | |||||
| d_lastSampleRate = setup->sample_rate; | |||||
| d_nextBufferSize = setup->max_block_size; | |||||
| d_nextSampleRate = setup->sample_rate; | |||||
| return processor->vst3->setupProcessing(setup); | return processor->vst3->setupProcessing(setup); | ||||
| } | } | ||||
| @@ -3389,12 +3389,12 @@ struct dpf_component : v3_component_cpp { | |||||
| host = component->hostContextFromFactory; | host = component->hostContextFromFactory; | ||||
| // default early values | // default early values | ||||
| if (d_lastBufferSize == 0) | |||||
| d_lastBufferSize = 2048; | |||||
| if (d_lastSampleRate <= 0.0) | |||||
| d_lastSampleRate = 44100.0; | |||||
| if (d_nextBufferSize == 0) | |||||
| d_nextBufferSize = 2048; | |||||
| if (d_nextSampleRate <= 0.0) | |||||
| d_nextSampleRate = 44100.0; | |||||
| d_lastCanRequestParameterValueChanges = true; | |||||
| d_nextCanRequestParameterValueChanges = true; | |||||
| component->vst3 = new PluginVst3(host); | component->vst3 = new PluginVst3(host); | ||||
| return V3_OK; | return V3_OK; | ||||
| @@ -3541,13 +3541,13 @@ struct dpf_component : v3_component_cpp { | |||||
| static const PluginExporter& _getPluginInfo() | static const PluginExporter& _getPluginInfo() | ||||
| { | { | ||||
| d_lastBufferSize = 512; | |||||
| d_lastSampleRate = 44100.0; | |||||
| d_lastCanRequestParameterValueChanges = true; | |||||
| d_nextBufferSize = 512; | |||||
| d_nextSampleRate = 44100.0; | |||||
| d_nextCanRequestParameterValueChanges = true; | |||||
| static const PluginExporter gPluginInfo(nullptr, nullptr, nullptr); | static const PluginExporter gPluginInfo(nullptr, nullptr, nullptr); | ||||
| d_lastBufferSize = 0; | |||||
| d_lastSampleRate = 0.0; | |||||
| d_lastCanRequestParameterValueChanges = false; | |||||
| d_nextBufferSize = 0; | |||||
| d_nextSampleRate = 0.0; | |||||
| d_nextCanRequestParameterValueChanges = false; | |||||
| return gPluginInfo; | return gPluginInfo; | ||||
| } | } | ||||
| @@ -32,14 +32,16 @@ | |||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * Static data, see DistrhoUIInternal.hpp */ | * Static data, see DistrhoUIInternal.hpp */ | ||||
| const char* g_nextBundlePath = nullptr; | |||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| uintptr_t g_nextWindowId = 0; | uintptr_t g_nextWindowId = 0; | ||||
| double g_nextScaleFactor = 1.0; | double g_nextScaleFactor = 1.0; | ||||
| const char* g_nextBundlePath = nullptr; | |||||
| #endif | |||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * get global scale factor */ | * get global scale factor */ | ||||
| @@ -217,11 +219,6 @@ double UI::getSampleRate() const noexcept | |||||
| return uiData->sampleRate; | return uiData->sampleRate; | ||||
| } | } | ||||
| const char* UI::getBinaryFilename() const noexcept | |||||
| { | |||||
| return uiData->binaryFilename; | |||||
| } | |||||
| const char* UI::getBundlePath() const noexcept | const char* UI::getBundlePath() const noexcept | ||||
| { | { | ||||
| return uiData->bundlePath; | return uiData->bundlePath; | ||||
| @@ -270,7 +267,7 @@ void* UI::getPluginInstancePointer() const noexcept | |||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | ||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * External UI helpers */ | |||||
| * External UI helpers (static calls) */ | |||||
| const char* UI::getNextBundlePath() noexcept | const char* UI::getNextBundlePath() noexcept | ||||
| { | { | ||||
| @@ -24,10 +24,10 @@ START_NAMESPACE_DISTRHO | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Static data, see DistrhoUI.cpp | // Static data, see DistrhoUI.cpp | ||||
| extern const char* g_nextBundlePath; | |||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | ||||
| extern uintptr_t g_nextWindowId; | extern uintptr_t g_nextWindowId; | ||||
| extern double g_nextScaleFactor; | extern double g_nextScaleFactor; | ||||
| extern const char* g_nextBundlePath; | |||||
| #endif | #endif | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -77,19 +77,19 @@ public: | |||||
| uiData->setSizeCallbackFunc = setSizeCall; | uiData->setSizeCallbackFunc = setSizeCall; | ||||
| uiData->fileRequestCallbackFunc = fileRequestCall; | uiData->fileRequestCallbackFunc = fileRequestCall; | ||||
| g_nextBundlePath = bundlePath; | |||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | ||||
| g_nextWindowId = winId; | g_nextWindowId = winId; | ||||
| g_nextScaleFactor = scaleFactor; | g_nextScaleFactor = scaleFactor; | ||||
| g_nextBundlePath = bundlePath; | |||||
| #endif | #endif | ||||
| UI::PrivateData::s_nextPrivateData = uiData; | UI::PrivateData::s_nextPrivateData = uiData; | ||||
| UI* const uiPtr = createUI(); | UI* const uiPtr = createUI(); | ||||
| g_nextBundlePath = nullptr; | |||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | ||||
| g_nextWindowId = 0; | g_nextWindowId = 0; | ||||
| g_nextScaleFactor = 0.0; | g_nextScaleFactor = 0.0; | ||||
| g_nextBundlePath = nullptr; | |||||
| #else | #else | ||||
| // enter context called in the PluginWindow constructor, see DistrhoUIPrivateData.hpp | // enter context called in the PluginWindow constructor, see DistrhoUIPrivateData.hpp | ||||
| uiData->window->leaveContext(); | uiData->window->leaveContext(); | ||||
| @@ -308,7 +308,6 @@ struct UI::PrivateData { | |||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI && !defined(DGL_FILE_BROWSER_DISABLED) | #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI && !defined(DGL_FILE_BROWSER_DISABLED) | ||||
| char* uiStateFileKeyRequest; | char* uiStateFileKeyRequest; | ||||
| #endif | #endif | ||||
| char* binaryFilename; | |||||
| char* bundlePath; | char* bundlePath; | ||||
| // Callbacks | // Callbacks | ||||
| @@ -333,7 +332,6 @@ struct UI::PrivateData { | |||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI && !defined(DGL_FILE_BROWSER_DISABLED) | #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI && !defined(DGL_FILE_BROWSER_DISABLED) | ||||
| uiStateFileKeyRequest(nullptr), | uiStateFileKeyRequest(nullptr), | ||||
| #endif | #endif | ||||
| binaryFilename(nullptr), | |||||
| bundlePath(nullptr), | bundlePath(nullptr), | ||||
| callbacksPtr(nullptr), | callbacksPtr(nullptr), | ||||
| editParamCallbackFunc(nullptr), | editParamCallbackFunc(nullptr), | ||||
| @@ -374,7 +372,6 @@ struct UI::PrivateData { | |||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI && !defined(DGL_FILE_BROWSER_DISABLED) | #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI && !defined(DGL_FILE_BROWSER_DISABLED) | ||||
| std::free(uiStateFileKeyRequest); | std::free(uiStateFileKeyRequest); | ||||
| #endif | #endif | ||||
| std::free(binaryFilename); | |||||
| std::free(bundlePath); | std::free(bundlePath); | ||||
| } | } | ||||
| @@ -14,6 +14,28 @@ | |||||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| */ | */ | ||||
| #ifndef DISTRHO_IS_STANDALONE | |||||
| # error Wrong build configuration | |||||
| #endif | |||||
| #include "extra/String.hpp" | |||||
| #ifndef DISTRHO_OS_WINDOWS | |||||
| # include <dlfcn.h> | |||||
| #endif | |||||
| #if defined(DISTRHO_OS_WINDOWS) && !DISTRHO_IS_STANDALONE | |||||
| static HINSTANCE hInstance = nullptr; | |||||
| DISTRHO_PLUGIN_EXPORT | |||||
| BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID) | |||||
| { | |||||
| if (reason == DLL_PROCESS_ATTACH) | |||||
| hInstance = hInst; | |||||
| return 1; | |||||
| } | |||||
| #endif | |||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| #ifdef DISTRHO_PLUGIN_TARGET_JACK | #ifdef DISTRHO_PLUGIN_TARGET_JACK | ||||
| @@ -21,6 +43,31 @@ START_NAMESPACE_DISTRHO | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| const char* getBinaryFilename() | |||||
| { | |||||
| static String filename; | |||||
| if (filename.isNotEmpty()) | |||||
| return filename; | |||||
| #ifdef DISTRHO_OS_WINDOWS | |||||
| # if DISTRHO_IS_STANDALONE | |||||
| // TODO | |||||
| # else | |||||
| CHAR filenameBuf[MAX_PATH + 256]; | |||||
| filenameBuf[0] = '\0'; | |||||
| GetModuleFileName(hInstance, filenameBuf, sizeof(filenameBuf)); | |||||
| filename = filenameBuf; | |||||
| # endif | |||||
| #else | |||||
| Dl_info info; | |||||
| dladdr((void*)getBinaryFilename, &info); | |||||
| filename = info.dli_fname; | |||||
| #endif | |||||
| return filename; | |||||
| } | |||||
| const char* getPluginFormatName() noexcept | const char* getPluginFormatName() noexcept | ||||
| { | { | ||||
| #if defined(DISTRHO_PLUGIN_TARGET_CARLA) | #if defined(DISTRHO_PLUGIN_TARGET_CARLA) | ||||