summaryrefslogtreecommitdiffstats
path: root/src/engine/filters/enginefilteriir.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/filters/enginefilteriir.h')
-rw-r--r--src/engine/filters/enginefilteriir.h208
1 files changed, 118 insertions, 90 deletions
diff --git a/src/engine/filters/enginefilteriir.h b/src/engine/filters/enginefilteriir.h
index 48464e37c8..b00996b9ba 100644
--- a/src/engine/filters/enginefilteriir.h
+++ b/src/engine/filters/enginefilteriir.h
@@ -1,7 +1,9 @@
#pragma once
-#define MIXXX
#include <cstdio>
+#include <cstring>
+
+#define MIXXX
#include <fidlib.h>
#include "engine/engineobject.h"
@@ -89,110 +91,136 @@ class EngineFilterIIR : public EngineFilterIIRBase {
m_doRamping = true;
}
- void setCoefs(const char* spec, double sampleRate,
- double freq0, double freq1 = 0, int adj = 0) {
-
+ void setCoefs(const char* spec,
+ size_t bufsize,
+ double sampleRate,
+ double freq0,
+ double freq1 = 0,
+ int adj = 0) {
char spec_d[FIDSPEC_LENGTH];
- if (strlen(spec) < sizeof(spec_d)) {
- // Copy to dynamic-ish memory to prevent fidlib API breakage.
- strcpy(spec_d, spec);
+ VERIFY_OR_DEBUG_ASSERT(bufsize <= sizeof(spec_d)) {
+ return;
+ }
+ // Copy to dynamic-ish memory to prevent fidlib API breakage.
+ std::strncpy(spec_d, spec, bufsize);
- // Copy the old coefficients into m_oldCoef
- memcpy(m_oldCoef, m_coef, sizeof(m_coef));
+ // Copy the old coefficients into m_oldCoef
+ memcpy(m_oldCoef, m_coef, sizeof(m_coef));
- m_coef[0] = fid_design_coef(m_coef + 1, SIZE,
- spec_d, sampleRate, freq0, freq1, adj);
+ m_coef[0] = fid_design_coef(m_coef + 1, SIZE, spec_d, sampleRate, freq0, freq1, adj);
- initBuffers();
+ initBuffers();
#if(IIR_ANALYSIS)
- char* desc;
- FidFilter* filt = fid_design(spec_d, sampleRate, freq0, freq1, adj, &desc);
- int delay = fid_calc_delay(filt);
- qDebug() << QString().fromLatin1(desc) << "delay:" << delay;
- double resp0, phase0;
- resp0 = fid_response_pha(filt, freq0 / sampleRate, &phase0);
- qDebug() << "freq0:" << freq0 << resp0 << phase0;
- if (freq1) {
- double resp1, phase1;
- resp1 = fid_response_pha(filt, freq1 / sampleRate, &phase1);
- qDebug() << "freq1:" << freq1 << resp1 << phase1;
- }
- double resp2, phase2;
- resp2 = fid_response_pha(filt, freq0 / sampleRate / 2, &phase2);
- qDebug() << "freq2:" << freq0 / 2 << resp2 << phase0;
- double resp3, phase3;
- resp3 = fid_response_pha(filt, freq0 / sampleRate * 2, &phase3);
- qDebug() << "freq3:" << freq0 * 2 << resp3 << phase0;
- double resp4, phase4;
- resp4 = fid_response_pha(filt, freq0 / sampleRate / 2.2, &phase4);
- qDebug() << "freq4:" << freq0 / 2.2 << resp2 << phase0;
- double resp5, phase5;
- resp5 = fid_response_pha(filt, freq0 / sampleRate * 2.2, &phase5);
- qDebug() << "freq5:" << freq0 * 2.2 << resp3 << phase0;
- free(filt);
-#endif
+ char* desc;
+ FidFilter* filt = fid_design(spec_d, sampleRate, freq0, freq1, adj, &desc);
+ int delay = fid_calc_delay(filt);
+ qDebug() << QString().fromLatin1(desc) << "delay:" << delay;
+ double resp0, phase0;
+ resp0 = fid_response_pha(filt, freq0 / sampleRate, &phase0);
+ qDebug() << "freq0:" << freq0 << resp0 << phase0;
+ if (freq1) {
+ double resp1, phase1;
+ resp1 = fid_response_pha(filt, freq1 / sampleRate, &phase1);
+ qDebug() << "freq1:" << freq1 << resp1 << phase1;
}
+ double resp2, phase2;
+ resp2 = fid_response_pha(filt, freq0 / sampleRate / 2, &phase2);
+ qDebug() << "freq2:" << freq0 / 2 << resp2 << phase0;
+ double resp3, phase3;
+ resp3 = fid_response_pha(filt, freq0 / sampleRate * 2, &phase3);
+ qDebug() << "freq3:" << freq0 * 2 << resp3 << phase0;
+ double resp4, phase4;
+ resp4 = fid_response_pha(filt, freq0 / sampleRate / 2.2, &phase4);
+ qDebug() << "freq4:" << freq0 / 2.2 << resp2 << phase0;
+ double resp5, phase5;
+ resp5 = fid_response_pha(filt, freq0 / sampleRate * 2.2, &phase5);
+ qDebug() << "freq5:" << freq0 * 2.2 << resp3 << phase0;
+ free(filt);
+#endif
}
- void setCoefs2(double sampleRate, int n_coef1,
- const char* spec1, double freq01, double freq11, int adj1,
- const char* spec2, double freq02, double freq12, int adj2) {
+ void setCoefs2(double sampleRate,
+ int n_coef1,
+ const char* spec1,
+ size_t spec1size,
+ double freq01,
+ double freq11,
+ int adj1,
+ const char* spec2,
+ size_t spec2size,
+ double freq02,
+ double freq12,
+ int adj2) {
char spec1_d[FIDSPEC_LENGTH];
char spec2_d[FIDSPEC_LENGTH];
- if (strlen(spec1) < sizeof(spec1_d) &&
- strlen(spec2) < sizeof(spec2_d)) {
- // Copy to dynamic-ish memory to prevent fidlib API breakage.
- strcpy(spec1_d, spec1);
- strcpy(spec2_d, spec2);
-
- // Copy the old coefficients into m_oldCoef
- memcpy(m_oldCoef, m_coef, sizeof(m_coef));
- m_coef[0] = fid_design_coef(m_coef + 1, n_coef1,
- spec1, sampleRate, freq01, freq11, adj1) *
- fid_design_coef(m_coef + 1 + n_coef1, SIZE - n_coef1,
- spec2, sampleRate, freq02, freq12, adj2);
+ VERIFY_OR_DEBUG_ASSERT(spec1size <= sizeof(spec1_d) && spec2size <= sizeof(spec2_d)) {
+ return;
+ }
- initBuffers();
+ // Copy to dynamic-ish memory to prevent fidlib API breakage.
+ std::strncpy(spec1_d, spec1, spec1size);
+ std::strncpy(spec2_d, spec2, spec2size);
+ spec1_d[FIDSPEC_LENGTH - 1] = '\0';
+ spec2_d[FIDSPEC_LENGTH - 1] = '\0';
+
+ // Copy the old coefficients into m_oldCoef
+ memcpy(m_oldCoef, m_coef, sizeof(m_coef));
+ m_coef[0] = fid_design_coef(m_coef + 1,
+ n_coef1,
+ spec1,
+ sampleRate,
+ freq01,
+ freq11,
+ adj1) *
+ fid_design_coef(m_coef + 1 + n_coef1,
+ SIZE - n_coef1,
+ spec2,
+ sampleRate,
+ freq02,
+ freq12,
+ adj2);
+
+ initBuffers();
#if(IIR_ANALYSIS)
- char* desc1;
- char* desc2;
- FidFilter* filt1 = fid_design(spec1, sampleRate, freq01, freq11, adj1, &desc1);
- FidFilter* filt2 = fid_design(spec2, sampleRate, freq02, freq12, adj2, &desc2);
- FidFilter* filt = fid_cat(1, filt1, filt2, NULL);
- int delay = fid_calc_delay(filt);
- qDebug() << QString().fromLatin1(desc1) << "X" << QString().fromLatin1(desc2) << "delay:" << delay;
- double resp0, phase0;
- resp0 = fid_response_pha(filt, freq01 / sampleRate, &phase0);
- qDebug() << "freq01:" << freq01 << resp0 << phase0;
- resp0 = fid_response_pha(filt, freq01 / sampleRate, &phase0);
- qDebug() << "freq02:" << freq02 << resp0 << phase0;
- if (freq11) {
- double resp1, phase1;
- resp1 = fid_response_pha(filt, freq11 / sampleRate, &phase1);
- qDebug() << "freq1:" << freq11 << resp1 << phase1;
- }
- if (freq12) {
- double resp1, phase1;
- resp1 = fid_response_pha(filt, freq12 / sampleRate, &phase1);
- qDebug() << "freq1:" << freq12 << resp1 << phase1;
- }
- double resp2, phase2;
- resp2 = fid_response_pha(filt, freq01 / sampleRate / 2, &phase2);
- qDebug() << "freq2:" << freq01 / 2 << resp2 << phase0;
- double resp3, phase3;
- resp3 = fid_response_pha(filt, freq01 / sampleRate * 2, &phase3);
- qDebug() << "freq3:" << freq01 * 2 << resp3 << phase0;
- double resp4, phase4;
- resp4 = fid_response_pha(filt, freq01 / sampleRate / 2.2, &phase4);
- qDebug() << "freq4:" << freq01 / 2.2 << resp2 << phase0;
- double resp5, phase5;
- resp5 = fid_response_pha(filt, freq01 / sampleRate * 2.2, &phase5);
- qDebug() << "freq5:" << freq01 * 2.2 << resp3 << phase0;
- free(filt);
-#endif
+ char* desc1;
+ char* desc2;
+ FidFilter* filt1 = fid_design(spec1, sampleRate, freq01, freq11, adj1, &desc1);
+ FidFilter* filt2 = fid_design(spec2, sampleRate, freq02, freq12, adj2, &desc2);
+ FidFilter* filt = fid_cat(1, filt1, filt2, NULL);
+ int delay = fid_calc_delay(filt);
+ qDebug() << QString().fromLatin1(desc1) << "X"
+ << QString().fromLatin1(desc2) << "delay:" << delay;
+ double resp0, phase0;
+ resp0 = fid_response_pha(filt, freq01 / sampleRate, &phase0);
+ qDebug() << "freq01:" << freq01 << resp0 << phase0;
+ resp0 = fid_response_pha(filt, freq01 / sampleRate, &phase0);
+ qDebug() << "freq02:" << freq02 << resp0 << phase0;
+ if (freq11) {
+ double resp1, phase1;
+ resp1 = fid_response_pha(filt, freq11 / sampleRate, &phase1);
+ qDebug() << "freq1:" << freq11 << resp1 << phase1;
+ }
+ if (freq12) {
+ double resp1, phase1;
+ resp1 = fid_response_pha(filt, freq12 / sampleRate, &phase1);
+ qDebug() << "freq1:" << freq12 << resp1 << phase1;
}
+ double resp2, phase2;
+ resp2 = fid_response_pha(filt, freq01 / sampleRate / 2, &phase2);
+ qDebug() << "freq2:" << freq01 / 2 << resp2 << phase0;
+ double resp3, phase3;
+ resp3 = fid_response_pha(filt, freq01 / sampleRate * 2, &phase3);
+ qDebug() << "freq3:" << freq01 * 2 << resp3 << phase0;
+ double resp4, phase4;
+ resp4 = fid_response_pha(filt, freq01 / sampleRate / 2.2, &phase4);
+ qDebug() << "freq4:" << freq01 / 2.2 << resp2 << phase0;
+ double resp5, phase5;
+ resp5 = fid_response_pha(filt, freq01 / sampleRate * 2.2, &phase5);
+ qDebug() << "freq5:" << freq01 * 2.2 << resp3 << phase0;
+ free(filt);
+#endif
}
virtual void assumeSettled() {