Compare commits

..

No commits in common. "master" and "2.7.3" have entirely different histories.

74 changed files with 351 additions and 423 deletions

View File

@ -2589,13 +2589,6 @@ Markus Ehrnsperger <markus.ehrnsperger@googlemail.com>
systems where 'int' is 64 bit
for suggesting a fix for expiring of one-time VPS timers in case there is more than
one event with the same VPS time
for fixing handling margins for timers that are not VPS controlled and not spawned
for implementing cStatus::OsdItem2() with the information whether the item is selectable
for reporting an improper call of cStatus::OsdCurrentItem() before cStatus::OsdItem2()
for fixing unnecessary calls to DisplayCurrent() for editable menu items
for implementing cStatus::OsdCurrentItem2() with the index of the current item
for adding missing calls to cStatus::MsgOsdStatusMessage() and implementing
cStatus::OsdStatusMessage2() with the type of the message
Werner Färber <w.faerber@gmx.de>
for reporting a bug in handling the cPluginManager::Active() result when pressing
@ -3377,13 +3370,6 @@ Stefan Hofmann <stefan.hofmann@t-online.de>
for a fix for compilers that don't like non-constant format strings
for suggesting to implement jumping between errors while replaying a recording
for adding vdrrootdir and incdir to vdr.pc
for fixing some typos in the translation files
for adding 1 to Utf8BufSize() for worst case
for adding a header to the backtrace
for adding parameter checks to strn0cpy()
for making the info files of recordings only be re-read if they have been modified
for reporting missing setting the file name of the info file after renaming a recording
for adding '~' to the list of delimiters in cTextWrapper
Stefan Blochberger <Stefan.Blochberger@gmx.de>
for suggesting to automatically display the progress display whenever replay of a
@ -3454,6 +3440,7 @@ Matthias Senzel <matthias.senzel@t-online.de>
for fixing an unnecessary double display of menu items in the Recordings menu
for reporting a bug in handling cSkinDisplayMenu::GetTextAreaFont()
for reporting characters being cut off while editing in the LCARS skin
for reporting a bug in error checking in case of large PTS discontinuities
Marek Nazarko <mnazarko@gmail.com>
for translating OSD texts to the Polish language
@ -3816,5 +3803,3 @@ Jose Angel <joseangelpp@gmail.com>
Andreas Baierl <post@andreasbaierl.de>
for implementing scaling images
for reporting a problem in the progress display when switching from "pause" to
"slow back"

58
HISTORY
View File

@ -10025,7 +10025,7 @@ Video Disk Recorder Revision History
- Removed defining DEPRECATED_* macros with value 0, because this is the preprocessor's
default (suggested by Winfried Köhler).
- Fixed error checking in case of large PTS discontinuities.
- Fixed error checking in case of large PTS discontinuities (reported by Matthias Senzel).
- Fixed handling negative values in cSource::Position() on systems where 'int' is 64 bit
(reported by Markus Ehrnsperger, fix suggested by Winfried Köhler).
- Fixed expiring of one-time VPS timers in case there is more than one event with the
@ -10033,59 +10033,3 @@ Video Disk Recorder Revision History
- The Channel+/- keys can now be used to jump between errors while replaying a recording
(suggested by Stefan Hofmann).
- Added vdrrootdir and incdir to vdr.pc (thanks to Stefan Hofmann).
2025-02-26: Version 2.7.4
- Removed all DEPRECATED_* code.
- Fixed error checking in case the fps value can't be determined by the frame parser.
- Updated the Italian OSD texts (thanks to Diego Pierotto).
- The VDR homepage is now accessible via HTTPS.
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed some typos in the translation files (thanks to Stefan Hofmann).
- Added some missing locking.
- TS packets with errors are now skipped when parsing for frames.
- Fixed handling the fps value if it can't be determined from the video data.
- Fixed accessing a timer's event schedule in case the event has been removed from the
schedule.
- Fixed a possible deadlock when canceling an editing process.
- Checking for VPS control is now limited to local timers.
- Added 1 to Utf8BufSize() for worst case (thanks to Stefan Hofmann).
- Fixed handling margins for timers that are not VPS controlled and not spawned (thanks
to Markus Ehrnsperger).
- Added a header to the backtrace (thanks to Stefan Hofmann).
- Added parameter checks to strn0cpy() (thanks to Stefan Hofmann). Same for Utf8Strn0Cpy().
- The info files of recordings are now only re-read if they have been modified (thanks
to Stefan Hofmann).
- The new virtual function cStatus::OsdItem2() can be used to get the information whether
a menu item is selectable (thanks to Markus Ehrnsperger). Plugins that implemented
cStatus::OsdItem() will still work as before, because the default implementation of
cStatus::OsdItem2() calls cStatus::OsdItem().
APIVERSNUM is now 30006.
- Fixed setting the file name of the info file after renaming a recording (reported by
Stefan Hofmann).
- Fixed an improper call of cStatus::OsdCurrentItem() before cStatus::OsdItem2() (reported
by Markus Ehrnsperger).
- Fixed an unnecessary redisplay of the menu when pressing a hotkey.
- Fixed unnecessary calls to DisplayCurrent() for editable menu items (thanks to Markus
Ehrnsperger).
- The new virtual function cStatus::OsdCurrentItem2() can be used to get the index of the
current menu item (thanks to Markus Ehrnsperger). Plugins that implemented
cStatus::OsdCurrentItem() will still work as before, because the default implementation
of cStatus::OsdCurrentItem2() calls cStatus::OsdCurrentItem().
- Fixed unnecessary calls to cStatus::OsdCurrentItem2() when scrolling.
- Added missing calls to cStatus::MsgOsdStatusMessage() and added the new virtual function
cStatus::OsdStatusMessage2(), which can be used to get the type of the message (thanks
to Markus Ehrnsperger). Plugins that implemented cStatus::OsdStatusMessage() will still
work as before, because the default implementation of cStatus::OsdStatusMessage2() calls
cStatus::OsdStatusMessage().
- Adjusted PLUGINS.html to the new API version numbering introduced in version 2.7.2.
- The function cPlugin::MainThreadHook() has been deprecated and may be removed in future
versions. Use proper locking instead.
- Fixed unnecessary redisplays of menus.
- Added '~' to the list of delimiters in cTextWrapper (thanks to Stefan Hofmann).
- Fixed progress display when switching from "pause" to "slow back" (reported by Andreas
Baierl).
- Fixed spurious fast frames when switching from "slow back" to "slow forward".
- Fixed cPtsIndex::FindFrameNumber() to handle the case where Pts points to an I-frame.
- Added missing locks to SetMenuItem() functions.
- Revised locking in cMenuSchedule and cMenuWhatsOn.

View File

@ -4,7 +4,7 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: Makefile 5.4 2024/10/21 19:01:16 kls Exp $
# $Id: Makefile 5.3 2024/10/11 14:21:04 kls Exp $
.DELETE_ON_ERROR:
@ -188,7 +188,7 @@ vdr.pc:
@echo "" >> $@
@echo "Name: VDR" >> $@
@echo "Description: Video Disk Recorder" >> $@
@echo "URL: https://www.tvdr.de/" >> $@
@echo "URL: http://www.tvdr.de/" >> $@
@echo "Version: $(VDRVERSION)" >> $@
@echo "Cflags: \$${cflags}" >> $@

View File

@ -35,7 +35,7 @@ modified {
<p>
Copyright &copy; 2021 Klaus Schmidinger<br>
<a href="mailto:vdr@tvdr.de">vdr@tvdr.de</a><br>
<a href="https://www.tvdr.de">www.tvdr.de</a>
<a href="http://www.tvdr.de">www.tvdr.de</a>
</div>
<p>
VDR provides an easy to use plugin interface that allows additional functionality
@ -74,6 +74,7 @@ structures and allows it to hook itself into specific areas to perform special a
<li><a href="#Main menu entry">Main menu entry</a>
<li><a href="#User interaction">User interaction</a>
<li><a href="#Housekeeping">Housekeeping</a>
<li><a href="#Main thread hook">Main thread hook</a>
<li><a href="#Activity">Activity</a>
<li><a href="#Wakeup">Wakeup</a>
<li><a href="#Setup parameters">Setup parameters</a>
@ -165,7 +166,7 @@ is used:
VDR/PLUGINS/src
VDR/PLUGINS/src/hello
VDR/PLUGINS/lib
VDR/PLUGINS/lib/libvdr-hello.so.1
VDR/PLUGINS/lib/libvdr-hello.so.1.1.0
</pre></td></tr></table><p>
The <tt>src</tt> directory contains one subdirectory for each plugin, which carries
@ -184,7 +185,7 @@ The <tt>lib</tt> directory contains the dynamically loadable libraries of all
available plugins. Note that the names of these files are created by concatenating
<p>
<table border=2>
<tr><td align=center><b><tt>libvdr-</tt></b></td><td align=center><b><tt>hello</tt></b></td><td align=center><b><tt>.so.</tt></b></td><td align=center><b><tt>1</tt></b></td></tr>
<tr><td align=center><b><tt>libvdr-</tt></b></td><td align=center><b><tt>hello</tt></b></td><td align=center><b><tt>.so.</tt></b></td><td align=center><b><tt>1.1.0</tt></b></td></tr>
<tr><td align=center><small>VDR plugin<br>library prefix</small></td><td align=center><small>name of<br>the plugin</small></td><td align=center><small>shared object<br>indicator</small></td><td align=center><small>API version number<br>this plugin was<br>compiled for</small></td></tr>
</table>
<p>
@ -195,11 +196,6 @@ the current VDR version. That way minor fixes to VDR, that don't require changes
to the VDR header files, can be made without requiring all plugins to be
recompiled.
<p>
While in earlier versions of VDR the API version number was closely related to the
VDR version number, starting with VDR version 2.7.2 the API version number was changed
from a dot separated, three part number to a single integer, completely unrelated to
the VDR version. This was done to avoid confusion.
<p>
The plugin library files can be stored in any directory. If the default organization
is not used, the path to the plugin directory has be be given to VDR through the
<b><tt>-L</tt></b> option.
@ -395,7 +391,13 @@ just like shown in the above example. This is a convention that allows the <tt>M
to extract the version number when generating the file name for the distribution archive.
<p>
A new plugin project should start with version number <tt>0.0.1</tt> and should reach
version <tt>1.0.0</tt> once it is completely operative and well tested.
version <tt>1.0.0</tt> once it is completely operative and well tested. Following the
Linux kernel version numbering scheme, versions with <i>even</i> release numbers
(like <tt>1.0.x</tt>, <tt>1.2.x</tt>, <tt>1.4.x</tt>...) should be stable releases,
while those with <i>odd</i> release numbers (like <tt>1.1.x</tt>, <tt>1.3.x</tt>,
<tt>1.5.x</tt>...) are usually considered "under development". The three parts of
a version number are not limited to single digits, so a version number of <tt>1.2.15</tt>
would be acceptable.
<hr><h2><a name="Description">Description</a></h2>
@ -691,6 +693,27 @@ interaction is possible. If a specific action takes longer than a few seconds,
the plugin should launch a separate thread to do this.
</b>
<hr><h2><a name="Main thread hook">Main thread hook</a></h2>
<div class="blurb">Pushing in...</div><p>
Normally a plugin only reacts on user input if directly called through its
<a href="#Main menu entry">main menu entry</a>, or performs some background
activity in a separate thread. However, sometimes a plugin may need to do
something in the context of the main program thread, without being explicitly
called up by the user. In such a case it can implement the function
<p><table><tr><td class="code"><pre>
virtual void MainThreadHook(void);
</pre></td></tr></table><p>
in which it can do this. This function is called for every plugin once during
every cycle of VDR's main program loop, which typically happens once every
second.
<b>Be very careful when using this function, and make sure you return from it
as soon as possible! If you spend too much time in this function, the user
interface performance will become sluggish!</b>
<hr><h2><a name="Activity">Activity</a></h2>
<div class="blurb">Now is not a good time!</div><p>

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de
Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de
Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de
Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de
Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Udo Richter <udo_richter@gmx.de>
Project's homepage: https://www.tvdr.de
Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de
Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -76,10 +76,3 @@ VDR Plugin 'status' Revision History
2021-12-27: Version 2.6.0
- Official release.
2025-02-10: Version 2.6.1
- Added cStatus::OsdItem2().
- Activated logging of OsdItem2().
- Added cStatus::OsdCurrentItem2().
- Added cStatus::OsdStatusMessage2().

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de
Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -3,13 +3,13 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: status.c 5.4 2025/02/12 21:18:53 kls Exp $
* $Id: status.c 4.1 2018/04/10 13:01:03 kls Exp $
*/
#include <vdr/plugin.h>
#include <vdr/status.h>
static const char *VERSION = "2.6.1";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = "Status monitor test";
static const char *MAINMENUENTRY = NULL;
@ -27,10 +27,10 @@ protected:
virtual void SetSubtitleTrack(int Index, const char * const *Tracks);
virtual void OsdClear(void);
virtual void OsdTitle(const char *Title);
virtual void OsdStatusMessage2(eMessageType Type, const char *Message);
virtual void OsdStatusMessage(const char *Message);
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
virtual void OsdItem2(const char *Text, int Index, bool Selectable);
virtual void OsdCurrentItem2(const char *Text, int Index);
virtual void OsdItem(const char *Text, int Index);
virtual void OsdCurrentItem(const char *Text);
virtual void OsdTextItem(const char *Text, bool Scroll);
virtual void OsdChannel(const char *Text);
virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
@ -86,9 +86,9 @@ void cStatusTest::OsdTitle(const char *Title)
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
}
void cStatusTest::OsdStatusMessage2(eMessageType Type, const char *Message)
void cStatusTest::OsdStatusMessage(const char *Message)
{
dsyslog("status: cStatusTest::OsdStatusMessage2 %d '%s'", Type, Message);
dsyslog("status: cStatusTest::OsdStatusMessage '%s'", Message);
}
void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
@ -96,14 +96,14 @@ void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Ye
dsyslog("status: cStatusTest::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue);
}
void cStatusTest::OsdItem2(const char *Text, int Index, bool Selected)
void cStatusTest::OsdItem(const char *Text, int Index)
{
dsyslog("status: cStatusTest::OsdItem2 %s %d %d", Text, Index, Selected);
//dsyslog("status: cStatusTest::OsdItem %s %d", Text, Index);
}
void cStatusTest::OsdCurrentItem2(const char *Text, int Index)
void cStatusTest::OsdCurrentItem(const char *Text)
{
dsyslog("status: cStatusTest::OsdCurrentItem %s %d", Text, Index);
dsyslog("status: cStatusTest::OsdCurrentItem %s", Text);
}
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
Project's homepage: https://www.tvdr.de
Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

4
README
View File

@ -4,7 +4,7 @@ Video Disk Recorder ('VDR')
These files contain the source code of the "Video Disk Recorder",
which is based on the DVB driver of the LinuxTV project (http://linuxtv.org).
For details about the "Video Disk Recorder" project please
refer to https://www.tvdr.de.
refer to http://www.tvdr.de.
Please see the INSTALL file for details on how to install
this program on your computer.
@ -33,7 +33,7 @@ the ones in this system, but here we have the full source code
and can modify the menus in whatever way desired.
If you actually use VDR, please add yourself to the "VDR User Counter"
at https://www.tvdr.de/counter.htm. You can also like VDR on facebook
at http://www.tvdr.de/counter.htm. You can also like VDR on facebook
at https://www.facebook.com/VideoDiskRecorder.

View File

@ -10,7 +10,7 @@ Plugins:
- Implemented a universal plugin interface. See the file PLUGINS.html
for a detailed description. The man page vdr(1) describes the new options '-L'
and '-P' used to load plugins.
See https://www.tvdr.de/plugins.htm for a list of available plugins.
See http://www.tvdr.de/plugins.htm for a list of available plugins.
- Rearranged the remote control key handling to allow plugins to implement
additional types of remote controls (see PLUGINS.html, section "Remote Control").
The previously used files 'keys.conf' and 'keys-pc.conf' have been replaced

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 5.26 2025/02/26 10:35:03 kls Exp $
* $Id: config.h 5.24 2024/10/12 13:32:46 kls Exp $
*/
#ifndef __CONFIG_H
@ -22,13 +22,13 @@
// VDR's own version number:
#define VDRVERSION "2.7.4"
#define VDRVERSNUM 20704 // Version * 10000 + Major * 100 + Minor
#define VDRVERSION "2.7.3"
#define VDRVERSNUM 20703 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number:
#define APIVERSION "6"
#define APIVERSNUM 30006
#define APIVERSION "5"
#define APIVERSNUM 30005
// When loading plugins, VDR searches files by their APIVERSION, which
// is different from VDRVERSION. APIVERSION is a plain number, incremented

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: cutter.c 5.4 2025/01/10 13:12:04 kls Exp $
* $Id: cutter.c 5.3 2024/09/20 21:34:18 kls Exp $
*/
#include "cutter.h"
@ -623,11 +623,8 @@ void cCuttingThread::HandleErrors(bool Force)
Force = true;
}
if (Force) {
cStateKey StateKey;
if (cRecordings *Recordings = cRecordings::GetRecordingsWrite(StateKey, 1)) {
LOCK_RECORDINGS_WRITE;
Recordings->UpdateByName(editedRecordingName);
StateKey.Remove();
}
}
lastErrorHandling = time(NULL);
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: dvbplayer.c 5.7 2025/02/19 15:39:16 kls Exp $
* $Id: dvbplayer.c 5.4 2024/09/19 09:49:02 kls Exp $
*/
#include "dvbplayer.h"
@ -36,7 +36,7 @@ public:
bool IsEmpty(void);
void Put(uint32_t Pts, int Index, bool Independent);
int FindIndex(uint32_t Pts);
int FindFrameNumber(uint32_t Pts, bool Forward);
int FindFrameNumber(uint32_t Pts);
};
cPtsIndex::cPtsIndex(void)
@ -90,29 +90,29 @@ int cPtsIndex::FindIndex(uint32_t Pts)
return Index;
}
int cPtsIndex::FindFrameNumber(uint32_t Pts, bool Forward)
int cPtsIndex::FindFrameNumber(uint32_t Pts)
{
if (!Forward)
return FindIndex(Pts); // there are only I frames in backward
cMutexLock MutexLock(&mutex);
if (w == r)
return lastFound; // replay always starts at an I frame
bool Valid = false;
int d;
int FrameNumber = 0;
int UnplayedIFrame = 2; // GOPs may intersect, so we loop until we processed a complete unplayed GOP
int UnplayedIFrame = 2; // GOPs may intersect, so we're looping until we found two unplayed I frames
for (int i = r; i != w && UnplayedIFrame; ) {
int32_t d = int32_t(Pts - pi[i].pts); // typecast handles rollover
if (d >= 0) {
d = Pts - pi[i].pts;
if (d > 0x7FFFFFFF)
d = 0xFFFFFFFF - d; // handle rollover
if (d > 0) {
if (pi[i].independent) {
FrameNumber = pi[i].index; // an I frame's index represents its frame number
Valid = true;
if (d == 0)
UnplayedIFrame = 1; // if Pts is at an I frame we only need to check up to the next I frame
}
else
FrameNumber++; // for every played non-I frame, increase frame number
}
else if (pi[i].independent)
else
if (pi[i].independent)
--UnplayedIFrame;
if (++i >= PTSINDEX_ENTRIES)
i = 0;
@ -793,17 +793,15 @@ void cDvbPlayer::Forward(void)
Pause();
break;
}
Empty();
// run into pmPause
case pmStill:
case pmPause: {
LOCK_THREAD;
Empty();
case pmPause:
DeviceMute();
playMode = pmSlow;
playDir = pdForward;
trickSpeed = NORMAL_SPEED;
TrickSpeed(Setup.MultiSpeedMode ? -1 : -MAX_SPEEDS);
}
break;
default: esyslog("ERROR: unknown playMode %d (%s)", playMode, __FUNCTION__);
}
@ -844,6 +842,7 @@ void cDvbPlayer::Backward(void)
Pause();
break;
}
Empty();
// run into pmPause
case pmStill:
case pmPause: {
@ -968,7 +967,7 @@ bool cDvbPlayer::GetIndex(int &Current, int &Total, bool SnapToIFrame)
bool cDvbPlayer::GetFrameNumber(int &Current, int &Total)
{
if (index) {
Current = ptsIndex.FindFrameNumber(DeviceGetSTC(), playDir == pdForward);
Current = ptsIndex.FindFrameNumber(DeviceGetSTC());
Total = index->Last();
return true;
}

18
epg.c
View File

@ -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 5.13 2024/11/30 14:30:46 kls Exp $
* $Id: epg.c 5.11 2024/09/26 19:25:41 kls Exp $
*/
#include "epg.h"
@ -303,7 +303,7 @@ const char *cEvent::ContentToString(uchar Content)
case 0x01: return tr("Content$News/Weather Report");
case 0x02: return tr("Content$News Magazine");
case 0x03: return tr("Content$Documentary");
case 0x04: return tr("Content$Discussion/Interview/Debate");
case 0x04: return tr("Content$Discussion/Inverview/Debate");
}
break;
case ecgShow:
@ -349,7 +349,7 @@ const char *cEvent::ContentToString(uchar Content)
case 0x00: return tr("Content$Music/Ballet/Dance");
case 0x01: return tr("Content$Rock/Pop");
case 0x02: return tr("Content$Serious/Classical Music");
case 0x03: return tr("Content$Folk/Traditional Music");
case 0x03: return tr("Content$Folk/Tradional Music");
case 0x04: return tr("Content$Jazz");
case 0x05: return tr("Content$Musical/Opera");
case 0x06: return tr("Content$Ballet");
@ -1030,6 +1030,18 @@ const cEvent *cSchedule::GetFollowingEvent(void) const
return p;
}
#if DEPRECATED_SCHEDULE_GET_EVENT
const cEvent *cSchedule::GetEvent(tEventID EventID, time_t StartTime) const
{
// Returns the event info with the given StartTime or, if no actual StartTime
// is given, the one with the given EventID.
if (StartTime > 0) // 'StartTime < 0' is apparently used with NVOD channels
return eventsHashStartTime.Get(StartTime);
else
return eventsHashID.Get(EventID);
}
#endif
const cEvent *cSchedule::GetEventById(tEventID EventID) const
{
return eventsHashID.Get(EventID);

6
epg.h
View File

@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
* $Id: epg.h 5.8 2024/10/13 09:47:18 kls Exp $
* $Id: epg.h 5.7 2024/10/08 08:09:48 kls Exp $
*/
#ifndef __EPG_H
@ -186,6 +186,10 @@ public:
const cList<cEvent> *Events(void) const { return &events; }
const cEvent *GetPresentEvent(void) const;
const cEvent *GetFollowingEvent(void) const;
#if DEPRECATED_SCHEDULE_GET_EVENT
[[deprecated("see HISTORY, version 2.5.2")]]
const cEvent *GetEvent(tEventID EventID, time_t StartTime = 0) const;
#endif
const cEvent *GetEventById(tEventID EventID) const;
const cEvent *GetEventByTime(time_t StartTime) const;
const cEvent *GetEventAround(time_t Time) const;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: filter.c 5.2 2024/10/13 09:47:18 kls Exp $
* $Id: filter.c 5.1 2021/03/16 15:10:54 kls Exp $
*/
#include "filter.h"
@ -73,6 +73,35 @@ bool cSectionSyncer::Processed(int SectionNumber, int LastSectionNumber, int Seg
return complete;
}
#if DEPRECATED_SECTIONSYNCER_SYNC_REPEAT
void cSectionSyncer::Repeat(void)
{
SetSectionFlag(currentSection, false);
synced = false;
complete = false;
}
bool cSectionSyncer::Sync(uchar Version, int Number, int LastNumber)
{
if (Version != currentVersion) {
Reset();
currentVersion = Version;
}
if (!synced) {
if (Number != 0)
return false;
else
synced = true;
}
currentSection = Number;
bool Result = !GetSectionFlag(Number);
SetSectionFlag(Number, true);
if (Number == LastNumber)
complete = true;
return Result;
}
#endif
// --- cFilterData -----------------------------------------------------------
cFilterData::cFilterData(void)

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: filter.h 5.5 2024/10/13 09:47:18 kls Exp $
* $Id: filter.h 5.4 2024/10/08 08:09:48 kls Exp $
*/
#ifndef __FILTER_H
@ -47,6 +47,12 @@ public:
///< Returns true if all sections have been processed.
bool Complete(void) { return complete; }
///< Returns true if all sections have been processed.
#if DEPRECATED_SECTIONSYNCER_SYNC_REPEAT
[[deprecated("see HISTORY, version 2.5.2")]]
void Repeat(void);
[[deprecated("see HISTORY, version 2.5.2")]]
bool Sync(uchar Version, int Number, int LastNumber);
#endif
};
class cSectionSyncerRandom : public cSectionSyncer {

4
font.c
View File

@ -6,7 +6,7 @@
*
* BiDi support by Osama Alrawab <alrawab@hotmail.com> @2008 Tripoli-Libya.
*
* $Id: font.c 5.3 2025/02/17 11:13:13 kls Exp $
* $Id: font.c 5.2 2022/12/06 12:30:13 kls Exp $
*/
#include "font.h"
@ -618,7 +618,7 @@ void cTextWrapper::Set(const char *Text, const cFont *Font, int Width)
}
}
w += cw;
if (strchr("-.,:;!?_~", *p)) {
if (strchr("-.,:;!?_", *p)) {
Delim = p;
Blank = NULL;
}

53
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 5.23 2025/02/25 15:53:43 kls Exp $
* $Id: menu.c 5.18 2024/10/11 14:10:50 kls Exp $
*/
#include "menu.h"
@ -342,7 +342,6 @@ void cMenuChannelItem::Set(void)
void cMenuChannelItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
LOCK_CHANNELS_READ;
if (!DisplayMenu->SetItemChannel(channel, Index, Current, Selectable, sortMode == csmProvider))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
@ -444,9 +443,8 @@ eOSState cMenuChannels::Number(eKeys Key)
number = number * 10 + Key - k0;
for (cMenuChannelItem *ci = (cMenuChannelItem *)First(); ci; ci = (cMenuChannelItem *)ci->Next()) {
if (!ci->Channel()->GroupSep() && ci->Channel()->Number() == number) {
DisplayCurrent(false);
SetCurrent(ci);
DisplayCurrent(true);
Display();
break;
}
}
@ -1265,7 +1263,6 @@ void cMenuTimerItem::Set(void)
}
const char *File = timer->Pattern();
if (!*File) {
LOCK_SCHEDULES_READ;
if (timer->HasFlags(tfSpawned) && timer->Event() && timer->Event()->Title())
File = timer->Event()->Title();
else {
@ -1294,7 +1291,6 @@ void cMenuTimerItem::Set(void)
void cMenuTimerItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
LOCK_TIMERS_READ;
if (!DisplayMenu->SetItemTimer(timer, Index, Current, Selectable))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
@ -1338,15 +1334,12 @@ void cMenuTimers::Set(void)
const cTimer *CurrentTimer = GetTimer();
cMenuTimerItem *CurrentItem = NULL;
Clear();
{
LOCK_SCHEDULES_READ;
for (const cTimer *Timer = Timers->First(); Timer; Timer = Timers->Next(Timer)) {
cMenuTimerItem *Item = new cMenuTimerItem(Timer);
Add(Item);
if (CurrentTimer && Timer->Id() == CurrentTimer->Id() && (!Timer->Remote() && !CurrentTimer->Remote() || Timer->Remote() && CurrentTimer->Remote() && strcmp(Timer->Remote(), CurrentTimer->Remote()) == 0))
CurrentItem = Item;
}
}
Sort();
SetCurrent(CurrentItem ? CurrentItem : First());
SetHelpKeys();
@ -1461,7 +1454,6 @@ eOSState cMenuTimers::Info(void)
return osContinue;
LOCK_TIMERS_READ;
LOCK_CHANNELS_READ;
LOCK_SCHEDULES_READ;
cTimer *Timer = GetTimer();
if (Timer && Timer->Event())
return AddSubMenu(new cMenuEvent(Timers, Channels, Timer->Event()));
@ -1521,7 +1513,6 @@ cMenuEvent::cMenuEvent(const cTimers *Timers, const cChannels *Channels, const c
void cMenuEvent::Display(void)
{
LOCK_SCHEDULES_READ;
cOsdMenu::Display();
DisplayMenu()->SetEvent(event);
if (event->Description())
@ -1608,8 +1599,6 @@ static const char *TimerMatchChars = " tT iI";
bool cMenuScheduleItem::Update(const cTimers *Timers, bool Force)
{
LOCK_CHANNELS_READ;
LOCK_SCHEDULES_READ;
eTimerMatch OldTimerMatch = timerMatch;
bool OldTimerActive = timerActive;
const cTimer *Timer = Timers->GetMatch(event, &timerMatch);
@ -1637,8 +1626,6 @@ bool cMenuScheduleItem::Update(const cTimers *Timers, bool Force)
void cMenuScheduleItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
LOCK_CHANNELS_READ;
LOCK_SCHEDULES_READ;
if (!DisplayMenu->SetItemEvent(event, Index, Current, Selectable, channel, withDate, timerMatch, timerActive))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
@ -1684,6 +1671,7 @@ cMenuWhatsOn::cMenuWhatsOn(const cTimers *Timers, const cChannels *Channels, con
}
}
currentChannel = CurrentChannelNr;
Display();
SetHelpKeys(Channels);
}
@ -1784,8 +1772,10 @@ eOSState cMenuWhatsOn::Record(void)
if (HasSubMenu())
CloseSubMenu();
}
if (Update())
if (Update()) {
LOCK_SCHEDULES_READ;
Display();
}
LOCK_CHANNELS_READ;
SetHelpKeys(Channels);
return osContinue;
@ -1805,7 +1795,6 @@ eOSState cMenuWhatsOn::ProcessKey(eKeys Key)
case kGreen: {
cMenuScheduleItem *mi = (cMenuScheduleItem *)Get(Current());
if (mi) {
LOCK_CHANNELS_READ;
scheduleEvent = mi->event;
currentChannel = mi->channel->Number();
}
@ -1818,12 +1807,14 @@ eOSState cMenuWhatsOn::ProcessKey(eKeys Key)
case kChanUp:
case kChanDn|k_Repeat:
case kChanDn: if (!HasSubMenu()) {
LOCK_CHANNELS_READ;
for (cOsdItem *item = First(); item; item = Next(item)) {
if (((cMenuScheduleItem *)item)->channel->Number() == cDevice::CurrentChannel()) {
DisplayCurrent(false);
SetCurrent(item);
DisplayCurrent(true);
{
LOCK_SCHEDULES_READ;
Display();
}
LOCK_CHANNELS_READ;
SetHelpKeys(Channels);
break;
}
@ -1841,8 +1832,10 @@ eOSState cMenuWhatsOn::ProcessKey(eKeys Key)
}
}
else if (!HasSubMenu()) {
if (HadSubMenu && Update())
if (HadSubMenu && Update()) {
LOCK_SCHEDULES_READ;
Display();
}
if (Key != kNone) {
LOCK_CHANNELS_READ;
SetHelpKeys(Channels);
@ -2090,8 +2083,10 @@ eOSState cMenuSchedule::Record(void)
if (HasSubMenu())
CloseSubMenu();
}
if (Update())
if (Update()) {
LOCK_SCHEDULES_READ;
Display();
}
SetHelpKeys();
return osContinue;
}
@ -2185,8 +2180,10 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key)
Set(Timers, Channels, Channel, true);
}
}
else if (HadSubMenu && Update())
else if (HadSubMenu && Update()) {
LOCK_SCHEDULES_READ;
Display();
}
if (Key != kNone)
SetHelpKeys();
}
@ -3045,7 +3042,6 @@ void cMenuRecordingItem::IncrementCounter(bool New)
void cMenuRecordingItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable)
{
LOCK_RECORDINGS_READ;
if (!DisplayMenu->SetItemRecording(recording, Index, Current, Selectable, level, totalEntries, newEntries))
DisplayMenu->SetItem(Text(), Index, Current, Selectable);
}
@ -4670,16 +4666,15 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
default: break;
}
}
bool DoDisplay = Update();
if (!HasSubMenu() && Update(HadSubMenu))
Display();
if (Key != kNone) {
if (I18nCurrentLanguage() != osdLanguage) {
Set();
if (!HasSubMenu())
DoDisplay = true;
}
}
if (DoDisplay)
Display();
}
}
return state;
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menuitems.c 5.3 2025/01/29 10:20:17 kls Exp $
* $Id: menuitems.c 5.2 2024/07/13 09:12:18 kls Exp $
*/
#include "menuitems.h"
@ -38,6 +38,7 @@ void cMenuEditItem::SetValue(const char *Value)
{
cString buffer = cString::sprintf("%s:\t%s", name, Value);
SetText(buffer);
cStatus::MsgOsdCurrentItem(buffer);
}
void cMenuEditItem::SetHelp(const char *Red, const char *Green, const char *Yellow, const char *Blue)

View File

@ -12,7 +12,7 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: newplugin 5.2 2025/02/12 22:22:20 kls Exp $
# $Id: newplugin 5.1 2021/01/02 14:32:20 kls Exp $
$PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
@ -216,6 +216,7 @@ public:
virtual bool Start(void);
virtual void Stop(void);
virtual void Housekeeping(void);
virtual void MainThreadHook(void);
virtual cString Active(void);
virtual time_t WakeupTime(void);
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
@ -273,6 +274,12 @@ void cPlugin${PLUGIN_CLASS}::Housekeeping(void)
// Perform any cleanup or other regular tasks.
}
void cPlugin${PLUGIN_CLASS}::MainThreadHook(void)
{
// Perform actions in the context of the main program thread.
// WARNING: Use with great care - see PLUGINS.html!
}
cString cPlugin${PLUGIN_CLASS}::Active(void)
{
// Return a message string if shutdown should be postponed

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osdbase.c 5.9 2025/02/17 10:49:10 kls Exp $
* $Id: osdbase.c 5.1 2024/01/19 12:10:47 kls Exp $
*/
#include "osdbase.h"
@ -78,16 +78,12 @@ void cOsdObject::Show(void)
cSkinDisplayMenu *cOsdMenu::displayMenu = NULL;
int cOsdMenu::displayMenuCount = 0;
int cOsdMenu::osdState = 0;
cOsdMenu *cOsdMenu::topMenu = NULL;
cOsdMenu::cOsdMenu(const char *Title, int c0, int c1, int c2, int c3, int c4)
{
isMenu = true;
digit = 0;
hasHotkeys = false;
if (!topMenu)
topMenu = this;
active = this == topMenu;
displayMenuItems = 0;
title = NULL;
menuCategory = mcUnknown;
@ -97,7 +93,6 @@ cOsdMenu::cOsdMenu(const char *Title, int c0, int c1, int c2, int c3, int c4)
SetCols(c0, c1, c2, c3, c4);
first = 0;
lastOffset = -1;
conveyStatus = true;
current = marked = -1;
subMenu = NULL;
helpRed = helpGreen = helpYellow = helpBlue = NULL;
@ -118,8 +113,6 @@ cOsdMenu::~cOsdMenu()
cStatus::MsgOsdClear();
if (!--displayMenuCount)
DELETENULL(displayMenu);
if (this == topMenu)
topMenu = NULL;
}
void cOsdMenu::SetMenuCategory(eMenuCategory MenuCategory)
@ -132,11 +125,6 @@ void cOsdMenu::SetMenuSortMode(eMenuSortMode MenuSortMode)
menuSortMode = MenuSortMode;
}
void cOsdMenu::SetActive(bool Active)
{
active = Active;
}
void cOsdMenu::SetDisplayMenu(void)
{
if (displayMenu) {
@ -181,7 +169,6 @@ void cOsdMenu::SetStatus(const char *s)
free(status);
status = s ? strdup(s) : NULL;
displayMenu->SetMessage(mtStatus, s);
cStatus::MsgOsdStatusMessage(mtStatus, s);
}
void cOsdMenu::SetTitle(const char *Title)
@ -194,7 +181,6 @@ void cOsdMenu::DisplayHelp(bool Force)
{
if (!helpDisplayed || Force) {
displayMenu->SetButtons(helpRed, helpGreen, helpYellow, helpBlue);
if (conveyStatus)
cStatus::MsgOsdHelpKeys(helpRed, helpGreen, helpYellow, helpBlue);
helpDisplayed = true;
}
@ -238,27 +224,16 @@ void cOsdMenu::Ins(cOsdItem *Item, bool Current, cOsdItem *Before)
current = Item->Index();
}
void cOsdMenu::DisplayNoStatus(void)
{
conveyStatus = false;
Display();
conveyStatus = true;
}
void cOsdMenu::Display(void)
{
if (subMenu) {
subMenu->Display();
return;
}
if (!active)
return;
if (cOsdProvider::OsdSizeChanged(osdState))
SetDisplayMenu();
displayMenu->SetMessage(mtStatus, NULL);
cStatus::MsgOsdStatusMessage(mtStatus, NULL);
displayMenu->Clear();
if (conveyStatus)
cStatus::MsgOsdClear();
if (menuCategory != displayMenu->MenuCategory())
displayMenu->SetMenuCategory(menuCategory);
@ -267,15 +242,13 @@ void cOsdMenu::Display(void)
displayMenuItems = displayMenu->MaxItems();
displayMenu->SetTabs(cols[0], cols[1], cols[2], cols[3], cols[4]);//XXX
displayMenu->SetTitle(title);
if (conveyStatus)
cStatus::MsgOsdTitle(title);
DisplayHelp(true);
int count = Count();
if (count > 0) {
int ni = 0;
for (cOsdItem *item = First(); item; item = Next(item)) {
if (conveyStatus)
cStatus::MsgOsdItem(item->Text(), ni++, item->Selectable());
cStatus::MsgOsdItem(item->Text(), ni++);
if (current < 0 && item->Selectable())
current = item->Index();
}
@ -294,18 +267,16 @@ void cOsdMenu::Display(void)
for (cOsdItem *item = Get(first); item; item = Next(item)) {
bool CurrentSelectable = (i == current) && item->Selectable();
item->SetMenuItem(displayMenu, i - first, CurrentSelectable, item->Selectable());
if (CurrentSelectable) // not checking conveyStatus here!
cStatus::MsgOsdCurrentItem(item->Text(), i);
if (CurrentSelectable)
cStatus::MsgOsdCurrentItem(item->Text());
if (++n == displayMenuItems)
break;
i++;
}
}
displayMenu->SetScrollbar(count, first);
if (!isempty(status)) {
if (!isempty(status))
displayMenu->SetMessage(mtStatus, status);
cStatus::MsgOsdStatusMessage(mtStatus, status);
}
}
void cOsdMenu::SetCurrent(cOsdItem *Item)
@ -328,13 +299,9 @@ void cOsdMenu::DisplayCurrent(bool Current)
cOsdItem *item = Get(current);
if (item) {
item->SetMenuItem(displayMenu, current - first, Current && item->Selectable(), item->Selectable());
if (Current) {
if (current - first >= displayMenuItems || current < first)
DisplayNoStatus();
else if (item->Selectable())
cStatus::MsgOsdCurrentItem(item->Text(), current);
}
else
if (Current && item->Selectable())
cStatus::MsgOsdCurrentItem(item->Text());
if (!Current)
item->SetFresh(true); // leaving the current item resets 'fresh'
if (cMenuEditItem *MenuEditItem = dynamic_cast<cMenuEditItem *>(item)) {
if (!MenuEditItem->DisplayHelp(Current))
@ -354,7 +321,7 @@ void cOsdMenu::DisplayItem(cOsdItem *Item)
bool Current = Index == current;
Item->SetMenuItem(displayMenu, Offset, Current && Item->Selectable(), Item->Selectable());
if (Current && Item->Selectable())
cStatus::MsgOsdCurrentItem(Item->Text(), Index);
cStatus::MsgOsdCurrentItem(Item->Text());
}
}
}
@ -388,7 +355,7 @@ void cOsdMenu::CursorUp(void)
if (first > 0) {
// make non-selectable items at the beginning visible:
first = 0;
DisplayNoStatus();
Display();
return;
}
if (Setup.MenuScrollWrap)
@ -404,11 +371,11 @@ void cOsdMenu::CursorUp(void)
current = tmpCurrent;
if (current < first) {
first = Setup.MenuScrollPage ? max(0, current - displayMenuItems + 1) : current;
DisplayNoStatus();
Display();
}
else if (current > lastOnScreen) {
first = max(0, current - displayMenuItems + 1);
DisplayNoStatus();
Display();
}
else
DisplayCurrent(true);
@ -426,7 +393,7 @@ void cOsdMenu::CursorDown(void)
if (first < last - displayMenuItems) {
// make non-selectable items at the end visible:
first = last - displayMenuItems + 1;
DisplayNoStatus();
Display();
return;
}
if (Setup.MenuScrollWrap)
@ -444,11 +411,11 @@ void cOsdMenu::CursorDown(void)
first = Setup.MenuScrollPage ? current : max(0, current - displayMenuItems + 1);
if (first + displayMenuItems > last)
first = max(0, last - displayMenuItems + 1);
DisplayNoStatus();
Display();
}
else if (current < first) {
first = current;
DisplayNoStatus();
Display();
}
else
DisplayCurrent(true);
@ -481,7 +448,7 @@ void cOsdMenu::PageUp(void)
first = current - displayMenuItems + 1;
}
if (current != oldCurrent || first != oldFirst)
DisplayNoStatus();
Display();
else if (Setup.MenuScrollWrap)
CursorUp();
}
@ -513,7 +480,7 @@ void cOsdMenu::PageDown(void)
first = current - displayMenuItems + 1;
}
if (current != oldCurrent || first != oldFirst)
DisplayNoStatus();
Display();
else if (Setup.MenuScrollWrap)
CursorDown();
}
@ -532,10 +499,9 @@ eOSState cOsdMenu::HotKey(eKeys Key)
const char *s = item->Text();
if (s && (s = skipspace(s)) != NULL) {
if (*s == Key - k1 + '1') {
DisplayCurrent(false);
current = item->Index();
RefreshCurrent();
DisplayCurrent(true);
Display();
cRemote::Put(kOk, true);
break;
}
@ -546,10 +512,8 @@ eOSState cOsdMenu::HotKey(eKeys Key)
eOSState cOsdMenu::AddSubMenu(cOsdMenu *SubMenu)
{
SetActive(false);
delete subMenu;
subMenu = SubMenu;
subMenu->SetActive(true);
subMenu->Display();
return osContinue; // convenience return value
}
@ -558,7 +522,6 @@ eOSState cOsdMenu::CloseSubMenu(bool ReDisplay)
{
delete subMenu;
subMenu = NULL;
SetActive(true);
if (ReDisplay) {
RefreshCurrent();
Display();
@ -579,7 +542,6 @@ eOSState cOsdMenu::ProcessKey(eKeys Key)
if (marked < 0 && item) {
eOSState state = item->ProcessKey(Key);
if (state != osUnknown) {
if (Key != kNone)
DisplayCurrent(true);
return state;
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osdbase.h 5.2 2025/02/17 10:49:10 kls Exp $
* $Id: osdbase.h 4.5 2018/01/25 15:09:23 kls Exp $
*/
#ifndef __OSDBASE_H
@ -87,13 +87,11 @@ private:
static cSkinDisplayMenu *displayMenu;
static int displayMenuCount;
static int osdState;
static cOsdMenu *topMenu;
int displayMenuItems;
char *title;
int cols[cSkinDisplayMenu::MaxTabs];
int first, current, marked;
int lastOffset;
bool conveyStatus;
eMenuCategory menuCategory;
eMenuSortMode menuSortMode;
eMenuOrientation menuOrientation;
@ -103,10 +101,7 @@ private:
char *status;
int digit;
bool hasHotkeys;
bool active;
void SetActive(bool Active);
void DisplayHelp(bool Force = false);
void DisplayNoStatus(void);
protected:
void SetDisplayMenu(void);
cSkinDisplayMenu *DisplayMenu(void) { return displayMenu; }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: player.c 5.2 2024/10/13 09:47:18 kls Exp $
* $Id: player.c 5.1 2024/07/16 12:33:27 kls Exp $
*/
#include "player.h"
@ -70,6 +70,14 @@ cString cControl::GetHeader(void)
return "";
}
#if DEPRECATED_CCONTROL
cControl *cControl::Control(bool Hidden)
{
cMutexLock MutexLock(&mutex);
return (control && (!control->hidden || Hidden)) ? control : NULL;
}
#endif
cControl *cControl::Control(cMutexLock &MutexLock, bool Hidden)
{
MutexLock.Lock(&mutex);
@ -79,8 +87,9 @@ cControl *cControl::Control(cMutexLock &MutexLock, bool Hidden)
void cControl::Launch(cControl *Control)
{
cMutexLock MutexLock(&mutex);
delete control;
cControl *c = control; // keeps control from pointing to uninitialized memory TODO obsolete once DEPRECATED_CCONTROL is gone
control = Control;
delete c;
}
void cControl::Attach(void)

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: player.h 5.6 2024/10/13 09:47:18 kls Exp $
* $Id: player.h 5.5 2024/10/08 08:09:48 kls Exp $
*/
#ifndef __PLAYER_H
@ -117,6 +117,15 @@ public:
static void Launch(cControl *Control);
static void Attach(void);
static void Shutdown(void);
#if DEPRECATED_CCONTROL
[[deprecated("see HISTORY, version 2.4.2")]]
static cControl *Control(bool Hidden = false);
///< Old version of this function, for backwards compatibility with plugins.
///< Plugins should be changed to use the new version below, which does
///< proper locking.
///< Use of this function may result in program crashes in case replay is
///< stopped immediately after starting it.
#endif
static cControl *Control(cMutexLock &MutexLock, bool Hidden = false);
///< Returns the current replay control (if any) in case it is currently
///< visible. If Hidden is true, the control will be returned even if it is

View File

@ -4,10 +4,9 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: plugin.c 5.1 2025/02/12 22:22:20 kls Exp $
* $Id: plugin.c 4.4 2020/12/16 11:54:06 kls Exp $
*/
#define MUTE_DEPRECATED_MAINTHREADHOOK
#include "plugin.h"
#include <ctype.h>
#include <dirent.h>

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: plugin.h 5.1 2025/02/12 22:22:20 kls Exp $
* $Id: plugin.h 4.1 2020/06/29 09:29:06 kls Exp $
*/
#ifndef __PLUGIN_H
@ -43,9 +43,6 @@ public:
virtual bool Start(void);
virtual void Stop(void);
virtual void Housekeeping(void);
#ifndef MUTE_DEPRECATED_MAINTHREADHOOK
[[deprecated("use proper locking instead")]]
#endif
virtual void MainThreadHook(void);
virtual cString Active(void);
virtual time_t WakeupTime(void);

View File

@ -134,8 +134,8 @@ msgstr "News Magazine"
msgid "Content$Documentary"
msgstr "Documentary"
msgid "Content$Discussion/Interview/Debate"
msgstr "Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Discussion/Inverview/Debate"
msgid "Content$Show/Game Show"
msgstr "Show/Game Show"
@ -212,8 +212,8 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Serious/Classical Music"
msgid "Content$Folk/Traditional Music"
msgstr "Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Folk/Tradional Music"
msgid "Content$Jazz"
msgstr "Jazz"

View File

@ -133,7 +133,7 @@ msgstr "Revista de not
msgid "Content$Documentary"
msgstr "Documental"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Discussió/Entrevista/Debat"
msgid "Content$Show/Game Show"
@ -211,7 +211,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Música clàssica/seriosa"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Música folklòrica/tradicional"
msgid "Content$Jazz"

View File

@ -133,7 +133,7 @@ msgstr "zprávy"
msgid "Content$Documentary"
msgstr "dokumentární"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "diskuze/rozhovor/debata"
msgid "Content$Show/Game Show"
@ -211,7 +211,7 @@ msgstr "rock/pop"
msgid "Content$Serious/Classical Music"
msgstr "vážná/klasická hudba"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "folk/country"
msgid "Content$Jazz"

View File

@ -130,7 +130,7 @@ msgstr ""
msgid "Content$Documentary"
msgstr ""
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr ""
msgid "Content$Show/Game Show"
@ -208,7 +208,7 @@ msgstr ""
msgid "Content$Serious/Classical Music"
msgstr ""
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr ""
msgid "Content$Jazz"

View File

@ -132,7 +132,7 @@ msgstr "Nachrichtenmagazin"
msgid "Content$Documentary"
msgstr "Dokumentation"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Diskussion/Interview/Debatte"
msgid "Content$Show/Game Show"
@ -142,7 +142,7 @@ msgid "Content$Game Show/Quiz/Contest"
msgstr "Spielshow/Quiz/Wettbewerb"
msgid "Content$Variety Show"
msgstr "Varieté-Show"
msgstr "Variete-Show"
msgid "Content$Talk Show"
msgstr "Talkshow"
@ -210,7 +210,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Ernste/Klassische Musik"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Volks/Traditionelle Musik"
msgid "Content$Jazz"

View File

@ -130,7 +130,7 @@ msgstr ""
msgid "Content$Documentary"
msgstr ""
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr ""
msgid "Content$Show/Game Show"
@ -208,7 +208,7 @@ msgstr ""
msgid "Content$Serious/Classical Music"
msgstr ""
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr ""
msgid "Content$Jazz"

View File

@ -131,7 +131,7 @@ msgstr "Revista de noticias"
msgid "Content$Documentary"
msgstr "Documental"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Discusión/Entrevista/Debate"
msgid "Content$Show/Game Show"
@ -209,7 +209,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Musica clásica"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Musica Folk/Tradicional"
msgid "Content$Jazz"

View File

@ -130,7 +130,7 @@ msgstr "Uudisteajakiri"
msgid "Content$Documentary"
msgstr "Dokumentaal"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Diskussioon/intervjuu/debatt"
msgid "Content$Show/Game Show"
@ -208,7 +208,7 @@ msgstr "Rock/pop"
msgid "Content$Serious/Classical Music"
msgstr "Klassikaline muusika"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Folk/rahvamuusika"
msgid "Content$Jazz"

View File

@ -134,7 +134,7 @@ msgstr "Uutismakasiini"
msgid "Content$Documentary"
msgstr "Dokumentti"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Keskustelu/haastattelu/väittely"
msgid "Content$Show/Game Show"
@ -212,7 +212,7 @@ msgstr "Rock/pop"
msgid "Content$Serious/Classical Music"
msgstr "Vakava/klassinen musiikki"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Folk/kansanmusiikki"
msgid "Content$Jazz"
@ -797,7 +797,7 @@ msgid "Folder"
msgstr "Kansio"
msgid "Size"
msgstr "Koko"
msgstr ""
msgid "This folder is currently in use - no changes are possible!"
msgstr "Kansio on käytössä - muokkaukset eivät mahdollisia!"
@ -846,7 +846,7 @@ msgid "Edited version already exists - overwrite?"
msgstr "Muokattava versio on jo olemassa - ylikirjoitetaanko?"
msgid "Not enough free disk space to start editing process!"
msgstr "Tallennustila ei riitä muokkaamiseen!"
msgstr ""
msgid "Error while queueing recording for cutting!"
msgstr "Tallenteen lisääminen leikkausjonoon epäonnistui!"
@ -1526,7 +1526,7 @@ msgid "Button$Insert"
msgstr "Lisää"
msgid "Button$Macro"
msgstr "Makro"
msgstr ""
msgid "Plugin"
msgstr "Laajennos"
@ -1535,7 +1535,7 @@ msgid "Up/Dn for new location - OK to move"
msgstr "'Ylös/Alas' uusi paikka - 'OK' hyväksy"
msgid "Primary device has no MPEG decoder, can't attach player!"
msgstr "Ensisijaissa laitteessa ei ole MPEG-toistinta!"
msgstr ""
msgid "Low disk space!"
msgstr "Tallennustila loppumassa!"
@ -1580,10 +1580,10 @@ msgstr "käynnistetäänkö uudelleen?"
#. TRANSLATORS: note the plural/singular!
msgid "errors"
msgstr "virhettä"
msgstr ""
msgid "error"
msgstr "virhe"
msgstr ""
#. TRANSLATORS: note the trailing blank!
msgid "Volume "

View File

@ -141,7 +141,7 @@ msgstr "Magazine d'information"
msgid "Content$Documentary"
msgstr "Documentaire"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Discussion/Interview/Débat"
msgid "Content$Show/Game Show"
@ -219,7 +219,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Sérieux/Musique Classique"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Folk/Musique Traditionnelle"
msgid "Content$Jazz"

View File

@ -132,7 +132,7 @@ msgstr ""
msgid "Content$Documentary"
msgstr ""
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr ""
msgid "Content$Show/Game Show"
@ -210,7 +210,7 @@ msgstr ""
msgid "Content$Serious/Classical Music"
msgstr ""
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr ""
msgid "Content$Jazz"

View File

@ -138,7 +138,7 @@ msgstr "Hírmagazin"
msgid "Content$Documentary"
msgstr "Dokumentumfilm"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Beszélgetés/Interjú/Vita"
msgid "Content$Show/Game Show"
@ -216,7 +216,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Komolyzene/Klasszikus zene"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Népzene/Hagyományos zene"
msgid "Content$Jazz"

View File

@ -12,7 +12,7 @@ msgstr ""
"Project-Id-Version: VDR 2.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2024-09-21 12:45+0200\n"
"PO-Revision-Date: 2024-10-15 00:35+0200\n"
"PO-Revision-Date: 2024-09-14 13:05+0200\n"
"Last-Translator: Gringo <openpli@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n"
"Language: it\n"
@ -136,7 +136,7 @@ msgstr "Settimanale di attualità"
msgid "Content$Documentary"
msgstr "Documentario"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Discussione/Intervista/Dibattito"
msgid "Content$Show/Game Show"
@ -214,7 +214,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Musica Classica/Seria"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Musica Tradizionale/Folclore"
msgid "Content$Jazz"
@ -1585,7 +1585,7 @@ msgid "errors"
msgstr "errori"
msgid "error"
msgstr "errore"
msgstr ""
#. TRANSLATORS: note the trailing blank!
msgid "Volume "

View File

@ -130,7 +130,7 @@ msgstr "Naujienų žurnalas"
msgid "Content$Documentary"
msgstr "Dokumentika"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Diskusijos/Interviu"
msgid "Content$Show/Game Show"
@ -208,7 +208,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Klasikinė muzika"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Folk/Tradizinė muzika"
msgid "Content$Jazz"

View File

@ -132,7 +132,7 @@ msgstr "Магазин"
msgid "Content$Documentary"
msgstr "Документарен"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Дискусија/Интервју/Дебата"
msgid "Content$Show/Game Show"
@ -210,7 +210,7 @@ msgstr "Рок/Поп"
msgid "Content$Serious/Classical Music"
msgstr "Сериозна/Класична музика"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Фолк/Народна музика"
msgid "Content$Jazz"

View File

@ -136,7 +136,7 @@ msgstr "Nieuwsbulletin"
msgid "Content$Documentary"
msgstr "Documentaire"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Discussie/Interview/Debat"
msgid "Content$Show/Game Show"
@ -214,7 +214,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Serieuze muziek/Klassieke muziek"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Folk/Traditionele muziek"
msgid "Content$Jazz"

View File

@ -131,7 +131,7 @@ msgstr ""
msgid "Content$Documentary"
msgstr ""
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr ""
msgid "Content$Show/Game Show"
@ -209,7 +209,7 @@ msgstr ""
msgid "Content$Serious/Classical Music"
msgstr ""
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr ""
msgid "Content$Jazz"

View File

@ -135,7 +135,7 @@ msgstr "Magazyny informacyjne"
msgid "Content$Documentary"
msgstr "Dokumentalne"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Dyskusje/Wywiady/Debaty"
msgid "Content$Show/Game Show"
@ -213,7 +213,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Muzyka klasyczna"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Folk/Muzyka tradycyjna"
msgid "Content$Jazz"

View File

@ -131,7 +131,7 @@ msgstr "Notici
msgid "Content$Documentary"
msgstr "Documentário"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Discussão/Entrevista/Debate"
msgid "Content$Show/Game Show"
@ -209,7 +209,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Música Clássica/Séria"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Música Tradicional/Folclore"
msgid "Content$Jazz"

View File

@ -132,7 +132,7 @@ msgstr "Magazin de ştiri"
msgid "Content$Documentary"
msgstr "Documentar"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Discuţie/Interviu/Dezbatere"
msgid "Content$Show/Game Show"
@ -210,7 +210,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Muzică clasică/serioasă"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Muzică folk/tradiţională"
msgid "Content$Jazz"

View File

@ -131,7 +131,7 @@ msgstr "Новостной журнал"
msgid "Content$Documentary"
msgstr "Документальные"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Дискуссия/Интервью/Дебаты"
msgid "Content$Show/Game Show"
@ -209,7 +209,7 @@ msgstr "Рок/Поп"
msgid "Content$Serious/Classical Music"
msgstr "Классическая музыка"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Фольклор/Традиционная музыка"
msgid "Content$Jazz"

View File

@ -131,7 +131,7 @@ msgstr "Spravodajsk
msgid "Content$Documentary"
msgstr "Dokumentárny"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Diskusia/Rozhovor/debata"
msgid "Content$Show/Game Show"
@ -209,7 +209,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Vá¾na/Klasická hudba"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "¥udová/Tradièná Hudba"
msgid "Content$Jazz"

View File

@ -131,7 +131,7 @@ msgstr "Poro
msgid "Content$Documentary"
msgstr "Dokumentarec"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Diskudija/Interviju/Debata"
msgid "Content$Show/Game Show"
@ -209,7 +209,7 @@ msgstr "Rok/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Resna/Klasièna Glasba"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Narodna/Tradicionalna glasba"
msgid "Content$Jazz"

View File

@ -131,7 +131,7 @@ msgstr "Novosti"
msgid "Content$Documentary"
msgstr "Dokumentarni"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Diskusija/Razgovor/Debata"
msgid "Content$Show/Game Show"
@ -209,7 +209,7 @@ msgstr "Rok/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Ozbiljna/Klasièna muzika"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Narodna/Izvorna muzika"
msgid "Content$Jazz"

View File

@ -135,7 +135,7 @@ msgstr "Nyhetsmagasin"
msgid "Content$Documentary"
msgstr "Dokumentär"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Diskussion/Intervju/Debatt"
msgid "Content$Show/Game Show"
@ -213,7 +213,7 @@ msgstr "Rock/Pop"
msgid "Content$Serious/Classical Music"
msgstr "Klassisk musik"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Folkmusik"
msgid "Content$Jazz"

View File

@ -130,7 +130,7 @@ msgstr ""
msgid "Content$Documentary"
msgstr ""
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr ""
msgid "Content$Show/Game Show"
@ -208,7 +208,7 @@ msgstr ""
msgid "Content$Serious/Classical Music"
msgstr ""
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr ""
msgid "Content$Jazz"

View File

@ -131,7 +131,7 @@ msgstr "Журнал новин"
msgid "Content$Documentary"
msgstr "Документальне"
msgid "Content$Discussion/Interview/Debate"
msgid "Content$Discussion/Inverview/Debate"
msgstr "Дискусія/Інтерв’ю/Дебати"
msgid "Content$Show/Game Show"
@ -209,7 +209,7 @@ msgstr "Рок/Поп"
msgid "Content$Serious/Classical Music"
msgstr "Серйозна/Класична музика"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "Фльк/Традиційна музика"
msgid "Content$Jazz"

View File

@ -132,8 +132,8 @@ msgstr "新闻杂志"
msgid "Content$Documentary"
msgstr "记录片"
msgid "Content$Discussion/Interview/Debate"
msgstr "讨论/ Interview/辩论"
msgid "Content$Discussion/Inverview/Debate"
msgstr "讨论/ Inverview/辩论"
msgid "Content$Show/Game Show"
msgstr "显示/游戏展"
@ -210,7 +210,7 @@ msgstr "摇滚/流行"
msgid "Content$Serious/Classical Music"
msgstr "严重/古典音乐"
msgid "Content$Folk/Traditional Music"
msgid "Content$Folk/Tradional Music"
msgstr "民谣/传统体育专业课程设置的音乐"
msgid "Content$Jazz"

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 5.37 2025/01/18 20:57:06 kls Exp $
* $Id: recording.c 5.35 2024/09/21 19:18:18 kls Exp $
*/
#include "recording.h"
@ -356,7 +356,6 @@ void cResumeFile::Delete(void)
cRecordingInfo::cRecordingInfo(const cChannel *Channel, const cEvent *Event)
{
modified = 0;
channelID = Channel ? Channel->GetChannelID() : tChannelID::InvalidID;
channelName = Channel ? strdup(Channel->Name()) : NULL;
ownEvent = Event ? NULL : new cEvent(0);
@ -421,7 +420,6 @@ cRecordingInfo::cRecordingInfo(const cChannel *Channel, const cEvent *Event)
cRecordingInfo::cRecordingInfo(const char *FileName)
{
modified = 0;
channelID = tChannelID::InvalidID;
channelName = NULL;
ownEvent = new cEvent(0);
@ -490,12 +488,6 @@ void cRecordingInfo::SetErrors(int Errors)
bool cRecordingInfo::Read(FILE *f)
{
if (ownEvent) {
struct stat st;
if (fstat(fileno(f), &st))
return false;
if (modified == st.st_mtime)
return true;
modified = st.st_mtime;
cReadLine ReadLine;
char *s;
int line = 0;
@ -1354,7 +1346,6 @@ bool cRecording::ChangeName(const char *NewName)
fileName = strdup(OldFileName);
return false;
}
info->SetFileName(NewFileName);
isOnVideoDirectoryFileSystem = -1; // it might have been moved to a different file system
ClearSortName();
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: recording.h 5.12 2025/01/15 10:50:29 kls Exp $
* $Id: recording.h 5.11 2024/09/19 20:21:58 kls Exp $
*/
#ifndef __RECORDING_H
@ -64,7 +64,6 @@ public:
class cRecordingInfo {
friend class cRecording;
private:
time_t modified;
tChannelID channelID;
char *channelName;
const cEvent *event;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: remux.c 5.18 2024/12/05 10:37:15 kls Exp $
* $Id: remux.c 5.14 2024/10/08 08:46:38 kls Exp $
*/
#include "remux.h"
@ -287,8 +287,6 @@ uchar cTsPayload::GetByte(void)
if (TsPid(p) == pid) { // only handle TS packets for the initial PID
if (++numPacketsPid > MAX_TS_PACKETS_FOR_VIDEO_FRAME_DETECTION)
return SetEof();
if (TsError(p))
return SetEof(); // don't parse TS packets with errors
if (TsHasPayload(p)) {
if (index > 0 && TsPayloadStart(p)) // checking index to not skip the very first TS packet
return SetEof();
@ -2271,12 +2269,11 @@ int cFrameDetector::Analyze(const uchar *Data, int Length, bool ErrorCheck)
framesPerSecond = 60.0 / 1.001;
else {
framesPerSecond = DEFAULTFRAMESPERSECOND;
dsyslog("unknown frame delta (%d), assuming %5.2f fps", Delta, framesPerSecond);
dsyslog("unknown frame delta (%d), assuming %5.2f fps", Delta, DEFAULTFRAMESPERSECOND);
}
}
else // audio
framesPerSecond = double(PTSTICKS) / Delta; // PTS of audio frames is always increasing
frameChecker->SetFrameDelta(PTSTICKS / framesPerSecond);
dbgframes("\nDelta = %d FPS = %5.2f FPPU = %d NF = %d TRO = %d\n", Delta, framesPerSecond, framesPerPayloadUnit, numPtsValues + 1, parser->IFrameTemporalReferenceOffset());
synced = true;
parser->SetDebug(false);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: remux.h 5.8 2024/12/04 14:33:22 kls Exp $
* $Id: remux.h 5.7 2024/09/21 19:18:18 kls Exp $
*/
#ifndef __REMUX_H

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: skinlcars.c 5.8 2024/12/02 12:40:56 kls Exp $
* $Id: skinlcars.c 5.7 2024/09/21 10:53:07 kls Exp $
*/
// "Star Trek: The Next Generation"(R) is a registered trademark of Paramount Pictures,
@ -1259,7 +1259,6 @@ void cSkinLCARSDisplayMenu::DrawTimers(void)
int NumDevices = 0;
int y = ys04;
// Timers and recording devices:
LOCK_SCHEDULES_READ;
while (1) {
int NumTimers = 0;
const cDevice *Device = NULL;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: skins.c 5.5 2025/02/12 21:18:53 kls Exp $
* $Id: skins.c 5.4 2024/09/21 16:21:08 kls Exp $
*/
#include "skins.h"
@ -305,7 +305,7 @@ eKeys cSkins::Message(eMessageType Type, const char *s, int Seconds)
}
cSkinDisplay::Current()->SetMessage(Type, s);
cSkinDisplay::Current()->Flush();
cStatus::MsgOsdStatusMessage(Type, s);
cStatus::MsgOsdStatusMessage(s);
eKeys k = kNone;
if (Type != mtStatus) {
k = Interface->Wait(Seconds);
@ -316,7 +316,7 @@ eKeys cSkins::Message(eMessageType Type, const char *s, int Seconds)
}
else {
cSkinDisplay::Current()->SetMessage(Type, NULL);
cStatus::MsgOsdStatusMessage(Type, NULL);
cStatus::MsgOsdStatusMessage(NULL);
}
}
else if (!s && displayMessage) {

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 5.3 2025/02/12 21:18:53 kls Exp $
* $Id: status.c 4.1 2018/01/29 13:36:53 kls Exp $
*/
#include "status.h"
@ -95,10 +95,10 @@ void cStatus::MsgOsdTitle(const char *Title)
sm->OsdTitle(Title);
}
void cStatus::MsgOsdStatusMessage(eMessageType Type, const char *Message)
void cStatus::MsgOsdStatusMessage(const char *Message)
{
for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
sm->OsdStatusMessage2(Type, Message);
sm->OsdStatusMessage(Message);
}
void cStatus::MsgOsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
@ -107,16 +107,16 @@ 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, bool Selectable)
void cStatus::MsgOsdItem(const char *Text, int Index)
{
for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
sm->OsdItem2(Text, Index, Selectable);
sm->OsdItem(Text, Index);
}
void cStatus::MsgOsdCurrentItem(const char *Text, int Index)
void cStatus::MsgOsdCurrentItem(const char *Text)
{
for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
sm->OsdCurrentItem2(Text, Index);
sm->OsdCurrentItem(Text);
}
void cStatus::MsgOsdTextItem(const char *Text, bool Scroll)

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 5.3 2025/02/12 21:18:53 kls Exp $
* $Id: status.h 4.4 2018/01/29 13:42:17 kls Exp $
*/
#ifndef __STATUS_H
@ -13,7 +13,6 @@
#include "config.h"
#include "device.h"
#include "player.h"
#include "skins.h"
#include "tools.h"
// Several member functions of the following classes are called with a pointer to
@ -82,21 +81,14 @@ protected:
virtual void OsdTitle(const char *Title) {}
// Title has been displayed in the title line of the menu.
virtual void OsdStatusMessage(const char *Message) {}
virtual void OsdStatusMessage2(eMessageType Type, const char *Message) { OsdStatusMessage(Message); }
// Message has been displayed in the status line of the menu.
// 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 OsdItem2(const char *Text, int Index, bool Selectable) { OsdItem(Text, Index); }
// The OSD displays the given single line Text as menu item at Index.
// Selectable is true if this item can be selected.
virtual void OsdCurrentItem(const char *Text) {}
// The OSD displays the given single line Text as the current menu item.
virtual void OsdCurrentItem2(const char *Text, int Index) { OsdCurrentItem(Text); }
// The OSD displays the given single line Text as the current menu item.
// Index is the one that was given in OsdItem[2]() for this item.
virtual void OsdTextItem(const char *Text, bool Scroll) {}
// The OSD displays the given multi line text. If Text points to an
// actual string, that text shall be displayed and Scroll has no
@ -123,12 +115,10 @@ public:
static void MsgSetSubtitleTrack(int Index, const char * const *Tracks);
static void MsgOsdClear(void);
static void MsgOsdTitle(const char *Title);
[[deprecated("use MsgOsdStatusMessage(eMessageType Type, const char *Message) instead")]]
static void MsgOsdStatusMessage(const char *Message) { MsgOsdStatusMessage(mtStatus, Message); }
static void MsgOsdStatusMessage(eMessageType Type, const char *Message);
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, bool Selectable = true);
static void MsgOsdCurrentItem(const char *Text, int Index = -1);
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);
static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);

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 5.3 2025/01/15 08:43:12 kls Exp $
* $Id: thread.c 5.2 2024/01/18 13:01:07 kls Exp $
*/
#include "thread.h"
@ -597,7 +597,6 @@ cStateLockLog::cStateLockLog(void)
void cStateLockLog::Dump(const char *Name, tThreadId ThreadId)
{
dsyslog("--- begin invalid lock sequence report");
dsyslog("TID T C R DR S ST");
int LastFlags = 0;
for (int i = 0; i < SLL_SIZE; i++) {
if (tThreadId tid = logThreadIds[logIndex]) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: timers.c 5.25 2025/01/13 14:44:18 kls Exp $
* $Id: timers.c 5.21 2024/10/11 13:58:11 kls Exp $
*/
#include "timers.h"
@ -185,8 +185,6 @@ cTimer::cTimer(const cEvent *Event, const char *FileName, const cTimer *PatternT
deferred = 0;
pending = inVpsMargin = false;
flags = tfActive;
if (PatternTimer)
SetFlags(tfSpawned);
*pattern = 0;
*file = 0;
aux = NULL;
@ -286,13 +284,11 @@ void cTimer::CalcMargins(int &MarginStart, int &MarginStop, const cEvent *Event)
MarginStop = Setup.MarginStop * 60;
// To make sure the timer gets assigned to the correct event, we must
// make sure that this is the only event that overlaps 100%:
if (HasFlags(tfSpawned)) {
if (const cEvent *e = dynamic_cast<const cEvent *>(Event->Prev()))
MarginStart = max(0, min(MarginStart, e->Duration() - 60));
if (const cEvent *e = dynamic_cast<const cEvent *>(Event->Next()))
MarginStop = max(0, min(MarginStop, e->Duration() - 60));
}
}
int cTimer::Compare(const cListObject &ListObject) const
{
@ -616,7 +612,7 @@ bool cTimer::Matches(time_t t, bool Directly, int Margin) const
return false;
deferred = 0;
if (HasFlags(tfActive) && !Remote()) {
if (HasFlags(tfActive)) {
if (event) {
if (HasFlags(tfVps)) {
if (event->Vps()) {
@ -624,8 +620,7 @@ bool cTimer::Matches(time_t t, bool Directly, int Margin) const
startTime = event->StartTime();
stopTime = event->EndTime();
if (!Margin) { // this is an actual check
const cSchedule *Schedule = event->Schedule();
if (Schedule && Schedule->PresentSeenWithin(EITPRESENTFOLLOWINGRATE)) { // VPS control can only work with up-to-date events...
if (event->Schedule()->PresentSeenWithin(EITPRESENTFOLLOWINGRATE)) { // VPS control can only work with up-to-date events...
if (!vpsActive) {
vpsActive = true;
if (Recording())
@ -641,7 +636,7 @@ bool cTimer::Matches(time_t t, bool Directly, int Margin) const
return running || time(NULL) < vpsNotRunning + VPSGRACE;
}
if (Recording()) {
if (Schedule && Schedule->PresentSeenWithin(EITPRESENTFOLLOWINGGRACE))
if (event->Schedule()->PresentSeenWithin(EITPRESENTFOLLOWINGGRACE))
return event->IsRunning(true); // give it a chance to recover - worst case: the recording will be 60 seconds too long
if (vpsActive) {
vpsActive = false;
@ -817,6 +812,7 @@ cTimer *cTimer::SpawnPatternTimer(const cEvent *Event, cTimers *Timers)
cString FileName = MakePatternFileName(Pattern(), Event->Title(), Event->ShortText(), File());
isyslog("spawning timer %s for event %s", *ToDescr(), *Event->ToDescr());
cTimer *t = new cTimer(Event, FileName, this);
t->SetFlags(tfSpawned);
if (startswith(Pattern(), TIMERPATTERN_AVOID))
t->SetFlags(tfAvoid);
Timers->Add(t);
@ -1161,7 +1157,6 @@ const cTimer *cTimers::GetMatch(time_t t) const
{
static int LastPending = -1;
const cTimer *t0 = NULL;
LOCK_SCHEDULES_READ;
for (const cTimer *ti = First(); ti; ti = Next(ti)) {
if (!ti->Remote() && !ti->Recording() && ti->Matches(t)) {
if (ti->Pending()) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.c 5.15 2025/01/15 08:57:45 kls Exp $
* $Id: tools.c 5.14 2024/09/01 20:43:40 kls Exp $
*/
#include "tools.h"
@ -131,11 +131,8 @@ char *strcpyrealloc(char *dest, const char *src)
char *strn0cpy(char *dest, const char *src, size_t n)
{
char *s = dest;
if (dest && n) {
if (src)
for ( ; --n && (*dest = *src) != 0; dest++, src++) ;
*dest = 0;
}
return s;
}
@ -917,8 +914,6 @@ char *Utf8Strn0Cpy(char *Dest, const char *Src, int n)
if (cCharSetConv::SystemCharacterTable())
return strn0cpy(Dest, Src, n);
char *d = Dest;
if (Dest && n > 0) {
if (Src) {
while (*Src) {
int sl = Utf8CharLen(Src);
n -= sl;
@ -929,9 +924,7 @@ char *Utf8Strn0Cpy(char *Dest, const char *Src, int n)
else
break;
}
}
*d = 0;
}
return Dest;
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.h 5.11 2025/01/13 13:18:42 kls Exp $
* $Id: tools.h 5.10 2024/09/01 20:43:40 kls Exp $
*/
#ifndef __TOOLS_H
@ -140,7 +140,7 @@ int Utf8FromArray(const uint *a, char *s, int Size, int Max = -1);
// When allocating buffer space, make sure we reserve enough space to hold
// a string in UTF-8 representation:
#define Utf8BufSize(s) ((s) * 4 + 1)
#define Utf8BufSize(s) ((s) * 4)
// The following macros automatically use the correct versions of the character
// class functions:

5
vdr.c
View File

@ -20,9 +20,9 @@
*
* The author can be reached at vdr@tvdr.de
*
* The project's page is at https://www.tvdr.de
* The project's page is at http://www.tvdr.de
*
* $Id: vdr.c 5.18 2024/12/02 12:40:56 kls Exp $
* $Id: vdr.c 5.16 2024/03/29 21:46:50 kls Exp $
*/
#include <getopt.h>
@ -1140,7 +1140,6 @@ int main(int argc, char *argv[])
if (Timer->Matches(Now, true, Setup.VpsMargin))
InVpsMargin = true;
else if (Timer->Event()) {
LOCK_SCHEDULES_READ;
InVpsMargin = Timer->Event()->StartTime() <= Now && Now < Timer->Event()->EndTime();
NeedsTransponder = Timer->Event()->StartTime() - Now < VPSLOOKAHEADTIME * 3600 && !Timer->Event()->SeenWithin(VPSUPTODATETIME);
}