|
|
@@ -31,14 +31,14 @@ struct HostAudio : Module { |
|
|
|
int64_t lastBlockFrame = -1; |
|
|
|
|
|
|
|
// for rack core audio module compatibility |
|
|
|
dsp::RCFilter dcFilters[numIO]; |
|
|
|
dsp::RCFilter dcFilters[numIO]; |
|
|
|
bool dcFilterEnabled = (numIO == 2); |
|
|
|
|
|
|
|
HostAudio() |
|
|
|
: pcontext(static_cast<CardinalPluginContext*>(APP)), |
|
|
|
numParams(numIO == 2 ? 1 : 0), |
|
|
|
numInputs(pcontext->variant == kCardinalVariantSynth ? 0 : std::max(pcontext->variant != kCardinalVariantMain ? 2 : 8, numIO)), |
|
|
|
numOutputs(std::max(pcontext->variant != kCardinalVariantMain ? 2 : 8, numIO)) |
|
|
|
numInputs(pcontext->variant == kCardinalVariantSynth ? 0 : pcontext->variant == kCardinalVariantMain ? numIO : 2), |
|
|
|
numOutputs(pcontext->variant == kCardinalVariantMain ? numIO : 2) |
|
|
|
{ |
|
|
|
if (pcontext == nullptr) |
|
|
|
throw rack::Exception("Plugin context is null"); |
|
|
@@ -49,9 +49,8 @@ struct HostAudio : Module { |
|
|
|
configParam(0, 0.f, 2.f, 1.f, "Level", " dB", -10, 40); |
|
|
|
|
|
|
|
const float sampleTime = pcontext->engine->getSampleTime(); |
|
|
|
for (int i = 0; i < numIO; i++) { |
|
|
|
for (int i=0; i<numIO; ++i) |
|
|
|
dcFilters[i].setCutoffFreq(10.f * sampleTime); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void onReset() override |
|
|
@@ -61,7 +60,7 @@ struct HostAudio : Module { |
|
|
|
|
|
|
|
void onSampleRateChange(const SampleRateChangeEvent& e) override |
|
|
|
{ |
|
|
|
for (int i = 0; i < numIO; i++) |
|
|
|
for (int i=0; i<numIO; ++i) |
|
|
|
dcFilters[i].setCutoffFreq(10.f * e.sampleTime); |
|
|
|
} |
|
|
|
|
|
|
@@ -84,11 +83,14 @@ struct HostAudio : Module { |
|
|
|
const float gain = numParams != 0 ? std::pow(params[0].getValue(), 2.f) : 1.0f; |
|
|
|
|
|
|
|
// from host into cardinal, shows as output plug |
|
|
|
for (int i=0; i<numInputs; ++i) |
|
|
|
outputs[i].setVoltage(dataIns[i][k] * 10.0f); |
|
|
|
if (dataIns != nullptr) |
|
|
|
{ |
|
|
|
for (int i=0; i<numOutputs; ++i) |
|
|
|
outputs[i].setVoltage(dataIns[i][k] * 10.0f); |
|
|
|
} |
|
|
|
|
|
|
|
// from cardinal into host, shows as input plug |
|
|
|
for (int i=0; i<numOutputs; ++i) |
|
|
|
for (int i=0; i<numInputs; ++i) |
|
|
|
{ |
|
|
|
float v = inputs[i].getVoltageSum() * 0.1f; |
|
|
|
|
|
|
@@ -147,14 +149,19 @@ struct HostAudioWidget : ModuleWidget { |
|
|
|
|
|
|
|
for (uint i=0; i<numIO; ++i) |
|
|
|
addOutput(createOutput<PJ301MPort>(Vec(startX_Out, startY + padding * i), m, i)); |
|
|
|
|
|
|
|
if (numIO == 2) |
|
|
|
{ |
|
|
|
addParam(createParamCentered<RoundLargeBlackKnob>(Vec(middleX, 290.0f), m, 0)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void drawTextLine(NVGcontext* const vg, const uint offset, const char* const text) |
|
|
|
void drawTextLine(NVGcontext* const vg, const float offsetX, const uint posY, const char* const text) |
|
|
|
{ |
|
|
|
const float y = startY + offset * padding; |
|
|
|
const float y = startY + posY * padding; |
|
|
|
nvgBeginPath(vg); |
|
|
|
nvgFillColor(vg, color::WHITE); |
|
|
|
nvgText(vg, middleX, y + 16, text, nullptr); |
|
|
|
nvgText(vg, middleX + offsetX, y + 16, text, nullptr); |
|
|
|
} |
|
|
|
|
|
|
|
void draw(const DrawArgs& args) override |
|
|
@@ -174,10 +181,18 @@ struct HostAudioWidget : ModuleWidget { |
|
|
|
nvgFillColor(args.vg, nvgRGB(0xd0, 0xd0, 0xd0)); |
|
|
|
nvgFill(args.vg); |
|
|
|
|
|
|
|
for (int i=0; i<numIO; ++i) |
|
|
|
if (numIO == 2) |
|
|
|
{ |
|
|
|
char text[] = {'A','u','d','i','o',' ',static_cast<char>('0'+i+1),'\0'}; |
|
|
|
drawTextLine(args.vg, i, text); |
|
|
|
drawTextLine(args.vg, 3.0f, 0, "Left/Mono"); |
|
|
|
drawTextLine(args.vg, 0.0f, 1, "Right"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (int i=0; i<numIO; ++i) |
|
|
|
{ |
|
|
|
char text[] = {'A','u','d','i','o',' ',static_cast<char>('0'+i+1),'\0'}; |
|
|
|
drawTextLine(args.vg, 0.0f, i, text); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ModuleWidget::draw(args); |
|
|
|