summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/audio/polepos.h
blob: 97b954921adc1558d9b81c2e9c9940cb5e102b74 (plain) (tree)





















































                                                                                                                                          
                                          

                              
#ifndef MAME_AUDIO_POLEPOS_H
#define MAME_AUDIO_POLEPOS_H

#pragma once

#include "sound/discrete.h"


class polepos_sound_device : public device_t,
								public device_sound_interface
{
public:
	polepos_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
	~polepos_sound_device() { }

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;

	// sound stream update overrides
	virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;

public:
	DECLARE_WRITE_LINE_MEMBER(clson_w);
	DECLARE_WRITE8_MEMBER(polepos_engine_sound_lsb_w);
	DECLARE_WRITE8_MEMBER(polepos_engine_sound_msb_w);

private:
	struct filter2_context
	{
		filter2_context() { }

		void setup(device_t *device, int type, double fc, double d, double gain);
		void opamp_m_bandpass_setup(device_t *device, double r1, double r2, double r3, double c1, double c2);
		void reset();
		void step();

		double x0 = 0.0, x1 = 0.0, x2 = 0.0;  /* x[k], x[k-1], x[k-2], current and previous 2 input values */
		double y0 = 0.0, y1 = 0.0, y2 = 0.0;  /* y[k], y[k-1], y[k-2], current and previous 2 output values */
		double a1 = 0.0, a2 = 0.0;            /* digital filter coefficients, denominator */
		double b0 = 0.0, b1 = 0.0, b2 = 0.0;  /* digital filter coefficients, numerator */
	};

	uint32_t m_current_position;
	int m_sample_msb;
	int m_sample_lsb;
	int m_sample_enable;
	sound_stream *m_stream;
	filter2_context m_filter_engine[3];
};

DECLARE_DEVICE_TYPE(POLEPOS_SOUND, polepos_sound_device)

DISCRETE_SOUND_EXTERN( polepos_discrete );

#endif // MAME_AUDIO_POLEPOS_H