Oversampler special cases 2x 4x
This commit is contained in:
parent
781f2167ad
commit
ff359df5cd
2 changed files with 86 additions and 86 deletions
|
|
@ -199,7 +199,14 @@ static void generate_cpp_upsampler(const Stage *stages, int num_stages)
|
|||
|
||||
printf("\t" "static int recommendedBuffer(int factor, int spl)\n");
|
||||
printf("\t" "{\n");
|
||||
printf("\t\t" "return factor * spl;\n");
|
||||
printf("\t\t" "switch (factor) {\n");
|
||||
printf("\t\t" "case 2:\n");
|
||||
printf("\t\t\t" "return 0;\n");
|
||||
printf("\t\t" "case 4:\n");
|
||||
printf("\t\t\t" "return 2 * spl;\n");
|
||||
printf("\t\t" "default:\n");
|
||||
printf("\t\t\t" "return factor * spl;\n");
|
||||
printf("\t\t" "}\n");
|
||||
printf("\t" "}\n");
|
||||
|
||||
printf("\t" "static bool canProcess(int factor)\n");
|
||||
|
|
@ -235,14 +242,25 @@ static void generate_cpp_upsampler(const Stage *stages, int num_stages)
|
|||
printf("\t" "}\n");
|
||||
|
||||
for (int n = 1; n <= num_stages; ++n) {
|
||||
// special case factor=2, buffer not required
|
||||
if (stages[n - 1].factor == 2) {
|
||||
printf("\t" "void process2x(const float *in, float *out, int spl, float * = nullptr, int = 0)\n");
|
||||
printf("\t" "{\n");
|
||||
printf("\t\t" "up2_.process_block(out, in, spl);\n");
|
||||
printf("\t" "}\n");
|
||||
continue;
|
||||
}
|
||||
printf("\t" "void process%dx(const float *in, float *out, int spl, float *temp, int ntemp)\n", stages[n - 1].factor);
|
||||
printf("\t" "{\n");
|
||||
printf("\t\t" "int maxspl = ntemp / %d;\n", stages[n - 1].factor);
|
||||
printf("\t\t" "ASSERT(maxspl >= 0);\n");
|
||||
// special case factor=4, only 1 buffer required
|
||||
if (stages[n - 1].factor > 4)
|
||||
printf("\t\t" "int maxspl = ntemp / %d;\n", stages[n - 1].factor);
|
||||
else
|
||||
printf("\t\t" "int maxspl = ntemp / %d;\n", stages[n - 1].factor / 2);
|
||||
printf("\t\t" "ASSERT(maxspl > 0);\n");
|
||||
printf("\t\t" "float *t1 = temp;\n");
|
||||
printf("\t\t" "float *t2 = temp + %d * maxspl;\n", stages[n - 1].factor / 2);
|
||||
printf("\t\t" "(void)t1;\n");
|
||||
printf("\t\t" "(void)t2;\n");
|
||||
if (stages[n - 1].factor > 4)
|
||||
printf("\t\t" "float *t2 = temp + %d * maxspl;\n", stages[n - 1].factor / 2);
|
||||
printf("\t\t" "while (spl > 0) {\n");
|
||||
printf("\t\t\t" "int curspl = (spl < maxspl) ? spl : maxspl;\n");
|
||||
for (int i = 0; i < n; ++i) {
|
||||
|
|
@ -294,7 +312,14 @@ static void generate_cpp_downsampler(const Stage *stages, int num_stages)
|
|||
|
||||
printf("\t" "static int recommendedBuffer(int factor, int spl)\n");
|
||||
printf("\t" "{\n");
|
||||
printf("\t\t" "return factor * spl;\n");
|
||||
printf("\t\t" "switch (factor) {\n");
|
||||
printf("\t\t" "case 2:\n");
|
||||
printf("\t\t\t" "return 0;\n");
|
||||
printf("\t\t" "case 4:\n");
|
||||
printf("\t\t\t" "return 2 * spl;\n");
|
||||
printf("\t\t" "default:\n");
|
||||
printf("\t\t\t" "return factor * spl;\n");
|
||||
printf("\t\t" "}\n");
|
||||
printf("\t" "}\n");
|
||||
|
||||
printf("\t" "static bool canProcess(int factor)\n");
|
||||
|
|
@ -330,14 +355,25 @@ static void generate_cpp_downsampler(const Stage *stages, int num_stages)
|
|||
printf("\t" "}\n");
|
||||
|
||||
for (int n = 1; n <= num_stages; ++n) {
|
||||
// special case factor=2, buffer not required
|
||||
if (stages[n - 1].factor == 2) {
|
||||
printf("\t" "void process2x(const float *in, float *out, int spl, float * = nullptr, int = 0)\n");
|
||||
printf("\t" "{\n");
|
||||
printf("\t\t" "down2_.process_block(out, in, spl);\n");
|
||||
printf("\t" "}\n");
|
||||
continue;
|
||||
}
|
||||
printf("\t" "void process%dx(const float *in, float *out, int spl, float *temp, int ntemp)\n", stages[n - 1].factor);
|
||||
printf("\t" "{\n");
|
||||
printf("\t\t" "int maxspl = ntemp / %d;\n", stages[n - 1].factor);
|
||||
printf("\t\t" "ASSERT(maxspl >= 0);\n");
|
||||
// special case factor=4, only 1 buffer required
|
||||
if (stages[n - 1].factor > 4)
|
||||
printf("\t\t" "int maxspl = ntemp / %d;\n", stages[n - 1].factor);
|
||||
else
|
||||
printf("\t\t" "int maxspl = ntemp / %d;\n", stages[n - 1].factor / 2);
|
||||
printf("\t\t" "ASSERT(maxspl > 0);\n");
|
||||
printf("\t\t" "float *t1 = temp;\n");
|
||||
printf("\t\t" "float *t2 = temp + %d * maxspl;\n", stages[n - 1].factor / 2);
|
||||
printf("\t\t" "(void)t1;\n");
|
||||
printf("\t\t" "(void)t2;\n");
|
||||
if (stages[n - 1].factor > 4)
|
||||
printf("\t\t" "float *t2 = temp + %d * maxspl;\n", stages[n - 1].factor / 2);
|
||||
printf("\t\t" "while (spl > 0) {\n");
|
||||
printf("\t\t\t" "int curspl = (spl < maxspl) ? spl : maxspl;\n");
|
||||
for (int i = 0; i < n; ++i) {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
// SPDX-License-Identifier: BSD-2-Clause
|
||||
|
||||
// This code is part of the sfizz library and is licensed under a BSD 2-clause
|
||||
// license. You should have receive a LICENSE.md file along with the code.
|
||||
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// This is generated by the Sfizz HIIR designer
|
||||
|
|
@ -85,7 +85,14 @@ public:
|
|||
}
|
||||
static int recommendedBuffer(int factor, int spl)
|
||||
{
|
||||
return factor * spl;
|
||||
switch (factor) {
|
||||
case 2:
|
||||
return 0;
|
||||
case 4:
|
||||
return 2 * spl;
|
||||
default:
|
||||
return factor * spl;
|
||||
}
|
||||
}
|
||||
static bool canProcess(int factor)
|
||||
{
|
||||
|
|
@ -135,30 +142,15 @@ public:
|
|||
break;
|
||||
}
|
||||
}
|
||||
void process2x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
void process2x(const float *in, float *out, int spl, float * = nullptr, int = 0)
|
||||
{
|
||||
int maxspl = ntemp / 2;
|
||||
ASSERT(maxspl >= 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 1 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
up2_.process_block(out, in, 1 * curspl);
|
||||
in += curspl;
|
||||
out += curspl;
|
||||
spl -= curspl;
|
||||
}
|
||||
up2_.process_block(out, in, spl);
|
||||
}
|
||||
void process4x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 4;
|
||||
ASSERT(maxspl >= 0);
|
||||
int maxspl = ntemp / 2;
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 2 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
up2_.process_block(t1, in, 1 * curspl);
|
||||
|
|
@ -171,11 +163,9 @@ public:
|
|||
void process8x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 8;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 4 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
up2_.process_block(t1, in, 1 * curspl);
|
||||
|
|
@ -189,11 +179,9 @@ public:
|
|||
void process16x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 16;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 8 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
up2_.process_block(t1, in, 1 * curspl);
|
||||
|
|
@ -208,11 +196,9 @@ public:
|
|||
void process32x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 32;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 16 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
up2_.process_block(t1, in, 1 * curspl);
|
||||
|
|
@ -228,11 +214,9 @@ public:
|
|||
void process64x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 64;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 32 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
up2_.process_block(t1, in, 1 * curspl);
|
||||
|
|
@ -249,11 +233,9 @@ public:
|
|||
void process128x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 128;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 64 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
up2_.process_block(t1, in, 1 * curspl);
|
||||
|
|
@ -302,7 +284,14 @@ public:
|
|||
}
|
||||
static int recommendedBuffer(int factor, int spl)
|
||||
{
|
||||
return factor * spl;
|
||||
switch (factor) {
|
||||
case 2:
|
||||
return 0;
|
||||
case 4:
|
||||
return 2 * spl;
|
||||
default:
|
||||
return factor * spl;
|
||||
}
|
||||
}
|
||||
static bool canProcess(int factor)
|
||||
{
|
||||
|
|
@ -352,30 +341,15 @@ public:
|
|||
break;
|
||||
}
|
||||
}
|
||||
void process2x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
void process2x(const float *in, float *out, int spl, float * = nullptr, int = 0)
|
||||
{
|
||||
int maxspl = ntemp / 2;
|
||||
ASSERT(maxspl >= 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 1 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
down2_.process_block(out, in, 1 * curspl);
|
||||
in += curspl;
|
||||
out += curspl;
|
||||
spl -= curspl;
|
||||
}
|
||||
down2_.process_block(out, in, spl);
|
||||
}
|
||||
void process4x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 4;
|
||||
ASSERT(maxspl >= 0);
|
||||
int maxspl = ntemp / 2;
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 2 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
down4_.process_block(t1, in, 2 * curspl);
|
||||
|
|
@ -388,11 +362,9 @@ public:
|
|||
void process8x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 8;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 4 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
down8_.process_block(t1, in, 4 * curspl);
|
||||
|
|
@ -406,11 +378,9 @@ public:
|
|||
void process16x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 16;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 8 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
down16_.process_block(t1, in, 8 * curspl);
|
||||
|
|
@ -425,11 +395,9 @@ public:
|
|||
void process32x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 32;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 16 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
down32_.process_block(t1, in, 16 * curspl);
|
||||
|
|
@ -445,11 +413,9 @@ public:
|
|||
void process64x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 64;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 32 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
down64_.process_block(t1, in, 32 * curspl);
|
||||
|
|
@ -466,11 +432,9 @@ public:
|
|||
void process128x(const float *in, float *out, int spl, float *temp, int ntemp)
|
||||
{
|
||||
int maxspl = ntemp / 128;
|
||||
ASSERT(maxspl >= 0);
|
||||
ASSERT(maxspl > 0);
|
||||
float *t1 = temp;
|
||||
float *t2 = temp + 64 * maxspl;
|
||||
(void)t1;
|
||||
(void)t2;
|
||||
while (spl > 0) {
|
||||
int curspl = (spl < maxspl) ? spl : maxspl;
|
||||
down128_.process_block(t1, in, 64 * curspl);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue