diff --git a/plugins/Cardinal/src/HostAudio.cpp b/plugins/Cardinal/src/HostAudio.cpp index 68459ae..8e12603 100644 --- a/plugins/Cardinal/src/HostAudio.cpp +++ b/plugins/Cardinal/src/HostAudio.cpp @@ -36,11 +36,6 @@ struct HostAudio : TerminalModule { dsp::RCFilter dcFilters[numIO]; bool dcFilterEnabled = (numIO == 2); - // for stereo meter - volatile bool resetMeters = true; - float gainMeterL = 0.0f; - float gainMeterR = 0.0f; - HostAudio() : pcontext(static_cast(APP)), numParams(numIO == 2 ? 1 : 0), @@ -63,13 +58,10 @@ struct HostAudio : TerminalModule { void onReset() override { dcFilterEnabled = (numIO == 2); - resetMeters = true; } void onSampleRateChange(const SampleRateChangeEvent& e) override { - resetMeters = true; - for (int i=0; i { + // for stereo meter + int internalDataFrame = 0; + float internalDataBuffer[2][128]; + volatile bool resetMeters = true; + float gainMeterL = 0.0f; + float gainMeterR = 0.0f; + + HostAudio2() + : HostAudio<2>() + { + std::memset(internalDataBuffer, 0, sizeof(internalDataBuffer)); + } + + void onReset() override + { + HostAudio<2>::onReset(); + resetMeters = true; + } + + void onSampleRateChange(const SampleRateChangeEvent& e) override + { + HostAudio<2>::onSampleRateChange(e); + resetMeters = true; + } + + void processTerminalOutput(const ProcessArgs&) { const int blockFrames = pcontext->engine->getBlockFrames(); @@ -116,11 +152,15 @@ struct HostAudio : TerminalModule { float** const dataOuts = pcontext->dataOuts; - // stereo version gain - const float gain = numParams != 0 ? std::pow(params[0].getValue(), 2.f) : 1.0f; + // gain (stereo variant only) + const float gain = std::pow(params[0].getValue(), 2.f); + + // left/mono check + const bool in2connected = inputs[1].isConnected(); - // read first value, special case for mono mode + // read stereo values float valueL = inputs[0].getVoltageSum() * 0.1f; + float valueR = inputs[1].getVoltageSum() * 0.1f; // Apply DC filter if (dcFilterEnabled) @@ -132,68 +172,111 @@ struct HostAudio : TerminalModule { valueL = clamp(valueL * gain, -1.0f, 1.0f); dataOuts[0][k] += valueL; - // read everything else - for (int i=1; i { + // no meters in this variant + + void processTerminalOutput(const ProcessArgs&) override { - json_t* const rootJ = json_object(); - DISTRHO_SAFE_ASSERT_RETURN(rootJ != nullptr, nullptr); + const int blockFrames = pcontext->engine->getBlockFrames(); - json_object_set_new(rootJ, "dcFilter", json_boolean(dcFilterEnabled)); - return rootJ; + // only incremented on output + const int k = dataFrame++; + DISTRHO_SAFE_ASSERT_INT2_RETURN(k < blockFrames, k, blockFrames,); + + if (isBypassed()) + return; + + float** const dataOuts = pcontext->dataOuts; + + for (int i=0; i +struct HostAudioWidget : ModuleWidgetWith8HP { + HostAudio* const module; + + HostAudioWidget(HostAudio* const m) + : module(m) { - json_t* const dcFilterJ = json_object_get(rootJ, "dcFilter"); - DISTRHO_SAFE_ASSERT_RETURN(dcFilterJ != nullptr,); + setModule(m); + setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostAudio.svg"))); - dcFilterEnabled = json_boolean_value(dcFilterJ); + createAndAddScrews(); + + for (uint i=0; iaddChild(new MenuSeparator); + menu->addChild(createBoolPtrMenuItem("DC blocker", "", &module->dcFilterEnabled)); } }; -template +// -------------------------------------------------------------------------------------------------------------------- + struct HostAudioNanoMeter : NanoMeter { - HostAudio* const module; + HostAudio2* const module; - HostAudioNanoMeter(HostAudio* const m) + HostAudioNanoMeter(HostAudio2* const m) : module(m) { hasGainKnob = true; @@ -211,69 +294,58 @@ struct HostAudioNanoMeter : NanoMeter { } }; -template -struct HostAudioWidget : ModuleWidgetWith8HP { - HostAudio* const module; +// -------------------------------------------------------------------------------------------------------------------- - HostAudioWidget(HostAudio* const m) - : module(m) +struct HostAudioWidget2 : HostAudioWidget<2> { + HostAudioWidget2(HostAudio2* const m) + : HostAudioWidget<2>(m) { - setModule(m); - setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostAudio.svg"))); + // FIXME + const float middleX = box.size.x * 0.5f; + addParam(createParamCentered(Vec(middleX, 310.0f), m, 0)); + + HostAudioNanoMeter* const meter = new HostAudioNanoMeter(m); + meter->box.pos = Vec(middleX - padding + 2.75f, startY + padding * 2); + meter->box.size = Vec(padding * 2.0f - 4.0f, 136.0f); + addChild(meter); + } - createAndAddScrews(); + void draw(const DrawArgs& args) override + { + drawBackground(args.vg); + drawOutputJacksArea(args.vg, 2); + setupTextLines(args.vg); - for (uint i=0; i(Vec(middleX, 310.0f), m, 0)); - - HostAudioNanoMeter* const meter = new HostAudioNanoMeter(m); - meter->box.pos = Vec(middleX - padding + 2.75f, startY + padding * 2); - meter->box.size = Vec(padding * 2.0f - 4.0f, 136.0f); - addChild(meter); - } + ModuleWidgetWith8HP::draw(args); } +}; + +struct HostAudioWidget8 : HostAudioWidget<8> { + HostAudioWidget8(HostAudio8* const m) + : HostAudioWidget<8>(m) {} void draw(const DrawArgs& args) override { drawBackground(args.vg); - drawOutputJacksArea(args.vg, numIO); + drawOutputJacksArea(args.vg, 8); setupTextLines(args.vg); - if (numIO == 2) - { - drawTextLine(args.vg, 0, "Left/M"); - drawTextLine(args.vg, 1, "Right"); - } - else + for (int i=0; i<8; ++i) { - for (int i=0; i('0'+i+1),'\0'}; - drawTextLine(args.vg, i, text); - } + char text[] = {'A','u','d','i','o',' ',static_cast('0'+i+1),'\0'}; + drawTextLine(args.vg, i, text); } ModuleWidgetWith8HP::draw(args); } - - void appendContextMenu(Menu* const menu) override { - menu->addChild(new MenuSeparator); - menu->addChild(createBoolPtrMenuItem("DC blocker", "", &module->dcFilterEnabled)); - } }; // -------------------------------------------------------------------------------------------------------------------- -Model* modelHostAudio2 = createModel, HostAudioWidget<2>>("HostAudio2"); -Model* modelHostAudio8 = createModel, HostAudioWidget<8>>("HostAudio8"); +Model* modelHostAudio2 = createModel("HostAudio2"); +Model* modelHostAudio8 = createModel("HostAudio8"); // --------------------------------------------------------------------------------------------------------------------