OSDN Git Service

ec6f26d13319864eb1ebd413f3e2860d66bb8f22
[csp-qt/common_source_project-fm7.git] / source / src / qt / osd_base.h
1 /*
2         Skelton for retropc emulator
3
4         Author : K.Ohta <whatisthis.sowhat _at_ gmail.com>
5         Date   : 2015.11.30-
6
7         [ Qt dependent ]
8 */
9
10 #ifndef _QT_OSD_BASE_H_
11 #define _QT_OSD_BASE_H_
12
13
14 #include <QWidget>
15 #include <QThread>
16 #include <QMutex>
17 #include <QSemaphore>
18 #include <QPainter>
19 #include <QElapsedTimer>
20 #include <QString>
21 #include <QQueue>
22 #include <QImage>
23 #include <QList>
24
25 #include <SDL.h>
26 #include "simd_types.h"
27
28 #include <ctime>
29 #include <limits>
30 #include <osd_base.h>
31
32 //#include "../vm/vm.h"
33 //#include "../emu.h"
34 #include "../config.h"
35 #include "../fileio.h"
36 #include "../fifo.h"
37 #if !defined(Q_OS_WIN32)
38 #include "qt_input.h"
39 #endif
40 #define SOCKET_MAX 4
41 #define SOCKET_BUFFER_MAX 0x100000
42 #include "osd_types.h"
43
44 #define N_MAX_BUTTONS 128
45
46 #define WM_RESIZE  (WM_USER + 1)
47 #define WM_SOCKET0 (WM_USER + 2)
48 #define WM_SOCKET1 (WM_USER + 3)
49 #define WM_SOCKET2 (WM_USER + 4)
50 #define WM_SOCKET3 (WM_USER + 5)
51
52 //#ifdef USE_VIDEO_CAPTURE
53 #define MAX_CAPTURE_DEVS 8
54 //#endif
55
56 #include "qt_main.h"
57 //#include "mainwidget.h"
58 #include "config.h"
59
60 class GLDrawClass;
61 class EmuThreadClass;
62 class DrawThreadClass;
63 class Ui_MainWindow;
64 class EMU;
65 class VM;
66 class FIFO;
67 class CSP_KeyTables;
68 class USING_FLAGS;
69 class CSP_LOGGER;
70 QT_BEGIN_NAMESPACE
71
72 typedef struct {
73         int id;
74         const _TCHAR *name;
75 } device_node_t;
76
77 typedef struct {
78         QString string;
79         union {
80                 int64_t ivalue;
81                 double  fvalue;
82         } v;
83 } supportedlist_t;
84
85 class DLL_PREFIX OSD_BASE : public QThread
86 {
87         Q_OBJECT
88 protected:
89         EmuThreadClass *parent_thread;
90         QSemaphore *VMSemaphore;
91         QSemaphore *DebugSemaphore;
92         sdl_snddata_t snddata;
93         USING_FLAGS *using_flags;
94         config_t *p_config;
95         CSP_Logger *csp_logger;
96
97         QList<supportedlist_t> SupportedFeatures;
98         
99         _TCHAR app_path[_MAX_PATH];
100         QElapsedTimer osd_timer;
101         bool locked_vm;
102         // console
103         FILE *hStdIn, *hStdOut;
104         QString console_cmd_str;
105         bool osd_console_opened;
106         // input
107         void initialize_input();
108         void release_input();
109         void key_down_sub(int code, bool repeat);
110         void key_up_sub(int code);
111         CSP_KeyTables *key_table;
112         
113         scrntype_t *get_buffer(bitmap_t *p, int y);
114         bool dinput_key_ok;
115 //      bool dinput_joy_ok;
116         
117         uint8_t keycode_conv[256];
118         uint8_t key_status[256];        // windows key code mapping
119         uint8_t key_dik_prev[256];
120         uint8_t key_converted[256];
121         bool key_shift_pressed, key_shift_released;
122
123
124         uint32_t modkey_status;
125         bool lost_focus;
126         uint32_t joy_status[4]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons
127         int joy_num;
128         uint32_t joy_mask[4];
129         
130         int mouse_status[3];    // x, y, button (b0 = left, b1 = right)
131         bool mouse_enabled;
132         int mouse_ptrx;
133         int mouse_ptry;
134         int mouse_button;
135         int mouse_oldx;
136         int mouse_oldy;
137         //Qt::CursorShape mouse_shape;
138         
139         QImage background_image;
140         QImage button_images[N_MAX_BUTTONS];
141         QImage rec_image_buffer;
142         
143         // printer
144         
145         // screen
146         void initialize_screen();
147         void release_screen();
148         void initialize_screen_buffer(bitmap_t *buffer, int width, int height, int mode);
149         void release_screen_buffer(bitmap_t *buffer);
150         void rotate_screen_buffer(bitmap_t *source, bitmap_t *dest);
151         
152         void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest);
153         int add_video_frames();
154         
155         bitmap_t vm_screen_buffer;
156         bitmap_t video_screen_buffer;
157         bitmap_t* draw_screen_buffer;
158         int vm_window_width, vm_window_height;
159         int vm_window_width_aspect, vm_window_height_aspect;
160         
161         int host_window_width, host_window_height;
162         bool host_window_mode;
163         int base_window_width, base_window_height;
164         int vm_screen_width, vm_screen_height;
165         int draw_screen_width, draw_screen_height;
166         int rec_video_nsec, rec_video_fps_nsec;
167         
168         _TCHAR video_file_name[_MAX_PATH];
169         int rec_video_fps;
170         
171         uint64_t dwAVIFileSize;
172         uint64_t lAVIFrames;
173
174         rec_video_thread_param_t rec_video_thread_param;
175         
176         bool first_draw_screen;
177         bool first_invalidate;
178         bool self_invalidate;
179         
180         // sound
181         void initialize_sound(int rate, int samples);
182         void release_sound();
183         static void audio_callback(void *udata, Uint8 *stream, int len);
184         int sound_rate, sound_samples;
185         bool sound_ok, sound_started, now_mute;
186         bool sound_first_half;
187         
188         _TCHAR sound_file_name[_MAX_PATH];
189         FILEIO* rec_sound_fio;
190         int rec_sound_bytes;
191         int rec_sound_buffer_ptr;
192         
193         int sound_buffer_size;
194         int sound_data_len;
195         int sound_data_pos;
196         int sound_write_pos;
197         bool sound_exit;
198         bool sound_debug;
199         SDL_sem *snd_apply_sem;
200         Sint16 *sound_buf_ptr;
201         Uint8 snd_total_volume;
202 #if defined(USE_SDL2)   
203         SDL_AudioDeviceID audio_dev_id;
204 #else
205         int audio_dev_id;
206 #endif
207         SDL_AudioSpec snd_spec_req, snd_spec_presented;
208         
209         // video device
210         virtual void initialize_video();
211         virtual void release_video();
212   
213         bitmap_t dshow_screen_buffer;
214         int direct_show_width, direct_show_height;
215         bool direct_show_mute[2];
216
217         double movie_frame_rate;
218         int movie_sound_rate;
219
220         void enum_capture_devs();
221         bool connect_capture_dev(int index, bool pin);
222         int cur_capture_dev_index;
223         int num_capture_devs;
224         _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];
225
226         _TCHAR prn_file_name[_MAX_PATH];
227         FILEIO *prn_fio;
228         int prn_data, prn_wait_frames;
229         bool prn_strobe;
230
231         // socket
232         virtual void initialize_socket();
233         virtual void release_socket();
234         
235         bool is_tcp[SOCKET_MAX];
236         bool host_mode[SOCKET_MAX];
237         int socket_delay[SOCKET_MAX];
238
239         // wrapper
240         int max_vm_nodes;
241         QList<device_node_t> device_node_list;
242         virtual void vm_draw_screen(void);
243         virtual Sint16* create_sound(int *extra_frames);
244         virtual bool get_use_socket(void);
245         virtual bool get_support_variable_timing(void);
246         virtual bool get_notify_key_down(void);
247         virtual bool get_notify_key_down_lr_shift(void);
248         virtual bool get_notify_key_down_lr_control(void);
249         virtual bool get_notify_key_down_lr_menu(void);
250         virtual bool get_use_shift_numpad_key(void);
251         virtual bool get_use_auto_key(void);
252         virtual bool get_dont_keeep_key_pressed(void);
253         virtual bool get_one_board_micro_computer(void);
254         virtual bool get_use_screen_rotate(void);
255         virtual bool get_use_movie_player(void);
256         virtual bool get_use_video_capture(void);
257         virtual void vm_key_down(int code, bool flag);
258         virtual void vm_key_up(int code);
259         virtual void vm_reset(void);
260         virtual void update_buttons(bool press_flag, bool release_flag);
261         virtual int get_screen_width(void);
262         virtual int get_screen_height(void);
263         virtual int get_vm_buttons_code(int num);
264
265         virtual void init_sound_files();
266         virtual void release_sound_files();
267 public:
268         OSD_BASE(USING_FLAGS *p, CSP_Logger *logger);
269         ~OSD_BASE();
270         
271         // common
272         VM* vm;
273         //EMU* emu;
274         class Ui_MainWindow *main_window_handle;
275         GLDrawClass *glv;
276         QMutex *screen_mutex;
277         
278         int host_cpus;
279         bool now_auto_key;
280         
281         virtual void initialize(int rate, int samples);
282         virtual void release();
283         virtual void power_off();
284         void suspend();
285         void restore();
286         _TCHAR* application_path();
287         _TCHAR* bios_path(const _TCHAR* file_name);
288         void get_host_time(cur_time_t* time);
289         void sleep(uint32_t ms);
290         void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
291         _TCHAR  *get_app_path(void);
292         // common console
293         void open_console(_TCHAR* title);
294         void close_console();
295         unsigned int get_console_code_page();
296         bool is_console_active();
297         void set_console_text_attribute(unsigned short attr);
298         void write_console(_TCHAR* buffer, unsigned int length);
299         int read_console_input(_TCHAR* buffer);
300         bool is_console_key_pressed(uint32_t ch);
301         
302         // common input
303         void update_input();
304         void key_down(int code, bool repeat);
305         void key_up(int code);
306         void key_down_native(int code, bool repeat);
307         void key_up_native(int code);
308         void key_lost_focus();
309         void press_button(int num);
310
311 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
312         uint16_t GetAsyncKeyState(uint32_t vk);  // Win32 GetAsyncKeyState() wrappeer.
313 # endif
314         void key_modifiers(uint32_t mod);
315         void enable_mouse();
316         void disable_mouse();
317         void toggle_mouse();
318         bool is_mouse_enabled();
319         //QImage *getPseudoVramClass(void) { return pPseudoVram;}
320         void set_mouse_pointer(int x, int y);
321         void set_mouse_button(int button);
322         int get_mouse_button();
323         void modify_key_buffer(int code, uint8_t val);
324         uint8_t* get_key_buffer();
325         uint32_t* get_joy_buffer();
326         int* get_mouse_buffer();
327         // common printer
328         void reset_printer();
329         void update_printer();
330         void printer_out(uint8_t value);
331         void printer_strobe(bool value);
332         // printer
333         void initialize_printer();
334         void release_printer();
335         void open_printer_file();
336         void close_printer_file();
337         
338         // common screen
339         int get_window_mode_width(int mode);
340         int get_window_mode_height(int mode);
341         void set_host_window_size(int window_width, int window_height, bool window_mode);
342         void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height);
343         int get_vm_window_width();
344         int get_vm_window_height();
345         int get_vm_window_width_aspect();
346         int get_vm_window_height_aspect();
347         scrntype_t* get_vm_screen_buffer(int y);
348         //int draw_screen();
349         //int no_draw_screen();
350         void reload_bitmap();
351         void capture_screen();
352         bool start_record_video(int fps);
353         void stop_record_video();
354         void restart_record_video();
355         void add_extra_frames(int extra_frames);
356         bool now_record_video;
357         bool screen_skip_line;
358         // common sound
359         void update_sound(int* extra_frames);
360         void mute_sound();
361         void stop_sound();
362         void start_record_sound();
363         void stop_record_sound();
364         void restart_record_sound();
365         bool now_record_sound;
366         int get_sound_rate();
367         // Wrapper : Sound
368         virtual void load_sound_file(int id, const _TCHAR *name, int16_t **data, int *dst_size);
369         virtual void free_sound_file(int id, int16_t **data);
370         
371         // common video device
372         virtual void get_video_buffer();
373         void mute_video_dev(bool l, bool r);
374         virtual bool open_movie_file(const _TCHAR* file_path);
375         virtual void close_movie_file();
376         void play_movie();
377         void stop_movie();
378         void pause_movie();
379         double get_movie_frame_rate();
380         virtual int get_movie_sound_rate();
381         void set_cur_movie_frame(int frame, bool relative);
382         uint32_t get_cur_movie_frame();
383         bool now_movie_play, now_movie_pause;
384         int get_cur_capture_dev_index();
385         int get_num_capture_devs();
386         _TCHAR* get_capture_dev_name(int index);
387         void open_capture_dev(int index, bool pin);
388         void close_capture_dev();
389         void show_capture_dev_filter();
390         void show_capture_dev_pin();
391         void show_capture_dev_source();
392         void set_capture_dev_channel(int ch);
393         
394         // common printer
395         void create_bitmap(bitmap_t *bitmap, int width, int height);
396         void release_bitmap(bitmap_t *bitmap);
397         void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
398         void release_font(font_t *font);
399         void create_pen(pen_t *pen, int width, uint8_t r, uint8_t g, uint8_t b);
400         void release_pen(pen_t *pen);
401
402         void clear_bitmap(bitmap_t *bitmap, uint8_t r, uint8_t g, uint8_t b);
403         int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
404         
405         void draw_text_to_bitmap(bitmap_t *bitmap, font_t *font, int x, int y, const _TCHAR *text, uint8_t r, uint8_t g, uint8_t b);
406         void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
407         void draw_rectangle_to_bitmap(bitmap_t *bitmap, int x, int y, int width, int height, uint8_t r, uint8_t g, uint8_t b);
408         void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b);
409
410         void stretch_bitmap(bitmap_t *dest, int dest_x, int dest_y, int dest_width, int dest_height, bitmap_t *source, int source_x, int source_y, int source_width, int source_height);
411         void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
412
413         // common socket
414         virtual int get_socket(int ch);
415         virtual void notify_socket_connected(int ch);
416         virtual void notify_socket_disconnected(int ch);
417         virtual void update_socket();
418         virtual bool initialize_socket_tcp(int ch);
419         virtual bool initialize_socket_udp(int ch);
420         virtual bool connect_socket(int ch, uint32_t ipaddr, int port);
421         virtual void disconnect_socket(int ch);
422         virtual bool listen_socket(int ch);
423         virtual void send_socket_data_tcp(int ch);
424         virtual void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
425         virtual void send_socket_data(int ch);
426         virtual void recv_socket_data(int ch);
427
428         // win32 dependent
429         void update_screen();
430         void set_parent_thread(EmuThreadClass *parent);
431         EmuThreadClass *get_parent_handler();
432
433         _TCHAR *console_input_string(void);
434         void clear_console_input_string(void);
435         // Wrapper
436         virtual void lock_vm(void);
437         virtual void unlock_vm(void);
438         virtual void force_unlock_vm(void);
439         virtual bool is_vm_locked(void);
440         virtual void set_draw_thread(DrawThreadClass *handler);
441         virtual QString get_vm_config_name(void);
442         virtual double vm_frame_rate(void);
443         virtual void reset_vm_node(void);
444         virtual void set_device_name(int id, char *name);
445         
446         virtual void set_vm_node(int id, const _TCHAR *name);
447         virtual const _TCHAR *get_vm_node_name(int id);
448         virtual int get_vm_node_size(void);
449         
450         // Get #define S to value.You may use inside of VM/ .
451         virtual void set_features(void) {}
452         void add_feature(const _TCHAR *key, double value);
453         void add_feature(const _TCHAR *key, float value);
454         void add_feature(const _TCHAR *key, int value = 1);
455         void add_feature(const _TCHAR *key, int64_t value);
456         void add_feature(const _TCHAR *key, uint32_t value);
457         void add_feature(const _TCHAR *key, uint16_t value);
458         void add_feature(const _TCHAR *key, uint8_t value);
459         bool check_feature(const _TCHAR *key);
460         double get_feature_double_value(const _TCHAR *key);
461         int64_t get_feature_int_value(const _TCHAR *key);
462         uint32_t get_feature_uint32_value(const _TCHAR *key);
463         uint16_t get_feature_uint16_value(const _TCHAR *key);
464         uint8_t get_feature_uint8_value(const _TCHAR *key);
465
466         void debug_log(int level, const char *fmt, ...);
467         void debug_log(int level, int domain_num, const char *fmt, ...);
468         virtual void debug_log(int level, int domain_num, char *strbuf);
469  
470 public slots:
471         void do_write_inputdata(QString s);
472         void do_set_input_string(QString s);
473         void close_debugger_console();
474         void do_close_debugger_thread();
475         void do_assign_js_setting(int jsnum, int axis_idx, int assigned_value);
476         void upload_bitmap(QImage *p);
477         void set_buttons();
478         void do_start_record_video();
479         virtual void do_decode_movie(int frames);
480         void do_video_movie_end(bool flag);
481         void do_video_decoding_error(int num);
482         virtual void do_run_movie_audio_callback(uint8_t *data, long len);
483         int draw_screen();
484         int no_draw_screen();
485         void do_draw(bool flag);
486
487 signals:
488         int sig_update_screen(bitmap_t *);
489         int sig_save_screen(const char *);
490         int sig_draw_frames(int);
491         int sig_close_window(void);
492         int sig_resize_vm_screen(QImage *, int, int);
493         int sig_put_string_debugger(QString);
494         int sig_console_input_string(QString);
495         int sig_enqueue_video(int, int, int, QImage *); 
496         int sig_enqueue_audio(int16_t *data, int size);
497         int sig_movie_set_width(int);
498         int sig_movie_set_height(int);
499         int sig_debugger_finished();
500         int sig_req_encueue_video(int, int, int);
501         int sig_save_as_movie(QString, int, int);
502         int sig_stop_saving_movie();
503
504         int sig_movie_play();
505         int sig_movie_stop();
506         int sig_movie_pause(bool);
507         int sig_movie_seek_frame(bool, int);
508
509         int sig_update_device_node_name(int id, const _TCHAR *name);
510         int sig_enable_mouse(void);
511         int sig_disable_mouse(void);
512 };
513 QT_END_NAMESPACE
514
515 #endif