Cog/Frameworks/libsidplay/sidplay-residfp-code/.svn/pristine/61/61d69da0b07c3b871a26079f49be31a2edc56d06.svn-base
2014-12-07 22:26:31 -08:00

149 lines
3.2 KiB
Text

/*
* This file is part of libsidplayfp, a SID player engine.
*
* Copyright 2011-2013 Leandro Nini <drfiemost@users.sourceforge.net>
* Copyright 2007-2010 Antti Lankila
* Copyright 2004 Dag Lem <resid@nimrod.no>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef FILTER_H
#define FILTER_H
namespace reSIDfp
{
/**
* SID filter base class
*/
class Filter
{
protected:
/// Filter cutoff frequency.
unsigned int fc;
/// Filter resonance.
unsigned char res;
/// Current volume.
unsigned char vol;
/// Routing to filter or outside filter
bool filt1, filt2, filt3, filtE;
/// Switch voice 3 off.
bool voice3off;
/// Highpass, bandpass, and lowpass filter modes.
bool hp, bp, lp;
private:
/// Filter enabled.
bool enabled;
/// Selects which inputs to route through filter.
unsigned char filt;
protected:
/**
* Set filter cutoff frequency.
*/
virtual void updatedCenterFrequency() = 0;
/**
* Set filter resonance.
*/
virtual void updatedResonance() = 0;
/**
* Mixing configuration modified (offsets change)
*/
virtual void updatedMixing() = 0;
public:
Filter() :
fc(0),
res(0),
vol(0),
filt1(false),
filt2(false),
filt3(false),
filtE(false),
voice3off(false),
hp(false),
bp(false),
lp(false),
enabled(true),
filt(0) {}
virtual ~Filter() {}
/**
* SID clocking - 1 cycle
*
* @param v1 voice 1 in
* @param v2 voice 2 in
* @param v3 voice 3 in
* @return filtered output
*/
virtual int clock(int v1, int v2, int v3) = 0;
/**
* Enable filter.
*
* @param enable
*/
void enable(bool enable);
/**
* SID reset.
*/
void reset();
/**
* Write Frequency Cutoff Low register.
*
* @param fc_lo Frequency Cutoff Low-Byte
*/
void writeFC_LO(unsigned char fc_lo);
/**
* Write Frequency Cutoff High register.
*
* @param fc_hi Frequency Cutoff High-Byte
*/
void writeFC_HI(unsigned char fc_hi);
/**
* Write Resonance/Filter register.
*
* @param res_filt Resonance/Filter
*/
void writeRES_FILT(unsigned char res_filt);
/**
* Write filter Mode/Volume register.
*
* @param mode_vol Filter Mode/Volume
*/
void writeMODE_VOL(unsigned char mode_vol);
virtual void input(int input) = 0;
};
} // namespace reSIDfp
#endif