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.
This commit is contained in:
Klaus Schmidinger 2003-05-04 18:00:00 +02:00
parent 0686038af3
commit af2a135212
21 changed files with 210 additions and 152 deletions

View File

@ -460,6 +460,8 @@ Oliver Endriss <o.endriss@gmx.de>
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 <rw.buchner@freenet.de>
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 <dennis.noordsij@wiral.com>
for reporting a small glitch when switching channels
@ -551,7 +554,7 @@ Walter Stroebel <walter.stroebel@lifeline.nl>
Paul Gohn <pgohn@nexgo.de>
for adding 'Hrvatska radiotelevizija' and 'RTV Slovenija' to ca.conf
Teemu Rantanen <teemu.rantanen@tekla.com>
Teemu Rantanen <tvr@iki.fi>
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 <christian.jacobsen@stageholding.de>
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
Olivier Jacques <jacquesolivier@hotmail.com>)
for translating OSD texts to the French language
Kai Moeller <moeller.ki@gmx.de>
for reporting a double call to MainMenuAction() of a plugin if invoked via a hotkey
Carsten Siebholz <c.siebholz@t-online.de>
for adding cStatus::OsdItem() to provide the entire list of menu items to a plugin

24
HISTORY
View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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();
}
}

View File

@ -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

View File

@ -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);

View File

@ -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;

46
i18n.c
View File

@ -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 <bertocar@tin.it>
* Dutch Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>
* Portuguese Paulo Lopes <pmml@netvita.pt>
* French Jean-Claude Repetto <jc@repetto.org>
* French Jean-Claude Repetto <jc@repetto.org> and Olivier Jacques <jacquesolivier@hotmail.com>
* Norwegian Jørgen Tvedt <pjtvedt@online.no> and Truls Slevigen <truls@slevigen.no>
* Finnish Hannu Savolainen <hannu@opensound.com> and Jaakko Hyvätti <jaakko@hyvatti.iki.fi>
* Polish Michael Rakowski <mrak@gmx.de>
@ -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

8
menu.c
View File

@ -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;

10
osd.c
View File

@ -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;
}
}
}

4
rcu.c
View File

@ -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();
}
}

View File

@ -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;

View File

@ -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 (;;) {

View File

@ -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);
};

View File

@ -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))

View File

@ -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);

View File

@ -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)

View File

@ -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);
};

11
vdr.1
View File

@ -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.

20
vdr.c
View File

@ -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 <getopt.h>
@ -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: