OSDN Git Service

[Qt][OSD] Prepair to add recording to video.
[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 <QWidget>
15 #include <QThread>
16 #include <QMutex>
17 #include <QSemaphore>
18 #include <QPainter>
19 #include <QElapsedTimer>
20 #include <QString>
21 #include <QQueue>
22
23 #include <SDL.h>
24 #include "simd_types.h"
25
26 #include <ctime>
27
28 //#include "../vm/vm.h"
29 //#include "../emu.h"
30 #include "../config.h"
31 #include "../fileio.h"
32 #include "../fifo.h"
33 #if !defined(Q_OS_WIN32)
34 #include "qt_input.h"
35 #endif
36 #define SOCKET_MAX 4
37 #define SOCKET_BUFFER_MAX 0x100000
38 #include "osd_types.h"
39
40
41 #define WM_RESIZE  (WM_USER + 1)
42 #define WM_SOCKET0 (WM_USER + 2)
43 #define WM_SOCKET1 (WM_USER + 3)
44 #define WM_SOCKET2 (WM_USER + 4)
45 #define WM_SOCKET3 (WM_USER + 5)
46
47 //#ifdef USE_VIDEO_CAPTURE
48 #define MAX_CAPTURE_DEVS 8
49 //#endif
50
51 #include "qt_main.h"
52 //#include "mainwidget.h"
53 #include "agar_logger.h"
54
55 class GLDrawClass;
56 class EmuThreadClass;
57 class DrawThreadClass;
58 class Ui_MainWindow;
59 class EMU;
60 class VM;
61 class FIFO;
62 class CSP_KeyTables;
63
64 QT_BEGIN_NAMESPACE
65 class OSD_BASE : public QThread
66 {
67         Q_OBJECT
68 protected:
69         EmuThreadClass *parent_thread;
70         QSemaphore *VMSemaphore;
71         QSemaphore *DebugSemaphore;
72         sdl_snddata_t snddata;
73 //private:
74         _TCHAR app_path[_MAX_PATH];
75         QElapsedTimer osd_timer;
76         bool locked_vm;
77         
78         // console
79         FILE *hStdIn, *hStdOut;
80         QString console_cmd_str;
81         bool osd_console_opened;
82         // input
83         void initialize_input();
84         void release_input();
85         void key_down_sub(int code, bool repeat);
86         void key_up_sub(int code);
87         CSP_KeyTables *key_table;
88         
89         scrntype_t *get_buffer(bitmap_t *p, int y);
90         bool dinput_key_ok;
91 //      bool dinput_joy_ok;
92         
93         uint8_t keycode_conv[256];
94         uint8_t key_status[256];        // windows key code mapping
95         uint8_t key_dik_prev[256];
96         uint8_t key_converted[256];
97         bool key_shift_pressed, key_shift_released;
98
99
100         uint32_t modkey_status;
101         bool lost_focus;
102         uint32_t joy_status[4]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons
103         int joy_num;
104         uint32_t joy_mask[4];
105         
106         int mouse_status[3];    // x, y, button (b0 = left, b1 = right)
107         bool mouse_enabled;
108         int mouse_ptrx;
109         int mouse_ptry;
110         int mouse_button;
111         int mouse_oldx;
112         int mouse_oldy;
113         Qt::CursorShape mouse_shape;
114         
115         // printer
116         
117         // screen
118         void initialize_screen();
119         void release_screen();
120         void initialize_screen_buffer(bitmap_t *buffer, int width, int height, int mode);
121         void release_screen_buffer(bitmap_t *buffer);
122         void rotate_screen_buffer(bitmap_t *source, bitmap_t *dest);
123         
124         void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest);
125         int add_video_frames();
126         
127         bitmap_t vm_screen_buffer;
128         bitmap_t video_screen_buffer;
129         bitmap_t* draw_screen_buffer;
130         int vm_window_width, vm_window_height;
131         int vm_window_width_aspect, vm_window_height_aspect;
132         
133         int host_window_width, host_window_height;
134         bool host_window_mode;
135         int base_window_width, base_window_height;
136         int vm_screen_width, vm_screen_height;
137         int draw_screen_width, draw_screen_height;
138         
139         
140         _TCHAR video_file_name[_MAX_PATH];
141         int rec_video_fps;
142         double rec_video_run_frames;
143         double rec_video_frames;
144         
145         //LPBITMAPINFO lpDibRec;
146         //PAVIFILE pAVIFile;
147         //PAVISTREAM pAVIStream;
148         //PAVISTREAM pAVICompressed;
149         //AVICOMPRESSOPTIONS AVIOpts;
150         uint64_t dwAVIFileSize;
151         uint64_t lAVIFrames;
152         //HANDLE hVideoThread;
153         rec_video_thread_param_t rec_video_thread_param;
154         
155         bool first_draw_screen;
156         bool first_invalidate;
157         bool self_invalidate;
158         
159         // sound
160         void initialize_sound(int rate, int samples);
161         void release_sound();
162         static void audio_callback(void *udata, Uint8 *stream, int len);
163         int sound_rate, sound_samples;
164         bool sound_ok, sound_started, now_mute;
165         bool sound_first_half;
166         
167         _TCHAR sound_file_name[_MAX_PATH];
168         FILEIO* rec_sound_fio;
169         int rec_sound_bytes;
170         int rec_sound_buffer_ptr;
171         
172         int sound_buffer_size;
173         int sound_data_len;
174         int sound_data_pos;
175         int sound_write_pos;
176         bool sound_exit;
177         bool sound_debug;
178         SDL_sem *snd_apply_sem;
179         Sint16 *sound_buf_ptr;
180         Uint8 snd_total_volume;
181 #if defined(USE_SDL2)   
182         SDL_AudioDeviceID audio_dev_id;
183 #else
184         int audio_dev_id;
185 #endif
186         SDL_AudioSpec snd_spec_req, snd_spec_presented;
187         
188         // video device
189         void initialize_video();
190         void release_video();
191         
192         //IGraphBuilder *pGraphBuilder;
193         //IBaseFilter *pVideoBaseFilter;
194         //IBaseFilter *pCaptureBaseFilter;
195         //ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
196         //ISampleGrabber *pVideoSampleGrabber;
197         //IBaseFilter *pSoundBaseFilter;
198         //ISampleGrabber *pSoundSampleGrabber;
199         //CMySampleGrabberCB *pSoundCallBack;
200         //IMediaControl *pMediaControl;
201         //IMediaSeeking *pMediaSeeking;
202         //IMediaPosition *pMediaPosition;
203         //IVideoWindow *pVideoWindow;
204         //IBasicVideo *pBasicVideo;
205         //IBasicAudio *pBasicAudio;
206         //bool bTimeFormatFrame;
207         //bool bVerticalReversed;
208         
209         bitmap_t dshow_screen_buffer;
210         int direct_show_width, direct_show_height;
211         bool direct_show_mute[2];
212
213         double movie_frame_rate;
214         int movie_sound_rate;
215
216         void enum_capture_devs();
217         bool connect_capture_dev(int index, bool pin);
218         int cur_capture_dev_index;
219         int num_capture_devs;
220         _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];
221
222         _TCHAR prn_file_name[_MAX_PATH];
223         FILEIO *prn_fio;
224         int prn_data, prn_wait_frames;
225         bool prn_strobe;
226
227         // socket
228         void initialize_socket();
229         void release_socket();
230         
231         int soc[SOCKET_MAX];
232         bool is_tcp[SOCKET_MAX];
233         //struct sockaddr_in udpaddr[SOCKET_MAX];
234         int socket_delay[SOCKET_MAX];
235         char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX];
236         int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX];
237
238         // wrapper
239         virtual void vm_draw_screen(void);
240         virtual double vm_frame_rate(void);
241         virtual Sint16* create_sound(int *extra_frames);
242         virtual bool get_use_socket(void);
243         virtual bool get_support_variable_timing(void);
244         virtual bool get_notify_key_down(void);
245         virtual bool get_notify_key_down_lr_shift(void);
246         virtual bool get_notify_key_down_lr_control(void);
247         virtual bool get_notify_key_down_lr_menu(void);
248         virtual bool get_use_shift_numpad_key(void);
249         virtual bool get_use_auto_key(void);
250         virtual bool get_dont_keeep_key_pressed(void);
251         virtual bool get_one_board_micro_computer(void);
252         virtual bool get_use_screen_rotate(void);
253         virtual bool get_use_movie_player(void);
254         virtual bool get_use_video_capture(void);
255         virtual void vm_key_down(int code, bool flag);
256         virtual void vm_key_up(int code);
257         virtual void vm_reset(void);
258         virtual void update_buttons(bool press_flag, bool release_flag);
259         virtual int get_screen_width(void);
260         virtual int get_screen_height(void);
261         virtual int get_vm_buttons_code(int num);
262
263 public:
264         OSD_BASE();
265         ~OSD_BASE();
266         
267         // common
268         VM* vm;
269         //EMU* emu;
270         class Ui_MainWindow *main_window_handle;
271         GLDrawClass *glv;
272         int host_cpus;
273         bool now_auto_key;
274         
275         virtual void initialize(int rate, int samples);
276         virtual void release();
277         virtual void power_off();
278         void suspend();
279         void restore();
280         _TCHAR* application_path();
281         _TCHAR* bios_path(const _TCHAR* file_name);
282         void get_host_time(cur_time_t* time);
283         void sleep(uint32_t ms);
284         void create_date_file_name(_TCHAR *name, int length, const _TCHAR *extension);
285         
286         // common console
287         void open_console(_TCHAR* title);
288         void close_console();
289         unsigned int get_console_code_page();
290         bool is_console_active();
291         void set_console_text_attribute(unsigned short attr);
292         void write_console(_TCHAR* buffer, unsigned int length);
293         int read_console_input(_TCHAR* buffer);
294         bool is_console_key_pressed(uint32_t ch);
295         
296         // common input
297         void update_input();
298         void key_down(int code, bool repeat);
299         void key_up(int code);
300         void key_down_native(int code, bool repeat);
301         void key_up_native(int code);
302         void key_lost_focus();
303         void press_button(int num);
304
305 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
306         uint16_t GetAsyncKeyState(uint32_t vk);  // Win32 GetAsyncKeyState() wrappeer.
307 # endif
308         void key_modifiers(uint32_t mod);
309         void enable_mouse();
310         void disable_mouse();
311         void toggle_mouse();
312         bool is_mouse_enabled();
313         //QImage *getPseudoVramClass(void) { return pPseudoVram;}
314         void set_mouse_pointer(int x, int y);
315         void set_mouse_button(int button);
316         int get_mouse_button();
317         void modify_key_buffer(int code, uint8_t val);
318         uint8_t* get_key_buffer();
319         uint32_t* get_joy_buffer();
320         int* get_mouse_buffer();
321         // common printer
322         void reset_printer();
323         void update_printer();
324         void printer_out(uint8_t value);
325         void printer_strobe(bool value);
326         // printer
327         void initialize_printer();
328         void release_printer();
329         void open_printer_file();
330         void close_printer_file();
331         
332         // common screen
333         int get_window_mode_width(int mode);
334         int get_window_mode_height(int mode);
335         void set_host_window_size(int window_width, int window_height, bool window_mode);
336         void set_vm_screen_size(int width, int height, int width_aspect, int height_aspect, int window_width, int window_height);
337         int get_vm_window_width();
338         int get_vm_window_height();
339         int get_vm_window_width_aspect();
340         int get_vm_window_height_aspect();
341         scrntype_t* get_vm_screen_buffer(int y);
342         int draw_screen();
343         void reload_bitmap();
344         void capture_screen();
345         bool start_record_video(int fps);
346         void stop_record_video();
347         void restart_record_video();
348         void add_extra_frames(int extra_frames);
349         bool now_record_video;
350         bool screen_skip_line;
351         // common sound
352         void update_sound(int* extra_frames);
353         void mute_sound();
354         void stop_sound();
355         void start_record_sound();
356         void stop_record_sound();
357         void restart_record_sound();
358         bool now_record_sound;
359         int get_sound_rate();
360         
361         // common video device
362         void get_video_buffer();
363         void mute_video_dev(bool l, bool r);
364         bool open_movie_file(const _TCHAR* file_path);
365         void close_movie_file();
366         void play_movie();
367         void stop_movie();
368         void pause_movie();
369         double get_movie_frame_rate();
370         int get_movie_sound_rate();
371         void set_cur_movie_frame(int frame, bool relative);
372         uint32_t get_cur_movie_frame();
373         bool now_movie_play, now_movie_pause;
374         int get_cur_capture_dev_index();
375         int get_num_capture_devs();
376         _TCHAR* get_capture_dev_name(int index);
377         void open_capture_dev(int index, bool pin);
378         void close_capture_dev();
379         void show_capture_dev_filter();
380         void show_capture_dev_pin();
381         void show_capture_dev_source();
382         void set_capture_dev_channel(int ch);
383         
384         // common printer
385         void create_bitmap(bitmap_t *bitmap, int width, int height);
386         void release_bitmap(bitmap_t *bitmap);
387         void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
388         void release_font(font_t *font);
389         void create_pen(pen_t *pen, int width, uint8_t r, uint8_t g, uint8_t b);
390         void release_pen(pen_t *pen);
391
392         void clear_bitmap(bitmap_t *bitmap, uint8_t r, uint8_t g, uint8_t b);
393         int get_text_width(bitmap_t *bitmap, font_t *font, const char *text);
394         
395         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);
396         void draw_line_to_bitmap(bitmap_t *bitmap, pen_t *pen, int sx, int sy, int ex, int ey);
397         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);
398         void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b);
399
400         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);
401         void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
402
403         // common socket
404         int get_socket(int ch);
405         void notify_socket_connected(int ch);
406         void notify_socket_disconnected(int ch);
407         void update_socket();
408         bool initialize_socket_tcp(int ch);
409         bool initialize_socket_udp(int ch);
410         bool connect_socket(int ch, uint32_t ipaddr, int port);
411         void disconnect_socket(int ch);
412         bool listen_socket(int ch);
413         void send_socket_data_tcp(int ch);
414         void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
415         void send_socket_data(int ch);
416         void recv_socket_data(int ch);
417
418         // win32 dependent
419         void update_screen();
420         void set_parent_thread(EmuThreadClass *parent);
421         EmuThreadClass *get_parent_handler();
422
423         _TCHAR *console_input_string(void);
424         void clear_console_input_string(void);
425         // Wrapper
426         virtual void lock_vm(void);
427         virtual void unlock_vm(void);
428         virtual void force_unlock_vm(void);
429         virtual bool is_vm_locked(void);
430         virtual void set_draw_thread(DrawThreadClass *handler);
431         virtual QString get_vm_config_name(void);
432         
433 public slots:
434         void do_write_inputdata(QString s);
435         void do_set_input_string(QString s);
436         void close_debugger_console();
437         void do_close_debugger_thread();
438         void do_assign_js_setting(int jsnum, int axis_idx, int assigned_value);
439         
440 signals:
441         int sig_update_screen(bitmap_t *);
442         int sig_save_screen(const char *);
443         int sig_close_window(void);
444         int sig_resize_vm_screen(QImage *, int, int);
445         int sig_put_string_debugger(QString);
446         int sig_console_input_string(QString);
447         int sig_enqueue_video(QByteArray *data, int width, int height); 
448         int sig_enqueue_audio(QByteArray *data); 
449         int sig_debugger_finished();
450 };
451 QT_END_NAMESPACE
452
453 #endif