OSDN Git Service

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