OSDN Git Service

[VM][General] Merge upstream 2016-03-01. (Pahse 1).
[csp-qt/common_source_project-fm7.git] / source / src / vm / ld700.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2014.02.12-
6
7         [ Pioneer LD-700 ]
8 */
9
10 #ifndef _LD700_H_
11 #define _LD700_H_
12
13 #include "vm.h"
14 #include "../emu.h"
15 #include "device.h"
16
17 #define SIG_LD700_REMOTE        0
18 #define SIG_LD700_MUTE_L        1
19 #define SIG_LD700_MUTE_R        2
20
21 #define MAX_TRACKS      1024
22 #define MAX_PAUSES      1024
23
24 class FIFO;
25
26 class LD700 : public DEVICE
27 {
28 private:
29         // output signals
30         outputs_t outputs_exv;
31         outputs_t outputs_ack;
32         outputs_t outputs_sound;
33         
34         bool prev_remote_signal;
35         uint32_t prev_remote_time;
36         uint32_t command, num_bits;
37         
38         int phase, status;
39         int seek_mode, seek_num;
40         bool accepted;
41         int cur_frame_raw;
42         int wait_frame_raw;
43         
44         int num_tracks, track_frame_raw[MAX_TRACKS];
45         int num_pauses, pause_frame_raw[MAX_PAUSES];
46         
47         bool prev_sound_signal;
48         FIFO *sound_buffer_l, *sound_buffer_r, *signal_buffer;
49         bool signal_buffer_ok;
50         int sound_event_id;
51         int16_t sound_sample_l, sound_sample_r;
52         int volume_l, volume_r;
53         bool sound_mute_l, sound_mute_r;
54         
55         int16_t *mix_buffer_l, *mix_buffer_r;
56         int mix_buffer_ptr, mix_buffer_length;
57         
58         void set_status(int value);
59         void set_ack(bool value);
60         void set_cur_frame(int frame, bool relative);
61         int get_cur_frame_raw();
62         void set_cur_track(int track);
63         
64 public:
65         LD700(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
66         {
67                 initialize_output_signals(&outputs_exv);
68                 initialize_output_signals(&outputs_ack);
69                 initialize_output_signals(&outputs_sound);
70                 volume_l = volume_r = 1024;
71                 sound_mute_l = sound_mute_r = true;
72         }
73         ~LD700() {}
74         
75         // common functions
76         void initialize();
77         void release();
78         void write_signal(int id, uint32_t data, uint32_t mask);
79         void event_frame();
80         void event_callback(int event_id, int err);
81         void mix(int32_t* buffer, int cnt);
82         void set_volume(int ch, int decibel_l, int decibel_r);
83         const _TCHAR *get_device_name()
84         {
85                 return _T("LD-700");
86         }
87         
88         // unique functions
89         void set_context_exv(DEVICE* device, int id, uint32_t mask)
90         {
91                 register_output_signal(&outputs_exv, device, id, mask);
92         }
93         void set_context_ack(DEVICE* device, int id, uint32_t mask)
94         {
95                 register_output_signal(&outputs_ack, device, id, mask);
96         }
97         void set_context_sound(DEVICE* device, int id, uint32_t mask)
98         {
99                 register_output_signal(&outputs_sound, device, id, mask);
100         }
101         void open_disc(const _TCHAR* file_path);
102         void close_disc();
103         bool is_disc_inserted();
104         void initialize_sound(int rate, int samples);
105         void movie_sound_callback(uint8_t *buffer, long size);
106 };
107
108 #endif
109