X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fxinema.cpp;h=499154387e67eef838531e017ca944afe03007ea;hb=4761421;hp=e4051cda3f15d5bb35bee8f474667d03d59f7190;hpb=4157ae2c48c539a3bbe609ab143d4c1454fd1748;p=xinema.git diff --git a/source/xinema.cpp b/source/xinema.cpp index e4051cd..4991543 100644 --- a/source/xinema.cpp +++ b/source/xinema.cpp @@ -1,5 +1,7 @@ #include -#include +#include +#include +#include #include "xineengine.h" #include "xinema.h" #include "xinestream.h" @@ -7,13 +9,20 @@ 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), + logo_mode(false), + pending_logo(false) +{ window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Xinema::exit), 0)); } @@ -22,13 +31,13 @@ int Xinema::main() window.show(); display.tick(); - engine = new XineEngine(window, &display_mutex); - stream = new XineStream(*engine, filename); - stream->play(); + engine = new XineEngine(window); + show_logo(); Application::main(); - delete stream; + if(stream) + delete stream; delete engine; return exit_code; @@ -36,10 +45,55 @@ int Xinema::main() void Xinema::tick() { + string mrl; + bool logo; + { + MutexLock lock(command_mutex); + mrl = pending_mrl; + logo = pending_logo; + pending_mrl.clear(); + pending_logo = false; + } + + if(!mrl.empty()) { - MutexLock lock(display_mutex); - display.tick(); + bool had_stream = stream; + + delete stream; + stream = 0; + + if(had_stream && !logo_mode) + signal_stream_destroyed.emit(); + + logo_mode = logo; + stream = new XineStream(*engine, mrl); + if(!logo_mode) + stream->signal_finished.connect(sigc::mem_fun(this, &Xinema::show_logo)); + stream->play(); + + if(!logo_mode) + signal_stream_created.emit(*stream); } - stream->tick(); + 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(); + pending_logo = false; +} + +void Xinema::show_logo() +{ + MutexLock lock(command_mutex); + pending_mrl = "file://"+(FS::get_sys_data_dir()/"xinema.png").str(); + pending_logo = true; }