// license:BSD-3-Clause
// copyright-holders:K.Wilkins,Couriersud,Derrick Renaud,Frank Palazzolo
#ifndef MAME_SOUND_DISC_CLS_H
#define MAME_SOUND_DISC_CLS_H
#pragma once
/***********************************************************************
*
* MAME - Discrete sound system emulation library
*
* Written by K.Wilkins (mame@esplexo.co.uk)
*
* (c) K.Wilkins 2000
*
* Coding started in November 2000
*
* Additions/bugfix February 2003 - Derrick Renaud, F.Palazzolo, K.Wilkins
* Discrete parallel tasks 2009 - Couriersud
* Discrete classes 2010 - Couriersud
*
***********************************************************************/
#define DISCRETE_CLASS_NAME(_name) discrete_ ## _name ## _node
#define DISCRETE_CLASS_INPUT(_name, _num) inline double _name (void) { return *(m_input[_num]); }
#define DISCRETE_CLASS_CONSTRUCTOR(_name, _base) \
public: \
DISCRETE_CLASS_NAME(_name)() \
: DISCRETE_CLASS_NAME(_base)() { }
#define DISCRETE_CLASS_DESTRUCTOR(_name) \
public: \
virtual ~ DISCRETE_CLASS_NAME(_name)(void) { }
#define DISCRETE_CLASS_STEP_RESET(_name, _maxout, _priv) \
class DISCRETE_CLASS_NAME(_name): public discrete_base_node, public discrete_step_interface \
{ \
DISCRETE_CLASS_CONSTRUCTOR(_name, base) \
DISCRETE_CLASS_DESTRUCTOR(_name) \
public: \
virtual void step(void) override; \
virtual void reset(void) override; \
virtual int max_output(void) override { return _maxout; } \
private: \
_priv \
}
#define DISCRETE_CLASS_STEP(_name, _maxout, _priv) \
class DISCRETE_CLASS_NAME(_name): public discrete_base_node, public discrete_step_interface \
{ \
DISCRETE_CLASS_CONSTRUCTOR(_name, base) \
DISCRETE_CLASS_DESTRUCTOR(_name) \
public: \
virtual void step(void) override; \
virtual void reset(void) override { this->step(); } \
virtual int max_output(void) override { return _maxout; } \
private: \
_priv \
}
#define DISCRETE_CLASS_RESET(_name, _maxout) \
class DISCRETE_CLASS_NAME(_name): public discrete_base_node \
{ \
DISCRETE_CLASS_CONSTRUCTOR(_name, base) \
DISCRETE_CLASS_DESTRUCTOR(_name) \
public: \
virtual void reset(void) override; \
virtual int max_output(void) override { return _maxout; } \
}
#define DISCRETE_CLASS(_name, _maxout, _priv) \
class DISCRETE_CLASS_NAME(_name): public discrete_base_node, public discrete_step_interface \
{ \
DISCRETE_CLASS_DESTRUCTOR(_name) \
DISCRETE_CLASS_CONSTRUCTOR(_name, base) \
public: \
virtual void step(void) override; \
virtual void reset(void) override; \
virtual void start(void) override; \
virtual void stop(void) override; \
virtual int max_output(void) override { return _maxout; } \
private: \
_priv \
}
class DISCRETE_CLASS_NAME(special): public discrete_base_node
{
DISCRETE_CLASS_CONSTRUCTOR(special, base)
DISCRETE_CLASS_DESTRUCTOR(special)
public:
virtual int max_output(void) override { return 0; }
};
class DISCRETE_CLASS_NAME(unimplemented): public discrete_base_node
{
DISCRETE_CLASS_CONSTRUCTOR(unimplemented, base)
DISCRETE_CLASS_DESTRUCTOR(unimplemented)
public:
virtual int max_output(void) override { return 0; }
};
/*************************************
*
* disc_sys.inc
*
*************************************/
class DISCRETE_CLASS_NAME(dso_output): public discrete_base_node,
public discrete_sound_output_interface,
public discrete_step_interface
{
DISCRETE_CLASS_CONSTRUCTOR(dso_output, base)
DISCRETE_CLASS_DESTRUCTOR(dso_output)
public:
virtual void step(void) override {
/* Add gain to the output and put into the buffers */
/* Clipping will be handled by the main sound system */
double val = DISCRETE_INPUT(0) * DISCRETE_INPUT(1);
*m_ptr++ = val;
}
virtual int max_output(void) override { return 0; }
virtual void set_output_ptr(stream_sample_t *ptr) override { m_ptr = ptr; }
private:
stream_sample_t *m_ptr;
};
DISCRETE_CLASS(dso_csvlog, 0,
FILE *m_csv_file;
int64_t m_sample_num;
char m_name[32];
);
DISCRETE_CLASS(dso_wavlog, 0,
wav_file *m_wavfile;
char m_name[32];
);
/*************************************
*
* disc_inp.inc
*
*************************************/
class DISCRETE_CLASS_NAME(dss_adjustment): public discrete_base_node, public discrete_step_interface
{
DISCRETE_CLASS_CONSTRUCTOR(dss_adjustment, base)
DISCRETE_CLASS_DESTRUCTOR(dss_adjustment)
public:
virtual void step(void) override;
virtual void reset(void) override;
private:
ioport_port *m_port;
int32_t m_lastpval;
int32_t m_pmin;
double m_pscale;
double m_min;
double m_scale;
};
DISCRETE_CLASS_RESET(dss_constant, 1);
class DISCRETE_CLASS_NAME(dss_input_data): public discrete_base_node, public discrete_input_interface
{
DISCRETE_CLASS_DESTRUCTOR(dss_input_data)
DISCRETE_CLASS_CONSTRUCTOR(dss_input_data, base)
public:
virtual void reset(void) override;
virtual void input_write(int sub_node, uint8_t data ) override;
private:
double m_gain; /* node gain */
double m_offset; /* node offset */
uint8_t m_data; /* data written */
};
class DISCRETE_CLASS_NAME(dss_input_logic): public discrete_base_node, public discrete_input_interface
{
DISCRETE_CLASS_CONSTRUCTOR(dss_input_logic, base)
DISCRETE_CLASS_DESTRUCTOR(dss_input_logic)
public:
virtual void reset(void) override;
virtual void input_write(int sub_node, uint8_t data ) override;
private:
double m_gain; /* node gain */
double m_offset; /* node offset */
uint8_t m_data; /* data written */
};
class DISCRETE_CLASS_NAME(dss_input_not): public discrete_base_node, public discrete_input_interface
{
DISCRETE_CLASS_CONSTRUCTOR(dss_input_not, base)
DISCRETE_CLASS_DESTRUCTOR(dss_input_not)
public:
virtual void reset(void) override;
virtual void input_write(int sub_node, uint8_t data ) override;
private:
double m_gain; /* node gain */
double m_offset; /* node offset */
uint8_t m_data; /* data written */
};
class DISCRETE_CLASS_NAME(dss_input_pulse): public discrete_base_node, public discrete_input_interface, public discrete_step_interface
{
DISCRETE_CLASS_CONSTRUCTOR(dss_input_pulse, base)
DISCRETE_CLASS_DESTRUCTOR(dss_input_pulse)
public:
virtual void step(void) override;
virtual void reset(void) override;
virtual void input_write(int sub_node, uint8_t data ) override;
private:
//double m_gain; /* node gain */
//double m_offset; /* node offset */
uint8_t m_data; /* data written */
};
class DISCRETE_CLASS_NAME(dss_input_stream): public discrete_base_node, public discrete_input_interface, public discrete_step_interface
{
DISCRETE_CLASS_CONSTRUCTOR(dss_input_stream, base)
DISCRETE_CLASS_DESTRUCTOR(dss_input_stream)
public:
virtual void step(void) override;
virtual void reset(void) override;
virtual void start(void) override;
virtual void input_write(int sub_node, uint8_t data ) override;
virtual bool is_buffered(void) { return false; }
/* This is called by discrete_sound_device */
void stream_start(void);
//protected:
uint32_t m_stream_in_number;
stream_sample_t *m_ptr; /* current in ptr for stream */
private:
void stream_generate(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
double m_gain; /* node gain */
double m_offset; /* node offset */
uint8_t m_data; /* data written */
uint8_t m_is_buffered;
/* the buffer stream */
sound_stream *m_buffer_stream;
};
class DISCRETE_CLASS_NAME(dss_input_buffer): public DISCRETE_CLASS_NAME(dss_input_stream)
{
DISCRETE_CLASS_CONSTRUCTOR(dss_input_buffer, dss_input_stream)
DISCRETE_CLASS_DESTRUCTOR(dss_input_buffer)
public:
virtual bool is_buffered(void) override { return true; }
};
#include "disc_wav.h"
#include "disc_mth.h"
#include "disc_flt.h"
#include "disc_dev.h"
#endif // MAME_SOUND_DISC_CLS_H