Skip to content

Commit

Permalink
Minor optimization in mixInputs lambda
Browse files Browse the repository at this point in the history
  • Loading branch information
messmerd committed Oct 16, 2024
1 parent bd404df commit dcf1fc9
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions src/core/PluginPinConnector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ void PluginPinConnector::routeToPlugin(f_cnt_t frames,
void PluginPinConnector::routeFromPlugin(f_cnt_t frames,
SplitAudioBufferView<const sample_t> in, CoreAudioBufferViewMut inOut) const
{
assert(frames <= DEFAULT_BUFFER_SIZE);
assert(frames <= MAXIMUM_BUFFER_SIZE);

// Ignore all unused track channels for better performance
const auto inOutSizeConstrained = m_trackChannelsUpperBound / 2;
Expand All @@ -204,7 +204,9 @@ void PluginPinConnector::routeFromPlugin(f_cnt_t frames,
SampleFrame* outPtr = inOut[outChannelPairIdx]; // L/R track channel pair
const auto outChannel = static_cast<std::uint8_t>(outChannelPairIdx * 2);

const auto mixInputs = [&](std::uint8_t outChannel, std::uint8_t outChannelOffset) {
// TODO C++20: Use explicit non-type template parameter instead of `outChannelOffset` auto parameter
const auto mixInputs = [&](std::uint8_t outChannel, auto outChannelOffset) {
constexpr auto outChannelOffsetConst = outChannelOffset();
WorkingBuffer.fill(0.f); // used as buffer out

// Counter for # of in channels routed to the current out channel
Expand All @@ -213,16 +215,14 @@ void PluginPinConnector::routeFromPlugin(f_cnt_t frames,
std::uint8_t inChannel = 0;
for (f_cnt_t inSampleIdx = 0; inSampleIdx < in.size(); inSampleIdx += frames, ++inChannel)
{
const SplitSampleType<sample_t>* inPtr = &in[inSampleIdx];
if (!m_out.enabled(outChannel + outChannelOffsetConst, inChannel)) { continue; }

if (m_out.enabled(outChannel + outChannelOffset, inChannel))
const SplitSampleType<sample_t>* inPtr = &in[inSampleIdx];
for (f_cnt_t frame = 0; frame < frames; ++frame)
{
for (f_cnt_t frame = 0; frame < frames; ++frame)
{
WorkingBuffer[frame] += inPtr[frame];
}
++numRouted;
WorkingBuffer[frame] += inPtr[frame];
}
++numRouted;
}

switch (numRouted)
Expand All @@ -236,7 +236,7 @@ void PluginPinConnector::routeFromPlugin(f_cnt_t frames,
// Normalization not needed, but copying is
for (f_cnt_t frame = 0; frame < frames; ++frame)
{
outPtr[frame][outChannelOffset] = WorkingBuffer[frame];
outPtr[frame][outChannelOffsetConst] = WorkingBuffer[frame];
}
break;
}
Expand All @@ -245,18 +245,18 @@ void PluginPinConnector::routeFromPlugin(f_cnt_t frames,
// Normalize output
for (f_cnt_t frame = 0; frame < frames; ++frame)
{
outPtr[frame][outChannelOffset] = WorkingBuffer[frame] / numRouted;
outPtr[frame][outChannelOffsetConst] = WorkingBuffer[frame] / numRouted;
}
break;
}
}
};

// Left SampleFrame channel first
mixInputs(outChannel, 0);
mixInputs(outChannel, std::integral_constant<int, 0>{});

// Right SampleFrame channel second
mixInputs(outChannel, 1);
mixInputs(outChannel, std::integral_constant<int, 1>{});
}
}

Expand Down

0 comments on commit dcf1fc9

Please sign in to comment.