1 #ifndef MAME_AUDIO_POLEPOS_H 2 #define MAME_AUDIO_POLEPOS_H 3 4 #pragma once 5 6 #include "sound/discrete.h" 7 8 9 class polepos_sound_device : public device_t, 10 public device_sound_interface 11 { 12 public: 13 polepos_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); ~polepos_sound_device()14 ~polepos_sound_device() { } 15 16 protected: 17 // device-level overrides 18 virtual void device_start() override; 19 virtual void device_reset() override; 20 21 // sound stream update overrides 22 virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; 23 24 public: 25 DECLARE_WRITE_LINE_MEMBER(clson_w); 26 void polepos_engine_sound_lsb_w(uint8_t data); 27 void polepos_engine_sound_msb_w(uint8_t data); 28 29 private: 30 struct filter2_context 31 { filter2_contextfilter2_context32 filter2_context() { } 33 34 void setup(device_t *device, int type, double fc, double d, double gain); 35 void opamp_m_bandpass_setup(device_t *device, double r1, double r2, double r3, double c1, double c2); 36 void reset(); 37 void step(); 38 39 double x0 = 0.0, x1 = 0.0, x2 = 0.0; /* x[k], x[k-1], x[k-2], current and previous 2 input values */ 40 double y0 = 0.0, y1 = 0.0, y2 = 0.0; /* y[k], y[k-1], y[k-2], current and previous 2 output values */ 41 double a1 = 0.0, a2 = 0.0; /* digital filter coefficients, denominator */ 42 double b0 = 0.0, b1 = 0.0, b2 = 0.0; /* digital filter coefficients, numerator */ 43 }; 44 45 uint32_t m_current_position; 46 int m_sample_msb; 47 int m_sample_lsb; 48 int m_sample_enable; 49 sound_stream *m_stream; 50 filter2_context m_filter_engine[3]; 51 }; 52 53 DECLARE_DEVICE_TYPE(POLEPOS_SOUND, polepos_sound_device) 54 55 DISCRETE_SOUND_EXTERN( polepos_discrete ); 56 57 #endif // MAME_AUDIO_POLEPOS_H 58