OSDN Git Service

1b6af00504ba610a6816bb3e5ac00e0b8bb69265
[csp-qt/common_source_project-fm7.git] / source / src / qt / gui / emu_thread_tmpl.h
1 /*
2         Skelton for retropc emulator
3         Author : Takeda.Toshiya
4         Port to Qt : K.Ohta <whatisthis.sowhat _at_ gmail.com>
5         Date   : 2006.08.18 -
6         License : GPLv2
7         History : 2015.11.10 Split from qt_main.h
8         [ win32 main ] -> [ Qt main ] -> [Emu Thread]
9 */
10 #ifndef _CSP_QT_EMU_THREAD_TMPL_H
11 #define _CSP_QT_EMU_THREAD_TMPL_H
12
13 #include <QThread>
14 #include <QQueue>
15 #include <QString>
16 #include <QStringList>
17 #include <QElapsedTimer>
18 #if QT_VERSION >= 0x051400
19         #include <QRecursiveMutex>
20 #else
21         #include <QMutex>
22 #endif
23
24 #include <QMutexLocker>
25
26 #include "fifo.h"
27 #include "common.h"
28 #include "commonclasses.h"
29 #include "fileio.h"
30 #include "emu_template.h"
31
32 //#include "menuclasses.h"
33
34 #include "mainwidget_base.h"
35 #include "commonclasses.h"
36 #include "config.h"
37 #include <memory>
38
39 #ifndef MAX_HISTORY
40 #define MAX_HISTORY 8
41 #endif
42 #define MAX_COMMAND_LEN 64
43
44 class QWaitCondition;
45 class QOpenGLContext;
46
47 class EMU_TEMPLATE;
48 class OSD_BASE;
49 class USING_FLAGS;
50
51 class Ui_MainWindowBase;
52
53 class VirtualFilesList;
54 class VirtualBanksList;
55 class Menu_MetaClass;
56
57 //class META_MainWindow;
58
59 QT_BEGIN_NAMESPACE
60 enum {
61         KEY_QUEUE_DOWN = 0x10000000,
62         KEY_QUEUE_UP   = 0x20000000,
63 };
64 typedef struct {
65         uint32_t type;
66         uint32_t code;
67         uint32_t mod;
68         bool repeat;
69 } key_queue_t;
70
71
72 class DLL_PREFIX EmuThreadClassBase : public QThread {
73         Q_OBJECT
74 protected:
75         EMU_TEMPLATE *p_emu;
76         OSD_BASE *p_osd;
77
78         bool poweroff_notified;
79
80         bool now_skip;
81         bool calc_message;
82         bool tape_play_flag;
83         bool tape_rec_flag;
84         int tape_pos;
85         bool mouse_flag;
86         int mouse_x;
87         int mouse_y;
88         Qt::HANDLE thread_id;
89         int queue_fixed_cpu;
90
91     FIFO *key_fifo;
92         QOpenGLContext *glContext;
93         bool is_shared_glcontext;
94
95         uint32_t key_mod;
96
97         std::shared_ptr<USING_FLAGS> using_flags;
98         config_t *p_config;
99
100         QWaitCondition *drawCond;
101 #if QT_VERSION >= 0x051400
102         QRecursiveMutex keyMutex;
103         QRecursiveMutex mouseMutex;
104 #else
105         QMutex keyMutex;
106         QMutex mouseMutex;
107 #endif
108         //class META_MainWindow *MainWindow;
109         Ui_MainWindowBase *MainWindow;
110         QElapsedTimer tick_timer;
111
112         bool bBlockTask;
113         bool bRunThread;
114         bool bResetReq;
115         bool bSpecialResetReq;
116         bool bLoadStateReq;
117         bool bSaveStateReq;
118         bool bUpdateConfigReq;
119         bool bStartRecordSoundReq;
120         bool bStopRecordSoundReq;
121         bool bStartRecordMovieReq;
122         QString sStateFile;
123         QString lStateFile;
124
125 #if QT_VERSION >= 0x051400
126         QRecursiveMutex uiMutex;
127 #else
128         QMutex uiMutex;
129 #endif
130         char dbg_prev_command[MAX_COMMAND_LEN];
131
132 //      bool draw_timing;
133         bool doing_debug_command;
134         bool bUpdateVolumeReq[32];
135         int volume_balance[32];
136         int volume_avg[32];
137         int record_fps;
138         int  specialResetNum;
139
140         qint64 next_time;
141         qint64 update_fps_time;
142         bool prev_skip;
143         int total_frames;
144         int draw_frames;
145         int skip_frames;
146         QString qd_text[4];
147         QString fd_text[8];
148         QString fd_lamp[8];
149         QString hdd_text[8];
150         QString hdd_lamp[8];
151         QString cmt_text[4];
152         QString cdrom_text[4];
153         QString laserdisc_text[4];
154         QString bubble_text[16];
155
156         QString clipBoardText;
157         QStringList vMovieQueue;
158
159         // Standard 8 files.
160         void calc_volume_from_balance(int num, int balance);
161         void calc_volume_from_level(int num, int level);
162         int parse_command_queue(QStringList _l, int _begin);
163
164         void button_pressed_mouse_sub(Qt::MouseButton button);
165         void button_released_mouse_sub(Qt::MouseButton button);
166
167         void get_qd_string(void);
168         void get_fd_string(void);
169         void get_hdd_string(void);
170         void get_tape_string(void);
171         void get_cd_string(void);
172         void get_bubble_string(void);
173
174         const _TCHAR *get_emu_message(void);
175         double get_emu_frame_rate(void);
176         int get_message_count(void);
177         void dec_message_count(void);
178
179         virtual const _TCHAR *get_device_name(void);
180         virtual void resetEmu() { }
181         virtual void specialResetEmu(int num) { }
182         virtual void loadState() { }
183         virtual void saveState() { }
184
185         void enqueue_key_up(key_queue_t s) {
186                 QMutexLocker n(&keyMutex);
187                 key_fifo->write(KEY_QUEUE_UP);
188                 key_fifo->write(s.code);
189                 key_fifo->write(s.mod);
190                 key_fifo->write(s.repeat? 1 : 0);
191         };
192         void enqueue_key_down(key_queue_t s) {
193                 QMutexLocker n(&keyMutex);
194                 key_fifo->write(KEY_QUEUE_DOWN);
195                 key_fifo->write(s.code);
196                 key_fifo->write(s.mod);
197                 key_fifo->write(s.repeat? 1 : 0);
198         };
199         void dequeue_key(key_queue_t *s) {
200                 QMutexLocker n(&keyMutex);
201                 uint32_t _type = (uint32_t)key_fifo->read();
202                 if(_type ==     KEY_QUEUE_DOWN) {
203                         s->type = _type;
204                         s->code = (uint32_t)key_fifo->read();
205                         s->mod  = (uint32_t)key_fifo->read();
206                         if(key_fifo->read() != 0) {
207                                 s->repeat = true;
208                         } else {
209                                 s->repeat = false;
210                         }
211                 } else if(_type == KEY_QUEUE_UP) {
212                         s->type = _type;
213                         s->code = (uint32_t)key_fifo->read();
214                         s->mod  = (uint32_t)key_fifo->read();
215                         volatile uint32_t dummy = key_fifo->read();
216                         s->repeat = false;
217                 } else {
218                         s->type = 0;
219                         s->code = 0;
220                         s->mod = 0;
221                         s->repeat = false;
222                 }
223         };
224         bool is_empty_key() {
225                 QMutexLocker n(&keyMutex);
226                 bool f = key_fifo->empty();
227                 return f;
228         };
229         void clear_key_queue() {
230                 QMutexLocker n(&keyMutex);
231                 key_fifo->clear();
232         };
233
234 public:
235         EmuThreadClassBase(Ui_MainWindowBase *rootWindow, std::shared_ptr<USING_FLAGS> p, QObject *parent = 0);
236         ~EmuThreadClassBase();
237         virtual void run() {};
238         void set_tape_play(bool);
239         void resize_screen(int sw, int sh, int stw, int sth);
240         void sample_access_drv(void);
241         bool now_debugging();
242
243         EMU_TEMPLATE *get_emu() { return p_emu; }
244
245         int get_d88_file_cur_bank(int drive);
246         int get_d88_file_bank_num(int drive);
247         QString get_d88_file_disk_name(int drive, int banknum);
248         bool is_floppy_disk_protected(int drive);
249         void set_floppy_disk_protected(int drive, bool flag);
250         QString get_d88_file_path(int drive);
251
252
253 public slots:
254         void doExit(void);
255
256         void do_reset(void);
257         void do_notify_power_off(void);
258         void do_special_reset(void);
259         void do_load_state();
260         void do_save_state();
261         void do_update_config();
262         void do_start_record_sound();
263         void do_stop_record_sound();
264         void do_start_record_video();
265         void do_stop_record_video();
266         void do_update_volume_level(int num, int level);
267         void do_update_volume_balance(int num, int level);
268
269         void button_pressed_mouse(Qt::MouseButton);
270         void button_released_mouse(Qt::MouseButton);
271         void do_key_down(uint32_t vk, uint32_t mod, bool repeat);
272         void do_key_up(uint32_t vk, uint32_t mod);
273         void print_framerate(int frames);
274         void set_emu_thread_to_fixed_cpu(int cpunum);
275         void do_block();
276         void do_unblock();
277         void do_start_emu_thread();
278         void do_set_emu_thread_to_fixed_cpu_from_action();
279         // From emu_thread_slots.cpp .
280         void do_set_display_size(int w, int h, int ww, int wh);
281         void moved_mouse(double x, double y, double globalx, double globaly);
282
283         void do_write_protect_floppy_disk(int drv, bool flag);
284         void do_close_floppy_disk(int);
285         void do_open_floppy_disk(int, QString, int);
286
287         void do_close_hard_disk(int);
288         void do_open_hard_disk(int, QString);
289
290         void do_play_tape(int drv, QString name);
291         void do_rec_tape(int drv, QString name);
292         void do_close_tape(int drv);
293         void do_cmt_push_play(int drv);
294         void do_cmt_push_stop(int drv);
295         void do_cmt_push_fast_forward(int drv);
296         void do_cmt_push_fast_rewind(int drv);
297         void do_cmt_push_apss_forward(int drv);
298         void do_cmt_push_apss_rewind(int drv);
299
300         void do_write_protect_quickdisk(int drv, bool flag);
301         void do_close_quickdisk(int drv);
302         void do_open_quickdisk(int drv, QString path);
303
304         void do_close_cart(int drv);
305         void do_open_cart(int drv, QString path);
306
307         void do_close_laser_disc(int drv);
308         void do_open_laser_disc(int drv, QString path);
309
310         void do_eject_cdrom(int drv);
311         void do_open_cdrom(int drv, QString path);
312
313         void do_load_binary(int drv, QString path);
314         void do_save_binary(int drv, QString path);
315
316         void do_write_protect_bubble_casette(int drv, bool flag);
317         void do_close_bubble_casette(int);
318         void do_open_bubble_casette(int, QString, int);
319
320         void do_start_auto_key(QString text);
321         void do_stop_auto_key(void);
322         void set_romakana(bool flag);
323         void do_close_debugger(void);
324
325
326         void do_select_floppy_disk_d88(int drive, int slot);
327         // Signal from EMU:: -> OSD:: -> EMU_THREAD (-> GUI (menu_foo[bar]))
328         void done_open_tape(int drive, QString path);
329         void done_close_tape(int drive);
330
331         void done_open_quick_disk(int drive, QString path);
332         void done_close_quick_disk(int drive);
333
334         void done_open_compact_disc(int drive, QString path);
335         void done_close_compact_disc(int drive);
336
337         void done_open_hard_disk(int drive, QString path);
338         void done_close_hard_disk(int drive);
339
340         void done_open_cart(int drive, QString path);
341         void done_close_cart(int drive);
342
343         void done_open_laser_disc(int drive, QString path);
344         void done_close_laser_disc(int drive);
345
346         void done_open_binary(int drive, QString path);
347         void done_close_binary(int drive);
348
349         void done_open_bubble(int drive, QString path);
350         void done_close_bubble(int drive);
351         void done_select_b77(int drive, int slot);
352
353 signals:
354         int message_changed(QString);
355         int window_title_changed(QString);
356         int sig_draw_thread(bool);
357         int quit_draw_thread(void);
358         int sig_screen_aspect(int);
359         int sig_screen_size(int, int);
360         int sig_finished(void);
361         int sig_mouse_enable(bool);
362         int sig_update_recent_hard_disk(int);
363
364         int sig_change_osd(int, int, QString);
365         int sig_change_access_lamp(int, int, QString);
366         int sig_change_virtual_media(int, int, QString);
367
368         int sig_update_recent_bubble(int);
369         int sig_change_osd_bubble(int, QString);
370         int sig_set_grid_vertical(int, bool);
371         int sig_set_grid_horizonal(int, bool);
372         int sig_send_data_led(quint32);
373         int sig_resize_screen(int, int);
374         int sig_resize_uibar(int, int);
375         int sig_resize_osd(int);
376         int sig_is_enable_mouse(bool);
377         int sig_debugger_input(QString);
378         int sig_quit_debugger();
379         int sig_romakana_mode(bool);
380         int sig_set_access_lamp(int, bool);
381
382         int sig_open_binary_load(int, QString);
383         int sig_open_binary_save(int, QString);
384         int sig_open_cart(int, QString);
385         int sig_open_cmt_load(int, QString);
386         int sig_open_cmt_write(int, QString);
387         int sig_open_fd(int, QString);
388         int sig_open_d88_fd(int, QString, int);
389         int sig_open_hdd(int, QString);
390
391         int sig_open_quick_disk(int, QString);
392         int sig_open_bubble(int, QString);
393         int sig_open_b77_bubble(int, QString, int);
394         int sig_open_cdrom(int, QString);
395         int sig_open_laser_disc(int, QString);
396
397         int sig_set_b77_num(int, int);
398
399         // From emu_thread_slots.cpp .
400         int sig_set_draw_fps(double);
401         int sig_draw_one_turn(bool);
402
403 // Signal from (EMU:: -> OSD:: ->) EMU_THREAD -> GUI(menu_foo[bar])
404         int sig_ui_update_floppy_list(int, QStringList);
405         int sig_ui_close_floppy_disk(int);
406         int sig_ui_clear_d88(int);
407         int sig_ui_update_d88(int, int, QString);
408         int sig_ui_select_d88(int, int);
409
410         int sig_ui_update_tape_list(int, QStringList);
411         int sig_ui_close_tape(int);
412
413         int sig_ui_update_quick_disk_list(int, QStringList);
414         int sig_ui_close_quick_disk(int);
415
416         int sig_ui_update_compact_disc_list(int, QStringList);
417         int sig_ui_close_compact_disc(int);
418
419         int sig_ui_update_hard_disk_list(int, QStringList);
420         int sig_ui_close_hard_disk(int);
421
422         int sig_ui_update_cart_list(int, QStringList);
423         int sig_ui_close_cart(int);
424
425         int sig_ui_update_laser_disc_list(int, QStringList);
426         int sig_ui_close_laser_disc(int);
427
428         int sig_ui_update_binary_list(int, QStringList);
429         int sig_ui_close_binary(int);
430
431         int sig_ui_update_bubble_casette_list(int, QStringList);
432         int sig_ui_close_bubble_casette(int);
433         int sig_ui_clear_b77(int);
434         int sig_ui_update_b77(int, int, QString);
435         int sig_ui_select_b77(int, int);
436
437 };
438
439 QT_END_NAMESPACE
440
441 #endif