2 Skelton for retropc emulator
4 Author : K.Ohta <whatisthis.sowhat _at_ gmail.com>
10 #ifndef _QT_OSD_BASE_H_
11 #define _QT_OSD_BASE_H_
19 //#include "simd_types.h"
23 //#include <osd_base.h>
25 //#include "../vm/vm.h"
27 #include "../config.h"
28 //#include "../fileio.h"
29 //#include "../fifo.h"
30 //#if !defined(Q_OS_WIN32)
31 //#include "qt_input.h"
34 #define SOCKET_BUFFER_MAX 0x100000
35 #include "osd_types.h"
37 #define N_MAX_BUTTONS 128
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)
45 //#ifdef USE_VIDEO_CAPTURE
46 #define MAX_CAPTURE_DEVS 8
49 //#include "qt_main.h"
53 class DrawThreadClass;
79 class DLL_PREFIX OSD_BASE : public QThread
83 EmuThreadClass *parent_thread;
84 sdl_snddata_t snddata;
85 USING_FLAGS *using_flags;
89 QList<supportedlist_t> SupportedFeatures;
92 bool __USE_SHIFT_NUMPAD_KEY;
94 _TCHAR app_path[_MAX_PATH];
95 QElapsedTimer osd_timer;
98 FILE *hStdIn, *hStdOut;
99 QString console_cmd_str;
100 bool osd_console_opened;
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;
108 scrntype_t *get_buffer(bitmap_t *p, int y);
110 // bool dinput_joy_ok;
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;
119 uint32_t modkey_status;
121 uint32_t joy_status[4]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons
123 uint32_t joy_mask[4];
125 int32_t mouse_status[3]; // x, y, button (b0 = left, b1 = right)
134 //Qt::CursorShape mouse_shape;
136 QImage background_image;
137 QImage button_images[N_MAX_BUTTONS];
138 QImage rec_image_buffer;
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);
149 void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest);
150 int add_video_frames();
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;
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;
165 _TCHAR video_file_name[_MAX_PATH];
168 uint64_t dwAVIFileSize;
171 rec_video_thread_param_t rec_video_thread_param;
173 bool first_draw_screen;
174 bool first_invalidate;
175 bool self_invalidate;
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;
185 _TCHAR sound_file_name[_MAX_PATH];
186 FILEIO* rec_sound_fio;
188 int rec_sound_buffer_ptr;
190 int sound_buffer_size;
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;
204 SDL_AudioSpec snd_spec_req, snd_spec_presented;
207 virtual void initialize_video();
208 virtual void release_video();
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];
218 double movie_frame_rate;
219 int movie_sound_rate;
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];
227 _TCHAR prn_file_name[_MAX_PATH];
229 int prn_data, prn_wait_frames;
233 virtual void initialize_socket();
234 virtual void release_socket();
236 bool is_tcp[SOCKET_MAX];
237 bool host_mode[SOCKET_MAX];
238 int socket_delay[SOCKET_MAX];
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_use_auto_key(void);
247 virtual bool get_dont_keeep_key_pressed(void);
248 virtual bool get_one_board_micro_computer(void);
249 virtual bool get_use_screen_rotate(void);
250 virtual bool get_use_movie_player(void);
251 virtual bool get_use_video_capture(void);
252 virtual void vm_key_down(int code, bool flag);
253 virtual void vm_key_up(int code);
254 virtual void vm_reset(void);
255 virtual void update_buttons(bool press_flag, bool release_flag);
256 virtual int get_screen_width(void);
257 virtual int get_screen_height(void);
258 virtual int get_vm_buttons_code(int num);
260 virtual void init_sound_files();
261 virtual void release_sound_files();
263 OSD_BASE(USING_FLAGS *p, CSP_Logger *logger);
269 class Ui_MainWindow *main_window_handle;
271 QMutex *screen_mutex;
277 virtual void initialize(int rate, int samples);
278 virtual void release();
279 virtual void power_off();
282 _TCHAR* application_path();
283 _TCHAR* bios_path(const _TCHAR* file_name);
284 void get_host_time(cur_time_t* time);
285 void sleep(uint32_t ms);
286 void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
287 _TCHAR *get_app_path(void);
289 void open_console(_TCHAR* title);
290 void close_console();
291 unsigned int get_console_code_page();
292 bool is_console_active();
293 void set_console_text_attribute(unsigned short attr);
294 void write_console(_TCHAR* buffer, unsigned int length);
295 int read_console_input(_TCHAR* buffer, int length);
296 bool is_console_key_pressed(uint32_t ch);
300 void key_down(int code, bool extended, bool repeat);
301 void key_up(int code, bool extended);
302 void key_down_native(int code, bool repeat);
303 void key_up_native(int code);
304 void key_lost_focus();
305 void press_button(int num);
307 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
308 uint16_t GetAsyncKeyState(uint32_t vk); // Win32 GetAsyncKeyState() wrappeer.
310 void key_modifiers(uint32_t mod);
312 void disable_mouse();
314 bool is_mouse_enabled();
315 //QImage *getPseudoVramClass(void) { return pPseudoVram;}
316 void set_mouse_pointer(int x, int y);
317 void set_mouse_button(int button);
318 int get_mouse_button();
319 void modify_key_buffer(int code, uint8_t val);
320 uint8_t* get_key_buffer();
321 uint32_t* get_joy_buffer();
322 int32_t* get_mouse_buffer();
324 void reset_printer();
325 void update_printer();
326 void printer_out(uint8_t value);
327 void printer_strobe(bool value);
329 void initialize_printer();
330 void release_printer();
331 void open_printer_file();
332 void close_printer_file();
335 int get_window_mode_width(int mode);
336 int get_window_mode_height(int mode);
337 void set_host_window_size(int window_width, int window_height, bool window_mode);
338 void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height);
339 void set_vm_screen_lines(int lines); // 20170118
340 int get_vm_window_width();
341 int get_vm_window_height();
342 int get_vm_window_width_aspect();
343 int get_vm_window_height_aspect();
344 scrntype_t* get_vm_screen_buffer(int y);
346 //int no_draw_screen();
347 void reload_bitmap();
348 void capture_screen();
349 bool start_record_video(int fps);
350 void stop_record_video();
351 void restart_record_video();
352 void add_extra_frames(int extra_frames);
353 bool now_record_video;
354 bool screen_skip_line;
356 void update_sound(int* extra_frames);
359 void start_record_sound();
360 void stop_record_sound();
361 void restart_record_sound();
362 bool now_record_sound;
363 int get_sound_rate();
365 virtual void load_sound_file(int id, const _TCHAR *name, int16_t **data, int *dst_size);
366 virtual void free_sound_file(int id, int16_t **data);
368 // common video device
369 virtual void get_video_buffer();
370 void mute_video_dev(bool l, bool r);
371 virtual bool open_movie_file(const _TCHAR* file_path);
372 virtual void close_movie_file();
376 double get_movie_frame_rate();
377 virtual int get_movie_sound_rate();
378 void set_cur_movie_frame(int frame, bool relative);
379 uint32_t get_cur_movie_frame();
380 bool now_movie_play, now_movie_pause;
381 int get_cur_capture_dev_index();
382 int get_num_capture_devs();
383 _TCHAR* get_capture_dev_name(int index);
384 void open_capture_dev(int index, bool pin);
385 void close_capture_dev();
386 void show_capture_dev_filter();
387 void show_capture_dev_pin();
388 void show_capture_dev_source();
389 void set_capture_dev_channel(int ch);
392 void create_bitmap(bitmap_t *bitmap, int width, int height);
393 void release_bitmap(bitmap_t *bitmap);
394 void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
395 void release_font(font_t *font);
396 void create_pen(pen_t *pen, int width, uint8_t r, uint8_t g, uint8_t b);
397 void release_pen(pen_t *pen);
399 void clear_bitmap(bitmap_t *bitmap, uint8_t r, uint8_t g, uint8_t b);
400 int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
402 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);
403 void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
404 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);
405 void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b);
407 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);
408 void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
411 virtual int get_socket(int ch);
412 virtual void notify_socket_connected(int ch);
413 virtual void notify_socket_disconnected(int ch);
414 virtual void update_socket();
415 virtual bool initialize_socket_tcp(int ch);
416 virtual bool initialize_socket_udp(int ch);
417 virtual bool connect_socket(int ch, uint32_t ipaddr, int port);
418 virtual void disconnect_socket(int ch);
419 virtual bool listen_socket(int ch);
420 virtual void send_socket_data_tcp(int ch);
421 virtual void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
422 virtual void send_socket_data(int ch);
423 virtual void recv_socket_data(int ch);
426 void update_screen();
427 void set_parent_thread(EmuThreadClass *parent);
428 EmuThreadClass *get_parent_handler();
430 _TCHAR *console_input_string(void);
431 void clear_console_input_string(void);
433 virtual void lock_vm(void);
434 virtual void unlock_vm(void);
435 virtual void force_unlock_vm(void);
436 virtual bool is_vm_locked(void);
437 virtual void set_draw_thread(DrawThreadClass *handler);
438 virtual QString get_vm_config_name(void);
439 virtual double vm_frame_rate(void);
440 virtual void reset_vm_node(void);
441 virtual const _TCHAR *get_lib_common_vm_version() { return (const _TCHAR *)"\0"; }
442 virtual const _TCHAR *get_lib_common_vm_git_version() { return (const _TCHAR *)"\0"; }
443 virtual const _TCHAR *get_lib_osd_version() { return (const _TCHAR *)"\0"; }
445 virtual void set_device_name(int id, char *name);
447 virtual void set_vm_node(int id, const _TCHAR *name);
448 virtual const _TCHAR *get_vm_node_name(int id);
449 virtual int get_vm_node_size(void);
451 // Get #define S to value.You may use inside of VM/ .
452 virtual void set_features(void) {}
453 void add_feature(const _TCHAR *key, double value);
454 void add_feature(const _TCHAR *key, float value);
455 void add_feature(const _TCHAR *key, int value = 1);
456 void add_feature(const _TCHAR *key, int64_t value);
457 void add_feature(const _TCHAR *key, uint32_t value);
458 void add_feature(const _TCHAR *key, uint16_t value);
459 void add_feature(const _TCHAR *key, uint8_t value);
460 bool check_feature(const _TCHAR *key);
461 double get_feature_double_value(const _TCHAR *key);
462 int64_t get_feature_int_value(const _TCHAR *key);
463 uint32_t get_feature_uint32_value(const _TCHAR *key);
464 uint16_t get_feature_uint16_value(const _TCHAR *key);
465 uint8_t get_feature_uint8_value(const _TCHAR *key);
467 void debug_log(int level, const char *fmt, ...);
468 void debug_log(int level, int domain_num, const char *fmt, ...);
469 virtual void debug_log(int level, int domain_num, char *strbuf);
471 USING_FLAGS *get_config_flags(void) { return using_flags; }
474 CSP_Logger *get_logger(void) { return p_logger; }
477 void do_write_inputdata(QString s);
478 void do_set_input_string(QString s);
479 void close_debugger_console();
480 void do_close_debugger_thread();
481 void do_assign_js_setting(int jsnum, int axis_idx, int assigned_value);
482 void upload_bitmap(QImage *p);
484 void do_start_record_video();
485 virtual void do_decode_movie(int frames);
486 void do_video_movie_end(bool flag);
487 void do_video_decoding_error(int num);
488 virtual void do_run_movie_audio_callback(uint8_t *data, long len);
490 int no_draw_screen();
491 void do_draw(bool flag);
492 void do_set_screen_map_texture_address(scrntype_t *p, int width, int height);
495 int sig_update_screen(bitmap_t *);
496 int sig_save_screen(const char *);
497 int sig_draw_frames(int);
498 int sig_close_window(void);
499 int sig_resize_vm_screen(QImage *, int, int);
500 int sig_resize_vm_lines(int);
501 int sig_put_string_debugger(QString);
502 int sig_console_input_string(QString);
503 int sig_enqueue_video(int, int, int, QImage *);
504 int sig_enqueue_audio(int16_t *data, int size);
505 int sig_movie_set_width(int);
506 int sig_movie_set_height(int);
507 int sig_debugger_finished();
508 int sig_req_encueue_video(int, int, int);
509 int sig_save_as_movie(QString, int, int);
510 int sig_stop_saving_movie();
512 int sig_movie_play();
513 int sig_movie_stop();
514 int sig_movie_pause(bool);
515 int sig_movie_seek_frame(bool, int);
517 int sig_update_device_node_name(int id, const _TCHAR *name);
518 int sig_enable_mouse(void);
519 int sig_disable_mouse(void);
520 int sig_close_console(void);
522 int sig_move_mouse_to_center(void);