#include <sigc++/bind.h>
-#include <msp/core/getopt.h>
+#include <msp/fs/dir.h>
+#include <msp/graphics/display_private.h>
+#include <msp/time/utils.h>
#include "xineengine.h"
#include "xinema.h"
#include "xinestream.h"
using namespace std;
using namespace Msp;
-Xinema::Xinema(int argc, char **argv):
- window(display, 1920, 1080)
+Xinema::EarlyInit::EarlyInit()
{
- GetOpt getopt;
- getopt.add_argument("filename", filename, GetOpt::REQUIRED_ARG);
- getopt(argc, argv);
+ XInitThreads();
+}
+
+Xinema::Xinema(int, char **):
+ window(display, 1920, 1080),
+ network(*this),
+ engine(0),
+ stream(0)
+{
window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Xinema::exit), 0));
}
window.show();
display.tick();
- engine = new XineEngine(window, &display_mutex);
- stream = new XineStream(*engine, filename);
- stream->play();
+ engine = new XineEngine(window);
+ play_file(FS::get_sys_data_dir()/"xinema.png");
Application::main();
- delete stream;
+ if(stream)
+ delete stream;
delete engine;
return exit_code;
void Xinema::tick()
{
+ bool new_stream = false;
+
{
- MutexLock lock(display_mutex);
- display.tick();
+ MutexLock lock(command_mutex);
+ if(!pending_mrl.empty())
+ {
+ delete stream;
+ stream = new XineStream(*engine, pending_mrl);
+ stream->play();
+ pending_mrl.clear();
+ new_stream = true;
+ }
}
- stream->tick();
+ if(new_stream)
+ signal_stream_created.emit(*stream);
+
+ XLockDisplay(display.get_private().display);
+ display.tick();
+ XUnlockDisplay(display.get_private().display);
+
+ engine->tick();
+
+ Time::sleep(10*Time::msec);
+}
+
+void Xinema::play_file(const FS::Path &fn)
+{
+ MutexLock lock(command_mutex);
+ pending_mrl = "file://"+fn.str();
}