]> git.tdb.fi Git - xinema.git/blob - source/xineengine.cpp
Revert to using XLockDisplay/XUnlockDisplay
[xinema.git] / source / xineengine.cpp
1 #include <algorithm>
2 #include <stdexcept>
3 #include <msp/fs/dir.h>
4 #include <msp/graphics/display_private.h>
5 #include <msp/graphics/window_private.h>
6 #include "xineengine.h"
7 #include "xinestream.h"
8
9 using namespace std;
10 using namespace Msp;
11
12 XineEngine::XineEngine(Graphics::Window &w):
13         window(w),
14         pending_expose(0)
15 {
16         engine = xine_new();
17
18         FS::Path config_fn = FS::get_home_dir()/".xine"/"config";
19         xine_config_load(engine, config_fn.c_str());
20
21         xine_init(engine);
22
23         audio_driver = xine_open_audio_driver(engine, "auto", 0);
24         if(!audio_driver)
25                 throw runtime_error("Could not open audio driver");
26
27         visual.display = window.get_display().get_private().display;
28         visual.screen = 0;
29         visual.d = window.get_private().window;
30         visual.user_data = this;
31         visual.dest_size_cb = &dest_size_cb;
32         visual.frame_output_cb = &frame_output_cb;
33         visual.lock_display = 0;
34         visual.unlock_display = 0;
35
36         video_driver = xine_open_video_driver(engine, "auto", XINE_VISUAL_TYPE_X11, &visual);
37         if(!video_driver)
38                 throw runtime_error("Could not open video driver");
39
40         window.signal_expose.connect(sigc::mem_fun(this, &XineEngine::window_exposed));
41 }
42
43 XineEngine::~XineEngine()
44 {
45         xine_close_video_driver(engine, video_driver);
46         xine_close_audio_driver(engine, audio_driver);
47         xine_exit(engine);
48 }
49
50 void XineEngine::add_stream(XineStream &stream)
51 {
52         streams.push_back(&stream);
53 }
54
55 void XineEngine::remove_stream(XineStream &stream)
56 {
57         list<XineStream *>::iterator i = find(streams.begin(), streams.end(), &stream);
58         if(i!=streams.end())
59                 streams.erase(i);
60 }
61
62 void XineEngine::tick()
63 {
64         if(pending_expose)
65         {
66                 xine_port_send_gui_data(video_driver, XINE_GUI_SEND_EXPOSE_EVENT, &pending_expose->xevent);
67                 delete pending_expose;
68                 pending_expose = 0;
69         }
70
71         for(list<XineStream *>::const_iterator i=streams.begin(); i!=streams.end(); ++i)
72                 (*i)->tick();
73 }
74
75 void XineEngine::window_exposed(unsigned, unsigned, unsigned, unsigned, const Graphics::Window::Event &event)
76 {
77         delete pending_expose;
78         pending_expose = new Graphics::Window::Event(event);
79 }
80
81 void XineEngine::dest_size_cb(void *user_data, int, int, double, int *dest_width, int *dest_height, double *dest_pixel_aspect)
82 {
83         XineEngine &engine = *reinterpret_cast<XineEngine *>(user_data);
84         *dest_width = engine.window.get_width();
85         *dest_height = engine.window.get_height();
86         *dest_pixel_aspect = 1.0;
87 }
88
89 void XineEngine::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)
90 {
91         XineEngine &engine = *reinterpret_cast<XineEngine *>(user_data);
92         *dest_x = 0;
93         *dest_y = 0;
94         *dest_width = engine.window.get_width();
95         *dest_height = engine.window.get_height();
96         *dest_pixel_aspect = 1.0;
97         *win_x = 0;
98         *win_y = 0;
99 }