X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fxineengine.cpp;h=5dadc93a5c7cfb35c23ffba992d871d23a166290;hb=2077f6b76cb7cd8e4095b4421d2c67c50752d6b7;hp=4175381b8d3a0a4b9f1782f9df00967a1b7121b4;hpb=4157ae2c48c539a3bbe609ab143d4c1454fd1748;p=xinema.git diff --git a/source/xineengine.cpp b/source/xineengine.cpp index 4175381..5dadc93 100644 --- a/source/xineengine.cpp +++ b/source/xineengine.cpp @@ -1,17 +1,20 @@ +#include #include #include #include #include #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::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::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(user_data);