OSDN Git Service

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