2 Skelton for retropc emulator
4 Author : K.Ohta <whatisthis.sowhat _at_ gmail.com>
19 #include <QElapsedTimer>
23 #include "simd_types.h"
27 //#include "../vm/vm.h"
29 #include "../config.h"
30 #include "../fileio.h"
32 #if !defined(Q_OS_WIN32)
37 #define SOCKET_BUFFER_MAX 0x100000
39 #include "osd_types.h"
42 #define WM_RESIZE (WM_USER + 1)
43 #define WM_SOCKET0 (WM_USER + 2)
44 #define WM_SOCKET1 (WM_USER + 3)
45 #define WM_SOCKET2 (WM_USER + 4)
46 #define WM_SOCKET3 (WM_USER + 5)
48 //#ifdef USE_VIDEO_CAPTURE
49 #define MAX_CAPTURE_DEVS 8
53 //#include "mainwidget.h"
54 #include "agar_logger.h"
58 class DrawThreadClass;
66 class OSD : public QThread
72 EmuThreadClass *parent_thread;
73 QSemaphore *VMSemaphore;
74 QSemaphore *DebugSemaphore;
75 sdl_snddata_t snddata;
77 _TCHAR app_path[_MAX_PATH];
78 QElapsedTimer osd_timer;
82 FILE *hStdIn, *hStdOut;
83 QString console_cmd_str;
84 bool osd_console_opened;
86 void initialize_input();
88 void key_down_sub(int code, bool repeat);
89 void key_up_sub(int code);
90 CSP_KeyTables *key_table;
92 scrntype_t *get_buffer(bitmap_t *p, int y);
94 // bool dinput_joy_ok;
96 uint8_t keycode_conv[256];
97 uint8_t key_status[256]; // windows key code mapping
98 uint8_t key_dik_prev[256];
99 //#ifdef USE_SHIFT_NUMPAD_KEY
100 uint8_t key_converted[256];
101 bool key_shift_pressed, key_shift_released;
103 uint32_t modkey_status;
105 uint32_t joy_status[4]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons
107 uint32_t joy_mask[4];
109 int mouse_status[3]; // x, y, button (b0 = left, b1 = right)
116 Qt::CursorShape mouse_shape;
121 void initialize_screen();
122 void release_screen();
123 void initialize_screen_buffer(bitmap_t *buffer, int width, int height, int mode);
124 void release_screen_buffer(bitmap_t *buffer);
125 //#ifdef USE_SCREEN_ROTATE
126 void rotate_screen_buffer(bitmap_t *source, bitmap_t *dest);
128 void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest);
129 int add_video_frames();
131 bitmap_t vm_screen_buffer;
132 bitmap_t video_screen_buffer;
133 bitmap_t* draw_screen_buffer;
134 int vm_window_width, vm_window_height;
135 int vm_window_width_aspect, vm_window_height_aspect;
137 int host_window_width, host_window_height;
138 bool host_window_mode;
139 int base_window_width, base_window_height;
140 int vm_screen_width, vm_screen_height;
141 int draw_screen_width, draw_screen_height;
144 _TCHAR video_file_name[_MAX_PATH];
146 double rec_video_run_frames;
147 double rec_video_frames;
149 //LPBITMAPINFO lpDibRec;
151 //PAVISTREAM pAVIStream;
152 //PAVISTREAM pAVICompressed;
153 //AVICOMPRESSOPTIONS AVIOpts;
154 uint64_t dwAVIFileSize;
156 //HANDLE hVideoThread;
157 rec_video_thread_param_t rec_video_thread_param;
159 bool first_draw_screen;
160 bool first_invalidate;
161 bool self_invalidate;
164 void initialize_sound(int rate, int samples);
165 void release_sound();
166 static void audio_callback(void *udata, Uint8 *stream, int len);
167 int sound_rate, sound_samples;
168 bool sound_ok, sound_started, now_mute;
169 bool sound_first_half;
171 _TCHAR sound_file_name[_MAX_PATH];
172 FILEIO* rec_sound_fio;
174 int rec_sound_buffer_ptr;
176 int sound_buffer_size;
182 SDL_sem *snd_apply_sem;
183 Sint16 *sound_buf_ptr;
184 Uint8 snd_total_volume;
185 #if defined(USE_SDL2)
186 SDL_AudioDeviceID audio_dev_id;
190 SDL_AudioSpec snd_spec_req, snd_spec_presented;
192 //#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
194 void initialize_video();
195 void release_video();
197 //IGraphBuilder *pGraphBuilder;
198 //IBaseFilter *pVideoBaseFilter;
199 //IBaseFilter *pCaptureBaseFilter;
200 //ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
201 //ISampleGrabber *pVideoSampleGrabber;
202 //IBaseFilter *pSoundBaseFilter;
203 //ISampleGrabber *pSoundSampleGrabber;
204 //CMySampleGrabberCB *pSoundCallBack;
205 //IMediaControl *pMediaControl;
206 //IMediaSeeking *pMediaSeeking;
207 //IMediaPosition *pMediaPosition;
208 //IVideoWindow *pVideoWindow;
209 //IBasicVideo *pBasicVideo;
210 //IBasicAudio *pBasicAudio;
211 //bool bTimeFormatFrame;
212 //bool bVerticalReversed;
214 bitmap_t dshow_screen_buffer;
215 int direct_show_width, direct_show_height;
216 bool direct_show_mute[2];
218 //#ifdef USE_MOVIE_PLAYER
219 double movie_frame_rate;
220 int movie_sound_rate;
222 //#ifdef USE_VIDEO_CAPTURE
223 void enum_capture_devs();
224 bool connect_capture_dev(int index, bool pin);
225 int cur_capture_dev_index;
226 int num_capture_devs;
227 _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];
229 _TCHAR prn_file_name[_MAX_PATH];
231 int prn_data, prn_wait_frames;
236 void initialize_socket();
237 void release_socket();
240 bool is_tcp[SOCKET_MAX];
241 //struct sockaddr_in udpaddr[SOCKET_MAX];
242 int socket_delay[SOCKET_MAX];
243 char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX];
244 int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX];
254 class Ui_MainWindow *main_window_handle;
257 //#ifdef USE_AUTO_KEY
261 void initialize(int rate, int samples);
266 _TCHAR* application_path()
270 _TCHAR* bios_path(const _TCHAR* file_name);
271 void get_host_time(cur_time_t* time);
272 void sleep(uint32_t ms);
273 void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
276 void open_console(_TCHAR* title);
277 void close_console();
278 unsigned int get_console_code_page();
279 bool is_console_active();
280 void set_console_text_attribute(unsigned short attr);
281 void write_console(_TCHAR* buffer, unsigned int length);
282 int read_console_input(_TCHAR* buffer);
283 bool is_console_key_pressed(uint32_t ch);
287 void key_down(int code, bool repeat);
288 void key_up(int code);
289 void key_down_native(int code, bool repeat);
290 void key_up_native(int code);
291 void key_lost_focus()
295 //#ifdef ONE_BOARD_MICRO_COMPUTER
296 void press_button(int num);
298 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
299 uint16_t GetAsyncKeyState(uint32_t vk); // Win32 GetAsyncKeyState() wrappeer.
301 void key_modifiers(uint32_t mod) {
305 void disable_mouse();
307 bool is_mouse_enabled()
309 return mouse_enabled;
311 //QImage *getPseudoVramClass(void) { return pPseudoVram;}
312 void set_mouse_pointer(int x, int y) {
316 void set_mouse_button(int button) {
317 mouse_button = button;
319 int get_mouse_button() {
322 void modify_key_buffer(int code, uint8_t val)
324 key_status[code] = val;
326 uint8_t* get_key_buffer()
330 uint32_t* get_joy_buffer()
334 int* get_mouse_buffer()
340 void reset_printer() {
341 close_printer_file();
345 void update_printer() {
346 if(prn_fio->IsOpened() && --prn_wait_frames == 0) {
347 close_printer_file();
350 void printer_out(uint8_t value) {
353 void printer_strobe(bool value);
355 void initialize_printer();
356 void release_printer();
357 void open_printer_file() {
358 create_date_file_name(prn_file_name, _MAX_PATH, _T("txt"));
359 prn_fio->Fopen(bios_path(prn_file_name), FILEIO_WRITE_BINARY);
362 void close_printer_file() {
363 if(prn_fio->IsOpened()) {
364 // remove if the file size is less than 2 bytes
365 bool remove = (prn_fio->Ftell() < 2);
368 FILEIO::RemoveFile(bios_path(prn_file_name));
374 int get_window_mode_width(int mode);
375 int get_window_mode_height(int mode);
376 void set_host_window_size(int window_width, int window_height, bool window_mode);
377 void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height);
378 int get_vm_window_width()
380 return vm_window_width;
382 int get_vm_window_height()
384 return vm_window_height;
386 int get_vm_window_width_aspect()
388 return vm_window_width_aspect;
390 int get_vm_window_height_aspect()
392 return vm_window_height_aspect;
394 scrntype_t* get_vm_screen_buffer(int y);
396 //#ifdef ONE_BOARD_MICRO_COMPUTER
399 first_invalidate = true;
402 void capture_screen();
403 bool start_record_video(int fps);
404 void stop_record_video();
405 void restart_record_video();
406 void add_extra_frames(int extra_frames);
407 bool now_record_video;
408 //#ifdef USE_CRT_FILTER
409 bool screen_skip_line;
413 void update_sound(int* extra_frames);
416 void start_record_sound();
417 void stop_record_sound();
418 void restart_record_sound();
419 bool now_record_sound;
421 //#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
422 // common video device
423 void get_video_buffer();
424 void mute_video_dev(bool l, bool r);
426 //#ifdef USE_MOVIE_PLAYER
427 bool open_movie_file(const _TCHAR* file_path);
428 void close_movie_file();
432 double get_movie_frame_rate()
434 return movie_frame_rate;
436 int get_movie_sound_rate()
438 return movie_sound_rate;
440 void set_cur_movie_frame(int frame, bool relative);
441 uint32_t get_cur_movie_frame();
442 bool now_movie_play, now_movie_pause;
444 //#ifdef USE_VIDEO_CAPTURE
445 int get_cur_capture_dev_index()
447 return cur_capture_dev_index;
449 int get_num_capture_devs()
451 return num_capture_devs;
453 _TCHAR* get_capture_dev_name(int index)
455 return capture_dev_name[index];
457 void open_capture_dev(int index, bool pin);
458 void close_capture_dev();
459 void show_capture_dev_filter();
460 void show_capture_dev_pin();
461 void show_capture_dev_source();
462 void set_capture_dev_channel(int ch);
467 void create_bitmap(bitmap_t *bitmap, int width, int height);
468 void release_bitmap(bitmap_t *bitmap);
469 void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
470 void release_font(font_t *font);
471 void create_pen(pen_t *pen, int width, uint8_t r, uint8_t g, uint8_t b);
472 void release_pen(pen_t *pen);
474 void clear_bitmap(bitmap_t *bitmap, uint8_t r, uint8_t g, uint8_t b);
475 int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
477 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);
478 void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
479 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);
480 void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b);
482 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);
484 void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
488 int get_socket(int ch)
492 void notify_socket_connected(int ch);
493 void notify_socket_disconnected(int ch);
494 void update_socket();
495 bool initialize_socket_tcp(int ch);
496 bool initialize_socket_udp(int ch);
497 bool connect_socket(int ch, uint32_t ipaddr, int port);
498 void disconnect_socket(int ch);
499 bool listen_socket(int ch);
500 void send_socket_data_tcp(int ch);
501 void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
502 void send_socket_data(int ch);
503 void recv_socket_data(int ch);
507 void update_screen();
508 void set_parent_thread(EmuThreadClass *parent);
509 EmuThreadClass *get_parent_handler();
510 void set_draw_thread(DrawThreadClass *handler);
511 _TCHAR *console_input_string(void);
512 void clear_console_input_string(void);
514 void unlock_vm(void);
515 void force_unlock_vm(void);
516 bool is_vm_locked(void);
519 void do_write_inputdata(QString s);
520 void do_set_input_string(QString s);
521 void close_debugger_console();
522 void do_close_debugger_thread();
523 void do_assign_js_setting(int jsnum, int axis_idx, int assigned_value);
526 int sig_update_screen(bitmap_t *);
527 int sig_save_screen(const char *);
528 int sig_close_window(void);
529 int sig_resize_vm_screen(QImage *, int, int);
530 int sig_put_string_debugger(QString);
531 int sig_console_input_string(QString);
532 int sig_debugger_finished();