OSDN Git Service

[VM][FMTOWNS][MEMORY] Fix setup around memory banks by I/O 0404h and 0480h.
[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 // For UIs
34 #include "osdcall_types.h"
35
36 #define N_MAX_BUTTONS 128
37
38 #define WM_RESIZE  (WM_USER + 1)
39 #define WM_SOCKET0 (WM_USER + 2)
40 #define WM_SOCKET1 (WM_USER + 3)
41 #define WM_SOCKET2 (WM_USER + 4)
42 #define WM_SOCKET3 (WM_USER + 5)
43
44 // osd common
45
46 #define OSD_CONSOLE_BLUE       1 // text color contains blue
47 #define OSD_CONSOLE_GREEN      2 // text color contains green
48 #define OSD_CONSOLE_RED                4 // text color contains red
49 #define OSD_CONSOLE_INTENSITY  8 // text color is intensified
50
51 //#ifdef USE_VIDEO_CAPTURE
52 #define MAX_CAPTURE_DEVS 8
53 //#endif
54
55 //#include "qt_main.h"
56
57 enum {
58         SAMPLE_TYPE_SINT8 = 0,
59         SAMPLE_TYPE_UINT8,
60         SAMPLE_TYPE_SINT16_BE,
61         SAMPLE_TYPE_SINT16_LE,
62         SAMPLE_TYPE_UINT16_BE,
63         SAMPLE_TYPE_UINT16_LE,
64         SAMPLE_TYPE_SINT32_BE,
65         SAMPLE_TYPE_SINT32_LE,
66         SAMPLE_TYPE_UINT32_BE,
67         SAMPLE_TYPE_UINT32_LE,
68         SAMPLE_TYPE_FLOAT_BE,
69         SAMPLE_TYPE_FLOAT_LE,
70 };
71
72 class GLDrawClass;
73 class EmuThreadClass;
74 class DrawThreadClass;
75 class Ui_MainWindow;
76 class EMU;
77 class VM_TEMPLATE;
78 class FIFO;
79 class FILEIO;
80 class CSP_KeyTables;
81 class USING_FLAGS;
82 class CSP_logger;
83
84 class QOpenGLContext;
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
110 typedef struct {
111         SDL_AudioFormat format;
112         int buffer_size;
113         int readlen;
114         int writelen;
115         int readpos;
116         int writepos;
117         uint8_t* read_buffer_ptr;
118 } osd_snddata_capture_t;
119
120 typedef struct {
121         SDL_AudioFormat format;
122         int sample_rate;
123         int channels;
124         int buffer_samples;
125         int silence;
126         int size;
127         SDL_AudioCallback callback;
128         osd_snddata_capture_t userdata;
129 } osd_snd_capture_dev_desc_t;
130
131 typedef struct {
132         int physical_dev;
133         SDL_AudioFormat  read_format;
134         int read_rate;
135         int read_channels;
136         int read_samples;
137         int read_silence;
138         int read_size;
139         SDL_AudioCallback read_callback;
140         void *read_userdata;
141         // For output
142         int sample_type; // ToDo : ENUM
143         int rate;
144         int channels;
145         int samples;
146         int write_size;
147         int write_pos;
148         int read_pos;
149         int read_data_len;
150         int read_buffer_len;
151
152         uint8_t *read_buffer_ptr;
153         uint8_t *out_buffer;
154 } osd_snd_capture_desc_t;
155
156
157
158 class SOUND_BUFFER_QT;
159
160 class DLL_PREFIX OSD_BASE : public  QObject
161 {
162         Q_OBJECT
163 private:
164         #if 1 /* Note: Below are new sound driver. */
165         std::shared_ptr<SOUND_MODULE::OUTPUT::M_BASE> m_sound_driver;
166         int64_t elapsed_us_before_rendered;
167         #else /* Note */
168         qint64 sound_us_before_rendered;
169         qint64 elapsed_us_before_rendered;
170         SOUND_BUFFER_QT *m_audioOutput;
171         SOUND_BUFFER_QT *m_audioInput;
172
173         QAudioFormat m_audioOutputFormat;
174         QAudioFormat m_audioInputFormat;
175
176         #endif
177         // Count half
178         uint32_t     m_sound_period;
179         // Count factor; this multiplies by 65536;
180         uint32_t     m_sound_samples_count;
181         uint32_t     m_sound_samples_factor;
182
183 protected:
184         EmuThreadClass          *parent_thread;
185         sdl_snddata_t           snddata;
186         std::shared_ptr<USING_FLAGS>                    using_flags;
187         config_t                        *p_config;
188         std::shared_ptr<CSP_Logger> p_logger;
189
190         QOpenGLContext *glContext;
191         bool is_glcontext_shared;
192
193         QList<supportedlist_t> SupportedFeatures;
194
195         bool __USE_AUTO_KEY;
196
197         _TCHAR app_path[_MAX_PATH];
198         QElapsedTimer osd_timer;
199         bool locked_vm;
200         // console
201         virtual void initialize_console();
202         virtual void release_console();
203
204         FILE *hStdIn, *hStdOut;
205         QString console_cmd_str;
206
207         bool use_telnet;
208         std::atomic<bool> telnet_closed;
209         std::atomic<int> console_count;
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         double m_fps;
284
285         _TCHAR video_file_name[_MAX_PATH];
286         int rec_video_fps;
287
288         uint64_t dwAVIFileSize;
289         uint64_t lAVIFrames;
290
291         rec_video_thread_param_t rec_video_thread_param;
292
293         bool first_draw_screen;
294         bool first_invalidate;
295         bool self_invalidate;
296
297         // sound
298 #if defined(USE_SDL2)
299         SDL_AudioDeviceID audio_dev_id;
300 #else
301         int audio_dev_id;
302 #endif
303         SDL_AudioSpec snd_spec_req, snd_spec_presented;
304         void release_sound();
305 #if 0
306         static void audio_capture_callback(void *udata, Uint8 *stream, int len);
307         static void audio_callback(void *udata, Uint8 *stream, int len);
308         void convert_sound_format(uint8_t* dst1, uint8_t* dst2, int16_t* src1, int16_t* src2, int samples1, int samples2);
309 #endif
310         virtual void init_sound_device_list();
311         bool __FASTCALL calcurate_sample_factor(int rate, int samples, const bool force);
312
313         int m_sound_rate, m_sound_samples;
314         bool sound_ok, sound_started, now_mute;
315         bool sound_first_half;
316         QStringList sound_device_list;
317
318         _TCHAR sound_file_name[_MAX_PATH];
319         FILEIO* rec_sound_fio;
320         int rec_sound_bytes;
321         int rec_sound_buffer_ptr;
322
323         int sound_buffer_size;
324         int sound_data_len;
325         int sound_data_pos;
326         int sound_write_pos;
327         bool sound_exit;
328         bool sound_debug;
329         bool sound_initialized;
330         uint8_t *sound_buf_ptr;
331         Uint8 snd_total_volume;
332
333         // sound capture
334         QStringList sound_capture_device_list;
335         bool sound_capturing_emu[MAX_CAPTURE_SOUNDS];
336         osd_snd_capture_desc_t  sound_capture_desc[MAX_CAPTURE_SOUNDS]; // To EMU:: and VM::
337         bool capturing_sound[MAX_SOUND_CAPTURE_DEVICES];
338         osd_snd_capture_dev_desc_t  sound_capture_dev_desc[MAX_SOUND_CAPTURE_DEVICES]; // From physical devices
339         uint8_t sound_capture_buffer[MAX_SOUND_CAPTURE_DEVICES][32768];
340         // video device
341         virtual void initialize_video();
342         virtual void release_video();
343
344         bitmap_t dshow_screen_buffer;
345         int direct_show_width, direct_show_height;
346         bool direct_show_mute[2];
347
348         double movie_frame_rate;
349         int movie_sound_rate;
350
351         void enum_capture_devs();
352         bool connect_capture_dev(int index, bool pin);
353         int cur_capture_dev_index;
354         int num_capture_devs;
355         _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];
356
357         _TCHAR prn_file_name[_MAX_PATH];
358         FILEIO *prn_fio;
359         int prn_data, prn_wait_frames;
360         bool prn_strobe;
361
362         // socket
363         virtual void initialize_socket();
364         virtual void release_socket();
365
366         bool is_tcp[SOCKET_MAX];
367         bool host_mode[SOCKET_MAX];
368         int socket_delay[SOCKET_MAX];
369
370         // MIDI : Will implement
371         virtual void initialize_midi();
372         virtual void release_midi();
373
374         // wrapper
375         int max_vm_nodes;
376         QList<device_node_t> device_node_list;
377         void vm_draw_screen(void);
378         Sint16* create_sound(int *extra_frames);
379
380         virtual bool get_use_socket(void);
381         virtual bool get_use_auto_key(void);
382         virtual bool get_dont_keeep_key_pressed(void);
383         virtual bool get_one_board_micro_computer(void);
384         virtual bool get_use_screen_rotate(void);
385         virtual bool get_use_movie_player(void);
386         virtual bool get_use_video_capture(void);
387         void vm_key_down(int code, bool flag);
388         void vm_key_up(int code);
389         void vm_reset(void);
390
391         virtual int get_screen_width(void);
392         virtual int get_screen_height(void);
393         virtual int get_vm_buttons_code(int num);
394         virtual void update_input_mouse();
395
396         // Messaging.
397         virtual void __FASTCALL osdcall_message_str(EMU_MEDIA_TYPE::type_t media_type, int drive, EMU_MESSAGE_TYPE::type_t message_type, QString message);
398         virtual void __FASTCALL osdcall_message_int(EMU_MEDIA_TYPE::type_t media_type, int drive, EMU_MESSAGE_TYPE::type_t message_type, int64_t data);
399         virtual void __FASTCALL osdcall_mount(EMU_MEDIA_TYPE::type_t media_type, int drive, EMU_MESSAGE_TYPE::type_t message_type, QString path);
400         virtual void __FASTCALL osdcall_unmount(EMU_MEDIA_TYPE::type_t media_type, int drive, EMU_MESSAGE_TYPE::type_t message_type);
401         virtual void __FASTCALL osdcall_misc(EMU_MEDIA_TYPE::type_t media_type, int drive, EMU_MESSAGE_TYPE::type_t message_type, QString message_str, int64_t data);
402
403 public:
404         OSD_BASE(std::shared_ptr<USING_FLAGS> p, std::shared_ptr<CSP_Logger> logger);
405         ~OSD_BASE();
406
407         // common
408         VM_TEMPLATE* vm;
409         //EMU* emu;
410         class Ui_MainWindow *main_window_handle;
411
412         std::recursive_timed_mutex screen_mutex;
413         std::recursive_timed_mutex vm_mutex;
414         std::recursive_timed_mutex debug_mutex;
415         std::recursive_timed_mutex joystick_mutex;
416         std::recursive_timed_mutex mouse_mutex;
417         std::recursive_timed_mutex log_mutex;
418         int host_cpus;
419         bool now_auto_key;
420
421         virtual void initialize(int rate, int samples, int* presented_rate, int* presented_samples);
422         // sound
423         virtual void initialize_sound(int rate, int samples, int* presented_rate, int* presented_samples);
424
425         virtual void release();
426
427         void notify_power_off(); // For USE_NOTIFY_POWER_OFF .
428
429         void power_off();
430         void suspend();
431         void restore();
432         _TCHAR* application_path();
433         _TCHAR* bios_path(const _TCHAR* file_name);
434         void get_host_time(cur_time_t* time);
435         void sleep(uint32_t ms);
436         void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
437         _TCHAR  *get_app_path(void);
438         // common console
439         virtual void open_console(int width, int height, const _TCHAR* title);
440         virtual void close_console();
441         virtual unsigned int get_console_code_page();
442         virtual bool is_console_closed();
443
444         void set_console_text_attribute(unsigned short attr);
445         void write_console(const _TCHAR* buffer, unsigned int length);
446         int read_console_input(_TCHAR* buffer, int length);
447         bool is_console_key_pressed(uint32_t ch);
448         void update_keyname_table(void);
449         // console / telnet
450         virtual void open_telnet(const _TCHAR* title);
451         virtual void close_telnet();
452         virtual void send_telnet(const char* string);
453
454         // common input
455         void update_input();
456         void key_down(int code, bool extended, bool repeat);
457         void key_up(int code, bool extended);
458         void key_down_native(int code, bool repeat);
459         void key_up_native(int code);
460         void key_lost_focus();
461         void press_button(int num);
462
463 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
464         uint16_t GetAsyncKeyState(uint32_t vk);  // Win32 GetAsyncKeyState() wrappeer.
465 # endif
466         void key_modifiers(uint32_t mod);
467         bool is_mouse_enabled();
468         //QImage *getPseudoVramClass(void) { return pPseudoVram;}
469         void set_mouse_pointer(double x, double y);
470         void set_mouse_button(int button);
471         void modify_key_buffer(int code, uint8_t val);
472         uint8_t* get_key_buffer();
473         uint32_t* get_joy_buffer();
474         void release_joy_buffer(uint32_t* ptr);
475         int32_t get_mouse_button();
476         int32_t* get_mouse_buffer();
477         void release_mouse_buffer(int32_t* ptr);
478         // common printer
479         void reset_printer();
480         void update_printer();
481         void printer_out(uint8_t value);
482         void printer_strobe(bool value);
483         // printer
484         void initialize_printer();
485         void release_printer();
486         void open_printer_file();
487         void close_printer_file();
488
489         // common screen
490         int get_window_mode_width(int mode);
491         int get_window_mode_height(int mode);
492         double get_window_mode_power(int mode);
493         void set_host_window_size(int window_width, int window_height, bool window_mode);
494         void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height);
495         void set_vm_screen_lines(int lines); // 20170118
496         int get_vm_screen_width();
497         int get_vm_screen_height();
498
499         int get_vm_window_width();
500         int get_vm_window_height();
501         int get_vm_window_width_aspect();
502         int get_vm_window_height_aspect();
503         scrntype_t* get_vm_screen_buffer(int y);
504         void reset_screen_buffer()
505         {
506                 // It's ugly hack for screen.
507                 emit sig_resize_vm_screen((QImage*)NULL, -1, -1);
508         }
509         //int draw_screen();
510         //int no_draw_screen();
511         void reload_bitmap();
512         void capture_screen();
513         bool start_record_video(int fps);
514         void stop_record_video();
515         void restart_record_video();
516         void add_extra_frames(int extra_frames);
517         bool now_record_video;
518         bool screen_skip_line;
519         // common sound
520         void update_sound(int* extra_frames);
521         void mute_sound();
522         void unmute_sound();
523         void stop_sound();
524         void start_record_sound();
525         void stop_record_sound();
526         void restart_record_sound();
527
528         const _TCHAR *get_vm_device_name();
529         const _TCHAR *get_sound_device_name(int num);
530         QStringList  get_sound_device_list()
531         {
532                 return sound_device_list;
533         }
534
535         int get_sound_device_num();
536
537         bool now_record_sound;
538         int get_sound_rate();
539
540         // To VM:: and EMU::
541         void *get_capture_sound_buffer(int ch);
542         bool is_capture_sound_buffer(int ch);
543         void *open_capture_sound_emu(int ch, int rate, int channels, int sample_type, int samples, int physical_device_num);
544         void close_capture_sound_emu(int ch);
545
546         // From physical device?
547         bool open_sound_capture_device(int num, int req_rate, int req_channels);
548         bool close_sound_capture_device(int num, bool force);
549
550         // common video device
551         virtual void get_video_buffer();
552         void mute_video_dev(bool l, bool r);
553         virtual bool open_movie_file(const _TCHAR* file_path);
554         virtual void close_movie_file();
555         void play_movie();
556         void stop_movie();
557         void pause_movie();
558         double get_movie_frame_rate();
559         virtual int get_movie_sound_rate();
560         void set_cur_movie_frame(int frame, bool relative);
561         uint32_t get_cur_movie_frame();
562         bool now_movie_play, now_movie_pause;
563         int get_cur_capture_dev_index();
564         int get_num_capture_devs();
565         _TCHAR* get_capture_dev_name(int index);
566         void open_capture_dev(int index, bool pin);
567         void close_capture_dev();
568         void show_capture_dev_filter();
569         void show_capture_dev_pin();
570         void show_capture_dev_source();
571         void set_capture_dev_channel(int ch);
572
573         // common printer
574         void create_bitmap(bitmap_t *bitmap, int width, int height);
575         void release_bitmap(bitmap_t *bitmap);
576         void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
577         void release_font(font_t *font);
578         void create_pen(pen_t *pen, int width, uint8_t r, uint8_t g, uint8_t b);
579         void release_pen(pen_t *pen);
580
581         void clear_bitmap(bitmap_t *bitmap, uint8_t r, uint8_t g, uint8_t b);
582         int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
583
584         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);
585         void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
586         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);
587         void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b);
588
589         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);
590         void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
591         double vm_frame_rate(void);
592
593         // common socket
594         virtual SOCKET get_socket(int ch);
595         virtual void notify_socket_connected(int ch);
596         virtual void notify_socket_disconnected(int ch);
597         virtual void update_socket();
598         virtual bool initialize_socket_tcp(int ch);
599         virtual bool initialize_socket_udp(int ch);
600         virtual bool connect_socket(int ch, uint32_t ipaddr, int port);
601         virtual void disconnect_socket(int ch);
602         virtual bool listen_socket(int ch);
603         virtual void send_socket_data_tcp(int ch);
604         virtual void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
605         virtual void send_socket_data(int ch);
606         virtual void recv_socket_data(int ch);
607
608         // common MIDI
609         virtual void __FASTCALL send_to_midi(uint8_t data, int ch, double timestamp_usec);
610         virtual bool __FASTCALL recv_from_midi(uint8_t* data, int ch, double timestamp_usec);
611         virtual bool __FASTCALL send_to_midi_timeout(uint8_t data, int ch, uint64_t timeout_ms, double timestamp_usec);
612         virtual bool __FASTCALL recv_from_midi_timeout(uint8_t* data, int ch, uint64_t timeout_ms, double timestamp_usec);
613         // Note: Belows maybe make Qt SLOTs.
614         virtual void __FASTCALL notify_timeout_sending_to_midi(int ch);
615         virtual void __FASTCALL notify_timeout_receiving_from_midi(int ch);
616
617         virtual void reset_to_midi(int ch, double timestamp_usec);
618         virtual void initialize_midi_device(bool handshake_from_midi, bool handshake_to_midi, int ch);
619         virtual void __FASTCALL ready_receive_from_midi(int ch, double timestamp_usec);
620         virtual void __FASTCALL ready_send_to_midi(int ch, double timestamp_usec);
621
622         virtual void __FASTCALL request_stop_to_receive_from_midi(int ch, double timestamp_usec);
623         virtual void __FASTCALL request_stop_to_send_to_midi(int ch, double timestamp_usec);
624
625         // win32 dependent
626         void update_screen();
627         void set_parent_thread(EmuThreadClass *parent);
628         EmuThreadClass *get_parent_handler();
629
630         _TCHAR *console_input_string(void);
631         void clear_console_input_string(void);
632
633         void lock_vm(void);
634         void unlock_vm(void);
635         void force_unlock_vm(void);
636         bool is_vm_locked(void);
637         virtual const _TCHAR *get_lib_common_vm_version();
638         const _TCHAR *get_lib_common_vm_git_version();
639         const _TCHAR *get_lib_osd_version();
640
641         // Wrapper
642         virtual void set_draw_thread(DrawThreadClass *handler);
643         virtual QString get_vm_config_name(void);
644         virtual void reset_vm_node(void);
645
646         void set_device_name(int id, char *name);
647
648         void set_vm_node(int id, const _TCHAR *name);
649         const _TCHAR *get_vm_node_name(int id);
650         int get_vm_node_size(void);
651
652         int get_key_name_table_size(void);
653         uint32_t get_scancode_by_vk(uint32_t vk);
654         uint32_t get_vk_by_scancode(uint32_t scancode);
655         const _TCHAR *get_key_name_by_scancode(uint32_t scancode);
656         const _TCHAR *get_key_name_by_vk(uint32_t vk);
657
658         // Get #define S to value.You may use inside of VM/ .
659         virtual void set_features(void) {}
660         void add_feature(const _TCHAR *key, double value);
661         void add_feature(const _TCHAR *key, float value);
662         void add_feature(const _TCHAR *key, int value = 1);
663         void add_feature(const _TCHAR *key, int64_t value);
664         void add_feature(const _TCHAR *key, int16_t value);
665         void add_feature(const _TCHAR *key, int8_t value);
666         void add_feature(const _TCHAR *key, uint64_t value);
667         void add_feature(const _TCHAR *key, uint32_t value);
668         void add_feature(const _TCHAR *key, uint16_t value);
669         void add_feature(const _TCHAR *key, uint8_t value);
670         bool check_feature(const _TCHAR *key);
671         double get_feature_double_value(const _TCHAR *key);
672         int get_feature_int_value(const _TCHAR *key);
673         int64_t get_feature_int64_value(const _TCHAR *key);
674         int32_t get_feature_int32_value(const _TCHAR *key);
675         int16_t get_feature_int16_value(const _TCHAR *key);
676         int8_t get_feature_int8_value(const _TCHAR *key);
677
678         uint64_t get_feature_uint64_value(const _TCHAR *key);
679         uint32_t get_feature_uint32_value(const _TCHAR *key);
680         uint16_t get_feature_uint16_value(const _TCHAR *key);
681         uint8_t get_feature_uint8_value(const _TCHAR *key);
682
683         void debug_log(int level, const char *fmt, ...);
684         void debug_log(int level, int domain_num, const char *fmt, ...);
685         void debug_log(int level, int domain_num, char *strbuf);
686         virtual double get_vm_current_usec() { return 0.0; }
687         virtual uint64_t get_vm_current_clock_uint64() { return 0;}
688
689         std::shared_ptr<USING_FLAGS> get_config_flags(void) { return using_flags; }
690         // Special
691         std::shared_ptr<CSP_Logger> get_logger(void) { return p_logger; }
692         virtual bool set_glview(GLDrawClass *glv) { /* Dummy */ return false;}
693         QOpenGLContext *get_gl_context();
694         virtual GLDrawClass *get_gl_view() { return NULL; }
695
696         // common debugger
697         void start_waiting_in_debugger();
698         void finish_waiting_in_debugger();
699         void process_waiting_in_debugger();
700
701         // Messaging wrapper from EMU:: to OSD::
702         void __FASTCALL string_message_from_emu(EMU_MEDIA_TYPE::type_t media_type, int drive, EMU_MESSAGE_TYPE::type_t  message_type, _TCHAR* message);
703         void __FASTCALL int_message_from_emu(EMU_MEDIA_TYPE::type_t media_type, int drive, EMU_MESSAGE_TYPE::type_t message_type, int64_t data);
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         void do_set_host_sound_output_device(QString device_name);
736         void do_update_master_volume(int level);
737
738 signals:
739         int sig_update_screen(void *, bool);
740         int sig_save_screen(const char *);
741         int sig_draw_frames(int);
742         int sig_close_window(void);
743         int sig_resize_vm_screen(QImage *, int, int);
744         int sig_resize_vm_lines(int);
745         int sig_put_string_debugger(QString);
746         int sig_console_input_string(QString);
747         int sig_enqueue_video(int, int, int, QImage *);
748         int sig_enqueue_audio(int16_t *data, int size);
749         int sig_movie_set_width(int);
750         int sig_movie_set_height(int);
751         int sig_debugger_finished();
752         int sig_req_encueue_video(int, int, int);
753         int sig_save_as_movie(QString, int, int);
754         int sig_stop_saving_movie();
755
756         int sig_movie_open(QString);
757         int sig_movie_play();
758         int sig_movie_stop();
759         int sig_movie_pause(bool);
760         int sig_movie_seek_frame(bool, int);
761         int sig_movie_mute(bool, bool);
762         int sig_movie_eject();
763         int sig_movie_quit();
764
765         int sig_set_sound_device(QString);
766         int sig_set_sound_volume(double);
767         int sig_set_sound_volume(int);
768
769         int sig_update_sound_output_list();
770         int sig_clear_sound_output_list();
771         int sig_append_sound_output_list(QString);
772
773         int sig_update_device_node_name(int id, const _TCHAR *name);
774         int sig_enable_mouse(void);
775         int sig_disable_mouse(void);
776         int sig_close_console(void);
777         int sig_set_attribute_debugger(QString, bool);
778         int sig_move_mouse_to_center(void);
779         int sig_clear_dbg_completion_list(void);
780         int sig_add_dbg_completion_list(_TCHAR *);
781         int sig_apply_dbg_completion_list(void);
782
783         int sig_clear_keyname_table(void);
784         int sig_add_keyname_table(uint32_t, QString);
785
786         int sig_change_virtual_media(int, int, QString);
787
788         int sig_notify_power_off(void); // To GUI 20230120 K.O
789
790         // To GUI 20230125 K.O
791         int sig_ui_floppy_insert_history(int, QString, quint64);
792         int sig_ui_floppy_close(int);
793         int sig_ui_floppy_write_protect(int, quint64);
794
795         int sig_ui_quick_disk_insert_history(int, QString);
796         int sig_ui_quick_disk_close(int);
797         int sig_ui_quick_disk_write_protect(int, quint64);
798
799         int sig_ui_hard_disk_insert_history(int, QString);
800         int sig_ui_hard_disk_close(int);
801
802         int sig_ui_cartridge_insert_history(int, QString);
803         int sig_ui_cartridge_eject(int);
804
805         int sig_ui_tape_play_insert_history(int, QString);
806         int sig_ui_tape_record_insert_history(int, QString);
807         int sig_ui_tape_eject(int);
808         int sig_ui_tape_position(int, int);
809         int sig_ui_tape_message(int, QString);
810         int sig_ui_tape_write_protect(int, quint64);
811
812         int sig_ui_tape_push_play(int);
813         int sig_ui_tape_push_stop(int);
814         int sig_ui_tape_push_fast_forward(int);
815         int sig_ui_tape_push_fast_rewind(int);
816         int sig_ui_tape_push_apss_forward(int);
817         int sig_ui_tape_push_apss_rewind(int);
818         int sig_ui_tape_push_pause(int, bool);
819
820         int sig_ui_compact_disc_insert_history(int, QString);
821         int sig_ui_compact_disc_eject(int);
822         int sig_ui_compact_disc_pause(int);
823
824         int sig_ui_laser_disc_insert_history(int, QString);
825         int sig_ui_laser_disc_eject(int);
826         int sig_ui_laser_disc_pause(int);
827
828         int sig_ui_binary_loading_insert_history(int, QString);
829         int sig_ui_binary_saving_insert_history(int, QString);
830         int sig_ui_binary_closed(int);
831
832         int sig_ui_bubble_insert_history(int, QString, quint64);
833         int sig_ui_bubble_closed(int);
834         int sig_ui_bubble_write_protect(int, quint64);
835
836         // To Logger.
837         int sig_debug_log(int, int, QString);
838         int sig_logger_reset();
839         int sig_logger_set_device_name(int, QString);
840         int sig_logger_set_cpu_name(int, QString);
841 };
842
843 QT_END_NAMESPACE
844
845 #endif