1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
// license:BSD-3-Clause
// copyright-holders:Derrick Renaud, Couriersud
#pragma once
#ifndef __FLT_RC_H__
#define __FLT_RC_H__
#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
*
* MCFG_FILTER_RC_ADD("tag", 0)
* MCFG_FILTER_RC_AC()
*
* Default behaviour:
*
* Without MCFG_FILTER_RC_AC, a disabled FLT_RC_LOWPASS is created
*
*/
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_FILTER_RC_ADD(_tag, _clock) \
MCFG_DEVICE_ADD(_tag, FILTER_RC, _clock)
#define MCFG_FILTER_RC_REPLACE(_tag, _clock) \
MCFG_DEVICE_REPLACE(_tag, FILTER_RC, _clock)
#define MCFG_FILTER_RC_AC() \
filter_rc_device::static_set_rc(*device, FLT_RC_AC, 10000, 0, 0, CAP_U(1));
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
#define FLT_RC_LOWPASS 0
#define FLT_RC_HIGHPASS 1
#define FLT_RC_AC 2
// ======================> filter_rc_device
class filter_rc_device : public device_t,
public device_sound_interface
{
public:
filter_rc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~filter_rc_device() { }
// static configuration
static void static_set_rc(device_t &device, int type, double R1, double R2, double R3, double C);
void filter_rc_set_RC(int type, double R1, double R2, double R3, double C);
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;
};
extern const device_type FILTER_RC;
#endif /* __FLT_RC_H__ */
|