OSDN Git Service

3bdf47870f15521f0cbbdfab907b46042c264bcf
[csp-qt/common_source_project-fm7.git] / source / src / qt / osd_base.h
1 /*
2         Skelton for retropc emulator
3
4         Author : K.Ohta <whatisthis.sowhat _at_ gmail.com>
5         Date   : 2015.11.30-
6
7         [ Qt dependent ]
8 */
9
10 #ifndef _QT_OSD_BASE_H_
11 #define _QT_OSD_BASE_H_
12
13
14 #include <QList>
15 #include <QObject>
16 #include <QThread>
17 #include <QString>
18 #include <QStringList>
19 #include <QImage>
20
21 #include <SDL.h>
22
23 #include <mutex>
24 #include <string>
25 #include <list>
26 #include <memory>
27 #include <atomic>
28
29 #define SOCKET_MAX 4
30 #define SOCKET_BUFFER_MAX 0x100000
31 #include "../config.h"
32 #include "osd_types.h"
33
34 #define N_MAX_BUTTONS 128
35
36 #define WM_RESIZE  (WM_USER + 1)
37 #define WM_SOCKET0 (WM_USER + 2)
38 #define WM_SOCKET1 (WM_USER + 3)
39 #define WM_SOCKET2 (WM_USER + 4)
40 #define WM_SOCKET3 (WM_USER + 5)
41
42 // osd common
43
44 #define OSD_CONSOLE_BLUE       1 // text color contains blue
45 #define OSD_CONSOLE_GREEN      2 // text color contains green
46 #define OSD_CONSOLE_RED                4 // text color contains red
47 #define OSD_CONSOLE_INTENSITY  8 // text color is intensified
48
49 //#ifdef USE_VIDEO_CAPTURE
50 #define MAX_CAPTURE_DEVS 8
51 //#endif
52
53 //#include "qt_main.h"
54
55 enum {
56         SAMPLE_TYPE_SINT8 = 0,
57         SAMPLE_TYPE_UINT8,
58         SAMPLE_TYPE_SINT16_BE,
59         SAMPLE_TYPE_SINT16_LE,
60         SAMPLE_TYPE_UINT16_BE,
61         SAMPLE_TYPE_UINT16_LE,
62         SAMPLE_TYPE_SINT32_BE,
63         SAMPLE_TYPE_SINT32_LE,
64         SAMPLE_TYPE_UINT32_BE,
65         SAMPLE_TYPE_UINT32_LE,
66         SAMPLE_TYPE_FLOAT_BE,
67         SAMPLE_TYPE_FLOAT_LE,
68 };
69
70 class GLDrawClass;
71 class EmuThreadClass;
72 class DrawThreadClass;
73 class Ui_MainWindow;
74 class EMU;
75 class VM_TEMPLATE;
76 class FIFO;
77 class FILEIO;
78 class CSP_KeyTables;
79 class USING_FLAGS;
80 class CSP_logger;
81
82 class QOpenGLContext;
83 class MIDI_REDIRECTOR;
84 class SIO_REDIRECTOR;
85 namespace SOUND_MODULE {
86         namespace OUTPUT {
87                 class M_BASE;
88         }
89 }
90
91 QT_BEGIN_NAMESPACE
92
93 #define MAX_SOUND_CAPTURE_DEVICES 8
94 #define MAX_CAPTURE_SOUNDS 16
95 typedef struct {
96         int id;
97         const _TCHAR *name;
98 } device_node_t;
99
100 typedef struct {
101         QString string;
102         union {
103                 int64_t ivalue;
104                 uint64_t uvalue;
105                 double  fvalue;
106         } v;
107 } supportedlist_t;
108
109 typedef struct {
110         int id; // Unique id
111         MIDI_REDIRECTOR* dev;
112 } external_midi_port_t;
113
114 typedef struct {
115         int id; // Unique id
116         SIO_REDIRECTOR* dev;
117 } external_sio_t;
118
119 typedef struct {
120         SDL_AudioFormat format;
121         int buffer_size;
122         int readlen;
123         int writelen;
124         int readpos;
125         int writepos;
126         uint8_t* read_buffer_ptr;
127 } osd_snddata_capture_t;
128
129 typedef struct {
130         SDL_AudioFormat format;
131         int sample_rate;
132         int channels;
133         int buffer_samples;
134         int silence;
135         int size;
136         SDL_AudioCallback callback;
137         osd_snddata_capture_t userdata;
138 } osd_snd_capture_dev_desc_t;
139
140 typedef struct {
141         int physical_dev;
142         SDL_AudioFormat  read_format;
143         int read_rate;
144         int read_channels;
145         int read_samples;
146         int read_silence;
147         int read_size;
148         SDL_AudioCallback read_callback;
149         void *read_userdata;
150         // For output
151         int sample_type; // ToDo : ENUM
152         int rate;
153         int channels;
154         int samples;
155         int write_size;
156         int write_pos;
157         int read_pos;
158         int read_data_len;
159         int read_buffer_len;
160         
161         uint8_t *read_buffer_ptr;
162         uint8_t *out_buffer;
163 } osd_snd_capture_desc_t;
164
165
166
167 class SOUND_BUFFER_QT;
168
169 class DLL_PREFIX OSD_BASE : public  QObject
170 {
171         Q_OBJECT
172 private:
173         #if 1 /* Note: Below are new sound driver. */
174         std::shared_ptr<SOUND_MODULE::OUTPUT::M_BASE> m_sound_driver;
175         #else /* Note */
176         qint64 sound_us_before_rendered;
177         qint64 elapsed_us_before_rendered;
178         SOUND_BUFFER_QT *m_audioOutput;
179         SOUND_BUFFER_QT *m_audioInput;
180         
181         QAudioFormat m_audioOutputFormat;
182         QAudioFormat m_audioInputFormat;
183         
184         #endif
185
186 protected:
187         EmuThreadClass          *parent_thread;
188         sdl_snddata_t           snddata;
189         std::shared_ptr<USING_FLAGS>                    using_flags;
190         config_t                        *p_config;
191         std::shared_ptr<CSP_Logger> p_logger;
192         
193         QOpenGLContext *glContext;
194         bool is_glcontext_shared;
195         QList<external_midi_port_t> midi_receivers;
196         QList<external_midi_port_t> midi_senders;
197         QList<external_sio_t> sio_receivers;
198         QList<external_sio_t> sio_senders;
199         
200         QList<supportedlist_t> SupportedFeatures;
201         
202         bool __USE_AUTO_KEY;
203    
204         _TCHAR app_path[_MAX_PATH];
205         QElapsedTimer osd_timer;
206         bool locked_vm;
207         // console
208         virtual void initialize_console();      
209         virtual void release_console();
210         
211         FILE *hStdIn, *hStdOut;
212         QString console_cmd_str;
213
214         bool use_telnet;
215         std::atomic<bool> telnet_closed;
216         std::atomic<int> console_count;
217         // input
218         void initialize_input();
219         void release_input();
220         void key_down_sub(int code, bool repeat);
221         void key_up_sub(int code);
222         CSP_KeyTables *key_table;
223         
224         bool dinput_key_ok;
225 //      bool dinput_joy_ok;
226         
227         uint8_t keycode_conv[256];
228         uint8_t key_status[256];        // windows key code mapping
229         uint8_t key_dik_prev[256];
230         uint8_t key_converted[256];
231         bool    joy_to_key_status[256];
232
233         bool numpad_5_pressed;
234         bool key_shift_pressed, key_shift_released;
235
236
237         uint32_t modkey_status;
238         bool lost_focus;
239         /*
240          * 0  - 3:
241          * joystick #1, - #4 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons)
242          * 4  - 11:
243          * ANALOG #1 - #4 AXIS LEFT X,Y : VALUE 65536 - 0 (RAW VALUE PLUS 32768) 
244          * 12 - 19:
245          * ANALOG #1 - #4 AXIS RIGHT X,Y : VALUE = 65536 - 0 (RAW VALUE PLUS 32768)
246          * 20 - 23:
247          * ANALOG #1 - #4 DIGITAL DIR (b0 = UP, b1 = DOWN, b2 = LEFT, b3 = RIGHT)
248          */
249         uint32_t joy_status[32];
250         
251         int32_t mouse_status[3];        // x, y, button (b0 = left, b1 = right)
252         bool mouse_enabled;
253         double mouse_ptrx;
254         double mouse_ptry;
255     int32_t mouse_button;
256         double mouse_oldx;
257         double mouse_oldy;
258         //Qt::CursorShape mouse_shape;
259         
260         QImage background_image;
261         QImage button_images[N_MAX_BUTTONS];
262         QImage rec_image_buffer;
263         
264         // printer
265         
266         // screen
267         void initialize_screen();
268         void release_screen();
269
270         virtual void initialize_screen_buffer(bitmap_t *buffer, int width, int height, int mode);
271         void release_screen_buffer(bitmap_t *buffer);
272         void rotate_screen_buffer(bitmap_t *source, bitmap_t *dest);
273         virtual scrntype_t *get_buffer(bitmap_t *p, int y);
274         
275         void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest);
276         virtual int add_video_frames();
277         
278         bitmap_t vm_screen_buffer;
279         bitmap_t video_screen_buffer;
280         bitmap_t* draw_screen_buffer;
281         int vm_window_width, vm_window_height;
282         int vm_window_width_aspect, vm_window_height_aspect;
283         
284         int host_window_width, host_window_height;
285         bool host_window_mode;
286         int base_window_width, base_window_height;
287         int vm_screen_width, vm_screen_height;
288         int draw_screen_width, draw_screen_height;
289         int rec_video_nsec, rec_video_fps_nsec;
290         
291         _TCHAR video_file_name[_MAX_PATH];
292         int rec_video_fps;
293         
294         uint64_t dwAVIFileSize;
295         uint64_t lAVIFrames;
296
297         rec_video_thread_param_t rec_video_thread_param;
298         
299         bool first_draw_screen;
300         bool first_invalidate;
301         bool self_invalidate;
302         
303         // sound
304 #if defined(USE_SDL2)   
305         SDL_AudioDeviceID audio_dev_id;
306 #else
307         int audio_dev_id;
308 #endif
309         SDL_AudioSpec snd_spec_req, snd_spec_presented;
310         void release_sound();
311 #if 0   
312         static void audio_capture_callback(void *udata, Uint8 *stream, int len);
313         static void audio_callback(void *udata, Uint8 *stream, int len);
314         void convert_sound_format(uint8_t* dst1, uint8_t* dst2, int16_t* src1, int16_t* src2, int samples1, int samples2);
315 #endif
316         virtual void init_sound_device_list();
317
318         int sound_rate, sound_samples;
319         bool sound_ok, sound_started, now_mute;
320         bool sound_first_half;
321         QStringList sound_device_list;
322         
323         _TCHAR sound_file_name[_MAX_PATH];
324         FILEIO* rec_sound_fio;
325         int rec_sound_bytes;
326         int rec_sound_buffer_ptr;
327
328         int sound_buffer_size;
329         int sound_data_len;
330         int sound_data_pos;
331         int sound_write_pos;
332         bool sound_exit;
333         bool sound_debug;
334         bool sound_initialized;
335         uint8_t *sound_buf_ptr;
336         Uint8 snd_total_volume;
337
338         // sound capture
339         QStringList sound_capture_device_list;
340         bool sound_capturing_emu[MAX_CAPTURE_SOUNDS];
341         osd_snd_capture_desc_t  sound_capture_desc[MAX_CAPTURE_SOUNDS]; // To EMU:: and VM::
342         bool capturing_sound[MAX_SOUND_CAPTURE_DEVICES];
343         osd_snd_capture_dev_desc_t  sound_capture_dev_desc[MAX_SOUND_CAPTURE_DEVICES]; // From physical devices
344         uint8_t sound_capture_buffer[MAX_SOUND_CAPTURE_DEVICES][32768];
345         // video device
346         virtual void initialize_video();
347         virtual void release_video();
348   
349         bitmap_t dshow_screen_buffer;
350         int direct_show_width, direct_show_height;
351         bool direct_show_mute[2];
352
353         double movie_frame_rate;
354         int movie_sound_rate;
355
356         void enum_capture_devs();
357         bool connect_capture_dev(int index, bool pin);
358         int cur_capture_dev_index;
359         int num_capture_devs;
360         _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];
361
362         _TCHAR prn_file_name[_MAX_PATH];
363         FILEIO *prn_fio;
364         int prn_data, prn_wait_frames;
365         bool prn_strobe;
366
367         // socket
368         virtual void initialize_socket();
369         virtual void release_socket();
370         
371         bool is_tcp[SOCKET_MAX];
372         bool host_mode[SOCKET_MAX];
373         int socket_delay[SOCKET_MAX];
374
375         // wrapper
376         int max_vm_nodes;
377         QList<device_node_t> device_node_list;
378         void vm_draw_screen(void);
379         Sint16* create_sound(int *extra_frames);
380         
381         virtual bool get_use_socket(void);
382         virtual bool get_use_auto_key(void);
383         virtual bool get_dont_keeep_key_pressed(void);
384         virtual bool get_one_board_micro_computer(void);
385         virtual bool get_use_screen_rotate(void);
386         virtual bool get_use_movie_player(void);
387         virtual bool get_use_video_capture(void);
388         void vm_key_down(int code, bool flag);
389         void vm_key_up(int code);
390         void vm_reset(void);
391
392         virtual int get_screen_width(void);
393         virtual int get_screen_height(void);
394         virtual int get_vm_buttons_code(int num);
395         virtual void update_input_mouse();
396
397 public:
398         OSD_BASE(std::shared_ptr<USING_FLAGS> p, std::shared_ptr<CSP_Logger> logger);
399         ~OSD_BASE();
400         
401         // common
402         VM_TEMPLATE* vm;
403         //EMU* emu;
404         class Ui_MainWindow *main_window_handle;
405
406         std::recursive_timed_mutex screen_mutex;
407         std::recursive_timed_mutex vm_mutex;
408         std::recursive_timed_mutex debug_mutex;
409         std::recursive_timed_mutex joystick_mutex;
410         std::recursive_timed_mutex mouse_mutex;
411         std::recursive_timed_mutex log_mutex;
412         int host_cpus;
413         bool now_auto_key;
414         
415         virtual void initialize(int rate, int samples, int* presented_rate, int* presented_samples);
416         // sound
417         virtual void initialize_sound(int rate, int samples, int* presented_rate, int* presented_samples);
418         virtual bool push_midi_data(int id, uint32_t data) {
419                 return true; // Dummy
420         }
421         virtual int bind_midi_receiver_port(MIDI_REDIRECTOR* dev) {
422                 int n = midi_receivers.count();
423                 external_midi_port_t s;
424                 s.id = n + 1;
425                 s.dev = dev;
426                 midi_receivers.push_back(s);
427                 return s.id; // Dummy
428         }
429         virtual int bind_midi_send_to(MIDI_REDIRECTOR* dev) {
430                 int n = midi_senders.count();
431                 external_midi_port_t s;
432                 s.id = n + 1;
433                 s.dev = dev;
434                 midi_senders.push_back(s);
435                 return s.id; // Dummy
436         }
437         // UART
438         virtual bool push_sio_data(int id, uint32_t data) {
439                 return true; // Dummy
440         }
441         virtual int bind_sio_receiver_port(SIO_REDIRECTOR* dev) {
442                 int n = sio_receivers.count();
443                 external_sio_t s;
444                 s.id = n + 1;
445                 s.dev = dev;
446                 sio_receivers.push_back(s);
447                 return s.id; // Dummy
448         }
449         virtual int bind_sio_send_to(SIO_REDIRECTOR* dev) {
450                 int n = sio_senders.count();
451                 external_sio_t s;
452                 s.id = n + 1;
453                 s.dev = dev;
454                 sio_senders.push_back(s);
455                 return s.id; // Dummy
456         }
457
458         virtual void release();
459         void power_off();
460         void suspend();
461         void restore();
462         _TCHAR* application_path();
463         _TCHAR* bios_path(const _TCHAR* file_name);
464         void get_host_time(cur_time_t* time);
465         void sleep(uint32_t ms);
466         void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
467         _TCHAR  *get_app_path(void);
468         // common console
469         virtual void open_console(int width, int height, const _TCHAR* title);
470         virtual void close_console();
471         virtual unsigned int get_console_code_page();
472         virtual bool is_console_closed();
473         
474         void set_console_text_attribute(unsigned short attr);
475         void write_console(const _TCHAR* buffer, unsigned int length);
476         int read_console_input(_TCHAR* buffer, int length);
477         bool is_console_key_pressed(uint32_t ch);
478         void update_keyname_table(void);
479         // console / telnet
480         virtual void open_telnet(const _TCHAR* title);
481         virtual void close_telnet();
482         virtual void send_telnet(const char* string);
483
484         // common input
485         void update_input();
486         void key_down(int code, bool extended, bool repeat);
487         void key_up(int code, bool extended);
488         void key_down_native(int code, bool repeat);
489         void key_up_native(int code);
490         void key_lost_focus();
491         void press_button(int num);
492
493 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
494         uint16_t GetAsyncKeyState(uint32_t vk);  // Win32 GetAsyncKeyState() wrappeer.
495 # endif
496         void key_modifiers(uint32_t mod);
497         bool is_mouse_enabled();
498         //QImage *getPseudoVramClass(void) { return pPseudoVram;}
499         void set_mouse_pointer(double x, double y);
500         void set_mouse_button(int button);
501         void modify_key_buffer(int code, uint8_t val);
502         uint8_t* get_key_buffer();
503         uint32_t* get_joy_buffer();
504         void release_joy_buffer(uint32_t* ptr);
505         int32_t get_mouse_button();
506         int32_t* get_mouse_buffer();
507         void release_mouse_buffer(int32_t* ptr);
508         // common printer
509         void reset_printer();
510         void update_printer();
511         void printer_out(uint8_t value);
512         void printer_strobe(bool value);
513         // printer
514         void initialize_printer();
515         void release_printer();
516         void open_printer_file();
517         void close_printer_file();
518         
519         // common screen
520         int get_window_mode_width(int mode);
521         int get_window_mode_height(int mode);
522         double get_window_mode_power(int mode);
523         void set_host_window_size(int window_width, int window_height, bool window_mode);
524         void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height);
525         void set_vm_screen_lines(int lines); // 20170118
526         int get_vm_screen_width();
527         int get_vm_screen_height();
528
529         int get_vm_window_width();
530         int get_vm_window_height();
531         int get_vm_window_width_aspect();
532         int get_vm_window_height_aspect();
533         scrntype_t* get_vm_screen_buffer(int y);
534         void reset_screen_buffer()
535         {
536                 // It's ugly hack for screen.
537                 emit sig_resize_vm_screen((QImage*)NULL, -1, -1);
538         }
539         //int draw_screen();
540         //int no_draw_screen();
541         void reload_bitmap();
542         void capture_screen();
543         bool start_record_video(int fps);
544         void stop_record_video();
545         void restart_record_video();
546         void add_extra_frames(int extra_frames);
547         bool now_record_video;
548         bool screen_skip_line;
549         // common sound
550         void update_sound(int* extra_frames);
551         void mute_sound();
552         void stop_sound();
553         void start_record_sound();
554         void stop_record_sound();
555         void restart_record_sound();
556
557         const _TCHAR *get_vm_device_name();
558         const _TCHAR *get_sound_device_name(int num);
559         QStringList  get_sound_device_list()
560         {
561                 return sound_device_list;
562         }
563         
564         int get_sound_device_num();
565         
566         bool now_record_sound;
567         int get_sound_rate();
568
569         // To VM:: and EMU::
570         void *get_capture_sound_buffer(int ch);
571         bool is_capture_sound_buffer(int ch);
572         void *open_capture_sound_emu(int ch, int rate, int channels, int sample_type, int samples, int physical_device_num);
573         void close_capture_sound_emu(int ch);
574
575         // From physical device?
576         bool open_sound_capture_device(int num, int req_rate, int req_channels);
577         bool close_sound_capture_device(int num, bool force);
578
579         // common video device
580         virtual void get_video_buffer();
581         void mute_video_dev(bool l, bool r);
582         virtual bool open_movie_file(const _TCHAR* file_path);
583         virtual void close_movie_file();
584         void play_movie();
585         void stop_movie();
586         void pause_movie();
587         double get_movie_frame_rate();
588         virtual int get_movie_sound_rate();
589         void set_cur_movie_frame(int frame, bool relative);
590         uint32_t get_cur_movie_frame();
591         bool now_movie_play, now_movie_pause;
592         int get_cur_capture_dev_index();
593         int get_num_capture_devs();
594         _TCHAR* get_capture_dev_name(int index);
595         void open_capture_dev(int index, bool pin);
596         void close_capture_dev();
597         void show_capture_dev_filter();
598         void show_capture_dev_pin();
599         void show_capture_dev_source();
600         void set_capture_dev_channel(int ch);
601         
602         // common printer
603         void create_bitmap(bitmap_t *bitmap, int width, int height);
604         void release_bitmap(bitmap_t *bitmap);
605         void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
606         void release_font(font_t *font);
607         void create_pen(pen_t *pen, int width, uint8_t r, uint8_t g, uint8_t b);
608         void release_pen(pen_t *pen);
609
610         void clear_bitmap(bitmap_t *bitmap, uint8_t r, uint8_t g, uint8_t b);
611         int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
612         
613         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);
614         void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
615         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);
616         void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b);
617
618         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);
619         void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
620         double vm_frame_rate(void);
621
622         // common socket
623         virtual SOCKET get_socket(int ch);
624         virtual void notify_socket_connected(int ch);
625         virtual void notify_socket_disconnected(int ch);
626         virtual void update_socket();
627         virtual bool initialize_socket_tcp(int ch);
628         virtual bool initialize_socket_udp(int ch);
629         virtual bool connect_socket(int ch, uint32_t ipaddr, int port);
630         virtual void disconnect_socket(int ch);
631         virtual bool listen_socket(int ch);
632         virtual void send_socket_data_tcp(int ch);
633         virtual void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
634         virtual void send_socket_data(int ch);
635         virtual void recv_socket_data(int ch);
636
637         // win32 dependent
638         void update_screen();
639         void set_parent_thread(EmuThreadClass *parent);
640         EmuThreadClass *get_parent_handler();
641
642         _TCHAR *console_input_string(void);
643         void clear_console_input_string(void);
644         
645         void lock_vm(void);
646         void unlock_vm(void);
647         void force_unlock_vm(void);
648         bool is_vm_locked(void);
649         virtual const _TCHAR *get_lib_common_vm_version();
650         const _TCHAR *get_lib_common_vm_git_version();
651         const _TCHAR *get_lib_osd_version();
652         
653         // Wrapper
654         virtual void set_draw_thread(DrawThreadClass *handler);
655         virtual QString get_vm_config_name(void);
656         virtual void reset_vm_node(void);
657         
658         void set_device_name(int id, char *name);
659         
660         void set_vm_node(int id, const _TCHAR *name);
661         const _TCHAR *get_vm_node_name(int id);
662         int get_vm_node_size(void);
663         
664         int get_key_name_table_size(void);
665         uint32_t get_scancode_by_vk(uint32_t vk);
666         uint32_t get_vk_by_scancode(uint32_t scancode);
667         const _TCHAR *get_key_name_by_scancode(uint32_t scancode);
668         const _TCHAR *get_key_name_by_vk(uint32_t vk);
669         
670         // Get #define S to value.You may use inside of VM/ .
671         virtual void set_features(void) {}
672         void add_feature(const _TCHAR *key, double value);
673         void add_feature(const _TCHAR *key, float value);
674         void add_feature(const _TCHAR *key, int value = 1);
675         void add_feature(const _TCHAR *key, int64_t value);
676         void add_feature(const _TCHAR *key, int16_t value);
677         void add_feature(const _TCHAR *key, int8_t value);
678         void add_feature(const _TCHAR *key, uint64_t value);
679         void add_feature(const _TCHAR *key, uint32_t value);
680         void add_feature(const _TCHAR *key, uint16_t value);
681         void add_feature(const _TCHAR *key, uint8_t value);
682         bool check_feature(const _TCHAR *key);
683         double get_feature_double_value(const _TCHAR *key);
684         int get_feature_int_value(const _TCHAR *key);
685         int64_t get_feature_int64_value(const _TCHAR *key);
686         int32_t get_feature_int32_value(const _TCHAR *key);
687         int16_t get_feature_int16_value(const _TCHAR *key);
688         int8_t get_feature_int8_value(const _TCHAR *key);
689         
690         uint64_t get_feature_uint64_value(const _TCHAR *key);
691         uint32_t get_feature_uint32_value(const _TCHAR *key);
692         uint16_t get_feature_uint16_value(const _TCHAR *key);
693         uint8_t get_feature_uint8_value(const _TCHAR *key);
694
695         void debug_log(int level, const char *fmt, ...);
696         void debug_log(int level, int domain_num, const char *fmt, ...);
697         void debug_log(int level, int domain_num, char *strbuf);
698         virtual double get_vm_current_usec() { return 0.0; }
699         virtual uint64_t get_vm_current_clock_uint64() { return 0;}
700
701         std::shared_ptr<USING_FLAGS> get_config_flags(void) { return using_flags; }
702         // Special
703         std::shared_ptr<CSP_Logger> get_logger(void) { return p_logger; }
704         virtual bool set_glview(GLDrawClass *glv) { /* Dummy */ return false;}
705         QOpenGLContext *get_gl_context();
706         virtual GLDrawClass *get_gl_view() { return NULL; }
707
708         // common debugger
709         void start_waiting_in_debugger();
710         void finish_waiting_in_debugger();
711         void process_waiting_in_debugger();
712
713 public slots:
714         void enable_mouse();
715         void disable_mouse();
716         void toggle_mouse();
717         
718         void upload_bitmap(QImage *p);
719         void set_buttons();
720         
721         int no_draw_screen();
722
723         void do_write_inputdata(QString s);
724         void do_set_input_string(QString s);
725         
726         void close_debugger_console();
727         void do_close_debugger_thread();
728         
729         void do_assign_js_setting(int jsnum, int axis_idx, int assigned_value);
730         void do_start_record_video();
731         virtual void do_decode_movie(int frames);
732         void do_video_movie_end(bool flag);
733         void do_video_decoding_error(int num);
734         virtual void do_run_movie_audio_callback(uint8_t *data, long len);
735         virtual int draw_screen();
736
737         void do_draw(bool flag);
738         
739         void set_dbg_completion_list(std::list<std::string> *p);
740         void clear_dbg_completion_list(void);
741         void set_hdd_image_name(int drv, _TCHAR *filename);
742
743         void do_set_host_sound_output_device(QString device_name);
744         void do_update_master_volume(int level);
745
746 signals:
747         int sig_update_screen(void *, bool);
748         int sig_save_screen(const char *);
749         int sig_draw_frames(int);
750         int sig_close_window(void);
751         int sig_resize_vm_screen(QImage *, int, int);
752         int sig_resize_vm_lines(int);
753         int sig_put_string_debugger(QString);
754         int sig_console_input_string(QString);
755         int sig_enqueue_video(int, int, int, QImage *); 
756         int sig_enqueue_audio(int16_t *data, int size);
757         int sig_movie_set_width(int);
758         int sig_movie_set_height(int);
759         int sig_debugger_finished();
760         int sig_req_encueue_video(int, int, int);
761         int sig_save_as_movie(QString, int, int);
762         int sig_stop_saving_movie();
763
764         int sig_movie_play();
765         int sig_movie_stop();
766         int sig_movie_pause(bool);
767         int sig_movie_seek_frame(bool, int);
768
769         int sig_set_sound_device(QString);
770         int sig_set_sound_volume(double);
771         int sig_set_sound_volume(int);
772
773         int sig_update_sound_output_list();
774         int sig_clear_sound_output_list();
775         int sig_append_sound_output_list(QString);
776
777         int sig_update_device_node_name(int id, const _TCHAR *name);
778         int sig_enable_mouse(void);
779         int sig_disable_mouse(void);
780         int sig_close_console(void);
781         int sig_set_attribute_debugger(QString, bool);
782         int sig_move_mouse_to_center(void);
783         int sig_clear_dbg_completion_list(void);
784         int sig_add_dbg_completion_list(_TCHAR *);
785         int sig_apply_dbg_completion_list(void);
786
787         int sig_clear_keyname_table(void);
788         int sig_add_keyname_table(uint32_t, QString);
789
790         int sig_change_virtual_media(int, int, QString);
791 };
792 QT_END_NAMESPACE
793
794 #endif