mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Original announce message:
VDR developer version 1.7.25 is now available at
ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.25.tar.bz2
A 'diff' against the previous version is available at
ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.24-1.7.25.diff
MD5 checksums:
a3fd482a3dd8027706d4f32a88c6bd13 vdr-1.7.25.tar.bz2
f34adcdc0cdab378431d8946872d6b59 vdr-1.7.24-1.7.25.diff
WARNING:
========
This is a developer version. Even though I use it in my productive
environment. I strongly recommend that you only use it under controlled
conditions and for testing and debugging.
From the HISTORY file:
- The fps value for channels where it differs from the default is now set correctly
when pausing live video.
- Increased the average character estimate for calculating tab positions in skins,
to better suit wide fonts (reported by Rudi Hofer).
- Fixed getting the subsystem ids of DVB devices in case they have been rearranged
via udev rules.
- Added several cTimer::Set...() functions (suggested by Alexander Rieger).
- Changed the return value of cTimer::SetFile() to 'void'.
- Revoked "Fixed a possible deadlock in time shift mode" because it caused trouble with
output on vdr-xine and dxr3, and also short glitches when replaying on any output
device.
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed handling subtitle color palettes on channels where subtitles appear
"word by word" (thanks to Rolf Ahrenberg).
- Fixed upscaling cBitmaps with anti-aliasing (thanks to Rolf Ahrenberg for reporting
a problem with color palettes in subtitles).
- Fixed getting the video aspect ratio for scaling subtitles.
- Removed the "PrimaryLimit". Old "full featured" DVB cards can be run with the
--outputonly option to avoid problems with recording high bandwidth channels.
Besides, with HDTV becoming ever more popular those cards are pretty much obsolete
by now (the TT S2-6400 has no problems recording and replaying high bandwidth
channels simultaneously). And, last but not least, people using software players
won't notice this change, anyway.
- Since cReceivers can have priorities between -99 and 99, the priority
for an unused device has been changed from -1 to -100.
- If the first event in a schedule has a table id of 0x00, any incoming EIT data for
that schedule from the DVB stream will be completely ignored. This way an external
EPG source can fill the schedules with EPG data that will not be messed up with
that from the DVB data stream. Note, though, that this means VDR can not do VPS
controlled recordings with such events!
- Added some typecasts to silence gcc compiler warnings (thanks to Rolf Ahrenberg).
- Fixed handling overlapping timers in case a VPS timer with higher priority needs
to interrupt a timer with lower priority.
- The code for the RCU remote control unit has been moved into a separate plugin
named "rcu".
The REMOTE=RCU option in the 'make' call for VDR is now obsolete.
The command line option --rcu is now obsolete. Use -Prcu instead. If you have
used --rcu with a device path, use -P"rcu -d<device>".
- Added support for automatically selecting subtitles when playing old PES
recordings made with the subtitles plugin (thanks to Anssi Hannula).
- Revised priority handling to allow receivers with a priority that is lower than
that of live viewing (with suggestions from Frank Schmirler):
+ An idle device (one that is not used for live viewing and has no receiver
attached to it) now has priority IDLEPRIORITY (-100).
+ An unused CAM slot now has priority IDLEPRIORITY.
+ The default priority of a cReceiver is now MINPRIORITY (-99).
+ A device that is used only for live viewing (no matter whether it's in Transfer
Mode or real live mode) now has priority TRANSFERPRIORITY (-1).
+ The function cDevice::Receiving() now returns true if there is any receiver
attached to the device. Its boolean parameter has no meaning any more.
+ The default value for the Priority parameter of the function cDevice::ProvidesChannel()
has been changed to IDLEPRIORITY.
- Added a Query parameter to cDevice::GetDevice(), so that devices can be queried
without side effects when zapping.
- Replaced min(max()) calls with the new function constrain().
- Fixed handling OSD color button texts in case a menu item has texts of its own
(reported by Rolf Ahrenberg). If a plugin creates derived cMenuEditItems that set
color button texts, these should not set the texts directly by calling
cSkinDisplay::Current()->SetButtons(), but rather call the new member function
cMenuEditItem::SetHelp().
- Moved the call to cStatus::MsgChannelSwitch(this, 0) to the beginning of
cDevice::SetChannel(), so that any receivers that have been attached to the
device by plugins may be detached before the final call to GetDevice().
This actually reverts "Only calling cStatus::MsgChannelSwitch() if a channel
is actually going to be switched or has actually been switched successfully"
which was made in version 1.1.10, so please report if this has any unwanted
side effects.
139 lines
4.7 KiB
C++
139 lines
4.7 KiB
C++
/*
|
|
* timers.h: Timer handling
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* $Id: timers.h 2.3 2012/02/20 15:52:57 kls Exp $
|
|
*/
|
|
|
|
#ifndef __TIMERS_H
|
|
#define __TIMERS_H
|
|
|
|
#include "channels.h"
|
|
#include "config.h"
|
|
#include "epg.h"
|
|
#include "tools.h"
|
|
|
|
enum eTimerFlags { tfNone = 0x0000,
|
|
tfActive = 0x0001,
|
|
tfInstant = 0x0002,
|
|
tfVps = 0x0004,
|
|
tfRecording = 0x0008,
|
|
tfAll = 0xFFFF,
|
|
};
|
|
enum eTimerMatch { tmNone, tmPartial, tmFull };
|
|
|
|
class cTimer : public cListObject {
|
|
friend class cMenuEditTimer;
|
|
private:
|
|
mutable time_t startTime, stopTime;
|
|
time_t lastSetEvent;
|
|
mutable time_t deferred; ///< Matches(time_t, ...) will return false if the current time is before this value
|
|
bool recording, pending, inVpsMargin;
|
|
uint flags;
|
|
cChannel *channel;
|
|
mutable time_t day; ///< midnight of the day this timer shall hit, or of the first day it shall hit in case of a repeating timer
|
|
int weekdays; ///< bitmask, lowest bits: SSFTWTM (the 'M' is the LSB)
|
|
int start;
|
|
int stop;
|
|
int priority;
|
|
int lifetime;
|
|
mutable char file[MaxFileName];
|
|
char *aux;
|
|
const cEvent *event;
|
|
public:
|
|
cTimer(bool Instant = false, bool Pause = false, cChannel *Channel = NULL);
|
|
cTimer(const cEvent *Event);
|
|
cTimer(const cTimer &Timer);
|
|
virtual ~cTimer();
|
|
cTimer& operator= (const cTimer &Timer);
|
|
virtual int Compare(const cListObject &ListObject) const;
|
|
bool Recording(void) const { return recording; }
|
|
bool Pending(void) const { return pending; }
|
|
bool InVpsMargin(void) const { return inVpsMargin; }
|
|
uint Flags(void) const { return flags; }
|
|
const cChannel *Channel(void) const { return channel; }
|
|
time_t Day(void) const { return day; }
|
|
int WeekDays(void) const { return weekdays; }
|
|
int Start(void) const { return start; }
|
|
int Stop(void) const { return stop; }
|
|
int Priority(void) const { return priority; }
|
|
int Lifetime(void) const { return lifetime; }
|
|
const char *File(void) const { return file; }
|
|
time_t FirstDay(void) const { return weekdays ? day : 0; }
|
|
const char *Aux(void) const { return aux; }
|
|
time_t Deferred(void) const { return deferred; }
|
|
cString ToText(bool UseChannelID = false) const;
|
|
cString ToDescr(void) const;
|
|
const cEvent *Event(void) const { return event; }
|
|
bool Parse(const char *s);
|
|
bool Save(FILE *f);
|
|
bool IsSingleEvent(void) const;
|
|
static int GetMDay(time_t t);
|
|
static int GetWDay(time_t t);
|
|
bool DayMatches(time_t t) const;
|
|
static time_t IncDay(time_t t, int Days);
|
|
static time_t SetTime(time_t t, int SecondsFromMidnight);
|
|
void SetFile(const char *File);
|
|
bool Matches(time_t t = 0, bool Directly = false, int Margin = 0) const;
|
|
int Matches(const cEvent *Event, int *Overlap = NULL) const;
|
|
bool Expired(void) const;
|
|
time_t StartTime(void) const;
|
|
time_t StopTime(void) const;
|
|
void SetEventFromSchedule(const cSchedules *Schedules = NULL);
|
|
void SetEvent(const cEvent *Event);
|
|
void SetRecording(bool Recording);
|
|
void SetPending(bool Pending);
|
|
void SetInVpsMargin(bool InVpsMargin);
|
|
void SetDay(time_t Day);
|
|
void SetWeekDays(int WeekDays);
|
|
void SetStart(int Start);
|
|
void SetStop(int Stop);
|
|
void SetPriority(int Priority);
|
|
void SetLifetime(int Lifetime);
|
|
void SetAux(const char *Aux);
|
|
void SetDeferred(int Seconds);
|
|
void SetFlags(uint Flags);
|
|
void ClrFlags(uint Flags);
|
|
void InvFlags(uint Flags);
|
|
bool HasFlags(uint Flags) const;
|
|
void Skip(void);
|
|
void OnOff(void);
|
|
cString PrintFirstDay(void) const;
|
|
static int TimeToInt(int t);
|
|
static bool ParseDay(const char *s, time_t &Day, int &WeekDays);
|
|
static cString PrintDay(time_t Day, int WeekDays, bool SingleByteChars);
|
|
};
|
|
|
|
class cTimers : public cConfig<cTimer> {
|
|
private:
|
|
int state;
|
|
int beingEdited;
|
|
time_t lastSetEvents;
|
|
time_t lastDeleteExpired;
|
|
public:
|
|
cTimers(void);
|
|
cTimer *GetTimer(cTimer *Timer);
|
|
cTimer *GetMatch(time_t t);
|
|
cTimer *GetMatch(const cEvent *Event, int *Match = NULL);
|
|
cTimer *GetNextActiveTimer(void);
|
|
int BeingEdited(void) { return beingEdited; }
|
|
void IncBeingEdited(void) { beingEdited++; }
|
|
void DecBeingEdited(void) { if (!--beingEdited) lastSetEvents = 0; }
|
|
void SetModified(void);
|
|
bool Modified(int &State);
|
|
///< Returns true if any of the timers have been modified, which
|
|
///< is detected by State being different than the internal state.
|
|
///< Upon return the internal state will be stored in State.
|
|
void SetEvents(void);
|
|
void DeleteExpired(void);
|
|
void Add(cTimer *Timer, cTimer *After = NULL);
|
|
void Ins(cTimer *Timer, cTimer *Before = NULL);
|
|
void Del(cTimer *Timer, bool DeleteObject = true);
|
|
};
|
|
|
|
extern cTimers Timers;
|
|
|
|
#endif //__TIMERS_H
|