Compare commits

...

1079 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
Klaus Schmidinger
7cdd4877c3 Adjusted release date 2017-05-25 09:08:46 +02:00
Klaus Schmidinger
37acfbd372 Fixed detecting the inclusion of STL header files in tools.h 2017-05-22 20:21:30 +02:00
Klaus Schmidinger
e7cd3f0b33 No longer displaying the actual (lengthy) commands during the build process 2017-05-22 16:29:49 +02:00
Klaus Schmidinger
354910faab If the Channel+/- keys are pressed while in the Schedules menu, the menu is now switched to the EPG of the new current channel 2017-05-21 13:18:26 +02:00
Klaus Schmidinger
0f1f277819 Fixed setting the local machine's SVDRP host name; only saving the SVDRP host name if it differs from the system's host name 2017-05-21 10:28:10 +02:00
Klaus Schmidinger
3b1b5bde68 Removed TsGetContinuityCounter() from remux.h, using TsContinuityCounter() instead 2017-05-21 09:53:27 +02:00
Klaus Schmidinger
82813f48c4 Added the macro VDR_NO_STL_PROTOTYPES to tools.h 2017-05-21 09:37:45 +02:00
Klaus Schmidinger
0b9870959b Fixed handling remote timers 2017-05-20 13:01:34 +02:00
Klaus Schmidinger
4100b47b37 Reduced the time before a CAM is marked as known to decrypt a particular channel to 3 seconds 2017-05-18 09:32:04 +02:00
Klaus Schmidinger
43c828f8ca Fixed a race between SVDRP CHAN and cDevice::HasProgramme() 2017-05-18 09:18:43 +02:00
Klaus Schmidinger
b01a1ee818 Extended the CI API to allow plugins to implement additional CAM resources 2017-05-18 09:05:46 +02:00
Klaus Schmidinger
50211c706a Fixed a crash in case the bottom text of a CAM menu is empty 2017-05-17 09:17:44 +02:00
Klaus Schmidinger
ce42e42ed7 Added handling RI_HOST_CONTROL to the CI protocol 2017-05-12 09:17:39 +02:00
Klaus Schmidinger
34f572f792 Fixed handling line numbers in error messages when reading EPG data 2017-05-09 12:25:32 +02:00
Klaus Schmidinger
44287ca25e Added a Status parameter to the interface of cDevice::SignalStats() and cDvbDevice::SignalStats() 2017-05-09 11:53:41 +02:00
Klaus Schmidinger
6bed5368e6 Changed the legacy delivery system name "DMBTH" to "DTMB", and added names for DVBC_ANNEX_C and DVBC2 2017-05-09 09:46:28 +02:00
Klaus Schmidinger
4591dcad2c Fixed selecting delivery system names in case of undefined indexes 2017-05-09 09:43:25 +02:00
Klaus Schmidinger
dbcea07600 Changed the default return value of cEpgHandler::BeginSegmentTransfer() to true 2017-05-09 09:20:34 +02:00
Klaus Schmidinger
b76601482f 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 prefering the primary device 2017-05-09 09:13:36 +02:00
Klaus Schmidinger
8e9d445248 cListObject now implements a private copy constructor and assignment operator, to keep derived objects from calling them implicitly 2017-05-09 08:39:19 +02:00
Klaus Schmidinger
7d1dde01ba The constructor of cHash (via cHashBase) now has an additional parameter (OwnObjects); fixed a memory leak in cSectionSyncerHash 2017-05-09 08:33:37 +02:00
Klaus Schmidinger
79b57feab6 Events in the EIT that end before the EPG linger time are now ignored in the incoming data stream 2017-05-03 09:02:24 +02:00
Klaus Schmidinger
1a92ae77a0 Added a note about complete TS packets to cCamSlot::Inject() 2017-05-01 16:26:34 +02:00
Klaus Schmidinger
84b8ea8395 Log messages about switching channels now include the channel ID 2017-05-01 13:06:32 +02:00
Klaus Schmidinger
9491948f04 Fixed handling UNC values 2017-05-01 12:50:12 +02:00
Klaus Schmidinger
073268bd45 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 2017-05-01 09:32:32 +02:00
Klaus Schmidinger
7cfce2fffa Adjusted release date 2017-04-27 08:43:41 +02:00
Klaus Schmidinger
a1fda4f218 Fixed a possible crash when pulling the CAM while decrypting a channel with MTD (cont'd) 2017-04-26 09:18:26 +02:00
Klaus Schmidinger
1a31974789 Fixed a typo 2017-04-24 14:59:39 +02:00
Klaus Schmidinger
3d63936a36 Fixed a possible crash when pulling the CAM while decrypting a channel with MTD 2017-04-24 09:25:29 +02:00
Klaus Schmidinger
2e9060d549 Removed logging DVB API 5 signal statistics, because it happened too often if EPG scan is active (cont'd) 2017-04-23 12:00:06 +02:00
Klaus Schmidinger
467829af32 The SVDRP command LSTC can now list the channels with channel ids; channel number 0 lists the data of the current channel 2017-04-22 15:02:56 +02:00
Klaus Schmidinger
9cd28b2ded Fixed handling the uncorrected block counter for DVB API 3 devices when calculating signal quality 2017-04-20 14:43:54 +02:00
Klaus Schmidinger
686831caf5 Fixed editing a remote timer immediately after it has been created 2017-04-20 10:08:04 +02:00
Klaus Schmidinger
1efd5e6b7e Fixed displaying remote timers in the main menu of skin LCARS 2017-04-20 08:49:31 +02:00
Klaus Schmidinger
f90edc1e8b Removed logging DVB API 5 signal statistics, because it happened too often if EPG scan is active 2017-04-18 13:11:51 +02:00
Klaus Schmidinger
d1ff365767 Updated the Finnish OSD texts 2017-04-18 12:15:01 +02:00
Klaus Schmidinger
6132a46768 Implemented getting and logging DVB API 5 signal statistics 2017-04-17 15:02:44 +02:00
Klaus Schmidinger
1f541487e0 cTSBuffer::Skip() no longer immediately deletes the given number of bytes from the TS buffer 2017-04-15 09:55:32 +02:00
Klaus Schmidinger
1a160e7afe The function cCamSlot::Decrypt() can now also be called with Data == NULL 2017-04-15 09:39:55 +02:00
Klaus Schmidinger
016e10c1b0 Signal strength and quality (CNR) are now determined via DVB API 5 (if available) 2017-04-06 17:12:59 +02:00
Klaus Schmidinger
6d52c80273 Changed some leftover 'number' to 'id' in SVDRP replies 2017-04-04 11:09:14 +02:00
Klaus Schmidinger
63a32ce483 Fixed a deadlock in the SVDRP command PLAY in case there is currently a recording being replayed 2017-04-04 11:05:38 +02:00
Klaus Schmidinger
7170c20c7e Added missing GetById() calls 2017-04-04 09:39:36 +02:00
Klaus Schmidinger
7e6667f58f Changed 'number' to 'id' in the help texts of SVDRP commands that deal with timers 2017-04-03 14:32:33 +02:00
Klaus Schmidinger
67cb53d587 Recordings now have unique ids 2017-04-03 14:11:41 +02:00
Klaus Schmidinger
e622854789 cOsdMenu::Display() now checks whether the OSD size has changed and if so calls SetDisplayMenu() 2017-04-03 12:49:56 +02:00
Klaus Schmidinger
792b9dc45f Added a note to the "Pausing live video" section of the MANUAL 2017-04-03 08:42:10 +02:00
Klaus Schmidinger
fe535d25e5 Added some guidelines and recommendations to the 'Logging' section of PLUGINS.html 2017-04-02 13:01:34 +02:00
Klaus Schmidinger
c4cc5e613c The cEvent class now has a new member 'aux' 2017-04-02 12:13:15 +02:00
Klaus Schmidinger
0a5a7893a5 Detecting whether a particular CAM actually decrypts a given channel is now done separately for each receiver 2017-04-02 10:08:49 +02:00
Klaus Schmidinger
f39d31631b The file 'cam.data' is no longer written if it is read-only 2017-04-02 10:06:31 +02:00
Klaus Schmidinger
8d3ae53bcd Changed tEventID back to u_int32_t 2017-04-01 12:39:46 +02:00
Klaus Schmidinger
d6f57259fa The function cEpgHandlers::BeginSegmentTransfer() is now boolean 2017-03-31 15:24:35 +02:00
Klaus Schmidinger
112bfa5897 The functionality of HandleRemoteModifications() has been moved to timers.[ch] 2017-03-30 15:25:20 +02:00
Klaus Schmidinger
da105e3bda Added credit for Jasmin Jessich 2017-03-28 08:31:51 +02:00
Klaus Schmidinger
2e8815ece8 Silently ignore MTD index -1 2017-03-27 14:26:04 +02:00
Klaus Schmidinger
830e30e2fb Only store ChannelCamRelations for receivers with valid channel ids 2017-03-27 14:02:54 +02:00
Klaus Schmidinger
d60336ba96 Added TS_SYNC to cMtdHandler::Put() 2017-03-27 09:09:37 +02:00
Klaus Schmidinger
44813e56a5 Limiting locking the mtdBuffer to reading and clearing 2017-03-27 08:35:29 +02:00
Klaus Schmidinger
b313d88db1 Improved clearing the MTD buffer and syncing on TS packets 2017-03-26 13:07:01 +02:00
Klaus Schmidinger
9e808255f8 Now stopping any ongoing recordings before stopping the plugins 2017-03-25 14:32:37 +01:00
Klaus Schmidinger
fe57c16f6f Fixed a crash when stopping VDR while recording encrypted channels with MTD 2017-03-25 14:09:31 +01:00
Klaus Schmidinger
2d9eb7e25d Mapping PIDs in CanDecrypt(); improved description of Start-/StopDecrypting(); removed obsolete cMtdCamSlot::IsDecrypting(); fixed getting device fpr channel up/down 2017-03-23 14:34:53 +01:00
Klaus Schmidinger
b7be7c900a cMtdHandler::Put() now processes as many TS packets as possible in one call 2017-03-19 14:20:22 +01:00
Klaus Schmidinger
e2756f8e9a Now clearing the MTD buffer 2017-03-19 13:33:53 +01:00
Klaus Schmidinger
367557039a The function cRingBufferLinear::Clear() can now be called safely from the reading thread, without additional locking 2017-03-19 13:11:39 +01:00
Klaus Schmidinger
31b0feae14 Added some remarks 2017-03-19 10:48:52 +01:00
Klaus Schmidinger
2cc25e65f4 Implemented support for MTD 2017-03-18 16:33:59 +01:00
Klaus Schmidinger
3f9cdea1c1 PIDs can now be added to and deleted from a cReceiver while it is attached to a cDevice 2017-02-21 14:17:07 +01:00
Klaus Schmidinger
71601e363e Fixed setting the local machine's SVDRP host name 2017-02-14 11:04:24 +01:00
Klaus Schmidinger
9b9d15438e Implemented the concept of 'master cams' 2017-01-23 12:01:48 +01:00
Klaus Schmidinger
6121095a30 Changed 'unsigned' to 'signed' in some places to avoid trouble with abs() in gcc6+ 2017-01-09 15:21:13 +01:00
Klaus Schmidinger
6773ab35d2 Fixed updating the elapsed/remaining time in the progress display during fast forward/rewind 2017-01-09 14:52:57 +01:00
Klaus Schmidinger
196f2af596 The mechanism of trying different CAMs when switching to an encrypted channel is now only triggered if there acually is more than one CAM in the system 2017-01-09 14:27:36 +01:00
Klaus Schmidinger
d1ddb39781 The channel/CAM relations are now stored in the file 'cam.data'; fixed a flaw in handling timeouts for encrypted channels 2017-01-09 13:42:41 +01:00
Klaus Schmidinger
882273d508 Added a missing dependency to the Makefile to avoid error messages in the clean-plugins target 2017-01-08 11:09:54 +01:00
Klaus Schmidinger
0aba3abaeb Updated the Russian OSD texts 2017-01-05 11:42:21 +01:00
Klaus Schmidinger
1c7c2f50b0 Fixed a possible deadlock in the recordings handler thread 2017-01-01 17:52:51 +01:00
Klaus Schmidinger
f345908f77 Added 'S3W ABS-3A' to sources.conf 2016-12-27 11:45:25 +01:00
Klaus Schmidinger
ab9e7d50a3 Adjusted release date 2016-12-24 08:48:22 +01:00
Klaus Schmidinger
834ac04c3b Added a short sleep to cTSBuffer::Action() to avoid high CPU usage 2016-12-23 14:49:06 +01:00
Klaus Schmidinger
e2ba3d09a5 Added support for the systemd watchdog 2016-12-23 14:36:24 +01:00
Klaus Schmidinger
bac0ca39ba Avoiding some duplicate code and unnecessary work in nit.c 2016-12-23 14:25:27 +01:00
Klaus Schmidinger
68acf8815c Fixed a possible buffer overflow in handling CA descriptors 2016-12-23 14:08:14 +01:00
Klaus Schmidinger
736f2fed42 Fixed the non-const version of cTimers::GetTimer() 2016-12-23 09:49:31 +01:00
Klaus Schmidinger
fdbbbd146a Fixed a typo in the description of cTimers::GetTimersRead() 2016-12-22 14:31:50 +01:00
Klaus Schmidinger
bac165a751 Added a 'const' version of cTimers::GetTimer() 2016-12-22 14:27:01 +01:00
Klaus Schmidinger
3d488bcf1c Updated the Estonian OSD texts 2016-12-22 14:19:54 +01:00
Klaus Schmidinger
39c9fc1199 Fixed truncated date/time strings in the skins on multi-byte UTF-8 systems 2016-12-22 14:13:42 +01:00
Klaus Schmidinger
99dfe9f66a Added 'S58.5E Kazsat 3' to sources.conf 2016-12-22 13:32:49 +01:00
Klaus Schmidinger
03d6fbec0a Sorted sources.conf by continuous azimuth 2016-12-22 13:30:30 +01:00
Klaus Schmidinger
5c8d366975 Fixed building VDR with systemd >= 230 2016-12-22 13:20:16 +01:00
Klaus Schmidinger
26252c37cd Fixed regenerating the index of audio recordings 2016-12-22 13:14:10 +01:00
Klaus Schmidinger
b6080634cc Added cFont::Width(void) to get the default character width and allow stretched font drawing in high level OSDs 2016-12-22 12:53:09 +01:00
Klaus Schmidinger
f91468ff9b Implemented a frame parser for H.265 (HEVC) recordings 2016-12-22 12:22:11 +01:00
Klaus Schmidinger
22cb026e5e Fixed replaying recordings to their very end, if they don't end with an I-frame 2016-12-22 11:40:25 +01:00
Klaus Schmidinger
be4cdcf170 Improved handling frame numbers to have a smoother progress display during replay of recordings with B-frames 2016-12-22 11:33:12 +01:00
Klaus Schmidinger
fd85701a84 Fixed resuming replay at a given position, which was off by one frame 2016-12-22 09:41:48 +01:00
Klaus Schmidinger
1135a1f9d5 Made the cPlayer member functions FramesPerSecond, GetIndex and GetReplayMode 'const' 2016-12-22 09:26:40 +01:00
Klaus Schmidinger
d71544d797 Added a note to the description of cFont::Size(), regarding possible differences between it and cFont::Height() 2016-12-13 15:01:24 +01:00
Klaus Schmidinger
08066065e3 Fixed a crash when moving a recording to a folder on a different volume 2016-12-13 13:54:00 +01:00
Klaus Schmidinger
a9bd3ca0dc Fixed a crash when deleting a recording that is currently being replayed 2016-12-11 13:06:58 +01:00
Klaus Schmidinger
031bbcef40 Fixed setting the current item and counter values in the Recordings menu after deleting the last recording in a subfolder 2016-12-09 15:00:55 +01:00
Klaus Schmidinger
d6c26af696 Using SetCurrentChannel(int ChannelNumber) instead of the deprecated SetCurrentChannel(const cChannel *Channel) 2016-12-08 10:48:53 +01:00
Klaus Schmidinger
12308b3c29 Fixed a crash when trying to delete a channel that is being used by a timer 2016-12-08 10:43:58 +01:00
Klaus Schmidinger
85ae27e372 The cRwLock class now allows nested read locks within a write lock from the same thread 2016-12-08 10:18:32 +01:00
Klaus Schmidinger
ce6c90a450 The SVDRP command DELC now refuses to delete the very last channel in the list 2016-12-08 09:53:01 +01:00
Klaus Schmidinger
1172937e8a The function SetCurrentChannel(const cChannel *Channel) is now deprecated 2016-12-06 14:17:39 +01:00
Klaus Schmidinger
146f2cbd4d Fixed initializing device specific parameters in cDvbTransponderParameters 2016-11-07 14:33:01 +01:00
Klaus Schmidinger
8ea018404a Updated the Italian OSD texts 2015-09-16 14:12:01 +02:00
Klaus Schmidinger
5d249c1ae5 Fixed an overflow of PIDs in a receiver 2015-09-16 14:08:42 +02:00
Klaus Schmidinger
09e64c24f2 Fixed a crash when deleting a recording 2015-09-16 11:11:42 +02:00
Klaus Schmidinger
462e094783 Adjusted release date 2015-09-14 14:11:00 +02:00
Klaus Schmidinger
8a09e90f02 Fixed handling remote timers 2015-09-14 13:23:06 +02:00
Klaus Schmidinger
bfc3f1f4b2 Fixed moving currently recording timers between machines 2015-09-13 13:57:51 +02:00
Klaus Schmidinger
2b20b9e064 Added missing saving of SVDRPHostName 2015-09-13 11:09:44 +02:00
Klaus Schmidinger
3427e224e3 Adjusted release date 2015-09-13 10:39:52 +02:00
Klaus Schmidinger
cf1474fc19 Removed unnecessary 'false' 2015-09-13 10:39:02 +02:00
Klaus Schmidinger
e6068912a4 Made the aff array 'static const' 2015-09-12 14:56:15 +02:00
Klaus Schmidinger
e59b5bf1af Empty adaptation field TS packets are now skipped when recording 2015-09-11 11:18:40 +02:00
Klaus Schmidinger
6f315bc235 Updated the German OSD texts 2015-09-11 08:45:58 +02:00
Klaus Schmidinger
2491984da3 Centralized remote timer error messages 2015-09-11 08:38:11 +02:00
Klaus Schmidinger
f1bef11f45 Implemented the setup option "Recording/Record key handling" 2015-09-11 08:29:41 +02:00
Klaus Schmidinger
4e46d2bb3b The width and height of the OSD are now limited to the actual maximum dimensions of the output device 2015-09-10 14:18:38 +02:00
Klaus Schmidinger
a384d14f92 No longer delivering the dvbsddevice and rcu plugins with the source archive 2015-09-10 13:51:49 +02:00
Klaus Schmidinger
471c1cc044 Changed the description of the --chartab option in the INSTALL file 2015-09-10 13:36:50 +02:00
Klaus Schmidinger
1cdbdc548a Fixed sorting recordings 2015-09-10 13:29:30 +02:00
Klaus Schmidinger
0f18bd0a6a Fixed a possible stack overflow in cListBase::Sort() 2015-09-10 13:20:21 +02:00
Klaus Schmidinger
14f97d0f2a Skins can now implement cSkinDisplayMenu::MenuOrientation() to display horizontal menus 2015-09-10 11:26:15 +02:00
Klaus Schmidinger
75f28cb0cb The 'newplugin' script now creates the 'po' subdirectory for translations 2015-09-10 11:12:51 +02:00
Klaus Schmidinger
9e58503aee The EPG scanner no longer moves the dish if there is a positioner 2015-09-10 11:08:19 +02:00
Klaus Schmidinger
18f0ce26fd The character 0x0D is now stripped from EPG texts 2015-09-10 11:00:59 +02:00
Klaus Schmidinger
bc0de5dbc5 Implemented full handling of remote timers 2015-09-10 10:39:45 +02:00
Klaus Schmidinger
4e3325b7f7 Implemented setup options for SVDRP peering 2015-09-08 11:08:06 +02:00
Klaus Schmidinger
3284e941c6 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 2015-09-06 09:32:00 +02:00
Klaus Schmidinger
aa40223ff2 Removed extra debug output 2015-09-06 09:25:16 +02:00
Klaus Schmidinger
04edd69b7a Timers now have unique ids 2015-09-06 09:14:53 +02:00
Klaus Schmidinger
50d268538e Added a missing 'const' to cReceiver::Receive(), to protect the given Data from being modified 2015-09-05 11:49:56 +02:00
Klaus Schmidinger
3cd5294d8a Implemented strict locking of global lists 2015-09-01 11:14:27 +02:00
Klaus Schmidinger
8a7bc6a0bb Added a missing 'const' 2015-07-17 10:15:35 +02:00
Klaus Schmidinger
894a392640 Fixed a typo 2015-06-01 20:32:09 +02:00
Klaus Schmidinger
c3b0347556 Implemented SVDRP peering 2015-05-22 13:44:43 +02:00
Klaus Schmidinger
2b9e988dd5 The SVDRP port now accepts multiple concurrent connections 2015-04-29 13:10:06 +02:00
Klaus Schmidinger
b6af7a9cf9 Added missing 'virtual' 2015-04-28 09:26:02 +02:00
Klaus Schmidinger
d14adc1e68 The -u option now also accepts a numerical user id 2015-04-19 12:50:26 +02:00
Klaus Schmidinger
5499d5ae84 The function cOsd::GetBitmap() is now 'protected' 2015-04-19 12:22:29 +02:00
Klaus Schmidinger
0a40ce6f9d Commented out the line #define DEPRECATED_VIDEOSYSTEM in device.h 2015-04-19 12:15:00 +02:00
Klaus Schmidinger
15927fd097 Fixed a compiler warning in font.c 2015-04-19 11:14:27 +02:00
Klaus Schmidinger
c17328da87 Fixed plural handling 2015-04-18 16:19:28 +02:00
Klaus Schmidinger
165aa63d2e The -V and -h options now list the plugins in alphabetical order 2015-04-18 14:55:16 +02:00
Klaus Schmidinger
fa701228d7 The command line option -D now accepts the value '-' (as in -D-), which prevents VDR from using any DVB devices 2015-04-18 14:30:47 +02:00
Klaus Schmidinger
7aef23e97f Implemented default sort mode for recordings 2015-04-18 13:43:29 +02:00
Klaus Schmidinger
e6592e6201 Added a demo case for storing images 2015-04-12 10:37:36 +02:00
Klaus Schmidinger
38ee88e5ee The script that gets called for recordings is now also called right before a recording is edited 2015-04-11 12:12:43 +02:00
Klaus Schmidinger
7d49075079 Reduced the priority of the "video directory scanner" thread and checking cIoThrottle::Engaged() when it is running 2015-04-11 10:47:38 +02:00
Klaus Schmidinger
577d43facf Fixed scaling subtitles (their areas could sometimes extend outside the actual OSD) 2015-03-25 12:39:01 +01:00
Klaus Schmidinger
909e6c6249 Fixed a crash in cOsd::SetAreas() in case CreatePixmap() returns NULL 2015-03-25 08:57:05 +01:00
Klaus Schmidinger
62596f991e Improved syncing on sections when parsing the NIT and SDT 2015-03-17 15:10:57 +01:00
Klaus Schmidinger
fd7ccc7627 Fixed setting the source value of newly created channels, in case the NIT is received from a different, but very close satellite position (cont'd) 2015-03-17 12:27:18 +01:00
Klaus Schmidinger
0bcf5d6da6 Added some comment to cPixmap about the relation between OSD, ViewPort and DrawPort 2015-03-13 15:09:45 +01:00
Klaus Schmidinger
57513db5c4 Added cOsd::MaxPixmapSize() (cont'd) 2015-03-13 15:06:48 +01:00
Klaus Schmidinger
70eb639c41 Fixed setting the source value of newly created channels, in case the NIT is received from a different, but very close satellite position 2015-03-13 12:12:33 +01:00
Klaus Schmidinger
52b1e2a9ff The dvbhddevice plugin is no longer part of the VDR source archive; added a section about Output Devices to the INSTALL file 2015-03-12 11:00:54 +01:00
Klaus Schmidinger
a4b657b040 Added a note about the VDR User Counter and VDR's facebook page to the README file 2015-03-12 10:25:35 +01:00
Klaus Schmidinger
371e60238a Added detection of 24fps 2015-03-11 09:57:21 +01:00
Klaus Schmidinger
cc306290da The Setup/CAM menu now displays which device an individual CAM is currently assigned to 2015-03-09 11:51:08 +01:00
Klaus Schmidinger
eb7816259c Fixed a vertical black line in the "TiledPixmaps" area on the rpihddevice OSD wit 1280x800 pixel 2015-03-08 16:43:40 +01:00
Klaus Schmidinger
735fb20ac6 Added cOsd::MaxPixmapSize() 2015-03-08 16:40:01 +01:00
Klaus Schmidinger
a429eefbe7 Official release of version 2.2.0 2015-02-19 09:17:46 +01:00
Klaus Schmidinger
f53815c6ee Updated the Spanish OSD texts 2015-02-19 09:10:36 +01:00
Klaus Schmidinger
f2fceac341 Updated the French OSD texts 2015-02-18 21:27:43 +01:00
Klaus Schmidinger
968c2ede0d Fixed multiple blanks in the translation files 2015-02-18 11:03:37 +01:00
Klaus Schmidinger
a90a977d68 Removed tags from msgstr 2015-02-18 10:09:50 +01:00
Klaus Schmidinger
7ab61f6732 Updated sources.conf to reflect the fact that Thor 5/6 and Intelsat 10-02 are actually in two separate positions 2015-02-18 09:37:38 +01:00
Klaus Schmidinger
7aae78e8a7 Updated the Slovak OSD texts 2015-02-18 08:55:11 +01:00
Klaus Schmidinger
77a1ff8b00 Fixed leading/trailing blanks in the translation files; bumped all version numbers to 2.2.0 2015-02-17 15:11:36 +01:00
Klaus Schmidinger
9e6ca94a72 Updated the Czech OSD texts 2015-02-17 08:53:26 +01:00
Klaus Schmidinger
5aa16b7489 Improved the German translations of "EPG bugfix level"", "StreamId" and "T2SystemId" 2015-02-16 12:18:43 +01:00
Klaus Schmidinger
d48355c305 Fixed using the default sort mode in a video directory without a ".sort" file 2015-02-16 07:54:21 +01:00
Klaus Schmidinger
519ecddc52 Modified credit to Albert Danis 2015-02-15 10:42:11 +01:00
Klaus Schmidinger
c73e635936 Removed credit to Mario Fenneis (requested by Albert Danis) 2015-02-15 10:31:36 +01:00
Klaus Schmidinger
1ed2b21aaa Updated the Estonian OSD texts 2015-02-14 17:37:36 +01:00
Klaus Schmidinger
1786dc714d Added credit for Albert Danis 2015-02-14 12:02:16 +01:00
Klaus Schmidinger
cc1494bfb6 Updated the Ukrainian OSD texts 2015-02-13 17:41:51 +01:00
Klaus Schmidinger
7b1f643977 Updated the Polish OSD texts 2015-02-13 15:35:18 +01:00
Klaus Schmidinger
01b1137284 Fixed pausing replay at the last editing mark 2015-02-13 15:17:45 +01:00
Klaus Schmidinger
d99d408fd8 Modified the German translations of the OSD texts regarding "adaptive skipping" 2015-02-13 11:59:25 +01:00
Klaus Schmidinger
e1d05f0a0f Added credit for Albert Danis 2015-02-13 11:03:02 +01:00
Klaus Schmidinger
c36d3f5145 Updated the Hungarian OSD texts 2015-02-13 10:39:08 +01:00
Klaus Schmidinger
ac953f5327 Updated the Swedish OSD texts 2015-02-13 10:24:22 +01:00
Klaus Schmidinger
a2b5d4e02b Updated the Finnish OSD texts 2015-02-13 10:19:24 +01:00
Klaus Schmidinger
83b139e7ba Updated the Italian OSD texts 2015-02-13 10:17:36 +01:00
Klaus Schmidinger
62494e735f Updated the Estonian OSD texts 2015-02-13 10:14:28 +01:00
Klaus Schmidinger
7b3c905a46 Updated the Romanian OSD texts 2015-02-13 09:59:11 +01:00
Klaus Schmidinger
ddc4a26457 Updated the Macedonian OSD texts 2015-02-11 22:38:42 +01:00
Klaus Schmidinger
2457dce862 Updated the Lithuanian OSD texts 2015-02-11 12:19:56 +01:00
Klaus Schmidinger
0c19df09d9 Fixed the German translation of "Zap timeout" 2015-02-11 10:19:21 +01:00
Klaus Schmidinger
c298cd5714 Updated the French OSD texts 2015-02-11 10:08:09 +01:00
Klaus Schmidinger
60d5d9762b Updated the Dutch OSD texts 2015-02-11 09:54:07 +01:00
Klaus Schmidinger
22106f6dd3 cOsd::RenderPixmaps() now returns a pointer to cPixmap instead of cPixmapMemory; a cPixmap with a negative layer no longer marks any portion of the OSD's view port as "dirty"; Added a missing initialization of "panning" to the constructor of cPixmapMemory 2015-02-11 09:48:02 +01:00
Klaus Schmidinger
89f5244007 Added command line option --chartab to replace VDR_CHARSET_OVERRIDE 2015-02-10 14:29:27 +01:00
Klaus Schmidinger
d34abd6665 Made the function of the Prev/Next keys during replay configurable 2015-02-10 12:51:07 +01:00
Klaus Schmidinger
fb37e93b04 Made skipping with Green/Yellow keys configurable 2015-02-10 12:18:39 +01:00
Klaus Schmidinger
888c33c890 Updated the Lithuanian OSD texts 2015-02-10 09:46:05 +01:00
Klaus Schmidinger
434bc96c74 Updated the Italian OSD texts 2015-02-10 09:27:59 +01:00
Klaus Schmidinger
9c100c8d0a Added an empty target to the Makefile to make sure the sub-make for libsi is always called 2015-02-09 12:30:42 +01:00
Klaus Schmidinger
2eb23cb9f4 Increased the width of the left text column in the Setup menus to avoid cutting off German texts 2015-02-09 12:04:40 +01:00
Klaus Schmidinger
9c9c1d9e19 Added missing text that was overwritten by translation 2015-02-09 10:46:06 +01:00
Klaus Schmidinger
42bdf852da Updated the Estonian OSD texts 2015-02-09 10:44:57 +01:00
Klaus Schmidinger
b547141f7a Added credit for Clemens Brauers 2015-02-09 10:09:53 +01:00
Klaus Schmidinger
0633053d5d Added "#REMOTE=LIRC" to Make.config.template 2015-02-09 10:00:57 +01:00
Klaus Schmidinger
3a71b2e887 Updated the Ukrainian OSD texts 2015-02-09 09:45:23 +01:00
Klaus Schmidinger
cdb5e90515 Updated the Romanian OSD texts 2015-02-09 09:22:31 +01:00
Klaus Schmidinger
b5128a6e1c Updated the Macedonian OSD texts 2015-02-09 09:20:38 +01:00
Klaus Schmidinger
ac7fa82b2f Updated the Finnish OSD texts 2015-02-09 09:17:31 +01:00
Klaus Schmidinger
a7fa43fd39 Added the UPDATE-2.2.0 file 2015-02-08 11:39:17 +01:00
Klaus Schmidinger
890e57cfab Updated the Hungarian OSD texts 2015-02-08 11:00:00 +01:00
Klaus Schmidinger
f656e7f6a9 Added a missing trailing blank in some translations 2015-02-08 10:19:50 +01:00
Klaus Schmidinger
3104f123ca Added credit for Stefan Herdler 2015-02-08 10:08:47 +01:00
Klaus Schmidinger
f041cf97a2 Updated the Romanian OSD texts 2015-02-07 18:51:28 +01:00
Klaus Schmidinger
8225d3758f Modified EntriesOnSameFileSystem(), so that it returns 'true' if either of the given; changed handling the 'error' variable in cDirCopier 2015-02-07 16:08:13 +01:00
Klaus Schmidinger
202a6b3072 Added a confirmation before renaming a recording to its folder name 2015-02-07 16:01:13 +01:00
Klaus Schmidinger
5b88d0bfac Fixed setting an empty recording name or folder to a blank in the "Edit recording" menu 2015-02-07 15:53:30 +01:00
Klaus Schmidinger
8b57eacd1b Updated the Finnish OSD texts 2015-02-07 14:32:47 +01:00
Klaus Schmidinger
18e7903b78 Fixed a deadlock in accessing marks 2015-02-07 14:29:14 +01:00
Klaus Schmidinger
5d8302b147 Changed "binary" to "adaptive" 2015-02-07 12:18:20 +01:00
Klaus Schmidinger
2e8f4b8d21 Fixed a typo 2015-02-07 11:09:22 +01:00
Klaus Schmidinger
9c13f76b66 Updated the Romanian OSD texts 2015-02-07 10:15:50 +01:00
Klaus Schmidinger
f3e6d39382 cDvbPlayer and cReplayControl now use the same list of editing marks 2015-02-06 15:42:21 +01:00
Klaus Schmidinger
4ffd2d6ccd Modified translations for adaptive skip mode 2015-02-06 11:00:06 +01:00
Klaus Schmidinger
1b2a62623c Changed the naming of "binary skip mode" to "adaptive skip mode" 2015-02-06 10:25:25 +01:00
Klaus Schmidinger
ad45f801d5 Fixed cMarks::GetNextBegin() and cMarks::GetNextEnd() 2015-02-05 14:24:35 +01:00
Klaus Schmidinger
f60d90aeb6 Updated sources.conf to reflect the fact that Astra 4A and SES5 are actually in two separate positions 2015-02-05 11:03:36 +01:00
Klaus Schmidinger
8a519202a8 Changed the German translations if the texts related to "binary skipping" 2015-02-05 10:54:04 +01:00
Klaus Schmidinger
9c9e200df5 Modified runvdr.template to improve compatibility with the "bash" and "dash" shells 2015-02-05 10:43:42 +01:00
Klaus Schmidinger
b3b0747328 Updated the Hungarian OSD texts 2015-02-05 09:58:35 +01:00
Klaus Schmidinger
8f9ff2cfe0 Fixed the German translations of "latitude" and "longitude" (they were swapped) 2015-02-05 09:36:58 +01:00
Klaus Schmidinger
ea94337f96 Updated the Italian OSD texts (cont'd) 2015-02-05 09:19:50 +01:00
Klaus Schmidinger
3e06c99a0a The "Select folder" menu now adds the folder names of all existing recordings to any names that have been predefined in "folders.conf" 2015-02-04 13:20:37 +01:00
Klaus Schmidinger
f2807bc782 Updated the Italian OSD texts 2015-02-04 10:46:10 +01:00
Klaus Schmidinger
6464eff516 In the "Edit recording" menu the '0' key can now be used on the "Name:" field to remove the name of the recording and replace it with the last element of the recording's folder path name 2015-02-04 09:38:55 +01:00
Klaus Schmidinger
e1acb774c6 Added "NORDIG" to the list of "DVB/Standard compliance" options and using it to restrict the LCN (Logical Channel Numbers) parsing to networks that actually use this non-standard feature 2015-02-04 09:18:30 +01:00
Klaus Schmidinger
de6d37134c Fixed setting the Blue button in the Schedule/Now/Next menus, so that it only shows "Switch" if the selected event is on a different channel 2015-02-03 11:56:51 +01:00
Klaus Schmidinger
93ec1a9df2 Fixed switching channels in the Schedule menu after going through various Now and Schedule menus for different channels 2015-02-03 10:52:33 +01:00
Klaus Schmidinger
0703fbf527 Updated the Hungarian OSD texts 2015-02-03 09:51:45 +01:00
Klaus Schmidinger
0e5de67d5f Updated the Romanian OSD texts 2015-02-03 09:38:17 +01:00
Klaus Schmidinger
d993d51367 Updated the Ukrainian OSD texts 2015-02-03 09:31:36 +01:00
Klaus Schmidinger
3909ce39ef Updated the Estonian OSD texts 2015-02-03 09:17:40 +01:00
Klaus Schmidinger
e8cd0ed7c5 Updated the Finnish OSD texts 2015-02-03 08:51:59 +01:00
Klaus Schmidinger
85969bc0bd Added a missing VDRDIR="$(CWD)" to the clean-plugins target of the Makefile 2015-02-02 14:50:46 +01:00
Klaus Schmidinger
659f67f04f Fixed cCamSlot::Assign(), so that it actually ignores the value of Query if Device is NULL (as described in the header file) 2015-02-02 14:04:10 +01:00
Klaus Schmidinger
e2d0f3f845 Added "Setup/Replay/Binary skip strict" 2015-02-02 13:59:19 +01:00
Klaus Schmidinger
ed766859d7 Added code from the "jumpplay" patch that makes the recording still be considered unviewed when stopping replay within RESUMEBACKUP seconds of the first mark 2015-02-02 09:51:32 +01:00
Klaus Schmidinger
5503161fdc Added SDNOTIFY, NO_KBD and BIDI to Make.config.template 2015-02-02 09:13:10 +01:00
Klaus Schmidinger
e83b09b4eb Adjusted release date 2015-02-02 08:56:39 +01:00
Klaus Schmidinger
2e34a10e93 Updated the Lithuanian OSD texts 2015-02-02 08:53:35 +01:00
Klaus Schmidinger
aa838791bf Fixed the Finnish translation of "Binary skip timeout (s)" 2015-02-01 16:21:39 +01:00
Klaus Schmidinger
4a6f714153 Fixed the German translation of "VDR will shut down later - press Power to force" 2015-02-01 15:20:04 +01:00
Klaus Schmidinger
f736d3a3de Fixed the German translation of "Binary skip timeout (s)" 2015-02-01 15:03:34 +01:00
Klaus Schmidinger
471b287f70 Fixed a memory leak in case of broken Extended Event Descriptors 2015-02-01 14:59:52 +01:00
Klaus Schmidinger
1c4865147a Added support for LCN (Logical Channel Numbers) 2015-02-01 13:49:10 +01:00
Klaus Schmidinger
b3bc711ed2 Removed a superfluous entry 2015-02-01 12:51:23 +01:00
Klaus Schmidinger
ef09e376b1 Updated the Finnish OSD texts 2015-02-01 11:34:57 +01:00
Klaus Schmidinger
0a5eb88696 Fixed setting the read index in cDvbPlayer::Goto() in case Still is false; The function cDvbPlayer::Goto() now automatically calls Play() if Still is false 2015-02-01 11:20:54 +01:00
Klaus Schmidinger
63372cd4aa Now also checking the CAM slot's priority when activating a CAM 2015-01-31 14:50:55 +01:00
Klaus Schmidinger
b9f0e39b1b Fixed a typo 2015-01-31 14:36:41 +01:00
Klaus Schmidinger
ebab5f3ec1 Made cRecording::GetResume() public 2015-01-31 13:37:02 +01:00
Klaus Schmidinger
6749e4ead9 Modified behavior of the '8' key during replay 2015-01-31 11:42:05 +01:00
Klaus Schmidinger
58c4fd5a0b Added ARGSDIR to the ONEDIR section of Make.config.template 2015-01-30 15:20:57 +01:00
Klaus Schmidinger
fccebc816d Updated the Estonian OSD texts 2015-01-30 13:41:03 +01:00
Klaus Schmidinger
bf7cc2c04f Added support for smart card activation 2015-01-30 13:38:44 +01:00
Klaus Schmidinger
7f195606ee Changed unit and range for binary skip timeout 2015-01-29 09:05:50 +01:00
Klaus Schmidinger
91e0151674 The keys '1' and '3' can now be used in replay mode to position an editing mark in "binary" mode 2015-01-27 21:22:53 +01:00
Klaus Schmidinger
4aa496b079 Added support for "Satellite Channel Routing" (SCR) according to EN50607, also known as "JESS" 2015-01-26 12:02:14 +01:00
Klaus Schmidinger
4fcd3ba56e Added functionality based on the "jumpplay" patch 2015-01-26 10:20:51 +01:00
Klaus Schmidinger
77c0de71c4 Updated the Romanian OSD texts 2015-01-24 11:01:43 +01:00
Klaus Schmidinger
7c40f797dc Added a missing 'void' 2015-01-23 15:12:47 +01:00
Klaus Schmidinger
189f694710 Updated the Finnish OSD texts 2015-01-23 10:27:01 +01:00
Klaus Schmidinger
b02c8b606c Fixed the link to "svdrpsend (1)" in the vdr.1 man page 2015-01-20 15:35:44 +01:00
Klaus Schmidinger
24c9e45789 Fixed "warning: invalid suffix on literal" with GCC 4.8 and C++11 2015-01-20 14:56:18 +01:00
Klaus Schmidinger
53db7fdc50 Added entries for version 2.0.7 2015-01-20 09:33:07 +01:00
Klaus Schmidinger
70aa4e4247 Updated the Italian OSD texts 2015-01-20 09:06:54 +01:00
Klaus Schmidinger
b26898e6e1 Adjusted release date 2015-01-18 10:14:48 +01:00
Klaus Schmidinger
0c2316b638 Added the new command line option --updindex 2015-01-17 15:03:01 +01:00
Klaus Schmidinger
f42cbac237 Fixed generating the index file of an existing recording 2015-01-17 13:47:33 +01:00
Klaus Schmidinger
b06d9cce37 Enhanced description of "Volume linearize" 2015-01-17 11:37:10 +01:00
Klaus Schmidinger
be92ad13ab Now returning from removing deleted recordings after at most 10 seconds, or if the user presses a remote control key 2015-01-17 10:52:15 +01:00
Klaus Schmidinger
3bb447cf8d Added a comment to cRecorder::Activate() about the need to call Detach() in the destructor 2015-01-15 14:29:18 +01:00
Klaus Schmidinger
66c65beea7 Added cOsdProvider::OsdSizeChanged() 2015-01-15 11:33:58 +01:00
Klaus Schmidinger
be9a6de0ef Plugins can now implement the function SetMenuSortMode() in their skin objects derived from cSkinDisplayMenu, to get informed about the currently used sort mode 2015-01-15 10:51:37 +01:00
Klaus Schmidinger
b3954aefd5 Modified the CAM API so that it is possible to implement CAMs that can be freely assigned to any devices 2015-01-15 09:28:37 +01:00
Klaus Schmidinger
555fe68a01 Added the channel name to log messages that reference a channel 2015-01-14 12:17:39 +01:00
Klaus Schmidinger
1ddda558b0 Modified the descriptions of several threads 2015-01-14 11:39:55 +01:00
Klaus Schmidinger
db47cdaa1a Use of the function cOsd::GetBitmap() outside of derived classes is now deprecated 2015-01-14 10:50:55 +01:00
Klaus Schmidinger
7062583ab4 Added support for PGS subtitles 2015-01-14 10:39:55 +01:00
Klaus Schmidinger
b454a0777f Added handling for DTS audio tracks to cPatPmtParser::ParsePmt() 2015-01-14 09:36:00 +01:00
Klaus Schmidinger
6ba9de491c Added boolean return values to cVector's InsertUnique(), AppendUnique() and RemoveElement() 2015-01-14 09:09:06 +01:00
Klaus Schmidinger
24b38eb812 Now handling CAT sections that consist of more than one TS packet 2015-01-13 14:45:12 +01:00
Klaus Schmidinger
14e37ed124 Changed the German weekday names from "MonDieMitDonFreSamSon" to "Mo.Di.Mi.Do.Fr.Sa.So." 2015-01-13 10:01:50 +01:00
Klaus Schmidinger
cee82d8659 Fixed jumping to an absolute position via the Red key in case replay was paused 2015-01-13 09:51:20 +01:00
Klaus Schmidinger
f5bbf06b60 Added the new parameters "Setup/Miscellaneous/Volume steps" and ".../Volume linearize" 2015-01-12 14:56:42 +01:00
Klaus Schmidinger
6b229d7d5f Added functions to set and retrieve the priority of a cReceiver 2015-01-12 14:12:19 +01:00
Klaus Schmidinger
67fff7f4fc Fixed a possible out-of-bounds access in cVector::Remove() 2015-01-12 12:14:16 +01:00
Klaus Schmidinger
6e35f47a3e Added the functions IndexOf(), InsertUnique(), AppendUnique() and RemoveElement() to the cVector class 2015-01-12 12:10:15 +01:00
Klaus Schmidinger
6514649439 Added subsystem id support for DVB devices connected via USB 2015-01-12 11:42:15 +01:00
Klaus Schmidinger
77340e9273 Added a missing backslash to the help text of the SVDRP command MOVR 2015-01-12 11:19:11 +01:00
Klaus Schmidinger
35f73199d4 Fixed resetting the receiver for EMM pids for CAMs that need to receive the TS (cont'd) 2015-01-12 10:44:58 +01:00
Klaus Schmidinger
34c79fdc50 Fixed support for systemd 2015-01-11 13:42:26 +01:00
Klaus Schmidinger
c8e789e12a Revoked "Increased the PMT_SCAN_TIMEOUT to avoid timeouts when scanning PMTs" (was unnecessary); pat.c change removed from RCS 2015-01-11 13:32:55 +01:00
Klaus Schmidinger
77173b7057 Fixed (well, actually worked around) a problem with subtitles not being displayed because the broadcaster doesn't set the data's version numbers as required by the DVB standard 2015-01-09 12:03:31 +01:00
Klaus Schmidinger
7fac1d4ae2 Fixed resetting the receiver for EMM pids for CAMs that need to receive the TS 2015-01-09 09:46:57 +01:00
Klaus Schmidinger
52620f147b Fixed detaching receivers from devices in case a CAM needs to receive the TS 2015-01-07 13:00:33 +01:00
Klaus Schmidinger
f3d583b124 Increased the PMT_SCAN_TIMEOUT to avoid timeouts when scanning PMTs 2015-01-06 14:02:40 +01:00
Klaus Schmidinger
fc0094231d Added cOsd::DrawScaledBitmap() 2015-01-04 15:53:47 +01:00
Klaus Schmidinger
aacdeba5d9 Fixed multiple OBSOLETE marks in channels that are not listed in the SDT in case "Setup/Miscellaneous/Show channel names with source" is set to "yes" 2015-01-04 15:11:13 +01:00
Klaus Schmidinger
761fb103b7 Channels that are not listed in the SDT are now only marked as OBSOLETE if"Setup/DVB/Update channels" is set to a value other than "no" or "PIDs only" 2015-01-04 14:37:36 +01:00
Klaus Schmidinger
afc17c1168 The pid of the PMT in which the CA descriptors of a given channel are broadcast is now stored together with the CA descriptors 2015-01-04 13:36:46 +01:00
Klaus Schmidinger
bfdd611fde Fixed a bug in the Makefile when installing plugins with LCLBLD=1 2015-01-01 13:55:13 +01:00
Klaus Schmidinger
ffeb43a38a Updated the dvbhddevice plugin source 2014-10-03 13:36:58 +02:00
Klaus Schmidinger
93f4852ba3 Fixed a possible crash in the LCARS skin 2014-06-12 08:55:32 +02:00
Klaus Schmidinger
4e460da371 VDR now reads command line options from *.conf files in /etc/vdr/conf.d 2014-04-14 13:15:34 +02:00
Klaus Schmidinger
6feb8d8875 Added entries for version 2.0.6 2014-04-13 14:04:47 +02:00
Klaus Schmidinger
57222002b2 Fixed a possible division by zero in frame rate detection 2014-04-13 13:50:04 +02:00
Klaus Schmidinger
4fc8101910 Whitespace fix 2014-04-13 11:49:40 +02:00
Klaus Schmidinger
011a984951 A cCamSlot that has WantsTsData set to true in its constructor now also gets the CAT and EMM PIDs data 2014-04-06 10:56:50 +02:00
Klaus Schmidinger
105ad61b6f Updated the Italian OSD texts 2014-03-24 13:28:05 +01:00
Klaus Schmidinger
23ea3dcb48 No longer logging an error message in DirSizeMB() if the given directory doesn't exist 2014-03-22 14:25:46 +01:00
Klaus Schmidinger
a4b8729e6a Added support for systemd 2014-03-16 12:53:47 +01:00
Klaus Schmidinger
687b93b215 Now resetting the isOnVideoDirectoryFileSystem member of a cRecording to -1 after renaming it 2014-03-16 11:11:04 +01:00
Klaus Schmidinger
8af9abbbb9 Now initializing the isOnVideoDirectoryFileSystem member of cRecording when scanning the video directory 2014-03-16 11:01:46 +01:00
Klaus Schmidinger
25e2dbf031 Added support for "Pilot", "T2-System-Id" and "SISO/MISO" parameters 2014-03-16 10:48:30 +01:00
Klaus Schmidinger
af56e53315 Refactored setup parameter handling for output devices 2014-03-15 14:05:15 +01:00
Klaus Schmidinger
7a114d640c Added a log message in case a receiver is detached from its device because the assigned CAM can't decrypt the channel 2014-03-11 09:48:40 +01:00
Klaus Schmidinger
c5071cc87b The SDT is now only parsed *after* the NIT has been read 2014-03-10 14:50:58 +01:00
Klaus Schmidinger
0990c279c7 Fixed indentation 2014-03-10 13:31:23 +01:00
Klaus Schmidinger
76c32d60f9 When checking for obsolete channels, those with an RID that is not 0 are now ignored 2014-03-10 13:17:11 +01:00
Klaus Schmidinger
ebdac2ddfc Fixed drawing the live indicator in the LCARS skin in case there are no devices 2014-03-10 12:09:52 +01:00
Klaus Schmidinger
caf708b618 Updated the Finnish OSD texts 2014-03-10 10:48:15 +01:00
Klaus Schmidinger
40aaf784b9 The Recordings menu now remembers the last recording the cursor was positioned on 2014-03-09 15:15:48 +01:00
Klaus Schmidinger
db1ca2c854 Removed an unnecessary assignment from cMenuRecordings::~cMenuRecordings() 2014-03-09 13:03:35 +01:00
Klaus Schmidinger
a9f1297022 Fixed adding new source types in case they are already registered 2014-03-09 12:11:32 +01:00
Klaus Schmidinger
f8058586f9 Fixed handling PAT packets when detecting frames 2014-03-08 15:05:35 +01:00
Klaus Schmidinger
ad1352f109 Fixed a possible endless loop in cH264Parser::GetGolombUe() 2014-03-08 15:04:09 +01:00
Klaus Schmidinger
df03740741 Changed email address of Christopher Reimer 2014-03-05 10:18:18 +01:00
Klaus Schmidinger
a437a3d743 Fixed handling transfer mode on full featured DVB cards for encrypted channels that have no audio pid 2014-02-27 17:05:55 +01:00
Klaus Schmidinger
927aa49576 Fixed keeping the current position in the Recordings menu if a recording was deleted in a sub folder 2014-02-26 11:39:06 +01:00
Klaus Schmidinger
de1ce0b27d Revoked "Fixed some compiler warnings with Clang 3.4.1" from ci.c, because this did not compile with older versions of gcc 2014-02-25 10:04:07 +01:00
Klaus Schmidinger
a9e1ca63dd Adjusted release date 2014-02-23 13:05:38 +01:00
Klaus Schmidinger
4cd251fc48 Fixed handling frame detection buffer length 2014-02-21 15:14:14 +01:00
Klaus Schmidinger
6d59e2866b Fixed detecting broken video data streams when recording 2014-02-21 09:20:36 +01:00
Klaus Schmidinger
da13903228 No section number in debug message 2014-02-19 08:57:43 +01:00
Klaus Schmidinger
585f622886 Fixed the replay progress display for very long recordings 2014-02-18 13:48:05 +01:00
Klaus Schmidinger
0de69c3899 Improved PAT/PMT scanning to speed up initial tuning to encrypted channels on transponders with many PAT entries 2014-02-18 13:12:39 +01:00
Klaus Schmidinger
0238234c52 Fixed learning keyboard remote control codes 2014-02-15 12:43:25 +01:00
Klaus Schmidinger
8b2f500d2a Replaced the NULL pointer assignment in ~cReceiver() to force a segfault with a call to abort() 2014-02-08 16:00:13 +01:00
Klaus Schmidinger
a30563634d Added LinkageTypePremiere to libsi/si.h and eit.c to avoid a compiler warning with Clang 3.4.1 2014-02-08 14:21:47 +01:00
Klaus Schmidinger
e5fde77e56 Fixed some compiler warnings with Clang 3.4.1 2014-02-08 13:00:39 +01:00
Klaus Schmidinger
bfb9c8fddd Fixed numbering frames (cont'd) 2014-02-08 11:16:02 +01:00
Klaus Schmidinger
0402ce9b8e Fixed a possible crash in the OSD demo 2014-02-06 11:57:51 +01:00
Klaus Schmidinger
e2f0edd8f6 Fixed numbering frames 2014-02-06 10:57:45 +01:00
Klaus Schmidinger
4f1404e991 Fixed flickering if subtitles are active while the OSD demo is running 2014-02-04 10:45:55 +01:00
Klaus Schmidinger
9813a9164b Further clarified the semantics of cCamSlot::Decrypt() 2014-01-31 09:21:47 +01:00
Klaus Schmidinger
b9ba7000bb Updated the Estonian OSD texts 2014-01-31 09:10:07 +01:00
Klaus Schmidinger
4c304467ba Fixed clearing non-editable members in the channel editor 2014-01-30 09:10:39 +01:00
Klaus Schmidinger
6a9502ab17 Fixed sorting recordings by time in the Recordings menu if "Setup/OSD/Recording directories" is set to "no" 2014-01-29 10:45:28 +01:00
Klaus Schmidinger
9eda923269 Increased MIN_TS_PACKETS_FOR_FRAME_DETECTOR to 100 and introduced counting the number of actual video TS packets in cTsPayload 2014-01-28 11:26:02 +01:00
Klaus Schmidinger
47a6f8fbff Now checking whether the primary device actually has a decoder before retuning the current channel after a change in its parameters 2014-01-26 12:40:57 +01:00
Klaus Schmidinger
c2826000bb Now checking whether the primary device atcually has a decoder before retuning the current channel after a change in its parameters 2014-01-26 12:27:51 +01:00
Klaus Schmidinger
7cea5df074 Adjusted release date 2014-01-26 10:40:23 +01:00
Klaus Schmidinger
8b9e1f513f Fixed a superfluous call to the skin's SetRecording() function after renaming a recording 2014-01-25 12:44:32 +01:00
Klaus Schmidinger
fdbf796b6b The new function cStatus::ChannelChange() can be implemented by plugins to be informed about changes to the parameters of a channel that may require a retune 2014-01-25 10:54:51 +01:00
Klaus Schmidinger
5ac41bf091 Revoked "Fixed sending CA descriptors to CAMs in case a cReceiver is not used for a recording or live view" - was unstable 2014-01-24 11:55:40 +01:00
Klaus Schmidinger
e158021a4d Replaced "Schnitt" with "Bearbeitung" in the German OSD texts 2014-01-22 10:40:50 +01:00
Klaus Schmidinger
549c499501 Fixed a wrong alignment in cCiDateTime::SendDateTime() 2014-01-22 09:41:08 +01:00
Klaus Schmidinger
838566ea41 Fixed a deadlock 2014-01-21 11:12:01 +01:00
Klaus Schmidinger
6e2f0f695f Now making sure the primary device goes into transfer mode for live viewing if the CAM wants to receive the TS data 2014-01-20 12:14:30 +01:00
Klaus Schmidinger
6f9929b1c0 Now unassigning CAMs from their devices when they are no longer used 2014-01-18 14:30:58 +01:00
Klaus Schmidinger
35d4ceaf37 Fixed deleting the source recording after moving it to a different volume (cont'd) 2014-01-18 12:54:56 +01:00
Klaus Schmidinger
2e41129c36 Fixed detecting frame borders in MPEG-2 streams that have "bottom fields" or varying GOP structures 2014-01-18 11:27:30 +01:00
Klaus Schmidinger
1df6a87249 Now waiting explicitly until all CAM slots are ready before switching to the initial channel when VDR is started 2014-01-16 11:57:54 +01:00
Klaus Schmidinger
e02d608bce Fixed deleting the source recording after moving it to a different volume 2014-01-16 11:09:03 +01:00
Klaus Schmidinger
7008aeaf22 Increased MIN_TS_PACKETS_FOR_FRAME_DETECTOR to 10 2014-01-16 10:31:28 +01:00
Klaus Schmidinger
ac44e6f2ae Added logging the supported system ids of a CAM 2014-01-15 10:21:48 +01:00
Klaus Schmidinger
1d869c4b36 Fixed sending CA descriptors to CAMs in case a cReceiver is not used for a recording or live view, like e.g. streaming clients 2014-01-14 14:39:59 +01:00
Klaus Schmidinger
e7c86c6760 Improved locking for CAM slots and made the pure functions of cCiAdapter have default implementations 2014-01-14 12:21:17 +01:00
Klaus Schmidinger
dbf342df3c cFont::CreateFont() now returns a dummy font in case there are no fonts installed 2014-01-07 12:42:37 +01:00
Klaus Schmidinger
3cf87dfe8a Added entries for version 2.0.5 2014-01-07 10:34:24 +01:00
Klaus Schmidinger
ea5e373df6 Updated 'sources.conf' 2014-01-07 09:03:29 +01:00
Klaus Schmidinger
c7256c1c11 Channels that are no longer contained in the current SDT of a transponder are now marked with the keyword OBSOLETE in their name and provider fields 2014-01-05 10:41:46 +01:00
Klaus Schmidinger
7cbced0c12 Made GetCaDescriptors() and GetCaPids() return all values if CaSystemIds is 0xFFFF 2014-01-04 11:17:24 +01:00
Klaus Schmidinger
a84defe86f Added support for buffered CAM decryption 2014-01-02 10:47:08 +01:00
Klaus Schmidinger
9dbd953cc2 Eliminated MAXDVBDEVICES 2014-01-01 14:26:26 +01:00
Klaus Schmidinger
ea613e6b26 Avoiding unnecessary pkg-config warnings in plugin Makefiles 2014-01-01 13:35:13 +01:00
Klaus Schmidinger
16dd077fb2 Changed email address for Christian Kaiser 2014-01-01 13:10:30 +01:00
Klaus Schmidinger
4da70bbab1 The script given to VDR with the '-r' option is now also called after the recording process has actually started 2014-01-01 12:53:40 +01:00
Klaus Schmidinger
566c6fa464 Added receiving Ca pids to cCamSlot 2014-01-01 12:37:22 +01:00
Klaus Schmidinger
b95b85fee4 Deleted a superfluous assignment in cPipe::Open() 2013-12-29 17:22:10 +01:00
Klaus Schmidinger
63ee17701a Added a check to avoid a possible NULL pointer dereference in cCiSession::SendData() 2013-12-29 17:20:22 +01:00
Klaus Schmidinger
00e2415b81 Implemented cCamSlot::Decrypt() 2013-12-28 13:29:54 +01:00
Klaus Schmidinger
6a8a2cf5fb Changed '%a' to the POSIX compliant '%m' in all scanf() calls 2013-12-28 11:37:42 +01:00
Klaus Schmidinger
c949ad35cc Fixed some spellings in positioner.h and Doxyfile 2013-12-28 11:21:09 +01:00
Klaus Schmidinger
ae4ffacbda Avoiding double entries when externally renaming a recording (cont'd) 2013-12-27 11:06:01 +01:00
Klaus Schmidinger
1379b621f7 Now handing down the recording filter to sub menus 2013-12-27 09:00:24 +01:00
Klaus Schmidinger
089b5eb212 Avoiding double entries when externally renaming a recording 2013-12-27 08:46:17 +01:00
Klaus Schmidinger
7c877edd2d Added a note to ePlayMode in device.h that VDR itself always uses pmAudioVideo when replaying a recording 2013-12-25 13:55:39 +01:00
Klaus Schmidinger
4e22b62192 cDevice::TrickSpeed() now has an additional parameter named Forward 2013-12-25 13:36:51 +01:00
Klaus Schmidinger
21c8829783 Made it clear that the Data parameter in cDevice::StillPicture() may point to a series of packets, not just a single one 2013-12-25 13:12:07 +01:00
Klaus Schmidinger
20791e4d95 Added handling UTF-8 'umlaut' characters to cKbdRemote 2013-12-25 12:47:04 +01:00
Klaus Schmidinger
f6283b8e91 The Recordings menu can now be called with a cRecordingFilter 2013-12-25 12:13:00 +01:00
Klaus Schmidinger
b936cb366f Fixed setting the name of the video directory to avoid a crash when using --genindex, and also to use the correct directory with --edit 2013-12-25 11:36:44 +01:00
Klaus Schmidinger
31e334a332 Added a missing closing ')' in the help and man page entry of the --vfat option 2013-12-25 11:04:25 +01:00
Klaus Schmidinger
7a2d3d993c Fixed a possible crash if the recordings list is updated externally while the Recordings menu is open 2013-12-24 14:41:09 +01:00
Klaus Schmidinger
a9acab6b7e Fixed uninitialized item area coordinates in cSkinLCARSDisplayMenu 2013-11-16 13:26:55 +01:00
Klaus Schmidinger
a8cbe3a56d Simplified some conditional expressions in skinlcars.c and skinsttng.c 2013-11-15 15:35:21 +01:00
Klaus Schmidinger
dfb9862460 Fixed a missing initialization in the c'tor of cSkinLCARSDisplayChannel 2013-11-15 15:23:43 +01:00
Klaus Schmidinger
215fde71a3 Updated the Italian OSD texts 2013-11-11 10:35:09 +01:00
Klaus Schmidinger
4bee872c09 Fixed a typo 2013-11-04 12:48:31 +01:00
Klaus Schmidinger
e8f557ae5f Removed '_' from the FileNameChars and CharMap translations in uk_UA.po 2013-11-04 11:24:53 +01:00
Klaus Schmidinger
d7462ae5ad Changes in the teletext PID no longer cause retuning 2013-11-04 10:11:51 +01:00
Klaus Schmidinger
a48a0543c8 Fixed some typos 2013-11-03 14:48:21 +01:00
Klaus Schmidinger
ff4aed2227 The new menu category mcRecordingEdit is now used to mark menus that edit recording properties 2013-11-03 14:10:59 +01:00
Klaus Schmidinger
39f6b6fc6b Fixed a possible access to uninitialized data in cEIT::cEIT() 2013-11-03 14:02:01 +01:00
Klaus Schmidinger
0b5085f4f0 In the "Select folder" menu pressing Ok now selects the folder, even if this is a folder that contains sub folders 2013-11-03 13:43:01 +01:00
Klaus Schmidinger
512cd24e53 Added code for parsing LCN and AVC descriptors to libsi 2013-10-30 10:18:26 +01:00
Klaus Schmidinger
83a8d5a561 Changed the absolute latitude limit for visible satellites to 81.2 degrees 2013-10-30 10:11:55 +01:00
Klaus Schmidinger
26fbb921f5 The LIRC remote control now connects to the socket even if it doesn't yet exist whe VDR is started 2013-10-29 16:03:43 +01:00
Klaus Schmidinger
589f5519d7 Added entries for version 2.0.4 2013-10-23 10:20:48 +02:00
Klaus Schmidinger
3592293cca Updated the Finnish OSD texts 2013-10-23 08:28:38 +02:00
Klaus Schmidinger
4312dfcf41 Revoked "Added maximum signal strength value for TechniSat SkyStar 2 DVB-S rev 2.3P" 2013-10-21 08:59:59 +02:00
Klaus Schmidinger
94ced5845a When cutting a recording it is now checked whether there is already an edited version of this recording 2013-10-21 08:23:19 +02:00
Klaus Schmidinger
a16391ecb0 Changed the name of the SVDRP command RENR to MOVR 2013-10-21 07:55:23 +02:00
Klaus Schmidinger
4ea90cefe8 Fixed some compiler warnings with gcc-4.6.3 2013-10-20 09:57:55 +02:00
Klaus Schmidinger
97eb54738f Updated the Finnish OSD texts 2013-10-20 09:34:59 +02:00
Klaus Schmidinger
641acd5709 Changed the return value of cPositioner::HorizonLongitude() to 0 in case the latitude of the antenna location is beyond +/-81 degrees 2013-10-20 09:32:23 +02:00
Klaus Schmidinger
856f67b4ac Adjusted release date 2013-10-19 10:04:51 +02:00
Klaus Schmidinger
71778859a7 Bumped the APIVERSION 2013-10-19 10:00:00 +02:00
Klaus Schmidinger
47b09cce5d Restoring the source recording in case copying fails 2013-10-16 10:24:28 +02:00
Klaus Schmidinger
c9fb7eb4d6 Fixed an inconsistent behavior between opening the Recordings menu manually via the main menu and by pressing the Recordings key 2013-10-16 09:43:47 +02:00
Klaus Schmidinger
3870322888 Fixed handling actions in Recordings Info/Edit in case the recording is being replayed 2013-10-14 10:28:10 +02:00
Klaus Schmidinger
396f8c96af Added refreshing the recording in the Recording Info/Edit menus 2013-10-14 09:59:04 +02:00
Klaus Schmidinger
9bd415d58e Added maximum signal strength value for TechniSat SkyStar 2 DVB-S rev 2.3P 2013-10-13 14:48:56 +02:00
Klaus Schmidinger
8bc6bcf86e The function cRecordings::MBperMinute() now only takes into account recordings with less than 5 seconds per megabyte 2013-10-12 13:48:32 +02:00
Klaus Schmidinger
54b3135d59 Revised the section on "Learning the remote control keys" in the INSTALL file 2013-10-12 12:56:31 +02:00
Klaus Schmidinger
446c3b4cfd Changed cRecorder::Action() to use cTimeMs instead of time() 2013-10-12 12:08:37 +02:00
Klaus Schmidinger
adf0dac2c3 Now also checking the source (in addition to the transponder) when setting the system time from the TDT 2013-10-12 11:23:10 +02:00
Klaus Schmidinger
1caa78a3e7 Fixed writing group separators to channels.conf that contain a comma 2013-10-11 11:38:05 +02:00
Klaus Schmidinger
e61e1ed425 Updated the Italian OSD texts 2013-10-11 09:46:43 +02:00
Klaus Schmidinger
01d7269904 Removed the deprecated VideoDirectory variable 2013-10-11 09:38:07 +02:00
Klaus Schmidinger
7c72f79329 Changed some variable names in positioner.c to match the names used in the page with the explanation on vdr-portal.de 2013-10-10 14:21:44 +02:00
Klaus Schmidinger
bf52b1a2e3 Fixed a comment 2013-10-10 13:23:30 +02:00
Klaus Schmidinger
2bdb599fbc Added renaming and moving recordings and folders, and editing a recording's priority and lifetime; added cutting queue 2013-10-10 13:13:30 +02:00
Klaus Schmidinger
3971cc6e88 Removed the code for distributing recordings over several video directories; added the cVideoDirectory plugin API 2013-09-11 12:20:37 +02:00
Klaus Schmidinger
209b850067 Removed superfluous lines 2013-09-10 13:10:40 +02:00
Klaus Schmidinger
7251fefa89 The Yellow button in the main menu no longer acts as "Pause" if "Pause key handling" is set to "do not pause live video" 2013-09-07 12:52:14 +02:00
Klaus Schmidinger
3c72be23f0 Added checks for debug file i/o 2013-09-07 10:39:46 +02:00
Klaus Schmidinger
699454ad7f Unified the internal sequence of actions when pressing the Blue and the Back key, respectively, during replay 2013-09-07 10:20:00 +02:00
Klaus Schmidinger
e8fb500819 Fixed displaying DVB subtitles (cont'd) 2013-09-06 12:37:27 +02:00
Klaus Schmidinger
d6c10fec7b Added entries for version 2.0.3 2013-09-03 11:09:17 +02:00
Klaus Schmidinger
f34be6f5f0 Fixed a typo 2013-09-02 07:53:54 +02:00
Klaus Schmidinger
b931724b75 Fixed cleaning up old EPG events in case no epg data file is given 2013-08-31 13:21:09 +02:00
Klaus Schmidinger
bd6da13a67 Updated the Estonian OSD texts 2013-08-31 12:45:15 +02:00
Klaus Schmidinger
f52e8759c5 Fixed wrong initialization of Setup.PositionerSwing 2013-08-31 12:42:36 +02:00
Klaus Schmidinger
2090ed6f7c Added credit to Thomas Bergwinkl's Rotor plugin 2013-08-31 12:19:10 +02:00
Klaus Schmidinger
246d5412e0 Fixed displaying DVB subtitles 2013-08-30 12:00:40 +02:00
Klaus Schmidinger
9b1b6b3ce4 Fixed handling DVB subtitle fill region codes for 2 and 8 bpp 2013-08-27 10:22:22 +02:00
Klaus Schmidinger
c8c14e31d8 Updated the Finnish OSD texts 2013-08-26 08:47:17 +02:00
Klaus Schmidinger
4d0a1db4ac Adjusted release date 2013-08-25 10:16:43 +02:00
Klaus Schmidinger
a0f63d40c6 The code for distributing recordings over several video directories is now deprecated and disabled by default 2013-08-23 13:09:27 +02:00
Klaus Schmidinger
f0537ea0f1 Added Begin/EndSegmentTransfer() to the EPG handler interface 2013-08-23 10:54:49 +02:00
Klaus Schmidinger
9492231058 Reverted the change from version 1.5.7 that made all logging go to LOG_ERR 2013-08-23 10:37:54 +02:00
Klaus Schmidinger
c385d5bf0c All bonded devices (except for the master) now turn off their LNB power completely to avoid problems when receiving vertically polarized transponders 2013-08-23 09:47:27 +02:00
Klaus Schmidinger
d377c778a7 Increased the value of MAXRETRIES to 20 to reduce the probability of disturbances in transfer mode 2013-08-22 12:35:10 +02:00
Klaus Schmidinger
17b12a32b0 cDevice::IsPrimaryDevice() now also checks whether the primary device actually has a decoder and returns false otherwise 2013-08-22 12:00:03 +02:00
Klaus Schmidinger
99321b371a Fixed a possible crash when shutting down VDR while subtitles are being displayed 2013-08-22 10:33:59 +02:00
Klaus Schmidinger
58c9fdc8c5 Fixed handling LIRC events in case repeated events are lost 2013-08-22 09:35:35 +02:00
Klaus Schmidinger
7fc654eb21 Fixed handling the -o option (short form of --outputonly) 2013-08-22 08:22:50 +02:00
Klaus Schmidinger
a0a4421278 No longer trying to delete old recordings in AssertFreeDiskSpace() if the given Priority is less than 1 2013-08-21 13:56:33 +02:00
Klaus Schmidinger
7a359a958e Fixed asserting free disk space in the cutter 2013-08-21 13:22:19 +02:00
Klaus Schmidinger
cd10b439d0 Added basic support for positioners to control steerable satellite dishes 2013-08-21 11:02:52 +02:00
Klaus Schmidinger
5b76eec1af Added option -x to pic2mpg 2013-05-23 10:00:23 +02:00
Klaus Schmidinger
f55aee0fc1 Fixed indentation 2013-05-23 09:41:54 +02:00
Klaus Schmidinger
21957f6e38 Backport of 'Fixed a crash in the LCARS skin's main menu in case there is no current channel' 2013-05-19 12:12:37 +02:00
Klaus Schmidinger
fc697bfdb1 Fixed a crash in the LCARS skin's main menu in case there is no current channel 2013-05-19 12:07:07 +02:00
Klaus Schmidinger
818763b332 Backport of 'Fixed an endless loop in the DrawEllipse() functions for very small ellipses' 2013-05-18 12:47:52 +02:00
Klaus Schmidinger
cc6c05fcf2 Fixed an endless loop in the DrawEllipse() functions for very small ellipses 2013-05-18 12:39:59 +02:00
Klaus Schmidinger
f6adb32202 Fixed unwanted version tag on checkout of older version 2013-05-02 10:23:11 +02:00
Klaus Schmidinger
4e1a01959d Backport of 'Fixed an error message when parsing SCR values in diseqc.conf' 2013-05-02 09:34:45 +02:00
Klaus Schmidinger
435978648b Fixed an error message when parsing SCR values in diseqc.conf 2013-05-02 09:31:31 +02:00
Klaus Schmidinger
c354540a31 Removed an extra blank line 2013-05-02 09:29:02 +02:00
Klaus Schmidinger
8d98b9193b Backport of 'Fixed no longer generating any editing marks if the edited recording results in just one single sequence' 2013-05-02 09:25:20 +02:00
Klaus Schmidinger
d8e8941c77 Fixed no longer generating any editing marks if the edited recording results in just one single sequence 2013-05-02 09:17:55 +02:00
Klaus Schmidinger
d32498f65f Backport of 'Fixed displaying the frame number when setting an editing mark' 2013-04-27 10:35:30 +02:00
Klaus Schmidinger
29537da370 Fixed displaying the frame number when setting an editing mark 2013-04-27 10:31:23 +02:00
Klaus Schmidinger
cbe8542622 Backport of 'Fixed multiple occurrences of the same directory in the recordings list in case there are directories that only differ in non-alphanumeric characters' 2013-04-27 10:21:14 +02:00
Klaus Schmidinger
fd3bf6c3d2 Fixed multiple occurrences of the same directory in the recordings list in case there are directories that only differ in non-alphanumeric characters 2013-04-27 10:06:49 +02:00
Klaus Schmidinger
53ef55410c Changed the sign of the satellite position value in cSource to reflect the standard of western values being negative 2013-04-11 10:40:47 +02:00
Klaus Schmidinger
4263a1a410 Backport of 'Changed cThread::SetIOPriority() from "best effort class" to "idle class" in order to improve overall performance when an editing process is running' 2013-04-11 09:01:04 +02:00
Klaus Schmidinger
37d2bf4d9a Removed a double empty line 2013-04-11 08:47:31 +02:00
Klaus Schmidinger
6bd7123072 Backport of 'Fixed handling '/' and '~' in recording file names in case DirectoryEncoding is used' 2013-04-11 08:32:40 +02:00
Klaus Schmidinger
c979ef393b Fixed handling '/' and '~' in recording file names in case DirectoryEncoding is used 2013-04-11 08:17:17 +02:00
Klaus Schmidinger
0e4b404102 Changed cThread::SetIOPriority() from "best effort class" to "idle class" in order to improve overall performance when an editing process is running 2013-04-10 15:38:29 +02:00
Klaus Schmidinger
89de3b6c01 Backport of 'Added definitions for older DVB API versions, back until 5.0' 2013-04-10 15:02:08 +02:00
Klaus Schmidinger
1682e2708d Fixed double semicolon 2013-04-09 11:10:30 +02:00
Klaus Schmidinger
71fb3e84da Added definitions for older DVB API versions, back until 5.0 2013-04-09 09:53:00 +02:00
Klaus Schmidinger
3bb55dfdde Fixed some typos 2013-04-08 12:36:22 +02:00
Klaus Schmidinger
497553d985 Removed all "modified since version 1.6" markers from PLUGINS.html 2013-04-08 08:58:49 +02:00
Klaus Schmidinger
d336191ed1 Backport of 'Fixed an endless loop in cTextWrapper::Set() in case the given Width is smaller than one character' 2013-04-07 14:56:26 +02:00
Klaus Schmidinger
cf7f25fe50 Fixed an endless loop in cTextWrapper::Set() in case the given Width is smaller than one character 2013-04-07 14:49:42 +02:00
Klaus Schmidinger
b6b66acfc7 Backport of 'Fixed initializing cDevice::keepTracks' 2013-04-05 11:03:02 +02:00
Klaus Schmidinger
d962999161 Fixed initializing cDevice::keepTracks 2013-04-05 10:27:16 +02:00
252 changed files with 35524 additions and 10636 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1658,7 +1658,7 @@ UML_LOOK = NO
# the class node. If there are many fields or methods and many nodes the
# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
# threshold limits the number of items for each type to make the size more
# managable. Set this to 0 for no limit. Note that the threshold may be
# manageable. Set this to 0 for no limit. Note that the threshold may be
# exceeded by 50% before the limit is enforced.
UML_LIMIT_NUM_FIELDS = 10

2317
HISTORY

File diff suppressed because it is too large Load Diff

146
INSTALL
View File

@ -1,7 +1,7 @@
Installation of the Video Disk Recorder
---------------------------------------
Version 2.0
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.
@ -94,6 +93,24 @@ vdr:123:respawn:/usr/local/bin/vdr --terminal=/dev/tty8 -w 60
See the man page vdr(1) for complete information about all command line options.
Output devices
--------------
VDR by itself doesn't produce any audio or video output. In order to watch
live tv or recordings, you will need to use a plugin that supports the actual
hardware in your system, for instance:
Plugin: Device:
dvbsddevice Full-Featured SD DVB cards (Fujitsu-Siemens Design)
ftp://ftp.tvdr.de/vdr/Plugins
dvbhddevice Full-featured HD DVB cards (Technotrend TT S2-6400)
https://bitbucket.org/powARman/dvbhddevice
rpihddevice Raspberry Pi
https://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
See https://linuxtv.org/vdrwiki/index.php/Output_devices for more.
Standard compliance
-------------------
@ -134,14 +151,14 @@ displayed correctly. Since BiDi support adds some runtime overhead by requiring
additional memory allocation and copying, this feature is not compiled in
by default, so that users that have no need for this don't get any overhead.
Workaround for providers not encoding their EPG data correctly
--------------------------------------------------------------
Workaround for providers not encoding their DVB SI table strings correctly
--------------------------------------------------------------------------
According to "ETSI EN 300 468" the default character set fo SI data is
According to "ETSI EN 300 468" the default character set for SI data is
ISO6937. But unfortunately some broadcasters actually use ISO-8859-9 or
other encodings, but fail to correctly announce that.
Users who want to set the default character set to something different can
do this by setting the environment variable VDR_CHARSET_OVERRIDE to something
do this by using the command line option --chartab with something
like ISO-8859-9.
Start script with automatic restart in case of hangups:
@ -247,23 +264,27 @@ 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 "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*
after if this is *after* a recording has finished
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 "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
@ -279,9 +300,16 @@ case "$1" in
before)
echo "Before recording $2"
;;
started)
echo "Started recording $2"
;;
after)
echo "After recording $2"
;;
editing)
echo "Editing recording $2"
echo "Source recording $3"
;;
edited)
echo "Edited recording $2"
echo "Source recording $3"
@ -289,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"
;;
@ -325,38 +369,9 @@ Note that the file system need not be 64-bit proof, since the 'vdr'
program splits video files into chunks of about 2GB. You should use
a disk with several gigabytes of free space. One GB can store roughly
half an hour of SD video data, or 10 minutes of HD video.
If you have more than one disk and don't want to combine them to form
one large logical volume, you can set up several video directories as
mount points for these disks. All of these directories must have the
same basic name and must end with a numeric part, which starts at 0 for
the main directory and has increasing values for the rest of the
directories. For example
/srv/vdr/video0
/srv/vdr/video1
/srv/vdr/video2
would be a setup with three directories. You can use more than one
numeric digit:
/mnt/MyVideos/vdr.00
/mnt/MyVideos/vdr.01
/mnt/MyVideos/vdr.02
...
/mnt/MyVideos/vdr.11
would set up twelve disks (wow, what a machine that would be!).
To use such a multi directory setup, you need to add the '-v' option
with the name of the basic directory when running 'vdr':
vdr -v /srv/vdr/video0
WARNING: Using multiple disks to form one large video directory this way
is deprecated and will be removed from VDR in a future version! Either
use one of today's large terabyte disks (preferably with a backup disk
in a RAID-1 array), or use something like "mhddfs".
Either use one of today's large terabyte disks (preferably with a backup disk
in a RAID-1 array), or use something like "mhddfs" to group several disks
into one large volume.
Note that you should not copy any non-VDR files into the video directory,
since this might cause a lot of unnecessary disk access when VDR cleans up those
@ -416,8 +431,9 @@ access your DiSEqC equipment (see man vdr(5) for details).
A special form of DiSEqC is used to connect several receivers to one signal
source using only a single cable. This method, known as "Satellite Channel Routing"
according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
Distribution", "Channel Stacking System" or "Single Cable Interface") uses
the file "scr.conf" to specify which SCR channels use which user band frequency.
Distribution", "Channel Stacking System" or "Single Cable Interface") or
EN50607 (aka "JESS") uses the file "scr.conf" to specify which SCR channels
use which user band frequency.
If DVB-S devices need to be connected to the same satellite cable, but no
"Satellite Channel Routing" is available, they can be set to be "bonded" in
@ -468,19 +484,17 @@ for a detailed description).
The recommended PC key assignments are:
Up, Down, Left, Right Crsr keys in numeric block
Menu 'Home' in numeric block
Up, Down, Left, Right Cursor keys
Menu 'Home'
Ok 'Enter'
Back 'End' in numeric block
Back 'Backspace'
Red, Green, Yellow, Blue 'F1'..'F4'
0..9 '0'..'9' in top row
Power 'P'
Volume+/- '+', '-'
Mute 'm'
0..9 '0'..'9'
Volume+/- 'PgUp', 'PgDn'
Mute 'F10'
If you prefer different key assignments, or if the default doesn't work for
your keyboard, simply delete the file 'remote.conf' and restart 'vdr' to get
into learning mode.
If you want to change your key assignments later, simply delete the file
'remote.conf' and restart 'vdr' to get into learning mode.
Generating source code documentation:
-------------------------------------

391
MANUAL
View File

@ -1,7 +1,7 @@
Video Disk Recorder User's Manual
---------------------------------
Version 2.0
Version 2.7
-----------
* Remote Control Keys
@ -50,8 +50,8 @@ Version 2.0
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.0
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).
@ -264,7 +264,7 @@ Version 2.0
* Pausing live video
If you want to pause the live programme you are just watching, simple press
If you want to pause the live programme you are just watching, simply press
"Menu/Yellow" or "Pause" on your remote control. VDR will start an instant
recording of the current channel (just as if you had pressed "Menu/Red" or
"Record") and immediately begin replaying that recording. Replay will be
@ -276,6 +276,9 @@ Version 2.0
in the "Setup/Recording" menu. Recording time will be the same as for
any other instant recording, so by default it will record 3 hours (which
should be enough for any normal broadcast).
Note that the timer that is created for recording the paused live video will
always record on the local VDR, even if an "SVDRP default host" has been
set for normal timer recordings.
* Replaying a Recording
@ -363,15 +366,30 @@ Version 2.0
- 0 Toggles an editing mark. If the mark indicator shows a red triangle,
the current mark is deleted. Otherwise a new mark is set at the
current position.
- 4, 6 Move an editing mark back and forward. You need to first jump to
an editing mark for this to work.
- 1, 3 Move an editing mark back and forward in "adaptive" mode. Pressing
either of these keys for the first time moves the mark 120 seconds
in the given direction (configurable via "Setup/Replay/Initial
duration for adaptive skipping"). Further presses of the same key
keep moving the mark by the same value. Once the other key is
pressed, the value is divided by 2 (hence the name "adaptive") with
every further press of either key. Pressing '1' and '3'
alternatingly divides the distance all the way down to a single
I-frame. That way a particular place in a recording (for instance
the beginning or end of a commercial break) can be found very
quickly. If none of these two keys is pressed for a while
(configurable via "Setup/Replay/Reset timeout for adaptive
skipping") the distance falls back to the initial value.
If replay is not in Pause mode, or if there is no mark at the
current position, the skip is performed without moving any mark.
- 4, 6 Move an editing mark back and forward by one I-frame. You need to
first jump to an editing mark for this to work.
- 7, 9 Jump back and forward between editing marks. Replay goes into still
mode after jumping to a mark. If the current position is at the
first or last mark, or if there are no marks at all, these keys
jump to the very beginning or end, respectively, of the recording.
- 8 Positions replay at a point 3 seconds before the current or next
"begin" mark and starts replay.
- 2 Start the actual cutting process.
- 2 Starts the actual cutting process.
Editing marks are represented by black, vertical lines in the progress display.
A small black triangle at the top of the mark means that this is a "begin"
@ -462,6 +480,8 @@ Version 2.0
"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
@ -483,6 +503,9 @@ Version 2.0
the name of the recording.
First day: The date of the first day when this timer shall start recording
(only available for repeating timers).
Record on: The name of the remote VDR this timer shall record on (only available
if there are any remote VDRs connected to this VDR). If this field
is empty, the timer will record on the local VDR.
A timer can also be programmed by pressing the "Red" key on the "Schedule",
"Now", "Next" or "Event" menus.
@ -490,6 +513,140 @@ Version 2.0
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
@ -500,9 +657,42 @@ Version 2.0
folder name in the list). The "Yellow" key deletes the current folder (note
that this will merely delete the folder definition stored in 'folders.conf'
and has no effect on existing timers or recordings). The "Blue" key can be
used to edit an existing folder definition. The "Red" key selects the current
folder, or enters a sub folder. Once a folder has been selected, the entire
path of the timer's file name will be replaced with the selected folder.
used to edit an existing folder definition. The "Red" key opens a folder that
contains sub folders, while pressing Ok selects the current folder. Once a
folder has been selected, the entire path of the timer's file name will be
replaced with the selected folder.
In the "Recordings" menu the folders of existing recordings can be renamed or
moved by pressing the "Blue" key ("Edit") while the cursor is positioned on
a folder. This will open a menu in which the folder's name and location (the
"parent" folder) can be edited. If such an operation will result in moving
more than one recording, you will be asked for confirmation.
The name, folder, priority and lifetime of an individual recording can be
changed by pressing the "Blue" key ("Info") while the cursor is positioned
on a recording, and in the resulting Info menu pressing the "Blue" key again
to bring up the "Edit recording" menu.
In the "Edit recording" menu the Red button ("Folder") allows you to select one
of your predefined folders. The Green button has multiple functions, depending
on what is currently going on with the recording. It can either stop or cancel
a cut, move or copy operation. If the button reads "Stop..." it means that the
respective operation is already happening, while "Cancel..." means that the
operation is still pending execution. If no operation is currently happening
and the recording has editing marks, the Button will read "Cut" and triggers
cutting the recording (same as pressing '2' while replaying the recording).
The Yellow button ("Delete marks") allows you to delete all editing marks from
the selected recording (if there are any and the recording is not currently
being cut). To directly edit the folder or name of the recording, position the
cursor to the respective line and press the Right key to start editing (press
Ok to confirm the edit, or Back to return to the previous value). If you want
to remove the name of the recording and make the folder name the actual
recording's name, you can position the cursor to the "Name:" field and press
the '0' key. This will take the last element of the recording's folder path
and make it the actual name of the recording. You can do this in turn until
the recording is moved all the way up to the root of the video directory.
Note that, in case you inadvertently pressed the '0' key, you can leave the
"Edit recording" menu with the "Back" key and any changes you have made so far
will not be applied. Once you are finished with editing the recording
properties, press Ok to confirm the changes.
* Parameters in the "Setup" menu
@ -606,6 +796,18 @@ Version 2.0
plain recordings. Set this option to "no" if you want folders
to be interspersed with recordings when sorted alphabetically.
Default sort mode for recordings = by time
Controls whether recordings are sorted by time or by name.
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
@ -627,6 +829,16 @@ Version 2.0
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
@ -704,15 +916,16 @@ Version 2.0
Defines the standard compliance mode:
0 = DVB
1 = ANSI/SCTE
2 = NORDIG
Video format = 4:3 The video format (or aspect ratio) of the tv set in use
(4:3 or 16:9).
(4:3 or 16:9). Applies only to SD output devices.
Video display format = letterbox
The display format to use for playing wide screen video on
a 4:3 tv set ("pan & scan", "letterbox" or "center cut out").
This option is only available if "Video format" is set to
4:3.
4:3. Applies only to SD output devices.
Use Dolby Digital = yes
Controls whether Dolby Digital tracks appear in the "Audio"
@ -776,6 +989,28 @@ Version 2.0
are connected to the same sat cable must be set to the same
number here.
Use dish positioner = no
By default, the 'P' command code in DiSEqC command sequences
is ignored. Set this parameter to 'yes' if you are using a
satellite dish positioner.
Site latitude (degrees) = 0
Site longitude (degrees) = 0
Set these to the latitude and longitude of your dish's
location if you use a satellite dish positioner. Use the
"Green" key to switch between north/south and east/west,
respectively.
Max. positioner swing (degrees) = 65
Defines the maximum angle by which the positioner can move
the dish away from due south (or north) in either direction.
The valid range is 0...90.
Positioner speed (degrees/s) = 1.5
Defines the speed at which the positioner moves the dish.
The valid range is 0.1...180. This value is used to calculate
how long it takes the positioner to reach the target position.
CAM:
n CAM Name Shows the CAM slots that are present in this system, where
@ -784,7 +1019,19 @@ Version 2.0
if it is in the process of being reset, its current status
is displayed. The "Red" key can be pressed to enter the CAM
menu, and the "Green" key triggers a reset of the selected
slot. The "Ok" key also opens the CAM menu.
slot. The "Ok" key also opens the CAM menu. The "Yellow" key
assigns the selected CAM to a device and switches it to the
current channel. The CAM/device combination remains tuned to
the current channel until the smart card in the CAM has been
activated and thus starts to descramble, or until a recording
needs this device. Pressing the "Yellow" key while a CAM is
in activation mode cancels the activation. The activation mode
remains in effect even if you switch to a different channel
(provided there is more than one device in the system) or
watch a recording. To activate your smart card simply switch
to the channel you want to watch, open the "Setup/CAM" menu,
select the CAM that contains the smart card (in case you
have more than one CAM) and press the "Yellow" key.
Recording:
@ -793,14 +1040,22 @@ Version 2.0
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
means that this recording will never be deleted
automatically.
Pause priority = 10 The Priority and Lifetime values used when pausing live
Pause lifetime = 1 video.
Record key handling = 2
Defines what happens if the Record key on the remote control
is pressed during live tv.
0 = no instant recording
1 = confirm instant recording
2 = record instantly
The default is 2.
Pause key handling = 2 Defines what happens if the Pause key on the remote control
is pressed during live tv.
@ -809,6 +1064,9 @@ Version 2.0
2 = pause live video
The default is 2.
Pause priority = 10 The Priority and Lifetime values used when pausing live
Pause lifetime = 1 video.
Use episode name = yes Repeating timers use the EPG's 'Episode name' information
to create recording file names in a hierarchical structure
(for instance to gather all episodes of a series in a
@ -896,6 +1154,70 @@ Version 2.0
Defines whether the player automatically goes into Pause
mode when setting an editing mark.
Pause replay when jumping to a mark = yes
By default replay is automatically paused whenever you jump
to an editing mark with the '7' or '9' key in order to allow
you to easily adjust those marks. If this option is set to
'no', the '9' key will not pause if you are in Play mode and
the mark you jump to is not within 3 seconds of the end of
the recording.
Skip edited parts = no Defines whether the edited parts of a recording are
automatically skipped during replay. This includes jumping
to the first mark if replay starts at the beginning of the
recording, and stopping at the last mark.
Pause replay at last mark = no
If enabled, replay of a recording will go into Pause mode
when it has reached the last "end" mark (if any). Note that
the actual position at which the pause occurs may be a couple
of frames before the last "end" mark, depending on how much
data is buffered by your output device.
Initial duration for adaptive skipping (s) = 120
Defines the number of seconds to jump from the current replay
position in either direction, when pressing the '1' or '3'
key for the first time after the "Reset timeout for adaptive
skipping".
The valid range is 10...600.
Reset timeout for adaptive skipping (s) = 3
Defines the number of seconds after which pressing the
'1' or '3' key falls back to the "Initial duration for adaptive
skipping".
The valid range is 0...10. Setting the timeout to 0 disables
the adaptive mode and makes '1' and '3' always skip the number
of seconds configured as the initial duration.
Alternate behavior for adaptive skipping = no
When skipping in adaptive mode with the '1' and '3' keys, the
distance of the skip is halved with every key press after the
first change of direction. While this allows for locating a
particular position in a recording very fast, once you make
one step too many in the current direction you have no chance
of ever reaching the desired point any more. You will have to
wait for the timeout to occur and start adaptive skipping anew.
If this option is set to 'yes', the skip distance will only be
halved if the direction actually changes. That way, even if
you missed the target point, you can still back up to it.
Use Prev/Next keys for adaptive skipping = no
Normally the Prev/Next keys jump between editing marks (or
the beginning/end of the recording). You can set this option
to 'yes' if you want to use these keys for adaptive skipping
instead.
Skip distance with Green/Yellow keys (s) = 60
Defines the number of seconds to skip in either direction
when pressing the "Green" or "Yellow" key, respectively.
The valid range is 5...600.
Skip distance with Green/Yellow keys in repeat (s) = 60
Defines the number of seconds to skip in either direction
when pressing and holding the "Green" or "Yellow" key,
respectively.
The valid range is 5...600.
Resume ID = 0 Defines an additional ID that can be used in a multi user
environment, so that every user has his/her own resume
files for each recording. The valid range is 0...99, with
@ -919,6 +1241,23 @@ Version 2.0
connection after which the connection is automatically
closed. Default is 300, a value of 0 means no timeout.
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.
SVDRP default host The name of the VDR to be used by default when creating a
new timer.
Zap timeout = 3 The time (in seconds) until a channel counts as "previous"
for switching with '0'
@ -941,7 +1280,7 @@ Version 2.0
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
@ -952,15 +1291,27 @@ Version 2.0
VDR was stopped will be used. The valid range is from
0 (silent) to 255 (loudest).
Volume steps = 51 The number of steps the volume will use when moving from
the lowest to the highest value. The valid range is from
5 to 255.
Volume linearize = 0 How to linearize the volume control. The valid range is
from -20 to 20. A value of 0 results in no linearization.
The higher this value is, the more fine grained the control
of the volume is for low sound levels. Lower values do the
same for high sound levels. This allows you to adjust the
more or less linear volume control of your sound card.
Channels wrap = no During zapping with the "Up" and "Down" keys (or the
"Channel+" and "Channel-" keys) the current channel will
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 2.19 2013/02/18 10:55:39 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,17 +33,19 @@ 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
#ARGSDIR = /etc/vdr/conf.d
#CACHEDIR = /var/cache/vdr
# Overrides for preset/legacy configurations:
@ -57,6 +65,7 @@ ifdef ONEDIR
VIDEODIR = /video
CACHEDIR = $(VIDEODIR)
CONFDIR = $(VIDEODIR)
ARGSDIR = $(VIDEODIR)/conf.d
RESDIR = $(VIDEODIR)
endif
@ -65,12 +74,25 @@ endif
#PLGCFG = $(CONFDIR)/plugins.mk
### 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
### Define if you don't want keyboard remote control:
#NO_KBD = 1
### Define if you want vdr to not run as root:
#VDR_USER = vdr
### Define if you want to compile in 'bidi' support:
#BIDI = 1
### Define if you want 'systemd' notification:
#SDNOTIFY = 1
### Fallback for plugins with old makefiles:
ifdef PLUGIN
CFLAGS += -fPIC

110
Makefile
View File

@ -4,23 +4,26 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: Makefile 2.54 2013/03/11 15:01:01 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,19 +31,29 @@ 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
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
@ -51,6 +64,15 @@ DOXYFILE = Doxyfile
-include Make.config
# Output control
ifdef VERBOSE
Q =
else
Q = @
endif
export Q
# Mandatory compiler flags:
CFLAGS += -fPIC
@ -66,9 +88,9 @@ endif
SILIB = $(LSIDIR)/libsi.a
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
OBJS = args.o audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o\
lirc.o menu.o menuitems.o mtd.o nit.o osdbase.o osd.o pat.o player.o plugin.o positioner.o\
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
timers.o tools.o transfer.o vdr.o videodir.o
@ -89,9 +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)
DEFINES += -DSDNOTIFY
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd)
endif
LIRC_DEVICE ?= /var/run/lirc/lircd
@ -99,6 +126,7 @@ LIRC_DEVICE ?= /var/run/lirc/lircd
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
DEFINES += -DARGSDIR=\"$(ARGSDIR)\"
DEFINES += -DCACHEDIR=\"$(CACHEDIR)\"
DEFINES += -DRESDIR=\"$(RESDIR)\"
DEFINES += -DPLUGINDIR=\"$(LIBDIR)\"
@ -114,7 +142,8 @@ all: vdr i18n plugins
# Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
# Dependencies:
@ -128,21 +157,26 @@ $(DEPFILE): Makefile
# The main program:
vdr: $(OBJS) $(SILIB)
$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
@echo LD $@
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
# The libsi library:
$(SILIB):
$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
$(SILIB): make-libsi
@$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
make-libsi: # empty rule makes sure the sub-make for libsi is always called
# pkg-config file:
.PHONY: vdr.pc
vdr.pc:
@echo "bindir=$(BINDIR)" > $@
@echo "vdrrootdir=$(VDRROOT)" > $@
@echo "bindir=$(BINDIR)" >> $@
@echo "incdir=$(INCDIR)" >> $@
@echo "mandir=$(MANDIR)" >> $@
@echo "configdir=$(CONFDIR)" >> $@
@echo "videodir=$(VIDEODIR)" >> $@
@echo "configdir=$(CONFDIR)" >> $@
@echo "argsdir=$(ARGSDIR)" >> $@
@echo "cachedir=$(CACHEDIR)" >> $@
@echo "resdir=$(RESDIR)" >> $@
@echo "libdir=$(LIBDIR)" >> $@
@ -154,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}" >> $@
@ -168,17 +202,21 @@ I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr.mo, $(notdir
I18Npot = $(PODIR)/vdr.pot
%.mo: %.po
msgfmt -c -o $@ $<
@echo MO $@
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
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 $^`
@echo GT $@
$(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)
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@echo PO $@
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
install -D -m644 $< $@
@echo IN $@
$(Q)install -D -m644 $< $@
.PHONY: i18n
i18n: $(I18Nmsgs)
@ -220,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;\
@ -241,13 +279,13 @@ plugins: include-dir vdr.pc
fi;\
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; exit 1; fi
clean-plugins:
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" clean; done
clean-plugins: vdr.pc
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" clean; done
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
# 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:
@ -260,11 +298,17 @@ install-bin: vdr
install-dirs:
@mkdir -p $(DESTDIR)$(VIDEODIR)
@mkdir -p $(DESTDIR)$(CONFDIR)
@mkdir -p $(DESTDIR)$(ARGSDIR)
@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:
@ -279,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\
@ -306,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
@ -314,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.0</b>
<b>Version 2.7</b>
<p>
Copyright &copy; 2013 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 1.6 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,15 +74,15 @@ 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>
<li><a href="#The Setup menu">The Setup menu</a>
<li><modified><a href="#Additional files">Additional files</modified></a>
<li><a href="#Additional files">Additional files</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>
@ -99,10 +96,12 @@ structures and allows it to hook itself into specific areas to perform special a
<li><a href="#Skins">Skins</a>
<li><a href="#Themes">Themes</a>
<li><a href="#Devices">Devices</a>
<li><a href="#Positioners">Positioners</a>
<li><a href="#Audio">Audio</a>
<li><a href="#Remote Control">Remote Control</a>
<li><a href="#Conditional Access">Conditional Access</a>
<li><modified><a href="#Electronic Program Guide">Electronic Program Guide</modified></a>
<li><a href="#Electronic Program Guide">Electronic Program Guide</a>
<li><a href="#The video directory">The video directory</a>
</ul>
</ul>
@ -166,28 +165,26 @@ 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
the name of that plugin (in the above example that would be <tt>hello</tt>).
What's inside the individual source directory of a
plugin is entirely up to the author of that plugin. The only prerequisites are
that there is a <tt>Makefile</tt> that provides the targets <tt>all</tt><modified>, <tt>install</tt></modified> and
that there is a <tt>Makefile</tt> that provides the targets <tt>all</tt>, <tt>install</tt> and
<tt>clean</tt>, and that a call to <tt>make all</tt> actually produces a dynamically
loadable library file for that plugin (we'll get to the details later).
<modified>
The dynamically loadable library file for the plugin shall be located directly under
the plugin's source directory.
See the section <a href="#Initializing a new plugin directory">Initializing a new plugin directory</a>
for how to generate an example Makefile.
</modified>
<p>
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>
@ -583,6 +579,31 @@ 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>
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
or the core VDR code, watching their log entries while they are permanently
interspersed with unrelated stuff.<br>
<br>
The recommended behavior for a plugin that does logging is to implement a command
line option that controls the level of log messages, preferably '-l N, --log=N',
where 'N' is in the range 0...3, with 0 meaning no logging whatsoever, 1 log only
errors, 2 log errors and informational messages, and 3 also log debug information.<br>
<br>
If a plugin can output extensive data for special debugging purposes (either to
the log file or stdout/stderr), this should be enabled by setting proper switches
in one of its source files (see for example how the communication between VDR and
CAMs can be monitored in VDR/ci.c).<br>
<br>
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.<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>
@ -670,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>
@ -891,70 +891,51 @@ You can first assign the temporary values to the global variables and then do th
your setup parameters and use that one to copy all parameters with one single statement
(like VDR does with its cSetup class).
<hr><h2><modified><a name="Additional files">Additional files</a></modified></h2>
<hr><h2><a name="Additional files">Additional files</a></h2>
<div class="blurb">I want my own stuff!</div><p>
<modified>
There may be situations where a plugin requires files of its own. While the plugin is
free to store such files anywhere it sees fit, it might be a good idea to put them in a common
place, preferably where such data already exists.
</modified>
<p>
<modified>
<i>configuration files</i>, maybe for data that can't be stored in the simple
<a href="#Setup parameters">setup parameters</a> of VDR, or maybe because it needs to
launch other programs that simply need a separate configuration file.
</modified>
<p>
<modified>
<i>cache files</i>, to store data so that future requests for that data can be served faster. The data
that is stored within a cache might be values that have been computed earlier or duplicates of
original values that are stored elsewhere.
</modified>
<p>
<modified>
<i>resource files</i>, for providing additional files, like pictures, movie clips or channel logos.
</modified>
<p>
<modified>
Therefore VDR provides the functions
<p><table><tr><td class="code"><pre>
<modified>
const char *ConfigDirectory(const char *PluginName = NULL);
const char *CacheDirectory(const char *PluginName = NULL);
const char *ResourceDirectory(const char *PluginName = NULL);
</modified>
</pre></td></tr></table><p>
<modified>
each of which returns a string containing the directory that VDR uses for its own
files (defined through the options in the call to VDR), extended by
</modified>
<tt>"/plugins"</tt>. So assuming the VDR configuration directory is <tt>/video</tt>
(the default if no <tt><b>-c</b></tt> or <tt><b>-v</b></tt> option is given),
a call to <tt>ConfigDirectory()</tt> will return <tt>/video/plugins</tt>. The first
call to <tt>ConfigDirectory()</tt> will automatically make sure that the <tt>plugins</tt>
subdirectory will exist. If, for some reason, this cannot be achieved, <tt>NULL</tt>
will be returned.
<modified>
The behavior of <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt> is similar.
</modified>
<p>
The additional <tt>plugins</tt> directory is used to keep files from plugins apart
from those of VDR itself, making sure there will be no name clashes. If a plugin
<modified>
needs only one extra file, it is suggested that this file be named <tt>name.*</tt>,
where <i>name</i> shall be the name of the plugin.
</modified>
<p>
If a plugin needs more than one such file, it is suggested that the plugin stores
these in a subdirectory of its own, named after the plugin. To easily get such a name
<modified>
the functions can be given an additional string that will be appended to the returned
directory name, as in
</modified>
<p><table><tr><td class="code"><pre>
const char *MyConfigDir = ConfigDirectory(Name());
@ -965,16 +946,12 @@ plugin's name. Again, VDR will make sure that the requested directory will exist
(or return <tt>NULL</tt> in case of an error).
<p>
<b>
<modified>
The returned strings are statically allocated and will be overwritten by subsequent calls!
</modified>
</b>
<p>
<modified>
The <tt>ConfigDirectory()</tt>, <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt>
functions are static member functions of the <tt>cPlugin</tt> class. This allows them to be
called even from outside any member function of the derived plugin class, by writing
</modified>
<p><table><tr><td class="code"><pre>
const char *MyConfigDir = cPlugin::ConfigDirectory();
@ -1184,6 +1161,60 @@ The returned string may consist of several lines, separated by the newline chara
('<tt>\n</tt>'). Each of these lines will be preceded with the <tt>ReplyCode</tt>
when presenting them to the caller, and the continuation character ('<tt>-</tt>')
will be set for all but the last one.
<p>
<b>The SVDRP functions are called from the separate "SVDRP server handler" thread.
Therefore the plugin needs to take care of proper <a href="#Locking">locking</a> if it accesses any
global data.</b>
<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>
@ -1265,10 +1296,10 @@ If a plugin wants to get informed on various events in VDR, it can derive a clas
class cMyStatusMonitor : public cStatus {
protected:
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber<modified>, bool LiveView</modified>);
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
};
void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber<modified>, bool LiveView</modified>)
void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
{
if (ChannelNumber)
dsyslog("channel switched to %d on DVB %d", ChannelNumber, Device-&gt;CardIndex());
@ -1525,13 +1556,11 @@ public:
cMyReceiver(int Pid);
};
<modified>
cMyReceiver::cMyReceiver(int Pid)
:cReceiver(NULL, -1)
{
AddPid(Pid);
}
</modified>
cMyReceiver::~cMyReceiver()
{
@ -1557,7 +1586,7 @@ The above example sets up a receiver that wants to receive data from only one
PID (for example the Teletext PID). In order to not interfere with other recording
operations, it sets its priority to <tt>-1</tt> (any negative value will allow
a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time
<modified>in favor of a timer recording or live viewing</modified>).
in favor of a timer recording or live viewing).
<p>
Once a <tt>cReceiver</tt> has been created, it needs to be <i>attached</i> to
a <tt>cDevice</tt>:
@ -1573,9 +1602,7 @@ the receiver is attached to the device that actually receives the current live
video stream (this may be different from the primary device in case of <i>Transfer
Mode</i>).
<p>
<modified>
The <tt>cReceiver</tt> must be detached from its device before it is deleted.
</modified>
<hr><h2><a name="Filters">Filters</a></h2>
@ -1704,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);
@ -1853,7 +1880,7 @@ If the new device can receive, it most likely needs to provide a way of
selecting which channel it shall tune to:
<p><table><tr><td class="code"><pre>
<modified>virtual int NumProvidedSystems(void) const;</modified>
virtual int NumProvidedSystems(void) const;
virtual bool ProvidesSource(int Source) const;
virtual bool ProvidesTransponder(const cChannel *Channel) const;
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const;
@ -1902,9 +1929,9 @@ virtual bool HasDecoder(void) const;
virtual bool CanReplay(void) const;
virtual bool SetPlayMode(ePlayMode PlayMode);
virtual int64_t GetSTC(void);
<modified>virtual bool IsPlayingVideo(void) const;</modified>
virtual bool IsPlayingVideo(void) const;
virtual bool HasIBPTrickSpeed(void);
virtual void TrickSpeed(int Speed);
virtual void TrickSpeed(int Speed, bool Forward);
virtual void Clear(void);
virtual void Play(void);
virtual void Freeze(void);
@ -1931,7 +1958,7 @@ the functions
<p><table><tr><td class="code"><pre>
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
<modified>virtual int ReadFilter(int Handle, void *Buffer, size_t Length);</modified>
virtual int ReadFilter(int Handle, void *Buffer, size_t Length);
virtual void CloseFilter(int Handle);
</pre></td></tr></table><p>
@ -1987,7 +2014,6 @@ user - whether this goes through OSD facilities of the physical device (like
a "full featured" DVB card) or through a graphics adapter that overlays its
output with the video signal, doesn't matter.
<p>
<div class="modified">
In order to be able to determine the proper size of the OSD, the device
should implement the function
@ -1996,7 +2022,6 @@ virtual void GetOsdSize(int &amp;Width, int &amp;Height, double &amp;Aspect);
</pre></td></tr></table><p>
By default, an OSD size of 720x480 with an aspect ratio of 1.0 is assumed.
</div modified>
<p>
<b>Initializing new devices</b>
@ -2017,14 +2042,13 @@ Nothing needs to be done to shut down the devices. VDR will automatically
shut down (delete) all devices when the program terminates. It is therefore
important that the devices are created on the heap, using the <tt>new</tt>
operator!
<div class="modified">
<p>
<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>
@ -2032,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>
@ -2048,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
@ -2056,7 +2094,56 @@ new cMyDeviceHook;
</pre></td></tr></table><p>
and shall not delete this object. It will be automatically deleted when the program ends.
</div modified>
<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>
<div class="blurb">Now you see me - now you don't!</div><p>
If you are using a positioner (also known as "motor" or "rotor") to move your
satellite dish to receive various satellites, you will be using the 'P' command
in the <tt>diseqc.conf</tt> file. This command sends the necessary data to the
positioner to move the dish to the satellite's orbital position. By default VDR
uses its builtin DiSEqC positioner control. If your positioner requires a different
method of controlling (like maybe via a serial link), you can derive a class
from <tt>cPositioner</tt>, as in
<p><table><tr><td class="code"><pre>
#include &lt;vdr/positioner.h&gt;
class cMyPositioner : public cPositioner {
public:
cMyPositioner(void);
virtual void Drive(ePositionerDirection Direction);
virtual void Step(ePositionerDirection Direction, uint Steps = 1);
virtual void Halt(void);
virtual void SetLimit(ePositionerDirection Direction);
virtual void DisableLimits(void);
virtual void EnableLimits(void);
virtual void StorePosition(uint Number);
virtual void RecalcPositions(uint Number);
virtual void GotoPosition(uint Number, int Longitude);
virtual void GotoAngle(int Longitude);
};
</pre></td></tr></table><p>
See the implementation of <tt>cDiseqcPositioner</tt> in <tt>diseqc.c</tt> for details.
<p>
You should create your derived positioner object in the
<a href="#Getting started"><tt>Start()</tt></a> function of your plugin.
Note that the object has to be created on the heap (using <tt>new</tt>),
and you shall not delete it at any point (it will be deleted automatically
when the program ends).
<hr><h2><a name="Audio">Audio</a></h2>
@ -2222,12 +2309,10 @@ Put(uint64 Code, bool Repeat = false, bool Release = false);
The other parameters have the same meaning as in the first version of this function.
<p>
<modified>
If your remote control has a repeat function that automatically repeats key events
if a key is held pressed down for a while, your derived class should use the global
parameters <tt>Setup.RcRepeatDelay</tt> and <tt>Setup.RcRepeatDelta</tt> to allow
users to configure the behavior of this function.
</modified>
<hr><h2><a name="Conditional Access">Conditional Access</a></h2>
@ -2264,7 +2349,6 @@ virtual bool Assign(cDevice *Device, bool Query = false);
See the description of this function in <tt>ci.h</tt> for details.
<div class="modified">
<hr><h2><a name="Electronic Program Guide">Electronic Program Guide</a></h2>
<div class="blurb">The grass is always greener on the other side...</div><p>
@ -2294,7 +2378,40 @@ where <tt>DescriptionFromDatabase()</tt> would derive the description of the
to signal VDR that no other EPG handlers shall be queried after this one.
<p>
See <tt>VDR/epg.h</tt> for details.
</div modified>
<hr><h2><a name="The video directory">The video directory</a></h2>
<div class="blurb">Bits and pieces...</div><p>
By default VDR assumes that the video directory consists of one large
volume, on which it can store its recordings. If you want to distribute your
recordings over several physical drives, you can derive from <tt>cVideoDirectory</tt>,
as in
<p><table><tr><td class="code"><pre>
#include &lt;vdr/videodir.h&gt;
class cMyVideoDirectory : public cVideoDirectory {
public:
cMyVideoDirectory(void);
virtual ~cMyVideoDirectory();
virtual int FreeMB(int *UsedMB = NULL);
virtual bool Register(const char *FileName);
virtual bool Rename(const char *OldName, const char *NewName);
virtual bool Move(const char *FromName, const char *ToName);
virtual bool Remove(const char *Name);
virtual void Cleanup(const char *IgnoreFiles[] = NULL);
virtual bool Contains(const char *Name);
};
</pre></td></tr></table><p>
See the description in <tt>videodir.h</tt> for details.
<p>
You should create your derived video directory object in the
<a href="#Getting started"><tt>Start()</tt></a> function of your plugin.
Note that the object has to be created on the heap (using <tt>new</tt>),
and you shall not delete it at any point (it will be deleted automatically
when the program ends).
</body>
</html>

View File

@ -1,340 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@ -1,47 +0,0 @@
VDR Plugin 'dvbsddevice' Revision History
-----------------------------------------
2009-12-28: Version 0.0.1
- Initial revision.
2010-01-04: Version 0.0.2
- Calling the MakePrimaryDevice() function of the base class to allow
the cDevice to stop displaying subtitles.
- Added support for DVB cards with multiple fontends.
2010-01-30: Version 0.0.3
- The PCR pid is now recorded for channels where this is different from the
video PID.
2011-04-17: Version 0.0.4
- Removed an obsolete local variable in dvbsdffosd.c (thanks to Paul Menzel).
2011-08-27: Version 0.0.5
- Added option --outputonly to use the device only for output (thanks to Udo Richter).
2012-03-07: Version 0.0.6
- Removed the call to EITScanner.UsesDevice(this) from dvbsddevice.c, because
the code following these calls is only executed if LiveView is true, which is
never the case when the EITScanner switches to a channel.
2012-12-27: Version 0.0.7
- Adapted Makefile to changes introduced in recent VDR versions.
2013-01-12: Version 0.0.8
- Adapted Makefile to changes introduced in recent VDR versions.
2013-01-25: Version 0.0.9
- Returning 0 from cDvbSdFfDevice::NumProvidedSystems() if option --outputonly is given.
2013-03-31: Version 2.0.0
- Official release.

View File

@ -1,94 +0,0 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 1.20 2013/01/12 13:45:01 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
# By default the main source file also carries this name.
PLUGIN = dvbsddevice
### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
### 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
TMPDIR ?= /tmp
### The compiler options:
export CFLAGS = $(call PKGCFG,cflags)
export CXXFLAGS = $(call PKGCFG,cxxflags)
### The version number of VDR's plugin API:
APIVERSION = $(call PKGCFG,apiversion)
### Allow user defined options to overwrite defaults:
-include $(PLGCFG)
### The name of the distribution archive:
ARCHIVE = $(PLUGIN)-$(VERSION)
PACKAGE = vdr-$(ARCHIVE)
### The name of the shared object file:
SOFILE = libvdr-$(PLUGIN).so
### Includes and Defines (add further entries here):
INCLUDES +=
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
### The object files (add further files here):
OBJS = $(PLUGIN).o dvbsdffdevice.o dvbsdffosd.o
### The main target:
all: $(SOFILE)
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
MAKEDEP = $(CXX) -MM -MG
DEPFILE = .dependencies
$(DEPFILE): Makefile
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-include $(DEPFILE)
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
install: install-lib
dist: clean
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@mkdir $(TMPDIR)/$(ARCHIVE)
@cp -a * $(TMPDIR)/$(ARCHIVE)
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@echo Distribution package created as $(PACKAGE).tgz
clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~

View File

@ -1,20 +0,0 @@
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
Latest version available at: ftp://ftp.tvdr.de/vdr
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
See the file COPYING for more information.
Description:
The 'dvbsddevice' plugin implements the output device for the
"Full Featured" DVB cards based on the TechnoTrend/Fujitsu-Siemens
design. This code was originally part of the core VDR source, and
was moved into this plugin in VDR version 1.7.11.

View File

@ -1,61 +0,0 @@
/*
* dvbsddevice.c: A plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbsddevice.c 1.10 2013/03/31 09:30:18 kls Exp $
*/
#include <getopt.h>
#include <vdr/plugin.h>
#include "dvbsdffdevice.h"
static const char *VERSION = "2.0.0";
static const char *DESCRIPTION = "SD Full Featured DVB device";
class cPluginDvbsddevice : public cPlugin {
private:
cDvbSdFfDeviceProbe *probe;
public:
cPluginDvbsddevice(void);
virtual ~cPluginDvbsddevice();
virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return DESCRIPTION; }
virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]);
};
cPluginDvbsddevice::cPluginDvbsddevice(void)
{
probe = new cDvbSdFfDeviceProbe;
}
cPluginDvbsddevice::~cPluginDvbsddevice()
{
delete probe;
}
const char *cPluginDvbsddevice::CommandLineHelp(void)
{
return " -o --outputonly do not receive, just use as output device\n";
}
bool cPluginDvbsddevice::ProcessArgs(int argc, char *argv[])
{
static struct option long_options[] = {
{ "outputonly", no_argument, NULL, 'o' },
{ NULL, no_argument, NULL, 0 }
};
int c;
while ((c = getopt_long(argc, argv, "", long_options, NULL)) != -1) {
switch (c) {
case 'o': probe->SetOutputOnly(true);
break;
default: return false;
}
}
return true;
}
VDRPLUGINCREATOR(cPluginDvbsddevice); // Don't touch this!

View File

@ -1,799 +0,0 @@
/*
* dvbsdffdevice.h: The DVB SD Full Featured device interface
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbsdffdevice.c 2.35 2013/02/17 13:16:18 kls Exp $
*/
#include "dvbsdffdevice.h"
#include <errno.h>
#include <limits.h>
#include <linux/videodev2.h>
#include <linux/dvb/audio.h>
#include <linux/dvb/dmx.h>
#include <linux/dvb/video.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <vdr/eitscan.h>
#include <vdr/transfer.h>
#include "dvbsdffosd.h"
// --- cDvbSdFfDevice --------------------------------------------------------
int cDvbSdFfDevice::devVideoOffset = -1;
cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly)
:cDvbDevice(Adapter, Frontend)
{
spuDecoder = NULL;
digitalAudio = false;
playMode = pmNone;
outputOnly = OutputOnly;
// Devices that are only present on cards with decoders:
fd_osd = DvbOpen(DEV_DVB_OSD, adapter, frontend, O_RDWR);
fd_video = DvbOpen(DEV_DVB_VIDEO, adapter, frontend, O_RDWR | O_NONBLOCK);
fd_audio = DvbOpen(DEV_DVB_AUDIO, adapter, frontend, O_RDWR | O_NONBLOCK);
fd_stc = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR);
// The offset of the /dev/video devices:
if (devVideoOffset < 0) { // the first one checks this
FILE *f = NULL;
char buffer[PATH_MAX];
for (int ofs = 0; ofs < 100; ofs++) {
snprintf(buffer, sizeof(buffer), "/proc/video/dev/video%d", ofs);
if ((f = fopen(buffer, "r")) != NULL) {
if (fgets(buffer, sizeof(buffer), f)) {
if (strstr(buffer, "DVB Board")) { // found the _first_ DVB card
devVideoOffset = ofs;
dsyslog("video device offset is %d", devVideoOffset);
break;
}
}
else
break;
fclose(f);
}
else
break;
}
if (devVideoOffset < 0)
devVideoOffset = 0;
if (f)
fclose(f);
}
devVideoIndex = devVideoOffset >= 0 ? devVideoOffset++ : -1;
}
cDvbSdFfDevice::~cDvbSdFfDevice()
{
delete spuDecoder;
// We're not explicitly closing any device files here, since this sometimes
// caused segfaults. Besides, the program is about to terminate anyway...
}
void cDvbSdFfDevice::MakePrimaryDevice(bool On)
{
if (On)
new cDvbOsdProvider(fd_osd);
cDvbDevice::MakePrimaryDevice(On);
}
bool cDvbSdFfDevice::HasDecoder(void) const
{
return true;
}
bool cDvbSdFfDevice::AvoidRecording(void) const
{
return true;
}
cSpuDecoder *cDvbSdFfDevice::GetSpuDecoder(void)
{
if (!spuDecoder && IsPrimaryDevice())
spuDecoder = new cDvbSpuDecoder();
return spuDecoder;
}
uchar *cDvbSdFfDevice::GrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY)
{
if (devVideoIndex < 0)
return NULL;
char buffer[PATH_MAX];
snprintf(buffer, sizeof(buffer), "%s%d", DEV_VIDEO, devVideoIndex);
int videoDev = open(buffer, O_RDWR);
if (videoDev >= 0) {
uchar *result = NULL;
// set up the size and RGB
v4l2_format fmt;
memset(&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = SizeX;
fmt.fmt.pix.height = SizeY;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
fmt.fmt.pix.field = V4L2_FIELD_ANY;
if (ioctl(videoDev, VIDIOC_S_FMT, &fmt) == 0) {
v4l2_requestbuffers reqBuf;
memset(&reqBuf, 0, sizeof(reqBuf));
reqBuf.count = 2;
reqBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
reqBuf.memory = V4L2_MEMORY_MMAP;
if (ioctl(videoDev, VIDIOC_REQBUFS, &reqBuf) >= 0) {
v4l2_buffer mbuf;
memset(&mbuf, 0, sizeof(mbuf));
mbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
mbuf.memory = V4L2_MEMORY_MMAP;
if (ioctl(videoDev, VIDIOC_QUERYBUF, &mbuf) == 0) {
int msize = mbuf.length;
unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0);
if (mem && mem != (unsigned char *)-1) {
v4l2_buffer buf;
memset(&buf, 0, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = 0;
if (ioctl(videoDev, VIDIOC_QBUF, &buf) == 0) {
v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl (videoDev, VIDIOC_STREAMON, &type) == 0) {
memset(&buf, 0, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = 0;
if (ioctl(videoDev, VIDIOC_DQBUF, &buf) == 0) {
if (ioctl(videoDev, VIDIOC_STREAMOFF, &type) == 0) {
// make RGB out of BGR:
int memsize = fmt.fmt.pix.width * fmt.fmt.pix.height;
unsigned char *mem1 = mem;
for (int i = 0; i < memsize; i++) {
unsigned char tmp = mem1[2];
mem1[2] = mem1[0];
mem1[0] = tmp;
mem1 += 3;
}
if (Quality < 0)
Quality = 100;
dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, fmt.fmt.pix.width, fmt.fmt.pix.height);
if (Jpeg) {
// convert to JPEG:
result = RgbToJpeg(mem, fmt.fmt.pix.width, fmt.fmt.pix.height, Size, Quality);
if (!result)
esyslog("ERROR: failed to convert image to JPEG");
}
else {
// convert to PNM:
char buf[32];
snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", fmt.fmt.pix.width, fmt.fmt.pix.height);
int l = strlen(buf);
int bytes = memsize * 3;
Size = l + bytes;
result = MALLOC(uchar, Size);
if (result) {
memcpy(result, buf, l);
memcpy(result + l, mem, bytes);
}
else
esyslog("ERROR: failed to convert image to PNM");
}
}
else
esyslog("ERROR: video device VIDIOC_STREAMOFF failed");
}
else
esyslog("ERROR: video device VIDIOC_DQBUF failed");
}
else
esyslog("ERROR: video device VIDIOC_STREAMON failed");
}
else
esyslog("ERROR: video device VIDIOC_QBUF failed");
munmap(mem, msize);
}
else
esyslog("ERROR: failed to memmap video device");
}
else
esyslog("ERROR: video device VIDIOC_QUERYBUF failed");
}
else
esyslog("ERROR: video device VIDIOC_REQBUFS failed");
}
else
esyslog("ERROR: video device VIDIOC_S_FMT failed");
close(videoDev);
return result;
}
else
LOG_ERROR_STR(buffer);
return NULL;
}
void cDvbSdFfDevice::SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
{
cDevice::SetVideoDisplayFormat(VideoDisplayFormat);
if (Setup.VideoFormat) {
CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX));
}
else {
switch (VideoDisplayFormat) {
case vdfPanAndScan:
CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_PAN_SCAN));
break;
case vdfLetterBox:
CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX));
break;
case vdfCenterCutOut:
CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_CENTER_CUT_OUT));
break;
default: esyslog("ERROR: unknown video display format %d", VideoDisplayFormat);
}
}
}
void cDvbSdFfDevice::SetVideoFormat(bool VideoFormat16_9)
{
CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
SetVideoDisplayFormat(eVideoDisplayFormat(Setup.VideoDisplayFormat));
}
eVideoSystem cDvbSdFfDevice::GetVideoSystem(void)
{
eVideoSystem VideoSystem = vsPAL;
if (fd_video >= 0) {
video_size_t vs;
if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
if (vs.h == 480 || vs.h == 240)
VideoSystem = vsNTSC;
}
else
LOG_ERROR;
}
return VideoSystem;
}
void cDvbSdFfDevice::GetVideoSize(int &Width, int &Height, double &VideoAspect)
{
if (fd_video >= 0) {
video_size_t vs;
if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
Width = vs.w;
Height = vs.h;
switch (vs.aspect_ratio) {
default:
case VIDEO_FORMAT_4_3: VideoAspect = 4.0 / 3.0; break;
case VIDEO_FORMAT_16_9: VideoAspect = 16.0 / 9.0; break;
case VIDEO_FORMAT_221_1: VideoAspect = 2.21; break;
}
return;
}
else
LOG_ERROR;
}
cDevice::GetVideoSize(Width, Height, VideoAspect);
}
void cDvbSdFfDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect)
{
if (fd_video >= 0) {
video_size_t vs;
if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
Width = 720;
if (vs.h != 480 && vs.h != 240)
Height = 576; // PAL
else
Height = 480; // NTSC
switch (Setup.VideoFormat ? vs.aspect_ratio : VIDEO_FORMAT_4_3) {
default:
case VIDEO_FORMAT_4_3: PixelAspect = 4.0 / 3.0; break;
case VIDEO_FORMAT_221_1: // FF DVB cards only distinguish between 4:3 and 16:9
case VIDEO_FORMAT_16_9: PixelAspect = 16.0 / 9.0; break;
}
PixelAspect /= double(Width) / Height;
return;
}
else
LOG_ERROR;
}
cDevice::GetOsdSize(Width, Height, PixelAspect);
}
bool cDvbSdFfDevice::SetAudioBypass(bool On)
{
if (setTransferModeForDolbyDigital != 1)
return false;
return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0;
}
// ptAudio ptVideo ptPcr ptTeletext ptDolby ptOther
static dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_PCR, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
bool cDvbSdFfDevice::SetPid(cPidHandle *Handle, int Type, bool On)
{
if (Handle->pid) {
dmx_pes_filter_params pesFilterParams;
memset(&pesFilterParams, 0, sizeof(pesFilterParams));
if (On) {
if (Handle->handle < 0) {
Handle->handle = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR | O_NONBLOCK, true);
if (Handle->handle < 0) {
LOG_ERROR;
return false;
}
}
pesFilterParams.pid = Handle->pid;
pesFilterParams.input = DMX_IN_FRONTEND;
pesFilterParams.output = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP;
pesFilterParams.pes_type= PesTypes[Type < ptOther ? Type : ptOther];
pesFilterParams.flags = DMX_IMMEDIATE_START;
if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
LOG_ERROR;
return false;
}
}
else if (!Handle->used) {
CHECK(ioctl(Handle->handle, DMX_STOP));
if (Type <= ptTeletext) {
pesFilterParams.pid = 0x1FFF;
pesFilterParams.input = DMX_IN_FRONTEND;
pesFilterParams.output = DMX_OUT_DECODER;
pesFilterParams.pes_type= PesTypes[Type];
pesFilterParams.flags = DMX_IMMEDIATE_START;
CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams));
if (PesTypes[Type] == DMX_PES_VIDEO) // let's only do this once
SetPlayMode(pmNone); // necessary to switch a PID from DMX_PES_VIDEO/AUDIO to DMX_PES_OTHER
}
close(Handle->handle);
Handle->handle = -1;
}
}
return true;
}
bool cDvbSdFfDevice::ProvidesSource(int Source) const
{
if (outputOnly)
return false;
else
return cDvbDevice::ProvidesSource(Source);
}
int cDvbSdFfDevice::NumProvidedSystems(void) const
{
if (outputOnly)
return 0;
return cDvbDevice::NumProvidedSystems();
}
void cDvbSdFfDevice::TurnOffLiveMode(bool LiveView)
{
if (LiveView) {
// Avoid noise while switching:
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
}
// Turn off live PIDs:
DetachAll(pidHandles[ptAudio].pid);
DetachAll(pidHandles[ptVideo].pid);
DetachAll(pidHandles[ptPcr].pid);
DetachAll(pidHandles[ptTeletext].pid);
DelPid(pidHandles[ptAudio].pid);
DelPid(pidHandles[ptVideo].pid);
DelPid(pidHandles[ptPcr].pid, ptPcr);
DelPid(pidHandles[ptTeletext].pid);
DelPid(pidHandles[ptDolby].pid);
}
bool cDvbSdFfDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{
int apid = Channel->Apid(0);
int vpid = Channel->Vpid();
int dpid = Channel->Dpid(0);
bool DoTune = !IsTunedToTransponder(Channel);
bool pidHandlesVideo = pidHandles[ptVideo].pid == vpid;
bool pidHandlesAudio = pidHandles[ptAudio].pid == apid;
bool TurnOffLivePIDs = DoTune
|| !IsPrimaryDevice()
|| LiveView // for a new live view the old PIDs need to be turned off
|| pidHandlesVideo // for recording the PIDs must be shifted from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
;
bool StartTransferMode = IsPrimaryDevice() && !DoTune
&& (LiveView && HasPid(vpid ? vpid : apid) && (!pidHandlesVideo || (!pidHandlesAudio && (dpid ? pidHandles[ptAudio].pid != dpid : true)))// the PID is already set as DMX_PES_OTHER
|| !LiveView && (pidHandlesVideo || pidHandlesAudio) // a recording is going to shift the PIDs from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
);
if (CamSlot() && !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlot()->SlotNumber()))
StartTransferMode |= LiveView && IsPrimaryDevice() && Channel->Ca() >= CA_ENCRYPTED_MIN;
bool TurnOnLivePIDs = !StartTransferMode && LiveView;
// Turn off live PIDs if necessary:
if (TurnOffLivePIDs)
TurnOffLiveMode(LiveView);
// Set the tuner:
if (!cDvbDevice::SetChannelDevice(Channel, LiveView))
return false;
// PID settings:
if (TurnOnLivePIDs) {
SetAudioBypass(false);
if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(vpid, ptVideo) && AddPid(apid, ptAudio))) {
esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1);
return false;
}
if (IsPrimaryDevice())
AddPid(Channel->Tpid(), ptTeletext);
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); // actually one would expect 'false' here, but according to Marco Schluessler <marco@lordzodiac.de> this works
// to avoid missing audio after replaying a DVD; with 'false' there is an audio disturbance when switching
// between two channels on the same transponder on DVB-S
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
}
else if (StartTransferMode)
cControl::Launch(new cTransferControl(this, Channel));
return true;
}
int cDvbSdFfDevice::GetAudioChannelDevice(void)
{
audio_status_t as;
CHECK(ioctl(fd_audio, AUDIO_GET_STATUS, &as));
return as.channel_select;
}
void cDvbSdFfDevice::SetAudioChannelDevice(int AudioChannel)
{
CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AudioChannel));
}
void cDvbSdFfDevice::SetVolumeDevice(int Volume)
{
if (digitalAudio)
Volume = 0;
audio_mixer_t am;
// conversion for linear volume response:
am.volume_left = am.volume_right = 2 * Volume - Volume * Volume / 255;
CHECK(ioctl(fd_audio, AUDIO_SET_MIXER, &am));
}
void cDvbSdFfDevice::SetDigitalAudioDevice(bool On)
{
if (digitalAudio != On) {
if (digitalAudio)
cCondWait::SleepMs(1000); // Wait until any leftover digital data has been flushed
digitalAudio = On;
SetVolumeDevice(On || IsMute() ? 0 : CurrentVolume());
}
}
void cDvbSdFfDevice::SetAudioTrackDevice(eTrackType Type)
{
const tTrackId *TrackId = GetTrack(Type);
if (TrackId && TrackId->id) {
SetAudioBypass(false);
if (IS_AUDIO_TRACK(Type) || (IS_DOLBY_TRACK(Type) && SetAudioBypass(true))) {
if (pidHandles[ptAudio].pid && pidHandles[ptAudio].pid != TrackId->id) {
DetachAll(pidHandles[ptAudio].pid);
if (CamSlot())
CamSlot()->SetPid(pidHandles[ptAudio].pid, false);
pidHandles[ptAudio].pid = TrackId->id;
SetPid(&pidHandles[ptAudio], ptAudio, true);
if (CamSlot()) {
CamSlot()->SetPid(pidHandles[ptAudio].pid, true);
CamSlot()->StartDecrypting();
}
}
}
else if (IS_DOLBY_TRACK(Type)) {
if (setTransferModeForDolbyDigital == 0)
return;
// Currently this works only in Transfer Mode
ForceTransferMode();
}
}
}
bool cDvbSdFfDevice::CanReplay(void) const
{
return cDevice::CanReplay();
}
bool cDvbSdFfDevice::SetPlayMode(ePlayMode PlayMode)
{
if (PlayMode != pmExtern_THIS_SHOULD_BE_AVOIDED && fd_video < 0 && fd_audio < 0) {
// reopen the devices
fd_video = DvbOpen(DEV_DVB_VIDEO, adapter, frontend, O_RDWR | O_NONBLOCK);
fd_audio = DvbOpen(DEV_DVB_AUDIO, adapter, frontend, O_RDWR | O_NONBLOCK);
SetVideoFormat(Setup.VideoFormat);
}
switch (PlayMode) {
case pmNone:
// special handling to return from PCM replay:
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
CHECK(ioctl(fd_video, VIDEO_PLAY));
CHECK(ioctl(fd_video, VIDEO_STOP, true));
CHECK(ioctl(fd_audio, AUDIO_STOP, true));
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX));
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
break;
case pmAudioVideo:
case pmAudioOnlyBlack:
if (playMode == pmNone)
TurnOffLiveMode(true);
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo));
CHECK(ioctl(fd_audio, AUDIO_PLAY));
CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
CHECK(ioctl(fd_video, VIDEO_PLAY));
break;
case pmAudioOnly:
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
CHECK(ioctl(fd_audio, AUDIO_STOP, true));
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
CHECK(ioctl(fd_audio, AUDIO_PLAY));
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
break;
case pmVideoOnly:
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
CHECK(ioctl(fd_video, VIDEO_STOP, true));
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
CHECK(ioctl(fd_audio, AUDIO_PLAY));
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
CHECK(ioctl(fd_video, VIDEO_PLAY));
break;
case pmExtern_THIS_SHOULD_BE_AVOIDED:
close(fd_video);
close(fd_audio);
fd_video = fd_audio = -1;
break;
default: esyslog("ERROR: unknown playmode %d", PlayMode);
}
playMode = PlayMode;
return true;
}
int64_t cDvbSdFfDevice::GetSTC(void)
{
if (fd_stc >= 0) {
struct dmx_stc stc;
stc.num = 0;
if (ioctl(fd_stc, DMX_GET_STC, &stc) == -1) {
esyslog("ERROR: stc %d: %m", CardIndex() + 1);
return -1;
}
return stc.stc / stc.base;
}
return -1;
}
void cDvbSdFfDevice::TrickSpeed(int Speed)
{
if (fd_video >= 0)
CHECK(ioctl(fd_video, VIDEO_SLOWMOTION, Speed));
}
void cDvbSdFfDevice::Clear(void)
{
if (fd_video >= 0)
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
if (fd_audio >= 0)
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
cDevice::Clear();
}
void cDvbSdFfDevice::Play(void)
{
if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) {
if (fd_audio >= 0)
CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
}
else {
if (fd_audio >= 0) {
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
}
if (fd_video >= 0)
CHECK(ioctl(fd_video, VIDEO_CONTINUE));
}
cDevice::Play();
}
void cDvbSdFfDevice::Freeze(void)
{
if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) {
if (fd_audio >= 0)
CHECK(ioctl(fd_audio, AUDIO_PAUSE));
}
else {
if (fd_audio >= 0) {
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
CHECK(ioctl(fd_audio, AUDIO_PAUSE));
}
if (fd_video >= 0)
CHECK(ioctl(fd_video, VIDEO_FREEZE));
}
cDevice::Freeze();
}
void cDvbSdFfDevice::Mute(void)
{
if (fd_audio >= 0) {
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
}
cDevice::Mute();
}
void cDvbSdFfDevice::StillPicture(const uchar *Data, int Length)
{
if (!Data || Length < TS_SIZE)
return;
if (Data[0] == 0x47) {
// TS data
cDevice::StillPicture(Data, Length);
}
else if (Data[0] == 0x00 && Data[1] == 0x00 && Data[2] == 0x01 && (Data[3] & 0xF0) == 0xE0) {
// PES data
char *buf = MALLOC(char, Length);
if (!buf)
return;
int i = 0;
int blen = 0;
while (i < Length - 6) {
if (Data[i] == 0x00 && Data[i + 1] == 0x00 && Data[i + 2] == 0x01) {
int len = Data[i + 4] * 256 + Data[i + 5];
if ((Data[i + 3] & 0xF0) == 0xE0) { // video packet
// skip PES header
int offs = i + 6;
// skip header extension
if ((Data[i + 6] & 0xC0) == 0x80) {
// MPEG-2 PES header
if (Data[i + 8] >= Length)
break;
offs += 3;
offs += Data[i + 8];
len -= 3;
len -= Data[i + 8];
if (len < 0 || offs + len > Length)
break;
}
else {
// MPEG-1 PES header
while (offs < Length && len > 0 && Data[offs] == 0xFF) {
offs++;
len--;
}
if (offs <= Length - 2 && len >= 2 && (Data[offs] & 0xC0) == 0x40) {
offs += 2;
len -= 2;
}
if (offs <= Length - 5 && len >= 5 && (Data[offs] & 0xF0) == 0x20) {
offs += 5;
len -= 5;
}
else if (offs <= Length - 10 && len >= 10 && (Data[offs] & 0xF0) == 0x30) {
offs += 10;
len -= 10;
}
else if (offs < Length && len > 0) {
offs++;
len--;
}
}
if (blen + len > Length) // invalid PES length field
break;
memcpy(&buf[blen], &Data[offs], len);
i = offs + len;
blen += len;
}
else if (Data[i + 3] >= 0xBD && Data[i + 3] <= 0xDF) // other PES packets
i += len + 6;
else
i++;
}
else
i++;
}
video_still_picture sp = { buf, blen };
CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
free(buf);
}
else {
// non-PES data
video_still_picture sp = { (char *)Data, Length };
CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
}
}
bool cDvbSdFfDevice::Poll(cPoller &Poller, int TimeoutMs)
{
Poller.Add((playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) ? fd_audio : fd_video, true);
return Poller.Poll(TimeoutMs);
}
bool cDvbSdFfDevice::Flush(int TimeoutMs)
{
//TODO actually this function should wait until all buffered data has been processed by the card, but how?
return true;
}
int cDvbSdFfDevice::PlayVideo(const uchar *Data, int Length)
{
return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
}
int cDvbSdFfDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
{
return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
}
int cDvbSdFfDevice::PlayTsVideo(const uchar *Data, int Length)
{
return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
}
int cDvbSdFfDevice::PlayTsAudio(const uchar *Data, int Length)
{
return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
}
// --- cDvbSdFfDeviceProbe ---------------------------------------------------
cDvbSdFfDeviceProbe::cDvbSdFfDeviceProbe(void)
{
outputOnly = false;
}
bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend)
{
static uint32_t SubsystemIds[] = {
0x110A0000, // Fujitsu Siemens DVB-C
0x13C20000, // Technotrend/Hauppauge WinTV DVB-S rev1.X or Fujitsu Siemens DVB-C
0x13C20001, // Technotrend/Hauppauge WinTV DVB-T rev1.X
0x13C20002, // Technotrend/Hauppauge WinTV DVB-C rev2.X
0x13C20003, // Technotrend/Hauppauge WinTV Nexus-S rev2.X
0x13C20004, // Galaxis DVB-S rev1.3
0x13C20006, // Fujitsu Siemens DVB-S rev1.6
0x13C20008, // Technotrend/Hauppauge DVB-T
0x13C2000A, // Technotrend/Hauppauge WinTV Nexus-CA rev1.X
0x13C2000E, // Technotrend/Hauppauge WinTV Nexus-S rev2.3
0x13C21002, // Technotrend/Hauppauge WinTV DVB-S rev1.3 SE
0x00000000
};
uint32_t SubsystemId = GetSubsystemId(Adapter, Frontend);
for (uint32_t *sid = SubsystemIds; *sid; sid++) {
if (*sid == SubsystemId) {
dsyslog("creating cDvbSdFfDevice");
new cDvbSdFfDevice(Adapter, Frontend, outputOnly);
return true;
}
}
return false;
}

View File

@ -1,116 +0,0 @@
/*
* dvbsdffdevice.h: The DVB SD Full Featured device interface
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbsdffdevice.h 2.16 2013/02/17 13:16:29 kls Exp $
*/
#ifndef __DVBSDFFDEVICE_H
#define __DVBSDFFDEVICE_H
#include <vdr/dvbdevice.h>
#include <vdr/dvbspu.h>
/// The cDvbSdFfDevice implements a DVB device which can be accessed through the Linux DVB driver API.
class cDvbSdFfDevice : public cDvbDevice {
private:
int fd_osd, fd_audio, fd_video, fd_stc;
bool outputOnly;
protected:
virtual void MakePrimaryDevice(bool On);
public:
cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly);
virtual ~cDvbSdFfDevice();
virtual bool HasDecoder(void) const;
virtual bool AvoidRecording(void) const;
// SPU facilities
private:
cDvbSpuDecoder *spuDecoder;
public:
virtual cSpuDecoder *GetSpuDecoder(void);
// Channel facilities
public:
virtual bool ProvidesSource(int Source) const;
virtual int NumProvidedSystems(void) const;
private:
void TurnOffLiveMode(bool LiveView);
protected:
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
// PID handle facilities
private:
bool SetAudioBypass(bool On);
protected:
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
// Image Grab facilities
private:
static int devVideoOffset;
int devVideoIndex;
public:
virtual uchar *GrabImage(int &Size, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1);
// Video format facilities
public:
virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat);
virtual void SetVideoFormat(bool VideoFormat16_9);
virtual eVideoSystem GetVideoSystem(void);
virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect);
virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect);
// Track facilities
protected:
virtual void SetAudioTrackDevice(eTrackType Type);
// Audio facilities
private:
bool digitalAudio;
protected:
virtual int GetAudioChannelDevice(void);
virtual void SetAudioChannelDevice(int AudioChannel);
virtual void SetVolumeDevice(int Volume);
virtual void SetDigitalAudioDevice(bool On);
// Player facilities
protected:
ePlayMode playMode;
virtual bool CanReplay(void) const;
virtual bool SetPlayMode(ePlayMode PlayMode);
virtual int PlayVideo(const uchar *Data, int Length);
virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
virtual int PlayTsVideo(const uchar *Data, int Length);
virtual int PlayTsAudio(const uchar *Data, int Length);
public:
virtual int64_t GetSTC(void);
virtual void TrickSpeed(int Speed);
virtual void Clear(void);
virtual void Play(void);
virtual void Freeze(void);
virtual void Mute(void);
virtual void StillPicture(const uchar *Data, int Length);
virtual bool Poll(cPoller &Poller, int TimeoutMs = 0);
virtual bool Flush(int TimeoutMs = 0);
};
class cDvbSdFfDeviceProbe : public cDvbDeviceProbe {
private:
bool outputOnly;
public:
cDvbSdFfDeviceProbe(void);
void SetOutputOnly(bool On) { outputOnly = On; }
virtual bool Probe(int Adapter, int Frontend);
};
#endif //__DVBSDFFDEVICE_H

View File

@ -1,211 +0,0 @@
/*
* dvbsdffosd.c: Implementation of the DVB SD Full Featured On Screen Display
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbsdffosd.c 2.3 2011/04/17 12:55:09 kls Exp $
*/
#include "dvbsdffosd.h"
#include <linux/dvb/osd.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/unistd.h>
#include <vdr/tools.h>
// --- cDvbSdFfOsd -----------------------------------------------------------
#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
#define MAXOSDMEMORY 92000 // number of bytes available to the OSD (for unmodified DVB cards)
class cDvbSdFfOsd : public cOsd {
private:
int osdDev;
int osdMem;
bool shown;
void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL);
protected:
virtual void SetActive(bool On);
public:
cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level);
virtual ~cDvbSdFfOsd();
virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
virtual eOsdError SetAreas(const tArea *Areas, int NumAreas);
virtual void Flush(void);
};
cDvbSdFfOsd::cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level)
:cOsd(Left, Top, Level)
{
osdDev = OsdDev;
shown = false;
if (osdDev < 0)
esyslog("ERROR: invalid OSD device handle (%d)!", osdDev);
else {
osdMem = MAXOSDMEMORY;
#ifdef OSD_CAP_MEMSIZE
// modified DVB cards may have more OSD memory:
osd_cap_t cap;
cap.cmd = OSD_CAP_MEMSIZE;
if (ioctl(osdDev, OSD_GET_CAPABILITY, &cap) == 0)
osdMem = cap.val;
#endif
}
}
cDvbSdFfOsd::~cDvbSdFfOsd()
{
SetActive(false);
}
void cDvbSdFfOsd::SetActive(bool On)
{
if (On != Active()) {
cOsd::SetActive(On);
if (On) {
// must clear all windows here to avoid flashing effects - doesn't work if done
// in Flush() only for the windows that are actually used...
for (int i = 0; i < MAXNUMWINDOWS; i++) {
Cmd(OSD_SetWindow, 0, i + 1);
Cmd(OSD_Clear);
}
if (GetBitmap(0)) // only flush here if there are already bitmaps
Flush();
}
else if (shown) {
for (int i = 0; GetBitmap(i); i++) {
Cmd(OSD_SetWindow, 0, i + 1);
Cmd(OSD_Close);
}
shown = false;
}
}
}
eOsdError cDvbSdFfOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
{
eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas);
if (Result == oeOk) {
if (NumAreas > MAXNUMWINDOWS)
return oeTooManyAreas;
int TotalMemory = 0;
for (int i = 0; i < NumAreas; i++) {
if (Areas[i].bpp != 1 && Areas[i].bpp != 2 && Areas[i].bpp != 4 && Areas[i].bpp != 8)
return oeBppNotSupported;
if ((Areas[i].Width() & (8 / Areas[i].bpp - 1)) != 0)
return oeWrongAlignment;
if (Areas[i].Width() < 1 || Areas[i].Height() < 1 || Areas[i].Width() > 720 || Areas[i].Height() > 576)
return oeWrongAreaSize;
TotalMemory += Areas[i].Width() * Areas[i].Height() / (8 / Areas[i].bpp);
}
if (TotalMemory > osdMem)
return oeOutOfMemory;
}
return Result;
}
eOsdError cDvbSdFfOsd::SetAreas(const tArea *Areas, int NumAreas)
{
if (shown) {
for (int i = 0; GetBitmap(i); i++) {
Cmd(OSD_SetWindow, 0, i + 1);
Cmd(OSD_Close);
}
shown = false;
}
return cOsd::SetAreas(Areas, NumAreas);
}
void cDvbSdFfOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data)
{
if (osdDev >= 0) {
osd_cmd_t dc;
dc.cmd = cmd;
dc.color = color;
dc.x0 = x0;
dc.y0 = y0;
dc.x1 = x1;
dc.y1 = y1;
dc.data = (void *)data;
ioctl(osdDev, OSD_SEND_CMD, &dc);
}
}
void cDvbSdFfOsd::Flush(void)
{
if (!Active())
return;
cBitmap *Bitmap;
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
Cmd(OSD_SetWindow, 0, i + 1);
if (!shown)
Cmd(OSD_Open, Bitmap->Bpp(), Left() + Bitmap->X0(), Top() + Bitmap->Y0(), Left() + Bitmap->X0() + Bitmap->Width() - 1, Top() + Bitmap->Y0() + Bitmap->Height() - 1, (void *)1); // initially hidden!
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
if (!shown || Bitmap->Dirty(x1, y1, x2, y2)) {
if (!shown) {
x1 = y1 = 0;
x2 = Bitmap->Width() - 1;
y2 = Bitmap->Height() - 1;
}
//TODO Workaround: apparently the bitmap sent to the driver always has to be a multiple
//TODO of 8 bits wide, and (dx * dy) also has to be a multiple of 8.
//TODO Fix driver (should be able to handle any size bitmaps!)
while ((x1 > 0 || x2 < Bitmap->Width() - 1) && ((x2 - x1) & 7) != 7) {
if (x2 < Bitmap->Width() - 1)
x2++;
else if (x1 > 0)
x1--;
}
//TODO "... / 2" <==> Bpp???
while ((y1 > 0 || y2 < Bitmap->Height() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
if (y2 < Bitmap->Height() - 1)
y2++;
else if (y1 > 0)
y1--;
}
while ((x1 > 0 || x2 < Bitmap->Width() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
if (x2 < Bitmap->Width() - 1)
x2++;
else if (x1 > 0)
x1--;
}
// commit colors:
int NumColors;
const tColor *Colors = Bitmap->Colors(NumColors);
if (Colors) {
//TODO this should be fixed in the driver!
tColor colors[NumColors];
for (int i = 0; i < NumColors; i++) {
// convert AARRGGBB to AABBGGRR (the driver expects the colors the wrong way):
colors[i] = (Colors[i] & 0xFF000000) | ((Colors[i] & 0x0000FF) << 16) | (Colors[i] & 0x00FF00) | ((Colors[i] & 0xFF0000) >> 16);
}
Colors = colors;
//TODO end of stuff that should be fixed in the driver
Cmd(OSD_SetPalette, 0, NumColors - 1, 0, 0, 0, Colors);
}
// commit modified data:
Cmd(OSD_SetBlock, Bitmap->Width(), x1, y1, x2, y2, Bitmap->Data(x1, y1));
}
Bitmap->Clean();
}
if (!shown) {
// Showing the windows in a separate loop to avoid seeing them come up one after another
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
Cmd(OSD_SetWindow, 0, i + 1);
Cmd(OSD_MoveWindow, 0, Left() + Bitmap->X0(), Top() + Bitmap->Y0());
}
shown = true;
}
}
// --- cDvbOsdProvider -------------------------------------------------------
cDvbOsdProvider::cDvbOsdProvider(int OsdDev)
{
osdDev = OsdDev;
}
cOsd *cDvbOsdProvider::CreateOsd(int Left, int Top, uint Level)
{
return new cDvbSdFfOsd(Left, Top, osdDev, Level);
}

View File

@ -1,22 +0,0 @@
/*
* dvbsdffosd.h: Implementation of the DVB SD Full Featured On Screen Display
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbsdffosd.h 2.2 2012/12/03 13:43:55 kls Exp $
*/
#ifndef __DVBSDFFODF_H
#define __DVBSDFFODF_H
#include <vdr/osd.h>
class cDvbOsdProvider : public cOsdProvider {
private:
int osdDev;
public:
cDvbOsdProvider(int OsdDev);
virtual cOsd *CreateOsd(int Left, int Top, uint Level);
};
#endif //__DVBSDFFODF_H

View File

@ -16,3 +16,19 @@ VDR Plugin 'epgtableid0' Revision History
2013-03-31: Version 2.0.0
- Official release.
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
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 1.13 2013/01/12 13:45:01 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
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)
#
@ -61,7 +62,8 @@ all: $(SOFILE)
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -75,7 +77,8 @@ $(DEPFILE): Makefile
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
@echo LD $@
$(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 1.4 2013/03/31 09:30: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.0.0";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
// --- cTable0Handler --------------------------------------------------------

View File

@ -86,3 +86,20 @@ VDR Plugin 'hello' Revision History
2013-03-31: Version 2.0.0
- Official release.
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
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 2.18 2013/01/12 13:45:01 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
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)
@ -62,7 +63,8 @@ all: $(SOFILE) i18n
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -82,13 +84,16 @@ I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
msgfmt -c -o $@ $<
@echo MO $@
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
@echo GT $@
$(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)
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@echo PO $@
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -102,7 +107,8 @@ install-i18n: $(I18Nmsgs)
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
@echo LD $@
$(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 2.6 2013/03/31 09:30:18 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.0.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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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,35 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 <kasjas@hot.ee>, 2004
# Arthur Konovalov <artlov@gmail.com>, 2004, 2015
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 0.2.5\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: Arthur Konovalov <kasjas@hot.ee>\n"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-13\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "A friendly greeting"
msgstr ""
msgstr "Sõbralik tervitus"
msgid "Hello"
msgstr ""
msgstr "Tere"
msgid "Greeting time (s)"
msgstr ""
msgstr "Tervituse kestus (s)"
msgid "Use alternate greeting"
msgstr ""
msgstr "Vahelduv tervitus"
msgid "Howdy folks!"
msgstr ""
msgstr "Kuidas käsi käib?"
msgid "Hello world!"
msgstr ""
msgstr "Tere, maailm!"

View File

@ -1,5 +1,5 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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) 2013 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 0.2.5\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,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2013 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
# Jordi Vilà <jvila@tinet.org>, 2003
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
# Nan Feng VDR <nfgx@21cn.com>, 2009
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-hello 0.2.5\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

@ -59,3 +59,35 @@ VDR Plugin 'osddemo' Revision History
2013-03-31: Version 2.0.0
- Official release.
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2014-02-06: Version 2.1.2
- Fixed flickering if subtitles are active while the OSD demo is running.
- Fixed a possible crash in the OSD demo (reported by Christopher Reimer).
2015-02-19: Version 2.2.0
- Official release.
2015-03-08: Version 2.3.1
- Now using cOsd::MaxPixmapSize().
- 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 2.16 2013/01/12 13:45:01 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
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)
#
@ -61,7 +62,8 @@ all: $(SOFILE)
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -75,7 +77,8 @@ $(DEPFILE): Makefile
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
@echo LD $@
$(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 2.12 2013/03/31 09:30:18 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.0.0";
static const char *VERSION = "2.4.1";
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
static const char *MAINMENUENTRY = "Osd Demo";
@ -90,6 +90,137 @@ void DrawSlopes(cOsd *Osd)
Osd->Flush();
}
// --- DrawImages ------------------------------------------------------------
struct tOsdImageRef {
int image;
cSize size;
};
#define NUMOSDIMAGES 16
#define NUMOSDIMAGEVARIANTS 8
void DrawImages(cOsd *Osd)
{
// Create images:
cImage *images[NUMOSDIMAGEVARIANTS];
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++) {
images[i] = new cImage(cSize(
i == 0 || i == 1 ? Osd->MaxPixmapSize().Width() + 1 : rand() % Osd->Width(),
i == 0 || i == 2 ? Osd->MaxPixmapSize().Height() + 1 : rand() % Osd->Height()));
for (int x = 0; x < images[i]->Width(); x++) {
for (int y = 0; y < images[i]->Height(); y++) {
images[i]->SetPixel(cPoint(x, y),
(!x || !y || x == images[i]->Width() - 1 || y == images[i]->Height() - 1) ? clrWhite :
(x > images[i]->Width() / 2 ?
(y > images[i]->Height() / 2 ? clrBlue : clrGreen) :
(y > images[i]->Height() / 2 ? clrRed : clrYellow)));
}
}
}
// Store images:
tOsdImageRef osdImages[NUMOSDIMAGES];
for (int i = 0; i < NUMOSDIMAGES; i++) {
osdImages[i].image = cOsdProvider::StoreImage(*images[i % NUMOSDIMAGEVARIANTS]);
osdImages[i].size.Set(images[i % NUMOSDIMAGEVARIANTS]->Size());
}
// Delete images:
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++)
delete images[i];
// Draw images:
for (int i = 0; i < NUMOSDIMAGES; i++)
Osd->DrawImage(cPoint(rand() % (Osd->Width() + osdImages[i].size.Width()), rand() % (Osd->Height() + osdImages[i].size.Height())).Shifted(-osdImages[i].size.Width(), -osdImages[i].size.Height()), osdImages[i].image);
// Drop image references:
for (int i = 0; i < NUMOSDIMAGES; i++)
cOsdProvider::DropImage(osdImages[i].image);
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 {
@ -119,7 +250,7 @@ cLineGame::~cLineGame()
void cLineGame::Show(void)
{
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop(), 50);
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
if (osd) {
int x1 = cOsd::OsdWidth() - 1;
int y1 = cOsd::OsdHeight() - 1;
@ -210,7 +341,7 @@ cPixmap *cTrueColorDemo::CreateTextPixmap(const char *s, int Line, int Layer, tC
if (Pixmap) {
Pixmap->Clear();
Pixmap->SetAlpha(0);
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font);
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font, w);
}
return Pixmap;
}
@ -427,16 +558,20 @@ void cTrueColorDemo::Action(void)
const int Size = SmlFont->Width(Text) + 10;
const int NumDots = 12;
const int AnimFrames = NumDots;
int Rows = min(osd->MaxPixmapSize().Height() / Size, AnimFrames);
int Cols = (AnimFrames + Rows - 1) / Rows;
// Temporarily using pixmap layer 0 to have the text alpha blended:
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size, Size * AnimFrames));
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size * Cols, Size * Rows));
if (AnimPixmap) {
AnimPixmap->SetAlpha(0);
AnimPixmap->Clear();
const int Diameter = Size / 5;
int xc = Size / 2 - Diameter / 2;
for (int Frame = 0; Frame < AnimFrames; Frame++) {
AnimPixmap->DrawEllipse(cRect(0, Frame * Size, Size, Size), 0xDDFFFFFF);
int yc = Frame * Size + Size / 2 - Diameter / 2;
int x0 = Frame / Rows * Size;
int y0 = Frame % Rows * Size;
AnimPixmap->DrawEllipse(cRect(x0, y0, Size, Size), 0xDDFFFFFF);
int xc = x0 + Size / 2 - Diameter / 2;
int yc = y0 + Size / 2 - Diameter / 2;
int Color = 0xFF;
int Delta = Color / NumDots / 3;
for (int a = 0; a < NumDots; a++) {
@ -446,7 +581,7 @@ void cTrueColorDemo::Action(void)
AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color));
Color -= Delta;
}
AnimPixmap->DrawText(cPoint(0, Frame * Size), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
AnimPixmap->DrawText(cPoint(x0, y0), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
}
AnimPixmap->SetLayer(3); // now setting the actual pixmap layer
FadeInPixmap = AnimPixmap;
@ -480,6 +615,8 @@ void cTrueColorDemo::Action(void)
if (Delta < FrameTime)
cCondWait::SleepMs(FrameTime - Delta);
}
destroyablePixmap = NULL;
toggleablePixmap = NULL;
delete OsdFont;
delete SmlFont;
delete LrgFont;
@ -496,7 +633,7 @@ bool cTrueColorDemo::SetArea(void)
void cTrueColorDemo::Show(void)
{
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop(), 50);
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
if (osd) {
if (SetArea()) {
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
@ -534,6 +671,14 @@ eOSState cTrueColorDemo::ProcessKey(eKeys Key)
SetArea();
DrawSlopes(osd);
break;
case k3: Cancel(3);
SetArea();
DrawImages(osd);
break;
case k4: Cancel(3);
SetArea();
DrawEllipseAlignments(osd);
return osContinue;
case kBack:
case kOk: return osEnd;
default: return state;

View File

@ -87,3 +87,36 @@ VDR Plugin 'pictures' Revision History
2013-03-31: Version 2.0.0
- Official release.
2013-07-01:
- Added option -x to pic2mpg.
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2015-02-19: Version 2.2.0
- Official release.
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 2.18 2013/01/12 13:45:01 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
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)
@ -62,7 +63,8 @@ all: $(SOFILE) i18n
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -82,13 +84,16 @@ I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
msgfmt -c -o $@ $<
@echo MO $@
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
@echo GT $@
$(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)
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@echo PO $@
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -102,7 +107,8 @@ install-i18n: $(I18Nmsgs)
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
@echo LD $@
$(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: menu.c 1.1 2008/01/13 11:35:18 kls Exp $
* $Id: menu.c 4.1 2015/07/17 10:13:56 kls Exp $
*/
#include "menu.h"
@ -85,7 +85,7 @@ eOSState cPictureMenu::SelectItem(const char *Path, bool SlideShow)
if (Item) {
const cList<cPictureEntry> *l = pictureEntry->Entries();
if (l) {
cPictureEntry *pe = l->Get(Current());
const cPictureEntry *pe = l->Get(Current());
if (pe) {
if (SlideShow) {
cControl::Launch(new cPictureControl(pictures, pe, true));

View File

@ -7,7 +7,7 @@
#
# See the README file for copyright information and how to reach the author.
#
# $Id: pic2mpg 2.5 2013/02/17 13:17:13 kls Exp $
# $Id: pic2mpg 4.1 2017/10/06 14:42:18 kls Exp $
use File::Path;
use File::Spec;
@ -23,9 +23,10 @@ Options: -f Force conversion
-o percent overscan in percent
-s size Screen size (WIDTHxHEIGHT, default is 1920x1080)
-v num Verbose (0=none, 1=list files, 2=detailed)
-x dir[,...] eXclude the given directories
};
getopts("fho:s:v:") || die $Usage;
getopts("fho:s:v:x:") || die $Usage;
die $Usage if $opt_h;
@ -33,6 +34,7 @@ $Force = $opt_f;
$Overscan = $opt_o || 0;
$Size = $opt_s || "1920x1080";
$Verbose = $opt_v;
@Exclude = split(',', $opt_x || "");
$ListFiles = $Verbose >= 1;
$Detailed = $Verbose >= 2;
@ -85,7 +87,11 @@ chdir($PICDIR) || die "$PICDIR: $!\n";
@Pictures = `find -type f | sort`;
chomp(@Pictures);
PIC:
for $pic (@Pictures) {
for (@Exclude) {
next PIC if ($pic =~ /\/$_\//);
}
my $mpg = "$MPGDIR/$pic.mpg";
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
(my $dir = $mpg) =~ s/\/[^\/]*$//;
@ -122,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");
}
}
@ -136,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
@ -156,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 2.9 2013/03/31 09:30:18 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.0.0";
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 2.2 2012/04/28 11:58:15 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;
@ -211,7 +213,7 @@ cString cPictureControl::GetHeader(void)
eOSState cPictureControl::ProcessKey(eKeys Key)
{
switch (Key) {
switch (int(Key)) {
case kUp:
case kPlay: slideShowDelay.Set();
slideShow = true;

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 0.1.3\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

@ -0,0 +1,33 @@
# 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.
# Arthur Konovalov <artlov@gmail.com>, 2015
#
msgid ""
msgstr ""
"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"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Pictures"
msgstr "Pildid"
msgid "A simple picture viewer"
msgstr "Lihtne pildivaatur"
msgid "Picture directory"
msgstr "Pildikaust"
msgid "Slide show delay (s)"
msgstr "Slaidiseanssi viide (s)"
msgid "No picture directory has been defined!"
msgstr "Pildikaust on määramata!"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 0.1.3\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) 2013 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 0.1.3\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) 2013 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 0.1.3\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) 2013 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 0.1.3\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) 2013 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 0.1.3\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"
@ -28,7 +28,7 @@ msgid "Picture directory"
msgstr "ºÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ"
msgid "Slide show delay (s)"
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
msgid "No picture directory has been defined!"
msgstr "½Õ ÞßàÕÔÕÛñÝ ÚÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ!"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 0.1.3\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

@ -1,340 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@ -1,22 +0,0 @@
VDR Plugin 'rcu' Revision History
---------------------------------
2012-02-27: Version 0.0.1
- Initial revision.
2012-03-07: Version 0.0.2
- Added new parameter LiveView to ChannelSwitch().
2012-12-27: Version 0.0.3
- Adapted Makefile to changes introduced in recent VDR versions.
2013-01-12: Version 0.0.4
- Adapted Makefile to changes introduced in recent VDR versions.
2013-03-31: Version 2.0.0
- Official release.

View File

@ -1,94 +0,0 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 1.13 2013/01/12 13:45:01 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
# By default the main source file also carries this name.
PLUGIN = rcu
### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
### 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
TMPDIR ?= /tmp
### The compiler options:
export CFLAGS = $(call PKGCFG,cflags)
export CXXFLAGS = $(call PKGCFG,cxxflags)
### The version number of VDR's plugin API:
APIVERSION = $(call PKGCFG,apiversion)
### Allow user defined options to overwrite defaults:
-include $(PLGCFG)
### The name of the distribution archive:
ARCHIVE = $(PLUGIN)-$(VERSION)
PACKAGE = vdr-$(ARCHIVE)
### The name of the shared object file:
SOFILE = libvdr-$(PLUGIN).so
### Includes and Defines (add further entries here):
INCLUDES +=
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
### The object files (add further files here):
OBJS = $(PLUGIN).o
### The main target:
all: $(SOFILE)
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
MAKEDEP = $(CXX) -MM -MG
DEPFILE = .dependencies
$(DEPFILE): Makefile
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-include $(DEPFILE)
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
install: install-lib
dist: clean
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@mkdir $(TMPDIR)/$(ARCHIVE)
@cp -a * $(TMPDIR)/$(ARCHIVE)
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@echo Distribution package created as $(PACKAGE).tgz
clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~

View File

@ -1,19 +0,0 @@
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/remote.htm
Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
See the file COPYING for more information.
Description:
============
The "Remote Control Unit" used to be part of the core VDR source
code, and has been moved into a separate plugin in version 1.7.25.

View File

@ -1,420 +0,0 @@
/*
* rcu.c: A plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
* $Id: rcu.c 1.5 2013/03/31 09:30:18 kls Exp $
*/
#include <getopt.h>
#include <netinet/in.h>
#include <termios.h>
#include <unistd.h>
#include <vdr/plugin.h>
#include <vdr/remote.h>
#include <vdr/status.h>
#include <vdr/thread.h>
#include <vdr/tools.h>
static const char *VERSION = "2.0.0";
static const char *DESCRIPTION = "Remote Control Unit";
#define REPEATLIMIT 150 // ms
#define REPEATDELAY 350 // ms
#define HANDSHAKETIMEOUT 20 // ms
#define DEFAULTDEVICE "/dev/ttyS1"
class cRcuRemote : public cRemote, private cThread, private cStatus {
private:
enum { modeH = 'h', modeB = 'b', modeS = 's' };
int f;
unsigned char dp, code, mode;
int number;
unsigned int data;
bool receivedCommand;
bool SendCommand(unsigned char Cmd);
int ReceiveByte(int TimeoutMs = 0);
bool SendByteHandshake(unsigned char c);
bool SendByte(unsigned char c);
bool SendData(unsigned int n);
void SetCode(unsigned char Code);
void SetMode(unsigned char Mode);
void SetNumber(int n, bool Hex = false);
void SetPoints(unsigned char Dp, bool On);
void SetString(const char *s);
bool DetectCode(unsigned char *Code);
virtual void Action(void);
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
public:
cRcuRemote(const char *DeviceName);
virtual ~cRcuRemote();
virtual bool Ready(void);
virtual bool Initialize(void);
};
cRcuRemote::cRcuRemote(const char *DeviceName)
:cRemote("RCU")
,cThread("RCU remote control")
{
dp = 0;
mode = modeB;
code = 0;
number = 0;
data = 0;
receivedCommand = false;
if ((f = open(DeviceName, O_RDWR | O_NONBLOCK)) >= 0) {
struct termios t;
if (tcgetattr(f, &t) == 0) {
cfsetspeed(&t, B9600);
cfmakeraw(&t);
if (tcsetattr(f, TCSAFLUSH, &t) == 0) {
SetNumber(8888);
const char *Setup = GetSetup();
if (Setup) {
code = *Setup;
SetCode(code);
isyslog("connecting to %s remote control using code %c", Name(), code);
}
Start();
return;
}
}
LOG_ERROR_STR(DeviceName);
close(f);
}
else
LOG_ERROR_STR(DeviceName);
f = -1;
}
cRcuRemote::~cRcuRemote()
{
Cancel();
}
bool cRcuRemote::Ready(void)
{
return f >= 0;
}
bool cRcuRemote::Initialize(void)
{
if (f >= 0) {
unsigned char Code = '0';
isyslog("trying codes for %s remote control...", Name());
for (;;) {
if (DetectCode(&Code)) {
code = Code;
break;
}
}
isyslog("established connection to %s remote control using code %c", Name(), code);
char buffer[16];
snprintf(buffer, sizeof(buffer), "%c", code);
PutSetup(buffer);
return true;
}
return false;
}
void cRcuRemote::Action(void)
{
#pragma pack(1)
union {
struct {
unsigned short address;
unsigned int command;
} data;
unsigned char raw[6];
} buffer;
#pragma pack()
time_t LastCodeRefresh = 0;
cTimeMs FirstTime;
unsigned char LastCode = 0, LastMode = 0;
uint64_t LastCommand = ~0; // 0x00 might be a valid command
unsigned int LastData = 0;
bool repeat = false;
while (Running() && f >= 0) {
if (ReceiveByte(REPEATLIMIT) == 'X') {
for (int i = 0; i < 6; i++) {
int b = ReceiveByte();
if (b >= 0) {
buffer.raw[i] = b;
if (i == 5) {
unsigned short Address = ntohs(buffer.data.address); // the PIC sends bytes in "network order"
uint64_t Command = ntohl(buffer.data.command);
if (code == 'B' && Address == 0x0000 && Command == 0x00004000)
// Well, well, if it isn't the "d-box"...
// This remote control sends the above command before and after
// each keypress - let's just drop this:
break;
Command |= uint64_t(Address) << 32;
if (Command != LastCommand) {
LastCommand = Command;
repeat = false;
FirstTime.Set();
}
else {
if (FirstTime.Elapsed() < REPEATDELAY)
break; // repeat function kicks in after a short delay
repeat = true;
}
Put(Command, repeat);
receivedCommand = true;
}
}
else
break;
}
}
else if (repeat) { // the last one was a repeat, so let's generate a release
Put(LastCommand, false, true);
repeat = false;
LastCommand = ~0;
}
else {
unsigned int d = data;
if (d != LastData) {
SendData(d);
LastData = d;
}
unsigned char c = code;
if (c != LastCode) {
SendCommand(c);
LastCode = c;
}
unsigned char m = mode;
if (m != LastMode) {
SendCommand(m);
LastMode = m;
}
LastCommand = ~0;
}
if (!repeat && code && time(NULL) - LastCodeRefresh > 60) {
SendCommand(code); // in case the PIC listens to the wrong code
LastCodeRefresh = time(NULL);
}
}
}
int cRcuRemote::ReceiveByte(int TimeoutMs)
{
// Returns the byte if one was received within a timeout, -1 otherwise
if (cFile::FileReady(f, TimeoutMs)) {
unsigned char b;
if (safe_read(f, &b, 1) == 1)
return b;
else
LOG_ERROR;
}
return -1;
}
bool cRcuRemote::SendByteHandshake(unsigned char c)
{
if (f >= 0) {
int w = write(f, &c, 1);
if (w == 1) {
for (int reply = ReceiveByte(HANDSHAKETIMEOUT); reply >= 0;) {
if (reply == c)
return true;
else if (reply == 'X') {
// skip any incoming RC code - it will come again
for (int i = 6; i--;) {
if (ReceiveByte() < 0)
return false;
}
}
else
return false;
}
}
LOG_ERROR;
}
return false;
}
bool cRcuRemote::SendByte(unsigned char c)
{
for (int retry = 5; retry--;) {
if (SendByteHandshake(c))
return true;
}
return false;
}
bool cRcuRemote::SendData(unsigned int n)
{
for (int i = 0; i < 4; i++) {
if (!SendByte(n & 0x7F))
return false;
n >>= 8;
}
return SendCommand(mode);
}
void cRcuRemote::SetCode(unsigned char Code)
{
code = Code;
}
void cRcuRemote::SetMode(unsigned char Mode)
{
mode = Mode;
}
bool cRcuRemote::SendCommand(unsigned char Cmd)
{
return SendByte(Cmd | 0x80);
}
void cRcuRemote::SetNumber(int n, bool Hex)
{
number = n;
if (!Hex) {
char buf[8];
sprintf(buf, "%4d", n & 0xFFFF);
n = 0;
for (char *d = buf; *d; d++) {
if (*d == ' ')
*d = 0xF;
n = (n << 4) | ((*d - '0') & 0x0F);
}
}
unsigned int m = 0;
for (int i = 0; i < 4; i++) {
m <<= 8;
m |= ((i & 0x03) << 5) | (n & 0x0F) | (((dp >> i) & 0x01) << 4);
n >>= 4;
}
data = m;
}
void cRcuRemote::SetString(const char *s)
{
const char *chars = mode == modeH ? "0123456789ABCDEF" : "0123456789-EHLP ";
int n = 0;
for (int i = 0; *s && i < 4; s++, i++) {
n <<= 4;
for (const char *c = chars; *c; c++) {
if (*c == *s) {
n |= c - chars;
break;
}
}
}
SetNumber(n, true);
}
void cRcuRemote::SetPoints(unsigned char Dp, bool On)
{
if (On)
dp |= Dp;
else
dp &= ~Dp;
SetNumber(number);
}
bool cRcuRemote::DetectCode(unsigned char *Code)
{
// Caller should initialize 'Code' to 0 and call DetectCode()
// until it returns true. Whenever DetectCode() returns false
// and 'Code' is not 0, the caller can use 'Code' to display
// a message like "Trying code '%c'". If false is returned and
// 'Code' is 0, all possible codes have been tried and the caller
// can either stop calling DetectCode() (and give some error
// message), or start all over again.
if (*Code < 'A' || *Code > 'D') {
*Code = 'A';
return false;
}
if (*Code <= 'D') {
SetMode(modeH);
char buf[5];
sprintf(buf, "C0D%c", *Code);
SetString(buf);
SetCode(*Code);
cCondWait::SleepMs(2 * REPEATDELAY);
if (receivedCommand) {
SetMode(modeB);
SetString("----");
return true;
}
if (*Code < 'D') {
(*Code)++;
return false;
}
}
*Code = 0;
return false;
}
void cRcuRemote::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
{
if (ChannelNumber && LiveView)
SetNumber(cDevice::CurrentChannel());
}
void cRcuRemote::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
{
SetPoints(1 << Device->DeviceNumber(), Device->Receiving());
}
class cPluginRcu : public cPlugin {
private:
// Add any member variables or functions you may need here.
const char *device;
public:
cPluginRcu(void);
virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return DESCRIPTION; }
virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]);
virtual bool Start(void);
};
cPluginRcu::cPluginRcu(void)
{
// Initialize any member variables here.
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
device = DEFAULTDEVICE;
}
const char *cPluginRcu::CommandLineHelp(void)
{
// Return a string that describes all known command line options.
return " -d DEV, --device=DEV set the device to use (default is " DEFAULTDEVICE ")\n";
}
bool cPluginRcu::ProcessArgs(int argc, char *argv[])
{
// Implement command line argument processing here if applicable.
static struct option long_options[] = {
{ "dev", required_argument, NULL, 'd' },
{ NULL, no_argument, NULL, 0 }
};
int c;
while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) {
switch (c) {
case 'd': device = optarg;
break;
default: return false;
}
}
return true;
}
bool cPluginRcu::Start(void)
{
// Start any background activities the plugin shall perform.
new cRcuRemote(device);
return true;
}
VDRPLUGINCREATOR(cPluginRcu); // Don't touch this!

View File

@ -21,3 +21,19 @@ VDR Plugin 'servicedemo' Revision History
2013-03-31: Version 2.0.0
- Official release.
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
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 2.14 2013/01/12 13:45:01 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
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)
#
@ -58,7 +59,8 @@ all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -72,10 +74,12 @@ $(DEPFILE): Makefile
### Targets:
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
@echo LD $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
@echo LD $@
$(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 2.4 2013/03/31 09:30:18 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.0.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 2.4 2013/03/31 09:30:18 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.0.0";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = "Service demo server";
class cPluginSvcSvr : public cPlugin {

View File

@ -118,3 +118,46 @@ VDR Plugin 'skincurses' Revision History
2013-03-31: Version 2.0.0
- Official release.
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2015-02-08: Version 2.1.2
- Added a missing trailing blank in some translations.
2015-02-19: Version 2.2.0
- Official release.
2016-12-22: Version 2.3.2
- Added cFont::Width(void) to get the default character width and allow stretched
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 2.18 2013/01/12 13:45:01 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
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)
@ -62,7 +63,8 @@ all: $(SOFILE) i18n
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -82,13 +84,16 @@ I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
msgfmt -c -o $@ $<
@echo MO $@
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
@echo GT $@
$(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)
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@echo PO $@
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -102,7 +107,8 @@ install-i18n: $(I18Nmsgs)
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
@echo LD $@
$(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) 2013 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 0.1.12\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+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,11 +19,15 @@ msgstr ""
msgid "A text only skin"
msgstr "Eine reine Text-Oberfläche"
msgid "errors"
msgstr "Fehler"
msgid "Key$Mute"
msgstr "Stumm"
#. TRANSLATORS: note the trailing blank!
msgid "Volume "
msgstr "Lautstärke"
msgstr "Lautstärke "
msgid "Text mode"
msgstr "Text-Modus"

View File

@ -0,0 +1,33 @@
# 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.
# Arthur Konovalov <artlov@gmail.com>, 2015
#
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: 2007-08-14 20:48+0300\n"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "A text only skin"
msgstr "Tekstipõhine kest"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Hääletu"
#. TRANSLATORS: note the trailing blank!
msgid "Volume "
msgstr "Helitugevus "
msgid "Text mode"
msgstr "Tekst"

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 0.1.12\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+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,9 +19,13 @@ msgstr ""
msgid "A text only skin"
msgstr "Tekstipohjainen ulkoasu"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Mykistys"
#. TRANSLATORS: note the trailing blank!
msgid "Volume "
msgstr "Äänenvoimakkuus "

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 0.1.12\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+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,9 +19,13 @@ msgstr ""
msgid "A text only skin"
msgstr "Una interfaccia solo testo"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Muto"
#. TRANSLATORS: note the trailing blank!
msgid "Volume "
msgstr "Volume "

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 0.1.12\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+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,9 +19,13 @@ msgstr ""
msgid "A text only skin"
msgstr "Tekstinis apvalkalas"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Išjungti garsą"
#. TRANSLATORS: note the trailing blank!
msgid "Volume "
msgstr "Garsas "

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) 2013 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 0.1.12\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+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,11 +20,15 @@ msgstr ""
msgid "A text only skin"
msgstr "¿àÞáâÞ âÕÚáâÞÒëÙ ØÝâÕàäÕÙá"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "²ëÚÛ. ÓàÞÜÚÞáâì"
#. TRANSLATORS: note the trailing blank!
msgid "Volume "
msgstr "³àÞÜÚÞáâì"
msgstr "³àÞÜÚÞáâì "
msgid "Text mode"
msgstr "ÀÕÖØÜ âÕÚáâÐ"

View File

@ -1,13 +1,13 @@
# VDR plugin language source file.
# Copyright (C) 2013 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 0.1.12\n"
"Project-Id-Version: vdr-skincurses 2.6.0\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+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,11 +19,15 @@ msgstr ""
msgid "A text only skin"
msgstr "Iba text vzhµadu"
msgid "errors"
msgstr ""
msgid "Key$Mute"
msgstr "Stlmi» zvuk"
#. TRANSLATORS: note the trailing blank!
msgid "Volume "
msgstr "Hlasitos»"
msgstr "Hlasitos» "
msgid "Text mode"
msgstr "Textový re¾im"

View File

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: skincurses.c 2.13 2013/03/31 09:30:18 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.0.0";
static const char *VERSION = "2.4.3";
static const char *DESCRIPTION = trNOOP("A text only skin");
static const char *MAINMENUENTRY = NULL;
@ -20,6 +20,7 @@ static const char *MAINMENUENTRY = NULL;
class cCursesFont : public cFont {
public:
virtual int Width(void) const { return 1; }
virtual int Width(uint c) const { return 1; }
virtual int Width(const char *s) const { return s ? Utf8StrLen(s) : 0; }
virtual int Height(void) const { return 1; }
@ -59,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);
@ -78,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)
@ -121,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;
}
@ -167,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)
@ -407,8 +405,7 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
return;
int y = 2;
cTextScroller ts;
char t[32];
snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
cString t = cString::sprintf("%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
cString buffer = cString::sprintf(" VPS: %s", *Event->GetVpsString());
@ -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();
@ -614,6 +620,7 @@ void cSkinCursesDisplayVolume::SetVolume(int Current, int Total, bool Mute)
osd->DrawText(0, 0, tr("Key$Mute"), clrGreen, clrBackground, &Font);
}
else {
// TRANSLATORS: note the trailing blank!
const char *Prompt = tr("Volume ");
int l = Utf8StrLen(Prompt);
int p = (ScOsdWidth - l) * Current / Total;
@ -826,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

@ -60,3 +60,26 @@ VDR Plugin 'status' Revision History
2013-03-31: Version 2.0.0
- Official release.
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
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 2.15 2013/01/12 13:45:01 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
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)
#
@ -61,7 +62,8 @@ all: $(SOFILE)
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -75,7 +77,8 @@ $(DEPFILE): Makefile
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
@echo LD $@
$(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 2.4 2013/03/31 09:30:18 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.0.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

@ -25,3 +25,19 @@ VDR Plugin 'svdrpdemo' Revision History
2013-03-31: Version 2.0.0
- Official release.
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
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 2.15 2013/01/12 13:45:01 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 --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
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)
#
@ -61,7 +62,8 @@ all: $(SOFILE)
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
@echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
@ -75,7 +77,8 @@ $(DEPFILE): Makefile
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
@echo LD $@
$(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 2.3 2013/03/31 09:30:18 kls Exp $
* $Id: svdrpdemo.c 4.1 2018/04/10 13:01:07 kls Exp $
*/
#include <vdr/plugin.h>
static const char *VERSION = "2.0.0";
static const char *VERSION = "2.4.0";
static const char *DESCRIPTION = "How to add SVDRP support to a plugin";
class cPluginSvdrpdemo : public cPlugin {

6
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.
@ -32,6 +32,10 @@ of commercial set-top boxes usually are a lot more fancy than
the ones in this system, but here we have the full source code
and can modify the menus in whatever way desired.
If you actually use VDR, please add yourself to the "VDR User Counter"
at https://www.tvdr.de/counter.htm. You can also like VDR on facebook
at https://www.facebook.com/VideoDiskRecorder.
"VDR Video Disk Recorder" is a registered trademark of Klaus Schmidinger.
"TVDR TV Done Right" is a registered trademark of Klaus Schmidinger.

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