Signed-off-by: falkTX <falktx@falktx.com>tags/22.02
| @@ -23,36 +23,6 @@ | |||||
| USE_NAMESPACE_DISTRHO; | USE_NAMESPACE_DISTRHO; | ||||
| /* | |||||
| * Find the highest absolute and normalized value within a float array. | |||||
| */ | |||||
| static inline | |||||
| float d_findMaxNormalizedFloat(const float floats[], const std::size_t count) | |||||
| { | |||||
| DISTRHO_SAFE_ASSERT_RETURN(floats != nullptr, 0.0f); | |||||
| DISTRHO_SAFE_ASSERT_RETURN(count > 0, 0.0f); | |||||
| static const float kEmptyFloats[8192] = {}; | |||||
| if (count <= 8192 && std::memcmp(floats, kEmptyFloats, count) == 0) | |||||
| return 0.0f; | |||||
| float tmp, maxf2 = std::abs(floats[0]); | |||||
| for (std::size_t i=1; i<count; ++i) | |||||
| { | |||||
| tmp = std::abs(*floats++); | |||||
| if (tmp > maxf2) | |||||
| maxf2 = tmp; | |||||
| } | |||||
| if (maxf2 > 1.0f) | |||||
| maxf2 = 1.0f; | |||||
| return maxf2; | |||||
| } | |||||
| template<int numIO> | template<int numIO> | ||||
| struct HostAudio : Module { | struct HostAudio : Module { | ||||
| CardinalPluginContext* const pcontext; | CardinalPluginContext* const pcontext; | ||||
| @@ -65,6 +35,8 @@ struct HostAudio : Module { | |||||
| // for rack core audio module compatibility | // for rack core audio module compatibility | ||||
| dsp::RCFilter dcFilters[numIO]; | dsp::RCFilter dcFilters[numIO]; | ||||
| bool dcFilterEnabled = (numIO == 2); | bool dcFilterEnabled = (numIO == 2); | ||||
| // for stereo meter | |||||
| volatile bool resetMeters = true; | volatile bool resetMeters = true; | ||||
| float gainMeterL = 0.0f; | float gainMeterL = 0.0f; | ||||
| float gainMeterR = 0.0f; | float gainMeterR = 0.0f; | ||||
| @@ -190,7 +162,10 @@ struct HostAudioNanoMeter : NanoMeter { | |||||
| HostAudio<numIO>* const module; | HostAudio<numIO>* const module; | ||||
| HostAudioNanoMeter(HostAudio<numIO>* const m) | HostAudioNanoMeter(HostAudio<numIO>* const m) | ||||
| : module(m) {} | |||||
| : module(m) | |||||
| { | |||||
| hasGainKnob = true; | |||||
| } | |||||
| void updateMeters() override | void updateMeters() override | ||||
| { | { | ||||
| @@ -29,7 +29,7 @@ template<int hp> | |||||
| struct ModuleWidgetWithSideScrews : ModuleWidget { | struct ModuleWidgetWithSideScrews : ModuleWidget { | ||||
| static constexpr const float startX_In = 10.65f; | static constexpr const float startX_In = 10.65f; | ||||
| static constexpr const float startX_Out = (hp - 3) * 15 + startX_In; | static constexpr const float startX_Out = (hp - 3) * 15 + startX_In; | ||||
| static constexpr const float startY = 73.0f; // note out bg box has 2px extra | |||||
| static constexpr const float startY = 73.0f; // note: out bg box has 2px extra | |||||
| static constexpr const float padding = 29.0f; | static constexpr const float padding = 29.0f; | ||||
| static constexpr const float middleX = startX_In + (startX_Out - startX_In) * 0.5f /*+ padding * 0.35f*/; | static constexpr const float middleX = startX_In + (startX_Out - startX_In) * 0.5f /*+ padding * 0.35f*/; | ||||
| @@ -242,6 +242,7 @@ struct NanoKnob : Knob { | |||||
| }; | }; | ||||
| struct NanoMeter : Widget { | struct NanoMeter : Widget { | ||||
| bool hasGainKnob = false; | |||||
| float gainMeterL = 0.0f; | float gainMeterL = 0.0f; | ||||
| float gainMeterR = 0.0f; | float gainMeterR = 0.0f; | ||||
| @@ -252,7 +253,7 @@ struct NanoMeter : Widget { | |||||
| if (layer != 1) | if (layer != 1) | ||||
| return; | return; | ||||
| const float usableHeight = box.size.y - 10.0f; | |||||
| const float usableHeight = box.size.y - (hasGainKnob ? 10.0f : 0.0f); | |||||
| // draw background | // draw background | ||||
| nvgBeginPath(args.vg); | nvgBeginPath(args.vg); | ||||
| @@ -281,6 +282,9 @@ struct NanoMeter : Widget { | |||||
| nvgFill(args.vg); | nvgFill(args.vg); | ||||
| nvgStroke(args.vg); | nvgStroke(args.vg); | ||||
| if (! hasGainKnob) | |||||
| return; | |||||
| nvgLineCap(args.vg, NVG_ROUND); | nvgLineCap(args.vg, NVG_ROUND); | ||||
| nvgBeginPath(args.vg); | nvgBeginPath(args.vg); | ||||
| @@ -44,3 +44,33 @@ extern Model* modelHostTime; | |||||
| extern Model* modelIldaeil; | extern Model* modelIldaeil; | ||||
| extern Model* modelMPV; | extern Model* modelMPV; | ||||
| extern Model* modelTextEditor; | extern Model* modelTextEditor; | ||||
| /* | |||||
| * Find the highest absolute and normalized value within a float array. | |||||
| */ | |||||
| static inline | |||||
| float d_findMaxNormalizedFloat(const float floats[], const std::size_t count) | |||||
| { | |||||
| DISTRHO_SAFE_ASSERT_RETURN(floats != nullptr, 0.0f); | |||||
| DISTRHO_SAFE_ASSERT_RETURN(count > 0, 0.0f); | |||||
| static const float kEmptyFloats[8192] = {}; | |||||
| if (count <= 8192 && std::memcmp(floats, kEmptyFloats, count) == 0) | |||||
| return 0.0f; | |||||
| float tmp, maxf2 = std::abs(floats[0]); | |||||
| for (std::size_t i=1; i<count; ++i) | |||||
| { | |||||
| tmp = std::abs(*floats++); | |||||
| if (tmp > maxf2) | |||||
| maxf2 = tmp; | |||||
| } | |||||
| if (maxf2 > 1.0f) | |||||
| maxf2 = 1.0f; | |||||
| return maxf2; | |||||
| } | |||||