From af2a135212088f0cba6bd8f98544b271c2f71bef Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 4 May 2003 18:00:00 +0200 Subject: =?UTF-8?q?Version=201.1.30=20-=20Fixed=20minimum=20lifespan=20of?= =?UTF-8?q?=20deleted=20recordings=20(thanks=20to=20Jaakko=20Hyv=C3=A4tti)?= =?UTF-8?q?.=20-=20Updated=20French=20OSD=20texts=20(thanks=20to=20Olivier?= =?UTF-8?q?=20Jacques).=20-=20Fixed=20paging=20through=20lists=20with=20re?= =?UTF-8?q?peated=20Left/Right=20keys.=20-=20Fixed=20setting=20the=20PCR-P?= =?UTF-8?q?ID=20in=20case=20it=20is=20equal=20to=20one=20of=20the=20other?= =?UTF-8?q?=20PIDs=20(thanks=20=20=20to=20Oliver=20Endriss=20for=20reporti?= =?UTF-8?q?ng=20this=20one).=20-=20Fixed=20double=20call=20to=20MainMenuAc?= =?UTF-8?q?tion()=20of=20a=20plugin=20if=20invoked=20via=20a=20hotkey=20(t?= =?UTF-8?q?hanks=20=20=20to=20Kai=20Moeller=20for=20reporting=20this=20one?= =?UTF-8?q?).=20-=20Fixed=20handling=20dedicated=20keys.=20-=20Now=20turni?= =?UTF-8?q?ng=20off=20live=20PIDs=20when=20replaying.=20This=20avoids=20sh?= =?UTF-8?q?ort=20spikes=20from=20other=20=20=20channels=20when=20switching?= =?UTF-8?q?=20between=20Transfer=20Mode=20channels,=20and=20also=20lets=20?= =?UTF-8?q?an=20ongoing=20=20=20replay=20continue=20even=20if=20a=20record?= =?UTF-8?q?ing=20is=20started=20on=20the=20primary=20device.=20-=20The=20R?= =?UTF-8?q?CU=20channel=20display=20no=20longer=20changes=20when=20a=20rec?= =?UTF-8?q?ording=20on=20a=20different=20=20=20channel=20starts=20on=20the?= =?UTF-8?q?=20primary=20device.=20-=20Restoring=20the=20current=20channel?= =?UTF-8?q?=20in=20case=20a=20recording=20has=20switched=20the=20transpond?= =?UTF-8?q?er.=20=20=20If=20all=20devices=20are=20busy=20and=20none=20of?= =?UTF-8?q?=20them=20can=20provide=20the=20current=20channel,=20the=20=20?= =?UTF-8?q?=20message=20"Channel=20not=20available!"=20will=20be=20display?= =?UTF-8?q?ed.=20-=20Removed=20the=20(no=20longer=20necessary)=20'panic'?= =?UTF-8?q?=20stuff=20from=20cThread.=20-=20Added=20cStatus::OsdItem()=20t?= =?UTF-8?q?o=20provide=20the=20entire=20list=20of=20menu=20items=20to=20a?= =?UTF-8?q?=20plugin=20=20=20(thanks=20to=20Carsten=20Siebholz).=20-=20The?= =?UTF-8?q?=20red=20("Record")=20and=20yellow=20("Pause")=20button=20in=20?= =?UTF-8?q?the=20"Main"=20menu=20are=20no=20longer=20=20=20available=20whe?= =?UTF-8?q?n=20replaying.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTORS | 14 +++++++++++- HISTORY | 24 ++++++++++++++++++++ channels.conf | 10 ++++----- config.h | 4 ++-- device.c | 70 +++++++++++++++++++++++++++++++++-------------------------- device.h | 10 ++++----- dvbdevice.c | 55 ++++++++++++++++++++++------------------------ dvbdevice.h | 3 ++- i18n.c | 46 +++++++++++++++++++-------------------- menu.c | 8 +++---- osd.c | 10 +++++++-- rcu.c | 4 ++-- recording.c | 4 ++-- remote.c | 22 ++++++++++++++----- remote.h | 6 ++--- status.c | 8 ++++++- status.h | 5 ++++- thread.c | 23 +------------------- thread.h | 5 +---- vdr.1 | 11 +++++++--- vdr.c | 20 ++++++++++++----- 21 files changed, 210 insertions(+), 152 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 37394db..f96e444 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -460,6 +460,8 @@ Oliver Endriss for making the "Left" and "Right" buttons set the cursor to the first or last list item even if the list consist only of a single page, like, for instance, the Main menu + for reporting a bug in setting the PCR-PID in case it is equal to one of the other + PIDs Reinhard Walter Buchner for adding some satellites to 'sources.conf' @@ -495,6 +497,7 @@ Jaakko Hyv for adding a check if there is a connection to the keyboard for fixing recording overlapping timers on the same channel in case DO_REC_AND_PLAY_ON_PRIMARY_DEVICE and/or DO_MULTIPLE_RECORDINGS is not defined + for fixing the minimum lifespan of deleted recordings Dennis Noordsij for reporting a small glitch when switching channels @@ -551,7 +554,7 @@ Walter Stroebel Paul Gohn for adding 'Hrvatska radiotelevizija' and 'RTV Slovenija' to ca.conf -Teemu Rantanen +Teemu Rantanen for increased the maximum possible packet size in remux.c to avoid corrupted streams with broadcasters that send extremely large PES packets for adding TS error checking to remux.c @@ -618,3 +621,12 @@ Christian Jacobsen Andreas Mair 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 + +Olivier Jacques ) + for translating OSD texts to the French language + +Kai Moeller + for reporting a double call to MainMenuAction() of a plugin if invoked via a hotkey + +Carsten Siebholz + for adding cStatus::OsdItem() to provide the entire list of menu items to a plugin diff --git a/HISTORY b/HISTORY index 16c7447..c436fdb 100644 --- a/HISTORY +++ b/HISTORY @@ -2084,3 +2084,27 @@ Video Disk Recorder Revision History - The new SVDRP command STAT can be used to request information about the disk usage (thanks to Thomas Koch). - Fixed faulty calculation of section length in eit.c (thanks to Teemu Rantanen). + +2003-05-04: Version 1.1.30 + +- Fixed minimum lifespan of deleted recordings (thanks to Jaakko Hyvätti). +- Updated French OSD texts (thanks to Olivier Jacques). +- Fixed paging through lists with repeated Left/Right keys. +- Fixed setting the PCR-PID in case it is equal to one of the other PIDs (thanks + to Oliver Endriss for reporting this one). +- Fixed double call to MainMenuAction() of a plugin if invoked via a hotkey (thanks + to Kai Moeller for reporting this one). +- Fixed handling dedicated keys. +- Now turning off live PIDs when replaying. This avoids short spikes from other + channels when switching between Transfer Mode channels, and also lets an ongoing + replay continue even if a recording is started on the primary device. +- The RCU channel display no longer changes when a recording on a different + channel starts on the primary device. +- Restoring the current channel in case a recording has switched the transponder. + If all devices are busy and none of them can provide the current channel, the + message "Channel not available!" will be displayed. +- Removed the (no longer necessary) 'panic' stuff from cThread. +- Added cStatus::OsdItem() to provide the entire list of menu items to a plugin + (thanks to Carsten Siebholz). +- The red ("Record") and yellow ("Pause") button in the "Main" menu are no longer + available when replaying. diff --git a/channels.conf b/channels.conf index 3909757..fb73f57 100644 --- a/channels.conf +++ b/channels.conf @@ -50,13 +50,13 @@ B1:12110:h:S19.2E:27500:601:602:604:0:28206:0:0:0 Premiere Start:11797:h:S19.2E:27500:255:256:0:101:8:0:0:0 Premiere 1:11797:h:S19.2E:27500:511:512,513;515:0:101:10:0:0:0 Premiere 2:11797:h:S19.2E:27500:1791:1792,1793;1795:0:101:11:0:0:0 -Premiere 3:11797:h:S19.2E:27500:2303:2304:0:101:43:0:0:0 -Premiere 4:11797:h:S19.2E:27500:767:768:0:101:9:0:0:0 -Premiere 5:11797:h:S19.2E:27500:1279:1280:0:101:29:0:0:0 +Premiere 3:11797:h:S19.2E:27500:2303:2304,2305:0:101:43:0:0:0 +Premiere 4:11797:h:S19.2E:27500:767:768,769:0:101:9:0:0:0 +Premiere 5:11797:h:S19.2E:27500:1279:1280,1281:0:101:29:0:0:0 Premiere 6:11797:h:S19.2E:27500:1535:1536:0:101:41:0:0:0 Premiere 7:11797:h:S19.2E:27500:1023:1024:0:101:20:0:0:0 13th Street:11758:h:S19.2E:27500:2303:2304:0:101:42:0:0:0 -Studio Universal:12071:h:S19.2E:27500:2047:2048:0:101:36:0:0:0 +Studio Universal:11798:h:S19.2E:27500:2047:2048:0:101:36:0:0:0 Premiere Serie:12031:h:S19.2E:27500:1023:1024:0:101:16:0:0:0 Disney Channel:11758:h:S19.2E:27500:2559:2560:0:101:34:0:0:0 Premiere Nostalgie:12031:h:S19.2E:27500:2559:2560:0:101:516:0:0:0 @@ -67,7 +67,7 @@ Junior:11758:h:S19.2E:27500:255:256:0:101:19:0:0:0 K-Toon:11758:h:S19.2E:27500:511:512:0:101:12:0:0:0 Krimi&Co:12031:h:S19.2E:27500:1535:1536:0:101:23:0:0:0 Goldstar TV:11758:h:S19.2E:27500:3839:3840:0:101:518:0:0:0 -Classica:11758:h:S19.2E:27500:767:768:0:101:15:0:0:0 +MGM:11758:h:S19.2E:27500:767:768:2:101:515:0:0:0 Sonnenklar TV:12090:v:S19.2E:27500:1023:1024:0:0:32:0:0:0 :Premiere Direkt Premiere Direkt Portal:12031:h:S19.2E:27500:2815:2816:0:101:18:0:0:0 diff --git a/config.h b/config.h index e56689f..343ed15 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.154 2003/04/21 16:23:15 kls Exp $ + * $Id: config.h 1.155 2003/04/27 15:56:04 kls Exp $ */ #ifndef __CONFIG_H @@ -19,7 +19,7 @@ #include "device.h" #include "tools.h" -#define VDRVERSION "1.1.29" +#define VDRVERSION "1.1.30" #define MAXPRIORITY 99 #define MAXLIFETIME 99 diff --git a/device.c b/device.c index 67da457..9346d3b 100644 --- a/device.c +++ b/device.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.39 2003/04/12 11:51:04 kls Exp $ + * $Id: device.c 1.41 2003/05/03 13:40:15 kls Exp $ */ #include "device.h" @@ -50,8 +50,6 @@ cDevice::cDevice(void) ciHandler = NULL; player = NULL; - playerDetached = false; - for (int i = 0; i < MAXRECEIVERS; i++) receiver[i] = NULL; @@ -122,13 +120,6 @@ bool cDevice::HasDecoder(void) const return false; } -bool cDevice::PlayerDetached(void) -{ - bool result = playerDetached; - playerDetached = false; - return result; -} - cOsdBase *cDevice::NewOsd(int x, int y) { return NULL; @@ -224,15 +215,19 @@ bool cDevice::HasPid(int Pid) const bool cDevice::AddPid(int Pid, ePidType PidType) { - if (Pid) { + if (Pid || PidType == ptPcr) { int n = -1; int a = -1; - for (int i = 0; i < MAXPIDHANDLES; i++) { - if (pidHandles[i].pid == Pid) - n = i; - else if (a < 0 && i >= ptOther && !pidHandles[i].used) - a = i; - } + if (PidType != ptPcr) { // PPID always has to be explicit + for (int i = 0; i < MAXPIDHANDLES; i++) { + if (i != ptPcr) { + if (pidHandles[i].pid == Pid) + n = i; + else if (a < 0 && i >= ptOther && !pidHandles[i].used) + a = i; + } + } + } if (n >= 0) { // The Pid is already in use if (++pidHandles[n].used == 2 && n <= ptTeletext) { @@ -263,22 +258,31 @@ bool cDevice::AddPid(int Pid, ePidType PidType) return true; } -void cDevice::DelPid(int Pid) +void cDevice::DelPid(int Pid, ePidType PidType) { - if (Pid) { - for (int i = 0; i < MAXPIDHANDLES; i++) { - if (pidHandles[i].pid == Pid) { - PRINTPIDS("D"); - if (--pidHandles[i].used < 2) { - SetPid(&pidHandles[i], i, false); - if (pidHandles[i].used == 0) { - pidHandles[i].handle = -1; - pidHandles[i].pid = 0; - } + if (Pid || PidType == ptPcr) { + int n = -1; + if (PidType == ptPcr) + n = PidType; // PPID always has to be explicit + else { + for (int i = 0; i < MAXPIDHANDLES; i++) { + if (pidHandles[i].pid == Pid) { + n = i; + break; } - PRINTPIDS("E"); } - } + } + if (n >= 0 && pidHandles[n].used) { + PRINTPIDS("D"); + if (--pidHandles[n].used < 2) { + SetPid(&pidHandles[n], n, false); + if (pidHandles[n].used == 0) { + pidHandles[n].handle = -1; + pidHandles[n].pid = 0; + } + } + PRINTPIDS("E"); + } } } @@ -395,6 +399,11 @@ bool cDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) return false; } +bool cDevice::HasProgramme(void) +{ + return Replaying() || pidHandles[ptAudio].pid || pidHandles[ptVideo].pid; +} + void cDevice::SetVolumeDevice(int Volume) { } @@ -523,7 +532,6 @@ void cDevice::Detach(cPlayer *Player) player->device = NULL; player = NULL; SetPlayMode(pmNone); - playerDetached = true; Audios.ClearAudio(); } } diff --git a/device.h b/device.h index 8ffd495..d2cc4f8 100644 --- a/device.h +++ b/device.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.h 1.30 2003/04/26 09:49:12 kls Exp $ + * $Id: device.h 1.32 2003/05/03 13:35:55 kls Exp $ */ #ifndef __DEVICE_H @@ -181,6 +181,9 @@ protected: public: static int CurrentChannel(void) { return primaryDevice ? currentChannel : 0; } ///< Returns the number of the current channel on the primary device. + virtual bool HasProgramme(void); + ///< Returns true if the device is currently showing any programme to + ///< the user, either through replaying or live. // PID handle facilities @@ -201,7 +204,7 @@ protected: ///< Returns true if this device is currently receiving the given PID. bool AddPid(int Pid, ePidType PidType = ptOther); ///< Adds a PID to the set of PIDs this device shall receive. - void DelPid(int Pid); + void DelPid(int Pid, ePidType PidType = ptOther); ///< Deletes a PID from the set of PIDs this device shall receive. virtual bool SetPid(cPidHandle *Handle, int Type, bool On); ///< Does the actual PID setting on this device. @@ -300,7 +303,6 @@ public: private: cPlayer *player; - bool playerDetached; protected: virtual bool CanReplay(void) const; ///< Returns true if this device can currently start a replay session. @@ -349,8 +351,6 @@ public: ///< Attaches the given player to this device. void Detach(cPlayer *Player); ///< Detaches the given player from this device. - bool PlayerDetached(void); - ///< Returns true if a player has been detached and resets the 'playerDetached' flag. // Receiver facilities diff --git a/dvbdevice.c b/dvbdevice.c index d66cd76..8314ab6 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.56 2003/04/27 09:44:17 kls Exp $ + * $Id: dvbdevice.c 1.59 2003/05/03 14:03:20 kls Exp $ */ #include "dvbdevice.h" @@ -567,6 +567,24 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On) return true; } +void cDvbDevice::TurnOffLiveMode(void) +{ + // Avoid noise while switching: + + CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); + CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); + CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); + CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); + + // Turn off live PIDs: + + DelPid(pidHandles[ptAudio].pid); + DelPid(pidHandles[ptVideo].pid); + DelPid(pidHandles[ptPcr].pid, ptPcr); + DelPid(pidHandles[ptTeletext].pid); + DelPid(pidHandles[ptDolby].pid); +} + bool cDvbDevice::ProvidesSource(int Source) const { int type = Source & cSource::st_Mask; @@ -649,42 +667,18 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) // Turn off live PIDs if necessary: - if (TurnOffLivePIDs) { - - // Avoid noise while switching: - - CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); - CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); - CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); - CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER)); - - // Turn off live PIDs: - - DelPid(pidHandles[ptAudio].pid); - DelPid(pidHandles[ptVideo].pid); - DelPid(pidHandles[ptPcr].pid); - DelPid(pidHandles[ptTeletext].pid); - DelPid(pidHandles[ptDolby].pid); - } + if (TurnOffLivePIDs) + TurnOffLiveMode(); dvbTuner->Set(Channel, DoTune); - if (DoTune) { - /*XXX do we still need this??? - if (!(status & FE_HAS_LOCK)) { - esyslog("ERROR: channel %d not locked on DVB card %d!", Channel->Number(), CardIndex() + 1); - if (LiveView && IsPrimaryDevice()) - cThread::RaisePanic(); - return false; - } - XXX*/ - } // PID settings: if (TurnOnLivePIDs) { aPid1 = Channel->Apid1(); aPid2 = Channel->Apid2(); - if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(Channel->Apid1(), ptAudio) && AddPid(Channel->Vpid(), ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached) + int pPid = Channel->Ppid() ? Channel->Ppid() : Channel->Vpid(); + if (!(AddPid(pPid, ptPcr) && AddPid(Channel->Apid1(), ptAudio) && AddPid(Channel->Vpid(), ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached) esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1); return false; } @@ -782,6 +776,9 @@ bool cDvbDevice::SetPlayMode(ePlayMode PlayMode) siProcessor->SetStatus(true); break; case pmAudioVideo: + if (playMode == pmNone) + TurnOffLiveMode(); + // continue with next... case pmAudioOnlyBlack: if (siProcessor) siProcessor->SetStatus(false); diff --git a/dvbdevice.h b/dvbdevice.h index 335a694..6bcbc72 100644 --- a/dvbdevice.h +++ b/dvbdevice.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbdevice.h 1.20 2002/12/15 14:45:29 kls Exp $ + * $Id: dvbdevice.h 1.21 2003/05/02 12:21:51 kls Exp $ */ #ifndef __DVBDEVICE_H @@ -59,6 +59,7 @@ public: private: cDvbTuner *dvbTuner; + void TurnOffLiveMode(void); public: virtual bool ProvidesSource(int Source) const; virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const; diff --git a/i18n.c b/i18n.c index efeb869..734e015 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.106 2003/04/21 14:05:17 kls Exp $ + * $Id: i18n.c 1.107 2003/05/01 14:10:18 kls Exp $ * * Translations provided by: * @@ -12,7 +12,7 @@ * Italian Alberto Carraro * Dutch Arnold Niessen * Portuguese Paulo Lopes - * French Jean-Claude Repetto + * French Jean-Claude Repetto and Olivier Jacques * Norwegian Jørgen Tvedt and Truls Slevigen * Finnish Hannu Savolainen and Jaakko Hyvätti * Polish Michael Rakowski @@ -1940,7 +1940,7 @@ const tI18nPhrase Phrases[] = { "Scrolla pagina nel menu", "Scrollen per pagina", "Scroll da página no menu", - "Affichage progr. suivant", + "Scrolling par pages", "Rask rulling i menyer", "Valikkojen rullaus", "Przesuwac stronami", @@ -1988,7 +1988,7 @@ const tI18nPhrase Phrases[] = { "Timeout EPG (h)", "EPG-scan Timeout (h)", "Expirou o EPG (h)", - "Temps maxi EPG (h)", + "Inactivité avant rech. EPG (h)", "Ledig tid før EPG-søk (h)", "Ohjelmatied. odotusaika (h)", "Czas do skanu EPG (h)", @@ -2228,7 +2228,7 @@ const tI18nPhrase Phrases[] = { "Durata predefinita (d)", "Standaard levensduur (d)", "Validade por defeito (d)", - "Durée de vie par défaut (d)", + "Durée de vie par défaut (j)", "Normal levetid timer (d)", "Oletus voimassaoloaika (d)", "Pierwotna trwalosc (d)", @@ -2260,7 +2260,7 @@ const tI18nPhrase Phrases[] = { "Marca la registrazione", "Direkte opnamen markeren", "Marca de gravação rápida", - "Enregistrement immédiat", + "Marquage enregistr. immédiats", "Markere direkteopptak", "Merkitse välitön nauh.", "Zaznaczyc natychm. nagranie", @@ -2292,7 +2292,7 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO - "",//TODO + "Durée enregistr. immédiat (min)", "",//TODO "Pikanauhoituksen pituus (min)", "",//TODO @@ -2404,7 +2404,7 @@ const tI18nPhrase Phrases[] = { "Tempo minimo di pausa (min)", // ??? i don't know... "Minimale event time-out (min)", "Período mínimo de pausa (min)", - "MinEventTimeout (min)", // Too difficult to translate - read the manual! + "MinEventTimeout (min)", "Minste hendelsespause (min)", "Minimi tapahtuman odotus (min)", "Min. czas do nast. akcji (Event) (min)", @@ -2420,7 +2420,7 @@ const tI18nPhrase Phrases[] = { "Tempo minimo di inattivita' (min)", "Minimum gebruikers inactiviteit (min)", "Período mínimo de inactividade (min)", - "Durée minimale d'inactivité (min)", + "Durée minimale d'inact. (min)", "Minimumstid med inaktivitet (min)", "Minimi käyttäjän odotus (min)", "Min. brak aktywnosci uzytkownika (min)", @@ -2486,7 +2486,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + " aàbcçdeéèêfghiîjklmnoôpqrstuùûvxyz0123456789-.#~", "",// TODO " abcdefghijklmnopqrstuvxyzåäö0123456789-.#~", "",// TODO @@ -2679,7 +2679,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "('Menu' pour passer cette touche)", "",// TODO "(Paina 'Valikko' jos näppäintä ei ole)", "",// TODO @@ -2904,7 +2904,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Lecture", "",// TODO "",// TODO "",// TODO @@ -2920,7 +2920,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Pause", "",// TODO "",// TODO "",// TODO @@ -2935,7 +2935,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Stop", "",// TODO "",// TODO "",// TODO @@ -2952,7 +2952,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Enregistrement", "",// TODO "",// TODO "",// TODO @@ -2968,7 +2968,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Avance rapide", "",// TODO "",// TODO "",// TODO @@ -2984,7 +2984,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Retour rapide", "",// TODO "",// TODO "",// TODO @@ -3016,7 +3016,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Chaîne+", "",// TODO "",// TODO "",// TODO @@ -3032,7 +3032,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Chaîne-", "",// TODO "",// TODO "",// TODO @@ -3145,7 +3145,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "aucun", "",// TODO "",// TODO "",// TODO @@ -3161,7 +3161,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "auto", "",// TODO "",// TODO "",// TODO @@ -3417,7 +3417,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Pause de l'émission en direct...", "",// TODO "",// TODO "",// TODO @@ -3433,7 +3433,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Ce plugin n'a pas de paramètres !", "",// TODO "Tällä laajennoksella ei ole asetuksia!", "",// TODO diff --git a/menu.c b/menu.c index 341480a..7fc2f36 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.240 2003/04/27 12:50:31 kls Exp $ + * $Id: menu.c 1.241 2003/05/03 15:59:07 kls Exp $ */ #include "menu.h" @@ -2489,7 +2489,7 @@ void cMenuMain::Set(const char *Plugin) // Color buttons: - SetHelp(tr("Record"), cDevice::PrimaryDevice()->NumAudioTracks() > 1 ? tr("Language") : NULL, replaying ? NULL : tr("Pause"), replaying ? tr("Button$Stop") : cReplayControl::LastReplayed() ? tr("Resume") : NULL); + SetHelp(!replaying ? tr("Record") : NULL, cDevice::PrimaryDevice()->NumAudioTracks() > 1 ? tr("Language") : NULL, replaying ? NULL : tr("Pause"), replaying ? tr("Button$Stop") : cReplayControl::LastReplayed() ? tr("Resume") : NULL); Display(); lastActivity = time(NULL); } @@ -2547,7 +2547,7 @@ eOSState cMenuMain::ProcessKey(eKeys Key) default: switch (Key) { case kRecord: case kRed: if (!HadSubMenu) - state = osRecord; + state = replaying ? osContinue : osRecord; break; case kGreen: if (!HadSubMenu) { int CurrentAudioTrack = -1; @@ -2564,7 +2564,7 @@ eOSState cMenuMain::ProcessKey(eKeys Key) } break; case kYellow: if (!HadSubMenu) - state = osPause; + state = replaying ? osContinue : osPause; break; case kBlue: if (!HadSubMenu) state = replaying ? osStopReplay : cReplayControl::LastReplayed() ? osReplay : osContinue; diff --git a/osd.c b/osd.c index d048f5c..9d8b72d 100644 --- a/osd.c +++ b/osd.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osd.c 1.40 2003/03/23 15:41:54 kls Exp $ + * $Id: osd.c 1.42 2003/05/03 14:46:38 kls Exp $ */ #include "osd.h" @@ -423,6 +423,11 @@ void cOsdMenu::Display(void) Interface->Help(helpRed, helpGreen, helpYellow, helpBlue); int count = Count(); if (count > 0) { + for (int i = 0; i < count; i++) { + cOsdItem *item = Get(i); + if (item) + cStatus::MsgOsdItem(item->Text(), i); + } if (current < 0) current = 0; // just for safety - there HAS to be a current item! int n = 0; @@ -578,7 +583,8 @@ eOSState cOsdMenu::HotKey(eKeys Key) if (s && (s = skipspace(s)) != NULL) { if (*s == Key - k1 + '1') { current = item->Index(); - return ProcessKey(kOk); + cRemote::Put(kOk, true); + break; } } } diff --git a/rcu.c b/rcu.c index 5c76a35..dae9b2a 100644 --- a/rcu.c +++ b/rcu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: rcu.c 1.4 2003/04/12 14:37:13 kls Exp $ + * $Id: rcu.c 1.5 2003/05/02 14:42:40 kls Exp $ */ #include "rcu.h" @@ -315,7 +315,7 @@ void cRcuRemote::ChannelSwitch(const cDevice *Device, int ChannelNumber) { if (ChannelNumber && Device->IsPrimaryDevice()) { LOCK_THREAD; - numberToSend = ChannelNumber; + numberToSend = cDevice::CurrentChannel(); } } diff --git a/recording.c b/recording.c index 261bee8..23521a6 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.c 1.75 2003/04/12 09:51:44 kls Exp $ + * $Id: recording.c 1.76 2003/04/27 15:52:17 kls Exp $ */ #include "recording.h" @@ -78,7 +78,7 @@ void RemoveDeletedRecordings(void) r0 = r; r = Recordings.Next(r); } - if (r0 && time(NULL) - r0->start > DELETEDLIFETIME * 60) { + if (r0 && time(NULL) - r0->start > DELETEDLIFETIME * 3600) { r0->Remove(); RemoveEmptyVideoDirectories(); LastRemoveCheck += REMOVELATENCY; diff --git a/remote.c b/remote.c index 29149e9..1b73d16 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.36 2002/12/15 15:58:59 kls Exp $ + * $Id: remote.c 1.38 2003/05/02 10:49:50 kls Exp $ */ #include "remote.h" @@ -58,7 +58,7 @@ void cRemote::Clear(void) } } -bool cRemote::Put(eKeys Key) +bool cRemote::Put(eKeys Key, bool AtFront) { if (Key != kNone) { cMutexLock MutexLock(&mutex); @@ -68,9 +68,16 @@ bool cRemote::Put(eKeys Key) if (d <= 0) d = MaxKeys + d; if (d - 1 > 0) { - keys[in] = Key; - if (++in >= MaxKeys) - in = 0; + if (AtFront) { + if (--out < 0) + out = MaxKeys - 1; + keys[out] = Key; + } + else { + keys[in] = Key; + if (++in >= MaxKeys) + in = 0; + } keyPressed.Broadcast(); return true; } @@ -123,6 +130,11 @@ bool cRemote::Put(const char *Code, bool Repeat, bool Release) return false; } +bool cRemote::HasKeys(void) +{ + return in != out && !(keys[out] & k_Repeat); +} + eKeys cRemote::Get(int WaitMs, char **UnknownCode) { for (;;) { diff --git a/remote.h b/remote.h index 9ff9566..64a2097 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.26 2003/04/27 12:05:48 kls Exp $ + * $Id: remote.h 1.28 2003/05/02 10:41:35 kls Exp $ */ #ifndef __REMOTE_H @@ -42,10 +42,10 @@ public: const char *Name(void) { return name; } static void SetLearning(cRemote *Learning) { learning = Learning; } static void Clear(void); - static bool Put(eKeys Key); + static bool Put(eKeys Key, bool AtFront = false); static bool PutMacro(eKeys Key); static const char *GetPlugin(void) { return plugin; } - static bool HasKeys(void) { return in != out; } + static bool HasKeys(void); static eKeys Get(int WaitMs = 1000, char **UnknownCode = NULL); }; diff --git a/status.c b/status.c index 0bc4dd8..3dbe854 100644 --- a/status.c +++ b/status.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: status.c 1.4 2002/07/13 10:49:34 kls Exp $ + * $Id: status.c 1.5 2003/05/03 14:47:44 kls Exp $ */ #include "status.h" @@ -71,6 +71,12 @@ void cStatus::MsgOsdHelpKeys(const char *Red, const char *Green, const char *Yel sm->OsdHelpKeys(Red, Green, Yellow, Blue); } +void cStatus::MsgOsdItem(const char *Text, int Index) +{ + for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) + sm->OsdItem(Text, Index); +} + void cStatus::MsgOsdCurrentItem(const char *Text) { for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) diff --git a/status.h b/status.h index 8041f8c..de0d925 100644 --- a/status.h +++ b/status.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: status.h 1.5 2002/07/14 10:54:39 kls Exp $ + * $Id: status.h 1.6 2003/05/03 14:43:18 kls Exp $ */ #ifndef __STATUS_H @@ -45,6 +45,8 @@ protected: // If Message is NULL, the status line has been cleared. virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue) {} // The help keys have been set to the given values (may be NULL). + virtual void OsdItem(const char *Text, int Index) {} + // The OSD displays the given single line Text as menu item at Index. virtual void OsdCurrentItem(const char *Text) {} // The OSD displays the given single line Text as the current menu item. virtual void OsdTextItem(const char *Text, bool Scroll) {} @@ -69,6 +71,7 @@ public: static void MsgOsdTitle(const char *Title); static void MsgOsdStatusMessage(const char *Message); static void MsgOsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue); + static void MsgOsdItem(const char *Text, int Index); static void MsgOsdCurrentItem(const char *Text); static void MsgOsdTextItem(const char *Text, bool Scroll = false); static void MsgOsdChannel(const char *Text); diff --git a/thread.c b/thread.c index e52771d..07c8f79 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.23 2002/11/03 11:00:03 kls Exp $ + * $Id: thread.c 1.24 2003/05/03 14:03:32 kls Exp $ */ #include "thread.h" @@ -114,8 +114,6 @@ void cMutex::Unlock(void) // The signal handler is necessary to be able to use SIGIO to wake up any // pending 'select()' call. -time_t cThread::lastPanic = 0; -int cThread::panicLevel = 0; bool cThread::signalHandlerInstalled = false; bool cThread::emergencyExitRequested = false; @@ -191,25 +189,6 @@ void cThread::WakeUp(void) kill(parentPid, SIGIO); // makes any waiting 'select()' call return immediately } -#define MAXPANICLEVEL 10 - -void cThread::RaisePanic(void) -{ - if (lastPanic > 0) { - if (time(NULL) - lastPanic < 5) - panicLevel++; - else if (panicLevel > 0) - panicLevel--; - } - lastPanic = time(NULL); - if (panicLevel > MAXPANICLEVEL) { - esyslog("ERROR: max. panic level exceeded"); - EmergencyExit(true); - } - else - dsyslog("panic level: %d", panicLevel); -} - bool cThread::EmergencyExit(bool Request) { if (!Request) diff --git a/thread.h b/thread.h index 9fc48b6..0599742 100644 --- a/thread.h +++ b/thread.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.h 1.14 2002/08/15 11:40:06 kls Exp $ + * $Id: thread.h 1.15 2003/05/03 14:03:36 kls Exp $ */ #ifndef __THREAD_H @@ -48,8 +48,6 @@ private: cMutex mutex; pid_t parentPid, threadPid; bool running; - static time_t lastPanic; - static int panicLevel; static bool emergencyExitRequested; static bool signalHandlerInstalled; static void SignalHandler(int signum); @@ -65,7 +63,6 @@ public: virtual ~cThread(); bool Start(void); bool Active(void); - static void RaisePanic(void); static bool EmergencyExit(bool Request = false); }; diff --git a/vdr.1 b/vdr.1 index a1ad9b1..86af51c 100644 --- a/vdr.1 +++ b/vdr.1 @@ -8,9 +8,9 @@ .\" License as specified in the file COPYING that comes with the .\" vdr distribution. .\" -.\" $Id: vdr.1 1.6 2002/11/24 16:36:37 kls Exp $ +.\" $Id: vdr.1 1.7 2003/05/03 16:16:05 kls Exp $ .\" -.TH vdr 1 "24 Nov 2002" "1.1.0" "Video Disk Recorder" +.TH vdr 1 "3 May 2003" "1.1.30" "Video Disk Recorder" .SH NAME vdr - the Video Disk Recorder .SH SYNOPSIS @@ -94,7 +94,12 @@ in quotes, like for example \fBvdr -P "abc -a -b xyz"\fR which would load a plugin named \fBabc\fR, giving it the command line options -\fB-a\ -b\ xyz\fR. +\fB-a\ -b\ xyz\fR. If you want to load all available plugins (without any +particular options) you can use + +\fBvdr -P "*"\fR + +(note the quotes around the asterisk to prevent wildcard expansion). .TP .BI -r\ cmd ,\ --record= cmd Call \fIcmd\fR before and after a recording. diff --git a/vdr.c b/vdr.c index a160e4c..ae4edd5 100644 --- a/vdr.c +++ b/vdr.c @@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/people/kls/vdr * - * $Id: vdr.c 1.150 2003/04/21 14:41:41 kls Exp $ + * $Id: vdr.c 1.152 2003/05/03 13:39:57 kls Exp $ */ #include @@ -53,6 +53,7 @@ #include "tools.h" #include "videodir.h" +#define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings #define ACTIVITYTIMEOUT 60 // seconds before starting housekeeping #define SHUTDOWNWAIT 300 // seconds to wait in user prompt before automatic shutdown #define MANUALSTART 600 // seconds the next timer must be in the future to assume manual start @@ -460,9 +461,14 @@ int main(int argc, char *argv[]) } // Attach launched player control: cControl::Attach(); - // Make sure Transfer-Mode is re-started after detaching a player: - if (cDevice::PrimaryDevice()->PlayerDetached() && !cDevice::PrimaryDevice()->Replaying()) - Channels.SwitchTo(cDevice::CurrentChannel()); + // Make sure we have a visible programme in case device usage has changed: + if (!cDevice::PrimaryDevice()->HasProgramme()) { + static time_t lastTime = 0; + if (time(NULL) - lastTime > MINCHANNELWAIT) { + if (!Channels.SwitchTo(cDevice::CurrentChannel())) + lastTime = time(NULL); // don't do this too often + } + } // Restart the Watchdog timer: if (WatchdogTimeout > 0) { int LatencyTime = WatchdogTimeout - alarm(WatchdogTimeout); @@ -503,6 +509,7 @@ int main(int argc, char *argv[]) switch (key) { // Menu control: case kMenu: + key = kNone; // nobody else needs to see this key if (Menu) { DELETENULL(Menu); if (!Temp) @@ -518,14 +525,15 @@ int main(int argc, char *argv[]) if (cControl::Control())\ cControl::Control()->Hide();\ Menu = new cMenuMain(cControl::Control(), function);\ - Temp = NULL; + Temp = NULL;\ + key = kNone; // nobody else needs to see this key case kSchedule: DirectMainFunction(osSchedule); break; case kChannels: DirectMainFunction(osChannels); break; case kTimers: DirectMainFunction(osTimers); break; case kRecordings: DirectMainFunction(osRecordings); break; case kSetup: DirectMainFunction(osSetup); break; case kCommands: DirectMainFunction(osCommands); break; - case kUser1 ... kUser9: cRemote::PutMacro(key); break; + case kUser1 ... kUser9: cRemote::PutMacro(key); key = kNone; break; case k_Plugin: DirectMainFunction(osPlugin, cRemote::GetPlugin()); break; // Channel up/down: case kChanUp|k_Repeat: -- cgit v1.2.3