Version 1.4.0-1

- Updated 'S110W' in 'sources.conf'.
- Adjusted the 'runvdr' script so that the user can fill in the functions to
  detect, load and unload the necessary driver modules (thanks to M. Kiesel for
  reporting that it still used DVBDIR).
- Added 'eval' to the $VDRCMD call in 'runvdr' to avoid problems with quoting
  (suggested by Udo Richter).
- Fixed missing ',' in the Italian and Polish OSD texts (thanks to Marko Mäkelä).
- Updated the Czech OSD texts (thanks to Vladimír Bárta).
- Fixed handling the "Power" key in case a timer is about to start recording
  (thanks to Udo Richter).
- Fixed the character 'r' in fontosd and fontsml for iso8859-2 (thanks to Vladimír
  Bárta).
- When checking whether a VPS timer has entered the "VPS margin", the event's start
  time is now used instead of the timer's start time, because otherwise events that
  start way off of their VPS time wouldn't be recorded correctly.
- If VPS timers are active, their events are now being kept up to date if there
  are any free devices available.
- Fixed the character #207 in fontosd for iso8859-2 (thanks to Vladimír Bárta).
- Fixed handling unknown codes when learning LIRC remote control codes (reported
  by Helmut Auer).
- Since some channels (especially the Austrian ORF) randomly change the ids of their
  EPG events, VDR now gives the start time precedence when searching for existing
  events.
- Fixed automatically updating the CAM menu in case the whole operation (for
  instance a firmware update) takes longer than the menu timeout.
This commit is contained in:
Klaus Schmidinger 2006-05-14 18:00:00 +02:00
parent 529fc7b48a
commit 5d8e3b18dc
13 changed files with 232 additions and 142 deletions

View File

@ -563,6 +563,8 @@ Helmut Auer <vdr@helmutauer.de>
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 for reporting that an attempt to call a plugin's main menu function while a
message is being displayed didn't work message is being displayed didn't work
for reporting a problem with the "Press any key on the RC unit" step when learning
LIRC remote control codes
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
@ -1422,6 +1424,9 @@ Udo Richter <udo_richter@gmx.de>
for providing a shorter version of the 'sed' expression for extracting APIVERSION for providing a shorter version of the 'sed' expression for extracting APIVERSION
for fixing a bug in handling the "Power" key in case a recording is going on and for fixing a bug in handling the "Power" key in case a recording is going on and
no plugin is active no plugin is active
for suggesting to add 'eval' to the $VDRCMD call in 'runvdr' to avoid problems with
quoting
for fixing handling the "Power" key in case a timer is about to start recording
Sven Kreiensen <svenk@kammer.uni-hannover.de> Sven Kreiensen <svenk@kammer.uni-hannover.de>
for his help in keeping 'channels.conf.terr' up to date for his help in keeping 'channels.conf.terr' up to date
@ -1677,6 +1682,7 @@ Marko M
for reporting that a menu was automatically closed when a replay ends for reporting that a menu was automatically closed when a replay ends
for suggesting to ignore k_Repeat when deciding whether the same key has been for suggesting to ignore k_Repeat when deciding whether the same key has been
pressed in string input fields pressed in string input fields
for fixing missing ',' in the Italian and Polish OSD texts
Patrick Rother <krd-vdr@gulu.net> Patrick Rother <krd-vdr@gulu.net>
for reporting a bug in defining timers that only differ in the day of week for reporting a bug in defining timers that only differ in the day of week
@ -1828,8 +1834,10 @@ Ronny Kornexl <ronny.kornexl@online.de>
font if set to '3' - even if it would have been a fixed font font if set to '3' - even if it would have been a fixed font
for reporting a bug in initializing 'noapiv' in the Makefile for reporting a bug in initializing 'noapiv' in the Makefile
Bárta Vladimír <vladimir.barta@k2atmitec.cz> Vladimír Bárta <vladimir.barta@k2atmitec.cz>
for translating OSD texts to the Czech language for translating OSD texts to the Czech language
for fixing the character 'r' in fontosd and fontsml for iso8859-2
for fixing the character #207 in fontosd for iso8859-2
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
@ -1894,3 +1902,6 @@ Werner F
Dominique Simon <d.simon@gmx.net> Dominique Simon <d.simon@gmx.net>
for reporting a bug in handling the "Power" key in case a recording is going on and for reporting a bug in handling the "Power" key in case a recording is going on and
no plugin is active no plugin is active
M. Kiesel <vdr@continuity.cjb.net>
for reporting that the 'runvdr' script still used DVBDIR

30
HISTORY
View File

@ -4283,7 +4283,7 @@ Video Disk Recorder Revision History
- Speeded up cVideoRepacker (thanks to Reinhard Nissl). - Speeded up cVideoRepacker (thanks to Reinhard Nissl).
- Added an 'Id' parameter to cDevice::PlayAudio() to allow plugins to easier - Added an 'Id' parameter to cDevice::PlayAudio() to allow plugins to easier
process the audio data (thanks to Marco Schlüßler). process the audio data (thanks to Marco Schlüßler).
- Added Czech language texts (thanks to Bárta Vladimír). - Added Czech language texts (thanks to Vladimír Bárta).
Plugin authors may want to add the new entries to their I18N texts and contact Plugin authors may want to add the new entries to their I18N texts and contact
the translators to have their texts translated. Note that there are now 21 the translators to have their texts translated. Note that there are now 21
different OSD languages, so please make sure you have 21 versions for each of different OSD languages, so please make sure you have 21 versions for each of
@ -4687,3 +4687,31 @@ Video Disk Recorder Revision History
- Fixed a memory leak in closing the video file during replay (thanks to Tobias Grimm). - Fixed a memory leak in closing the video file during replay (thanks to Tobias Grimm).
- Updated the Italian OSD texts (thanks to Nino Gerbino and Antonio Ospite). - Updated the Italian OSD texts (thanks to Nino Gerbino and Antonio Ospite).
- Updated the Estonian OSD texts (thanks to Arthur Konovalov). - Updated the Estonian OSD texts (thanks to Arthur Konovalov).
2006-05-14: Version 1.4.0-1
- Updated 'S110W' in 'sources.conf'.
- Adjusted the 'runvdr' script so that the user can fill in the functions to
detect, load and unload the necessary driver modules (thanks to M. Kiesel for
reporting that it still used DVBDIR).
- Added 'eval' to the $VDRCMD call in 'runvdr' to avoid problems with quoting
(suggested by Udo Richter).
- Fixed missing ',' in the Italian and Polish OSD texts (thanks to Marko Mäkelä).
- Updated the Czech OSD texts (thanks to Vladimír Bárta).
- Fixed handling the "Power" key in case a timer is about to start recording
(thanks to Udo Richter).
- Fixed the character 'r' in fontosd and fontsml for iso8859-2 (thanks to Vladimír
Bárta).
- When checking whether a VPS timer has entered the "VPS margin", the event's start
time is now used instead of the timer's start time, because otherwise events that
start way off of their VPS time wouldn't be recorded correctly.
- If VPS timers are active, their events are now being kept up to date if there
are any free devices available.
- Fixed the character #207 in fontosd for iso8859-2 (thanks to Vladimír Bárta).
- Fixed handling unknown codes when learning LIRC remote control codes (reported
by Helmut Auer).
- Since some channels (especially the Austrian ORF) randomly change the ids of their
EPG events, VDR now gives the start time precedence when searching for existing
events.
- Fixed automatically updating the CAM menu in case the whole operation (for
instance a firmware update) takes longer than the menu timeout.

View File

@ -133,6 +133,9 @@ call to the VDR program, be sure to NOT use the '-d' option! Otherwise
VDR will go into 'daemon' mode and the initial program call will return VDR will go into 'daemon' mode and the initial program call will return
immediately! 'runvdr' needs to be started as user 'root'. Use the '-u' immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
option to run the actual 'vdr' program under a different user id. option to run the actual 'vdr' program under a different user id.
Note that the 'runvdr' script needs to be adjusted to your particular
requirements before you can actually use it. See the comments inside
the script for more information.
Setting the system time: Setting the system time:
------------------------ ------------------------

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.255 2006/04/29 09:24:07 kls Exp $ * $Id: config.h 1.256 2006/05/07 09:01:49 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -21,7 +21,7 @@
// VDR's own version number: // VDR's own version number:
#define VDRVERSION "1.4.0" #define VDRVERSION "1.4.0-1"
#define VDRVERSNUM 10400 // Version * 10000 + Major * 100 + Minor #define VDRVERSNUM 10400 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number: // The plugin API's version number:

18
epg.c
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.c 1.72 2006/04/22 12:02:47 kls Exp $ * $Id: epg.c 1.74 2006/05/12 13:25:44 kls Exp $
*/ */
#include "epg.h" #include "epg.h"
@ -327,8 +327,10 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
cEvent *newEvent = NULL; cEvent *newEvent = NULL;
if (Event) if (Event)
DELETENULL(Event->components); DELETENULL(Event->components);
if (!Event) if (!Event) {
Event = newEvent = new cEvent(EventID); Event = newEvent = new cEvent(EventID);
Event->seen = 0;
}
if (Event) { if (Event) {
Event->SetTableID(TableID); Event->SetTableID(TableID);
Event->SetStartTime(StartTime); Event->SetStartTime(StartTime);
@ -710,12 +712,12 @@ const cEvent *cSchedule::GetFollowingEvent(void) const
const cEvent *cSchedule::GetEvent(tEventID EventID, time_t StartTime) const const cEvent *cSchedule::GetEvent(tEventID EventID, time_t StartTime) const
{ {
// Returns either the event info with the given EventID or, if that one can't // Returns the event info with the given StartTime or, if no actual StartTime
// be found, the one with the given StartTime (or NULL if neither can be found) // is given, the one with the given EventID.
cEvent *pt = eventsHashID.Get(EventID); if (StartTime > 0) // 'StartTime < 0' is apparently used with NVOD channels
if (!pt && StartTime > 0) // 'StartTime < 0' is apparently used with NVOD channels return eventsHashStartTime.Get(StartTime);
pt = eventsHashStartTime.Get(StartTime); else
return pt; return eventsHashID.Get(EventID);
} }
const cEvent *cSchedule::GetEventAround(time_t Time) const const cEvent *cSchedule::GetEventAround(time_t Time) const

View File

@ -2471,34 +2471,34 @@ static const cFont::tPixelData FontOsd_iso8859_2[][29] = {
0x0000000C, // .........**.. 0x0000000C, // .........**..
}, },
{ // 114 { // 114
10, 27, 8, 27,
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x000000CE, // ..**..***. 0x0000000E, // ....***.
0x000000FE, // ..*******. 0x0000003E, // ..*****.
0x000000E0, // ..***..... 0x00000038, // ..***...
0x000000C0, // ..**...... 0x00000030, // ..**....
0x000000C0, // ..**...... 0x00000030, // ..**....
0x000000C0, // ..**...... 0x00000030, // ..**....
0x000000C0, // ..**...... 0x00000030, // ..**....
0x000000C0, // ..**...... 0x00000030, // ..**....
0x000000C0, // ..**...... 0x00000030, // ..**....
0x000000C0, // ..**...... 0x00000030, // ..**....
0x000000C0, // ..**...... 0x00000030, // ..**....
0x000000C0, // ..**...... 0x00000030, // ..**....
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
0x00000000, // .......... 0x00000000, // ........
}, },
{ // 115 { // 115
12, 27, 12, 27,
@ -5261,34 +5261,34 @@ static const cFont::tPixelData FontOsd_iso8859_2[][29] = {
0x00000000, // ........ 0x00000000, // ........
}, },
{ // 207 { // 207
6, 27, 17, 27,
0x00000000, // ...... 0x00001860, // ....**....**.....
0x00000033, // **..** 0x00000CC0, // .....**..**......
0x00000033, // **..** 0x00000780, // ......****.......
0x00000033, // **..** 0x00000300, // .......**........
0x00000000, // ...... 0x00000000, // .................
0x0000000C, // ..**.. 0x00007FC0, // ..*********......
0x0000000C, // ..**.. 0x00007FF0, // ..***********....
0x0000000C, // ..**.. 0x00006078, // ..**......****...
0x0000000C, // ..**.. 0x00006018, // ..**........**...
0x0000000C, // ..**.. 0x00006018, // ..**........**...
0x0000000C, // ..**.. 0x0000600C, // ..**.........**..
0x0000000C, // ..**.. 0x0000600C, // ..**.........**..
0x0000000C, // ..**.. 0x0000600C, // ..**.........**..
0x0000000C, // ..**.. 0x0000600C, // ..**.........**..
0x0000000C, // ..**.. 0x0000600C, // ..**.........**..
0x0000000C, // ..**.. 0x0000600C, // ..**.........**..
0x0000000C, // ..**.. 0x0000600C, // ..**.........**..
0x0000000C, // ..**.. 0x00006018, // ..**........**...
0x0000000C, // ..**.. 0x00006018, // ..**........**...
0x0000000C, // ..**.. 0x00006070, // ..**......***....
0x0000000C, // ..**.. 0x00007FF0, // ..***********....
0x0000000C, // ..**.. 0x00007FC0, // ..*********......
0x00000000, // ...... 0x00000000, // .................
0x00000000, // ...... 0x00000000, // .................
0x00000000, // ...... 0x00000000, // .................
0x00000000, // ...... 0x00000000, // .................
0x00000000, // ...... 0x00000000, // .................
}, },
{ // 208 iso8859-2 { // 208 iso8859-2
17, 27, 17, 27,

View File

@ -2132,30 +2132,30 @@ static const cFont::tPixelData FontSml_iso8859_2[][25] = {
0x00000006, // ........**. 0x00000006, // ........**.
}, },
{ // 114 { // 114
9, 23, 6, 23,
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x000000CC, // .**..**.. 0x0000001B, // .**.**
0x000000F8, // .*****... 0x0000001B, // .**.**
0x000000E0, // .***..... 0x0000001C, // .***..
0x000000C0, // .**...... 0x00000018, // .**...
0x000000C0, // .**...... 0x00000018, // .**...
0x000000C0, // .**...... 0x00000018, // .**...
0x000000C0, // .**...... 0x00000018, // .**...
0x000000C0, // .**...... 0x00000018, // .**...
0x000000C0, // .**...... 0x00000018, // .**...
0x000000C0, // .**...... 0x00000018, // .**...
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
0x00000000, // ......... 0x00000000, // ......
}, },
{ // 115 { // 115
9, 23, 9, 23,

22
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.279 2006/04/30 08:51:10 kls Exp $ * $Id: i18n.c 1.281 2006/05/05 13:26:09 kls Exp $
* *
* Translations provided by: * Translations provided by:
* *
@ -484,7 +484,7 @@ const tI18nPhrase Phrases[] = {
{ "This event - all channels", { "This event - all channels",
"Diese Sendung - alle Kanäle", "Diese Sendung - alle Kanäle",
"Ta oddaja - vsi kanali", "Ta oddaja - vsi kanali",
"Questo evento - tutti i canali" "Questo evento - tutti i canali",
"",//TODO "",//TODO
"",//TODO "",//TODO
"Cet événement - toutes les chaînes", "Cet événement - toutes les chaînes",
@ -1703,7 +1703,7 @@ const tI18nPhrase Phrases[] = {
"Aucun cryptage", "Aucun cryptage",
"",//TODO "",//TODO
"vapaa", "vapaa",
"nieszyfrowany" "nieszyfrowany",
"en abierto", "en abierto",
"",//TODO "",//TODO
"Okodad", "Okodad",
@ -2310,7 +2310,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"VPS salvestamine tulekul!", "VPS salvestamine tulekul!",
"VPS optagelse starter snart!", "VPS optagelse starter snart!",
"",//TODO "Brzo začne nahrávání VPS!",
}, },
{ "No free DVB device to record!", { "No free DVB device to record!",
"Keine freie DVB-Karte zum Aufnehmen!", "Keine freie DVB-Karte zum Aufnehmen!",
@ -3764,7 +3764,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"ainult PID-id", "ainult PID-id",
"kun PIDs", "kun PIDs",
"",// TODO "jen PIDs",
}, },
{ "names and PIDs", { "names and PIDs",
"Namen und PIDs", "Namen und PIDs",
@ -4490,7 +4490,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"Kanal käivitamisel", "Kanal käivitamisel",
"Kanal ved opstart", "Kanal ved opstart",
"",// TODO "Kanál po spuštění",
}, },
{ "Setup.Miscellaneous$Initial volume", { "Setup.Miscellaneous$Initial volume",
"Lautstärke beim Einschalten", "Lautstärke beim Einschalten",
@ -4512,7 +4512,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"Helitugevus käivitamisel", "Helitugevus käivitamisel",
"Lydstyrke ved opstart", "Lydstyrke ved opstart",
"",// TODO "Hlasitost po spuštění",
}, },
{ "Setup.Miscellaneous$as before", { "Setup.Miscellaneous$as before",
"wie vorher", "wie vorher",
@ -4534,7 +4534,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"nagu enne", "nagu enne",
"som før", "som før",
"",// TODO "jako naposledy",
}, },
// The days of the week: // The days of the week:
{ "MTWTFSS", { "MTWTFSS",
@ -5353,7 +5353,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"Järgmine", "Järgmine",
"Fremad", "Fremad",
"",// TODO "Dále",
}, },
{ "Key$Prev", { "Key$Prev",
"Zurück", "Zurück",
@ -5375,7 +5375,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"Eelmine", "Eelmine",
"Tilbage", "Tilbage",
"",// TODO "Zpět",
}, },
{ "Key$Power", { "Key$Power",
"Ausschalten", "Ausschalten",
@ -5463,7 +5463,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"Eelmine kanal", "Eelmine kanal",
"Foregående kanal", "Foregående kanal",
"",// TODO "Předcházející kanál",
}, },
{ "Key$Volume+", { "Key$Volume+",
"Lautstärke+", "Lautstärke+",

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: remote.c 1.50 2006/04/17 08:58:28 kls Exp $ * $Id: remote.c 1.51 2006/05/12 12:40:15 kls Exp $
*/ */
#include "remote.h" #include "remote.h"
@ -182,11 +182,11 @@ eKeys cRemote::Get(int WaitMs, char **UnknownCode)
repeatTimeout.Set(REPEATTIMEOUT); repeatTimeout.Set(REPEATTIMEOUT);
return k; return k;
} }
else if (!WaitMs || !keyPressed.TimedWait(mutex, WaitMs) && repeatTimeout.TimedOut()) { else if (!WaitMs || !keyPressed.TimedWait(mutex, WaitMs) && repeatTimeout.TimedOut())
if (learning && UnknownCode) { return kNone;
*UnknownCode = unknownCode; else if (learning && UnknownCode && unknownCode) {
unknownCode = NULL; *UnknownCode = unknownCode;
} unknownCode = NULL;
return kNone; return kNone;
} }
} }

39
runvdr
View File

@ -5,6 +5,11 @@
# If VDR exits abnormally, the driver will be reloaded # If VDR exits abnormally, the driver will be reloaded
# and VDR restarted. # and VDR restarted.
# #
# In order to actually use this script you need to implement
# the functions DriverLoaded(), LoadDriver() and UnloadDriver()
# and maybe adjust the VDRPRG and VDRCMD to your particular
# requirements.
#
# Since this script loads the DVB driver, it must be started # Since this script loads the DVB driver, it must be started
# as user 'root'. Add the option "-u username" to run VDR # as user 'root'. Add the option "-u username" to run VDR
# under the given user name. # under the given user name.
@ -15,27 +20,43 @@
# 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: runvdr 1.16 2006/02/04 15:20:48 kls Exp $ # $Id: runvdr 1.18 2006/05/01 14:51:00 kls Exp $
DVBDIR="../DVB/driver"
VDRPRG="./vdr" VDRPRG="./vdr"
VDRCMD="$VDRPRG -w 60 $*" VDRCMD="$VDRPRG -w 60 $*"
LSMOD="`/sbin/lsmod | grep -w '^dvb' | wc -l`" LSMOD="`/sbin/lsmod | grep -w '^dvb' | wc -l`"
KILL="/usr/bin/killall -q -TERM" KILL="/usr/bin/killall -q -TERM"
# Detect whether the DVB driver is already loaded
# and return 0 if it *is* loaded, 1 if not:
function DriverLoaded()
{
return 1
}
# Load all DVB driver modules needed for your hardware:
function LoadDriver()
{
}
# Unload all DVB driver modules loaded in LoadDriver():
function UnloadDriver()
{
}
# Load driver if it hasn't been loaded already: # Load driver if it hasn't been loaded already:
if [ $LSMOD -eq 0 ] ; then if ! DriverLoaded; then
(cd $DVBDIR; make insmod) LoadDriver
fi fi
while (true) do while (true) do
$VDRCMD eval "$VDRCMD"
if test $? -eq 0 -o $? -eq 2; then exit; fi if test $? -eq 0 -o $? -eq 2; then exit; fi
date echo "`date` reloading DVB driver"
echo "restarting VDR"
$KILL $VDRPRG $KILL $VDRPRG
sleep 10 sleep 10
(cd $DVBDIR; make rmmod; make insmod) UnloadDriver
date LoadDriver
echo "`date` restarting VDR"
done done

View File

@ -164,7 +164,7 @@ S101W DirecTV 1R/4S/8 & AMC4
S103W AMC1 S103W AMC1
S105W AMC15 S105W AMC15
S107.3W Anik F1/F1R S107.3W Anik F1/F1R
S110W DirecTV 5 & Echostar 6/8 S110W DirecTV 5 & Echostar 6/8/10
S111.1W Anik F2 S111.1W Anik F2
S113W Solidaridad 2 S113W Solidaridad 2
S119W Echostar 7 & DirecTV 7S S119W Echostar 7 & DirecTV 7S

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.58 2006/04/21 15:12:49 kls Exp $ * $Id: timers.c 1.59 2006/05/13 09:03:59 kls Exp $
*/ */
#include "timers.h" #include "timers.h"
@ -365,10 +365,13 @@ bool cTimer::Matches(time_t t, bool Directly, int Margin) const
} }
if (HasFlags(tfActive)) { if (HasFlags(tfActive)) {
if (HasFlags(tfVps) && !Directly && event && event->Vps() && event->Schedule() && event->Schedule()->PresentSeenWithin(30)) { if (HasFlags(tfVps) && event && event->Vps()) {
startTime = event->StartTime(); if (Margin || !Directly) {
stopTime = event->EndTime(); startTime = event->StartTime();
return event->IsRunning(true); stopTime = event->EndTime();
if (!Margin)
return event->IsRunning(true);
}
} }
return startTime <= t + Margin && t < stopTime; // must stop *before* stopTime to allow adjacent timers return startTime <= t + Margin && t < stopTime; // must stop *before* stopTime to allow adjacent timers
} }

58
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.267 2006/04/29 09:14:06 kls Exp $ * $Id: vdr.c 1.272 2006/05/14 09:23:46 kls Exp $
*/ */
#include <getopt.h> #include <getopt.h>
@ -74,6 +74,8 @@
#define SHUTDOWNRETRY 300 // seconds before trying again to shut down #define SHUTDOWNRETRY 300 // seconds before trying again to shut down
#define VPSCHECKDELTA 10 // seconds between checks for timers that have entered the VPS margin #define VPSCHECKDELTA 10 // seconds between checks for timers that have entered the VPS margin
#define VPSDEVICETIMEOUT 8 // seconds before a device used for VPS may be reused #define VPSDEVICETIMEOUT 8 // seconds before a device used for VPS may be reused
#define VPSLOOKAHEADTIME 24 // hours within which VPS timers will make sure their events are up to date
#define VPSUPTODATETIME 3600 // seconds before the event or schedule of a VPS timer needs to be refreshed
#define EXIT(v) { ExitCode = (v); goto Exit; } #define EXIT(v) { ExitCode = (v); goto Exit; }
@ -762,8 +764,25 @@ int main(int argc, char *argv[])
TimerInVpsMargin = false; TimerInVpsMargin = false;
static time_t DeviceUsed[MAXDEVICES] = { 0 }; static time_t DeviceUsed[MAXDEVICES] = { 0 };
for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) { for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) {
if (Timer->HasFlags(tfActive | tfVps) && !Timer->Recording() && Timer->Matches(Now, true, Setup.VpsMargin)) { bool InVpsMargin = false;
Timer->SetInVpsMargin(true); bool NeedsTransponder = false;
if (Timer->HasFlags(tfActive | tfVps) && !Timer->Recording()) {
if (Timer->Matches(Now, true, Setup.VpsMargin))
InVpsMargin = true;
else if (Timer->Event())
NeedsTransponder = Timer->Event()->StartTime() - Now < VPSLOOKAHEADTIME * 3600 && !Timer->Event()->SeenWithin(VPSUPTODATETIME);
else {
cSchedulesLock SchedulesLock;
const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock);
if (Schedules) {
const cSchedule *Schedule = Schedules->GetSchedule(Timer->Channel());
NeedsTransponder = Schedule && !Schedule->PresentSeenWithin(VPSUPTODATETIME);
}
}
TimerInVpsMargin |= InVpsMargin | NeedsTransponder;
}
Timer->SetInVpsMargin(InVpsMargin);
if (NeedsTransponder || InVpsMargin) {
// Find a device that provides the required transponder: // Find a device that provides the required transponder:
cDevice *Device = NULL; cDevice *Device = NULL;
for (int i = 0; i < cDevice::NumDevices(); i++) { for (int i = 0; i < cDevice::NumDevices(); i++) {
@ -779,13 +798,13 @@ int main(int argc, char *argv[])
if (d->MaySwitchTransponder()) if (d->MaySwitchTransponder())
// this one can be switched without disturbing anything else // this one can be switched without disturbing anything else
Device = d; Device = d;
else if (!Device && !d->Receiving() && d->ProvidesTransponderExclusively(Timer->Channel())) else if (!Device && InVpsMargin && !d->Receiving() && d->ProvidesTransponderExclusively(Timer->Channel()))
// use this one only if no other with less impact can be found // use this one only if no other with less impact can be found
Device = d; Device = d;
} }
} }
} }
if (!Device) { if (!Device && InVpsMargin) {
cDevice *d = cDevice::ActualDevice(); cDevice *d = cDevice::ActualDevice();
if (!d->Receiving() && d->ProvidesTransponder(Timer->Channel()) && Now - DeviceUsed[d->DeviceNumber()] > VPSDEVICETIMEOUT) if (!d->Receiving() && d->ProvidesTransponder(Timer->Channel()) && Now - DeviceUsed[d->DeviceNumber()] > VPSDEVICETIMEOUT)
Device = d; // use the actual device as a last resort Device = d; // use the actual device as a last resort
@ -805,10 +824,7 @@ int main(int argc, char *argv[])
Skins.Message(mtInfo, tr("Upcoming VPS recording!")); Skins.Message(mtInfo, tr("Upcoming VPS recording!"));
} }
} }
TimerInVpsMargin = true;
} }
else
Timer->SetInVpsMargin(false);
} }
LastVpsCheck = time(NULL); LastVpsCheck = time(NULL);
} }
@ -970,7 +986,7 @@ int main(int argc, char *argv[])
} }
break; break;
// Power off: // Power off:
case kPower: case kPower: {
isyslog("Power button pressed"); isyslog("Power button pressed");
DELETE_MENU; DELETE_MENU;
if (!Shutdown) { if (!Shutdown) {
@ -985,8 +1001,20 @@ int main(int argc, char *argv[])
} }
if (cPluginManager::Active(tr("shut down anyway?"))) if (cPluginManager::Active(tr("shut down anyway?")))
break; break;
cTimer *timer = Timers.GetNextActiveTimer();
time_t Next = timer ? timer->StartTime() : 0;
time_t Delta = timer ? Next - time(NULL) : 0;
if (Next && Delta <= Setup.MinEventTimeout * 60) {
char *buf;
asprintf(&buf, tr("Recording in %ld minutes, shut down anyway?"), Delta / 60);
bool confirm = Interface->Confirm(buf);
free(buf);
if (!confirm)
break;
}
ForceShutdown = true; ForceShutdown = true;
break; break;
}
default: break; default: break;
} }
Interact = Menu ? Menu : cControl::Control(); // might have been closed in the mean time Interact = Menu ? Menu : cControl::Control(); // might have been closed in the mean time
@ -1004,6 +1032,9 @@ int main(int argc, char *argv[])
else if (time(NULL) - LastActivity > MENUTIMEOUT) else if (time(NULL) - LastActivity > MENUTIMEOUT)
state = osEnd; state = osEnd;
} }
// TODO make the CAM menu stay open in case of automatic updates and have it return osContinue; then the following two lines can be removed again
else if (state == osEnd && LastActivity > 1)
LastActivity = time(NULL);
switch (state) { switch (state) {
case osPause: DELETE_MENU; case osPause: DELETE_MENU;
cControl::Shutdown(); // just in case cControl::Shutdown(); // just in case
@ -1121,15 +1152,6 @@ int main(int argc, char *argv[])
else else
LastActivity = 1; LastActivity = 1;
} }
if (UserShutdown && Next && Delta <= Setup.MinEventTimeout * 60 && !ForceShutdown) {
char *buf;
asprintf(&buf, tr("Recording in %ld minutes, shut down anyway?"), Delta / 60);
if (Interface->Confirm(buf))
ForceShutdown = true;
else
UserShutdown = false;
free(buf);
}
if (!Next || Delta > Setup.MinEventTimeout * 60 || ForceShutdown) { if (!Next || Delta > Setup.MinEventTimeout * 60 || ForceShutdown) {
ForceShutdown = false; ForceShutdown = false;
if (timer) if (timer)