OSDN Git Service

[UI][Qt] Update to upstream 2017-06-22.Some parts are temporally.
[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 <QElapsedTimer>
17
18 #include "fifo.h"
19 #include "common.h"
20 #include "commonclasses.h"
21 #include "fileio.h"
22 #include "emu.h"
23
24 //#include "menuclasses.h"
25 #include "mainwidget_base.h"
26 #include "commonclasses.h"
27 #include "config.h"
28
29 class META_MainWindow;
30 class EMU;
31 class QWaitCondition;
32 class USING_FLAGS;
33
34 QT_BEGIN_NAMESPACE
35 //#include "../../romakana.h"
36
37 typedef struct {
38         uint32_t code;
39         uint32_t mod;
40         bool repeat;
41 } key_queue_t;
42
43 class DLL_PREFIX EmuThreadClassBase : public QThread {
44         Q_OBJECT
45 protected:
46         bool calc_message;
47         bool tape_play_flag;
48         bool tape_rec_flag;
49         int tape_pos;
50         bool mouse_flag;
51         int mouse_x;
52         int mouse_y;
53         
54         //QQueue <key_queue_t>key_up_queue;
55         //QQueue <key_queue_t>key_down_queue;
56     FIFO *key_up_code_fifo;
57         FIFO *key_up_mod_fifo;
58         FIFO *key_up_repeat_fifo;
59         
60     FIFO *key_down_code_fifo;
61         FIFO *key_down_mod_fifo;
62         FIFO *key_down_repeat_fifo;
63
64         
65         QQueue <QString>roma_kana_queue;
66         uint32_t key_mod;
67         bool roma_kana_conv;
68         bool romakana_conversion_mode;
69
70         EMU *p_emu;
71         USING_FLAGS *using_flags;
72         config_t *p_config;
73         
74         QWaitCondition *drawCond;
75         class META_MainWindow *MainWindow;
76         QElapsedTimer tick_timer;
77         
78         bool bRunThread;
79         bool bResetReq;
80         bool bSpecialResetReq;
81         bool bLoadStateReq;
82         bool bSaveStateReq;
83         bool bUpdateConfigReq;
84         bool bStartRecordSoundReq;
85         bool bStopRecordSoundReq;
86         bool bStartRecordMovieReq;
87         QString sStateFile;
88
89 //      bool draw_timing;
90         bool doing_debug_command;
91         bool bUpdateVolumeReq[32];
92         int volume_balance[32];
93         int volume_avg[32];
94         int record_fps;
95
96         qint64 next_time;
97         qint64 update_fps_time;
98         bool prev_skip;
99         int total_frames;
100         int draw_frames;
101         int skip_frames;
102         QString qd_text[8];
103         QString fd_text[16];
104         QString cmt_text;
105         QString cdrom_text;
106         QString laserdisc_text;
107         QString bubble_text[16];
108         QString clipBoardText;
109
110         _TCHAR roma_kana_buffer[8];
111         uint32_t roma_kana_shadow[8];
112         int roma_kana_ptr;
113         void calc_volume_from_balance(int num, int balance);
114         void calc_volume_from_level(int num, int level);
115         
116         virtual void button_pressed_mouse_sub(Qt::MouseButton button) {};
117         virtual void button_released_mouse_sub(Qt::MouseButton button) {};
118         virtual void get_qd_string(void) {};
119         virtual void get_fd_string(void) {};
120         virtual void get_tape_string(void) {};
121         virtual void get_cd_string(void) {};
122         virtual void get_bubble_string(void) {};
123         void enqueue_key_up(key_queue_t s) {
124                 key_up_code_fifo->write(s.code);
125                 key_up_mod_fifo->write(s.mod);
126                 key_up_repeat_fifo->write(s.repeat? 1 : 0);
127         };
128         void enqueue_key_down(key_queue_t s) {
129                 key_down_code_fifo->write(s.code);
130                 key_down_mod_fifo->write(s.mod);
131                 key_down_repeat_fifo->write(s.repeat? 1 : 0);
132         };
133         void dequeue_key_up(key_queue_t *s) {
134                 s->code = (uint32_t)key_up_code_fifo->read();
135                 s->mod  = (uint32_t)key_up_mod_fifo->read();
136                 if(key_up_repeat_fifo->read() != 0) {
137                         s->repeat = true;
138                 } else {
139                         s->repeat = false;
140                 }
141         };
142         void dequeue_key_down(key_queue_t *s) {
143                 s->code = (uint32_t)key_down_code_fifo->read();
144                 s->mod  = (uint32_t)key_down_mod_fifo->read();
145                 if(key_down_repeat_fifo->read() != 0) {
146                         s->repeat = true;
147                 } else {
148                         s->repeat = false;
149                 }
150         };
151         bool is_empty_key_down() {
152                 bool f = key_down_code_fifo->empty();
153                 f &= key_down_mod_fifo->empty();
154                 f &= key_down_repeat_fifo->empty();
155                 return f;
156         };
157         bool is_empty_key_up() {
158                 bool f = key_up_code_fifo->empty();
159                 f &= key_up_mod_fifo->empty();
160                 f &= key_up_repeat_fifo->empty();
161                 return f;
162         };
163         void clear_key_queue() {
164                 key_up_code_fifo->clear();
165                 key_up_mod_fifo->clear();
166                 key_up_repeat_fifo->clear();
167
168                 key_down_code_fifo->clear();
169                 key_down_mod_fifo->clear();
170                 key_down_repeat_fifo->clear();
171         };
172         virtual void set_romakana(void) { };
173 public:
174         EmuThreadClassBase(META_MainWindow *rootWindow, USING_FLAGS *p, QObject *parent = 0);
175         ~EmuThreadClassBase();
176         virtual void run() {};
177         void set_tape_play(bool);
178         void resize_screen(int sw, int sh, int stw, int sth);
179         void sample_access_drv(void);
180         virtual bool now_debugging() { return false; };
181 public slots:
182         void doExit(void);
183         
184         void do_reset();
185         void do_special_reset();
186         void do_load_state(QString name);
187         void do_save_state(QString name);
188         void do_update_config();
189         void do_start_record_sound();
190         void do_stop_record_sound();
191         void do_start_record_video(int fps);
192         void do_stop_record_video();
193         void do_update_volume_level(int num, int level);
194         void do_update_volume_balance(int num, int level);
195
196         void button_pressed_mouse(Qt::MouseButton);
197         void button_released_mouse(Qt::MouseButton);
198         void do_key_down(uint32_t vk, uint32_t mod, bool repeat);
199         void do_key_up(uint32_t vk, uint32_t mod);
200 signals:
201         int message_changed(QString);
202         int window_title_changed(QString);
203         int sig_draw_thread(bool);
204         int quit_draw_thread(void);
205         int sig_screen_aspect(int);
206         int sig_screen_size(int, int);
207         int sig_finished(void);
208         int call_emu_thread(EMU *);
209         int sig_check_grab_mouse(bool);
210         int sig_mouse_enable(bool);
211         int sig_update_recent_disk(int);
212         int sig_change_osd(int, int, QString);
213         int sig_update_recent_bubble(int);
214         int sig_change_osd_bubble(int, QString);
215         int sig_set_grid_vertical(int, bool);
216         int sig_set_grid_horizonal(int, bool);
217         int sig_send_data_led(quint32);
218         int sig_resize_screen(int, int);
219         int sig_resize_uibar(int, int);
220         int sig_is_enable_mouse(bool);
221         int sig_debugger_input(QString);
222         int sig_quit_debugger();
223         int sig_romakana_mode(bool);
224 };
225
226 QT_END_NAMESPACE
227
228 #endif