|
@@ -338,6 +338,64 @@ public: |
|
|
DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); |
|
|
DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); |
|
|
DISTRHO_SAFE_ASSERT_RETURN(fData != 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<uint32_t> 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<uint32_t>(portGroupIndices.size())) |
|
|
|
|
|
{ |
|
|
|
|
|
fData->portGroups = new PortGroupWithId[portGroupSize]; |
|
|
|
|
|
fData->portGroupCount = portGroupSize; |
|
|
|
|
|
|
|
|
|
|
|
uint32_t index = 0; |
|
|
|
|
|
for (std::set<uint32_t>::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__) |
|
|
#if defined(DPF_RUNTIME_TESTING) && defined(__GNUC__) && !defined(__clang__) |
|
|
/* Run-time testing build. |
|
|
/* Run-time testing build. |
|
|
* Verify that virtual functions are overriden if parameters, programs or states are in use. |
|
|
* 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 DISTRHO_PLUGIN_WANT_STATE |
|
|
if (fData->stateCount != 0) |
|
|
if (fData->stateCount != 0) |
|
|
{ |
|
|
{ |
|
|
if ((void*)(fPlugin->*(static_cast<void(Plugin::*)(uint32_t,State&)>(&Plugin::initState))) == |
|
|
|
|
|
(void*)static_cast<void(Plugin::*)(uint32_t,State&)>(&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<void(Plugin::*)(uint32_t,State&)>(&Plugin::initState))) == |
|
|
|
|
|
(void*)static_cast<void(Plugin::*)(uint32_t,State&)>(&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 |
|
|
# endif |
|
@@ -412,64 +483,6 @@ public: |
|
|
# endif |
|
|
# endif |
|
|
#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<uint32_t> 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<uint32_t>(portGroupIndices.size())) |
|
|
|
|
|
{ |
|
|
|
|
|
fData->portGroups = new PortGroupWithId[portGroupSize]; |
|
|
|
|
|
fData->portGroupCount = portGroupSize; |
|
|
|
|
|
|
|
|
|
|
|
uint32_t index = 0; |
|
|
|
|
|
for (std::set<uint32_t>::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->callbacksPtr = callbacksPtr; |
|
|
fData->writeMidiCallbackFunc = writeMidiCall; |
|
|
fData->writeMidiCallbackFunc = writeMidiCall; |
|
|
fData->requestParameterValueChangeCallbackFunc = requestParameterValueChangeCall; |
|
|
fData->requestParameterValueChangeCallbackFunc = requestParameterValueChangeCall; |
|
|