Merge pull request #713 from jpcima/linear-smoother-fix
Linear smoother fix
This commit is contained in:
commit
44e48f7003
1 changed files with 34 additions and 4 deletions
|
|
@ -9,7 +9,10 @@
|
||||||
#include "MathHelpers.h"
|
#include "MathHelpers.h"
|
||||||
#include "SfzHelpers.h"
|
#include "SfzHelpers.h"
|
||||||
#include "SIMDHelpers.h"
|
#include "SIMDHelpers.h"
|
||||||
|
#include <simde/simde-features.h>
|
||||||
|
#if SIMDE_NATURAL_VECTOR_SIZE_GE(128)
|
||||||
#include <simde/x86/sse.h>
|
#include <simde/x86/sse.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace sfz {
|
namespace sfz {
|
||||||
|
|
||||||
|
|
@ -96,13 +99,14 @@ void LinearSmoother::process(absl::Span<const float> input, absl::Span<float> ou
|
||||||
// int32_t framesToTarget = framesToTarget_;
|
// int32_t framesToTarget = framesToTarget_;
|
||||||
const int32_t smoothFrames = smoothFrames_;
|
const int32_t smoothFrames = smoothFrames_;
|
||||||
|
|
||||||
|
#if SIMDE_NATURAL_VECTOR_SIZE_GE(128)
|
||||||
for (; i + 15 < count; i += 16) {
|
for (; i + 15 < count; i += 16) {
|
||||||
const float nextTarget = input[i + 15];
|
const float nextTarget = input[i + 15];
|
||||||
if (target != nextTarget) {
|
if (target != nextTarget) {
|
||||||
target = nextTarget;
|
target = nextTarget;
|
||||||
//framesToTarget = (framesToTarget > 0) ? framesToTarget : smoothFrames;
|
//framesToTarget = (framesToTarget > 0) ? framesToTarget : smoothFrames;
|
||||||
//step = (target - current) / max(1, framesToTarget);
|
//step = (target - current) / (16 * max(1, framesToTarget));
|
||||||
step = (target - current) / max(1, smoothFrames);
|
step = (target - current) / (16 * max(1, smoothFrames));
|
||||||
}
|
}
|
||||||
const simde__m128 targetX4 = simde_mm_set1_ps(target);
|
const simde__m128 targetX4 = simde_mm_set1_ps(target);
|
||||||
if (target > current) {
|
if (target > current) {
|
||||||
|
|
@ -143,14 +147,40 @@ void LinearSmoother::process(absl::Span<const float> input, absl::Span<float> ou
|
||||||
}
|
}
|
||||||
//framesToTarget -= 16;
|
//framesToTarget -= 16;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
for (; i + 15 < count; i += 16) {
|
||||||
|
const float nextTarget = input[i + 15];
|
||||||
|
|
||||||
|
if (target != nextTarget) {
|
||||||
|
target = nextTarget;
|
||||||
|
//framesToTarget = (framesToTarget > 0) ? framesToTarget : smoothFrames;
|
||||||
|
//step = (target - current) / (16 * max(1, framesToTarget));
|
||||||
|
step = (target - current) / (16 * max(1, smoothFrames));
|
||||||
|
}
|
||||||
|
if (target > current) {
|
||||||
|
for (size_t j = 0; j < 16; ++j)
|
||||||
|
output[i + j] = current = min(target, current + step);
|
||||||
|
}
|
||||||
|
else if (target < current) {
|
||||||
|
for (size_t j = 0; j < 16; ++j)
|
||||||
|
output[i + j] = current = max(target, current + step);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (size_t j = 0; j < 16; ++j)
|
||||||
|
output[i + j] = target;
|
||||||
|
}
|
||||||
|
|
||||||
|
//framesToTarget -= 16;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (i < count) {
|
if (i < count) {
|
||||||
const float nextTarget = input[count - 1];
|
const float nextTarget = input[count - 1];
|
||||||
if (target != nextTarget) {
|
if (target != nextTarget) {
|
||||||
target = nextTarget;
|
target = nextTarget;
|
||||||
// framesToTarget = (framesToTarget > 0) ? framesToTarget : smoothFrames;
|
// framesToTarget = (framesToTarget > 0) ? framesToTarget : smoothFrames;
|
||||||
// step = (target - current) / max(1, framesToTarget);
|
// step = (target - current) / ((count - i) * max(1, framesToTarget));
|
||||||
step = (target - current) / max(1, smoothFrames);
|
step = (target - current) / ((count - i) * max(1, smoothFrames));
|
||||||
}
|
}
|
||||||
if (target > current) {
|
if (target > current) {
|
||||||
for (; i < count; ++i)
|
for (; i < count; ++i)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue