ce10d4ff11d3648487f1e27f26958d6460ffa179
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

1) /* Blinker
2)    Copyright 2011 Stefan Schuermans <stefan@blinkenarea.org>
3)    Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
4)    a blinkenarea.org project */
5) 
6) #include <list>
7) #include <string>
8) 
9) #include <BlinkenLib/BlinkenFrame.h>
10) #include <BlinkenLib/BlinkenMovie.h>
11) 
12) #include "CallMgr.h"
13) #include "Directory.h"
14) #include "File.h"
Stefan Schuermans implemented base class for...

Stefan Schuermans authored 13 years ago

15) #include "Module.h"
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

16) #include "Player.h"
Stefan Schuermans implemented stream printer...

Stefan Schuermans authored 13 years ago

17) #include "SettingFile.h"
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

18) #include "StreamMgr.h"
19) #include "Time.h"
20) #include "TimeCallee.h"
21) 
22) namespace Blinker {
23) 
24) /**
25)  * @brief constructor
26)  * @param[in] callMgr callback manager
27)  * @param[in] streamMgr stream manager
28)  * @param[in] dirBase base directory
29)  */
30) Player::Player(CallMgr &callMgr, StreamMgr &streamMgr,
31)                const Directory &dirBase):
Stefan Schuermans implemented base class for...

Stefan Schuermans authored 13 years ago

32)   Module(callMgr, streamMgr, dirBase),
Stefan Schuermans implemented stream printer...

Stefan Schuermans authored 13 years ago

33)   m_fileOutStream(dirBase.getFile("outstream")),
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

34)   m_dirPlaylist(dirBase.getSubdir("playlist")),
Stefan Schuermans implemented stream printer...

Stefan Schuermans authored 13 years ago

35)   m_pOutStream(NULL),
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

36)   m_curEntry(m_playlist.begin()),
37)   m_curFrame(0)
38) {
39)   // get output stream
Stefan Schuermans implemented stream printer...

Stefan Schuermans authored 13 years ago

40)   m_fileOutStream.getStr(m_nameOutStream);
41)   m_pOutStream = &m_streamMgr.refStream(m_nameOutStream);
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

42) 
43)   // load playlist
44)   updatePlaylist();
45) }
46) 
47) /// virtual destructor
48) Player::~Player()
49) {
50)   // free all movies
51)   while (!m_playlist.empty()) {
52)     m_playlist.back().freeMovie();
53)     m_playlist.pop_back();
54)   }
55) 
56)   // unreference stream
Stefan Schuermans implemented stream printer...

Stefan Schuermans authored 13 years ago

57)   m_pOutStream = NULL;
58)   m_streamMgr.unrefStream(m_nameOutStream);
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

59) }
60) 
Stefan Schuermans implemented base class for...

Stefan Schuermans authored 13 years ago

61) /// check for update of configuration
62) void Player::updateConfig()
63) {
64)   // TODO
65) }
66) 
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

67) /// callback when requsted time reached
68) void Player::timeCall()
69) {
70)   // show next frame
71)   showFrame();
72) }
73) 
74) /// update playlist
75) void Player::updatePlaylist()
76) {
77)   // get list of files in playlist directory
78)   typedef std::list<std::string> Filelist;
79)   Filelist curFiles;
80)   m_dirPlaylist.getEntries(Directory::TypeFile, curFiles);
81) 
82)   // walk through current playlist and file list simultaneously
83)   bool                     bWasEmpty = m_playlist.empty();
84)   Filelist::const_iterator itFile    = curFiles.begin();
85)   Playlist::iterator       itEntry   = m_playlist.begin();
86)   bool                     bCurChg   = false;
87)   while (itFile != curFiles.end() || itEntry != m_playlist.end()) {
88) 
89)     // new movie inserted
90)     if (itEntry == m_playlist.end() || *itFile < itEntry->m_name) {
91)       // load movie
92)       Entry entry(*itFile, m_dirPlaylist.getFile(*itFile));
93)       if (entry.loadMovie())
94)         // insert playlist entry
95)         m_playlist.insert(itEntry, entry);
96)       // advance to next file
97)       ++itFile;
98)     }
99) 
100)     // movie removed
101)     // movie changed (=> remove and re-insert in next iteration)
102)     else if (itFile == curFiles.end() || *itFile > itEntry->m_name ||
103)              itEntry->m_file.checkModified()) {
104)       // check if movie to remov movie is current movie
105)       if (itEntry == m_curEntry) {
106)         // advance current movie to next movie
107)         ++m_curEntry;
108)         bCurChg = true;
109)       }
110)       // remove entry
111)       itEntry->freeMovie();
112)       itEntry = m_playlist.erase(itEntry);
113)       // do not advance to next file
114)     }
115) 
116)     // movie stayed in playlist and did not change
117)     else {
118)       // advance to next file and next entry
119)       ++itFile;
120)       ++itEntry;
121)     }
122) 
123)   } // while itFile itPlaylist
124) 
125)   // current movie entry changed - or - playlist was empty and is not now
126)   if (bCurChg || (bWasEmpty && !m_playlist.empty())) {
127)     // go to begin of movie and start playing now
128)     m_curFrame = 0;
129)     m_showTime = Time::now();
130)     showFrame();
131)   }
132) }
133) 
134) /// show current frame
135) void Player::showFrame()
136) {
137)   // leave if time is not yet ready to show frame
138)   if (Time::now() < m_showTime) {
139)     m_callMgr.requestTimeCall(this, m_showTime); // request call at show time
140)     return;
141)   }
142) 
143)   // movie finished -> next movie
144)   //   use while loops to handle empty movies / empty playlist
145)   bool wrapped = false;
146)   while (true) {
147)     // playlist finished -> re-start from beginning
148)     while (m_curEntry == m_playlist.end()) {
149)       m_curEntry = m_playlist.begin();
150)       m_curFrame = 0;
151)       // detect empty playlist or playlist with only empty movies
152)       if (wrapped) {
153)         // empty playlist or playlist with only empty movies -> no frame
Stefan Schuermans implemented stream printer...

Stefan Schuermans authored 13 years ago

154)         if (m_pOutStream)
155)           m_pOutStream->setNoFrame();
Stefan Schuermans first version, plays videos...

Stefan Schuermans authored 13 years ago

156)         return;
157)       }
158)       wrapped = true;
159)     }
160)     // movie not yet finished -> done
161)     if (m_curFrame < BlinkenMovieGetFrameCnt(m_curEntry->m_pMovie))
162)       break;
163)     // movie finished -> next movie
164)     ++m_curEntry;
165)     m_curFrame = 0;
166)   }
167) 
168)   // show frame
169)   stBlinkenFrame *pFrame =
170)       BlinkenMovieGetFrame(m_curEntry->m_pMovie, m_curFrame);
Stefan Schuermans implemented stream printer...

Stefan Schuermans authored 13 years ago

171)   if (m_pOutStream)
172)     m_pOutStream->setFrame(pFrame);