Compare commits

...

568 Commits

Author SHA1 Message Date
Klaus Schmidinger
dd71a004e2 Official release of version 2.7.4 2025-02-26 10:35:03 +01:00
Klaus Schmidinger
45091fbd72 Revised locking in cMenuSchedule and cMenuWhatsOn 2025-02-25 15:53:43 +01:00
Klaus Schmidinger
988d5aebfa Added missing locks to SetMenuItem() functions 2025-02-20 10:23:15 +01:00
Klaus Schmidinger
8c3671fae6 Fixed cPtsIndex::FindFrameNumber() to handle the case where Pts points to an I-frame 2025-02-19 15:39:16 +01:00
Klaus Schmidinger
2a12af481a Fixed spurious fast frames when switching from "slow back" to "slow forward" 2025-02-18 17:06:15 +01:00
Klaus Schmidinger
7817e64695 Fixed progress display when switching from "pause" to "slow back" 2025-02-18 15:37:24 +01:00
Klaus Schmidinger
ebbaa39098 Added '~' to the list of delimiters in cTextWrapper 2025-02-17 11:13:13 +01:00
Klaus Schmidinger
d3dcbbd4f2 Fixed unnecessary redisplays of menus 2025-02-17 10:49:10 +01:00
Klaus Schmidinger
3045995bbc Fixed displaying the current item when pressing a hotkey 2025-02-13 13:58:07 +01:00
Klaus Schmidinger
1b4233d6ad The function cPlugin::MainThreadHook() has been deprecated 2025-02-12 22:22:20 +01:00
Klaus Schmidinger
34aa8fe8b4 Adjusted PLUGINS.html to the new API version numbering introduced in version 2.7.2 2025-02-12 22:02:25 +01:00
Klaus Schmidinger
baa97e9ff1 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 2025-02-12 21:18:53 +01:00
Klaus Schmidinger
03afc4a353 Fixed unnecessary calls to cStatus::OsdCurrentItem2() when scrolling 2025-02-05 22:12:32 +01:00
Klaus Schmidinger
ef4ebeb7ee The new virtual function cStatus::OsdCurrentItem2() can be used to get the index of the current menu item 2025-01-29 11:15:26 +01:00
Klaus Schmidinger
80d8851e62 Added cStatus::OsdCurrentItem2() 2025-01-29 11:15:26 +01:00
Klaus Schmidinger
ead135f716 Fixed unnecessary calls to DisplayCurrent() for editable menu items 2025-01-29 10:35:25 +01:00
Klaus Schmidinger
49dc61a92c Fixed an unnecessary redisplay of the menu when pressing a hotkey 2025-01-29 10:25:55 +01:00
Klaus Schmidinger
af0309cc40 Fixed an improper call of cStatus::OsdCurrentItem() before cStatus::OsdItem2() 2025-01-29 10:20:17 +01:00
Klaus Schmidinger
4ed7421b1c Activated logging of OsdItem2() 2025-01-28 10:41:03 +01:00
Klaus Schmidinger
3058354dba Fixed setting the file name of the info file after renaming a recording 2025-01-18 20:57:06 +01:00
Klaus Schmidinger
20a8c5d240 Added cStatus::OsdItem2() 2025-01-16 10:23:12 +01:00
Klaus Schmidinger
0749a34342 The new virtual function cStatus::OsdItem2() can be used to get the information whether a menu item is selectable 2025-01-16 09:42:11 +01:00
Klaus Schmidinger
e595eed57d The info files of recordings are now only re-read if they have been modified 2025-01-15 10:50:29 +01:00
Klaus Schmidinger
a7576f0b6c Added parameter checks to strn0cpy() and Utf8Strn0Cpy() 2025-01-15 08:57:45 +01:00
Klaus Schmidinger
657e5dda5d Added a header to the backtrace 2025-01-15 08:43:12 +01:00
Klaus Schmidinger
8fb6a2b24b Fixed handling margins for timers that are not VPS controlled and not spawned 2025-01-13 14:44:18 +01:00
Klaus Schmidinger
53cac302d8 Added 1 to Utf8BufSize() for worst case 2025-01-13 13:18:42 +01:00
Klaus Schmidinger
2c6c014dd8 Checking for VPS control is now limited to local timers 2025-01-13 12:34:18 +01:00
Klaus Schmidinger
a7071f580e Added some missing locking 2025-01-10 16:11:02 +01:00
Klaus Schmidinger
de5327a048 Fixed a possible deadlock when canceling an editing process 2025-01-10 13:12:04 +01:00
Klaus Schmidinger
7ab94c7bcb Fixed accessing a timer's event schedule in case the event has been removed from the schedule 2025-01-07 10:46:22 +01:00
Klaus Schmidinger
0f80fc5e86 Fixed handling the fps value if it can't be determined from the video data 2024-12-05 10:37:15 +01:00
Klaus Schmidinger
d169f30e5c TS packets with errors are now skipped when parsing for frames 2024-12-05 10:33:31 +01:00
Klaus Schmidinger
7a1842cba6 Fixed a typo 2024-12-04 14:33:22 +01:00
Klaus Schmidinger
e4e9d7a55f Added some missing locking 2024-12-02 12:40:56 +01:00
Klaus Schmidinger
ccbef6ce6c Fixed some typos in the translation files 2024-11-30 14:30:46 +01:00
Klaus Schmidinger
7461a1ba3a Updated the Finnish OSD texts 2024-10-24 09:58:43 +02:00
Klaus Schmidinger
bb55e3036e The VDR homepage is now accessible via HTTPS 2024-10-21 19:04:53 +02:00
Klaus Schmidinger
bbf2cca198 Updated the Italian OSD texts 2024-10-20 10:05:19 +02:00
Klaus Schmidinger
8ce034d124 Fixed wrong credits 2024-10-17 20:17:57 +02:00
Klaus Schmidinger
4030698007 Fixed error checking in case the fps value can't be determined by the frame parser 2024-10-13 13:34:32 +02:00
Klaus Schmidinger
66fea5c9f1 Removed all DEPRECATED_* code 2024-10-13 09:47:18 +02:00
Klaus Schmidinger
285574eeaa Official release of version 2.7.3 2024-10-12 13:32:46 +02:00
Klaus Schmidinger
55cfb057e0 Added vdrrootdir and incdir to vdr.pc 2024-10-11 14:21:04 +02:00
Klaus Schmidinger
b4c538cff7 The Channel+/- keys can now be used to jump between errors while replaying a recording 2024-10-11 14:10:50 +02:00
Klaus Schmidinger
5a626fef9f Fixed expiring of one-time VPS timers in case there is more than one event with the same VPS time 2024-10-11 13:58:11 +02:00
Klaus Schmidinger
2bcd8ba8f3 Fixed handling negative values in cSource::Position() on systems where 'int' is 64 bit 2024-10-09 10:36:16 +02:00
Klaus Schmidinger
2dacc776bd Fixed error checking in case of large PTS discontinuities 2024-10-08 08:46:38 +02:00
Klaus Schmidinger
a91d687a1a Removed defining DEPRECATED_* macros with value 0, because this is the preprocessor's default 2024-10-08 08:09:48 +02:00
Klaus Schmidinger
0d3882d43e Official release of version 2.7.2 2024-09-27 09:15:33 +02:00
Klaus Schmidinger
72ad601328 Added a note about re-generating the index of old recordings with errors 2024-09-27 09:14:23 +02:00
Klaus Schmidinger
2c6fd804f6 Fixed a problem with duplicate events if they are moved to a lower table ID and at the same time get a new event ID 2024-09-26 19:25:41 +02:00
Klaus Schmidinger
c590444b7d Fixed error checking when regenerating the index 2024-09-21 19:18:18 +02:00
Klaus Schmidinger
4805af7915 Increased the bpp of cProgressBar to 4 to handle all different colors 2024-09-21 16:21:08 +02:00
Klaus Schmidinger
171b20a80d Fixed singular when displaying number of errors in the recording info 2024-09-21 10:53:07 +02:00
Klaus Schmidinger
d00ae923ab Edited recordings now show error count of original if there are no error indicators in the index 2024-09-20 21:34:18 +02:00
Klaus Schmidinger
d8ab5dc5c6 Fixed syncing the frame checker to I-frames 2024-09-20 14:21:39 +02:00
Klaus Schmidinger
292af5d4f4 The info file of an edited recording now contains the number of errors in the edited version 2024-09-19 20:21:58 +02:00
Klaus Schmidinger
3d6b31b115 When the index file of a recording is regenerated, errors in the recording are now stored in the index file 2024-09-19 12:06:55 +02:00
Klaus Schmidinger
9e523073aa Errors are now shown as diamond shaped markers in the replay progress display of the default skins 2024-09-19 09:49:02 +02:00
Klaus Schmidinger
32d8e473fb Fixed description of cSkinDisplayReplay::SetRecording() 2024-09-18 11:10:56 +02:00
Klaus Schmidinger
5cd25df60c Recording errors are now marked in the index file 2024-09-18 09:23:07 +02:00
Klaus Schmidinger
52c4816c9c Now distinguishing between frames with errors and completely missing frames 2024-09-17 11:30:28 +02:00
Klaus Schmidinger
6f6b05ffcb The number of errors in a recording now represents the number of broken frames 2024-09-17 09:39:50 +02:00
Klaus Schmidinger
6dd5854b7a Moved error checking from recorder.c to remux.c 2024-09-17 09:31:15 +02:00
Klaus Schmidinger
83425df0b6 Updated the Italian OSD texts 2024-09-16 09:14:41 +02:00
Klaus Schmidinger
82b09eaa8e Silenced a compiler warning with gcc 14.1.0 2024-09-16 09:07:12 +02:00
Klaus Schmidinger
ec5b1aadab Fixed a problem in cSchedule::Sort(), in case hasRunning was true, but there was no event with RunningStatus() >= SI::RunningStatusPausing 2024-09-14 14:17:12 +02:00
Klaus Schmidinger
f786510ba2 Made APIVERSION independent from VDRVERSION to avoid irritation in case only VDRVERSION is incremented 2024-09-12 12:48:40 +02:00
Klaus Schmidinger
f006884e57 Deprecated code is now marked with [[deprecated]] to issue a compile time warning when used 2024-09-09 22:15:59 +02:00
Klaus Schmidinger
c0a005b3cd Fix for compilers that don't like non-constant format strings 2024-09-09 13:39:05 +02:00
Klaus Schmidinger
0c91893643 There will be no more distinction between "developer" and "stable" versions regarding version numbering 2024-09-09 10:58:55 +02:00
Klaus Schmidinger
796da9e0f6 Improved the error message when closing a frontend 2024-09-09 08:53:57 +02:00
Klaus Schmidinger
5d539be071 The '.update' file in the video directory is now created if it doesn't already exist 2024-09-01 20:43:40 +02:00
Klaus Schmidinger
1df138d876 Fixed a crash when deleting a recording that is currently being edited, and then immediately deleting the edited version, too 2024-08-30 20:43:26 +02:00
Klaus Schmidinger
71b0140003 The new SVDRP command 'AUDI' can be used to list the currently available audio tracks and select one of them 2024-08-30 09:55:15 +02:00
Klaus Schmidinger
a33adf365d Changed the error message when trying to attach a player to a primary device without an MPEG decoder 2024-07-16 12:33:31 +02:00
Klaus Schmidinger
8d82b05071 Disabled/removed deprecated code 2024-07-15 14:42:22 +02:00
Klaus Schmidinger
930e3b4200 Official release of version 2.6.9 2024-07-15 09:07:09 +02:00
Klaus Schmidinger
2543f2c486 Added the lines from 'Fixed a timeout in cDvbDevice while tuning after the frontend has been reopened' to cDvbTuner::ProvidesFrontend() 2024-07-14 15:41:01 +02:00
Klaus Schmidinger
d919817c35 Fixed restarting the EPG scan and keeping the frequency of calls to Device->SetPowerSaveIfUnused() low 2024-07-13 20:12:24 +02:00
Klaus Schmidinger
6bbb596968 Fixed setting the editable width in the LCARS skin 2024-07-13 15:25:22 +02:00
Klaus Schmidinger
8aec1974bb Fixed a timeout in cDvbDevice while tuning after the frontend has been reopened 2024-07-13 12:34:42 +02:00
Klaus Schmidinger
b3ad9ec699 Fixed handling of cSkinDisplayMenu::GetTextAreaFont() 2024-07-13 09:12:18 +02:00
Klaus Schmidinger
87410442b6 Fixed a crash in strreplace() for multiple replacements with strings of different lengths 2024-07-10 14:59:45 +02:00
Klaus Schmidinger
305735a886 Official release of version 2.6.8 2024-07-08 18:40:20 +02:00
Klaus Schmidinger
41b7e1546a Added 'lnbPowerTurnedOn = false' to cDvbTuner::ProvidesFrontend() 2024-07-08 18:39:18 +02:00
Klaus Schmidinger
f3972e4795 Implemented power save mode for cDvbDevice 2024-07-08 09:34:33 +02:00
Klaus Schmidinger
e7ea087a6e Unused devices can now be put into a power save mode 2024-07-06 11:19:21 +02:00
Klaus Schmidinger
749ba57dcc Updated the Italian OSD texts 2024-07-02 07:57:42 +02:00
Klaus Schmidinger
0360b0d0e7 The EIT scanner now checks whether there is a proper device before adding a channel to the scan list 2024-06-27 10:49:34 +02:00
Klaus Schmidinger
2b495e0f87 Removed leftover cMenuRecordings::SetPath() 2024-06-25 19:00:06 +02:00
Klaus Schmidinger
32b11e1a53 Added an EPG bugfix for broadcasters who put literal "\n" strings in their EPG 2024-06-21 06:27:20 +02:00
Klaus Schmidinger
db81c07b27 When starting an editing process, VDR now first checks whether there is enough free disk space to take up the edited version of the recording 2024-06-13 09:31:14 +02:00
Klaus Schmidinger
1c2401eb6c Fixed typos 2024-06-11 12:43:25 +02:00
Klaus Schmidinger
5828d347f7 Fixed setting T2 system ID from NIT 2024-05-29 11:13:34 +02:00
Klaus Schmidinger
9c64622718 Fixed a possible access of a deleted object in the EIT scanner 2024-05-19 14:55:57 +02:00
Klaus Schmidinger
f9260d0141 Updated the Italian OSD texts 2024-04-03 08:21:05 +02:00
Klaus Schmidinger
746cdaff01 Official release of version 2.6.7 2024-04-02 09:05:33 +02:00
Klaus Schmidinger
179d5b87fc A device is now always kept occupied if a timer is in VPS margin or needs the transponder 2024-03-29 21:46:50 +01:00
Klaus Schmidinger
51dca45a0c If the current channel is no longer available because of a VPS timer entering the VPS margin, live view now switches to the channel of that timer 2024-03-28 13:21:42 +01:00
Klaus Schmidinger
62ad9b41dd Added a missing initialization 2024-03-28 13:02:42 +01:00
Klaus Schmidinger
8b87a6968a The EIT scan is no longer inhibited if a timer is in VPS margin or needs the transponder 2024-03-10 11:26:54 +01:00
Klaus Schmidinger
faf562fd4e The EIT scan now skips scanList entries if a device is already tuned to that transponder 2024-03-10 11:16:29 +01:00
Klaus Schmidinger
6a09a2fbd6 The EIT scan no longer deletes the scanList if no device was switched in this pass 2024-03-10 10:38:18 +01:00
Klaus Schmidinger
bc32ffe2f9 Fixed logging when a timer has entered the VPS margin 2024-03-08 10:50:06 +01:00
Klaus Schmidinger
ff16bbd777 Logging event status changes now also shows the previous status 2024-03-06 20:16:51 +01:00
Klaus Schmidinger
f7f8a6b131 Improved handling present/following data for VPS timers 2024-03-06 14:37:15 +01:00
Klaus Schmidinger
a3310e2954 The new setup parameters "EPG scan max. channel number" and "EPG pause after scan" can be used to tune the behavior of the EPG scan 2024-03-04 21:14:27 +01:00
Klaus Schmidinger
0b08666310 Updated the Hungarian OSD texts 2024-03-04 15:04:26 +01:00
Klaus Schmidinger
42db3fbee0 The info file of a recording is now re-read if an update of the video directory is triggered, to make sure modifications from other VDRs are adopted 2024-03-04 14:12:37 +01:00
Klaus Schmidinger
bfa25d6276 The primary device no longer starts unnecessary threads if it doesn't have a decoder 2024-03-04 12:26:32 +01:00
Klaus Schmidinger
824c495d33 Added a 15 second grace period before actually stopping a VPS timer 2024-03-03 15:47:09 +01:00
Klaus Schmidinger
561be36958 Adapted "Setup/Miscellaneous/Show channel names with source" to the new handling in cChannel 2024-03-02 21:49:21 +01:00
Klaus Schmidinger
8bd0437497 Modified handling channel names with source to make it thread safe 2024-03-02 16:21:16 +01:00
Klaus Schmidinger
18c9cef1ea Added missing initialization of cChannel::nameSourceMode 2024-03-01 14:33:28 +01:00
Klaus Schmidinger
2c66d57d4b Fixed the move assignment operator to check for self-assignment 2024-02-15 14:57:56 +01:00
Klaus Schmidinger
29200d040e Official release of version 2.6.6 2024-01-25 09:44:48 +01:00
Klaus Schmidinger
385738cadd Fixed possible duplicate component entries in the info of an ongoing recording 2024-01-24 13:24:51 +01:00
Klaus Schmidinger
a2591d6e98 Workaround in detecting frame height for channels with wrong crop parameters 2024-01-23 19:33:45 +01:00
Klaus Schmidinger
fe97a38e77 Fixed handling primary device on headless systems 2024-01-22 12:10:30 +01:00
Klaus Schmidinger
552f5fc4e7 Fixed a typo 2024-01-22 12:09:22 +01:00
Klaus Schmidinger
21d3d489fd Added '/' to the list of fuzzy characters for pattern timers 2024-01-21 10:43:20 +01:00
Klaus Schmidinger
78b7e4e252 Added the total number of errors when logging new recording errors 2024-01-20 20:04:03 +01:00
Klaus Schmidinger
5d984b606e Added the move constructor to cString for better performance 2024-01-20 13:59:55 +01:00
Klaus Schmidinger
88b1e30494 Fixed an unnecessary double display of menu items in the Recordings menu 2024-01-19 12:17:05 +01:00
Klaus Schmidinger
939071bf25 Fixed an unnecessary double display of the current menu item in page up/down 2024-01-19 12:10:47 +01:00
Klaus Schmidinger
655682b5d2 Removed syslog calls in child process after fork() 2024-01-18 13:01:07 +01:00
Klaus Schmidinger
b1418b6bcd Implemented scaling images 2024-01-18 12:04:57 +01:00
Klaus Schmidinger
35c8b3d22c Using a dummy OSD if no OSD provider is available is not considered an error any more 2024-01-18 11:06:45 +01:00
Klaus Schmidinger
e5ae02e3fa Fixed a possible crash in cDevice::StopSectionHandler() 2024-01-18 10:58:39 +01:00
Klaus Schmidinger
f0da21ea13 Fixed height calculation in progress display 2024-01-17 21:15:48 +01:00
Klaus Schmidinger
eb35faaf7d Changed installing config files to handle potentially broken 'cp -n' 2024-01-05 14:16:16 +01:00
Klaus Schmidinger
05f03d6e38 Official release of version 2.6.5 2023-12-30 10:27:34 +01:00
Klaus Schmidinger
0d4284df29 The recording info of the default skins now shows the frame parameters of the recording at the end of the description (if such information is available) 2023-12-29 10:48:40 +01:00
Klaus Schmidinger
cade92cda1 Added the function cRecordingInfo::FrameParams(), which can be used to get a nicely formatted string with all the available frame data 2023-12-29 10:48:25 +01:00
Klaus Schmidinger
f0bbf64da0 Added cString::Append(char) 2023-12-29 10:24:29 +01:00
Klaus Schmidinger
6458f8b581 The frame width, height, scan type and apect ratio of a recording are now stored in the 'info' file under the 'F' tag 2023-12-28 21:23:19 +01:00
Klaus Schmidinger
1770a18598 Fixed broken video data streams on systems without output device when switching live channel to a different transponder while recording 2023-02-21 09:31:47 +01:00
Klaus Schmidinger
5f136032a2 Official release of version 2.6.4 2023-02-17 12:04:45 +01:00
Klaus Schmidinger
63efcf3927 Removed unnecessary empty lines 2023-02-16 17:20:09 +01:00
Klaus Schmidinger
468dc1115e Revised support for kernel based LIRC driver 2023-02-16 17:15:06 +01:00
Klaus Schmidinger
d53e0fd5c3 Fixed unnecessary interruption of ongoing recordings if timers avoided the transfer mode receiver device 2023-02-16 14:53:38 +01:00
Klaus Schmidinger
14b907b01c Fixed a possible crash if an editing process is canceled while the edited recording is being replayed (new solution) 2023-02-15 14:59:25 +01:00
Klaus Schmidinger
e0d87da768 Reverted 'Fixed a possible crash if an editing process is canceled while the edited recording is being replayed' 2023-02-15 14:01:20 +01:00
Klaus Schmidinger
42b584e38d Fixed initializing cDvbPlayerControl (was broken in version 2.6.3) 2022-12-27 15:57:20 +01:00
Klaus Schmidinger
a0f79bdd5f Added a note to vdr.5 about event ids possibly changing when an event moves from one table to another 2022-12-26 13:24:09 +01:00
Klaus Schmidinger
4372d55dd1 Added a note to epg.h about not messing with event ids 2022-12-24 11:37:17 +01:00
Klaus Schmidinger
13672280b6 Fixed symmetry of Begin/EndSegmentTransfer() calls in cEIT::cEIT() 2022-12-23 09:47:23 +01:00
Klaus Schmidinger
5b134cb23e Fixed restoring the volume at program start 2022-12-19 15:13:56 +01:00
Klaus Schmidinger
87cf0b7a3d Updated the Italian OSD texts 2022-12-16 12:17:03 +01:00
Klaus Schmidinger
8b14723e9e Official release of version 2.6.3 2022-12-14 09:38:41 +01:00
Klaus Schmidinger
7fe59548cd Now checking the video directory after setting the user id 2022-12-12 10:27:38 +01:00
Klaus Schmidinger
15f13ac936 Avoiding a zero sized array in cDevice::GetDevice() 2022-12-07 09:38:05 +01:00
Klaus Schmidinger
5b176f97a4 Now avoiding unnecessary processing in cDvbSubtitleConverter::FinishPage() if there are no areas 2022-12-06 16:57:01 +01:00
Klaus Schmidinger
0bb6f87776 Now avoiding the memcpy() call in cGlyph::cGlyph() if the bitmap is empty 2022-12-06 12:30:13 +01:00
Klaus Schmidinger
c06d2389e9 Now avoiding calling poll() in cSectionHandler::Action() if there are no filters 2022-12-06 12:25:08 +01:00
Klaus Schmidinger
548a33c728 Fixed initializing cPictureControl 2022-12-05 15:26:23 +01:00
Klaus Schmidinger
4336b55f4e Fixed initializing cDvbPlayerControl and cTransferControl 2022-12-05 14:45:51 +01:00
Klaus Schmidinger
c12c7378e9 Fixed a possible heap-use-after-free in cDvbTuner::Action() 2022-12-05 14:04:10 +01:00
Klaus Schmidinger
a299d8d348 Added code for the 'qks' audio track 2022-12-01 20:57:12 +01:00
Klaus Schmidinger
c7bf474a42 Fixed a faulty 'Timer still recording' query when canceling an editing job 2022-12-01 13:09:04 +01:00
Klaus Schmidinger
8d65cc6dc0 Fixed generating the index file in the cutter 2022-12-01 12:47:33 +01:00
Klaus Schmidinger
f2b9f0e8dd Fixed a compiler warning 2022-11-30 14:38:46 +01:00
Klaus Schmidinger
30f05ba714 Official release of version 2.6.2 2022-11-30 12:03:17 +01:00
Klaus Schmidinger
76445411a5 Added missing rounding when dividing frequencies in processing the NIT 2022-11-30 12:02:00 +01:00
Klaus Schmidinger
4425918d31 Fixed regenerating the index file of a recording in case it is present, but empty 2022-11-28 14:39:23 +01:00
Klaus Schmidinger
6888ea68b6 Added periodic calls to malloc_trim(0) to reduce memory consumption 2022-11-28 10:44:01 +01:00
Klaus Schmidinger
abb82a2396 Added support for kernel based LIRC driver 2022-11-26 13:37:06 +01:00
Klaus Schmidinger
6192ca81d9 Fixed name and email for Marko Mkel 2022-11-23 14:42:03 +01:00
Klaus Schmidinger
d06c5efa54 Avoiding a compiler warning 2022-11-22 15:53:07 +01:00
Klaus Schmidinger
f859b8d2ae Fixed printing/scanning values for systems where %ld doesn't work for time_t 2022-11-22 14:33:56 +01:00
Klaus Schmidinger
035d5fd5b9 Using the frame rate parsed from the stream, with fall back to determining it from PTS values 2022-11-22 11:35:37 +01:00
Klaus Schmidinger
93d578d9b8 Implemented parsing frame rate and image size for MPEG2, H.264 and H.265 2022-11-22 11:31:39 +01:00
Klaus Schmidinger
d756628297 Added a chapter about locking to PLUGINS.html 2022-11-20 21:38:18 +01:00
Klaus Schmidinger
a4cde807bc Added a missing 'const' to cTimers::GetTimerForEvent() 2022-11-20 10:57:31 +01:00
Klaus Schmidinger
83c9677899 Fixed a possible deadlock in case two SVDRP clients send each other POLL commands at the same time 2022-11-19 15:49:27 +01:00
Klaus Schmidinger
b14ed38a48 Removed some unnecessary locks from SVDRPClientHandler 2022-11-19 15:47:03 +01:00
Klaus Schmidinger
2bf0967a47 Fixed default values for DVB-T 2022-11-15 10:21:55 +01:00
Klaus Schmidinger
7ed306d127 Changed email address of Winfried Khler 2022-11-14 11:14:10 +01:00
Klaus Schmidinger
5a029eb29f Added a warning if an attempt is made to obtain a write lock twice from the same thread 2022-11-13 15:25:52 +01:00
Klaus Schmidinger
230adc8235 Fixed a possible crash if an editing process is canceled while the edited recording is being replayed 2022-11-13 15:23:13 +01:00
Klaus Schmidinger
982a9a5157 Setting the '.timer' file when regenerating the index file 2022-11-13 14:49:08 +01:00
Klaus Schmidinger
c8e4921a0a Now checking for '.timer' file to determine whether a recording is still active 2022-11-06 11:49:31 +01:00
Klaus Schmidinger
786245efe5 Now assuming the lock when removing deleted recordings even if the disk is full 2022-11-04 14:30:01 +01:00
Klaus Schmidinger
74460f22bf Now dropping capabilities after opening terminal 2022-06-01 14:24:57 +02:00
Klaus Schmidinger
a843d03af1 Fixed unexpected calls of the '-r' script when a recording is interrupted and the timer has not yet finished 2022-03-03 14:44:47 +01:00
Klaus Schmidinger
d3f3e856e4 Added UPDATE-2.6.0, which was missing in the official 2.6.0 release 2022-02-09 12:34:09 +01:00
Klaus Schmidinger
be3c6048ed Official release of version 2.6.1 2022-02-02 10:56:43 +01:00
Klaus Schmidinger
2a0222226a Clarified some potentially mistakable code in cSectionHandler::SetStatus() 2022-01-31 21:21:42 +01:00
Klaus Schmidinger
50c3951017 Fixed a possible deadlock in cDevice::DetachAllReceivers() 2022-01-24 16:53:45 +01:00
Klaus Schmidinger
ea1ad945b4 Fixed handling error conditions in the index file 2022-01-24 10:44:21 +01:00
Klaus Schmidinger
8cde8464eb Fixed handling zero bytes in cH264Parser 2022-01-18 14:24:33 +01:00
Klaus Schmidinger
14b108f104 Added some missing "AUTO" values to vdr.5 2022-01-14 10:46:15 +01:00
Klaus Schmidinger
330dbce1e7 Updated the Italian OSD texts 2022-01-14 10:27:26 +01:00
Klaus Schmidinger
adeb6314fb Fixed starting replay after jumping to an editing mark 2022-01-13 21:41:41 +01:00
Klaus Schmidinger
78a09b5926 Removed a TODO - detecting errors was implemented in version 2.5.4 2022-01-13 10:56:01 +01:00
Klaus Schmidinger
d05765c670 Replaced strncpy() with memcpy() in strreplace() to avoid a compiler warning 2021-12-30 14:38:40 +01:00
Klaus Schmidinger
a5a4b72d1c Fixed description of using number keys to toggle weekdays of a timer 2021-12-29 21:06:52 +01:00
Klaus Schmidinger
955b1c914f Official release of version 2.6.0 2021-12-27 13:31:29 +01:00
Klaus Schmidinger
5b28aa7e02 Added entries for backports to version 2.4.8 2021-12-27 13:27:16 +01:00
Klaus Schmidinger
f34a6d66a0 Removed a leftover debugging line 2021-12-25 14:11:39 +01:00
Klaus Schmidinger
104bddc560 Fixed calculating the disk use percentage if there's more than 20TB of recordings 2021-12-24 10:56:47 +01:00
Klaus Schmidinger
e7107b789e Fixed a possible memory leak in creating fonts 2021-12-20 13:19:52 +01:00
Klaus Schmidinger
f2e71eb668 Version 2.5.7 2021-12-20 10:06:37 +01:00
Klaus Schmidinger
f275346ecc Fixed a memory leak in handling the NIT 2021-12-14 21:15:02 +01:00
Klaus Schmidinger
33b47142e4 Fixed unlocking vs. call to EpgHandlers.EndSegmentTransfer() 2021-12-11 20:58:51 +01:00
Klaus Schmidinger
5f3d42bcd8 Added missing '0x09=H.265 video, 0x19 = AC4 audio' to vdr.5 2021-10-16 09:27:11 +02:00
Klaus Schmidinger
3f2dd916c1 Replaced all umlauts in the example channels.conf with their ae, oe, ue substitutes to avoid problems on UTF-8 systems 2021-07-26 12:39:42 +02:00
Klaus Schmidinger
0d50ec57f5 Version 2.5.6 2021-07-02 08:58:59 +02:00
Klaus Schmidinger
7301f2de08 The Recordings menu now marks recordings with errors, and the number of errors (if any) is displayed in the recording's Info menu 2021-07-01 15:40:46 +02:00
Klaus Schmidinger
8c7d387e86 Fixed triggering the PAT filter 2021-06-21 20:13:55 +02:00
Klaus Schmidinger
6c5a448dec Fixed deleting the edited recording in case of an error 2021-06-21 15:30:16 +02:00
Klaus Schmidinger
a84f9a8e19 Improved responsiveness in cSectionHandler::Action() 2021-06-20 10:27:19 +02:00
Klaus Schmidinger
545613e0e7 When checking whether a recording has already been made, recording names are now compared case insensitive 2021-06-20 10:03:28 +02:00
Klaus Schmidinger
ac4da6e380 Fixed a possible access to characters after the terminating zero of strings in cDoneRecordings::Contains(), in case there are fuzzy characters at the end of a string 2021-06-19 15:34:38 +02:00
Klaus Schmidinger
4d5cbaf57d If an error occurs while recording, the respective entry in the list of recordings is now updated immediately 2021-06-19 14:21:16 +02:00
Klaus Schmidinger
a4a2466bf4 Fixed restarting PMT pids after starting a recording on the currently viewed channel 2021-06-11 09:38:38 +02:00
Klaus Schmidinger
a0cdfc432a Version 2.5.5 2021-06-10 09:59:45 +02:00
Klaus Schmidinger
60c858689b Fixed handling incomplete multi-packet CAT 2021-06-09 09:42:15 +02:00
Klaus Schmidinger
9686a9b474 Removed unused declaration of cDvbTuner::SetFrontendType() 2021-06-09 09:12:25 +02:00
Klaus Schmidinger
0f6265a97f Fixed flushing old data from the section handler 2021-06-08 15:10:51 +02:00
Klaus Schmidinger
7b1c097958 No longer permanently looping through PMT PIDs, which caused problems with some SatIP receivers 2021-06-08 14:57:26 +02:00
Klaus Schmidinger
58e21d8e37 Now using __cplusplus instead of DISABLE_TEMPLATES_COLLIDING_WITH_STL, and using std::min(), std::max() and std::swap() if available 2021-05-26 13:37:53 +02:00
Klaus Schmidinger
e1f04cd6fa Added missing initialization of cRecorder::lastErrors 2021-05-25 20:14:06 +02:00
Klaus Schmidinger
7775698bac The error counter of a recording is now copied as is when editing a recording 2021-05-25 20:09:29 +02:00
Klaus Schmidinger
8f52603665 cRecordingInfo::Errors() now returns -1 for old recordings; added a missing 'const' 2021-05-23 15:03:17 +02:00
Klaus Schmidinger
c40fb4b4aa Version 2.5.4 2021-05-21 15:09:34 +02:00
Klaus Schmidinger
161fa8ead4 The default for DEPRECATED_SKIN_SETITEMEVENT has been set to 0 2021-05-21 13:03:42 +02:00
Klaus Schmidinger
115eb9fdb4 The macro DEPRECATED_GETBITMAP and the related code has been removed 2021-05-21 12:54:08 +02:00
Klaus Schmidinger
b7112ece6c The default for DEPRECATED_SETCURRENTCHANNEL has been set to 0 2021-05-21 12:51:16 +02:00
Klaus Schmidinger
f7c8f582ea The macro DEPRECATED_VDR_CHARSET_OVERRIDE and the related code has been removed 2021-05-21 12:43:18 +02:00
Klaus Schmidinger
ada85b693e The 'Edit path' dialog now also shows the total size of all recordings in that path 2021-05-21 10:41:46 +02:00
Klaus Schmidinger
a1a8c5d94c Added code for the 'qad' audio track 2021-05-21 09:50:57 +02:00
Klaus Schmidinger
505bcee926 The transponder value of channels is now cached 2021-05-21 09:38:34 +02:00
Klaus Schmidinger
c02c081d91 The cFile class has been partially deprecated 2021-05-20 10:13:43 +02:00
Klaus Schmidinger
c8566fab77 Removed 'register' from libsi/util.c to avoid a warning with ISO-C++17 2021-05-19 11:55:00 +02:00
Klaus Schmidinger
54c4e69299 Removed the macros __STL_CONFIG_H, _STL_ALGOBASE_H and _MOVE_H from tools.h 2021-05-19 11:50:24 +02:00
Klaus Schmidinger
31b87544f1 Recordings are now checked for errors 2021-05-19 11:22:20 +02:00
Klaus Schmidinger
cd3cda2654 Fixed cTsPayload::AtPayloadStart() to ignore TS packets from other PIDs 2021-05-11 20:47:31 +02:00
Klaus Schmidinger
c98fdd9120 Fixed a typo 2021-05-03 14:06:12 +02:00
Klaus Schmidinger
10ffd08c82 Fixed a possible crash in the Schedule menu, in case Setup.EPGLinger is 0 2021-04-29 09:19:58 +02:00
Klaus Schmidinger
4a199fe4ac Now using a separate fixed value for internal EPG linger time 2021-04-28 20:44:56 +02:00
Klaus Schmidinger
98fa6206ac Version 2.5.3 2021-04-20 14:25:33 +02:00
Klaus Schmidinger
ce23ba64bd Deleting expired timers is now triggered immediately after the timers are modified 2021-04-20 13:22:37 +02:00
Klaus Schmidinger
02c668a6a9 EXPIRELATENCY now only applies to VPS timers 2021-04-20 09:50:02 +02:00
Klaus Schmidinger
9de337d2ee The new functions cTimer::Start/StopTimeEvent() are now used in the LCARS skin to display the start/stop times of timers in the main menu 2021-04-18 14:56:40 +02:00
Klaus Schmidinger
fa8c7c35b5 Fixed the timer indicator in the Schedule menu in case an event is already over, but the timer is still recording 2021-04-17 09:44:01 +02:00
Klaus Schmidinger
3d13eb002f Now making sure that spawned timers with reduced start/stop margins actually record with the full margins 2021-04-16 16:26:47 +02:00
Klaus Schmidinger
b2fb654bb3 To avoid problems with very short events, non-VPS pattern timers now spawn timers for all matching events that would start while the first one is still recording 2021-04-13 13:54:00 +02:00
Klaus Schmidinger
cd834c79ba Fixed dropping outdated events 2021-04-13 13:35:17 +02:00
Klaus Schmidinger
65aafacd8e Now adjusting spawned timers before setting events to timers 2021-04-10 11:32:50 +02:00
Klaus Schmidinger
ebd92dcd31 Fixed logging the old timer data in cTimer::AdjustSpawnedTimer() 2021-04-10 11:32:50 +02:00
Klaus Schmidinger
0003d6391c When spawning pattern timers, the new function cTimers::GetTimerForEvent() is now used to check whether a matching event already has a local timer 2021-04-10 10:09:50 +02:00
Klaus Schmidinger
4e52547a59 cTimer::TriggerRespawn() now only acts on local timers 2021-04-06 14:25:05 +02:00
Klaus Schmidinger
d3755c92d7 Version 2.5.2 2021-04-06 10:04:24 +02:00
Klaus Schmidinger
d536cf0947 No longer switching devices for pattern timers 2021-04-06 10:00:27 +02:00
Klaus Schmidinger
19a0e3cda7 Fixed MakePatternFileName() in case the event doesn't yet have a short text 2021-04-06 09:50:30 +02:00
Klaus Schmidinger
7fb13b3cbf Fixed handling the timer counter in cSchedule::DelEvent() 2021-04-06 09:01:26 +02:00
Klaus Schmidinger
23d986657a Spawned timers that don't use VPS now automatically adjust their start/stop times to changes in the respective event's times 2021-04-06 08:48:35 +02:00
Klaus Schmidinger
8f1419fff5 The margins for timer recordings are now always limited to the duration of the previous and next event 2021-04-04 13:38:13 +02:00
Klaus Schmidinger
b80c22e9c4 Improved handling EPG data from the EIT tables 2021-04-04 11:06:30 +02:00
Klaus Schmidinger
f672fe90c1 Fixed scaling subtitles with anti-aliasing 2021-03-17 15:24:34 +01:00
Klaus Schmidinger
3d55d3045e Decreased the scrambling timeout for CAMs known to decrypt a certain channel 2021-03-17 10:59:36 +01:00
Klaus Schmidinger
7ffc1a5efe Made checking for done recordings more tolerant 2021-03-17 10:55:43 +01:00
Klaus Schmidinger
36a833053b Improved cSectionSyncer 2021-03-16 15:10:54 +01:00
Klaus Schmidinger
ad35c9c2d3 Added some missing user command calls for copying, renaming and moving recordings 2021-01-19 20:38:28 +01:00
Klaus Schmidinger
1b1465a677 Now making sure a spawned timer only fully overlaps the given event 2021-01-19 13:21:51 +01:00
Klaus Schmidinger
2f6ce68ca7 Fixed setting the 'title' of a recording's info to the recording's name if there is no info file 2021-01-18 13:35:16 +01:00
Klaus Schmidinger
dee1225fa4 Made the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public 2021-01-18 12:55:47 +01:00
Klaus Schmidinger
d78d6fba7e Spawned timers are now preferred over pattern timers in the Schedule menu 2021-01-15 13:52:40 +01:00
Klaus Schmidinger
80bdc90650 Now explicitly triggering respawning of pattern timers 2021-01-14 10:29:05 +01:00
Klaus Schmidinger
c402d57809 Increased the number of possible modulation systems in cDevice::GetDevice() 2021-01-11 10:36:05 +01:00
Klaus Schmidinger
f1836af0b0 Fixed VPS handling when spawning a pattern timer, in case Setup.UseVps is false 2021-01-07 16:00:17 +01:00
Klaus Schmidinger
eebcc57079 Fixed initializing the cChannel::schedule pointer after reading EPG data with PUTE 2021-01-04 09:05:26 +01:00
Klaus Schmidinger
cbc04d73b8 Added entries for backports to version 2.4.7 2021-01-02 15:37:57 +01:00
Klaus Schmidinger
be9eff0fad Fixed handling $(PKG_CONFIG) in newplugin 2021-01-02 14:32:20 +01:00
Klaus Schmidinger
3f3e47d280 Fixed a crash in the SVDRP command CLRE in case a non-existing channel number is given 2021-01-01 21:23:00 +01:00
Klaus Schmidinger
40ca081ff4 Using strgetlast() in more places 2021-01-01 15:26:27 +01:00
Klaus Schmidinger
c46fd1ff5b The Makefile now makes sure the 'x' bit of Doxyfile.filter is set before calling doxygen 2020-12-31 11:15:11 +01:00
Klaus Schmidinger
55b237dbe8 Fixed strreplace() to handle NULL strings 2020-12-29 21:40:29 +01:00
Klaus Schmidinger
2b3556b460 Implemented "Pattern Timers" 2020-12-26 15:49:01 +01:00
Klaus Schmidinger
d2e0087c4e Official release of version 2.4.6 2020-12-22 17:23:51 +01:00
Klaus Schmidinger
9a650a4772 Fixed convertCharacterTable() in case iconv_open() fails 2020-12-19 14:41:41 +01:00
Klaus Schmidinger
f4739f89bf Whitespace cleanup 2020-12-18 23:02:47 +01:00
Klaus Schmidinger
7ade54dfd7 Fixed a compiler warning 2020-12-18 14:51:57 +01:00
Klaus Schmidinger
45fde332a0 Fixed initializing tmpbuf in ExtendedEventDescriptors::getText() 2020-12-17 12:52:57 +01:00
Klaus Schmidinger
82cc5c76a4 Improved handling missing VDRPluginDestroyer() 2020-12-16 11:54:06 +01:00
Klaus Schmidinger
67a4ba4228 Fixed error handling when loading a plugin 2020-12-13 10:56:36 +01:00
Klaus Schmidinger
79a3607d0c Avoiding a lengthy lock on the Channels list when starting a recording 2020-12-12 22:01:01 +01:00
Klaus Schmidinger
dffeabbacb Fixed PMT handling in case locking the Channels list times out 2020-12-12 10:31:52 +01:00
Klaus Schmidinger
9fa7de2036 Fixed a bug in handling shared PMTs, where after the first pass not all SIDs of a PMT pid were checked any more 2020-12-09 21:42:26 +01:00
Klaus Schmidinger
bacc873896 Added initialization of cDvbFrontend::frontendInfo 2020-12-05 15:48:40 +01:00
Klaus Schmidinger
375d25627d Fixed generating the HashId in cEIT::cEIT() 2020-11-28 21:45:05 +01:00
Klaus Schmidinger
56e2ed2628 Fixed "read incomplete section" errors 2020-11-24 21:19:49 +01:00
Klaus Schmidinger
ad55da4ef9 Fixed possible compilation errors with libjpeg 2020-11-22 13:32:05 +01:00
Klaus Schmidinger
272231467a Fixed parsing the '-l' command line option 2020-11-20 13:49:58 +01:00
Klaus Schmidinger
6cb818c7ad Fixed allocating memory for cImage 2020-11-16 15:53:53 +01:00
Klaus Schmidinger
c23547c4ca Fixed a crash in case an error occurs when setting a remote timer 2020-11-06 13:13:05 +01:00
Klaus Schmidinger
0468b38ff3 Fixed an unnecessary double call to Display() in cMenuRecording::RefreshRecording() 2020-11-03 22:12:38 +01:00
Klaus Schmidinger
ebbc562aab Fixed multiple recording entries in case a recording is started during the initial reading of the video directory 2020-11-01 10:29:07 +01:00
Klaus Schmidinger
f387bb5e77 Now initializing the status variable in cDvbTuner::GetFrontendStatus() and cDvbTuner::GetSignalStats() to avoid problems with drivers that don't do this 2020-10-16 13:58:45 +02:00
Klaus Schmidinger
c5461ffd9f Now checking for an empty command in cDvbTuner::GetSignalStats() to avoid a possible error message 2020-10-16 13:50:36 +02:00
Klaus Schmidinger
8c1c92bff6 Added checking the symbol rate to cDvbTuner::IsTunedTo(), which apparently got lost in version 1.7.13 2020-10-16 13:42:13 +02:00
Klaus Schmidinger
36be6abfbd Increased the size of the TS buffer to 16MB, to have more reserve when recording several HD programmes 2020-10-15 10:16:38 +02:00
Klaus Schmidinger
f24e93ade1 Added test cases for alignment of semi-circles 2020-10-14 20:32:41 +02:00
Klaus Schmidinger
1a6a518f49 Fixed alignment of semi-circles in case of odd sizes 2020-10-13 13:47:10 +02:00
Klaus Schmidinger
fc7ca12edd Implemented anti-aliasing for cPixmap::DrawEllipse() 2020-10-12 13:54:44 +02:00
Klaus Schmidinger
bbd36d0610 Implemented anti-aliasing for cPixmap::DrawSlope() 2020-09-29 14:09:26 +02:00
Klaus Schmidinger
eebe7c798a Fixed several typos 2020-09-16 13:48:33 +02:00
Klaus Schmidinger
76a7bed575 Fixed a possible invalid lock sequence in cMenuTimers::OnOff() 2020-09-16 13:35:30 +02:00
Klaus Schmidinger
46b480c798 Fixed checking the return value of the Open() call in cFileName::SetOffset() 2020-09-16 13:30:59 +02:00
Klaus Schmidinger
b4a6c36215 Fixed handling newline characters in ci.c's CopyString() 2020-08-17 10:26:18 +02:00
Klaus Schmidinger
121f348379 Updated the Italian OSD texts 2020-08-16 13:34:23 +02:00
Klaus Schmidinger
16fb7967ff Official release of version 2.4.4 2020-08-02 08:55:08 +02:00
Klaus Schmidinger
88a2ef45ee Fixed a possible 'invalid lock sequence' when switching to an unavailable channel with the main menu open 2020-07-13 08:16:41 +02:00
Klaus Schmidinger
dd6077eb90 Implemented handling multi packet CATs with MTD 2020-07-10 09:06:21 +02:00
Klaus Schmidinger
568ca0e773 Fixed handling inactive shared CA pids 2020-07-01 15:16:21 +02:00
Klaus Schmidinger
fa5c9f764a Now setting currentDisplayChannel = NULL before calling cStatus::MsgOsdClear() in ~cDisplayChannel(), to avoid possible problems in case a plugin calls IsOpen() 2020-07-01 15:05:17 +02:00
Klaus Schmidinger
5193fd9d99 Improved deleting plugins in case the plugin uses its own memory management 2020-06-29 09:29:06 +02:00
Klaus Schmidinger
a526eee165 Fixed the 'else if' branch in cDevice::GetDeviceForTransponder(), which hasn't been active since version 1.7.29 2020-06-27 10:24:46 +02:00
Klaus Schmidinger
848c65fe4f Added CRC check of the CAT in cCaPidReceiver::Receive() 2020-06-27 10:05:56 +02:00
Klaus Schmidinger
488a13543e Now adding CPPFLAGS to CXXFLAGS to allow extra preprocessor flags to be given when doing make 2020-06-27 09:13:04 +02:00
Klaus Schmidinger
3cc0abf6ea Adjusted device selection in GetDeviceForTransponder() to that in GetDevice() 2020-06-25 13:46:16 +02:00
Klaus Schmidinger
35b95c2b00 Added a comment about the semantics of cTimeMs::Set() 2020-06-23 15:52:29 +02:00
Klaus Schmidinger
7630f579e1 Added support for HEVC-video and AC-4-audio 2020-06-23 09:27:09 +02:00
Klaus Schmidinger
8bd2ed1494 Fixed a typo in svdrp.c 2020-06-22 20:59:49 +02:00
Klaus Schmidinger
f5dba03447 Made the call to pkg_config configurable via the PKG_CONFIG macro, which is necessary for cross-building VDR 2020-06-22 15:08:46 +02:00
Klaus Schmidinger
73bcd869dc Added optional verbose output to the libsi Makefile 2020-06-22 14:31:10 +02:00
Klaus Schmidinger
1dabb9b8c5 Changed the country code in the generated ParentalRatingDescriptor from 'DEU' to '902' to make it valid for all countries 2020-06-22 12:15:52 +02:00
Klaus Schmidinger
5d39daa13c Added handling shared PMT pids and multiple PMT sections 2020-06-19 12:19:15 +02:00
Klaus Schmidinger
54cf10588d Added support for detecting 'advanced codec digital radio sound service' 2020-06-16 14:50:07 +02:00
Klaus Schmidinger
52826ec4c1 Added support for detecting new channels broadcast in HEVC 2020-06-16 14:41:32 +02:00
Klaus Schmidinger
ba9ccc12a5 Added cMtdHandler::StopDecrypting() 2020-06-16 14:33:32 +02:00
Klaus Schmidinger
67ea2163f4 Added cMtdCamSlot::TsPostProcess() 2020-06-16 14:25:43 +02:00
Klaus Schmidinger
1e1cd4554e Added codes for more languages and special audio tracks 2020-06-15 15:57:32 +02:00
Klaus Schmidinger
319df53e87 Added failsafe defaults for 'make LCLBLD=1' to the Makefile 2020-06-15 13:07:55 +02:00
Klaus Schmidinger
8e1be83b56 Revised 'Fixed a possible deadlock when detaching a receiver from a device' from version 2.3.9, which sometimes caused a black screen when switching channels 2020-06-12 09:28:44 +02:00
Klaus Schmidinger
5cfa736ad0 Fixed memory handling in cString::Append() 2020-06-10 20:52:10 +02:00
Klaus Schmidinger
8a282ef267 Added a device hook for detecting whether a device provides EIT data 2020-06-10 14:52:43 +02:00
Klaus Schmidinger
709055980e Fixed the size of cChannel::dtypes[] 2020-06-10 14:00:36 +02:00
Klaus Schmidinger
576e21f2fd Fixed credits for Winfried Khler 2020-06-10 13:51:58 +02:00
Klaus Schmidinger
e6bf3b6975 Added a missing '-D' to the 'plugins' target of the Makefile 2020-06-03 12:25:09 +02:00
Klaus Schmidinger
196785ff05 Fixed a possible crash in case replay is started and stopped in rapid sequence 2020-05-18 16:47:29 +02:00
Klaus Schmidinger
dd9dd76722 The isSingleByte parameter in the call to getCharacterTable() is deprecated and only present for backwards compatibility 2020-05-15 12:32:51 +02:00
Klaus Schmidinger
aae02a43da Modified setting system and override character tables 2020-05-15 11:31:40 +02:00
Klaus Schmidinger
ab308bea31 Fixed handling multi part ExtendedEventDescriptors where only the first part contains information about the character table 2020-05-14 21:21:03 +02:00
Klaus Schmidinger
5f3ad4fc9b Added the language code for Bulgarian 2020-05-11 11:04:29 +02:00
Klaus Schmidinger
f031563400 Improvements to the skincurses plugin 2020-05-11 10:23:15 +02:00
Klaus Schmidinger
d354d01af7 Fixed 'Changes for ncurses version 6' 2020-05-10 09:04:31 +02:00
Klaus Schmidinger
35b936200f Fixed dropping capabilities in case cap_sys_time is not available 2020-05-07 10:45:41 +02:00
Klaus Schmidinger
e6c450b346 Added missing '<...>' to the 'file' parameter in the help text of PUTE 2020-05-06 11:51:33 +02:00
Klaus Schmidinger
c813de133b The SVDRP command DELC now also accepts a channel id 2020-05-05 15:37:49 +02:00
Klaus Schmidinger
abe61dc903 Fixed wrong/missing credits for Jrgen Schneider (there's two of them) 2020-05-04 13:22:58 +02:00
Klaus Schmidinger
f624a082ad Fixed initializer 2020-05-04 13:02:14 +02:00
Klaus Schmidinger
38703cbf5d Updated email address of Uwe Scheffler 2020-05-04 12:47:40 +02:00
Klaus Schmidinger
930c2cd2eb Fixed compatibility with current versions of glibc 2020-05-04 12:28:31 +02:00
Klaus Schmidinger
225c495632 Fixed a typo 2020-05-04 11:40:44 +02:00
Klaus Schmidinger
5705ffbd2b Now retuning if the received transponder's SDT doesn't contain the expected values for NID and TID 2020-05-04 08:50:20 +02:00
Klaus Schmidinger
6e0f5287ea Fixed moving channels between number groups in SVDRP's MOVC command and the Channels menu, in case a channel is moved to a higher number and into a numbered group 2020-04-11 09:22:05 +02:00
Klaus Schmidinger
f63a066b98 Fixed typos 2020-03-29 15:53:48 +02:00
Klaus Schmidinger
6ff6db23bf Removed a wrong comment 2020-03-29 15:50:22 +02:00
Klaus Schmidinger
2af25bc58e Official release of version 2.4.1 2019-06-16 09:15:44 +02:00
Klaus Schmidinger
2b39c192a6 Fixed handling the S2SatelliteDeliverySystemDescriptor for transponders broadcasting in "backwards compatibility mode" according to ETSI EN 300 468 2019-05-31 13:25:00 +02:00
Klaus Schmidinger
0873d14614 If cSkins::Message() is called from a background thread and Type is not mtStatus, the call is now automatically forwarded to QueueMessage() 2019-05-29 16:44:55 +02:00
Klaus Schmidinger
712523f004 Fixed a wrong variable name in cFileName::cFileName() 2019-05-29 14:23:40 +02:00
Klaus Schmidinger
c2634a7ccf Fixed inconsistent behavior in case only certain devices are used (selected by the '-D' option) 2019-05-28 15:54:22 +02:00
Klaus Schmidinger
e8ae4afd09 Increased PLAYERBUFSIZE to (MAXFRAMESIZE * 5) to avoid stuttering replay under heavy system load, and to better document that this buffer size is related to the maximum frame size 2019-05-27 14:15:06 +02:00
Klaus Schmidinger
96aa4cacae The default maximum size of a cPixmap has been raised to the maximum possible value 2019-05-24 21:28:35 +02:00
Klaus Schmidinger
4242fa7f22 Fixed asserting free disk space in case there is no local timer currently recording 2019-05-23 10:00:48 +02:00
Klaus Schmidinger
abdab18807 Added a workaround for broadcasters who set an event to status "not running" where this is inappropriate; implicitly setting events to "not running" is now also logged 2019-05-20 09:55:22 +02:00
Klaus Schmidinger
12d8ef5a21 Fixed handling repeat function for keyboards 2019-05-13 13:41:29 +02:00
Klaus Schmidinger
6f95a495ab Fixed a compiler warning in cIndexFile::ConvertToPes() and added __attribute__((packed)) to tIndexPes and tIndexTs 2019-05-07 09:26:40 +02:00
Klaus Schmidinger
99dad019cc Fixed handling remote timers in case the response to LSTT is '550 No timers defined' 2019-05-06 15:14:04 +02:00
Klaus Schmidinger
ff2af3dffd Fixed a possible invalid lock sequence if the main menu is open and the user switches to a channel that is currently not available, using the Channel+/- keys 2019-05-06 13:14:23 +02:00
Klaus Schmidinger
294452cd43 Fixed a compiler warning and a possible buffer overflow in cCiMMI::SendAnswer() 2019-05-06 12:03:59 +02:00
Klaus Schmidinger
820c22775c Fixed a compiler warning in ExchangeChars() 2019-05-06 11:30:03 +02:00
Klaus Schmidinger
16f18cbce8 Fixed updating the checksum in the CA table after mapping EMM PIDs for MTD 2019-05-05 18:35:15 +02:00
Klaus Schmidinger
0f10c8824c Fixed mapping SIDs in MTD 2019-05-05 13:59:03 +02:00
Klaus Schmidinger
c5277df361 Fixed the install target in case of multiple jobs 2019-05-05 13:35:56 +02:00
Klaus Schmidinger
b83d29764e Now touching the .update file in the video directory after removing deleted recordings 2019-03-19 16:02:28 +01:00
Klaus Schmidinger
dd13070260 Fixed handling shared CA pids 2019-03-19 14:58:06 +01:00
Klaus Schmidinger
bd3b6f17e4 Fixed updating the cursor position when switching channels with the Channel+/- keys while the Channels menu is open 2019-03-18 16:20:17 +01:00
Klaus Schmidinger
1fa861ecb9 Fixed dropping capabilities in case cap_sys_time is not available 2019-03-18 13:39:56 +01:00
Klaus Schmidinger
2cf207b53e Fixed a copy/paste error 2019-03-18 10:29:09 +01:00
Klaus Schmidinger
4bd6d6559f Fixed sorting recordings alphabetically 2019-03-17 16:15:51 +01:00
Klaus Schmidinger
4b3fec660a Fixed processing SI::T2DeliverySystemDescriptor when typecasting it over an SI::ExtensionDescriptor 2019-03-15 16:28:16 +01:00
Klaus Schmidinger
dc160ab570 No longer logging tuning timeouts for transponders that are announced in the NIT but are not currently broadcasting 2019-03-15 14:51:22 +01:00
Klaus Schmidinger
4c7efcbd02 Added support for EAC3 audio from other sources 2019-03-15 13:10:33 +01:00
Klaus Schmidinger
27c0fffe7c Fixed triggering the SDT filter when parsing the NIT 2019-03-12 14:02:53 +01:00
Klaus Schmidinger
df8f5f4800 Fixed processing transponder data in the NIT 2019-03-12 13:05:33 +01:00
Klaus Schmidinger
71461c6082 Changes for ncurses version 6 2019-03-12 12:26:05 +01:00
Klaus Schmidinger
61ea56a1bd Fixed processing the last entry in the scan list of the EIT scanner 2019-03-12 11:47:36 +01:00
Klaus Schmidinger
235c652648 Fixed shutdown after user inactivity in case a plugin is keeping the OSD open (cont'd) 2019-03-12 10:01:16 +01:00
Klaus Schmidinger
61c00ccae5 Fixed handling PATs that contain no PMTs 2019-03-11 13:21:17 +01:00
Klaus Schmidinger
084f51c7db Fixed opening the UDP port in peerdemo 2019-03-11 10:28:22 +01:00
Klaus Schmidinger
18bb52554f Fixed accessing the actual frontend on multi frontend devices 2019-03-10 12:10:01 +01:00
Klaus Schmidinger
b9162ad7bd Reverted the change "The EIT filter no longer parses data from "other TS"..." 2018-11-15 16:38:14 +01:00
Klaus Schmidinger
5300077109 Rearranged some code for clarity - no functional changes 2018-10-29 12:22:11 +01:00
Klaus Schmidinger
cbc77f1f25 Added support for DVB devices with more than one frontend that all use the same dvr and demux 2018-10-29 12:16:35 +01:00
Klaus Schmidinger
bcee8ad43d Now deactivating MTD support if a non MCD capable CAM is inserted after removing a previously used CAM that is MCD capable 2018-09-23 10:21:12 +02:00
Klaus Schmidinger
336822f672 Fixed switching through encrypted channels with the Up/Down keys 2018-07-16 09:33:21 +02:00
Klaus Schmidinger
5543f13051 Fixed shutdown after user inactivity in case a plugin is keeping the OSD open 2018-07-16 08:55:15 +02:00
Klaus Schmidinger
30eb01ef37 Fixed locking the Channels list in cDisplayChannel, where the lock was still held when Flush() was called (cont'd) 2018-05-27 09:55:30 +02:00
Klaus Schmidinger
d380b57d28 Fixed locking the Channels list in cDisplayChannel, where the lock was still held when Flush() was called 2018-05-06 09:41:03 +02:00
Klaus Schmidinger
820a0ddb8a Fixed a possible invalid locking sequence in case a remote timer handling error message is displayed on the OSD and the skin tries to lock the Recordings or DeletedRecordings list in its Flush() function 2018-04-28 12:17:22 +02:00
Klaus Schmidinger
d84ec07ff6 Fixed handling the tfRecording flag in the SVDRP commands MODT and UPDT 2018-04-19 09:45:08 +02:00
Klaus Schmidinger
c48d5242ce Official release of version 2.4.0 2018-04-15 08:32:25 +02:00
Klaus Schmidinger
c057e057f9 Fixed a high CPU load during replay with active progress display 2018-04-14 10:24:41 +02:00
Klaus Schmidinger
fb03134411 Updated the French OSD texts 2018-04-14 08:49:04 +02:00
Klaus Schmidinger
732ba55126 channels.conf 2018-04-12 13:18:28 +02:00
Klaus Schmidinger
49d54df7d0 Adjusted version numbers and dates 2018-04-10 17:20:58 +02:00
Klaus Schmidinger
c89c83f5c1 Updated the Hungarian OSD texts 2018-04-10 08:39:00 +02:00
Klaus Schmidinger
3e83390fb9 Updated the Italian OSD texts 2018-04-09 09:51:04 +02:00
Klaus Schmidinger
0f9b4b6fd5 Added a missing initialization of osdState in cDisplayChannel::cDisplayChannel(eKeys FirstKey) 2018-04-09 09:21:27 +02:00
Klaus Schmidinger
bac9c65515 Fixed scaling bitmaps with very small factors 2018-04-06 08:51:16 +02:00
Klaus Schmidinger
5b9b09a90e Fixed updating the Schedule menu after editing a timer 2018-04-05 14:18:55 +02:00
Klaus Schmidinger
43544435fa Fixed sluggish setting of editing marks and a jumping progress display with very short recordings 2018-04-03 08:00:12 +02:00
Klaus Schmidinger
ac30924cdf Updated the Finnish OSD texts 2018-04-02 09:06:10 +02:00
Klaus Schmidinger
675e10d6fb Updated the Macedonian OSD texts 2018-04-02 09:01:49 +02:00
Klaus Schmidinger
77f438ed85 The EIT filter no longer parses data from "other TS" 2018-03-31 13:40:32 +02:00
Klaus Schmidinger
9dea1502eb Rephrased the note about the REMOTE macro 2018-03-25 13:11:38 +02:00
Klaus Schmidinger
e1a71ce7cc Fixed setting the initial offset of the cursor in a list menu 2018-03-24 11:58:00 +01:00
Klaus Schmidinger
53aea17949 Fixed a possible discrepancy of the primary device number in the LSTD and PRIM commands 2018-03-24 09:58:03 +01:00
Klaus Schmidinger
1f16ada70c Fixed some warnings from g++ 7.2.0 regarding fixed buffer sizes 2018-03-23 15:47:26 +01:00
Klaus Schmidinger
b539134e54 Fixed (not) saving the 'cam.data' file in case VDR stops early during startup due to some error 2018-03-19 16:39:58 +01:00
Klaus Schmidinger
6180dcce45 Version 2.4.0 2018-03-19 15:06:46 +01:00
Klaus Schmidinger
040f842e6c Fixed processing SVDRP client responses in case the caller doesn't want the actual response strings 2018-03-19 12:32:16 +01:00
Klaus Schmidinger
5cb66f8090 Updated the Ukrainian OSD texts 2018-03-19 10:47:53 +01:00
Klaus Schmidinger
a2b6b142d8 Modified cMenuTimers::Delete() to avoid a lengthy lock on the Timers list while prompting the user 2018-03-18 12:03:46 +01:00
Klaus Schmidinger
55408b73ca Fixed handling parameters in the S2SatelliteDeliverySystemDescriptor and T2DeliverySystemDescriptor 2018-03-18 10:52:21 +01:00
Klaus Schmidinger
f4b60f0b68 Made the input buffer in cSVDRPClient dynamic 2018-03-18 10:43:53 +01:00
Klaus Schmidinger
a1af84f29a Added missing <name> to help for POLL 2018-03-17 13:00:19 +01:00
Klaus Schmidinger
0e1956bb29 Fixed a typo 2018-03-17 12:17:37 +01:00
Klaus Schmidinger
64e8a34281 Commented out the logging in cMarks::Align() 2018-03-17 10:56:13 +01:00
Klaus Schmidinger
043929d850 Fixed a possible race condition with CONN vs. LSTT 2018-03-17 10:07:19 +01:00
Klaus Schmidinger
af3cb1c9c3 Improved handling VPS timers to better react to EPG changes during an ongoing recording 2018-03-11 13:19:30 +01:00
Klaus Schmidinger
c6796ac6df Removed sending the SVDRP command UPDR to peer VDRs whenever a change is made to the recordings in the video directory 2018-03-09 15:33:27 +01:00
Klaus Schmidinger
6b4911c6a2 Making sure the Schedules menu has a proper title, even if it is empty 2018-03-09 15:08:45 +01:00
Klaus Schmidinger
ec0e368a7f Handling SVDRP commands case insensitive 2018-03-09 10:49:48 +01:00
Klaus Schmidinger
1275de1b07 Now writing the info file before attaching the recorder to the device, to make sure it is present when the recorder needs to update the fps value 2018-03-08 17:03:51 +01:00
Klaus Schmidinger
746ce7d406 Fixed keeping the offset of the list cursor in case it is at the very top of the visible part of the list 2018-03-06 10:38:18 +01:00
Klaus Schmidinger
bb4b6901ad Fixed removing a cStateKey from a cStateLock 2018-03-05 22:40:12 +01:00
Klaus Schmidinger
a7fdd3c165 When making modifications to remote timers, the local VDR no longer sends a POLL to all remote VDRs 2018-03-05 15:49:20 +01:00
Klaus Schmidinger
1f9832b449 Assigning events to timers no longer triggers sending a POLL to all peer VDRs 2018-03-04 14:15:07 +01:00
Klaus Schmidinger
75648e80cf Modified cStateLock's SetExplicitModify() and IncState() 2018-03-04 11:31:21 +01:00
Klaus Schmidinger
8a7540321d Disabled the use of posix_fadvise() when reading 2018-03-03 19:35:31 +01:00
Klaus Schmidinger
adc7056c9e Fixed a typo 2018-03-03 13:10:51 +01:00
Klaus Schmidinger
b1b4a12848 Fixed stopping a remote repeating timer 2018-03-03 12:55:57 +01:00
Klaus Schmidinger
7b77f400a1 Fixed handling close of connections 2018-03-01 15:00:32 +01:00
Klaus Schmidinger
4d7455e783 Added timeouts for SVDRP peer communication about timers 2018-03-01 14:45:57 +01:00
Klaus Schmidinger
66d66b31dc Fixed the CompareInts() function 2018-02-28 10:14:18 +01:00
Klaus Schmidinger
9c3ce0048a When remote timers are fetched from a peer VDR, we no longer blindly delete and re-add them, but rather compare them and make only the minimum necessary changes 2018-02-28 10:06:47 +01:00
Klaus Schmidinger
3a3a233994 Updated the Polish OSD texts 2018-02-27 09:48:28 +01:00
Klaus Schmidinger
d5db0c5ba7 Improved locking 2018-02-26 15:42:15 +01:00
Klaus Schmidinger
dd6c37c13d Added options for name and port 2018-02-25 21:50:18 +01:00
Klaus Schmidinger
e4af94d3f9 Combined Start/StopSVDRPServer/ClientHandler() into Start/StopSVDRPHandler() 2018-02-25 13:57:21 +01:00
Klaus Schmidinger
bf497f4aae Fixed storing timer id in .timer for instant recordings 2018-02-25 13:28:19 +01:00
Klaus Schmidinger
6600478675 Moved handling remote timers into cSVDRPClientHandler::ProcessConnections() 2018-02-25 13:26:17 +01:00
Klaus Schmidinger
bbbc36a1e6 Adapted to the new CONN command 2018-02-25 12:42:58 +01:00
Klaus Schmidinger
361d642660 Initiating the client side of a peer-to-peer SVDRP connection is now done with the new SVDRP command CONN instead of using the UDP port with the server's address 2018-02-20 13:28:04 +01:00
Klaus Schmidinger
a72806a0ba Added a section about the '.sort' file to vdr.5 2018-02-15 16:02:04 +01:00
Klaus Schmidinger
a1c53eae1e Improved calculating signal strength and quality (cont'd) 2018-02-15 15:37:01 +01:00
Klaus Schmidinger
a4343bdfd9 Fixed case inconsistency with SVDRPDefaultHost 2018-02-15 14:41:14 +01:00
Klaus Schmidinger
940e4a7c4d Fixed handling SVDRP peering for more than one instance of VDR on the same machine, and improved logging and debug output 2018-02-15 14:30:14 +01:00
Klaus Schmidinger
3090d8146f Implemented storing timer id in .timer 2018-02-13 09:33:41 +01:00
Klaus Schmidinger
78831a72d5 Improved calculating signal strength and quality 2018-02-12 14:05:22 +01:00
Klaus Schmidinger
68f0f24670 Fixed getting the info of a newly edited recording 2018-02-10 13:31:31 +01:00
Klaus Schmidinger
6b9c5aa1ac When a timer is newly created in the Timers menu, it now immediately appears at the correct position in the list 2018-02-10 12:51:19 +01:00
Klaus Schmidinger
902c83ece3 Fixed keeping the cursor position in the Recordings menu in case a timer starts recording while the menu is open 2018-02-10 12:34:10 +01:00
Klaus Schmidinger
30650b9c13 Fixed updating the Timers menu after turning a local timer on/off with the Red button 2018-02-10 10:54:33 +01:00
Klaus Schmidinger
5976079fd3 Added a note about the fixed UDP port for SVDRP discovery to vdr.1 2018-02-09 15:21:06 +01:00
Klaus Schmidinger
1e3f146707 Replaced the warning regarding the open SVDRP port in the INSTALL file with a remarkabout using svdrphosts.conf to completely disable SVDRP access 2018-02-09 15:19:59 +01:00
Klaus Schmidinger
015b269c21 Making sure cSVDRPClient::Process() reads the entire reply once it started reading, even if no Response parameter is given 2018-02-05 15:18:19 +01:00
Klaus Schmidinger
802544662d Added the UPDATE-2.4.0 file 2018-02-04 10:07:42 +01:00
Klaus Schmidinger
41c247b8ff Added a note about 'cam.data' not being overwritten if it is read-only 2018-02-03 13:56:27 +01:00
Klaus Schmidinger
b2d3c92da9 Fixed typos 2018-02-03 13:42:11 +01:00
Klaus Schmidinger
bc295040d0 Added a note about the 'peerdemo' script 2018-02-03 13:12:04 +01:00
Klaus Schmidinger
c441a634a5 Limited some CAM related log messages to the actual master CAM, if any 2018-02-03 12:59:56 +01:00
Klaus Schmidinger
c71c3115cc Fixed handling editing marks in the replay progress display, in case the marks are deleted via the Info/Edit menu of the currently played recording 2018-02-01 16:08:15 +01:00
Klaus Schmidinger
5ae8d1a7a3 Implemented cStatus::MarksModified() 2018-01-29 14:09:59 +01:00
Klaus Schmidinger
0055eeeeb8 Fixed a possible deadlock when quickly zapping through encrypted channels 2018-01-28 11:21:28 +01:00
Klaus Schmidinger
5443fd4219 Fixed a possible crash when stopping VDR (contd) 2018-01-27 14:45:08 +01:00
Klaus Schmidinger
626ae82fee Added a missing '|' 2018-01-26 14:34:31 +01:00
Klaus Schmidinger
4fd2870720 Removed some excess ';' 2018-01-25 15:09:23 +01:00
Klaus Schmidinger
a9e32ad0a5 Removed superfluous call to cVideoDirectory::RemoveVideoFile() 2018-01-18 12:19:31 +01:00
Klaus Schmidinger
165eae9c31 Fixed wrongly removing the edited version after the cutter has completed 2018-01-18 10:13:29 +01:00
Klaus Schmidinger
a343b375df Now unlocking the Recordings list before displaying an error message in cMenuPathEdit::ApplyChanges() and cReplayControl::Stop() 2018-01-17 10:27:37 +01:00
Klaus Schmidinger
28b6ee47e3 Now using the 'example' macro in vdr.5 2018-01-16 15:27:17 +01:00
Klaus Schmidinger
ae41be85c8 Moved any locking from cutter.c into recording.c 2018-01-16 14:11:40 +01:00
Klaus Schmidinger
e7936c8595 Fixed wrongly deleting a recording that already exists when moving a recording 2018-01-16 11:09:26 +01:00
Klaus Schmidinger
5467bc4f24 Fixed a possible deadlock when detaching a receiver from a device 2017-12-16 13:13:13 +01:00
Klaus Schmidinger
477fb7dc20 When selecting a folder for a recording or timer, it is now possible to open a folder even if it doesn't contain any subfolders 2017-12-15 13:43:00 +01:00
Klaus Schmidinger
05bfa4b476 Changed the log message ""ERROR: copying directory %s to %s ended prematurely" from "error" to "info" 2017-12-14 15:18:05 +01:00
Klaus Schmidinger
630cc496ea Moved adding the name of the edited recording into the cutting thread, to avoid a problem with locking the Recordings list 2017-12-14 14:17:35 +01:00
Klaus Schmidinger
c3af5a69da Now staying in the source folder when moving a recording or a folder to a different folder 2017-12-14 10:45:02 +01:00
Klaus Schmidinger
7455fbd2ad Fixed canceling moving a folder with several recordings between volumes 2017-12-11 13:55:38 +01:00
Klaus Schmidinger
ea217de338 Now displaying recordings in move as non-selectable 2017-12-10 13:04:38 +01:00
Klaus Schmidinger
1492f6dbc4 Implemented 'OSD/Sorting direction for recordings' 2017-12-09 18:58:25 +01:00
Klaus Schmidinger
e757f10e44 If TS packets are not accepted by the output device in Transfer Mode, this is now reported only once per minute in the log file 2017-12-07 15:05:48 +01:00
Klaus Schmidinger
c868265397 Fixed a lengthy write lock on the Recordings list in case of moving a folder with more than one recording 2017-12-05 16:44:21 +01:00
Klaus Schmidinger
e5e0315d34 The CAM menu is now automatically closed when the current channel is switched 2017-12-04 15:33:41 +01:00
Klaus Schmidinger
0224fc5210 Fixed positioning to the current item when changing the sort mode in the Recordings menu, in case there is a LastReplayed recording 2017-12-04 14:55:13 +01:00
Klaus Schmidinger
b96277e28a Fixed a deadlock when moving a folder containing several recordings between different volumes 2017-12-04 13:07:39 +01:00
Klaus Schmidinger
b5d8f68b87 Translations for 'The new SVDRP commands 'LSTD' and 'PRIM'...' 2017-12-04 12:12:17 +01:00
Klaus Schmidinger
0a47b30528 Added the 'peerdemo' script 2017-12-03 12:49:30 +01:00
Klaus Schmidinger
26a40bc174 Added a note to PLUGINS.html about writing log messages in English 2017-11-29 10:03:13 +01:00
Klaus Schmidinger
990bc6a11f Fixed positioning the cursor in the Recordings menu when moving a recording between different volumes 2017-11-27 15:19:43 +01:00
Klaus Schmidinger
91774cf074 Fixed a possible crash when moving a recording between different volumes 2017-11-27 14:09:04 +01:00
Klaus Schmidinger
9d5ce204aa Now calling Hide() and cStatus::MsgReplaying(..., false) from cReplayControl::Stop() 2017-11-26 15:07:00 +01:00
Klaus Schmidinger
a9d82331e6 Fixed a possible crash with plugins that retrieve player information after a replay has been stopped, but before the replay control has been destroyed 2017-11-26 15:02:54 +01:00
Klaus Schmidinger
8dcff164fa Fixed handling timers during the change from DST to winter time 2017-11-12 13:13:06 +01:00
Klaus Schmidinger
54b721ebde Added some comments regarding font height 2017-11-11 14:05:53 +01:00
Klaus Schmidinger
d19a3fc3b8 The new SVDRP commands 'LSTD' and 'PRIM' can be used to list all available devices and to switch the primary device 2017-11-11 12:04:17 +01:00
Klaus Schmidinger
950b248220 Switching the primary device is no longer done via osSwitchDvb, but rather by the main program loop reacting to changes in Setup.PrimaryDVB 2017-11-09 16:23:15 +01:00
Klaus Schmidinger
bc3b6ed601 Local timers are now preferred over remote timers in the Schedules menu 2017-11-09 12:22:20 +01:00
Klaus Schmidinger
33bbff2aa5 The LCARS skin's main menu now reacts to changes of the current channel's name 2017-11-08 10:37:57 +01:00
Klaus Schmidinger
5c94900026 OSD menus now try to keep the offset of the list cursor at a constant position on the screen, even if the list is modified while being displayed 2017-11-07 15:42:47 +01:00
Klaus Schmidinger
e02a0a8c88 The timeout for the channel display is now reset whenever the channel or EPG data changes 2017-11-02 15:36:24 +01:00
Klaus Schmidinger
d8523b0db8 The macros used to control deprecated code or functions have been changed to hold numeric values; the default for DEPRECATED_VDR_CHARSET_OVERRIDE has been set to 0 2017-11-02 15:04:56 +01:00
Klaus Schmidinger
d74dd7a60a The function cDevice::GetVideoSystem() has been finally removed 2017-11-02 14:38:49 +01:00
Klaus Schmidinger
c08ed3ce44 The MTD mapper now avoids immediately reusing unique PIDs when switching channels 2017-10-31 12:20:56 +01:00
Klaus Schmidinger
19275aa8bb Fixed an invalid lock sequence when trying to remove a deleted recording in case of low disk space; now making sure that AssertFreeDiskSpace() is called with the maximum timer priority in case there are several timers recording with different priorities 2017-10-31 09:47:14 +01:00
Klaus Schmidinger
7bbbfb0dee Fixed handling VPS events outside the LingerLimit, which could cause recordings to stop prematurely 2017-10-11 09:22:24 +02:00
Klaus Schmidinger
ef7018cca4 Adapted the pic2mpg script to new ffmpeg options; no longer using 'convert' to scale/rotate the pictures 2017-10-06 15:12:25 +02:00
Klaus Schmidinger
f2a2c67152 Fixed a possible crash when stopping VDR 2017-08-31 11:46:16 +02:00
Klaus Schmidinger
9719766007 Updated the Finnish OSD texts 2017-07-24 09:02:12 +02:00
Klaus Schmidinger
32fb2e8a3e Updated the Italian OSD texts 2017-07-24 08:59:28 +02:00
Klaus Schmidinger
363dee6846 SVDRP peering can now be limited to the default SVDRP host 2017-06-30 09:50:44 +02:00
Klaus Schmidinger
a28d92d049 Whenever a change is made to the recordings in the video directory, the SVDRP command UPDR is now sent to all peer VDRs 2017-06-25 12:43:09 +02:00
Klaus Schmidinger
39294e0147 Added a note to the log, indicating that no further invalid lock sequences will be reported until VDR is restarted 2017-06-25 12:10:19 +02:00
Klaus Schmidinger
027ae738a8 Now using readdir() instead of readdir_r(), if GLIBC version 2.24 or newer is used 2017-06-25 11:54:32 +02:00
Klaus Schmidinger
ce5e23f209 Timers are now linked to EPG events even if they are inactive 2017-06-25 10:03:19 +02:00
Klaus Schmidinger
139a93156b Fixed drawing very long menu titles in the LCARS skin 2017-06-23 16:03:51 +02:00
Klaus Schmidinger
9cf7328452 Now skipping a leading '/' in AddDirectory(), to avoid double slashes 2017-06-23 09:44:25 +02:00
Klaus Schmidinger
0bccf29254 Updated the Italian OSD texts 2017-06-23 09:14:13 +02:00
Klaus Schmidinger
ede2e89670 Added a note about only working with the given data 2017-06-23 09:08:40 +02:00
Klaus Schmidinger
56117751a8 Fixed a possible crash in cStateLockLog 2017-06-23 09:03:19 +02:00
Klaus Schmidinger
1bce499383 Added some missing locks when calling functions from cStatus or cSkin* 2017-06-21 09:40:39 +02:00
Klaus Schmidinger
699c073d85 Fixed indentation 2017-06-20 15:02:39 +02:00
Klaus Schmidinger
95947a29d5 Fixed detecting whether a CAM replies to queries 2017-06-19 12:16:40 +02:00
Klaus Schmidinger
70f48e6ca3 Updated links in the INSTALL file 2017-06-12 08:58:26 +02:00
Klaus Schmidinger
0a2c88c288 Introduced the new macro DISABLE_TEMPLATES_COLLIDING_WITH_STL 2017-06-11 10:05:34 +02:00
Klaus Schmidinger
c70d62aeb4 Changed ##Lock to ##_Lock in the DEF_LIST_LOCK and USE_LIST_LOCK macros defined in tools.h 2017-06-11 09:01:47 +02:00
Klaus Schmidinger
a4a3c63779 Removed dashes from channel group delimiter in channels menu 2017-06-10 19:19:51 +02:00
Klaus Schmidinger
a98f6ca354 The "Channels" menu now indicates whether a channel is encrypted or a radio channel 2017-06-10 15:57:33 +02:00
Klaus Schmidinger
deb96b372e The option "Setup/Miscellaneous/Show channel names with source" can now be set to "type" or "full" 2017-06-10 15:34:23 +02:00
Klaus Schmidinger
360d8fe6b1 Implemented CAM auto responses 2017-06-10 11:53:39 +02:00
Klaus Schmidinger
93102b45e0 Fixed a typo in CAMMENURETYTIMEOUT and added logging CAM enquiries 2017-06-10 11:52:47 +02:00
Klaus Schmidinger
fd3bf51f7d Changed '-' to 'U' when a lock is released 2017-06-09 08:27:22 +02:00
Klaus Schmidinger
79314ab98f Increased SLL_LENGTH in thread.c to better handle long caller lines, and enclosed logCaller with DEBUG_LOCKCALL to preserve memory in normal operation 2017-06-08 08:29:45 +02:00
Klaus Schmidinger
38fed8c901 Fixed L(ock) and U(nlock) indicators in cStateLockLog 2017-06-08 08:24:30 +02:00
Klaus Schmidinger
081e9eb45f Fixed the locking sequence when starting an instant recording 2017-06-07 15:41:12 +02:00
Klaus Schmidinger
c0b8666d1f Fixed false positives when checking the locking sequence, in case of nested locks within the same thread (cont'd) 2017-06-07 12:31:31 +02:00
Klaus Schmidinger
210df9d835 Fixed uninitialized variable SdWatchdog in vdr.c 2017-06-06 10:55:12 +02:00
Klaus Schmidinger
dc775bc5f8 Fixed false positives when checking the locking sequence, in case of nested locks within the same thread 2017-06-06 09:25:48 +02:00
Klaus Schmidinger
ec47c4f932 Fixed the locking sequence when switching between 'Now', 'Next' and 'Schedule' in the Schedules menu 2017-06-04 09:35:18 +02:00
Klaus Schmidinger
25d28e7421 Fixed the locking sequence when creating a new timer from the Schedules menu 2017-06-03 12:51:22 +02:00
Klaus Schmidinger
2c74a31afe Added backtrace functions for debugging 2017-06-03 12:43:22 +02:00
Klaus Schmidinger
bae02358a3 Fixed a possible crash in case the SVDRP connection to a peer VDR is terminated while getting remote timers 2017-05-31 14:06:07 +02:00
Klaus Schmidinger
f97a59597f Now using a separate mutex to fix the race between SVDRP CHAN and cDevice::HasProgramme() 2017-05-30 11:06:55 +02:00
Klaus Schmidinger
6edfcda43a Fixed generating k_Release key events for LIRC remote controls 2017-05-30 11:05:00 +02:00
Klaus Schmidinger
c9c15a727d Fixed a double channel switch when pressing the Channel+/- keys while no menu or channel display is open 2017-05-29 11:37:06 +02:00
Klaus Schmidinger
5324809a91 Added clearing CiResourceHandlers before shutting down the plugin manager 2017-05-29 11:14:43 +02:00
Klaus Schmidinger
f69b920dbc The Makefiles now use the macro $(Q) instead of a plain '@' in front of their commands, so that verbosity can be controlled by the user 2017-05-29 09:12:42 +02:00
Klaus Schmidinger
a4c851f759 Fixed the locking sequence when starting a recording 2017-05-29 08:18:17 +02:00
Klaus Schmidinger
2751e239eb Fixed the locking sequence when dumping EPG data 2017-05-28 13:08:09 +02:00
Klaus Schmidinger
0af3ed548c Added debug output for checking the correct sequence of locking global lists 2017-05-28 12:47:54 +02:00
210 changed files with 14070 additions and 3825 deletions

View File

@ -275,7 +275,7 @@ Aaron Holtzman
Wolfgang Henselmann-Weiss <Wolfgang_Henselmann@betaresearch.de>
for fixing calculating the timeout value in cFile::FileReady()
Uwe Scheffler <linux_dvb@uni.de>
Uwe Scheffler <scheffler.u@web.de>
for his help in keeping 'channels.conf.cable' and 'channels.conf.terr' up to date
for helping to test new DVB-T handling
for reporting a bug in switching the video format in the Setup/DVB menu
@ -283,6 +283,9 @@ Uwe Scheffler <linux_dvb@uni.de>
for reporting a problem in handling the PrimaryLimit when requesting a device for
live viewing
for reporting a black screen while a "Recording started" message is displayed
for reporting a problem with the lock on the Channels list in cDisplayChannel still
being held when Flush() was called
for reporting a problem with failed tuning in SCR systems
Matjaz Thaler <matjaz.thaler@guest.arnes.si>
for improving AC3 decoding when replaying DVDs
@ -716,6 +719,8 @@ Oliver Endriss <o.endriss@gmx.de>
channels
for fixing a possible stack overflow in cListBase::Sort()
for reporting a crash when deleting a recording
for reporting a problem with sluggish setting of editing marks and a jumping progress
display with very short recordings
Reinhard Walter Buchner <rw.buchner@freenet.de>
for adding some satellites to 'sources.conf'
@ -1201,6 +1206,7 @@ Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>
for suggesting to change the naming of "binary skip mode" to "adaptive skip mode"
for adding a Status parameter to the interface of cDevice::SignalStats() and
cDvbDevice::SignalStats()
for reporting a possible crash when scaling bitmaps with very small factors
Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark
@ -1220,6 +1226,9 @@ Peter Bieringer <pb@bieringer.de>
for suggesting to ignore lines tagged with '#' in the 'info.vdr' file of a recording
for reporting a problem with the backslash ('\') in parameters when executing
external commands
for making the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public
for adding some missing user command calls for copying, renaming and moving recordings
for fixing scaling subtitles with anti-aliasing
Alexander Damhuis <ad@phonedation.de>
for reporting problems when deleting a timer that is currently recording
@ -1847,7 +1856,7 @@ Lucian Muresan <lucianm@users.sourceforge.net>
for exporting some libsi functions
for suggesting to add functions to cDevice that allow derived output devices to
implement scaling the video to a given size and location
fpr sorting sources.conf by continous azimuth
for sorting sources.conf by continuous azimuth
Mattias Grönlund <Mattias@Gronlund.net>
for pointing out a missing cleanup at program exit in case there is a problem
@ -2115,6 +2124,10 @@ Martin Wache <M.Wache@gmx.net>
device, which avoids a busy loop on very fast machines
for fixing a possible crash when loading an invalid XPM file
for suggesting to speed up anti-aliased font rendering by caching the blend indexes
for extending the option "Setup/Miscellaneous/Show channel names with source" to
"type" or "full"
for making the "Channels" menu indicate whether a channel is encrypted or a radio
channel
Matthias Lenk <matthias.lenk@amd.com>
for reporting an out-of-bounds memory access with audio language ids
@ -2174,8 +2187,9 @@ Hardy Flor <HFlor@web.de>
Harald Milz <hm@seneca.muc.de>
for his CUTR patch, which was used as a base to implement the SVDRP command EDIT
for reporting a bug in parsing the '-l' command line option
Marko Mäkelä <marko.makela@hut.fi>
Marko Mäkelä <marko.makela@iki.fi>
for making repeat keys be ignored when waiting for a keypress to cancel an operation
for reporting that a menu was automatically closed when a replay ends
for suggesting to ignore k_Repeat when deciding whether the same key has been
@ -2186,6 +2200,18 @@ Marko M
for suggesting to simplify some conditional expressions in skinlcars.c and skinsttng.c
for reporting some uninitialized item area coordinates in cSkinLCARSDisplayMenu
for reporting a problem with the video directory not being set correctly with --edit
for reporting a compiler warning about the use of strncpy() in strreplace()
for adding support for kernel based LIRC driver
for reporting a possible heap-use-after-free in cDvbTuner::Action()
for reporting a flaw in initializing cDvbPlayerControl and cTransferControl
for reporting a possible call to poll() in cSectionHandler::Action() without any
filters
for avoiding the memcpy() call in cGlyph::cGlyph() if the bitmap is empty
for avoiding unnecessary processing in cDvbSubtitleConverter::FinishPage() if there
are no areas
for avoiding a zero sized array in cDevice::GetDevice()
for reporting a crash when deleting a recording that is currently being edited, and
then immediately deleting the edited version, too
Patrick Rother <krd-vdr@gulu.net>
for reporting a bug in defining timers that only differ in the day of week
@ -2329,6 +2355,7 @@ Andr
for reporting a bug in 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
for reporting a problem with permanently looping through PMT PIDs on a SatIP receiver
Jürgen Schilling <juergen_schilling@web.de>
for reporting that color buttons were displayed in the recording info menu if it
@ -2430,6 +2457,23 @@ Christoph Haubrich <christoph1.haubrich@arcor.de>
"Edit recording" menu
for suggesting to add a confirmation before renaming a recording to its folder name
for reporting a problem with data loss in case renaming a recording fails
for adding support for HEVC-video and AC-4-audio
for implementing anti-aliasing for cPixmap::DrawSlope() and cPixmap::DrawEllipse()
for reporting an unnecessary double call to Display() in cMenuRecording::RefreshRecording()
for reporting too much memory being allocated in the cImage constructors
for making the 'Edit path' dialog also show the total size of all recordings in that path
for suggesting to make cRecordingInfo::Errors() return -1 for old recordings, and
reporting a missing 'const'
for reporting that the edited recording is not deleted in case of an error
for reporting missing '0x09=H.265 video, 0x19 = AC4 audio' in vdr.5
for reporting a problem with the call to EpgHandlers.EndSegmentTransfer()
for fixing handling zero bytes in cH264Parser
for implementing parsing frame rate and image size for MPEG2, H.264 and H.265
for reporting a bug in generating the index file in the cutter
for adding the frame width, height, scan type and aspect ratio of a recording to the 'F'
tag of the 'info' file
for adding a workaround in detecting frame height for channels with wrong crop parameters
for reporting duplicate component entries in the info of an ongoing recording
Pekka Mauno <pekka.mauno@iki.fi>
for fixing cSchedule::GetFollowingEvent() in case there is currently no present
@ -2482,6 +2526,11 @@ Tobias Grimm <tobias.grimm@e-tobi.net>
for adding a manual page for 'svdrpsend'
for adding a missing dependency to the Makefile to avoid error messages in the
clean-plugins target
for adding optional verbose output to the libsi Makefile
for making the call to pkg_config configurable via the PKG_CONFIG macro
for fixing a typo in svdrp.c
for suggesting to add CPPFLAGS to CXXFLAGS to allow extra preprocessor flags to be
given when doing make
Helge Lenz <h.lenz@gmx.de>
for reporting a bug in setting the 'Delta' parameter when calling the shutdown
@ -2503,6 +2552,50 @@ Nino Gerbino <ngerb@interfree.it>
Markus Ehrnsperger <markus.ehrnsperger@googlemail.com>
for reporting a problem with missing 'INCLUDES += -I$(DVBDIR)/include' in an existing
Make.config
for reporting a bug in error handling when loading a plugin
for reporting a possible crash in cIndexFile::GetClosestIFrame()
for reporting a missing 'const' in cTimers::GetTimerForEvent()
for suggesting to add a chapter about locking to PLUGINS.html
for fixing unnecessary interruption of ongoing recordings if timers avoided the
transfer mode receiver device
for reporting broken video data streams on systems without output device when switching
live channel to a different transponder while recording
for fixing a possible crash in cDevice::StopSectionHandler()
for making using a dummy OSD if no OSD provider is available not be considered an error
any more
for removing syslog calls in child process after fork()
for adding the move constructor to cString for better performance
for fixing handling primary device on headless systems
for adding a 15 second grace period before actually stopping a VPS timer
for making the primary device no longer start unnecessary threads if it doesn't have
a decoder
for improving handling present/following data for VPS timers
for making logging event status changes also show the previous status
for making a device always being kept occupied if a timer is in VPS margin or needs the
transponder
for suggesting to enable unused devices to be put into a power save mode
for a patch that was used to implement power save mode for cDvbDevice
for suggesting to add 'lnbPowerTurnedOn = false' to cDvbTuner::ProvidesFrontend()
for reporting a crash in strreplace() for multiple replacements with strings of
different lengths
for suggesting to add the lines from 'Fixed a timeout in cDvbDevice while tuning after
the frontend has been reopened' to cDvbTuner::ProvidesFrontend()
for improving the error message when closing a frontend
for reporting a problem in cSchedule::Sort(), in case hasRunning was true, but there
was no event with RunningStatus() >= SI::RunningStatusPausing
for reporting problem with duplicate events if they are moved to a lower table ID and
at the same time get a new event ID
for reporting a bug in handling negative values in cSource::Position() on
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
@ -2623,6 +2716,12 @@ J
for making cEpgHandlers::BeginSegmentTransfer() boolean
for suggesting to change tEventID back to u_int32_t
for adding the 'aux' member to cEvent
for reporting a possible deadlock when quickly zapping through encrypted channels
for a patch that was used to implement cStatus::MarksModified()
for suggesting to no longer log unaligned marks in cMarks::Align()
for reporting some warnings from g++ 7.2.0 regarding fixed buffer sizes in
cMenuEditTimeItem::Set() and cCountdown::Update()
for fixing symmetry of Begin/EndSegmentTransfer() calls in cEIT::cEIT()
Peter Pinnau <vdr@unterbrecher.de>
for reporting that 'uint32_t' requires including stdint.h in font.h on some systems
@ -2729,10 +2828,38 @@ Benjamin Hess <benjamin.h@gmx.ch>
for enhancing the SVDRP command CLRE to allow clearing the EPG data of a particular
channel
Winfried Koehler <w_koehl@gmx.de>
Winfried Köhler <nvdec@quantentunnel.de>
for fixing finding new transponders
for fixing wrong value for TableIdBAT in libsi/si.h
for reporting a compiler warning in calculations involving FramesPerSecond()
for making several code modifications to avoid compiler warnings
for improving the description of the transponder parameters in vdr.5
for reporting a necessary fix in the description of cReceiver in PLUGINS.html,
regarding detaching a receiver from its device before deleting it
for fixing some copy&paste errors in PLUGINS.html
for fixing the size of cChannel::dtypes[]
for adding a device hook for detecting whether a device provides EIT data
for improving deleting plugins in case the plugin uses its own memory management
for reporting a bug in handling newline characters in ci.c's CopyString()
for reporting a bug in checking the return value of the Open() call in
cFileName::SetOffset()
for adding initialization of cDvbFrontend::frontendInfo
for improving handling missing VDRPluginDestroyer()
for fixing a compiler warning
for fixing handling $(PKG_CONFIG) in newplugin
for using __cplusplus instead of DISABLE_TEMPLATES_COLLIDING_WITH_STL, and using
std::min(), std::max() and std::swap() is available
for adding some missing "AUTO" values to vdr.5
for fixing default values for DVB-T
for adding missing rounding when dividing frequencies in processing the NIT
for suggesting to add note about not messing with event ids in EPG handlers
for adding a missing initialization of cChannel::nameSourceMode
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
for reporting a compiler warning with gcc 14.1.0
for suggesting to remove defining DEPRECATED_* macros with value 0, because this
is the preprocessor's default
for suggesting a fix for handling negative values in cSource::Position() on
systems where 'int' is 64 bit
Hans-Werner Hilse <hilse@web.de>
for adding the command line option --userdump to enable core dumps in case VDR
@ -2799,13 +2926,6 @@ Michael Nork <mnork0@gmx.net>
binary distributions to have full control over whether or not to use the --vfat
option at runtime
Winfried Köhler <w_koehl@gmx.de>
for fixing wrong value for TableIdBAT in libsi/si.h
for making several code modifications to avoid compiler warnings
for improving the description of the transponder parameters in vdr.5
for reporting a necessary fix in the description of cReceiver in PLUGINS.html,
regarding detaching a receiver from its device before deleting it
Igor M. Liplianin <liplianin@tut.by>
for a patch that was used to convert VDR to the S2API driver API
@ -2831,6 +2951,18 @@ Johann Friedrichs <johann.friedrichs@web.de>
respective recording did not exist
for fixing a double deletion of a cTimer in case HandleRemoteModifications() returned
false
for reporting an invalid lock sequence in the epgsearch plugin, which turned out to
be an abandoned member of class cSchedulesLock
for fixing handling VPS events outside the LingerLimit, which could cause recordings to
stop prematurely
for fixing handling timers during the change from DST to winter time
for fixing a possible crash with plugins that retrieve player information after a
replay has been stopped, but before the replay control has been destroyed
for reporting a problem in processing SVDRP client responses in case the caller doesn't
want the actual response strings
for reporting a bug in handling the tfRecording flag in the SVDRP commands MODT and UPDT
for adding a missing '-D' to the 'plugins' target of the Makefile
for adding code for the 'qks' audio track
Timo Helkio <timolavi@mbnet.fi>
for reporting a hangup when replaying a TS recording with subtitles activated
@ -2858,6 +2990,8 @@ Derek Kelly <user.vdr@gmail.com>
for suggesting to change the naming of "binary skip mode" to "adaptive skip mode"
for suggesting to make the -u option also accept a numerical user id
for reporting a problem with abs() in gcc6+ when called with an unsigned variable
for reporting a deadlock after the fix for a race between SVDRP CHAN and
cDevice::HasProgramme()
Marcel Unbehaun <frostworks@gmx.de>
for adding cRecordingInfo::GetEvent()
@ -2889,6 +3023,14 @@ Manuel Reimer <Manuel.Reimer@gmx.de>
order to avoid discontinuities
for setting the environment variables HOME, USER, LOGNAME and SHELL accordingly
when switching to a less privileged user id
for reporting a bug in moving channels between number groups in SVDRP's MOVC command
for fixing compatibility with current versions of glibc
for suggesting to make the SVDRP command DELC accept a channel id
for reporting a crash in the SVDRP command CLRE in case a non-existing channel
number is given
for reporting that LSTE doesn't work after PUTE in case a channel didn't already
have EPG data
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
Rene van den Braken <rene@vandenbraken.name>
for reporting a bug in writing the PCR pid into the PMT in
@ -2942,6 +3084,7 @@ Lars Hanisch <dvb@flensrocker.de>
for fixing a typo in the description of cTimers::GetTimersRead()
for suggesting to use dynamic buffering in handling CA descriptors to avoid a
possible buffer overflow
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
Alex Lasnier <alex@fepg.org>
for adding tuning support for ATSC devices
@ -3028,6 +3171,9 @@ Frank Neumann <fnu@yavdr.org>
is currently assigned to
for reporting a problem with the default return value of cEpgHandler::BeginSegmentTransfer()
in derived classes that don't implement this function
for reporting uninitialized variable SdWatchdog in vdr.c
for suggesting to use readdir() instead of readdir_r(), if GLIBC version 2.24 or
newer is used
Gerald Dachs <vdr@dachsweb.de>
for reporting a problem with checking for minimum line length of 21 characters in
@ -3093,6 +3239,10 @@ Frank Niederwipper <f.niederwipper@gmail.com>
Chris Mayo <aklhfex@gmail.com>
for reporting a problem with detecting frames on radio channels
for fixing the link to "svdrpsend (1)" in the vdr.1 man page
for updating links in the INSTALL file
for reporting double slashes in file names processed with AddDirectory()
for using the 'example' macro in vdr.5
for fixing the install target in case of multiple jobs
Dominic Evans <oldmanuk@gmail.com>
for making the SVDRP command LSTC accepts channel IDs
@ -3224,6 +3374,16 @@ Mike Hay <mike.hay@linenshorts.com>
Stefan Hofmann <stefan.hofmann@t-online.de>
for suggesting to implement support for remote controls that only have a combined
"Play/Pause" key instead of separate keys for "Play" and "Pause"
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
@ -3263,6 +3423,37 @@ Matthias Senzel <matthias.senzel@t-online.de>
for reporting a bug in switching channels in the Schedule menu after going through
various Now and Schedule menus for different channels
for the "jumpingseconds" patch
for reporting a bug in drawing very long menu titles in the LCARS skin
for reporting and helping to debug a crash when stopping VDR
for reporting a crash when moving a recording between different volumes
for reporting a deadlock when moving a folder containing several recordings between
different volumes
for fixing a lengthy write lock on the Recordings list in case of moving a folder with
more than one recording
for implementing the parameter "OSD/Sorting direction for recordings"
for suggesting to stay in the original folder when moving a recording to a different
folder
for reporting problem with locking the Recordings list in the cutting process
for suggesting to change the log message ""ERROR: copying directory '%s' to '%s' ended
prematurely" from "error" to "info"
for suggesting to allow opening a folder when selecting a folder for a recording or
timer, even if it doesn't contain any subfolders
for reporting a possible locking problem in cMenuPathEdit::ApplyChanges() when the
lock is held while the error message is displayed
for reporting that the info of a newly edited recording was not available immediately
after starting the editing process
for reporting a problem with setting the initial offset of the cursor in a list menu
for reporting a high CPU load during replay with active progress display
for reporting that the lock on the Channels list in cDisplayChannel was still held
when Flush() was called
for reporting that if an error occurs while recording, the respective entry in the list
of recordings was not updated immediately
for fixing restoring the volume at program start
for fixing height calculation in progress display
for fixing an unnecessary double display of the current menu item in page up/down
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
Marek Nazarko <mnazarko@gmail.com>
for translating OSD texts to the Polish language
@ -3356,6 +3547,9 @@ Thomas Reufer <thomas@reufer.ch>
for adding cFont::Width(void) to get the default character width and allow stretched
font drawing in high level OSDs
for fixing regenerating the index of audio recordings
for implementing the SVDRP commands 'LSTD' and 'PRIM'
for adding some comments regarding font height
for reporting a possible problem with plugins calling IsOpen() in ~cDisplayChannel()
Eike Sauer <EikeSauer@t-online.de>
for reporting a problem with channels that need more than 5 TS packets for detecting
@ -3400,6 +3594,7 @@ Dietmar Spingler <d_spingler@gmx.de>
for suggesting to optionally list the channels with channel ids in the SVDRP command LSTC
for suggesting to include the channel ID in log messages about switching channels
for reporting a problem with the SVDRP command CHAN while the channel display is open
for suggesting to automatically close the CAM menu when the current channel is switched
Stefan Schallenberg <infos@nafets.de>
for adding the functions IndexOf(), InsertUnique(), AppendUnique() and RemoveElement()
@ -3408,6 +3603,10 @@ Stefan Schallenberg <infos@nafets.de>
Claus Muus <email@clausmuus.de>
for adding the new parameters "Setup/Miscellaneous/Volume steps" and
".../Volume linearize"
for reporting multiple recording entries in case a recording is started during the
initial reading of the video directory
for reporting that getting the lock for removing deleted recordings may fail if the
disk is full
Dieter Ferdinand <dieter.ferdinand@gmx.de>
for reporting a problem with jumping to an absolute position via the Red key in
@ -3424,6 +3623,14 @@ Jasmin Jessich <jasmin@anw.at>
debugging MTD support
for fixing selecting delivery system names in case of undefined indexes
for fixing detecting the inclusion of STL header files in tools.h
for help and suggestions when implementing debug output for checking the correct
sequence of locking global lists
for suggesting to use $(Q) to control Makefile verbosity
for adding handling DEBUG to the Make.config.template file, in order to control
code optimization
for suggesting to change the macros used to control deprecated code or functions
to numeric values (0 and 1), so that they can be controlled at compile time, without
having to edit the actual source code
Martin Schirrmacher <schirrmie@gmail.com>
for suggesting to provide a way for skin plugins to get informed about the currently
@ -3438,6 +3645,13 @@ Stefan Herdler <herdler@gmx.de>
too early
for reporting a bug in using the default sort mode in a video directory without a
".sort" file
for reporting faulty memory handling in cString::Append()
for adding failsafe defaults for 'make LCLBLD=1' to the Makefile
for reporting the index file of a recording not being regenerated in case it is
present, but empty
for reporting a missing check for self-assignment in the move assignment operator
for modifying handling channel names with source to make it thread safe
for fixing setting T2 system ID from NIT
Tobias Faust <tobias.faust@gmx.de>
for the original "jumpingseconds" patch
@ -3476,6 +3690,7 @@ Stefan P
Robert Hannebauer <vdr@hannebauer.org>
for fixing an overflow of PIDs in a receiver
for fixing opening the UDP port in peerdemo
Aitugan Sarbassov <isarbassov@gmail.com>
for adding 'S58.5E Kazsat 3' to sources.conf
@ -3488,3 +3703,118 @@ Sergey Chernyavskiy <glenvt18@gmail.com>
Frank Richter <kulpstur@t-online.de>
for adding 'S3W ABS-3A' to sources.conf
Daniel Scheller <d.scheller@gmx.net>
for reporting a problem with detecting whether a CAM replies to queries, which didn't
work on some systems since the implementation of RI_HOST_CONTROL
Onur Sentürk <onur@sentek.org>
for making the MTD mapper avoid immediately reusing unique PIDs when switching channels
for fixing handling shared CA pids
for fixing handling the S2SatelliteDeliverySystemDescriptor for transponders broadcasting
in "backwards compatibility mode" according to ETSI EN 300 468
for pointing out some potentially mistakable code in cSectionHandler::SetStatus()
for adding periodic calls to malloc_trim(0) to reduce memory consumption
Helmut Binder <cco@aon.at>
for improving calculating signal strength and quality
for fixing switching through encrypted channels with the Up/Down keys
for deactivating MTD support if a non MCD capable CAM is inserted after removing
a previously used CAM that is MCD capable
for fixing accessing the actual frontend on multi frontend devices
for fixing processing the last entry in the scan list of the EIT scanner
for fixing processing transponder data in the NIT
for fixing triggering the SDT filter when parsing the NIT
for reporting a bug in processing SI::T2DeliverySystemDescriptor when typecasting it
over an SI::ExtensionDescriptor
for fixing mapping SIDs in MTD
for fixing updating the checksum in the CA table after mapping EMM PIDs for MTD
for fixing a compiler warning in ExchangeChars()
for suggesting to add __attribute__((packed)) to tIndexPes and tIndexTs
for helping with the implementation of retuning if the received transponder's SDT
doesn't contain the expected values for NID and TID
for adding the language code for Bulgarian
for a patch that was used as a base for fixing handling multi part ExtendedEventDescriptors
where only the first part contains information about the character table
for suggesting to check and report whether the given value is valid when setting the
override character table
for adding codes for more languages and special audio tracks
for adding cMtdCamSlot::TsPostProcess()
for adding cMtdHandler::StopDecrypting()
for adding support for detecting new channels broadcast in HEVC
for adding support for detecting 'advanced codec digital radio sound service'
for adding handling shared PMT pids and multiple PMT sections
for changing the country code in the generated ParentalRatingDescriptor from 'DEU' to
'902' to make it valid for all countries
for adjusting device selection in GetDeviceForTransponder() to that in GetDevice()
for adding CRC check of the CAT in cCaPidReceiver::Receive()
for reporting that the 'else if' branch in cDevice::GetDeviceForTransponder() hasn't
been active since version 1.7.29
for fixing handling inactive shared CA pids
for implementing handling multi packet CATs with MTD
for adding checking the symbol rate to cDvbTuner::IsTunedTo(), which apparently got
lost in version 1.7.13
for adding a check for an empty command in cDvbTuner::GetSignalStats() to avoid a
possible error message
for initializing the status variable in cDvbTuner::GetFrontendStatus() and
cDvbTuner::GetSignalStats() to avoid problems with drivers that don't do this
for fixing "read incomplete section" errors
for fixing generating the HashId in cEIT::cEIT()
for fixing a bug in handling shared PMTs, where after the first pass not all SIDs of a
PMT pid were checked any more
for reporting a problem with PMT handling in case locking the Channels list times out
for avoiding a lengthy lock on the Channels list when starting a recording
for preventing switching devices for pattern timers
for pointing out that cChannel::Transponder(void) is called very often
for fixing flushing old data from the section handler
for removing unused declaration of cDvbTuner::SetFrontendType()
for fixing handling incomplete multi-packet CAT
for fixing a memory leak in handling the NIT
for reporting a possible memory leak in creating fonts
for fixing a possible deadlock in cDevice::DetachAllReceivers()
Ulrich Eckhardt <uli@uli-eckhardt.de>
for reporting a problem with shutdown after user inactivity in case a plugin is
keeping the OSD open
Stian B. Barmen <stian@barmen.nu>
for reporting missing EPG data on channels from Canal Digital Norway
Jürgen Schneider <jsffm@web.de>
for reporting a possible discrepancy of the primary device number in the LSTD and
PRIM commands
for adding support for EAC3 audio from other sources
for reporting a crash if a pattern timer spawns a timer that uses EPISODE and the
event has no short text
for reporting a bug in VPS handling when spawning a pattern timer, in case Setup.UseVps
is false
for reporting an endless spawning of pattern timers in case the spawned timer doesn't
use VPS and fully overlaps a second event that is longer than the original one
for reporting a missing EPISODE macro expansion in case the event doesn't yet have a
short text when generating the pattern timer file name
for reporting a problem with spawned timers jumping to the next event in case
Setup.EPGLinger is very small
Stefan Verse <Verse@amotronics.de>
for fixing an occasional black screen when switching channels
Jens Schleusener <Jens.Schleusener@fossies.org>
for reporting several typos
Bernd Kuhls <bernd.kuhls@t-online.de>
for fixing possible compilation errors with libjpeg
Ulf Grüne <ulf.gruene@t-online.de>
for reporting the need for more than 15 modulation systems in cDevice::GetDevice()
Timo Weingärtner <timo@tiwe.de>
for reporting an integer overflow in calculating the disk use percentage if there's
more than 20TB of recordings
Jose Angel <joseangelpp@gmail.com>
for reporting a bug in default values for DVB-T
Andreas Baierl <post@andreasbaierl.de>
for implementing scaling images
for reporting a problem in the progress display when switching from "pause" to
"slow back"

1040
HISTORY

File diff suppressed because it is too large Load Diff

59
INSTALL
View File

@ -1,7 +1,7 @@
Installation of the Video Disk Recorder
---------------------------------------
Version 2.2
Version 2.7
-----------
Compiling and running the program:
@ -47,9 +47,9 @@ By default the 'vdr' program can be controlled via the PC keyboard.
If you want to disable control via the keyboard, you can add NO_KBD=1
to the 'make' call, or use the '--no-kbd' option at runtime.
If you have an infrared remote control unit you can define the REMOTE macro
to one of the following values in the 'make' call to make the respective control
the default:
If you have a LIRC compatible infrared remote control receiver you can define
the REMOTE macro to one of the following values in the 'make' call to make
the respective control the default:
REMOTE=LIRC control via the "Linux Infrared Remote Control"
(see http://www.lirc.org)
@ -73,16 +73,15 @@ port ("Simple Video Disk Recorder Protocol"). By default, it listens
on port 6419 (use the --port=PORT option to change this). For details
about the SVDRP syntax see the source file 'svdrp.c'.
WARNING: DUE TO THE OPEN SVDRP PORT THIS PROGRAM MAY CONSTITUTE A
======= POTENTIAL SECURITY HAZARD! IF YOU ARE NOT RUNNING VDR IN
A CONTROLLED ENVIRONMENT, YOU MAY WANT TO DISABLE SVDRP
BY USING '--port=0'!
The file 'svdrphosts.conf' can be used to define which hosts are allowed
to access the SVDRP port. By default only localhost (127.0.0.1) is granted
access. If you want to give other hosts access to your SVDRP port you need to
add their IP numbers to 'svdrphosts.conf'.
You can disable SVDRP access entirely by either running VDR with '--port=0',
or by removing all entries (including 127.0.0.1 for the localhost) from
'svdrphosts.conf'.
If the program shall run as a daemon, use the --daemon option. This
will completely detach it from the terminal and will continue as a
background process.
@ -104,13 +103,13 @@ hardware in your system, for instance:
Plugin: Device:
dvbsddevice Full-Featured SD DVB cards (Fujitsu-Siemens Design)
(comes with the VDR source)
ftp://ftp.tvdr.de/vdr/Plugins
dvbhddevice Full-featured HD DVB cards (Technotrend TT S2-6400)
https://bitbucket.org/powARman/dvbhddevice
rpihddevice Raspberry Pi
http://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
https://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
See http://linuxtv.org/vdrwiki/index.php/Output_devices for more.
See https://linuxtv.org/vdrwiki/index.php/Output_devices for more.
Standard compliance
-------------------
@ -265,11 +264,10 @@ Executing commands before and after a recording:
------------------------------------------------
You can use the '-r' option to define a program or script that gets called
before and after a recording is performed, and after an editing process
has finished or a recording has been deleted.
at various stages of handling recordings.
The program will be called with two or three (in case of "editing" and "edited")
string parameters. The first parameter is one of
The program will be called with two or three string parameters.
The first parameter is one of
before if this is *before* a recording starts
started if this is after a recording has *started*
@ -277,13 +275,16 @@ string parameters. The first parameter is one of
editing if this is before *editing* a recording
edited if this is after a recording has been *edited*
deleted if this is after a recording has been *deleted*
copying if this is before *copying* a recording
copied if this is after a recording has been *copied*
renamed if this is after a recording has been *renamed*
moved if this is after a recording has been *moved*
(note that a move across file system borders triggers a sequence
of "copying", "copied" and "deleted")
and the second parameter contains the full name of the recording's
and the second and third parameter (if present) contain the full name of the recording's
directory (which may not yet exists at that moment in the "before" case).
In the "editing" and "edited" case it will be the name of the edited version
(second parameter) and the name of the source version (third parameter).
In the "deleted" case the extension of the directory name is ".del"
instead of ".rec".
See the example below for the exact meaning of these parameters.
Within this program you can do anything you would like to do before and/or
after a recording or after an editing process. However, the program must return
@ -316,6 +317,22 @@ case "$1" in
deleted)
echo "Deleted recording $2"
;;
copying)
echo "Destination recording $2"
echo "Source recording $3"
;;
copied)
echo "Destination recording $2"
echo "Source recording $3"
;;
renamed)
echo "New name of recording $2"
echo "Old name of recording $3"
;;
moved)
echo "New path of recording $2"
echo "Old path of recording $3"
;;
*)
echo "ERROR: unknown state: $1"
;;

185
MANUAL
View File

@ -1,7 +1,7 @@
Video Disk Recorder User's Manual
---------------------------------
Version 2.2
Version 2.7
-----------
* Remote Control Keys
@ -50,8 +50,8 @@ Version 2.2
Next Next/previous channel group (in live tv mode)
Prev or next/previous editing mark (in replay mode)
Channel+ channel up
Channel- channel down
Channel+ channel up (live view), next error (replay)
Channel- channel down (live view), previous error (replay)
PrevChannel previous channel
Power shutdown
@ -90,7 +90,7 @@ Version 2.2
be treated as part of that number, not as a sort mode toggle. If no numeric
key has been pressed for more than one second, the number is reset and '0'
functions as sort mode toggle again.
(3) In the "Timers" menu, when on the "Day" item, the '0' key toggles between
(3) In the "Edit timer" menu, when on the "Day" item, the '0' key toggles between
a single shot and a repeating timer. If "Day" indicates a repeating timer,
the keys '1'...'7' can be used to toggle the individual days ('1' is Monday).
@ -480,6 +480,8 @@ Version 2.2
"forever", and a value of 0 means that this recording can be
deleted any time if a recording with a higher priority needs disk
space.
Pattern: The pattern to use for recordings matching events (only available
for pattern timers). See section "Pattern timers" below.
File: The name under which a recording created through this timer will
be stored on disk (the actual name will also contain the date and
time, so it is possible to have a "repeating timer" store all its
@ -511,6 +513,140 @@ Version 2.2
The "Red" key in the "Edit timer" menu opens a list of folders, which can be
used to define the file name in which the recording will be stored.
The "Yellow" key in the "Edit timer" menu toggles the timer between "Pattern"
and "Regular".
When editing the "File" field, the "Blue" key in can be used to insert useful
macros.
* Pattern timers
There are cases where it would make sense to have a more flexible kind of
recording timer. For instance, some channels that provide VPS don't always
use the exact same VPS time for a series, which is extremely annoying.
Or you might want to record all films that have a certain pattern in their
title, no matter when they are broadcast. In such cases, "pattern timers"
can help.
In the "Edit timer" menu press the Yellow button to turn a regular timer into
a pattern timer. Pressing this button again switches back to regular.
The following rules apply to pattern timers:
- Pattern timers can only work for channels that provide EPG data.
- When using pattern timers, there should always be at least one free device that
can be used to regularly receive the EPG of the pattern timer's channel.
- A pattern timer records every matching event on the given channel that overlaps
with the given start/stop time. Overlapping events are recorded in full,
even if they extend outside the given start/stop interval.
- In order to actually record an event, a pattern timer "spawns" a separate timer
that does the recording. If there are matching events that would start while
the first spawned timer is still recording (due to the start/stop margins), timers
for those events are also spawned.
- Spawned timers are marked with the flag tfSpawned.
- Spawned timers take the Priority, Lifetime and VPS settings from the pattern timer.
- The special pattern "*" matches every event. So a timer with
a start/stop time of 00:00/23:59 will record every event of that day
into separate recordings. Note that when using this pattern there should
be no other timers for the same channel, because these might interfere.
- Once a timer has been spawned, it is treated like any other regular
timer. Any changes made to the corresponding pattern timer thereafter will have
no effect on spawned timers. Note that after deleting a spawned timer,
the corresponding pattern timer may respawn it.
- Recording is done according to the event's begin/end times, either
by adding the start/stop margins (for non-VPS timers) or by using the
event's running status (for VPS timers).
- If the start/stop margins of a spawned timer are reduced because the event
before and/or after that timer's event is shorter than the respective margin,
the actual recording still uses the full margins.
- If the times of the event change, a non-VPS pattern timer automatically adjusts
itself to the new times. This also happens if the start/stop margins are changed
in the setup.
- The recording of a pattern timer is stored under the given file name, just like
regular timers do. In addition to the "TITLE" and "EPISODE" macros the file
name of a pattern timer can also use "{<}" and "{>}" to reference the part of the
event's title before and after the pattern, respectively. For instance,
if the event's title is "Abc def ghi" and the pattern is "def ", "{<}"
would contain "Abc " and "{>}" would contain "ghi" (note the matching of the
blanks). For completeness, "{=}" can be used to reference the matching
pattern itself.
- In the "Timers" menu pressing the Red button on a pattern timer only toggles the
timer between "on" and "off", even if this is a repeating timer.
- In the "Timers" menu pattern timers are sorted alphabetically to the end of the
list of timers.
- A regular timer that is currently recording can't be changed into a pattern timer.
- In the "Edit timer" menu the file name and pattern are displayed as
separate items. The Yellow button can be used to toggle between a regular
timer and a pattern timer. When going from regular to pattern, the Pattern item will
be initialized with the base part of the file name.
- The characters '^' and '$' can be used at the very beginning and end of
the pattern to anchor the pattern to the begin or end of the title.
Using both of these will match only titles that consist of exactly the given pattern,
with nothing before and nothing after it.
- The Pattern field in the "Edit timer" menu allows blanks at the end of the string,
which may help to separate the text after the matching pattern.
- If the first character of the pattern is '@', an event that matches the
rest of the pattern is only recorded if the resulting recording's file
name (without any folders) is not contained in the donerecs.data file.
This avoids duplicate recordings of the same programme. Timers spawned from
such a pattern timer are marked with the flag tfAvoid.
- When editing the "File" field of a timer, the Blue button can be pressed to
insert one of the macros "TITLE", "EPISODE", "{<}", "{=}" or "{>}",
respectively. Pressing the Blue button repeatedly loops through the available
macros. The "{...}" macros are only available for pattern timers.
- In the "Schedule" and "What's on...?" menus the events that will be recorded
by a pattern timer are marked in the same way as regular timers.
- The TIMERS column in the LCARS skin doesn't show the basic definitions of
pattern timers, it only shows timers actually spawned from pattern timers.
If the pattern is prepended with '@', the name of the resulting recording (everything
after the rightmost '~', or the entire file name, if there is no '~') will be stored
in the file donerecs.data, so that multiple recordings of the same programme can be
avoided. When using this feature, special care must be taken regarding the recording's
file name. For instance, with a combination of
pattern file name
@Columbo Movies~TITLE
if the event's title is just "Columbo", this pattern timer would only record once,
and ignore any future events with that title, even if the episode would be different.
So you may want to use the episode name, as in
pattern file name
@Columbo Movies~TITLE - EPISODE
to make the file name unique. If you have several pattern timers for the same show on
different channels, chances are that the broadcasters handle title and episode
differently, as for example in
TITLE EPISODE pattern file name
Columbo Blueprint for Murder @^Columbo$ TITLE - EPISODE
Columbo - Blueprint for Murder @^Columbo TITLE
Columbo: Blueprint for Murder @^Columbo:_ Columbo - {>}
(note the '_' in the pattern of the third example; this is just used to visualize
the blank at the end of the pattern)
In order to have the same episode result in the same recording file name on all
channels, the file name needs to be generated differently for each channel. First
you need to decide on a proper combination of title and episode name, preferably
one that is already used by one of your channels (let's say the second one).
In the first case, title and episode name are correctly put in their respective
places, and "TITLE - EPISODE" as file name will do. The second case is our common
version, where everything is in the title, so TITLE is just fine. The third case
poses a problem, because everything is in the title, but with a different separator.
Here the special macro "{>}" can be used in the file name, which contains everything
following the matching pattern. There are three macros that can be used here:
{<} everything before the matching pattern
{>} everything after the matching pattern
{=} the matching pattern itself (just for completeness)
As of VDR version 2.5.2, the characters ' ' (blank), ':' and '-' are ignored
when checking whether a particular recording has already been made by a pattern
timer, making "TITLE - EPISODE" and "TITLE: EPISODE" the same.
VDR version 2.6.6 added '/' to this list.
* Managing folders
The "Select folder" menu, which can be accessed by pressing the "Red" key in
@ -665,6 +801,13 @@ Version 2.2
If a particular sort mode has been selected for a folder by
pressing '0', the default no longer applies to that folder.
Sorting direction for recordings = ascending
When recordings are sorted "by time", they appear in ascending
order (i.e. "oldest" to "newest"). If this parameter is set to
"descending", they will be presented "newest" to "oldest.
Note that in the latter case, if "Always sort folders first"
is "yes", folders will appear in reverse alphabetical order.
Number keys for characters = yes
Controls whether the number keys can be used to enter
characters in a text input field. You may want to set this
@ -686,6 +829,16 @@ Version 2.2
A value of '0' completely turns off scanning on both single
and multiple card systems.
EPG scan max. channel number = 0
The EPG scan will only tune to transponders of channels with
numbers below this limit. By default all transponders will
be scanned.
EPG pause after scan = no
After a complete scan of all transponders (optionally limited
by "EPG scan max. channel number") the EPG scan pauses for
"EPG scan timeout" hours if this option is set to "yes".
EPG bugfix level = 3 Some tv stations transmit weirdly formatted EPG data.
VDR attempts to fix these bugs up to the given level:
0 = no EPG fixing
@ -887,6 +1040,9 @@ Version 2.2
after the official end time it shall stop recording.
These margins are added automatically to timers that
are created from the EPG data.
Note that the actual margins used may be smaller than the
given values, if the event before and/or after the event
to be recorded is shorter than the respective margin.
Default priority = 50 The default Priority and Lifetime values used when
Default lifetime = 99 creating a new timer event. A Lifetime value of 99
@ -1085,8 +1241,16 @@ Version 2.2
connection after which the connection is automatically
closed. Default is 300, a value of 0 means no timeout.
SVDRP peering = no Activates automatic connections between VDRs in the same
network.
SVDRP peering = off Activates automatic connections between VDRs in the same
network. If set to "any hosts" this VDR will establish
connections with any available hosts. If set to "only
default host" this VDR will only connect to the VDR with
the name defined in "SVDRP default host". If no default
host has been defined, the behavior is the same as with
"any hosts". To switch from "off" to "only default host",
you may need to select "any hosts" first and confirm the
dialog by pressing "Ok" in order to be able to select a
default host.
SVDRP host name The name of this VDR, which is used when connecting VDRs
via SVDRP. By default, the machine's host name is used.
@ -1116,7 +1280,7 @@ Version 2.2
The time (in milliseconds) between two subsequent key
presses generated by the remote control's repeat function.
If the remote control in use has a repeat delta that is
longer than that given in this parameter, that longer delay
longer than that given in this parameter, that longer delta
will prevail.
Initial channel = The channel ID of the channel that shall be tuned to when
VDR starts. Default is empty, which means that it will
@ -1143,10 +1307,11 @@ Version 2.2
wrap around the beginning or end of the channel list if
this parameter is set to 'yes'.
Show channel names with source = no
Show channel names with source = off
If this option is turned on, channel names will be displayed
with the source appended to them, as in "ZDF (S)", where
'S' stands for "Satellite".
with the source appended to them, as in "ZDF (S)" (if the
option is set to "type), or "ZDF (S19.2E)" (if it is set to
"full"), where 'S' stands for "Satellite".
Emergency exit = yes If, for some reason, a recording fails because the video
data stream is broken, or the CAM doesn't decrypt etc.,

View File

@ -6,7 +6,7 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: Make.config.template 3.4 2015/02/09 09:58:45 kls Exp $
# $Id: Make.config.template 5.2 2024/10/11 14:21:04 kls Exp $
### The C compiler and options:
@ -16,6 +16,12 @@ CFLAGS = -g -O3 -Wall
CXX = g++
CXXFLAGS = -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
# Use 'make DEBUG=1 ...' to build a debug version of VDR and plugins:
ifdef DEBUG
CFLAGS += -O0
CXXFLAGS += -O0
endif
# Use 'make M32=1 ...' to build a 32-bit version of VDR on a 64-bit machine:
ifdef M32
CFLAGS += -m32
@ -27,14 +33,15 @@ endif
# Default directories (adjust as necessary or desired):
#PREFIX = /usr/local
#BINDIR = $(PREFIX)/bin
#INCDIR = $(PREFIX)/include
#LIBDIR = $(PREFIX)/lib/vdr
#LOCDIR = $(PREFIX)/share/locale
#MANDIR = $(PREFIX)/share/man
#PCDIR = $(PREFIX)/lib/pkgconfig
#RESDIR = $(PREFIX)/share/vdr
#DVBDIR = /usr/src/v4l-dvb/linux/include/uapi
#VDRROOT = $(PREFIX)
#BINDIR = $(VDRROOT)/bin
#INCDIR = $(VDRROOT)/include
#LIBDIR = $(VDRROOT)/lib
#LOCDIR = $(VDRROOT)/locale
#MANDIR = $(VDRROOT)/man
#PCDIR = $(VDRROOT)/pkgconfig
#RESDIR = $(VDRROOT)/share
#DVBDIR = /usr/include
#VIDEODIR = /srv/vdr/video
#CONFDIR = /var/lib/vdr
@ -68,6 +75,8 @@ endif
### The remote control:
LIRC_DEVICE = /var/run/lirc/lircd
### Use this for kernel based driver:
#LIRC_DEVICE = /dev/lirc0
### Define if you always want to use LIRC, independent of the --lirc option:
#REMOTE=LIRC

View File

@ -4,23 +4,26 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: Makefile 4.4 2017/05/22 15:33:30 kls Exp $
# $Id: Makefile 5.4 2024/10/21 19:01:16 kls Exp $
.DELETE_ON_ERROR:
# Compiler flags:
PKG_CONFIG ?= pkg-config
CC ?= gcc
CFLAGS ?= -g -O3 -Wall
CXX ?= g++
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
CXXFLAGS += $(CPPFLAGS)
CDEFINES = -D_GNU_SOURCE
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell pkg-config --libs freetype2 fontconfig)
INCLUDES ?= $(shell pkg-config --cflags freetype2 fontconfig)
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell $(PKG_CONFIG) --libs freetype2 fontconfig)
INCLUDES ?= $(shell $(PKG_CONFIG) --cflags freetype2 fontconfig)
# Directories:
@ -28,6 +31,14 @@ CWD ?= $(shell pwd)
LSIDIR ?= $(CWD)/libsi
PLUGINDIR ?= $(CWD)/PLUGINS
# Failsafe defaults for "make LCLBLD=1":
ifdef LCLBLD
DESTDIR ?= $(CWD)
LOCDIR ?= $(CWD)/locale
HDRDIR ?= $(CWD)/include
LIBDIR ?= $(PLUGINDIR)/lib
endif
DESTDIR ?=
VIDEODIR ?= /srv/vdr/video
CONFDIR ?= /var/lib/vdr
@ -35,13 +46,14 @@ ARGSDIR ?= /etc/vdr/conf.d
CACHEDIR ?= /var/cache/vdr
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
INCDIR ?= $(PREFIX)/include
LIBDIR ?= $(PREFIX)/lib/vdr
LOCDIR ?= $(PREFIX)/share/locale
MANDIR ?= $(PREFIX)/share/man
PCDIR ?= $(PREFIX)/lib/pkgconfig
RESDIR ?= $(PREFIX)/share/vdr
VDRROOT ?= $(PREFIX)
BINDIR ?= $(VDRROOT)/bin
INCDIR ?= $(VDRROOT)/include
LIBDIR ?= $(VDRROOT)/lib/vdr
LOCDIR ?= $(VDRROOT)/share/locale
MANDIR ?= $(VDRROOT)/share/man
PCDIR ?= $(VDRROOT)/lib/pkgconfig
RESDIR ?= $(VDRROOT)/share/vdr
# Source documentation
@ -52,6 +64,15 @@ DOXYFILE = Doxyfile
-include Make.config
# Output control
ifdef VERBOSE
Q =
else
Q = @
endif
export Q
# Mandatory compiler flags:
CFLAGS += -fPIC
@ -90,14 +111,14 @@ ifdef VDR_USER
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
endif
ifdef BIDI
INCLUDES += $(shell pkg-config --cflags fribidi)
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi)
DEFINES += -DBIDI
LIBS += $(shell pkg-config --libs fribidi)
LIBS += $(shell $(PKG_CONFIG) --libs fribidi)
endif
ifdef SDNOTIFY
INCLUDES += $(shell pkg-config --silence-errors --cflags libsystemd-daemon || pkg-config --cflags libsystemd)
INCLUDES += $(shell $(PKG_CONFIG) --silence-errors --cflags libsystemd-daemon || $(PKG_CONFIG) --cflags libsystemd)
DEFINES += -DSDNOTIFY
LIBS += $(shell pkg-config --silence-errors --libs libsystemd-daemon || pkg-config --libs libsystemd)
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd)
endif
LIRC_DEVICE ?= /var/run/lirc/lircd
@ -122,7 +143,7 @@ all: vdr i18n plugins
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
# Dependencies:
@ -137,7 +158,7 @@ $(DEPFILE): Makefile
vdr: $(OBJS) $(SILIB)
@echo LD $@
@$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
# The libsi library:
@ -149,7 +170,9 @@ make-libsi: # empty rule makes sure the sub-make for libsi is always called
.PHONY: vdr.pc
vdr.pc:
@echo "bindir=$(BINDIR)" > $@
@echo "vdrrootdir=$(VDRROOT)" > $@
@echo "bindir=$(BINDIR)" >> $@
@echo "incdir=$(INCDIR)" >> $@
@echo "mandir=$(MANDIR)" >> $@
@echo "videodir=$(VIDEODIR)" >> $@
@echo "configdir=$(CONFDIR)" >> $@
@ -165,7 +188,7 @@ vdr.pc:
@echo "" >> $@
@echo "Name: VDR" >> $@
@echo "Description: Video Disk Recorder" >> $@
@echo "URL: http://www.tvdr.de/" >> $@
@echo "URL: https://www.tvdr.de/" >> $@
@echo "Version: $(VDRVERSION)" >> $@
@echo "Cflags: \$${cflags}" >> $@
@ -180,20 +203,20 @@ I18Npot = $(PODIR)/vdr.pot
%.mo: %.po
@echo MO $@
@msgfmt -c -o $@ $<
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
@echo GT $@
@xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
%.po: $(I18Npot)
@echo PO $@
@msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
@echo IN $@
@install -D -m644 $< $@
$(Q)install -D -m644 $< $@
.PHONY: i18n
i18n: $(I18Nmsgs)
@ -235,7 +258,7 @@ plugins: include-dir vdr.pc
INCLUDES="-I$(CWD)/include"\
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" || failed="$$failed $$i";\
if [ -n "$(LCLBLD)" ] ; then\
(cd $(PLUGINDIR)/src/$$i; for l in `find -name "libvdr-*.so" -o -name "lib$$i-*.so"`; do install $$l $(LIBDIR)/`basename $$l`.$(APIVERSION); done);\
(cd $(PLUGINDIR)/src/$$i; for l in `find -name "libvdr-*.so" -o -name "lib$$i-*.so"`; do install -D $$l $(LIBDIR)/`basename $$l`.$(APIVERSION); done);\
if [ -d $(PLUGINDIR)/src/$$i/po ]; then\
for l in `ls $(PLUGINDIR)/src/$$i/po/*.mo`; do\
install -D -m644 $$l $(LOCDIR)/`basename $$l | cut -d. -f1`/LC_MESSAGES/vdr-$$i.mo;\
@ -262,7 +285,7 @@ clean-plugins: vdr.pc
# Install the files (note that 'install-pc' must be first!):
install: install-pc install-bin install-dirs install-conf install-doc install-plugins install-i18n install-includes
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes
# VDR binary:
@ -279,8 +302,13 @@ install-dirs:
@mkdir -p $(DESTDIR)$(CACHEDIR)
@mkdir -p $(DESTDIR)$(RESDIR)
install-conf:
@cp -pn *.conf $(DESTDIR)$(CONFDIR)
install-conf: install-dirs
# 'cp -n' may be broken, so let's do it the hard way
@for i in *.conf; do\
if ! [ -e $(DESTDIR)$(CONFDIR)/$$i ] ; then\
cp -p $$i $(DESTDIR)$(CONFDIR);\
fi\
done
# Documentation:
@ -295,6 +323,7 @@ install-doc:
install-plugins: plugins
@-for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
echo; echo "*** Plugin $$i:";\
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(CWD) DESTDIR=$(DESTDIR) install;\
done
@if [ -d $(PLUGINDIR)/lib ] ; then\
@ -322,6 +351,7 @@ install-pc: vdr.pc
srcdoc:
@cat $(DOXYFILE) > $(DOXYFILE).tmp
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
@chmod +x $(DOXYFILE).filter
$(DOXYGEN) $(DOXYFILE).tmp
@rm $(DOXYFILE).tmp
@ -330,7 +360,7 @@ srcdoc:
clean:
@$(MAKE) --no-print-directory -C $(LSIDIR) clean
@-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~
@-rm -rf $(LOCALEDIR) $(PODIR)/*.mo $(PODIR)/*.pot
@-rm -rf $(LOCALEDIR) $(PODIR)/*~ $(PODIR)/*.mo $(PODIR)/*.pot
@-rm -rf include
@-rm -rf srcdoc
CLEAN: clean

View File

@ -31,14 +31,11 @@ modified {
<div class="center">
<h1>The VDR Plugin System</h1>
<b>Version 2.2</b>
<b>Version 2.7</b>
<p>
Copyright &copy; 2015 Klaus Schmidinger<br>
Copyright &copy; 2021 Klaus Schmidinger<br>
<a href="mailto:vdr@tvdr.de">vdr@tvdr.de</a><br>
<a href="http://www.tvdr.de">www.tvdr.de</a>
</div>
<div class="center">
<modified>Important modifications introduced since version 2.2 are marked like this.</modified>
<a href="https://www.tvdr.de">www.tvdr.de</a>
</div>
<p>
VDR provides an easy to use plugin interface that allows additional functionality
@ -77,7 +74,6 @@ 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>
@ -86,6 +82,7 @@ structures and allows it to hook itself into specific areas to perform special a
<li><a href="#Internationalization">Internationalization</a>
<li><a href="#Custom services">Custom services</a>
<li><a href="#SVDRP commands">SVDRP commands</a>
<li><a href="#Locking">Locking</a>
<li><a href="#Loading plugins into VDR">Loading plugins into VDR</a>
<li><a href="#Building the distribution package">Building the distribution package</a>
</ul>
@ -168,7 +165,7 @@ is used:
VDR/PLUGINS/src
VDR/PLUGINS/src/hello
VDR/PLUGINS/lib
VDR/PLUGINS/lib/libvdr-hello.so.1.1.0
VDR/PLUGINS/lib/libvdr-hello.so.1
</pre></td></tr></table><p>
The <tt>src</tt> directory contains one subdirectory for each plugin, which carries
@ -187,7 +184,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.1.0</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</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>
@ -198,6 +195,11 @@ 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.
@ -393,13 +395,7 @@ 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. 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.
version <tt>1.0.0</tt> once it is completely operative and well tested.
<hr><h2><a name="Description">Description</a></h2>
@ -584,7 +580,6 @@ esyslog("pluginname: error #%d has occurred", ErrorNumber);
Note that the log messages will be given as provided, the plugin's name will not
automatically be added, so make sure your log messages are obvious enough.
<p>
<modified>
Only use the above logging functions for occasional log messages. Do not use
them unconditionally for frequent messages that produce long sequences of lines
in the log file every few seconds. That might make it hard to work on other plugins
@ -605,8 +600,10 @@ Under no circumstances must a plugin print anything to stdout or stderr during
normal operation! The only exceptions being special debug information as described
above, fatal error messages that will cause VDR to abort, or if it is the sole
purpose of the plugin to display something on stdout, like for instance the
<i>skincurses</i> plugin, which displays the OSD at the console.
</modified>
<i>skincurses</i> plugin, which displays the OSD at the console.<br>
<br>
Please make any log messages in <b>ENGLISH</b>! Logs are usually sent to the developers
of a program, and they may not be able to read them if they are in an exotic language.
<hr><h2><a name="Main menu entry">Main menu entry</a></h2>
@ -694,27 +691,6 @@ 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>
@ -1186,11 +1162,59 @@ The returned string may consist of several lines, separated by the newline chara
when presenting them to the caller, and the continuation character ('<tt>-</tt>')
will be set for all but the last one.
<p>
<modified>
<b>The SVDRP functions are called from the separate "SVDRP server handler" thread.
Therefore the plugin needs to take care of proper locking if it accesses any
Therefore the plugin needs to take care of proper <a href="#Locking">locking</a> if it accesses any
global data.</b>
</modified>
<hr><h2><a name="Locking">Locking</a></h2>
<div class="blurb">U can't touch this</div><p>
When accessing global data structures, proper locking is absolutely necessary.
<p>
There are several macros that allow for easy locking and unlocking. They all
follow the naming convention <tt>LOCK_*_READ|WRITE</tt>, where <tt>'*'</tt> is the name
of the global data structure, which can be one of <tt>TIMERS</tt>, <tt>CHANNELS</tt>,
<tt>RECORDINGS</tt> or <tt>SCHEDULES</tt>. To implicitly avoid deadlocks in case you
need to lock more than one structure, always make sure you use these macros in
this sequence!
<p>
Using one of these macros sets a lock on the structure, creates a local pointer to the
respective structure and makes sure the lock is released at the end of the current
block:
<p><table><tr><td class="code"><pre>
if (some condition) {
LOCK_TIMERS_READ; // creates local const cTimers *Timers
for (const cTimer *Timer = Timers-&gt;First(); Timer; Timer = Timers-&gt;Next(Timer)) {
// do something with Timer
}
}
</pre></td></tr></table><p>
Note the naming convention: TIMERS -&gt; Timers etc.
<p>
The <tt>LOCK_*_READ</tt> macros create pointers that are '<tt>const</tt>', while
the <tt>LOCK_*_WRITE</tt> macros allow modifications to the data structures.
Both wait indefinitely to obtain the lock. However, if <tt>LOCK_*_WRITE</tt> is
used twice in the same block, the second call will not obtain a lock and
immediately return <tt>NULL</tt>, which may lead to a crash. In such cases a
warning and backtrace is logged.
<p>
You may keep pointers to objects in such lists, even after releasing
the lock. However, you may only access such objects if you are
holding a proper lock again. If an object has been deleted from the list
while you did not hold a lock (for instance by an other thread), the
object will still be there, but no longer within this list (it is then
stored in the ListGarbageCollector for a few seconds). That way even if you
access the object after it has been deleted, you won't cause a segfault.
You can call the Contains() function to check whether an object you are
holding a pointer to is still in the list. Note that the garbage collector
is purged when the usual housekeeping is done.
<p>
See tools.h, class <tt>cListBase</tt> for more documentation and information on how
to use locking with timeouts, and thread.h, classes <tt>cStateLock</tt> and
<tt>cStateKey</tt> on how to easily react to changes in such lists.
<hr><h2><a name="Loading plugins into VDR">Loading plugins into VDR</a></h2>
@ -1707,7 +1731,7 @@ restricts this to a <tt>cOsdObject</tt> returned from the plugin's <tt>MainMenuA
function, or any of the skin classes a plugin might implement.
<p>
If a plugin runs a separate thread and wants to issue a message directly from
within that tread, it can call
within that thread, it can call
<p><table><tr><td class="code"><pre>
int cSkins::QueueMessage(eMessageType Type, const char *s, int Seconds = 0, int Timeout = 0);
@ -2022,8 +2046,9 @@ operator!
<b>Device hooks</b>
<p>
VDR has builtin facilities that select which device is able to provide a given
transponder. However, there may be situations where the setup is so special
that it requires considerations that exceed the scope of the core VDR code.
transponder, or, which device may provide EIT data. However, there may be
situations where the setup is so special that it requires considerations that
exceed the scope of the core VDR code.
This is where <i>device hooks</i> can be used.
<p><table><tr><td class="code"><pre>
@ -2031,6 +2056,7 @@ class cMyDeviceHook : public cDeviceHook {
public:
cMyDeviceHook(void);
virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const;
virtual bool DeviceProvidesEIT(const cDevice *Device) const;
};
</pre></td></tr></table><p>
@ -2047,6 +2073,19 @@ bool cMyDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChan
}
</pre></td></tr></table><p>
In its <tt>DeviceProvidesEIT()</tt> function the device hook can take
whatever actions are necessary to determine whether the given Device can
provide EIT data, as in
<p><table><tr><td class="code"><pre>
bool cMyDeviceHook::DeviceProvidesEIT(const cDevice *Device) const
{
if (<i>condition where Device can't provide EIT data</i>)
return false;
return true;
}
</pre></td></tr></table><p>
A plugin that creates a derived cDeviceHook shall do so in its <tt>Initialize()</tt>
function, as in
@ -2055,6 +2094,17 @@ new cMyDeviceHook;
</pre></td></tr></table><p>
and shall not delete this object. It will be automatically deleted when the program ends.
<p>
<b>Power management</b>
<p>
A device that can be put into a power save mode can implement the function
<p><table><tr><td class="code"><pre>
virtual void SetPowerSaveMode(bool On);
</pre></td></tr></table><p>
If On is true, power save mode shall be activated, if it is false,
normal operating mode shall be restored.
<hr><h2><a name="Positioners">Positioners</a></h2>

View File

@ -24,3 +24,11 @@ VDR Plugin 'epgtableid0' Revision History
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 4.1 2017/05/22 15:30:42 kls Exp $
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
PKG_CONFIG ?= pkg-config
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
@ -62,7 +63,7 @@ all: $(SOFILE)
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -77,7 +78,7 @@ $(DEPFILE): Makefile
$(SOFILE): $(OBJS)
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

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: http://www.tvdr.de
Project's homepage: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
Latest version available at: https://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: epgtableid0.c 3.2 2015/02/17 13:12:18 kls Exp $
* $Id: epgtableid0.c 4.1 2018/04/10 13:00:18 kls Exp $
*/
#include <vdr/epg.h>
#include <vdr/plugin.h>
static const char *VERSION = "2.2.0";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
// --- cTable0Handler --------------------------------------------------------

View File

@ -94,3 +94,12 @@ VDR Plugin 'hello' Revision History
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Updated the French OSD texts (thanks to Bernard Jaulin).
- Official release.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 4.1 2017/05/22 15:32:10 kls Exp $
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
PKG_CONFIG ?= pkg-config
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
LIBDIR = $(call PKGCFG,libdir)
LOCDIR = $(call PKGCFG,locdir)
PLGCFG = $(call PKGCFG,plgcfg)
@ -63,7 +64,7 @@ all: $(SOFILE) i18n
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -84,15 +85,15 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
@echo MO $@
@msgfmt -c -o $@ $<
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
@echo GT $@
@xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot)
@echo PO $@
@msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -107,7 +108,7 @@ install-i18n: $(I18Nmsgs)
$(SOFILE): $(OBJS)
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

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: http://www.tvdr.de
Project's homepage: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
Latest version available at: https://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,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: hello.c 3.2 2015/02/17 13:12:26 kls Exp $
* $Id: hello.c 4.1 2018/04/10 13:00:22 kls Exp $
*/
#include <getopt.h>
@ -12,7 +12,7 @@
#include <vdr/interface.h>
#include <vdr/plugin.h>
static const char *VERSION = "2.2.0";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = trNOOP("A friendly greeting");
static const char *MAINMENUENTRY = trNOOP("Hello");

View File

@ -1,5 +1,5 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
# Ramon Roca <ramon.roca@xcombo.com>, 2003
@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Mogens Elneff <mogens@elneff.dk>, 2004
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Klaus Schmidinger <vdr@tvdr.de>, 2000
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Dimitrios Dimitrakos <mail@dimitrios.de>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Ruben Nunez Francisco <ruben.nunez@tang-it.com>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Arthur Konovalov <artlov@gmail.com>, 2004, 2015
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,5 +1,5 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Hannu Savolainen <hannu@opensound.com>, 2002
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
@ -8,7 +8,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,18 +1,19 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Jean-Claude Repetto <jc@repetto.org>, 2001
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003
# Gregoire Favre <greg@magma.unil.ch>, 2003
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2018
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Nicolas Huillard <nhuillard@e-dition.fr>\n"
"PO-Revision-Date: 2018-04-14 8:34+0200\n"
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
"Language-Team: French <vdr@linuxtv.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
@ -20,19 +21,19 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
msgid "A friendly greeting"
msgstr ""
msgstr "Bien le bonjour"
msgid "Hello"
msgstr ""
msgstr "Hello"
msgid "Greeting time (s)"
msgstr ""
msgstr "Durée pour le salut (s)"
msgid "Use alternate greeting"
msgstr ""
msgstr "Changer de salutation"
msgid "Howdy folks!"
msgstr ""
msgstr "Bonjour à tous !"
msgid "Hello world!"
msgstr ""
msgstr "Bonjour le monde !"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Adrian Caval <anrxc@sysphere.org>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2008-03-17 19:52+0100\n"

View File

@ -1,12 +1,12 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Istvan Koenigsberger <istvnko@hotmail.com>, 2002
# Guido Josten <guido.josten@t-online.de>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2008-01-27 20:11+0100\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2009-12-08 12:18+0200\n"

View File

@ -1,5 +1,5 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, 2001
# Hans Dingemans <hans.dingemans@tacticalops.nl>, 2003
@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,12 +1,12 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Jørgen Tvedt <pjtvedt@online.no>, 2001
# Truls Slevigen <truls@slevigen.no>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,35 +1,38 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Michael Rakowski <mrak@gmx.de>, 2002
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
"PO-Revision-Date: 2018-02-19 00:41+0100\n"
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
"Language-Team: Polish <vdr@linuxtv.org>\n"
"Language: pl\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.0.6\n"
msgid "A friendly greeting"
msgstr ""
msgstr "Przyjazne pozdrowienie"
msgid "Hello"
msgstr ""
msgstr "Witaj"
msgid "Greeting time (s)"
msgstr ""
msgstr "Czas pozdrowienia (s)"
msgid "Use alternate greeting"
msgstr ""
msgstr "Użyj alternatywnego pozdrowienia"
msgid "Howdy folks!"
msgstr ""
msgstr "Siema ziomy!"
msgid "Hello world!"
msgstr ""
msgstr "Witaj świecie!"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Paulo Lopes <pmml@netvita.pt>, 2001
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,12 +1,12 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Paul Lacatus <paul@campina.iiruc.ro>, 2002
# Lucian Muresan <lucianm@users.sourceforge.net>, 2004
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Vyacheslav Dikonov <sdiconov@mail.ru>, 2004
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2009-09-30 09:48+0100\n"

View File

@ -1,12 +1,12 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Miha Setina <mihasetina@softhome.net>, 2000
# Matjaz Thaler <matjaz.thaler@guest.arnes.si>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,12 +1,12 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Tomas Prybil <tomas@prybil.se>, 2002
# Jan Ekholm <chakie@infa.abo.fi>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Oktay Yolgeçen <oktay_73@yahoo.de>, 2007
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2008-05-12 22:34:4800\n"

View File

@ -1,5 +1,5 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
# Ramon Roca <ramon.roca@xcombo.com>, 2003
@ -8,7 +8,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 2.2.0\n"
"Project-Id-Version: vdr-hello 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 2009-01-23 09:48+0800\n"

View File

@ -79,3 +79,15 @@ VDR Plugin 'osddemo' Revision History
- Fixed a vertical black line in the "TiledPixmaps" area on the rpihddevice OSD with
1280x800 pixel (thanks to Thomas Reufer).
- Added a demo case for storing images (thanks to Thomas Reufer).
2018-04-15: Version 2.4.0
- Official release.
2020-10-12: Version 2.4.1
- Added test cases for alignment of semi-circles (press key '4').
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 4.1 2017/05/22 15:30:47 kls Exp $
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
PKG_CONFIG ?= pkg-config
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
@ -62,7 +63,7 @@ all: $(SOFILE)
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -77,7 +78,7 @@ $(DEPFILE): Makefile
$(SOFILE): $(OBJS)
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

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: http://www.tvdr.de
Project's homepage: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
Latest version available at: https://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: osddemo.c 4.3 2015/04/12 09:35:21 kls Exp $
* $Id: osddemo.c 4.5 2020/10/14 20:32:41 kls Exp $
*/
#include <vdr/osd.h>
#include <vdr/plugin.h>
static const char *VERSION = "2.3.1";
static const char *VERSION = "2.4.1";
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
static const char *MAINMENUENTRY = "Osd Demo";
@ -136,6 +136,91 @@ void DrawImages(cOsd *Osd)
Osd->Flush();
}
// --- DrawEllipseAlignments -------------------------------------------------
void DrawEllipseAlignments(cOsd *Osd)
{
cFont *Font = cFont::CreateFont(Setup.FontOsd, 20);
int xa = 0;
int ya = 0;
int xb = Osd->Width() - 1;
int yb = Osd->Height() - 1;
Osd->DrawRectangle(xa, ya, xb, yb, clrBlack);
int d = 50;
int a = d / 2 + 1;
int t = a * 2;
int n = 30;
for (int i = 0; i < n; i++) {
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
Osd->DrawEllipse(a, t - d / 2, a + d - 1, t, clrGreen, 6);
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d / 2, clrGreen, 8);
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
a += d + 5;
d++;
}
d = 50;
a = d * 3;
n = 20;
for (int i = 0; i < n; i++) {
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
Osd->DrawEllipse(t - d / 2, a, t, a + d - 1, clrGreen, 7);
Osd->DrawEllipse(t + d, a, t + d + d / 2, a + d - 1, clrGreen, 5);
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
a += d + 5;
d++;
}
d = 50;
a = d * 3;
t = d * 5;
n = 30;
for (int i = 0; i < n; i++) {
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 2);
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 3);
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
a += d + 5;
d++;
}
d = 50;
a = d * 3;
t = d * 9;
n = 30;
for (int i = 0; i < n; i++) {
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 1);
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 4);
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
a += d + 5;
d++;
}
d = 50;
a = d * 12;
t = d * 5;
n = 20;
for (int i = 0; i < n; i++) {
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 2);
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 1);
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
a += d + 5;
d++;
}
d = 50;
a = d * 12;
t = d * 9;
n = 20;
for (int i = 0; i < n; i++) {
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 3);
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 4);
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
a += d + 5;
d++;
}
Osd->Flush();
delete Font;
}
// --- cLineGame -------------------------------------------------------------
class cLineGame : public cOsdObject {
@ -590,6 +675,10 @@ eOSState cTrueColorDemo::ProcessKey(eKeys Key)
SetArea();
DrawImages(osd);
break;
case k4: Cancel(3);
SetArea();
DrawEllipseAlignments(osd);
return osContinue;
case kBack:
case kOk: return osEnd;
default: return state;

View File

@ -100,6 +100,23 @@ VDR Plugin 'pictures' Revision History
- Official release.
2015-07.23: Version 2.3.1
2015-07-23: Version 2.3.1
- Added a missing 'const'.
2017-10-06: Version 2.3.2
- Adapted the pic2mpg script to new ffmpeg options.
- No longer using 'convert' to scale/rotate the pictures.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.
2022-12-05: Version 2.6.1
Fixed initializing cPictureControl.

View File

@ -1,7 +1,7 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 4.1 2017/05/22 15:31:28 kls Exp $
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
PKG_CONFIG ?= pkg-config
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
LIBDIR = $(call PKGCFG,libdir)
LOCDIR = $(call PKGCFG,locdir)
PLGCFG = $(call PKGCFG,plgcfg)
@ -63,7 +64,7 @@ all: $(SOFILE) i18n
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -84,15 +85,15 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
@echo MO $@
@msgfmt -c -o $@ $<
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
@echo GT $@
@xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot)
@echo PO $@
@msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -107,7 +108,7 @@ install-i18n: $(I18Nmsgs)
$(SOFILE): $(OBJS)
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

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: http://www.tvdr.de
Project's homepage: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
Latest version available at: https://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

@ -7,7 +7,7 @@
#
# See the README file for copyright information and how to reach the author.
#
# $Id: pic2mpg 3.1 2013/05/23 10:00:23 kls Exp $
# $Id: pic2mpg 4.1 2017/10/06 14:42:18 kls Exp $
use File::Path;
use File::Spec;
@ -128,7 +128,7 @@ for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subd
for $dir (@Dirs) {
$dir = EscapeMeta($dir);
print "removing $dir\n";
!system("rm -rf $dir") || die "$dir: $!\n";
Exec("rm -rf $dir");
}
}
@ -142,17 +142,18 @@ sub ConvertFile
my $Exif = ImageInfo($Pict);
my $Orientation = $$Exif{"Orientation"};
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+)/;
my $Rotate = $Degrees ? "-rotate $Degrees" : "";
my $Rotate = ($Degrees == 90) ? "transpose=clock" : ($Degrees == 180) ? "hflip,vflip" : ($Degrees == 270) ? "transpose=cclock" : "";
$Rotate .= ',' if ($Rotate);
my $Background = '#000000@1';
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
$Pict = EscapeMeta($Pict);
$Mpeg = EscapeMeta($Mpeg);
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
my $Cmd = "convert $Pict -background '#000000' $Rotate -resize $Size -gravity center -extent $Extent ppm:- | "
. "ffmpeg -f image2pipe -vcodec ppm -i pipe:0 -an -vcodec libx264 -vpre baseline -s $Size -qscale 2 -f mpegts -y $Mpeg "
my $Cmd = "ffmpeg -i $Pict -vf '${Rotate}scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:$Background' -c:v libx264 -pix_fmt yuv420p -f mpegts -y $Mpeg "
. ($Detailed ? "" : "2>/dev/null");
!system($Cmd) || die "$Cmd: $!\n";
Exec($Cmd);
$Cmd = "touch -r $Pict $Mpeg";
!system($Cmd) || die "$Cmd: $!\n";
Exec($Cmd);
}
sub EscapeMeta
@ -162,3 +163,10 @@ sub EscapeMeta
$s =~ s/([$META])/\\$1/g;
return $s;
}
sub Exec
{
my $Cmd = shift;
print "==> '$Cmd'\n" if ($Verbose);
!system($Cmd) || die "$Cmd: $!\n";
}

View File

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: pictures.c 4.1 2015/07/17 10:14:22 kls Exp $
* $Id: pictures.c 5.1 2022/12/05 15:26:23 kls Exp $
*/
#include <getopt.h>
@ -11,7 +11,7 @@
#include "menu.h"
#include "player.h"
static const char *VERSION = "2.3.1";
static const char *VERSION = "2.6.1";
static const char *DESCRIPTION = trNOOP("A simple picture viewer");
static const char *MAINMENUENTRY = trNOOP("Pictures");

View File

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: player.c 3.1 2014/02/08 12:48:12 kls Exp $
* $Id: player.c 5.1 2022/12/05 15:26:23 kls Exp $
*/
#include "player.h"
@ -96,8 +96,10 @@ int cPictureControl::active = 0;
cString cPictureControl::lastDisplayed;
cPictureControl::cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow)
:cControl(player = new cPicturePlayer)
:cControl(NULL)
{
player = new cPicturePlayer;
SetPlayer(player);
pictures = Pictures;
pictureEntry = PictureEntry;
osd = NULL;

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Klaus Schmidinger <vdr@tvdr.de>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.2.0\n"
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2008-01-12 17:41+0100\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Arthur Konovalov <artlov@gmail.com>, 2015
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.2.0\n"
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2008-01-12 17:41+0100\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.2.0\n"
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2008-01-12 17:41+0100\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Patrice Staudt <patrice.staudt@laposte.net>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.2.0\n"
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2008-01-12 17:41+0100\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.2.0\n"
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2008-01-27 20:22+0100\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.2.0\n"
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2009-12-08 12:41+0100\n"

View File

@ -0,0 +1,34 @@
# VDR plugin language source file.
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2018-02-19 00:48+0100\n"
"PO-Revision-Date: 2018-02-19 00:53+0100\n"
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
"Language-Team: Polish <vdr@linuxtv.org>\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.0.6\n"
msgid "Pictures"
msgstr "Zdjęcia"
msgid "A simple picture viewer"
msgstr "Prosta przeglądarka zdjęć"
msgid "Picture directory"
msgstr "Katalog ze zdjęciami"
msgid "Slide show delay (s)"
msgstr "Pokaz slajdów opóźnienie (s)"
msgid "No picture directory has been defined!"
msgstr "Nie zdefiniowano katalogu ze zdjęciami!"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Alexander Gross <Bikalexander@gmail.com>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.2.0\n"
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2008-03-14 00:45+0100\n"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Klaus Schmidinger <vdr@tvdr.de>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-pictures 2.2.0\n"
"Project-Id-Version: vdr-pictures 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2009-09-30 12:54+0100\n"

View File

@ -29,3 +29,11 @@ VDR Plugin 'servicedemo' Revision History
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 4.1 2017/05/22 15:31:59 kls Exp $
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
@ -17,7 +17,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ pr
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
PKG_CONFIG ?= pkg-config
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
@ -59,7 +60,7 @@ all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -74,11 +75,11 @@ $(DEPFILE): Makefile
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
install -D libvdr-$(PLUGIN1).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION)

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: http://www.tvdr.de
Project's homepage: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
Latest version available at: https://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,14 +3,14 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: svccli.c 3.2 2015/02/17 13:13:05 kls Exp $
* $Id: svccli.c 4.1 2018/04/10 13:00:53 kls Exp $
*/
#include <stdlib.h>
#include <vdr/interface.h>
#include <vdr/plugin.h>
static const char *VERSION = "2.2.0";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = "Service demo client";
static const char *MAINMENUENTRY = "Service demo";

View File

@ -3,14 +3,14 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: svcsvr.c 3.2 2015/02/17 13:13:09 kls Exp $
* $Id: svcsvr.c 4.1 2018/04/10 13:00:57 kls Exp $
*/
#include <stdlib.h>
#include <vdr/interface.h>
#include <vdr/plugin.h>
static const char *VERSION = "2.2.0";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = "Service demo server";
class cPluginSvcSvr : public cPlugin {

View File

@ -137,3 +137,27 @@ VDR Plugin 'skincurses' Revision History
font drawing in high level OSDs (dummy for skincurses).
- Fixed truncated date/time strings in the skins on multi-byte UTF-8 systems
(reported by Sergey Chernyavskiy).
2018-04-15: Version 2.4.0
- Official release.
2019-03-12: Version 2.4.1
- Changes for ncurses version 6 (thanks to Ulrick Eckhardt).
2020-05-11: Version 2.4.2
- Fixed 'Changes for ncurses version 6'.
- Reacting to changes in screen size.
- Simplified color handling.
- Using 'stdscr' directly instead of an additional window.
2021-07-01: Version 2.4.3
- The number of errors (if any) of a recording is now displayed in the recording's
Info menu.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 4.1 2017/05/22 15:31:47 kls Exp $
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
PKG_CONFIG ?= pkg-config
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
LIBDIR = $(call PKGCFG,libdir)
LOCDIR = $(call PKGCFG,locdir)
PLGCFG = $(call PKGCFG,plgcfg)
@ -63,7 +64,7 @@ all: $(SOFILE) i18n
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -84,15 +85,15 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
@echo MO $@
@msgfmt -c -o $@ $<
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
@echo GT $@
@xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot)
@echo PO $@
@msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -107,7 +108,7 @@ install-i18n: $(I18Nmsgs)
$(SOFILE): $(OBJS)
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

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: http://www.tvdr.de
Project's homepage: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
Latest version available at: https://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

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Klaus Schmidinger <vdr@tvdr.de>, 2007
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-skincurses 2.2.0\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
"PO-Revision-Date: 2007-08-15 16:07+0200\n"
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n"
@ -19,6 +19,9 @@ msgstr ""
msgid "A text only skin"
msgstr "Eine reine Text-Oberfläche"
msgid "errors"
msgstr "Fehler"
msgid "Key$Mute"
msgstr "Stumm"

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Arthur Konovalov <artlov@gmail.com>, 2015
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-skincurses 2.2.0\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
@ -19,6 +19,9 @@ msgstr ""
msgid "A text only skin"
msgstr "Tekstipõhine kest"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Hääletu"

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2007
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-skincurses 2.2.0\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n"
@ -19,6 +19,9 @@ msgstr ""
msgid "A text only skin"
msgstr "Tekstipohjainen ulkoasu"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Mykistys"

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-skincurses 2.2.0\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
"PO-Revision-Date: 2008-01-27 20:35+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n"
@ -19,6 +19,9 @@ msgstr ""
msgid "A text only skin"
msgstr "Una interfaccia solo testo"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Muto"

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Valdemaras Pipiras <varas@ambernet.lt>, 2010
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-skincurses 2.2.0\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
"PO-Revision-Date: 2010-02-22 18:18+0200\n"
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
@ -19,6 +19,9 @@ msgstr ""
msgid "A text only skin"
msgstr "Tekstinis apvalkalas"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Išjungti garsą"

View File

@ -0,0 +1,35 @@
# VDR plugin language source file.
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
"PO-Revision-Date: 2018-02-19 01:02+0100\n"
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
"Language-Team: Polish <vdr@linuxtv.org>\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.0.6\n"
msgid "A text only skin"
msgstr "Skóra tekstowa"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Wycisz"
#. TRANSLATORS: note the trailing blank!
msgid "Volume "
msgstr "Głośność "
msgid "Text mode"
msgstr "Tryb tekstowy"

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Alexander Gross <Bikalexander@gmail.com>, 2008
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-skincurses 2.2.0\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
"PO-Revision-Date: 2008-03-14 00:21+0100\n"
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
"Language-Team: Russian <vdr@linuxtv.org>\n"
@ -20,6 +20,9 @@ msgstr ""
msgid "A text only skin"
msgstr "¿àÞáâÞ âÕÚáâÞÒëÙ ØÝâÕàäÕÙá"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "²ëÚÛ. ÓàÞÜÚÞáâì"

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package.
# Klaus Schmidinger <vdr@tvdr.de>, 2007
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-skincurses 2.2.0\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
"PO-Revision-Date: 2009-09-30 12:52+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <vdr@linuxtv.org>\n"
@ -19,6 +19,9 @@ msgstr ""
msgid "A text only skin"
msgstr "Iba text vzhµadu"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Stlmi» zvuk"

View File

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: skincurses.c 4.2 2016/12/22 14:09:09 kls Exp $
* $Id: skincurses.c 5.1 2021/07/01 15:40:46 kls Exp $
*/
#include <ncurses.h>
@ -12,7 +12,7 @@
#include <vdr/skins.h>
#include <vdr/videodir.h>
static const char *VERSION = "2.3.2";
static const char *VERSION = "2.4.3";
static const char *DESCRIPTION = trNOOP("A text only skin");
static const char *MAINMENUENTRY = NULL;
@ -60,9 +60,7 @@ static int ScOsdHeight = 20;
class cCursesOsd : public cOsd {
private:
WINDOW *savedRegion;
WINDOW *window;
enum { MaxColorPairs = 16 };
int colorPairs[MaxColorPairs];
cVector<int> colorPairs;
void SetColor(int colorFg, int colorBg = clrBackground);
public:
cCursesOsd(int Left, int Top);
@ -79,40 +77,34 @@ cCursesOsd::cCursesOsd(int Left, int Top)
{
savedRegion = NULL;
memset(colorPairs, 0x00, sizeof(colorPairs));
start_color();
leaveok(stdscr, true);
refresh(); // to react on changes to screen size
window = subwin(stdscr, ScOsdHeight, ScOsdWidth, 0, 0);
syncok(window, true);
int begy, begx;
int maxy, maxx;
getmaxyx(stdscr, maxy, maxx);
getbegyx(stdscr, begy, begx);
ScOsdWidth = maxx - begx;
ScOsdHeight = maxy - begy;
}
cCursesOsd::~cCursesOsd()
{
if (window) {
werase(window);
Flush();
delwin(window);
window = NULL;
}
erase();
Flush();
}
void cCursesOsd::SetColor(int colorFg, int colorBg)
{
int color = (colorBg << 16) | colorFg | 0x80000000;
for (int i = 0; i < MaxColorPairs; i++) {
if (!colorPairs[i]) {
colorPairs[i] = color;
init_pair(i + 1, colorFg, colorBg);
//XXX??? attron(COLOR_PAIR(WHITE_ON_BLUE));
wattrset(window, COLOR_PAIR(i + 1));
break;
}
else if (color == colorPairs[i]) {
wattrset(window, COLOR_PAIR(i + 1));
break;
}
}
int i = colorPairs.IndexOf(color);
if (i < 0) {
colorPairs.Append(color);
i = colorPairs.Size() - 1;
init_pair(i + 1, colorFg, colorBg);
}
attrset(COLOR_PAIR(i + 1));
}
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
@ -122,13 +114,14 @@ void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
savedRegion = NULL;
}
savedRegion = newwin(y2 - y1 + 1, x2 - x1 + 1, y1, x1);
copywin(window, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
if (savedRegion)
copywin(stdscr, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
}
void cCursesOsd::RestoreRegion(void)
{
if (savedRegion) {
copywin(savedRegion, window, 0, 0, savedRegion->_begy, savedRegion->_begx, savedRegion->_maxy - savedRegion->_begy, savedRegion->_maxx - savedRegion->_begx, false);
overwrite(savedRegion, stdscr);
delwin(savedRegion);
savedRegion = NULL;
}
@ -168,18 +161,22 @@ void cCursesOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Co
}
}
SetColor(ColorFg, ColorBg);
wmove(window, y, x); // ncurses wants 'y' before 'x'!
waddnstr(window, s, Width ? Width : ScOsdWidth - x);
mvaddnstr(y, x, s, Width ? Width : ScOsdWidth - x);
}
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
{
SetColor(Color, Color);
for (int y = y1; y <= y2; y++) {
wmove(window, y, x1); // ncurses wants 'y' before 'x'!
whline(window, ' ', x2 - x1 + 1);
}
wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work
int dx = x2 - x1;
int dy = y2 - y1;
if (dx >= dy) {
for (int y = y1; y <= y2; y++)
mvhline(y, x1, ' ', dx + 1);
}
else {
for (int x = x1; x <= x2; x++)
mvvline(y1, x, ' ', dy + 1);
}
}
void cCursesOsd::Flush(void)
@ -450,9 +447,18 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
y += ts.Height();
int xt = ScOsdWidth;
if (Info->GetEvent()->ParentalRating()) {
cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
int w = Utf8StrLen(buffer);
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
xt -= w + 1;
}
if (Info->Errors() > 0) {
cString buffer = cString::sprintf(" %d %s ", Info->Errors(), tr("errors"));
int w = Utf8StrLen(buffer);
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
xt -= w + 1;
}
y += 1;
const char *Title = Info->Title();
@ -827,12 +833,8 @@ bool cPluginSkinCurses::ProcessArgs(int argc, char *argv[])
bool cPluginSkinCurses::Initialize(void)
{
// Initialize any background activities the plugin shall perform.
WINDOW *w = initscr();
if (w) {
ScOsdWidth = w->_maxx - w->_begx + 1;
ScOsdHeight = w->_maxy - w->_begy + 1;
if (initscr())
return true;
}
return false;
}

View File

@ -68,3 +68,18 @@ VDR Plugin 'status' Revision History
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Official release.
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

@ -1,7 +1,7 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 4.1 2017/05/22 15:30:58 kls Exp $
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
PKG_CONFIG ?= pkg-config
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
@ -62,7 +63,7 @@ all: $(SOFILE)
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -77,7 +78,7 @@ $(DEPFILE): Makefile
$(SOFILE): $(OBJS)
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

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: http://www.tvdr.de
Project's homepage: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
Latest version available at: https://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 3.2 2015/02/17 13:13:21 kls Exp $
* $Id: status.c 5.4 2025/02/12 21:18:53 kls Exp $
*/
#include <vdr/plugin.h>
#include <vdr/status.h>
static const char *VERSION = "2.2.0";
static const char *VERSION = "2.6.1";
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 OsdStatusMessage(const char *Message);
virtual void OsdStatusMessage2(eMessageType Type, const char *Message);
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
virtual void OsdItem(const char *Text, int Index);
virtual void OsdCurrentItem(const char *Text);
virtual void OsdItem2(const char *Text, int Index, bool Selectable);
virtual void OsdCurrentItem2(const char *Text, int Index);
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::OsdStatusMessage(const char *Message)
void cStatusTest::OsdStatusMessage2(eMessageType Type, const char *Message)
{
dsyslog("status: cStatusTest::OsdStatusMessage '%s'", Message);
dsyslog("status: cStatusTest::OsdStatusMessage2 %d '%s'", Type, 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::OsdItem(const char *Text, int Index)
void cStatusTest::OsdItem2(const char *Text, int Index, bool Selected)
{
//dsyslog("status: cStatusTest::OsdItem %s %d", Text, Index);
dsyslog("status: cStatusTest::OsdItem2 %s %d %d", Text, Index, Selected);
}
void cStatusTest::OsdCurrentItem(const char *Text)
void cStatusTest::OsdCurrentItem2(const char *Text, int Index)
{
dsyslog("status: cStatusTest::OsdCurrentItem %s", Text);
dsyslog("status: cStatusTest::OsdCurrentItem %s %d", Text, Index);
}
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)

View File

@ -33,3 +33,11 @@ VDR Plugin 'svdrpdemo' Revision History
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 4.1 2017/05/22 15:31:19 kls Exp $
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
PKG_CONFIG ?= pkg-config
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
@ -62,7 +63,7 @@ all: $(SOFILE)
%.o: %.c
@echo CC $@
@$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -77,7 +78,7 @@ $(DEPFILE): Makefile
$(SOFILE): $(OBJS)
@echo LD $@
@$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

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: http://www.tvdr.de
Project's homepage: https://www.tvdr.de
Latest version available at: http://www.tvdr.de
Latest version available at: https://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,12 +3,12 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: svdrpdemo.c 3.2 2015/02/17 13:13:29 kls Exp $
* $Id: svdrpdemo.c 4.1 2018/04/10 13:01:07 kls Exp $
*/
#include <vdr/plugin.h>
static const char *VERSION = "2.2.0";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = "How to add SVDRP support to a plugin";
class cPluginSvdrpdemo : public cPlugin {

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 http://www.tvdr.de.
refer to https://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 http://www.tvdr.de/counter.htm. You can also like VDR on facebook
at https://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 http://www.tvdr.de/plugins.htm for a list of available plugins.
See https://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

@ -224,7 +224,7 @@ OSD:
- The OSD size is now automatically adjusted to the actual video display
(provided the output device implements the GetOsdSize() function).
- The OSD now has full TrueColor support. There can be several "pixmaps" that can
be overlayed with alpha blending. All existing skins should work out of the box
be overlaid with alpha blending. All existing skins should work out of the box
with the TrueColor OSD - the only exception being cOsd::GetBitmap(). Since the
TrueColor OSD doesn't use bitmaps, this function will return a dummy bitmap, which
may not be what the plugin expects. As long as this bitmap is only used for setting

View File

@ -408,7 +408,7 @@ Misc:
- Updated sources.conf to reflect the fact that Astra 4A and SES5 are actually in
two separate positions.
- Fixed cMarks::GetNextBegin() and cMarks::GetNextEnd(). The behavior of these two
functions is now exacly as described in the header file. Editing marks that are
functions is now exactly as described in the header file. Editing marks that are
placed at exactly the same offset in a recording are now preserved in the cutting
process.
- The new command line option --chartab can be used to set the default character

442
UPDATE-2.4.0 Normal file
View File

@ -0,0 +1,442 @@
This is a summary of the changes in VDR 2.4.0 since the last stable
version 2.2.0. It only contains things that are of actual importance
to the user and doesn't mention the many fixes and improvements that
have been made "behind the scenes".
See the file HISTORY for a detailed list of all changes.
Peering:
- If there is more than one VDR in the local network, they can now form a peer-to-peer
network, so that timers can be moved freely between them.
The following changes have been made to implement this:
+ VDR now sends out a broadcast to port 6419/udp, which was assigned to 'svdrp-disc'
by the IANA. VDRs listening on that port will automatically initiate an SVDRP
connection to the broadcasting VDR, and in turn send out a broadcast to make
other VDRs connect to them. That way all VDRs within the local network will
have permanent "peer-to-peer" SVDRP connections between each other. The
configuration in the svdrphosts.conf file is taken into account when considering
whether or not to respond to an SVDRP discover broadcast.
+ The new SVDRP command PING is used by automatically established peer-to-peer
connections to keep them alive.
+ The new function GetSVDRPServerNames() can be used to get a list of all VDRs
this VDR is connected to via SVDRP.
+ The new function ExecSVDRPCommand() can be used to execute an SVDRP command on
one of the servers this VDR is connected to, and retrieve the result.
The helper functions SVDRPCode() and SVDRPValue() can be used to easily access
the codes and values returned by ExecSVDRPCommand().
+ The new SVDRP command POLL is used by automatically established peer-to-peer
connections to trigger fetching remote timers.
+ The new options "Setup/Miscellaneous/SVDRP peering", ".../SVDRP host name" and
".../SVDRP default host" can be used to configure automatic peering between VDRs
in the same network. Peering is disabled by default and can be enabled by setting
"SVDRP peering" to "yes".
+ The "Edit timer" menu now has a new parameter "Record on", which can be used to
select the VDR on which this timer shall record. Timers can be freely moved
between connected VDRs by simply selecting the desired machine in this field.
+ The cTimer class now has a new member named 'remote', which holds the name of the
remote server this timer will record on. If this is NULL, it is a local timer.
+ Added a note to the "Pausing live video" section of the MANUAL, stating that
the timer for paused live video will always record on the local VDR, even if
an "SVDRP default host" has been set for normal timer recordings.
+ The Perl script 'peerdemo' shows how one can find all the VDRs in the local network
using the peer connection mechanism.
Conditional Access:
- Implemented support for MTD ("Multi Transponder Decryption"). This allows a CAM
that is capable of decrypting more than one channel ("Multi Channel Decryption")
to decrypt channels from different transponders. See the remarks in mtd.h on
what a derived cCamSlot class needs to do in order to activate MTD.
- The Setup/CAM menu now displays which device an individual CAM is currently
assigned to.
- The channel/CAM relations (i.e. the information which CAM can decrypt a given
channel) are now stored in the file 'cam.data' in the cache directory.
This speeds up switching to encrypted channels after newly starting VDR, in case
there is more than one CAM in the system.
The file 'cam.data' is not written if it is read-only.
- The mechanism of trying different CAMs when switching to an encrypted channel is
now only triggered if there actually is more than one CAM in the system.
- CAMs that can handle multiple devices at the same time can now indicate this
by creating the first cCamSlot as usual, and every other cCamSlot by giving
it the first one as its "MasterSlot". To VDR this means that when searching
for a CAM that can decrypt a particular channel, it only needs to ask the
master CAM slot whether it is suitable for decrypting, and can skip all the
other slots belonging to the same master. This can greatly speed up channel
switching on systems with more than one CAM (that can handle multiple devices).
- The LCARS skin now displays the master CAM's number when a device is tuned to
an encrypted channel.
- The Setup/CAM menu now only displays master CAMs.
- Detecting whether a particular CAM actually decrypts a given channel is now
done separately for each receiver.
- The function cCamSlot::Decrypt() can now also be called with Data == NULL.
This is necessary to allow CAMs that copy the incoming data into a separate buffer
to return previously received and decrypted TS packets. See ci.h for details.
Plugins that implement a derived cCamSlot need to properly handle this case, and
plugins that implement a derived cDevice need to call Decrypt() in their
GetTSPacket() function even if the incoming buffer is currently empty (see
cDvbDevice::GetTSPacket()).
- CAMs are now sent a generated EIT packet that contains a single 'present event' for
the current SID, in order to avoid any parental rating dialogs.
- When selecting a device/CAM combination for live viewing, CAMs that are known to
decrypt the requested channel are now given a higher priority than preferring the
primary device.
- Extended the CI API to allow plugins to implement additional CAM resources.
- The new configuration file 'camresponses.conf' can be used to define automatic
responses to CAM menus, for instance to avoid annyoing popup messages or entering
the parental rating PIN. See vdr.5 for details.
Timers:
- The cTimer class now has a new member named 'remote', which holds the name of the
remote server this timer will record on. If this is NULL, it is a local timer.
- Timers from other VDRs that are connected to this VDR via SVDRP are now
automatically fetched and stored in the global Timers list. In order for this
to work, all of the channels used by timers on the remote VDR must also be
defined on the local VDR (however, not necessarily in the same sequence).
- Accessing the global Timers list now has to be protected by proper locking,
because SVDRP commands are now executed in a separate thread.
The introduction of this locking mechanism required the following changes:
+ The new classes cStateLock and cStateKey are used to implement locking
with quick detection of state changes.
+ cConfig::cConfig() now has a parameter that indicates whether this list
requires locking.
+ The global lists of Timers, Channels, Schedules and Recordings are no longer
static variables. They are now pointers that need to be retrieved through
a call to cTimers::GetTimersRead/Write(), cChannels::GetChannelsRead/Write(),
cSchedules::GetSchedulesRead/Write() and cRecordings::GetRecordingsRead/Write(),
respectively.
+ References from/to link channels are now removed in cChannels::Del() rather
than cChannel::~cChannel(), to make sure the caller holds a proper lock.
+ cChannel::HasTimer() has been removed. This information is now retrieved
via cSchedule::HasTimer().
+ Several member functions of cChannel, cTimer, cMarks and cRecording have
been made 'const', and some of them are now available as both 'const' and
'non-const' versions.
+ The cChannel::Set...() functions are now 'bool' and return true if they have
actually changed any of the channels's members.
+ cChannels::SetModified() has been renamed to cChannels::SetModifiedByUser().
+ cChannels::Modified() has been renamed to cChannels::ModifiedByUser(), and
now has a 'State' parameter that allows the caller to see whether a channel
has been modified since the last call to this function with the same State
variable.
+ The macros CHANNELSMOD_NONE/_AUTO/_USER have been removed.
+ cMarks now requires locking via cStateKey.
+ cSortedTimers now requires a pointer to the list of timers.
+ cEvent::HasTimer() no longer scans the list of timers to check whether an event
is referenced by a timer, but rather keeps score of how many timers reference
it. This was necessary in order to avoid having to lock the list of timers from
within a cEvent.
+ The new class cListGarbageCollector is used to temporary store any objects deleted
from cLists that require locking. This allows pointers to such objects to be
dereferenced even if the objects are no longer part of the list.
+ cListBase::Contains() can be used to check whether a particular object is still
contained in that list.
+ Outdated events are no longer "phased out", but rather deleted right away and thus
taken care of by the new "garbage collector" of the list.
+ Deleted cRecording objects are no longer kept in a list of "vanished" recordings,
but are rather taken care of by the new "garbage collector" of the list.
+ cSchedules::ClearAll() has been removed. The functionality is now implemented
directly in cSVDRPServer::CmdCLRE().
+ cSchedule now has a member Modified(), which can be used with a State variable
to quickly determine whether this schedule has been modified since the last call
to this function with the same State variable.
+ cSchedulesLock has been removed. Locking the list of schedules is now done via
the cList's new locking mechanism.
+ The 'OnlyRunningStatus' parameters in cEpgHandler::BeginSegmentTransfer() and
cEpgHandler::EndSegmentTransfer() are now obsolete. They are still present in
the interface for backward compatibility, but may be removed in a future version.
Their value is always 'false'.
+ The constant tcMod is no longer used in cStatus::TimerChange(). The definition is
still there for backward compatibility.
- Plugins that access the global lists of Timers, Channels, Recordings or Schedules
will need to be adapted as follows:
+ Instead of directly accessing the global variables Timers, Channels or Recordings,
they need to set up a cStateKey variable and call the proper getter function,
as in
cStateKey StateKey;
if (const cTimers *Timers = cTimers::GetTimersRead(StateKey)) {
// access the timers
StateKey.Remove();
}
and
cStateKey StateKey;
if (cTimers *Timers = cTimers::GetTimersWrite(StateKey)) {
// access the timers
StateKey.Remove();
}
See timers.h, thread.h and tools.h for details on this new locking mechanism.
+ There are convenience macros for easily accessing these lists without having
to explicitly set up a cStateKey and calling its Remove() function. These macros
have the form LOCK_*_READ/WRITE (with '*' being TIMERS, CHANNELS, SCHEDULES or
RECORDINGS). Simply put such a macro before the point where you need to access
the respective list, and there will be a pointer named Timers, Channels, Schedules
or Recordings, respectively, which is valid until the end of the current block.
+ If a plugin needs to access several of the global lists in parallel, locking must
always be done in the sequence Timers, Channels, Recordings, Schedules. This is
necessary to make sure that different threads that need to lock several lists at
the same time don't end up in a deadlock.
+ Some pointer variables may need to be made 'const'. The compiler will tell you
about these.
- If a timer is newly created with the Red button in the Schedule menu, and the timer
is presented to the user in the "Edit timer" menu because it will start immediately,
it now *must* be confirmed with "Ok" to set the timer. Otherwise the timer will not
be created.
- The function cTimer::ToText() no longer returns a newline character at the end of
the string. The newline is now added by the caller as necessary. This was changed
because cTimer::ToText() is now also needed in a context where the terminating
newline can't be used. Consequently, cChannel::ToText() and cMark::ToText() have
been modified accordingly.
- Timers now have unique ids instead of numbers, which remain valid as long as this
instance of VDR is running. This means that timers are no longer continuously
numbered from 1 to N in LSTT. There may be
gaps in the sequence, in case timers have been deleted.
- Timers are now linked to EPG events even if they are inactive. By default Events that
are linked to inactive timers are marked with 'I' and 'i', depending on whether the
timer would record the entire Event or only part of it.
The function cSkinDisplayMenu::SetItemEvent() now has an additional parameter named
TimerActive, which indicates whether the timer that would record this event (if any)
is active. A plugin may react on this when displaying a menu line for an event.
The old version of cSkinDisplayMenu::SetItemEvent() (without the TimerActive
parameter) is still there for backwards compatibility. It may be removed in a future
version, so plugin authors should switch to the new one.
- Improved handling VPS timers to better react to EPG changes during an ongoing recording.
Plugins:
- The dvbhddevice plugin is no longer part of the VDR source archive.
You can get the latest version of this plugin from the author's repository at
https://bitbucket.org/powARman/dvbhddevice.
- The dvbsddevice and rcu plugins are no longer part of the VDR source archive.
You can get the latest versions of these plugins from ftp://ftp.tvdr.de/vdr/Plugins.
- The -V and -h options now list the plugins in alphabetical order.
- Added some guidelines and recommendations to the 'Logging' section of PLUGINS.html.
The most important being: implement a command line option to control the level
of logging (in particular allow turning off logging completely!) and never print
anything to stdout or stderr (unless one of the listed exceptions applies).
- Added a note to PLUGINS.html about writing log messages in English.
- The new function cStatus::MarksModified() can be implemented by plugins to get
informed about any modifications to the editing marks of the currently played
recording.
Skins:
- The main menu of the LCARS skin now displays a small rectangle on the left side
of a timer if this is a remote timer. The color of that rectangle changes if
the timer is currently recording on the remote VDR.
- Skins can now implement cSkinDisplayMenu::MenuOrientation() to display horizontal
menus.
- The LCARS skin now displays the master CAM's number when a device is tuned to
an encrypted channel.
Remote control:
- The new setup option "Recording/Record key handling" can be used to define
what happens if the Record key on the remote control is pressed during
live tv.
- If the Channel+/- keys are pressed while in the Schedules menu, the menu is now
switched to the EPG of the new current channel.
Devices:
- The command line option -D now accepts the value '-' (as in -D-), which prevents
VDR from using any DVB devices.
- The function cDevice::SetCurrentChannel(const cChannel *Channel) is now deprecated
and may be removed in a future version. Use SetCurrentChannel(int ChannelNumber)
instead.
- Signal strength and quality (CNR) are now determined via DVB API 5 (if available).
Fallback is the old DVB API 3 method.
- The new function cDevice::SignalStats() (if implemented by an actual device) returns
statistics about the currently received signal.
- The function cDevice::GetVideoSystem() (which has been deprecated since version 2.1.6)
has been finally removed.
- Switching the primary device is no longer done via osSwitchDvb (which has been
removed), but rather by the main program loop reacting to changes in Setup.PrimaryDVB.
EPG:
- The character 0x0D is now stripped from EPG texts.
- The EPG scanner no longer moves the dish if there is a positioner.
- The function cEpgHandlers::BeginSegmentTransfer() is now boolean.
See the description in epg.h for the meaning of the return value.
- The cEvent class now has a new member 'aux', in which external applications can
store auxiliary information with an event. This string has no meaning whatsoever to
VDR itself, and it will not be written into the info file of a recording that is
made for such an event.
- Changed the default return value of cEpgHandler::BeginSegmentTransfer() to true, to
avoid problems with derived classes that don't implement this function.
- The EIT filter no longer parses data from "other TS", to avoid problems with
broadcasters who transmit faulty EIT data.
OSD:
- The new function cOsd::MaxPixmapSize() can be called to determine the maximum size
a cPixmap may have on the current OSD. The 'osddemo' example has been modified
accordingly. Plugin authors may want to use this function in case they use pixmaps
that are larger than the full OSD size. The default implementation sets this limit
to 2048x2048 pixel.
- Added some comment to cPixmap about the relation between OSD, ViewPort and DrawPort.
- The new setup option "OSD/Default sort mode for recordings" can be used to define
how recordings shall be sorted by default (either by time or by name, with "by time"
being the default). If a particular sort mode has been selected for a folder by
pressing '0', the default no longer applies to that folder. Repeating timers no
longer write a ".sort" file into a recordings folder to have the recordings sorted
by time.
- The function cOsd::GetBitmap() is now 'protected'. If a plugin doesn't compile with
this version of VDR, you can uncomment the line
//#define DEPRECATED_GETBITMAP
in osd.h as a quick workaround. In the long run the plugin will need to be adapted.
- Background modifications of channels, timers and events are now displayed immediately
in the corresponding menus.
- The Timers menu now displays the name of the remote VDR in front of the timer's
file name, if this is a remote timer.
- The width and height of the OSD are now limited to the actual maximum dimensions
of the output device, taking into account the top and left offset.
- Added a note to the description of cFont::Size(), regarding possible differences
between it and cFont::Height().
- Added cFont::Width(void) to get the default character width and allow stretched
font drawing in high level OSDs.
- cOsdMenu::Display() now checks whether the OSD size has changed and if so calls
SetDisplayMenu().
- The option "Setup/Miscellaneous/Show channel names with source" can now be set to
"type" or "full" to show either the type or the full name of the source.
- The "Channels" menu now indicates whether a channel is encrypted ('X') or a radio
channel ('R').
- The timeout for the channel display is now reset whenever the channel or EPG data
changes.
- OSD menus now try to keep the offset of the list cursor at a constant position on
the screen, even if the list is modified while being displayed.
- If an event in the Schedules menu is marked with a 'T' or 'I' and the user presses the
Red button to edit the timer, local timers are now preferred over remote timers
in case there is more than one timer that will record that event.
- The new setup option "OSD/Sorting direction for recordings" can be used to switch
the sequence in which recordings are presented in the "Recordings" menu between
ascending (oldest first) and descendeng (newest first).
- When selecting a folder for a recording or timer, it is now possible to open a folder
even if it doesn't contain any subfolders.
Recordings:
- Recordings now have unique ids instead of numbers, which remain valid as long as
this instance of VDR is running. This means that recordings are no longer continuously
numbered from 1 to N in LSTR. There may be gaps in the sequence, in case recordings
have been deleted, and they are not necessarily listed in numeric order.
- Added detection of 24fps.
- The script that gets called for recordings is now also called right before a
recording is edited, with the first parameter being "editing".
- Implemented a frame parser for H.265 (HEVC) recordings.
- When moving recordings between volumes, the "Recordings" menu now displays those items
that have not yet been moved completely as non-selectable. This avoids situations
where trying to play such a recording might fail.
- When moving a recording to a different folder, the cursor is no longer placed on the
new location of the recording, but rather stays in the original folder.
If the original folder got empty by moving away the last recording
it contained, the cursor is moved up until a non empty folder is found.
SVDRP:
- The SVDRP port now accepts multiple concurrent connections. You can now keep an
SVDRP connection open as long as you wish, without preventing others from
connecting. Note, though, that SVDRP connections still get closed automatically
if there has been no activity for 300 seconds (configurable via
"Setup/Miscellaneous/SVDRP timeout (s)").
- The SVDRP log messages have been unified and now always contain the IP and port
number of the remote host.
- SVDRP connections are now handled in a separate "SVDRP server handler" thread,
which makes them more responsive. Note that there is only one thread that handles
all concurrent SVDRP connections. That way each SVDRP command is guaranteed to be
processed separately, without interfering with any other SVDRP commands that might
be issued at the same time. Plugins that implement SVDRP commands may need to take
care of proper locking if the commands access global data.
- You can now set DumpSVDRPDataTransfer in svdrp.c to true to have all SVDRP
communication printed to the console for debugging.
- The SVDRP commands that deal with timers (DELT, LSTT, MODT, NEWT, NEXT and UPDT)
as well as any log messages that refer to timers, now use a unique id for each
timer, which remains valid as long as this instance of VDR is running. This means
that timers are no longer continuously numbered from 1 to N in LSTT. There may be
gaps in the sequence, in case timers have been deleted.
- All timer related response strings from SVDRP commands now use the channel ID
instead of channel numbers.
- The SVDRP command DELT no longer checks whether the timer that shall be deleted
is currently recording.
- The SVDRP command DELC now refuses to delete the very last channel in the list,
to avoid ending up with an empty channel list.
- The SVDRP commands that deal with recordings (DELR, EDIT, LSTR, MOVR, and PLAY)
now use a unique id for each recording, which remains valid as long as this
instance of VDR is running. This means that recordings are no longer continuously
numbered from 1 to N in LSTR. There may be gaps in the sequence, in case recordings
have been deleted, and they are not necessarily listed in numeric order.
- Changed 'number' to 'id' in the help texts of SVDRP commands that deal with
timers.
- The SVDRP command LSTC can now list the channels with channel ids if the option
':ids' is given.
- If 0 is given as the channel number in the SVDRP command LSTC, the data of the
current channel is listed.
- The new SVDRP commands 'LSTD' and 'PRIM' can be used to list all available devices
and to switch the primary device.
Misc:
- Added a section about Output Devices to the INSTALL file.
- The -u option now also accepts a numerical user id.
- The cRwLock class now allows nested read locks within a write lock from the
same thread. This fixes possible crashes when moving or deleting channels in
the menu or through SVDRP (as well as other operations that try to acquire a
read lock within a write lock).
- Added support for the systemd watchdog.
- PIDs can now be added to and deleted from a cReceiver while it is attached to
a cDevice, without having to detach it first and re-attach it afterwards.
- Log messages about switching channels now include the channel ID.
- The constructor of cHash (via cHashBase) now has an additional parameter (OwnObjects)
which, if set to true, makes the hash take ownership of the hashed objects, so that
they are deleted when the hash is cleared or destroyed.
- cListObject now implements a private copy constructor and assignment operator, to keep
derived objects from calling them implicitly.
- The Makefiles have been modified so that during the build process they no longer
display the actual (lengthy) commands, but rather just the name of the file that
is being built, as in
CC vdr.o
The first two characters indicate the kind of operation (CC=compile, LD=link,
AR=archive, MO=msgfmt, GT=xgettext, PO=msgmerge, IN=install).
This way it is much easier to spot error messages and warnings, since they are not
buried under tons of text.
Add VERBOSE=1 to the 'make' call in the VDR source directory to see the
actual commands that are executed.
Plugin authors should modify their makefiles accordingly, by simply preceding
the respective commands with '$(Q)' and inserting '@echo XX $@' (where XX is one
of the character combinations listed above) before the command.
The newplugin script has also been modified accordingly.
Note that if you build a plugin directly in the plugin's own source directory,
the $(Q) macro won't be defined and commands will be displayed. You can add
Q=@ to the make call to have it less verbose (provided the plugin's Makefile
was modified as described above).
- Added backtrace functions for debugging (see cBackTrace in thread.h).
- Added checking the correct sequence of locking global lists.
At the first occurrence of an invalid locking
sequence, the 20 most recent locks will be written to the log file, followed by a
backtrace that led to the call in question. This code can be activated by defining
the macro DEBUG_LOCKSEQ in thread.c (which is on by default).
When debugging an actual invalid locking sequence, you can additionally define
the macro DEBUG_LOCKCALL in thread.c, which will add information about the caller
of each lock. Note that this may cause some stress on the CPU, therefore it is off
by default.
- The file Make.config.template now reacts on DEBUG=1 in the 'make' command line,
and disables code optimizations by setting -O0.
This can be helpful when backtracing highly optimized code. You may want to
'make distclean' before running 'make' with a modified setting of DEBUG, to make
sure all object files are newly compiled.
- Introduced the new macro DISABLE_TEMPLATES_COLLIDING_WITH_STL, which can be defined
before including tools.h in case some plugin needs to use the STL and gets error
messages regarding one of the template functions defined in tools.h.
- The macros used to control deprecated code or functions have been changed to hold
numeric values (0 and 1), so that they can be controlled at compile time, without
having to edit the actual source code.
- The default for DEPRECATED_VDR_CHARSET_OVERRIDE has been set to 0, which means VDR
no longer reacts on the environment variable VDR_CHARSET_OVERRIDE. You can add
'DEPRECATED_VDR_CHARSET_OVERRIDE=1' when compiling in order to restore this
functionality. However, it is recommended to use the command line option --chartab
instead.
- Disabled the use of posix_fadvise() when reading (i.e. replaying), since it caused
stuttering replay in fast forward and fast rewind mode in case the video directory
is mounted via NFS. You can re-enable it by setting the macro USE_FADVISE_READ to 1
in tools.c.

119
UPDATE-2.6.0 Normal file
View File

@ -0,0 +1,119 @@
This is a summary of the changes in VDR 2.6.0 since the last stable
version 2.4.0. It only contains things that are of actual importance
to the user and doesn't mention the many fixes and improvements that
have been made "behind the scenes".
See the file HISTORY for a detailed list of all changes.
Timers:
- Implemented "Pattern Timers" (see MANUAL, vdr.1 and vdr.5 for details).
- The margins for timer recordings are now always limited to the duration of the
previous and next event.
- Spawned timers that don't use VPS now automatically adjust their start/stop times
to changes in the respective event's times.
EPG:
- Events in the past are no longer marked as having a timer in the Schedules
menu.
- Improved handling EPG data from the EIT tables:
+ Table 0x4F is now completely ignored.
+ Once a schedule has seen events from 0x5X, tables 0x6X are ignored for that
schedule.
+ When looking up an event in its schedule, the start time is used for tables 0x6X, and the
event id for tables 0x4E and 0x5X.
+ When hashing events by event id or start time, existing older entries in the hash
tables are now deleted before entering the new ones.
+ The function cSchedule::GetEvent() is now deprecated and may be removed in a future
version. Use GetEventById() and GetEventByTime() instead.
+ On channels that use proper event ids a change of the start time no longer
causes a new event to be created, but rather modifies the existing one. This
avoids possible interruptions in VPS recordings in case the event's start time
is changed while the recording is already going on.
- Fixed the timer indicator in the Schedule menu in case an event is already over, but the
timer is still recording.
- Fixed unlocking vs. call to EpgHandlers.EndSegmentTransfer().
Devices:
- Increased the number of possible modulation systems in cDevice::GetDevice().
- Improved cSectionSyncer to make sure that no sections are missed, and to allow
handling partially used segments (as in the EIT) and processing sections in random
order. Segment syncing is now done with the two member functions Check() and
Processed(). The old functions Sync() and Repeat() are deprecated and may be
removed in a future version. See the comments in filter.h for a description on
how to use these new function.
- Added a device hook for detecting whether a device provides EIT data.
Recordings:
- Made the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public.
- Fixed setting the 'title' of a recording's info to the recording's name if there
is no info file (the change in version 1.7.28 broke the fallback to the old 'summary.vdr').
- Added some missing user command calls for copying, renaming and moving recordings.
- Recordings are now checked for errors:
+ On TS level, the continuity counter, transport error indicator and scramble flags are
checked.
+ On frame level it is checked whether there are no gaps in the PTS.
+ The number of errors during a recording is stored in the recording's 'info' file, with
the new tag 'O'.
+ Spawned timers that shall avoid recording reruns only store the recording's name in
the donerecs,data file if there were no errors during recording, and if the timer has
actually finished.
- The Recordings menu now marks recordings with errors with an exclamation mark ('!'),
and the number of errors (if any) is displayed in the recording's Info menu.
Replay:
- Fixed scaling subtitles with anti-aliasing.
Conditional Access:
- Decreased the scrambling timeout for CAMs known to decrypt a certain channel, so
that it won't collide with MAXBROKENTIMEOUT in recorder.c.
Skins:
- The new functions cTimer::Start/StopTimeEvent() are now used in the LCARS skin to display
the start/stop times of timers in the main menu.
SVDRP:
- The SVDRP command DELC now also accepts a channel id.
Misc:
- Added support for HEVC-video and AC-4-audio.
- EXPIRELATENCY now only applies to VPS timers.
- Removed the macros __STL_CONFIG_H, _STL_ALGOBASE_H and _MOVE_H from tools.h. If your
plugin insists in using "using namespace std;" you can still define
DISABLE_TEMPLATES_COLLIDING_WITH_STL before including any VDR header files.
- The cFile class has been partially deprecated:
+ The handling of file handles was not thread-safe.
+ It was only actually used in svdrp.c.
+ cFile::Ready() now processes only its own file descriptor by calling FileReady()
instead of AnyFileReady().
- The transponder value of channels is now cached, because cChannel::Transponder(void)
is called very often.
- Added code for the 'qad' audio track.
- The 'Edit path' dialog now also shows the total size of all recordings in that path.
- The macro DEPRECATED_VDR_CHARSET_OVERRIDE and the related code has been removed.
- The default for DEPRECATED_SETCURRENTCHANNEL has been set to 0, which means that
the function SetCurrentChannel(const cChannel *Channel) is no longer available.
You can add 'DEPRECATED_SETCURRENTCHANNEL=1' when compiling in order to restore this
functionality. However, it is recommended to use SetCurrentChannel(int ChannelNumber)
instead.
- The macro DEPRECATED_GETBITMAP and the related code has been removed.
- The default for DEPRECATED_SKIN_SETITEMEVENT has been set to 0, which means that
the function cSkinDisplayMenu::SetItemEvent() without the TimerActive parameter is
no longer available. You can add 'DEPRECATED_SKIN_SETITEMEVENT=1' when compiling in
order to restore this functionality. However, it is recommended to use the function
with the TimerActive parameter instead.
- Now using __cplusplus instead of DISABLE_TEMPLATES_COLLIDING_WITH_STL, and using
std::min(), std::max() and std::swap() if available.
- No longer permanently looping through PMT PIDs, which caused problems with some
SatIP receivers.
- Replaced all umlauts in the example channels.conf with their ae, oe, ue substitutes
to avoid problems on UTF-8 systems.
- Added missing '0x09=H.265 video, 0x19 = AC4 audio' to vdr.5.

29
camresponses.conf Normal file
View File

@ -0,0 +1,29 @@
# CAM responses for VDR
#
# Format:
#
# nr text action
#
# nr: the number of the CAM this action applies to (0 = all CAMs)
# text: the text in the CAM menu to react on (must be quoted with '"' if it contains
# blanks, escape '"' with '\')
# action: the action to take if the given text is encountered
#
# Possible actions are:
#
# - DISCARD: simply discard the menu (equivalent to pressing 'Back' on the RC)
# - CONFIRM: confirm the menu (equivalent to pressing 'OK' without selecting a
# particular item)
# - SELECT: select the menu item containing the text (equivalent to positioning
# the cursor on the item and pressing 'OK')
# - <number>: the given number is sent to the CAM as if it were typed in by the user
# (provided this is an input field).
#
# Note that the text given in a rule must match exactly, including any leading or
# trailing blanks. If in doubt, you can get the exact text from the log file.
# Action keywords are case insensitive.
#
# Examples:
# * "Hello! This is your annoying \"nag\" message!" DISCARD
# 3 "Please enter your PIN" 1234

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: channels.c 4.3 2015/09/09 10:21:22 kls Exp $
* $Id: channels.c 5.3 2024/03/02 16:21:16 kls Exp $
*/
#include "channels.h"
@ -97,18 +97,32 @@ cChannel& cChannel::operator= (const cChannel &Channel)
provider = strcpyrealloc(provider, Channel.provider);
portalName = strcpyrealloc(portalName, Channel.portalName);
memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__);
nameSource = NULL; // these will be recalculated automatically
shortNameSource = NULL;
UpdateNameSource();
parameters = Channel.parameters;
return *this;
}
void cChannel::UpdateNameSource(void)
{
if (Setup.ShowChannelNamesWithSource == 0) {
nameSource = NULL;
shortNameSource = NULL;
return;
}
if (Setup.ShowChannelNamesWithSource == 1)
nameSource = cString::sprintf("%s (%c)", name, cSource::ToChar(source));
else
nameSource = cString::sprintf("%s (%s)", name, *cSource::ToString(source));
shortNameSource = cString::sprintf("%s (%c)", shortName, cSource::ToChar(source));
}
const char *cChannel::Name(void) const
{
if (Setup.ShowChannelNamesWithSource && !groupSep) {
if (isempty(nameSource))
nameSource = cString::sprintf("%s (%c)", name, cSource::ToChar(source));
return nameSource;
if (!isempty(nameSource))
return nameSource;
}
return name;
}
@ -118,9 +132,8 @@ const char *cChannel::ShortName(bool OrName) const
if (OrName && isempty(shortName))
return Name();
if (Setup.ShowChannelNamesWithSource && !groupSep) {
if (isempty(shortNameSource))
shortNameSource = cString::sprintf("%s (%c)", shortName, cSource::ToChar(source));
return shortNameSource;
if (!isempty(shortNameSource))
return shortNameSource;
}
return shortName;
}
@ -140,15 +153,18 @@ int cChannel::Transponder(int Frequency, char Polarization)
int cChannel::Transponder(void) const
{
int tf = frequency;
while (tf > 20000)
tf /= 1000;
if (IsSat()) {
const char *p = strpbrk(parameters, "HVLRhvlr"); // lowercase for backwards compatibility
if (p)
tf = Transponder(tf, *p);
if (!transponder) {
int tf = frequency;
while (tf > 20000)
tf /= 1000;
if (IsSat()) {
const char *p = strpbrk(parameters, "HVLRhvlr"); // lowercase for backwards compatibility
if (p)
tf = Transponder(tf, *p);
}
transponder = tf;
}
return tf;
return transponder;
}
int cChannel::Modification(int Mask) const
@ -162,6 +178,7 @@ void cChannel::CopyTransponderData(const cChannel *Channel)
{
if (Channel) {
frequency = Channel->frequency;
transponder = Channel->transponder;
source = Channel->source;
srate = Channel->srate;
parameters = Channel->parameters;
@ -190,11 +207,11 @@ bool cChannel::SetTransponderData(int Source, int Frequency, int Srate, const ch
cString OldTransponderData = TransponderDataToString();
source = Source;
frequency = Frequency;
transponder = 0;
srate = Srate;
parameters = Parameters;
schedule = NULL;
nameSource = NULL;
shortNameSource = NULL;
UpdateNameSource();
if (Number() && !Quiet) {
dsyslog("changing transponder data of channel %d (%s) from %s to %s", Number(), name, *OldTransponderData, *TransponderDataToString());
modification |= CHANNELMOD_TRANSP;
@ -259,14 +276,12 @@ bool cChannel::SetName(const char *Name, const char *ShortName, const char *Prov
dsyslog("changing name of channel %d from '%s,%s;%s' to '%s,%s;%s'", Number(), name, shortName, provider, Name, ShortName, Provider);
modification |= CHANNELMOD_NAME;
}
if (nn) {
if (nn)
name = strcpyrealloc(name, Name);
nameSource = NULL;
}
if (ns) {
if (ns)
shortName = strcpyrealloc(shortName, ShortName);
shortNameSource = NULL;
}
if (nn || ns)
UpdateNameSource();
if (np)
provider = strcpyrealloc(provider, Provider);
return true;
@ -648,6 +663,7 @@ bool cChannel::Parse(const char *s)
if (parambuf && sourcebuf && vpidbuf && apidbuf) {
parameters = parambuf;
ok = (source = cSource::FromString(sourcebuf)) >= 0;
transponder = 0;
char *p;
if ((p = strchr(vpidbuf, '=')) != NULL) {
@ -791,8 +807,7 @@ bool cChannel::Parse(const char *s)
free(tpidbuf);
free(caidbuf);
free(namebuf);
nameSource = NULL;
shortNameSource = NULL;
UpdateNameSource();
if (!GetChannelID().Valid()) {
esyslog("ERROR: channel data results in invalid ID!");
return false;
@ -833,7 +848,7 @@ int cChannels::maxChannelNameLength = 0;
int cChannels::maxShortChannelNameLength = 0;
cChannels::cChannels(void)
:cConfig<cChannel>("Channels")
:cConfig<cChannel>("2 Channels")
{
modifiedByUser = 0;
}
@ -938,6 +953,25 @@ void cChannels::ReNumber(void)
}
}
bool cChannels::MoveNeedsDecrement(cChannel *From, cChannel *To)
{
int Number = From->Number();
if (Number < To->Number()) {
for (cChannel *Channel = Next(From); Channel; Channel = Next(Channel)) {
if (Channel == To)
break;
if (Channel->GroupSep()) {
if (Channel->Number() > Number)
Number = Channel->Number();
}
else
Number++;
}
return Number == To->Number();
}
return false;
}
void cChannels::Del(cChannel *Channel)
{
UnhashChannel(Channel);
@ -1093,8 +1127,8 @@ bool cChannels::MarkObsoleteChannels(int Source, int Nid, int Tid)
bool ChannelsModified = false;
for (cChannel *Channel = First(); Channel; Channel = Next(Channel)) {
if (time(NULL) - Channel->Seen() > CHANNELTIMEOBSOLETE && Channel->Source() == Source && Channel->Nid() == Nid && Channel->Tid() == Tid && Channel->Rid() == 0) {
bool OldShowChannelNamesWithSource = Setup.ShowChannelNamesWithSource;
Setup.ShowChannelNamesWithSource = false;
int OldShowChannelNamesWithSource = Setup.ShowChannelNamesWithSource;
Setup.ShowChannelNamesWithSource = 0;
if (!endswith(Channel->Name(), CHANNELMARKOBSOLETE))
ChannelsModified |= Channel->SetName(cString::sprintf("%s %s", Channel->Name(), CHANNELMARKOBSOLETE), Channel->ShortName(), cString::sprintf("%s %s", CHANNELMARKOBSOLETE, Channel->Provider()));
Setup.ShowChannelNamesWithSource = OldShowChannelNamesWithSource;

View File

@ -1,85 +1,162 @@
RTL Television,RTL;RTL World:12187:HC34M2S0:S19.2E:27500:163=2:104=deu@3;106=deu@106:105;110=deu:0:12003:1:1089:0
RTL Television,RTL;CBC:12187:HC34M2S0:S19.2E:27500:163=2:104=deu@3;106=deu@106:105;110=deu:0:12003:1:1089:0
SAT.1;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:255=2:256=deu@3;259=deu@106:32:0:17500:1:1107:0
ProSieben;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:511=2:512=deu@3;515=deu@106:33:0:17501:1:1107:0
RTL2;RTL World:12187:HC34M2S0:S19.2E:27500:166=2:128=deu@3:68:0:12020:1:1089:0
RTL2;CBC:12187:HC34M2S0:S19.2E:27500:166=2:128=deu@3:68;75=deu:0:12020:1:1089:0
:ARD und ZDF
Das Erste HD;ARD:11493:HC23M5O35P0S1:S19.2E:22000:5101=27:5102=deu@3,5103=mis@3;5106=deu@106:5104;5105=deu:0:10301:1:1019:0
ZDF HD;ZDFvision:11362:HC23M5O35P0S1:S19.2E:22000:6110=27:6120=deu@3,6121=mis@3,6123=mul@3;6122=deu@106:6130;6131=deu:0:11110:1:1011:0
BR Süd HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5201=27:5202=deu@3,5203=mis@3;5206=deu@106:5204:0:10325:1:1025:0
hr-fernsehen;ARD:11836:HC34M2S0:S19.2E:27500:301=2:302=deu@3,303=mis@3:304:0:28108:1:1101:0
NDR FS MV HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5221=27:5222=deu@3,5223=mis@3;5226=deu@106:5224;5225=deu:0:10328:1:1025:0
SR Fernsehen;ARD:12265:HC34M2S0:S19.2E:27500:1301=2:1302=deu@3,1303=mis@3:1304:0:28486:1:1093:0
WDR HD Köln;ARD:12422:HC34M2S0:S19.2E:27500:5501=27:5502=deu@3,5503=mis@3;5506=deu@106:5504:0:28325:1:1201:0
:Dritte Programme
BR Fernsehen Sued HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5201=27:5202=deu@3,5203=mis@3;5206=deu@106:5204;5205=deu:0:10325:1:1025:0
hr-fernsehen HD;ARD:10891:HC23M5O35P0S1:S19.2E:22000:5351=27:5352=deu@3,5353=mis@3;5356=deu@106:5354;5355=deu:0:10355:1:1061:0
NDR FS NDS HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5221=27:5222=deu@3,5223=mis@3;5226=deu@106:5224;5225=deu:0:10327:1:1025:0
WDR HD Koeln;ARD:12422:HC34M2S0:S19.2E:27500:5501=27:5502=deu@3,5503=mis@3;5506=deu@106:5504;5505=deu:0:28325:1:1201:0
SWR BW HD;ARD:11493:HC23M5O35P0S1:S19.2E:22000:5121=27:5122=deu@3,5123=mis@3;5126=deu@106:5124;5125=deu:0:10303:1:1019:0
rbb Berlin;ARD:12109:HC34M2S0:S19.2E:27500:601=2:602=deu@3,603=mis@3:604:0:28206:1:1073:0
rbb Berlin HD;ARD:10891:HC23M5O35P0S1:S19.2E:22000:5311=27:5312=deu@3,5313=mis@3;5316=deu@106:5314;5315=deu:0:10351:1:1061:0
MDR Sachsen HD;ARD:10891:HC23M5O35P0S1:S19.2E:22000:5331=27:5332=deu@3,5333=mis@3;5336=deu@106:5334;5335=deu:0:10352:1:1061:0
PHOENIX HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5261=27:5262=deu@3,5263=mul@3:5264:0:10331:1:1025:0
BR-alpha;ARD:12265:HC34M2S0:S19.2E:27500:1401=2:1402=deu@3,1403=mis@3;1406=deu@106:1404:0:28487:1:1093:0
ARD-alpha;ARD:12265:HC34M2S0:S19.2E:27500:1401=2:1402=deu@3,1403=mis@3;1406=deu@106:1404;1405=deu:0:28487:1:1093:0
3sat HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6510=27:6520=deu@3,6521=mis@3,6523=mul@3;6522=deu@106:6530;6531=deu:0:11150:1:1010:0
arte HD;ARD:11493:HC23M5O35P0S1:S19.2E:22000:5111=27:5112=deu@3,5113=fra@3;5116=deu@106:5114;5115=deu,5118=fra:0:10302:1:1019:0
MDR Sachsen;ARD:12109:HC34M2S0:S19.2E:27500:2901=2:2902=deu@3,2903=mis@3:2904:0:28228:1:1073:0
ServusTV HD Oesterreich;ServusTV:11303:HC23M5O35P0S1:S19.2E:22000:3583=27:3584=deu@4,3585=eng@4;3586=deu@122,3587=deu@106:3588:0:4913:1:1007:0
N24;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1023=2:1024=deu@3:35:0:17503:1:1107:0
Das Erste;ARD:11836:HC34M2S0:S19.2E:27500:101=2:102=deu@3,103=mis@3;106=deu@106:104;105=deu:0:28106:1:1101:0
Bayerisches FS Süd;ARD:11836:HC34M2S0:S19.2E:27500:201=2:202=deu@3,203=mis@3;206=deu@106:204:0:28107:1:1101:0
NDR FS MV;ARD:12109:HC34M2S0:S19.2E:27500:2601=2:2602=deu@3,2603=mis@3:2604:0:28224:1:1073:0
WDR Köln;ARD:11836:HC34M2S0:S19.2E:27500:601=2:602=deu@3,603=mis@3:604:0:28111:1:1101:0
SWR Fernsehen BW;ARD:11836:HC34M2S0:S19.2E:27500:801=2:802=deu@3,803=mis@3;806=deu@106:804:0:28113:1:1101:0
PHOENIX;ARD:10744:HC56M2S0:S19.2E:22000:501=2:502=deu@3,503=mul@3:504:0:28725:1:1051:0
ZDF;ZDFvision:11953:HC34M2S0:S19.2E:27500:110=2:120=deu@3,121=mis@3,122=mul@3;125=deu@106:130;131=deu:0:28006:1:1079:0
3sat;ZDFvision:11953:HC34M2S0:S19.2E:27500:210=2:220=deu@3,221=mis@3,222=mul@3;225=deu@106:230;231=deu:0:28007:1:1079:0
KiKA HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6610=27:6620=deu@3,6621=mis@3;6622=deu@106:6630:0:11160:1:1010:0
KiKA;ZDFvision:11953:HC34M2S0:S19.2E:27500:310=2:320=deu@3,321=mis@3;325=deu@106:330:0:28008:1:1079:0
arte;ARD:10744:HC56M2S0:S19.2E:22000:401=2:402=deu@3,403=fra@3:404:0:28724:1:1051:0
ORF1 HD;ORF:11303:HC23M5O35P0S1:S19.2E:22000:1920=27:1921=deu@4,1922=eng@4;1923=deu@106:1925:D05,D95,648,1702,1833,9C4,98C:4911:1:1007:0
ORF1;ORF:12692:HC56M2S0:S19.2E:22000:160=2:161=deu@3;163=deu@106:165:D05,D95,648,1702,1833,9C4,98C:13001:1:1117:0
ORF2 HD;ORF:11303:HC23M5O35P0S1:S19.2E:22000:2920=27:2921=deu@4,2922=eng@4;2923=deu@106:2925:D05,D95,648,1702,1833,9C4,98C:4912:1:1007:0
ORF2;ORF:12692:HC56M2S0:S19.2E:22000:500=2:501=deu@3;503=deu@106:505:D95,D05,648,1702,1833,9C4,98C:13002:1:1117:0
ZDFinfo HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6710=27:6720=deu@3,6721=mis@3,6723=mul@3;6722=deu@106:6730:0:11170:1:1010:0
ZDFinfo;ZDFvision:11953:HC34M2S0:S19.2E:27500:610=2:620=deu@3,621=mis@3,622=mul@3;625=deu@106:630:0:28011:1:1079:0
CNN Int.;CNN:11778:VC34M2S0:S19.2E:27500:165=2:100=eng@3:0:0:28522:1:1068:0
SUPER RTL;RTL World:12187:HC34M2S0:S19.2E:27500:165=2:120=deu@3:65:0:12040:1:1089:0
VOX;RTL World:12187:HC34M2S0:S19.2E:27500:167=2:136=deu@3:71;74=deu:0:12060:1:1089:0
kabel eins;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:767=2:768=deu@3:34:0:17502:1:1107:0
DAS VIERTE,D VIERTE;BetaDigital:12460:HC34M2S0:S19.2E:27500:2047=2:2048=deu@3:36:0:1793:133:5:0
BBC FOUR;BSkyB:10802:HC56M2S0:S28.2E:22000:5600=2:5601=eng@3,5602=NAR@3:5603;5604=eng:0:6416:2:2047:0
BBC HD;BSkyB:10847:vC56M2O0S1:S28.5E:23000:5500=27:5502=NAR@3;5501=eng@106:5503;5504=eng:0:6940:2:2050:0
BBC One HD;BSkyB:10847:VC23M5O25P0S1:S28.2E:23000:5400=27:5402=NAR@3;5401=eng@106:5403;5404=eng:0:6941:2:2050:0
SAT.1 Gold;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1279=2:1280=deu@3:36:0:17504:1:1107:0
arte HD;ARD:11493:HC23M5O35P0S1:S19.2E:22000:5111=27:5112=deu@3,5113=fra@3,5117=mis@3;5116=mul@106:5114;5115=deu,5118=fra,5119=deu:0:10302:1:1019:0
zdf_neo HD;ZDFvision:11362:HC23M5O35P0S1:S19.2E:22000:6310=27:6320=deu@3,6321=mis@3,6323=mul@3;6322=deu@106:6330;6331=deu:0:11130:1:1011:0
ZDFinfo HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6710=27:6720=deu@3,6721=mis@3,6723=mul@3;6722=deu@106:6730;6731=deu:0:11170:1:1010:0
ONE HD;ARD:11052:HC23M5O35P0S1:S19.2E:22000:5411=27:5412=deu@3,5413=mis@3;5416=deu@106:5414;5415=deu:0:10376:1:1039:0
KiKA HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6610=27:6620=deu@3,6621=mis@3;6622=deu@106:6630;6631=deu:0:11160:1:1010:0
:Regionalprogramme
Niederbayern;MB Satellite:11523:HC56M2S0:S19.2E:22000:2559=2:2560=deu@3:0:0:4609:1:1021:0
Franken Fernsehen;MB Satellite:11523:HC56M2S0:S19.2E:22000:511=2:512=deu@3:0:0:4601:1:1021:0
muenchen.tv;MB Satellite:11523:HC56M2S0:S19.2E:22000:1279=2:1280=deu@3:0:0:4604:1:1021:0
Mainfranken;MB Satellite:11523:HC56M2S0:S19.2E:22000:1791=2:1792=deu@3:0:0:4606:1:1021:0
TV Oberfranken;MB Satellite:11523:HC56M2S0:S19.2E:22000:2047=2:2048=deu@3:0:0:4607:1:1021:0
TVA-OTV;MB Satellite:11523:HC56M2S0:S19.2E:22000:2303=2:2304=deu@3:0:0:4608:1:1021:0
a.tv;MB Satellite:11523:HC56M2S0:S19.2E:22000:255=2:256=deu@3:0:0:4600:1:1021:0
BR Fernsehen Nord HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5201=27:5202=deu@3,5203=mis@3;5206=deu@106:5204;5205=deu:0:10326:1:1025:0
rbb Brandenburg HD;ARD:10891:HC23M5O35P0S1:S19.2E:22000:5311=27:5312=deu@3,5313=mis@3;5316=deu@106:5314;5315=deu:0:10350:1:1061:0
SR Fernsehen HD;ARD:11052:HC23M5O35P0S1:S19.2E:22000:5431=27:5432=deu@3,5433=mis@3;5436=deu@106:5434;5435=deu:0:10378:1:1039:0
Radio Bremen TV;ARD:12421:HC34M2S0:S19.2E:27500:1201=2:1202=deu@3:1204:0:28385:1:1201:0
:Oesterreichisches Fernsehen
ORF1 HD;ORF:11303:HC23M5O35P0S1:S19.2E:22000:1920=27:0;1921=deu@106,1922=mis@106:1925:648,650,D95,D98,6E2,500,9C4,98C:4911:1:1007:0
ORF2W HD;ORF:11303:HC23M5O35P0S1:S19.2E:22000:2920=27:0;2921=deu@106,2922=mis@106:2925:648,650,D95,D98,6E2,500,9C4,98C:4912:1:1007:0
ORF III;ORF:12662:HC56M2S0:S19.2E:22000:1010=2:1011=deu@4:1013:648,650,D95,D98,9C4,98C:13101:1:1115:0
ServusTV HD Oesterreich;ServusTV:11303:HC23M5O35P0S1:S19.2E:22000:3583=27:3584=deu@4,3585=eng@4;3587=deu@106:3588:648,650,D95,D98,9C4,98C,6E2,500:4913:1:1007:0
ServusTV HD Deutschland;ServusTV:11303:HC23M5O35P0S1:S19.2E:22000:4920=27:4921=deu@4,4922=eng@4;4924=deu@106:4925:0:4914:1:1007:0
ATV;ATV+:12692:HC56M2S0:S19.2E:22000:506=2:507=deu@3:509:648,650,D95,D98,9C4,98C:13012:1:1117:0
ORF SPORT+;ORF:11243:HC56M2S0:S19.2E:22000:2210=2:2211=deu@3,2212=mis@3:2215:648,650,D95,D98,9C4,98C:13221:1:1003:0
PULS 4 Austria;ProSiebenSat.1:12051:VC34M2S0:S19.2E:27500:1791=2:1792=deu@3:39:9C4,98C,D95,648,D98,650,500,6E2,98D:20007:1:1082:0
:Nachrichten
tagesschau24 HD;ARD:11052:HC23M5O35P0S1:S19.2E:22000:5401=27:5402=deu@3,5403=mis@3;5406=deu@106:5404:0:10375:1:1039:0
n-tv;CBC:12187:HC34M2S0:S19.2E:27500:169=2:73=deu@3,77=mul@3:80:0:12090:1:1089:0
WELT;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1023=2:1024=deu@3:35:0:17503:1:1107:0
N24 DOKU;BetaDigital:12460:HC34M2S0:S19.2E:27500:511=2:512=deu@3:34:0:48:133:5:0
CNN Int.;Harmonic:11626:VC56M2S0:S19.2E:22000:165=2:100=eng@3:0:0:4422:1:1028:0
EURONEWS FRENCH SD;Globecast:12226:HC34M2S0:S19.2E:27500:2432=2:2435=fra@3:0:0:31220:1:1091:0
Bloomberg Europe TV;Bloomberg TV:11597:VC56M2S0:S19.2E:22000:1360=2:1320=eng@3:0:0:10067:1:1026:0
CNBC Europe;CNBC:11597:VC56M2S0:S19.2E:22000:307=2:308=eng@3:0:0:10030:1:1026:0
Russia Today;GLOBECAST:11538:VC56M2S0:S19.2E:22000:604=2:624=eng@3:0:0:6904:1:1022:0
Sky News Intl;SES ASTRA:12604:HC56M2S0:S19.2E:22000:1290=2:2290=eng@3:1750:0:7290:1:1111:0
Al Jazeera English;Al Jazeera:11626:VC56M2S0:S19.2E:22000:3505=2:3625=eng@3:0:0:4440:1:1028:0
Al Jazeera Channel;GLOBECAST:11508:VC56M2S0:S19.2E:22000:709=2:729=ara@3:0:0:7009:1:1020:0
:Sport
SPORT1;BetaDigital:12480:VC34M2S0:S19.2E:27500:1023=2:1024=deu@3:39:0:900:133:33:0
HSE24,HSE24;BetaDigital:12480:VC34M2S0:S19.2E:27500:1279=2:1280=deu@3:37:0:40:133:33:0
Bloomberg Europe TV;Arqiva:11597:VC56M2S0:S19.2E:22000:1360=2:1320=eng@4:37:0:10067:1:1026:0
NRJ 12;CSAT:11817:VC34M2S0:S19.2E:27500:163=2:92=fra@4;93=fra@106:41:1811,1812,500,1863,100:8004:1:1070:0
rbb Brandenburg;ARD:12109:HC34M2S0:S19.2E:27500:601=2:602=deu@3,603=mis@3:604:0:28205:1:1073:0
Sky News Intl;SES ASTRA:12604:HC56M2S0:S19.2E:22000:1290=2:2290=@4:0:0:7290:1:1111:0
Veronica/DisneyXD;CANALDIGITAAL:12574:HC56M2O0S0:S19.2E:22000:0:0:0:622:5020:53:1109:0
Test;CANALDIGITAAL:12574:HC56M2O0S0:S19.2E:22000:522+8190=2:97=dut@4:40:100:5025:53:1109:0
n-tv;RTL World:12187:HC34M2S0:S19.2E:27500:169=2:73=deu@3:80:0:12090:1:1089:0
Al Jazeera Channel;GlobeCast:11508:VC56M2S0:S19.2E:22000:709=2:729=ara@3:0:0:7009:1:1020:0
ORF III;ORF:12662:HC56M2S0:S19.2E:22000:1010=2:1011=deu@4:1013:D95,648,D05,9C4,1702,1833,98C:13101:1:1115:0
Eurosport HD,EurospHD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:1535=27:0;1539=deu@106:32:1833,9C4,9AF,98C:132:133:6:0
Eurosport Deutschland;SES Astra:12226:HC34M2S0:S19.2E:27500:101=2:103=deu@4:102:0:31200:1:1091:0
tagesschau24;ARD:10744:HC56M2S0:S19.2E:22000:101=2:102=deu@3:0:0:28721:1:1051:0
Einsfestival HD;ARD:12422:HC34M2S0:S19.2E:27500:1601=27:1602=deu@3;1606=deu@106:1604:0:28396:1:1201:0
Einsfestival;ARD:10744:HC56M2S0:S19.2E:22000:201=2:202=deu@3,203=mis@3;206=deu@106:204:0:28722:1:1051:0
EinsPlus;ARD:10744:HC56M2S0:S19.2E:22000:301=2:302=deu@3,303=mis@3;306=deu@106:304:0:28723:1:1051:0
zdf.kultur HD;ZDFvision:11362:HC23M5O35P0S1:S19.2E:22000:6410=27:6420=deu@3,6421=mis@3,6423=mul@3;6422=deu@106:6430:0:11140:1:1011:0
zdf.kultur;ZDFvision:11953:HC34M2S0:S19.2E:27500:1110=2:1120=deu@3,1121=mis@3,1122=mul@3;1125=deu@106:1130:0:28016:1:1079:0
zdf_neo HD;ZDFvision:11362:HC23M5O35P0S1:S19.2E:22000:6310=27:6320=deu@3,6321=mis@3,6323=mul@3;6322=deu@106:6330:0:11130:1:1011:0
zdf_neo;ZDFvision:11953:HC34M2S0:S19.2E:27500:660=2:670=deu@3,671=mis@3,672=mul@3;675=deu@106:680:0:28014:1:1079:0
Eurosport 1 Deutschland;SES Astra:12226:HC34M2S0:S19.2E:27500:101=2:103=deu@4:102:0:31200:1:1091:0
:Privatsender
RTLplus;CBC:12187:HC34M2S0:S19.2E:27500:168=2:137=deu@3:70:0:12080:1:1089:0
NITRO;CBC:12187:HC34M2S0:S19.2E:27500:173=2:146=deu@3:84;86=deu:0:12061:1:1089:0
SUPER RTL;CBC:12187:HC34M2S0:S19.2E:27500:165=2:120=deu@3:65;66=deu:0:12040:1:1089:0
SAT.1 Gold;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1279=2:1280=deu@3:36:0:17504:1:1107:0
Pro7 MAXX;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1535=2:1536=deu@3:37:0:17505:1:1107:0
kabel eins;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:767=2:768=deu@3:34:0:17502:1:1107:0
kabel eins Doku;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:2559=2:2560=deu@3:41:0:17509:1:1107:0
Family TV;BetaDigital:10920:HC78M2S0:S19.2E:22000:255=2:256=deu@3:0:0:33:133:15:0
Disney Channel;BetaDigital:12460:HC34M2S0:S19.2E:27500:2047=2:2048=deu@3;2051=deu@106:36:0:1793:133:5:0
TELE 5;BetaDigital:12480:VC34M2S0:S19.2E:27500:1535=2:1536=deu@3:38:0:51:133:33:0
VOX;CBC:12187:HC34M2S0:S19.2E:27500:167=2:136=deu@3:71;74=deu:0:12060:1:1089:0
SIXX;ProSiebenSat.1:12460:HC34M2S0:S19.2E:27500:767=2:768=deu@3:35:0:776:133:5:0
:Sky
Sky Cinema,Cinema;SKY:11797:HC34M2S0:S19.2E:27500:511=2:512=deu@3,513=eng@3;515=deu@106:32:1702,1722,1833,1834,1836,9C4,9C7,9AF,98C,1861:10:133:2:0
Sky Cinema +1,Cinema1;SKY:11797:HC34M2S0:S19.2E:27500:1791=2:1792=deu@3,1793=eng@3;1795=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:11:133:2:0
Sky Cinema +24,Cinema24;SKY:11797:HC34M2S0:S19.2E:27500:2303=2:2304=deu@3,2305=eng@3;2307=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:43:133:2:0
Sky Action,Action;SKY:11797:HC34M2S0:S19.2E:27500:767=2:768=deu@3,769=eng@3;771=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:9:133:2:0
Sky Comedy,Comedy;SKY:11797:HC34M2S0:S19.2E:27500:2559=2:2560=deu@3,2561=eng@3;2563=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:8:133:2:0
Sky Atlantic HD,AtlanticHD;SKY:11993:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106,1284=eng@106:32:1833,9C4,9AF,98C:110:133:13:0
Fox Serie,Fox;SKY:12070:HC34M2S0:S19.2E:27500:1279=2:1280=deu@3,1281=eng@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:16:133:1:0
History HD,HistHD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106:32:1833,9C4,9AF,98C:113:133:13:0
Sky Emotion,Emotion;SKY:11797:HC34M2S0:S19.2E:27500:2815=2:2816=deu@3,2817=eng@3;2819=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:20:133:2:0
Sky Nostalgie,Nostalgie;SKY:11719:HC34M2S0:S19.2E:27500:1535=2:1536=deu@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:516:133:3:0
Sky Hits,SkyHits;SKY:11719:HC34M2S0:S19.2E:27500:1023=2:1024=deu@3,1025=eng@3;1027=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:41:133:3:0
Discovery Channel,Discovery;SKY:12031:HC34M2S0:S19.2E:27500:3071=2:3072=deu@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:14:133:4:0
National Geographic,NatGeo;SKY:12031:HC34M2S0:S19.2E:27500:3327=2:3328=deu@3,3329=eng@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:13:133:4:0
Disney Channel,Disney;SKY:11758:HC34M2S0:S19.2E:27500:2559=2:2560=deu@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:34:133:17:0
TNT Serie,TNTSerie;SKY:12070:HC34M2S0:S19.2E:27500:2559=2:2560=deu@3,2561=eng@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:50:133:1:0
:@1000 New channels
DMAX;BetaDigital:12480:VC34M2S0:S19.2E:27500:3327=2:3328=deu@3:44:0:63:133:33:0
ANIXE HD;BetaDigital:10773:HC34M5O20P0S1:S19.2E:22000:255=27:0;259=deu@106:0:0:21100:1:1053:0
Nickelodeon;MTV Networks Europe:11973:VC34M2S0:S19.2E:27500:4101=2:4102=deu@4,4103=eng@4:4104:0:28680:1:1078:0
TOGGO plus;CBC:12187:HC34M2S0:S19.2E:27500:301=2:303=deu@3:0:0:12030:1:1089:0
Comedy Central/VIVA;MTV Networks Europe:11973:VC34M2S0:S19.2E:27500:4061=2:4062=@4:4064:0:28676:1:1078:0
DELUXE MUSIC,DELUXE;BetaDigital:12148:HC34M2S0:S19.2E:27500:3327=2:3328=deu@3:0:0:65:133:7:0
sonnenklar.TV HD;BetaDigital:12574:HC23M5O35P0S1:S19.2E:22000:255=27:0;259=deu@106:32:0:5400:1:1109:0
QVC Deutschland;SES ASTRA:12551:VC56M2S0:S19.2E:22000:165=2:166=deu@3:167:0:12100:1:1108:0
HSE24,HSE24;BetaDigital:12480:VC34M2S0:S19.2E:27500:1279=2:1280=deu@3:37:0:40:133:33:0
1-2-3.tv HD;BetaDigital:10802:HC34M5O35P0S1:S19.2E:22000:767=27:0;771=deu@106:34:0:5502:1:1055:0
Juwelo HD;BetaDigital:12574:HC23M5O35P0S1:S19.2E:22000:1023=27:1024=deu@3:0:0:5403:1:1109:0
:@100
:Sky HD
Sky Cinema HD,Sky Cinema HD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106,1284=eng@106:0:98C,9C4,9AF,98D:131:133:6:0
Sky Cinema +1 HD,Sky Cine1 HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:255=27:0;259=deu@106,260=eng@106:0:9C4,98C,9AF,98D:134:133:8:0
Sky Cinema +24 HD,Sky Cine24 HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:9C4,98C,9AF,98D:135:133:8:0
Sky Cinema Hits HD,Sky Hits HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106:0:9C4,98C,9AF,98D:107:133:12:0
Sky Cinema Action HD,Action HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:1023=27:0;1027=deu@106,1028=eng@106:0:98C,9C4,9AF,98D:116:133:11:0
Sky Cinema Animation HD,Animation HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106,772=eng@106:0:9C4,98C,9AF,98D:139:133:8:0
SYFY HD,SYFY HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:9C4,98C,9AF,98D:126:133:12:0
Sky Atlantic HD,AtlanticHD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106,1284=eng@106:0:98C,9C4,9AF,98D:110:133:13:0
Sky 1 +1 HD,Sky 1 +1 HD;SKY:11797:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:98C,9C4,9AF,98D:144:133:16:0
TNT Serie HD,TNTSerieHD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:255=27:0;259=deu@106,260=eng@106:0:98C,9C4,9AF,98D:123:133:11:0
TNT Comedy HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:98C,9C4,98D:136:133:14:0
Fox HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:1023=27:0;1027=deu@106,1028=eng@106:0:98C,9C4,98D:124:133:10:0
13th Street HD,13th St HD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106,772=eng@106:0:98C,9C4,9AF,98D:127:133:13:0
Universal HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:1535=27:0;1539=deu@106,1540=eng@106:0:98C,9C4,98D:101:133:14:0
RTL Crime HD,RTL CrimeHD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:255=27:0;259=deu@106,260=eng@106:0:9C4,98C,98D:140:133:9:0
E! Entertainm. HD,E! HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:255=27:0;259=deu@106,260=eng@106:0:98C,9C4,98D:128:133:14:0
Spiegel Geschichte HD,Spiegel G HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:255=27:0;259=deu@106:0:98C,9C4,98D:137:133:10:0
Discovery HD,DiscHD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:1023=27:0;1027=deu@106,1028=eng@106:0:98C,9C4,9AF,98D:130:133:6:0
History HD,HistHD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106,772=eng@106:0:98C,9C4,9AF,98D:113:133:11:0
NatGeo HD,NatGeoHD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:98C,9C4,9AF,98D:112:133:13:0
Nat Geo Wild HD,NGWildHD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:98C,9C4,9AF,98D:118:133:6:0
Disney Cinemagic HD,DisneyCinHD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:255=27:0;259=deu@106,260=eng@106:0:98C,9C4,9AF,98D:111:133:13:0
Disney Junior HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106:0:9C4,98C,9AF,98D:138:133:8:0
Sky Arts HD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:767=27:0;771=deu@106,772=eng@106:0:9C4,98C,98D:145:133:9:0
:Sky Film
Sky Cinema Comedy,Sky Comedy;SKY:11719:HC910M2O35P0S1:S19.2E:27500:1023=27:1024=deu@3,1025=eng@3;1027=deu@106:0:9C4,98C,9AF,98D:8:133:3:0
Sky Cinema Western,Sky Western;SKY:12031:HC910M2O35P0S1:S19.2E:27500:767=27:768=deu@3,769=eng@3:0:9C4,98C,9AF,98D:516:133:4:0
Sky Cinema Emotion,Sky Emotion;SKY:12031:HC910M2O35P0S1:S19.2E:27500:511=27:512=deu@3,513=eng@3;515=deu@106:0:9C4,98C,9AF,98D:20:133:4:0
:Sky Welt
RTL Passion,Passion;SKY:12031:HC910M2O35P0S1:S19.2E:27500:3839=27:3840=deu@3,3841=eng@3:0:9C4,98C,9AF,98D:29:133:4:0
Sky Krimi,SkyKrimi;SKY:12031:HC910M2O35P0S1:S19.2E:27500:1535=27:1536=deu@3:0:9C4,98C,9AF,98D:23:133:4:0
Disney XD,DisneyXD;SKY:11719:HC910M2O35P0S1:S19.2E:27500:1279=27:1280=deu@3,1281=eng@3:0:9C4,98C,9AF,98D:28:133:3:0
Heimatkanal,Heimat;SKY:11758:HC910M2O35P0S1:S19.2E:27500:2815=27:2816=deu@3:0:9C4,98C,9AF,98D:22:133:2:0
Romance TV,Romance;SKY:11758:HC910M2O35P0S1:S19.2E:27500:3071=27:3072=deu@3:0:9C4,98C,9AF,98D:518:133:2:0
Classica;SKY:11719:HC910M2O35P0S1:S19.2E:27500:2047=27:2048=deu@3:0:9C4,98C,9AF,98D:24:133:3:0
:Sky Welt Extra
TNT Film (TCM),TNT Film;SKY:11914:HC910M2O35P0S1:S19.2E:27500:4351=27:4352=deu@3,4353=eng@3:0:98C,9C4,9AF,98D:405:133:6:0
Kinowelt TV,Kinowelt;SKY:12031:HC910M2O35P0S1:S19.2E:27500:4351=27:4352=deu@3:0:9C4,98C,9AF,98D:406:133:4:0
.;BetaDigital:10920:HC78M2S0:S19.2E:22000:2047=27:2048=deu@3,2049=eng@3:0:9C4,98C:57:133:15:0
.;SKY:10920:HC78M2S0:S19.2E:22000:1023=27:1024=deu@3:0:1837,9C4,98C,1867:38:133:15:0
RTL Living;CBC:11082:HC34M5O20P0S1:S19.2E:22000:700=27:710=deu@3,711=qaa@3:0:9C4,98C,98D:11971:1:1041:0
Boomerang;SKY:11875:HC34M5O35P0S1:S19.2E:27500:4351=27:4352=deu@3,4353=eng@3:0:98C,9C4,98D:403:133:14:0
Cartoon Network,Cartoon Net;SKY:11875:HC34M5O35P0S1:S19.2E:27500:4607=27:4608=deu@3,4609=eng@3:0:98C,9C4,98D:404:133:14:0
Nicktoons (S);MTV Networks Europe:11973:VC34M2S0:S19.2E:27500:4121=2:4122=@4:0:500:28682:1:1078:0
Beate-Uhse.TV,BeateU;SKY:11719:HC910M2O35P0S1:S19.2E:27500:2303=27:2304=deu@3:0:9C4,98C,9AF,98D:21:133:3:0
:Sky Bundesliga HD
Sky Sport Bundesliga 1 HD,Sky Buli 1 HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:255=27:0;258=qab@106,259=qab@106,260=qac@106:32;33=deu:9C4,98C,9AF,98D:105:133:12:0
Sky Sport Bundesliga 2 HD,Sky Buli 2 HD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106:32:9C4,98C,9AF,98D:267:133:6:0
Sky Sport Bundesliga 3 HD,Sky Buli 3 HD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106,2052=qac@106:32:98C,9C4,9AF,98D:277:133:13:0
Sky Sport Bundesliga 4 HD,Sky Buli 4 HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106,2052=qac@106:32:9C4,98C,9AF,98D:287:133:12:0
Sky Sport Bundesliga 5 HD,Sky Buli 5 HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106,2052=qac@106:32:98C,9C4,9AF,98D:297:133:11:0
Sky Sport Bundesliga 6 HD,Sky Buli 6 HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106,2052=qac@106:32:98C,9C4,98D:307:133:8:0
Sky Sport Bundesliga 7 HD,Sky Buli 7 HD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:1791=27:0;1794=qab@106,1795=qab@106,1796=qac@106:33:98C,9C4:317:133:9:0
Sky Sport Bundesliga 8 HD,Sky Buli 8 HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:2559=27:0;2562=deu@106,2563=deu@106,2564=deu@106:0:9C4,98C:327:133:14:0
Sky Sport Bundesliga 9 HD,Sky Buli 9 HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:2559=27:0;2562=qab@106,2563=qab@106,2564=qac@106:32:98C,9C4:337:133:10:0
Sky Sport Bundesliga 10 HD,Sky Buli 10 HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:2047=27:0;2050=deu@106,2051=deu@106,2052=deu@106:0:9C4,98C:257:133:14:0
Sky Sport Fanzone HD,Fanzone HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:1279=27:0:0:98C,9C4:102:133:10:0
:Sky Sport HD
Sky Sport News HD,SportNewsHD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:1023=27:0;1027=deu@106:0:0:108:133:12:0
Sky Sport 1 HD,Sky Sport 1 HD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:767=27:0;770=qae@106,771=qaf@106:32:98C,9C4,9AF,98D:129:133:6:0
Sky Sport 2 HD,Sky Sport 2 HD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:1023=27:0;1026=qae@106,1027=qaf@106,1028=qtz@106:32:98C,9C4,9AF,98D:114:133:13:0
Sky Sport 3 HD,Sky Sport 3 HD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,9AF,98D:268:133:6:0
Sky Sport 4 HD,Sky Sport 4 HD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,9AF:278:133:13:0
Sky Sport 5 HD,Sky Sport 5 HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106:261:9C4,98C,9AF:288:133:12:0
Sky Sport 6 HD,Sky Sport 6 HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,9AF,98D:298:133:11:0
Sky Sport 7 HD,Sky Sport 7 HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,98D:308:133:8:0
Sky Sport 8 HD,Sky Sport 8 HD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:3071=27:0;3074=qae@106,3075=qaf@106,3076=qtz@106:32:98C,9C4,98D:318:133:9:0
Sky Sport 9 HD,Sky Sport 9 HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:2815=27:0;2818=deu@106,2819=deu@106:32:98C,9C4:328:133:14:0
Sky Sport 10 HD,Sky Sport 10HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:2815=27:0;2818=qae@106,2819=qaf@106,2820=qtz@106:32:98C,9C4,98D:338:133:10:0
Sky Sport 11 HD,Sky Sport 11HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,98D:258:133:14:0
Eurosport 1 HD,Eurosp1 HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106:0:98C,9C4,9AF,98D:132:133:11:0
Eurosport 2 HD,Eurosp2HD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:1279=27:0;1283=deu@106,1284=eng@106:0:9C4,98C,98D:109:133:9:0
Sport1+ HD,Sport1+HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106:0:98C,9C4,98D,9AF:122:133:11:0
Sport1 US HD,Sport1USHD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:511=27:0;515=deu@106:32:98C,9C4:119:133:10:0
Sky Sport Austria HD,SportAutHD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:1023=27:0;1027=deu@106:0:9C4,98C,98D:143:133:9:0
:@1000 Neue Kanaele

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: channels.h 4.2 2015/08/17 09:39:48 kls Exp $
* $Id: channels.h 5.3 2024/03/02 16:21:16 kls Exp $
*/
#ifndef __CHANNELS_H
@ -87,6 +87,7 @@ class cChannels;
class cChannel : public cListObject {
friend class cSchedules;
friend class cMenuEditChannel;
friend class cMenuSetupMisc;
friend class cDvbSourceParam;
private:
static cString ToText(const cChannel *Channel);
@ -96,6 +97,7 @@ private:
char *portalName;
int __BeginData__;
int frequency; // MHz
mutable int transponder; // cached value
int source;
int srate;
int vpid;
@ -105,7 +107,7 @@ private:
int atypes[MAXAPIDS + 1]; // list is zero-terminated
char alangs[MAXAPIDS][MAXLANGCODE2];
int dpids[MAXDPIDS + 1]; // list is zero-terminated
int dtypes[MAXAPIDS + 1]; // list is zero-terminated
int dtypes[MAXDPIDS + 1]; // list is zero-terminated
char dlangs[MAXDPIDS][MAXLANGCODE2];
int spids[MAXSPIDS + 1]; // list is zero-terminated
char slangs[MAXSPIDS][MAXLANGCODE2];
@ -122,8 +124,8 @@ private:
int number; // Sequence number assigned on load
bool groupSep;
int __EndData__;
mutable cString nameSource;
mutable cString shortNameSource;
cString nameSource;
cString shortNameSource;
cString parameters;
mutable int modification;
time_t seen; // When this channel was last seen in the SDT of its transponder
@ -131,6 +133,7 @@ private:
cLinkChannels *linkChannels;
cChannel *refChannel;
cString TransponderDataToString(void) const;
void UpdateNameSource(void);
public:
cChannel(void);
cChannel(const cChannel &Channel);
@ -177,6 +180,7 @@ public:
void SetNumber(int Number) { number = Number; }
bool GroupSep(void) const { return groupSep; }
const char *Parameters(void) const { return parameters; }
const cSchedule *Schedule(void) const { return schedule; }
const cLinkChannels* LinkChannels(void) const { return linkChannels; }
const cChannel *RefChannel(void) const { return refChannel; }
bool IsAtsc(void) const { return cSource::IsAtsc(source); }
@ -229,6 +233,7 @@ public:
int GetNextNormal(int Idx) const; ///< Get next normal channel (not group)
int GetPrevNormal(int Idx) const; ///< Get previous normal channel (not group)
void ReNumber(void); ///< Recalculate 'number' based on channel type
bool MoveNeedsDecrement(cChannel *From, cChannel *To); // Detect special case when moving a channel (closely related to Renumber())
void Del(cChannel *Channel); ///< Delete the given Channel from the list
const cChannel *GetByNumber(int Number, int SkipGap = 0) const;
cChannel *GetByNumber(int Number, int SkipGap = 0) { return const_cast<cChannel *>(static_cast<const cChannels *>(this)->GetByNumber(Number, SkipGap)); }

432
ci.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: ci.c 4.16 2017/05/18 09:05:46 kls Exp $
* $Id: ci.c 5.1 2021/06/09 09:41:18 kls Exp $
*/
#include "ci.h"
@ -78,17 +78,18 @@ static char *CopyString(int Length, const uint8_t *Data)
///< Copies the string at Data.
///< Returns a pointer to a newly allocated string.
{
// Some CAMs send funny characters at the beginning of strings.
// Let's just skip them:
while (Length > 0 && (*Data == ' ' || *Data == 0x05 || *Data == 0x96 || *Data == 0x97)) {
char *s = MALLOC(char, Length + 1);
char *p = s;
while (Length > 0) {
int c = *Data;
if (isprint(c)) // some CAMs send funny characters in their strings, let's just skip them
*p++ = c;
else if (c == 0x8A) // the character 0x8A is used as newline, so let's put a real '\n' in there
*p++ = '\n';
Length--;
Data++;
}
char *s = MALLOC(char, Length + 1);
strncpy(s, (char *)Data, Length);
s[Length] = 0;
// The character 0x8A is used as newline, so let's put a real '\n' in there:
strreplace(s, 0x8A, '\n');
*p = 0;
return s;
}
@ -117,10 +118,14 @@ class cCaPidReceiver : public cReceiver {
private:
int catVersion;
cVector<int> emmPids;
uchar buffer[2048]; // 11 bit length, max. 2048 byte
uchar buffer[1024]; // CAT table length: 10 bit -> max. 1021 + 3 bytes
uchar *bufp;
uchar mtdCatBuffer[TS_SIZE]; // TODO: handle multi packet CATs!
#define CAT_MAXPACKETS 6 // 6 * 184 = 1104 bytes for CAT table
uchar mtdCatBuffer[CAT_MAXPACKETS][TS_SIZE]; // TODO: handle multi table CATs!
int mtdNumCatPackets;
int length;
cMutex mutex;
bool handlingPid;
void AddEmmPid(int Pid);
void DelEmmPids(void);
public:
@ -129,14 +134,28 @@ public:
virtual void Receive(const uchar *Data, int Length);
bool HasCaPids(void) const { return NumPids() - emmPids.Size() - 1 > 0; }
void Reset(void) { DelEmmPids(); catVersion = -1; }
bool HandlingPid(void);
///< The cCaPidReceiver adds/deletes PIDs to/from the base class cReceiver,
///< which in turn does the same on the cDevice it is attached to. The cDevice
///< then sets the PIDs on the assigned cCamSlot, which can cause a deadlock on the
///< cCamSlot's mutex if a cReceiver is detached from the device at the same time.
///< Since these PIDs, however, are none that have to be decrypted,
///< it is not necessary to set them in the CAM. Therefore this function is
///< used in cCamSlot::SetPid() to detect this situation, and thus avoid the
///< deadlock.
};
cCaPidReceiver::cCaPidReceiver(void)
{
catVersion = -1;
bufp = NULL;
mtdNumCatPackets = 0;
length = 0;
handlingPid = false;
cMutexLock MutexLock(&mutex);
handlingPid = true;
AddPid(CATPID);
handlingPid = false;
}
void cCaPidReceiver::AddEmmPid(int Pid)
@ -146,14 +165,20 @@ void cCaPidReceiver::AddEmmPid(int Pid)
return;
}
emmPids.Append(Pid);
cMutexLock MutexLock(&mutex);
handlingPid = true;
AddPid(Pid);
handlingPid = false;
}
void cCaPidReceiver::DelEmmPids(void)
{
cMutexLock MutexLock(&mutex);
handlingPid = true;
for (int i = 0; i < emmPids.Size(); i++)
DelPid(emmPids[i]);
emmPids.Clear();
handlingPid = false;
}
void cCaPidReceiver::Receive(const uchar *Data, int Length)
@ -163,30 +188,38 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length)
const uchar *p = NULL;
if (TsPayloadStart(Data)) {
if (Data[5] == SI::TableIdCAT) {
length = (int(Data[6] & 0x03) << 8) | Data[7]; // section length
if (bufp) { // incomplete multi-packet CAT
catVersion = -1;
bufp = NULL;
}
length = (int(Data[6] & 0x0F) << 8) | Data[7]; // section length (12 bit field)
if (length > 5) {
int v = (Data[10] & 0x3E) >> 1; // version number
if (v != catVersion) {
if (Data[11] == 0 && Data[12] == 0) { // section number, last section number
if (length > TS_SIZE - 8) {
if (MtdCamSlot)
esyslog("ERROR: need to implement multi packet CAT handling for MTD!");
int n = TS_SIZE - 13;
memcpy(buffer, Data + 13, n);
length += 3; // with TableIdCAT -> Data[5]
if (length > TS_SIZE - 5) {
int n = TS_SIZE - 5;
memcpy(buffer, Data + 5, n);
bufp = buffer + n;
length -= n + 5; // 5 = header
length -= n;
}
else {
p = Data + 13; // no need to copy the data
length -= 5; // header
p = Data + 5; // no need to copy the data
}
if (MtdCamSlot) {
mtdNumCatPackets = 0;
memcpy(mtdCatBuffer[mtdNumCatPackets++], Data, TS_SIZE);
}
}
else
dsyslog("multi table CAT section - unhandled!");
catVersion = v;
}
else if (MtdCamSlot)
MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
else if (MtdCamSlot) {
for (int i = 0; i < mtdNumCatPackets; i++)
MtdCamSlot->PutCat(mtdCatBuffer[i], TS_SIZE);
}
}
}
}
@ -200,44 +233,73 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length)
p = buffer;
length = bufp - buffer;
}
if (MtdCamSlot)
memcpy(mtdCatBuffer[mtdNumCatPackets++], Data, TS_SIZE);
}
else {
esyslog("ERROR: buffer overflow in cCaPidReceiver::Receive()");
bufp = 0;
bufp = NULL;
length = 0;
}
}
if (p) {
DelEmmPids();
for (int i = 0; i < length - 4; i++) { // -4 = checksum
if (p[i] == 0x09) {
int CaId = int(p[i + 2] << 8) | p[i + 3];
int EmmPid = Peek13(p + i + 4);
AddEmmPid(EmmPid);
if (MtdCamSlot)
MtdMapPid(const_cast<uchar *>(p + i + 4), MtdCamSlot->MtdMapper());
switch (CaId >> 8) {
case 0x01: for (int j = i + 7; j < p[i + 1] + 2; j += 4) {
EmmPid = Peek13(p + j);
AddEmmPid(EmmPid);
if (MtdCamSlot)
MtdMapPid(const_cast<uchar *>(p + j), MtdCamSlot->MtdMapper());
}
break;
}
i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment
if (!SI::CRC32::crc32((const char *)p, length, 0xFFFFFFFF)) { // <TableIdCAT,....,crc32>
DelEmmPids();
for (int i = 8; i < length - 4; i++) { // -4 = checksum
if (p[i] == 0x09) {
int CaId = int(p[i + 2] << 8) | p[i + 3];
int EmmPid = Peek13(p + i + 4);
AddEmmPid(EmmPid);
if (MtdCamSlot)
MtdMapPid(const_cast<uchar *>(p + i + 4), MtdCamSlot->MtdMapper());
switch (CaId >> 8) {
case 0x01: for (int j = i + 7; j < i + p[i + 1] + 2; j += 4) {
EmmPid = Peek13(p + j);
AddEmmPid(EmmPid);
if (MtdCamSlot)
MtdMapPid(const_cast<uchar *>(p + j), MtdCamSlot->MtdMapper());
}
break;
}
i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment
}
}
}
if (MtdCamSlot) {
// update crc32
uint32_t crc = SI::CRC32::crc32((const char *)p, length - 4, 0xFFFFFFFF); // <TableIdCAT....>[crc32]
uchar *c = const_cast<uchar *>(p + length - 4);
*c++ = crc >> 24;
*c++ = crc >> 16;
*c++ = crc >> 8;
*c++ = crc;
// modify CAT packets
const uchar *t = p;
for (int i = 0, j = 5; i < mtdNumCatPackets; i++, j = 4) {
int n = min(length, TS_SIZE - j);
memcpy(mtdCatBuffer[i] + j, t, n);
t += n;
length -= n;
MtdCamSlot->PutCat(mtdCatBuffer[i], TS_SIZE);
}
}
}
else {
esyslog("ERROR: wrong checksum in CAT");
catVersion = -1;
}
p = NULL;
bufp = 0;
bufp = NULL;
length = 0;
memcpy(mtdCatBuffer, Data, TS_SIZE);
if (MtdCamSlot)
MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
}
}
}
bool cCaPidReceiver::HandlingPid(void)
{
cMutexLock MutexLock(&mutex);
return handlingPid;
}
// --- cCaActivationReceiver -------------------------------------------------
// A receiver that is used to make the device stay on a given channel and
@ -278,7 +340,7 @@ void cCaActivationReceiver::Receive(const uchar *Data, int Length)
if (TsIsScrambled(Data))
lastScrambledTime = Now;
else if (Now - lastScrambledTime > UNSCRAMBLE_TIME) {
dsyslog("CAM %d: activated!", camSlot->SlotNumber());
dsyslog("CAM %d: activated!", camSlot->MasterSlotNumber());
Skins.QueueMessage(mtInfo, tr("CAM activated!"));
cDevice *d = Device();
Detach();
@ -290,6 +352,137 @@ void cCaActivationReceiver::Receive(const uchar *Data, int Length)
}
}
// --- cCamResponse ----------------------------------------------------------
// CAM Response Actions:
#define CRA_NONE 0
#define CRA_DISCARD -1
#define CRA_CONFIRM -2
#define CRA_SELECT -3
class cCamResponse : public cListObject {
private:
int camNumber;
char *text;
int action;
public:
cCamResponse(void);
~cCamResponse();
bool Parse(const char *s);
int Matches(int CamNumber, const char *Text) const;
};
cCamResponse::cCamResponse(void)
{
camNumber = -1;
text = NULL;
action = CRA_NONE;
}
cCamResponse::~cCamResponse()
{
free(text);
}
bool cCamResponse::Parse(const char *s)
{
// Number:
s = skipspace(s);
if (*s == '*') {
camNumber = 0; // all CAMs
s++;
}
else {
char *e;
camNumber = strtol(s, &e, 10);
if (e == s || camNumber <= 0)
return false;
s = e;
}
// Text:
s = skipspace(s);
char *t = const_cast<char *>(s); // might have to modify it
char *q = NULL; // holds a copy in case of backslashes
bool InQuotes = false;
while (*t) {
if (*t == '"') {
if (t == s) { // opening quotes
InQuotes = true;
s++;
}
else if (InQuotes) // closing quotes
break;
}
else if (*t == '\\') {
if (!q) { // need to make a copy in order to strip backslashes
q = strdup(s);
t = q + (t - s);
s = q;
}
memmove(t, t + 1, strlen(t));
}
else if (*t == ' ') {
if (!InQuotes)
break;
}
t++;
}
free(text); // just for safety
text = NULL;
if (t != s) {
text = strndup(s, t - s);
s = t + 1;
}
free(q);
if (!text)
return false;
// Action:
s = skipspace(s);
if (strcasecmp(s, "DISCARD") == 0) action = CRA_DISCARD;
else if (strcasecmp(s, "CONFIRM") == 0) action = CRA_CONFIRM;
else if (strcasecmp(s, "SELECT") == 0) action = CRA_SELECT;
else if (isnumber(s)) action = atoi(s);
else
return false;
return true;
}
int cCamResponse::Matches(int CamNumber, const char *Text) const
{
if (!camNumber || camNumber == CamNumber) {
if (strcmp(text, Text) == 0)
return action;
}
return CRA_NONE;
}
// --- cCamResponses --------------------------------------------------------
class cCamResponses : public cConfig<cCamResponse> {
public:
int GetMatch(int CamNumber, const char *Text) const;
};
int cCamResponses::GetMatch(int CamNumber, const char *Text) const
{
for (const cCamResponse *cr = First(); cr; cr = Next(cr)) {
int Action = cr->Matches(CamNumber, Text);
if (Action != CRA_NONE) {
dsyslog("CAM %d: auto response %4d to '%s'\n", CamNumber, Action, Text);
return Action;
}
}
return CRA_NONE;
}
cCamResponses CamResponses;
bool CamResponsesLoad(const char *FileName, bool AllowComments, bool MustExist)
{
return CamResponses.Load(FileName, AllowComments, MustExist);
}
// --- cTPDU -----------------------------------------------------------------
#define MAX_TPDU_SIZE 4096
@ -418,6 +611,7 @@ uint8_t cTPDU::Status(void)
class cCiTransportConnection {
private:
enum eState { stIDLE, stCREATION, stACTIVE, stDELETION };
cMutex mutex;
cCamSlot *camSlot;
uint8_t tcid;
eState state;
@ -909,8 +1103,9 @@ void cCiCaPmt::MtdMapPids(cMtdMapper *MtdMapper)
#define CA_ENABLE(x) (((x) & CA_ENABLE_FLAG) ? (x) & ~CA_ENABLE_FLAG : 0)
#define QUERY_WAIT_TIME 1000 // ms to wait before sending a query
#define QUERY_WAIT_TIME 500 // ms to wait before sending a query
#define QUERY_REPLY_TIMEOUT 2000 // ms to wait for a reply to a query
#define QUERY_RETRIES 6 // max. number of retries to check if there is a reply to a query
class cCiConditionalAccessSupport : public cCiSession {
private:
@ -919,6 +1114,7 @@ private:
int caSystemIds[MAXCASYSTEMIDS + 1]; // list is zero terminated!
bool repliesToQuery;
cTimeMs timer;
int numRetries;
public:
cCiConditionalAccessSupport(uint16_t SessionId, cCiTransportConnection *Tc);
virtual void Process(int Length = 0, const uint8_t *Data = NULL);
@ -937,6 +1133,7 @@ cCiConditionalAccessSupport::cCiConditionalAccessSupport(uint16_t SessionId, cCi
state = 0; // inactive
caSystemIds[numCaSystemIds = 0] = 0;
repliesToQuery = false;
numRetries = 0;
}
void cCiConditionalAccessSupport::Process(int Length, const uint8_t *Data)
@ -966,7 +1163,8 @@ void cCiConditionalAccessSupport::Process(int Length, const uint8_t *Data)
caSystemIds[numCaSystemIds] = 0;
dbgprotocol("\n");
if (state == 1) {
timer.Set(QUERY_WAIT_TIME); // WORKAROUND: Alphacrypt 3.09 doesn't reply to QUERY immediately after reset
timer.Set(0);
numRetries = QUERY_RETRIES;
state = 2; // got ca info
}
dsyslog("CAM %d: system ids:%s", CamSlot()->SlotNumber(), *Ids ? *Ids : " none");
@ -975,10 +1173,12 @@ void cCiConditionalAccessSupport::Process(int Length, const uint8_t *Data)
case AOT_CA_PMT_REPLY: {
dbgprotocol("Slot %d: <== Ca Pmt Reply (%d)", CamSlot()->SlotNumber(), SessionId());
if (!repliesToQuery) {
dsyslog("CAM %d: replies to QUERY - multi channel decryption (MCD) possible", CamSlot()->SlotNumber());
if (CamSlot()->IsMasterSlot())
dsyslog("CAM %d: replies to QUERY - multi channel decryption (MCD) possible", CamSlot()->SlotNumber());
repliesToQuery = true;
if (CamSlot()->MtdAvailable()) {
dsyslog("CAM %d: supports multi transponder decryption (MTD)", CamSlot()->SlotNumber());
if (CamSlot()->IsMasterSlot())
dsyslog("CAM %d: supports multi transponder decryption (MTD)", CamSlot()->SlotNumber());
CamSlot()->MtdActivate(true);
}
}
@ -1039,15 +1239,18 @@ void cCiConditionalAccessSupport::Process(int Length, const uint8_t *Data)
SendData(AOT_CA_INFO_ENQ);
state = 1; // enquired ca info
}
else if (state == 2 && timer.TimedOut()) {
cCiCaPmt CaPmt(CPCI_QUERY, 0, 0, 0, NULL);
SendPMT(&CaPmt);
timer.Set(QUERY_REPLY_TIMEOUT);
state = 3; // waiting for reply
}
else if (state == 3 && timer.TimedOut()) {
dsyslog("CAM %d: doesn't reply to QUERY - only a single channel can be decrypted", CamSlot()->SlotNumber());
state = 4; // normal operation
else if ((state == 2 || state == 3) && timer.TimedOut()) {
if (numRetries-- > 0) {
cCiCaPmt CaPmt(CPCI_QUERY, 0, 0, 0, NULL);
SendPMT(&CaPmt);
timer.Set(QUERY_WAIT_TIME);
state = 3; // waiting for reply
}
else {
dsyslog("CAM %d: doesn't reply to QUERY - only a single channel can be decrypted", CamSlot()->SlotNumber());
CamSlot()->MtdActivate(false);
state = 4; // normal operation
}
}
}
@ -1292,15 +1495,41 @@ void cCiMMI::Process(int Length, const uint8_t *Data)
if (l > 0) menu->titleText = GetText(l, &d);
if (l > 0) menu->subTitleText = GetText(l, &d);
if (l > 0) menu->bottomText = GetText(l, &d);
int Action = CRA_NONE;
int Select = -1;
int Item = 0;
while (l > 0) {
char *s = GetText(l, &d);
if (s) {
if (!menu->AddEntry(s))
free(s);
else if (Action == CRA_NONE) {
Action = CamResponses.GetMatch(CamSlot()->SlotNumber(), s);
if (Action == CRA_SELECT)
Select = Item;
}
}
else
break;
Item++;
}
if (Action != CRA_NONE) {
delete menu;
menu = NULL;
cCondWait::SleepMs(100);
if (Action == CRA_DISCARD) {
SendCloseMMI();
dsyslog("CAM %d: DISCARD", CamSlot()->SlotNumber());
}
else if (Action == CRA_CONFIRM) {
SendMenuAnswer(1);
dsyslog("CAM %d: CONFIRM", CamSlot()->SlotNumber());
}
else if (Action == CRA_SELECT) {
SendMenuAnswer(Select + 1);
dsyslog("CAM %d: SELECT %d", CamSlot()->SlotNumber(), Select + 1);
}
}
}
}
break;
@ -1319,6 +1548,19 @@ void cCiMMI::Process(int Length, const uint8_t *Data)
l--;
// I really wonder why there is no text length field here...
enquiry->text = CopyString(l, d);
int Action = CamResponses.GetMatch(CamSlot()->SlotNumber(), enquiry->text);
if (Action > CRA_NONE) {
char s[enquiry->expectedLength * 2];
snprintf(s, sizeof(s), "%d", Action);
if (int(strlen(s)) == enquiry->expectedLength) {
delete enquiry;
enquiry = NULL;
SendAnswer(s);
dsyslog("CAM %d: PIN", CamSlot()->SlotNumber());
}
else
esyslog("CAM %d: ERROR: unexpected PIN length %d, expected %d", CamSlot()->SlotNumber(), int(strlen(s)), enquiry->expectedLength);
}
}
}
break;
@ -1374,9 +1616,12 @@ bool cCiMMI::SendAnswer(const char *Text)
struct tAnswer { uint8_t id; char text[256]; };//XXX
tAnswer answer;
answer.id = Text ? AI_ANSWER : AI_CANCEL;
if (Text)
strncpy(answer.text, Text, sizeof(answer.text));
SendData(AOT_ANSW, Text ? strlen(Text) + 1 : 1, (uint8_t *)&answer);
int len = 0;
if (Text) {
len = min(sizeof(answer.text), strlen(Text));
memcpy(answer.text, Text, len);
}
SendData(AOT_ANSW, len + 1, (uint8_t *)&answer);
return true;
}
@ -1449,6 +1694,7 @@ void cCiMenu::Abort(void)
cCiEnquiry::cCiEnquiry(cCiMMI *MMI)
{
mmi = MMI;
mutex = NULL;
text = NULL;
blind = false;
expectedLength = 0;
@ -1590,6 +1836,7 @@ void cCiTransportConnection::SetTsPostProcessor(cCiSession *CiSession)
bool cCiTransportConnection::TsPostProcess(uint8_t *TsPacket)
{
cMutexLock MutexLock(&mutex);
if (tsPostProcessor)
return tsPostProcessor->TsPostProcess(TsPacket);
return false;
@ -2012,14 +2259,14 @@ bool cCamSlot::Assign(cDevice *Device, bool Query)
return false;
}
bool cCamSlot::Devices(cVector<int> &CardIndexes)
bool cCamSlot::Devices(cVector<int> &DeviceNumbers)
{
cMutexLock MutexLock(&mutex);
if (mtdHandler)
return mtdHandler->Devices(CardIndexes);
return mtdHandler->Devices(DeviceNumbers);
if (assignedDevice)
CardIndexes.Append(assignedDevice->CardIndex());
return CardIndexes.Size() > 0;
DeviceNumbers.Append(assignedDevice->DeviceNumber());
return DeviceNumbers.Size() > 0;
}
void cCamSlot::NewConnection(void)
@ -2297,8 +2544,10 @@ void cCamSlot::BuildCaPmts(uint8_t CmdId, cCiCaPmtList &CaPmtList, cMtdMapper *M
if (GetCaPids(source, transponder, p->programNumber, CaSystemIds, MAXRECEIVEPIDS + 1, CaPids) > 0) {
if (Active)
caPidReceiver->AddPids(CaPids);
else
else {
KeepSharedCaPids(p->programNumber, CaSystemIds, CaPids);
caPidReceiver->DelPids(CaPids);
}
}
}
if (RepliesToQuery())
@ -2314,6 +2563,43 @@ void cCamSlot::BuildCaPmts(uint8_t CmdId, cCiCaPmtList &CaPmtList, cMtdMapper *M
}
}
void cCamSlot::KeepSharedCaPids(int ProgramNumber, const int *CaSystemIds, int *CaPids)
{
int numPids = 0;
int *pCaPids = CaPids;
while (*pCaPids) {
numPids++;
pCaPids++;
}
if (numPids <= 0)
return;
int CaPids2[MAXRECEIVEPIDS + 1];
for (cCiCaProgramData *p = caProgramList.First(); p; p = caProgramList.Next(p)) {
if (p->Active()) {
if (GetCaPids(source, transponder, p->programNumber, CaSystemIds, MAXRECEIVEPIDS + 1, CaPids2) > 0) {
int *pCaPids2 = CaPids2;
while (*pCaPids2) {
pCaPids = CaPids;
while (*pCaPids) {
if (*pCaPids == *pCaPids2) {
dsyslog("CAM %d: keeping shared CA pid %d", SlotNumber(), *pCaPids);
// To remove *pCaPids from CaPids we overwrite it with the last valie in the list, and then strip the last value:
*pCaPids = CaPids[numPids - 1];
numPids--;
CaPids[numPids] = 0;
if (numPids <= 0)
return;
}
else
pCaPids++;
}
pCaPids2++;
}
}
}
}
}
void cCamSlot::SendCaPmts(cCiCaPmtList &CaPmtList)
{
cMutexLock MutexLock(&mutex);
@ -2410,6 +2696,8 @@ void cCamSlot::AddPid(int ProgramNumber, int Pid, int StreamType)
void cCamSlot::SetPid(int Pid, bool Active)
{
if (caPidReceiver && caPidReceiver->HandlingPid())
return;
cMutexLock MutexLock(&mutex);
for (cCiCaProgramData *p = caProgramList.First(); p; p = caProgramList.Next(p)) {
for (cCiCaPidData *q = p->pidList.First(); q; q = p->pidList.Next(q)) {
@ -2493,9 +2781,13 @@ void cCamSlot::StartDecrypting(void)
void cCamSlot::StopDecrypting(void)
{
cMutexLock MutexLock(&mutex);
if (mtdHandler) {
mtdHandler->StopDecrypting();
return;
}
if (caProgramList.Count()) {
caProgramList.Clear();
if (!dynamic_cast<cMtdCamSlot *>(this))
if (!dynamic_cast<cMtdCamSlot *>(this) || !MasterSlot()->IsDecrypting())
SendCaPmt(CPCI_NOT_SELECTED);
}
}
@ -2784,6 +3076,8 @@ void cChannelCamRelations::Load(const char *FileName)
void cChannelCamRelations::Save(void)
{
if (!*fileName)
return;
cMutexLock MutexLock(&mutex);
struct stat st;
if (stat(fileName, &st) == 0) {

15
ci.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: ci.h 4.9 2017/05/18 09:05:46 kls Exp $
* $Id: ci.h 4.14 2019/05/28 14:58:08 kls Exp $
*/
#ifndef __CI_H
@ -254,6 +254,7 @@ private:
cList<cCiCaProgramData> caProgramList;
bool mtdAvailable;
cMtdHandler *mtdHandler;
void KeepSharedCaPids(int ProgramNumber, const int *CaSystemIds, int *CaPids);
void NewConnection(void);
void DeleteAllConnections(void);
void Process(cTPDU *TPDU = NULL);
@ -304,7 +305,7 @@ public:
virtual ~cCamSlot();
bool IsMasterSlot(void) { return !masterSlot; }
///< Returns true if this CAM slot itself is a master slot (which means that
///< it doesn't have pointer to another CAM slot that's its master).
///< it doesn't have a pointer to another CAM slot that's its master).
cCamSlot *MasterSlot(void) { return masterSlot ? masterSlot : this; }
///< Returns this CAM slot's master slot, or a pointer to itself if it is a
///< master slot.
@ -330,9 +331,9 @@ public:
///< class function.
cDevice *Device(void) { return assignedDevice; }
///< Returns the device this CAM slot is currently assigned to.
bool Devices(cVector<int> &CardIndexes);
///< Adds the card indexes of any devices that currently use this CAM to
///< the given CardIndexes. This can be more than one in case of MTD.
bool Devices(cVector<int> &DeviceNumbers);
///< Adds the numbers of any devices that currently use this CAM to
///< the given DeviceNumbers. This can be more than one in case of MTD.
///< Returns true if the array is not empty.
bool WantsTsData(void) const { return caPidReceiver != NULL; }
///< Returns true if this CAM slot wants to receive the TS data through
@ -402,7 +403,7 @@ public:
///< call to AddPid()) to Active. A later call to StartDecrypting() will
///< send the full list of currently active CA_PMT entries to the CAM.
virtual void AddChannel(const cChannel *Channel);
///< Adds all PIDs if the given Channel to the current list of PIDs.
///< Adds all PIDs of the given Channel to the current list of PIDs.
///< If the source or transponder of the channel are different than
///< what was given in a previous call to AddChannel(), any previously
///< added PIDs will be cleared.
@ -529,4 +530,6 @@ public:
extern cChannelCamRelations ChannelCamRelations;
bool CamResponsesLoad(const char *FileName, bool AllowComments = false, bool MustExist = false);
#endif //__CI_H

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.c 4.6 2017/05/21 10:25:26 kls Exp $
* $Id: config.c 5.1 2024/03/04 21:13:58 kls Exp $
*/
#include "config.h"
@ -409,6 +409,8 @@ cSetup::cSetup(void)
SubtitleBgTransparency = 0;
EPGLanguages[0] = -1;
EPGScanTimeout = 5;
EPGScanMaxChannel = 0;
EPGPauseAfterScan = 0;
EPGBugfixLevel = 3;
EPGLinger = 0;
SVDRPTimeout = 300;
@ -432,6 +434,7 @@ cSetup::cSetup(void)
FoldersInTimerMenu = 1;
AlwaysSortFoldersFirst = 1;
DefaultSortModeRec = rsmTime;
RecSortingDirection = rsdAscending;
NumberKeysForChars = 1;
ColorKey0 = 0;
ColorKey1 = 1;
@ -636,12 +639,14 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "SubtitleBgTransparency")) SubtitleBgTransparency = atoi(Value);
else if (!strcasecmp(Name, "EPGLanguages")) return ParseLanguages(Value, EPGLanguages);
else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
else if (!strcasecmp(Name, "EPGScanMaxChannel")) EPGScanMaxChannel = atoi(Value);
else if (!strcasecmp(Name, "EPGPauseAfterScan")) EPGPauseAfterScan = atoi(Value);
else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
else if (!strcasecmp(Name, "EPGLinger")) EPGLinger = atoi(Value);
else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
else if (!strcasecmp(Name, "SVDRPPeering")) SVDRPPeering = atoi(Value);
else if (!strcasecmp(Name, "SVDRPHostName")) { if (*Value) strn0cpy(SVDRPHostName, Value, sizeof(SVDRPHostName)); }
else if (!strcasecmp(Name, "SVDRPdefaultHost")) strn0cpy(SVDRPDefaultHost, Value, sizeof(SVDRPDefaultHost));
else if (!strcasecmp(Name, "SVDRPDefaultHost")) strn0cpy(SVDRPDefaultHost, Value, sizeof(SVDRPDefaultHost));
else if (!strcasecmp(Name, "ZapTimeout")) ZapTimeout = atoi(Value);
else if (!strcasecmp(Name, "ChannelEntryTimeout")) ChannelEntryTimeout= atoi(Value);
else if (!strcasecmp(Name, "RcRepeatDelay")) RcRepeatDelay = atoi(Value);
@ -658,6 +663,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "RecordingDirs")) RecordingDirs = atoi(Value);
else if (!strcasecmp(Name, "FoldersInTimerMenu")) FoldersInTimerMenu = atoi(Value);
else if (!strcasecmp(Name, "AlwaysSortFoldersFirst")) AlwaysSortFoldersFirst = atoi(Value);
else if (!strcasecmp(Name, "RecSortingDirection")) RecSortingDirection= atoi(Value);
else if (!strcasecmp(Name, "DefaultSortModeRec")) DefaultSortModeRec = atoi(Value);
else if (!strcasecmp(Name, "NumberKeysForChars")) NumberKeysForChars = atoi(Value);
else if (!strcasecmp(Name, "ColorKey0")) ColorKey0 = atoi(Value);
@ -767,6 +773,8 @@ bool cSetup::Save(void)
Store("SubtitleBgTransparency", SubtitleBgTransparency);
StoreLanguages("EPGLanguages", EPGLanguages);
Store("EPGScanTimeout", EPGScanTimeout);
Store("EPGScanMaxChannel", EPGScanMaxChannel);
Store("EPGPauseAfterScan", EPGPauseAfterScan);
Store("EPGBugfixLevel", EPGBugfixLevel);
Store("EPGLinger", EPGLinger);
Store("SVDRPTimeout", SVDRPTimeout);
@ -789,6 +797,7 @@ bool cSetup::Save(void)
Store("RecordingDirs", RecordingDirs);
Store("FoldersInTimerMenu", FoldersInTimerMenu);
Store("AlwaysSortFoldersFirst", AlwaysSortFoldersFirst);
Store("RecSortingDirection",RecSortingDirection);
Store("DefaultSortModeRec", DefaultSortModeRec);
Store("NumberKeysForChars", NumberKeysForChars);
Store("ColorKey0", ColorKey0);

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 4.9 2017/04/29 13:33:13 kls Exp $
* $Id: config.h 5.26 2025/02/26 10:35:03 kls Exp $
*/
#ifndef __CONFIG_H
@ -22,19 +22,21 @@
// VDR's own version number:
#define VDRVERSION "2.3.5"
#define VDRVERSNUM 20305 // Version * 10000 + Major * 100 + Minor
#define VDRVERSION "2.7.4"
#define VDRVERSNUM 20704 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number:
#define APIVERSION "2.3.5"
#define APIVERSNUM 20305 // Version * 10000 + Major * 100 + Minor
#define APIVERSION "6"
#define APIVERSNUM 30006
// When loading plugins, VDR searches them by their APIVERSION, which
// may be smaller than VDRVERSION in case there have been no changes to
// VDR header files since the last APIVERSION. This allows compiled
// When loading plugins, VDR searches files by their APIVERSION, which
// is different from VDRVERSION. APIVERSION is a plain number, incremented
// only when there are changes to the plugin API. This allows compiled
// plugins to work with newer versions of the core VDR as long as no
// VDR header files have changed.
// interfaces have changed. APIVERSNUM begins with "300.." for backwards
// compatibility and can be used in #if preprocessor statements to handle
// version dependent code.
#define MAXPRIORITY 99
#define MINPRIORITY (-MAXPRIORITY)
@ -46,6 +48,13 @@
#define TIMERMACRO_TITLE "TITLE"
#define TIMERMACRO_EPISODE "EPISODE"
#define TIMERMACRO_BEFORE "{<}"
#define TIMERMACRO_MATCH "{=}"
#define TIMERMACRO_AFTER "{>}"
#define TIMERPATTERN_AVOID "@"
#define TIMERPATTERN_BEGIN "^"
#define TIMERPATTERN_END "$"
#define MINOSDWIDTH 480
#define MAXOSDWIDTH 1920
@ -284,6 +293,8 @@ public:
int SubtitleOffset;
int SubtitleFgTransparency, SubtitleBgTransparency;
int EPGLanguages[I18N_MAX_LANGUAGES + 1];
int EPGScanMaxChannel;
int EPGPauseAfterScan;
int EPGScanTimeout;
int EPGBugfixLevel;
int EPGLinger;
@ -306,6 +317,7 @@ public:
int FoldersInTimerMenu;
int AlwaysSortFoldersFirst;
int DefaultSortModeRec;
int RecSortingDirection;
int NumberKeysForChars;
int ColorKey0, ColorKey1, ColorKey2, ColorKey3;
int VideoDisplayFormat;

View File

@ -4,12 +4,11 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: cutter.c 4.3 2017/05/21 09:45:06 kls Exp $
* $Id: cutter.c 5.4 2025/01/10 13:12:04 kls Exp $
*/
#include "cutter.h"
#include "menu.h"
#include "recording.h"
#include "remux.h"
#include "videodir.h"
@ -232,6 +231,10 @@ private:
int numSequences;
off_t maxVideoFileSize;
off_t fileSize;
int frameErrors;
time_t lastErrorHandling;
cString editedRecordingName;
cRecordingInfo *recordingInfo;
bool suspensionLogged;
int sequence; // cutting sequence
int delta; // time between two frames (PTS ticks)
@ -246,7 +249,7 @@ private:
cPatPmtParser patPmtParser;
bool Throttled(void);
bool SwitchFile(bool Force = false);
bool LoadFrame(int Index, uchar *Buffer, bool &Independent, int &Length);
bool LoadFrame(int Index, uchar *Buffer, bool &Independent, int &Length, bool *Errors = NULL, bool *Missing = NULL);
bool FramesAreEqual(int Index1, int Index2);
void GetPendingPackets(uchar *Buffer, int &Length, int Index);
// Gather all non-video TS packets from Index upward that either belong to
@ -254,15 +257,16 @@ private:
// and add them to the end of the given Data.
bool FixFrame(uchar *Data, int &Length, bool Independent, int Index, bool CutIn, bool CutOut);
bool ProcessSequence(int LastEndIndex, int BeginIndex, int EndIndex, int NextBeginIndex);
void HandleErrors(bool Force = false);
protected:
virtual void Action(void);
public:
cCuttingThread(const char *FromFileName, const char *ToFileName);
cCuttingThread(const char *FromFileName, const char *ToFileName, cRecordingInfo *RecordingInfo);
virtual ~cCuttingThread();
const char *Error(void) { return error; }
};
cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName)
cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName, cRecordingInfo *RecordingInfo)
:cThread("video cutting", true)
{
error = NULL;
@ -274,6 +278,10 @@ cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName)
framesPerSecond = Recording.FramesPerSecond();
suspensionLogged = false;
fileSize = 0;
frameErrors = 0;
lastErrorHandling = 0;
editedRecordingName = ToFileName;
recordingInfo = RecordingInfo;
sequence = 0;
delta = int(round(PTSTICKS / framesPerSecond));
lastVidPts = -1;
@ -294,6 +302,10 @@ cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName)
maxVideoFileSize = MEGABYTE(Setup.MaxVideoFileSize);
if (isPesRecording && maxVideoFileSize > MEGABYTE(MAXVIDEOFILESIZEPES))
maxVideoFileSize = MEGABYTE(MAXVIDEOFILESIZEPES);
if (fromIndex->GetErrors()->Size() > 0) {
recordingInfo->SetErrors(0); // the fromIndex has error indicators, so we reset the error count
recordingInfo->Write();
}
Start();
}
else
@ -328,11 +340,11 @@ bool cCuttingThread::Throttled(void)
return false;
}
bool cCuttingThread::LoadFrame(int Index, uchar *Buffer, bool &Independent, int &Length)
bool cCuttingThread::LoadFrame(int Index, uchar *Buffer, bool &Independent, int &Length, bool *Errors, bool *Missing)
{
uint16_t FileNumber;
off_t FileOffset;
if (fromIndex->Get(Index, &FileNumber, &FileOffset, &Independent, &Length)) {
if (fromIndex->Get(Index, &FileNumber, &FileOffset, &Independent, &Length, Errors, Missing)) {
fromFile = fromFileName->SetOffset(FileNumber, FileOffset);
if (fromFile) {
fromFile->SetReadAhead(MEGABYTE(20));
@ -555,7 +567,9 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn
for (int Index = BeginIndex; Running() && Index < EndIndex; Index++) {
bool Independent;
int Length;
if (LoadFrame(Index, Buffer, Independent, Length)) {
bool Errors;
bool Missing;
if (LoadFrame(Index, Buffer, Independent, Length, &Errors, &Missing)) {
// Make sure there is enough disk space:
AssertFreeDiskSpace(-1);
bool CutIn = !SeamlessBegin && Index == BeginIndex;
@ -572,10 +586,12 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn
return false;
}
// Write index:
if (!DeletedFrame && !toIndex->Write(Independent, toFileName->Number(), fileSize)) {
if (!DeletedFrame && !toIndex->Write(Independent, toFileName->Number(), fileSize, Errors, Missing)) {
error = "toIndex";
return false;
}
frameErrors += Errors + Missing;
HandleErrors();
// Write data:
if (toFile->Write(Buffer, Length) < 0) {
error = "safe_write";
@ -596,6 +612,27 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn
return true;
}
#define ERROR_HANDLING_DELTA 1 // seconds between handling errors
void cCuttingThread::HandleErrors(bool Force)
{
if (Force || time(NULL) - lastErrorHandling >= ERROR_HANDLING_DELTA) {
if (frameErrors > recordingInfo->Errors()) {
recordingInfo->SetErrors(frameErrors);
recordingInfo->Write();
Force = true;
}
if (Force) {
cStateKey StateKey;
if (cRecordings *Recordings = cRecordings::GetRecordingsWrite(StateKey, 1)) {
Recordings->UpdateByName(editedRecordingName);
StateKey.Remove();
}
}
lastErrorHandling = time(NULL);
}
}
void cCuttingThread::Action(void)
{
if (cMark *BeginMark = fromMarks.GetNextBegin()) {
@ -604,6 +641,7 @@ void cCuttingThread::Action(void)
if (!fromFile || !toFile)
return;
int LastEndIndex = -1;
HandleErrors(true); // to make sure an initially reset error count is displayed correctly
while (BeginMark && Running()) {
// Suspend cutting if we have severe throughput problems:
if (Throttled()) {
@ -634,6 +672,7 @@ void cCuttingThread::Action(void)
}
}
}
HandleErrors(true);
}
else
esyslog("no editing marks found!");
@ -642,6 +681,7 @@ void cCuttingThread::Action(void)
// --- cCutter ---------------------------------------------------------------
cCutter::cCutter(const char *FileName)
:recordingInfo(FileName)
{
cuttingThread = NULL;
error = false;
@ -676,10 +716,11 @@ bool cCutter::Start(void)
if (strcmp(originalVersionName, editedVersionName) != 0) { // names must be different!
cRecordingUserCommand::InvokeCommand(RUC_EDITINGRECORDING, editedVersionName, originalVersionName);
if (cVideoDirectory::RemoveVideoFile(editedVersionName) && MakeDirs(editedVersionName, true)) {
Recording.WriteInfo(editedVersionName);
LOCK_RECORDINGS_WRITE;
Recordings->AddByName(editedVersionName, false);
cuttingThread = new cCuttingThread(originalVersionName, editedVersionName);
recordingInfo.Read();
recordingInfo.SetFileName(editedVersionName);
recordingInfo.Write();
SetRecordingTimerId(editedVersionName, cString::sprintf("%d@%s", 0, Setup.SVDRPHostName));
cuttingThread = new cCuttingThread(originalVersionName, editedVersionName, &recordingInfo);
return true;
}
}
@ -695,6 +736,7 @@ void cCutter::Stop(void)
const char *Error = cuttingThread ? cuttingThread->Error() : NULL;
delete cuttingThread;
cuttingThread = NULL;
SetRecordingTimerId(editedVersionName, NULL);
if ((Interrupted || Error) && *editedVersionName) {
if (Interrupted)
isyslog("editing process has been interrupted");
@ -702,9 +744,6 @@ void cCutter::Stop(void)
esyslog("ERROR: '%s' during editing process", Error);
if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), editedVersionName) == 0)
cControl::Shutdown();
cVideoDirectory::RemoveVideoFile(editedVersionName);
LOCK_RECORDINGS_WRITE;
Recordings->DelByName(editedVersionName);
}
}

View File

@ -4,12 +4,13 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: cutter.h 3.1 2013/10/05 11:34:55 kls Exp $
* $Id: cutter.h 5.1 2024/09/19 20:21:58 kls Exp $
*/
#ifndef __CUTTER_H
#define __CUTTER_H
#include "recording.h"
#include "thread.h"
#include "tools.h"
@ -19,6 +20,7 @@ class cCutter {
private:
cString originalVersionName;
cString editedVersionName;
cRecordingInfo recordingInfo;
cCuttingThread *cuttingThread;
bool error;
public:

216
device.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.c 4.22 2017/05/18 09:27:55 kls Exp $
* $Id: device.c 5.14 2024/07/06 11:19:21 kls Exp $
*/
#include "device.h"
@ -58,6 +58,11 @@ bool cDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChanne
return true;
}
bool cDeviceHook::DeviceProvidesEIT(const cDevice *Device) const
{
return true;
}
// --- cDevice ---------------------------------------------------------------
// The minimum number of unknown PS1 packets to consider this a "pre 1.3.19 private stream":
@ -75,9 +80,9 @@ cDevice::cDevice(void)
:patPmtParser(true)
{
cardIndex = nextCardIndex++;
dsyslog("new device number %d", CardIndex() + 1);
dsyslog("new device number %d (card index %d)", numDevices + 1, CardIndex() + 1);
SetDescription("device %d receiver", CardIndex() + 1);
SetDescription("device %d receiver", numDevices + 1);
mute = false;
volume = Setup.CurrentVolume;
@ -90,7 +95,9 @@ cDevice::cDevice(void)
camSlot = NULL;
occupiedFrom = 0;
occupiedTimeout = 0;
occupiedPriority = MINPRIORITY;
player = NULL;
isPlayingVideo = false;
@ -120,6 +127,7 @@ cDevice::~cDevice()
delete dvbSubtitleConverter;
if (this == primaryDevice)
primaryDevice = NULL;
Cancel(3);
}
bool cDevice::WaitForAllDevicesReady(int Timeout)
@ -194,6 +202,7 @@ bool cDevice::SetPrimaryDevice(int n)
primaryDevice->MakePrimaryDevice(true);
primaryDevice->SetVideoFormat(Setup.VideoFormat);
primaryDevice->SetVolumeDevice(Setup.CurrentVolume);
Setup.PrimaryDVB = n + 1;
return true;
}
esyslog("ERROR: invalid primary device number: %d", n + 1);
@ -228,11 +237,11 @@ static int GetClippedNumProvidedSystems(int AvailableBits, cDevice *Device)
int MaxNumProvidedSystems = (1 << AvailableBits) - 1;
int NumProvidedSystems = Device->NumProvidedSystems();
if (NumProvidedSystems > MaxNumProvidedSystems) {
esyslog("ERROR: device %d supports %d modulation systems but cDevice::GetDevice() currently only supports %d delivery systems which should be fixed", Device->CardIndex() + 1, NumProvidedSystems, MaxNumProvidedSystems);
esyslog("ERROR: device %d supports %d modulation systems but cDevice::GetDevice() currently only supports %d delivery systems which should be fixed", Device->DeviceNumber() + 1, NumProvidedSystems, MaxNumProvidedSystems);
NumProvidedSystems = MaxNumProvidedSystems;
}
else if (NumProvidedSystems <= 0) {
esyslog("ERROR: device %d reported an invalid number (%d) of supported delivery systems - assuming 1", Device->CardIndex() + 1, NumProvidedSystems);
esyslog("ERROR: device %d reported an invalid number (%d) of supported delivery systems - assuming 1", Device->DeviceNumber() + 1, NumProvidedSystems);
NumProvidedSystems = 1;
}
return NumProvidedSystems;
@ -242,7 +251,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
{
// Collect the current priorities of all CAM slots that can decrypt the channel:
int NumCamSlots = CamSlots.Count();
int SlotPriority[NumCamSlots];
int SlotPriority[NumCamSlots + 1]; // +1 to avoid a zero sized array in case there are no CAM slots
int NumUsableSlots = 0;
bool InternalCamNeeded = false;
if (Channel->Ca() >= CA_ENCRYPTED_MIN) {
@ -270,15 +279,19 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
if (NumUsableSlots && SlotPriority[j] > MAXPRIORITY)
continue; // there is no CAM available in this slot
for (int i = 0; i < numDevices; i++) {
if (Channel->Ca() && Channel->Ca() <= CA_DVB_MAX && Channel->Ca() != device[i]->CardIndex() + 1)
if (Channel->Ca() && Channel->Ca() <= CA_DVB_MAX && Channel->Ca() != device[i]->DeviceNumber() + 1)
continue; // a specific card was requested, but not this one
bool HasInternalCam = device[i]->HasInternalCam();
if (InternalCamNeeded && !HasInternalCam)
continue; // no CAM is able to decrypt this channel and the device uses vdr handled CAMs
if (NumUsableSlots && !HasInternalCam && !CamSlots.Get(j)->Assign(device[i], true))
continue; // CAM slot can't be used with this device
bool ndr;
if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basically able to do the job
bool ndr = false;
bool TunedToTransponder = device[i]->IsTunedToTransponder(Channel);
if (TunedToTransponder || device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basically able to do the job
bool OccupiedOtherTransponder = !TunedToTransponder && device[i]->Occupied();
if (OccupiedOtherTransponder)
ndr = true;
if (NumUsableSlots && !HasInternalCam) {
if (cCamSlot *csi = device[i]->CamSlot()) {
cCamSlot *csj = CamSlots.Get(j);
@ -296,10 +309,10 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
imp <<= 1; imp |= (LiveView && NumUsableSlots && !HasInternalCam) ? !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlots.Get(j)->MasterSlotNumber()) || ndr : 0; // prefer CAMs that are known to decrypt this channel for live viewing, if we don't need to detach existing receivers
imp <<= 1; imp |= LiveView ? !device[i]->IsPrimaryDevice() || ndr : 0; // prefer the primary device for live viewing if we don't need to detach existing receivers
imp <<= 1; imp |= !device[i]->Receiving() && (device[i] != cTransferControl::ReceiverDevice() || device[i]->IsPrimaryDevice()) || ndr; // use receiving devices if we don't need to detach existing receivers, but avoid primary device in local transfer mode
imp <<= 1; imp |= device[i]->Receiving(); // avoid devices that are receiving
imp <<= 4; imp |= GetClippedNumProvidedSystems(4, device[i]) - 1; // avoid cards which support multiple delivery systems
imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device
imp <<= 1; imp |= device[i]->Receiving() || OccupiedOtherTransponder; // avoid devices that are receiving
imp <<= 5; imp |= GetClippedNumProvidedSystems(5, device[i]) - 1; // avoid cards which support multiple delivery systems
imp <<= 8; imp |= device[i]->Priority() - IDLEPRIORITY; // use the device with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used)
imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device
imp <<= 8; imp |= ((NumUsableSlots && !HasInternalCam) ? SlotPriority[j] : IDLEPRIORITY) - IDLEPRIORITY;// use the CAM slot with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used)
imp <<= 1; imp |= ndr; // avoid devices if we need to detach existing receivers
imp <<= 1; imp |= (NumUsableSlots || InternalCamNeeded) ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels
@ -314,6 +327,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
if (NumUsableSlots && !HasInternalCam)
s = CamSlots.Get(j);
}
//dsyslog("device %d provides channel %d prio %d ndr %d imp %.8X", device[i]->DeviceNumber() + 1, Channel->Number(), Priority, ndr, imp);
}
}
if (!NumUsableSlots)
@ -419,8 +433,9 @@ cDevice *cDevice::GetDeviceForTransponder(const cChannel *Channel, int Priority)
return d; // if any device is tuned to the transponder, we're done
if (d->ProvidesTransponder(Channel)) {
if (d->MaySwitchTransponder(Channel))
Device = d; // this device may switch to the transponder without disturbing any receiver or live view
else if (!d->Occupied() && d->MaySwitchTransponder(Channel)) { // MaySwitchTransponder() implicitly calls Occupied()
return d; // this device may switch to the transponder without disturbing any receiver or live view
else if (!d->Occupied(Priority) && !d->IsBonded() && d->Priority(true) < LIVEPRIORITY) { // MaySwitchTransponder() implicitly calls Occupied()
// we select only devices with priority < LIVEPRIORITY, so device can be switched without impact on recordings or live viewing
if (d->Priority() < Priority && (!Device || d->Priority() < Device->Priority()))
Device = d; // use this one only if no other with less impact can be found
}
@ -430,6 +445,12 @@ cDevice *cDevice::GetDeviceForTransponder(const cChannel *Channel, int Priority)
return Device;
}
void cDevice::ReleaseCamSlot(void)
{
if (camSlot && !camSlot->IsDecrypting() && !camSlot->IsActivating())
camSlot->Assign(NULL);
}
bool cDevice::HasCi(void)
{
return false;
@ -523,7 +544,7 @@ void cDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect)
PixelAspect = 1.0;
}
//#define PRINTPIDS(s) { char b[500]; char *q = b; q += sprintf(q, "%d %s ", CardIndex(), s); for (int i = 0; i < MAXPIDHANDLES; i++) q += sprintf(q, " %s%4d %d", i == ptOther ? "* " : "", pidHandles[i].pid, pidHandles[i].used); dsyslog("%s", b); }
//#define PRINTPIDS(s) { char b[500]; char *q = b; q += sprintf(q, "%d %s ", DeviceNumber() + 1, s); for (int i = 0; i < MAXPIDHANDLES; i++) q += sprintf(q, " %s%4d %d", i == ptOther ? "* " : "", pidHandles[i].pid, pidHandles[i].used); dsyslog("%s", b); }
#define PRINTPIDS(s)
bool cDevice::HasPid(int Pid) const
@ -558,7 +579,7 @@ bool cDevice::AddPid(int Pid, ePidType PidType, int StreamType)
// It's a special PID that may have to be switched into "tap" mode
PRINTPIDS("A");
if (!SetPid(&pidHandles[n], n, true)) {
esyslog("ERROR: can't set PID %d on device %d", Pid, CardIndex() + 1);
esyslog("ERROR: can't set PID %d on device %d", Pid, DeviceNumber() + 1);
if (PidType <= ptTeletext)
DetachAll(Pid);
DelPid(Pid, PidType);
@ -579,7 +600,7 @@ bool cDevice::AddPid(int Pid, ePidType PidType, int StreamType)
n = a;
}
else {
esyslog("ERROR: no free slot for PID %d on device %d", Pid, CardIndex() + 1);
esyslog("ERROR: no free slot for PID %d on device %d", Pid, DeviceNumber() + 1);
return false;
}
if (n >= 0) {
@ -588,7 +609,7 @@ bool cDevice::AddPid(int Pid, ePidType PidType, int StreamType)
pidHandles[n].used = 1;
PRINTPIDS("C");
if (!SetPid(&pidHandles[n], n, true)) {
esyslog("ERROR: can't set PID %d on device %d", Pid, CardIndex() + 1);
esyslog("ERROR: can't set PID %d on device %d", Pid, DeviceNumber() + 1);
if (PidType <= ptTeletext)
DetachAll(Pid);
DelPid(Pid, PidType);
@ -660,11 +681,11 @@ void cDevice::StartSectionHandler(void)
void cDevice::StopSectionHandler(void)
{
if (sectionHandler) {
delete sectionHandler; // automatically detaches filters
delete nitFilter;
delete sdtFilter;
delete patFilter;
delete eitFilter;
delete sectionHandler;
nitFilter = NULL;
sdtFilter = NULL;
patFilter = NULL;
@ -716,6 +737,17 @@ bool cDevice::DeviceHooksProvidesTransponder(const cChannel *Channel) const
return true;
}
bool cDevice::DeviceHooksProvidesEIT(void) const
{
cDeviceHook *Hook = deviceHooks.First();
while (Hook) {
if (!Hook->DeviceProvidesEIT(this))
return false;
Hook = deviceHooks.Next(Hook);
}
return true;
}
bool cDevice::ProvidesTransponder(const cChannel *Channel) const
{
return false;
@ -777,7 +809,17 @@ bool cDevice::IsTunedToTransponder(const cChannel *Channel) const
bool cDevice::MaySwitchTransponder(const cChannel *Channel) const
{
return time(NULL) > occupiedTimeout && !Receiving() && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid);
return !Occupied() && !Receiving() && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid);
}
void cDevice::SetPowerSaveMode(bool On)
{
}
void cDevice::SetPowerSaveIfUnused(void)
{
if (!Occupied() && !Receiving() && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid))
SetPowerSaveMode(true);
}
bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
@ -785,13 +827,14 @@ bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
if (LiveView) {
isyslog("switching to channel %d %s (%s)", Channel->Number(), *Channel->GetChannelID().ToString(), Channel->Name());
cControl::Shutdown(); // prevents old channel from being shown too long if GetDevice() takes longer
// and, if decrypted, this removes the now superfluous PIDs from the CAM, too
}
for (int i = 3; i--;) {
switch (SetChannel(Channel, LiveView)) {
case scrOk: return true;
case scrNotAvailable: Skins.Message(mtInfo, tr("Channel not available!"));
case scrNotAvailable: Skins.QueueMessage(mtInfo, tr("Channel not available!"));
return false;
case scrNoTransfer: Skins.Message(mtError, tr("Can't start Transfer Mode!"));
case scrNoTransfer: Skins.QueueMessage(mtError, tr("Can't start Transfer Mode!"));
return false;
case scrFailed: break; // loop will retry
default: esyslog("ERROR: invalid return value from SetChannel");
@ -807,6 +850,7 @@ bool cDevice::SwitchChannel(int Direction)
Direction = sgn(Direction);
if (Direction) {
cControl::Shutdown(); // prevents old channel from being shown too long if GetDevice() takes longer
// and, if decrypted, this removes the now superfluous PIDs from the CAM, too
int n = CurrentChannel() + Direction;
int first = n;
LOCK_CHANNELS_READ;
@ -827,23 +871,30 @@ bool cDevice::SwitchChannel(int Direction)
result = true;
}
else if (n != first)
Skins.Message(mtError, tr("Channel not available!"));
Skins.QueueMessage(mtError, tr("Channel not available!"));
}
return result;
}
eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
{
cMutexLock MutexLock(&mutexReceiver); // to avoid a race between SVDRP CHAN and HasProgramme()
cMutexLock MutexLock(&mutexChannel); // to avoid a race between SVDRP CHAN and HasProgramme()
cStatus::MsgChannelSwitch(this, 0, LiveView);
if (LiveView) {
if (IsPrimaryDevice() && !Replaying() && !Transferring()) { // this is only for FF DVB cards!
LOCK_CHANNELS_READ;
if (const cChannel *ch = Channels->GetByNumber(currentChannel)) {
if (patFilter)
patFilter->Release(ch->Sid());
}
}
StopReplay();
DELETENULL(liveSubtitle);
DELETENULL(dvbSubtitleConverter);
}
cDevice *Device = (LiveView && IsPrimaryDevice()) ? GetDevice(Channel, LIVEPRIORITY, true) : this;
cDevice *Device = (LiveView && IsPrimaryDevice(false)) ? GetDevice(Channel, LIVEPRIORITY, true) : this;
bool NeedsTransferMode = LiveView && Device != PrimaryDevice();
// If the CAM slot wants the TS data, we need to switch to Transfer Mode:
@ -875,11 +926,10 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
// channel to it, for possible later decryption:
if (camSlot)
camSlot->AddChannel(Channel);
SetPowerSaveMode(false);
if (SetChannelDevice(Channel, LiveView)) {
// Start section handling:
if (sectionHandler) {
if (patFilter)
patFilter->Trigger(Channel->Sid());
sectionHandler->SetChannel(Channel);
sectionHandler->SetStatus(true);
}
@ -892,21 +942,26 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
}
if (Result == scrOk) {
if (LiveView && IsPrimaryDevice()) {
currentChannel = Channel->Number();
// Set the available audio tracks:
ClrAvailableTracks();
for (int i = 0; i < MAXAPIDS; i++)
SetAvailableTrack(ttAudio, i, Channel->Apid(i), Channel->Alang(i));
if (Setup.UseDolbyDigital) {
for (int i = 0; i < MAXDPIDS; i++)
SetAvailableTrack(ttDolby, i, Channel->Dpid(i), Channel->Dlang(i));
if (LiveView) {
if (IsPrimaryDevice(false))
currentChannel = Channel->Number();
if (IsPrimaryDevice()) {
if (patFilter) // this is only for FF DVB cards!
patFilter->Request(Channel->Sid());
// Set the available audio tracks:
ClrAvailableTracks();
for (int i = 0; i < MAXAPIDS; i++)
SetAvailableTrack(ttAudio, i, Channel->Apid(i), Channel->Alang(i));
if (Setup.UseDolbyDigital) {
for (int i = 0; i < MAXDPIDS; i++)
SetAvailableTrack(ttDolby, i, Channel->Dpid(i), Channel->Dlang(i));
}
for (int i = 0; i < MAXSPIDS; i++)
SetAvailableTrack(ttSubtitle, i, Channel->Spid(i), Channel->Slang(i));
if (!NeedsTransferMode)
EnsureAudioTrack(true);
EnsureSubtitleTrack();
}
for (int i = 0; i < MAXSPIDS; i++)
SetAvailableTrack(ttSubtitle, i, Channel->Spid(i), Channel->Slang(i));
if (!NeedsTransferMode)
EnsureAudioTrack(true);
EnsureSubtitleTrack();
}
cStatus::MsgChannelSwitch(this, Channel->Number(), LiveView); // only report status if channel switch successful
}
@ -918,21 +973,34 @@ void cDevice::ForceTransferMode(void)
{
if (!cTransferControl::ReceiverDevice()) {
LOCK_CHANNELS_READ;
if (const cChannel *Channel = Channels->GetByNumber(CurrentChannel()))
if (const cChannel *Channel = Channels->GetByNumber(CurrentChannel())) {
SetPowerSaveMode(false);
SetChannelDevice(Channel, false); // this implicitly starts Transfer Mode
}
}
}
int cDevice::Occupied(void) const
int cDevice::Occupied(int Priority) const
{
if (Priority > occupiedPriority)
return 0;
int Seconds = occupiedTimeout - time(NULL);
return Seconds > 0 ? Seconds : 0;
}
void cDevice::SetOccupied(int Seconds)
void cDevice::SetOccupied(int Seconds, int Priority, time_t From)
{
if (Seconds >= 0)
occupiedTimeout = time(NULL) + min(Seconds, MAXOCCUPIEDTIMEOUT);
if (Seconds < 0)
return;
if (From == 0)
From = time(NULL);
if (From == occupiedFrom)
occupiedPriority = max(Priority, occupiedPriority);
else {
occupiedPriority = Priority;
occupiedFrom = From;
}
occupiedTimeout = From + min(Seconds, MAXOCCUPIEDTIMEOUT);
}
bool cDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
@ -947,7 +1015,7 @@ bool cDevice::HasLock(int TimeoutMs) const
bool cDevice::HasProgramme(void) const
{
cMutexLock MutexLock(&mutexReceiver); // to avoid a race between SVDRP CHAN and HasProgramme()
cMutexLock MutexLock(&mutexChannel); // to avoid a race between SVDRP CHAN and HasProgramme()
return Replaying() || pidHandles[ptAudio].pid || pidHandles[ptVideo].pid;
}
@ -1561,7 +1629,6 @@ int cDevice::PlayTsSubtitle(const uchar *Data, int Length)
return Length;
}
//TODO detect and report continuity errors?
int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
{
int Played = 0;
@ -1625,11 +1692,13 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
return Played;
}
int cDevice::Priority(void) const
int cDevice::Priority(bool IgnoreOccupied) const
{
int priority = IDLEPRIORITY;
if (IsPrimaryDevice() && !Replaying() && HasProgramme())
priority = TRANSFERPRIORITY; // we use the same value here, no matter whether it's actual Transfer Mode or real live viewing
if (!IgnoreOccupied && time(NULL) <= occupiedTimeout && occupiedPriority > priority)
priority = occupiedPriority - 1; // so timers with occupiedPriority can start
cMutexLock MutexLock(&mutexReceiver);
for (int i = 0; i < MAXRECEIVERS; i++) {
if (receiver[i])
@ -1673,6 +1742,7 @@ void cDevice::Action(void)
int Pid = TsPid(b);
bool IsScrambled = TsIsScrambled(b);
for (int i = 0; i < MAXRECEIVERS; i++) {
cMutexLock MutexLock(&mutexReceiver);
cReceiver *Receiver = receiver[i];
if (Receiver && Receiver->WantsPid(Pid)) {
Receiver->Receive(b, TS_SIZE);
@ -1753,7 +1823,7 @@ bool cDevice::AttachReceiver(cReceiver *Receiver)
#ifdef WAIT_FOR_TUNER_LOCK
#define TUNER_LOCK_TIMEOUT 5000 // ms
if (!HasLock(TUNER_LOCK_TIMEOUT)) {
esyslog("ERROR: device %d has no lock, can't attach receiver!", CardIndex() + 1);
esyslog("ERROR: device %d has no lock, can't attach receiver!", DeviceNumber() + 1);
return false;
}
#endif
@ -1768,10 +1838,8 @@ bool cDevice::AttachReceiver(cReceiver *Receiver)
}
}
Receiver->Activate(true);
Lock();
Receiver->device = this;
receiver[i] = Receiver;
Unlock();
if (camSlot && Receiver->priority > MINPRIORITY) { // priority check to avoid an infinite loop with the CAM slot's caPidReceiver
camSlot->StartDecrypting();
if (camSlot->WantsTsData()) {
@ -1783,11 +1851,13 @@ bool cDevice::AttachReceiver(cReceiver *Receiver)
Receiver->scramblingTimeout = TS_SCRAMBLING_TIMEOUT;
bool KnownToDecrypt = ChannelCamRelations.CamDecrypt(Receiver->ChannelID(), camSlot->MasterSlotNumber());
if (KnownToDecrypt)
Receiver->scramblingTimeout *= 10; // give it time to receive ECM/EMM
Receiver->scramblingTimeout *= 9; // give it time to receive ECM/EMM (must be less than MAXBROKENTIMEOUT in recorder.c!)
if (Receiver->ChannelID().Valid())
dsyslog("CAM %d: %sknown to decrypt channel %s (scramblingTimeout = %ds)", camSlot->MasterSlotNumber(), KnownToDecrypt ? "" : "not ", *Receiver->ChannelID().ToString(), Receiver->scramblingTimeout);
}
}
if (patFilter && Receiver->ChannelID().Valid())
patFilter->Request(Receiver->ChannelID().Sid());
Start();
return true;
}
@ -1796,30 +1866,30 @@ bool cDevice::AttachReceiver(cReceiver *Receiver)
return false;
}
void cDevice::Detach(cReceiver *Receiver)
void cDevice::Detach(cReceiver *Receiver, bool ReleaseCam)
{
if (!Receiver || Receiver->device != this)
return;
bool receiversLeft = false;
cMutexLock MutexLock(&mutexReceiver);
mutexReceiver.Lock();
for (int i = 0; i < MAXRECEIVERS; i++) {
if (receiver[i] == Receiver) {
Lock();
if (receiver[i] == Receiver)
receiver[i] = NULL;
Receiver->device = NULL;
Unlock();
Receiver->Activate(false);
for (int n = 0; n < Receiver->numPids; n++)
DelPid(Receiver->pids[n]);
}
else if (receiver[i])
receiversLeft = true;
}
if (patFilter && Receiver->ChannelID().Valid())
patFilter->Release(Receiver->ChannelID().Sid());
mutexReceiver.Unlock();
Receiver->device = NULL;
Receiver->Activate(false);
for (int n = 0; n < Receiver->numPids; n++)
DelPid(Receiver->pids[n]);
if (camSlot) {
if (Receiver->priority > MINPRIORITY) { // priority check to avoid an infinite loop with the CAM slot's caPidReceiver
camSlot->StartDecrypting();
if (!camSlot->IsDecrypting() && !camSlot->IsActivating())
camSlot->Assign(NULL);
if (ReleaseCam)
ReleaseCamSlot();
}
}
if (!receiversLeft)
@ -1833,8 +1903,9 @@ void cDevice::DetachAll(int Pid)
for (int i = 0; i < MAXRECEIVERS; i++) {
cReceiver *Receiver = receiver[i];
if (Receiver && Receiver->WantsPid(Pid))
Detach(Receiver);
Detach(Receiver, false);
}
ReleaseCamSlot();
}
}
@ -1842,16 +1913,17 @@ void cDevice::DetachAllReceivers(void)
{
cMutexLock MutexLock(&mutexReceiver);
for (int i = 0; i < MAXRECEIVERS; i++)
Detach(receiver[i]);
Detach(receiver[i], false);
ReleaseCamSlot();
}
// --- cTSBuffer -------------------------------------------------------------
cTSBuffer::cTSBuffer(int File, int Size, int CardIndex)
cTSBuffer::cTSBuffer(int File, int Size, int DeviceNumber)
{
SetDescription("device %d TS buffer", CardIndex);
SetDescription("device %d TS buffer", DeviceNumber);
f = File;
cardIndex = CardIndex;
deviceNumber = DeviceNumber;
delivered = 0;
ringBuffer = new cRingBufferLinear(Size, TS_SIZE, true, "TS");
ringBuffer->SetTimeouts(100, 100);
@ -1876,7 +1948,7 @@ void cTSBuffer::Action(void)
int r = ringBuffer->Read(f);
if (r < 0 && FATALERRNO) {
if (errno == EOVERFLOW)
esyslog("ERROR: driver buffer overflow on device %d", cardIndex);
esyslog("ERROR: driver buffer overflow on device %d", deviceNumber);
else {
LOG_ERROR;
break;
@ -1907,7 +1979,7 @@ uchar *cTSBuffer::Get(int *Available, bool CheckAvailable)
}
}
ringBuffer->Del(Count);
esyslog("ERROR: skipped %d bytes to sync on TS packet on device %d", Count, cardIndex);
esyslog("ERROR: skipped %d bytes to sync on TS packet on device %d", Count, deviceNumber);
return NULL;
}
delivered = TS_SIZE;

Some files were not shown because too many files have changed in this diff Show More