summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS27
-rw-r--r--HISTORY43
-rw-r--r--Makefile28
-rw-r--r--channels.conf8
-rw-r--r--config.h6
-rw-r--r--cutter.c6
-rw-r--r--dvbdevice.c6
-rw-r--r--dvbosd.c9
-rw-r--r--epg.c31
-rw-r--r--epg.h6
-rw-r--r--i18n.c32
-rw-r--r--interface.c2
-rw-r--r--lirc.c41
-rw-r--r--lirc.h5
-rw-r--r--menu.c28
-rw-r--r--pat.c4
-rw-r--r--remote.c10
-rw-r--r--remote.h3
-rw-r--r--thread.c8
-rw-r--r--timers.c5
-rw-r--r--transfer.c37
-rw-r--r--vdr.54
-rw-r--r--vdr.c6
23 files changed, 217 insertions, 138 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 5b460ca..b6234d2 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -269,6 +269,7 @@ Matjaz Thaler <matjaz.thaler@guest.arnes.si>
Artur Skawina <skawina@geocities.com>
for improving the font file generation in the Makefile
for pointing out a problem with the ERR macro defined by ncurses.h
+ for a patch that contained a fix for checking toFile in cCuttingThread::Action()
Werner Fink <werner@suse.de>
for making I/O more robust by handling EINTR
@@ -545,6 +546,8 @@ Helmut Auer <vdr@helmutauer.de>
for suggesting to increase the default value for 'Min. user inactivity' to 300 minutes
for suggesting to add cChannel::LinkChannels() and cChannel::RefChannel()
for suggesting to give a message when an instant recording is started
+ fpr suggesting to retry a shutdown after a while
+ for separating the 'install' target into several individual targets
Jeremy Hall <jhall@UU.NET>
for fixing an incomplete initialization of the filter parameters in eit.c
@@ -882,6 +885,7 @@ Andreas Mair <Andreas.Mair@linogate.com>
for reporting a short display of the main menu if a plugin displays its own OSD and
is started through a user defined key macro
for reporting a problem with extremely long summary fields in timers
+ for reporting a bug in handling the tfRecording flag when reading timers
Olivier Jacques <jacquesolivier@hotmail.com>)
for translating OSD texts to the French language
@@ -939,6 +943,7 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
for reporting a crash in the Schedule menu with events that have no title
for a patch that was used to implement automatic cursor advance when entering text
via the numeric keys
+ for reporting a problem with expired timers when shutting down via the Power key
Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark
@@ -1165,6 +1170,8 @@ Thomas Bergwinkl <Thomas.Bergwinkl@vr-web.de>
for fixing detecting if there can be any useful further input when entering channel
numbers
for fixing handling the '0' key for switching between the last two channels
+ for making cPatFilter::Process() check whether the channel exists before setting
+ the PMT filter
Stéphane Esté-Gracias <sestegra@free.fr>
for fixing a typo in libsi/si.h
@@ -1322,6 +1329,7 @@ Kimmo Tykkala <tykkala@iki.fi>
Arthur Konovalov <kasjas@hot.ee>
for translating OSD texts to the Estonian language
+ for fixing a missing ',' in the Greek OSD texts
Milos Kapoun <m.kapoun@cra.cz>
for suggesting to skip code table info in SI data
@@ -1341,6 +1349,8 @@ Udo Richter <udo_richter@gmx.de>
no longer exists
for reporting a missing check against MAXOSDAREAS in cOsd::CanHandleAreas()
for making the Makefile report a summary of failed plugins
+ for reporting a problem with the new handling of k_Repeat keypresses in channel
+ switching
Sven Kreiensen <svenk@kammer.uni-hannover.de>
for his help in keeping 'channels.conf.terr' up to date
@@ -1457,6 +1467,8 @@ Luca Olivetti <luca@ventoso.org>
for making cDevice::AttachPlayer() keep the track language codes and descriptions
in Transfer Mode
for suggesting to make the "Menu" key behave consistently
+ for suggesting to implement a timeout for remote controls that don't deliver
+ "repeat" keypresses very fast
Mikko Salo <mikko.salo@ppe.inet.fi>
for suggesting to make the setup option "DVB/Video display format" available only
@@ -1480,6 +1492,8 @@ Ville Skyttä <ville.skytta@iki.fi>
for adding a missing #include <linux/unistd.h> to thread.c
for adding missing i18n entry for the "Timer" button
for removing the obsolete "ca.conf" section from vdr.1
+ for making the cLircRemote try to reestablish the connection to the LIRC daemon
+ in case it breaks
Steffen Beyer <cpunk@reactor.de>
for fixing setting the colored button help after deleting a recording in case the next
@@ -1531,6 +1545,8 @@ Matthias Lenk <matthias.lenk@amd.com>
Frank Krömmelbein <kroemmelbein@gmx.de>
for adding missing storing of the MenuScrollPage parameter
+ for reporting a problem with channel switching with the Down (Up) key in case the
+ current channel is already the first (last) in the list
Bernhard Stegmaier <bernhard.stegmaier@in.tum.de>
for reporting a problem in cEITScanner::Process() with forced EPG scans if EPG
@@ -1683,3 +1699,14 @@ Markus Hahn <mhahn@reel-multimedia.com>
Jaroslaw Swierczynski <swiergot@gmail.com>
for updating the Polish OSD texts and the fontosd-iso8859-2.c file
+
+Alexander Hans <cleditor@arcor.de>
+ fpr reporting a crash when pressing '0' in the "Schedule" menu on a channel that
+ doesn't have any EPG data
+
+Daniel Karsubka <dkar@gmx.de>
+ for suggesting to write the epg.data file when VDR exits
+
+Suur Karu <suurkaru@fastmail.fm>
+ for reporting a problem with the tuning timeout for channels that have low symbol
+ rates
diff --git a/HISTORY b/HISTORY
index 18e5636..62ab4db 100644
--- a/HISTORY
+++ b/HISTORY
@@ -4227,3 +4227,46 @@ Video Disk Recorder Revision History
- Updated the Spanish OSD texts (thanks to Jesus Bravo Alvarez).
- Fixed handling the '0' key for switching between the last two channels (thanks
to Thomas Bergwinkl).
+
+2006-01-29: Version 1.3.41
+
+- EPG events from epg.data or SVDRP's PUTE command now have their Title set to
+ "No Title" if none was set.
+- Fixed checking toFile in cCuttingThread::Action() (found in a larger patch from
+ Artur Skawina).
+- Fixed a crash when pressing '0' in the "Schedule" menu on a channel that doesn't
+ have any EPG data (reported ny Alexander Hans).
+- Updated the Danish OSD texts (thanks to Mogens Elneff).
+- Fixed a missing ',' in the Greek OSD texts (thanks to Arthur Konovalov).
+- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
+- Fixed handling the tfRecording flag when reading timers (bug reported by Andreas
+ Mair).
+- Now checking whether the channel exists before setting the PMT filter in
+ cPatFilter::Process() (thanks to Thomas Bergwinkl).
+- Now trying to reestablish the connection to the LIRC daemon in case it breaks
+ (thanks to Ville Skyttä).
+- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
+- Fixed channel switching with the Down (Up) key in case the current channel is
+ already the first (last) in the list (reported by Frank Krömmelbein).
+- Removed the "buffer reserve" in Transfer Mode - it's no longer necessary with
+ recent driver/firmware versions.
+- The epg.data file is now written when VDR exits (suggested by Daniel Karsubka).
+- Fixed cTimers::GetNextActiveTimer() so that it won't return an expired timer
+ (reported by Rolf Ahrenberg).
+- Changed DVBS_TUNE_TIMEOUT and DVBC_TUNE_TIMEOUT to 9000ms to avoid problems with
+ channels that have low symbol rates (reported by Suur Karu).
+- Fixed displaying the current audio track in the channel display.
+- When reading epg.data (or data from PUTE), the version number of events with
+ table IDs smaller than 0x50 is now ignored because otherwise the current
+ running status would not be set after a restart of VDR.
+- Implemented a timeout for remote controls that don't deliver "repeat" keypresses
+ very fast (based on a suggestion by Luca Olivetti; problem with the new handling
+ of k_Repeat keypresses in channel switching reported by Udo Richter).
+- When looking for the present or following EPG event, the running status is now
+ always taken into account.
+- Now initializing the channels' schedule pointers when reading the epg.data file,
+ so that the first WhatsOn menu will come up faster.
+- If a shutdown is requested, but the shutdown script doesn't actually halt the
+ system, it is now tried again after 5 minutes (suggested by Helmut Auer).
+- Separated the 'install' target into several individual targets; renamed the
+ 'plugins-install' target to 'install-plugins' (thanks to Helmut Auer).
diff --git a/Makefile b/Makefile
index f1b61e7..a642751 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
-# $Id: Makefile 1.83 2006/01/13 16:04:56 kls Exp $
+# $Id: Makefile 1.84 2006/01/29 14:50:34 kls Exp $
.DELETE_ON_ERROR:
@@ -199,19 +199,33 @@ plugins-clean:
# Install the files:
-install:
+install: install-bin install-conf install-doc install-plugins
+
+# VDR binary:
+
+install-bin: vdr
@mkdir -p $(BINDIR)
@cp vdr runvdr $(BINDIR)
+
+# Configuration files:
+
+install-conf:
+ @if [ ! -d $(VIDEODIR) ]; then\
+ mkdir -p $(VIDEODIR);\
+ cp *.conf $(VIDEODIR);\
+ fi
+
+# Documentation:
+
+install-doc:
@mkdir -p $(MANDIR)/man1
@mkdir -p $(MANDIR)/man5
@gzip -c vdr.1 > $(MANDIR)/man1/vdr.1.gz
@gzip -c vdr.5 > $(MANDIR)/man5/vdr.5.gz
- @if [ ! -d $(VIDEODIR) ]; then\
- mkdir -p $(VIDEODIR);\
- cp *.conf $(VIDEODIR);\
- fi
-plugins-install:
+# Plugins:
+
+install-plugins: plugins
@mkdir -p $(PLUGINLIBDIR)
@cp $(PLUGINDIR)/lib/libvdr-*.so.$(VDRVERSION) $(PLUGINLIBDIR)
diff --git a/channels.conf b/channels.conf
index e15663d..f1fdbc9 100644
--- a/channels.conf
+++ b/channels.conf
@@ -45,14 +45,14 @@ MDR FERNSEHEN;ARD:12109:hC34:S19.2E:27500:401:402=deu:404:0:28204:1:1073:0
rbb Berlin;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0
:Premiere World
PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1801,1722,1702:8:133:2:0
-PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu;515=deu:32:1801,1722,1702:10:133:2:0
-PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu;1795=deu:32:1801,1722,1702:11:133:2:0
+PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu,513=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: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 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1801,1722,1702:9:133:2:0
+PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=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 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1702,1722,1801:41:133:2:0
PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1801,1702,1722:20:133:2:0
-DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1801,1702,1722: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,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0
:PW Erotic
diff --git a/config.h b/config.h
index 03e4451..9920d00 100644
--- a/config.h
+++ b/config.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: config.h 1.241 2006/01/15 16:01:48 kls Exp $
+ * $Id: config.h 1.242 2006/01/27 13:27:41 kls Exp $
*/
#ifndef __CONFIG_H
@@ -19,8 +19,8 @@
#include "i18n.h"
#include "tools.h"
-#define VDRVERSION "1.3.40"
-#define VDRVERSNUM 10340 // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION "1.3.41"
+#define VDRVERSNUM 10341 // Version * 10000 + Major * 100 + Minor
#define MAXPRIORITY 99
#define MAXLIFETIME 99
diff --git a/cutter.c b/cutter.c
index f656bbd..6d3a152 100644
--- a/cutter.c
+++ b/cutter.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: cutter.c 1.11 2005/10/31 12:26:44 kls Exp $
+ * $Id: cutter.c 1.12 2006/01/27 13:45:00 kls Exp $
*/
#include "cutter.h"
@@ -118,7 +118,7 @@ void cCuttingThread::Action(void)
break;
if (FileSize > MEGABYTE(Setup.MaxVideoFileSize)) {
toFile = toFileName->NextFile();
- if (toFile < 0) {
+ if (!toFile) {
error = "toFile 1";
break;
}
@@ -158,7 +158,7 @@ void cCuttingThread::Action(void)
cutIn = true;
if (Setup.SplitEditedFiles) {
toFile = toFileName->NextFile();
- if (toFile < 0) {
+ if (!toFile) {
error = "toFile 2";
break;
}
diff --git a/dvbdevice.c b/dvbdevice.c
index fe32298..ee8c623 100644
--- a/dvbdevice.c
+++ b/dvbdevice.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbdevice.c 1.150 2006/01/14 15:57:36 kls Exp $
+ * $Id: dvbdevice.c 1.151 2006/01/28 15:37:01 kls Exp $
*/
#include "dvbdevice.h"
@@ -40,9 +40,9 @@
#define DEV_DVB_AUDIO "audio"
#define DEV_DVB_CA "ca"
-#define DVBS_TUNE_TIMEOUT 2000 //ms
+#define DVBS_TUNE_TIMEOUT 9000 //ms
#define DVBS_LOCK_TIMEOUT 2000 //ms
-#define DVBC_TUNE_TIMEOUT 5000 //ms
+#define DVBC_TUNE_TIMEOUT 9000 //ms
#define DVBC_LOCK_TIMEOUT 2000 //ms
#define DVBT_TUNE_TIMEOUT 9000 //ms
#define DVBT_LOCK_TIMEOUT 2000 //ms
diff --git a/dvbosd.c b/dvbosd.c
index 76afecb..469ef1f 100644
--- a/dvbosd.c
+++ b/dvbosd.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbosd.c 1.29 2005/12/30 15:41:54 kls Exp $
+ * $Id: dvbosd.c 1.30 2006/01/28 14:24:04 kls Exp $
*/
#include "dvbosd.h"
@@ -48,13 +48,6 @@ cDvbOsd::cDvbOsd(int Left, int Top, int OsdDev)
cap.cmd = OSD_CAP_MEMSIZE;
if (ioctl(osdDev, OSD_GET_CAPABILITY, &cap) == 0)
osdMem = cap.val;
- #define FW_NEEDS_BUFFER_RESERVE_FOR_AC3
- #ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
- //XXX This is a very ugly hack to allow cDvbOsd to reduce the buffer
- //XXX requirements in cTransfer if it detects a 4MB full featured DVB card.
- extern bool DvbCardWith4MBofSDRAM;
- DvbCardWith4MBofSDRAM = osdMem >= 1000000;
- #endif
#endif
// must clear all windows here to avoid flashing effects - doesn't work if done
// in Flush() only for the windows that are actually used...
diff --git a/epg.c b/epg.c
index 384f86b..d69158e 100644
--- a/epg.c
+++ b/epg.c
@@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
- * $Id: epg.c 1.51 2006/01/20 14:09:48 kls Exp $
+ * $Id: epg.c 1.57 2006/01/29 14:17:33 kls Exp $
*/
#include "epg.h"
@@ -16,6 +16,8 @@
#include <ctype.h>
#include <time.h>
+#define RUNNINGSTATUSTIMEOUT 30 // seconds before the running status is considered unknown
+
// --- tComponent ------------------------------------------------------------
cString tComponent::ToString(void)
@@ -204,7 +206,7 @@ bool cEvent::HasTimer(void) const
bool cEvent::IsRunning(bool OrAboutToStart) const
{
- return runningStatus >= (OrAboutToStart ? SI::RunningStatusStartsInAFewSeconds : SI::RunningStatusPausing);
+ return SeenWithin(RUNNINGSTATUSTIMEOUT) && runningStatus >= (OrAboutToStart ? SI::RunningStatusStartsInAFewSeconds : SI::RunningStatusPausing);
}
cString cEvent::GetDateString(void) const
@@ -309,7 +311,8 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
Event = newEvent = new cEvent(EventID);
if (Event) {
Event->SetTableID(TableID);
- Event->SetVersion(Version);
+ if (TableID >= 0x50) // makes sure the running status flag is set from the actual data stream
+ Event->SetVersion(Version);
Event->SetStartTime(StartTime);
Event->SetDuration(Duration);
if (newEvent)
@@ -318,7 +321,9 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
}
}
break;
- case 'e': Event = NULL;
+ case 'e': if (!Event->Title())
+ Event->SetTitle(tr("No title"));
+ Event = NULL;
break;
case 'c': // to keep things simple we react on 'c' here
return true;
@@ -655,25 +660,22 @@ void cSchedule::UnhashEvent(cEvent *Event)
eventsHashStartTime.Del(Event, Event->StartTime());
}
-const cEvent *cSchedule::GetPresentEvent(bool CheckRunningStatus) const
+const cEvent *cSchedule::GetPresentEvent(void) const
{
const cEvent *pe = NULL;
time_t now = time(NULL);
for (cEvent *p = events.First(); p; p = events.Next(p)) {
- if (p->StartTime() <= now && now < p->EndTime()) {
+ if (p->StartTime() <= now && now < p->EndTime())
pe = p;
- if (!CheckRunningStatus)
- break;
- }
- if (CheckRunningStatus && p->SeenWithin(30) && p->RunningStatus() >= SI::RunningStatusPausing)
+ if (p->SeenWithin(RUNNINGSTATUSTIMEOUT) && p->RunningStatus() >= SI::RunningStatusPausing)
return p;
}
return pe;
}
-const cEvent *cSchedule::GetFollowingEvent(bool CheckRunningStatus) const
+const cEvent *cSchedule::GetFollowingEvent(void) const
{
- const cEvent *p = GetPresentEvent(CheckRunningStatus);
+ const cEvent *p = GetPresentEvent();
if (p)
p = events.Next(p);
return p;
@@ -975,6 +977,11 @@ bool cSchedules::Read(FILE *f)
bool result = cSchedule::Read(f, s);
if (OwnFile)
fclose(f);
+ if (result) {
+ // Initialize the channels' schedule pointers, so that the first WhatsOn menu will come up faster:
+ for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel))
+ s->GetSchedule(Channel);
+ }
return result;
}
return false;
diff --git a/epg.h b/epg.h
index 443b560..ad24524 100644
--- a/epg.h
+++ b/epg.h
@@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
- * $Id: epg.h 1.29 2006/01/14 15:45:24 kls Exp $
+ * $Id: epg.h 1.30 2006/01/29 14:03:13 kls Exp $
*/
#ifndef __EPG_H
@@ -137,8 +137,8 @@ public:
void HashEvent(cEvent *Event);
void UnhashEvent(cEvent *Event);
const cList<cEvent> *Events(void) const { return &events; }
- const cEvent *GetPresentEvent(bool CheckRunningStatus = false) const;
- const cEvent *GetFollowingEvent(bool CheckRunningStatus = false) const;
+ const cEvent *GetPresentEvent(void) const;
+ const cEvent *GetFollowingEvent(void) const;
const cEvent *GetEvent(u_int16_t EventID, time_t StartTime = 0) const;
const cEvent *GetEventAround(time_t Time) const;
void Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0) const;
diff --git a/i18n.c b/i18n.c
index 1bd20da..c061a1a 100644
--- a/i18n.c
+++ b/i18n.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: i18n.c 1.240 2006/01/22 15:55:28 kls Exp $
+ * $Id: i18n.c 1.244 2006/01/28 10:38:33 kls Exp $
*
* Translations provided by:
*
@@ -460,7 +460,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"See sündmus - %s",
- "",//TODO
+ "Denne udsendelse - %s",
},
{ "This event - all channels",
"Diese Sendung - alle Kanäle",
@@ -481,7 +481,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"See sündmus - kõik kanalid",
- "",//TODO
+ "Denne udsendelse - alle kanaler",
},
{ "All events - all channels",
"Alle Sendungen - alle Kanäle",
@@ -502,7 +502,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"Kõik sündmused - kõik kanalid",
- "",//TODO
+ "Alle udsendelser - alle kanaler",
},
{ "What's on now?",
"Was läuft jetzt?",
@@ -692,7 +692,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"Taimer",
- "",// TODO
+ "Timer",
},
{ "Button$Record",
"Aufnehmen",
@@ -1597,7 +1597,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"FTA",
- "",//TODO
+ "Free To Air",
},
{ "encrypted",
"verschlüsselt",
@@ -1618,7 +1618,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"krüptitud",
- "",//TODO
+ "kodet",
},
{ "Sid",
"Sid",
@@ -2344,6 +2344,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
+ "Tallennustilan puute estää tallennuksen!",
"",//TODO
"",//TODO
"",//TODO
@@ -2353,9 +2354,8 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
- "",//TODO
- "",//TODO
+ "Ebapiisavalt kettaruumi salvestamise alustamiseks!",
+ "For lidt harddisk plads til optagelse!",
},
{ "Low disk space!",
"Platte beinahe voll!",
@@ -2958,7 +2958,7 @@ const tI18nPhrase Phrases[] = {
"ei koskaan",
"nigdy",
"nunca",
- "ÐïôÝ"
+ "ÐïôÝ",
"aldrig",
"niciodatã",
"",// TODO
@@ -3092,7 +3092,7 @@ const tI18nPhrase Phrases[] = {
"", // TODO
"", // TODO
"Kanaliinfo kuvamise ajapiirang",
- "", // TODO
+ "Timeout ved anmodet kanal info",
},
{ "Setup.OSD$Scroll pages",
"Seitenweise scrollen",
@@ -3155,7 +3155,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"Sulgemine Menüü klahviga",
- "",// TODO
+ "Menu taste lukker",
},
{ "Setup.OSD$Sort timers",
"Timer sortieren",
@@ -3616,7 +3616,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"¿àÕÔßÞçØâÐÕÜëÕ ï×ëÚØ (×ÒãÚ)",
"Audio jezici",
- "Audio keeled",
+ "Audio keeli",
"Audio sprog (ant.)",
},
{ "Setup.DVB$Audio language", // note the singular
@@ -4292,7 +4292,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
" 0\t-.#~,/_@1\tabcäå2\tdef3\tghi4\tjkl5\tmnoõö6\tpqrsð7\ttuvü8\twxyzþ9",
- "",//TODO
+ " 0\t-.#~,/_@1\tabcæå2\tdef3\tghi4\tjkl5\tmnoø6\tpqrs7\ttuv8\twxyz9",
},
// Learning keys:
{ "Learning Remote Control Keys",
@@ -5534,7 +5534,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"Salvestamine algas",
- "",//TODO
+ "Optagelse startet",
},
{ "Pausing live video...",
"Live-Signal wird angehalten...",
diff --git a/interface.c b/interface.c
index b2e842d..4b74db9 100644
--- a/interface.c
+++ b/interface.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: interface.c 1.71 2006/01/04 15:44:19 kls Exp $
+ * $Id: interface.c 1.73 2006/01/29 12:35:50 kls Exp $
*/
#include "interface.h"
diff --git a/lirc.c b/lirc.c
index ac9de01..9bb8328 100644
--- a/lirc.c
+++ b/lirc.c
@@ -6,35 +6,28 @@
*
* LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16.
*
- * $Id: lirc.c 1.13 2005/09/02 12:51:35 kls Exp $
+ * $Id: lirc.c 1.14 2006/01/27 15:59:47 kls Exp $
*/
#include "lirc.h"
#include <netinet/in.h>
#include <sys/socket.h>
-#include <sys/un.h>
#define REPEATLIMIT 20 // ms
#define REPEATDELAY 350 // ms
#define KEYPRESSDELAY 150 // ms
+#define RECONNECTDELAY 3000 // ms
cLircRemote::cLircRemote(const char *DeviceName)
:cRemote("LIRC")
,cThread("LIRC remote control")
{
- struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, DeviceName);
- if ((f = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) {
- if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0) {
- Start();
- return;
- }
- LOG_ERROR_STR(DeviceName);
- close(f);
+ if (Connect()) {
+ Start();
+ return;
}
- else
- LOG_ERROR_STR(DeviceName);
f = -1;
}
@@ -47,6 +40,20 @@ cLircRemote::~cLircRemote()
close(fh);
}
+bool cLircRemote::Connect(void)
+{
+ if ((f = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) {
+ if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0)
+ return true;
+ LOG_ERROR_STR(addr.sun_path);
+ close(f);
+ f = -1;
+ }
+ else
+ LOG_ERROR_STR(addr.sun_path);
+ return false;
+}
+
bool cLircRemote::Ready(void)
{
return f >= 0;
@@ -67,10 +74,16 @@ void cLircRemote::Action(void)
int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1;
if (ready && ret <= 0 ) {
- esyslog("ERROR: lircd connection lost");
+ esyslog("ERROR: lircd connection broken, trying to reconnect every %.1f seconds", float(RECONNECTDELAY) / 1000);
close(f);
f = -1;
- break;
+ while (Running() && f < 0) {
+ cCondWait::SleepMs(RECONNECTDELAY);
+ if (Connect()) {
+ isyslog("reconnected to lircd");
+ break;
+ }
+ }
}
if (ready && ret > 21) {
diff --git a/lirc.h b/lirc.h
index 25b743f..3c4735a 100644
--- a/lirc.h
+++ b/lirc.h
@@ -4,12 +4,13 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: lirc.h 1.3 2005/07/31 10:18:15 kls Exp $
+ * $Id: lirc.h 1.4 2006/01/27 16:00:19 kls Exp $
*/
#ifndef __LIRC_H
#define __LIRC_H
+#include <sys/un.h>
#include "remote.h"
#include "thread.h"
@@ -17,7 +18,9 @@ class cLircRemote : public cRemote, private cThread {
private:
enum { LIRC_KEY_BUF = 30, LIRC_BUFFER_SIZE = 128 };
int f;
+ struct sockaddr_un addr;
virtual void Action(void);
+ bool Connect(void);
public:
cLircRemote(const char *DeviceName);
virtual ~cLircRemote();
diff --git a/menu.c b/menu.c
index ec49b1c..4aa5397 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 1.403 2006/01/22 16:06:39 kls Exp $
+ * $Id: menu.c 1.407 2006/01/29 14:04:37 kls Exp $
*/
#include "menu.h"
@@ -1245,7 +1245,7 @@ void cMenuSchedule::PrepareScheduleAllThis(const cEvent *Event, const cChannel *
if (schedules && Channel) {
const cSchedule *Schedule = schedules->GetSchedule(Channel);
if (Schedule) {
- const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent(Channel->Number() == cDevice::CurrentChannel());
+ const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent();
time_t now = time(NULL) - Setup.EPGLinger * 60;
for (const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->Next(ev)) {
if (ev->EndTime() > now || ev == PresentEvent)
@@ -1352,6 +1352,8 @@ eOSState cMenuSchedule::Number(void)
Event = CurrentItem->event;
Channel = Channels.GetByChannelID(Event->ChannelID(), true);
}
+ else
+ Channel = Channels.GetByNumber(cDevice::CurrentChannel());
switch (cMenuScheduleItem::SortMode()) {
case cMenuScheduleItem::ssmAllThis: PrepareScheduleAllThis(Event, Channel); break;
case cMenuScheduleItem::ssmThisThis: PrepareScheduleThisThis(Event, Channel); break;
@@ -2954,19 +2956,19 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
// --- SetTrackDescriptions --------------------------------------------------
-static void SetTrackDescriptions(bool Live)
+static void SetTrackDescriptions(int LiveChannel)
{
cDevice::PrimaryDevice()->ClrAvailableTracks(true);
const cComponents *Components = NULL;
cSchedulesLock SchedulesLock;
- if (Live) {
- cChannel *Channel = Channels.GetByNumber(cDevice::CurrentChannel());
+ if (LiveChannel) {
+ cChannel *Channel = Channels.GetByNumber(LiveChannel);
if (Channel) {
const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock);
if (Schedules) {
const cSchedule *Schedule = Schedules->GetSchedule(Channel);
if (Schedule) {
- const cEvent *Present = Schedule->GetPresentEvent(true);
+ const cEvent *Present = Schedule->GetPresentEvent();
if (Present)
Components = Present->Components();
}
@@ -3056,10 +3058,10 @@ void cDisplayChannel::DisplayInfo(void)
if (Schedules) {
const cSchedule *Schedule = Schedules->GetSchedule(channel);
if (Schedule) {
- const cEvent *Present = Schedule->GetPresentEvent(true);
- const cEvent *Following = Schedule->GetFollowingEvent(true);
+ const cEvent *Present = Schedule->GetPresentEvent();
+ const cEvent *Following = Schedule->GetFollowingEvent();
if (Present != lastPresent || Following != lastFollowing) {
- SetTrackDescriptions(true);
+ SetTrackDescriptions(channel->Number());
displayChannel->SetEvents(Present, Following);
cStatus::MsgOsdProgramme(Present ? Present->StartTime() : 0, Present ? Present->Title() : NULL, Present ? Present->ShortText() : NULL, Following ? Following->StartTime() : 0, Following ? Following->Title() : NULL, Following ? Following->ShortText() : NULL);
lastPresent = Present;
@@ -3172,13 +3174,15 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key)
cChannel *ch = NextAvailableChannel(channel, (k == kUp || k == kChanUp) ? 1 : -1);
if (ch)
channel = ch;
+ else if (channel && channel->Number() != cDevice::CurrentChannel())
+ Key = k; // immediately switches channel when hitting the beginning/end of the channel list with k_Repeat
}
// no break here
case kUp|k_Release:
case kDown|k_Release:
case kChanUp|k_Release:
case kChanDn|k_Release:
- if (!(Key & k_Repeat) && channel)
+ if (!(Key & k_Repeat) && channel && channel->Number() != cDevice::CurrentChannel())
NewChannel = channel;
withInfo = true;
group = -1;
@@ -3235,7 +3239,9 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key)
DisplayInfo();
displayChannel->Flush();
if (NewChannel) {
+ SetTrackDescriptions(NewChannel->Number()); // to make them immediately visible in the channel display
Channels.SwitchTo(NewChannel->Number());
+ SetTrackDescriptions(NewChannel->Number()); // switching the channel has cleared them
channel = NewChannel;
}
return osContinue;
@@ -3320,7 +3326,7 @@ cDisplayTracks::cDisplayTracks(void)
:cOsdObject(true)
{
cDevice::PrimaryDevice()->EnsureAudioTrack();
- SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice());
+ SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice() ? cDevice::CurrentChannel() : 0);
currentDisplayTracks = this;
numTracks = track = 0;
audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
diff --git a/pat.c b/pat.c
index 83031db..a7216b8 100644
--- a/pat.c
+++ b/pat.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: pat.c 1.14 2005/09/04 14:32:39 kls Exp $
+ * $Id: pat.c 1.15 2006/01/27 15:48:29 kls Exp $
*/
#include "pat.h"
@@ -287,7 +287,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
int Index = 0;
for (SI::Loop::Iterator it; pat.associationLoop.getNext(assoc, it); ) {
if (!assoc.isNITPid()) {
- if (Index++ == pmtIndex) {
+ if (Index++ >= pmtIndex && Channels.GetByServiceID(Source(), Transponder(), assoc.getServiceId())) {
pmtPid = assoc.getPid();
Add(pmtPid, 0x02);
break;
diff --git a/remote.c b/remote.c
index 7d7b4a5..4504533 100644
--- a/remote.c
+++ b/remote.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remote.c 1.48 2006/01/15 15:17:40 kls Exp $
+ * $Id: remote.c 1.49 2006/01/29 14:43:07 kls Exp $
*/
#include "remote.h"
@@ -18,11 +18,13 @@
// --- cRemote ---------------------------------------------------------------
-#define INITTIMEOUT 10000 // ms
+#define INITTIMEOUT 10000 // ms
+#define REPEATTIMEOUT 1000 // ms
eKeys cRemote::keys[MaxKeys];
int cRemote::in = 0;
int cRemote::out = 0;
+cTimeMs cRemote::repeatTimeout;
cRemote *cRemote::learning = NULL;
char *cRemote::unknownCode = NULL;
cMutex cRemote::mutex;
@@ -163,9 +165,11 @@ eKeys cRemote::Get(int WaitMs, char **UnknownCode)
eKeys k = keys[out];
if (++out >= MaxKeys)
out = 0;
+ if ((k & k_Repeat) != 0)
+ repeatTimeout.Set(REPEATTIMEOUT);
return k;
}
- else if (!WaitMs || !keyPressed.TimedWait(mutex, WaitMs)) {
+ else if (!WaitMs || !keyPressed.TimedWait(mutex, WaitMs) && repeatTimeout.TimedOut()) {
if (learning && UnknownCode) {
*UnknownCode = unknownCode;
unknownCode = NULL;
diff --git a/remote.h b/remote.h
index 4fd26d8..0213b0c 100644
--- a/remote.h
+++ b/remote.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remote.h 1.32 2006/01/01 14:00:50 kls Exp $
+ * $Id: remote.h 1.33 2006/01/29 12:27:08 kls Exp $
*/
#ifndef __REMOTE_H
@@ -23,6 +23,7 @@ private:
static eKeys keys[MaxKeys];
static int in;
static int out;
+ static cTimeMs repeatTimeout;
static cRemote *learning;
static char *unknownCode;
static cMutex mutex;
diff --git a/thread.c b/thread.c
index 4fcfc27..5d5e18b 100644
--- a/thread.c
+++ b/thread.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: thread.c 1.51 2006/01/08 16:03:56 kls Exp $
+ * $Id: thread.c 1.52 2006/01/28 11:34:35 kls Exp $
*/
#include "thread.h"
@@ -105,7 +105,7 @@ void cCondVar::Wait(cMutex &Mutex)
if (Mutex.locked) {
int locked = Mutex.locked;
Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_wait
- // does an implizit unlock of the mutex
+ // does an implicit unlock of the mutex
pthread_cond_wait(&cond, &Mutex.mutex);
Mutex.locked = locked;
}
@@ -113,14 +113,14 @@ void cCondVar::Wait(cMutex &Mutex)
bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs)
{
- bool r = true; // true = condition signaled false = timeout
+ bool r = true; // true = condition signaled, false = timeout
if (Mutex.locked) {
struct timespec abstime;
if (GetAbsTime(&abstime, TimeoutMs)) {
int locked = Mutex.locked;
Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_timedwait
- // does an implizit unlock of the mutex.
+ // does an implicit unlock of the mutex.
if (pthread_cond_timedwait(&cond, &Mutex.mutex, &abstime) == ETIMEDOUT)
r = false;
Mutex.locked = locked;
diff --git a/timers.c b/timers.c
index a168cc1..ab42680 100644
--- a/timers.c
+++ b/timers.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: timers.c 1.43 2006/01/15 13:31:11 kls Exp $
+ * $Id: timers.c 1.45 2006/01/28 15:09:05 kls Exp $
*/
#include "timers.h"
@@ -245,6 +245,7 @@ bool cTimer::Parse(const char *s)
}
bool result = false;
if (8 <= sscanf(s, "%u :%a[^:]:%a[^:]:%d :%d :%d :%d :%a[^:\n]:%a[^\n]", &flags, &channelbuffer, &daybuffer, &start, &stop, &priority, &lifetime, &filebuffer, &summary)) {
+ ClrFlags(tfRecording);
if (summary && !*skipspace(summary)) {
free(summary);
summary = NULL;
@@ -566,7 +567,7 @@ cTimer *cTimers::GetNextActiveTimer(void)
{
cTimer *t0 = NULL;
for (cTimer *ti = First(); ti; ti = Next(ti)) {
- if ((ti->HasFlags(tfActive)) && (!t0 || ti->Compare(*t0) < 0))
+ if ((ti->HasFlags(tfActive)) && (!t0 || ti->StopTime() > time(NULL) && ti->Compare(*t0) < 0))
t0 = ti;
}
return t0;
diff --git a/transfer.c b/transfer.c
index 8a0db4d..b8313df 100644
--- a/transfer.c
+++ b/transfer.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: transfer.c 1.31 2006/01/21 14:13:16 kls Exp $
+ * $Id: transfer.c 1.32 2006/01/28 14:23:38 kls Exp $
*/
#include "transfer.h"
@@ -49,41 +49,12 @@ void cTransfer::Receive(uchar *Data, int Length)
}
}
-#define FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-//XXX This is a very ugly hack to allow cDvbOsd to reduce the buffer
-//XXX requirements in cTransfer if it detects a 4MB full featured DVB card.
-bool DvbCardWith4MBofSDRAM = false;
-#endif
-
void cTransfer::Action(void)
{
int PollTimeouts = 0;
uchar *p = NULL;
int Result = 0;
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
- bool GotBufferReserve = false;
- GotBufferReserve = true; //XXX remove this line if you absolutely need the buffer reserve
- int RequiredBufferReserve = KILOBYTE(DvbCardWith4MBofSDRAM ? 288 : 576);
-#endif
while (Running()) {
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
- if (needsBufferReserve && !GotBufferReserve) {
- //XXX For dolby we've to fill the buffer because the firmware does
- //XXX not decode dolby but use a PCM stream for transport, therefore
- //XXX the firmware has not enough buffer for noiseless skipping early
- //XXX PCM samples (each dolby frame requires 6144 bytes in PCM and
- //XXX audio is mostly to early in comparison to video).
- //XXX To resolve this, the remuxer or PlayPes() should synchronize
- //XXX audio with the video frames. 2004/09/09 Werner
- if (ringBuffer->Available() < RequiredBufferReserve) { // used to be MAXFRAMESIZE, but the HDTV value of KILOBYTE(512) is way too much here
- cCondWait::SleepMs(20); // allow the buffer to collect some reserve
- continue;
- }
- else
- GotBufferReserve = true;
- }
-#endif
int Count;
uchar *b = ringBuffer->Get(Count);
if (b) {
@@ -98,9 +69,6 @@ void cTransfer::Action(void)
remux->Clear();
PlayPes(NULL, 0);
p = NULL;
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
- GotBufferReserve = false;
-#endif
continue;
}
Count = remux->Put(b, Count);
@@ -133,9 +101,6 @@ void cTransfer::Action(void)
remux->Clear();
PlayPes(NULL, 0);
p = NULL;
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
- GotBufferReserve = false;
-#endif
}
}
}
diff --git a/vdr.5 b/vdr.5
index caabe51..214aac8 100644
--- a/vdr.5
+++ b/vdr.5
@@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the
.\" vdr distribution.
.\"
-.\" $Id: vdr.5 1.47 2006/01/14 10:57:37 kls Exp $
+.\" $Id: vdr.5 1.48 2006/01/29 11:31:58 kls Exp $
.\"
.TH vdr 5 "08 Jan 2006" "1.3.38" "Video Disk Recorder Files"
.SH NAME
@@ -635,7 +635,7 @@ l l.
<start time> @is the time (as a time_t integer) in UTC when this event starts
<duration> @is the time (in seconds) that this event will take
<table id> @is a hex number that indicates the table this event is contained in (if this is left empty or 0 this event will not be overwritten or modified by data that comes from the DVB stream)
-<version> @is a hex number that indicates the event's version number inside its table (optional)
+<version> @is a hex number that indicates the event's version number inside its table (optional, only processed for table IDs smaller than 0x50)
<title> @is the title of the event
<short text> @is the short text of the event (typically the name of the episode etc.)
<description> @is the description of the event (any '|' characters will be interpreted as newlines)
diff --git a/vdr.c b/vdr.c
index 1658590..3913f62 100644
--- a/vdr.c
+++ b/vdr.c
@@ -22,7 +22,7 @@
*
* The project's page is at http://www.cadsoft.de/vdr
*
- * $Id: vdr.c 1.244 2006/01/22 15:59:13 kls Exp $
+ * $Id: vdr.c 1.246 2006/01/29 14:35:31 kls Exp $
*/
#include <getopt.h>
@@ -71,6 +71,7 @@
// in order to react on a possible new CAM menu as soon as possible
#define DEVICEREADYTIMEOUT 30 // seconds to wait until all devices are ready
#define MENUTIMEOUT 120 // seconds of user inactivity after which an OSD display is closed
+#define SHUTDOWNRETRY 300 // seconds before trying again to shut down
#define EXIT(v) { ExitCode = (v); goto Exit; }
@@ -1087,7 +1088,7 @@ int main(int argc, char *argv[])
if (signal(SIGALRM, Watchdog) == SIG_IGN)
signal(SIGALRM, SIG_IGN);
}
- LastActivity = time(NULL); // don't try again too soon
+ LastActivity = time(NULL) - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later
UserShutdown = false;
continue; // skip the rest of the housekeeping for now
}
@@ -1122,6 +1123,7 @@ Exit:
}
cDevice::Shutdown();
PluginManager.Shutdown();
+ cSchedules::Cleanup(true);
ReportEpgBugFixStats();
if (WatchdogTimeout > 0)
dsyslog("max. latency time %d seconds", MaxLatencyTime);