]> git.tdb.fi Git - xinema.git/blob - source/xinema.cpp
bc70c4154c04bec4aa63f49bd3cfe6855a73cd1e
[xinema.git] / source / xinema.cpp
1 #include <sigc++/bind.h>
2 #include <msp/fs/dir.h>
3 #include <msp/graphics/display_private.h>
4 #include <msp/time/utils.h>
5 #include "xineengine.h"
6 #include "xinema.h"
7 #include "xinestream.h"
8
9 using namespace std;
10 using namespace Msp;
11
12 Xinema::EarlyInit::EarlyInit()
13 {
14         XInitThreads();
15 }
16
17
18 Xinema::Xinema(int, char **):
19         window(display, 1920, 1080),
20         network(*this),
21         engine(0),
22         stream(0)
23 {
24         window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Xinema::exit), 0));
25 }
26
27 int Xinema::main()
28 {
29         window.show();
30         display.tick();
31
32         engine = new XineEngine(window);
33         play_file(FS::get_sys_data_dir()/"xinema.png");
34
35         Application::main();
36
37         if(stream)
38                 delete stream;
39         delete engine;
40
41         return exit_code;
42 }
43
44 void Xinema::tick()
45 {
46         bool new_stream = false;
47
48         {
49                 MutexLock lock(command_mutex);
50                 if(!pending_mrl.empty())
51                 {
52                         delete stream;
53                         stream = new XineStream(*engine, pending_mrl);
54                         stream->play();
55                         pending_mrl.clear();
56                         new_stream = true;
57                 }
58         }
59
60         if(new_stream)
61                 signal_stream_created.emit(*stream);
62
63         XLockDisplay(display.get_private().display);
64         display.tick();
65         XUnlockDisplay(display.get_private().display);
66
67         engine->tick();
68
69         Time::sleep(10*Time::msec);
70 }
71
72 void Xinema::play_file(const FS::Path &fn)
73 {
74         MutexLock lock(command_mutex);
75         pending_mrl = "file://"+fn.str();
76 }