// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
#ifndef MAME_SOUND_FLT_RC_H
#define MAME_SOUND_FLT_RC_H
#pragma once
#include "machine/rescap.h"
/*
* FLT_RC_LOWPASS:
*
* signal >--R1--+--R2--+
* | |
* C R3---> amp
* | |
* GND GND
*
* Set C=0 to disable filter
*
* FLT_RC_HIGHPASS:
*
* signal >--C---+----> amp
* |
* R1
* |
* GND
*
* Set C = 0 to disable filter
*
* FLT_RC_AC:
*
* Same as FLT_RC_HIGHPASS, but with standard frequency of 16 HZ
* This filter may be setup just with
*
* FILTER_RC(config, "tag", 0).set_ac();
*
* Default behaviour:
*
* Without set_ac(), a disabled FLT_RC_LOWPASS is created
*
*/
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> filter_rc_device
class filter_rc_device : public device_t, public device_sound_interface
{
public:
enum
{
LOWPASS = 0,
HIGHPASS = 1,
AC = 2
};
filter_rc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// configuration
filter_rc_device &set_rc(int type, double R1, double R2, double R3, double C)
{
m_type = type;
m_R1 = R1;
m_R2 = R2;
m_R3 = R3;
m_C = C;
return *this;
}
filter_rc_device &filter_rc_set_RC(int type, double R1, double R2, double R3, double C)
{
m_stream->update();
set_rc(type, R1, R2, R3, C);
recalc();
return *this;
}
filter_rc_device &set_ac()
{
return set_rc(filter_rc_device::AC, 10000, 0, 0, CAP_U(1));
}
protected:
// device-level overrides
virtual void device_start() override;
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
private:
void recalc();
private:
sound_stream* m_stream;
int m_k;
int m_memory;
int m_type;
double m_R1;
double m_R2;
double m_R3;
double m_C;
};
DECLARE_DEVICE_TYPE(FILTER_RC, filter_rc_device)
#endif // MAME_SOUND_FLT_RC_H