X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fqt%2Fosd.h;h=38d19c6ea49eded63cfad4195b5ceefe3b79c3dd;hb=ec501682b3c2d970c7703b5e507951577e5d886c;hp=1ac3aa6218424321ab54b952cd7ed03765632945;hpb=26f3ced80a6b679371975e68318d3348697e2fe6;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/qt/osd.h b/source/src/qt/osd.h index 1ac3aa621..38d19c6ea 100644 --- a/source/src/qt/osd.h +++ b/source/src/qt/osd.h @@ -15,10 +15,16 @@ #include #include #include +#include +#include +#include + #include +#include "simd_types.h" + #include -#include "../vm/vm.h" +//#include "../vm/vm.h" //#include "../emu.h" #include "../config.h" #include "../fileio.h" @@ -26,76 +32,10 @@ #if !defined(Q_OS_WIN32) #include "qt_input.h" #endif +#define SOCKET_MAX 4 +#define SOCKET_BUFFER_MAX 0x100000 +#include "osd_types.h" -typedef struct { - Sint16 **pSoundBuf; - int *uBufSize; - int *nSndWritePos; - int *nSndDataLen; - SDL_sem **pSndApplySem; - Uint8 *iTotalVolume; - bool *bSndExit; - bool *bSoundDebug; -} sdl_snddata_t; - - -#if 0 // TODO -#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE) -ISampleGrabberCB : public IUnknown { -public: - virtual HRESULT STDMETHODCALLTYPE SampleCB( double SampleTime,IMediaSample *pSample) = 0; - virtual HRESULT STDMETHODCALLTYPE BufferCB( double SampleTime,BYTE *pBuffer,long BufferLen) = 0; -}; -EXTERN_C const IID IID_ISampleGrabber; -MIDL_INTERFACE("6B652FFF-11FE-4fce-92AD-0266B5D7C78F") -ISampleGrabber : public IUnknown { -public: - virtual HRESULT STDMETHODCALLTYPE SetOneShot( BOOL OneShot) = 0; - virtual HRESULT STDMETHODCALLTYPE SetMediaType( const AM_MEDIA_TYPE *pType) = 0; - virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( AM_MEDIA_TYPE *pType) = 0; - virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( BOOL BufferThem) = 0; - virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( /* [out][in] */ long *pBufferSize,/* [out] */ long *pBuffer) = 0; - virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( /* [retval][out] */ IMediaSample **ppSample) = 0; - virtual HRESULT STDMETHODCALLTYPE SetCallback( ISampleGrabberCB *pCallback,long WhichMethodToCallback) = 0; -}; -#endif -#ifdef USE_MOVIE_PLAYER -class CMySampleGrabberCB : public ISampleGrabberCB { -private: - VM *vm; -public: - CMySampleGrabberCB(VM *vm_ptr) - { - vm = vm_ptr; - } - STDMETHODIMP_(ULONG) AddRef() - { - return 2; - } - STDMETHODIMP_(ULONG) Release() - { - return 1; - } - STDMETHODIMP QueryInterface(REFIID riid, void **ppv) - { - if(riid == IID_ISampleGrabberCB || riid == IID_IUnknown) { - *ppv = (void *) static_cast(this); - return NOERROR; - } - return E_NOINTERFACE; - } - STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample) - { - return S_OK; - } - STDMETHODIMP BufferCB(double dblSampleTime, BYTE *pBuffer, long lBufferSize) - { - vm->movie_sound_callback(pBuffer, lBufferSize); - return S_OK; - } -}; -#endif -#endif #define WM_RESIZE (WM_USER + 1) #define WM_SOCKET0 (WM_USER + 2) @@ -103,44 +43,12 @@ public: #define WM_SOCKET2 (WM_USER + 4) #define WM_SOCKET3 (WM_USER + 5) -#ifdef USE_SOCKET -#define SOCKET_MAX 4 -#define SOCKET_BUFFER_MAX 0x100000 -#endif - -#ifdef USE_VIDEO_CAPTURE +//#ifdef USE_VIDEO_CAPTURE #define MAX_CAPTURE_DEVS 8 -#endif - -// check memory leaks -#ifdef _DEBUG -//#define _CRTDBG_MAP_ALLOC -//#include -//#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__) -//#define new new(_NORMAL_BLOCK, __FILE__, __LINE__) -#endif - -typedef struct screen_buffer_s { - int width, height; - //HBITMAP hBmp, hOldBmp; - //LPBYTE lpBuf; - scrntype* lpBuf; - QImage pImage; -} screen_buffer_t; - -typedef struct { - //PAVISTREAM pAVICompressed; - scrntype* lpBmp; - //LPBITMAPINFOHEADER pbmInfoHeader; - DWORD dwAVIFileSize; - UINT64 lAVIFrames; - int frames; - int result; -} rec_video_thread_param_t; +//#endif #include "qt_main.h" -#include "mainwidget.h" -#include "qt_gldraw.h" +//#include "mainwidget.h" #include "agar_logger.h" class GLDrawClass; @@ -150,47 +58,49 @@ class Ui_MainWindow; class EMU; class VM; class FIFO; +class CSP_KeyTables; QT_BEGIN_NAMESPACE class OSD : public QThread { Q_OBJECT protected: -// VM* vm; -// EMU* emu; EmuThreadClass *parent_thread; QSemaphore *VMSemaphore; - _TCHAR auto_key_str[2048]; + QSemaphore *DebugSemaphore; sdl_snddata_t snddata; private: _TCHAR app_path[_MAX_PATH]; + QElapsedTimer osd_timer; + bool locked_vm; // console FILE *hStdIn, *hStdOut; - FIFO *osd_console_input; + QString console_cmd_str; bool osd_console_opened; // input void initialize_input(); void release_input(); void key_down_sub(int code, bool repeat); void key_up_sub(int code); - scrntype *get_buffer(screen_buffer_t *p, int y); + CSP_KeyTables *key_table; + + scrntype_t *get_buffer(bitmap_t *p, int y); bool dinput_key_ok; // bool dinput_joy_ok; - uint8 keycode_conv[256]; - uint8 key_status[256]; // windows key code mapping - uint8 key_dik_prev[256]; -#ifdef USE_SHIFT_NUMPAD_KEY - uint8 key_converted[256]; + uint8_t keycode_conv[256]; + uint8_t key_status[256]; // windows key code mapping + uint8_t key_dik_prev[256]; + uint8_t key_converted[256]; bool key_shift_pressed, key_shift_released; -#endif + + uint32_t modkey_status; bool lost_focus; - - uint32 joy_status[2]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons + uint32_t joy_status[4]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons int joy_num; - uint32 joy_mask[2]; + uint32_t joy_mask[4]; int mouse_status[3]; // x, y, button (b0 = left, b1 = right) bool mouse_enabled; @@ -201,44 +111,28 @@ protected: int mouse_oldy; Qt::CursorShape mouse_shape; -#ifdef USE_AUTO_KEY - FIFO* autokey_buffer; - int autokey_phase, autokey_shift; - int autokey_table[256]; -#endif - // printer // screen void initialize_screen(); void release_screen(); - void initialize_screen_buffer(screen_buffer_t *buffer, int width, int height, int mode); - void release_screen_buffer(screen_buffer_t *buffer); -#ifdef USE_CRT_FILTER - void apply_crt_fileter_to_screen_buffer(screen_buffer_t *source, screen_buffer_t *dest); - void apply_crt_filter_x3_y3(screen_buffer_t *source, screen_buffer_t *dest); - void apply_crt_filter_x3_y2(screen_buffer_t *source, screen_buffer_t *dest); - void apply_crt_filter_x2_y3(screen_buffer_t *source, screen_buffer_t *dest); - void apply_crt_filter_x2_y2(screen_buffer_t *source, screen_buffer_t *dest); - void apply_crt_filter_x1_y1(screen_buffer_t *source, screen_buffer_t *dest); -#endif -#ifdef USE_SCREEN_ROTATE - void rotate_screen_buffer(screen_buffer_t *source, screen_buffer_t *dest); -#endif - void stretch_screen_buffer(screen_buffer_t *source, screen_buffer_t *dest); + void initialize_screen_buffer(bitmap_t *buffer, int width, int height, int mode); + void release_screen_buffer(bitmap_t *buffer); + void rotate_screen_buffer(bitmap_t *source, bitmap_t *dest); + + void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest); int add_video_frames(); - screen_buffer_t vm_screen_buffer; - screen_buffer_t video_screen_buffer; -#ifdef USE_CRT_FILTER - screen_buffer_t filtered_screen_buffer; -#endif - screen_buffer_t* draw_screen_buffer; + bitmap_t vm_screen_buffer; + bitmap_t video_screen_buffer; + bitmap_t* draw_screen_buffer; + int vm_window_width, vm_window_height; + int vm_window_width_aspect, vm_window_height_aspect; int host_window_width, host_window_height; bool host_window_mode; int base_window_width, base_window_height; - int vm_screen_width, vm_screen_height, vm_screen_width_aspect, vm_screen_height_aspect; + int vm_screen_width, vm_screen_height; int draw_screen_width, draw_screen_height; @@ -252,8 +146,8 @@ protected: //PAVISTREAM pAVIStream; //PAVISTREAM pAVICompressed; //AVICOMPRESSOPTIONS AVIOpts; - DWORD dwAVIFileSize; - UINT64 lAVIFrames; + uint64_t dwAVIFileSize; + uint64_t lAVIFrames; //HANDLE hVideoThread; rec_video_thread_param_t rec_video_thread_param; @@ -264,7 +158,7 @@ protected: // sound void initialize_sound(int rate, int samples); void release_sound(); - + static void audio_callback(void *udata, Uint8 *stream, int len); int sound_rate, sound_samples; bool sound_ok, sound_started, now_mute; bool sound_first_half; @@ -274,8 +168,22 @@ protected: int rec_sound_bytes; int rec_sound_buffer_ptr; + int sound_buffer_size; + int sound_data_len; + int sound_data_pos; + int sound_write_pos; + bool sound_exit; + bool sound_debug; + SDL_sem *snd_apply_sem; + Sint16 *sound_buf_ptr; + Uint8 snd_total_volume; +#if defined(USE_SDL2) + SDL_AudioDeviceID audio_dev_id; +#else + int audio_dev_id; +#endif + SDL_AudioSpec snd_spec_req, snd_spec_presented; -#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE) // video device void initialize_video(); void release_video(); @@ -297,28 +205,25 @@ protected: //bool bTimeFormatFrame; //bool bVerticalReversed; - screen_buffer_t dshow_screen_buffer; + bitmap_t dshow_screen_buffer; int direct_show_width, direct_show_height; bool direct_show_mute[2]; -#endif -#ifdef USE_MOVIE_PLAYER + double movie_frame_rate; int movie_sound_rate; -#endif -#ifdef USE_VIDEO_CAPTURE + void enum_capture_devs(); bool connect_capture_dev(int index, bool pin); int cur_capture_dev_index; int num_capture_devs; _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256]; -#endif + _TCHAR prn_file_name[_MAX_PATH]; FILEIO *prn_fio; int prn_data, prn_wait_frames; bool prn_strobe; // socket -#ifdef USE_SOCKET void initialize_socket(); void release_socket(); @@ -328,8 +233,33 @@ protected: int socket_delay[SOCKET_MAX]; char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX]; int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX]; -#endif - + + // wrapper + void vm_draw_screen(void); + double vm_frame_rate(void); + Sint16* create_sound(int *extra_frames); + bool get_use_socket(void); + bool get_support_variable_timing(void); + bool get_notify_key_down(void); + bool get_notify_key_down_lr_shift(void); + bool get_notify_key_down_lr_control(void); + bool get_notify_key_down_lr_menu(void); + bool get_use_shift_numpad_key(void); + bool get_use_auto_key(void); + bool get_dont_keeep_key_pressed(void); + bool get_one_board_micro_computer(void); + bool get_use_screen_rotate(void); + bool get_use_movie_player(void); + bool get_use_video_capture(void); + void vm_key_down(int code, bool flag); + void vm_key_up(int code); + void vm_reset(void); + void update_buttons(void); + QString get_vm_config_name(void); + int get_screen_width(void); + int get_screen_height(void); + int get_vm_buttons_code(int num); + public: OSD(); ~OSD(); @@ -340,6 +270,7 @@ public: class Ui_MainWindow *main_window_handle; GLDrawClass *glv; int host_cpus; + bool now_auto_key; void initialize(int rate, int samples); void release(); @@ -352,7 +283,7 @@ public: } _TCHAR* bios_path(const _TCHAR* file_name); void get_host_time(cur_time_t* time); - void sleep(uint32 ms); + void sleep(uint32_t ms); void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension); // common console @@ -363,32 +294,34 @@ public: void set_console_text_attribute(unsigned short attr); void write_console(_TCHAR* buffer, unsigned int length); int read_console_input(_TCHAR* buffer); + bool is_console_key_pressed(uint32_t ch); // common input void update_input(); void key_down(int code, bool repeat); void key_up(int code); + void key_down_native(int code, bool repeat); + void key_up_native(int code); void key_lost_focus() { lost_focus = true; } -#ifdef ONE_BOARD_MICRO_COMPUTER void press_button(int num); -#endif + # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN) uint16_t GetAsyncKeyState(uint32_t vk); // Win32 GetAsyncKeyState() wrappeer. # endif - void key_modifiers(uint32 mod) { + void key_modifiers(uint32_t mod) { modkey_status = mod; } void enable_mouse(); - void disenable_mouse(); + void disable_mouse(); void toggle_mouse(); - bool get_mouse_enabled() + bool is_mouse_enabled() { return mouse_enabled; } - //QImage *getPseudoVramClass(void) { return pPseudoVram;} + //QImage *getPseudoVramClass(void) { return pPseudoVram;} void set_mouse_pointer(int x, int y) { mouse_ptrx = x; mouse_ptry = y; @@ -399,23 +332,19 @@ public: int get_mouse_button() { return mouse_button; } -#ifdef USE_AUTO_KEY - void start_auto_key(); - void stop_auto_key(); - bool now_auto_key() + void modify_key_buffer(int code, uint8_t val) { - return (autokey_phase != 0); + key_status[code] = val; } -#endif - uint8* key_buffer() + uint8_t* get_key_buffer() { return key_status; } - uint32* joy_buffer() + uint32_t* get_joy_buffer() { return joy_status; } - int* mouse_buffer() + int* get_mouse_buffer() { return mouse_status; } @@ -431,29 +360,10 @@ public: close_printer_file(); } } - void printer_out(uint8 value) { + void printer_out(uint8_t value) { prn_data = value; } - void printer_strobe(bool value) { - bool falling = (prn_strobe && !value); - prn_strobe = value; - - if(falling) { - if(!prn_fio->IsOpened()) { - if(prn_data == -1) { - return; - } - open_printer_file(); - } - prn_fio->Fputc(prn_data); - // wait 10sec -#ifdef SUPPORT_VARIABLE_TIMING - prn_wait_frames = (int)(vm->frame_rate() * 10.0 + 0.5); -#else - prn_wait_frames = (int)(FRAMES_PER_SEC * 10.0 + 0.5); -#endif - } - } + void printer_strobe(bool value); // printer void initialize_printer(); void release_printer(); @@ -474,43 +384,51 @@ public: } // common screen - int get_window_width(int mode); - int get_window_height(int mode); - void set_window_size(int window_width, int window_height, bool window_mode); + int get_window_mode_width(int mode); + int get_window_mode_height(int mode); + void set_host_window_size(int window_width, int window_height, bool window_mode); void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height); - scrntype* get_vm_screen_buffer(int y); + int get_vm_window_width() + { + return vm_window_width; + } + int get_vm_window_height() + { + return vm_window_height; + } + int get_vm_window_width_aspect() + { + return vm_window_width_aspect; + } + int get_vm_window_height_aspect() + { + return vm_window_height_aspect; + } + scrntype_t* get_vm_screen_buffer(int y); int draw_screen(); -#ifdef ONE_BOARD_MICRO_COMPUTER void reload_bitmap() { first_invalidate = true; } -#endif void capture_screen(); - bool start_rec_video(int fps); - void stop_rec_video(); - void restart_rec_video(); + bool start_record_video(int fps); + void stop_record_video(); + void restart_record_video(); void add_extra_frames(int extra_frames); - bool now_rec_video; -#ifdef USE_CRT_FILTER + bool now_record_video; bool screen_skip_line; -#endif - // common sound void update_sound(int* extra_frames); void mute_sound(); void stop_sound(); - void start_rec_sound(); - void stop_rec_sound(); - void restart_rec_sound(); - bool now_rec_sound; + void start_record_sound(); + void stop_record_sound(); + void restart_record_sound(); + bool now_record_sound; -#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE) // common video device void get_video_buffer(); void mute_video_dev(bool l, bool r); -#endif -#ifdef USE_MOVIE_PLAYER bool open_movie_file(const _TCHAR* file_path); void close_movie_file(); void play_movie(); @@ -525,10 +443,8 @@ public: return movie_sound_rate; } void set_cur_movie_frame(int frame, bool relative); - uint32 get_cur_movie_frame(); + uint32_t get_cur_movie_frame(); bool now_movie_play, now_movie_pause; -#endif -#ifdef USE_VIDEO_CAPTURE int get_cur_capture_dev_index() { return cur_capture_dev_index; @@ -547,56 +463,72 @@ public: void show_capture_dev_pin(); void show_capture_dev_source(); void set_capture_dev_channel(int ch); -#endif -#ifdef USE_SOCKET + // common printer + void create_bitmap(bitmap_t *bitmap, int width, int height); + void release_bitmap(bitmap_t *bitmap); + void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic); + void release_font(font_t *font); + void create_pen(pen_t *pen, int width, uint8_t r, uint8_t g, uint8_t b); + void release_pen(pen_t *pen); + + void clear_bitmap(bitmap_t *bitmap, uint8_t r, uint8_t g, uint8_t b); + int get_text_width(bitmap_t *bitmap, font_t *font, const char *text); + + 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); + void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey); + 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); + void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b); + + 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); + void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path); + // common socket int get_socket(int ch) { return soc[ch]; } - void socket_connected(int ch); - void socket_disconnected(int ch); + void notify_socket_connected(int ch); + void notify_socket_disconnected(int ch); void update_socket(); - bool init_socket_tcp(int ch); - bool init_socket_udp(int ch); - bool connect_socket(int ch, uint32 ipaddr, int port); + bool initialize_socket_tcp(int ch); + bool initialize_socket_udp(int ch); + bool connect_socket(int ch, uint32_t ipaddr, int port); void disconnect_socket(int ch); bool listen_socket(int ch); - void send_data_tcp(int ch); - void send_data_udp(int ch, uint32 ipaddr, int port); - void send_data(int ch); - void recv_data(int ch); -#endif + void send_socket_data_tcp(int ch); + void send_socket_data_udp(int ch, uint32_t ipaddr, int port); + void send_socket_data(int ch); + void recv_socket_data(int ch); // win32 dependent void update_screen(); void set_parent_thread(EmuThreadClass *parent); EmuThreadClass *get_parent_handler(); + + _TCHAR *console_input_string(void); + void clear_console_input_string(void); + // Wrapper + void lock_vm(void); + void unlock_vm(void); + void force_unlock_vm(void); + bool is_vm_locked(void); void set_draw_thread(DrawThreadClass *handler); - void lock_vm(void){ - VMSemaphore->acquire(1); - } - void unlock_vm(void){ - VMSemaphore->release(1); - } - void force_unlock_vm(void){ - while(VMSemaphore->available() < 1) VMSemaphore->release(1); - } + public slots: -#ifdef USE_AUTO_KEY - void set_auto_key_string(QByteArray); -#endif void do_write_inputdata(QString s); - void do_close_debugger_console(); + void do_set_input_string(QString s); + void close_debugger_console(); void do_close_debugger_thread(); + void do_assign_js_setting(int jsnum, int axis_idx, int assigned_value); signals: - int sig_update_screen(screen_buffer_t *); + int sig_update_screen(bitmap_t *); int sig_save_screen(const char *); int sig_close_window(void); int sig_resize_vm_screen(QImage *, int, int); int sig_put_string_debugger(QString); + int sig_console_input_string(QString); int sig_debugger_finished(); }; QT_END_NAMESPACE