OSDN Git Service

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