1 // license:BSD-3-Clause
2 // copyright-holders:Philip Bennett
3 /*************************************************************************
4 
5      Microprose Games 3D hardware
6 
7 *************************************************************************/
8 #ifndef MAME_AUDIO_MICRO3D_H
9 #define MAME_AUDIO_MICRO3D_H
10 
11 #pragma once
12 
13 class micro3d_sound_device : public device_t, public device_sound_interface
14 {
15 public:
16 	micro3d_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
17 
dac_w(u8 data)18 	void dac_w(u8 data) { m_dac_data = data; }
19 	void noise_sh_w(u8 data);
20 
21 protected:
22 	// device-level overrides
23 	virtual void device_start() override;
24 	virtual void device_reset() override;
25 
26 	// sound stream update overrides
27 	virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
28 
29 private:
30 	enum dac_registers {
31 		VCF,
32 		VCQ,
33 		VCA,
34 		PAN
35 	};
36 
37 	struct biquad
38 	{
39 		double a0, a1, a2;      /* Numerator coefficients */
40 		double b0, b1, b2;      /* Denominator coefficients */
41 	};
42 
43 	struct lp_filter
44 	{
45 		void init(double fs);
46 		void recompute(double k, double q, double fc);
47 
48 		float history[2 * 2];
49 		float coef[4 * 2 + 1];
50 		double fs;
51 		biquad proto_coef[2];
52 	};
53 
54 	struct m3d_filter_state
55 	{
56 		void configure(double r, double c);
57 
58 		double      capval;
59 		double      exponent;
60 	};
61 
62 	u8      m_dac_data;
63 
64 	u8      m_dac[4];
65 
66 	float   m_gain;
67 	u32     m_noise_shift;
68 	u8      m_noise_value;
69 	u8      m_noise_subcount;
70 
71 	m3d_filter_state    m_noise_filters[4];
72 	lp_filter           m_filter;
73 	sound_stream        *m_stream;
74 };
75 
76 DECLARE_DEVICE_TYPE(MICRO3D_SOUND, micro3d_sound_device)
77 
78 #endif // MAME_AUDIO_MICRO3D_H
79