]> git.tdb.fi Git - xinema.git/blobdiff - source/xinema.cpp
Avoid crashing due to network exceptions
[xinema.git] / source / xinema.cpp
index c7ffa810b6a357ebb146c7a7c5b6bc7407426242..bc70c4154c04bec4aa63f49bd3cfe6855a73cd1e 100644 (file)
@@ -1,4 +1,6 @@
 #include <sigc++/bind.h>
+#include <msp/fs/dir.h>
+#include <msp/graphics/display_private.h>
 #include <msp/time/utils.h>
 #include "xineengine.h"
 #include "xinema.h"
@@ -7,6 +9,12 @@
 using namespace std;
 using namespace Msp;
 
+Xinema::EarlyInit::EarlyInit()
+{
+       XInitThreads();
+}
+
+
 Xinema::Xinema(int, char **):
        window(display, 1920, 1080),
        network(*this),
@@ -21,7 +29,8 @@ int Xinema::main()
        window.show();
        display.tick();
 
-       engine = new XineEngine(window, &display_mutex);
+       engine = new XineEngine(window);
+       play_file(FS::get_sys_data_dir()/"xinema.png");
 
        Application::main();
 
@@ -34,6 +43,8 @@ int Xinema::main()
 
 void Xinema::tick()
 {
+       bool new_stream = false;
+
        {
                MutexLock lock(command_mutex);
                if(!pending_mrl.empty())
@@ -42,13 +53,16 @@ void Xinema::tick()
                        stream = new XineStream(*engine, pending_mrl);
                        stream->play();
                        pending_mrl.clear();
+                       new_stream = true;
                }
        }
 
-       {
-               MutexLock lock(display_mutex);
-               display.tick();
-       }
+       if(new_stream)
+               signal_stream_created.emit(*stream);
+
+       XLockDisplay(display.get_private().display);
+       display.tick();
+       XUnlockDisplay(display.get_private().display);
 
        engine->tick();