]> git.vomp.tv Git - vompclient.git/blob - vvideorec.cc
Zero length recording segfault fixed
[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   Colour transparent(0, 0, 0, 0);
35   setBackgroundColour(transparent);
36 }
37
38 VVideoRec::~VVideoRec()
39 {
40   Log::getInstance()->log("VVideoRec", Log::DEBUG, "Pre delete player");
41   delete player;
42   Log::getInstance()->log("VVideoRec", Log::DEBUG, "Post delete player");
43   Video::getInstance()->setDefaultAspect();
44 }
45
46 void VVideoRec::draw()
47 {
48   View::draw();
49 }
50
51 void VVideoRec::go(ULLONG startPosition)
52 {
53   ULLONG recLength = vdr->streamRecording(myRec);
54   if (recLength)
55   {
56     player->setLength(recLength);
57     player->setPosition(startPosition);
58     player->play();
59   }
60   else
61   {
62     ViewMan* viewman = ViewMan::getInstance();
63
64     Message* m = new Message();
65     m->message = Message::CLOSE_ME;
66     m->from = this;
67     m->to = viewman;
68     viewman->postMessage(m);
69
70     VInfo* vi = new VInfo();
71     vi->create(400, 150);
72     if (Video::getInstance()->getFormat() == Video::PAL)
73       vi->setScreenPos(170, 200);
74     else
75       vi->setScreenPos(160, 150);
76     vi->setExitable();
77     vi->setBorderOn(1);
78     vi->setTitleBarOn(0);
79     vi->setOneLiner(tr("Error playing recording"));
80     vi->draw();
81
82     m = new Message();
83     m->message = Message::ADD_VIEW;
84     m->to = viewman;
85     m->parameter = (ULONG)vi;
86     viewman->postMessage(m);
87   }
88 }
89
90 int VVideoRec::handleCommand(int command)
91 {
92   switch(command)
93   {
94     case Remote::PLAY:
95     {
96       player->play(); // do resync
97       return 2;
98     }
99
100     case Remote::STOP:
101     case Remote::BACK:
102     case Remote::MENU:
103     {
104       Log::getInstance()->log("VVideoRec", Log::DEBUG, "Pre player stop");
105       player->stop();
106       vdr->stopStreaming();
107       Log::getInstance()->log("VVideoRec", Log::DEBUG, "Post player stop");
108       return 4;
109     }
110     case Remote::PAUSE:
111     {
112       player->togglePause();
113       return 2;
114     }
115     case Remote::SKIPFORWARD:
116     {
117       player->skipForward(60);
118       return 2;
119     }
120     case Remote::SKIPBACK:
121     {
122       player->skipBackward(60);
123       return 2;
124     }
125     case Remote::FORWARD:
126     {
127       player->toggleFastForward();
128       return 2;
129     }
130     case Remote::YELLOW:
131     {
132       player->skipBackward(10);
133       return 2;
134     }
135     case Remote::BLUE:
136     {
137       player->skipForward(10);
138       return 2;
139     }
140     case Remote::FULL:
141     case Remote::TV:
142     {
143       toggleChopSides();
144       return 2;
145     }
146
147 //    case Remote::REVERSE:
148 //    {
149 //      player->toggleFastBackward();
150 //      return 2;
151 //    }
152
153 #ifdef DEV
154     case Remote::RED:
155     {
156       //player->test1();
157
158       /*
159       // for testing EPG in NTSC with a NTSC test video
160       Video::getInstance()->setMode(Video::QUARTER);
161       Video::getInstance()->setPosition(170, 5);
162       VEpg* vepg = new VEpg(NULL, 0);
163       vepg->draw();
164       ViewMan::getInstance()->add(vepg);
165       ViewMan::getInstance()->updateView(vepg);
166       */
167
168       return 2;
169     }
170     case Remote::GREEN:
171     {
172       player->test2();
173       return 2;
174     }
175 #endif
176
177     case Remote::ZERO: player->jumpToPercent(0); return 2;
178     case Remote::ONE: player->jumpToPercent(10); return 2;
179     case Remote::TWO: player->jumpToPercent(20); return 2;
180     case Remote::THREE: player->jumpToPercent(30); return 2;
181     case Remote::FOUR: player->jumpToPercent(40); return 2;
182     case Remote::FIVE: player->jumpToPercent(50); return 2;
183     case Remote::SIX: player->jumpToPercent(60); return 2;
184     case Remote::SEVEN: player->jumpToPercent(70); return 2;
185     case Remote::EIGHT: player->jumpToPercent(80); return 2;
186     case Remote::NINE: player->jumpToPercent(90); return 2;
187
188   }
189
190   return 1;
191 }
192
193 void VVideoRec::toggleChopSides()
194 {
195   if (video->getTVsize() == Video::ASPECT16X9) return; // Means nothing for 16:9 TVs
196
197   if (videoMode == Video::NORMAL)
198   {
199     videoMode = Video::LETTERBOX;
200     video->setMode(Video::LETTERBOX);
201   }
202   else
203   {
204     videoMode = Video::NORMAL;
205     video->setMode(Video::NORMAL);
206   }
207 }