/* Bitcrusher.h */ #pragma once #include "dspobject.h" #include "MonoEffect.h" namespace DSP { class Bitcrusher : public MonoEffect { public: Bitcrusher(); ~Bitcrusher(); void processReplacing(float* in, float* out, int sampleFrames); void setSteps(int i) { this->steps = i; } private: int steps; }; } /* Bitcrusher.cpp */ #include "Bitcrusher.h" using namespace DSP; Bitcrusher::Bitcrusher() : MonoEffect() { } Bitcrusher::~Bitcrusher(void) { } void Bitcrusher::processReplacing(float* in, float* out, int sampleFrames) { register int steps = this->steps; for(; sampleFrames; sampleFrames--, out++, in++) { *out = (int) (*in * steps) / (float) steps; } } /* MonoEffect.h */ #pragma once #include "DSPObject.h" namespace DSP { class MonoEffect : public DSPObject { public: MonoEffect() : DSPObject(1, 1) { } virtual ~MonoEffect() = 0; virtual void processReplacing(float* in, float* out, int sampleFrames) = 0; void processReplacing(float** ins, float** outs, int sampleFrames) { this->processReplacing(*ins, *outs, sampleFrames); } }; } /* DSPObject.h */ #pragma once namespace DSP { // Represents an abstract processing object class DSPObject { public: DSPObject() { this->numInputs = this->numOutputs = 0; } DSPObject(int numInputs, int numOutputs) { this->numInputs = numInputs; this->numOutputs = numOutputs; } virtual ~DSPObject() {}; // process sampleFrames samples from in[] and put them into out[] // pure virtual - must be overloaded in inheriting class virtual void processReplacing(float** in, float** out, int sampleFrames) = 0; virtual int getNumInputs() { return this->numInputs; } virtual int getNumOutputs() { return this->numOutputs; } protected: int numInputs; int numOutputs; }; } /* Error: Error 1 error LNK2019: unresolved external symbol "public: virtual __thiscall DSP::MonoEffect::~MonoEffect(void)" (??1MonoEffect@DSP@@UAE@XZ) referenced in function "public: virtual __thiscall DSP::Bitcrusher::~Bitcrusher(void)" (??1Bitcrusher@DSP@@UAE@XZ) Bitcrusher.obj */