]> git.vomp.tv Git - vompclient.git/blob - vvideorec.cc
New bits of OSD for recording playback
[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       return 2;
142     }
143     case Remote::YELLOW:
144     {
145       doBar(2);
146       player->skipBackward(10);
147       return 2;
148     }
149     case Remote::BLUE:
150     {
151       doBar(1);
152       player->skipForward(10);
153       return 2;
154     }
155     case Remote::FULL:
156     case Remote::TV:
157     {
158       toggleChopSides();
159       return 2;
160     }
161
162     case Remote::OK:
163     {
164       doBar(0);
165       return 2;
166     }
167
168
169 //    case Remote::REVERSE:
170 //    {
171 //      player->toggleFastBackward();
172 //      return 2;
173 //    }
174
175     case Remote::ZERO: player->jumpToPercent(0); return 2;
176     case Remote::ONE: player->jumpToPercent(10); return 2;
177     case Remote::TWO: player->jumpToPercent(20); return 2;
178     case Remote::THREE: player->jumpToPercent(30); return 2;
179     case Remote::FOUR: player->jumpToPercent(40); return 2;
180     case Remote::FIVE: player->jumpToPercent(50); return 2;
181     case Remote::SIX: player->jumpToPercent(60); return 2;
182     case Remote::SEVEN: player->jumpToPercent(70); return 2;
183     case Remote::EIGHT: player->jumpToPercent(80); return 2;
184     case Remote::NINE: player->jumpToPercent(90); return 2;
185
186 #ifdef DEV
187     case Remote::RED:
188     {
189       //player->test1();
190
191       /*
192       // for testing EPG in NTSC with a NTSC test video
193       Video::getInstance()->setMode(Video::QUARTER);
194       Video::getInstance()->setPosition(170, 5);
195       VEpg* vepg = new VEpg(NULL, 0);
196       vepg->draw();
197       ViewMan::getInstance()->add(vepg);
198       ViewMan::getInstance()->updateView(vepg);
199       */
200
201       return 2;
202     }
203     case Remote::GREEN:
204     {
205       player->test2();
206       return 2;
207     }
208 #endif
209
210   }
211
212   return 1;
213 }
214
215 void VVideoRec::toggleChopSides()
216 {
217   if (video->getTVsize() == Video::ASPECT16X9) return; // Means nothing for 16:9 TVs
218
219   if (videoMode == Video::NORMAL)
220   {
221     videoMode = Video::LETTERBOX;
222     video->setMode(Video::LETTERBOX);
223   }
224   else
225   {
226     videoMode = Video::NORMAL;
227     video->setMode(Video::NORMAL);
228   }
229 }
230
231 void VVideoRec::doBar(int action)
232 {
233   rectangle(barRegion, barBlue);
234
235   /* Work out what to display - choices:
236
237   Playing  >
238   Paused   ||
239   FFwd     >>
240   FBwd     <<
241
242   Specials, informed by parameter
243
244   Skip forward 10s    >|
245   Skip backward 10s   |<
246   Skip forward 1m     >>|
247   Skip backward 1m    |<<
248
249   */
250
251   WSymbol w;
252   w.setSurface(surface);
253   w.nextSymbol = 0;
254   w.setSurfaceOffset(76, barRegion.y + 16);
255
256   if (action)
257   {
258     if (action == 1)       w.nextSymbol = WSymbol::SKIPFORWARD;
259     else if (action == 2)  w.nextSymbol = WSymbol::SKIPBACK;
260     else if (action == 3)  w.nextSymbol = WSymbol::SKIPFORWARD2;
261     else if (action == 4)  w.nextSymbol = WSymbol::SKIPBACK2;
262   }
263   else
264   {
265     if (player->isPaused())     w.nextSymbol = WSymbol::PAUSE;
266     else if (player->isFfwd())  ;
267     else if (player->isFbwd())  ;
268     else                        w.nextSymbol = WSymbol::PLAY;
269   }
270
271   w.draw();
272
273   ViewMan::getInstance()->updateView(this, &barRegion);
274   Timers::getInstance()->setTimer(this, 1, (struct timespec){4, 0});
275 }
276
277 void VVideoRec::timercall(int clientReference)
278 {
279   switch(clientReference)
280   {
281     case 1:
282     {
283       // Remove bar
284       rectangle(barRegion, transparent);
285       ViewMan::getInstance()->updateView(this, &barRegion);
286       break;
287     }
288   }
289 }