diff --git a/distrho/src/DistrhoPluginInternal.hpp b/distrho/src/DistrhoPluginInternal.hpp index e42fe867..a92de45b 100644 --- a/distrho/src/DistrhoPluginInternal.hpp +++ b/distrho/src/DistrhoPluginInternal.hpp @@ -338,6 +338,64 @@ public: DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + { + uint32_t j=0; +# if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i, ++j) + fPlugin->initAudioPort(true, i, fData->audioPorts[j]); +# endif +# if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i, ++j) + fPlugin->initAudioPort(false, i, fData->audioPorts[j]); +# endif + } +#endif // DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + + for (uint32_t i=0, count=fData->parameterCount; i < count; ++i) + fPlugin->initParameter(i, fData->parameters[i]); + + { + std::set portGroupIndices; + +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + portGroupIndices.insert(fData->audioPorts[i].groupId); +#endif + for (uint32_t i=0, count=fData->parameterCount; i < count; ++i) + portGroupIndices.insert(fData->parameters[i].groupId); + + portGroupIndices.erase(kPortGroupNone); + + if (const uint32_t portGroupSize = static_cast(portGroupIndices.size())) + { + fData->portGroups = new PortGroupWithId[portGroupSize]; + fData->portGroupCount = portGroupSize; + + uint32_t index = 0; + for (std::set::iterator it = portGroupIndices.begin(); it != portGroupIndices.end(); ++it, ++index) + { + PortGroupWithId& portGroup(fData->portGroups[index]); + portGroup.groupId = *it; + + if (portGroup.groupId < portGroupSize) + fPlugin->initPortGroup(portGroup.groupId, portGroup); + else + fillInPredefinedPortGroupData(portGroup.groupId, portGroup); + } + } + } + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + for (uint32_t i=0; i < fData->programCount; ++i) + fPlugin->initProgramName(i, fData->programNames[i]); +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + for (uint32_t i=0; i < fData->stateCount; ++i) + fPlugin->initState(i, fData->states[i]); +#endif + #if defined(DPF_RUNTIME_TESTING) && defined(__GNUC__) && !defined(__clang__) /* Run-time testing build. * Verify that virtual functions are overriden if parameters, programs or states are in use. @@ -380,17 +438,30 @@ public: # if DISTRHO_PLUGIN_WANT_STATE if (fData->stateCount != 0) { - if ((void*)(fPlugin->*(static_cast(&Plugin::initState))) == - (void*)static_cast(&Plugin::initState)) + bool hasNonUiState = false; + for (uint32_t i=0; i < fData->stateCount; ++i) { - d_stderr2("DPF warning: Plugins with state must implement `initState`"); - abort(); + if ((fData->states[i].flags & kStateIsOnlyForUI) == 0) + { + hasNonUiState = true; + break; + } } - if ((void*)(fPlugin->*(&Plugin::setState)) == (void*)&Plugin::setState) + if (hasNonUiState) { - d_stderr2("DPF warning: Plugins with state must implement `setState`"); - abort(); + if ((void*)(fPlugin->*(static_cast(&Plugin::initState))) == + (void*)static_cast(&Plugin::initState)) + { + d_stderr2("DPF warning: Plugins with state must implement `initState`"); + abort(); + } + + if ((void*)(fPlugin->*(&Plugin::setState)) == (void*)&Plugin::setState) + { + d_stderr2("DPF warning: Plugins with state must implement `setState`"); + abort(); + } } } # endif @@ -412,64 +483,6 @@ public: # endif #endif -#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 - { - uint32_t j=0; -# if DISTRHO_PLUGIN_NUM_INPUTS > 0 - for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i, ++j) - fPlugin->initAudioPort(true, i, fData->audioPorts[j]); -# endif -# if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 - for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i, ++j) - fPlugin->initAudioPort(false, i, fData->audioPorts[j]); -# endif - } -#endif // DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 - - for (uint32_t i=0, count=fData->parameterCount; i < count; ++i) - fPlugin->initParameter(i, fData->parameters[i]); - - { - std::set portGroupIndices; - -#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 - for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) - portGroupIndices.insert(fData->audioPorts[i].groupId); -#endif - for (uint32_t i=0, count=fData->parameterCount; i < count; ++i) - portGroupIndices.insert(fData->parameters[i].groupId); - - portGroupIndices.erase(kPortGroupNone); - - if (const uint32_t portGroupSize = static_cast(portGroupIndices.size())) - { - fData->portGroups = new PortGroupWithId[portGroupSize]; - fData->portGroupCount = portGroupSize; - - uint32_t index = 0; - for (std::set::iterator it = portGroupIndices.begin(); it != portGroupIndices.end(); ++it, ++index) - { - PortGroupWithId& portGroup(fData->portGroups[index]); - portGroup.groupId = *it; - - if (portGroup.groupId < portGroupSize) - fPlugin->initPortGroup(portGroup.groupId, portGroup); - else - fillInPredefinedPortGroupData(portGroup.groupId, portGroup); - } - } - } - -#if DISTRHO_PLUGIN_WANT_PROGRAMS - for (uint32_t i=0, count=fData->programCount; i < count; ++i) - fPlugin->initProgramName(i, fData->programNames[i]); -#endif - -#if DISTRHO_PLUGIN_WANT_STATE - for (uint32_t i=0, count=fData->stateCount; i < count; ++i) - fPlugin->initState(i, fData->states[i]); -#endif - fData->callbacksPtr = callbacksPtr; fData->writeMidiCallbackFunc = writeMidiCall; fData->requestParameterValueChangeCallbackFunc = requestParameterValueChangeCall;