#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)
#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;
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;
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
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;
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)
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];
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);
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
//EMU* emu;
class Ui_MainWindow *main_window_handle;
GLDrawClass *glv;
+ QMutex *screen_mutex;
+ QMutex *vm_mutex;
+
int host_cpus;
bool now_auto_key;
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();
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();
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();
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);
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;
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();
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);
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