Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions NAM/dsp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions NAM/dsp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions tools/run_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
42 changes: 42 additions & 0 deletions tools/test/test_dsp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "NAM/dsp.h"
#include <cassert>
#include <stdexcept>
#include <vector>

namespace test_dsp
Expand All @@ -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()
{
Expand Down Expand Up @@ -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;
Expand Down
Loading