memlnaut-nisps/nisps/engines/base.hpp
monkey-w1n5t0n ea588e79cd refactor(nisps): delete dead engine/mode mass
Phase 1 group 3 (L3, L9, L4, L5, L6, ST1).

- L3: nisps/modes/voice_space.hpp — entirely dead, no includes anywhere.
- L4: deleted SawOsc and SquareOsc. KEPT SineOsc — a verifier caught that the
  original reviewer's grep missed its live consumer (the firmware selftest);
  re-confirmed here before touching the file.
- L9: removed the no-op VoiceSpace enum/table/setter boilerplate from the five
  engines with no real voice spaces; kept it on PAFSynth, VerbFX and
  ChannelStrip, which have real ones. Every engine member was checked against
  nisps/wasm/bindings.cpp, firmware/ and tests/ for callers first.
- L5: ModeBase::input_dirty_ was write-only state — deleted the flag rather
  than making it gate inference, which would have been a behaviour change.
- L6: VerbFXEngine's delay_to_verb_ (computed 12x per block, never read),
  enable_reverb_, enable_delay_to_reverb_ and the unused set_enable_* setters.
- ST1: rewrote the four engine header comment blocks that described
  implementations which do not exist.

L7 (MEMLCeliumEngine's inert feedback path) is deliberately NOT done — tracing
git history showed feedbackGain went 0.1f (live) -> "0; //0.1f" (explicitly
muted, value preserved) -> dropped entirely in the port. That is a muted
feature, not dead weight, and deleting it would silently lose it. Left intact
pending an operator decision; see the phase report.

Gates: run-all-tests.sh ALL GREEN.
2026-07-21 12:48:50 +02:00

45 lines
1.5 KiB
C++

// nisps/engines/base.hpp — common building blocks for AudioEngine
// implementations.
//
// Includes:
// - NoOpEngine: silent passthrough (engine_id() == "thru"), used directly
// as the mode-level EngineT wherever a mode produces no audio itself —
// SoundAnalysisMIDIMode (audio is analysed via a separately-composed
// AnalysisEngine member, not synthesised) and ExternalSynthMIDIMode
// (joystick -> MLP -> MIDI CC only, no audio path). BreakOrEngine and
// ElysiamorfEngine are sequencer-only engines that also return silence
// from process(), but each implements that directly — neither composes
// NoOpEngine.
// - Helper macros / static_asserts to verify each concrete engine satisfies
// `nisps::AudioEngine` at compile time.
#pragma once
#include <cstddef>
#include <span>
#include <string_view>
#include "../core/concepts.hpp"
#include "../core/perf.hpp"
#include "../core/types.hpp"
namespace nisps {
class NoOpEngine {
public:
static constexpr std::size_t param_count() noexcept { return 0u; }
static constexpr std::string_view engine_id() noexcept { return "thru"; }
void setup(float /*sample_rate*/) noexcept {}
void set_params(std::span<const float> /*params*/) noexcept {}
NISPS_HOT NISPS_FORCE_INLINE stereosample_t process(stereosample_t /*x*/) noexcept {
return {0.f, 0.f};
}
DriverConfig driver_config() const noexcept { return {}; }
};
static_assert(AudioEngine<NoOpEngine>, "NoOpEngine must satisfy AudioEngine");
} // namespace nisps