OSDN Git Service

[BUILD] Set SOVERSION and GIT hash automatically.
[csp-qt/common_source_project-fm7.git] / source / src / qt / osd_base.h
index 55e8bf2..40b4491 100644 (file)
 #define _QT_OSD_BASE_H_
 
 
-#include <QWidget>
+#include <QList>
 #include <QThread>
-#include <QMutex>
-#include <QSemaphore>
-#include <QPainter>
-#include <QElapsedTimer>
 #include <QString>
-#include <QQueue>
-
+#include <QImage>
 #include <SDL.h>
-#include "simd_types.h"
+//#include "simd_types.h"
 
-#include <ctime>
+//#include <ctime>
+//#include <limits>
+//#include <osd_base.h>
 
 //#include "../vm/vm.h"
 //#include "../emu.h"
 #include "../config.h"
-#include "../fileio.h"
-#include "../fifo.h"
-#if !defined(Q_OS_WIN32)
-#include "qt_input.h"
-#endif
+//#include "../fileio.h"
+//#include "../fifo.h"
+//#if !defined(Q_OS_WIN32)
+//#include "qt_input.h"
+//#endif
 #define SOCKET_MAX 4
 #define SOCKET_BUFFER_MAX 0x100000
 #include "osd_types.h"
 
+#define N_MAX_BUTTONS 128
 
 #define WM_RESIZE  (WM_USER + 1)
 #define WM_SOCKET0 (WM_USER + 2)
@@ -48,9 +46,7 @@
 #define MAX_CAPTURE_DEVS 8
 //#endif
 
-#include "qt_main.h"
-//#include "mainwidget.h"
-#include "agar_logger.h"
+//#include "qt_main.h"
 
 class GLDrawClass;
 class EmuThreadClass;
@@ -59,22 +55,45 @@ class Ui_MainWindow;
 class EMU;
 class VM;
 class FIFO;
+class FILEIO;
 class CSP_KeyTables;
+class USING_FLAGS;
+class CSP_logger;
+class QMutex;
 
 QT_BEGIN_NAMESPACE
-class OSD_BASE : public QThread
+
+typedef struct {
+       int id;
+       const _TCHAR *name;
+} device_node_t;
+
+typedef struct {
+       QString string;
+       union {
+               int64_t ivalue;
+               double  fvalue;
+       } v;
+} supportedlist_t;
+
+class DLL_PREFIX OSD_BASE : public QThread
 {
        Q_OBJECT
 protected:
        EmuThreadClass *parent_thread;
-       QSemaphore *VMSemaphore;
-       QSemaphore *DebugSemaphore;
        sdl_snddata_t snddata;
-//private:
+       USING_FLAGS *using_flags;
+       config_t *p_config;
+       CSP_Logger *p_logger;
+
+       QList<supportedlist_t> SupportedFeatures;
+       
+       bool __USE_AUTO_KEY;
+       bool __USE_SHIFT_NUMPAD_KEY;
+   
        _TCHAR app_path[_MAX_PATH];
        QElapsedTimer osd_timer;
        bool locked_vm;
-       
        // console
        FILE *hStdIn, *hStdOut;
        QString console_cmd_str;
@@ -103,14 +122,20 @@ protected:
        int joy_num;
        uint32_t joy_mask[4];
        
-       int mouse_status[3];    // x, y, button (b0 = left, b1 = right)
+       int32_t mouse_status[3];        // x, y, button (b0 = left, b1 = right)
        bool mouse_enabled;
        int mouse_ptrx;
        int mouse_ptry;
        int mouse_button;
        int mouse_oldx;
        int mouse_oldy;
-       Qt::CursorShape mouse_shape;
+       int delta_x;
+       int delta_y;
+       //Qt::CursorShape mouse_shape;
+       
+       QImage background_image;
+       QImage button_images[N_MAX_BUTTONS];
+       QImage rec_image_buffer;
        
        // printer
        
@@ -135,21 +160,14 @@ protected:
        int base_window_width, base_window_height;
        int vm_screen_width, vm_screen_height;
        int draw_screen_width, draw_screen_height;
-       
+       int rec_video_nsec, rec_video_fps_nsec;
        
        _TCHAR video_file_name[_MAX_PATH];
        int rec_video_fps;
-       double rec_video_run_frames;
-       double rec_video_frames;
        
-       //LPBITMAPINFO lpDibRec;
-       //PAVIFILE pAVIFile;
-       //PAVISTREAM pAVIStream;
-       //PAVISTREAM pAVICompressed;
-       //AVICOMPRESSOPTIONS AVIOpts;
        uint64_t dwAVIFileSize;
        uint64_t lAVIFrames;
-       //HANDLE hVideoThread;
+
        rec_video_thread_param_t rec_video_thread_param;
        
        bool first_draw_screen;
@@ -175,7 +193,7 @@ protected:
        int sound_write_pos;
        bool sound_exit;
        bool sound_debug;
-       SDL_sem *snd_apply_sem;
+       bool sound_initialized;
        Sint16 *sound_buf_ptr;
        Uint8 snd_total_volume;
 #if defined(USE_SDL2)   
@@ -186,26 +204,13 @@ protected:
        SDL_AudioSpec snd_spec_req, snd_spec_presented;
        
        // video device
-       void initialize_video();
-       void release_video();
-       
-       //IGraphBuilder *pGraphBuilder;
-       //IBaseFilter *pVideoBaseFilter;
-       //IBaseFilter *pCaptureBaseFilter;
-       //ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
-       //ISampleGrabber *pVideoSampleGrabber;
-       //IBaseFilter *pSoundBaseFilter;
-       //ISampleGrabber *pSoundSampleGrabber;
-       //CMySampleGrabberCB *pSoundCallBack;
-       //IMediaControl *pMediaControl;
-       //IMediaSeeking *pMediaSeeking;
-       //IMediaPosition *pMediaPosition;
-       //IVideoWindow *pVideoWindow;
-       //IBasicVideo *pBasicVideo;
-       //IBasicAudio *pBasicAudio;
-       //bool bTimeFormatFrame;
-       //bool bVerticalReversed;
-       
+       virtual void initialize_video();
+       virtual void release_video();
+  
+       scrntype_t *mapped_screen_pointer;
+       int mapped_screen_width;
+       int mapped_screen_height;
+       bool mapped_screen_status;
        bitmap_t dshow_screen_buffer;
        int direct_show_width, direct_show_height;
        bool direct_show_mute[2];
@@ -225,19 +230,17 @@ protected:
        bool prn_strobe;
 
        // socket
-       void initialize_socket();
-       void release_socket();
+       virtual void initialize_socket();
+       virtual void release_socket();
        
-       int soc[SOCKET_MAX];
        bool is_tcp[SOCKET_MAX];
-       //struct sockaddr_in udpaddr[SOCKET_MAX];
+       bool host_mode[SOCKET_MAX];
        int socket_delay[SOCKET_MAX];
-       char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX];
-       int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX];
 
        // wrapper
+       int max_vm_nodes;
+       QList<device_node_t> device_node_list;
        virtual void vm_draw_screen(void);
-       virtual double vm_frame_rate(void);
        virtual Sint16* create_sound(int *extra_frames);
        virtual bool get_use_socket(void);
        virtual bool get_support_variable_timing(void);
@@ -260,8 +263,10 @@ protected:
        virtual int get_screen_height(void);
        virtual int get_vm_buttons_code(int num);
 
+       virtual void init_sound_files();
+       virtual void release_sound_files();
 public:
-       OSD_BASE();
+       OSD_BASE(USING_FLAGS *p, CSP_Logger *logger);
        ~OSD_BASE();
        
        // common
@@ -269,6 +274,9 @@ public:
        //EMU* emu;
        class Ui_MainWindow *main_window_handle;
        GLDrawClass *glv;
+       QMutex *screen_mutex;
+       QMutex *vm_mutex;
+       
        int host_cpus;
        bool now_auto_key;
        
@@ -282,7 +290,7 @@ public:
        void get_host_time(cur_time_t* time);
        void sleep(uint32_t ms);
        void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
-       
+       _TCHAR  *get_app_path(void);
        // common console
        void open_console(_TCHAR* title);
        void close_console();
@@ -290,13 +298,13 @@ public:
        bool is_console_active();
        void set_console_text_attribute(unsigned short attr);
        void write_console(_TCHAR* buffer, unsigned int length);
-       int read_console_input(_TCHAR* buffer);
+       int read_console_input(_TCHAR* buffer, int length);
        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(int code, bool extended, bool repeat);
+       void key_up(int code, bool extended);
        void key_down_native(int code, bool repeat);
        void key_up_native(int code);
        void key_lost_focus();
@@ -317,7 +325,7 @@ public:
        void modify_key_buffer(int code, uint8_t val);
        uint8_t* get_key_buffer();
        uint32_t* get_joy_buffer();
-       int* get_mouse_buffer();
+       int32_t* get_mouse_buffer();
        // common printer
        void reset_printer();
        void update_printer();
@@ -334,12 +342,14 @@ public:
        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);
+       void set_vm_screen_lines(int lines); // 20170118
        int get_vm_window_width();
        int get_vm_window_height();
        int get_vm_window_width_aspect();
        int get_vm_window_height_aspect();
        scrntype_t* get_vm_screen_buffer(int y);
-       int draw_screen();
+       //int draw_screen();
+       //int no_draw_screen();
        void reload_bitmap();
        void capture_screen();
        bool start_record_video(int fps);
@@ -357,17 +367,20 @@ public:
        void restart_record_sound();
        bool now_record_sound;
        int get_sound_rate();
+       // Wrapper : Sound
+       virtual void load_sound_file(int id, const _TCHAR *name, int16_t **data, int *dst_size);
+       virtual void free_sound_file(int id, int16_t **data);
        
        // common video device
-       void get_video_buffer();
+       virtual void get_video_buffer();
        void mute_video_dev(bool l, bool r);
-       bool open_movie_file(const _TCHAR* file_path);
-       void close_movie_file();
+       virtual bool open_movie_file(const _TCHAR* file_path);
+       virtual void close_movie_file();
        void play_movie();
        void stop_movie();
        void pause_movie();
        double get_movie_frame_rate();
-       int get_movie_sound_rate();
+       virtual int get_movie_sound_rate();
        void set_cur_movie_frame(int frame, bool relative);
        uint32_t get_cur_movie_frame();
        bool now_movie_play, now_movie_pause;
@@ -401,19 +414,19 @@ public:
        void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
 
        // common socket
-       int get_socket(int ch);
-       void notify_socket_connected(int ch);
-       void notify_socket_disconnected(int ch);
-       void update_socket();
-       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_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);
+       virtual int get_socket(int ch);
+       virtual void notify_socket_connected(int ch);
+       virtual void notify_socket_disconnected(int ch);
+       virtual void update_socket();
+       virtual bool initialize_socket_tcp(int ch);
+       virtual bool initialize_socket_udp(int ch);
+       virtual bool connect_socket(int ch, uint32_t ipaddr, int port);
+       virtual void disconnect_socket(int ch);
+       virtual bool listen_socket(int ch);
+       virtual void send_socket_data_tcp(int ch);
+       virtual void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
+       virtual void send_socket_data(int ch);
+       virtual void recv_socket_data(int ch);
 
        // win32 dependent
        void update_screen();
@@ -429,6 +442,42 @@ public:
        virtual bool is_vm_locked(void);
        virtual void set_draw_thread(DrawThreadClass *handler);
        virtual QString get_vm_config_name(void);
+       virtual double vm_frame_rate(void);
+       virtual void reset_vm_node(void);
+       virtual const _TCHAR *get_lib_common_vm_version() { return (const _TCHAR *)"\0"; }
+       virtual const _TCHAR *get_lib_common_vm_git_version() { return (const _TCHAR *)"\0"; }
+       virtual const _TCHAR *get_lib_osd_version() { return (const _TCHAR *)"\0"; }
+       
+       virtual void set_device_name(int id, char *name);
+       
+       virtual void set_vm_node(int id, const _TCHAR *name);
+       virtual const _TCHAR *get_vm_node_name(int id);
+       virtual int get_vm_node_size(void);
+       
+       // Get #define S to value.You may use inside of VM/ .
+       virtual void set_features(void) {}
+       void add_feature(const _TCHAR *key, double value);
+       void add_feature(const _TCHAR *key, float value);
+       void add_feature(const _TCHAR *key, int value = 1);
+       void add_feature(const _TCHAR *key, int64_t value);
+       void add_feature(const _TCHAR *key, uint32_t value);
+       void add_feature(const _TCHAR *key, uint16_t value);
+       void add_feature(const _TCHAR *key, uint8_t value);
+       bool check_feature(const _TCHAR *key);
+       double get_feature_double_value(const _TCHAR *key);
+       int64_t get_feature_int_value(const _TCHAR *key);
+       uint32_t get_feature_uint32_value(const _TCHAR *key);
+       uint16_t get_feature_uint16_value(const _TCHAR *key);
+       uint8_t get_feature_uint8_value(const _TCHAR *key);
+
+       void debug_log(int level, const char *fmt, ...);
+       void debug_log(int level, int domain_num, const char *fmt, ...);
+       virtual void debug_log(int level, int domain_num, char *strbuf);
+
+       USING_FLAGS *get_config_flags(void) { return using_flags; }
+
+       // Special
+       CSP_Logger *get_logger(void) { return p_logger; }
        
 public slots:
        void do_write_inputdata(QString s);
@@ -436,17 +485,48 @@ public slots:
        void close_debugger_console();
        void do_close_debugger_thread();
        void do_assign_js_setting(int jsnum, int axis_idx, int assigned_value);
-       
+       void upload_bitmap(QImage *p);
+       void set_buttons();
+       void do_start_record_video();
+       virtual void do_decode_movie(int frames);
+       void do_video_movie_end(bool flag);
+       void do_video_decoding_error(int num);
+       virtual void do_run_movie_audio_callback(uint8_t *data, long len);
+       int draw_screen();
+       int no_draw_screen();
+       void do_draw(bool flag);
+       void do_set_screen_map_texture_address(scrntype_t *p, int width, int height);
+
 signals:
        int sig_update_screen(bitmap_t *);
        int sig_save_screen(const char *);
+       int sig_draw_frames(int);
        int sig_close_window(void);
        int sig_resize_vm_screen(QImage *, int, int);
+       int sig_resize_vm_lines(int);
        int sig_put_string_debugger(QString);
        int sig_console_input_string(QString);
-       int sig_enqueue_video(QByteArray *data, int width, int height); 
-       int sig_enqueue_audio(QByteArray *data); 
+       int sig_enqueue_video(int, int, int, QImage *); 
+       int sig_enqueue_audio(int16_t *data, int size);
+       int sig_movie_set_width(int);
+       int sig_movie_set_height(int);
        int sig_debugger_finished();
+       int sig_req_encueue_video(int, int, int);
+       int sig_save_as_movie(QString, int, int);
+       int sig_stop_saving_movie();
+
+       int sig_movie_play();
+       int sig_movie_stop();
+       int sig_movie_pause(bool);
+       int sig_movie_seek_frame(bool, int);
+
+       int sig_update_device_node_name(int id, const _TCHAR *name);
+       int sig_enable_mouse(void);
+       int sig_disable_mouse(void);
+       int sig_close_console(void);
+
+       int sig_move_mouse_to_center(void);
+       
 };
 QT_END_NAMESPACE