summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2006-03-26 19:00:00 +0200
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2006-03-26 19:00:00 +0200
commit49b561fcad16d3315fce8cb854de9f4ee6156640 (patch)
tree5612d6646e299dec266787f6068834f28c7ca81b
parent9d12ac30f006ed63b4c9ab4c1a076b7d4f025022 (diff)
downloadvdr-patch-lnbsharing-vdr-1.3.45.tar.gz
vdr-patch-lnbsharing-vdr-1.3.45.tar.bz2
Version 1.3.45vdr-1.3.45
- Fixed updating the "Info" button in the "Timers" menu. - Reduced the number of events to actually check when setting events to timers. - cMenuEditIntItem now checks the given value and forces it to be between the given min and max limits. - The status changes of EPG events are now logged for all channels that have timers. - Removed the log message "deleting plugin: ..." when shutting down VDR (thanks to Christoph Haubrich for reporting that this is irritating when calling "vdr --help"). - Fixed cReadLine::Read() for lines that end with the infamous "\r\n" (thanks to Rolf Ahrenberg). - Fixed cDvbDevice::SetAudioBypass() in case setTransferModeForDolbyDigital is false (thanks to Werner Fink). - Updated 'sources.conf' (thanks to Oleg Roitburd). - Fixed the shutdown timeout (thanks to Alexander Wenzel). - Only calling RemoveEmptyVideoDirectories() once in case a recording has been deleted (reported by Hardy Flor). - Fixed deleting recordings that have been removed externally when running out of disk space (reported by Jan Lenz). - Fixed handling repeating VPS timers (they stopped recording too early). - Timer log messages now show "VPS" if this is a VPS timer. - Fixed getting the present EPG event in case none is currently 'running' (it then returns the one that just ended). - Fixed calling a plugin's main menu function while a message is being displayed (reported by Helmut Auer). - Updated the Russian OSD texts (thanks to Oleg Roitburd). - Made cMenuRecordings::GetRecording() 'protected' (suggested by Marius Heidenstecker). - Speeded up cRemux::ScanVideoPacket() (thanks to Reinhard Nissl). - Enhanced logging EPG event data. - Fixed format string handling (thanks to Darren Salt). - The new function cDevice::ForceTransferMode() can be used to force the primary device into transfer mode (thanks to Reinhard Nissl). - The 'version' of EPG events is now ignored when reading EPG data from 'epg.data' or via SVDRP/PUTE to avoid problems with double EPG events. - The 'running status' of EPG events is now only set to SI::RunningStatusNotRunning for events before the present event. - Fixed some #include sequences. - Single shot VPS timers are now only considered 'expired' if their associated EPG event has been explicitly set to SI::RunningStatusNotRunning. - The check for timers to be deleted is now done only every 30 seconds.
-rw-r--r--CONTRIBUTORS25
-rw-r--r--HISTORY43
-rw-r--r--PLUGINS/src/sky/HISTORY4
-rw-r--r--PLUGINS/src/sky/sky.c7
-rw-r--r--channels.c12
-rw-r--r--channels.conf30
-rw-r--r--channels.h3
-rw-r--r--config.h6
-rw-r--r--device.c11
-rw-r--r--device.h4
-rw-r--r--dvbdevice.c8
-rw-r--r--epg.c37
-rw-r--r--epg.h3
-rw-r--r--i18n.c78
-rw-r--r--i18n.h4
-rw-r--r--interface.c4
-rw-r--r--menu.c20
-rw-r--r--menu.h5
-rw-r--r--menuitems.c9
-rw-r--r--pat.h4
-rw-r--r--plugin.c8
-rw-r--r--receiver.c4
-rw-r--r--recording.c20
-rw-r--r--remux.c44
-rw-r--r--remux.h6
-rw-r--r--sources.conf171
-rw-r--r--spu.c4
-rw-r--r--svdrp.c16
-rw-r--r--thread.c5
-rw-r--r--timers.c49
-rw-r--r--timers.h3
-rw-r--r--tools.c10
-rw-r--r--vdr.56
-rw-r--r--vdr.c19
34 files changed, 460 insertions, 222 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 4b9f40b..f44f437 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -307,6 +307,8 @@ Werner Fink <werner@suse.de>
for enabling a device to detach all receivers for a given PID
for modifying switching to Dolby Digital audio in live mode, if the driver
and firmware can handle live DD without the need of a Transfer Mode
+ for fixing cDvbDevice::SetAudioBypass() in case setTransferModeForDolbyDigital is
+ false
Rolf Hakenes <hakenes@hippomi.de>
for providing 'libdtv' and adapting the EIT mechanisms to it
@@ -556,6 +558,8 @@ Helmut Auer <vdr@helmutauer.de>
items at the beginning of the menu
for a patch that was used to implement stopping scanning the video directory if
there are too many levels of symbolic links
+ for reporting that an attempt to call a plugin's main menu function while a
+ message is being displayed didn't work
Jeremy Hall <jhall@UU.NET>
for fixing an incomplete initialization of the filter parameters in eit.c
@@ -964,6 +968,7 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
exceeds the maximum channel number
for suggesting to also set the language codes when setting the audio track descriptions
for reporting a problem in setting the audio language codes in 'Transfer-Mode'
+ for fixing cReadLine::Read() for lines that end with the infamous "\r\n"
Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark
@@ -1063,6 +1068,8 @@ Reinhard Nissl <rnissl@gmx.de>
for adding a mutex to synchronize cDevice::PlayPesPacket() and SetCurrentAudioTrack()
for a suggestion that lead to implementing cDevice::Transferring()
for fixing replaying recordings of radio channels with many audio tracks
+ for speeding up cRemux::ScanVideoPacket()
+ for implementing cDevice::ForceTransferMode()
Richard Robson <richard_robson@beeb.net>
for reporting freezing replay if a timer starts while in Transfer Mode from the
@@ -1454,6 +1461,7 @@ Darren Salt <linux@youmustbejoking.demon.co.uk>
for suggesting to open the file handle in the SVDRP GRAB command in a way that
it won't follow symbolic links, and to canonicalize the file name
for making all font and image data 'const'
+ for fixing format string handling
Sean Carlos <seanc@libero.it>
for translating OSD texts to the Italian language
@@ -1616,6 +1624,8 @@ Marcus Hilbrich <s4440288@mail.inf.tu-dresden.de>
Hardy Flor <HFlor@web.de>
for a patch that was used as a base to implement SVDRP commands for plugins
for implementing the SVDRP command PLAY
+ for reporting that RemoveEmptyVideoDirectories() was called for every single
+ recording that has been deleted
Harald Milz <hm@seneca.muc.de>
for his CUTR patch, which was used as a base to implement the SVDRP command EDIT
@@ -1767,7 +1777,22 @@ Bárta Vladimír <vladimir.barta@k2atmitec.cz>
Christoph Haubrich <christoph1.haubrich@arcor.de>
for making the "Ok" key in the "Jump" mode of the replay progress display confirm
the jump instead of closing the display
+ for reporting that the log message "deleting plugin: ..." is irritating when
+ calling "vdr --help"
Pekka Mauno <pekka.mauno@iki.fi>
for fixing cSchedule::GetFollowingEvent() in case there is currently no present
event running
+
+Alexander Wenzel <hondansx@gmx.de>
+ for fixing the shutdown timeout
+
+Jan Lenz <email@JanLenz.de>
+ for reporting a bug in deleting recordings that have been removed externally when
+ running out of disk space
+
+Oleg Roitburd <oleg@roitburd.de>
+ for translating OSD texts to the Russian language
+
+Marius Heidenstecker <marius@heidenstecker.de>
+ for suggesting to make cMenuRecordings::GetRecording() 'protected'
diff --git a/HISTORY b/HISTORY
index 2b6cb5b..ad85a22 100644
--- a/HISTORY
+++ b/HISTORY
@@ -3838,7 +3838,7 @@ Video Disk Recorder Revision History
- The 'new' indicator in the Recordings menu is now kept up-to-date (thanks to
Thomas Günther).
- Updated the Romanian OSD texts (thanks to Lucian Muresan).
-- Updated the Russian OSD texts (thanks to Oleg ???).
+- Updated the Russian OSD texts (thanks to Oleg Roitburd).
- The '.update' file in the video directory is now touched when a recording is
added or deleted, so that other VDR instances can update their lists (thanks to
Alexander Rieger).
@@ -4414,3 +4414,44 @@ Video Disk Recorder Revision History
to be drawn with a transparent background (thanks to Alexander Hans).
- Fixed cSchedule::GetFollowingEvent() in case there is currently no present event
running (thanks to Pekka Mauno).
+
+2006-03-26: Version 1.3.45
+
+- Fixed updating the "Info" button in the "Timers" menu.
+- Reduced the number of events to actually check when setting events to timers.
+- cMenuEditIntItem now checks the given value and forces it to be between the
+ given min and max limits.
+- The status changes of EPG events are now logged for all channels that have timers.
+- Removed the log message "deleting plugin: ..." when shutting down VDR (thanks to
+ Christoph Haubrich for reporting that this is irritating when calling "vdr --help").
+- Fixed cReadLine::Read() for lines that end with the infamous "\r\n" (thanks to
+ Rolf Ahrenberg).
+- Fixed cDvbDevice::SetAudioBypass() in case setTransferModeForDolbyDigital is false
+ (thanks to Werner Fink).
+- Updated 'sources.conf'.
+- Fixed the shutdown timeout (thanks to Alexander Wenzel).
+- Only calling RemoveEmptyVideoDirectories() once in case a recording has been
+ deleted (reported by Hardy Flor).
+- Fixed deleting recordings that have been removed externally when running out of
+ disk space (reported by Jan Lenz).
+- Fixed handling repeating VPS timers (they stopped recording too early).
+- Timer log messages now show "VPS" if this is a VPS timer.
+- Fixed getting the present EPG event in case none is currently 'running' (it
+ then returns the one that just ended).
+- Fixed calling a plugin's main menu function while a message is being displayed
+ (reported by Helmut Auer).
+- Updated the Russian OSD texts (thanks to Oleg Roitburd).
+- Made cMenuRecordings::GetRecording() 'protected' (suggested by Marius Heidenstecker).
+- Speeded up cRemux::ScanVideoPacket() (thanks to Reinhard Nissl).
+- Enhanced logging EPG event data.
+- Fixed format string handling (thanks to Darren Salt).
+- The new function cDevice::ForceTransferMode() can be used to force the primary
+ device into transfer mode (thanks to Reinhard Nissl).
+- The 'version' of EPG events is now ignored when reading EPG data from 'epg.data'
+ or via SVDRP/PUTE to avoid problems with double EPG events.
+- The 'running status' of EPG events is now only set to SI::RunningStatusNotRunning
+ for events before the present event.
+- Fixed some #include sequences.
+- Single shot VPS timers are now only considered 'expired' if their associated
+ EPG event has been explicitly set to SI::RunningStatusNotRunning.
+- The check for timers to be deleted is now done only every 30 seconds.
diff --git a/PLUGINS/src/sky/HISTORY b/PLUGINS/src/sky/HISTORY
index 9d40575..45774f1 100644
--- a/PLUGINS/src/sky/HISTORY
+++ b/PLUGINS/src/sky/HISTORY
@@ -41,3 +41,7 @@ VDR Plugin 'sky' Revision History
2005-09-17: Version 0.3.4
- Added a missing include statement.
+
+2006-03-26: Version 0.3.5
+
+- Fixed format string handling.
diff --git a/PLUGINS/src/sky/sky.c b/PLUGINS/src/sky/sky.c
index cbb927b..4033bf7 100644
--- a/PLUGINS/src/sky/sky.c
+++ b/PLUGINS/src/sky/sky.c
@@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
- * $Id: sky.c 1.12 2005/09/17 10:39:35 kls Exp $
+ * $Id: sky.c 1.13 2006/03/26 09:21:10 kls Exp $
*/
#include <sys/socket.h>
@@ -15,7 +15,7 @@
#include <vdr/plugin.h>
#include <vdr/sources.h>
-static const char *VERSION = "0.3.4";
+static const char *VERSION = "0.3.5";
static const char *DESCRIPTION = "Sky Digibox interface";
// --- cDigiboxDevice --------------------------------------------------------
@@ -108,9 +108,8 @@ cDigiboxDevice::~cDigiboxDevice()
void cDigiboxDevice::LircSend(const char *s)
{
- const char *c = "SEND_ONCE SKY %s\n";
char buf[100];
- sprintf(buf, c, s);
+ snprintf(buf, sizeof(buf), "SEND_ONCE SKY %s\n", s);
dsyslog(buf);//XXX
if (write(fd_lirc, buf, strlen(buf)) < 0)
LOG_ERROR;//XXX _STR
diff --git a/channels.c b/channels.c
index bf1230b..c400061 100644
--- a/channels.c
+++ b/channels.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: channels.c 1.48 2006/01/14 15:51:02 kls Exp $
+ * $Id: channels.c 1.49 2006/02/28 13:54:34 kls Exp $
*/
#include "channels.h"
@@ -12,6 +12,7 @@
#include <ctype.h>
#include "device.h"
#include "epg.h"
+#include "timers.h"
// IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
// format characters in order to allow any number of blanks after a numeric
@@ -248,6 +249,15 @@ int cChannel::Transponder(void) const
return tf;
}
+bool cChannel::HasTimer(void) const
+{
+ for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) {
+ if (Timer->Channel() == this)
+ return true;
+ }
+ return false;
+}
+
int cChannel::Modification(int Mask)
{
int Result = modification & Mask;
diff --git a/channels.conf b/channels.conf
index 50266e9..29dffe1 100644
--- a/channels.conf
+++ b/channels.conf
@@ -1,4 +1,4 @@
-RTL Television,RTL;RTL World:12187:hC34:S19.2E:27500:163:104=deu:105:0:12003:1:1089:0
+RTL Television,RTL;RTL World:12187:hC34:S19.2E:27500:163:104=deu;106=deu:105:0:12003:1:1089:0
SAT.1;ProSiebenSat.1:12480:vC34:S19.2E:27500:1791:1792=deu;1795=deu:34:0:46:133:33:0
ProSieben;ProSiebenSat.1:12480:vC34:S19.2E:27500:255:256=deu;257=deu:32:0:898:133:33:0
RTL2;RTL World:12187:hC34:S19.2E:27500:166:128=deu:68:0:12020:1:1089:0
@@ -8,15 +8,15 @@ hr-fernsehen;ARD:11836:hC34:S19.2E:27500:301:302=deu:304:0:28108:1:1101:0
NDR FS MV;ARD:12109:hC34:S19.2E:27500:2401:2402=deu:2404:0:28224:1:1073:0
SR SÜDWEST Ferns.;ARD:12265:hC34:S19.2E:27500:1301:1302=deu:1304:0:28486:1:1093:0
WDR Köln;ARD:11836:hC34:S19.2E:27500:601:602=deu:604:0:28111:1:1101:0
-BR-alpha;ARD:11836:hC34:S19.2E:27500:701:702=deu:704:0:28112:1:1101:0
+BR-alpha;ARD:11836:hC34:S19.2E:27500:701:702=deu;706=deu:704:0:28112:1:1101:0
SÜDWEST Ferns. BW;ARD:11836:hC34:S19.2E:27500:801:802=deu:804:0:28113:1:1101:0
Phoenix;ARD:11836:hC34:S19.2E:27500:901:902=deu:904:0:28114:1:1101:0
ZDF;ZDFvision:11953:hC34:S19.2E:27500:110:120=deu,121=2ch;125=dd:130:0:28006:1:1079:0
3sat;ZDFvision:11953:hC34:S19.2E:27500:210:220=deu,221=2ch;225=dd:230:0:28007:1:1079:0
KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320=deu:330:0:28008:1:1079:0
arte;ARD:11836:hC34:S19.2E:27500:401:402=deu,403=fra:404:0:28109:1:1101:0
-ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:1762,D05,1801,1702:13001:1:1117:0
-ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu;503=deu:505:1762,D05,1801,1702:13002:1:1117:0
+ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:1762,D05,1702,1801:13001:1:1117:0
+ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu;503=deu:505:1762,D05,1702,1801:13002:1:1117:0
ZDFinfokanal;ZDFvision:11953:hC34:S19.2E:27500:610:620=deu:130:0:28011:1:1079:0
CNN Int.;CNN:11778:vC34:S19.2E:27500:165:100=eng:47:0:28522:1:1068:0
Super RTL,S RTL;RTL World:12187:hC34:S19.2E:27500:165:120=deu:65:0:12040:1:1089:0
@@ -44,20 +44,20 @@ ZDFdokukanal;ZDFvision:11953:hC34:S19.2E:27500:660:670=deu:130:0:28014:1:1079:0
MDR FERNSEHEN;ARD:12109:hC34:S19.2E:27500:401:402=deu:404:0:28204:1:1073:0
rbb Berlin;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0
:Premiere World
-PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1801,1722,1702:8:133:2:0
-PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu,513=deu;515=deu:32:1801,1722,1702:10:133:2:0
-PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu,1793=deu;1795=deu:32:1801,1722,1702:11:133:2:0
-PREMIERE 3,PREM 3;PREMIERE:11797:hC34:S19.2E:27500:2303:2304=deu,2305=deu:32:1722,1702,1801:43:133:2:0
-PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu:32:1801,1722,1702:9:133:2:0
-PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu:32:1722,1702,1801:29:133:2:0
-PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1801,1722,1702:41:133:2:0
-PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1801,1702,1722:20:133:2:0
-DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1801,1722,1702:34:133:17:0
+PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1722,1801,1702:8:133:2:0
+PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu;515=deu:32:1:10:133:2:0
+PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu;1795=deu:32:1:11:133:2:0
+PREMIERE 3,PREM 3;PREMIERE:11797:hC34:S19.2E:27500:2303:2304=deu,2305=deu:32:1:43:133:2:0
+PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu:32:1:9:133:2:0
+PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu,1281=deu:32:1:29:133:2:0
+PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1:41:133:2:0
+PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1702,1801,1722:20:133:2:0
+DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1:34:133:17:0
:Premiere Direkt
PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0
:PW Erotic
BEATE-UHSE.TV,B-UHSE;PREMIERE:11758:hC34:S19.2E:27500:1791:1792=deu:32:1722,1702,1801:21:133:17:0
-EROTIK - AB 18!,AB 18!;PREMIERE:12031:hC34:S19.2E:27500:1279:1280=deu:0:1801,1702,1722,1810:513:133:4:0
+EROTIK - AB 18!,AB 18!;PREMIERE:12031:hC34:S19.2E:27500:1279:1280=deu:0:1722,1801,1702,1810:513:133:4:0
:Sportsworld
PREMIERE SPORT PORTAL,SPORT PORTAL;PREMIERE:11719:hC34:S19.2E:27500:255:256=deu,257=deu:32:1722,1801,1702:17:133:3:0
PREMIERE WIN,WIN;PREMIERE:12031:hC34:S19.2E:27500:3839:3840=deu:33:0:27:133:4:0
@@ -108,7 +108,7 @@ TPS Star:10757:vC34:S13.0E:27500:420:430=fra,431=eng:440:500,100:1204:176:11200:
Sky One;BSkyB:12226:hC23:S28.2E:27500:515+8190:643=eng:579:960,961:4705:2:2027:0
Sky Two;BSkyB:12226:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:5104:2:2027:0
ITV2;BSkyB:10758:vC56:S28.2E:22000:2314:2315=eng,2363=NAR:2317:0:10070:2:2044:0
-Sci-Fi;BSkyB:12148:hC23:S28.2E:27500:512+8190:640=eng,660=NAR:576:960,961:4905:2:2023:0
+SCI FI;BSkyB:12148:hC23:S28.2E:27500:512+8190:640=eng,660=NAR:576:960,961:4905:2:2023:0
ParaComedy 1;BSkyB:12187:hC23:S28.2E:27500:518+8190:666=eng,686=NAR:582:960,961:5904:2:2025:0
Paramount;BSkyB:11526:vC23:S28.2E:27500:2317+2306:2318=eng:2319:960,961:50305:2:2404:0
ParaComedy 2;BSkyB:11914:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:4504:2:2011:0
diff --git a/channels.h b/channels.h
index ef4e80b..c7da4f3 100644
--- a/channels.h
+++ b/channels.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: channels.h 1.39 2006/02/19 14:39:43 kls Exp $
+ * $Id: channels.h 1.40 2006/02/28 13:52:49 kls Exp $
*/
#ifndef __CHANNELS_H
@@ -202,6 +202,7 @@ public:
bool IsSat(void) const { return cSource::IsSat(source); }
bool IsTerr(void) const { return cSource::IsTerr(source); }
tChannelID GetChannelID(void) const { return tChannelID(source, nid, (nid || tid) ? tid : Transponder(), sid, rid); }
+ bool HasTimer(void) const;
int Modification(int Mask = CHANNELMOD_ALL);
void CopyTransponderData(const cChannel *Channel);
bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH);
diff --git a/config.h b/config.h
index ff532d2..07f48cf 100644
--- a/config.h
+++ b/config.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: config.h 1.246 2006/02/25 14:12:20 kls Exp $
+ * $Id: config.h 1.247 2006/02/28 12:23:28 kls Exp $
*/
#ifndef __CONFIG_H
@@ -19,8 +19,8 @@
#include "i18n.h"
#include "tools.h"
-#define VDRVERSION "1.3.44"
-#define VDRVERSNUM 10344 // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION "1.3.45"
+#define VDRVERSNUM 10345 // Version * 10000 + Major * 100 + Minor
#define MAXPRIORITY 99
#define MAXLIFETIME 99
diff --git a/device.c b/device.c
index 5eaa8ac..dfb95f4 100644
--- a/device.c
+++ b/device.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: device.c 1.124 2006/02/24 14:05:26 kls Exp $
+ * $Id: device.c 1.125 2006/03/26 09:42:48 kls Exp $
*/
#include "device.h"
@@ -697,6 +697,15 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
return Result;
}
+void cDevice::ForceTransferMode(void)
+{
+ if (!cTransferControl::ReceiverDevice()) {
+ cChannel *Channel = Channels.GetByNumber(CurrentChannel());
+ if (Channel)
+ SetChannelDevice(Channel, false); // this implicitly starts Transfer Mode
+ }
+}
+
bool cDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{
return false;
diff --git a/device.h b/device.h
index e6e436b..16fa370 100644
--- a/device.h
+++ b/device.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: device.h 1.72 2006/02/04 14:22:08 kls Exp $
+ * $Id: device.h 1.73 2006/03/26 09:42:40 kls Exp $
*/
#ifndef __DEVICE_H
@@ -236,6 +236,8 @@ protected:
public:
static int CurrentChannel(void) { return primaryDevice ? currentChannel : 0; }
///< Returns the number of the current channel on the primary device.
+ void ForceTransferMode(void);
+ ///< Forces the device into transfermode for the current channel.
virtual bool HasLock(int TimeoutMs = 0);//XXX PLUGINS.html
///< Returns true if the device has a lock on the requested transponder.
///< Default is true, a specific device implementation may return false
diff --git a/dvbdevice.c b/dvbdevice.c
index 148a12a..af9b4a8 100644
--- a/dvbdevice.c
+++ b/dvbdevice.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbdevice.c 1.153 2006/02/19 13:52:04 kls Exp $
+ * $Id: dvbdevice.c 1.155 2006/03/26 09:42:54 kls Exp $
*/
#include "dvbdevice.h"
@@ -653,6 +653,8 @@ eVideoSystem cDvbDevice::GetVideoSystem(void)
bool cDvbDevice::SetAudioBypass(bool On)
{
+ if (!setTransferModeForDolbyDigital)
+ return false;
return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0;
}
@@ -928,9 +930,7 @@ void cDvbDevice::SetAudioTrackDevice(eTrackType Type)
if (!setTransferModeForDolbyDigital)
return;
// Currently this works only in Transfer Mode
- cChannel *Channel = Channels.GetByNumber(CurrentChannel());
- if (Channel)
- SetChannelDevice(Channel, false); // this implicitly starts Transfer Mode
+ ForceTransferMode();
}
}
}
diff --git a/epg.c b/epg.c
index 2f88af9..987efb9 100644
--- a/epg.c
+++ b/epg.c
@@ -7,14 +7,14 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
- * $Id: epg.c 1.64 2006/02/26 15:07:17 kls Exp $
+ * $Id: epg.c 1.70 2006/03/26 14:06:11 kls Exp $
*/
#include "epg.h"
-#include "libsi/si.h"
-#include "timers.h"
#include <ctype.h>
#include <time.h>
+#include "libsi/si.h"
+#include "timers.h"
#define RUNNINGSTATUSTIMEOUT 30 // seconds before the running status is considered unknown
@@ -103,7 +103,7 @@ cEvent::cEvent(tEventID EventID)
eventID = EventID;
tableID = 0;
version = 0xFF; // actual version numbers are 0..31
- runningStatus = 0;
+ runningStatus = SI::RunningStatusUndefined;
title = NULL;
shortText = NULL;
description = NULL;
@@ -156,9 +156,8 @@ void cEvent::SetVersion(uchar Version)
void cEvent::SetRunningStatus(int RunningStatus, cChannel *Channel)
{
- if (Channel && runningStatus != RunningStatus && (RunningStatus > SI::RunningStatusNotRunning || runningStatus > SI::RunningStatusUndefined))
- if (Channel->Number() <= 30)//XXX maybe log only those that have timers???
- isyslog("channel %d (%s) event %s '%s' status %d", Channel->Number(), Channel->Name(), *GetTimeString(), Title(), RunningStatus);
+ if (Channel && runningStatus != RunningStatus && (RunningStatus > SI::RunningStatusNotRunning || runningStatus > SI::RunningStatusUndefined) && Channel->HasTimer())
+ isyslog("channel %d (%s) event %s status %d", Channel->Number(), Channel->Name(), *ToDescr(), RunningStatus);
runningStatus = RunningStatus;
}
@@ -209,6 +208,14 @@ void cEvent::SetSeen(void)
seen = time(NULL);
}
+cString cEvent::ToDescr(void) const
+{
+ char vpsbuf[64] = "";
+ if (Vps())
+ sprintf(vpsbuf, "(VPS: %s) ", *GetVpsString());
+ return cString::sprintf("%s %s-%s %s'%s'", *GetDateString(), *GetTimeString(), *GetEndTimeString(), vpsbuf, Title());
+}
+
bool cEvent::HasTimer(void) const
{
for (cTimer *t = Timers.First(); t; t = Timers.Next(t)) {
@@ -313,7 +320,7 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
time_t StartTime;
int Duration;
unsigned int TableID = 0;
- unsigned int Version = 0xFF;
+ unsigned int Version = 0xFF; // actual value is ignored
int n = sscanf(t, "%u %ld %d %X %X", &EventID, &StartTime, &Duration, &TableID, &Version);
if (n >= 3 && n <= 5) {
Event = (cEvent *)Schedule->GetEvent(EventID, StartTime);
@@ -324,8 +331,6 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
Event = newEvent = new cEvent(EventID);
if (Event) {
Event->SetTableID(TableID);
- if (TableID >= 0x50) // makes sure the running status flag is set from the actual data stream
- Event->SetVersion(Version);
Event->SetStartTime(StartTime);
Event->SetDuration(Duration);
if (newEvent)
@@ -678,8 +683,10 @@ const cEvent *cSchedule::GetPresentEvent(void) const
const cEvent *pe = NULL;
time_t now = time(NULL);
for (cEvent *p = events.First(); p; p = events.Next(p)) {
- if (p->StartTime() <= now && now < p->EndTime())
+ if (p->StartTime() <= now)
pe = p;
+ else if (p->StartTime() > now + 3600)
+ break;
if (p->SeenWithin(RUNNINGSTATUSTIMEOUT) && p->RunningStatus() >= SI::RunningStatusPausing)
return p;
}
@@ -728,9 +735,11 @@ const cEvent *cSchedule::GetEventAround(time_t Time) const
void cSchedule::SetRunningStatus(cEvent *Event, int RunningStatus, cChannel *Channel)
{
for (cEvent *p = events.First(); p; p = events.Next(p)) {
- if (p == Event)
- p->SetRunningStatus(RunningStatus, Channel);
- else if (RunningStatus >= SI::RunningStatusPausing && p->RunningStatus() > SI::RunningStatusNotRunning)
+ if (p == Event) {
+ if (p->RunningStatus() > SI::RunningStatusNotRunning || RunningStatus > SI::RunningStatusNotRunning)
+ p->SetRunningStatus(RunningStatus, Channel);
+ }
+ else if (RunningStatus >= SI::RunningStatusPausing && p->StartTime() < Event->StartTime())
p->SetRunningStatus(SI::RunningStatusNotRunning);
}
if (RunningStatus >= SI::RunningStatusPausing)
diff --git a/epg.h b/epg.h
index 1def617..a937ff7 100644
--- a/epg.h
+++ b/epg.h
@@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
- * $Id: epg.h 1.33 2006/02/26 13:58:57 kls Exp $
+ * $Id: epg.h 1.34 2006/03/25 12:39:39 kls Exp $
*/
#ifndef __EPG_H
@@ -103,6 +103,7 @@ public:
void SetDuration(int Duration);
void SetVps(time_t Vps);
void SetSeen(void);
+ cString ToDescr(void) const;
void Dump(FILE *f, const char *Prefix = "", bool InfoOnly = false) const;
bool Parse(char *s);
static bool Read(FILE *f, cSchedule *Schedule);
diff --git a/i18n.c b/i18n.c
index 63c4aef..f4760f6 100644
--- a/i18n.c
+++ b/i18n.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: i18n.c 1.250 2006/02/25 14:21:28 kls Exp $
+ * $Id: i18n.c 1.252 2006/03/26 09:17:58 kls Exp $
*
* Translations provided by:
*
@@ -22,7 +22,7 @@
* Romanian Paul Lacatus <paul@campina.iiruc.ro>, Lucian Muresan <lucianm@users.sourceforge.net>
* Hungarian Istvan Koenigsberger <istvnko@hotmail.com>, Guido Josten <guido.josten@t-online.de>
* Catalanian Marc Rovira Vall <tm05462@salleURL.edu>, Ramon Roca <ramon.roca@xcombo.com>, Jordi Vilà <jvila@tinet.org>
- * Russian Vyacheslav Dikonov <sdiconov@mail.ru>
+ * Russian Vyacheslav Dikonov <sdiconov@mail.ru>, Oleg Roitburd <oleg@roitburd.de>
* Croatian Drazen Dupor <drazen.dupor@dupor.com>, Dino Ravnic <dino.ravnic@fer.hr>
* Estonian Arthur Konovalov <kasjas@hot.ee>
* Danish Mogens Elneff <mogens@elneff.dk>
@@ -475,7 +475,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "ÍâÐ ßÕàÕÔÐçÐ - %s",
"",//TODO
"See sündmus - %s",
"Denne udsendelse - %s",
@@ -497,7 +497,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "ÍâÐ ßÕàÕÔÐçÐ - ÒáÕ ÚÐÝÐÛë",
"",//TODO
"See sündmus - kõik kanalid",
"Denne udsendelse - alle kanaler",
@@ -519,7 +519,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "²áÕ ßÕàÕÔÐçØ - ÒáÕ ÚÐÝÐÛë",
"",//TODO
"Kõik sündmused - kõik kanalid",
"Alle udsendelser - alle kanaler",
@@ -696,7 +696,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "ÂÐÙÜÕà",
"",// TODO
"Taimer",
"Timer",
@@ -1319,27 +1319,27 @@ const tI18nPhrase Phrases[] = {
"Optagelse igang - sluk alligevel?",
"Systém je zaneprázdnìn - pøesto vypnout?",
},
- { "Recording in %d minutes, shut down anyway?",
- "Aufnahme in %d Minuten - trotzdem ausschalten?",
- "Snemanje èez %d minut, zares izklopi?",
- "Registrazione fra %d minuti - spengo comunque?",
- "Opname in %d minuten - toch uitschakelen?",
- "Em gravação dentro de %d minutos - quer mesmo desligar?",
- "Enregistrement dans %d minutes - confirmez l'arrêt",
- "Skal gjøre opptak om %d minutter - slå av likevel?",
- "Tallennus alkaa %d min kuluttua - sammutetaanko?",
- "Nagrywanie za %d minut - wy³±czyæ mimo to?",
- "Grabación dentro de %d minutos, ¿apagar realmente?",
- "ÁíáìÝíåôáé åããñáöÞ óÝ %d ëåðôÜ - ÔåëéêÜ íá ôåñìáôéóôåß?",
- "Inspelning startar om %d minuter, vill du avsluta?",
- "Înregistrez peste %d minute - închid, totuºi?",
- "Felvétel %d perc mulva kezdödik - mégis kikapcsolni?",
- "Hi ha una gravació en %d minuts - Apagar de totes maneres?",
- "ÇÕàÕ× %d ÜØÝãâ ÝÐçÝñâáï ×ÐßØáì - ÔÕÙáâÒØâÕÛìÝÞ ÒëÚÛîçØâì?",
- "Snimanje za %d minuta - svejedno iskljuèiti?",
- "Salvestamine algab %d minuti pärast - lülitan välja?",
- "Optagelse om %d minutter - sluk alligevel?",
- "Nahrávání zaène za %d minut - pøesto vypnout?",
+ { "Recording in %ld minutes, shut down anyway?",
+ "Aufnahme in %ld Minuten - trotzdem ausschalten?",
+ "Snemanje èez %ld minut, zares izklopi?",
+ "Registrazione fra %ld minuti - spengo comunque?",
+ "Opname in %ld minuten - toch uitschakelen?",
+ "Em gravação dentro de %ld minutos - quer mesmo desligar?",
+ "Enregistrement dans %ld minutes - confirmez l'arrêt",
+ "Skal gjøre opptak om %ld minutter - slå av likevel?",
+ "Tallennus alkaa %ld min kuluttua - sammutetaanko?",
+ "Nagrywanie za %ld minut - wy³±czyæ mimo to?",
+ "Grabación dentro de %ld minutos, ¿apagar realmente?",
+ "ÁíáìÝíåôáé åããñáöÞ óÝ %ld ëåðôÜ - ÔåëéêÜ íá ôåñìáôéóôåß?",
+ "Inspelning startar om %ld minuter, vill du avsluta?",
+ "Înregistrez peste %ld minute - închid, totuºi?",
+ "Felvétel %ld perc mulva kezdödik - mégis kikapcsolni?",
+ "Hi ha una gravació en %ld minuts - Apagar de totes maneres?",
+ "ÇÕàÕ× %ld ÜØÝãâ ÝÐçÝñâáï ×ÐßØáì - ÔÕÙáâÒØâÕÛìÝÞ ÒëÚÛîçØâì?",
+ "Snimanje za %ld minuta - svejedno iskljuèiti?",
+ "Salvestamine algab %ld minuti pärast - lülitan välja?",
+ "Optagelse om %ld minutter - sluk alligevel?",
+ "Nahrávání zaène za %ld minut - pøesto vypnout?",
},
{ "Press any key to cancel shutdown",
"Taste drücken, um Shutdown abzubrechen",
@@ -1666,7 +1666,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "FTA (ÝÕ×ÐÚÞÔØàÞÒÐÝÞ)",
"",//TODO
"FTA",
"Free To Air",
@@ -1688,7 +1688,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "×ÐÚÞÔØàÞÒÐÝÞ",
"",//TODO
"krüptitud",
"kodet",
@@ -2460,7 +2460,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "½ÕÔÞáâÐâÞçÝÞ ÜÕáâÐ ÝÐ ÔØáÚÕ ÔÛï ÝÐçÐÛÐ ×ÐßØáØ",
"",//TODO
"Ebapiisavalt kettaruumi salvestamise alustamiseks!",
"For lidt harddisk plads til optagelse!",
@@ -2504,7 +2504,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "¾âÚàëÒÐî ÜÕÝî ÜÞÔãÛï ãáÛÞÒÝÞÓÞ ÔÞáâãßÐ (CAM)",
"",//TODO
"CAM-menüü avamine...",
"Åbner CAM menu...",
@@ -2548,7 +2548,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "¿ÕàÕÓàã×ÚÐ CAM...",
"",//TODO
"CAM mooduli taaskäivitus...",
"Nulstiller CAM...",
@@ -2614,7 +2614,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "½ÐÖÜØâÕ %d æØäàë",
"",//TODO
"Palun sisesta %d numbrit!",
"Indtast venligst %d cifre!",
@@ -3232,7 +3232,7 @@ const tI18nPhrase Phrases[] = {
"", // TODO
"", // TODO
"", // TODO
- "", // TODO
+ "¸ÝäÞàÜÐæØî Þ ÚÐÝÐÛÕ ×ÐÚàëâì",
"", // TODO
"Kanaliinfo kuvamise ajapiirang",
"Timeout ved anmodet kanal info",
@@ -3298,7 +3298,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "ºÝÞßÚã ¼ÕÝî ×ÐÚàëâì",
"",// TODO
"Sulgemine Menüü klahviga",
"Menu taste lukker",
@@ -4399,7 +4399,7 @@ const tI18nPhrase Phrases[] = {
"LMMJVSD",
"HKSCPSV",
"LMCJVSG",
- "¿²ÁÇ¿²Á",
+ "¿²ÁÇ¿Á²",
"PUSÈPSN", // hrv
"ETKNRLP",
"MTOTFLS",
@@ -5151,7 +5151,7 @@ const tI18nPhrase Phrases[] = {
"Derulare înainte",
"Elöre pörgetni",
"Endavant ràpidament",
- "²ßÕàñÔ",
+ "¿àÞÚàãâÚÐ ÒßÕàñÔ",
"Naprijed",
"Edasikerimine",
"Spol fremad",
@@ -5173,7 +5173,7 @@ const tI18nPhrase Phrases[] = {
"Derulare înapoi",
"Vissza pörgetni",
"Enrera ràpidament",
- "½Ð×ÐÔ",
+ "¿àÞÚàãâÚÐ ÝÐ×ÐÔ",
"Nazad",
"Tagasikerimine",
"Spol tilbage",
@@ -5768,7 +5768,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "·ÐßØáì ÝÐçÐâÐ",
"",//TODO
"Salvestamine algas",
"Optagelse startet",
diff --git a/i18n.h b/i18n.h
index 0cbf728..b6c217b 100644
--- a/i18n.h
+++ b/i18n.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: i18n.h 1.17 2006/02/04 10:41:16 kls Exp $
+ * $Id: i18n.h 1.18 2006/03/26 09:08:00 kls Exp $
*/
#ifndef __I18N_H
@@ -18,7 +18,7 @@ typedef const char *tI18nPhrase[I18nNumLanguages];
void I18nRegister(const tI18nPhrase * const Phrases, const char *Plugin);
-const char *I18nTranslate(const char *s, const char *Plugin = NULL);
+const char *I18nTranslate(const char *s, const char *Plugin = NULL) __attribute_format_arg__(1);
const char * const * I18nLanguages(void);
const char * const * I18nCharSets(void);
diff --git a/interface.c b/interface.c
index 4b74db9..59147f4 100644
--- a/interface.c
+++ b/interface.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: interface.c 1.73 2006/01/29 12:35:50 kls Exp $
+ * $Id: interface.c 1.74 2006/03/25 11:50:55 kls Exp $
*/
#include "interface.h"
@@ -52,7 +52,7 @@ eKeys cInterface::Wait(int Seconds, bool KeepChar)
if (ISRAWKEY(Key) || time(NULL) > timeout || interrupted)
break;
}
- if (KeepChar && ISRAWKEY(Key))
+ if (KeepChar && ISRAWKEY(Key) || Key == k_Plugin)
cRemote::Put(Key);
interrupted = false;
return Key;
diff --git a/menu.c b/menu.c
index d15c017..f3c9fab 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 1.422 2006/02/25 15:41:40 kls Exp $
+ * $Id: menu.c 1.424 2006/02/28 13:58:00 kls Exp $
*/
#include "menu.h"
@@ -500,12 +500,10 @@ eOSState cMenuChannels::Delete(void)
cChannel *channel = GetChannel(Current());
int DeletedChannel = channel->Number();
// Check if there is a timer using this channel:
- for (cTimer *ti = Timers.First(); ti; ti = Timers.Next(ti)) {
- if (ti->Channel() == channel) {
- Skins.Message(mtError, tr("Channel is being used by a timer!"));
- return osContinue;
- }
- }
+ if (channel->HasTimer()) {
+ Skins.Message(mtError, tr("Channel is being used by a timer!"));
+ return osContinue;
+ }
if (Interface->Confirm(tr("Delete channel?"))) {
Channels.Del(channel);
cOsdMenu::Del(Index);
@@ -690,8 +688,8 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key)
*timer = data;
if (addIfConfirmed)
Timers.Add(timer);
- timer->Matches();
timer->SetEventFromSchedule();
+ timer->Matches();
Timers.SetModified();
isyslog("timer %s %s (%s)", *timer->ToDescr(), addIfConfirmed ? "added" : "modified", timer->HasFlags(tfActive) ? "active" : "inactive");
addIfConfirmed = false;
@@ -787,8 +785,10 @@ cMenuTimers::cMenuTimers(void)
:cOsdMenu(tr("Timers"), 2, CHNUMWIDTH, 10, 6, 6)
{
helpKeys = -1;
- for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer))
+ for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer)) {
+ timer->SetEventFromSchedule(); // make sure the event is current
Add(new cMenuTimerItem(timer));
+ }
Sort();
SetCurrent(First());
SetHelpKeys();
@@ -900,7 +900,7 @@ eOSState cMenuTimers::ProcessKey(eKeys Key)
case kOk: return Edit();
case kRed: state = OnOff(); break; // must go through SetHelpKeys()!
case kGreen: return New();
- case kYellow: return Delete();
+ case kYellow: state = Delete(); break;
case kBlue: return Info();
break;
default: break;
diff --git a/menu.h b/menu.h
index 46c1eef..de6014e 100644
--- a/menu.h
+++ b/menu.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.h 1.84 2006/02/25 13:41:21 kls Exp $
+ * $Id: menu.h 1.85 2006/03/25 12:15:19 kls Exp $
*/
#ifndef __MENU_H
@@ -165,13 +165,14 @@ private:
int helpKeys;
void SetHelpKeys(void);
void Set(bool Refresh = false);
- cRecording *GetRecording(cMenuRecordingItem *Item);
bool Open(bool OpenSubMenus = false);
eOSState Play(void);
eOSState Rewind(void);
eOSState Delete(void);
eOSState Info(void);
eOSState Commands(eKeys Key = kNone);
+protected:
+ cRecording *GetRecording(cMenuRecordingItem *Item);
public:
cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false);
~cMenuRecordings();
diff --git a/menuitems.c b/menuitems.c
index fab13ca..34e0dd7 100644
--- a/menuitems.c
+++ b/menuitems.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menuitems.c 1.32 2006/02/12 10:31:08 kls Exp $
+ * $Id: menuitems.c 1.34 2006/03/26 09:10:17 kls Exp $
*/
#include "menuitems.h"
@@ -51,6 +51,10 @@ cMenuEditIntItem::cMenuEditIntItem(const char *Name, int *Value, int Min, int Ma
value = Value;
min = Min;
max = Max;
+ if (*value < min)
+ *value = min;
+ else if (*value > max)
+ *value = max;
Set();
}
@@ -286,12 +290,11 @@ void cMenuEditStrItem::AdvancePos(void)
void cMenuEditStrItem::Set(void)
{
char buf[1000];
- const char *fmt = insert && newchar ? "[]%c%s" : "[%c]%s";
if (InEditMode()) {
const cFont *font = cFont::GetFont(fontOsd);
strncpy(buf, value, pos);
- snprintf(buf + pos, sizeof(buf) - pos - 2, fmt, *(value + pos), value + pos + 1);
+ snprintf(buf + pos, sizeof(buf) - pos - 2, insert && newchar ? "[]%c%s" : "[%c]%s", *(value + pos), value + pos + 1);
int width = cSkinDisplay::Current()->EditableWidth();
if (font->Width(buf) <= width) {
// the whole buffer fits on the screen
diff --git a/pat.h b/pat.h
index a7f4635..6246cc0 100644
--- a/pat.h
+++ b/pat.h
@@ -4,14 +4,14 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: pat.h 1.4 2004/03/07 16:22:01 kls Exp $
+ * $Id: pat.h 1.5 2006/03/26 14:09:43 kls Exp $
*/
#ifndef __PAT_H
#define __PAT_H
-#include "filter.h"
#include <stdint.h>
+#include "filter.h"
#define MAXPMTENTRIES 64
diff --git a/plugin.c b/plugin.c
index fdb38e8..6ceb561 100644
--- a/plugin.c
+++ b/plugin.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: plugin.c 1.16 2006/01/08 11:40:05 kls Exp $
+ * $Id: plugin.c 1.17 2006/02/28 14:16:54 kls Exp $
*/
#include "plugin.h"
@@ -427,10 +427,6 @@ void cPluginManager::StopPlugins(void)
void cPluginManager::Shutdown(void)
{
cDll *dll;
- while ((dll = dlls.Last()) != NULL) {
- cPlugin *p = dll->Plugin();
- if (p)
- isyslog("deleting plugin: %s", p->Name());
+ while ((dll = dlls.Last()) != NULL)
dlls.Del(dll);
- }
}
diff --git a/receiver.c b/receiver.c
index 2fc36c9..ddaafef 100644
--- a/receiver.c
+++ b/receiver.c
@@ -4,12 +4,12 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: receiver.c 1.4 2005/01/16 14:03:01 kls Exp $
+ * $Id: receiver.c 1.5 2006/03/26 14:07:21 kls Exp $
*/
+#include "receiver.h"
#include <stdarg.h>
#include <stdio.h>
-#include "receiver.h"
#include "tools.h"
cReceiver::cReceiver(int Ca, int Priority, int Pid, const int *Pids1, const int *Pids2, const int *Pids3)
diff --git a/recording.c b/recording.c
index b8db264..379627c 100644
--- a/recording.c
+++ b/recording.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recording.c 1.140 2006/02/26 11:59:59 kls Exp $
+ * $Id: recording.c 1.143 2006/03/26 09:11:00 kls Exp $
*/
#include "recording.h"
@@ -83,6 +83,7 @@ void cRemoveDeletedRecordingsThread::Action(void)
// Make sure only one instance of VDR does this:
cLockFile LockFile(VideoDirectory);
if (LockFile.Lock()) {
+ bool deleted = false;
cThreadLock DeletedRecordingsLock(&DeletedRecordings);
for (cRecording *r = DeletedRecordings.First(); r; ) {
if (r->deleted && time(NULL) - r->deleted > DELETEDLIFETIME) {
@@ -90,11 +91,13 @@ void cRemoveDeletedRecordingsThread::Action(void)
r->Remove();
DeletedRecordings.Del(r);
r = next;
- RemoveEmptyVideoDirectories();
+ deleted = true;
continue;
}
r = DeletedRecordings.Next(r);
}
+ if (deleted)
+ RemoveEmptyVideoDirectories();
}
}
@@ -801,11 +804,16 @@ bool cRecording::Delete(void)
strncpy(ext, DELEXT, strlen(ext));
if (access(NewName, F_OK) == 0) {
// the new name already exists, so let's remove that one first:
- isyslog("removing recording %s", NewName);
+ isyslog("removing recording '%s'", NewName);
RemoveVideoFile(NewName);
}
- isyslog("deleting recording %s", FileName());
- result = RenameVideoFile(FileName(), NewName);
+ isyslog("deleting recording '%s'", FileName());
+ if (access(FileName(), F_OK) == 0)
+ result = RenameVideoFile(FileName(), NewName);
+ else {
+ isyslog("recording '%s' vanished", FileName());
+ result = true; // well, we were going to delete it, anyway
+ }
}
free(NewName);
return result;
@@ -1049,7 +1057,7 @@ bool cMark::Parse(const char *s)
bool cMark::Save(FILE *f)
{
- return fprintf(f, ToText()) > 0;
+ return fprintf(f, "%s", *ToText()) > 0;
}
// --- cMarks ----------------------------------------------------------------
diff --git a/remux.c b/remux.c
index 31ad719..ae4a17a 100644
--- a/remux.c
+++ b/remux.c
@@ -11,7 +11,7 @@
* The cRepacker family's code was originally written by Reinhard Nissl <rnissl@gmx.de>,
* and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de.
*
- * $Id: remux.c 1.54 2006/02/03 16:19:02 kls Exp $
+ * $Id: remux.c 1.55 2006/03/25 12:27:30 kls Exp $
*/
#include "remux.h"
@@ -1429,7 +1429,9 @@ int cDolbyRepacker::BreakAt(const uchar *Data, int Count)
#define IPACKS 2048
// Start codes:
-#define SC_PICTURE 0x00 // "picture header"
+#define SC_SEQUENCE 0xB3 // "sequence header code"
+#define SC_GROUP 0xB8 // "group start code"
+#define SC_PICTURE 0x00 // "picture start code"
#define MAXNONUSEFULDATA (10*1024*1024)
#define MAXNUMUPTERRORS 10
@@ -1925,14 +1927,38 @@ int cRemux::ScanVideoPacket(const uchar *Data, int Count, int Offset, uchar &Pic
if (Length > 0) {
int PesPayloadOffset = 0;
if (AnalyzePesHeader(Data + Offset, Length, PesPayloadOffset) >= phMPEG1) {
- for (int i = Offset + PesPayloadOffset; i < Offset + Length - 5; i++) {
- if (Data[i] == 0 && Data[i + 1] == 0 && Data[i + 2] == 1) {
- switch (Data[i + 3]) {
- case SC_PICTURE: PictureType = (Data[i + 5] >> 3) & 0x07;
- return Length;
+ const uchar *p = Data + Offset + PesPayloadOffset + 2;
+ const uchar *pLimit = Data + Offset + Length - 3;
+#ifdef TEST_cVideoRepacker
+ // cVideoRepacker ensures that a new PES packet is started for a new sequence,
+ // group or picture which allows us to easily skip scanning through a huge
+ // amount of video data.
+ if (p < pLimit) {
+ if (p[-2] || p[-1] || p[0] != 0x01)
+ pLimit = 0; // skip scanning: packet doesn't start with 0x000001
+ else {
+ switch (p[1]) {
+ case SC_SEQUENCE:
+ case SC_GROUP:
+ case SC_PICTURE:
+ break;
+ default: // skip scanning: packet doesn't start a new sequence, group or picture
+ pLimit = 0;
+ }
+ }
+ }
+#endif
+ while (p < pLimit && (p = (const uchar *)memchr(p, 0x01, pLimit - p))) {
+ if (!p[-2] && !p[-1]) { // found 0x000001
+ switch (p[1]) {
+ case SC_PICTURE: PictureType = (p[3] >> 3) & 0x07;
+ return Length;
+ }
+ p += 4; // continue scanning after 0x01ssxxyy
}
- }
- }
+ else
+ p += 3; // continue scanning after 0x01xxyy
+ }
}
PictureType = NO_PICTURE;
return Length;
diff --git a/remux.h b/remux.h
index ab29655..2f11756 100644
--- a/remux.h
+++ b/remux.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remux.h 1.15 2005/08/26 13:22:19 kls Exp $
+ * $Id: remux.h 1.16 2006/03/25 12:27:30 kls Exp $
*/
#ifndef __REMUX_H
@@ -46,8 +46,6 @@ private:
cRingBufferLinear *resultBuffer;
int resultSkipped;
int GetPid(const uchar *Data);
- int GetPacketLength(const uchar *Data, int Count, int Offset);
- int ScanVideoPacket(const uchar *Data, int Count, int Offset, uchar &PictureType);
public:
cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure = false);
///< Creates a new remuxer for the given PIDs. VPid is the video PID, while
@@ -79,6 +77,8 @@ public:
///< Clears the remuxer of all data it might still contain, keeping the PID
///< settings as they are.
static void SetBrokenLink(uchar *Data, int Length);
+ static int GetPacketLength(const uchar *Data, int Count, int Offset);
+ static int ScanVideoPacket(const uchar *Data, int Count, int Offset, uchar &PictureType);
};
#endif // __REMUX_H
diff --git a/sources.conf b/sources.conf
index b318468..e770496 100644
--- a/sources.conf
+++ b/sources.conf
@@ -17,98 +17,169 @@
# Satellites
+# Europe
+
S5E Sirius 2/3
-S7E Eutelsat W3
-S10E Eutelsat W1R
+S7E Eutelsat W3A
+S10E Eutelsat W1
S13E Hotbird 1-(5)-6
S16E Eutelsat W2
S19.2E Astra 1B/C/E/F/G/H/2C
-S21.5E Eutelsat II F3
-S23.5E Astra 3A
-S24.2E Astra 1D
-S26E Arabsat 2A/3A
+S21.0E Afristar 1
+S21.6E Eutelsat W6
+S23.5E Astra 1D 3A
+S26E Arabsat 2D/2C/3A
S28.2E Astra 2D/A/B
-S28.5E Eurobird
+S28.5E Eurobird 1 & Astra 2A/B/D
S30.5E Arabsat 2B
-S31.3E Türksat 1B
+S33E Eurobird 3 & Intelsat 802
S36E Eutelsat W4 & Sesat
-S39E Hellas Sat
-S40E Express A1R
-S42E Turksat 1C & EurAsiaSat 1 & NewSat 1
-S45E Europe*Star 1
-S47E Telecom 2B
-S48E Eutelsat II F1
-S50E Anatolia 1
-S53E Gorizont 32
-S55.1E Insat 2DT
-S56E Most 1
+S38E Paksat 1
+S39E Hellas Sat 2
+S40E Express AM1
+S42E Turksat 1C/2A
+S45E PAS 12
+S49E Yamal 202
+S53E Express AM 22
+S55E Insat 3E & Intelsat 702
+S56E Bonum 1
S57E NSS 703
S60E Intelsat 904
S62E Intelsat 902
S64E Intelsat 906
S66E Intelsat 704
S68.5E PAS 7/10
+S70.5E Eutelsat W5
S72E PAS 4
-S74E Insat 3C
+
+# Asia
+
+S74E Insat 3C & Edusat
S75E LMI 1
-S76.5E Apstar
+S76.5E Telstar 10
S78.5E Thaicom 2/3
-S80E Express 6A
-S83E Insat 2E/3B
+S80E Express AM2
+S83E Insat 2E/3B/4A
+S85.2E Intelsat 709
+S87.5E Chinastar 1
+S88E ST 1
+S90E Yamal 201
+S91.5E Measat 1
+S93.5E Insat 3A
+S95E NSS 6
+S96.5E Express AM 11
S100.5E Asiasat 2
+S103E Express A2
S105.5E Asiasat 3S
-S113E Palapa C2
+S107.7E Cakrawarta 1
+S108E Telkom 1 & AAP 1
+S110E N-Sat 110 & BSAT 1A/2A
+S110.5E Sinosat 1
+S113E Palapa C2 & Koreasat 2
+S116E Koreasat 3
+S118E Telkom 2
+S120E Thaicom 1A
+S122.2E Asiasat 4
+S124E JCSAT 4a
+S128E JCSAT 3
+S132E N-Star A
+S134E Apstar 6
+S136E N-Star B
+S138E Telstar 18
+S140E Express AM 3
+S144E Superbird C
+S146E Agila 2
+S148E Measat 2
+S150E JCSAT R
S152E Optus B3
+S154E JCSAT 2A
S156E Optus C1
+S158E Superbird A
S160E Optus B1
+S162E Superbird B2
+S164E Optus A3
S166E PAS 8
S169E PAS 2
+S172E AMC 23
S180E Intelsat 701
+S177W NSS 5
-S1W Thor 2/3 & Intelsat 707
-S4W Amos 1
-S5W Telecom 2C & Atlantic Bird 3
+# Atlantic
+
+S1W Thor 2/3 & Intelsat 10-02
+S4W Amos 1/2
+S5W Atlantic Bird 3
S7W Nilesat 101 & 102
-S8W Telecom 2A/2D & Atlantic Bird 2
-S11W Express 3A
-S12.5W Eutelsat II F2
-S14W Gorizont 26
+S8W Telecom 2D & Atlantic Bird 2
+S11W Express A3
+S12.5W Atlantic Bird 2
+S14W Express A4
S15W Telstar 12
S18W Intelsat 901
-S21.5W NSS 7
-S27.5W Intelsat 605
-S30W Hispasat 1
+S20W Intelsat 603
+S22W NSS 7
+S24.5W Intelsat 905
+S27.5W Intelsat 907
+S30W Hispasat 1C/1D
S31.5W Intelsat 801
S34.5W Intelsat 903
-S37.5W Telstar 11
+S37.5W Telstar 11 & AMC 12
S40.5W NSS 806
-S43W PAS 3R/6/6B
-S45W PAS 1/5R
-S47W TDRS 6
-S53W Intelsat 706
+S43W PAS 3R/6B
+S45W PAS 1R
+S50W Intelsat 705
+S53W Intelsat 707
S55.5W Intelsat 805
S58W PAS 9
-S61.5W Echostar 3
+S61W Amazonas
+
+# America
+
+S61.5W Echostar 3 & Rainbow 1
+S63W Estrelo de Sul 1
+S65W Brasilsat B2
+S70W Brasilsat B1
+S72W Nahuel 1 & AMC 6
+S72.5W DirecTV 1
+S74W SBS 6
+S77W Echostar 4
S79W AMC5
+S79.5W Nimiq 3
S82W Nimiq 2
-S85W AMC2
+S83W AMC 9
+S84W Brasilsat B3
+S85W AMC 2
+S85.1W XM 3
S87W AMC3
-S89W Intelsat 808
-S91W Galaxy 11 & Nimiq 1/3
-S93W Intelsat 806
+S89W Intelsat Americas 8
+S91W Galaxy 11 & Nimiq 1
+S91.5W DirecTV 2
+S92W Brasilsat B4
+S93W Intelsat Americas 6
S95W Galaxy 3C
-S97W Telestar 5
+S97W Intelsat Americas 5
S99W Galaxy 4R
-S101W AMC4
+S99.2W Spaceway 2
+S101W DirecTV 1R/4S/8 & AMC4
S103W AMC1
S105W AMC15
-S110W Echostar 6/8
-S119W Echostar 7
-S121W Echostar 9 & Intelsat 813
+S107.3W Anik F1/F1R
+S110W DirecTV 5 & Echostar 6/8
+A111.1W Anik F2
+S113W Solidaridad 2
+S119W Echostar 7 & DirecTV 7S
+S121W Echostar 9 & Intelsat Americas 13
S123W Galaxy 10R
-S129W Intelsat 807
+S125W Galaxy 14
+S127W Galaxy 13/Horizons 1
+S129W Echostar 5 & Intelsat Americas 7
+S131W AMC 11
+S133W Galaxy15/1R
+S135W AMC 10
+S137W AMC 7
+S138.5W Echostar 10
+S139W AMC 8
S148W Echostar 1/2
-S157W Echostar 4
# Cable
diff --git a/spu.c b/spu.c
index ccdcc39..9ca25a1 100644
--- a/spu.c
+++ b/spu.c
@@ -6,11 +6,11 @@
* This code is distributed under the terms and conditions of the
* GNU GENERAL PUBLIC LICENSE. See the file COPYING for details.
*
- * $Id: spu.c 1.1 2002/09/08 14:17:41 kls Exp $
+ * $Id: spu.c 1.2 2006/03/26 14:07:59 kls Exp $
*/
-#include <inttypes.h>
#include "spu.h"
+#include <inttypes.h>
// -- cSpuDecoder ----------------
/*
diff --git a/svdrp.c b/svdrp.c
index 9fa61ea..0cf73e9 100644
--- a/svdrp.c
+++ b/svdrp.c
@@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
- * $Id: svdrp.c 1.93 2006/01/14 16:08:20 kls Exp $
+ * $Id: svdrp.c 1.94 2006/03/26 09:14:13 kls Exp $
*/
#include "svdrp.h"
@@ -461,7 +461,7 @@ void cSVDRP::PrintHelpTopics(const char **hp)
q += sprintf(q, "%*s", -MAXHELPTOPIC, topic);
}
x = 0;
- Reply(-214, buffer);
+ Reply(-214, "%s", buffer);
}
}
@@ -782,7 +782,7 @@ void cSVDRP::CmdGRAB(const char *Option)
cBase64Encoder Base64(Image, ImageSize);
const char *s;
while ((s = Base64.NextLine()) != NULL)
- Reply(-216, s);
+ Reply(-216, "%s", s);
Reply(216, "Grabbed image %s", Option);
}
free(Image);
@@ -799,7 +799,7 @@ void cSVDRP::CmdHELP(const char *Option)
if (*Option) {
const char *hp = GetHelpPage(Option, HelpPages);
if (hp)
- Reply(214, hp);
+ Reply(214, "%s", hp);
else {
Reply(504, "HELP topic \"%s\" unknown", Option);
return;
@@ -1332,7 +1332,7 @@ void cSVDRP::CmdPLUG(const char *Option)
if (*cmd && *option) {
const char *hp = GetHelpPage(option, plugin->SVDRPHelpPages());
if (hp) {
- Reply(-214, hp);
+ Reply(-214, "%s", hp);
Reply(214, "End of HELP info");
}
else
@@ -1358,7 +1358,7 @@ void cSVDRP::CmdPLUG(const char *Option)
int ReplyCode = 900;
cString s = plugin->SVDRPCommand(cmd, option, ReplyCode);
if (s)
- Reply(abs(ReplyCode), *s);
+ Reply(abs(ReplyCode), "%s", *s);
else
Reply(500, "Command unrecognized: \"%s\"", cmd);
}
@@ -1380,7 +1380,7 @@ void cSVDRP::CmdPUTE(const char *Option)
{
delete PUTEhandler;
PUTEhandler = new cPUTEhandler;
- Reply(PUTEhandler->Status(), PUTEhandler->Message());
+ Reply(PUTEhandler->Status(), "%s", PUTEhandler->Message());
if (PUTEhandler->Status() != 354)
DELETENULL(PUTEhandler);
}
@@ -1467,7 +1467,7 @@ void cSVDRP::Execute(char *Cmd)
// handle PUTE data:
if (PUTEhandler) {
if (!PUTEhandler->Process(Cmd)) {
- Reply(PUTEhandler->Status(), PUTEhandler->Message());
+ Reply(PUTEhandler->Status(), "%s", PUTEhandler->Message());
DELETENULL(PUTEhandler);
}
return;
diff --git a/thread.c b/thread.c
index 3293b1d..89d56e9 100644
--- a/thread.c
+++ b/thread.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: thread.c 1.53 2006/02/12 12:24:39 kls Exp $
+ * $Id: thread.c 1.54 2006/03/26 09:22:27 kls Exp $
*/
#include "thread.h"
@@ -208,7 +208,8 @@ cThread::cThread(const char *Description)
childTid = 0;
childThreadId = 0;
description = NULL;
- SetDescription(Description);
+ if (Description)
+ SetDescription("%s", Description);
}
cThread::~cThread()
diff --git a/timers.c b/timers.c
index 63eb342..0e764d3 100644
--- a/timers.c
+++ b/timers.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: timers.c 1.50 2006/02/26 10:50:47 kls Exp $
+ * $Id: timers.c 1.55 2006/03/26 14:08:57 kls Exp $
*/
#include "timers.h"
@@ -12,6 +12,7 @@
#include "channels.h"
#include "device.h"
#include "i18n.h"
+#include "libsi/si.h"
#include "remote.h"
// IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
@@ -120,7 +121,7 @@ cString cTimer::ToText(bool UseChannelID)
cString cTimer::ToDescr(void) const
{
char *buffer;
- asprintf(&buffer, "%d (%d %04d-%04d '%s')", Index() + 1, Channel()->Number(), start, stop, file);
+ asprintf(&buffer, "%d (%d %04d-%04d %s'%s')", Index() + 1, Channel()->Number(), start, stop, HasFlags(tfVps) ? "VPS " : "", file);
return cString(buffer, true);
}
@@ -409,7 +410,13 @@ int cTimer::Matches(const cEvent *Event, int *Overlap) const
bool cTimer::Expired(void) const
{
- return IsSingleEvent() && !Recording() && StopTime() + EXPIRELATENCY <= time(NULL);
+ if (IsSingleEvent() && !Recording() && StopTime() + EXPIRELATENCY <= time(NULL)) {
+ if (HasFlags(tfVps) && event && event->Vps())
+ return event->RunningStatus() == SI::RunningStatusNotRunning;
+ else
+ return true;
+ }
+ return false;
}
time_t cTimer::StartTime(void) const
@@ -426,7 +433,10 @@ time_t cTimer::StopTime(void) const
return stopTime;
}
-#define EPGLIMITPAST (2 * 3600) // time in seconds in the past within which EPG events will be taken into consideration
+#define EPGLIMITBEFORE (1 * 3600) // Time in seconds before a timer's start time and
+#define EPGLIMITAFTER (1 * 3600) // after its stop time within which EPG events will be taken into consideration.
+#define VPSLIMITBEFORE (2 * 3600) // Same for VPS timers, which need to
+#define VPSLIMITAFTER (24 * 3600) // look further into the future to catch shifted broadcasts.
void cTimer::SetEventFromSchedule(const cSchedules *Schedules)
{
@@ -438,14 +448,25 @@ void cTimer::SetEventFromSchedule(const cSchedules *Schedules)
}
const cSchedule *Schedule = Schedules->GetSchedule(Channel());
if (Schedule) {
+ time_t now = time(NULL);
if (!lastSetEvent || Schedule->Modified() >= lastSetEvent) {
const cEvent *Event = NULL;
int Overlap = 0;
int Distance = INT_MIN;
- time_t now = time(NULL);
+ bool UseVps = HasFlags(tfVps);
+ const cEvent *PresentEvent = UseVps ? Schedule->GetPresentEvent() : NULL;
+ const cEvent *FollowingEvent = UseVps ? Schedule->GetFollowingEvent() : NULL;
+ // Set up the time frame within which to check events:
+ Matches(0, true);
+ time_t TimeFrameBegin = StartTime() - (UseVps ? VPSLIMITBEFORE : EPGLIMITBEFORE);
+ time_t TimeFrameEnd = StopTime() + (UseVps ? VPSLIMITAFTER : EPGLIMITAFTER);
for (const cEvent *e = Schedule->Events()->First(); e; e = Schedule->Events()->Next(e)) {
- if (e->EndTime() < now - EPGLIMITPAST)
- continue; // skip old events
+ if (!UseVps || e != event && e != PresentEvent && e != FollowingEvent) { // always check these if this is a VPS timer
+ if (e->EndTime() < TimeFrameBegin)
+ continue; // skip events way before the timer starts
+ if (e->StartTime() > TimeFrameEnd)
+ break; // the rest is way after the timer ends
+ }
int overlap = 0;
Matches(e, &overlap);
if (overlap && overlap >= Overlap) {
@@ -470,20 +491,16 @@ void cTimer::SetEventFromSchedule(const cSchedules *Schedules)
if (Event && Event->EndTime() < now - EXPIRELATENCY && Overlap > FULLMATCH && !Event->IsRunning())
Event = NULL;
SetEvent(Event);
+ lastSetEvent = now;
}
}
- lastSetEvent = time(NULL);
}
void cTimer::SetEvent(const cEvent *Event)
{
if (event != Event) { //XXX TODO check event data, too???
- if (Event) {
- char vpsbuf[64] = "";
- if (Event->Vps())
- sprintf(vpsbuf, "(VPS: %s) ", *Event->GetVpsString());
- isyslog("timer %s set to event %s %s-%s %s'%s'", *ToDescr(), *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString(), vpsbuf, Event->Title());
- }
+ if (Event)
+ isyslog("timer %s set to event %s", *ToDescr(), *Event->ToDescr());
else
isyslog("timer %s set to no event", *ToDescr());
event = Event;
@@ -568,6 +585,7 @@ cTimers::cTimers(void)
state = 0;
beingEdited = 0;;
lastSetEvents = 0;
+ lastDeleteExpired = 0;
}
cTimer *cTimers::GetTimer(cTimer *Timer)
@@ -663,6 +681,8 @@ void cTimers::SetEvents(void)
void cTimers::DeleteExpired(void)
{
+ if (time(NULL) - lastDeleteExpired < 30)
+ return;
cTimer *ti = First();
while (ti) {
cTimer *next = Next(ti);
@@ -673,4 +693,5 @@ void cTimers::DeleteExpired(void)
}
ti = next;
}
+ lastDeleteExpired = time(NULL);
}
diff --git a/timers.h b/timers.h
index f49b48d..da7a5f8 100644
--- a/timers.h
+++ b/timers.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: timers.h 1.26 2006/02/25 15:05:09 kls Exp $
+ * $Id: timers.h 1.27 2006/03/26 10:44:01 kls Exp $
*/
#ifndef __TIMERS_H
@@ -101,6 +101,7 @@ private:
int state;
int beingEdited;
time_t lastSetEvents;
+ time_t lastDeleteExpired;
public:
cTimers(void);
cTimer *GetTimer(cTimer *Timer);
diff --git a/tools.c b/tools.c
index fb88789..18f9537 100644
--- a/tools.c
+++ b/tools.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: tools.c 1.114 2006/02/05 11:05:56 kls Exp $
+ * $Id: tools.c 1.115 2006/03/19 12:28:16 kls Exp $
*/
#include "tools.h"
@@ -829,8 +829,14 @@ char *cReadLine::Read(FILE *f)
int n = getline(&buffer, &size, f);
if (n > 0) {
n--;
- if (buffer[n] == '\n')
+ if (buffer[n] == '\n') {
buffer[n] = 0;
+ if (n > 0) {
+ n--;
+ if (buffer[n] == '\r')
+ buffer[n] = 0;
+ }
+ }
return buffer;
}
return NULL;
diff --git a/vdr.5 b/vdr.5
index e167965..f6fc2fd 100644
--- a/vdr.5
+++ b/vdr.5
@@ -8,9 +8,9 @@
.\" License as specified in the file COPYING that comes with the
.\" vdr distribution.
.\"
-.\" $Id: vdr.5 1.54 2006/02/26 14:10:00 kls Exp $
+.\" $Id: vdr.5 1.55 2006/03/26 13:42:29 kls Exp $
.\"
-.TH vdr 5 "19 Feb 2006" "1.3.43" "Video Disk Recorder Files"
+.TH vdr 5 "26 Mar 2006" "1.3.45" "Video Disk Recorder Files"
.SH NAME
vdr file formats - the Video Disk Recorder Files
.SH DESCRIPTION
@@ -636,7 +636,7 @@ l l.
<start time> @is the time (as a time_t integer) in UTC when this event starts
<duration> @is the time (in seconds) that this event will take
<table id> @is a hex number that indicates the table this event is contained in (if this is left empty or 0 this event will not be overwritten or modified by data that comes from the DVB stream)
-<version> @is a hex number that indicates the event's version number inside its table (optional, only processed for table IDs smaller than 0x50)
+<version> @is a hex number that indicates the event's version number inside its table (optional, ignored when reading EPG data)
<title> @is the title of the event
<short text> @is the short text of the event (typically the name of the episode etc.)
<description> @is the description of the event (any '|' characters will be interpreted as newlines)
diff --git a/vdr.c b/vdr.c
index 5e17a37..7ff749b 100644
--- a/vdr.c
+++ b/vdr.c
@@ -22,7 +22,7 @@
*
* The project's page is at http://www.cadsoft.de/vdr
*
- * $Id: vdr.c 1.249 2006/02/05 12:57:10 kls Exp $
+ * $Id: vdr.c 1.251 2006/03/26 09:16:53 kls Exp $
*/
#include <getopt.h>
@@ -1067,7 +1067,7 @@ int main(int argc, char *argv[])
}
if (UserShutdown && Next && Delta <= Setup.MinEventTimeout * 60 && !ForceShutdown) {
char *buf;
- asprintf(&buf, tr("Recording in %d minutes, shut down anyway?"), Delta / 60);
+ asprintf(&buf, tr("Recording in %ld minutes, shut down anyway?"), Delta / 60);
if (Interface->Confirm(buf))
ForceShutdown = true;
else
@@ -1090,13 +1090,16 @@ int main(int argc, char *argv[])
isyslog("executing '%s'", cmd);
SystemExec(cmd);
free(cmd);
+ LastActivity = time(NULL) - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later
}
- else if (WatchdogTimeout > 0) {
- alarm(WatchdogTimeout);
- if (signal(SIGALRM, Watchdog) == SIG_IGN)
- signal(SIGALRM, SIG_IGN);
- }
- LastActivity = time(NULL) - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later
+ else {
+ LastActivity = Now;
+ if (WatchdogTimeout > 0) {
+ alarm(WatchdogTimeout);
+ if (signal(SIGALRM, Watchdog) == SIG_IGN)
+ signal(SIGALRM, SIG_IGN);
+ }
+ }
UserShutdown = false;
continue; // skip the rest of the housekeeping for now
}