]> git.vomp.tv Git - vompclient-marten.git/blob - vrecording.cc
Detect mpeg audio frame header changes, and wait at least 4 packets after a change...
[vompclient-marten.git] / vrecording.cc
1 /*
2     Copyright 2004-2008 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #include "vrecording.h"
22
23 #include "remote.h"
24 #include "recinfo.h"
25 #include "vquestion.h"
26 #include "vinfo.h"
27 #include "vdr.h"
28 #include "colour.h"
29 #include "video.h"
30 #include "i18n.h"
31 #include "command.h"
32 #include "vrecmove.h"
33 #include "boxstack.h"
34 #include "recman.h"
35 #include "vrecordinglist.h"
36 #include "recording.h"
37 #include "message.h"
38 #include "log.h"
39
40 VRecording::VRecording(RecMan* trecman, Recording* trec)
41 {
42   rec = trec;
43   recman = trecman;
44   
45   Log::getInstance()->log("VRecording", Log::DEBUG, "%s", rec->getProgName());
46   rec->loadRecInfo();
47   Log::getInstance()->log("VRecording", Log::DEBUG, "%s", rec->getProgName());
48
49   setSize(570, 420);
50   createBuffer();
51   if (Video::getInstance()->getFormat() == Video::PAL)
52   {
53     setPosition(80, 70);
54   }
55   else
56   {
57     setPosition(70, 35);
58   }
59
60   setTitleBarOn(1);
61   setBorderOn(1);
62   setTitleText(rec->getProgName());
63   setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
64
65   summary.setPosition(10, 30 + 5);
66   summary.setSize(area.w - 20, area.h - 30 - 15 - 50);
67   summary.setParaMode(true);
68
69   if (rec->recInfo &&strlen(rec->recInfo->summary))
70     summary.setText(rec->recInfo->summary);
71   else
72     summary.setText(tr("Summary unavailable"));
73
74   add(&summary);
75   
76   int sfh = getFontHeight();
77   buttonRegion.x = 10;
78   buttonRegion.y = area.h - 40;
79   buttonRegion.w = 550;
80   buttonRegion.h = sfh;
81
82   button[PLAY].setText(tr("Play"));
83   button[RESUME].setText(tr("Resume"));
84   button[MOVE].setText(tr("Move"));
85   button[A_DELETE].setText(tr("Delete"));
86   
87   for (int i=PLAY, hor=10; i<last; i++, hor+= 140)
88   {
89     button[i].setPosition(hor, area.h - 40);
90     button[i].setSize(130, sfh);
91     add(&button[i]);
92   }
93   
94   selected = RESUME;
95   button[selected].setActive(1);
96 }
97
98 VRecording::~VRecording()
99 {
100 }
101
102 void VRecording::setParent(VRecordingList* tvRecList)
103 {
104   vRecList = tvRecList;
105 }
106
107 void VRecording::draw()
108 {
109   TBBoxx::draw();
110 }
111
112 int VRecording::handleCommand(int command)
113 {
114   switch(command)
115   {
116     case Remote::LEFT:
117     case Remote::DF_LEFT:
118     case Remote::DF_UP:
119     case Remote::UP:
120     {
121       moveCursor(LEFT);
122       return 2;
123     }
124     case Remote::RIGHT:
125     case Remote::DF_RIGHT:
126     case Remote::DF_DOWN:
127     case Remote::DOWN:
128     {
129       moveCursor(RIGHT);
130       return 2;
131     }
132     case Remote::OK:
133     {
134
135       if (selected == PLAY)
136       {
137         Message* m = new Message(); // Must be done after this view deleted
138         m->from = this;
139         m->to = vRecList;
140         m->message = Message::PLAY_SELECTED_RECORDING;
141         Command::getInstance()->postMessageNoLock(m);
142         return 4;
143       }
144
145       if (selected == RESUME)
146       {
147         Message* m = new Message(); // Must be done after this view deleted
148         m->from = this;
149         m->to = vRecList;
150         m->message = Message::RESUME_SELECTED_RECORDING;
151         Command::getInstance()->postMessageNoLock(m);
152         return 4;
153       }
154
155       if (selected == MOVE)
156       {
157         VRecMove* vrm = new VRecMove(recman);
158         vrm->setParent(this);
159         vrm->draw();
160         BoxStack::getInstance()->add(vrm);
161         BoxStack::getInstance()->update(vrm);
162         return 2;
163       }
164
165       if (selected == A_DELETE)
166       {
167         VQuestion* v = new VQuestion(this);
168         v->setSize(260, 180);
169         v->createBuffer();
170         v->setTitleBarColour(DrawStyle::DANGER);
171         v->setTitleBarOn(1);
172         v->setBorderOn(1);
173         v->setTitleText(tr("Delete recording"));
174         v->setMainText(tr("Are you sure you want to delete this recording?"));
175         v->setDefault(VQuestion::NO);
176         if (Video::getInstance()->getFormat() == Video::PAL)
177         {
178           v->setPosition(230, 160);
179         }
180         else
181         {
182           v->setPosition(220, 140);
183         }
184
185         v->draw();
186         BoxStack::getInstance()->add(v);
187         BoxStack::getInstance()->update(v);
188         return 2;
189       }
190     }
191
192     case Remote::BACK:
193     {
194       return 4;
195     }
196   }
197   // stop command getting to any more views
198   return 1;
199 }
200
201 void VRecording::moveCursor(Direction direction)
202 {
203   button[selected].setActive(0);
204   button[selected].draw();
205   if (direction == RIGHT)
206   { 
207     if (++selected == last) selected = PLAY;
208   }
209   else
210   {
211     if (--selected < 0) selected = last - 1;
212   }
213   button[selected].setActive(1);
214   button[selected].draw();
215   BoxStack::getInstance()->update(this, &buttonRegion);
216 }
217
218 void VRecording::processMessage(Message* m)
219 {
220   if (m->message == Message::MOUSE_MOVE)
221   {
222     for (int i = PLAY; i < last; i++)
223     {
224       if (button[i].mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
225       {
226         for (int j = PLAY; j < last; j++)
227           button[j].setActive(0);
228         button[i].setActive(1);
229         selected=i;
230         draw();
231         BoxStack::getInstance()->update(this);
232         break;
233       }
234     }
235   }
236   else if (m->message == Message::MOUSE_LBDOWN)
237   {
238     int cancel = true;
239     for (int i = PLAY; i < last; i++)
240     {
241       if (button[i].mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
242       {
243         BoxStack::getInstance()->handleCommand(Remote::OK); //simulate OK press
244         cancel = false;
245         break;
246       }
247     }
248     if (cancel)
249     {
250       //check if press is outside this view! then simulate cancel
251       int x=(m->parameter>>16)-getScreenX();
252       int y=(m->parameter&0xFFFF)-getScreenY();
253       if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())
254       {
255         BoxStack::getInstance()->handleCommand(Remote::BACK); //simulate cancel press
256       }
257     }
258   }
259   else if (m->message == Message::QUESTION_YES)
260   {
261     if (selected == A_DELETE)
262     {
263       Message* m2 = new Message(); // Delete self
264       m2->from = this;
265       m2->to = BoxStack::getInstance();
266       m2->message = Message::CLOSE_ME;
267       Command::getInstance()->postMessageNoLock(m2);
268
269       m2 = new Message(); // OK. Want this to delete before this message does its job
270       m2->from = this;
271       m2->to = vRecList;
272       m2->message = Message::DELETE_SELECTED_RECORDING;
273       Command::getInstance()->postMessageNoLock(m2);
274     }
275   }
276   else if (m->message == Message::MOVE_RECORDING)
277   {
278     Message* m2 = new Message(); // Delete self
279     m2->from = this;
280     m2->to = BoxStack::getInstance();
281     m2->message = Message::CLOSE_ME;
282     Command::getInstance()->postMessageNoLock(m2);
283
284     m2 = new Message();
285     m2->from = this;
286     m2->to = vRecList;
287     m2->message = Message::MOVE_RECORDING;
288     m2->parameter = m->parameter;
289     Command::getInstance()->postMessageNoLock(m2);
290   }
291 }
292