2 Skelton for retropc emulator
4 Author : K.Ohta <whatisthis.sowhat _at_ gmail.com>
25 #include "../config.h"
26 #include "../fileio.h"
28 #if !defined(Q_OS_WIN32)
37 SDL_sem **pSndApplySem;
45 #if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
46 ISampleGrabberCB : public IUnknown {
48 virtual HRESULT STDMETHODCALLTYPE SampleCB( double SampleTime,IMediaSample *pSample) = 0;
49 virtual HRESULT STDMETHODCALLTYPE BufferCB( double SampleTime,BYTE *pBuffer,long BufferLen) = 0;
51 EXTERN_C const IID IID_ISampleGrabber;
52 MIDL_INTERFACE("6B652FFF-11FE-4fce-92AD-0266B5D7C78F")
53 ISampleGrabber : public IUnknown {
55 virtual HRESULT STDMETHODCALLTYPE SetOneShot( BOOL OneShot) = 0;
56 virtual HRESULT STDMETHODCALLTYPE SetMediaType( const AM_MEDIA_TYPE *pType) = 0;
57 virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( AM_MEDIA_TYPE *pType) = 0;
58 virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( BOOL BufferThem) = 0;
59 virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( /* [out][in] */ long *pBufferSize,/* [out] */ long *pBuffer) = 0;
60 virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( /* [retval][out] */ IMediaSample **ppSample) = 0;
61 virtual HRESULT STDMETHODCALLTYPE SetCallback( ISampleGrabberCB *pCallback,long WhichMethodToCallback) = 0;
64 #ifdef USE_MOVIE_PLAYER
65 class CMySampleGrabberCB : public ISampleGrabberCB {
69 CMySampleGrabberCB(VM *vm_ptr)
73 STDMETHODIMP_(ULONG) AddRef()
77 STDMETHODIMP_(ULONG) Release()
81 STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
83 if(riid == IID_ISampleGrabberCB || riid == IID_IUnknown) {
84 *ppv = (void *) static_cast<ISampleGrabberCB*>(this);
89 STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample)
93 STDMETHODIMP BufferCB(double dblSampleTime, BYTE *pBuffer, long lBufferSize)
95 vm->movie_sound_callback(pBuffer, lBufferSize);
102 #define WM_RESIZE (WM_USER + 1)
103 #define WM_SOCKET0 (WM_USER + 2)
104 #define WM_SOCKET1 (WM_USER + 3)
105 #define WM_SOCKET2 (WM_USER + 4)
106 #define WM_SOCKET3 (WM_USER + 5)
110 #define SOCKET_BUFFER_MAX 0x100000
113 #ifdef USE_VIDEO_CAPTURE
114 #define MAX_CAPTURE_DEVS 8
117 // check memory leaks
119 //#define _CRTDBG_MAP_ALLOC
120 //#include <crtdbg.h>
121 //#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
122 //#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
126 typedef struct bitmap_s {
129 scrntype *get_buffer(int y) {
130 return (scrntype *)pImage.scanLine(y);
136 typedef struct font_s {
143 bool initialized(void) {
150 typedef struct pen_s {
160 //PAVISTREAM pAVICompressed;
162 //LPBITMAPINFOHEADER pbmInfoHeader;
167 } rec_video_thread_param_t;
170 #include "mainwidget.h"
171 #include "agar_logger.h"
174 class EmuThreadClass;
175 class DrawThreadClass;
182 class OSD : public QThread
188 EmuThreadClass *parent_thread;
189 QSemaphore *VMSemaphore;
190 _TCHAR auto_key_str[2048];
191 sdl_snddata_t snddata;
193 _TCHAR app_path[_MAX_PATH];
196 FILE *hStdIn, *hStdOut;
197 char console_string[128];
198 bool osd_console_opened;
200 void initialize_input();
201 void release_input();
202 void key_down_sub(int code, bool repeat);
203 void key_up_sub(int code);
204 scrntype *get_buffer(bitmap_t *p, int y);
206 // bool dinput_joy_ok;
208 uint8 keycode_conv[256];
209 uint8 key_status[256]; // windows key code mapping
210 uint8 key_dik_prev[256];
211 #ifdef USE_SHIFT_NUMPAD_KEY
212 uint8 key_converted[256];
213 bool key_shift_pressed, key_shift_released;
215 uint32_t modkey_status;
218 uint32 joy_status[2]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons
222 int mouse_status[3]; // x, y, button (b0 = left, b1 = right)
229 Qt::CursorShape mouse_shape;
232 FIFO* autokey_buffer;
233 int autokey_phase, autokey_shift;
234 int autokey_table[256];
240 void initialize_screen();
241 void release_screen();
242 void initialize_screen_buffer(bitmap_t *buffer, int width, int height, int mode);
243 void release_screen_buffer(bitmap_t *buffer);
244 #ifdef USE_SCREEN_ROTATE
245 void rotate_screen_buffer(bitmap_t *source, bitmap_t *dest);
247 void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest);
248 int add_video_frames();
250 bitmap_t vm_screen_buffer;
251 bitmap_t video_screen_buffer;
252 bitmap_t* draw_screen_buffer;
254 int host_window_width, host_window_height;
255 bool host_window_mode;
256 int base_window_width, base_window_height;
257 int vm_screen_width, vm_screen_height, vm_screen_width_aspect, vm_screen_height_aspect;
258 int draw_screen_width, draw_screen_height;
261 _TCHAR video_file_name[_MAX_PATH];
263 double rec_video_run_frames;
264 double rec_video_frames;
266 //LPBITMAPINFO lpDibRec;
268 //PAVISTREAM pAVIStream;
269 //PAVISTREAM pAVICompressed;
270 //AVICOMPRESSOPTIONS AVIOpts;
273 //HANDLE hVideoThread;
274 rec_video_thread_param_t rec_video_thread_param;
276 bool first_draw_screen;
277 bool first_invalidate;
278 bool self_invalidate;
281 void initialize_sound(int rate, int samples);
282 void release_sound();
284 int sound_rate, sound_samples;
285 bool sound_ok, sound_started, now_mute;
286 bool sound_first_half;
288 _TCHAR sound_file_name[_MAX_PATH];
289 FILEIO* rec_sound_fio;
291 int rec_sound_buffer_ptr;
294 #if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
296 void initialize_video();
297 void release_video();
299 //IGraphBuilder *pGraphBuilder;
300 //IBaseFilter *pVideoBaseFilter;
301 //IBaseFilter *pCaptureBaseFilter;
302 //ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
303 //ISampleGrabber *pVideoSampleGrabber;
304 //IBaseFilter *pSoundBaseFilter;
305 //ISampleGrabber *pSoundSampleGrabber;
306 //CMySampleGrabberCB *pSoundCallBack;
307 //IMediaControl *pMediaControl;
308 //IMediaSeeking *pMediaSeeking;
309 //IMediaPosition *pMediaPosition;
310 //IVideoWindow *pVideoWindow;
311 //IBasicVideo *pBasicVideo;
312 //IBasicAudio *pBasicAudio;
313 //bool bTimeFormatFrame;
314 //bool bVerticalReversed;
316 bitmap_t dshow_screen_buffer;
317 int direct_show_width, direct_show_height;
318 bool direct_show_mute[2];
320 #ifdef USE_MOVIE_PLAYER
321 double movie_frame_rate;
322 int movie_sound_rate;
324 #ifdef USE_VIDEO_CAPTURE
325 void enum_capture_devs();
326 bool connect_capture_dev(int index, bool pin);
327 int cur_capture_dev_index;
328 int num_capture_devs;
329 _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];
331 _TCHAR prn_file_name[_MAX_PATH];
333 int prn_data, prn_wait_frames;
338 void initialize_socket();
339 void release_socket();
342 bool is_tcp[SOCKET_MAX];
343 //struct sockaddr_in udpaddr[SOCKET_MAX];
344 int socket_delay[SOCKET_MAX];
345 char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX];
346 int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX];
356 class Ui_MainWindow *main_window_handle;
360 void initialize(int rate, int samples);
365 _TCHAR* application_path()
369 _TCHAR* bios_path(const _TCHAR* file_name);
370 void get_host_time(cur_time_t* time);
371 void sleep(uint32 ms);
372 void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
375 void open_console(_TCHAR* title);
376 void close_console();
377 unsigned int get_console_code_page();
378 bool is_console_active();
379 void set_console_text_attribute(unsigned short attr);
380 void write_console(_TCHAR* buffer, unsigned int length);
381 int read_console_input(_TCHAR* buffer);
385 void key_down(int code, bool repeat);
386 void key_up(int code);
387 void key_lost_focus()
391 #ifdef ONE_BOARD_MICRO_COMPUTER
392 void press_button(int num);
394 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
395 uint16_t GetAsyncKeyState(uint32_t vk); // Win32 GetAsyncKeyState() wrappeer.
397 void key_modifiers(uint32 mod) {
401 void disenable_mouse();
403 bool get_mouse_enabled()
405 return mouse_enabled;
407 //QImage *getPseudoVramClass(void) { return pPseudoVram;}
408 void set_mouse_pointer(int x, int y) {
412 void set_mouse_button(int button) {
413 mouse_button = button;
415 int get_mouse_button() {
419 void start_auto_key();
420 void stop_auto_key();
423 return (autokey_phase != 0);
440 void reset_printer() {
441 close_printer_file();
445 void update_printer() {
446 if(prn_fio->IsOpened() && --prn_wait_frames == 0) {
447 close_printer_file();
450 void printer_out(uint8 value) {
453 void printer_strobe(bool value) {
454 bool falling = (prn_strobe && !value);
458 if(!prn_fio->IsOpened()) {
464 prn_fio->Fputc(prn_data);
466 #ifdef SUPPORT_VARIABLE_TIMING
467 prn_wait_frames = (int)(vm->frame_rate() * 10.0 + 0.5);
469 prn_wait_frames = (int)(FRAMES_PER_SEC * 10.0 + 0.5);
474 void initialize_printer();
475 void release_printer();
476 void open_printer_file() {
477 create_date_file_name(prn_file_name, _MAX_PATH, _T("txt"));
478 prn_fio->Fopen(bios_path(prn_file_name), FILEIO_WRITE_BINARY);
481 void close_printer_file() {
482 if(prn_fio->IsOpened()) {
483 // remove if the file size is less than 2 bytes
484 bool remove = (prn_fio->Ftell() < 2);
487 FILEIO::RemoveFile(bios_path(prn_file_name));
493 int get_window_width(int mode);
494 int get_window_height(int mode);
495 void set_window_size(int window_width, int window_height, bool window_mode);
496 void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height);
497 scrntype* get_vm_screen_buffer(int y);
499 #ifdef ONE_BOARD_MICRO_COMPUTER
502 first_invalidate = true;
505 void capture_screen();
506 bool start_rec_video(int fps);
507 void stop_rec_video();
508 void restart_rec_video();
509 void add_extra_frames(int extra_frames);
511 #ifdef USE_CRT_FILTER
512 bool screen_skip_line;
516 void update_sound(int* extra_frames);
519 void start_rec_sound();
520 void stop_rec_sound();
521 void restart_rec_sound();
524 #if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
525 // common video device
526 void get_video_buffer();
527 void mute_video_dev(bool l, bool r);
529 #ifdef USE_MOVIE_PLAYER
530 bool open_movie_file(const _TCHAR* file_path);
531 void close_movie_file();
535 double get_movie_frame_rate()
537 return movie_frame_rate;
539 int get_movie_sound_rate()
541 return movie_sound_rate;
543 void set_cur_movie_frame(int frame, bool relative);
544 uint32 get_cur_movie_frame();
545 bool now_movie_play, now_movie_pause;
547 #ifdef USE_VIDEO_CAPTURE
548 int get_cur_capture_dev_index()
550 return cur_capture_dev_index;
552 int get_num_capture_devs()
554 return num_capture_devs;
556 _TCHAR* get_capture_dev_name(int index)
558 return capture_dev_name[index];
560 void open_capture_dev(int index, bool pin);
561 void close_capture_dev();
562 void show_capture_dev_filter();
563 void show_capture_dev_pin();
564 void show_capture_dev_source();
565 void set_capture_dev_channel(int ch);
570 void create_bitmap(bitmap_t *bitmap, int width, int height);
571 void release_bitmap(bitmap_t *bitmap);
572 void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
573 void release_font(font_t *font);
574 void create_pen(pen_t *pen, int width, uint8 r, uint8 g, uint8 b);
575 void release_pen(pen_t *pen);
577 void clear_bitmap(bitmap_t *bitmap, uint8 r, uint8 g, uint8 b);
578 int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
580 void draw_text_to_bitmap(bitmap_t *bitmap, font_t *font, int x, int y, const _TCHAR *text, uint8 r, uint8 g, uint8 b);
581 void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
582 void draw_rectangle_to_bitmap(bitmap_t *bitmap, int x, int y, int width, int height, uint8 r, uint8 g, uint8 b);
583 void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8 r, uint8 g, uint8 b);
585 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);
587 void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
591 int get_socket(int ch)
595 void socket_connected(int ch);
596 void socket_disconnected(int ch);
597 void update_socket();
598 bool init_socket_tcp(int ch);
599 bool init_socket_udp(int ch);
600 bool connect_socket(int ch, uint32 ipaddr, int port);
601 void disconnect_socket(int ch);
602 bool listen_socket(int ch);
603 void send_data_tcp(int ch);
604 void send_data_udp(int ch, uint32 ipaddr, int port);
605 void send_data(int ch);
606 void recv_data(int ch);
610 void update_screen();
611 void set_parent_thread(EmuThreadClass *parent);
612 EmuThreadClass *get_parent_handler();
613 void set_draw_thread(DrawThreadClass *handler);
614 _TCHAR *console_input_string(void);
615 void clear_console_input_string(void);
617 void unlock_vm(void);
618 void force_unlock_vm(void);
622 void set_auto_key_string(QByteArray);
624 void do_write_inputdata(QString s);
625 void do_set_input_string(QString s);
626 void do_close_debugger_console();
627 void do_close_debugger_thread();
630 int sig_update_screen(bitmap_t *);
631 int sig_save_screen(const char *);
632 int sig_close_window(void);
633 int sig_resize_vm_screen(QImage *, int, int);
634 int sig_put_string_debugger(QString);
635 int sig_console_input_string(QString);
636 int sig_debugger_finished();