1 #include <sigc++/bind.h>
2 #include <msp/core/getopt.h>
3 #include <msp/fs/dir.h>
4 #include <msp/graphics/display_private.h>
5 #include <msp/graphics/window_private.h>
6 #include <msp/io/print.h>
12 Xinema::EarlyInit::EarlyInit()
18 Xinema::Xinema(int argc, char **argv):
19 window(display, 1920, 1080)
22 getopt.add_argument("filename", filename, GetOpt::REQUIRED_ARG);
25 window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Xinema::exit), 0));
32 FS::Path config_fn = FS::get_home_dir()/".xine"/"config";
33 xine_config_load(xine, config_fn.c_str());
37 xine_audio = xine_open_audio_driver(xine, "auto", 0);
39 XLockDisplay(display.get_private().display);
41 XSync(display.get_private().display, false);
42 XUnlockDisplay(display.get_private().display);
44 xine_visual.display = display.get_private().display;
45 xine_visual.screen = 0;
46 xine_visual.d = window.get_private().window;
47 xine_visual.user_data = this;
48 xine_visual.dest_size_cb = &dest_size_cb;
49 xine_visual.frame_output_cb = &frame_output_cb;
51 xine_video = xine_open_video_driver(xine, "auto", XINE_VISUAL_TYPE_X11, &xine_visual);
53 xine_stream = xine_stream_new(xine, xine_audio, xine_video);
54 xine_open(xine_stream, filename.c_str());
55 xine_play(xine_stream, 0, 0);
57 xine_queue = xine_event_new_queue(xine_stream);
61 xine_close(xine_stream);
62 xine_event_dispose_queue(xine_queue);
63 xine_dispose(xine_stream);
64 xine_close_video_driver(xine, xine_video);
65 xine_close_audio_driver(xine, xine_audio);
73 XLockDisplay(display.get_private().display);
75 XUnlockDisplay(display.get_private().display);
77 while(xine_event_t *event = xine_event_get(xine_queue))
81 case XINE_EVENT_PROGRESS:
83 xine_progress_data_t *data = reinterpret_cast<xine_progress_data_t *>(event->data);
84 IO::print("%s [%d%%]\n", data->description, data->percent);
91 void Xinema::dest_size_cb(void *user_data, int, int, double, int *dest_width, int *dest_height, double *dest_pixel_aspect)
93 Xinema &xinema = *reinterpret_cast<Xinema *>(user_data);
94 *dest_width = xinema.window.get_width();
95 *dest_height = xinema.window.get_height();
96 *dest_pixel_aspect = 1.0;
99 void Xinema::frame_output_cb(void *user_data, int, int, double, int *dest_x, int *dest_y, int *dest_width, int *dest_height, double *dest_pixel_aspect, int *win_x, int *win_y)
101 Xinema &xinema = *reinterpret_cast<Xinema *>(user_data);
104 *dest_width = xinema.window.get_width();
105 *dest_height = xinema.window.get_height();
106 *dest_pixel_aspect = 1.0;