]> git.vomp.tv Git - vompclient.git/blob - vvideorec.cc
Half way through recording playback OSD stuff
[vompclient.git] / vvideorec.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "vvideorec.h"
22
23 VVideoRec::VVideoRec(Recording* rec)
24 {
25   player = new PlayerVideo(Command::getInstance(), 1, 0); // say 0 for radio because buffering will work anyway
26   player->init();
27   vdr = VDR::getInstance();
28   video = Video::getInstance();
29
30   videoMode = video->getMode();
31   myRec = rec;
32
33   create(video->getScreenWidth(), video->getScreenHeight());
34   transparent.set(0, 0, 0, 0);
35   setBackgroundColour(transparent);
36
37   barRegion.x = 0;
38   barRegion.y = video->getScreenHeight() - 66;   // FIXME, need to be - 1? and below?
39   barRegion.w = video->getScreenWidth();
40   barRegion.h = 66;
41
42   barBlue.set(0, 0, 150, 150);
43 }
44
45 VVideoRec::~VVideoRec()
46 {
47   Log::getInstance()->log("VVideoRec", Log::DEBUG, "Pre delete player");
48   delete player;
49   Log::getInstance()->log("VVideoRec", Log::DEBUG, "Post delete player");
50   Video::getInstance()->setDefaultAspect();
51
52   Timers::getInstance()->cancelTimer(this, 1);
53 }
54
55 void VVideoRec::draw()
56 {
57   View::draw();
58 }
59
60 void VVideoRec::go(ULLONG startPosition)
61 {
62   ULLONG recLength = vdr->streamRecording(myRec);
63   if (recLength)
64   {
65     doBar(0);
66     player->setLength(recLength);
67     player->setPosition(startPosition);
68     player->play();
69   }
70   else
71   {
72     ViewMan* viewman = ViewMan::getInstance();
73
74     Message* m = new Message();
75     m->message = Message::CLOSE_ME;
76     m->from = this;
77     m->to = viewman;
78     viewman->postMessage(m);
79
80     VInfo* vi = new VInfo();
81     vi->create(400, 150);
82     if (Video::getInstance()->getFormat() == Video::PAL)
83       vi->setScreenPos(170, 200);
84     else
85       vi->setScreenPos(160, 150);
86     vi->setExitable();
87     vi->setBorderOn(1);
88     vi->setTitleBarOn(0);
89     vi->setOneLiner(tr("Error playing recording"));
90     vi->draw();
91
92     m = new Message();
93     m->message = Message::ADD_VIEW;
94     m->to = viewman;
95     m->parameter = (ULONG)vi;
96     viewman->postMessage(m);
97   }
98 }
99
100 int VVideoRec::handleCommand(int command)
101 {
102   switch(command)
103   {
104     case Remote::PLAY:
105     {
106       player->play(); // do resync
107       return 2;
108     }
109
110     case Remote::STOP:
111     case Remote::BACK:
112     case Remote::MENU:
113     {
114       Log::getInstance()->log("VVideoRec", Log::DEBUG, "Pre player stop");
115       player->stop();
116       vdr->stopStreaming();
117       Log::getInstance()->log("VVideoRec", Log::DEBUG, "Post player stop");
118       return 4;
119     }
120     case Remote::PAUSE:
121     {
122       player->togglePause();
123       doBar(0);
124       return 2;
125     }
126     case Remote::SKIPFORWARD:
127     {
128       doBar(3);
129       player->skipForward(60);
130       return 2;
131     }
132     case Remote::SKIPBACK:
133     {
134       doBar(4);
135       player->skipBackward(60);
136       return 2;
137     }
138     case Remote::FORWARD:
139     {
140       player->toggleFastForward();
141       doBar(0);
142       return 2;
143     }
144     case Remote::YELLOW:
145     {
146       doBar(2);
147       player->skipBackward(10);
148       return 2;
149     }
150     case Remote::BLUE:
151     {
152       doBar(1);
153       player->skipForward(10);
154       return 2;
155     }
156     case Remote::FULL:
157     case Remote::TV:
158     {
159       toggleChopSides();
160       return 2;
161     }
162
163     case Remote::OK:
164     {
165       doBar(0);
166       return 2;
167     }
168
169
170 //    case Remote::REVERSE:
171 //    {
172 //      player->toggleFastBackward();
173 //      return 2;
174 //    }
175
176     case Remote::ZERO: player->jumpToPercent(0); return 2;
177     case Remote::ONE: player->jumpToPercent(10); return 2;
178     case Remote::TWO: player->jumpToPercent(20); return 2;
179     case Remote::THREE: player->jumpToPercent(30); return 2;
180     case Remote::FOUR: player->jumpToPercent(40); return 2;
181     case Remote::FIVE: player->jumpToPercent(50); return 2;
182     case Remote::SIX: player->jumpToPercent(60); return 2;
183     case Remote::SEVEN: player->jumpToPercent(70); return 2;
184     case Remote::EIGHT: player->jumpToPercent(80); return 2;
185     case Remote::NINE: player->jumpToPercent(90); return 2;
186
187 #ifdef DEV
188     case Remote::RED:
189     {
190       //player->test1();
191
192       /*
193       // for testing EPG in NTSC with a NTSC test video
194       Video::getInstance()->setMode(Video::QUARTER);
195       Video::getInstance()->setPosition(170, 5);
196       VEpg* vepg = new VEpg(NULL, 0);
197       vepg->draw();
198       ViewMan::getInstance()->add(vepg);
199       ViewMan::getInstance()->updateView(vepg);
200       */
201
202       return 2;
203     }
204     case Remote::GREEN:
205     {
206       player->test2();
207       return 2;
208     }
209 #endif
210
211   }
212
213   return 1;
214 }
215
216 void VVideoRec::toggleChopSides()
217 {
218   if (video->getTVsize() == Video::ASPECT16X9) return; // Means nothing for 16:9 TVs
219
220   if (videoMode == Video::NORMAL)
221   {
222     videoMode = Video::LETTERBOX;
223     video->setMode(Video::LETTERBOX);
224   }
225   else
226   {
227     videoMode = Video::NORMAL;
228     video->setMode(Video::NORMAL);
229   }
230 }
231
232 void VVideoRec::doBar(int action)
233 {
234   rectangle(barRegion, barBlue);
235
236   /* Work out what to display - choices:
237
238   Playing  >
239   Paused   ||
240   FFwd     >>
241   FBwd     <<
242
243   Specials, informed by parameter
244
245   Skip forward 10s    >|
246   Skip backward 10s   |<
247   Skip forward 1m     >>|
248   Skip backward 1m    |<<
249
250   */
251
252   WSymbol w;
253   w.setSurface(surface);
254   w.nextSymbol = 0;
255   w.setSurfaceOffset(76, barRegion.y + 16);
256
257   if (action)
258   {
259     if (action == 1)       w.nextSymbol = WSymbol::SKIPFORWARD;
260     else if (action == 2)  w.nextSymbol = WSymbol::SKIPBACK;
261     else if (action == 3)  w.nextSymbol = WSymbol::SKIPFORWARD2;
262     else if (action == 4)  w.nextSymbol = WSymbol::SKIPBACK2;
263   }
264   else
265   {
266     if (player->isPaused())     w.nextSymbol = WSymbol::PAUSE;
267     else if (player->isFfwd())  w.nextSymbol = WSymbol::FFWD;
268     else if (player->isFbwd())  w.nextSymbol = WSymbol::FBWD;
269     else                        w.nextSymbol = WSymbol::PLAY;
270   }
271
272   w.draw();
273
274   ULONG currentTS = (player->getPositionTS() / 90000);
275   int chours = currentTS / 3600;
276   int cminutes = (currentTS - (chours * 3600)) / 60;
277   int cseconds = currentTS - (chours * 3600) - (cminutes * 60);
278
279   ULONG endTS = (player->getEndTS() / 90000);
280   int ehours = endTS / 3600;
281   int eminutes = (endTS - (ehours * 3600)) / 60;
282   int eseconds = endTS - (ehours * 3600) - (eminutes * 60);
283
284   char buffer[100];
285   snprintf(buffer, 99, "%01i:%02i:%02i / %01i:%02i:%02i", chours, cminutes, cseconds, ehours, eminutes, eseconds);
286
287   drawText(buffer, barRegion.x + 180, barRegion.y + 12, Colour::LIGHTTEXT);
288
289   ViewMan::getInstance()->updateView(this, &barRegion);
290   Timers::getInstance()->setTimer(this, 1, (struct timespec){4, 0});
291 }
292
293 void VVideoRec::timercall(int clientReference)
294 {
295   switch(clientReference)
296   {
297     case 1:
298     {
299       // Remove bar
300       rectangle(barRegion, transparent);
301       ViewMan::getInstance()->updateView(this, &barRegion);
302       break;
303     }
304   }
305 }