diff options
-rw-r--r-- | CONTRIBUTORS | 27 | ||||
-rw-r--r-- | HISTORY | 43 | ||||
-rw-r--r-- | Makefile | 28 | ||||
-rw-r--r-- | channels.conf | 8 | ||||
-rw-r--r-- | config.h | 6 | ||||
-rw-r--r-- | cutter.c | 6 | ||||
-rw-r--r-- | dvbdevice.c | 6 | ||||
-rw-r--r-- | dvbosd.c | 9 | ||||
-rw-r--r-- | epg.c | 31 | ||||
-rw-r--r-- | epg.h | 6 | ||||
-rw-r--r-- | i18n.c | 32 | ||||
-rw-r--r-- | interface.c | 2 | ||||
-rw-r--r-- | lirc.c | 41 | ||||
-rw-r--r-- | lirc.h | 5 | ||||
-rw-r--r-- | menu.c | 28 | ||||
-rw-r--r-- | pat.c | 4 | ||||
-rw-r--r-- | remote.c | 10 | ||||
-rw-r--r-- | remote.h | 3 | ||||
-rw-r--r-- | thread.c | 8 | ||||
-rw-r--r-- | timers.c | 5 | ||||
-rw-r--r-- | transfer.c | 37 | ||||
-rw-r--r-- | vdr.5 | 4 | ||||
-rw-r--r-- | vdr.c | 6 |
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 @@ -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). @@ -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 @@ -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 @@ -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 @@ -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... @@ -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; @@ -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; @@ -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" @@ -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) { @@ -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(); @@ -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(); @@ -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; @@ -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; @@ -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; @@ -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; @@ -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; @@ -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 } } } @@ -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) @@ -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); |