-/*\r
- EPOCH Super Cassette Vision Emulator 'eSCV'\r
-\r
- Author : Takeda.Toshiya\r
- Date : 2006.08.21 -\r
-\r
- [ uPD1771C ]\r
-*/\r
-\r
-#ifndef _SOUND_H_\r
-#define _SOUND_H_\r
-\r
-#include "../vm.h"\r
-#include "../../emu.h"\r
-#include "../device.h"\r
-\r
-#define SOUND_CLOCK 1522400.0\r
-#define NOISE_CLOCK 760.0\r
-#define SQUARE_CLOCK 174000.0\r
-\r
-#define PCM_PERIOD 120000\r
-\r
-#define MAX_TONE 24000\r
-#define MAX_NOISE 16000\r
-#define MAX_SQUARE 8000\r
-#define MAX_PCM 20000\r
-\r
-#define MAX_PARAM 0x8000\r
-\r
-class SOUND : public DEVICE\r
-{\r
-private:\r
- DEVICE* d_cpu;\r
- \r
- // sound gen\r
- typedef struct {\r
- int count;\r
- int diff;\r
- int period;\r
- int timbre;\r
- int volume;\r
- int output;\r
- int ptr;\r
- } channel_t;\r
- struct channel_t tone;\r
- struct channel_t noise;\r
- struct channel_t square1;\r
- struct channel_t square2;\r
- struct channel_t square3;\r
- struct channel_t pcm;\r
- void clear_channel(channel_t *ch);\r
- \r
- int pcm_table[MAX_PARAM * 8];\r
- uint32 cmd_addr;\r
- int pcm_len;\r
- \r
- int volume_table[32];\r
- int detune_table[32];\r
- \r
- // command buffer\r
- int param_cnt, param_ptr, register_id;\r
- uint8 params[MAX_PARAM];\r
- \r
- void process_pcm(uint8 data);\r
- void process_cmd();\r
- \r
-public:\r
- SOUND(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {}\r
- ~SOUND() {}\r
- \r
- // common functions\r
- void reset();\r
- void write_data8(uint32 addr, uint32 data);\r
- void write_io8(uint32 addr, uint32 data);\r
- void event_callback(int event_id, int err);\r
- void mix(int32* buffer, int cnt);\r
- \r
- // unique function\r
- void set_context_cpu(DEVICE* device)\r
- {\r
- d_cpu = device;\r
- }\r
- void init(int rate);\r
-};\r
-\r
-#endif\r
-\r
+/*
+ EPOCH Super Cassette Vision Emulator 'eSCV'
+
+ Author : Takeda.Toshiya
+ Date : 2006.08.21 -
+
+ [ uPD1771C ]
+*/
+
+#ifndef _SOUND_H_
+#define _SOUND_H_
+
+#include "../vm.h"
+#include "../../emu.h"
+#include "../device.h"
+
+#define SOUND_CLOCK 1522400.0
+#define NOISE_CLOCK 760.0
+#define SQUARE_CLOCK 174000.0
+
+#define PCM_PERIOD 120000
+
+#define MAX_TONE 24000
+#define MAX_NOISE 16000
+#define MAX_SQUARE 8000
+#define MAX_PCM 20000
+
+#define MAX_PARAM 0x8000
+
+class SOUND : public DEVICE
+{
+private:
+ DEVICE* d_cpu;
+
+ // sound gen
+ typedef struct {
+ int count;
+ int diff;
+ int period;
+ int timbre;
+ int volume;
+ int output;
+ int ptr;
+ } channel_t;
+ channel_t tone;
+ channel_t noise;
+ channel_t square1;
+ channel_t square2;
+ channel_t square3;
+ channel_t pcm;
+ void clear_channel(channel_t *ch);
+
+ int pcm_table[MAX_PARAM * 8];
+ uint32_t cmd_addr;
+ int pcm_len;
+
+ int volume_table[32];
+ int detune_table[32];
+
+ int psg_volume_l, psg_volume_r;
+ int pcm_volume_l, pcm_volume_r;
+
+ // command buffer
+ int param_cnt, param_ptr, register_id;
+ uint8_t params[MAX_PARAM];
+
+ void process_pcm(uint8_t data);
+ void process_cmd();
+
+public:
+ SOUND(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+ {
+ set_device_name(_T("Sound"));
+ }
+ ~SOUND() {}
+
+ // common functions
+ void reset();
+ void write_data8(uint32_t addr, uint32_t data);
+ void write_io8(uint32_t addr, uint32_t data);
+ void event_callback(int event_id, int err);
+ void mix(int32_t* buffer, int cnt);
+ void set_volume(int ch, int decibel_l, int decibel_r);
+ void decl_state();
+ void save_state(FILEIO* state_fio);
+ bool load_state(FILEIO* state_fio);
+
+ // unique functions
+ void set_context_cpu(DEVICE* device)
+ {
+ d_cpu = device;
+ }
+ void initialize_sound(int rate);
+};
+
+#endif
+