diff --git a/templates/vst3/src/data.h b/templates/vst3/src/data.h index 4841551..14ef826 100644 --- a/templates/vst3/src/data.h +++ b/templates/vst3/src/data.h @@ -211,6 +211,10 @@ static struct { {{~}} }; +{{?it.product.parameters.find(x => x.direction == "output" && x.isCpumeter)}} +# define PARAM_OUT_CPU_INDEX {{=it.product.parameters.indexOf(it.product.parameters.find(x => x.direction == "output" && x.isCpumeter))}} +{{?}} + # endif #endif diff --git a/templates/vst3/src/vst3.c b/templates/vst3/src/vst3.c index adcf8ee..859f4e9 100644 --- a/templates/vst3/src/vst3.c +++ b/templates/vst3/src/vst3.c @@ -67,6 +67,10 @@ typedef struct { #include #endif +#ifdef PARAM_OUT_CPU_INDEX +# include "fatica.h" +#endif + // COM in C doc: // https://github.com/rubberduck-vba/Rubberduck/wiki/COM-in-plain-C // https://devblogs.microsoft.com/oldnewthing/20040205-00/?p=40733 @@ -225,6 +229,9 @@ typedef struct pluginInstance { char midiOutputsActive[DATA_PRODUCT_BUSES_MIDI_OUTPUT_N]; #endif void *mem; +#ifdef PARAM_OUT_CPU_INDEX + float cpu_meter; +#endif } pluginInstance; static Steinberg_Vst_IComponentVtbl pluginVtblIComponent; @@ -323,6 +330,9 @@ static Steinberg_tresult pluginInitialize(void *thisInterface, struct Steinberg_ p->midiOutputsActive[i] = 0; #endif p->mem = NULL; +#ifdef PARAM_OUT_CPU_INDEX + p->cpu_meter = 0.f; +#endif return Steinberg_kResultOk; } @@ -741,6 +751,10 @@ static void processParams(pluginInstance *p, struct Steinberg_Vst_ProcessData *d static Steinberg_tresult pluginProcess(void* thisInterface, struct Steinberg_Vst_ProcessData* data) { TRACE("plugin IAudioProcessor process\n"); +#ifdef PARAM_OUT_CPU_INDEX + const unsigned long long processTimeStart = fatica_time_process(); +#endif + #if defined(__aarch64__) uint64_t fpcr; __asm__ __volatile__ ("mrs %0, fpcr" : "=r"(fpcr)); @@ -816,7 +830,13 @@ static Steinberg_tresult pluginProcess(void* thisInterface, struct Steinberg_Vst for (Steinberg_int32 i = 0; i < DATA_PRODUCT_PARAMETERS_N; i++) { if (!(parameterInfo[i].flags & Steinberg_Vst_ParameterInfo_ParameterFlags_kIsReadOnly)) continue; - float v = plugin_get_parameter(&p->p, parameterData[i].index); + float v; +# ifdef PARAM_OUT_CPU_INDEX + if (i == PARAM_OUT_CPU_INDEX) + v = p->cpu_meter; + else +# endif + v = plugin_get_parameter(&p->p, parameterData[i].index); if (v == p->parameters[i]) continue; p->parameters[i] = v; @@ -840,6 +860,13 @@ static Steinberg_tresult pluginProcess(void* thisInterface, struct Steinberg_Vst _MM_SET_DENORMALS_ZERO_MODE(denormals_zero_mode); #endif +#ifdef PARAM_OUT_CPU_INDEX + const unsigned long long processTimeEnd = fatica_time_process(); + const unsigned long long processTime100n = processTimeEnd - processTimeStart; + const double processTimeS = ((double) processTime100n) * 1.0e-7; + p->cpu_meter = p->cpu_meter * 0.9f + ((float) (processTimeS * p->sampleRate)) * 0.1f; +#endif + return Steinberg_kResultOk; } diff --git a/test/run.sh b/test/run.sh index dda595b..f949268 100755 --- a/test/run.sh +++ b/test/run.sh @@ -3,6 +3,7 @@ dir=`dirname $0` $dir/../tibia $dir/product.json,$dir/company.json,$dir/vst3.json $dir/../templates/vst3 $dir/../out/vst3 $dir/../tibia $dir/product.json,$dir/company.json,$dir/vst3.json,$dir/vst3-make.json $dir/../templates/vst3-make $dir/../out/vst3 +cp $dir/../templates/common/* $dir/../out/vst3/src/ cp $dir/plugin.h $dir/plugin_ui.h $dir/../out/vst3/src $dir/../tibia $dir/product.json,$dir/company.json,$dir/lv2.json $dir/../templates/lv2 $dir/../out/lv2