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' (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.
This commit is contained in:
Klaus Schmidinger 2006-03-26 19:00:00 +02:00
parent 9d12ac30f0
commit 49b561fcad
34 changed files with 460 additions and 222 deletions

View File

@ -307,6 +307,8 @@ Werner Fink <werner@suse.de>
for enabling a device to detach all receivers for a given PID 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 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 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> Rolf Hakenes <hakenes@hippomi.de>
for providing 'libdtv' and adapting the EIT mechanisms to it 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 items at the beginning of the menu
for a patch that was used to implement stopping scanning the video directory if for a patch that was used to implement stopping scanning the video directory if
there are too many levels of symbolic links 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> Jeremy Hall <jhall@UU.NET>
for fixing an incomplete initialization of the filter parameters in eit.c 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 exceeds the maximum channel number
for suggesting to also set the language codes when setting the audio track descriptions 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 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> Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark 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 adding a mutex to synchronize cDevice::PlayPesPacket() and SetCurrentAudioTrack()
for a suggestion that lead to implementing cDevice::Transferring() for a suggestion that lead to implementing cDevice::Transferring()
for fixing replaying recordings of radio channels with many audio tracks 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> Richard Robson <richard_robson@beeb.net>
for reporting freezing replay if a timer starts while in Transfer Mode from the 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 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 it won't follow symbolic links, and to canonicalize the file name
for making all font and image data 'const' for making all font and image data 'const'
for fixing format string handling
Sean Carlos <seanc@libero.it> Sean Carlos <seanc@libero.it>
for translating OSD texts to the Italian language 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> Hardy Flor <HFlor@web.de>
for a patch that was used as a base to implement SVDRP commands for plugins for a patch that was used as a base to implement SVDRP commands for plugins
for implementing the SVDRP command PLAY 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> Harald Milz <hm@seneca.muc.de>
for his CUTR patch, which was used as a base to implement the SVDRP command EDIT for his CUTR patch, which was used as a base to implement the SVDRP command EDIT
@ -1767,7 +1777,22 @@ B
Christoph Haubrich <christoph1.haubrich@arcor.de> Christoph Haubrich <christoph1.haubrich@arcor.de>
for making the "Ok" key in the "Jump" mode of the replay progress display confirm for making the "Ok" key in the "Jump" mode of the replay progress display confirm
the jump instead of closing the display 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> Pekka Mauno <pekka.mauno@iki.fi>
for fixing cSchedule::GetFollowingEvent() in case there is currently no present for fixing cSchedule::GetFollowingEvent() in case there is currently no present
event running 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'

43
HISTORY
View File

@ -3838,7 +3838,7 @@ Video Disk Recorder Revision History
- The 'new' indicator in the Recordings menu is now kept up-to-date (thanks to - The 'new' indicator in the Recordings menu is now kept up-to-date (thanks to
Thomas Günther). Thomas Günther).
- Updated the Romanian OSD texts (thanks to Lucian Muresan). - 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 - 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 added or deleted, so that other VDR instances can update their lists (thanks to
Alexander Rieger). Alexander Rieger).
@ -4414,3 +4414,44 @@ Video Disk Recorder Revision History
to be drawn with a transparent background (thanks to Alexander Hans). to be drawn with a transparent background (thanks to Alexander Hans).
- Fixed cSchedule::GetFollowingEvent() in case there is currently no present event - Fixed cSchedule::GetFollowingEvent() in case there is currently no present event
running (thanks to Pekka Mauno). 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.

View File

@ -41,3 +41,7 @@ VDR Plugin 'sky' Revision History
2005-09-17: Version 0.3.4 2005-09-17: Version 0.3.4
- Added a missing include statement. - Added a missing include statement.
2006-03-26: Version 0.3.5
- Fixed format string handling.

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * 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> #include <sys/socket.h>
@ -15,7 +15,7 @@
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include <vdr/sources.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"; static const char *DESCRIPTION = "Sky Digibox interface";
// --- cDigiboxDevice -------------------------------------------------------- // --- cDigiboxDevice --------------------------------------------------------
@ -108,9 +108,8 @@ cDigiboxDevice::~cDigiboxDevice()
void cDigiboxDevice::LircSend(const char *s) void cDigiboxDevice::LircSend(const char *s)
{ {
const char *c = "SEND_ONCE SKY %s\n";
char buf[100]; char buf[100];
sprintf(buf, c, s); snprintf(buf, sizeof(buf), "SEND_ONCE SKY %s\n", s);
dsyslog(buf);//XXX dsyslog(buf);//XXX
if (write(fd_lirc, buf, strlen(buf)) < 0) if (write(fd_lirc, buf, strlen(buf)) < 0)
LOG_ERROR;//XXX _STR LOG_ERROR;//XXX _STR

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "channels.h"
@ -12,6 +12,7 @@
#include <ctype.h> #include <ctype.h>
#include "device.h" #include "device.h"
#include "epg.h" #include "epg.h"
#include "timers.h"
// IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d' // 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 // format characters in order to allow any number of blanks after a numeric
@ -248,6 +249,15 @@ int cChannel::Transponder(void) const
return tf; 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 cChannel::Modification(int Mask)
{ {
int Result = modification & Mask; int Result = modification & Mask;

View File

@ -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 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 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 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 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 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 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 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 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 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 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 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 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 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,1801,1702:13002: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 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 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 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 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 rbb Berlin;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0
:Premiere World :Premiere World
PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1801,1722,1702:8:133:2: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,513=deu;515=deu:32:1801,1722,1702:10: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,1793=deu;1795=deu:32:1801,1722,1702:11: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:1722,1702,1801:43: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:1801,1722,1702:9: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:32:1722,1702,1801:29: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:1801,1722,1702:41: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:1801,1702,1722:20: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:1801,1722,1702:34:133:17:0 DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1:34:133:17:0
:Premiere Direkt :Premiere Direkt
PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0 PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0
:PW Erotic :PW Erotic
BEATE-UHSE.TV,B-UHSE;PREMIERE:11758:hC34:S19.2E:27500:1791:1792=deu:32:1722,1702,1801:21:133:17:0 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 :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 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 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 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 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 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 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 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 ParaComedy 2;BSkyB:11914:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:4504:2:2011:0

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __CHANNELS_H
@ -202,6 +202,7 @@ public:
bool IsSat(void) const { return cSource::IsSat(source); } bool IsSat(void) const { return cSource::IsSat(source); }
bool IsTerr(void) const { return cSource::IsTerr(source); } bool IsTerr(void) const { return cSource::IsTerr(source); }
tChannelID GetChannelID(void) const { return tChannelID(source, nid, (nid || tid) ? tid : Transponder(), sid, rid); } tChannelID GetChannelID(void) const { return tChannelID(source, nid, (nid || tid) ? tid : Transponder(), sid, rid); }
bool HasTimer(void) const;
int Modification(int Mask = CHANNELMOD_ALL); int Modification(int Mask = CHANNELMOD_ALL);
void CopyTransponderData(const cChannel *Channel); void CopyTransponderData(const cChannel *Channel);
bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH); bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __CONFIG_H
@ -19,8 +19,8 @@
#include "i18n.h" #include "i18n.h"
#include "tools.h" #include "tools.h"
#define VDRVERSION "1.3.44" #define VDRVERSION "1.3.45"
#define VDRVERSNUM 10344 // Version * 10000 + Major * 100 + Minor #define VDRVERSNUM 10345 // Version * 10000 + Major * 100 + Minor
#define MAXPRIORITY 99 #define MAXPRIORITY 99
#define MAXLIFETIME 99 #define MAXLIFETIME 99

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "device.h"
@ -697,6 +697,15 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
return Result; 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) bool cDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{ {
return false; return false;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __DEVICE_H
@ -236,6 +236,8 @@ protected:
public: public:
static int CurrentChannel(void) { return primaryDevice ? currentChannel : 0; } static int CurrentChannel(void) { return primaryDevice ? currentChannel : 0; }
///< Returns the number of the current channel on the primary device. ///< 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 virtual bool HasLock(int TimeoutMs = 0);//XXX PLUGINS.html
///< Returns true if the device has a lock on the requested transponder. ///< Returns true if the device has a lock on the requested transponder.
///< Default is true, a specific device implementation may return false ///< Default is true, a specific device implementation may return false

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "dvbdevice.h"
@ -653,6 +653,8 @@ eVideoSystem cDvbDevice::GetVideoSystem(void)
bool cDvbDevice::SetAudioBypass(bool On) bool cDvbDevice::SetAudioBypass(bool On)
{ {
if (!setTransferModeForDolbyDigital)
return false;
return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0; return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0;
} }
@ -928,9 +930,7 @@ void cDvbDevice::SetAudioTrackDevice(eTrackType Type)
if (!setTransferModeForDolbyDigital) if (!setTransferModeForDolbyDigital)
return; return;
// Currently this works only in Transfer Mode // Currently this works only in Transfer Mode
cChannel *Channel = Channels.GetByNumber(CurrentChannel()); ForceTransferMode();
if (Channel)
SetChannelDevice(Channel, false); // this implicitly starts Transfer Mode
} }
} }
} }

35
epg.c
View File

@ -7,14 +7,14 @@
* Original version (as used in VDR before 1.3.0) written by * Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * 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 "epg.h"
#include "libsi/si.h"
#include "timers.h"
#include <ctype.h> #include <ctype.h>
#include <time.h> #include <time.h>
#include "libsi/si.h"
#include "timers.h"
#define RUNNINGSTATUSTIMEOUT 30 // seconds before the running status is considered unknown #define RUNNINGSTATUSTIMEOUT 30 // seconds before the running status is considered unknown
@ -103,7 +103,7 @@ cEvent::cEvent(tEventID EventID)
eventID = EventID; eventID = EventID;
tableID = 0; tableID = 0;
version = 0xFF; // actual version numbers are 0..31 version = 0xFF; // actual version numbers are 0..31
runningStatus = 0; runningStatus = SI::RunningStatusUndefined;
title = NULL; title = NULL;
shortText = NULL; shortText = NULL;
description = NULL; description = NULL;
@ -156,9 +156,8 @@ void cEvent::SetVersion(uchar Version)
void cEvent::SetRunningStatus(int RunningStatus, cChannel *Channel) void cEvent::SetRunningStatus(int RunningStatus, cChannel *Channel)
{ {
if (Channel && runningStatus != RunningStatus && (RunningStatus > SI::RunningStatusNotRunning || runningStatus > SI::RunningStatusUndefined)) if (Channel && runningStatus != RunningStatus && (RunningStatus > SI::RunningStatusNotRunning || runningStatus > SI::RunningStatusUndefined) && Channel->HasTimer())
if (Channel->Number() <= 30)//XXX maybe log only those that have timers??? isyslog("channel %d (%s) event %s status %d", Channel->Number(), Channel->Name(), *ToDescr(), RunningStatus);
isyslog("channel %d (%s) event %s '%s' status %d", Channel->Number(), Channel->Name(), *GetTimeString(), Title(), RunningStatus);
runningStatus = RunningStatus; runningStatus = RunningStatus;
} }
@ -209,6 +208,14 @@ void cEvent::SetSeen(void)
seen = time(NULL); 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 bool cEvent::HasTimer(void) const
{ {
for (cTimer *t = Timers.First(); t; t = Timers.Next(t)) { for (cTimer *t = Timers.First(); t; t = Timers.Next(t)) {
@ -313,7 +320,7 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
time_t StartTime; time_t StartTime;
int Duration; int Duration;
unsigned int TableID = 0; 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); int n = sscanf(t, "%u %ld %d %X %X", &EventID, &StartTime, &Duration, &TableID, &Version);
if (n >= 3 && n <= 5) { if (n >= 3 && n <= 5) {
Event = (cEvent *)Schedule->GetEvent(EventID, StartTime); Event = (cEvent *)Schedule->GetEvent(EventID, StartTime);
@ -324,8 +331,6 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
Event = newEvent = new cEvent(EventID); Event = newEvent = new cEvent(EventID);
if (Event) { if (Event) {
Event->SetTableID(TableID); 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->SetStartTime(StartTime);
Event->SetDuration(Duration); Event->SetDuration(Duration);
if (newEvent) if (newEvent)
@ -678,8 +683,10 @@ const cEvent *cSchedule::GetPresentEvent(void) const
const cEvent *pe = NULL; const cEvent *pe = NULL;
time_t now = time(NULL); time_t now = time(NULL);
for (cEvent *p = events.First(); p; p = events.Next(p)) { for (cEvent *p = events.First(); p; p = events.Next(p)) {
if (p->StartTime() <= now && now < p->EndTime()) if (p->StartTime() <= now)
pe = p; pe = p;
else if (p->StartTime() > now + 3600)
break;
if (p->SeenWithin(RUNNINGSTATUSTIMEOUT) && p->RunningStatus() >= SI::RunningStatusPausing) if (p->SeenWithin(RUNNINGSTATUSTIMEOUT) && p->RunningStatus() >= SI::RunningStatusPausing)
return p; return p;
} }
@ -728,9 +735,11 @@ const cEvent *cSchedule::GetEventAround(time_t Time) const
void cSchedule::SetRunningStatus(cEvent *Event, int RunningStatus, cChannel *Channel) void cSchedule::SetRunningStatus(cEvent *Event, int RunningStatus, cChannel *Channel)
{ {
for (cEvent *p = events.First(); p; p = events.Next(p)) { for (cEvent *p = events.First(); p; p = events.Next(p)) {
if (p == Event) if (p == Event) {
if (p->RunningStatus() > SI::RunningStatusNotRunning || RunningStatus > SI::RunningStatusNotRunning)
p->SetRunningStatus(RunningStatus, Channel); p->SetRunningStatus(RunningStatus, Channel);
else if (RunningStatus >= SI::RunningStatusPausing && p->RunningStatus() > SI::RunningStatusNotRunning) }
else if (RunningStatus >= SI::RunningStatusPausing && p->StartTime() < Event->StartTime())
p->SetRunningStatus(SI::RunningStatusNotRunning); p->SetRunningStatus(SI::RunningStatusNotRunning);
} }
if (RunningStatus >= SI::RunningStatusPausing) if (RunningStatus >= SI::RunningStatusPausing)

3
epg.h
View File

@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by * Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * 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 #ifndef __EPG_H
@ -103,6 +103,7 @@ public:
void SetDuration(int Duration); void SetDuration(int Duration);
void SetVps(time_t Vps); void SetVps(time_t Vps);
void SetSeen(void); void SetSeen(void);
cString ToDescr(void) const;
void Dump(FILE *f, const char *Prefix = "", bool InfoOnly = false) const; void Dump(FILE *f, const char *Prefix = "", bool InfoOnly = false) const;
bool Parse(char *s); bool Parse(char *s);
static bool Read(FILE *f, cSchedule *Schedule); static bool Read(FILE *f, cSchedule *Schedule);

78
i18n.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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: * Translations provided by:
* *
@ -22,7 +22,7 @@
* Romanian Paul Lacatus <paul@campina.iiruc.ro>, Lucian Muresan <lucianm@users.sourceforge.net> * 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> * 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> * 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> * Croatian Drazen Dupor <drazen.dupor@dupor.com>, Dino Ravnic <dino.ravnic@fer.hr>
* Estonian Arthur Konovalov <kasjas@hot.ee> * Estonian Arthur Konovalov <kasjas@hot.ee>
* Danish Mogens Elneff <mogens@elneff.dk> * Danish Mogens Elneff <mogens@elneff.dk>
@ -475,7 +475,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "ÍâÐ ßÕàÕÔÐçÐ - %s",
"",//TODO "",//TODO
"See sündmus - %s", "See sündmus - %s",
"Denne udsendelse - %s", "Denne udsendelse - %s",
@ -497,7 +497,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "ÍâÐ ßÕàÕÔÐçÐ - ÒáÕ ÚÐÝÐÛë",
"",//TODO "",//TODO
"See sündmus - kõik kanalid", "See sündmus - kõik kanalid",
"Denne udsendelse - alle kanaler", "Denne udsendelse - alle kanaler",
@ -519,7 +519,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "²áÕ ßÕàÕÔÐçØ - ÒáÕ ÚÐÝÐÛë",
"",//TODO "",//TODO
"Kõik sündmused - kõik kanalid", "Kõik sündmused - kõik kanalid",
"Alle udsendelser - alle kanaler", "Alle udsendelser - alle kanaler",
@ -696,7 +696,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÂÐÙÜÕà",
"",// TODO "",// TODO
"Taimer", "Taimer",
"Timer", "Timer",
@ -1319,27 +1319,27 @@ const tI18nPhrase Phrases[] = {
"Optagelse igang - sluk alligevel?", "Optagelse igang - sluk alligevel?",
"Systém je zaneprázdnìn - pøesto vypnout?", "Systém je zaneprázdnìn - pøesto vypnout?",
}, },
{ "Recording in %d minutes, shut down anyway?", { "Recording in %ld minutes, shut down anyway?",
"Aufnahme in %d Minuten - trotzdem ausschalten?", "Aufnahme in %ld Minuten - trotzdem ausschalten?",
"Snemanje èez %d minut, zares izklopi?", "Snemanje èez %ld minut, zares izklopi?",
"Registrazione fra %d minuti - spengo comunque?", "Registrazione fra %ld minuti - spengo comunque?",
"Opname in %d minuten - toch uitschakelen?", "Opname in %ld minuten - toch uitschakelen?",
"Em gravação dentro de %d minutos - quer mesmo desligar?", "Em gravação dentro de %ld minutos - quer mesmo desligar?",
"Enregistrement dans %d minutes - confirmez l'arrêt", "Enregistrement dans %ld minutes - confirmez l'arrêt",
"Skal gjøre opptak om %d minutter - slå av likevel?", "Skal gjøre opptak om %ld minutter - slå av likevel?",
"Tallennus alkaa %d min kuluttua - sammutetaanko?", "Tallennus alkaa %ld min kuluttua - sammutetaanko?",
"Nagrywanie za %d minut - wy³±czyæ mimo to?", "Nagrywanie za %ld minut - wy³±czyæ mimo to?",
"Grabación dentro de %d minutos, ¿apagar realmente?", "Grabación dentro de %ld minutos, ¿apagar realmente?",
"ÁíáìÝíåôáé åããñáöÞ óÝ %d ëåðôÜ - ÔåëéêÜ íá ôåñìáôéóôåß?", "ÁíáìÝíåôáé åããñáöÞ óÝ %ld ëåðôÜ - ÔåëéêÜ íá ôåñìáôéóôåß?",
"Inspelning startar om %d minuter, vill du avsluta?", "Inspelning startar om %ld minuter, vill du avsluta?",
"Înregistrez peste %d minute - închid, totuºi?", "Înregistrez peste %ld minute - închid, totuºi?",
"Felvétel %d perc mulva kezdödik - mégis kikapcsolni?", "Felvétel %ld perc mulva kezdödik - mégis kikapcsolni?",
"Hi ha una gravació en %d minuts - Apagar de totes maneres?", "Hi ha una gravació en %ld minuts - Apagar de totes maneres?",
"ÇÕàÕ× %d ÜØÝãâ ÝÐçÝñâáï ×ÐßØáì - ÔÕÙáâÒØâÕÛìÝÞ ÒëÚÛîçØâì?", "ÇÕàÕ× %ld ÜØÝãâ ÝÐçÝñâáï ×ÐßØáì - ÔÕÙáâÒØâÕÛìÝÞ ÒëÚÛîçØâì?",
"Snimanje za %d minuta - svejedno iskljuèiti?", "Snimanje za %ld minuta - svejedno iskljuèiti?",
"Salvestamine algab %d minuti pärast - lülitan välja?", "Salvestamine algab %ld minuti pärast - lülitan välja?",
"Optagelse om %d minutter - sluk alligevel?", "Optagelse om %ld minutter - sluk alligevel?",
"Nahrávání zaène za %d minut - pøesto vypnout?", "Nahrávání zaène za %ld minut - pøesto vypnout?",
}, },
{ "Press any key to cancel shutdown", { "Press any key to cancel shutdown",
"Taste drücken, um Shutdown abzubrechen", "Taste drücken, um Shutdown abzubrechen",
@ -1666,7 +1666,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "FTA (ÝÕ×ÐÚÞÔØàÞÒÐÝÞ)",
"",//TODO "",//TODO
"FTA", "FTA",
"Free To Air", "Free To Air",
@ -1688,7 +1688,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "×ÐÚÞÔØàÞÒÐÝÞ",
"",//TODO "",//TODO
"krüptitud", "krüptitud",
"kodet", "kodet",
@ -2460,7 +2460,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "½ÕÔÞáâÐâÞçÝÞ ÜÕáâÐ ÝÐ ÔØáÚÕ ÔÛï ÝÐçÐÛÐ ×ÐßØáØ",
"",//TODO "",//TODO
"Ebapiisavalt kettaruumi salvestamise alustamiseks!", "Ebapiisavalt kettaruumi salvestamise alustamiseks!",
"For lidt harddisk plads til optagelse!", "For lidt harddisk plads til optagelse!",
@ -2504,7 +2504,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "¾âÚàëÒÐî ÜÕÝî ÜÞÔãÛï ãáÛÞÒÝÞÓÞ ÔÞáâãßÐ (CAM)",
"",//TODO "",//TODO
"CAM-menüü avamine...", "CAM-menüü avamine...",
"Åbner CAM menu...", "Åbner CAM menu...",
@ -2548,7 +2548,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "¿ÕàÕÓàã×ÚÐ CAM...",
"",//TODO "",//TODO
"CAM mooduli taaskäivitus...", "CAM mooduli taaskäivitus...",
"Nulstiller CAM...", "Nulstiller CAM...",
@ -2614,7 +2614,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "½ÐÖÜØâÕ %d æØäàë",
"",//TODO "",//TODO
"Palun sisesta %d numbrit!", "Palun sisesta %d numbrit!",
"Indtast venligst %d cifre!", "Indtast venligst %d cifre!",
@ -3232,7 +3232,7 @@ const tI18nPhrase Phrases[] = {
"", // TODO "", // TODO
"", // TODO "", // TODO
"", // TODO "", // TODO
"", // TODO "¸ÝäÞàÜÐæØî Þ ÚÐÝÐÛÕ ×ÐÚàëâì",
"", // TODO "", // TODO
"Kanaliinfo kuvamise ajapiirang", "Kanaliinfo kuvamise ajapiirang",
"Timeout ved anmodet kanal info", "Timeout ved anmodet kanal info",
@ -3298,7 +3298,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ºÝÞßÚã ¼ÕÝî ×ÐÚàëâì",
"",// TODO "",// TODO
"Sulgemine Menüü klahviga", "Sulgemine Menüü klahviga",
"Menu taste lukker", "Menu taste lukker",
@ -4399,7 +4399,7 @@ const tI18nPhrase Phrases[] = {
"LMMJVSD", "LMMJVSD",
"HKSCPSV", "HKSCPSV",
"LMCJVSG", "LMCJVSG",
"¿²ÁÇ¿²Á", "¿²ÁÇ¿Á²",
"PUSÈPSN", // hrv "PUSÈPSN", // hrv
"ETKNRLP", "ETKNRLP",
"MTOTFLS", "MTOTFLS",
@ -5151,7 +5151,7 @@ const tI18nPhrase Phrases[] = {
"Derulare înainte", "Derulare înainte",
"Elöre pörgetni", "Elöre pörgetni",
"Endavant ràpidament", "Endavant ràpidament",
"²ßÕàñÔ", "¿àÞÚàãâÚÐ ÒßÕàñÔ",
"Naprijed", "Naprijed",
"Edasikerimine", "Edasikerimine",
"Spol fremad", "Spol fremad",
@ -5173,7 +5173,7 @@ const tI18nPhrase Phrases[] = {
"Derulare înapoi", "Derulare înapoi",
"Vissza pörgetni", "Vissza pörgetni",
"Enrera ràpidament", "Enrera ràpidament",
"½Ð×ÐÔ", "¿àÞÚàãâÚÐ ÝÐ×ÐÔ",
"Nazad", "Nazad",
"Tagasikerimine", "Tagasikerimine",
"Spol tilbage", "Spol tilbage",
@ -5768,7 +5768,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "·ÐßØáì ÝÐçÐâÐ",
"",//TODO "",//TODO
"Salvestamine algas", "Salvestamine algas",
"Optagelse startet", "Optagelse startet",

4
i18n.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __I18N_H
@ -18,7 +18,7 @@ typedef const char *tI18nPhrase[I18nNumLanguages];
void I18nRegister(const tI18nPhrase * const Phrases, const char *Plugin); 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 * I18nLanguages(void);
const char * const * I18nCharSets(void); const char * const * I18nCharSets(void);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "interface.h"
@ -52,7 +52,7 @@ eKeys cInterface::Wait(int Seconds, bool KeepChar)
if (ISRAWKEY(Key) || time(NULL) > timeout || interrupted) if (ISRAWKEY(Key) || time(NULL) > timeout || interrupted)
break; break;
} }
if (KeepChar && ISRAWKEY(Key)) if (KeepChar && ISRAWKEY(Key) || Key == k_Plugin)
cRemote::Put(Key); cRemote::Put(Key);
interrupted = false; interrupted = false;
return Key; return Key;

14
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "menu.h"
@ -500,12 +500,10 @@ eOSState cMenuChannels::Delete(void)
cChannel *channel = GetChannel(Current()); cChannel *channel = GetChannel(Current());
int DeletedChannel = channel->Number(); int DeletedChannel = channel->Number();
// Check if there is a timer using this channel: // Check if there is a timer using this channel:
for (cTimer *ti = Timers.First(); ti; ti = Timers.Next(ti)) { if (channel->HasTimer()) {
if (ti->Channel() == channel) {
Skins.Message(mtError, tr("Channel is being used by a timer!")); Skins.Message(mtError, tr("Channel is being used by a timer!"));
return osContinue; return osContinue;
} }
}
if (Interface->Confirm(tr("Delete channel?"))) { if (Interface->Confirm(tr("Delete channel?"))) {
Channels.Del(channel); Channels.Del(channel);
cOsdMenu::Del(Index); cOsdMenu::Del(Index);
@ -690,8 +688,8 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key)
*timer = data; *timer = data;
if (addIfConfirmed) if (addIfConfirmed)
Timers.Add(timer); Timers.Add(timer);
timer->Matches();
timer->SetEventFromSchedule(); timer->SetEventFromSchedule();
timer->Matches();
Timers.SetModified(); Timers.SetModified();
isyslog("timer %s %s (%s)", *timer->ToDescr(), addIfConfirmed ? "added" : "modified", timer->HasFlags(tfActive) ? "active" : "inactive"); isyslog("timer %s %s (%s)", *timer->ToDescr(), addIfConfirmed ? "added" : "modified", timer->HasFlags(tfActive) ? "active" : "inactive");
addIfConfirmed = false; addIfConfirmed = false;
@ -787,8 +785,10 @@ cMenuTimers::cMenuTimers(void)
:cOsdMenu(tr("Timers"), 2, CHNUMWIDTH, 10, 6, 6) :cOsdMenu(tr("Timers"), 2, CHNUMWIDTH, 10, 6, 6)
{ {
helpKeys = -1; 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)); Add(new cMenuTimerItem(timer));
}
Sort(); Sort();
SetCurrent(First()); SetCurrent(First());
SetHelpKeys(); SetHelpKeys();
@ -900,7 +900,7 @@ eOSState cMenuTimers::ProcessKey(eKeys Key)
case kOk: return Edit(); case kOk: return Edit();
case kRed: state = OnOff(); break; // must go through SetHelpKeys()! case kRed: state = OnOff(); break; // must go through SetHelpKeys()!
case kGreen: return New(); case kGreen: return New();
case kYellow: return Delete(); case kYellow: state = Delete(); break;
case kBlue: return Info(); case kBlue: return Info();
break; break;
default: break; default: break;

5
menu.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __MENU_H
@ -165,13 +165,14 @@ private:
int helpKeys; int helpKeys;
void SetHelpKeys(void); void SetHelpKeys(void);
void Set(bool Refresh = false); void Set(bool Refresh = false);
cRecording *GetRecording(cMenuRecordingItem *Item);
bool Open(bool OpenSubMenus = false); bool Open(bool OpenSubMenus = false);
eOSState Play(void); eOSState Play(void);
eOSState Rewind(void); eOSState Rewind(void);
eOSState Delete(void); eOSState Delete(void);
eOSState Info(void); eOSState Info(void);
eOSState Commands(eKeys Key = kNone); eOSState Commands(eKeys Key = kNone);
protected:
cRecording *GetRecording(cMenuRecordingItem *Item);
public: public:
cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false); cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false);
~cMenuRecordings(); ~cMenuRecordings();

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "menuitems.h"
@ -51,6 +51,10 @@ cMenuEditIntItem::cMenuEditIntItem(const char *Name, int *Value, int Min, int Ma
value = Value; value = Value;
min = Min; min = Min;
max = Max; max = Max;
if (*value < min)
*value = min;
else if (*value > max)
*value = max;
Set(); Set();
} }
@ -286,12 +290,11 @@ void cMenuEditStrItem::AdvancePos(void)
void cMenuEditStrItem::Set(void) void cMenuEditStrItem::Set(void)
{ {
char buf[1000]; char buf[1000];
const char *fmt = insert && newchar ? "[]%c%s" : "[%c]%s";
if (InEditMode()) { if (InEditMode()) {
const cFont *font = cFont::GetFont(fontOsd); const cFont *font = cFont::GetFont(fontOsd);
strncpy(buf, value, pos); 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(); int width = cSkinDisplay::Current()->EditableWidth();
if (font->Width(buf) <= width) { if (font->Width(buf) <= width) {
// the whole buffer fits on the screen // the whole buffer fits on the screen

4
pat.h
View File

@ -4,14 +4,14 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __PAT_H
#define __PAT_H #define __PAT_H
#include "filter.h"
#include <stdint.h> #include <stdint.h>
#include "filter.h"
#define MAXPMTENTRIES 64 #define MAXPMTENTRIES 64

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "plugin.h"
@ -427,10 +427,6 @@ void cPluginManager::StopPlugins(void)
void cPluginManager::Shutdown(void) void cPluginManager::Shutdown(void)
{ {
cDll *dll; cDll *dll;
while ((dll = dlls.Last()) != NULL) { while ((dll = dlls.Last()) != NULL)
cPlugin *p = dll->Plugin();
if (p)
isyslog("deleting plugin: %s", p->Name());
dlls.Del(dll); dlls.Del(dll);
}
} }

View File

@ -4,12 +4,12 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include "receiver.h"
#include "tools.h" #include "tools.h"
cReceiver::cReceiver(int Ca, int Priority, int Pid, const int *Pids1, const int *Pids2, const int *Pids3) cReceiver::cReceiver(int Ca, int Priority, int Pid, const int *Pids1, const int *Pids2, const int *Pids3)

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "recording.h"
@ -83,6 +83,7 @@ void cRemoveDeletedRecordingsThread::Action(void)
// Make sure only one instance of VDR does this: // Make sure only one instance of VDR does this:
cLockFile LockFile(VideoDirectory); cLockFile LockFile(VideoDirectory);
if (LockFile.Lock()) { if (LockFile.Lock()) {
bool deleted = false;
cThreadLock DeletedRecordingsLock(&DeletedRecordings); cThreadLock DeletedRecordingsLock(&DeletedRecordings);
for (cRecording *r = DeletedRecordings.First(); r; ) { for (cRecording *r = DeletedRecordings.First(); r; ) {
if (r->deleted && time(NULL) - r->deleted > DELETEDLIFETIME) { if (r->deleted && time(NULL) - r->deleted > DELETEDLIFETIME) {
@ -90,11 +91,13 @@ void cRemoveDeletedRecordingsThread::Action(void)
r->Remove(); r->Remove();
DeletedRecordings.Del(r); DeletedRecordings.Del(r);
r = next; r = next;
RemoveEmptyVideoDirectories(); deleted = true;
continue; continue;
} }
r = DeletedRecordings.Next(r); r = DeletedRecordings.Next(r);
} }
if (deleted)
RemoveEmptyVideoDirectories();
} }
} }
@ -801,11 +804,16 @@ bool cRecording::Delete(void)
strncpy(ext, DELEXT, strlen(ext)); strncpy(ext, DELEXT, strlen(ext));
if (access(NewName, F_OK) == 0) { if (access(NewName, F_OK) == 0) {
// the new name already exists, so let's remove that one first: // the new name already exists, so let's remove that one first:
isyslog("removing recording %s", NewName); isyslog("removing recording '%s'", NewName);
RemoveVideoFile(NewName); RemoveVideoFile(NewName);
} }
isyslog("deleting recording %s", FileName()); isyslog("deleting recording '%s'", FileName());
if (access(FileName(), F_OK) == 0)
result = RenameVideoFile(FileName(), NewName); result = RenameVideoFile(FileName(), NewName);
else {
isyslog("recording '%s' vanished", FileName());
result = true; // well, we were going to delete it, anyway
}
} }
free(NewName); free(NewName);
return result; return result;
@ -1049,7 +1057,7 @@ bool cMark::Parse(const char *s)
bool cMark::Save(FILE *f) bool cMark::Save(FILE *f)
{ {
return fprintf(f, ToText()) > 0; return fprintf(f, "%s", *ToText()) > 0;
} }
// --- cMarks ---------------------------------------------------------------- // --- cMarks ----------------------------------------------------------------

38
remux.c
View File

@ -11,7 +11,7 @@
* The cRepacker family's code was originally written by Reinhard Nissl <rnissl@gmx.de>, * 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. * 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" #include "remux.h"
@ -1429,7 +1429,9 @@ int cDolbyRepacker::BreakAt(const uchar *Data, int Count)
#define IPACKS 2048 #define IPACKS 2048
// Start codes: // 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 MAXNONUSEFULDATA (10*1024*1024)
#define MAXNUMUPTERRORS 10 #define MAXNUMUPTERRORS 10
@ -1925,13 +1927,37 @@ int cRemux::ScanVideoPacket(const uchar *Data, int Count, int Offset, uchar &Pic
if (Length > 0) { if (Length > 0) {
int PesPayloadOffset = 0; int PesPayloadOffset = 0;
if (AnalyzePesHeader(Data + Offset, Length, PesPayloadOffset) >= phMPEG1) { if (AnalyzePesHeader(Data + Offset, Length, PesPayloadOffset) >= phMPEG1) {
for (int i = Offset + PesPayloadOffset; i < Offset + Length - 5; i++) { const uchar *p = Data + Offset + PesPayloadOffset + 2;
if (Data[i] == 0 && Data[i + 1] == 0 && Data[i + 2] == 1) { const uchar *pLimit = Data + Offset + Length - 3;
switch (Data[i + 3]) { #ifdef TEST_cVideoRepacker
case SC_PICTURE: PictureType = (Data[i + 5] >> 3) & 0x07; // 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; return Length;
} }
p += 4; // continue scanning after 0x01ssxxyy
} }
else
p += 3; // continue scanning after 0x01xxyy
} }
} }
PictureType = NO_PICTURE; PictureType = NO_PICTURE;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __REMUX_H
@ -46,8 +46,6 @@ private:
cRingBufferLinear *resultBuffer; cRingBufferLinear *resultBuffer;
int resultSkipped; int resultSkipped;
int GetPid(const uchar *Data); 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: public:
cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure = false); 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 ///< 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 ///< Clears the remuxer of all data it might still contain, keeping the PID
///< settings as they are. ///< settings as they are.
static void SetBrokenLink(uchar *Data, int Length); 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 #endif // __REMUX_H

View File

@ -17,98 +17,169 @@
# Satellites # Satellites
# Europe
S5E Sirius 2/3 S5E Sirius 2/3
S7E Eutelsat W3 S7E Eutelsat W3A
S10E Eutelsat W1R S10E Eutelsat W1
S13E Hotbird 1-(5)-6 S13E Hotbird 1-(5)-6
S16E Eutelsat W2 S16E Eutelsat W2
S19.2E Astra 1B/C/E/F/G/H/2C S19.2E Astra 1B/C/E/F/G/H/2C
S21.5E Eutelsat II F3 S21.0E Afristar 1
S23.5E Astra 3A S21.6E Eutelsat W6
S24.2E Astra 1D S23.5E Astra 1D 3A
S26E Arabsat 2A/3A S26E Arabsat 2D/2C/3A
S28.2E Astra 2D/A/B S28.2E Astra 2D/A/B
S28.5E Eurobird S28.5E Eurobird 1 & Astra 2A/B/D
S30.5E Arabsat 2B S30.5E Arabsat 2B
S31.3E Türksat 1B S33E Eurobird 3 & Intelsat 802
S36E Eutelsat W4 & Sesat S36E Eutelsat W4 & Sesat
S39E Hellas Sat S38E Paksat 1
S40E Express A1R S39E Hellas Sat 2
S42E Turksat 1C & EurAsiaSat 1 & NewSat 1 S40E Express AM1
S45E Europe*Star 1 S42E Turksat 1C/2A
S47E Telecom 2B S45E PAS 12
S48E Eutelsat II F1 S49E Yamal 202
S50E Anatolia 1 S53E Express AM 22
S53E Gorizont 32 S55E Insat 3E & Intelsat 702
S55.1E Insat 2DT S56E Bonum 1
S56E Most 1
S57E NSS 703 S57E NSS 703
S60E Intelsat 904 S60E Intelsat 904
S62E Intelsat 902 S62E Intelsat 902
S64E Intelsat 906 S64E Intelsat 906
S66E Intelsat 704 S66E Intelsat 704
S68.5E PAS 7/10 S68.5E PAS 7/10
S70.5E Eutelsat W5
S72E PAS 4 S72E PAS 4
S74E Insat 3C
# Asia
S74E Insat 3C & Edusat
S75E LMI 1 S75E LMI 1
S76.5E Apstar S76.5E Telstar 10
S78.5E Thaicom 2/3 S78.5E Thaicom 2/3
S80E Express 6A S80E Express AM2
S83E Insat 2E/3B 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 S100.5E Asiasat 2
S103E Express A2
S105.5E Asiasat 3S 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 S152E Optus B3
S154E JCSAT 2A
S156E Optus C1 S156E Optus C1
S158E Superbird A
S160E Optus B1 S160E Optus B1
S162E Superbird B2
S164E Optus A3
S166E PAS 8 S166E PAS 8
S169E PAS 2 S169E PAS 2
S172E AMC 23
S180E Intelsat 701 S180E Intelsat 701
S177W NSS 5
S1W Thor 2/3 & Intelsat 707 # Atlantic
S4W Amos 1
S5W Telecom 2C & Atlantic Bird 3 S1W Thor 2/3 & Intelsat 10-02
S4W Amos 1/2
S5W Atlantic Bird 3
S7W Nilesat 101 & 102 S7W Nilesat 101 & 102
S8W Telecom 2A/2D & Atlantic Bird 2 S8W Telecom 2D & Atlantic Bird 2
S11W Express 3A S11W Express A3
S12.5W Eutelsat II F2 S12.5W Atlantic Bird 2
S14W Gorizont 26 S14W Express A4
S15W Telstar 12 S15W Telstar 12
S18W Intelsat 901 S18W Intelsat 901
S21.5W NSS 7 S20W Intelsat 603
S27.5W Intelsat 605 S22W NSS 7
S30W Hispasat 1 S24.5W Intelsat 905
S27.5W Intelsat 907
S30W Hispasat 1C/1D
S31.5W Intelsat 801 S31.5W Intelsat 801
S34.5W Intelsat 903 S34.5W Intelsat 903
S37.5W Telstar 11 S37.5W Telstar 11 & AMC 12
S40.5W NSS 806 S40.5W NSS 806
S43W PAS 3R/6/6B S43W PAS 3R/6B
S45W PAS 1/5R S45W PAS 1R
S47W TDRS 6 S50W Intelsat 705
S53W Intelsat 706 S53W Intelsat 707
S55.5W Intelsat 805 S55.5W Intelsat 805
S58W PAS 9 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 S79W AMC5
S79.5W Nimiq 3
S82W Nimiq 2 S82W Nimiq 2
S85W AMC2 S83W AMC 9
S84W Brasilsat B3
S85W AMC 2
S85.1W XM 3
S87W AMC3 S87W AMC3
S89W Intelsat 808 S89W Intelsat Americas 8
S91W Galaxy 11 & Nimiq 1/3 S91W Galaxy 11 & Nimiq 1
S93W Intelsat 806 S91.5W DirecTV 2
S92W Brasilsat B4
S93W Intelsat Americas 6
S95W Galaxy 3C S95W Galaxy 3C
S97W Telestar 5 S97W Intelsat Americas 5
S99W Galaxy 4R S99W Galaxy 4R
S101W AMC4 S99.2W Spaceway 2
S101W DirecTV 1R/4S/8 & AMC4
S103W AMC1 S103W AMC1
S105W AMC15 S105W AMC15
S110W Echostar 6/8 S107.3W Anik F1/F1R
S119W Echostar 7 S110W DirecTV 5 & Echostar 6/8
S121W Echostar 9 & Intelsat 813 A111.1W Anik F2
S113W Solidaridad 2
S119W Echostar 7 & DirecTV 7S
S121W Echostar 9 & Intelsat Americas 13
S123W Galaxy 10R 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 S148W Echostar 1/2
S157W Echostar 4
# Cable # Cable

4
spu.c
View File

@ -6,11 +6,11 @@
* This code is distributed under the terms and conditions of the * This code is distributed under the terms and conditions of the
* GNU GENERAL PUBLIC LICENSE. See the file COPYING for details. * 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 "spu.h"
#include <inttypes.h>
// -- cSpuDecoder ---------------- // -- cSpuDecoder ----------------
/* /*

16
svdrp.c
View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured * and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection. * 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" #include "svdrp.h"
@ -461,7 +461,7 @@ void cSVDRP::PrintHelpTopics(const char **hp)
q += sprintf(q, "%*s", -MAXHELPTOPIC, topic); q += sprintf(q, "%*s", -MAXHELPTOPIC, topic);
} }
x = 0; x = 0;
Reply(-214, buffer); Reply(-214, "%s", buffer);
} }
} }
@ -782,7 +782,7 @@ void cSVDRP::CmdGRAB(const char *Option)
cBase64Encoder Base64(Image, ImageSize); cBase64Encoder Base64(Image, ImageSize);
const char *s; const char *s;
while ((s = Base64.NextLine()) != NULL) while ((s = Base64.NextLine()) != NULL)
Reply(-216, s); Reply(-216, "%s", s);
Reply(216, "Grabbed image %s", Option); Reply(216, "Grabbed image %s", Option);
} }
free(Image); free(Image);
@ -799,7 +799,7 @@ void cSVDRP::CmdHELP(const char *Option)
if (*Option) { if (*Option) {
const char *hp = GetHelpPage(Option, HelpPages); const char *hp = GetHelpPage(Option, HelpPages);
if (hp) if (hp)
Reply(214, hp); Reply(214, "%s", hp);
else { else {
Reply(504, "HELP topic \"%s\" unknown", Option); Reply(504, "HELP topic \"%s\" unknown", Option);
return; return;
@ -1332,7 +1332,7 @@ void cSVDRP::CmdPLUG(const char *Option)
if (*cmd && *option) { if (*cmd && *option) {
const char *hp = GetHelpPage(option, plugin->SVDRPHelpPages()); const char *hp = GetHelpPage(option, plugin->SVDRPHelpPages());
if (hp) { if (hp) {
Reply(-214, hp); Reply(-214, "%s", hp);
Reply(214, "End of HELP info"); Reply(214, "End of HELP info");
} }
else else
@ -1358,7 +1358,7 @@ void cSVDRP::CmdPLUG(const char *Option)
int ReplyCode = 900; int ReplyCode = 900;
cString s = plugin->SVDRPCommand(cmd, option, ReplyCode); cString s = plugin->SVDRPCommand(cmd, option, ReplyCode);
if (s) if (s)
Reply(abs(ReplyCode), *s); Reply(abs(ReplyCode), "%s", *s);
else else
Reply(500, "Command unrecognized: \"%s\"", cmd); Reply(500, "Command unrecognized: \"%s\"", cmd);
} }
@ -1380,7 +1380,7 @@ void cSVDRP::CmdPUTE(const char *Option)
{ {
delete PUTEhandler; delete PUTEhandler;
PUTEhandler = new cPUTEhandler; PUTEhandler = new cPUTEhandler;
Reply(PUTEhandler->Status(), PUTEhandler->Message()); Reply(PUTEhandler->Status(), "%s", PUTEhandler->Message());
if (PUTEhandler->Status() != 354) if (PUTEhandler->Status() != 354)
DELETENULL(PUTEhandler); DELETENULL(PUTEhandler);
} }
@ -1467,7 +1467,7 @@ void cSVDRP::Execute(char *Cmd)
// handle PUTE data: // handle PUTE data:
if (PUTEhandler) { if (PUTEhandler) {
if (!PUTEhandler->Process(Cmd)) { if (!PUTEhandler->Process(Cmd)) {
Reply(PUTEhandler->Status(), PUTEhandler->Message()); Reply(PUTEhandler->Status(), "%s", PUTEhandler->Message());
DELETENULL(PUTEhandler); DELETENULL(PUTEhandler);
} }
return; return;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "thread.h"
@ -208,7 +208,8 @@ cThread::cThread(const char *Description)
childTid = 0; childTid = 0;
childThreadId = 0; childThreadId = 0;
description = NULL; description = NULL;
SetDescription(Description); if (Description)
SetDescription("%s", Description);
} }
cThread::~cThread() cThread::~cThread()

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "timers.h"
@ -12,6 +12,7 @@
#include "channels.h" #include "channels.h"
#include "device.h" #include "device.h"
#include "i18n.h" #include "i18n.h"
#include "libsi/si.h"
#include "remote.h" #include "remote.h"
// IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d' // 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 cString cTimer::ToDescr(void) const
{ {
char *buffer; 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); return cString(buffer, true);
} }
@ -409,7 +410,13 @@ int cTimer::Matches(const cEvent *Event, int *Overlap) const
bool cTimer::Expired(void) 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 time_t cTimer::StartTime(void) const
@ -426,7 +433,10 @@ time_t cTimer::StopTime(void) const
return stopTime; 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) void cTimer::SetEventFromSchedule(const cSchedules *Schedules)
{ {
@ -438,14 +448,25 @@ void cTimer::SetEventFromSchedule(const cSchedules *Schedules)
} }
const cSchedule *Schedule = Schedules->GetSchedule(Channel()); const cSchedule *Schedule = Schedules->GetSchedule(Channel());
if (Schedule) { if (Schedule) {
time_t now = time(NULL);
if (!lastSetEvent || Schedule->Modified() >= lastSetEvent) { if (!lastSetEvent || Schedule->Modified() >= lastSetEvent) {
const cEvent *Event = NULL; const cEvent *Event = NULL;
int Overlap = 0; int Overlap = 0;
int Distance = INT_MIN; 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)) { for (const cEvent *e = Schedule->Events()->First(); e; e = Schedule->Events()->Next(e)) {
if (e->EndTime() < now - EPGLIMITPAST) if (!UseVps || e != event && e != PresentEvent && e != FollowingEvent) { // always check these if this is a VPS timer
continue; // skip old events 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; int overlap = 0;
Matches(e, &overlap); Matches(e, &overlap);
if (overlap && overlap >= 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()) if (Event && Event->EndTime() < now - EXPIRELATENCY && Overlap > FULLMATCH && !Event->IsRunning())
Event = NULL; Event = NULL;
SetEvent(Event); SetEvent(Event);
lastSetEvent = now;
} }
} }
lastSetEvent = time(NULL);
} }
void cTimer::SetEvent(const cEvent *Event) void cTimer::SetEvent(const cEvent *Event)
{ {
if (event != Event) { //XXX TODO check event data, too??? if (event != Event) { //XXX TODO check event data, too???
if (Event) { if (Event)
char vpsbuf[64] = ""; isyslog("timer %s set to event %s", *ToDescr(), *Event->ToDescr());
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());
}
else else
isyslog("timer %s set to no event", *ToDescr()); isyslog("timer %s set to no event", *ToDescr());
event = Event; event = Event;
@ -568,6 +585,7 @@ cTimers::cTimers(void)
state = 0; state = 0;
beingEdited = 0;; beingEdited = 0;;
lastSetEvents = 0; lastSetEvents = 0;
lastDeleteExpired = 0;
} }
cTimer *cTimers::GetTimer(cTimer *Timer) cTimer *cTimers::GetTimer(cTimer *Timer)
@ -663,6 +681,8 @@ void cTimers::SetEvents(void)
void cTimers::DeleteExpired(void) void cTimers::DeleteExpired(void)
{ {
if (time(NULL) - lastDeleteExpired < 30)
return;
cTimer *ti = First(); cTimer *ti = First();
while (ti) { while (ti) {
cTimer *next = Next(ti); cTimer *next = Next(ti);
@ -673,4 +693,5 @@ void cTimers::DeleteExpired(void)
} }
ti = next; ti = next;
} }
lastDeleteExpired = time(NULL);
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __TIMERS_H
@ -101,6 +101,7 @@ private:
int state; int state;
int beingEdited; int beingEdited;
time_t lastSetEvents; time_t lastSetEvents;
time_t lastDeleteExpired;
public: public:
cTimers(void); cTimers(void);
cTimer *GetTimer(cTimer *Timer); cTimer *GetTimer(cTimer *Timer);

10
tools.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "tools.h"
@ -829,8 +829,14 @@ char *cReadLine::Read(FILE *f)
int n = getline(&buffer, &size, f); int n = getline(&buffer, &size, f);
if (n > 0) { if (n > 0) {
n--; n--;
if (buffer[n] == '\n') if (buffer[n] == '\n') {
buffer[n] = 0; buffer[n] = 0;
if (n > 0) {
n--;
if (buffer[n] == '\r')
buffer[n] = 0;
}
}
return buffer; return buffer;
} }
return NULL; return NULL;

6
vdr.5
View File

@ -8,9 +8,9 @@
.\" License as specified in the file COPYING that comes with the .\" License as specified in the file COPYING that comes with the
.\" vdr distribution. .\" 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 .SH NAME
vdr file formats - the Video Disk Recorder Files vdr file formats - the Video Disk Recorder Files
.SH DESCRIPTION .SH DESCRIPTION
@ -636,7 +636,7 @@ l l.
<start time> @is the time (as a time_t integer) in UTC when this event starts <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 <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) <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 <title> @is the title of the event
<short text> @is the short text of the event (typically the name of the episode etc.) <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) <description> @is the description of the event (any '|' characters will be interpreted as newlines)

11
vdr.c
View File

@ -22,7 +22,7 @@
* *
* The project's page is at http://www.cadsoft.de/vdr * 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> #include <getopt.h>
@ -1067,7 +1067,7 @@ int main(int argc, char *argv[])
} }
if (UserShutdown && Next && Delta <= Setup.MinEventTimeout * 60 && !ForceShutdown) { if (UserShutdown && Next && Delta <= Setup.MinEventTimeout * 60 && !ForceShutdown) {
char *buf; 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)) if (Interface->Confirm(buf))
ForceShutdown = true; ForceShutdown = true;
else else
@ -1090,13 +1090,16 @@ int main(int argc, char *argv[])
isyslog("executing '%s'", cmd); isyslog("executing '%s'", cmd);
SystemExec(cmd); SystemExec(cmd);
free(cmd); free(cmd);
LastActivity = time(NULL) - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later
} }
else if (WatchdogTimeout > 0) { else {
LastActivity = Now;
if (WatchdogTimeout > 0) {
alarm(WatchdogTimeout); alarm(WatchdogTimeout);
if (signal(SIGALRM, Watchdog) == SIG_IGN) if (signal(SIGALRM, Watchdog) == SIG_IGN)
signal(SIGALRM, SIG_IGN); signal(SIGALRM, SIG_IGN);
} }
LastActivity = time(NULL) - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later }
UserShutdown = false; UserShutdown = false;
continue; // skip the rest of the housekeeping for now continue; // skip the rest of the housekeeping for now
} }