OSDN Git Service

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