mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a7728f9db7 | ||
|
4e7ef3214f | ||
|
6a4004a8a2 | ||
|
1045069fee | ||
|
cca9d858a7 | ||
|
7b634a092c | ||
|
25e05054a6 | ||
|
578cfe64a8 | ||
|
746a9f88e7 | ||
|
fb74e0feeb | ||
|
cb1498a609 | ||
|
ddce16326c | ||
|
c8d77e241f | ||
|
965b3471b7 | ||
|
0f75df5452 | ||
|
c37fb11a08 | ||
|
c169e20141 | ||
|
c3a3b70fa0 | ||
|
fc03e021bb | ||
|
6e6e468148 | ||
|
1f0a55ca7d | ||
|
917331767b | ||
|
0161639e93 | ||
|
77da7bb20c | ||
|
acdfbb5aad | ||
|
cd53d57779 | ||
|
0d14872adc | ||
|
90f4648a7c | ||
|
be88699b00 | ||
|
1b1fe2c887 | ||
|
fa77b5c2b2 | ||
|
cffde6ee09 | ||
|
2266b0e633 | ||
|
06f7c2d414 | ||
|
1b1dc6d775 | ||
|
e5971d2684 | ||
|
ae208771e8 | ||
|
df4ea10419 |
54
CONTRIBUTORS
54
CONTRIBUTORS
@ -618,6 +618,8 @@ Helmut Auer <vdr@helmutauer.de>
|
||||
for suggesting to read the epg.data file in a separate thread
|
||||
for some improvements to allowing the parameters PATH and NAME to the --dirnames
|
||||
command line option to be left empty to use the default values if only ENC shall be set
|
||||
for reporting an inconsistent behavior between opening the Recordings menu manually
|
||||
via the main menu and by pressing the Recordings key
|
||||
|
||||
Jeremy Hall <jhall@UU.NET>
|
||||
for fixing an incomplete initialization of the filter parameters in eit.c
|
||||
@ -700,6 +702,8 @@ Oliver Endriss <o.endriss@gmx.de>
|
||||
for helping to debug a problem with reduced number of retries in Transfer Mode on
|
||||
SD-FF cards
|
||||
for reporting a problem with resuming replay of PES recordings
|
||||
for suggesting to make all bonded devices (except for the master) turn off their LNB
|
||||
power completely to avoid problems when receiving vertically polarized transponders
|
||||
|
||||
Reinhard Walter Buchner <rw.buchner@freenet.de>
|
||||
for adding some satellites to 'sources.conf'
|
||||
@ -1013,9 +1017,11 @@ Andreas Mair <amair.sob@googlemail.com>
|
||||
for fixing the type of MBperMinute in cVideoDiskUsage::HasChanged()
|
||||
for reporting a bug in sorting recordings in case two folders have the same name,
|
||||
but one of them ends in an additional digit, as in "abc" and "abc2"
|
||||
for reporting multiple occurrences of the same directory in the recordings list ini
|
||||
for reporting multiple occurrences of the same directory in the recordings list in
|
||||
case there are directories that only differ in non-alphanumeric characters
|
||||
for reporting a problem with reduced number of retries in Transfer Mode on SD-FF cards
|
||||
for fixing multiple occurrences of the same directory in the recordings list in case
|
||||
there are directories that only differ in non-alphanumeric characters
|
||||
|
||||
Olivier Jacques <jacquesolivier@hotmail.com>)
|
||||
for translating OSD texts to the French language
|
||||
@ -2015,6 +2021,8 @@ Ville Skytt
|
||||
be escaped
|
||||
for changing the template for PLGCFG to $(CONFDIR)/plugins.mk
|
||||
for updating the help and man page entry about the location of the epg.data file
|
||||
for reporting a possible crash when shutting down VDR while subtitles are being
|
||||
displayed
|
||||
|
||||
Steffen Beyer <cpunk@reactor.de>
|
||||
for fixing setting the colored button help after deleting a recording in case the next
|
||||
@ -2100,6 +2108,7 @@ Thomas G
|
||||
for suggesting to make the 'Allowed' parameter in cMenuEditStrItem() NULL by default,
|
||||
which results in using tr(FileNameChars)
|
||||
for fixing handling "none" color entries in XPM files
|
||||
for fixing displaying the frame number when setting an editing mark
|
||||
|
||||
David Woodhouse <dwmw2@infradead.org>
|
||||
for his help in replacing the get/put_unaligned() macros from asm/unaligned.h with
|
||||
@ -2127,6 +2136,9 @@ Marko M
|
||||
pressed in string input fields
|
||||
for fixing missing ',' in the Italian and Polish OSD texts
|
||||
for pointing out that "Menu button closes" should actually be "Menu key closes"
|
||||
for fixing a missing initialization in the c'tor of cSkinLCARSDisplayChannel
|
||||
for reporting some uninitialized item area coordinates in cSkinLCARSDisplayMenu
|
||||
for reporting a problem with the video directory not being set correctly with --edit
|
||||
|
||||
Patrick Rother <krd-vdr@gulu.net>
|
||||
for reporting a bug in defining timers that only differ in the day of week
|
||||
@ -2537,6 +2549,8 @@ Ulf Kiener <webmaster@ulf-kiener.de>
|
||||
for suggesting to add user defined key kUser0
|
||||
for suggesting to perform absolute jumps when replaying a recording (via the Red key)
|
||||
only if an actual value has been entered
|
||||
for suggesting to make the Yellow button in the main menu not act as "Pause" if
|
||||
"Pause key handling" is set to "do not pause live video"
|
||||
|
||||
Jörg Wendel <vdr-ml@jwendel.de>
|
||||
for reporting that cPlugin::Active() was called too often
|
||||
@ -2598,6 +2612,8 @@ Halim Sahin <halim.sahin@t-online.de>
|
||||
for suggesting to make the "Source" item in the "Edit channel" menu wrap around the
|
||||
list of sources
|
||||
for reporting a crash when creating a new channel if the channel list is empty
|
||||
for reporting that editing marks were generated even if the edited recording resulted
|
||||
in just one single sequence
|
||||
|
||||
Denis Knauf <denis.knauf@gmail.com>
|
||||
for reporting a missing '-' at the next to last line of SVDRP help texts
|
||||
@ -2832,6 +2848,13 @@ Lars Hanisch <dvb@flensrocker.de>
|
||||
for fixing a typo in skins.h
|
||||
for fixing some #include statements in plugins to use <vdr/...> instead of "vdr/..."
|
||||
for reporting an invalid line in channels.conf.terr
|
||||
for fixing handling '/' and '~' in recording file names in case DirectoryEncoding is
|
||||
used
|
||||
for making the LIRC remote control connect to the socket even if it doesn't yet exist
|
||||
when VDR is started
|
||||
for reporting a possible crash if the recordings list is updated externally while the
|
||||
Recordings menu is open
|
||||
for reporting a missing closing ')' in the help entry of the --vfat option
|
||||
|
||||
Alex Lasnier <alex@fepg.org>
|
||||
for adding tuning support for ATSC devices
|
||||
@ -2946,6 +2969,7 @@ Johan Andersson <jna@jna.pp.se>
|
||||
Dave Pickles <dave@pickles.me.uk>
|
||||
for adding support for "content identifier descriptor" and "default authority
|
||||
descriptor" to 'libsi'
|
||||
for reporting that old EPG events are not cleaned up in case no epg data file is given
|
||||
|
||||
Holger Dengler <holger.dengler@gmx.de>
|
||||
for making the isnumber() function check the given pointer for NULL
|
||||
@ -2994,6 +3018,11 @@ Torsten Lang <info@torstenlang.de>
|
||||
for suggesting to increase the size of the TS buffer to 5MB and that of the Recorder
|
||||
buffer to 20MB to better handle HD recordings
|
||||
for fixing setting the video format in the dvbhdffdevice
|
||||
for reporting a problem with setting the system time from the TDT in case devices
|
||||
are tuned to the same transponder on different sources, and these broadcast different
|
||||
time data
|
||||
for reporting a problem with unjustified "video data stream broken" errors in case
|
||||
the system time is changed while a recording is active
|
||||
|
||||
Christian Ruppert <idl0r@gentoo.org>
|
||||
for some improvements to the Makefiles
|
||||
@ -3135,3 +3164,26 @@ Zoran Turalija <zoran.turalija@gmail.com>
|
||||
for translating OSD texts to the Serbian language
|
||||
for adding maximum SNR and signal strength value for TechniSat SkyStar HD2
|
||||
for pointing out that the language file sr_SR.po should be renamed to sr_RS.po
|
||||
|
||||
Stefan Braun <louis.braun@gmx.de>
|
||||
for reporting an endless loop in cTextWrapper::Set() in case the given Width is smaller
|
||||
than one character
|
||||
for reporting an endless loop in the DrawEllipse() functions for very small ellipses
|
||||
|
||||
Jochen Dolze <vdr@dolze.de>
|
||||
for changing cThread::SetIOPriority() from "best effort class" to "idle class" in order
|
||||
to improve overall performance when an editing process is running
|
||||
|
||||
Dominique Dumont <domi.dumont@free.fr>
|
||||
for reporting a crash in the LCARS skin's main menu in case there is no current channel
|
||||
|
||||
Manfred Völkel <mvoelkel@digitaldevices.de>
|
||||
for suggesting to make all bonded devices (except for the master) turn off their LNB
|
||||
power completely to avoid problems when receiving vertically polarized transponders
|
||||
|
||||
Thomas Maass <mase@setho.org>
|
||||
for reporting a difference in the internal sequence of actions when pressing the Blue
|
||||
and the Back key, respectively, during replay
|
||||
|
||||
Eike Edener <eike@edener.de>
|
||||
for reporting a bug in writing group separators to channels.conf that contain a comma
|
||||
|
91
HISTORY
91
HISTORY
@ -7328,7 +7328,7 @@ Video Disk Recorder Revision History
|
||||
+ no longer generating an editing mark at the "end" of the edited recording (this
|
||||
was actually generated at the beginning of the last GOP, so that a subsequent
|
||||
edit would have cut off the last GOP)
|
||||
+ no longer generating any editing marks if the edited recording results on just
|
||||
+ no longer generating any editing marks if the edited recording results in just
|
||||
one single sequence
|
||||
+ ignoring pairs of editing marks that are placed at exactly the same position of
|
||||
a recording when actually cutting the recording
|
||||
@ -7773,7 +7773,6 @@ Video Disk Recorder Revision History
|
||||
Dominic Evans).
|
||||
- Updated the default channels.conf file.
|
||||
|
||||
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Updated the Lithuanian OSD texts (thanks to Valdemaras Pipiras).
|
||||
@ -7782,3 +7781,91 @@ Video Disk Recorder Revision History
|
||||
- Fixed handling overlapping pending timers (reported by Matthias Senzel).
|
||||
- Bumped all version numbers to 2.0.0.
|
||||
- Official release.
|
||||
|
||||
2013-04-13: Version 2.0.1
|
||||
|
||||
- Fixed initializing cDevice::keepTracks.
|
||||
- Fixed an endless loop in cTextWrapper::Set() in case the given Width is smaller than
|
||||
one character (reported by Stefan Braun).
|
||||
- Added definitions for older DVB API versions, back until 5.0 (based on a patch from
|
||||
Udo Richter).
|
||||
- Fixed handling '/' and '~' in recording file names in case DirectoryEncoding is
|
||||
used (thanks to Lars Hanisch).
|
||||
- Changed cThread::SetIOPriority() from "best effort class" to "idle class" in order to
|
||||
improve overall performance when an editing process is running (thanks to Jochen
|
||||
Dolze).
|
||||
|
||||
2013-05-19: Version 2.0.2
|
||||
|
||||
- Fixed multiple occurrences of the same directory in the recordings list in case there
|
||||
are directories that only differ in non-alphanumeric characters (was broken by
|
||||
"Fixed selecting the last replayed recording in the Recordings menu in case there
|
||||
are folders and plain recordings with names that differ only in non-alphanumeric
|
||||
characters" in version 1.7.36).
|
||||
- Fixed displaying the frame number when setting an editing mark (thanks to Thomas
|
||||
Günther).
|
||||
- Fixed no longer generating any editing marks if the edited recording results in just
|
||||
one single sequence.
|
||||
- Fixed an error message when parsing SCR values in diseqc.conf.
|
||||
- Fixed an unexpected RCS version tag in the newplugin script.
|
||||
- Fixed an endless loop in the DrawEllipse() functions for very small ellipses (reported
|
||||
by Stefan Braun).
|
||||
- Fixed a crash in the LCARS skin's main menu in case there is no current channel
|
||||
(reported by Dominique Dumont).
|
||||
|
||||
2013-09-01: Version 2.0.3
|
||||
|
||||
- Fixed asserting free disk space in the cutter.
|
||||
- No longer trying to delete old recordings in AssertFreeDiskSpace() if the given
|
||||
Priority is less than 1.
|
||||
- Fixed handling LIRC events in case repeated events are lost.
|
||||
- Fixed a possible crash when shutting down VDR while subtitles are being displayed
|
||||
(reported by Ville Skyttä).
|
||||
- cDevice::IsPrimaryDevice() now also checks whether the primary device actually has
|
||||
a decoder and returns false otherwise. This should improve device allocation on
|
||||
systems that are only used as a receiver and don't actually display anything.
|
||||
- Increased the value of MAXRETRIES to 20 to reduce the probability of disturbances
|
||||
in transfer mode.
|
||||
- All bonded devices (except for the master) now turn off their LNB power completely
|
||||
to avoid problems when receiving vertically polarized transponders (suggested by
|
||||
Manfred Völkel and Oliver Endriss).
|
||||
- Fixed cleaning up old EPG events in case no epg data file is given (reported by
|
||||
Dave Pickles).
|
||||
|
||||
2013-10-23: Version 2.0.4
|
||||
|
||||
- Unified the internal sequence of actions when pressing the Blue and the Back key,
|
||||
respectively, during replay (reported by Thomas Maass).
|
||||
- The Yellow button in the main menu no longer acts as "Pause" if "Pause key handling"
|
||||
is set to "do not pause live video" (suggested by Ulf Kiener).
|
||||
- Fixed writing group separators to channels.conf that contain a comma (reported by
|
||||
Eike Edener).
|
||||
- Now also checking the source (in addition to the transponder) when setting the
|
||||
system time from the TDT, which avoids problems in case devices are tuned to the
|
||||
same transponder on different sources, and these broadcast different time data
|
||||
(reported by Torsten Lang).
|
||||
- Changed cRecorder::Action() to use cTimeMs instead of time() to avoid problems with
|
||||
unjustified "video data stream broken" errors in case the system time is changed
|
||||
while a recording is active (reported by Torsten Lang).
|
||||
- Fixed an inconsistent behavior between opening the Recordings menu manually via the
|
||||
main menu and by pressing the Recordings key. In the latter case it automatically
|
||||
opened all sub folders to position the cursor to the last replayed recording, which
|
||||
is unexpected at this point (reported by Helmut Auer). You can still navigate to
|
||||
the last replayed recording (if any) by pressing Ok repeatedly in the Recordings
|
||||
menu.
|
||||
|
||||
2014-01-07: Version 2.0.5
|
||||
|
||||
- The LIRC remote control now connects to the socket even if it doesn't yet exist when
|
||||
VDR is started (thanks to Lars Hanisch).
|
||||
- Fixed a missing initialization in the c'tor of cSkinLCARSDisplayChannel (thanks to
|
||||
Marko Mäkelä).
|
||||
- Fixed uninitialized item area coordinates in cSkinLCARSDisplayMenu (reported by
|
||||
Marko Mäkelä).
|
||||
- Fixed a possible crash if the recordings list is updated externally while the
|
||||
Recordings menu is open (reported by Lars Hanisch).
|
||||
- Added a missing closing ')' in the help and man page entry of the --vfat option
|
||||
(reported by Lars Hanisch).
|
||||
- Fixed setting the name of the video directory to avoid a crash when using --genindex,
|
||||
and also to use the correct directory with --edit (the latter reported by Marko
|
||||
Mäkelä).
|
||||
|
@ -45,3 +45,8 @@ VDR Plugin 'dvbsddevice' Revision History
|
||||
2013-03-31: Version 2.0.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2013-08-22: Version 2.0.1
|
||||
|
||||
- Fixed handling the -o option (short form of --outputonly; problem reported by
|
||||
Mario Edelmann).
|
||||
|
@ -3,14 +3,14 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: dvbsddevice.c 1.10 2013/03/31 09:30:18 kls Exp $
|
||||
* $Id: dvbsddevice.c 1.10.1.1 2013/08/22 08:30:52 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include "dvbsdffdevice.h"
|
||||
|
||||
static const char *VERSION = "2.0.0";
|
||||
static const char *VERSION = "2.0.1";
|
||||
static const char *DESCRIPTION = "SD Full Featured DVB device";
|
||||
|
||||
class cPluginDvbsddevice : public cPlugin {
|
||||
@ -48,7 +48,7 @@ bool cPluginDvbsddevice::ProcessArgs(int argc, char *argv[])
|
||||
};
|
||||
|
||||
int c;
|
||||
while ((c = getopt_long(argc, argv, "", long_options, NULL)) != -1) {
|
||||
while ((c = getopt_long(argc, argv, "o", long_options, NULL)) != -1) {
|
||||
switch (c) {
|
||||
case 'o': probe->SetOutputOnly(true);
|
||||
break;
|
||||
|
16
channels.c
16
channels.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: channels.c 2.24 2012/07/14 12:15:00 kls Exp $
|
||||
* $Id: channels.c 2.24.1.1 2013/10/11 11:40:02 kls Exp $
|
||||
*/
|
||||
|
||||
#include "channels.h"
|
||||
@ -503,12 +503,14 @@ cString cChannel::ToText(const cChannel *Channel)
|
||||
char FullName[strlen(Channel->name) + 1 + strlen(Channel->shortName) + 1 + strlen(Channel->provider) + 1 + 10]; // +10: paranoia
|
||||
char *q = FullName;
|
||||
q += sprintf(q, "%s", Channel->name);
|
||||
if (!isempty(Channel->shortName))
|
||||
q += sprintf(q, ",%s", Channel->shortName);
|
||||
else if (strchr(Channel->name, ','))
|
||||
q += sprintf(q, ",");
|
||||
if (!isempty(Channel->provider))
|
||||
q += sprintf(q, ";%s", Channel->provider);
|
||||
if (!Channel->groupSep) {
|
||||
if (!isempty(Channel->shortName))
|
||||
q += sprintf(q, ",%s", Channel->shortName);
|
||||
else if (strchr(Channel->name, ','))
|
||||
q += sprintf(q, ",");
|
||||
if (!isempty(Channel->provider))
|
||||
q += sprintf(q, ";%s", Channel->provider);
|
||||
}
|
||||
*q = 0;
|
||||
strreplace(FullName, ':', '|');
|
||||
cString buffer;
|
||||
|
6
config.h
6
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 2.76 2013/03/31 09:30:18 kls Exp $
|
||||
* $Id: config.h 2.76.1.5 2013/10/29 16:06:45 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
@ -22,8 +22,8 @@
|
||||
|
||||
// VDR's own version number:
|
||||
|
||||
#define VDRVERSION "2.0.0"
|
||||
#define VDRVERSNUM 20000 // Version * 10000 + Major * 100 + Minor
|
||||
#define VDRVERSION "2.0.5"
|
||||
#define VDRVERSNUM 20005 // Version * 10000 + Major * 100 + Minor
|
||||
|
||||
// The plugin API's version number:
|
||||
|
||||
|
8
cutter.c
8
cutter.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: cutter.c 2.25 2013/03/18 09:40:49 kls Exp $
|
||||
* $Id: cutter.c 2.25.1.2 2013/08/21 13:43:46 kls Exp $
|
||||
*/
|
||||
|
||||
#include "cutter.h"
|
||||
@ -556,6 +556,8 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn
|
||||
bool Independent;
|
||||
int Length;
|
||||
if (LoadFrame(Index, Buffer, Independent, Length)) {
|
||||
// Make sure there is enough disk space:
|
||||
AssertFreeDiskSpace(-1);
|
||||
bool CutIn = !SeamlessBegin && Index == BeginIndex;
|
||||
bool CutOut = !SeamlessEnd && Index == EndIndex - 1;
|
||||
bool DeletedFrame = false;
|
||||
@ -581,7 +583,7 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn
|
||||
}
|
||||
fileSize += Length;
|
||||
// Generate marks at the editing points in the edited recording:
|
||||
if (numSequences > 0 && Index == BeginIndex) {
|
||||
if (numSequences > 1 && Index == BeginIndex) {
|
||||
if (toMarks.Count() > 0)
|
||||
toMarks.Add(toIndex->Last());
|
||||
toMarks.Add(toIndex->Last());
|
||||
@ -608,8 +610,6 @@ void cCuttingThread::Action(void)
|
||||
cCondWait::SleepMs(100);
|
||||
continue;
|
||||
}
|
||||
// Make sure there is enough disk space:
|
||||
AssertFreeDiskSpace(-1);
|
||||
// Determine the actual begin and end marks, skipping any marks at the same position:
|
||||
cMark *EndMark = fromMarks.GetNextEnd(BeginMark);
|
||||
// Process the current sequence:
|
||||
|
7
device.c
7
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 2.74 2013/03/07 13:18:35 kls Exp $
|
||||
* $Id: device.c 2.74.1.2 2013/08/22 10:35:30 kls Exp $
|
||||
*/
|
||||
|
||||
#include "device.h"
|
||||
@ -94,11 +94,11 @@ cDevice::cDevice(void)
|
||||
|
||||
player = NULL;
|
||||
isPlayingVideo = false;
|
||||
keepTracks = false; // used in ClrAvailableTracks()!
|
||||
ClrAvailableTracks();
|
||||
currentAudioTrack = ttNone;
|
||||
currentAudioTrackMissingCount = 0;
|
||||
currentSubtitleTrack = ttNone;
|
||||
keepTracks = false;
|
||||
liveSubtitle = NULL;
|
||||
dvbSubtitleConverter = NULL;
|
||||
autoSelectPreferredSubtitleLanguage = true;
|
||||
@ -118,6 +118,8 @@ cDevice::~cDevice()
|
||||
DetachAllReceivers();
|
||||
delete liveSubtitle;
|
||||
delete dvbSubtitleConverter;
|
||||
if (this == primaryDevice)
|
||||
primaryDevice = NULL;
|
||||
}
|
||||
|
||||
bool cDevice::WaitForAllDevicesReady(int Timeout)
|
||||
@ -362,7 +364,6 @@ void cDevice::SetCamSlot(cCamSlot *CamSlot)
|
||||
void cDevice::Shutdown(void)
|
||||
{
|
||||
deviceHooks.Clear();
|
||||
primaryDevice = NULL;
|
||||
for (int i = 0; i < numDevices; i++) {
|
||||
delete device[i];
|
||||
device[i] = NULL;
|
||||
|
4
device.h
4
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 2.47 2013/02/16 15:20:01 kls Exp $
|
||||
* $Id: device.h 2.47.1.1 2013/08/22 12:01:48 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DEVICE_H
|
||||
@ -196,7 +196,7 @@ protected:
|
||||
///< A derived class must call the MakePrimaryDevice() function of its
|
||||
///< base class.
|
||||
public:
|
||||
bool IsPrimaryDevice(void) const { return this == primaryDevice; }
|
||||
bool IsPrimaryDevice(void) const { return this == primaryDevice && HasDecoder(); }
|
||||
int CardIndex(void) const { return cardIndex; }
|
||||
///< Returns the card index of this device (0 ... MAXDEVICES - 1).
|
||||
int DeviceNumber(void) const;
|
||||
|
4
diseqc.c
4
diseqc.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: diseqc.c 2.9 2011/09/17 14:13:31 kls Exp $
|
||||
* $Id: diseqc.c 2.9.1.1 2013/05/02 09:33:12 kls Exp $
|
||||
*/
|
||||
|
||||
#include "diseqc.h"
|
||||
@ -192,7 +192,7 @@ const char *cDiseqc::GetScrBank(const char *s) const
|
||||
}
|
||||
return p;
|
||||
}
|
||||
esyslog("ERROR: more than one scr bank in '%s'", s - 1);
|
||||
esyslog("ERROR: invalid value for scr bank in '%s'", s - 1);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
72
dvbdevice.c
72
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 2.88 2013/03/16 15:23:35 kls Exp $
|
||||
* $Id: dvbdevice.c 2.88.1.4 2013/10/21 09:01:21 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbdevice.h"
|
||||
@ -21,10 +21,7 @@
|
||||
#include "menuitems.h"
|
||||
#include "sourceparams.h"
|
||||
|
||||
#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0508
|
||||
#define DTV_STREAM_ID DTV_DVBT2_PLP_ID
|
||||
#define FE_CAN_MULTISTREAM 0x4000000
|
||||
#endif
|
||||
static int DvbApiVersion = 0x0000; // the version of the DVB driver actually in use (will be determined by the first device created)
|
||||
|
||||
#define DVBS_TUNE_TIMEOUT 9000 //ms
|
||||
#define DVBS_LOCK_TIMEOUT 2000 //ms
|
||||
@ -700,7 +697,7 @@ void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency)
|
||||
|
||||
void cDvbTuner::ResetToneAndVoltage(void)
|
||||
{
|
||||
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13));
|
||||
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, bondedTuner ? SEC_VOLTAGE_OFF : SEC_VOLTAGE_13));
|
||||
CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF));
|
||||
}
|
||||
|
||||
@ -801,7 +798,8 @@ bool cDvbTuner::SetFrontend(void)
|
||||
// DVB-S2
|
||||
SETCMD(DTV_PILOT, PILOT_AUTO);
|
||||
SETCMD(DTV_ROLLOFF, dtp.RollOff());
|
||||
SETCMD(DTV_STREAM_ID, dtp.StreamId());
|
||||
if (DvbApiVersion >= 0x0508)
|
||||
SETCMD(DTV_STREAM_ID, dtp.StreamId());
|
||||
}
|
||||
else {
|
||||
// DVB-S
|
||||
@ -835,7 +833,11 @@ bool cDvbTuner::SetFrontend(void)
|
||||
SETCMD(DTV_HIERARCHY, dtp.Hierarchy());
|
||||
if (frontendType == SYS_DVBT2) {
|
||||
// DVB-T2
|
||||
SETCMD(DTV_STREAM_ID, dtp.StreamId());
|
||||
if (DvbApiVersion >= 0x0508) {
|
||||
SETCMD(DTV_STREAM_ID, dtp.StreamId());
|
||||
}
|
||||
else if (DvbApiVersion >= 0x0503)
|
||||
SETCMD(DTV_DVBT2_PLP_ID_LEGACY, dtp.StreamId());
|
||||
}
|
||||
|
||||
tuneTimeout = DVBT_TUNE_TIMEOUT;
|
||||
@ -1178,28 +1180,44 @@ bool cDvbDevice::QueryDeliverySystems(int fd_frontend)
|
||||
LOG_ERROR;
|
||||
return false;
|
||||
}
|
||||
#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) >= 0x0505
|
||||
dtv_property Frontend[1];
|
||||
memset(&Frontend, 0, sizeof(Frontend));
|
||||
dtv_properties CmdSeq;
|
||||
memset(&CmdSeq, 0, sizeof(CmdSeq));
|
||||
CmdSeq.props = Frontend;
|
||||
SETCMD(DTV_ENUM_DELSYS, 0);
|
||||
int Result = ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq);
|
||||
if (Result == 0) {
|
||||
for (uint i = 0; i < Frontend[0].u.buffer.len; i++) {
|
||||
if (numDeliverySystems >= MAXDELIVERYSYSTEMS) {
|
||||
esyslog("ERROR: too many delivery systems on frontend %d/%d", adapter, frontend);
|
||||
break;
|
||||
}
|
||||
deliverySystems[numDeliverySystems++] = Frontend[0].u.buffer.data[i];
|
||||
}
|
||||
// Determine the version of the running DVB API:
|
||||
if (!DvbApiVersion) {
|
||||
memset(&Frontend, 0, sizeof(Frontend));
|
||||
memset(&CmdSeq, 0, sizeof(CmdSeq));
|
||||
CmdSeq.props = Frontend;
|
||||
SETCMD(DTV_API_VERSION, 0);
|
||||
if (ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq) != 0) {
|
||||
LOG_ERROR;
|
||||
return false;
|
||||
}
|
||||
DvbApiVersion = Frontend[0].u.data;
|
||||
isyslog("DVB API version is 0x%04X (VDR was built with 0x%04X)", DvbApiVersion, DVBAPIVERSION);
|
||||
}
|
||||
else {
|
||||
esyslog("ERROR: can't query delivery systems on frontend %d/%d - falling back to legacy mode", adapter, frontend);
|
||||
#else
|
||||
{
|
||||
#endif
|
||||
// Determine the types of delivery systems this device provides:
|
||||
bool LegacyMode = true;
|
||||
if (DvbApiVersion >= 0x0505) {
|
||||
memset(&Frontend, 0, sizeof(Frontend));
|
||||
memset(&CmdSeq, 0, sizeof(CmdSeq));
|
||||
CmdSeq.props = Frontend;
|
||||
SETCMD(DTV_ENUM_DELSYS, 0);
|
||||
int Result = ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq);
|
||||
if (Result == 0) {
|
||||
for (uint i = 0; i < Frontend[0].u.buffer.len; i++) {
|
||||
if (numDeliverySystems >= MAXDELIVERYSYSTEMS) {
|
||||
esyslog("ERROR: too many delivery systems on frontend %d/%d", adapter, frontend);
|
||||
break;
|
||||
}
|
||||
deliverySystems[numDeliverySystems++] = Frontend[0].u.buffer.data[i];
|
||||
}
|
||||
LegacyMode = false;
|
||||
}
|
||||
else {
|
||||
esyslog("ERROR: can't query delivery systems on frontend %d/%d - falling back to legacy mode", adapter, frontend);
|
||||
}
|
||||
}
|
||||
if (LegacyMode) {
|
||||
// Legacy mode (DVB-API < 5.5):
|
||||
switch (frontendInfo.type) {
|
||||
case FE_QPSK: deliverySystems[numDeliverySystems++] = SYS_DVBS;
|
||||
|
55
dvbdevice.h
55
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 2.29 2013/03/07 09:42:29 kls Exp $
|
||||
* $Id: dvbdevice.h 2.29.1.1 2013/04/09 13:43:33 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DVBDEVICE_H
|
||||
@ -14,10 +14,59 @@
|
||||
#include <linux/dvb/version.h>
|
||||
#include "device.h"
|
||||
|
||||
#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0503
|
||||
#error VDR requires Linux DVB driver API version 5.3 or higher!
|
||||
#define DVBAPIVERSION (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR)
|
||||
|
||||
#if DVBAPIVERSION < 0x0500
|
||||
#error VDR requires Linux DVB driver API version 5.0 or higher!
|
||||
#endif
|
||||
|
||||
// --- Definitions for older DVB API versions --------------------------------
|
||||
|
||||
#if DVBAPIVERSION < 0x0501
|
||||
enum {
|
||||
FE_CAN_2G_MODULATION = 0x10000000,
|
||||
};
|
||||
enum {
|
||||
TRANSMISSION_MODE_4K = TRANSMISSION_MODE_AUTO + 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if DVBAPIVERSION < 0x0502
|
||||
enum {
|
||||
FE_CAN_TURBO_FEC = 0x8000000,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if DVBAPIVERSION < 0x0503
|
||||
enum {
|
||||
TRANSMISSION_MODE_1K = TRANSMISSION_MODE_4K + 1,
|
||||
TRANSMISSION_MODE_16K,
|
||||
TRANSMISSION_MODE_32K,
|
||||
};
|
||||
enum {
|
||||
GUARD_INTERVAL_1_128 = GUARD_INTERVAL_AUTO + 1,
|
||||
GUARD_INTERVAL_19_128,
|
||||
GUARD_INTERVAL_19_256,
|
||||
};
|
||||
enum {
|
||||
SYS_DVBT2 = SYS_DAB + 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if DVBAPIVERSION < 0x0505
|
||||
#define DTV_ENUM_DELSYS 44
|
||||
#endif
|
||||
|
||||
#if DVBAPIVERSION < 0x0508
|
||||
enum {
|
||||
FE_CAN_MULTISTREAM = 0x4000000,
|
||||
};
|
||||
#define DTV_STREAM_ID 42
|
||||
#define DTV_DVBT2_PLP_ID_LEGACY 43
|
||||
#endif
|
||||
|
||||
// --- End of definitions for older DVB API versions -------------------------
|
||||
|
||||
#define MAXDVBDEVICES 8
|
||||
#define MAXDELIVERYSYSTEMS 8
|
||||
|
||||
|
4
eit.c
4
eit.c
@ -8,7 +8,7 @@
|
||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
|
||||
*
|
||||
* $Id: eit.c 2.23 2012/12/04 11:10:10 kls Exp $
|
||||
* $Id: eit.c 2.23.1.1 2013/10/12 11:24:51 kls Exp $
|
||||
*/
|
||||
|
||||
#include "eit.h"
|
||||
@ -404,7 +404,7 @@ void cEitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
||||
}
|
||||
break;
|
||||
case 0x14: {
|
||||
if (Setup.SetSystemTime && Setup.TimeTransponder && ISTRANSPONDER(Transponder(), Setup.TimeTransponder))
|
||||
if (Setup.SetSystemTime && Setup.TimeSource == Source() && Setup.TimeTransponder && ISTRANSPONDER(Transponder(), Setup.TimeTransponder))
|
||||
cTDT TDT(Data);
|
||||
}
|
||||
break;
|
||||
|
19
epg.c
19
epg.c
@ -7,7 +7,7 @@
|
||||
* Original version (as used in VDR before 1.3.0) written by
|
||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||
*
|
||||
* $Id: epg.c 2.23 2013/02/17 14:12:07 kls Exp $
|
||||
* $Id: epg.c 2.23.1.1 2013/09/01 09:16:53 kls Exp $
|
||||
*/
|
||||
|
||||
#include "epg.h"
|
||||
@ -1140,16 +1140,19 @@ bool cSchedule::Read(FILE *f, cSchedules *Schedules)
|
||||
class cEpgDataWriter : public cThread {
|
||||
private:
|
||||
cMutex mutex;
|
||||
bool dump;
|
||||
protected:
|
||||
virtual void Action(void);
|
||||
public:
|
||||
cEpgDataWriter(void);
|
||||
void SetDump(bool Dump) { dump = Dump; }
|
||||
void Perform(void);
|
||||
};
|
||||
|
||||
cEpgDataWriter::cEpgDataWriter(void)
|
||||
:cThread("epg data writer", true)
|
||||
{
|
||||
dump = false;
|
||||
}
|
||||
|
||||
void cEpgDataWriter::Action(void)
|
||||
@ -1169,7 +1172,8 @@ void cEpgDataWriter::Perform(void)
|
||||
p->Cleanup(now);
|
||||
}
|
||||
}
|
||||
cSchedules::Dump();
|
||||
if (dump)
|
||||
cSchedules::Dump();
|
||||
}
|
||||
|
||||
static cEpgDataWriter EpgDataWriter;
|
||||
@ -1203,6 +1207,7 @@ void cSchedules::SetEpgDataFileName(const char *FileName)
|
||||
{
|
||||
free(epgDataFileName);
|
||||
epgDataFileName = FileName ? strdup(FileName) : NULL;
|
||||
EpgDataWriter.SetDump(epgDataFileName != NULL);
|
||||
}
|
||||
|
||||
void cSchedules::SetModified(cSchedule *Schedule)
|
||||
@ -1217,12 +1222,10 @@ void cSchedules::Cleanup(bool Force)
|
||||
lastDump = 0;
|
||||
time_t now = time(NULL);
|
||||
if (now - lastDump > EPGDATAWRITEDELTA) {
|
||||
if (epgDataFileName) {
|
||||
if (Force)
|
||||
EpgDataWriter.Perform();
|
||||
else if (!EpgDataWriter.Active())
|
||||
EpgDataWriter.Start();
|
||||
}
|
||||
if (Force)
|
||||
EpgDataWriter.Perform();
|
||||
else if (!EpgDataWriter.Active())
|
||||
EpgDataWriter.Start();
|
||||
lastDump = now;
|
||||
}
|
||||
}
|
||||
|
7
font.c
7
font.c
@ -6,7 +6,7 @@
|
||||
*
|
||||
* BiDi support by Osama Alrawab <alrawab@hotmail.com> @2008 Tripoli-Libya.
|
||||
*
|
||||
* $Id: font.c 2.13 2012/06/02 13:38:28 kls Exp $
|
||||
* $Id: font.c 2.13.1.1 2013/04/07 14:54:15 kls Exp $
|
||||
*/
|
||||
|
||||
#include "font.h"
|
||||
@ -592,7 +592,7 @@ void cTextWrapper::Set(const char *Text, const cFont *Font, int Width)
|
||||
p = Blank;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
else if (w > 0) { // there has to be at least one character before the newline
|
||||
// Here's the ugly part, where we don't have any whitespace to
|
||||
// punch in a newline, so we need to make room for it:
|
||||
if (Delim)
|
||||
@ -608,8 +608,7 @@ void cTextWrapper::Set(const char *Text, const cFont *Font, int Width)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
w += cw;
|
||||
w += cw;
|
||||
if (strchr("-.,:;!?_", *p)) {
|
||||
Delim = p;
|
||||
Blank = NULL;
|
||||
|
20
lirc.c
20
lirc.c
@ -6,7 +6,7 @@
|
||||
*
|
||||
* LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16.
|
||||
*
|
||||
* $Id: lirc.c 2.5 2013/02/11 15:25:42 kls Exp $
|
||||
* $Id: lirc.c 2.5.1.2 2013/10/29 16:06:20 kls Exp $
|
||||
*/
|
||||
|
||||
#include "lirc.h"
|
||||
@ -21,11 +21,9 @@ cLircRemote::cLircRemote(const char *DeviceName)
|
||||
{
|
||||
addr.sun_family = AF_UNIX;
|
||||
strcpy(addr.sun_path, DeviceName);
|
||||
if (Connect()) {
|
||||
Start();
|
||||
return;
|
||||
}
|
||||
f = -1;
|
||||
if (!Connect())
|
||||
f = -1;
|
||||
Start();
|
||||
}
|
||||
|
||||
cLircRemote::~cLircRemote()
|
||||
@ -67,14 +65,15 @@ void cLircRemote::Action(void)
|
||||
bool repeat = false;
|
||||
int timeout = -1;
|
||||
|
||||
while (Running() && f >= 0) {
|
||||
while (Running()) {
|
||||
|
||||
bool ready = cFile::FileReady(f, timeout);
|
||||
bool ready = f >= 0 && cFile::FileReady(f, timeout);
|
||||
int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1;
|
||||
|
||||
if (ready && ret <= 0 ) {
|
||||
if (f < 0 || ready && ret <= 0) {
|
||||
esyslog("ERROR: lircd connection broken, trying to reconnect every %.1f seconds", float(RECONNECTDELAY) / 1000);
|
||||
close(f);
|
||||
if (f >= 0)
|
||||
close(f);
|
||||
f = -1;
|
||||
while (Running() && f < 0) {
|
||||
cCondWait::SleepMs(RECONNECTDELAY);
|
||||
@ -111,6 +110,7 @@ void cLircRemote::Action(void)
|
||||
else if (LastTime.Elapsed() < (uint)Setup.RcRepeatDelta)
|
||||
continue; // skip same keys coming in too fast
|
||||
else {
|
||||
pressed = true;
|
||||
repeat = true;
|
||||
timeout = Delta * 10 / 9;
|
||||
}
|
||||
|
28
menu.c
28
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 2.82 2013/03/18 09:11:48 kls Exp $
|
||||
* $Id: menu.c 2.82.1.5 2013/10/16 09:46:24 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -2302,14 +2302,12 @@ void cMenuRecordings::Set(bool Refresh)
|
||||
}
|
||||
else
|
||||
delete Item;
|
||||
if (LastItem) {
|
||||
if (LastItem || LastDir) {
|
||||
if (CurrentRecording && strcmp(CurrentRecording, recording->FileName()) == 0)
|
||||
SetCurrent(LastItem);
|
||||
SetCurrent(LastDir ? LastDir : LastItem);
|
||||
}
|
||||
if (LastDir) {
|
||||
if (LastDir)
|
||||
LastDir->IncrementCounter(recording->IsNew());
|
||||
LastItem = LastDir;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Refresh)
|
||||
@ -3366,7 +3364,7 @@ cMenuPluginItem::cMenuPluginItem(const char *Name, int Index)
|
||||
|
||||
cOsdObject *cMenuMain::pluginOsdObject = NULL;
|
||||
|
||||
cMenuMain::cMenuMain(eOSState State)
|
||||
cMenuMain::cMenuMain(eOSState State, bool OpenSubMenus)
|
||||
:cOsdMenu("")
|
||||
{
|
||||
SetMenuCategory(mcMain);
|
||||
@ -3383,7 +3381,7 @@ cMenuMain::cMenuMain(eOSState State)
|
||||
case osSchedule: AddSubMenu(new cMenuSchedule); break;
|
||||
case osChannels: AddSubMenu(new cMenuChannels); break;
|
||||
case osTimers: AddSubMenu(new cMenuTimers); break;
|
||||
case osRecordings: AddSubMenu(new cMenuRecordings(NULL, 0, true)); break;
|
||||
case osRecordings: AddSubMenu(new cMenuRecordings(NULL, 0, OpenSubMenus)); break;
|
||||
case osSetup: AddSubMenu(new cMenuSetup); break;
|
||||
case osCommands: AddSubMenu(new cMenuCommands(tr("Commands"), &Commands)); break;
|
||||
default: break;
|
||||
@ -3450,7 +3448,7 @@ bool cMenuMain::Update(bool Force)
|
||||
stopReplayItem = NULL;
|
||||
}
|
||||
// Color buttons:
|
||||
SetHelp(!replaying ? tr("Button$Record") : NULL, tr("Button$Audio"), replaying ? NULL : tr("Button$Pause"), replaying ? tr("Button$Stop") : cReplayControl::LastReplayed() ? tr("Button$Resume") : tr("Button$Play"));
|
||||
SetHelp(!replaying ? tr("Button$Record") : NULL, tr("Button$Audio"), replaying || !Setup.PauseKeyHandling ? NULL : tr("Button$Pause"), replaying ? tr("Button$Stop") : cReplayControl::LastReplayed() ? tr("Button$Resume") : tr("Button$Play"));
|
||||
result = true;
|
||||
}
|
||||
|
||||
@ -3545,7 +3543,7 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
|
||||
}
|
||||
break;
|
||||
case kYellow: if (!HadSubMenu)
|
||||
state = replaying ? osContinue : osPause;
|
||||
state = replaying || !Setup.PauseKeyHandling ? osContinue : osPause;
|
||||
break;
|
||||
case kBlue: if (!HadSubMenu)
|
||||
state = replaying ? osStopReplay : cReplayControl::LastReplayed() ? osReplay : osRecordings;
|
||||
@ -4779,8 +4777,10 @@ void cReplayControl::MarkToggle(void)
|
||||
marks.Add(Current);
|
||||
bool Play, Forward;
|
||||
int Speed;
|
||||
if (Setup.PauseOnMarkSet || GetReplayMode(Play, Forward, Speed) && !Play)
|
||||
if (Setup.PauseOnMarkSet || GetReplayMode(Play, Forward, Speed) && !Play) {
|
||||
Goto(Current, true);
|
||||
displayFrames = true;
|
||||
}
|
||||
}
|
||||
ShowTimed(2);
|
||||
marksModified = true;
|
||||
@ -4968,10 +4968,8 @@ eOSState cReplayControl::ProcessKey(eKeys Key)
|
||||
else
|
||||
Show();
|
||||
break;
|
||||
case kBack: if (Setup.DelTimeshiftRec) {
|
||||
cRecordControl* rc = cRecordControls::GetRecordControl(fileName);
|
||||
return rc && rc->InstantId() ? osEnd : osRecordings;
|
||||
}
|
||||
case kBack: Hide();
|
||||
Stop();
|
||||
return osRecordings;
|
||||
default: return osUnknown;
|
||||
}
|
||||
|
4
menu.h
4
menu.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.h 2.13 2012/12/07 13:44:13 kls Exp $
|
||||
* $Id: menu.h 2.13.1.1 2013/10/16 09:46:15 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __MENU_H
|
||||
@ -107,7 +107,7 @@ private:
|
||||
void Set(void);
|
||||
bool Update(bool Force = false);
|
||||
public:
|
||||
cMenuMain(eOSState State = osUnknown);
|
||||
cMenuMain(eOSState State = osUnknown, bool OpenSubMenus = false);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
static cOsdObject *PluginOsdObject(void);
|
||||
};
|
||||
|
@ -12,7 +12,7 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: newplugin 2.17 2013/01/12 13:46:00 kls Exp $
|
||||
# $Id: newplugin 2.17.1.1 2013/05/02 10:04:06 kls Exp $
|
||||
|
||||
$PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
|
||||
|
||||
@ -352,8 +352,8 @@ The next steps you should perform now are:
|
||||
|
||||
sub CreateFile
|
||||
{
|
||||
my ($Name, $Content) = @_;
|
||||
open(FILE, ">$PLUGINDIR/$Name") || die "$Name: $!\n";
|
||||
my ($FileName, $Content) = @_;
|
||||
open(FILE, ">$PLUGINDIR/$FileName") || die "$FileName: $!\n";
|
||||
print FILE $Content;
|
||||
close(FILE);
|
||||
}
|
||||
|
10
osd.c
10
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 2.38 2013/02/14 15:50:19 kls Exp $
|
||||
* $Id: osd.c 2.38.1.1 2013/05/18 12:41:48 kls Exp $
|
||||
*/
|
||||
|
||||
#include "osd.h"
|
||||
@ -639,8 +639,8 @@ void cBitmap::DrawEllipse(int x1, int y1, int x2, int y2, tColor Color, int Quad
|
||||
case 8: cy = y1; rx /= 2; break;
|
||||
default: ;
|
||||
}
|
||||
int TwoASquare = 2 * rx * rx;
|
||||
int TwoBSquare = 2 * ry * ry;
|
||||
int TwoASquare = max(1, 2 * rx * rx);
|
||||
int TwoBSquare = max(1, 2 * ry * ry);
|
||||
int x = rx;
|
||||
int y = 0;
|
||||
int XChange = ry * ry * (1 - 2 * rx);
|
||||
@ -1380,8 +1380,8 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
|
||||
case 8: cy = y1; rx /= 2; break;
|
||||
default: ;
|
||||
}
|
||||
int TwoASquare = 2 * rx * rx;
|
||||
int TwoBSquare = 2 * ry * ry;
|
||||
int TwoASquare = max(1, 2 * rx * rx);
|
||||
int TwoBSquare = max(1, 2 * ry * ry);
|
||||
int x = rx;
|
||||
int y = 0;
|
||||
int XChange = ry * ry * (1 - 2 * rx);
|
||||
|
12
recorder.c
12
recorder.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recorder.c 2.17 2012/09/22 11:53:57 kls Exp $
|
||||
* $Id: recorder.c 2.17.1.1 2013/10/12 12:10:05 kls Exp $
|
||||
*/
|
||||
|
||||
#include "recorder.h"
|
||||
@ -14,7 +14,7 @@
|
||||
|
||||
// The maximum time we wait before assuming that a recorded video data stream
|
||||
// is broken:
|
||||
#define MAXBROKENTIMEOUT 30 // seconds
|
||||
#define MAXBROKENTIMEOUT 30000 // milliseconds
|
||||
|
||||
#define MINFREEDISKSPACE (512) // MB
|
||||
#define DISKCHECKINTERVAL 100 // seconds
|
||||
@ -117,7 +117,7 @@ void cRecorder::Receive(uchar *Data, int Length)
|
||||
|
||||
void cRecorder::Action(void)
|
||||
{
|
||||
time_t t = time(NULL);
|
||||
cTimeMs t(MAXBROKENTIMEOUT);
|
||||
bool InfoWritten = false;
|
||||
bool FirstIframeSeen = false;
|
||||
while (Running()) {
|
||||
@ -160,16 +160,16 @@ void cRecorder::Action(void)
|
||||
break;
|
||||
}
|
||||
fileSize += Count;
|
||||
t = time(NULL);
|
||||
t.Set(MAXBROKENTIMEOUT);
|
||||
}
|
||||
}
|
||||
ringBuffer->Del(Count);
|
||||
}
|
||||
}
|
||||
if (time(NULL) - t > MAXBROKENTIMEOUT) {
|
||||
if (t.TimedOut()) {
|
||||
esyslog("ERROR: video data stream broken");
|
||||
ShutdownHandler.RequestEmergencyExit();
|
||||
t = time(NULL);
|
||||
t.Set(MAXBROKENTIMEOUT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
106
recording.c
106
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 2.91 2013/03/11 10:34:41 kls Exp $
|
||||
* $Id: recording.c 2.91.1.3 2013/12/25 10:55:32 kls Exp $
|
||||
*/
|
||||
|
||||
#include "recording.h"
|
||||
@ -72,6 +72,7 @@ bool DirectoryEncoding = false;
|
||||
int InstanceId = 0;
|
||||
|
||||
cRecordings DeletedRecordings(true);
|
||||
static cRecordings VanishedRecordings;
|
||||
|
||||
// --- cRemoveDeletedRecordingsThread ----------------------------------------
|
||||
|
||||
@ -178,40 +179,52 @@ void AssertFreeDiskSpace(int Priority, bool Force)
|
||||
return; // the next call will actually remove it
|
||||
}
|
||||
// No "deleted" files to remove, so let's see if we can delete a recording:
|
||||
isyslog("...no deleted recording found, trying to delete an old recording...");
|
||||
cThreadLock RecordingsLock(&Recordings);
|
||||
if (Recordings.Count()) {
|
||||
cRecording *r = Recordings.First();
|
||||
cRecording *r0 = NULL;
|
||||
while (r) {
|
||||
if (r->IsOnVideoDirectoryFileSystem()) { // only delete recordings that will actually increase the free video disk space
|
||||
if (!r->IsEdited() && r->Lifetime() < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
|
||||
if ((r->Lifetime() == 0 && Priority > r->Priority()) || // the recording has no guaranteed lifetime and the new recording has higher priority
|
||||
(r->Lifetime() > 0 && (time(NULL) - r->Start()) / SECSINDAY >= r->Lifetime())) { // the recording's guaranteed lifetime has expired
|
||||
if (r0) {
|
||||
if (r->Priority() < r0->Priority() || (r->Priority() == r0->Priority() && r->Start() < r0->Start()))
|
||||
r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
|
||||
if (Priority > 0) {
|
||||
isyslog("...no deleted recording found, trying to delete an old recording...");
|
||||
cThreadLock RecordingsLock(&Recordings);
|
||||
if (Recordings.Count()) {
|
||||
cRecording *r = Recordings.First();
|
||||
cRecording *r0 = NULL;
|
||||
while (r) {
|
||||
if (r->IsOnVideoDirectoryFileSystem()) { // only delete recordings that will actually increase the free video disk space
|
||||
if (!r->IsEdited() && r->Lifetime() < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
|
||||
if ((r->Lifetime() == 0 && Priority > r->Priority()) || // the recording has no guaranteed lifetime and the new recording has higher priority
|
||||
(r->Lifetime() > 0 && (time(NULL) - r->Start()) / SECSINDAY >= r->Lifetime())) { // the recording's guaranteed lifetime has expired
|
||||
if (r0) {
|
||||
if (r->Priority() < r0->Priority() || (r->Priority() == r0->Priority() && r->Start() < r0->Start()))
|
||||
r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
|
||||
}
|
||||
else
|
||||
r0 = r;
|
||||
}
|
||||
else
|
||||
r0 = r;
|
||||
}
|
||||
}
|
||||
r = Recordings.Next(r);
|
||||
}
|
||||
r = Recordings.Next(r);
|
||||
if (r0 && r0->Delete()) {
|
||||
Recordings.Del(r0);
|
||||
return;
|
||||
}
|
||||
if (r0 && r0->Delete()) {
|
||||
Recordings.Del(r0);
|
||||
return;
|
||||
}
|
||||
// Unable to free disk space, but there's nothing we can do about that...
|
||||
isyslog("...no old recording found, giving up");
|
||||
}
|
||||
// Unable to free disk space, but there's nothing we can do about that...
|
||||
isyslog("...no old recording found, giving up");
|
||||
else
|
||||
isyslog("...no deleted recording found, priority %d too low to trigger deleting an old recording", Priority);
|
||||
Skins.QueueMessage(mtWarning, tr("Low disk space!"), 5, -1);
|
||||
}
|
||||
LastFreeDiskCheck = time(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
// --- Clear vanished recordings ---------------------------------------------
|
||||
|
||||
void ClearVanishedRecordings(void)
|
||||
{
|
||||
cThreadLock RecordingsLock(&Recordings); // yes, it *is* Recordings!
|
||||
VanishedRecordings.Clear();
|
||||
}
|
||||
|
||||
// --- cResumeFile -----------------------------------------------------------
|
||||
|
||||
cResumeFile::cResumeFile(const char *FileName, bool IsPesRecording)
|
||||
@ -561,6 +574,7 @@ char *ExchangeChars(char *s, bool ToFileSystem)
|
||||
// characters that can be mapped to other characters:
|
||||
case ' ': *p = '_'; break;
|
||||
case FOLDERDELIMCHAR: *p = '/'; break;
|
||||
case '/': *p = FOLDERDELIMCHAR; break;
|
||||
// characters that have to be encoded:
|
||||
default:
|
||||
if (NeedsConversion(p)) {
|
||||
@ -583,6 +597,7 @@ char *ExchangeChars(char *s, bool ToFileSystem)
|
||||
switch (*p) {
|
||||
// mapped characters:
|
||||
case '_': *p = ' '; break;
|
||||
case FOLDERDELIMCHAR: *p = '/'; break;
|
||||
case '/': *p = FOLDERDELIMCHAR; break;
|
||||
// encoded characters:
|
||||
case '#': {
|
||||
@ -1227,6 +1242,7 @@ cRecordings::cRecordings(bool Deleted)
|
||||
:cThread("video directory scanner")
|
||||
{
|
||||
deleted = Deleted;
|
||||
initial = true;
|
||||
lastUpdate = 0;
|
||||
state = 0;
|
||||
}
|
||||
@ -1258,8 +1274,9 @@ void cRecordings::Refresh(bool Foreground)
|
||||
ScanVideoDir(VideoDirectory, Foreground);
|
||||
}
|
||||
|
||||
void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLevel)
|
||||
void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLevel, int DirLevel)
|
||||
{
|
||||
// Find any new recordings:
|
||||
cReadDir d(DirName);
|
||||
struct dirent *e;
|
||||
while ((Foreground || Running()) && (e = d.Next()) != NULL) {
|
||||
@ -1278,25 +1295,41 @@ void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLev
|
||||
}
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
if (endswith(buffer, deleted ? DELEXT : RECEXT)) {
|
||||
cRecording *r = new cRecording(buffer);
|
||||
if (r->Name()) {
|
||||
r->NumFrames(); // initializes the numFrames member
|
||||
r->FileSizeMB(); // initializes the fileSizeMB member
|
||||
if (deleted)
|
||||
r->deleted = time(NULL);
|
||||
Lock();
|
||||
Add(r);
|
||||
ChangeState();
|
||||
Unlock();
|
||||
if (deleted || initial || !GetByName(buffer)) {
|
||||
cRecording *r = new cRecording(buffer);
|
||||
if (r->Name()) {
|
||||
r->NumFrames(); // initializes the numFrames member
|
||||
r->FileSizeMB(); // initializes the fileSizeMB member
|
||||
if (deleted)
|
||||
r->deleted = time(NULL);
|
||||
Lock();
|
||||
Add(r);
|
||||
ChangeState();
|
||||
Unlock();
|
||||
}
|
||||
else
|
||||
delete r;
|
||||
}
|
||||
else
|
||||
delete r;
|
||||
}
|
||||
else
|
||||
ScanVideoDir(buffer, Foreground, LinkLevel + Link);
|
||||
ScanVideoDir(buffer, Foreground, LinkLevel + Link, DirLevel + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Handle any vanished recordings:
|
||||
if (!deleted && !initial && DirLevel == 0) {
|
||||
for (cRecording *recording = First(); recording; ) {
|
||||
cRecording *r = recording;
|
||||
recording = Next(recording);
|
||||
if (access(r->FileName(), F_OK) != 0) {
|
||||
Lock();
|
||||
Del(r, false);
|
||||
VanishedRecordings.Add(r);
|
||||
ChangeState();
|
||||
Unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool cRecordings::StateChanged(int &State)
|
||||
@ -1337,6 +1370,7 @@ bool cRecordings::Update(bool Wait)
|
||||
cRecording *cRecordings::GetByName(const char *FileName)
|
||||
{
|
||||
if (FileName) {
|
||||
LOCK_THREAD;
|
||||
for (cRecording *recording = First(); recording; recording = Next(recording)) {
|
||||
if (strcmp(recording->FileName(), FileName) == 0)
|
||||
return recording;
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.h 2.46 2013/03/04 14:01:23 kls Exp $
|
||||
* $Id: recording.h 2.46.1.1 2013/12/25 10:54:05 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __RECORDING_H
|
||||
@ -26,6 +26,7 @@ extern bool DirectoryEncoding;
|
||||
extern int InstanceId;
|
||||
|
||||
void RemoveDeletedRecordings(void);
|
||||
void ClearVanishedRecordings(void);
|
||||
void AssertFreeDiskSpace(int Priority = 0, bool Force = false);
|
||||
///< The special Priority value -1 means that we shall get rid of any
|
||||
///< deleted recordings faster than normal (because we're cutting).
|
||||
@ -160,11 +161,12 @@ class cRecordings : public cList<cRecording>, public cThread {
|
||||
private:
|
||||
static char *updateFileName;
|
||||
bool deleted;
|
||||
bool initial;
|
||||
time_t lastUpdate;
|
||||
int state;
|
||||
const char *UpdateFileName(void);
|
||||
void Refresh(bool Foreground = false);
|
||||
void ScanVideoDir(const char *DirName, bool Foreground = false, int LinkLevel = 0);
|
||||
void ScanVideoDir(const char *DirName, bool Foreground = false, int LinkLevel = 0, int DirLevel = 0);
|
||||
protected:
|
||||
void Action(void);
|
||||
public:
|
||||
@ -199,6 +201,8 @@ public:
|
||||
///< this value is unknown.
|
||||
};
|
||||
|
||||
/// Any access to Recordings that loops through the list of recordings
|
||||
/// needs to hold a thread lock on this object!
|
||||
extern cRecordings Recordings;
|
||||
extern cRecordings DeletedRecordings;
|
||||
|
||||
|
14
skinlcars.c
14
skinlcars.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: skinlcars.c 2.21 2013/03/09 10:43:34 kls Exp $
|
||||
* $Id: skinlcars.c 2.21.1.3 2013/11/16 13:28:19 kls Exp $
|
||||
*/
|
||||
|
||||
// "Star Trek: The Next Generation"(R) is a registered trademark of Paramount Pictures,
|
||||
@ -837,6 +837,15 @@ cSkinLCARSDisplayMenu::cSkinLCARSDisplayMenu(void)
|
||||
ys03 = ys04 - Gap;
|
||||
ys05 = yb15;
|
||||
|
||||
// The item area (just to have them initialized, actual setting will be done in SetMenuCategory():
|
||||
|
||||
xi00 = 0;
|
||||
xi01 = 0;
|
||||
xi02 = 0;
|
||||
xi03 = 1;
|
||||
yi00 = 0;
|
||||
yi01 = 1;
|
||||
|
||||
// The color buttons in submenus:
|
||||
xb00 = xa06;
|
||||
xb15 = xa07;
|
||||
@ -1340,6 +1349,8 @@ void cSkinLCARSDisplayMenu::DrawLive(const cChannel *Channel)
|
||||
DrawMainFrameUpper(Theme.Color(clrChannelFrameBg));
|
||||
osd->DrawText(xd00, yd00, tr("LIVE"), Theme.Color(clrChannelFrameBg), Theme.Color(clrBackground), tallFont, xd07 - xd00, yd01 - yd00, taTop | taRight | taBorder);
|
||||
}
|
||||
if (!Channel)
|
||||
return;
|
||||
if (initial || Channel != lastChannel) {
|
||||
osd->DrawText(xa00, yt00, itoa(Channel->Number()), Theme.Color(clrChannelFrameFg), Theme.Color(clrChannelFrameBg), tallFont, xa02 - xa00, yt02 - yt00, taTop | taRight | taBorder);
|
||||
osd->DrawText(xa03, yt00, Channel->Name(), Theme.Color(clrChannelName), Theme.Color(clrBackground), tallFont, xd00 - xa03, yd01 - yd00, taTop | taLeft);
|
||||
@ -1708,6 +1719,7 @@ cSkinLCARSDisplayReplay::cSkinLCARSDisplayReplay(bool ModeOnly)
|
||||
frameColor = Theme.Color(clrReplayFrameBg);
|
||||
lastCurrentWidth = 0;
|
||||
lastTotalWidth = 0;
|
||||
memset(&lastTrackId, 0, sizeof(lastTrackId));
|
||||
int d = 5 * lineHeight;
|
||||
xp00 = 0;
|
||||
xp01 = xp00 + d / 2;
|
||||
|
4
thread.c
4
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 2.7 2013/02/22 14:52:49 kls Exp $
|
||||
* $Id: thread.c 2.7.1.1 2013/04/11 08:59:26 kls Exp $
|
||||
*/
|
||||
|
||||
#include "thread.h"
|
||||
@ -229,7 +229,7 @@ void cThread::SetPriority(int Priority)
|
||||
|
||||
void cThread::SetIOPriority(int Priority)
|
||||
{
|
||||
if (syscall(SYS_ioprio_set, 1, 0, (Priority & 0xff) | (2 << 13)) < 0) // best effort class
|
||||
if (syscall(SYS_ioprio_set, 1, 0, (Priority & 0xff) | (3 << 13)) < 0) // idle class
|
||||
LOG_ERROR;
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: transfer.c 2.8 2013/03/01 09:50:15 kls Exp $
|
||||
* $Id: transfer.c 2.8.1.1 2013/08/22 12:37:02 kls Exp $
|
||||
*/
|
||||
|
||||
#include "transfer.h"
|
||||
@ -35,7 +35,7 @@ void cTransfer::Activate(bool On)
|
||||
cPlayer::Detach();
|
||||
}
|
||||
|
||||
#define MAXRETRIES 5 // max. number of retries for a single TS packet
|
||||
#define MAXRETRIES 20 // max. number of retries for a single TS packet
|
||||
#define RETRYWAIT 5 // time (in ms) between two retries
|
||||
|
||||
void cTransfer::Receive(uchar *Data, int Length)
|
||||
|
4
vdr.1
4
vdr.1
@ -8,7 +8,7 @@
|
||||
.\" License as specified in the file COPYING that comes with the
|
||||
.\" vdr distribution.
|
||||
.\"
|
||||
.\" $Id: vdr.1 2.17 2013/03/15 10:44:54 kls Exp $
|
||||
.\" $Id: vdr.1 2.17.1.1 2013/12/25 11:05:27 kls Exp $
|
||||
.\"
|
||||
.TH vdr 1 "31 Mar 2013" "2.0" "Video Disk Recorder"
|
||||
.SH NAME
|
||||
@ -201,7 +201,7 @@ operation.
|
||||
Allow coredumps if -u is given (only for debugging).
|
||||
.TP
|
||||
.BI \-\-vfat
|
||||
For backwards compatibility (same as \-\-dirnames= 250,40,1.
|
||||
For backwards compatibility (same as \-\-dirnames= 250,40,1).
|
||||
.TP
|
||||
.BI \-v\ dir ,\ \-\-video= dir
|
||||
Use \fIdir\fR as video directory.
|
||||
|
10
vdr.c
10
vdr.c
@ -22,7 +22,7 @@
|
||||
*
|
||||
* The project's page is at http://www.tvdr.de
|
||||
*
|
||||
* $Id: vdr.c 2.57 2013/03/15 10:44:54 kls Exp $
|
||||
* $Id: vdr.c 2.57.1.4 2013/12/25 11:40:37 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -223,6 +223,7 @@ int main(int argc, char *argv[])
|
||||
VdrUser = VDR_USER;
|
||||
#endif
|
||||
|
||||
SetVideoDirectory(VideoDirectory);
|
||||
cPluginManager PluginManager(DEFAULTPLUGINDIR);
|
||||
|
||||
static struct option long_options[] = {
|
||||
@ -443,6 +444,7 @@ int main(int argc, char *argv[])
|
||||
case 'v': VideoDirectory = optarg;
|
||||
while (optarg && *optarg && optarg[strlen(optarg) - 1] == '/')
|
||||
optarg[strlen(optarg) - 1] = 0;
|
||||
SetVideoDirectory(VideoDirectory);
|
||||
break;
|
||||
case 'w': if (isnumber(optarg)) {
|
||||
int t = atoi(optarg);
|
||||
@ -540,7 +542,7 @@ int main(int argc, char *argv[])
|
||||
" -v DIR, --video=DIR use DIR as video directory (default: %s)\n"
|
||||
" -V, --version print version information and exit\n"
|
||||
" --vfat for backwards compatibility (same as\n"
|
||||
" --dirnames=250,40,1\n"
|
||||
" --dirnames=250,40,1)\n"
|
||||
" -w SEC, --watchdog=SEC activate the watchdog timer with a timeout of SEC\n"
|
||||
" seconds (default: %d); '0' disables the watchdog\n"
|
||||
"\n",
|
||||
@ -663,7 +665,6 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Directories:
|
||||
|
||||
SetVideoDirectory(VideoDirectory);
|
||||
if (!ConfigDirectory)
|
||||
ConfigDirectory = DEFAULTCONFDIR;
|
||||
cPlugin::SetConfigDirectory(ConfigDirectory);
|
||||
@ -1234,7 +1235,7 @@ int main(int argc, char *argv[])
|
||||
case osRecordings:
|
||||
DELETE_MENU;
|
||||
cControl::Shutdown();
|
||||
Menu = new cMenuMain(osRecordings);
|
||||
Menu = new cMenuMain(osRecordings, true);
|
||||
break;
|
||||
case osReplay: DELETE_MENU;
|
||||
cControl::Shutdown();
|
||||
@ -1360,6 +1361,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Disk housekeeping:
|
||||
RemoveDeletedRecordings();
|
||||
ClearVanishedRecordings();
|
||||
cSchedules::Cleanup();
|
||||
// Plugins housekeeping:
|
||||
PluginManager.Housekeeping();
|
||||
|
Loading…
x
Reference in New Issue
Block a user