]> git.tdb.fi Git - xinema.git/blobdiff - source/xineengine.cpp
Refactor code to have the engine tick any streams
[xinema.git] / source / xineengine.cpp
index 4175381b8d3a0a4b9f1782f9df00967a1b7121b4..5dadc93a5c7cfb35c23ffba992d871d23a166290 100644 (file)
@@ -1,17 +1,20 @@
+#include <algorithm>
 #include <stdexcept>
 #include <msp/fs/dir.h>
 #include <msp/graphics/display_private.h>
 #include <msp/graphics/window_private.h>
 #include "xineengine.h"
+#include "xinestream.h"
 
 using namespace std;
 using namespace Msp;
 
-XineEngine::XineEngine(const Graphics::Window &w, Mutex *m):
+XineEngine::XineEngine(Graphics::Window &w, Mutex *m):
        window(w),
        display_mutex(m),
        locked_thread(0),
-       lock_count(0)
+       lock_count(0),
+       pending_expose(0)
 {
        engine = xine_new();
 
@@ -44,6 +47,8 @@ XineEngine::XineEngine(const Graphics::Window &w, Mutex *m):
        video_driver = xine_open_video_driver(engine, "auto", XINE_VISUAL_TYPE_X11_2, &visual);
        if(!video_driver)
                throw runtime_error("Could not open video driver");
+
+       window.signal_expose.connect(sigc::mem_fun(this, &XineEngine::window_exposed));
 }
 
 XineEngine::~XineEngine()
@@ -53,6 +58,37 @@ XineEngine::~XineEngine()
        xine_exit(engine);
 }
 
+void XineEngine::add_stream(XineStream &stream)
+{
+       streams.push_back(&stream);
+}
+
+void XineEngine::remove_stream(XineStream &stream)
+{
+       list<XineStream *>::iterator i = find(streams.begin(), streams.end(), &stream);
+       if(i!=streams.end())
+               streams.erase(i);
+}
+
+void XineEngine::tick()
+{
+       if(pending_expose)
+       {
+               xine_port_send_gui_data(video_driver, XINE_GUI_SEND_EXPOSE_EVENT, &pending_expose->xevent);
+               delete pending_expose;
+               pending_expose = 0;
+       }
+
+       for(list<XineStream *>::const_iterator i=streams.begin(); i!=streams.end(); ++i)
+               (*i)->tick();
+}
+
+void XineEngine::window_exposed(unsigned, unsigned, unsigned, unsigned, const Graphics::Window::Event &event)
+{
+       delete pending_expose;
+       pending_expose = new Graphics::Window::Event(event);
+}
+
 void XineEngine::dest_size_cb(void *user_data, int, int, double, int *dest_width, int *dest_height, double *dest_pixel_aspect)
 {
        XineEngine &engine = *reinterpret_cast<XineEngine *>(user_data);