@@ -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