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 <QElapsedTimer>
24 #include "simd_types.h"
28 //#include "../vm/vm.h"
30 #include "../config.h"
31 #include "../fileio.h"
33 #if !defined(Q_OS_WIN32)
37 #define SOCKET_BUFFER_MAX 0x100000
38 #include "osd_types.h"
41 #define WM_RESIZE (WM_USER + 1)
42 #define WM_SOCKET0 (WM_USER + 2)
43 #define WM_SOCKET1 (WM_USER + 3)
44 #define WM_SOCKET2 (WM_USER + 4)
45 #define WM_SOCKET3 (WM_USER + 5)
47 //#ifdef USE_VIDEO_CAPTURE
48 #define MAX_CAPTURE_DEVS 8
52 //#include "mainwidget.h"
53 #include "agar_logger.h"
57 class DrawThreadClass;
65 class OSD_BASE : public QThread
69 EmuThreadClass *parent_thread;
70 QSemaphore *VMSemaphore;
71 QSemaphore *DebugSemaphore;
72 sdl_snddata_t snddata;
74 _TCHAR app_path[_MAX_PATH];
75 QElapsedTimer osd_timer;
79 FILE *hStdIn, *hStdOut;
80 QString console_cmd_str;
81 bool osd_console_opened;
83 void initialize_input();
85 void key_down_sub(int code, bool repeat);
86 void key_up_sub(int code);
87 CSP_KeyTables *key_table;
89 scrntype_t *get_buffer(bitmap_t *p, int y);
91 // bool dinput_joy_ok;
93 uint8_t keycode_conv[256];
94 uint8_t key_status[256]; // windows key code mapping
95 uint8_t key_dik_prev[256];
96 uint8_t key_converted[256];
97 bool key_shift_pressed, key_shift_released;
100 uint32_t modkey_status;
102 uint32_t joy_status[4]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons
104 uint32_t joy_mask[4];
106 int mouse_status[3]; // x, y, button (b0 = left, b1 = right)
113 Qt::CursorShape mouse_shape;
118 void initialize_screen();
119 void release_screen();
120 void initialize_screen_buffer(bitmap_t *buffer, int width, int height, int mode);
121 void release_screen_buffer(bitmap_t *buffer);
122 void rotate_screen_buffer(bitmap_t *source, bitmap_t *dest);
124 void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest);
125 int add_video_frames();
127 bitmap_t vm_screen_buffer;
128 bitmap_t video_screen_buffer;
129 bitmap_t* draw_screen_buffer;
130 int vm_window_width, vm_window_height;
131 int vm_window_width_aspect, vm_window_height_aspect;
133 int host_window_width, host_window_height;
134 bool host_window_mode;
135 int base_window_width, base_window_height;
136 int vm_screen_width, vm_screen_height;
137 int draw_screen_width, draw_screen_height;
140 _TCHAR video_file_name[_MAX_PATH];
142 double rec_video_run_frames;
143 double rec_video_frames;
145 //LPBITMAPINFO lpDibRec;
147 //PAVISTREAM pAVIStream;
148 //PAVISTREAM pAVICompressed;
149 //AVICOMPRESSOPTIONS AVIOpts;
150 uint64_t dwAVIFileSize;
152 //HANDLE hVideoThread;
153 rec_video_thread_param_t rec_video_thread_param;
155 bool first_draw_screen;
156 bool first_invalidate;
157 bool self_invalidate;
160 void initialize_sound(int rate, int samples);
161 void release_sound();
162 static void audio_callback(void *udata, Uint8 *stream, int len);
163 int sound_rate, sound_samples;
164 bool sound_ok, sound_started, now_mute;
165 bool sound_first_half;
167 _TCHAR sound_file_name[_MAX_PATH];
168 FILEIO* rec_sound_fio;
170 int rec_sound_buffer_ptr;
172 int sound_buffer_size;
178 SDL_sem *snd_apply_sem;
179 Sint16 *sound_buf_ptr;
180 Uint8 snd_total_volume;
181 #if defined(USE_SDL2)
182 SDL_AudioDeviceID audio_dev_id;
186 SDL_AudioSpec snd_spec_req, snd_spec_presented;
189 void initialize_video();
190 void release_video();
192 //IGraphBuilder *pGraphBuilder;
193 //IBaseFilter *pVideoBaseFilter;
194 //IBaseFilter *pCaptureBaseFilter;
195 //ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
196 //ISampleGrabber *pVideoSampleGrabber;
197 //IBaseFilter *pSoundBaseFilter;
198 //ISampleGrabber *pSoundSampleGrabber;
199 //CMySampleGrabberCB *pSoundCallBack;
200 //IMediaControl *pMediaControl;
201 //IMediaSeeking *pMediaSeeking;
202 //IMediaPosition *pMediaPosition;
203 //IVideoWindow *pVideoWindow;
204 //IBasicVideo *pBasicVideo;
205 //IBasicAudio *pBasicAudio;
206 //bool bTimeFormatFrame;
207 //bool bVerticalReversed;
209 bitmap_t dshow_screen_buffer;
210 int direct_show_width, direct_show_height;
211 bool direct_show_mute[2];
213 double movie_frame_rate;
214 int movie_sound_rate;
216 void enum_capture_devs();
217 bool connect_capture_dev(int index, bool pin);
218 int cur_capture_dev_index;
219 int num_capture_devs;
220 _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];
222 _TCHAR prn_file_name[_MAX_PATH];
224 int prn_data, prn_wait_frames;
228 void initialize_socket();
229 void release_socket();
232 bool is_tcp[SOCKET_MAX];
233 //struct sockaddr_in udpaddr[SOCKET_MAX];
234 int socket_delay[SOCKET_MAX];
235 char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX];
236 int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX];
239 virtual void vm_draw_screen(void);
240 virtual double vm_frame_rate(void);
241 virtual Sint16* create_sound(int *extra_frames);
242 virtual bool get_use_socket(void);
243 virtual bool get_support_variable_timing(void);
244 virtual bool get_notify_key_down(void);
245 virtual bool get_notify_key_down_lr_shift(void);
246 virtual bool get_notify_key_down_lr_control(void);
247 virtual bool get_notify_key_down_lr_menu(void);
248 virtual bool get_use_shift_numpad_key(void);
249 virtual bool get_use_auto_key(void);
250 virtual bool get_dont_keeep_key_pressed(void);
251 virtual bool get_one_board_micro_computer(void);
252 virtual bool get_use_screen_rotate(void);
253 virtual bool get_use_movie_player(void);
254 virtual bool get_use_video_capture(void);
255 virtual void vm_key_down(int code, bool flag);
256 virtual void vm_key_up(int code);
257 virtual void vm_reset(void);
258 virtual void update_buttons(bool press_flag, bool release_flag);
259 virtual int get_screen_width(void);
260 virtual int get_screen_height(void);
261 virtual int get_vm_buttons_code(int num);
270 class Ui_MainWindow *main_window_handle;
275 virtual void initialize(int rate, int samples);
276 virtual void release();
277 virtual void power_off();
280 _TCHAR* application_path();
281 _TCHAR* bios_path(const _TCHAR* file_name);
282 void get_host_time(cur_time_t* time);
283 void sleep(uint32_t ms);
284 void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
287 void open_console(_TCHAR* title);
288 void close_console();
289 unsigned int get_console_code_page();
290 bool is_console_active();
291 void set_console_text_attribute(unsigned short attr);
292 void write_console(_TCHAR* buffer, unsigned int length);
293 int read_console_input(_TCHAR* buffer);
294 bool is_console_key_pressed(uint32_t ch);
298 void key_down(int code, bool repeat);
299 void key_up(int code);
300 void key_down_native(int code, bool repeat);
301 void key_up_native(int code);
302 void key_lost_focus();
303 void press_button(int num);
305 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
306 uint16_t GetAsyncKeyState(uint32_t vk); // Win32 GetAsyncKeyState() wrappeer.
308 void key_modifiers(uint32_t mod);
310 void disable_mouse();
312 bool is_mouse_enabled();
313 //QImage *getPseudoVramClass(void) { return pPseudoVram;}
314 void set_mouse_pointer(int x, int y);
315 void set_mouse_button(int button);
316 int get_mouse_button();
317 void modify_key_buffer(int code, uint8_t val);
318 uint8_t* get_key_buffer();
319 uint32_t* get_joy_buffer();
320 int* get_mouse_buffer();
322 void reset_printer();
323 void update_printer();
324 void printer_out(uint8_t value);
325 void printer_strobe(bool value);
327 void initialize_printer();
328 void release_printer();
329 void open_printer_file();
330 void close_printer_file();
333 int get_window_mode_width(int mode);
334 int get_window_mode_height(int mode);
335 void set_host_window_size(int window_width, int window_height, bool window_mode);
336 void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height);
337 int get_vm_window_width();
338 int get_vm_window_height();
339 int get_vm_window_width_aspect();
340 int get_vm_window_height_aspect();
341 scrntype_t* get_vm_screen_buffer(int y);
343 void reload_bitmap();
344 void capture_screen();
345 bool start_record_video(int fps);
346 void stop_record_video();
347 void restart_record_video();
348 void add_extra_frames(int extra_frames);
349 bool now_record_video;
350 bool screen_skip_line;
352 void update_sound(int* extra_frames);
355 void start_record_sound();
356 void stop_record_sound();
357 void restart_record_sound();
358 bool now_record_sound;
359 int get_sound_rate();
361 // common video device
362 void get_video_buffer();
363 void mute_video_dev(bool l, bool r);
364 bool open_movie_file(const _TCHAR* file_path);
365 void close_movie_file();
369 double get_movie_frame_rate();
370 int get_movie_sound_rate();
371 void set_cur_movie_frame(int frame, bool relative);
372 uint32_t get_cur_movie_frame();
373 bool now_movie_play, now_movie_pause;
374 int get_cur_capture_dev_index();
375 int get_num_capture_devs();
376 _TCHAR* get_capture_dev_name(int index);
377 void open_capture_dev(int index, bool pin);
378 void close_capture_dev();
379 void show_capture_dev_filter();
380 void show_capture_dev_pin();
381 void show_capture_dev_source();
382 void set_capture_dev_channel(int ch);
385 void create_bitmap(bitmap_t *bitmap, int width, int height);
386 void release_bitmap(bitmap_t *bitmap);
387 void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
388 void release_font(font_t *font);
389 void create_pen(pen_t *pen, int width, uint8_t r, uint8_t g, uint8_t b);
390 void release_pen(pen_t *pen);
392 void clear_bitmap(bitmap_t *bitmap, uint8_t r, uint8_t g, uint8_t b);
393 int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
395 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);
396 void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
397 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);
398 void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b);
400 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);
401 void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
404 int get_socket(int ch);
405 void notify_socket_connected(int ch);
406 void notify_socket_disconnected(int ch);
407 void update_socket();
408 bool initialize_socket_tcp(int ch);
409 bool initialize_socket_udp(int ch);
410 bool connect_socket(int ch, uint32_t ipaddr, int port);
411 void disconnect_socket(int ch);
412 bool listen_socket(int ch);
413 void send_socket_data_tcp(int ch);
414 void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
415 void send_socket_data(int ch);
416 void recv_socket_data(int ch);
419 void update_screen();
420 void set_parent_thread(EmuThreadClass *parent);
421 EmuThreadClass *get_parent_handler();
423 _TCHAR *console_input_string(void);
424 void clear_console_input_string(void);
426 virtual void lock_vm(void);
427 virtual void unlock_vm(void);
428 virtual void force_unlock_vm(void);
429 virtual bool is_vm_locked(void);
430 virtual void set_draw_thread(DrawThreadClass *handler);
431 virtual QString get_vm_config_name(void);
434 void do_write_inputdata(QString s);
435 void do_set_input_string(QString s);
436 void close_debugger_console();
437 void do_close_debugger_thread();
438 void do_assign_js_setting(int jsnum, int axis_idx, int assigned_value);
441 int sig_update_screen(bitmap_t *);
442 int sig_save_screen(const char *);
443 int sig_close_window(void);
444 int sig_resize_vm_screen(QImage *, int, int);
445 int sig_put_string_debugger(QString);
446 int sig_console_input_string(QString);
447 int sig_enqueue_video(QByteArray *data, int width, int height);
448 int sig_enqueue_audio(QByteArray *data);
449 int sig_debugger_finished();