OSDN Git Service

[Qt][OpenGL][WIP] GL4.3: Implementing texture buffer with mapping.
[csp-qt/common_source_project-fm7.git] / source / src / vm / datarec.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2006.08.18 -
6
7         [ data recorder ]
8 */
9
10 #ifndef _DREC_H_
11 #define _DREC_H_
12
13 //#include "vm.h"
14 //#include "../emu.h"
15 #include "device.h"
16
17 #define SIG_DATAREC_MIC         0
18 #define SIG_DATAREC_REMOTE      1
19 #define SIG_DATAREC_TRIG        2
20
21 class FILEIO;
22 class NOISE;
23
24 class DATAREC : public DEVICE
25 {
26 private:
27         // output signals
28         outputs_t outputs_ear;
29         outputs_t outputs_remote;
30         outputs_t outputs_rotate;
31         outputs_t outputs_end;
32         outputs_t outputs_top;
33         outputs_t outputs_apss;
34         
35         // cmt noise
36         NOISE* d_noise_play;
37         NOISE* d_noise_stop;
38         NOISE* d_noise_fast;
39         
40         // data recorder
41         FILEIO* play_fio;
42         FILEIO* rec_fio;
43         
44         bool play, rec, remote, trigger;
45         _TCHAR rec_file_path[_MAX_PATH];
46         int ff_rew;
47         bool in_signal, out_signal;
48         uint32_t prev_clock;
49         int positive_clocks, negative_clocks;
50         int signal_changed;
51         int register_id;
52         bool realtime;
53         
54         int sample_rate;
55         double sample_usec;
56         int buffer_ptr, buffer_length;
57         uint8_t *buffer, *buffer_bak;
58 //#ifdef DATAREC_SOUND
59         int sound_buffer_length;
60         int16_t *sound_buffer, sound_sample;
61 //#endif
62         bool is_wav, is_tap, is_t77;
63         double ave_hi_freq;
64         
65         int apss_buffer_length;
66         bool *apss_buffer;
67         int apss_ptr, apss_count, apss_remain;
68         bool apss_signals;
69         
70         int pcm_changed;
71         uint32_t pcm_prev_clock;
72         int pcm_positive_clocks, pcm_negative_clocks;
73         int pcm_max_vol;
74         int32_t pcm_last_vol_l, pcm_last_vol_r;
75         int pcm_volume_l, pcm_volume_r;
76 //#ifdef DATAREC_SOUND
77         int32_t sound_last_vol_l, sound_last_vol_r;
78         int sound_volume_l, sound_volume_r;
79 //#endif
80         _TCHAR message[1024];
81
82         int _tmp_buffer_length;
83         int _tmp_buffer_bak_length;
84         int _tmp_sound_buffer_length;
85         int _tmp_apss_buffer_length;
86         bool __DATAREC_SOUND;
87         bool __DATAREC_SOUND_LEFT;
88         bool __DATAREC_SOUND_RIGHT;
89         bool __TYPE_MZ80B;
90         double __DATAREC_FAST_FWD_SPEED;
91         double __DATAREC_FAST_REW_SPEED;
92         
93         void update_event();
94         void update_realtime_render();
95         void close_file();
96         
97         int load_wav_image(int offset);
98         void save_wav_image();
99         int load_t77_image();
100         int load_tap_image();
101         int load_mzt_image();
102         int load_p6_image(bool is_p6t);
103         int load_bmjr_image();
104         int load_cas_image();
105         int load_m5_cas_image();
106         int load_msx_cas_image();
107         
108 public:
109         DATAREC(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
110         {
111                 initialize_output_signals(&outputs_ear);
112                 initialize_output_signals(&outputs_remote);
113                 initialize_output_signals(&outputs_rotate);
114                 initialize_output_signals(&outputs_end);
115                 initialize_output_signals(&outputs_top);
116                 initialize_output_signals(&outputs_apss);
117                 d_noise_play = NULL;
118                 d_noise_stop = NULL;
119                 d_noise_fast = NULL;
120 //#ifdef DATAREC_PCM_VOLUME
121 //              pcm_max_vol = DATAREC_PCM_VOLUME;
122 //#else
123                 pcm_max_vol = 8000;
124 //#endif
125                 pcm_volume_l = pcm_volume_r = 1024;
126 //#ifdef DATAREC_SOUND
127                 sound_volume_l = sound_volume_r = 1024;
128 //#endif
129                 __TYPE_MZ80B = false;
130                 __DATAREC_SOUND = __DATAREC_SOUND_LEFT = __DATAREC_SOUND_RIGHT = false;
131                 __DATAREC_FAST_FWD_SPEED = __DATAREC_FAST_REW_SPEED = 10.0;
132                 my_tcscpy_s(message, 1023, _T("Stop"));
133                 set_device_name(_T("Data Recorder"));
134         }
135         ~DATAREC() {}
136         
137         // common functions
138         void initialize();
139         void reset();
140         void release();
141         void write_signal(int id, uint32_t data, uint32_t mask);
142         uint32_t read_signal(int ch)
143         {
144                 return in_signal ? 1 : 0;
145         }
146         void event_frame();
147         void event_callback(int event_id, int err);
148         void mix(int32_t* buffer, int cnt);
149         void set_volume(int ch, int decibel_l, int decibel_r);
150         void update_config();
151         void decl_state();
152         void save_state(FILEIO* state_fio);
153         bool load_state(FILEIO* state_fio);
154         
155         // unique functions
156         void initialize_sound(int rate, int volume)
157         {
158                 pcm_max_vol = volume;
159         }
160         void set_context_ear(DEVICE* device, int id, uint32_t mask)
161         {
162                 register_output_signal(&outputs_ear, device, id, mask);
163         }
164         void set_context_remote(DEVICE* device, int id, uint32_t mask)
165         {
166                 register_output_signal(&outputs_remote, device, id, mask);
167         }
168         void set_context_rotate(DEVICE* device, int id, uint32_t mask)
169         {
170                 register_output_signal(&outputs_rotate, device, id, mask);
171         }
172         void set_context_end(DEVICE* device, int id, uint32_t mask)
173         {
174                 register_output_signal(&outputs_end, device, id, mask);
175         }
176         void set_context_top(DEVICE* device, int id, uint32_t mask)
177         {
178                 register_output_signal(&outputs_top, device, id, mask);
179         }
180         void set_context_apss(DEVICE* device, int id, uint32_t mask)
181         {
182                 register_output_signal(&outputs_apss, device, id, mask);
183         }
184         void set_context_noise_play(NOISE* device)
185         {
186                 d_noise_play = device;
187         }
188         NOISE* get_context_noise_play()
189         {
190                 return d_noise_play;
191         }
192         void set_context_noise_stop(NOISE* device)
193         {
194                 d_noise_stop = device;
195         }
196         NOISE* get_context_noise_stop()
197         {
198                 return d_noise_stop;
199         }
200         void set_context_noise_fast(NOISE* device)
201         {
202                 d_noise_fast = device;
203         }
204         NOISE* get_context_noise_fast()
205         {
206                 return d_noise_fast;
207         }
208         bool play_tape(const _TCHAR* file_path);
209         bool rec_tape(const _TCHAR* file_path);
210         void close_tape();
211         bool is_tape_inserted()
212         {
213                 return (play || rec);
214         }
215         bool is_tape_playing()
216         {
217                 return (remote && play);
218         }
219         bool is_tape_recording()
220         {
221                 return (remote && rec);
222         }
223         int get_tape_position()
224         {
225                 if(play && buffer_length > 0) {
226                         if(buffer_ptr >= buffer_length) {
227                                 return 100;
228                         } else if(buffer_ptr <= 0) {
229                                 return 0;
230                         } else {
231                                 return (int)(((double)buffer_ptr / (double)buffer_length) * 100.0);
232                         }
233                 }
234                 return 0;
235         }
236         const _TCHAR* get_message()
237         {
238                 return message;
239         }
240         void set_remote(bool value);
241         void set_ff_rew(int value);
242         bool do_apss(int value);
243         double get_ave_hi_freq();
244         int drive_num;
245 };
246
247 #endif
248