From 9258a65cc9660d854acf27ae341e1ab549f23460 Mon Sep 17 00:00:00 2001 From: Steven Atkinson Date: Wed, 17 Jun 2026 10:47:53 -0400 Subject: [PATCH 1/2] Add ResetAndPrewarm compatibility shim --- Dependencies/eigen | 2 +- NAM/dsp.cpp | 26 +++++++++++++++++++++++++ NAM/dsp.h | 8 ++++++++ tools/run_tests.cpp | 2 ++ tools/test/test_dsp.cpp | 42 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 1 deletion(-) diff --git a/Dependencies/eigen b/Dependencies/eigen index bc3b3987..87300c93 160000 --- a/Dependencies/eigen +++ b/Dependencies/eigen @@ -1 +1 @@ -Subproject commit bc3b39870ecb690a623a3f49149a358b95c5781d +Subproject commit 87300c93cae6a8afd9a4f8aa8d9d5c5324cf02e1 diff --git a/NAM/dsp.cpp b/NAM/dsp.cpp index a89c0217..0aea735d 100644 --- a/NAM/dsp.cpp +++ b/NAM/dsp.cpp @@ -19,6 +19,26 @@ namespace thread_local bool gPrewarmOnResetDefault = true; +class ScopedDSPPrewarmOnReset +{ +public: + ScopedDSPPrewarmOnReset(nam::DSP& dsp, const bool prewarmOnReset) + : mDSP(dsp) + , mPreviousPrewarmOnReset(dsp.GetPrewarmOnReset()) + { + mDSP.SetPrewarmOnReset(prewarmOnReset); + } + + ~ScopedDSPPrewarmOnReset() { mDSP.SetPrewarmOnReset(mPreviousPrewarmOnReset); } + + ScopedDSPPrewarmOnReset(const ScopedDSPPrewarmOnReset&) = delete; + ScopedDSPPrewarmOnReset& operator=(const ScopedDSPPrewarmOnReset&) = delete; + +private: + nam::DSP& mDSP; + bool mPreviousPrewarmOnReset; +}; + } // namespace nam::ScopedPrewarmOnResetDefault::ScopedPrewarmOnResetDefault(const bool prewarmOnReset) @@ -119,6 +139,12 @@ void nam::DSP::Reset(const double sampleRate, const int maxBufferSize) prewarm(); } +void nam::DSP::ResetAndPrewarm(const double sampleRate, const int maxBufferSize) +{ + ScopedDSPPrewarmOnReset scoped_prewarm_on_reset(*this, true); + Reset(sampleRate, maxBufferSize); +} + void nam::DSP::SetPrewarmOnReset(const bool prewarmOnReset) { mPrewarmOnReset.store(prewarmOnReset, std::memory_order_release); diff --git a/NAM/dsp.h b/NAM/dsp.h index d181c388..716683d0 100644 --- a/NAM/dsp.h +++ b/NAM/dsp.h @@ -165,6 +165,14 @@ class DSP /// \param maxBufferSize Maximum buffer size to process virtual void Reset(const double sampleRate, const int maxBufferSize); + /// \brief Reset the DSP unit, then prewarm + /// + /// Deprecated: ResetAndPrewarm() will be removed in v0.6.0. Reset() prewarms by default; use + /// SetPrewarmOnReset() to control whether Reset() calls prewarm(). + /// \param sampleRate Current sample rate + /// \param maxBufferSize Maximum buffer size to process + void ResetAndPrewarm(const double sampleRate, const int maxBufferSize); + /// \brief Control whether Reset() calls prewarm() /// \param prewarmOnReset true for Reset() to call prewarm(), false to skip prewarm() virtual void SetPrewarmOnReset(const bool prewarmOnReset); diff --git a/tools/run_tests.cpp b/tools/run_tests.cpp index e765ddff..fab71f8e 100644 --- a/tools/run_tests.cpp +++ b/tools/run_tests.cpp @@ -86,6 +86,8 @@ int main() test_dsp::test_set_output_level(); test_dsp::test_reset_prewarm_on_reset_default(); test_dsp::test_set_prewarm_on_reset(); + test_dsp::test_reset_and_prewarm_forces_prewarm(); + test_dsp::test_reset_and_prewarm_restores_prewarm_on_throw(); test_dsp::test_scoped_prewarm_on_reset_default(); test_linear::test_direct_known_values(); diff --git a/tools/test/test_dsp.cpp b/tools/test/test_dsp.cpp index 334461d5..639e9eb1 100644 --- a/tools/test/test_dsp.cpp +++ b/tools/test/test_dsp.cpp @@ -2,6 +2,7 @@ #include "NAM/dsp.h" #include +#include #include namespace test_dsp @@ -19,6 +20,17 @@ class PrewarmCountingDSP : public nam::DSP int prewarm_count = 0; }; +class ThrowingResetDSP : public PrewarmCountingDSP +{ +public: + void Reset(const double sampleRate, const int maxBufferSize) override + { + (void)sampleRate; + (void)maxBufferSize; + throw std::runtime_error("Reset failed"); + } +}; + // Simplest test: can I construct something! void test_construct() { @@ -128,6 +140,36 @@ void test_set_prewarm_on_reset() assert(dsp.prewarm_count == 1); } +void test_reset_and_prewarm_forces_prewarm() +{ + PrewarmCountingDSP dsp; + dsp.SetPrewarmOnReset(false); + + dsp.ResetAndPrewarm(48000.0, 64); + + assert(dsp.prewarm_count == 1); + assert(!dsp.GetPrewarmOnReset()); +} + +void test_reset_and_prewarm_restores_prewarm_on_throw() +{ + ThrowingResetDSP dsp; + dsp.SetPrewarmOnReset(false); + + bool threw = false; + try + { + dsp.ResetAndPrewarm(48000.0, 64); + } + catch (const std::runtime_error&) + { + threw = true; + } + + assert(threw); + assert(!dsp.GetPrewarmOnReset()); +} + void test_scoped_prewarm_on_reset_default() { PrewarmCountingDSP before_scope; From ab8b9c5ed11e86a9430a5617d10efb176f90fe5b Mon Sep 17 00:00:00 2001 From: Steven Atkinson Date: Wed, 17 Jun 2026 11:07:39 -0400 Subject: [PATCH 2/2] Restore Eigen submodule version --- Dependencies/eigen | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dependencies/eigen b/Dependencies/eigen index 87300c93..bc3b3987 160000 --- a/Dependencies/eigen +++ b/Dependencies/eigen @@ -1 +1 @@ -Subproject commit 87300c93cae6a8afd9a4f8aa8d9d5c5324cf02e1 +Subproject commit bc3b39870ecb690a623a3f49149a358b95c5781d