d47b86aef63e5be42cc40898512bcbe55d289912
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"
15) #include "Player.h"
Stefan Schuermans implemented stream printer...

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

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

Stefan Schuermans authored 13 years ago

166)   if (m_pOutStream)
167)     m_pOutStream->setFrame(pFrame);