Program Listing for File MusicControlPannel-inl.h
↰ Return to documentation for file (include/audioRender/ManualMix/MusicControlPannel-inl.h
)
#include "MusicControlPannel.hpp"
#undef HWY_TARGET_INCLUDE
#define HWY_TARGET_INCLUDE "MusicControlPannel-inl.h"
#include "hwy/foreach_target.h"
#include <hwy/highway.h>
namespace HWY_NAMESPACE {
HWY_ATTR
bool
GetPCMFramesSIMD(SIMD_FLOAT &tempFrames,
std::vector<float> &L,
std::vector<float> &R,
float **FaustStyle,
LOADS &deck,
float *array,
const unsigned long FrameSize)
{
const unsigned long long RAWFrameSize = FrameSize * CHANNEL;
tempFrames.resize(RAWFrameSize);
L.resize(FrameSize);
R.resize(FrameSize);
FaustStyle[0] = L.data();
FaustStyle[1] = R.data();
const hwy::HWY_NAMESPACE::ScalableTag<float> hwyFTag;
auto laneSize = hwy::HWY_NAMESPACE::Lanes(hwyFTag);
auto times = RAWFrameSize / laneSize;
auto remained = RAWFrameSize % laneSize;
SIMD_FLOAT solaVector;
for (auto &i : deck) {
if (i.second.play) {
const FRAME_POS Sola = static_cast<FRAME_POS>(
std::ceil(static_cast<double>(FrameSize) /
i.second.st->getInputOutputSampleRatio()));
solaVector.resize(Sola * CHANNEL);
if (ma_decoder_read_pcm_frames(
&i.second.dec.dec, solaVector.data(), Sola, NULL) !=
MA_SUCCESS) {
return false;
}
i.second.st->putSamples(solaVector.data(), Sola);
i.second.st->receiveSamples(tempFrames.data(), FrameSize);
toFaustStylePCM(FaustStyle, tempFrames.data(), FrameSize);
i.second.fxP->addFX(FaustStyle, FrameSize);
toLRStylePCM(FaustStyle, tempFrames.data(), FrameSize);
float *opoint = array;
float *tpoint = tempFrames.data();
for (size_t j = 0; j < times; ++j) {
auto simdtemp = hwy::HWY_NAMESPACE::Load(hwyFTag, tpoint);
auto simdorigin = hwy::HWY_NAMESPACE::LoadU(hwyFTag, opoint);
auto res = simdtemp + simdorigin;
hwy::HWY_NAMESPACE::StoreU(res, hwyFTag, opoint);
opoint += laneSize;
tpoint += laneSize;
}
for (size_t j = 0; j < remained; ++j) {
(*(opoint++)) += (*(tpoint++));
}
}
}
return true;
}
} // namespace HWY_NAMESPACE