diff --git a/plugins/NeuralCapture/CairoWidgets.hpp b/plugins/NeuralCapture/CairoWidgets.hpp index 0307c29..70bc1f9 100644 --- a/plugins/NeuralCapture/CairoWidgets.hpp +++ b/plugins/NeuralCapture/CairoWidgets.hpp @@ -13,6 +13,7 @@ #include #include "Cairo.hpp" +#include "extra/Runner.hpp" START_NAMESPACE_DISTRHO @@ -63,6 +64,49 @@ class CairoShadows cairo_pattern_destroy (pat); } + void box_shadow(cairo_t* const cr, int width, int height, int w, int h) + { + cairo_pattern_t *pat = cairo_pattern_create_linear (0, 0, w, 0); + cairo_pattern_add_color_stop_rgba (pat, 0, 0.33, 0.33, 0.33, 0.8); + cairo_pattern_add_color_stop_rgba (pat, 0.4, 0.33, 0.33, 0.33, 0.3); + cairo_pattern_add_color_stop_rgba (pat, 1, 0.33, 0.33, 0.33, 0.0); + cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); + cairo_set_source(cr, pat); + cairo_paint (cr); + cairo_pattern_destroy (pat); + pat = NULL; + + pat = cairo_pattern_create_linear (0, 0, 0, h); + cairo_pattern_add_color_stop_rgba (pat, 0, 0.33, 0.33, 0.33, 0.8); + cairo_pattern_add_color_stop_rgba (pat, 0.4, 0.33, 0.33, 0.33, 0.3); + cairo_pattern_add_color_stop_rgba (pat, 1, 0.33, 0.33, 0.33, 0.0); + cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); + cairo_set_source(cr, pat); + cairo_paint (cr); + cairo_pattern_destroy (pat); + pat = NULL; + + pat = cairo_pattern_create_linear (width - w, 0, width, 0); + cairo_pattern_add_color_stop_rgba (pat, 0, 0.05, 0.05, 0.05, 0.0); + cairo_pattern_add_color_stop_rgba (pat, 0.4, 0.05, 0.05, 0.05, 0.3); + cairo_pattern_add_color_stop_rgba (pat, 1, 0.05, 0.05, 0.05, 0.8); + cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); + cairo_set_source(cr, pat); + cairo_paint (cr); + cairo_pattern_destroy (pat); + pat = NULL; + + pat = cairo_pattern_create_linear (0, height - h, 0, height); + cairo_pattern_add_color_stop_rgba (pat, 0, 0.05, 0.05, 0.05, 0.0); + cairo_pattern_add_color_stop_rgba (pat, 0.4, 0.05, 0.05, 0.05, 0.3); + cairo_pattern_add_color_stop_rgba (pat, 1, 0.05, 0.05, 0.05, 0.8); + cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); + cairo_set_source(cr, pat); + cairo_paint (cr); + cairo_pattern_destroy (pat); + pat = NULL; + } + }; class CairoButton : public CairoSubWidget, public CairoShadows @@ -86,7 +130,6 @@ class CairoButton : public CairoSubWidget, public CairoShadows void setValue(float v) { - // fprintf(stderr, "get value %f\n", v); value = v; state = (int)value; repaint(); @@ -137,7 +180,6 @@ class CairoButton : public CairoSubWidget, public CairoShadows bool onMouse(const MouseEvent& event) override { - // fprintf(stderr, "mouse\n"); if (!event.press) { const int w = getWidth(); @@ -164,6 +206,7 @@ class CairoButton : public CairoSubWidget, public CairoShadows float value; uint state; const char* label; + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoButton) }; // ----------------------------------------------------------------------- @@ -183,7 +226,6 @@ class CairoProgressBar : public CairoSubWidget, public CairoShadows void setValue(float v) { - // fprintf(stderr, "set state value %f\n", v); value = v; repaint(); } @@ -213,7 +255,7 @@ class CairoProgressBar : public CairoSubWidget, public CairoShadows char s[64]; snprintf(s, 63,"%d%%", (int) (value * 100.0)); cairo_text_extents(cr,s , &extents); - cairo_move_to (cr, width/2-extents.width/2, height/2 + extents.height/2 ); + cairo_move_to (cr, width * 0.5-extents.width * 0.5, height * 0.5 + extents.height * 0.5 ); cairo_set_source_rgba(cr, 0.63, 0.63, 0.63, 1.0); cairo_set_operator(cr, CAIRO_OPERATOR_ADD); cairo_show_text(cr, s); @@ -226,6 +268,7 @@ class CairoProgressBar : public CairoSubWidget, public CairoShadows private: float value; + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoProgressBar) }; // ----------------------------------------------------------------------- @@ -240,7 +283,7 @@ class CairoPeekMeter : public CairoSubWidget, public CairoShadows std_value = -70.0f; value = -70.0f; setSize(w, h); - drawMeterImage(w, h/2); + drawMeterImage(w, h * 0.5); } explicit CairoPeekMeter(TopLevelWidget* const parent, int w, int h) @@ -250,12 +293,11 @@ class CairoPeekMeter : public CairoSubWidget, public CairoShadows std_value = -70.0f; value = -70.0f; setSize(w, h); - drawMeterImage(w, h/2); + drawMeterImage(w, h * 0.5); } void setValue(float v) { - //fprintf(stderr, "set meter value %f\n", v); value = v; repaint(); } @@ -334,7 +376,7 @@ class CairoPeekMeter : public CairoSubWidget, public CairoShadows cairo_pattern_add_color_stop_rgba(pat, 1.0, 0.5, 0.0, 0.0, 0.4); cairo_set_source(cri, pat); - int c = (height)/2 ; + int c = (height) * 0.5 ; int ci = c-2; int i = 1; @@ -381,7 +423,7 @@ class CairoPeekMeter : public CairoSubWidget, public CairoShadows int db_points[] = { -50, -40, -30, -20, -15, -10, -6, -3, 0, 3 }; char buf[32]; - cairo_set_font_size (cr, (float)rect_height/2); + cairo_set_font_size (cr, (float)rect_height * 0.5); cairo_set_source_rgba(cr, 0.6, 0.6, 0.6, 0.6); for (unsigned int i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) @@ -416,20 +458,20 @@ class CairoPeekMeter : public CairoSubWidget, public CairoShadows const Size sz = getSize(); const int width = sz.getWidth(); - const int height = sz.getHeight()/2; + const int height = sz.getHeight() * 0.5; double meterstate = logMeter(power2db(value)); double oldstate = logMeter(old_value); - cairo_set_source_surface (cr, image, 0, height/2); - cairo_rectangle(cr,0, height/2, width, height/2); + cairo_set_source_surface (cr, image, 0, height * 0.5); + cairo_rectangle(cr,0, height * 0.5, width, height * 0.5); cairo_fill(cr); cairo_set_source_surface (cr, image, 0, -height); - cairo_rectangle(cr, 0,height/2, width*meterstate, height/2); + cairo_rectangle(cr, 0,height * 0.5, width*meterstate, height * 0.5); cairo_fill(cr); - cairo_rectangle(cr,(width*oldstate)-3, height/2, 3, height/2); + cairo_rectangle(cr,(width*oldstate)-3, height * 0.5, 3, height * 0.5); cairo_fill(cr); - drawMeterScale(cr, height, width, height/2); + drawMeterScale(cr, height, width, height * 0.5); boxShadowInset(cr, width, height*2); cairo_pop_group_to_source (cr); cairo_paint (cr); @@ -439,7 +481,7 @@ class CairoPeekMeter : public CairoSubWidget, public CairoShadows { cairo_surface_destroy(image); image = nullptr; - drawMeterImage(ev.size.getWidth(), ev.size.getHeight()); + drawMeterImage(ev.size.getWidth(), ev.size.getHeight() * 0.5); } private: @@ -447,10 +489,96 @@ class CairoPeekMeter : public CairoSubWidget, public CairoShadows float value; float old_value; float std_value; + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoPeekMeter) }; // ----------------------------------------------------------------------- +class CairoToolTip : public CairoSubWidget, public Runner +{ +public: + explicit CairoToolTip(SubWidget* const parent_, const char* lab) + : CairoSubWidget(parent_), + parent(parent_) { + label = lab; + hide(); + state = 0; + } + + explicit CairoToolTip(TopLevelWidget* const parent_, const char* lab) + : CairoSubWidget(parent_), + parent(parent_) { + label = lab; + hide(); + state = 0; + } + + ~CairoToolTip() {if (isRunnerActive()) stopRunner();} + + void setLabel(const char* lab) + { + label = lab; + show(); + repaint(); + if (!isRunnerActive()) startRunner(2500); + } + + void unset() + { + hide(); + parent->repaint(); + } + +protected: + + void onCairoDisplay(const CairoGraphicsContext& context) override + { + cairo_t* const cr = context.handle; + cairo_push_group (cr); + + const Size sz = getSize(); + const int w = sz.getWidth(); + const int h = sz.getHeight(); + cairo_set_source_rgba(cr, 0.13, 0.13, 0.13, 1.0); + + cairo_rectangle(cr, 0, 0, w, h); + cairo_fill_preserve(cr); + cairo_set_source_rgba(cr, 0., 0., 0., 1.0); + cairo_stroke(cr); + cairo_text_extents_t extents; + cairo_set_source_rgba(cr, 0.63, 0.63, 0.63, 1.0); + cairo_set_font_size (cr, h * 0.26); + cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD); + cairo_text_extents(cr, label , &extents); + + cairo_move_to (cr, (w-extents.width)*0.5, (h+extents.height)*0.45); + cairo_show_text(cr, label); + cairo_new_path (cr); + cairo_pop_group_to_source (cr); + cairo_paint (cr); + } + + bool run() override + { + if (state) { + state = 0; + unset(); + return false; + } else { + state = 1; + return true; + } + } + +private: + Widget* parent; + const char* label; + uint state; + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoToolTip) +}; + +// ----------------------------------------------------------------------- END_NAMESPACE_DISTRHO diff --git a/plugins/NeuralCapture/PluginNeuralCapture.cpp b/plugins/NeuralCapture/PluginNeuralCapture.cpp index 402a384..a92288f 100644 --- a/plugins/NeuralCapture/PluginNeuralCapture.cpp +++ b/plugins/NeuralCapture/PluginNeuralCapture.cpp @@ -66,6 +66,14 @@ void PluginNeuralCapture::initParameter(uint32_t index, Parameter& parameter) { parameter.ranges.max = 4.0f; parameter.hints = kParameterIsAutomatable|kParameterIsOutput; break; + case paramError: + parameter.name = "Error"; + parameter.shortName = "Error"; + parameter.symbol = "ERRORS"; + parameter.ranges.min = 0.0f; + parameter.ranges.max = 3.0f; + parameter.hints = kParameterIsOutput; + break; } } @@ -112,6 +120,9 @@ void PluginNeuralCapture::setParameterValue(uint32_t index, float value) { case paramMeter: meter = fParams[paramMeter]; break; + case paramError: + p_error = fParams[paramError]; + break; } profil->connect_ports(index, value, profil); } @@ -131,6 +142,9 @@ void PluginNeuralCapture::setOutputParameterValue(uint32_t index, float value) case paramMeter: meter = fParams[paramMeter]; break; + case paramError: + p_error = fParams[paramError]; + break; } } /** diff --git a/plugins/NeuralCapture/PluginNeuralCapture.hpp b/plugins/NeuralCapture/PluginNeuralCapture.hpp index 333ff5a..c230aaf 100644 --- a/plugins/NeuralCapture/PluginNeuralCapture.hpp +++ b/plugins/NeuralCapture/PluginNeuralCapture.hpp @@ -38,6 +38,7 @@ class PluginNeuralCapture : public Plugin { paramButton = 0, paramState = 1, paramMeter = 2, + paramError = 3, paramCount }; @@ -119,6 +120,7 @@ class PluginNeuralCapture : public Plugin { float button; float state; float meter; + float p_error; // pointer to dsp class profiler::Profil* profil; diff --git a/plugins/NeuralCapture/UINeuralCapture.cpp b/plugins/NeuralCapture/UINeuralCapture.cpp index 930f064..d0200c2 100644 --- a/plugins/NeuralCapture/UINeuralCapture.cpp +++ b/plugins/NeuralCapture/UINeuralCapture.cpp @@ -10,10 +10,6 @@ #include "Window.hpp" START_NAMESPACE_DISTRHO -using DGL_NAMESPACE::CairoGraphicsContext; -using DGL_NAMESPACE::CairoImage; -using DGL_NAMESPACE::CairoImageButton; -using DGL_NAMESPACE::CairoImageKnob; // ----------------------------------------------------------------------- // Init / Deinit @@ -22,7 +18,8 @@ UINeuralCapture::UINeuralCapture() : UI(350, 250) { kInitialHeight = 250; kInitialWidth = 350; - fButton = new CairoButton(this, "Capture", [this] (const uint32_t index, float value) {this->setParameterValue(index, value);}); + fButton = new CairoButton(this, "Capture", + [this] (const uint32_t index, float value) {this->setParameterValue(index, value);}); fButton->setSize(200, 50); fButton->setAbsolutePos(75, 30); @@ -33,6 +30,10 @@ UINeuralCapture::UINeuralCapture() fPeekMeter = new CairoPeekMeter(this, 200, 50); fPeekMeter->setAbsolutePos(75, 160); + fToolTip = new CairoToolTip(this, "This is a Error Message"); + fToolTip->setSize(350, 50); + fToolTip->setAbsolutePos(0, 105); + setGeometryConstraints(kInitialWidth, kInitialHeight, true); } @@ -56,12 +57,24 @@ void UINeuralCapture::parameterChanged(uint32_t index, float value) { fProgressBar->setValue(value); if (value >=1.0) { fButton->setValue(0.0f); - setParameterValue(0, 0.0f); + setParameterValue(PluginNeuralCapture::paramButton, 0.0f); } break; case PluginNeuralCapture::paramMeter: fPeekMeter->setValue(value); break; + case PluginNeuralCapture::paramError: + // if ((int)value == 0) fToolTip->unset(); + if ((int)value > 0) + fButton->setValue(0.0f); + if ((int)value == 1) + fToolTip->setLabel("Error: no signal comes in, stop the process here"); + else if ((int)value == 2) + fToolTip->setLabel("Error: seems we receive garbage, stop the process here"); + else if ((int)value == 3) + fToolTip->setLabel("Error: Sample Rate mismatch, please use 48kHz"); + + break; } } @@ -82,7 +95,7 @@ void UINeuralCapture::programLoaded(uint32_t index) { Optional callback to inform the UI about a sample rate change on the plugin side. */ void UINeuralCapture::sampleRateChanged(double newSampleRate) { - (void)newSampleRate; + if (newSampleRate != 48000) fToolTip->setLabel("Sample Rate mismatch, please use 48kHz"); } // ----------------------------------------------------------------------- @@ -107,62 +120,20 @@ void UINeuralCapture::uiReshape(uint width, uint height) { // ----------------------------------------------------------------------- // Widget callbacks - -void UINeuralCapture::box_shadows(cairo_t* const cr, int wi, int h) { - int width = getWidth(); - int height = getHeight(); - - cairo_pattern_t *pat = cairo_pattern_create_linear (0, 0, wi, 0); - cairo_pattern_add_color_stop_rgba (pat, 0, 0.33, 0.33, 0.33, 0.8); - cairo_pattern_add_color_stop_rgba (pat, 0.4, 0.33, 0.33, 0.33, 0.3); - cairo_pattern_add_color_stop_rgba (pat, 1, 0.33, 0.33, 0.33, 0.0); - cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); - cairo_set_source(cr, pat); - cairo_paint (cr); - cairo_pattern_destroy (pat); - pat = NULL; - - pat = cairo_pattern_create_linear (0, 0, 0, h); - cairo_pattern_add_color_stop_rgba (pat, 0, 0.33, 0.33, 0.33, 0.8); - cairo_pattern_add_color_stop_rgba (pat, 0.4, 0.33, 0.33, 0.33, 0.3); - cairo_pattern_add_color_stop_rgba (pat, 1, 0.33, 0.33, 0.33, 0.0); - cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); - cairo_set_source(cr, pat); - cairo_paint (cr); - cairo_pattern_destroy (pat); - pat = NULL; - - pat = cairo_pattern_create_linear (width - wi, 0, width, 0); - cairo_pattern_add_color_stop_rgba (pat, 0, 0.05, 0.05, 0.05, 0.0); - cairo_pattern_add_color_stop_rgba (pat, 0.4, 0.05, 0.05, 0.05, 0.3); - cairo_pattern_add_color_stop_rgba (pat, 1, 0.05, 0.05, 0.05, 0.8); - cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); - cairo_set_source(cr, pat); - cairo_paint (cr); - cairo_pattern_destroy (pat); - pat = NULL; - - pat = cairo_pattern_create_linear (0, height - h, 0, height); - cairo_pattern_add_color_stop_rgba (pat, 0, 0.05, 0.05, 0.05, 0.0); - cairo_pattern_add_color_stop_rgba (pat, 0.4, 0.05, 0.05, 0.05, 0.3); - cairo_pattern_add_color_stop_rgba (pat, 1, 0.05, 0.05, 0.05, 0.8); - cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); - cairo_set_source(cr, pat); - cairo_paint (cr); - cairo_pattern_destroy (pat); - pat = NULL; - -} - /** A function called to draw the view contents. */ void UINeuralCapture::onCairoDisplay(const CairoGraphicsContext& context) { cairo_t* const cr = context.handle; + int width = getWidth(); + int height = getHeight(); + cairo_push_group (cr); cairo_set_source_rgba(cr, 0.13, 0.13, 0.13, 1.0); cairo_paint(cr); - box_shadows(cr, 25, 25); + box_shadow(cr, width, height, 25, 25); + cairo_pop_group_to_source (cr); + cairo_paint (cr); } void UINeuralCapture::onResize(const ResizeEvent& ev) @@ -180,6 +151,9 @@ void UINeuralCapture::onResize(const ResizeEvent& ev) fPeekMeter->setSize( 200*scaleFactor, 50*scaleFactor); fPeekMeter->setAbsolutePos(75*scaleWFactor, 160*scaleHFactor); + + fToolTip->setSize(350*scaleFactor, 50*scaleFactor); + fToolTip->setAbsolutePos(0*scaleFactor, 105*scaleFactor); } // ----------------------------------------------------------------------- diff --git a/plugins/NeuralCapture/UINeuralCapture.hpp b/plugins/NeuralCapture/UINeuralCapture.hpp index 7fafa12..4f628d2 100644 --- a/plugins/NeuralCapture/UINeuralCapture.hpp +++ b/plugins/NeuralCapture/UINeuralCapture.hpp @@ -17,7 +17,7 @@ START_NAMESPACE_DISTRHO -class UINeuralCapture : public UI { +class UINeuralCapture : public UI, public CairoShadows { public: UINeuralCapture(); ~UINeuralCapture(); @@ -30,7 +30,6 @@ class UINeuralCapture : public UI { void uiIdle() override; void uiReshape(uint width, uint height) override; - void box_shadows(cairo_t* const cr, int wi, int h); void onCairoDisplay(const CairoGraphicsContext& context) override; bool onKeyboard(const KeyboardEvent& ev) override; @@ -45,6 +44,7 @@ class UINeuralCapture : public UI { ScopedPointer fButton; ScopedPointer fProgressBar; ScopedPointer fPeekMeter; + ScopedPointer fToolTip; DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UINeuralCapture) }; diff --git a/plugins/NeuralCapture/profiler.cc b/plugins/NeuralCapture/profiler.cc index b45992f..9d446a0 100644 --- a/plugins/NeuralCapture/profiler.cc +++ b/plugins/NeuralCapture/profiler.cc @@ -27,8 +27,8 @@ typedef enum PROFILE, STATE, METER, - CLIP, ERRORS, + CLIP, } PortIndex; @@ -177,7 +177,7 @@ inline std::string to_string(const T& t) { return ss.str(); } -Profil::Profil(int channel_, std::function send_to_host_, +Profil::Profil(int channel_, std::function setOutputParameterValue_, std::function requestParameterValueChange_) : recfile(NULL), playfile(NULL), @@ -192,7 +192,7 @@ Profil::Profil(int channel_, std::function send_t keep_stream(false), mem_allocated(false), err(false), - send_to_host(send_to_host_), + setOutputParameterValue(setOutputParameterValue_), requestParameterValueChange(requestParameterValueChange_) { sem_init(&m_trig, 0, 0); } @@ -386,9 +386,16 @@ inline void Profil::init(unsigned int samplingFreq) { nf = 1.0; iRef = 0; fRef = 0.0000003; + errors = 0.0; + reset_errors = 0; fConst0 = (1.0f / float(fmin(192000, fmax(1, fSamplingFreq)))); mtdm = mtdm_new(fSamplingFreq); start_thread(); + if (fSamplingFreq != 48000) { + err = true; + errors = 3.0; + setOutputParameterValue(ERRORS, errors); + } } // static wrapper for the internal init call @@ -485,6 +492,7 @@ void always_inline Profil::compute(int count, const float *input0, float *output if (!(int(fcheckbox0))) { finish = 0; errors = 0.0; + //setOutputParameterValue(ERRORS, errors); fbargraph1 = 0.0; } @@ -502,8 +510,9 @@ void always_inline Profil::compute(int count, const float *input0, float *output measure = 0; finish = 1; errors = 1.0; + setOutputParameterValue(ERRORS, errors); requestParameterValueChange((PortIndex)PROFILE, 0.0f); - fprintf (stderr, "no signal comes in, stop the process here\n"); + //fprintf (stderr, "no signal comes in, stop the process here\n"); return; } // when phase is inverted resolve with inverted frames @@ -513,7 +522,7 @@ void always_inline Profil::compute(int count, const float *input0, float *output } // set roundtrip latency roundtrip = mtdm->_del; - printf ("roundtrip latency is %i\n", roundtrip); + //printf ("roundtrip latency is %i\n", roundtrip); // seems we receive garbage, stop the process here if (mtdm->_err > 0.2) { @@ -521,8 +530,9 @@ void always_inline Profil::compute(int count, const float *input0, float *output measure = 0; finish = 1; errors = 2.0; + setOutputParameterValue(ERRORS, errors); requestParameterValueChange((PortIndex)PROFILE, 0.0f); - fprintf (stderr, "seems we receive garbage, stop the process here\n"); + //fprintf (stderr, "seems we receive garbage, stop the process here\n"); return; } } @@ -602,10 +612,15 @@ void always_inline Profil::compute(int count, const float *input0, float *output iRef = !iRef; fRef = iRef ? 0.0000003 : 0.00000031; fbargraph = 20.*log10(fmax(fRef,fRecb2[0])); - send_to_host(METER, fbargraph); + setOutputParameterValue(METER, fbargraph); // progress bar fbargraph1 = finish ? 1.0 : float(float(IOTAP) / float(inputsize)); - send_to_host(STATE, fbargraph1); + setOutputParameterValue(STATE, fbargraph1); + reset_errors++; + if (reset_errors > 2000) { + reset_errors = 0; + setOutputParameterValue(ERRORS, errors); + } } // static wrapper to run the process diff --git a/plugins/NeuralCapture/profiler.h b/plugins/NeuralCapture/profiler.h index cf9717a..024efa9 100644 --- a/plugins/NeuralCapture/profiler.h +++ b/plugins/NeuralCapture/profiler.h @@ -91,6 +91,7 @@ class Profil { float fbargraph; float fbargraph1; float errors; + int reset_errors; int latency; int roundtrip; int measure; @@ -144,7 +145,7 @@ class Profil { inline std::string get_path(); inline std::string get_ffilename(); inline std::string get_ifilename(); - std::function send_to_host; + std::function setOutputParameterValue; std::function requestParameterValueChange; public: @@ -155,7 +156,7 @@ class Profil { static void mono_audio(int count, const float *input0, float *output0, Profil*); static void delete_instance(Profil *p); static void connect_ports(uint32_t port, float data, Profil *p); - Profil(int channel_, std::function send_to_host_, + Profil(int channel_, std::function setOutputParameterValue_, std::function requestParameterValueChange_); ~Profil(); };