source: titan/titan/timeshift.h @ 30921

Last change on this file since 30921 was 30921, checked in by obi, 8 years ago

[titan] fix pts pause picture on first pause and add pause picture after error msg

File size: 11.2 KB
Line 
1#ifndef TIMESHIFT_H
2#define TIMESHIFT_H
3
4//flag 0: pause from rcpause
5//flag 1: pause from servicestart
6void timeshiftpause(int flag)
7{
8        int ret = 0;
9               
10        if(flag == 0 && status.timeshift == 1 && status.playing == 0 && status.timeshifttype == 1 && status.timeshiftpos == 0) //stop service
11        {
12                ret = servicestop(status.aktservice, 0, 2);
13                if(ret == 0)
14                {
15                        struct service* snode = getservice(RECORDTIMESHIFT, 0);
16                        if(snode != NULL)
17                        {
18                                status.timeshiftstart = time(NULL);
19                                status.timeshiftpos = lseek64(snode->recdstfd, 0, SEEK_CUR);
20                                status.timeshiftpos = status.timeshiftpos - (status.timeshiftpos % snode->tssize);
21                                if(status.timeshiftpos <= 0) status.timeshiftpos = snode->tssize;
22                        }               
23                }
24        }
25        else if(status.timeshift == 0) //stop service an start timeshift record
26        {
27                //reset timeline
28                struct skin* playinfobar = getscreen("playinfobar");
29                struct skin* sprogress = getscreennode(playinfobar, "progress");
30                sprogress->progresssize = 0;
31
32                if(status.timeshifttype == 0)
33                        ret = servicestop(status.aktservice, 0, 2);
34                if(ret == 0)
35                {
36                        ret = recordstart(status.aktservice->channel, -1, 0, RECTIMESHIFT, 0, NULL);
37                        if(ret != 0)
38                        {
39                                status.timeshift = 0;
40                                if(status.timeshifttype == 0)
41                                        servicecheckret(servicestart(status.aktservice->channel, NULL, NULL, 3), 0);
42                        }
43                        else
44                                status.timeshiftstart = time(NULL);
45                        recordcheckret(NULL, ret, 6);
46                }
47        }
48        else if(status.playspeed == 0 && status.slowspeed == 0 && status.timeshift == 1 && status.playing == 1) //if playing, set pause
49        {
50                status.slowspeed = 0;
51                status.playspeed = 0;
52                status.play = 0;
53                status.pause = 1;
54                playerpausets();
55        }
56}
57
58//flag 0: stop from rcstop
59//flag 1: stop from servicestop
60//flag 2: error in record thread
61//flag 3: stop from titan end
62void timeshiftstop(int flag)
63{
64        int i = 0, ret = 0;
65        char* file = NULL;
66
67        if(flag == 1 && status.timeshifttype == 1 && status.playing == 0 && status.timeshiftpos > 0)
68                return;
69        if(flag == 0 && status.timeshifttype == 1)
70        {
71                if(status.timeshiftpos > 0 && status.playing == 0)
72                        goto startservice;
73                else if(status.playing == 1)
74                {
75                        if(status.playspeed != 0 || status.slowspeed != 0)
76                        {
77                                playerpausets();
78                                playercontinuets();
79                        }
80
81                        playerstopts(1, flag);
82
83                        writevfdmenu("Player");
84                        screenplayinfobar(NULL, NULL, 1, 1, 4);
85
86                        goto startservice;
87                }
88                return;
89        }
90
91        struct service* snode = getservice(RECORDTIMESHIFT, flag);
92       
93        if(status.playspeed != 0 || status.slowspeed != 0)
94        {
95                playerpausets();
96                playercontinuets();
97        }
98       
99        playerstopts(1, flag);
100
101        writevfdmenu("Player");
102        screenplayinfobar(NULL, NULL, 1, 1, 4);
103       
104        if(snode != NULL)
105        {
106                status.timeshift = 2;
107                file = ostrcat(file, snode->recname, 1, 0);
108                snode->recendtime = 1;
109
110                ret = getconfigint("deltimeshift", NULL);
111                if(ret == 0)
112                {
113                        ret = textbox(_("Message"), _("Should Timeshift File deleted ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 400, 10, 0);
114                        if(ret == 0) ret = 1;
115                }
116
117                if(ret == 1) unlink(file);
118               
119                free(file); file = NULL;
120        }
121
122        if(flag == 0 || flag == 3)
123        {
124                while(status.timeshift > 0)
125                {
126                        usleep(100000);
127                        i++; if(i > 20) break;
128                }
129        }
130       
131startservice:
132        if(flag == 0 || flag == 2)
133                servicecheckret(servicestart(status.aktservice->channel, NULL, NULL, 3), 0);
134       
135        //if timeshift ends in pause status, we must reactivate continue in player driver
136        playercontinuets();
137        status.timeshiftstart = 0;
138        status.timeshiftpos = 0;
139        status.playspeed = 0;
140        status.slowspeed = 0;
141        status.pause = 0;
142        status.play = 0;
143}
144
145void timeshiftplay(int* playinfobarstatus, int* playinfobarcount)
146{
147        int ret = 1;
148
149        struct service* snode = getservice(RECORDTIMESHIFT, 0);
150        struct skin* playinfobarpic = getscreen("playinfobarpic");
151
152        if((status.timeshifttype == 0 && status.playing == 0) || (status.timeshifttype == 1 && status.playing == 0 && status.timeshiftpos > 0))
153        {
154                if(status.timeshiftstart + 15 > time(NULL))
155                {
156                        textbox(_("Message"), _("Timeshift file to short\nplease wait a little and try again"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 5, 0);
157                        if(status.playpic == 0)
158                        {       
159                                drawscreen(playinfobarpic, 0, 0);
160                                status.playpic = 1;
161                        }
162                        return;
163                }
164       
165                if(snode != NULL) ret = playerstartts(snode->recname, 1);
166                if(ret != 0)
167                {
168                        textbox(_("Message"), _("Can't start timeshift play !"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0);
169                        if(status.playpic == 0)
170                        {       
171                                drawscreen(playinfobarpic, 0, 0);
172                                status.playpic = 1;
173                        }
174                        return;
175                }
176        }
177        else if(status.playing == 0 && status.timeshifttype == 1)
178        {
179                status.playercan = 0x7FFF;
180                *playinfobarstatus = 1;
181                *playinfobarcount = 0;
182                if(snode != NULL) screenplayinfobar(snode->recname, NULL, 0, 1, 5);
183        }
184        else if(status.playing == 1)
185        {
186                if(status.playspeed != 0 || status.slowspeed != 0)
187                        playerpausets();
188                if(status.slowspeed != 0)
189                        audioclearbuffer(status.aktservice->audiodev);
190                playercontinuets();
191                if(status.playspeed != 0 || status.slowspeed != 0)
192                        playerresetts();
193        }
194       
195        if(status.playing == 0) return;
196
197        status.slowspeed = 0;
198        status.playspeed = 0;
199        status.pause = 0;
200        status.play = 1;
201        status.playercan = 0x7FFF;
202        *playinfobarstatus = 1;
203        *playinfobarcount = 0;
204        if(snode != NULL) screenplayinfobar(snode->recname, NULL, 0, 1, 4);
205}
206
207/*
208void timeshiftscreen(struct stimerthread* self, struct service* servicenode)
209{
210       
211        off64_t endoffile;
212        off64_t currentpos;
213        unsigned long long ptsend = 0;
214        unsigned long long ptscurrent = 0;
215        char* tmpstr = NULL;
216        struct skin* framebuffer = getscreen("framebuffer");
217        struct skin* timeshift = getscreen("timeshift");
218        struct skin* seek = getscreennode(timeshift, "seek");
219        struct skin* timeshiftbar = getscreennode(timeshift, "timeshiftbar");
220        char* bg = NULL;
221        int seeking = 0, timeout = 0, ret = 0, minuten = 0, sekunden = 0;
222        struct service* snode = getservice(RECORDTIMESHIFT, 0);
223        int fd = -1;
224       
225        if(servicenode == NULL)
226        {
227                err("NULL detect");
228                return;
229        }
230       
231        if(snode != NULL)
232                fd = open(snode->recname, O_RDONLY | O_LARGEFILE);
233       
234        if(fd < 0)
235        {
236                err("timeshift fd not ok");
237                return;
238        }
239       
240        timeshiftbar->progresssize = 0;
241        setnodeattr(timeshift, framebuffer, 0);
242        bg = savescreen(timeshift);
243        if(status.timeshiftseek == 999999)
244                timeout = 5;
245
246        while(status.timeshiftseek != 0 || seeking != 0)
247        {
248                currentpos = lseek64(servicenode->recsrcfd, 0, SEEK_CUR);
249                currentpos = currentpos - 5000000;
250                endoffile = lseek64(fd , 0, SEEK_END);
251               
252                if(endoffile != 0)
253                {
254                        timeshiftbar->progresssize = currentpos * 100 / endoffile;
255                        if(status.timeshiftseek < 999999)
256                        {
257                                if(status.timeshiftseek > 10000)
258                                {
259                                        tmpstr = oitoa(status.timeshiftseek - 10000);
260                                        tmpstr = ostrcat(_(">> "), tmpstr, 0, 1);
261                                        tmpstr = ostrcat(tmpstr, "x", 1, 0);
262                                        changetext(seek, tmpstr);
263                                        free(tmpstr); tmpstr = NULL;
264                                }
265                                if(status.timeshiftseek < 10000 && status.timeshiftseek > -10000)
266                                {
267                                        if(seeking == 0)
268                                        {
269                                                seeking = status.timeshiftseek;
270                                                tmpstr = oitoa(status.timeshiftseek);
271                                        }
272                                        else
273                                        {
274                                                tmpstr = oitoa(seeking);
275                                                seeking = 0;
276                                        }
277                                        tmpstr = ostrcat(_("skip "), tmpstr, 0, 1);
278                                        tmpstr = ostrcat(tmpstr, " sec", 1, 0);
279                                        changetext(seek, tmpstr);
280                                        free(tmpstr); tmpstr = NULL;
281                                }
282                        }
283                        else
284                        {
285                                ret = getptspos(fd, currentpos, &ptscurrent, &currentpos, 1, servicenode->tssize);
286                                ret = getpts(fd, 0, 0, 256 * 1024, &ptsend, &endoffile, -1, servicenode->tssize);
287                                sekunden = (ptsend - ptscurrent) / 90000;
288                                minuten = sekunden / 60;
289                                sekunden = sekunden % 60;
290                                tmpstr = ostrcat(tmpstr, "-", 1, 0);
291                                tmpstr = ostrcat(tmpstr, oitoa(minuten), 1, 1);
292                                tmpstr = ostrcat(tmpstr, ":", 1, 0);
293                               
294                                if(sekunden < 10)
295                                        tmpstr = ostrcat(tmpstr, "0", 1, 0);
296                                       
297                                tmpstr = ostrcat(tmpstr, oitoa(sekunden), 1, 1);
298                                tmpstr = ostrcat(tmpstr, " min", 1, 0);
299                                changetext(seek, tmpstr);
300                                free(tmpstr); tmpstr = NULL;
301                        }
302                }
303               
304                drawscreen(timeshift, 0, 0);
305                sleep (1);
306                if(status.timeshiftseek == 999999) {
307                        timeout = timeout - 1;
308                        if(timeout == 0)
309                                status.timeshiftseek = 0;
310                }
311        }
312       
313        restorescreen(bg, timeshift);
314        blitfb(0);
315        close(fd);
316}
317
318//flag 0: normal ff or fr
319//flag 1: ff or fr back
320void timeshiftseek(int sekunden, int* playinfobarstatus, int* playinfobarcount, int flag)
321{
322        struct service* snode = getservice(RECORDPLAY, 0);
323       
324        if(sekunden < 999999)
325        {
326                status.timeshiftseek = sekunden;
327                if(snode != 0)
328                {
329                        if(sekunden > 10000)
330                        {
331                                if(sekunden < 20000)
332                                {
333                                        if(sekunden >= 10128)
334                                        {
335                                                status.timeshiftseek = 10064;
336                                                return;
337                                        }
338                                        status.play = 0;
339                                        if(flag == 0)
340                                                status.playspeed++;
341                                        else
342                                                status.playspeed--;
343                                        sekunden = sekunden - 10000;
344                                        playerffts(sekunden);
345                                }
346                                else
347                                {
348                                        if(sekunden >= 20128)
349                                        {
350                                                status.timeshiftseek = 20064;
351                                                return;
352                                        }
353                                        status.play = 0;
354                                        if(flag == 0)
355                                                status.playspeed--;
356                                        else
357                                                status.playspeed++;
358                                        sekunden = sekunden - 20000;
359                                        playerfrts(sekunden * -1, 1);
360                                        //playerseekts(snode, -10, 0);
361                                }
362                                *playinfobarstatus = 2;
363                                *playinfobarcount = 0;
364                                screenplayinfobar(status.playfile, NULL, 0, 1, 4);
365                        }       
366                        else
367                        {
368                                playerseekts(snode, sekunden, 0);
369                                *playinfobarstatus = 1;
370                                *playinfobarcount = 0;
371                                screenplayinfobar(status.playfile, NULL, 0, 1, 4);
372                        }
373                }
374        }
375        else
376        {
377                if(*playinfobarstatus == 0)
378                {
379                        *playinfobarstatus = 1;
380                        *playinfobarcount = 0;
381                        screenplayinfobar(status.playfile, NULL, 0, 1, 4);
382                }
383                else if(*playinfobarstatus == 1)
384                {
385                        *playinfobarstatus = 0;
386                        screenplayinfobar(status.playfile, NULL, 1, 1, 4);
387                }
388        }
389}
390*/
391
392void timeshiftinfobar(int* playinfobarstatus, int* playinfobarcount)
393{
394        if(status.playing == 0 && status.playspeed == 0)
395        {
396                *playinfobarstatus = 2;
397                //player simmulieren fuer infobar
398                status.playercan = 0xFFFF;
399                status.pause = 1;
400        }
401       
402        if(status.playing == 1 && status.pause == 1)
403        {
404                //*playinfobarstatus = 0;
405                *playinfobarstatus = 2;
406                //screenplayinfobar(NULL, NULL, 1, 1, 4);
407        }
408        if(status.playing == 1)
409        {
410                (*playinfobarcount)++;
411                if(*playinfobarstatus == 2)
412                {
413                        screenplayinfobar(status.playfile, NULL, 0, 1, 4);
414                        if(status.playspeed == 0 && status.slowspeed == 0) //used for begin of file with fr
415                        {
416                                *playinfobarstatus = 1;
417                                *playinfobarcount = 0;
418                        }
419                }
420                if(*playinfobarstatus == 1)
421                        screenplayinfobar(status.playfile, NULL, 0, 1, 4);
422                if(*playinfobarstatus == 1 && *playinfobarcount >= getconfigint("infobartimeout", NULL) && status.playspeed == 0 && status.slowspeed == 0)
423                {
424                        *playinfobarstatus = 0;
425                        screenplayinfobar(NULL, NULL, 1, 1, 4);
426                }
427        }
428        else if(*playinfobarstatus > 0)
429        {
430                *playinfobarstatus = 0;
431                screenplayinfobar(NULL, NULL, 1, 1, 4);
432        }
433}
434
435void timeshiftposplay(int* playinfobarstatus, int* playinfobarcount)
436{
437        unsigned long long oldpos = status.timeshiftpos;
438        struct service* snode = getservice(RECORDTIMESHIFT, 0);
439        if(snode != NULL)
440        {
441                status.timeshiftpos = lseek64(snode->recdstfd, 0, SEEK_CUR) - 10000000;
442                status.timeshiftpos = status.timeshiftpos - (status.timeshiftpos % snode->tssize);
443                if(status.timeshiftpos <= 0) status.timeshiftpos = snode->tssize;
444        }
445        timeshiftplay(playinfobarstatus, playinfobarcount);
446        if(status.playing == 0)
447                status.timeshiftpos = oldpos;
448        else
449                status.timeshiftpos = 0;
450}
451
452
453#endif
Note: See TracBrowser for help on using the repository browser.