Skip to content

Commit 2026925

Browse files
committed
Allow plugins with UI-only state to skip DSP setState()
Signed-off-by: falkTX <falktx@falktx.com>
1 parent 69414bc commit 2026925

File tree

1 file changed

+78
-65
lines changed

1 file changed

+78
-65
lines changed

distrho/src/DistrhoPluginInternal.hpp

Lines changed: 78 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,64 @@ class PluginExporter
338338
DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,);
339339
DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,);
340340

341+
#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
342+
{
343+
uint32_t j=0;
344+
# if DISTRHO_PLUGIN_NUM_INPUTS > 0
345+
for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i, ++j)
346+
fPlugin->initAudioPort(true, i, fData->audioPorts[j]);
347+
# endif
348+
# if DISTRHO_PLUGIN_NUM_OUTPUTS > 0
349+
for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i, ++j)
350+
fPlugin->initAudioPort(false, i, fData->audioPorts[j]);
351+
# endif
352+
}
353+
#endif // DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
354+
355+
for (uint32_t i=0, count=fData->parameterCount; i < count; ++i)
356+
fPlugin->initParameter(i, fData->parameters[i]);
357+
358+
{
359+
std::set<uint32_t> portGroupIndices;
360+
361+
#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
362+
for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS; ++i)
363+
portGroupIndices.insert(fData->audioPorts[i].groupId);
364+
#endif
365+
for (uint32_t i=0, count=fData->parameterCount; i < count; ++i)
366+
portGroupIndices.insert(fData->parameters[i].groupId);
367+
368+
portGroupIndices.erase(kPortGroupNone);
369+
370+
if (const uint32_t portGroupSize = static_cast<uint32_t>(portGroupIndices.size()))
371+
{
372+
fData->portGroups = new PortGroupWithId[portGroupSize];
373+
fData->portGroupCount = portGroupSize;
374+
375+
uint32_t index = 0;
376+
for (std::set<uint32_t>::iterator it = portGroupIndices.begin(); it != portGroupIndices.end(); ++it, ++index)
377+
{
378+
PortGroupWithId& portGroup(fData->portGroups[index]);
379+
portGroup.groupId = *it;
380+
381+
if (portGroup.groupId < portGroupSize)
382+
fPlugin->initPortGroup(portGroup.groupId, portGroup);
383+
else
384+
fillInPredefinedPortGroupData(portGroup.groupId, portGroup);
385+
}
386+
}
387+
}
388+
389+
#if DISTRHO_PLUGIN_WANT_PROGRAMS
390+
for (uint32_t i=0; i < fData->programCount; ++i)
391+
fPlugin->initProgramName(i, fData->programNames[i]);
392+
#endif
393+
394+
#if DISTRHO_PLUGIN_WANT_STATE
395+
for (uint32_t i=0; i < fData->stateCount; ++i)
396+
fPlugin->initState(i, fData->states[i]);
397+
#endif
398+
341399
#if defined(DPF_RUNTIME_TESTING) && defined(__GNUC__) && !defined(__clang__)
342400
/* Run-time testing build.
343401
* Verify that virtual functions are overriden if parameters, programs or states are in use.
@@ -380,17 +438,30 @@ class PluginExporter
380438
# if DISTRHO_PLUGIN_WANT_STATE
381439
if (fData->stateCount != 0)
382440
{
383-
if ((void*)(fPlugin->*(static_cast<void(Plugin::*)(uint32_t,State&)>(&Plugin::initState))) ==
384-
(void*)static_cast<void(Plugin::*)(uint32_t,State&)>(&Plugin::initState))
441+
bool hasNonUiState = false;
442+
for (uint32_t i=0; i < fData->stateCount; ++i)
385443
{
386-
d_stderr2("DPF warning: Plugins with state must implement `initState`");
387-
abort();
444+
if ((fData->states[i].flags & kStateIsOnlyForUI) == 0)
445+
{
446+
hasNonUiState = true;
447+
break;
448+
}
388449
}
389450

390-
if ((void*)(fPlugin->*(&Plugin::setState)) == (void*)&Plugin::setState)
451+
if (hasNonUiState)
391452
{
392-
d_stderr2("DPF warning: Plugins with state must implement `setState`");
393-
abort();
453+
if ((void*)(fPlugin->*(static_cast<void(Plugin::*)(uint32_t,State&)>(&Plugin::initState))) ==
454+
(void*)static_cast<void(Plugin::*)(uint32_t,State&)>(&Plugin::initState))
455+
{
456+
d_stderr2("DPF warning: Plugins with state must implement `initState`");
457+
abort();
458+
}
459+
460+
if ((void*)(fPlugin->*(&Plugin::setState)) == (void*)&Plugin::setState)
461+
{
462+
d_stderr2("DPF warning: Plugins with state must implement `setState`");
463+
abort();
464+
}
394465
}
395466
}
396467
# endif
@@ -412,64 +483,6 @@ class PluginExporter
412483
# endif
413484
#endif
414485

415-
#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
416-
{
417-
uint32_t j=0;
418-
# if DISTRHO_PLUGIN_NUM_INPUTS > 0
419-
for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i, ++j)
420-
fPlugin->initAudioPort(true, i, fData->audioPorts[j]);
421-
# endif
422-
# if DISTRHO_PLUGIN_NUM_OUTPUTS > 0
423-
for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i, ++j)
424-
fPlugin->initAudioPort(false, i, fData->audioPorts[j]);
425-
# endif
426-
}
427-
#endif // DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
428-
429-
for (uint32_t i=0, count=fData->parameterCount; i < count; ++i)
430-
fPlugin->initParameter(i, fData->parameters[i]);
431-
432-
{
433-
std::set<uint32_t> portGroupIndices;
434-
435-
#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0
436-
for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS; ++i)
437-
portGroupIndices.insert(fData->audioPorts[i].groupId);
438-
#endif
439-
for (uint32_t i=0, count=fData->parameterCount; i < count; ++i)
440-
portGroupIndices.insert(fData->parameters[i].groupId);
441-
442-
portGroupIndices.erase(kPortGroupNone);
443-
444-
if (const uint32_t portGroupSize = static_cast<uint32_t>(portGroupIndices.size()))
445-
{
446-
fData->portGroups = new PortGroupWithId[portGroupSize];
447-
fData->portGroupCount = portGroupSize;
448-
449-
uint32_t index = 0;
450-
for (std::set<uint32_t>::iterator it = portGroupIndices.begin(); it != portGroupIndices.end(); ++it, ++index)
451-
{
452-
PortGroupWithId& portGroup(fData->portGroups[index]);
453-
portGroup.groupId = *it;
454-
455-
if (portGroup.groupId < portGroupSize)
456-
fPlugin->initPortGroup(portGroup.groupId, portGroup);
457-
else
458-
fillInPredefinedPortGroupData(portGroup.groupId, portGroup);
459-
}
460-
}
461-
}
462-
463-
#if DISTRHO_PLUGIN_WANT_PROGRAMS
464-
for (uint32_t i=0, count=fData->programCount; i < count; ++i)
465-
fPlugin->initProgramName(i, fData->programNames[i]);
466-
#endif
467-
468-
#if DISTRHO_PLUGIN_WANT_STATE
469-
for (uint32_t i=0, count=fData->stateCount; i < count; ++i)
470-
fPlugin->initState(i, fData->states[i]);
471-
#endif
472-
473486
fData->callbacksPtr = callbacksPtr;
474487
fData->writeMidiCallbackFunc = writeMidiCall;
475488
fData->requestParameterValueChangeCallbackFunc = requestParameterValueChangeCall;

0 commit comments

Comments
 (0)