furnace/src/engine/platform/sound/namco.h
2022-05-21 01:34:43 -05:00

129 lines
2.8 KiB
C++

// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria,Aaron Giles
#ifndef MAME_SOUND_NAMCO_H
#define MAME_SOUND_NAMCO_H
#include <stdio.h>
#include <stdint.h>
#include <memory>
class namco_audio_device
{
public:
// configuration
void set_voices(int voices) { m_voices = voices; }
void set_stereo(bool stereo) { m_stereo = stereo; }
void sound_enable_w(int state);
static constexpr unsigned MAX_VOICES = 8;
static constexpr unsigned MAX_VOLUME = 16;
/* this structure defines the parameters for a channel */
struct sound_channel
{
uint32_t frequency;
uint32_t counter;
int32_t volume[2];
int32_t noise_sw;
int32_t noise_state;
int32_t noise_seed;
uint32_t noise_counter;
int32_t noise_hold;
int32_t waveform_select;
};
namco_audio_device(uint32_t clock);
// device-level overrides
virtual void device_start(unsigned char* wavePtr);
void device_clock_changed(int clk);
// internal state
void build_decoded_waveform( uint8_t *rgnbase );
void update_namco_waveform(int offset, uint8_t data);
uint32_t namco_update_one(short* buffer, int size, const int16_t *wave, uint32_t counter, uint32_t freq);
/* waveform region */
uint8_t* m_wave_ptr;
/* data about the sound system */
sound_channel m_channel_list[MAX_VOICES];
sound_channel *m_last_channel;
uint8_t *m_wavedata;
/* global sound parameters */
int m_wave_size;
bool m_sound_enable;
int m_namco_clock;
int m_sample_rate;
int m_f_fracbits;
int m_voices; /* number of voices */
bool m_stereo; /* set to indicate stereo (e.g., System 1) */
uint8_t m_waveram_alloc[0x400];
/* decoded waveform table */
int16_t m_waveform[MAX_VOLUME][512];
virtual void sound_stream_update(short** outputs, int len);
virtual ~namco_audio_device() {}
};
class namco_device : public namco_audio_device
{
public:
namco_device(uint32_t clock);
void pacman_sound_w(int offset, uint8_t data);
uint8_t polepos_sound_r(int offset);
void polepos_sound_w(int offset, uint8_t data);
void device_start(unsigned char* wavePtr);
~namco_device() {}
private:
uint8_t m_soundregs[0x400];
};
class namco_15xx_device : public namco_audio_device
{
public:
namco_15xx_device(uint32_t clock);
void namco_15xx_w(int offset, uint8_t data);
uint8_t sharedram_r(int offset);
void sharedram_w(int offset, uint8_t data);
void device_start(unsigned char* wavePtr);
~namco_15xx_device() {}
private:
uint8_t m_soundregs[0x400];
};
class namco_cus30_device : public namco_audio_device
{
public:
namco_cus30_device(uint32_t clock);
void namcos1_cus30_w(int offset, uint8_t data); /* wavedata + sound registers + RAM */
uint8_t namcos1_cus30_r(int offset);
void namcos1_sound_w(int offset, uint8_t data);
void pacman_sound_w(int offset, uint8_t data);
void device_start(unsigned char* wavePtr);
~namco_cus30_device() {}
};
#endif // MAME_SOUND_NAMCO_H