mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Compare commits
429 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
dd71a004e2 | ||
|
45091fbd72 | ||
|
988d5aebfa | ||
|
8c3671fae6 | ||
|
2a12af481a | ||
|
7817e64695 | ||
|
ebbaa39098 | ||
|
d3dcbbd4f2 | ||
|
3045995bbc | ||
|
1b4233d6ad | ||
|
34aa8fe8b4 | ||
|
baa97e9ff1 | ||
|
03afc4a353 | ||
|
ef4ebeb7ee | ||
|
80d8851e62 | ||
|
ead135f716 | ||
|
49dc61a92c | ||
|
af0309cc40 | ||
|
4ed7421b1c | ||
|
3058354dba | ||
|
20a8c5d240 | ||
|
0749a34342 | ||
|
e595eed57d | ||
|
a7576f0b6c | ||
|
657e5dda5d | ||
|
8fb6a2b24b | ||
|
53cac302d8 | ||
|
2c6c014dd8 | ||
|
a7071f580e | ||
|
de5327a048 | ||
|
7ab94c7bcb | ||
|
0f80fc5e86 | ||
|
d169f30e5c | ||
|
7a1842cba6 | ||
|
e4e9d7a55f | ||
|
ccbef6ce6c | ||
|
7461a1ba3a | ||
|
bb55e3036e | ||
|
bbf2cca198 | ||
|
8ce034d124 | ||
|
4030698007 | ||
|
66fea5c9f1 | ||
|
285574eeaa | ||
|
55cfb057e0 | ||
|
b4c538cff7 | ||
|
5a626fef9f | ||
|
2bcd8ba8f3 | ||
|
2dacc776bd | ||
|
a91d687a1a | ||
|
0d3882d43e | ||
|
72ad601328 | ||
|
2c6fd804f6 | ||
|
c590444b7d | ||
|
4805af7915 | ||
|
171b20a80d | ||
|
d00ae923ab | ||
|
d8ab5dc5c6 | ||
|
292af5d4f4 | ||
|
3d6b31b115 | ||
|
9e523073aa | ||
|
32d8e473fb | ||
|
5cd25df60c | ||
|
52c4816c9c | ||
|
6f6b05ffcb | ||
|
6dd5854b7a | ||
|
83425df0b6 | ||
|
82b09eaa8e | ||
|
ec5b1aadab | ||
|
f786510ba2 | ||
|
f006884e57 | ||
|
c0a005b3cd | ||
|
0c91893643 | ||
|
796da9e0f6 | ||
|
5d539be071 | ||
|
1df138d876 | ||
|
71b0140003 | ||
|
a33adf365d | ||
|
8d82b05071 | ||
|
930e3b4200 | ||
|
2543f2c486 | ||
|
d919817c35 | ||
|
6bbb596968 | ||
|
8aec1974bb | ||
|
b3ad9ec699 | ||
|
87410442b6 | ||
|
305735a886 | ||
|
41b7e1546a | ||
|
f3972e4795 | ||
|
e7ea087a6e | ||
|
749ba57dcc | ||
|
0360b0d0e7 | ||
|
2b495e0f87 | ||
|
32b11e1a53 | ||
|
db81c07b27 | ||
|
1c2401eb6c | ||
|
5828d347f7 | ||
|
9c64622718 | ||
|
f9260d0141 | ||
|
746cdaff01 | ||
|
179d5b87fc | ||
|
51dca45a0c | ||
|
62ad9b41dd | ||
|
8b87a6968a | ||
|
faf562fd4e | ||
|
6a09a2fbd6 | ||
|
bc32ffe2f9 | ||
|
ff16bbd777 | ||
|
f7f8a6b131 | ||
|
a3310e2954 | ||
|
0b08666310 | ||
|
42db3fbee0 | ||
|
bfa25d6276 | ||
|
824c495d33 | ||
|
561be36958 | ||
|
8bd0437497 | ||
|
18c9cef1ea | ||
|
2c66d57d4b | ||
|
29200d040e | ||
|
385738cadd | ||
|
a2591d6e98 | ||
|
fe97a38e77 | ||
|
552f5fc4e7 | ||
|
21d3d489fd | ||
|
78b7e4e252 | ||
|
5d984b606e | ||
|
88b1e30494 | ||
|
939071bf25 | ||
|
655682b5d2 | ||
|
b1418b6bcd | ||
|
35c8b3d22c | ||
|
e5ae02e3fa | ||
|
f0da21ea13 | ||
|
eb35faaf7d | ||
|
05f03d6e38 | ||
|
0d4284df29 | ||
|
cade92cda1 | ||
|
f0bbf64da0 | ||
|
6458f8b581 | ||
|
1770a18598 | ||
|
5f136032a2 | ||
|
63efcf3927 | ||
|
468dc1115e | ||
|
d53e0fd5c3 | ||
|
14b907b01c | ||
|
e0d87da768 | ||
|
42b584e38d | ||
|
a0f79bdd5f | ||
|
4372d55dd1 | ||
|
13672280b6 | ||
|
5b134cb23e | ||
|
87cf0b7a3d | ||
|
8b14723e9e | ||
|
7fe59548cd | ||
|
15f13ac936 | ||
|
5b176f97a4 | ||
|
0bb6f87776 | ||
|
c06d2389e9 | ||
|
548a33c728 | ||
|
4336b55f4e | ||
|
c12c7378e9 | ||
|
a299d8d348 | ||
|
c7bf474a42 | ||
|
8d65cc6dc0 | ||
|
f2b9f0e8dd | ||
|
30f05ba714 | ||
|
76445411a5 | ||
|
4425918d31 | ||
|
6888ea68b6 | ||
|
abb82a2396 | ||
|
6192ca81d9 | ||
|
d06c5efa54 | ||
|
f859b8d2ae | ||
|
035d5fd5b9 | ||
|
93d578d9b8 | ||
|
d756628297 | ||
|
a4cde807bc | ||
|
83c9677899 | ||
|
b14ed38a48 | ||
|
2bf0967a47 | ||
|
7ed306d127 | ||
|
5a029eb29f | ||
|
230adc8235 | ||
|
982a9a5157 | ||
|
c8e4921a0a | ||
|
786245efe5 | ||
|
74460f22bf | ||
|
a843d03af1 | ||
|
d3f3e856e4 | ||
|
be3c6048ed | ||
|
2a0222226a | ||
|
50c3951017 | ||
|
ea1ad945b4 | ||
|
8cde8464eb | ||
|
14b108f104 | ||
|
330dbce1e7 | ||
|
adeb6314fb | ||
|
78a09b5926 | ||
|
d05765c670 | ||
|
a5a4b72d1c | ||
|
955b1c914f | ||
|
5b28aa7e02 | ||
|
f34a6d66a0 | ||
|
104bddc560 | ||
|
e7107b789e | ||
|
f2e71eb668 | ||
|
f275346ecc | ||
|
33b47142e4 | ||
|
5f3d42bcd8 | ||
|
3f2dd916c1 | ||
|
0d50ec57f5 | ||
|
7301f2de08 | ||
|
8c7d387e86 | ||
|
6c5a448dec | ||
|
a84f9a8e19 | ||
|
545613e0e7 | ||
|
ac4da6e380 | ||
|
4d5cbaf57d | ||
|
a4a2466bf4 | ||
|
a0cdfc432a | ||
|
60c858689b | ||
|
9686a9b474 | ||
|
0f6265a97f | ||
|
7b1c097958 | ||
|
58e21d8e37 | ||
|
e1f04cd6fa | ||
|
7775698bac | ||
|
8f52603665 | ||
|
c40fb4b4aa | ||
|
161fa8ead4 | ||
|
115eb9fdb4 | ||
|
b7112ece6c | ||
|
f7c8f582ea | ||
|
ada85b693e | ||
|
a1a8c5d94c | ||
|
505bcee926 | ||
|
c02c081d91 | ||
|
c8566fab77 | ||
|
54c4e69299 | ||
|
31b87544f1 | ||
|
cd3cda2654 | ||
|
c98fdd9120 | ||
|
10ffd08c82 | ||
|
4a199fe4ac | ||
|
98fa6206ac | ||
|
ce23ba64bd | ||
|
02c668a6a9 | ||
|
9de337d2ee | ||
|
fa8c7c35b5 | ||
|
3d13eb002f | ||
|
b2fb654bb3 | ||
|
cd834c79ba | ||
|
65aafacd8e | ||
|
ebd92dcd31 | ||
|
0003d6391c | ||
|
4e52547a59 | ||
|
d3755c92d7 | ||
|
d536cf0947 | ||
|
19a0e3cda7 | ||
|
7fb13b3cbf | ||
|
23d986657a | ||
|
8f1419fff5 | ||
|
b80c22e9c4 | ||
|
f672fe90c1 | ||
|
3d55d3045e | ||
|
7ffc1a5efe | ||
|
36a833053b | ||
|
ad35c9c2d3 | ||
|
1b1465a677 | ||
|
2f6ce68ca7 | ||
|
dee1225fa4 | ||
|
d78d6fba7e | ||
|
80bdc90650 | ||
|
c402d57809 | ||
|
f1836af0b0 | ||
|
eebcc57079 | ||
|
cbc04d73b8 | ||
|
be9eff0fad | ||
|
3f3e47d280 | ||
|
40ca081ff4 | ||
|
c46fd1ff5b | ||
|
55b237dbe8 | ||
|
2b3556b460 | ||
|
d2e0087c4e | ||
|
9a650a4772 | ||
|
f4739f89bf | ||
|
7ade54dfd7 | ||
|
45fde332a0 | ||
|
82cc5c76a4 | ||
|
67a4ba4228 | ||
|
79a3607d0c | ||
|
dffeabbacb | ||
|
9fa7de2036 | ||
|
bacc873896 | ||
|
375d25627d | ||
|
56e2ed2628 | ||
|
ad55da4ef9 | ||
|
272231467a | ||
|
6cb818c7ad | ||
|
c23547c4ca | ||
|
0468b38ff3 | ||
|
ebbc562aab | ||
|
f387bb5e77 | ||
|
c5461ffd9f | ||
|
8c1c92bff6 | ||
|
36be6abfbd | ||
|
f24e93ade1 | ||
|
1a6a518f49 | ||
|
fc7ca12edd | ||
|
bbd36d0610 | ||
|
eebe7c798a | ||
|
76a7bed575 | ||
|
46b480c798 | ||
|
b4a6c36215 | ||
|
121f348379 | ||
|
16fb7967ff | ||
|
88a2ef45ee | ||
|
dd6077eb90 | ||
|
568ca0e773 | ||
|
fa5c9f764a | ||
|
5193fd9d99 | ||
|
a526eee165 | ||
|
848c65fe4f | ||
|
488a13543e | ||
|
3cc0abf6ea | ||
|
35b95c2b00 | ||
|
7630f579e1 | ||
|
8bd2ed1494 | ||
|
f5dba03447 | ||
|
73bcd869dc | ||
|
1dabb9b8c5 | ||
|
5d39daa13c | ||
|
54cf10588d | ||
|
52826ec4c1 | ||
|
ba9ccc12a5 | ||
|
67ea2163f4 | ||
|
1e1cd4554e | ||
|
319df53e87 | ||
|
8e1be83b56 | ||
|
5cfa736ad0 | ||
|
8a282ef267 | ||
|
709055980e | ||
|
576e21f2fd | ||
|
e6bf3b6975 | ||
|
196785ff05 | ||
|
dd9dd76722 | ||
|
aae02a43da | ||
|
ab308bea31 | ||
|
5f3ad4fc9b | ||
|
f031563400 | ||
|
d354d01af7 | ||
|
35b936200f | ||
|
e6c450b346 | ||
|
c813de133b | ||
|
abe61dc903 | ||
|
f624a082ad | ||
|
38703cbf5d | ||
|
930c2cd2eb | ||
|
225c495632 | ||
|
5705ffbd2b | ||
|
6e0f5287ea | ||
|
f63a066b98 | ||
|
6ff6db23bf | ||
|
2af25bc58e | ||
|
2b39c192a6 | ||
|
0873d14614 | ||
|
712523f004 | ||
|
c2634a7ccf | ||
|
e8ae4afd09 | ||
|
96aa4cacae | ||
|
4242fa7f22 | ||
|
abdab18807 | ||
|
12d8ef5a21 | ||
|
6f95a495ab | ||
|
99dad019cc | ||
|
ff2af3dffd | ||
|
294452cd43 | ||
|
820c22775c | ||
|
16f18cbce8 | ||
|
0f10c8824c | ||
|
c5277df361 | ||
|
b83d29764e | ||
|
dd13070260 | ||
|
bd3b6f17e4 | ||
|
1fa861ecb9 | ||
|
2cf207b53e | ||
|
4bd6d6559f | ||
|
4b3fec660a | ||
|
dc160ab570 | ||
|
4c7efcbd02 | ||
|
27c0fffe7c | ||
|
df8f5f4800 | ||
|
71461c6082 | ||
|
61ea56a1bd | ||
|
235c652648 | ||
|
61c00ccae5 | ||
|
084f51c7db | ||
|
18bb52554f | ||
|
b9162ad7bd | ||
|
5300077109 | ||
|
cbc77f1f25 | ||
|
bcee8ad43d | ||
|
336822f672 | ||
|
5543f13051 | ||
|
30eb01ef37 | ||
|
d380b57d28 | ||
|
820a0ddb8a | ||
|
d84ec07ff6 | ||
|
c48d5242ce | ||
|
c057e057f9 | ||
|
fb03134411 | ||
|
732ba55126 | ||
|
49d54df7d0 | ||
|
c89c83f5c1 | ||
|
3e83390fb9 | ||
|
0f9b4b6fd5 | ||
|
bac9c65515 | ||
|
5b9b09a90e | ||
|
43544435fa | ||
|
ac30924cdf | ||
|
675e10d6fb | ||
|
77f438ed85 | ||
|
9dea1502eb | ||
|
e1a71ce7cc | ||
|
53aea17949 | ||
|
1f16ada70c | ||
|
b539134e54 | ||
|
6180dcce45 | ||
|
040f842e6c | ||
|
5cb66f8090 |
288
CONTRIBUTORS
288
CONTRIBUTORS
@ -275,7 +275,7 @@ Aaron Holtzman
|
||||
Wolfgang Henselmann-Weiss <Wolfgang_Henselmann@betaresearch.de>
|
||||
for fixing calculating the timeout value in cFile::FileReady()
|
||||
|
||||
Uwe Scheffler <linux_dvb@uni.de>
|
||||
Uwe Scheffler <scheffler.u@web.de>
|
||||
for his help in keeping 'channels.conf.cable' and 'channels.conf.terr' up to date
|
||||
for helping to test new DVB-T handling
|
||||
for reporting a bug in switching the video format in the Setup/DVB menu
|
||||
@ -283,6 +283,9 @@ Uwe Scheffler <linux_dvb@uni.de>
|
||||
for reporting a problem in handling the PrimaryLimit when requesting a device for
|
||||
live viewing
|
||||
for reporting a black screen while a "Recording started" message is displayed
|
||||
for reporting a problem with the lock on the Channels list in cDisplayChannel still
|
||||
being held when Flush() was called
|
||||
for reporting a problem with failed tuning in SCR systems
|
||||
|
||||
Matjaz Thaler <matjaz.thaler@guest.arnes.si>
|
||||
for improving AC3 decoding when replaying DVDs
|
||||
@ -716,6 +719,8 @@ Oliver Endriss <o.endriss@gmx.de>
|
||||
channels
|
||||
for fixing a possible stack overflow in cListBase::Sort()
|
||||
for reporting a crash when deleting a recording
|
||||
for reporting a problem with sluggish setting of editing marks and a jumping progress
|
||||
display with very short recordings
|
||||
|
||||
Reinhard Walter Buchner <rw.buchner@freenet.de>
|
||||
for adding some satellites to 'sources.conf'
|
||||
@ -1201,6 +1206,7 @@ Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>
|
||||
for suggesting to change the naming of "binary skip mode" to "adaptive skip mode"
|
||||
for adding a Status parameter to the interface of cDevice::SignalStats() and
|
||||
cDvbDevice::SignalStats()
|
||||
for reporting a possible crash when scaling bitmaps with very small factors
|
||||
|
||||
Ralf Klueber <ralf.klueber@vodafone.com>
|
||||
for reporting a bug in cutting a recording if there is only a single editing mark
|
||||
@ -1220,6 +1226,9 @@ Peter Bieringer <pb@bieringer.de>
|
||||
for suggesting to ignore lines tagged with '#' in the 'info.vdr' file of a recording
|
||||
for reporting a problem with the backslash ('\') in parameters when executing
|
||||
external commands
|
||||
for making the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public
|
||||
for adding some missing user command calls for copying, renaming and moving recordings
|
||||
for fixing scaling subtitles with anti-aliasing
|
||||
|
||||
Alexander Damhuis <ad@phonedation.de>
|
||||
for reporting problems when deleting a timer that is currently recording
|
||||
@ -2178,8 +2187,9 @@ Hardy Flor <HFlor@web.de>
|
||||
|
||||
Harald Milz <hm@seneca.muc.de>
|
||||
for his CUTR patch, which was used as a base to implement the SVDRP command EDIT
|
||||
for reporting a bug in parsing the '-l' command line option
|
||||
|
||||
Marko Mäkelä <marko.makela@hut.fi>
|
||||
Marko Mäkelä <marko.makela@iki.fi>
|
||||
for making repeat keys be ignored when waiting for a keypress to cancel an operation
|
||||
for reporting that a menu was automatically closed when a replay ends
|
||||
for suggesting to ignore k_Repeat when deciding whether the same key has been
|
||||
@ -2190,6 +2200,18 @@ Marko M
|
||||
for suggesting to simplify some conditional expressions in skinlcars.c and skinsttng.c
|
||||
for reporting some uninitialized item area coordinates in cSkinLCARSDisplayMenu
|
||||
for reporting a problem with the video directory not being set correctly with --edit
|
||||
for reporting a compiler warning about the use of strncpy() in strreplace()
|
||||
for adding support for kernel based LIRC driver
|
||||
for reporting a possible heap-use-after-free in cDvbTuner::Action()
|
||||
for reporting a flaw in initializing cDvbPlayerControl and cTransferControl
|
||||
for reporting a possible call to poll() in cSectionHandler::Action() without any
|
||||
filters
|
||||
for avoiding the memcpy() call in cGlyph::cGlyph() if the bitmap is empty
|
||||
for avoiding unnecessary processing in cDvbSubtitleConverter::FinishPage() if there
|
||||
are no areas
|
||||
for avoiding a zero sized array in cDevice::GetDevice()
|
||||
for reporting a crash when deleting a recording that is currently being edited, and
|
||||
then immediately deleting the edited version, too
|
||||
|
||||
Patrick Rother <krd-vdr@gulu.net>
|
||||
for reporting a bug in defining timers that only differ in the day of week
|
||||
@ -2333,6 +2355,7 @@ Andr
|
||||
for reporting a bug in selecting the last replayed recording in the Recordings menu
|
||||
in case there are folders and plain recordings with names that differ only in
|
||||
non-alphanumeric characters
|
||||
for reporting a problem with permanently looping through PMT PIDs on a SatIP receiver
|
||||
|
||||
Jürgen Schilling <juergen_schilling@web.de>
|
||||
for reporting that color buttons were displayed in the recording info menu if it
|
||||
@ -2434,6 +2457,23 @@ Christoph Haubrich <christoph1.haubrich@arcor.de>
|
||||
"Edit recording" menu
|
||||
for suggesting to add a confirmation before renaming a recording to its folder name
|
||||
for reporting a problem with data loss in case renaming a recording fails
|
||||
for adding support for HEVC-video and AC-4-audio
|
||||
for implementing anti-aliasing for cPixmap::DrawSlope() and cPixmap::DrawEllipse()
|
||||
for reporting an unnecessary double call to Display() in cMenuRecording::RefreshRecording()
|
||||
for reporting too much memory being allocated in the cImage constructors
|
||||
for making the 'Edit path' dialog also show the total size of all recordings in that path
|
||||
for suggesting to make cRecordingInfo::Errors() return -1 for old recordings, and
|
||||
reporting a missing 'const'
|
||||
for reporting that the edited recording is not deleted in case of an error
|
||||
for reporting missing '0x09=H.265 video, 0x19 = AC4 audio' in vdr.5
|
||||
for reporting a problem with the call to EpgHandlers.EndSegmentTransfer()
|
||||
for fixing handling zero bytes in cH264Parser
|
||||
for implementing parsing frame rate and image size for MPEG2, H.264 and H.265
|
||||
for reporting a bug in generating the index file in the cutter
|
||||
for adding the frame width, height, scan type and aspect ratio of a recording to the 'F'
|
||||
tag of the 'info' file
|
||||
for adding a workaround in detecting frame height for channels with wrong crop parameters
|
||||
for reporting duplicate component entries in the info of an ongoing recording
|
||||
|
||||
Pekka Mauno <pekka.mauno@iki.fi>
|
||||
for fixing cSchedule::GetFollowingEvent() in case there is currently no present
|
||||
@ -2486,6 +2526,11 @@ Tobias Grimm <tobias.grimm@e-tobi.net>
|
||||
for adding a manual page for 'svdrpsend'
|
||||
for adding a missing dependency to the Makefile to avoid error messages in the
|
||||
clean-plugins target
|
||||
for adding optional verbose output to the libsi Makefile
|
||||
for making the call to pkg_config configurable via the PKG_CONFIG macro
|
||||
for fixing a typo in svdrp.c
|
||||
for suggesting to add CPPFLAGS to CXXFLAGS to allow extra preprocessor flags to be
|
||||
given when doing make
|
||||
|
||||
Helge Lenz <h.lenz@gmx.de>
|
||||
for reporting a bug in setting the 'Delta' parameter when calling the shutdown
|
||||
@ -2507,6 +2552,50 @@ Nino Gerbino <ngerb@interfree.it>
|
||||
Markus Ehrnsperger <markus.ehrnsperger@googlemail.com>
|
||||
for reporting a problem with missing 'INCLUDES += -I$(DVBDIR)/include' in an existing
|
||||
Make.config
|
||||
for reporting a bug in error handling when loading a plugin
|
||||
for reporting a possible crash in cIndexFile::GetClosestIFrame()
|
||||
for reporting a missing 'const' in cTimers::GetTimerForEvent()
|
||||
for suggesting to add a chapter about locking to PLUGINS.html
|
||||
for fixing unnecessary interruption of ongoing recordings if timers avoided the
|
||||
transfer mode receiver device
|
||||
for reporting broken video data streams on systems without output device when switching
|
||||
live channel to a different transponder while recording
|
||||
for fixing a possible crash in cDevice::StopSectionHandler()
|
||||
for making using a dummy OSD if no OSD provider is available not be considered an error
|
||||
any more
|
||||
for removing syslog calls in child process after fork()
|
||||
for adding the move constructor to cString for better performance
|
||||
for fixing handling primary device on headless systems
|
||||
for adding a 15 second grace period before actually stopping a VPS timer
|
||||
for making the primary device no longer start unnecessary threads if it doesn't have
|
||||
a decoder
|
||||
for improving handling present/following data for VPS timers
|
||||
for making logging event status changes also show the previous status
|
||||
for making a device always being kept occupied if a timer is in VPS margin or needs the
|
||||
transponder
|
||||
for suggesting to enable unused devices to be put into a power save mode
|
||||
for a patch that was used to implement power save mode for cDvbDevice
|
||||
for suggesting to add 'lnbPowerTurnedOn = false' to cDvbTuner::ProvidesFrontend()
|
||||
for reporting a crash in strreplace() for multiple replacements with strings of
|
||||
different lengths
|
||||
for suggesting to add the lines from 'Fixed a timeout in cDvbDevice while tuning after
|
||||
the frontend has been reopened' to cDvbTuner::ProvidesFrontend()
|
||||
for improving the error message when closing a frontend
|
||||
for reporting a problem in cSchedule::Sort(), in case hasRunning was true, but there
|
||||
was no event with RunningStatus() >= SI::RunningStatusPausing
|
||||
for reporting problem with duplicate events if they are moved to a lower table ID and
|
||||
at the same time get a new event ID
|
||||
for reporting a bug in handling negative values in cSource::Position() on
|
||||
systems where 'int' is 64 bit
|
||||
for suggesting a fix for expiring of one-time VPS timers in case there is more than
|
||||
one event with the same VPS time
|
||||
for fixing handling margins for timers that are not VPS controlled and not spawned
|
||||
for implementing cStatus::OsdItem2() with the information whether the item is selectable
|
||||
for reporting an improper call of cStatus::OsdCurrentItem() before cStatus::OsdItem2()
|
||||
for fixing unnecessary calls to DisplayCurrent() for editable menu items
|
||||
for implementing cStatus::OsdCurrentItem2() with the index of the current item
|
||||
for adding missing calls to cStatus::MsgOsdStatusMessage() and implementing
|
||||
cStatus::OsdStatusMessage2() with the type of the message
|
||||
|
||||
Werner Färber <w.faerber@gmx.de>
|
||||
for reporting a bug in handling the cPluginManager::Active() result when pressing
|
||||
@ -2630,6 +2719,9 @@ J
|
||||
for reporting a possible deadlock when quickly zapping through encrypted channels
|
||||
for a patch that was used to implement cStatus::MarksModified()
|
||||
for suggesting to no longer log unaligned marks in cMarks::Align()
|
||||
for reporting some warnings from g++ 7.2.0 regarding fixed buffer sizes in
|
||||
cMenuEditTimeItem::Set() and cCountdown::Update()
|
||||
for fixing symmetry of Begin/EndSegmentTransfer() calls in cEIT::cEIT()
|
||||
|
||||
Peter Pinnau <vdr@unterbrecher.de>
|
||||
for reporting that 'uint32_t' requires including stdint.h in font.h on some systems
|
||||
@ -2736,10 +2828,38 @@ Benjamin Hess <benjamin.h@gmx.ch>
|
||||
for enhancing the SVDRP command CLRE to allow clearing the EPG data of a particular
|
||||
channel
|
||||
|
||||
Winfried Koehler <w_koehl@gmx.de>
|
||||
Winfried Köhler <nvdec@quantentunnel.de>
|
||||
for fixing finding new transponders
|
||||
for fixing wrong value for TableIdBAT in libsi/si.h
|
||||
for reporting a compiler warning in calculations involving FramesPerSecond()
|
||||
for making several code modifications to avoid compiler warnings
|
||||
for improving the description of the transponder parameters in vdr.5
|
||||
for reporting a necessary fix in the description of cReceiver in PLUGINS.html,
|
||||
regarding detaching a receiver from its device before deleting it
|
||||
for fixing some copy&paste errors in PLUGINS.html
|
||||
for fixing the size of cChannel::dtypes[]
|
||||
for adding a device hook for detecting whether a device provides EIT data
|
||||
for improving deleting plugins in case the plugin uses its own memory management
|
||||
for reporting a bug in handling newline characters in ci.c's CopyString()
|
||||
for reporting a bug in checking the return value of the Open() call in
|
||||
cFileName::SetOffset()
|
||||
for adding initialization of cDvbFrontend::frontendInfo
|
||||
for improving handling missing VDRPluginDestroyer()
|
||||
for fixing a compiler warning
|
||||
for fixing handling $(PKG_CONFIG) in newplugin
|
||||
for using __cplusplus instead of DISABLE_TEMPLATES_COLLIDING_WITH_STL, and using
|
||||
std::min(), std::max() and std::swap() is available
|
||||
for adding some missing "AUTO" values to vdr.5
|
||||
for fixing default values for DVB-T
|
||||
for adding missing rounding when dividing frequencies in processing the NIT
|
||||
for suggesting to add note about not messing with event ids in EPG handlers
|
||||
for adding a missing initialization of cChannel::nameSourceMode
|
||||
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
|
||||
for reporting a compiler warning with gcc 14.1.0
|
||||
for suggesting to remove defining DEPRECATED_* macros with value 0, because this
|
||||
is the preprocessor's default
|
||||
for suggesting a fix for handling negative values in cSource::Position() on
|
||||
systems where 'int' is 64 bit
|
||||
|
||||
Hans-Werner Hilse <hilse@web.de>
|
||||
for adding the command line option --userdump to enable core dumps in case VDR
|
||||
@ -2806,13 +2926,6 @@ Michael Nork <mnork0@gmx.net>
|
||||
binary distributions to have full control over whether or not to use the --vfat
|
||||
option at runtime
|
||||
|
||||
Winfried Köhler <w_koehl@gmx.de>
|
||||
for fixing wrong value for TableIdBAT in libsi/si.h
|
||||
for making several code modifications to avoid compiler warnings
|
||||
for improving the description of the transponder parameters in vdr.5
|
||||
for reporting a necessary fix in the description of cReceiver in PLUGINS.html,
|
||||
regarding detaching a receiver from its device before deleting it
|
||||
|
||||
Igor M. Liplianin <liplianin@tut.by>
|
||||
for a patch that was used to convert VDR to the S2API driver API
|
||||
|
||||
@ -2845,6 +2958,11 @@ Johann Friedrichs <johann.friedrichs@web.de>
|
||||
for fixing handling timers during the change from DST to winter time
|
||||
for fixing a possible crash with plugins that retrieve player information after a
|
||||
replay has been stopped, but before the replay control has been destroyed
|
||||
for reporting a problem in processing SVDRP client responses in case the caller doesn't
|
||||
want the actual response strings
|
||||
for reporting a bug in handling the tfRecording flag in the SVDRP commands MODT and UPDT
|
||||
for adding a missing '-D' to the 'plugins' target of the Makefile
|
||||
for adding code for the 'qks' audio track
|
||||
|
||||
Timo Helkio <timolavi@mbnet.fi>
|
||||
for reporting a hangup when replaying a TS recording with subtitles activated
|
||||
@ -2905,6 +3023,14 @@ Manuel Reimer <Manuel.Reimer@gmx.de>
|
||||
order to avoid discontinuities
|
||||
for setting the environment variables HOME, USER, LOGNAME and SHELL accordingly
|
||||
when switching to a less privileged user id
|
||||
for reporting a bug in moving channels between number groups in SVDRP's MOVC command
|
||||
for fixing compatibility with current versions of glibc
|
||||
for suggesting to make the SVDRP command DELC accept a channel id
|
||||
for reporting a crash in the SVDRP command CLRE in case a non-existing channel
|
||||
number is given
|
||||
for reporting that LSTE doesn't work after PUTE in case a channel didn't already
|
||||
have EPG data
|
||||
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
|
||||
|
||||
Rene van den Braken <rene@vandenbraken.name>
|
||||
for reporting a bug in writing the PCR pid into the PMT in
|
||||
@ -2958,6 +3084,7 @@ Lars Hanisch <dvb@flensrocker.de>
|
||||
for fixing a typo in the description of cTimers::GetTimersRead()
|
||||
for suggesting to use dynamic buffering in handling CA descriptors to avoid a
|
||||
possible buffer overflow
|
||||
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
|
||||
|
||||
Alex Lasnier <alex@fepg.org>
|
||||
for adding tuning support for ATSC devices
|
||||
@ -3115,6 +3242,7 @@ Chris Mayo <aklhfex@gmail.com>
|
||||
for updating links in the INSTALL file
|
||||
for reporting double slashes in file names processed with AddDirectory()
|
||||
for using the 'example' macro in vdr.5
|
||||
for fixing the install target in case of multiple jobs
|
||||
|
||||
Dominic Evans <oldmanuk@gmail.com>
|
||||
for making the SVDRP command LSTC accepts channel IDs
|
||||
@ -3246,6 +3374,16 @@ Mike Hay <mike.hay@linenshorts.com>
|
||||
Stefan Hofmann <stefan.hofmann@t-online.de>
|
||||
for suggesting to implement support for remote controls that only have a combined
|
||||
"Play/Pause" key instead of separate keys for "Play" and "Pause"
|
||||
for a fix for compilers that don't like non-constant format strings
|
||||
for suggesting to implement jumping between errors while replaying a recording
|
||||
for adding vdrrootdir and incdir to vdr.pc
|
||||
for fixing some typos in the translation files
|
||||
for adding 1 to Utf8BufSize() for worst case
|
||||
for adding a header to the backtrace
|
||||
for adding parameter checks to strn0cpy()
|
||||
for making the info files of recordings only be re-read if they have been modified
|
||||
for reporting missing setting the file name of the info file after renaming a recording
|
||||
for adding '~' to the list of delimiters in cTextWrapper
|
||||
|
||||
Stefan Blochberger <Stefan.Blochberger@gmx.de>
|
||||
for suggesting to automatically display the progress display whenever replay of a
|
||||
@ -3304,6 +3442,18 @@ Matthias Senzel <matthias.senzel@t-online.de>
|
||||
lock is held while the error message is displayed
|
||||
for reporting that the info of a newly edited recording was not available immediately
|
||||
after starting the editing process
|
||||
for reporting a problem with setting the initial offset of the cursor in a list menu
|
||||
for reporting a high CPU load during replay with active progress display
|
||||
for reporting that the lock on the Channels list in cDisplayChannel was still held
|
||||
when Flush() was called
|
||||
for reporting that if an error occurs while recording, the respective entry in the list
|
||||
of recordings was not updated immediately
|
||||
for fixing restoring the volume at program start
|
||||
for fixing height calculation in progress display
|
||||
for fixing an unnecessary double display of the current menu item in page up/down
|
||||
for fixing an unnecessary double display of menu items in the Recordings menu
|
||||
for reporting a bug in handling cSkinDisplayMenu::GetTextAreaFont()
|
||||
for reporting characters being cut off while editing in the LCARS skin
|
||||
|
||||
Marek Nazarko <mnazarko@gmail.com>
|
||||
for translating OSD texts to the Polish language
|
||||
@ -3399,6 +3549,7 @@ Thomas Reufer <thomas@reufer.ch>
|
||||
for fixing regenerating the index of audio recordings
|
||||
for implementing the SVDRP commands 'LSTD' and 'PRIM'
|
||||
for adding some comments regarding font height
|
||||
for reporting a possible problem with plugins calling IsOpen() in ~cDisplayChannel()
|
||||
|
||||
Eike Sauer <EikeSauer@t-online.de>
|
||||
for reporting a problem with channels that need more than 5 TS packets for detecting
|
||||
@ -3452,6 +3603,10 @@ Stefan Schallenberg <infos@nafets.de>
|
||||
Claus Muus <email@clausmuus.de>
|
||||
for adding the new parameters "Setup/Miscellaneous/Volume steps" and
|
||||
".../Volume linearize"
|
||||
for reporting multiple recording entries in case a recording is started during the
|
||||
initial reading of the video directory
|
||||
for reporting that getting the lock for removing deleted recordings may fail if the
|
||||
disk is full
|
||||
|
||||
Dieter Ferdinand <dieter.ferdinand@gmx.de>
|
||||
for reporting a problem with jumping to an absolute position via the Red key in
|
||||
@ -3490,6 +3645,13 @@ Stefan Herdler <herdler@gmx.de>
|
||||
too early
|
||||
for reporting a bug in using the default sort mode in a video directory without a
|
||||
".sort" file
|
||||
for reporting faulty memory handling in cString::Append()
|
||||
for adding failsafe defaults for 'make LCLBLD=1' to the Makefile
|
||||
for reporting the index file of a recording not being regenerated in case it is
|
||||
present, but empty
|
||||
for reporting a missing check for self-assignment in the move assignment operator
|
||||
for modifying handling channel names with source to make it thread safe
|
||||
for fixing setting T2 system ID from NIT
|
||||
|
||||
Tobias Faust <tobias.faust@gmx.de>
|
||||
for the original "jumpingseconds" patch
|
||||
@ -3528,6 +3690,7 @@ Stefan P
|
||||
|
||||
Robert Hannebauer <vdr@hannebauer.org>
|
||||
for fixing an overflow of PIDs in a receiver
|
||||
for fixing opening the UDP port in peerdemo
|
||||
|
||||
Aitugan Sarbassov <isarbassov@gmail.com>
|
||||
for adding 'S58.5E Kazsat 3' to sources.conf
|
||||
@ -3547,6 +3710,111 @@ Daniel Scheller <d.scheller@gmx.net>
|
||||
|
||||
Onur Sentürk <onur@sentek.org>
|
||||
for making the MTD mapper avoid immediately reusing unique PIDs when switching channels
|
||||
for fixing handling shared CA pids
|
||||
for fixing handling the S2SatelliteDeliverySystemDescriptor for transponders broadcasting
|
||||
in "backwards compatibility mode" according to ETSI EN 300 468
|
||||
for pointing out some potentially mistakable code in cSectionHandler::SetStatus()
|
||||
for adding periodic calls to malloc_trim(0) to reduce memory consumption
|
||||
|
||||
Helmut Binder <cco@aon.at>
|
||||
for improving calculating signal strength and quality
|
||||
for fixing switching through encrypted channels with the Up/Down keys
|
||||
for deactivating MTD support if a non MCD capable CAM is inserted after removing
|
||||
a previously used CAM that is MCD capable
|
||||
for fixing accessing the actual frontend on multi frontend devices
|
||||
for fixing processing the last entry in the scan list of the EIT scanner
|
||||
for fixing processing transponder data in the NIT
|
||||
for fixing triggering the SDT filter when parsing the NIT
|
||||
for reporting a bug in processing SI::T2DeliverySystemDescriptor when typecasting it
|
||||
over an SI::ExtensionDescriptor
|
||||
for fixing mapping SIDs in MTD
|
||||
for fixing updating the checksum in the CA table after mapping EMM PIDs for MTD
|
||||
for fixing a compiler warning in ExchangeChars()
|
||||
for suggesting to add __attribute__((packed)) to tIndexPes and tIndexTs
|
||||
for helping with the implementation of retuning if the received transponder's SDT
|
||||
doesn't contain the expected values for NID and TID
|
||||
for adding the language code for Bulgarian
|
||||
for a patch that was used as a base for fixing handling multi part ExtendedEventDescriptors
|
||||
where only the first part contains information about the character table
|
||||
for suggesting to check and report whether the given value is valid when setting the
|
||||
override character table
|
||||
for adding codes for more languages and special audio tracks
|
||||
for adding cMtdCamSlot::TsPostProcess()
|
||||
for adding cMtdHandler::StopDecrypting()
|
||||
for adding support for detecting new channels broadcast in HEVC
|
||||
for adding support for detecting 'advanced codec digital radio sound service'
|
||||
for adding handling shared PMT pids and multiple PMT sections
|
||||
for changing the country code in the generated ParentalRatingDescriptor from 'DEU' to
|
||||
'902' to make it valid for all countries
|
||||
for adjusting device selection in GetDeviceForTransponder() to that in GetDevice()
|
||||
for adding CRC check of the CAT in cCaPidReceiver::Receive()
|
||||
for reporting that the 'else if' branch in cDevice::GetDeviceForTransponder() hasn't
|
||||
been active since version 1.7.29
|
||||
for fixing handling inactive shared CA pids
|
||||
for implementing handling multi packet CATs with MTD
|
||||
for adding checking the symbol rate to cDvbTuner::IsTunedTo(), which apparently got
|
||||
lost in version 1.7.13
|
||||
for adding a check for an empty command in cDvbTuner::GetSignalStats() to avoid a
|
||||
possible error message
|
||||
for initializing the status variable in cDvbTuner::GetFrontendStatus() and
|
||||
cDvbTuner::GetSignalStats() to avoid problems with drivers that don't do this
|
||||
for fixing "read incomplete section" errors
|
||||
for fixing generating the HashId in cEIT::cEIT()
|
||||
for fixing a bug in handling shared PMTs, where after the first pass not all SIDs of a
|
||||
PMT pid were checked any more
|
||||
for reporting a problem with PMT handling in case locking the Channels list times out
|
||||
for avoiding a lengthy lock on the Channels list when starting a recording
|
||||
for preventing switching devices for pattern timers
|
||||
for pointing out that cChannel::Transponder(void) is called very often
|
||||
for fixing flushing old data from the section handler
|
||||
for removing unused declaration of cDvbTuner::SetFrontendType()
|
||||
for fixing handling incomplete multi-packet CAT
|
||||
for fixing a memory leak in handling the NIT
|
||||
for reporting a possible memory leak in creating fonts
|
||||
for fixing a possible deadlock in cDevice::DetachAllReceivers()
|
||||
|
||||
Ulrich Eckhardt <uli@uli-eckhardt.de>
|
||||
for reporting a problem with shutdown after user inactivity in case a plugin is
|
||||
keeping the OSD open
|
||||
|
||||
Stian B. Barmen <stian@barmen.nu>
|
||||
for reporting missing EPG data on channels from Canal Digital Norway
|
||||
|
||||
Jürgen Schneider <jsffm@web.de>
|
||||
for reporting a possible discrepancy of the primary device number in the LSTD and
|
||||
PRIM commands
|
||||
for adding support for EAC3 audio from other sources
|
||||
for reporting a crash if a pattern timer spawns a timer that uses EPISODE and the
|
||||
event has no short text
|
||||
for reporting a bug in VPS handling when spawning a pattern timer, in case Setup.UseVps
|
||||
is false
|
||||
for reporting an endless spawning of pattern timers in case the spawned timer doesn't
|
||||
use VPS and fully overlaps a second event that is longer than the original one
|
||||
for reporting a missing EPISODE macro expansion in case the event doesn't yet have a
|
||||
short text when generating the pattern timer file name
|
||||
for reporting a problem with spawned timers jumping to the next event in case
|
||||
Setup.EPGLinger is very small
|
||||
|
||||
Stefan Verse <Verse@amotronics.de>
|
||||
for fixing an occasional black screen when switching channels
|
||||
|
||||
Jens Schleusener <Jens.Schleusener@fossies.org>
|
||||
for reporting several typos
|
||||
|
||||
Bernd Kuhls <bernd.kuhls@t-online.de>
|
||||
for fixing possible compilation errors with libjpeg
|
||||
|
||||
Ulf Grüne <ulf.gruene@t-online.de>
|
||||
for reporting the need for more than 15 modulation systems in cDevice::GetDevice()
|
||||
|
||||
Timo Weingärtner <timo@tiwe.de>
|
||||
for reporting an integer overflow in calculating the disk use percentage if there's
|
||||
more than 20TB of recordings
|
||||
|
||||
Jose Angel <joseangelpp@gmail.com>
|
||||
for reporting a bug in default values for DVB-T
|
||||
|
||||
Andreas Baierl <post@andreasbaierl.de>
|
||||
for implementing scaling images
|
||||
for reporting a problem in the progress display when switching from "pause" to
|
||||
"slow back"
|
||||
|
775
HISTORY
775
HISTORY
@ -5957,7 +5957,7 @@ Video Disk Recorder Revision History
|
||||
- Fixed cDevice::PlayTsAudio() and made cDevice::PlayTsVideo() return 0 if
|
||||
PlayVideo() didn't play anything.
|
||||
- Added an 'int' typecast to calculations involving FramesPerSecond() to avoid
|
||||
compiler warnings (reported by Winfried Koehler).
|
||||
compiler warnings (reported by Winfried Köhler).
|
||||
- Fixed detecting frames for pure audio recordings.
|
||||
- Fixed editing PES recordings. The frame type in the index.vdr file generated for
|
||||
the edited PES recording is set to 1 for I-frames and 2 for all others (P- and
|
||||
@ -9316,3 +9316,776 @@ Video Disk Recorder Revision History
|
||||
SatelliteDeliverySystemDescriptor or TerrestrialDeliverySystemDescriptor, respectively.
|
||||
- Modified cMenuTimers::Delete() to avoid a lengthy lock on the Timers list while prompting
|
||||
the user.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Updated the Ukrainian OSD texts (thanks to Yarema Aka Knedlyk).
|
||||
- Fixed processing SVDRP client responses in case the caller doesn't want the actual
|
||||
response strings (reported by Johann Friedrichs).
|
||||
- Fixed (not) saving the 'cam.data' file in case VDR stops early during startup due to
|
||||
some error.
|
||||
- Fixed some warnings from g++ 7.2.0 regarding fixed buffer sizes in cMenuEditTimeItem::Set()
|
||||
and cCountdown::Update() (reported by Jörg Wendel).
|
||||
- Fixed a possible discrepancy of the primary device number in the LSTD and PRIM
|
||||
commands, by setting Setup.PrimaryDVB in cDevice::SetPrimaryDevice() (reported by
|
||||
Jürgen Schneider).
|
||||
- Fixed setting the initial offset of the cursor in a list menu (reported by Matthias
|
||||
Senzel).
|
||||
- The EIT filter no longer parses data from "other TS", to avoid problems with
|
||||
broadcasters who transmit faulty EIT data.
|
||||
- Updated the Macedonian OSD texts (thanks to Dimitar Petrovski).
|
||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
||||
- Fixed sluggish setting of editing marks and a jumping progress display with very
|
||||
short recordings (reported by Oliver Endriss).
|
||||
- Fixed updating the Schedule menu after editing a timer.
|
||||
- Fixed scaling bitmaps with very small factors (reported by Rolf Ahrenberg).
|
||||
- Added a missing initialization of osdState in cDisplayChannel::cDisplayChannel(eKeys
|
||||
FirstKey).
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- Updated the Hungarian OSD texts (thanks to István Füley).
|
||||
- Updated the French OSD texts (thanks to Bernard Jaulin).
|
||||
- Fixed a high CPU load during replay with active progress display (reported by Matthias
|
||||
Senzel).
|
||||
- Official release.
|
||||
|
||||
2019-06-17: Version 2.4.1
|
||||
|
||||
- Fixed handling the tfRecording flag in the SVDRP commands MODT and UPDT (reported
|
||||
by Johann Friedrichs).
|
||||
- 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 (for instance by calling cVideoDiskUsage::HasChanged()).
|
||||
To do this, the call to Skins.Message() in menu.c's HandleRemoteModifications() has
|
||||
been changed to Skins.QueueMessage(), and cSkins::ProcessQueuedMessages() is now called
|
||||
unconditionally in the main loop, and checks whether the current cSkinDisplay object
|
||||
(if any) implements SetMessage().
|
||||
- Fixed locking the Channels list in cDisplayChannel, where the lock was still held
|
||||
when Flush() was called (reported by Matthias Senzel and Uwe Scheffler).
|
||||
- Fixed shutdown after user inactivity in case a plugin is keeping the OSD open
|
||||
(reported by Ulrich Eckhardt).
|
||||
- Fixed switching through encrypted channels with the Up/Down keys (thanks to Helmut
|
||||
Binder).
|
||||
- Now deactivating MTD support if a non MCD capable CAM is inserted after removing
|
||||
a previously used CAM that is MCD capable (thanks to Helmut Binder).
|
||||
- Added support for DVB devices with more than one frontend that all use the same
|
||||
dvr and demux. Note that in order for this to work, you must not set symbolic
|
||||
links like "demux1 -> demux0" and "dvr1 -> dvr0", as is mentioned in some user
|
||||
manuals of multi frontend DVB cards.
|
||||
- Reverted the change "The EIT filter no longer parses data from "other TS"...". It led to
|
||||
missing EPG data on channels from Canal Digital Norway (reported by Stian B. Barmen).
|
||||
- Fixed accessing the actual frontend on multi frontend devices (thanks to Helmut Binder).
|
||||
- Fixed opening the UDP port in peerdemo (thanks to Robert Hannebauer).
|
||||
- Fixed handling PATs that contain no PMTs.
|
||||
- Fixed processing the last entry in the scan list of the EIT scanner (thanks to
|
||||
Helmut Binder).
|
||||
- Fixed processing transponder data in the NIT (thanks to Helmut Binder).
|
||||
- Fixed triggering the SDT filter when parsing the NIT (thanks to Helmut Binder).
|
||||
- Added support for EAC3 audio from other sources (thanks to Jürgen Schneider).
|
||||
- No longer logging tuning timeouts for transponders that are announced in the NIT but
|
||||
are not currently broadcasting.
|
||||
- Fixed processing SI::T2DeliverySystemDescriptor when typecasting it over an
|
||||
SI::ExtensionDescriptor (reported by Helmut Binder).
|
||||
- Fixed sorting recordings alphabetically.
|
||||
- Fixed dropping capabilities in case cap_sys_time is not available.
|
||||
- Fixed updating the cursor position when switching channels with the Channel+/- keys
|
||||
while the Channels menu is open.
|
||||
- Fixed handling shared CA pids (thanks to Onur Sentürk).
|
||||
- Now touching the .update file in the video directory after removing deleted
|
||||
recordings, so that other VDRs that use the same video directory will update their
|
||||
list of (deleted) recordings and thus won't display too much empty disk space.
|
||||
- Fixed the install target in case of multiple jobs (thanks to Chris Mayo).
|
||||
- Fixed mapping SIDs in MTD (thanks to Helmut Binder).
|
||||
- Fixed updating the checksum in the CA table after mapping EMM PIDs for MTD (thanks to
|
||||
Helmut Binder).
|
||||
- Fixed a compiler warning in ExchangeChars() (thanks to Helmut Binder).
|
||||
- Fixed a compiler warning and a possible buffer overflow in cCiMMI::SendAnswer().
|
||||
- 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.
|
||||
- Fixed handling remote timers in case the response to LSTT is '550 No timers defined'.
|
||||
- Fixed a compiler warning in cIndexFile::ConvertToPes() and added __attribute__((packed))
|
||||
to tIndexPes and tIndexTs (suggested by Helmut Binder).
|
||||
- Fixed handling repeat function for keyboards.
|
||||
- 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.
|
||||
- Fixed asserting free disk space in case there is no local timer currently recording.
|
||||
- The default maximum size of a cPixmap has been raised to the maximum possible value.
|
||||
- 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.
|
||||
- Fixed inconsistent behavior in case only certain devices are used (selected by the '-D'
|
||||
option).
|
||||
- Fixed a wrong variable name in cFileName::cFileName().
|
||||
- If cSkins::Message() is called from a background thread and Type is not mtStatus,
|
||||
the call is now automatically forwarded to QueueMessage().
|
||||
- Fixed handling the S2SatelliteDeliverySystemDescriptor for transponders broadcasting
|
||||
in "backwards compatibility mode" according to ETSI EN 300 468 (thanks to Onur Sentürk).
|
||||
|
||||
2020-05-18: Version 2.4.2
|
||||
|
||||
- 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
|
||||
(reported by Manuel Reimer).
|
||||
- Now retuning if the received transponder's SDT doesn't contain the expected values
|
||||
for NID and TID (thanks to Uwe Scheffler for reporting a problem with failed tuning
|
||||
in SCR systems, and Helmut Binder for helping with the implementation).
|
||||
- Fixed compatibility with current versions of glibc (thanks to Manuel Reimer).
|
||||
- The SVDRP command DELC now also accepts a channel id (suggested by Manuel Reimer).
|
||||
- Fixed dropping capabilities in case cap_sys_time is not available.
|
||||
- Added the language code for Bulgarian (thanks to Helmut Binder).
|
||||
- Fixed handling multi part ExtendedEventDescriptors where only the first part
|
||||
contains information about the character table (based on a patch from Helmut Binder).
|
||||
- When setting the system character table, it is no longer checked against the known
|
||||
entries that are hard coded in libsi/si.c, but rather given to iconv_open() and the
|
||||
result of that call is used to check whether the given name is valid.
|
||||
- Checking whether the system character table is "single byte" is now done by checking
|
||||
the result of a sample call to iconv().
|
||||
- Setting the override character table now checks and reports whether the given value
|
||||
is valid (suggested by Helmut Binder).
|
||||
- The isSingleByte parameter in the call to getCharacterTable() is deprecated and only
|
||||
present for backwards compatibility.
|
||||
- Fixed a possible crash in case replay is started and stopped in rapid sequence, by
|
||||
adding missing locking to cControl::Control(). The caller of this function must now
|
||||
provide a cMutexLock which stays alive as long as the result of this call is used.
|
||||
The old version of this function is still there for backwards compatibility with
|
||||
plugins, because this problem appears to occur only under very rare circumstances.
|
||||
Authors of plugins that use this function should switch to the new version, because
|
||||
the old one is deprecated and will be removed in a future version.
|
||||
The version numbers (both VDRVERSNUM and APIVERSNUM) have been bumped to 2.4.2, so
|
||||
that plugins can detect the presence of the new cControl::Control().
|
||||
|
||||
2020-06-27: Version 2.4.3
|
||||
|
||||
- Added a missing '-D' to the 'plugins' target of the Makefile (thanks to Johann
|
||||
Friedrichs).
|
||||
- Fixed the size of cChannel::dtypes[] (thanks to Winfried Köhler).
|
||||
The version numbers (both VDRVERSNUM and APIVERSNUM) have been bumped to 2.4.3 to
|
||||
indicate this change.
|
||||
- Added a device hook for detecting whether a device provides EIT data (thanks to
|
||||
Winfried Köhler).
|
||||
- Fixed memory handling in cString::Append() (reported by Stefan Herdler).
|
||||
- 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
|
||||
(thanks to Stefan Verse).
|
||||
- Added failsafe defaults for 'make LCLBLD=1' to the Makefile (thanks to Stefan
|
||||
Herdler).
|
||||
- Added codes for more languages and special audio tracks (thanks to Helmut Binder).
|
||||
- Added cMtdCamSlot::TsPostProcess() (thanks to Helmut Binder).
|
||||
- Added cMtdHandler::StopDecrypting() (thanks to Helmut Binder).
|
||||
- Added support for detecting new channels broadcast in HEVC (thanks to Helmut Binder).
|
||||
- Added support for detecting 'advanced codec digital radio sound service' (thanks to
|
||||
Helmut Binder).
|
||||
- Added handling shared PMT pids and multiple PMT sections (thanks to Helmut Binder).
|
||||
- Changed the country code in the generated ParentalRatingDescriptor from 'DEU' to
|
||||
'902' to make it valid for all countries (thanks to Helmut Binder).
|
||||
- Added optional verbose output to the libsi Makefile (thanks to Tobias Grimm).
|
||||
- Made the call to pkg_config configurable via the PKG_CONFIG macro, which is necessary
|
||||
for cross-building VDR (thanks to Tobias Grimm). Plugin authors may want to modify
|
||||
their Makefiles accordingly by adding the line 'PKG_CONFIG ?= pkg-config' and
|
||||
replacing every occurrence of 'pkg-config' with '$(PKG_CONFIG)', as can be seen in
|
||||
the Makefiles of the plugins that come with the VDR source.
|
||||
- Fixed a typo in svdrp.c (thanks to Tobias Grimm).
|
||||
- Added support for HEVC-video and AC-4-audio (thanks to Christoph Haubrich).
|
||||
- Added a comment about the semantics of cTimeMs::Set().
|
||||
- Adjusted device selection in GetDeviceForTransponder() to that in GetDevice() (thanks
|
||||
to Helmut Binder).
|
||||
- Now adding CPPFLAGS to CXXFLAGS to allow extra preprocessor flags to be given when
|
||||
doing make (suggested by Tobisa Grimm).
|
||||
- Added CRC check of the CAT in cCaPidReceiver::Receive() (thanks to Helmut Binder).
|
||||
- Fixed the 'else if' branch in cDevice::GetDeviceForTransponder(), which hasn't
|
||||
been active since version 1.7.29 (reported by Helmut Binder). The original purpose of
|
||||
this branch was to use a device that is currently not recording for switching to the
|
||||
transponder of an upcoming VPS timer. However, this caused problems with more than
|
||||
two bonded devices, which was "fixed" in version 1.7.29. Apparently this fix merely
|
||||
rendered the whole code branch inactive. Now this branch is only executed for devices
|
||||
that are not bonded.
|
||||
|
||||
2020-08-02: Version 2.4.4
|
||||
|
||||
- Improved deleting plugins in case the plugin uses its own memory management (thanks
|
||||
to Winfried Köhler). Plugins that have been compiled with previous versions of VDR
|
||||
do not need to be recompiled, they will silently be handled as before.
|
||||
- Now setting currentDisplayChannel = NULL before calling cStatus::MsgOsdClear() in
|
||||
~cDisplayChannel(), to avoid possible problems in case a plugin calls IsOpen()
|
||||
(reported by Thomas Reufer).
|
||||
- Fixed handling inactive shared CA pids (thanks to Helmut Binder).
|
||||
- Implemented handling multi packet CATs with MTD (thanks to Helmut Binder).
|
||||
- Fixed a possible 'invalid lock sequence' when switching to an unavailable channel
|
||||
with the main menu open.
|
||||
- Official release.
|
||||
|
||||
2020-10-16: Version 2.4.5
|
||||
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- Fixed handling newline characters in ci.c's CopyString() (reported by Winfried Köhler).
|
||||
- Fixed checking the return value of the Open() call in cFileName::SetOffset() (reported
|
||||
by Winfried Köhler).
|
||||
- Fixed a possible invalid lock sequence in cMenuTimers::OnOff().
|
||||
- Fixed several typos (reported by Jens Schleusener).
|
||||
- Implemented anti-aliasing for cPixmap::DrawSlope() and cPixmap::DrawEllipse() (thanks
|
||||
to Christoph Haubrich).
|
||||
The version numbers (both VDRVERSNUM and APIVERSNUM) have been bumped to 2.4.5 to
|
||||
indicate this change.
|
||||
- Fixed alignment of semi-circles in case of odd sizes.
|
||||
- Increased the size of the TS buffer to 16MB, to have more reserve when recording
|
||||
several HD programmes.
|
||||
- Added checking the symbol rate to cDvbTuner::IsTunedTo(), which apparently got lost
|
||||
in version 1.7.13 (thanks to Helmut Binder).
|
||||
- Now checking for an empty command in cDvbTuner::GetSignalStats() to avoid a possible
|
||||
error message (thanks to Helmut Binder).
|
||||
- Now initializing the status variable in cDvbTuner::GetFrontendStatus() and
|
||||
cDvbTuner::GetSignalStats() to avoid problems with drivers that don't do this
|
||||
(thanks to Helmut Binder).
|
||||
|
||||
2020-12-22: Version 2.4.6
|
||||
|
||||
- Fixed multiple recording entries in case a recording is started during the initial
|
||||
reading of the video directory (reported by Claus Muus).
|
||||
- Fixed an unnecessary double call to Display() in cMenuRecording::RefreshRecording()
|
||||
(reported by Christoph Haubrich).
|
||||
- Fixed a crash in case an error occurs when setting a remote timer.
|
||||
- Fixed allocating memory for cImage (reported by Christoph Haubrich).
|
||||
- Fixed parsing the '-l' command line option (reported by Harald Milz).
|
||||
- Fixed possible compilation errors with libjpeg (thanks to Bernd Kuhls).
|
||||
- Fixed "read incomplete section" errors (thanks to Helmut Binder).
|
||||
- Fixed generating the HashId in cEIT::cEIT() (thanks to Helmut Binder).
|
||||
- Added initialization of cDvbFrontend::frontendInfo (thanks to Winfried Köhler).
|
||||
- Fixed a bug in handling shared PMTs, where after the first pass not all SIDs of a
|
||||
PMT pid were checked any more (thanks to Helmut Binder).
|
||||
- Fixed PMT handling in case locking the Channels list times out (reported by Helmut
|
||||
Binder).
|
||||
- Avoiding a lengthy lock on the Channels list when starting a recording (thanks to
|
||||
Helmut Binder).
|
||||
- Fixed error handling when loading a plugin (reported by Markus Ehrnsperger).
|
||||
- Improved handling missing VDRPluginDestroyer() (thanks to Winfried Köhler).
|
||||
- Fixed initializing tmpbuf in ExtendedEventDescriptors::getText() (thanks to Helmut
|
||||
Binder).
|
||||
- Fixed a compiler warning (thanks to Winfried Köhler).
|
||||
- Fixed convertCharacterTable() in case iconv_open() fails (thanks to Helmut Binder).
|
||||
- Official release.
|
||||
|
||||
2020-12-26: Version 2.5.1
|
||||
|
||||
- Implemented "Pattern Timers" (see MANUAL, vdr.1 and vdr.5 for details).
|
||||
- Events in the past are no longer marked as having a timer in the Schedules
|
||||
menu.
|
||||
|
||||
2021-01-02: Version 2.4.7
|
||||
|
||||
- Fixed strreplace() to handle NULL strings (reported by Jürgen Schneider).
|
||||
- Somewhere down the road the 'x' bit of Doxyfile.filter got lost, so the
|
||||
Makefile now makes sure it is set before calling doxygen.
|
||||
- Fixed a crash in the SVDRP command CLRE in case a non-existing channel number is
|
||||
given (reported by Manuel Reimer).
|
||||
- Fixed handling $(PKG_CONFIG) in newplugin (thanks to Winfried Köhler).
|
||||
|
||||
2021-04-06: Version 2.5.2
|
||||
|
||||
- Fixed strreplace() to handle NULL strings (reported by Jürgen Schneider).
|
||||
- Somewhere down the road the 'x' bit of Doxyfile.filter got lost, so the
|
||||
Makefile now makes sure it is set before calling doxygen.
|
||||
- Using strgetlast() in more places.
|
||||
- Fixed a crash in the SVDRP command CLRE in case a non-existing channel number is
|
||||
given (reported by Manuel Reimer).
|
||||
- Fixed handling $(PKG_CONFIG) in newplugin (thanks to Winfried Köhler).
|
||||
- Fixed initializing the cChannel::schedule pointer after reading EPG data with PUTE
|
||||
(reported by Manuel Reimer).
|
||||
- Fixed VPS handling when spawning a pattern timer, in case Setup.UseVps is false
|
||||
(reported by Jürgen Schneider).
|
||||
- Increased the number of possible modulation systems in cDevice::GetDevice()
|
||||
(reported by Ulf Grüne).
|
||||
- Now explicitly triggering respawning of pattern timers.
|
||||
- If an event in the Schedules menu is marked with a 'T' or 'I' and the user presses the
|
||||
Red button to edit the timer, spawned timers are now preferred over pattern timers
|
||||
in case there is more than one timer that will match that event.
|
||||
- Made the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public
|
||||
(thanks to Peter Bieringer).
|
||||
- Fixed setting the 'title' of a recording's info to the recording's name if there
|
||||
is no info file (the change in version 1.7.28 broke the fallback to the old 'summary.vdr').
|
||||
- Now making sure a spawned timer only fully overlaps the given event (reported by
|
||||
Jürgen Schneider).
|
||||
- Added some missing user command calls for copying, renaming and moving recordings
|
||||
(thanks to Peter Bieringer).
|
||||
- Improved cSectionSyncer to make sure that no sections are missed, and to allow
|
||||
handling partially used segments (as in the EIT) and processing sections in random
|
||||
order. Segment syncing is now done with the two member functions Check() and
|
||||
Processed(). The old functions Sync() and Repeat() are deprecated and may be
|
||||
removed in a future version. See the comments in filter.h for a description on
|
||||
how to use these new function.
|
||||
- When checking whether a particular recording has already been made by a pattern
|
||||
timer, the characters ' ' (blank), ':' and '-' are now ignored, making
|
||||
"TITLE - EPISODE" and "TITLE: EPISODE" the same.
|
||||
- Decreased the scrambling timeout for CAMs known to decrypt a certain channel, so
|
||||
that it won't collide with MAXBROKENTIMEOUT in recorder.c.
|
||||
- Fixed scaling subtitles with anti-aliasing (thanks to Peter Bieringer).
|
||||
- Improved handling EPG data from the EIT tables:
|
||||
+ Table 0x4F is now completely ignored.
|
||||
+ Once a schedule has seen events from 0x5X, tables 0x6X are ignored for that
|
||||
schedule.
|
||||
+ When looking up an event in its schedule, the start time is used for tables 0x6X, and the
|
||||
event id for tables 0x4E and 0x5X.
|
||||
+ When hashing events by event id or start time, existing older entries in the hash
|
||||
tables are now deleted before entering the new ones.
|
||||
+ The function cSchedule::GetEvent() is now deprecated and may be removed in a future
|
||||
version. Use GetEventById() and GetEventByTime() instead.
|
||||
+ On channels that use proper event ids a change of the start time no longer
|
||||
causes a new event to be created, but rather modifies the existing one. This
|
||||
avoids possible interruptions in VPS recordings in case the event's start time
|
||||
is changed while the recording is already going on.
|
||||
- The margins for timer recordings are now always limited to the duration of the
|
||||
previous and next event.
|
||||
- Spawned timers that don't use VPS now automatically adjust their start/stop times
|
||||
to changes in the respective event's times.
|
||||
- Fixed handling the timer counter in cSchedule::DelEvent().
|
||||
- Fixed MakePatternFileName() in case the event doesn't yet have a short text (reported
|
||||
by Jürgen Schneider).
|
||||
- No longer switching devices for pattern timers (thanks to Helmut Binder).
|
||||
- cTimer::TriggerRespawn() now only acts on local timers.
|
||||
|
||||
2021-04-20: Version 2.5.3
|
||||
|
||||
- When spawning pattern timers, the new function cTimers::GetTimerForEvent() is now used
|
||||
to check whether a matching event already has a local spawned timer. Reason: creating a timer
|
||||
from the Schedule menu (by pressing the Red button), then pressing Red again to edit
|
||||
the timer, making it a pattern timer and moving it to a remote machine, did not cause
|
||||
an immediate respawn on the remote machine, because at that time the event on the remote
|
||||
machine was still covered by the initial timer (which, from the remote machine's standpoint,
|
||||
was "remote").
|
||||
- Now adjusting spawned timers before setting events to timers.
|
||||
- Fixed dropping outdated events.
|
||||
- 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.
|
||||
- Now making sure that spawned timers with reduced start/stop margins actually record with
|
||||
the full margins.
|
||||
- Fixed the timer indicator in the Schedule menu in case an event is already over, but the
|
||||
timer is still recording.
|
||||
- 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.
|
||||
- EXPIRELATENCY now only applies to VPS timers.
|
||||
- Deleting expired timers is now triggered immediately after the timers are modified.
|
||||
|
||||
2021-05-21: Version 2.5.4
|
||||
|
||||
- Now using a separate fixed value for internal EPG linger time. This fixes problems with
|
||||
spawned timers jumping to the next event in case Setup.EPGLinger is very small. (reported
|
||||
by Jürgen Schneider).
|
||||
- Fixed a possible crash in the Schedule menu, in case Setup.EPGLinger is 0.
|
||||
- Fixed cTsPayload::AtPayloadStart() to ignore TS packets from other PIDs.
|
||||
- Recordings are now checked for errors:
|
||||
+ On TS level, the continuity counter, transport error indicator and scramble flags are
|
||||
checked.
|
||||
+ On frame level it is checked whether there are no gaps in the PTS.
|
||||
+ The number of errors during a recording is stored in the recording's 'info' file, with
|
||||
the new tag 'O'.
|
||||
+ Spawned timers that shall avoid recording reruns only store the recording's name in
|
||||
the donerecs,data file if there were no errors during recording, and if the timer has
|
||||
actually finished.
|
||||
- Removed the macros __STL_CONFIG_H, _STL_ALGOBASE_H and _MOVE_H from tools.h. If your
|
||||
plugin insists in using "using namespace std;" you can still define
|
||||
DISABLE_TEMPLATES_COLLIDING_WITH_STL before including any VDR header files.
|
||||
- Removed 'register' from libsi/util.c to avoid a warning with ISO-C++17.
|
||||
- The cFile class has been partially deprecated:
|
||||
+ The handling of file handles was not thread-safe.
|
||||
+ It was only actually used in svdrp.c.
|
||||
+ cFile::Ready() now processes only its own file descriptor by calling FileReady()
|
||||
instead of AnyFileReady().
|
||||
- The transponder value of channels is now cached, because cChannel::Transponder(void)
|
||||
is called very often (pointed out by Helmut Binder).
|
||||
- Added code for the 'qad' audio track (thanks to Helmut Binder).
|
||||
- The 'Edit path' dialog now also shows the total size of all recordings in that path
|
||||
(thanks to Christoph Haubrich).
|
||||
- The macro DEPRECATED_VDR_CHARSET_OVERRIDE and the related code has been removed.
|
||||
- The default for DEPRECATED_SETCURRENTCHANNEL has been set to 0, which means that
|
||||
the function SetCurrentChannel(const cChannel *Channel) is no longer available.
|
||||
You can add 'DEPRECATED_SETCURRENTCHANNEL=1' when compiling in order to restore this
|
||||
functionality. However, it is recommended to use SetCurrentChannel(int ChannelNumber)
|
||||
instead.
|
||||
- The macro DEPRECATED_GETBITMAP and the related code has been removed.
|
||||
- The default for DEPRECATED_SKIN_SETITEMEVENT has been set to 0, which means that
|
||||
the function cSkinDisplayMenu::SetItemEvent() without the TimerActive parameter is
|
||||
no longer available. You can add 'DEPRECATED_SKIN_SETITEMEVENT=1' when compiling in
|
||||
order to restore this functionality. However, it is recommended to use the function
|
||||
with the TimerActive parameter instead.
|
||||
|
||||
2021-06-10: Version 2.5.5
|
||||
|
||||
- cRecordingInfo::Errors() now returns -1 for old recordings; added a missing 'const'
|
||||
(suggested by Christoph Haubrich).
|
||||
- The error counter of a recording is now copied as is when editing a recording.
|
||||
- Added missing initialization of cRecorder::lastErrors.
|
||||
- Now using __cplusplus instead of DISABLE_TEMPLATES_COLLIDING_WITH_STL, and using
|
||||
std::min(), std::max() and std::swap() if available (thanks to Winfried Köhler).
|
||||
- No longer permanently looping through PMT PIDs, which caused problems with some
|
||||
SatIP receivers (reported by André Weidemann; with help from Helmut Binder).
|
||||
- Fixed flushing old data from the section handler (thanks to Helmut Binder).
|
||||
- Removed unused declaration of cDvbTuner::SetFrontendType() (thanks to Helmut Binder).
|
||||
- Fixed handling incomplete multi-packet CAT (thanks to Helmut Binder).
|
||||
|
||||
2021-07-02: Version 2.5.6
|
||||
|
||||
- Fixed restarting PMT pids after starting a recording on the currently viewed channel
|
||||
(with help from Helmut Binder).
|
||||
- If an error occurs while recording, the respective entry in the list of recordings is
|
||||
now updated immediately (reported by Matthias Senzel).
|
||||
- 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.
|
||||
- When checking whether a recording has already been made, recording names are now
|
||||
compared case insensitive.
|
||||
- Improved responsiveness in cSectionHandler::Action() (thanks to Helmut Binder).
|
||||
- Fixed deleting the edited recording in case of an error (reported by Christoph Haubrich).
|
||||
- Fixed triggering the PAT filter.
|
||||
- The Recordings menu now marks recordings with errors with an exclamation mark ('!'),
|
||||
and the number of errors (if any) is displayed in the recording's Info menu.
|
||||
|
||||
2021-12-20: Version 2.5.7
|
||||
|
||||
- Replaced all umlauts in the example channels.conf with their ae, oe, ue substitutes
|
||||
to avoid problems on UTF-8 systems.
|
||||
- Added missing '0x09=H.265 video, 0x19 = AC4 audio' to vdr.5 (reported by Christoph
|
||||
Haubrich).
|
||||
- Fixed unlocking vs. call to EpgHandlers.EndSegmentTransfer() (reported by Christoph
|
||||
Haubrich).
|
||||
- Fixed a memory leak in handling the NIT (thanks to Helmut Binder).
|
||||
|
||||
2021-12-27: Version 2.4.8
|
||||
|
||||
- Fixed a possible crash in the Schedule menu, in case Setup.EPGLinger is 0.
|
||||
- Fixed cTsPayload::AtPayloadStart() to ignore TS packets from other PIDs.
|
||||
- Fixed unlocking vs. call to EpgHandlers.EndSegmentTransfer() (reported by Christoph
|
||||
Haubrich).
|
||||
- Fixed a memory leak in handling the NIT (thanks to Helmut Binder).
|
||||
- Fixed a possible memory leak in creating fonts (reported by Helmut Binder).
|
||||
- Fixed calculating the disk use percentage if there's more than 20TB of recordings
|
||||
(reported by Timo Weingärtner).
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Fixed a possible memory leak in creating fonts (reported by Helmut Binder).
|
||||
- Fixed calculating the disk use percentage if there's more than 20TB of recordings
|
||||
(reported by Timo Weingärtner).
|
||||
- Official release.
|
||||
|
||||
2022-02-02: Version 2.6.1
|
||||
|
||||
- Replaced strncpy() with memcpy() in strreplace() to avoid a compiler warning
|
||||
(reported by Marko Mäkelä).
|
||||
- Fixed starting replay after jumping to an editing mark.
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- Added some missing "AUTO" values to vdr.5 (thanks to Winfried Köhler).
|
||||
- Fixed handling zero bytes in cH264Parser (thanks to Christoph Haubrich).
|
||||
- Fixed handling error conditions in the index file (reported by Markus Ehrnsperger).
|
||||
- Fixed a possible deadlock in cDevice::DetachAllReceivers() (thanks to Helmut Binder).
|
||||
- Clarified some potentially mistakable code in cSectionHandler::SetStatus() (pointed
|
||||
out by Onur Sentürk).
|
||||
- Official release.
|
||||
|
||||
2022-11-30: Version 2.6.2
|
||||
|
||||
- Added UPDATE-2.6.0, which was missing in the official 2.6.0 release.
|
||||
- Fixed unexpected calls of the '-r' script when a recording is interrupted and
|
||||
the timer has not yet finished.
|
||||
- Now dropping capabilities after opening terminal.
|
||||
- Now assuming the lock when removing deleted recordings even if the disk is full
|
||||
(reported by Claus Muus).
|
||||
- When checking whether a recording is still active, VDR no longer checks whether the
|
||||
index file is being written, but rather checks for the presence of a '.timer' file.
|
||||
The cutter now writes a dummy '.timer' file with timer ID '0' to make this work
|
||||
for recordings that are currently being edited.
|
||||
- Fixed a possible crash if an editing process is canceled while the edited
|
||||
recording is being replayed.
|
||||
- Added a warning if an attempt is made to obtain a write lock twice from the same thread.
|
||||
- Fixed default values for DVB-T (thanks to Winfried Köhler and Jose Angel).
|
||||
- Removed some unnecessary locks from SVDRPClientHandler.
|
||||
- Fixed a possible deadlock in case two SVDRP clients send each other POLL commands
|
||||
at the same time.
|
||||
- Added a missing 'const' to cTimers::GetTimerForEvent() (reported by Markus Ehrnsperger).
|
||||
- Added a chapter about locking to PLUGINS.html (suggested by Markus Ehrnsperger).
|
||||
- Implemented parsing frame rate and image size for MPEG2, H.264 and H.265 (thanks
|
||||
to Christoph Haubrich).
|
||||
- Using the frame rate parsed from the stream, with fall back to determining it from
|
||||
PTS values.
|
||||
- Fixed printing/scanning values for systems where %ld doesn't work for time_t.
|
||||
- Added support for kernel based LIRC driver (thanks to Marko Mäkelä). Use the
|
||||
command line option '--lirc=/dev/lirc0' to use this. Requires kernel version 5.10
|
||||
or above.
|
||||
- Added periodic calls to malloc_trim(0) to reduce memory consumption (thanks to
|
||||
Onur Sentürk).
|
||||
- Fixed regenerating the index file of a recording in case it is present, but empty
|
||||
(reported by Stefan Herdler).
|
||||
- Added missing rounding when dividing frequencies in processing the NIT (thanks to
|
||||
Winfried Köhler).
|
||||
|
||||
2022-12-14: Version 2.6.3
|
||||
|
||||
- Fixed a compiler warning.
|
||||
- Fixed generating the index file in the cutter (reported by Christoph Haubrich).
|
||||
- Fixed a faulty 'Timer still recording' query when canceling an editing job.
|
||||
- Added code for the 'qks' audio track (thanks to Johann Friedrichs).
|
||||
- Fixed a possible heap-use-after-free in cDvbTuner::Action() (reported by Marko Mäkelä).
|
||||
- Fixed initializing cDvbPlayerControl and cTransferControl (reported by Marko Mäkelä).
|
||||
- Now avoiding calling poll() in cSectionHandler::Action() if there are no filters
|
||||
(reported by Marko Mäkelä).
|
||||
- Now avoiding the memcpy() call in cGlyph::cGlyph() if the bitmap is empty (thanks
|
||||
to Marko Mäkelä).
|
||||
- Now avoiding unnecessary processing in cDvbSubtitleConverter::FinishPage() if there
|
||||
are no areas (thanks to Marko Mäkelä).
|
||||
- Avoiding a zero sized array in cDevice::GetDevice() (thanks to Marko Mäkelä).
|
||||
- Now checking the video directory after setting the user id.
|
||||
|
||||
2023-02-17: Version 2.6.4
|
||||
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- Fixed restoring the volume at program start (thanks to Matthias Senzel).
|
||||
- Fixed symmetry of Begin/EndSegmentTransfer() calls in cEIT::cEIT() (thanks to
|
||||
Jörg Wendel).
|
||||
- Added a note to epg.h about not messing with event ids (suggested by Winfried Köhler).
|
||||
- Added a note to vdr.5 about event ids possibly changing when an event moves from
|
||||
one table to another.
|
||||
- Fixed initializing cDvbPlayerControl (was broken in version 2.6.3).
|
||||
- Reverted 'Fixed a possible crash if an editing process is canceled while the edited
|
||||
recording is being replayed' (introduced in version 2.6.2), because it caused a
|
||||
deadlock when moving recordings between volumes.
|
||||
- Fixed a possible crash if an editing process is canceled while the edited recording
|
||||
is being replayed (new solution).
|
||||
- Fixed unnecessary interruption of ongoing recordings if timers avoided the transfer
|
||||
mode receiver device (thanks to Markus Ehrnsperger).
|
||||
- Revised support for kernel based LIRC driver (thanks to Marko Mäkelä).
|
||||
|
||||
2023-12-30: Version 2.6.5
|
||||
|
||||
- Fixed broken video data streams on systems without output device when switching live
|
||||
channel to a different transponder while recording (reported by Markus Ehrnsperger).
|
||||
- The frame width, height, scan type and aspect ratio of a recording are now stored in
|
||||
the 'info' file under the 'F' tag (thanks to Christoph Haubrich).
|
||||
- Added the function cRecordingInfo::FrameParams(), which can be used to get a nicely
|
||||
formatted string with all the available frame data.
|
||||
- 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).
|
||||
|
||||
2024-01-24: Version 2.6.6
|
||||
|
||||
- Changed installing config files to handle potentially broken 'cp -n'.
|
||||
- Fixed height calculation in progress display (thanks to Matthias Senzel).
|
||||
- Fixed a possible crash in cDevice::StopSectionHandler() (thanks to Markus
|
||||
Ehrnsperger).
|
||||
- Using a dummy OSD if no OSD provider is available is not considered an error any
|
||||
more (thanks to Markus Ehrnsperger).
|
||||
- Implemented scaling images (thanks to Andreas Baierl).
|
||||
- Removed syslog calls in child process after fork() (thanks to Markus Ehrnsperger).
|
||||
- Fixed an unnecessary double display of the current menu item in page up/down
|
||||
(thanks to Matthias Senzel).
|
||||
- Fixed an unnecessary double display of menu items in the Recordings menu (thanks to
|
||||
Matthias Senzel).
|
||||
- Added the move constructor to cString for better performance (thanks to Markus
|
||||
Ehrnsperger).
|
||||
- Added the total number of errors when logging new recording errors.
|
||||
- Added '/' to the list of fuzzy characters for pattern timers.
|
||||
- Fixed handling primary device on headless systems (thanks to Markus Ehrnsperger).
|
||||
- Workaround in detecting frame height for channels with wrong crop parameters
|
||||
(thanks to Christoph Haubrich).
|
||||
- Fixed possible duplicate component entries in the info of an ongoing recording
|
||||
(reported by Christoph Haubrich).
|
||||
|
||||
2024-04-02: Version 2.6.7
|
||||
|
||||
- Fixed the move assignment operator to check for self-assignment (suggested by
|
||||
Stefan Herdler).
|
||||
- Added missing initialization of cChannel::nameSourceMode (thanks to Winfried Köhler).
|
||||
- Modified handling channel names with source to make it thread safe (thanks to
|
||||
Stefan Herdler).
|
||||
- Adapted "Setup/Miscellaneous/Show channel names with source" to the new handling
|
||||
in cChannel.
|
||||
- Added a 15 second grace period before actually stopping a VPS timer (thanks to
|
||||
Markus Ehrnsperger).
|
||||
- The primary device no longer starts unnecessary threads if it doesn't have a decoder
|
||||
(thanks to Markus Ehrnsperger).
|
||||
- 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.
|
||||
- Updated the Hungarian OSD texts (thanks to István Füley).
|
||||
- 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 (see MANUAL for details).
|
||||
- Improved handling present/following data for VPS timers (thanks to Markus Ehrnsperger).
|
||||
- Logging event status changes now also shows the previous status (thanks to Markus
|
||||
Ehrnsperger).
|
||||
- Fixed logging when a timer has entered the VPS margin.
|
||||
- The EIT scan no longer deletes the scanList if no device was switched in this pass.
|
||||
- The EIT scan now skips scanList entries if a device is already tuned to that
|
||||
transponder.
|
||||
- The EIT scan is no longer inhibited if a timer is in VPS margin or needs the
|
||||
transponder.
|
||||
- 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.
|
||||
- A device is now always kept occupied if a timer is in VPS margin or needs the
|
||||
transponder (thanks to Markus Ehrnsperger).
|
||||
|
||||
2024-07-08: Version 2.6.8
|
||||
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- Fixed a possible access of a deleted object in the EIT scanner.
|
||||
- Fixed setting T2 system ID from NIT (thanks to Stefan Herdler).
|
||||
- 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.
|
||||
- Added an EPG bugfix for broadcasters who put literal "\n" strings in their EPG.
|
||||
Note that the string version of strreplace() has been modified, so that it
|
||||
replaces all occurrences of the search string, not just the first one.
|
||||
- Removed leftover cMenuRecordings::SetPath().
|
||||
- The EIT scanner now checks whether there is a proper device before adding a
|
||||
channel to the scan list.
|
||||
- Unused devices can now be put into a power save mode (suggested by Markus
|
||||
Ehrnsperger). Device plugins need to implement the new function
|
||||
cDevice::SetPowerSaveMode() to make this work.
|
||||
- Implemented power save mode for cDvbDevice (based on a patch from Markus
|
||||
Ehrnsperger).
|
||||
- Added 'lnbPowerTurnedOn = false' to cDvbTuner::ProvidesFrontend() (suggested by
|
||||
Markus Ehrnsperger).
|
||||
|
||||
2024-07-15: Version 2.6.9
|
||||
|
||||
- Fixed a crash in strreplace() for multiple replacements with strings of different
|
||||
lengths (reported by Markus Ehrnsperger).
|
||||
- Fixed handling of cSkinDisplayMenu::GetTextAreaFont() (reported by Matthias Senzel).
|
||||
- Fixed a timeout in cDvbDevice while tuning after the frontend has been reopened.
|
||||
- Fixed setting the editable width in the LCARS skin (reported by Matthias Senzel).
|
||||
- Fixed restarting the EPG scan and keeping the frequency of calls to
|
||||
Device->SetPowerSaveIfUnused() low.
|
||||
- Added the lines from 'Fixed a timeout in cDvbDevice while tuning after the frontend
|
||||
has been reopened' to cDvbTuner::ProvidesFrontend() (suggested by Markus Ehrnsperger).
|
||||
|
||||
2024-09-09: Version 2.7.1
|
||||
|
||||
- Removed deprecated function cDevice::SetCurrentChannel(const cChannel *Channel).
|
||||
- Removed deprecated function cSkinDisplayMenu::SetItemEvent(const cEvent *Event, int Index,
|
||||
bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch).
|
||||
- Removed deprecated functions from cFile.
|
||||
- The default for DEPRECATED_SCHEDULE_GET_EVENT has been set to 0, which means that
|
||||
the function GetEvent(tEventID EventID, time_t StartTime = 0) is no longer available.
|
||||
You can add 'DEPRECATED_SCHEDULE_GET_EVENT=1' when compiling in order to restore this
|
||||
functionality. However, it is recommended to use GetEventById() and GetEventByTime()
|
||||
instead.
|
||||
- The default for DEPRECATED_SECTIONSYNCER_SYNC_REPEAT has been set to 0, which means that
|
||||
the functions Repeat() and Sync() are no longer available.
|
||||
You can add 'DEPRECATED_SECTIONSYNCER_SYNC_REPEAT=1' when compiling in order to restore this
|
||||
functionality. However, it is recommended to use Check() and Processed() instead.
|
||||
- The default for DEPRECATED_CCONTROL has been set to 0, which means that
|
||||
the function Control(bool Hidden) is no longer available.
|
||||
You can add 'DEPRECATED_CCONTROL=1' when compiling in order to restore this
|
||||
functionality. However, it is recommended to use Control(cMutexLock &MutexLock, bool Hidden)
|
||||
instead.
|
||||
- Changed the error message when trying to attach a player to a primary device without
|
||||
an MPEG decoder.
|
||||
- The new SVDRP command 'AUDI' can be used to list the currently available audio tracks
|
||||
and select one of them.
|
||||
- Fixed a crash when deleting a recording that is currently being edited, and then
|
||||
immediately deleting the edited version, too (reported by Marko Mäkelä).
|
||||
- The '.update' file in the video directory is now created if it doesn't already exist.
|
||||
- Improved the error message when closing a frontend (thanks to Markus Ehrnsperger).
|
||||
- There will be no more distinction between "developer" and "stable" versions regarding
|
||||
version numbering. Version numbers are simply counted upwards, with each of the three
|
||||
parts ("version", "major", "minor") always being a single digit, and '0' being skipped.
|
||||
|
||||
2024-09-27: Version 2.7.2
|
||||
|
||||
- Fix for compilers that don't like non-constant format strings (thanks to Stefan Hofmann).
|
||||
- Deprecated code is now marked with [[deprecated]] to issue a compile time warning when
|
||||
used.
|
||||
- Made APIVERSION independent from VDRVERSION to avoid irritation in case only
|
||||
VDRVERSION is incremented (originally suggested by Winfried Köhler, with contributions
|
||||
from Lars Hanisch and Manuel Reimer).
|
||||
APIVERSNUM is now 30003.
|
||||
- Fixed a problem in cSchedule::Sort(), in case hasRunning was true, but there was no event
|
||||
with RunningStatus() >= SI::RunningStatusPausing (reported by Markus Ehrnsperger).
|
||||
- Silenced a compiler warning with gcc 14.1.0 (reported by Winfried Köhler).
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- Moved error checking from recorder.c to remux.c.
|
||||
- The number of errors in a recording now represents the number of broken frames.
|
||||
- Now distinguishing between frames with errors and completely missing frames.
|
||||
- Recording errors are now marked in the index file.
|
||||
- Fixed description of cSkinDisplayReplay::SetRecording().
|
||||
- Errors are now shown as diamond shaped markers in the replay progress display of the
|
||||
default skins. Plugin authors can switch to the new constructor of cProgressBar to
|
||||
benefit from this feature. Of course this only works with recordings that have error
|
||||
information stored in their index file. If you have existing recordings with errors
|
||||
and want them to be displayed in the progress bar, you can re-generate their index
|
||||
file, either by deleting the old index, or by running vdr with the --genindex option.
|
||||
APIVERSNUM is now 30004.
|
||||
- When the index file of a recording is regenerated, errors in the recording are now
|
||||
stored in the index file.
|
||||
- The info file of an edited recording now contains the number of errors in the edited
|
||||
version. Note that this applies only to recordings that have errors stored in their
|
||||
index file. If errors are not stored in the index file, the edited version will have
|
||||
its number of errors set to that of the original recording.
|
||||
APIVERSNUM is now 30005.
|
||||
- Fixed singular when displaying number of errors in the recording info.
|
||||
- Increased the bpp of cProgressBar to 4 to handle all different colors.
|
||||
- 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 (reported by Markus Ehrnsperger).
|
||||
|
||||
2024-10-12: Version 2.7.3
|
||||
|
||||
- Removed defining DEPRECATED_* macros with value 0, because this is the preprocessor's
|
||||
default (suggested by Winfried Köhler).
|
||||
- Fixed error checking in case of large PTS discontinuities.
|
||||
- Fixed handling negative values in cSource::Position() on systems where 'int' is 64 bit
|
||||
(reported by Markus Ehrnsperger, fix suggested by Winfried Köhler).
|
||||
- Fixed expiring of one-time VPS timers in case there is more than one event with the
|
||||
same VPS time (suggested by Markus Ehrnsperger).
|
||||
- The Channel+/- keys can now be used to jump between errors while replaying a recording
|
||||
(suggested by Stefan Hofmann).
|
||||
- Added vdrrootdir and incdir to vdr.pc (thanks to Stefan Hofmann).
|
||||
|
||||
2025-02-26: Version 2.7.4
|
||||
|
||||
- Removed all DEPRECATED_* code.
|
||||
- Fixed error checking in case the fps value can't be determined by the frame parser.
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- The VDR homepage is now accessible via HTTPS.
|
||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
||||
- Fixed some typos in the translation files (thanks to Stefan Hofmann).
|
||||
- Added some missing locking.
|
||||
- TS packets with errors are now skipped when parsing for frames.
|
||||
- Fixed handling the fps value if it can't be determined from the video data.
|
||||
- Fixed accessing a timer's event schedule in case the event has been removed from the
|
||||
schedule.
|
||||
- Fixed a possible deadlock when canceling an editing process.
|
||||
- Checking for VPS control is now limited to local timers.
|
||||
- Added 1 to Utf8BufSize() for worst case (thanks to Stefan Hofmann).
|
||||
- Fixed handling margins for timers that are not VPS controlled and not spawned (thanks
|
||||
to Markus Ehrnsperger).
|
||||
- Added a header to the backtrace (thanks to Stefan Hofmann).
|
||||
- Added parameter checks to strn0cpy() (thanks to Stefan Hofmann). Same for Utf8Strn0Cpy().
|
||||
- The info files of recordings are now only re-read if they have been modified (thanks
|
||||
to Stefan Hofmann).
|
||||
- The new virtual function cStatus::OsdItem2() can be used to get the information whether
|
||||
a menu item is selectable (thanks to Markus Ehrnsperger). Plugins that implemented
|
||||
cStatus::OsdItem() will still work as before, because the default implementation of
|
||||
cStatus::OsdItem2() calls cStatus::OsdItem().
|
||||
APIVERSNUM is now 30006.
|
||||
- Fixed setting the file name of the info file after renaming a recording (reported by
|
||||
Stefan Hofmann).
|
||||
- Fixed an improper call of cStatus::OsdCurrentItem() before cStatus::OsdItem2() (reported
|
||||
by Markus Ehrnsperger).
|
||||
- Fixed an unnecessary redisplay of the menu when pressing a hotkey.
|
||||
- Fixed unnecessary calls to DisplayCurrent() for editable menu items (thanks to Markus
|
||||
Ehrnsperger).
|
||||
- The new virtual function cStatus::OsdCurrentItem2() can be used to get the index of the
|
||||
current menu item (thanks to Markus Ehrnsperger). Plugins that implemented
|
||||
cStatus::OsdCurrentItem() will still work as before, because the default implementation
|
||||
of cStatus::OsdCurrentItem2() calls cStatus::OsdCurrentItem().
|
||||
- Fixed unnecessary calls to cStatus::OsdCurrentItem2() when scrolling.
|
||||
- Added missing calls to cStatus::MsgOsdStatusMessage() and added the new virtual function
|
||||
cStatus::OsdStatusMessage2(), which can be used to get the type of the message (thanks
|
||||
to Markus Ehrnsperger). Plugins that implemented cStatus::OsdStatusMessage() will still
|
||||
work as before, because the default implementation of cStatus::OsdStatusMessage2() calls
|
||||
cStatus::OsdStatusMessage().
|
||||
- Adjusted PLUGINS.html to the new API version numbering introduced in version 2.7.2.
|
||||
- The function cPlugin::MainThreadHook() has been deprecated and may be removed in future
|
||||
versions. Use proper locking instead.
|
||||
- Fixed unnecessary redisplays of menus.
|
||||
- Added '~' to the list of delimiters in cTextWrapper (thanks to Stefan Hofmann).
|
||||
- Fixed progress display when switching from "pause" to "slow back" (reported by Andreas
|
||||
Baierl).
|
||||
- Fixed spurious fast frames when switching from "slow back" to "slow forward".
|
||||
- Fixed cPtsIndex::FindFrameNumber() to handle the case where Pts points to an I-frame.
|
||||
- Added missing locks to SetMenuItem() functions.
|
||||
- Revised locking in cMenuSchedule and cMenuWhatsOn.
|
||||
|
44
INSTALL
44
INSTALL
@ -1,7 +1,7 @@
|
||||
Installation of the Video Disk Recorder
|
||||
---------------------------------------
|
||||
|
||||
Version 2.2
|
||||
Version 2.7
|
||||
-----------
|
||||
|
||||
Compiling and running the program:
|
||||
@ -47,9 +47,9 @@ By default the 'vdr' program can be controlled via the PC keyboard.
|
||||
If you want to disable control via the keyboard, you can add NO_KBD=1
|
||||
to the 'make' call, or use the '--no-kbd' option at runtime.
|
||||
|
||||
If you have an infrared remote control unit you can define the REMOTE macro
|
||||
to one of the following values in the 'make' call to make the respective control
|
||||
the default:
|
||||
If you have a LIRC compatible infrared remote control receiver you can define
|
||||
the REMOTE macro to one of the following values in the 'make' call to make
|
||||
the respective control the default:
|
||||
|
||||
REMOTE=LIRC control via the "Linux Infrared Remote Control"
|
||||
(see http://www.lirc.org)
|
||||
@ -264,11 +264,10 @@ Executing commands before and after a recording:
|
||||
------------------------------------------------
|
||||
|
||||
You can use the '-r' option to define a program or script that gets called
|
||||
before and after a recording is performed, and after an editing process
|
||||
has finished or a recording has been deleted.
|
||||
at various stages of handling recordings.
|
||||
|
||||
The program will be called with two or three (in case of "editing" and "edited")
|
||||
string parameters. The first parameter is one of
|
||||
The program will be called with two or three string parameters.
|
||||
The first parameter is one of
|
||||
|
||||
before if this is *before* a recording starts
|
||||
started if this is after a recording has *started*
|
||||
@ -276,13 +275,16 @@ string parameters. The first parameter is one of
|
||||
editing if this is before *editing* a recording
|
||||
edited if this is after a recording has been *edited*
|
||||
deleted if this is after a recording has been *deleted*
|
||||
copying if this is before *copying* a recording
|
||||
copied if this is after a recording has been *copied*
|
||||
renamed if this is after a recording has been *renamed*
|
||||
moved if this is after a recording has been *moved*
|
||||
(note that a move across file system borders triggers a sequence
|
||||
of "copying", "copied" and "deleted")
|
||||
|
||||
and the second parameter contains the full name of the recording's
|
||||
and the second and third parameter (if present) contain the full name of the recording's
|
||||
directory (which may not yet exists at that moment in the "before" case).
|
||||
In the "editing" and "edited" case it will be the name of the edited version
|
||||
(second parameter) and the name of the source version (third parameter).
|
||||
In the "deleted" case the extension of the directory name is ".del"
|
||||
instead of ".rec".
|
||||
See the example below for the exact meaning of these parameters.
|
||||
|
||||
Within this program you can do anything you would like to do before and/or
|
||||
after a recording or after an editing process. However, the program must return
|
||||
@ -315,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"
|
||||
;;
|
||||
|
159
MANUAL
159
MANUAL
@ -1,7 +1,7 @@
|
||||
Video Disk Recorder User's Manual
|
||||
---------------------------------
|
||||
|
||||
Version 2.2
|
||||
Version 2.7
|
||||
-----------
|
||||
|
||||
* Remote Control Keys
|
||||
@ -50,8 +50,8 @@ Version 2.2
|
||||
Next Next/previous channel group (in live tv mode)
|
||||
Prev or next/previous editing mark (in replay mode)
|
||||
|
||||
Channel+ channel up
|
||||
Channel- channel down
|
||||
Channel+ channel up (live view), next error (replay)
|
||||
Channel- channel down (live view), previous error (replay)
|
||||
PrevChannel previous channel
|
||||
|
||||
Power shutdown
|
||||
@ -90,7 +90,7 @@ Version 2.2
|
||||
be treated as part of that number, not as a sort mode toggle. If no numeric
|
||||
key has been pressed for more than one second, the number is reset and '0'
|
||||
functions as sort mode toggle again.
|
||||
(3) In the "Timers" menu, when on the "Day" item, the '0' key toggles between
|
||||
(3) In the "Edit timer" menu, when on the "Day" item, the '0' key toggles between
|
||||
a single shot and a repeating timer. If "Day" indicates a repeating timer,
|
||||
the keys '1'...'7' can be used to toggle the individual days ('1' is Monday).
|
||||
|
||||
@ -480,6 +480,8 @@ Version 2.2
|
||||
"forever", and a value of 0 means that this recording can be
|
||||
deleted any time if a recording with a higher priority needs disk
|
||||
space.
|
||||
Pattern: The pattern to use for recordings matching events (only available
|
||||
for pattern timers). See section "Pattern timers" below.
|
||||
File: The name under which a recording created through this timer will
|
||||
be stored on disk (the actual name will also contain the date and
|
||||
time, so it is possible to have a "repeating timer" store all its
|
||||
@ -511,6 +513,140 @@ Version 2.2
|
||||
The "Red" key in the "Edit timer" menu opens a list of folders, which can be
|
||||
used to define the file name in which the recording will be stored.
|
||||
|
||||
The "Yellow" key in the "Edit timer" menu toggles the timer between "Pattern"
|
||||
and "Regular".
|
||||
|
||||
When editing the "File" field, the "Blue" key in can be used to insert useful
|
||||
macros.
|
||||
|
||||
* Pattern timers
|
||||
|
||||
There are cases where it would make sense to have a more flexible kind of
|
||||
recording timer. For instance, some channels that provide VPS don't always
|
||||
use the exact same VPS time for a series, which is extremely annoying.
|
||||
Or you might want to record all films that have a certain pattern in their
|
||||
title, no matter when they are broadcast. In such cases, "pattern timers"
|
||||
can help.
|
||||
|
||||
In the "Edit timer" menu press the Yellow button to turn a regular timer into
|
||||
a pattern timer. Pressing this button again switches back to regular.
|
||||
|
||||
The following rules apply to pattern timers:
|
||||
|
||||
- Pattern timers can only work for channels that provide EPG data.
|
||||
- When using pattern timers, there should always be at least one free device that
|
||||
can be used to regularly receive the EPG of the pattern timer's channel.
|
||||
- A pattern timer records every matching event on the given channel that overlaps
|
||||
with the given start/stop time. Overlapping events are recorded in full,
|
||||
even if they extend outside the given start/stop interval.
|
||||
- In order to actually record an event, a pattern timer "spawns" a separate timer
|
||||
that does the recording. If there are matching events that would start while
|
||||
the first spawned timer is still recording (due to the start/stop margins), timers
|
||||
for those events are also spawned.
|
||||
- Spawned timers are marked with the flag tfSpawned.
|
||||
- Spawned timers take the Priority, Lifetime and VPS settings from the pattern timer.
|
||||
- The special pattern "*" matches every event. So a timer with
|
||||
a start/stop time of 00:00/23:59 will record every event of that day
|
||||
into separate recordings. Note that when using this pattern there should
|
||||
be no other timers for the same channel, because these might interfere.
|
||||
- Once a timer has been spawned, it is treated like any other regular
|
||||
timer. Any changes made to the corresponding pattern timer thereafter will have
|
||||
no effect on spawned timers. Note that after deleting a spawned timer,
|
||||
the corresponding pattern timer may respawn it.
|
||||
- Recording is done according to the event's begin/end times, either
|
||||
by adding the start/stop margins (for non-VPS timers) or by using the
|
||||
event's running status (for VPS timers).
|
||||
- If the start/stop margins of a spawned timer are reduced because the event
|
||||
before and/or after that timer's event is shorter than the respective margin,
|
||||
the actual recording still uses the full margins.
|
||||
- If the times of the event change, a non-VPS pattern timer automatically adjusts
|
||||
itself to the new times. This also happens if the start/stop margins are changed
|
||||
in the setup.
|
||||
- The recording of a pattern timer is stored under the given file name, just like
|
||||
regular timers do. In addition to the "TITLE" and "EPISODE" macros the file
|
||||
name of a pattern timer can also use "{<}" and "{>}" to reference the part of the
|
||||
event's title before and after the pattern, respectively. For instance,
|
||||
if the event's title is "Abc def ghi" and the pattern is "def ", "{<}"
|
||||
would contain "Abc " and "{>}" would contain "ghi" (note the matching of the
|
||||
blanks). For completeness, "{=}" can be used to reference the matching
|
||||
pattern itself.
|
||||
- In the "Timers" menu pressing the Red button on a pattern timer only toggles the
|
||||
timer between "on" and "off", even if this is a repeating timer.
|
||||
- In the "Timers" menu pattern timers are sorted alphabetically to the end of the
|
||||
list of timers.
|
||||
- A regular timer that is currently recording can't be changed into a pattern timer.
|
||||
- In the "Edit timer" menu the file name and pattern are displayed as
|
||||
separate items. The Yellow button can be used to toggle between a regular
|
||||
timer and a pattern timer. When going from regular to pattern, the Pattern item will
|
||||
be initialized with the base part of the file name.
|
||||
- The characters '^' and '$' can be used at the very beginning and end of
|
||||
the pattern to anchor the pattern to the begin or end of the title.
|
||||
Using both of these will match only titles that consist of exactly the given pattern,
|
||||
with nothing before and nothing after it.
|
||||
- The Pattern field in the "Edit timer" menu allows blanks at the end of the string,
|
||||
which may help to separate the text after the matching pattern.
|
||||
- If the first character of the pattern is '@', an event that matches the
|
||||
rest of the pattern is only recorded if the resulting recording's file
|
||||
name (without any folders) is not contained in the donerecs.data file.
|
||||
This avoids duplicate recordings of the same programme. Timers spawned from
|
||||
such a pattern timer are marked with the flag tfAvoid.
|
||||
- When editing the "File" field of a timer, the Blue button can be pressed to
|
||||
insert one of the macros "TITLE", "EPISODE", "{<}", "{=}" or "{>}",
|
||||
respectively. Pressing the Blue button repeatedly loops through the available
|
||||
macros. The "{...}" macros are only available for pattern timers.
|
||||
- In the "Schedule" and "What's on...?" menus the events that will be recorded
|
||||
by a pattern timer are marked in the same way as regular timers.
|
||||
- The TIMERS column in the LCARS skin doesn't show the basic definitions of
|
||||
pattern timers, it only shows timers actually spawned from pattern timers.
|
||||
|
||||
If the pattern is prepended with '@', the name of the resulting recording (everything
|
||||
after the rightmost '~', or the entire file name, if there is no '~') will be stored
|
||||
in the file donerecs.data, so that multiple recordings of the same programme can be
|
||||
avoided. When using this feature, special care must be taken regarding the recording's
|
||||
file name. For instance, with a combination of
|
||||
|
||||
pattern file name
|
||||
@Columbo Movies~TITLE
|
||||
|
||||
if the event's title is just "Columbo", this pattern timer would only record once,
|
||||
and ignore any future events with that title, even if the episode would be different.
|
||||
So you may want to use the episode name, as in
|
||||
|
||||
pattern file name
|
||||
@Columbo Movies~TITLE - EPISODE
|
||||
|
||||
to make the file name unique. If you have several pattern timers for the same show on
|
||||
different channels, chances are that the broadcasters handle title and episode
|
||||
differently, as for example in
|
||||
|
||||
TITLE EPISODE pattern file name
|
||||
Columbo Blueprint for Murder @^Columbo$ TITLE - EPISODE
|
||||
Columbo - Blueprint for Murder @^Columbo TITLE
|
||||
Columbo: Blueprint for Murder @^Columbo:_ Columbo - {>}
|
||||
|
||||
(note the '_' in the pattern of the third example; this is just used to visualize
|
||||
the blank at the end of the pattern)
|
||||
|
||||
In order to have the same episode result in the same recording file name on all
|
||||
channels, the file name needs to be generated differently for each channel. First
|
||||
you need to decide on a proper combination of title and episode name, preferably
|
||||
one that is already used by one of your channels (let's say the second one).
|
||||
In the first case, title and episode name are correctly put in their respective
|
||||
places, and "TITLE - EPISODE" as file name will do. The second case is our common
|
||||
version, where everything is in the title, so TITLE is just fine. The third case
|
||||
poses a problem, because everything is in the title, but with a different separator.
|
||||
Here the special macro "{>}" can be used in the file name, which contains everything
|
||||
following the matching pattern. There are three macros that can be used here:
|
||||
|
||||
{<} everything before the matching pattern
|
||||
{>} everything after the matching pattern
|
||||
{=} the matching pattern itself (just for completeness)
|
||||
|
||||
As of VDR version 2.5.2, the characters ' ' (blank), ':' and '-' are ignored
|
||||
when checking whether a particular recording has already been made by a pattern
|
||||
timer, making "TITLE - EPISODE" and "TITLE: EPISODE" the same.
|
||||
VDR version 2.6.6 added '/' to this list.
|
||||
|
||||
* Managing folders
|
||||
|
||||
The "Select folder" menu, which can be accessed by pressing the "Red" key in
|
||||
@ -693,6 +829,16 @@ Version 2.2
|
||||
A value of '0' completely turns off scanning on both single
|
||||
and multiple card systems.
|
||||
|
||||
EPG scan max. channel number = 0
|
||||
The EPG scan will only tune to transponders of channels with
|
||||
numbers below this limit. By default all transponders will
|
||||
be scanned.
|
||||
|
||||
EPG pause after scan = no
|
||||
After a complete scan of all transponders (optionally limited
|
||||
by "EPG scan max. channel number") the EPG scan pauses for
|
||||
"EPG scan timeout" hours if this option is set to "yes".
|
||||
|
||||
EPG bugfix level = 3 Some tv stations transmit weirdly formatted EPG data.
|
||||
VDR attempts to fix these bugs up to the given level:
|
||||
0 = no EPG fixing
|
||||
@ -894,6 +1040,9 @@ Version 2.2
|
||||
after the official end time it shall stop recording.
|
||||
These margins are added automatically to timers that
|
||||
are created from the EPG data.
|
||||
Note that the actual margins used may be smaller than the
|
||||
given values, if the event before and/or after the event
|
||||
to be recorded is shorter than the respective margin.
|
||||
|
||||
Default priority = 50 The default Priority and Lifetime values used when
|
||||
Default lifetime = 99 creating a new timer event. A Lifetime value of 99
|
||||
@ -1131,7 +1280,7 @@ Version 2.2
|
||||
The time (in milliseconds) between two subsequent key
|
||||
presses generated by the remote control's repeat function.
|
||||
If the remote control in use has a repeat delta that is
|
||||
longer than that given in this parameter, that longer delay
|
||||
longer than that given in this parameter, that longer delta
|
||||
will prevail.
|
||||
Initial channel = The channel ID of the channel that shall be tuned to when
|
||||
VDR starts. Default is empty, which means that it will
|
||||
|
@ -6,7 +6,7 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Make.config.template 4.1 2017/06/02 09:29:54 kls Exp $
|
||||
# $Id: Make.config.template 5.2 2024/10/11 14:21:04 kls Exp $
|
||||
|
||||
### The C compiler and options:
|
||||
|
||||
@ -33,14 +33,15 @@ endif
|
||||
# Default directories (adjust as necessary or desired):
|
||||
|
||||
#PREFIX = /usr/local
|
||||
#BINDIR = $(PREFIX)/bin
|
||||
#INCDIR = $(PREFIX)/include
|
||||
#LIBDIR = $(PREFIX)/lib/vdr
|
||||
#LOCDIR = $(PREFIX)/share/locale
|
||||
#MANDIR = $(PREFIX)/share/man
|
||||
#PCDIR = $(PREFIX)/lib/pkgconfig
|
||||
#RESDIR = $(PREFIX)/share/vdr
|
||||
#DVBDIR = /usr/src/v4l-dvb/linux/include/uapi
|
||||
#VDRROOT = $(PREFIX)
|
||||
#BINDIR = $(VDRROOT)/bin
|
||||
#INCDIR = $(VDRROOT)/include
|
||||
#LIBDIR = $(VDRROOT)/lib
|
||||
#LOCDIR = $(VDRROOT)/locale
|
||||
#MANDIR = $(VDRROOT)/man
|
||||
#PCDIR = $(VDRROOT)/pkgconfig
|
||||
#RESDIR = $(VDRROOT)/share
|
||||
#DVBDIR = /usr/include
|
||||
|
||||
#VIDEODIR = /srv/vdr/video
|
||||
#CONFDIR = /var/lib/vdr
|
||||
@ -74,6 +75,8 @@ endif
|
||||
|
||||
### The remote control:
|
||||
LIRC_DEVICE = /var/run/lirc/lircd
|
||||
### Use this for kernel based driver:
|
||||
#LIRC_DEVICE = /dev/lirc0
|
||||
|
||||
### Define if you always want to use LIRC, independent of the --lirc option:
|
||||
#REMOTE=LIRC
|
||||
|
63
Makefile
63
Makefile
@ -4,23 +4,26 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Makefile 4.5 2017/05/29 08:48:42 kls Exp $
|
||||
# $Id: Makefile 5.4 2024/10/21 19:01:16 kls Exp $
|
||||
|
||||
.DELETE_ON_ERROR:
|
||||
|
||||
# Compiler flags:
|
||||
|
||||
PKG_CONFIG ?= pkg-config
|
||||
|
||||
CC ?= gcc
|
||||
CFLAGS ?= -g -O3 -Wall
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
||||
CXXFLAGS += $(CPPFLAGS)
|
||||
|
||||
CDEFINES = -D_GNU_SOURCE
|
||||
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
||||
|
||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell pkg-config --libs freetype2 fontconfig)
|
||||
INCLUDES ?= $(shell pkg-config --cflags freetype2 fontconfig)
|
||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell $(PKG_CONFIG) --libs freetype2 fontconfig)
|
||||
INCLUDES ?= $(shell $(PKG_CONFIG) --cflags freetype2 fontconfig)
|
||||
|
||||
# Directories:
|
||||
|
||||
@ -28,6 +31,14 @@ CWD ?= $(shell pwd)
|
||||
LSIDIR ?= $(CWD)/libsi
|
||||
PLUGINDIR ?= $(CWD)/PLUGINS
|
||||
|
||||
# Failsafe defaults for "make LCLBLD=1":
|
||||
ifdef LCLBLD
|
||||
DESTDIR ?= $(CWD)
|
||||
LOCDIR ?= $(CWD)/locale
|
||||
HDRDIR ?= $(CWD)/include
|
||||
LIBDIR ?= $(PLUGINDIR)/lib
|
||||
endif
|
||||
|
||||
DESTDIR ?=
|
||||
VIDEODIR ?= /srv/vdr/video
|
||||
CONFDIR ?= /var/lib/vdr
|
||||
@ -35,13 +46,14 @@ ARGSDIR ?= /etc/vdr/conf.d
|
||||
CACHEDIR ?= /var/cache/vdr
|
||||
|
||||
PREFIX ?= /usr/local
|
||||
BINDIR ?= $(PREFIX)/bin
|
||||
INCDIR ?= $(PREFIX)/include
|
||||
LIBDIR ?= $(PREFIX)/lib/vdr
|
||||
LOCDIR ?= $(PREFIX)/share/locale
|
||||
MANDIR ?= $(PREFIX)/share/man
|
||||
PCDIR ?= $(PREFIX)/lib/pkgconfig
|
||||
RESDIR ?= $(PREFIX)/share/vdr
|
||||
VDRROOT ?= $(PREFIX)
|
||||
BINDIR ?= $(VDRROOT)/bin
|
||||
INCDIR ?= $(VDRROOT)/include
|
||||
LIBDIR ?= $(VDRROOT)/lib/vdr
|
||||
LOCDIR ?= $(VDRROOT)/share/locale
|
||||
MANDIR ?= $(VDRROOT)/share/man
|
||||
PCDIR ?= $(VDRROOT)/lib/pkgconfig
|
||||
RESDIR ?= $(VDRROOT)/share/vdr
|
||||
|
||||
# Source documentation
|
||||
|
||||
@ -99,14 +111,14 @@ ifdef VDR_USER
|
||||
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
||||
endif
|
||||
ifdef BIDI
|
||||
INCLUDES += $(shell pkg-config --cflags fribidi)
|
||||
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi)
|
||||
DEFINES += -DBIDI
|
||||
LIBS += $(shell pkg-config --libs fribidi)
|
||||
LIBS += $(shell $(PKG_CONFIG) --libs fribidi)
|
||||
endif
|
||||
ifdef SDNOTIFY
|
||||
INCLUDES += $(shell pkg-config --silence-errors --cflags libsystemd-daemon || pkg-config --cflags libsystemd)
|
||||
INCLUDES += $(shell $(PKG_CONFIG) --silence-errors --cflags libsystemd-daemon || $(PKG_CONFIG) --cflags libsystemd)
|
||||
DEFINES += -DSDNOTIFY
|
||||
LIBS += $(shell pkg-config --silence-errors --libs libsystemd-daemon || pkg-config --libs libsystemd)
|
||||
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd)
|
||||
endif
|
||||
|
||||
LIRC_DEVICE ?= /var/run/lirc/lircd
|
||||
@ -158,7 +170,9 @@ make-libsi: # empty rule makes sure the sub-make for libsi is always called
|
||||
|
||||
.PHONY: vdr.pc
|
||||
vdr.pc:
|
||||
@echo "bindir=$(BINDIR)" > $@
|
||||
@echo "vdrrootdir=$(VDRROOT)" > $@
|
||||
@echo "bindir=$(BINDIR)" >> $@
|
||||
@echo "incdir=$(INCDIR)" >> $@
|
||||
@echo "mandir=$(MANDIR)" >> $@
|
||||
@echo "videodir=$(VIDEODIR)" >> $@
|
||||
@echo "configdir=$(CONFDIR)" >> $@
|
||||
@ -174,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}" >> $@
|
||||
|
||||
@ -244,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;\
|
||||
@ -271,7 +285,7 @@ clean-plugins: vdr.pc
|
||||
|
||||
# Install the files (note that 'install-pc' must be first!):
|
||||
|
||||
install: install-pc install-bin install-dirs install-conf install-doc install-plugins install-i18n install-includes
|
||||
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes
|
||||
|
||||
# VDR binary:
|
||||
|
||||
@ -288,8 +302,13 @@ install-dirs:
|
||||
@mkdir -p $(DESTDIR)$(CACHEDIR)
|
||||
@mkdir -p $(DESTDIR)$(RESDIR)
|
||||
|
||||
install-conf:
|
||||
@cp -pn *.conf $(DESTDIR)$(CONFDIR)
|
||||
install-conf: install-dirs
|
||||
# 'cp -n' may be broken, so let's do it the hard way
|
||||
@for i in *.conf; do\
|
||||
if ! [ -e $(DESTDIR)$(CONFDIR)/$$i ] ; then\
|
||||
cp -p $$i $(DESTDIR)$(CONFDIR);\
|
||||
fi\
|
||||
done
|
||||
|
||||
# Documentation:
|
||||
|
||||
@ -304,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\
|
||||
@ -331,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
|
||||
|
||||
@ -339,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
|
||||
|
137
PLUGINS.html
137
PLUGINS.html
@ -31,14 +31,11 @@ modified {
|
||||
<div class="center">
|
||||
<h1>The VDR Plugin System</h1>
|
||||
|
||||
<b>Version 2.2</b>
|
||||
<b>Version 2.7</b>
|
||||
<p>
|
||||
Copyright © 2015 Klaus Schmidinger<br>
|
||||
Copyright © 2021 Klaus Schmidinger<br>
|
||||
<a href="mailto:vdr@tvdr.de">vdr@tvdr.de</a><br>
|
||||
<a href="http://www.tvdr.de">www.tvdr.de</a>
|
||||
</div>
|
||||
<div class="center">
|
||||
<modified>Important modifications introduced since version 2.2 are marked like this.</modified>
|
||||
<a href="https://www.tvdr.de">www.tvdr.de</a>
|
||||
</div>
|
||||
<p>
|
||||
VDR provides an easy to use plugin interface that allows additional functionality
|
||||
@ -77,7 +74,6 @@ structures and allows it to hook itself into specific areas to perform special a
|
||||
<li><a href="#Main menu entry">Main menu entry</a>
|
||||
<li><a href="#User interaction">User interaction</a>
|
||||
<li><a href="#Housekeeping">Housekeeping</a>
|
||||
<li><a href="#Main thread hook">Main thread hook</a>
|
||||
<li><a href="#Activity">Activity</a>
|
||||
<li><a href="#Wakeup">Wakeup</a>
|
||||
<li><a href="#Setup parameters">Setup parameters</a>
|
||||
@ -86,6 +82,7 @@ structures and allows it to hook itself into specific areas to perform special a
|
||||
<li><a href="#Internationalization">Internationalization</a>
|
||||
<li><a href="#Custom services">Custom services</a>
|
||||
<li><a href="#SVDRP commands">SVDRP commands</a>
|
||||
<li><a href="#Locking">Locking</a>
|
||||
<li><a href="#Loading plugins into VDR">Loading plugins into VDR</a>
|
||||
<li><a href="#Building the distribution package">Building the distribution package</a>
|
||||
</ul>
|
||||
@ -168,7 +165,7 @@ is used:
|
||||
VDR/PLUGINS/src
|
||||
VDR/PLUGINS/src/hello
|
||||
VDR/PLUGINS/lib
|
||||
VDR/PLUGINS/lib/libvdr-hello.so.1.1.0
|
||||
VDR/PLUGINS/lib/libvdr-hello.so.1
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
The <tt>src</tt> directory contains one subdirectory for each plugin, which carries
|
||||
@ -187,7 +184,7 @@ The <tt>lib</tt> directory contains the dynamically loadable libraries of all
|
||||
available plugins. Note that the names of these files are created by concatenating
|
||||
<p>
|
||||
<table border=2>
|
||||
<tr><td align=center><b><tt>libvdr-</tt></b></td><td align=center><b><tt>hello</tt></b></td><td align=center><b><tt>.so.</tt></b></td><td align=center><b><tt>1.1.0</tt></b></td></tr>
|
||||
<tr><td align=center><b><tt>libvdr-</tt></b></td><td align=center><b><tt>hello</tt></b></td><td align=center><b><tt>.so.</tt></b></td><td align=center><b><tt>1</tt></b></td></tr>
|
||||
<tr><td align=center><small>VDR plugin<br>library prefix</small></td><td align=center><small>name of<br>the plugin</small></td><td align=center><small>shared object<br>indicator</small></td><td align=center><small>API version number<br>this plugin was<br>compiled for</small></td></tr>
|
||||
</table>
|
||||
<p>
|
||||
@ -198,6 +195,11 @@ the current VDR version. That way minor fixes to VDR, that don't require changes
|
||||
to the VDR header files, can be made without requiring all plugins to be
|
||||
recompiled.
|
||||
<p>
|
||||
While in earlier versions of VDR the API version number was closely related to the
|
||||
VDR version number, starting with VDR version 2.7.2 the API version number was changed
|
||||
from a dot separated, three part number to a single integer, completely unrelated to
|
||||
the VDR version. This was done to avoid confusion.
|
||||
<p>
|
||||
The plugin library files can be stored in any directory. If the default organization
|
||||
is not used, the path to the plugin directory has be be given to VDR through the
|
||||
<b><tt>-L</tt></b> option.
|
||||
@ -393,13 +395,7 @@ just like shown in the above example. This is a convention that allows the <tt>M
|
||||
to extract the version number when generating the file name for the distribution archive.
|
||||
<p>
|
||||
A new plugin project should start with version number <tt>0.0.1</tt> and should reach
|
||||
version <tt>1.0.0</tt> once it is completely operative and well tested. Following the
|
||||
Linux kernel version numbering scheme, versions with <i>even</i> release numbers
|
||||
(like <tt>1.0.x</tt>, <tt>1.2.x</tt>, <tt>1.4.x</tt>...) should be stable releases,
|
||||
while those with <i>odd</i> release numbers (like <tt>1.1.x</tt>, <tt>1.3.x</tt>,
|
||||
<tt>1.5.x</tt>...) are usually considered "under development". The three parts of
|
||||
a version number are not limited to single digits, so a version number of <tt>1.2.15</tt>
|
||||
would be acceptable.
|
||||
version <tt>1.0.0</tt> once it is completely operative and well tested.
|
||||
|
||||
<hr><h2><a name="Description">Description</a></h2>
|
||||
|
||||
@ -584,7 +580,6 @@ esyslog("pluginname: error #%d has occurred", ErrorNumber);
|
||||
Note that the log messages will be given as provided, the plugin's name will not
|
||||
automatically be added, so make sure your log messages are obvious enough.
|
||||
<p>
|
||||
<modified>
|
||||
Only use the above logging functions for occasional log messages. Do not use
|
||||
them unconditionally for frequent messages that produce long sequences of lines
|
||||
in the log file every few seconds. That might make it hard to work on other plugins
|
||||
@ -609,7 +604,6 @@ purpose of the plugin to display something on stdout, like for instance the
|
||||
<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.
|
||||
</modified>
|
||||
|
||||
<hr><h2><a name="Main menu entry">Main menu entry</a></h2>
|
||||
|
||||
@ -697,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>
|
||||
@ -1189,11 +1162,59 @@ The returned string may consist of several lines, separated by the newline chara
|
||||
when presenting them to the caller, and the continuation character ('<tt>-</tt>')
|
||||
will be set for all but the last one.
|
||||
<p>
|
||||
<modified>
|
||||
<b>The SVDRP functions are called from the separate "SVDRP server handler" thread.
|
||||
Therefore the plugin needs to take care of proper locking if it accesses any
|
||||
Therefore the plugin needs to take care of proper <a href="#Locking">locking</a> if it accesses any
|
||||
global data.</b>
|
||||
</modified>
|
||||
|
||||
<hr><h2><a name="Locking">Locking</a></h2>
|
||||
|
||||
<div class="blurb">U can't touch this</div><p>
|
||||
|
||||
When accessing global data structures, proper locking is absolutely necessary.
|
||||
<p>
|
||||
There are several macros that allow for easy locking and unlocking. They all
|
||||
follow the naming convention <tt>LOCK_*_READ|WRITE</tt>, where <tt>'*'</tt> is the name
|
||||
of the global data structure, which can be one of <tt>TIMERS</tt>, <tt>CHANNELS</tt>,
|
||||
<tt>RECORDINGS</tt> or <tt>SCHEDULES</tt>. To implicitly avoid deadlocks in case you
|
||||
need to lock more than one structure, always make sure you use these macros in
|
||||
this sequence!
|
||||
<p>
|
||||
Using one of these macros sets a lock on the structure, creates a local pointer to the
|
||||
respective structure and makes sure the lock is released at the end of the current
|
||||
block:
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
if (some condition) {
|
||||
LOCK_TIMERS_READ; // creates local const cTimers *Timers
|
||||
for (const cTimer *Timer = Timers->First(); Timer; Timer = Timers->Next(Timer)) {
|
||||
// do something with Timer
|
||||
}
|
||||
}
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
Note the naming convention: TIMERS -> 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>
|
||||
|
||||
@ -1710,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);
|
||||
@ -2025,8 +2046,9 @@ operator!
|
||||
<b>Device hooks</b>
|
||||
<p>
|
||||
VDR has builtin facilities that select which device is able to provide a given
|
||||
transponder. However, there may be situations where the setup is so special
|
||||
that it requires considerations that exceed the scope of the core VDR code.
|
||||
transponder, or, which device may provide EIT data. However, there may be
|
||||
situations where the setup is so special that it requires considerations that
|
||||
exceed the scope of the core VDR code.
|
||||
This is where <i>device hooks</i> can be used.
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
@ -2034,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>
|
||||
|
||||
@ -2050,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
|
||||
|
||||
@ -2058,6 +2094,17 @@ new cMyDeviceHook;
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
and shall not delete this object. It will be automatically deleted when the program ends.
|
||||
<p>
|
||||
<b>Power management</b>
|
||||
<p>
|
||||
A device that can be put into a power save mode can implement the function
|
||||
|
||||
<p><table><tr><td class="code"><pre>
|
||||
virtual void SetPowerSaveMode(bool On);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
If On is true, power save mode shall be activated, if it is false,
|
||||
normal operating mode shall be restored.
|
||||
|
||||
<hr><h2><a name="Positioners">Positioners</a></h2>
|
||||
|
||||
|
@ -24,3 +24,11 @@ VDR Plugin 'epgtableid0' Revision History
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.2 2017/05/29 08:30:00 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
|
@ -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
|
||||
|
@ -3,13 +3,13 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: epgtableid0.c 3.2 2015/02/17 13:12:18 kls Exp $
|
||||
* $Id: epgtableid0.c 4.1 2018/04/10 13:00:18 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/epg.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.2.0";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
|
||||
|
||||
// --- cTable0Handler --------------------------------------------------------
|
||||
|
@ -94,3 +94,12 @@ VDR Plugin 'hello' Revision History
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Updated the French OSD texts (thanks to Bernard Jaulin).
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.2 2017/05/29 08:26:45 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
|
@ -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
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: hello.c 3.2 2015/02/17 13:12:26 kls Exp $
|
||||
* $Id: hello.c 4.1 2018/04/10 13:00:22 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -12,7 +12,7 @@
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.2.0";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = trNOOP("A friendly greeting");
|
||||
static const char *MAINMENUENTRY = trNOOP("Hello");
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
||||
@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Mogens Elneff <mogens@elneff.dk>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2000
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Dimitrios Dimitrakos <mail@dimitrios.de>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Ruben Nunez Francisco <ruben.nunez@tang-it.com>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2004, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,5 +1,5 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Hannu Savolainen <hannu@opensound.com>, 2002
|
||||
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
|
||||
@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,18 +1,19 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Jean-Claude Repetto <jc@repetto.org>, 2001
|
||||
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003
|
||||
# Gregoire Favre <greg@magma.unil.ch>, 2003
|
||||
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005
|
||||
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Nicolas Huillard <nhuillard@e-dition.fr>\n"
|
||||
"PO-Revision-Date: 2018-04-14 8:34+0200\n"
|
||||
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -20,19 +21,19 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
msgstr "Bien le bonjour"
|
||||
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
msgstr "Hello"
|
||||
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
msgstr "Durée pour le salut (s)"
|
||||
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
msgstr "Changer de salutation"
|
||||
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
msgstr "Bonjour à tous !"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
msgstr "Bonjour le monde !"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Adrian Caval <anrxc@sysphere.org>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-03-17 19:52+0100\n"
|
||||
|
@ -1,12 +1,12 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Istvan Koenigsberger <istvnko@hotmail.com>, 2002
|
||||
# Guido Josten <guido.josten@t-online.de>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:11+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-12-08 12:18+0200\n"
|
||||
|
@ -1,5 +1,5 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, 2001
|
||||
# Hans Dingemans <hans.dingemans@tacticalops.nl>, 2003
|
||||
@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,12 +1,12 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Jørgen Tvedt <pjtvedt@online.no>, 2001
|
||||
# Truls Slevigen <truls@slevigen.no>, 2002
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,12 +1,12 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Michael Rakowski <mrak@gmx.de>, 2002
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2018-02-19 00:41+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Paulo Lopes <pmml@netvita.pt>, 2001
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,12 +1,12 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Paul Lacatus <paul@campina.iiruc.ro>, 2002
|
||||
# Lucian Muresan <lucianm@users.sourceforge.net>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vyacheslav Dikonov <sdiconov@mail.ru>, 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-09-30 09:48+0100\n"
|
||||
|
@ -1,12 +1,12 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Miha Setina <mihasetina@softhome.net>, 2000
|
||||
# Matjaz Thaler <matjaz.thaler@guest.arnes.si>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,12 +1,12 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomas Prybil <tomas@prybil.se>, 2002
|
||||
# Jan Ekholm <chakie@infa.abo.fi>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Oktay Yolgeçen <oktay_73@yahoo.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2008-05-12 22:34:4800\n"
|
||||
|
@ -1,5 +1,5 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
||||
@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-hello 2.2.0\n"
|
||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||
"PO-Revision-Date: 2009-01-23 09:48+0800\n"
|
||||
|
@ -79,3 +79,15 @@ VDR Plugin 'osddemo' Revision History
|
||||
- Fixed a vertical black line in the "TiledPixmaps" area on the rpihddevice OSD with
|
||||
1280x800 pixel (thanks to Thomas Reufer).
|
||||
- Added a demo case for storing images (thanks to Thomas Reufer).
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2020-10-12: Version 2.4.1
|
||||
|
||||
- Added test cases for alignment of semi-circles (press key '4').
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.2 2017/05/29 08:30:08 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
|
@ -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
|
||||
|
@ -3,13 +3,13 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: osddemo.c 4.3 2015/04/12 09:35:21 kls Exp $
|
||||
* $Id: osddemo.c 4.5 2020/10/14 20:32:41 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.3.1";
|
||||
static const char *VERSION = "2.4.1";
|
||||
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
||||
static const char *MAINMENUENTRY = "Osd Demo";
|
||||
|
||||
@ -136,6 +136,91 @@ void DrawImages(cOsd *Osd)
|
||||
Osd->Flush();
|
||||
}
|
||||
|
||||
// --- DrawEllipseAlignments -------------------------------------------------
|
||||
|
||||
void DrawEllipseAlignments(cOsd *Osd)
|
||||
{
|
||||
cFont *Font = cFont::CreateFont(Setup.FontOsd, 20);
|
||||
int xa = 0;
|
||||
int ya = 0;
|
||||
int xb = Osd->Width() - 1;
|
||||
int yb = Osd->Height() - 1;
|
||||
Osd->DrawRectangle(xa, ya, xb, yb, clrBlack);
|
||||
int d = 50;
|
||||
int a = d / 2 + 1;
|
||||
int t = a * 2;
|
||||
int n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d / 2, a + d - 1, t, clrGreen, 6);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d / 2, clrGreen, 8);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d / 2, a, t, a + d - 1, clrGreen, 7);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d / 2, a + d - 1, clrGreen, 5);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
t = d * 5;
|
||||
n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 2);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 3);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 3;
|
||||
t = d * 9;
|
||||
n = 30;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 1);
|
||||
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 4);
|
||||
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 12;
|
||||
t = d * 5;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 2);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 1);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
d = 50;
|
||||
a = d * 12;
|
||||
t = d * 9;
|
||||
n = 20;
|
||||
for (int i = 0; i < n; i++) {
|
||||
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 3);
|
||||
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 4);
|
||||
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||
a += d + 5;
|
||||
d++;
|
||||
}
|
||||
Osd->Flush();
|
||||
delete Font;
|
||||
}
|
||||
|
||||
// --- cLineGame -------------------------------------------------------------
|
||||
|
||||
class cLineGame : public cOsdObject {
|
||||
@ -590,6 +675,10 @@ eOSState cTrueColorDemo::ProcessKey(eKeys Key)
|
||||
SetArea();
|
||||
DrawImages(osd);
|
||||
break;
|
||||
case k4: Cancel(3);
|
||||
SetArea();
|
||||
DrawEllipseAlignments(osd);
|
||||
return osContinue;
|
||||
case kBack:
|
||||
case kOk: return osEnd;
|
||||
default: return state;
|
||||
|
@ -108,3 +108,15 @@ VDR Plugin 'pictures' Revision History
|
||||
|
||||
- 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.
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.2 2017/05/29 08:30:55 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
|
@ -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
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: pictures.c 4.2 2017/10/06 15:10:44 kls Exp $
|
||||
* $Id: pictures.c 5.1 2022/12/05 15:26:23 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -11,7 +11,7 @@
|
||||
#include "menu.h"
|
||||
#include "player.h"
|
||||
|
||||
static const char *VERSION = "2.3.2";
|
||||
static const char *VERSION = "2.6.1";
|
||||
static const char *DESCRIPTION = trNOOP("A simple picture viewer");
|
||||
static const char *MAINMENUENTRY = trNOOP("Pictures");
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: player.c 3.1 2014/02/08 12:48:12 kls Exp $
|
||||
* $Id: player.c 5.1 2022/12/05 15:26:23 kls Exp $
|
||||
*/
|
||||
|
||||
#include "player.h"
|
||||
@ -96,8 +96,10 @@ int cPictureControl::active = 0;
|
||||
cString cPictureControl::lastDisplayed;
|
||||
|
||||
cPictureControl::cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow)
|
||||
:cControl(player = new cPicturePlayer)
|
||||
:cControl(NULL)
|
||||
{
|
||||
player = new cPicturePlayer;
|
||||
SetPlayer(player);
|
||||
pictures = Pictures;
|
||||
pictureEntry = PictureEntry;
|
||||
osd = NULL;
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Patrice Staudt <patrice.staudt@laposte.net>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:22+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2009-12-08 12:41+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-02-19 00:48+0100\n"
|
||||
"PO-Revision-Date: 2018-02-19 00:53+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2008-03-14 00:45+0100\n"
|
||||
|
@ -1,11 +1,11 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-pictures 2.2.0\n"
|
||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||
"PO-Revision-Date: 2009-09-30 12:54+0100\n"
|
||||
|
@ -29,3 +29,11 @@ VDR Plugin 'servicedemo' Revision History
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.2 2017/05/29 08:31:07 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -17,7 +17,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ pr
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
|
@ -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
|
||||
|
@ -3,14 +3,14 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: svccli.c 3.2 2015/02/17 13:13:05 kls Exp $
|
||||
* $Id: svccli.c 4.1 2018/04/10 13:00:53 kls Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.2.0";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "Service demo client";
|
||||
static const char *MAINMENUENTRY = "Service demo";
|
||||
|
||||
|
@ -3,14 +3,14 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: svcsvr.c 3.2 2015/02/17 13:13:09 kls Exp $
|
||||
* $Id: svcsvr.c 4.1 2018/04/10 13:00:57 kls Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.2.0";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "Service demo server";
|
||||
|
||||
class cPluginSvcSvr : public cPlugin {
|
||||
|
@ -137,3 +137,27 @@ VDR Plugin 'skincurses' Revision History
|
||||
font drawing in high level OSDs (dummy for skincurses).
|
||||
- Fixed truncated date/time strings in the skins on multi-byte UTF-8 systems
|
||||
(reported by Sergey Chernyavskiy).
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2019-03-12: Version 2.4.1
|
||||
|
||||
- Changes for ncurses version 6 (thanks to Ulrick Eckhardt).
|
||||
|
||||
2020-05-11: Version 2.4.2
|
||||
|
||||
- Fixed 'Changes for ncurses version 6'.
|
||||
- Reacting to changes in screen size.
|
||||
- Simplified color handling.
|
||||
- Using 'stdscr' directly instead of an additional window.
|
||||
|
||||
2021-07-01: Version 2.4.3
|
||||
|
||||
- The number of errors (if any) of a recording is now displayed in the recording's
|
||||
Info menu.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.2 2017/05/29 08:31:02 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
|
@ -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
|
||||
|
@ -1,13 +1,13 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.2.0\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-15 16:07+0200\n"
|
||||
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
@ -19,6 +19,9 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Eine reine Text-Oberfläche"
|
||||
|
||||
msgid "errors"
|
||||
msgstr "Fehler"
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Stumm"
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Arthur Konovalov <artlov@gmail.com>, 2015
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.2.0\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
@ -19,6 +19,9 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstipõhine kest"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Hääletu"
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.2.0\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
||||
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
@ -19,6 +19,9 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstipohjainen ulkoasu"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Mykistys"
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.2.0\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2008-01-27 20:35+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
@ -19,6 +19,9 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Una interfaccia solo testo"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Muto"
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2010
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.2.0\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2010-02-22 18:18+0200\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
@ -19,6 +19,9 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstinis apvalkalas"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Išjungti garsą"
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.2.0\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-02-19 00:48+0100\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"
|
||||
@ -21,6 +21,9 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Skóra tekstowa"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Wycisz"
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.2.0\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2008-03-14 00:21+0100\n"
|
||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
@ -20,6 +20,9 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "¿àÞáâÞ âÕÚáâÞÒëÙ ØÝâÕàäÕÙá"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "²ëÚÛ. ÓàÞÜÚÞáâì"
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2015 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||
# This file is distributed under the same license as the VDR package.
|
||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-skincurses 2.2.0\n"
|
||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2015-02-08 11:16+0100\n"
|
||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||
"PO-Revision-Date: 2009-09-30 12:52+0100\n"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
@ -19,6 +19,9 @@ msgstr ""
|
||||
msgid "A text only skin"
|
||||
msgstr "Iba text vzhµadu"
|
||||
|
||||
msgid "errors"
|
||||
msgstr ""
|
||||
|
||||
msgid "Key$Mute"
|
||||
msgstr "Stlmi» zvuk"
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: skincurses.c 4.2 2016/12/22 14:09:09 kls Exp $
|
||||
* $Id: skincurses.c 5.1 2021/07/01 15:40:46 kls Exp $
|
||||
*/
|
||||
|
||||
#include <ncurses.h>
|
||||
@ -12,7 +12,7 @@
|
||||
#include <vdr/skins.h>
|
||||
#include <vdr/videodir.h>
|
||||
|
||||
static const char *VERSION = "2.3.2";
|
||||
static const char *VERSION = "2.4.3";
|
||||
static const char *DESCRIPTION = trNOOP("A text only skin");
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
@ -60,9 +60,7 @@ static int ScOsdHeight = 20;
|
||||
class cCursesOsd : public cOsd {
|
||||
private:
|
||||
WINDOW *savedRegion;
|
||||
WINDOW *window;
|
||||
enum { MaxColorPairs = 16 };
|
||||
int colorPairs[MaxColorPairs];
|
||||
cVector<int> colorPairs;
|
||||
void SetColor(int colorFg, int colorBg = clrBackground);
|
||||
public:
|
||||
cCursesOsd(int Left, int Top);
|
||||
@ -79,40 +77,34 @@ cCursesOsd::cCursesOsd(int Left, int Top)
|
||||
{
|
||||
savedRegion = NULL;
|
||||
|
||||
memset(colorPairs, 0x00, sizeof(colorPairs));
|
||||
start_color();
|
||||
leaveok(stdscr, true);
|
||||
refresh(); // to react on changes to screen size
|
||||
|
||||
window = subwin(stdscr, ScOsdHeight, ScOsdWidth, 0, 0);
|
||||
syncok(window, true);
|
||||
int begy, begx;
|
||||
int maxy, maxx;
|
||||
getmaxyx(stdscr, maxy, maxx);
|
||||
getbegyx(stdscr, begy, begx);
|
||||
ScOsdWidth = maxx - begx;
|
||||
ScOsdHeight = maxy - begy;
|
||||
}
|
||||
|
||||
cCursesOsd::~cCursesOsd()
|
||||
{
|
||||
if (window) {
|
||||
werase(window);
|
||||
Flush();
|
||||
delwin(window);
|
||||
window = NULL;
|
||||
}
|
||||
erase();
|
||||
Flush();
|
||||
}
|
||||
|
||||
void cCursesOsd::SetColor(int colorFg, int colorBg)
|
||||
{
|
||||
int color = (colorBg << 16) | colorFg | 0x80000000;
|
||||
for (int i = 0; i < MaxColorPairs; i++) {
|
||||
if (!colorPairs[i]) {
|
||||
colorPairs[i] = color;
|
||||
init_pair(i + 1, colorFg, colorBg);
|
||||
//XXX??? attron(COLOR_PAIR(WHITE_ON_BLUE));
|
||||
wattrset(window, COLOR_PAIR(i + 1));
|
||||
break;
|
||||
}
|
||||
else if (color == colorPairs[i]) {
|
||||
wattrset(window, COLOR_PAIR(i + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
int i = colorPairs.IndexOf(color);
|
||||
if (i < 0) {
|
||||
colorPairs.Append(color);
|
||||
i = colorPairs.Size() - 1;
|
||||
init_pair(i + 1, colorFg, colorBg);
|
||||
}
|
||||
attrset(COLOR_PAIR(i + 1));
|
||||
}
|
||||
|
||||
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||
@ -122,13 +114,14 @@ void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||
savedRegion = NULL;
|
||||
}
|
||||
savedRegion = newwin(y2 - y1 + 1, x2 - x1 + 1, y1, x1);
|
||||
copywin(window, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
||||
if (savedRegion)
|
||||
copywin(stdscr, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
||||
}
|
||||
|
||||
void cCursesOsd::RestoreRegion(void)
|
||||
{
|
||||
if (savedRegion) {
|
||||
copywin(savedRegion, window, 0, 0, savedRegion->_begy, savedRegion->_begx, savedRegion->_maxy - savedRegion->_begy, savedRegion->_maxx - savedRegion->_begx, false);
|
||||
overwrite(savedRegion, stdscr);
|
||||
delwin(savedRegion);
|
||||
savedRegion = NULL;
|
||||
}
|
||||
@ -168,18 +161,22 @@ void cCursesOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Co
|
||||
}
|
||||
}
|
||||
SetColor(ColorFg, ColorBg);
|
||||
wmove(window, y, x); // ncurses wants 'y' before 'x'!
|
||||
waddnstr(window, s, Width ? Width : ScOsdWidth - x);
|
||||
mvaddnstr(y, x, s, Width ? Width : ScOsdWidth - x);
|
||||
}
|
||||
|
||||
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
|
||||
{
|
||||
SetColor(Color, Color);
|
||||
for (int y = y1; y <= y2; y++) {
|
||||
wmove(window, y, x1); // ncurses wants 'y' before 'x'!
|
||||
whline(window, ' ', x2 - x1 + 1);
|
||||
}
|
||||
wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work
|
||||
int dx = x2 - x1;
|
||||
int dy = y2 - y1;
|
||||
if (dx >= dy) {
|
||||
for (int y = y1; y <= y2; y++)
|
||||
mvhline(y, x1, ' ', dx + 1);
|
||||
}
|
||||
else {
|
||||
for (int x = x1; x <= x2; x++)
|
||||
mvvline(y1, x, ' ', dy + 1);
|
||||
}
|
||||
}
|
||||
|
||||
void cCursesOsd::Flush(void)
|
||||
@ -450,9 +447,18 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
|
||||
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
|
||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||
y += ts.Height();
|
||||
int xt = ScOsdWidth;
|
||||
if (Info->GetEvent()->ParentalRating()) {
|
||||
cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
|
||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||
int w = Utf8StrLen(buffer);
|
||||
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
|
||||
xt -= w + 1;
|
||||
}
|
||||
if (Info->Errors() > 0) {
|
||||
cString buffer = cString::sprintf(" %d %s ", Info->Errors(), tr("errors"));
|
||||
int w = Utf8StrLen(buffer);
|
||||
osd->DrawText(xt - w, y, buffer, clrBlack, clrYellow, &Font);
|
||||
xt -= w + 1;
|
||||
}
|
||||
y += 1;
|
||||
const char *Title = Info->Title();
|
||||
@ -827,12 +833,8 @@ bool cPluginSkinCurses::ProcessArgs(int argc, char *argv[])
|
||||
bool cPluginSkinCurses::Initialize(void)
|
||||
{
|
||||
// Initialize any background activities the plugin shall perform.
|
||||
WINDOW *w = initscr();
|
||||
if (w) {
|
||||
ScOsdWidth = w->_maxx - w->_begx + 1;
|
||||
ScOsdHeight = w->_maxy - w->_begy + 1;
|
||||
if (initscr())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -68,3 +68,18 @@ VDR Plugin 'status' Revision History
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2025-02-10: Version 2.6.1
|
||||
|
||||
- Added cStatus::OsdItem2().
|
||||
- Activated logging of OsdItem2().
|
||||
- Added cStatus::OsdCurrentItem2().
|
||||
- Added cStatus::OsdStatusMessage2().
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.2 2017/05/29 08:30:32 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
|
@ -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
|
||||
|
@ -3,13 +3,13 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: status.c 3.2 2015/02/17 13:13:21 kls Exp $
|
||||
* $Id: status.c 5.4 2025/02/12 21:18:53 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/status.h>
|
||||
|
||||
static const char *VERSION = "2.2.0";
|
||||
static const char *VERSION = "2.6.1";
|
||||
static const char *DESCRIPTION = "Status monitor test";
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
@ -27,10 +27,10 @@ protected:
|
||||
virtual void SetSubtitleTrack(int Index, const char * const *Tracks);
|
||||
virtual void OsdClear(void);
|
||||
virtual void OsdTitle(const char *Title);
|
||||
virtual void OsdStatusMessage(const char *Message);
|
||||
virtual void OsdStatusMessage2(eMessageType Type, const char *Message);
|
||||
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
|
||||
virtual void OsdItem(const char *Text, int Index);
|
||||
virtual void OsdCurrentItem(const char *Text);
|
||||
virtual void OsdItem2(const char *Text, int Index, bool Selectable);
|
||||
virtual void OsdCurrentItem2(const char *Text, int Index);
|
||||
virtual void OsdTextItem(const char *Text, bool Scroll);
|
||||
virtual void OsdChannel(const char *Text);
|
||||
virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
|
||||
@ -86,9 +86,9 @@ void cStatusTest::OsdTitle(const char *Title)
|
||||
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdStatusMessage(const char *Message)
|
||||
void cStatusTest::OsdStatusMessage2(eMessageType Type, const char *Message)
|
||||
{
|
||||
dsyslog("status: cStatusTest::OsdStatusMessage '%s'", Message);
|
||||
dsyslog("status: cStatusTest::OsdStatusMessage2 %d '%s'", Type, Message);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||
@ -96,14 +96,14 @@ void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Ye
|
||||
dsyslog("status: cStatusTest::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdItem(const char *Text, int Index)
|
||||
void cStatusTest::OsdItem2(const char *Text, int Index, bool Selected)
|
||||
{
|
||||
//dsyslog("status: cStatusTest::OsdItem %s %d", Text, Index);
|
||||
dsyslog("status: cStatusTest::OsdItem2 %s %d %d", Text, Index, Selected);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdCurrentItem(const char *Text)
|
||||
void cStatusTest::OsdCurrentItem2(const char *Text, int Index)
|
||||
{
|
||||
dsyslog("status: cStatusTest::OsdCurrentItem %s", Text);
|
||||
dsyslog("status: cStatusTest::OsdCurrentItem %s %d", Text, Index);
|
||||
}
|
||||
|
||||
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
||||
|
@ -33,3 +33,11 @@ VDR Plugin 'svdrpdemo' Revision History
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Official release.
|
||||
|
||||
2021-12-27: Version 2.6.0
|
||||
|
||||
- Official release.
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 4.2 2017/05/29 08:30:42 kls Exp $
|
||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -16,7 +16,8 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
|
@ -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
|
||||
|
@ -3,12 +3,12 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: svdrpdemo.c 3.2 2015/02/17 13:13:29 kls Exp $
|
||||
* $Id: svdrpdemo.c 4.1 2018/04/10 13:01:07 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "2.2.0";
|
||||
static const char *VERSION = "2.4.0";
|
||||
static const char *DESCRIPTION = "How to add SVDRP support to a plugin";
|
||||
|
||||
class cPluginSvdrpdemo : public cPlugin {
|
||||
|
4
README
4
README
@ -4,7 +4,7 @@ Video Disk Recorder ('VDR')
|
||||
These files contain the source code of the "Video Disk Recorder",
|
||||
which is based on the DVB driver of the LinuxTV project (http://linuxtv.org).
|
||||
For details about the "Video Disk Recorder" project please
|
||||
refer to http://www.tvdr.de.
|
||||
refer to https://www.tvdr.de.
|
||||
|
||||
Please see the INSTALL file for details on how to install
|
||||
this program on your computer.
|
||||
@ -33,7 +33,7 @@ the ones in this system, but here we have the full source code
|
||||
and can modify the menus in whatever way desired.
|
||||
|
||||
If you actually use VDR, please add yourself to the "VDR User Counter"
|
||||
at http://www.tvdr.de/counter.htm. You can also like VDR on facebook
|
||||
at https://www.tvdr.de/counter.htm. You can also like VDR on facebook
|
||||
at https://www.facebook.com/VideoDiskRecorder.
|
||||
|
||||
|
||||
|
@ -10,7 +10,7 @@ Plugins:
|
||||
- Implemented a universal plugin interface. See the file PLUGINS.html
|
||||
for a detailed description. The man page vdr(1) describes the new options '-L'
|
||||
and '-P' used to load plugins.
|
||||
See http://www.tvdr.de/plugins.htm for a list of available plugins.
|
||||
See https://www.tvdr.de/plugins.htm for a list of available plugins.
|
||||
- Rearranged the remote control key handling to allow plugins to implement
|
||||
additional types of remote controls (see PLUGINS.html, section "Remote Control").
|
||||
The previously used files 'keys.conf' and 'keys-pc.conf' have been replaced
|
||||
|
@ -224,7 +224,7 @@ OSD:
|
||||
- The OSD size is now automatically adjusted to the actual video display
|
||||
(provided the output device implements the GetOsdSize() function).
|
||||
- The OSD now has full TrueColor support. There can be several "pixmaps" that can
|
||||
be overlayed with alpha blending. All existing skins should work out of the box
|
||||
be overlaid with alpha blending. All existing skins should work out of the box
|
||||
with the TrueColor OSD - the only exception being cOsd::GetBitmap(). Since the
|
||||
TrueColor OSD doesn't use bitmaps, this function will return a dummy bitmap, which
|
||||
may not be what the plugin expects. As long as this bitmap is only used for setting
|
||||
|
@ -408,7 +408,7 @@ Misc:
|
||||
- Updated sources.conf to reflect the fact that Astra 4A and SES5 are actually in
|
||||
two separate positions.
|
||||
- Fixed cMarks::GetNextBegin() and cMarks::GetNextEnd(). The behavior of these two
|
||||
functions is now exacly as described in the header file. Editing marks that are
|
||||
functions is now exactly as described in the header file. Editing marks that are
|
||||
placed at exactly the same offset in a recording are now preserved in the cutting
|
||||
process.
|
||||
- The new command line option --chartab can be used to set the default character
|
||||
|
@ -56,7 +56,7 @@ Conditional Access:
|
||||
there is more than one CAM in the system.
|
||||
The file 'cam.data' is not written if it is read-only.
|
||||
- The mechanism of trying different CAMs when switching to an encrypted channel is
|
||||
now only triggered if there acually is more than one CAM in the system.
|
||||
now only triggered if there actually is more than one CAM in the system.
|
||||
- CAMs that can handle multiple devices at the same time can now indicate this
|
||||
by creating the first cCamSlot as usual, and every other cCamSlot by giving
|
||||
it the first one as its "MasterSlot". To VDR this means that when searching
|
||||
@ -79,7 +79,7 @@ Conditional Access:
|
||||
- CAMs are now sent a generated EIT packet that contains a single 'present event' for
|
||||
the current SID, in order to avoid any parental rating dialogs.
|
||||
- When selecting a device/CAM combination for live viewing, CAMs that are known to
|
||||
decrypt the requested channel are now given a higher priority than prefering the
|
||||
decrypt the requested channel are now given a higher priority than preferring the
|
||||
primary device.
|
||||
- Extended the CI API to allow plugins to implement additional CAM resources.
|
||||
- The new configuration file 'camresponses.conf' can be used to define automatic
|
||||
@ -265,6 +265,8 @@ EPG:
|
||||
made for such an event.
|
||||
- Changed the default return value of cEpgHandler::BeginSegmentTransfer() to true, to
|
||||
avoid problems with derived classes that don't implement this function.
|
||||
- The EIT filter no longer parses data from "other TS", to avoid problems with
|
||||
broadcasters who transmit faulty EIT data.
|
||||
|
||||
OSD:
|
||||
|
||||
@ -400,7 +402,7 @@ Misc:
|
||||
buried under tons of text.
|
||||
Add VERBOSE=1 to the 'make' call in the VDR source directory to see the
|
||||
actual commands that are executed.
|
||||
Plugin authors should modify their makefiles accordingly, by simply preceeding
|
||||
Plugin authors should modify their makefiles accordingly, by simply preceding
|
||||
the respective commands with '$(Q)' and inserting '@echo XX $@' (where XX is one
|
||||
of the character combinations listed above) before the command.
|
||||
The newplugin script has also been modified accordingly.
|
||||
|
119
UPDATE-2.6.0
Normal file
119
UPDATE-2.6.0
Normal file
@ -0,0 +1,119 @@
|
||||
This is a summary of the changes in VDR 2.6.0 since the last stable
|
||||
version 2.4.0. It only contains things that are of actual importance
|
||||
to the user and doesn't mention the many fixes and improvements that
|
||||
have been made "behind the scenes".
|
||||
|
||||
See the file HISTORY for a detailed list of all changes.
|
||||
|
||||
Timers:
|
||||
|
||||
- Implemented "Pattern Timers" (see MANUAL, vdr.1 and vdr.5 for details).
|
||||
- The margins for timer recordings are now always limited to the duration of the
|
||||
previous and next event.
|
||||
- Spawned timers that don't use VPS now automatically adjust their start/stop times
|
||||
to changes in the respective event's times.
|
||||
|
||||
EPG:
|
||||
|
||||
- Events in the past are no longer marked as having a timer in the Schedules
|
||||
menu.
|
||||
- Improved handling EPG data from the EIT tables:
|
||||
+ Table 0x4F is now completely ignored.
|
||||
+ Once a schedule has seen events from 0x5X, tables 0x6X are ignored for that
|
||||
schedule.
|
||||
+ When looking up an event in its schedule, the start time is used for tables 0x6X, and the
|
||||
event id for tables 0x4E and 0x5X.
|
||||
+ When hashing events by event id or start time, existing older entries in the hash
|
||||
tables are now deleted before entering the new ones.
|
||||
+ The function cSchedule::GetEvent() is now deprecated and may be removed in a future
|
||||
version. Use GetEventById() and GetEventByTime() instead.
|
||||
+ On channels that use proper event ids a change of the start time no longer
|
||||
causes a new event to be created, but rather modifies the existing one. This
|
||||
avoids possible interruptions in VPS recordings in case the event's start time
|
||||
is changed while the recording is already going on.
|
||||
- Fixed the timer indicator in the Schedule menu in case an event is already over, but the
|
||||
timer is still recording.
|
||||
- Fixed unlocking vs. call to EpgHandlers.EndSegmentTransfer().
|
||||
|
||||
Devices:
|
||||
|
||||
- Increased the number of possible modulation systems in cDevice::GetDevice().
|
||||
- Improved cSectionSyncer to make sure that no sections are missed, and to allow
|
||||
handling partially used segments (as in the EIT) and processing sections in random
|
||||
order. Segment syncing is now done with the two member functions Check() and
|
||||
Processed(). The old functions Sync() and Repeat() are deprecated and may be
|
||||
removed in a future version. See the comments in filter.h for a description on
|
||||
how to use these new function.
|
||||
- Added a device hook for detecting whether a device provides EIT data.
|
||||
|
||||
Recordings:
|
||||
|
||||
- Made the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public.
|
||||
- Fixed setting the 'title' of a recording's info to the recording's name if there
|
||||
is no info file (the change in version 1.7.28 broke the fallback to the old 'summary.vdr').
|
||||
- Added some missing user command calls for copying, renaming and moving recordings.
|
||||
- Recordings are now checked for errors:
|
||||
+ On TS level, the continuity counter, transport error indicator and scramble flags are
|
||||
checked.
|
||||
+ On frame level it is checked whether there are no gaps in the PTS.
|
||||
+ The number of errors during a recording is stored in the recording's 'info' file, with
|
||||
the new tag 'O'.
|
||||
+ Spawned timers that shall avoid recording reruns only store the recording's name in
|
||||
the donerecs,data file if there were no errors during recording, and if the timer has
|
||||
actually finished.
|
||||
- The Recordings menu now marks recordings with errors with an exclamation mark ('!'),
|
||||
and the number of errors (if any) is displayed in the recording's Info menu.
|
||||
|
||||
Replay:
|
||||
|
||||
- Fixed scaling subtitles with anti-aliasing.
|
||||
|
||||
Conditional Access:
|
||||
|
||||
- Decreased the scrambling timeout for CAMs known to decrypt a certain channel, so
|
||||
that it won't collide with MAXBROKENTIMEOUT in recorder.c.
|
||||
|
||||
Skins:
|
||||
|
||||
- The new functions cTimer::Start/StopTimeEvent() are now used in the LCARS skin to display
|
||||
the start/stop times of timers in the main menu.
|
||||
|
||||
SVDRP:
|
||||
|
||||
- The SVDRP command DELC now also accepts a channel id.
|
||||
|
||||
Misc:
|
||||
|
||||
- Added support for HEVC-video and AC-4-audio.
|
||||
- EXPIRELATENCY now only applies to VPS timers.
|
||||
- Removed the macros __STL_CONFIG_H, _STL_ALGOBASE_H and _MOVE_H from tools.h. If your
|
||||
plugin insists in using "using namespace std;" you can still define
|
||||
DISABLE_TEMPLATES_COLLIDING_WITH_STL before including any VDR header files.
|
||||
- The cFile class has been partially deprecated:
|
||||
+ The handling of file handles was not thread-safe.
|
||||
+ It was only actually used in svdrp.c.
|
||||
+ cFile::Ready() now processes only its own file descriptor by calling FileReady()
|
||||
instead of AnyFileReady().
|
||||
- The transponder value of channels is now cached, because cChannel::Transponder(void)
|
||||
is called very often.
|
||||
- Added code for the 'qad' audio track.
|
||||
- The 'Edit path' dialog now also shows the total size of all recordings in that path.
|
||||
- The macro DEPRECATED_VDR_CHARSET_OVERRIDE and the related code has been removed.
|
||||
- The default for DEPRECATED_SETCURRENTCHANNEL has been set to 0, which means that
|
||||
the function SetCurrentChannel(const cChannel *Channel) is no longer available.
|
||||
You can add 'DEPRECATED_SETCURRENTCHANNEL=1' when compiling in order to restore this
|
||||
functionality. However, it is recommended to use SetCurrentChannel(int ChannelNumber)
|
||||
instead.
|
||||
- The macro DEPRECATED_GETBITMAP and the related code has been removed.
|
||||
- The default for DEPRECATED_SKIN_SETITEMEVENT has been set to 0, which means that
|
||||
the function cSkinDisplayMenu::SetItemEvent() without the TimerActive parameter is
|
||||
no longer available. You can add 'DEPRECATED_SKIN_SETITEMEVENT=1' when compiling in
|
||||
order to restore this functionality. However, it is recommended to use the function
|
||||
with the TimerActive parameter instead.
|
||||
- Now using __cplusplus instead of DISABLE_TEMPLATES_COLLIDING_WITH_STL, and using
|
||||
std::min(), std::max() and std::swap() if available.
|
||||
- No longer permanently looping through PMT PIDs, which caused problems with some
|
||||
SatIP receivers.
|
||||
- Replaced all umlauts in the example channels.conf with their ae, oe, ue substitutes
|
||||
to avoid problems on UTF-8 systems.
|
||||
- Added missing '0x09=H.265 video, 0x19 = AC4 audio' to vdr.5.
|
96
channels.c
96
channels.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: channels.c 4.5 2017/06/10 15:08:56 kls Exp $
|
||||
* $Id: channels.c 5.3 2024/03/02 16:21:16 kls Exp $
|
||||
*/
|
||||
|
||||
#include "channels.h"
|
||||
@ -97,23 +97,32 @@ cChannel& cChannel::operator= (const cChannel &Channel)
|
||||
provider = strcpyrealloc(provider, Channel.provider);
|
||||
portalName = strcpyrealloc(portalName, Channel.portalName);
|
||||
memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__);
|
||||
nameSource = NULL; // these will be recalculated automatically
|
||||
nameSourceMode = 0;
|
||||
shortNameSource = NULL;
|
||||
UpdateNameSource();
|
||||
parameters = Channel.parameters;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void cChannel::UpdateNameSource(void)
|
||||
{
|
||||
if (Setup.ShowChannelNamesWithSource == 0) {
|
||||
nameSource = NULL;
|
||||
shortNameSource = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Setup.ShowChannelNamesWithSource == 1)
|
||||
nameSource = cString::sprintf("%s (%c)", name, cSource::ToChar(source));
|
||||
else
|
||||
nameSource = cString::sprintf("%s (%s)", name, *cSource::ToString(source));
|
||||
|
||||
shortNameSource = cString::sprintf("%s (%c)", shortName, cSource::ToChar(source));
|
||||
}
|
||||
|
||||
const char *cChannel::Name(void) const
|
||||
{
|
||||
if (Setup.ShowChannelNamesWithSource && !groupSep) {
|
||||
if (isempty(nameSource) || nameSourceMode != Setup.ShowChannelNamesWithSource) {
|
||||
if (Setup.ShowChannelNamesWithSource == 1)
|
||||
nameSource = cString::sprintf("%s (%c)", name, cSource::ToChar(source));
|
||||
else
|
||||
nameSource = cString::sprintf("%s (%s)", name, *cSource::ToString(source));
|
||||
}
|
||||
return nameSource;
|
||||
if (!isempty(nameSource))
|
||||
return nameSource;
|
||||
}
|
||||
return name;
|
||||
}
|
||||
@ -123,9 +132,8 @@ const char *cChannel::ShortName(bool OrName) const
|
||||
if (OrName && isempty(shortName))
|
||||
return Name();
|
||||
if (Setup.ShowChannelNamesWithSource && !groupSep) {
|
||||
if (isempty(shortNameSource))
|
||||
shortNameSource = cString::sprintf("%s (%c)", shortName, cSource::ToChar(source));
|
||||
return shortNameSource;
|
||||
if (!isempty(shortNameSource))
|
||||
return shortNameSource;
|
||||
}
|
||||
return shortName;
|
||||
}
|
||||
@ -145,15 +153,18 @@ int cChannel::Transponder(int Frequency, char Polarization)
|
||||
|
||||
int cChannel::Transponder(void) const
|
||||
{
|
||||
int tf = frequency;
|
||||
while (tf > 20000)
|
||||
tf /= 1000;
|
||||
if (IsSat()) {
|
||||
const char *p = strpbrk(parameters, "HVLRhvlr"); // lowercase for backwards compatibility
|
||||
if (p)
|
||||
tf = Transponder(tf, *p);
|
||||
if (!transponder) {
|
||||
int tf = frequency;
|
||||
while (tf > 20000)
|
||||
tf /= 1000;
|
||||
if (IsSat()) {
|
||||
const char *p = strpbrk(parameters, "HVLRhvlr"); // lowercase for backwards compatibility
|
||||
if (p)
|
||||
tf = Transponder(tf, *p);
|
||||
}
|
||||
transponder = tf;
|
||||
}
|
||||
return tf;
|
||||
return transponder;
|
||||
}
|
||||
|
||||
int cChannel::Modification(int Mask) const
|
||||
@ -167,6 +178,7 @@ void cChannel::CopyTransponderData(const cChannel *Channel)
|
||||
{
|
||||
if (Channel) {
|
||||
frequency = Channel->frequency;
|
||||
transponder = Channel->transponder;
|
||||
source = Channel->source;
|
||||
srate = Channel->srate;
|
||||
parameters = Channel->parameters;
|
||||
@ -195,12 +207,11 @@ bool cChannel::SetTransponderData(int Source, int Frequency, int Srate, const ch
|
||||
cString OldTransponderData = TransponderDataToString();
|
||||
source = Source;
|
||||
frequency = Frequency;
|
||||
transponder = 0;
|
||||
srate = Srate;
|
||||
parameters = Parameters;
|
||||
schedule = NULL;
|
||||
nameSource = NULL;
|
||||
nameSourceMode = 0;
|
||||
shortNameSource = NULL;
|
||||
UpdateNameSource();
|
||||
if (Number() && !Quiet) {
|
||||
dsyslog("changing transponder data of channel %d (%s) from %s to %s", Number(), name, *OldTransponderData, *TransponderDataToString());
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
@ -265,15 +276,12 @@ bool cChannel::SetName(const char *Name, const char *ShortName, const char *Prov
|
||||
dsyslog("changing name of channel %d from '%s,%s;%s' to '%s,%s;%s'", Number(), name, shortName, provider, Name, ShortName, Provider);
|
||||
modification |= CHANNELMOD_NAME;
|
||||
}
|
||||
if (nn) {
|
||||
if (nn)
|
||||
name = strcpyrealloc(name, Name);
|
||||
nameSource = NULL;
|
||||
nameSourceMode = 0;
|
||||
}
|
||||
if (ns) {
|
||||
if (ns)
|
||||
shortName = strcpyrealloc(shortName, ShortName);
|
||||
shortNameSource = NULL;
|
||||
}
|
||||
if (nn || ns)
|
||||
UpdateNameSource();
|
||||
if (np)
|
||||
provider = strcpyrealloc(provider, Provider);
|
||||
return true;
|
||||
@ -655,6 +663,7 @@ bool cChannel::Parse(const char *s)
|
||||
if (parambuf && sourcebuf && vpidbuf && apidbuf) {
|
||||
parameters = parambuf;
|
||||
ok = (source = cSource::FromString(sourcebuf)) >= 0;
|
||||
transponder = 0;
|
||||
|
||||
char *p;
|
||||
if ((p = strchr(vpidbuf, '=')) != NULL) {
|
||||
@ -798,9 +807,7 @@ bool cChannel::Parse(const char *s)
|
||||
free(tpidbuf);
|
||||
free(caidbuf);
|
||||
free(namebuf);
|
||||
nameSource = NULL;
|
||||
nameSourceMode = 0;
|
||||
shortNameSource = NULL;
|
||||
UpdateNameSource();
|
||||
if (!GetChannelID().Valid()) {
|
||||
esyslog("ERROR: channel data results in invalid ID!");
|
||||
return false;
|
||||
@ -946,6 +953,25 @@ void cChannels::ReNumber(void)
|
||||
}
|
||||
}
|
||||
|
||||
bool cChannels::MoveNeedsDecrement(cChannel *From, cChannel *To)
|
||||
{
|
||||
int Number = From->Number();
|
||||
if (Number < To->Number()) {
|
||||
for (cChannel *Channel = Next(From); Channel; Channel = Next(Channel)) {
|
||||
if (Channel == To)
|
||||
break;
|
||||
if (Channel->GroupSep()) {
|
||||
if (Channel->Number() > Number)
|
||||
Number = Channel->Number();
|
||||
}
|
||||
else
|
||||
Number++;
|
||||
}
|
||||
return Number == To->Number();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void cChannels::Del(cChannel *Channel)
|
||||
{
|
||||
UnhashChannel(Channel);
|
||||
|
229
channels.conf
229
channels.conf
@ -1,85 +1,162 @@
|
||||
RTL Television,RTL;RTL World:12187:HC34M2S0:S19.2E:27500:163=2:104=deu@3;106=deu@106:105;110=deu:0:12003:1:1089:0
|
||||
RTL Television,RTL;CBC:12187:HC34M2S0:S19.2E:27500:163=2:104=deu@3;106=deu@106:105;110=deu:0:12003:1:1089:0
|
||||
SAT.1;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:255=2:256=deu@3;259=deu@106:32:0:17500:1:1107:0
|
||||
ProSieben;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:511=2:512=deu@3;515=deu@106:33:0:17501:1:1107:0
|
||||
RTL2;RTL World:12187:HC34M2S0:S19.2E:27500:166=2:128=deu@3:68:0:12020:1:1089:0
|
||||
RTL2;CBC:12187:HC34M2S0:S19.2E:27500:166=2:128=deu@3:68;75=deu:0:12020:1:1089:0
|
||||
:ARD und ZDF
|
||||
Das Erste HD;ARD:11493:HC23M5O35P0S1:S19.2E:22000:5101=27:5102=deu@3,5103=mis@3;5106=deu@106:5104;5105=deu:0:10301:1:1019:0
|
||||
ZDF HD;ZDFvision:11362:HC23M5O35P0S1:S19.2E:22000:6110=27:6120=deu@3,6121=mis@3,6123=mul@3;6122=deu@106:6130;6131=deu:0:11110:1:1011:0
|
||||
BR Süd HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5201=27:5202=deu@3,5203=mis@3;5206=deu@106:5204:0:10325:1:1025:0
|
||||
hr-fernsehen;ARD:11836:HC34M2S0:S19.2E:27500:301=2:302=deu@3,303=mis@3:304:0:28108:1:1101:0
|
||||
NDR FS MV HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5221=27:5222=deu@3,5223=mis@3;5226=deu@106:5224;5225=deu:0:10328:1:1025:0
|
||||
SR Fernsehen;ARD:12265:HC34M2S0:S19.2E:27500:1301=2:1302=deu@3,1303=mis@3:1304:0:28486:1:1093:0
|
||||
WDR HD Köln;ARD:12422:HC34M2S0:S19.2E:27500:5501=27:5502=deu@3,5503=mis@3;5506=deu@106:5504:0:28325:1:1201:0
|
||||
:Dritte Programme
|
||||
BR Fernsehen Sued HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5201=27:5202=deu@3,5203=mis@3;5206=deu@106:5204;5205=deu:0:10325:1:1025:0
|
||||
hr-fernsehen HD;ARD:10891:HC23M5O35P0S1:S19.2E:22000:5351=27:5352=deu@3,5353=mis@3;5356=deu@106:5354;5355=deu:0:10355:1:1061:0
|
||||
NDR FS NDS HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5221=27:5222=deu@3,5223=mis@3;5226=deu@106:5224;5225=deu:0:10327:1:1025:0
|
||||
WDR HD Koeln;ARD:12422:HC34M2S0:S19.2E:27500:5501=27:5502=deu@3,5503=mis@3;5506=deu@106:5504;5505=deu:0:28325:1:1201:0
|
||||
SWR BW HD;ARD:11493:HC23M5O35P0S1:S19.2E:22000:5121=27:5122=deu@3,5123=mis@3;5126=deu@106:5124;5125=deu:0:10303:1:1019:0
|
||||
rbb Berlin;ARD:12109:HC34M2S0:S19.2E:27500:601=2:602=deu@3,603=mis@3:604:0:28206:1:1073:0
|
||||
rbb Berlin HD;ARD:10891:HC23M5O35P0S1:S19.2E:22000:5311=27:5312=deu@3,5313=mis@3;5316=deu@106:5314;5315=deu:0:10351:1:1061:0
|
||||
MDR Sachsen HD;ARD:10891:HC23M5O35P0S1:S19.2E:22000:5331=27:5332=deu@3,5333=mis@3;5336=deu@106:5334;5335=deu:0:10352:1:1061:0
|
||||
PHOENIX HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5261=27:5262=deu@3,5263=mul@3:5264:0:10331:1:1025:0
|
||||
BR-alpha;ARD:12265:HC34M2S0:S19.2E:27500:1401=2:1402=deu@3,1403=mis@3;1406=deu@106:1404:0:28487:1:1093:0
|
||||
ARD-alpha;ARD:12265:HC34M2S0:S19.2E:27500:1401=2:1402=deu@3,1403=mis@3;1406=deu@106:1404;1405=deu:0:28487:1:1093:0
|
||||
3sat HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6510=27:6520=deu@3,6521=mis@3,6523=mul@3;6522=deu@106:6530;6531=deu:0:11150:1:1010:0
|
||||
arte HD;ARD:11493:HC23M5O35P0S1:S19.2E:22000:5111=27:5112=deu@3,5113=fra@3;5116=deu@106:5114;5115=deu,5118=fra:0:10302:1:1019:0
|
||||
MDR Sachsen;ARD:12109:HC34M2S0:S19.2E:27500:2901=2:2902=deu@3,2903=mis@3:2904:0:28228:1:1073:0
|
||||
ServusTV HD Oesterreich;ServusTV:11303:HC23M5O35P0S1:S19.2E:22000:3583=27:3584=deu@4,3585=eng@4;3586=deu@122,3587=deu@106:3588:0:4913:1:1007:0
|
||||
N24;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1023=2:1024=deu@3:35:0:17503:1:1107:0
|
||||
Das Erste;ARD:11836:HC34M2S0:S19.2E:27500:101=2:102=deu@3,103=mis@3;106=deu@106:104;105=deu:0:28106:1:1101:0
|
||||
Bayerisches FS Süd;ARD:11836:HC34M2S0:S19.2E:27500:201=2:202=deu@3,203=mis@3;206=deu@106:204:0:28107:1:1101:0
|
||||
NDR FS MV;ARD:12109:HC34M2S0:S19.2E:27500:2601=2:2602=deu@3,2603=mis@3:2604:0:28224:1:1073:0
|
||||
WDR Köln;ARD:11836:HC34M2S0:S19.2E:27500:601=2:602=deu@3,603=mis@3:604:0:28111:1:1101:0
|
||||
SWR Fernsehen BW;ARD:11836:HC34M2S0:S19.2E:27500:801=2:802=deu@3,803=mis@3;806=deu@106:804:0:28113:1:1101:0
|
||||
PHOENIX;ARD:10744:HC56M2S0:S19.2E:22000:501=2:502=deu@3,503=mul@3:504:0:28725:1:1051:0
|
||||
ZDF;ZDFvision:11953:HC34M2S0:S19.2E:27500:110=2:120=deu@3,121=mis@3,122=mul@3;125=deu@106:130;131=deu:0:28006:1:1079:0
|
||||
3sat;ZDFvision:11953:HC34M2S0:S19.2E:27500:210=2:220=deu@3,221=mis@3,222=mul@3;225=deu@106:230;231=deu:0:28007:1:1079:0
|
||||
KiKA HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6610=27:6620=deu@3,6621=mis@3;6622=deu@106:6630:0:11160:1:1010:0
|
||||
KiKA;ZDFvision:11953:HC34M2S0:S19.2E:27500:310=2:320=deu@3,321=mis@3;325=deu@106:330:0:28008:1:1079:0
|
||||
arte;ARD:10744:HC56M2S0:S19.2E:22000:401=2:402=deu@3,403=fra@3:404:0:28724:1:1051:0
|
||||
ORF1 HD;ORF:11303:HC23M5O35P0S1:S19.2E:22000:1920=27:1921=deu@4,1922=eng@4;1923=deu@106:1925:D05,D95,648,1702,1833,9C4,98C:4911:1:1007:0
|
||||
ORF1;ORF:12692:HC56M2S0:S19.2E:22000:160=2:161=deu@3;163=deu@106:165:D05,D95,648,1702,1833,9C4,98C:13001:1:1117:0
|
||||
ORF2 HD;ORF:11303:HC23M5O35P0S1:S19.2E:22000:2920=27:2921=deu@4,2922=eng@4;2923=deu@106:2925:D05,D95,648,1702,1833,9C4,98C:4912:1:1007:0
|
||||
ORF2;ORF:12692:HC56M2S0:S19.2E:22000:500=2:501=deu@3;503=deu@106:505:D95,D05,648,1702,1833,9C4,98C:13002:1:1117:0
|
||||
ZDFinfo HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6710=27:6720=deu@3,6721=mis@3,6723=mul@3;6722=deu@106:6730:0:11170:1:1010:0
|
||||
ZDFinfo;ZDFvision:11953:HC34M2S0:S19.2E:27500:610=2:620=deu@3,621=mis@3,622=mul@3;625=deu@106:630:0:28011:1:1079:0
|
||||
CNN Int.;CNN:11778:VC34M2S0:S19.2E:27500:165=2:100=eng@3:0:0:28522:1:1068:0
|
||||
SUPER RTL;RTL World:12187:HC34M2S0:S19.2E:27500:165=2:120=deu@3:65:0:12040:1:1089:0
|
||||
VOX;RTL World:12187:HC34M2S0:S19.2E:27500:167=2:136=deu@3:71;74=deu:0:12060:1:1089:0
|
||||
kabel eins;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:767=2:768=deu@3:34:0:17502:1:1107:0
|
||||
DAS VIERTE,D VIERTE;BetaDigital:12460:HC34M2S0:S19.2E:27500:2047=2:2048=deu@3:36:0:1793:133:5:0
|
||||
BBC FOUR;BSkyB:10802:HC56M2S0:S28.2E:22000:5600=2:5601=eng@3,5602=NAR@3:5603;5604=eng:0:6416:2:2047:0
|
||||
BBC HD;BSkyB:10847:vC56M2O0S1:S28.5E:23000:5500=27:5502=NAR@3;5501=eng@106:5503;5504=eng:0:6940:2:2050:0
|
||||
BBC One HD;BSkyB:10847:VC23M5O25P0S1:S28.2E:23000:5400=27:5402=NAR@3;5401=eng@106:5403;5404=eng:0:6941:2:2050:0
|
||||
SAT.1 Gold;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1279=2:1280=deu@3:36:0:17504:1:1107:0
|
||||
arte HD;ARD:11493:HC23M5O35P0S1:S19.2E:22000:5111=27:5112=deu@3,5113=fra@3,5117=mis@3;5116=mul@106:5114;5115=deu,5118=fra,5119=deu:0:10302:1:1019:0
|
||||
zdf_neo HD;ZDFvision:11362:HC23M5O35P0S1:S19.2E:22000:6310=27:6320=deu@3,6321=mis@3,6323=mul@3;6322=deu@106:6330;6331=deu:0:11130:1:1011:0
|
||||
ZDFinfo HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6710=27:6720=deu@3,6721=mis@3,6723=mul@3;6722=deu@106:6730;6731=deu:0:11170:1:1010:0
|
||||
ONE HD;ARD:11052:HC23M5O35P0S1:S19.2E:22000:5411=27:5412=deu@3,5413=mis@3;5416=deu@106:5414;5415=deu:0:10376:1:1039:0
|
||||
KiKA HD;ZDFvision:11347:VC23M5O35P0S1:S19.2E:22000:6610=27:6620=deu@3,6621=mis@3;6622=deu@106:6630;6631=deu:0:11160:1:1010:0
|
||||
:Regionalprogramme
|
||||
Niederbayern;MB Satellite:11523:HC56M2S0:S19.2E:22000:2559=2:2560=deu@3:0:0:4609:1:1021:0
|
||||
Franken Fernsehen;MB Satellite:11523:HC56M2S0:S19.2E:22000:511=2:512=deu@3:0:0:4601:1:1021:0
|
||||
muenchen.tv;MB Satellite:11523:HC56M2S0:S19.2E:22000:1279=2:1280=deu@3:0:0:4604:1:1021:0
|
||||
Mainfranken;MB Satellite:11523:HC56M2S0:S19.2E:22000:1791=2:1792=deu@3:0:0:4606:1:1021:0
|
||||
TV Oberfranken;MB Satellite:11523:HC56M2S0:S19.2E:22000:2047=2:2048=deu@3:0:0:4607:1:1021:0
|
||||
TVA-OTV;MB Satellite:11523:HC56M2S0:S19.2E:22000:2303=2:2304=deu@3:0:0:4608:1:1021:0
|
||||
a.tv;MB Satellite:11523:HC56M2S0:S19.2E:22000:255=2:256=deu@3:0:0:4600:1:1021:0
|
||||
BR Fernsehen Nord HD;ARD:11582:HC23M5O35P0S1:S19.2E:22000:5201=27:5202=deu@3,5203=mis@3;5206=deu@106:5204;5205=deu:0:10326:1:1025:0
|
||||
rbb Brandenburg HD;ARD:10891:HC23M5O35P0S1:S19.2E:22000:5311=27:5312=deu@3,5313=mis@3;5316=deu@106:5314;5315=deu:0:10350:1:1061:0
|
||||
SR Fernsehen HD;ARD:11052:HC23M5O35P0S1:S19.2E:22000:5431=27:5432=deu@3,5433=mis@3;5436=deu@106:5434;5435=deu:0:10378:1:1039:0
|
||||
Radio Bremen TV;ARD:12421:HC34M2S0:S19.2E:27500:1201=2:1202=deu@3:1204:0:28385:1:1201:0
|
||||
:Oesterreichisches Fernsehen
|
||||
ORF1 HD;ORF:11303:HC23M5O35P0S1:S19.2E:22000:1920=27:0;1921=deu@106,1922=mis@106:1925:648,650,D95,D98,6E2,500,9C4,98C:4911:1:1007:0
|
||||
ORF2W HD;ORF:11303:HC23M5O35P0S1:S19.2E:22000:2920=27:0;2921=deu@106,2922=mis@106:2925:648,650,D95,D98,6E2,500,9C4,98C:4912:1:1007:0
|
||||
ORF III;ORF:12662:HC56M2S0:S19.2E:22000:1010=2:1011=deu@4:1013:648,650,D95,D98,9C4,98C:13101:1:1115:0
|
||||
ServusTV HD Oesterreich;ServusTV:11303:HC23M5O35P0S1:S19.2E:22000:3583=27:3584=deu@4,3585=eng@4;3587=deu@106:3588:648,650,D95,D98,9C4,98C,6E2,500:4913:1:1007:0
|
||||
ServusTV HD Deutschland;ServusTV:11303:HC23M5O35P0S1:S19.2E:22000:4920=27:4921=deu@4,4922=eng@4;4924=deu@106:4925:0:4914:1:1007:0
|
||||
ATV;ATV+:12692:HC56M2S0:S19.2E:22000:506=2:507=deu@3:509:648,650,D95,D98,9C4,98C:13012:1:1117:0
|
||||
ORF SPORT+;ORF:11243:HC56M2S0:S19.2E:22000:2210=2:2211=deu@3,2212=mis@3:2215:648,650,D95,D98,9C4,98C:13221:1:1003:0
|
||||
PULS 4 Austria;ProSiebenSat.1:12051:VC34M2S0:S19.2E:27500:1791=2:1792=deu@3:39:9C4,98C,D95,648,D98,650,500,6E2,98D:20007:1:1082:0
|
||||
:Nachrichten
|
||||
tagesschau24 HD;ARD:11052:HC23M5O35P0S1:S19.2E:22000:5401=27:5402=deu@3,5403=mis@3;5406=deu@106:5404:0:10375:1:1039:0
|
||||
n-tv;CBC:12187:HC34M2S0:S19.2E:27500:169=2:73=deu@3,77=mul@3:80:0:12090:1:1089:0
|
||||
WELT;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1023=2:1024=deu@3:35:0:17503:1:1107:0
|
||||
N24 DOKU;BetaDigital:12460:HC34M2S0:S19.2E:27500:511=2:512=deu@3:34:0:48:133:5:0
|
||||
CNN Int.;Harmonic:11626:VC56M2S0:S19.2E:22000:165=2:100=eng@3:0:0:4422:1:1028:0
|
||||
EURONEWS FRENCH SD;Globecast:12226:HC34M2S0:S19.2E:27500:2432=2:2435=fra@3:0:0:31220:1:1091:0
|
||||
Bloomberg Europe TV;Bloomberg TV:11597:VC56M2S0:S19.2E:22000:1360=2:1320=eng@3:0:0:10067:1:1026:0
|
||||
CNBC Europe;CNBC:11597:VC56M2S0:S19.2E:22000:307=2:308=eng@3:0:0:10030:1:1026:0
|
||||
Russia Today;GLOBECAST:11538:VC56M2S0:S19.2E:22000:604=2:624=eng@3:0:0:6904:1:1022:0
|
||||
Sky News Intl;SES ASTRA:12604:HC56M2S0:S19.2E:22000:1290=2:2290=eng@3:1750:0:7290:1:1111:0
|
||||
Al Jazeera English;Al Jazeera:11626:VC56M2S0:S19.2E:22000:3505=2:3625=eng@3:0:0:4440:1:1028:0
|
||||
Al Jazeera Channel;GLOBECAST:11508:VC56M2S0:S19.2E:22000:709=2:729=ara@3:0:0:7009:1:1020:0
|
||||
:Sport
|
||||
SPORT1;BetaDigital:12480:VC34M2S0:S19.2E:27500:1023=2:1024=deu@3:39:0:900:133:33:0
|
||||
HSE24,HSE24;BetaDigital:12480:VC34M2S0:S19.2E:27500:1279=2:1280=deu@3:37:0:40:133:33:0
|
||||
Bloomberg Europe TV;Arqiva:11597:VC56M2S0:S19.2E:22000:1360=2:1320=eng@4:37:0:10067:1:1026:0
|
||||
NRJ 12;CSAT:11817:VC34M2S0:S19.2E:27500:163=2:92=fra@4;93=fra@106:41:1811,1812,500,1863,100:8004:1:1070:0
|
||||
rbb Brandenburg;ARD:12109:HC34M2S0:S19.2E:27500:601=2:602=deu@3,603=mis@3:604:0:28205:1:1073:0
|
||||
Sky News Intl;SES ASTRA:12604:HC56M2S0:S19.2E:22000:1290=2:2290=@4:0:0:7290:1:1111:0
|
||||
Veronica/DisneyXD;CANALDIGITAAL:12574:HC56M2O0S0:S19.2E:22000:0:0:0:622:5020:53:1109:0
|
||||
Test;CANALDIGITAAL:12574:HC56M2O0S0:S19.2E:22000:522+8190=2:97=dut@4:40:100:5025:53:1109:0
|
||||
n-tv;RTL World:12187:HC34M2S0:S19.2E:27500:169=2:73=deu@3:80:0:12090:1:1089:0
|
||||
Al Jazeera Channel;GlobeCast:11508:VC56M2S0:S19.2E:22000:709=2:729=ara@3:0:0:7009:1:1020:0
|
||||
ORF III;ORF:12662:HC56M2S0:S19.2E:22000:1010=2:1011=deu@4:1013:D95,648,D05,9C4,1702,1833,98C:13101:1:1115:0
|
||||
Eurosport HD,EurospHD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:1535=27:0;1539=deu@106:32:1833,9C4,9AF,98C:132:133:6:0
|
||||
Eurosport Deutschland;SES Astra:12226:HC34M2S0:S19.2E:27500:101=2:103=deu@4:102:0:31200:1:1091:0
|
||||
tagesschau24;ARD:10744:HC56M2S0:S19.2E:22000:101=2:102=deu@3:0:0:28721:1:1051:0
|
||||
Einsfestival HD;ARD:12422:HC34M2S0:S19.2E:27500:1601=27:1602=deu@3;1606=deu@106:1604:0:28396:1:1201:0
|
||||
Einsfestival;ARD:10744:HC56M2S0:S19.2E:22000:201=2:202=deu@3,203=mis@3;206=deu@106:204:0:28722:1:1051:0
|
||||
EinsPlus;ARD:10744:HC56M2S0:S19.2E:22000:301=2:302=deu@3,303=mis@3;306=deu@106:304:0:28723:1:1051:0
|
||||
zdf.kultur HD;ZDFvision:11362:HC23M5O35P0S1:S19.2E:22000:6410=27:6420=deu@3,6421=mis@3,6423=mul@3;6422=deu@106:6430:0:11140:1:1011:0
|
||||
zdf.kultur;ZDFvision:11953:HC34M2S0:S19.2E:27500:1110=2:1120=deu@3,1121=mis@3,1122=mul@3;1125=deu@106:1130:0:28016:1:1079:0
|
||||
zdf_neo HD;ZDFvision:11362:HC23M5O35P0S1:S19.2E:22000:6310=27:6320=deu@3,6321=mis@3,6323=mul@3;6322=deu@106:6330:0:11130:1:1011:0
|
||||
zdf_neo;ZDFvision:11953:HC34M2S0:S19.2E:27500:660=2:670=deu@3,671=mis@3,672=mul@3;675=deu@106:680:0:28014:1:1079:0
|
||||
Eurosport 1 Deutschland;SES Astra:12226:HC34M2S0:S19.2E:27500:101=2:103=deu@4:102:0:31200:1:1091:0
|
||||
:Privatsender
|
||||
RTLplus;CBC:12187:HC34M2S0:S19.2E:27500:168=2:137=deu@3:70:0:12080:1:1089:0
|
||||
NITRO;CBC:12187:HC34M2S0:S19.2E:27500:173=2:146=deu@3:84;86=deu:0:12061:1:1089:0
|
||||
SUPER RTL;CBC:12187:HC34M2S0:S19.2E:27500:165=2:120=deu@3:65;66=deu:0:12040:1:1089:0
|
||||
SAT.1 Gold;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1279=2:1280=deu@3:36:0:17504:1:1107:0
|
||||
Pro7 MAXX;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:1535=2:1536=deu@3:37:0:17505:1:1107:0
|
||||
kabel eins;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:767=2:768=deu@3:34:0:17502:1:1107:0
|
||||
kabel eins Doku;ProSiebenSat.1:12544:HC56M2S0:S19.2E:22000:2559=2:2560=deu@3:41:0:17509:1:1107:0
|
||||
Family TV;BetaDigital:10920:HC78M2S0:S19.2E:22000:255=2:256=deu@3:0:0:33:133:15:0
|
||||
Disney Channel;BetaDigital:12460:HC34M2S0:S19.2E:27500:2047=2:2048=deu@3;2051=deu@106:36:0:1793:133:5:0
|
||||
TELE 5;BetaDigital:12480:VC34M2S0:S19.2E:27500:1535=2:1536=deu@3:38:0:51:133:33:0
|
||||
VOX;CBC:12187:HC34M2S0:S19.2E:27500:167=2:136=deu@3:71;74=deu:0:12060:1:1089:0
|
||||
SIXX;ProSiebenSat.1:12460:HC34M2S0:S19.2E:27500:767=2:768=deu@3:35:0:776:133:5:0
|
||||
:Sky
|
||||
Sky Cinema,Cinema;SKY:11797:HC34M2S0:S19.2E:27500:511=2:512=deu@3,513=eng@3;515=deu@106:32:1702,1722,1833,1834,1836,9C4,9C7,9AF,98C,1861:10:133:2:0
|
||||
Sky Cinema +1,Cinema1;SKY:11797:HC34M2S0:S19.2E:27500:1791=2:1792=deu@3,1793=eng@3;1795=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:11:133:2:0
|
||||
Sky Cinema +24,Cinema24;SKY:11797:HC34M2S0:S19.2E:27500:2303=2:2304=deu@3,2305=eng@3;2307=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:43:133:2:0
|
||||
Sky Action,Action;SKY:11797:HC34M2S0:S19.2E:27500:767=2:768=deu@3,769=eng@3;771=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:9:133:2:0
|
||||
Sky Comedy,Comedy;SKY:11797:HC34M2S0:S19.2E:27500:2559=2:2560=deu@3,2561=eng@3;2563=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:8:133:2:0
|
||||
Sky Atlantic HD,AtlanticHD;SKY:11993:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106,1284=eng@106:32:1833,9C4,9AF,98C:110:133:13:0
|
||||
Fox Serie,Fox;SKY:12070:HC34M2S0:S19.2E:27500:1279=2:1280=deu@3,1281=eng@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:16:133:1:0
|
||||
History HD,HistHD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106:32:1833,9C4,9AF,98C:113:133:13:0
|
||||
Sky Emotion,Emotion;SKY:11797:HC34M2S0:S19.2E:27500:2815=2:2816=deu@3,2817=eng@3;2819=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:20:133:2:0
|
||||
Sky Nostalgie,Nostalgie;SKY:11719:HC34M2S0:S19.2E:27500:1535=2:1536=deu@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:516:133:3:0
|
||||
Sky Hits,SkyHits;SKY:11719:HC34M2S0:S19.2E:27500:1023=2:1024=deu@3,1025=eng@3;1027=deu@106:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:41:133:3:0
|
||||
Discovery Channel,Discovery;SKY:12031:HC34M2S0:S19.2E:27500:3071=2:3072=deu@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:14:133:4:0
|
||||
National Geographic,NatGeo;SKY:12031:HC34M2S0:S19.2E:27500:3327=2:3328=deu@3,3329=eng@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:13:133:4:0
|
||||
Disney Channel,Disney;SKY:11758:HC34M2S0:S19.2E:27500:2559=2:2560=deu@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:34:133:17:0
|
||||
TNT Serie,TNTSerie;SKY:12070:HC34M2S0:S19.2E:27500:2559=2:2560=deu@3,2561=eng@3:32:1702,1722,1833,1834,9C4,9C7,9AF,98C,1861:50:133:1:0
|
||||
:@1000 New channels
|
||||
DMAX;BetaDigital:12480:VC34M2S0:S19.2E:27500:3327=2:3328=deu@3:44:0:63:133:33:0
|
||||
ANIXE HD;BetaDigital:10773:HC34M5O20P0S1:S19.2E:22000:255=27:0;259=deu@106:0:0:21100:1:1053:0
|
||||
Nickelodeon;MTV Networks Europe:11973:VC34M2S0:S19.2E:27500:4101=2:4102=deu@4,4103=eng@4:4104:0:28680:1:1078:0
|
||||
TOGGO plus;CBC:12187:HC34M2S0:S19.2E:27500:301=2:303=deu@3:0:0:12030:1:1089:0
|
||||
Comedy Central/VIVA;MTV Networks Europe:11973:VC34M2S0:S19.2E:27500:4061=2:4062=@4:4064:0:28676:1:1078:0
|
||||
DELUXE MUSIC,DELUXE;BetaDigital:12148:HC34M2S0:S19.2E:27500:3327=2:3328=deu@3:0:0:65:133:7:0
|
||||
sonnenklar.TV HD;BetaDigital:12574:HC23M5O35P0S1:S19.2E:22000:255=27:0;259=deu@106:32:0:5400:1:1109:0
|
||||
QVC Deutschland;SES ASTRA:12551:VC56M2S0:S19.2E:22000:165=2:166=deu@3:167:0:12100:1:1108:0
|
||||
HSE24,HSE24;BetaDigital:12480:VC34M2S0:S19.2E:27500:1279=2:1280=deu@3:37:0:40:133:33:0
|
||||
1-2-3.tv HD;BetaDigital:10802:HC34M5O35P0S1:S19.2E:22000:767=27:0;771=deu@106:34:0:5502:1:1055:0
|
||||
Juwelo HD;BetaDigital:12574:HC23M5O35P0S1:S19.2E:22000:1023=27:1024=deu@3:0:0:5403:1:1109:0
|
||||
:@100
|
||||
:Sky HD
|
||||
Sky Cinema HD,Sky Cinema HD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106,1284=eng@106:0:98C,9C4,9AF,98D:131:133:6:0
|
||||
Sky Cinema +1 HD,Sky Cine1 HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:255=27:0;259=deu@106,260=eng@106:0:9C4,98C,9AF,98D:134:133:8:0
|
||||
Sky Cinema +24 HD,Sky Cine24 HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:9C4,98C,9AF,98D:135:133:8:0
|
||||
Sky Cinema Hits HD,Sky Hits HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106:0:9C4,98C,9AF,98D:107:133:12:0
|
||||
Sky Cinema Action HD,Action HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:1023=27:0;1027=deu@106,1028=eng@106:0:98C,9C4,9AF,98D:116:133:11:0
|
||||
Sky Cinema Animation HD,Animation HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106,772=eng@106:0:9C4,98C,9AF,98D:139:133:8:0
|
||||
SYFY HD,SYFY HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:9C4,98C,9AF,98D:126:133:12:0
|
||||
Sky Atlantic HD,AtlanticHD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106,1284=eng@106:0:98C,9C4,9AF,98D:110:133:13:0
|
||||
Sky 1 +1 HD,Sky 1 +1 HD;SKY:11797:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:98C,9C4,9AF,98D:144:133:16:0
|
||||
TNT Serie HD,TNTSerieHD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:255=27:0;259=deu@106,260=eng@106:0:98C,9C4,9AF,98D:123:133:11:0
|
||||
TNT Comedy HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:98C,9C4,98D:136:133:14:0
|
||||
Fox HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:1023=27:0;1027=deu@106,1028=eng@106:0:98C,9C4,98D:124:133:10:0
|
||||
13th Street HD,13th St HD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106,772=eng@106:0:98C,9C4,9AF,98D:127:133:13:0
|
||||
Universal HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:1535=27:0;1539=deu@106,1540=eng@106:0:98C,9C4,98D:101:133:14:0
|
||||
RTL Crime HD,RTL CrimeHD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:255=27:0;259=deu@106,260=eng@106:0:9C4,98C,98D:140:133:9:0
|
||||
E! Entertainm. HD,E! HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:255=27:0;259=deu@106,260=eng@106:0:98C,9C4,98D:128:133:14:0
|
||||
Spiegel Geschichte HD,Spiegel G HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:255=27:0;259=deu@106:0:98C,9C4,98D:137:133:10:0
|
||||
Discovery HD,DiscHD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:1023=27:0;1027=deu@106,1028=eng@106:0:98C,9C4,9AF,98D:130:133:6:0
|
||||
History HD,HistHD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:767=27:0;771=deu@106,772=eng@106:0:98C,9C4,9AF,98D:113:133:11:0
|
||||
NatGeo HD,NatGeoHD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:98C,9C4,9AF,98D:112:133:13:0
|
||||
Nat Geo Wild HD,NGWildHD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106,516=eng@106:0:98C,9C4,9AF,98D:118:133:6:0
|
||||
Disney Cinemagic HD,DisneyCinHD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:255=27:0;259=deu@106,260=eng@106:0:98C,9C4,9AF,98D:111:133:13:0
|
||||
Disney Junior HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106:0:9C4,98C,9AF,98D:138:133:8:0
|
||||
Sky Arts HD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:767=27:0;771=deu@106,772=eng@106:0:9C4,98C,98D:145:133:9:0
|
||||
:Sky Film
|
||||
Sky Cinema Comedy,Sky Comedy;SKY:11719:HC910M2O35P0S1:S19.2E:27500:1023=27:1024=deu@3,1025=eng@3;1027=deu@106:0:9C4,98C,9AF,98D:8:133:3:0
|
||||
Sky Cinema Western,Sky Western;SKY:12031:HC910M2O35P0S1:S19.2E:27500:767=27:768=deu@3,769=eng@3:0:9C4,98C,9AF,98D:516:133:4:0
|
||||
Sky Cinema Emotion,Sky Emotion;SKY:12031:HC910M2O35P0S1:S19.2E:27500:511=27:512=deu@3,513=eng@3;515=deu@106:0:9C4,98C,9AF,98D:20:133:4:0
|
||||
:Sky Welt
|
||||
RTL Passion,Passion;SKY:12031:HC910M2O35P0S1:S19.2E:27500:3839=27:3840=deu@3,3841=eng@3:0:9C4,98C,9AF,98D:29:133:4:0
|
||||
Sky Krimi,SkyKrimi;SKY:12031:HC910M2O35P0S1:S19.2E:27500:1535=27:1536=deu@3:0:9C4,98C,9AF,98D:23:133:4:0
|
||||
Disney XD,DisneyXD;SKY:11719:HC910M2O35P0S1:S19.2E:27500:1279=27:1280=deu@3,1281=eng@3:0:9C4,98C,9AF,98D:28:133:3:0
|
||||
Heimatkanal,Heimat;SKY:11758:HC910M2O35P0S1:S19.2E:27500:2815=27:2816=deu@3:0:9C4,98C,9AF,98D:22:133:2:0
|
||||
Romance TV,Romance;SKY:11758:HC910M2O35P0S1:S19.2E:27500:3071=27:3072=deu@3:0:9C4,98C,9AF,98D:518:133:2:0
|
||||
Classica;SKY:11719:HC910M2O35P0S1:S19.2E:27500:2047=27:2048=deu@3:0:9C4,98C,9AF,98D:24:133:3:0
|
||||
:Sky Welt Extra
|
||||
TNT Film (TCM),TNT Film;SKY:11914:HC910M2O35P0S1:S19.2E:27500:4351=27:4352=deu@3,4353=eng@3:0:98C,9C4,9AF,98D:405:133:6:0
|
||||
Kinowelt TV,Kinowelt;SKY:12031:HC910M2O35P0S1:S19.2E:27500:4351=27:4352=deu@3:0:9C4,98C,9AF,98D:406:133:4:0
|
||||
.;BetaDigital:10920:HC78M2S0:S19.2E:22000:2047=27:2048=deu@3,2049=eng@3:0:9C4,98C:57:133:15:0
|
||||
.;SKY:10920:HC78M2S0:S19.2E:22000:1023=27:1024=deu@3:0:1837,9C4,98C,1867:38:133:15:0
|
||||
RTL Living;CBC:11082:HC34M5O20P0S1:S19.2E:22000:700=27:710=deu@3,711=qaa@3:0:9C4,98C,98D:11971:1:1041:0
|
||||
Boomerang;SKY:11875:HC34M5O35P0S1:S19.2E:27500:4351=27:4352=deu@3,4353=eng@3:0:98C,9C4,98D:403:133:14:0
|
||||
Cartoon Network,Cartoon Net;SKY:11875:HC34M5O35P0S1:S19.2E:27500:4607=27:4608=deu@3,4609=eng@3:0:98C,9C4,98D:404:133:14:0
|
||||
Nicktoons (S);MTV Networks Europe:11973:VC34M2S0:S19.2E:27500:4121=2:4122=@4:0:500:28682:1:1078:0
|
||||
Beate-Uhse.TV,BeateU;SKY:11719:HC910M2O35P0S1:S19.2E:27500:2303=27:2304=deu@3:0:9C4,98C,9AF,98D:21:133:3:0
|
||||
:Sky Bundesliga HD
|
||||
Sky Sport Bundesliga 1 HD,Sky Buli 1 HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:255=27:0;258=qab@106,259=qab@106,260=qac@106:32;33=deu:9C4,98C,9AF,98D:105:133:12:0
|
||||
Sky Sport Bundesliga 2 HD,Sky Buli 2 HD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106:32:9C4,98C,9AF,98D:267:133:6:0
|
||||
Sky Sport Bundesliga 3 HD,Sky Buli 3 HD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106,2052=qac@106:32:98C,9C4,9AF,98D:277:133:13:0
|
||||
Sky Sport Bundesliga 4 HD,Sky Buli 4 HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106,2052=qac@106:32:9C4,98C,9AF,98D:287:133:12:0
|
||||
Sky Sport Bundesliga 5 HD,Sky Buli 5 HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106,2052=qac@106:32:98C,9C4,9AF,98D:297:133:11:0
|
||||
Sky Sport Bundesliga 6 HD,Sky Buli 6 HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:2047=27:0;2050=qab@106,2051=qab@106,2052=qac@106:32:98C,9C4,98D:307:133:8:0
|
||||
Sky Sport Bundesliga 7 HD,Sky Buli 7 HD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:1791=27:0;1794=qab@106,1795=qab@106,1796=qac@106:33:98C,9C4:317:133:9:0
|
||||
Sky Sport Bundesliga 8 HD,Sky Buli 8 HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:2559=27:0;2562=deu@106,2563=deu@106,2564=deu@106:0:9C4,98C:327:133:14:0
|
||||
Sky Sport Bundesliga 9 HD,Sky Buli 9 HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:2559=27:0;2562=qab@106,2563=qab@106,2564=qac@106:32:98C,9C4:337:133:10:0
|
||||
Sky Sport Bundesliga 10 HD,Sky Buli 10 HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:2047=27:0;2050=deu@106,2051=deu@106,2052=deu@106:0:9C4,98C:257:133:14:0
|
||||
Sky Sport Fanzone HD,Fanzone HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:1279=27:0:0:98C,9C4:102:133:10:0
|
||||
:Sky Sport HD
|
||||
Sky Sport News HD,SportNewsHD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:1023=27:0;1027=deu@106:0:0:108:133:12:0
|
||||
Sky Sport 1 HD,Sky Sport 1 HD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:767=27:0;770=qae@106,771=qaf@106:32:98C,9C4,9AF,98D:129:133:6:0
|
||||
Sky Sport 2 HD,Sky Sport 2 HD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:1023=27:0;1026=qae@106,1027=qaf@106,1028=qtz@106:32:98C,9C4,9AF,98D:114:133:13:0
|
||||
Sky Sport 3 HD,Sky Sport 3 HD;SKY:11914:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,9AF,98D:268:133:6:0
|
||||
Sky Sport 4 HD,Sky Sport 4 HD;SKY:11992:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,9AF:278:133:13:0
|
||||
Sky Sport 5 HD,Sky Sport 5 HD;SKY:12304:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106:261:9C4,98C,9AF:288:133:12:0
|
||||
Sky Sport 6 HD,Sky Sport 6 HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,9AF,98D:298:133:11:0
|
||||
Sky Sport 7 HD,Sky Sport 7 HD;SKY:12070:HC910M2O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,98D:308:133:8:0
|
||||
Sky Sport 8 HD,Sky Sport 8 HD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:3071=27:0;3074=qae@106,3075=qaf@106,3076=qtz@106:32:98C,9C4,98D:318:133:9:0
|
||||
Sky Sport 9 HD,Sky Sport 9 HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:2815=27:0;2818=deu@106,2819=deu@106:32:98C,9C4:328:133:14:0
|
||||
Sky Sport 10 HD,Sky Sport 10HD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:2815=27:0;2818=qae@106,2819=qaf@106,2820=qtz@106:32:98C,9C4,98D:338:133:10:0
|
||||
Sky Sport 11 HD,Sky Sport 11HD;SKY:11875:HC34M5O35P0S1:S19.2E:27500:2303=27:0;2306=qae@106,2307=qaf@106,2308=qtz@106:32:98C,9C4,98D:258:133:14:0
|
||||
Eurosport 1 HD,Eurosp1 HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:511=27:0;515=deu@106:0:98C,9C4,9AF,98D:132:133:11:0
|
||||
Eurosport 2 HD,Eurosp2HD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:1279=27:0;1283=deu@106,1284=eng@106:0:9C4,98C,98D:109:133:9:0
|
||||
Sport1+ HD,Sport1+HD;SKY:12382:HC910M2O35P0S1:S19.2E:27500:1279=27:0;1283=deu@106:0:98C,9C4,98D,9AF:122:133:11:0
|
||||
Sport1 US HD,Sport1USHD;SKY:11332:HC34M5O35P0S1:S19.2E:22000:511=27:0;515=deu@106:32:98C,9C4:119:133:10:0
|
||||
Sky Sport Austria HD,SportAutHD;SKY:11170:HC34M5O35P0S1:S19.2E:22000:1023=27:0;1027=deu@106:0:9C4,98C,98D:143:133:9:0
|
||||
:@1000 Neue Kanaele
|
||||
|
14
channels.h
14
channels.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: channels.h 4.3 2017/06/10 15:06:40 kls Exp $
|
||||
* $Id: channels.h 5.3 2024/03/02 16:21:16 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CHANNELS_H
|
||||
@ -87,6 +87,7 @@ class cChannels;
|
||||
class cChannel : public cListObject {
|
||||
friend class cSchedules;
|
||||
friend class cMenuEditChannel;
|
||||
friend class cMenuSetupMisc;
|
||||
friend class cDvbSourceParam;
|
||||
private:
|
||||
static cString ToText(const cChannel *Channel);
|
||||
@ -96,6 +97,7 @@ private:
|
||||
char *portalName;
|
||||
int __BeginData__;
|
||||
int frequency; // MHz
|
||||
mutable int transponder; // cached value
|
||||
int source;
|
||||
int srate;
|
||||
int vpid;
|
||||
@ -105,7 +107,7 @@ private:
|
||||
int atypes[MAXAPIDS + 1]; // list is zero-terminated
|
||||
char alangs[MAXAPIDS][MAXLANGCODE2];
|
||||
int dpids[MAXDPIDS + 1]; // list is zero-terminated
|
||||
int dtypes[MAXAPIDS + 1]; // list is zero-terminated
|
||||
int dtypes[MAXDPIDS + 1]; // list is zero-terminated
|
||||
char dlangs[MAXDPIDS][MAXLANGCODE2];
|
||||
int spids[MAXSPIDS + 1]; // list is zero-terminated
|
||||
char slangs[MAXSPIDS][MAXLANGCODE2];
|
||||
@ -122,9 +124,8 @@ private:
|
||||
int number; // Sequence number assigned on load
|
||||
bool groupSep;
|
||||
int __EndData__;
|
||||
mutable cString nameSource;
|
||||
mutable int nameSourceMode;
|
||||
mutable cString shortNameSource;
|
||||
cString nameSource;
|
||||
cString shortNameSource;
|
||||
cString parameters;
|
||||
mutable int modification;
|
||||
time_t seen; // When this channel was last seen in the SDT of its transponder
|
||||
@ -132,6 +133,7 @@ private:
|
||||
cLinkChannels *linkChannels;
|
||||
cChannel *refChannel;
|
||||
cString TransponderDataToString(void) const;
|
||||
void UpdateNameSource(void);
|
||||
public:
|
||||
cChannel(void);
|
||||
cChannel(const cChannel &Channel);
|
||||
@ -178,6 +180,7 @@ public:
|
||||
void SetNumber(int Number) { number = Number; }
|
||||
bool GroupSep(void) const { return groupSep; }
|
||||
const char *Parameters(void) const { return parameters; }
|
||||
const cSchedule *Schedule(void) const { return schedule; }
|
||||
const cLinkChannels* LinkChannels(void) const { return linkChannels; }
|
||||
const cChannel *RefChannel(void) const { return refChannel; }
|
||||
bool IsAtsc(void) const { return cSource::IsAtsc(source); }
|
||||
@ -230,6 +233,7 @@ public:
|
||||
int GetNextNormal(int Idx) const; ///< Get next normal channel (not group)
|
||||
int GetPrevNormal(int Idx) const; ///< Get previous normal channel (not group)
|
||||
void ReNumber(void); ///< Recalculate 'number' based on channel type
|
||||
bool MoveNeedsDecrement(cChannel *From, cChannel *To); // Detect special case when moving a channel (closely related to Renumber())
|
||||
void Del(cChannel *Channel); ///< Delete the given Channel from the list
|
||||
const cChannel *GetByNumber(int Number, int SkipGap = 0) const;
|
||||
cChannel *GetByNumber(int Number, int SkipGap = 0) { return const_cast<cChannel *>(static_cast<const cChannels *>(this)->GetByNumber(Number, SkipGap)); }
|
||||
|
181
ci.c
181
ci.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: ci.c 4.20 2018/02/03 12:55:03 kls Exp $
|
||||
* $Id: ci.c 5.1 2021/06/09 09:41:18 kls Exp $
|
||||
*/
|
||||
|
||||
#include "ci.h"
|
||||
@ -81,7 +81,7 @@ static char *CopyString(int Length, const uint8_t *Data)
|
||||
char *s = MALLOC(char, Length + 1);
|
||||
char *p = s;
|
||||
while (Length > 0) {
|
||||
char c = *Data;
|
||||
int c = *Data;
|
||||
if (isprint(c)) // some CAMs send funny characters in their strings, let's just skip them
|
||||
*p++ = c;
|
||||
else if (c == 0x8A) // the character 0x8A is used as newline, so let's put a real '\n' in there
|
||||
@ -118,9 +118,11 @@ class cCaPidReceiver : public cReceiver {
|
||||
private:
|
||||
int catVersion;
|
||||
cVector<int> emmPids;
|
||||
uchar buffer[2048]; // 11 bit length, max. 2048 byte
|
||||
uchar buffer[1024]; // CAT table length: 10 bit -> max. 1021 + 3 bytes
|
||||
uchar *bufp;
|
||||
uchar mtdCatBuffer[TS_SIZE]; // TODO: handle multi packet CATs!
|
||||
#define CAT_MAXPACKETS 6 // 6 * 184 = 1104 bytes for CAT table
|
||||
uchar mtdCatBuffer[CAT_MAXPACKETS][TS_SIZE]; // TODO: handle multi table CATs!
|
||||
int mtdNumCatPackets;
|
||||
int length;
|
||||
cMutex mutex;
|
||||
bool handlingPid;
|
||||
@ -147,6 +149,7 @@ cCaPidReceiver::cCaPidReceiver(void)
|
||||
{
|
||||
catVersion = -1;
|
||||
bufp = NULL;
|
||||
mtdNumCatPackets = 0;
|
||||
length = 0;
|
||||
handlingPid = false;
|
||||
cMutexLock MutexLock(&mutex);
|
||||
@ -185,30 +188,38 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length)
|
||||
const uchar *p = NULL;
|
||||
if (TsPayloadStart(Data)) {
|
||||
if (Data[5] == SI::TableIdCAT) {
|
||||
length = (int(Data[6] & 0x03) << 8) | Data[7]; // section length
|
||||
if (bufp) { // incomplete multi-packet CAT
|
||||
catVersion = -1;
|
||||
bufp = NULL;
|
||||
}
|
||||
length = (int(Data[6] & 0x0F) << 8) | Data[7]; // section length (12 bit field)
|
||||
if (length > 5) {
|
||||
int v = (Data[10] & 0x3E) >> 1; // version number
|
||||
if (v != catVersion) {
|
||||
if (Data[11] == 0 && Data[12] == 0) { // section number, last section number
|
||||
if (length > TS_SIZE - 8) {
|
||||
if (MtdCamSlot)
|
||||
esyslog("ERROR: need to implement multi packet CAT handling for MTD!");
|
||||
int n = TS_SIZE - 13;
|
||||
memcpy(buffer, Data + 13, n);
|
||||
length += 3; // with TableIdCAT -> Data[5]
|
||||
if (length > TS_SIZE - 5) {
|
||||
int n = TS_SIZE - 5;
|
||||
memcpy(buffer, Data + 5, n);
|
||||
bufp = buffer + n;
|
||||
length -= n + 5; // 5 = header
|
||||
length -= n;
|
||||
}
|
||||
else {
|
||||
p = Data + 13; // no need to copy the data
|
||||
length -= 5; // header
|
||||
p = Data + 5; // no need to copy the data
|
||||
}
|
||||
if (MtdCamSlot) {
|
||||
mtdNumCatPackets = 0;
|
||||
memcpy(mtdCatBuffer[mtdNumCatPackets++], Data, TS_SIZE);
|
||||
}
|
||||
}
|
||||
else
|
||||
dsyslog("multi table CAT section - unhandled!");
|
||||
catVersion = v;
|
||||
}
|
||||
else if (MtdCamSlot)
|
||||
MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
|
||||
else if (MtdCamSlot) {
|
||||
for (int i = 0; i < mtdNumCatPackets; i++)
|
||||
MtdCamSlot->PutCat(mtdCatBuffer[i], TS_SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -222,40 +233,63 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length)
|
||||
p = buffer;
|
||||
length = bufp - buffer;
|
||||
}
|
||||
if (MtdCamSlot)
|
||||
memcpy(mtdCatBuffer[mtdNumCatPackets++], Data, TS_SIZE);
|
||||
}
|
||||
else {
|
||||
esyslog("ERROR: buffer overflow in cCaPidReceiver::Receive()");
|
||||
bufp = 0;
|
||||
bufp = NULL;
|
||||
length = 0;
|
||||
}
|
||||
}
|
||||
if (p) {
|
||||
DelEmmPids();
|
||||
for (int i = 0; i < length - 4; i++) { // -4 = checksum
|
||||
if (p[i] == 0x09) {
|
||||
int CaId = int(p[i + 2] << 8) | p[i + 3];
|
||||
int EmmPid = Peek13(p + i + 4);
|
||||
AddEmmPid(EmmPid);
|
||||
if (MtdCamSlot)
|
||||
MtdMapPid(const_cast<uchar *>(p + i + 4), MtdCamSlot->MtdMapper());
|
||||
switch (CaId >> 8) {
|
||||
case 0x01: for (int j = i + 7; j < p[i + 1] + 2; j += 4) {
|
||||
EmmPid = Peek13(p + j);
|
||||
AddEmmPid(EmmPid);
|
||||
if (MtdCamSlot)
|
||||
MtdMapPid(const_cast<uchar *>(p + j), MtdCamSlot->MtdMapper());
|
||||
}
|
||||
break;
|
||||
}
|
||||
i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment
|
||||
if (!SI::CRC32::crc32((const char *)p, length, 0xFFFFFFFF)) { // <TableIdCAT,....,crc32>
|
||||
DelEmmPids();
|
||||
for (int i = 8; i < length - 4; i++) { // -4 = checksum
|
||||
if (p[i] == 0x09) {
|
||||
int CaId = int(p[i + 2] << 8) | p[i + 3];
|
||||
int EmmPid = Peek13(p + i + 4);
|
||||
AddEmmPid(EmmPid);
|
||||
if (MtdCamSlot)
|
||||
MtdMapPid(const_cast<uchar *>(p + i + 4), MtdCamSlot->MtdMapper());
|
||||
switch (CaId >> 8) {
|
||||
case 0x01: for (int j = i + 7; j < i + p[i + 1] + 2; j += 4) {
|
||||
EmmPid = Peek13(p + j);
|
||||
AddEmmPid(EmmPid);
|
||||
if (MtdCamSlot)
|
||||
MtdMapPid(const_cast<uchar *>(p + j), MtdCamSlot->MtdMapper());
|
||||
}
|
||||
break;
|
||||
}
|
||||
i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment
|
||||
}
|
||||
}
|
||||
}
|
||||
if (MtdCamSlot) {
|
||||
// update crc32
|
||||
uint32_t crc = SI::CRC32::crc32((const char *)p, length - 4, 0xFFFFFFFF); // <TableIdCAT....>[crc32]
|
||||
uchar *c = const_cast<uchar *>(p + length - 4);
|
||||
*c++ = crc >> 24;
|
||||
*c++ = crc >> 16;
|
||||
*c++ = crc >> 8;
|
||||
*c++ = crc;
|
||||
// modify CAT packets
|
||||
const uchar *t = p;
|
||||
for (int i = 0, j = 5; i < mtdNumCatPackets; i++, j = 4) {
|
||||
int n = min(length, TS_SIZE - j);
|
||||
memcpy(mtdCatBuffer[i] + j, t, n);
|
||||
t += n;
|
||||
length -= n;
|
||||
MtdCamSlot->PutCat(mtdCatBuffer[i], TS_SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
esyslog("ERROR: wrong checksum in CAT");
|
||||
catVersion = -1;
|
||||
}
|
||||
p = NULL;
|
||||
bufp = 0;
|
||||
bufp = NULL;
|
||||
length = 0;
|
||||
memcpy(mtdCatBuffer, Data, TS_SIZE);
|
||||
if (MtdCamSlot)
|
||||
MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -577,6 +611,7 @@ uint8_t cTPDU::Status(void)
|
||||
class cCiTransportConnection {
|
||||
private:
|
||||
enum eState { stIDLE, stCREATION, stACTIVE, stDELETION };
|
||||
cMutex mutex;
|
||||
cCamSlot *camSlot;
|
||||
uint8_t tcid;
|
||||
eState state;
|
||||
@ -1213,6 +1248,7 @@ void cCiConditionalAccessSupport::Process(int Length, const uint8_t *Data)
|
||||
}
|
||||
else {
|
||||
dsyslog("CAM %d: doesn't reply to QUERY - only a single channel can be decrypted", CamSlot()->SlotNumber());
|
||||
CamSlot()->MtdActivate(false);
|
||||
state = 4; // normal operation
|
||||
}
|
||||
}
|
||||
@ -1580,9 +1616,12 @@ bool cCiMMI::SendAnswer(const char *Text)
|
||||
struct tAnswer { uint8_t id; char text[256]; };//XXX
|
||||
tAnswer answer;
|
||||
answer.id = Text ? AI_ANSWER : AI_CANCEL;
|
||||
if (Text)
|
||||
strncpy(answer.text, Text, sizeof(answer.text));
|
||||
SendData(AOT_ANSW, Text ? strlen(Text) + 1 : 1, (uint8_t *)&answer);
|
||||
int len = 0;
|
||||
if (Text) {
|
||||
len = min(sizeof(answer.text), strlen(Text));
|
||||
memcpy(answer.text, Text, len);
|
||||
}
|
||||
SendData(AOT_ANSW, len + 1, (uint8_t *)&answer);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1797,6 +1836,7 @@ void cCiTransportConnection::SetTsPostProcessor(cCiSession *CiSession)
|
||||
|
||||
bool cCiTransportConnection::TsPostProcess(uint8_t *TsPacket)
|
||||
{
|
||||
cMutexLock MutexLock(&mutex);
|
||||
if (tsPostProcessor)
|
||||
return tsPostProcessor->TsPostProcess(TsPacket);
|
||||
return false;
|
||||
@ -2219,14 +2259,14 @@ bool cCamSlot::Assign(cDevice *Device, bool Query)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cCamSlot::Devices(cVector<int> &CardIndexes)
|
||||
bool cCamSlot::Devices(cVector<int> &DeviceNumbers)
|
||||
{
|
||||
cMutexLock MutexLock(&mutex);
|
||||
if (mtdHandler)
|
||||
return mtdHandler->Devices(CardIndexes);
|
||||
return mtdHandler->Devices(DeviceNumbers);
|
||||
if (assignedDevice)
|
||||
CardIndexes.Append(assignedDevice->CardIndex());
|
||||
return CardIndexes.Size() > 0;
|
||||
DeviceNumbers.Append(assignedDevice->DeviceNumber());
|
||||
return DeviceNumbers.Size() > 0;
|
||||
}
|
||||
|
||||
void cCamSlot::NewConnection(void)
|
||||
@ -2504,8 +2544,10 @@ void cCamSlot::BuildCaPmts(uint8_t CmdId, cCiCaPmtList &CaPmtList, cMtdMapper *M
|
||||
if (GetCaPids(source, transponder, p->programNumber, CaSystemIds, MAXRECEIVEPIDS + 1, CaPids) > 0) {
|
||||
if (Active)
|
||||
caPidReceiver->AddPids(CaPids);
|
||||
else
|
||||
else {
|
||||
KeepSharedCaPids(p->programNumber, CaSystemIds, CaPids);
|
||||
caPidReceiver->DelPids(CaPids);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (RepliesToQuery())
|
||||
@ -2521,6 +2563,43 @@ void cCamSlot::BuildCaPmts(uint8_t CmdId, cCiCaPmtList &CaPmtList, cMtdMapper *M
|
||||
}
|
||||
}
|
||||
|
||||
void cCamSlot::KeepSharedCaPids(int ProgramNumber, const int *CaSystemIds, int *CaPids)
|
||||
{
|
||||
int numPids = 0;
|
||||
int *pCaPids = CaPids;
|
||||
while (*pCaPids) {
|
||||
numPids++;
|
||||
pCaPids++;
|
||||
}
|
||||
if (numPids <= 0)
|
||||
return;
|
||||
int CaPids2[MAXRECEIVEPIDS + 1];
|
||||
for (cCiCaProgramData *p = caProgramList.First(); p; p = caProgramList.Next(p)) {
|
||||
if (p->Active()) {
|
||||
if (GetCaPids(source, transponder, p->programNumber, CaSystemIds, MAXRECEIVEPIDS + 1, CaPids2) > 0) {
|
||||
int *pCaPids2 = CaPids2;
|
||||
while (*pCaPids2) {
|
||||
pCaPids = CaPids;
|
||||
while (*pCaPids) {
|
||||
if (*pCaPids == *pCaPids2) {
|
||||
dsyslog("CAM %d: keeping shared CA pid %d", SlotNumber(), *pCaPids);
|
||||
// To remove *pCaPids from CaPids we overwrite it with the last valie in the list, and then strip the last value:
|
||||
*pCaPids = CaPids[numPids - 1];
|
||||
numPids--;
|
||||
CaPids[numPids] = 0;
|
||||
if (numPids <= 0)
|
||||
return;
|
||||
}
|
||||
else
|
||||
pCaPids++;
|
||||
}
|
||||
pCaPids2++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cCamSlot::SendCaPmts(cCiCaPmtList &CaPmtList)
|
||||
{
|
||||
cMutexLock MutexLock(&mutex);
|
||||
@ -2702,9 +2781,13 @@ void cCamSlot::StartDecrypting(void)
|
||||
void cCamSlot::StopDecrypting(void)
|
||||
{
|
||||
cMutexLock MutexLock(&mutex);
|
||||
if (mtdHandler) {
|
||||
mtdHandler->StopDecrypting();
|
||||
return;
|
||||
}
|
||||
if (caProgramList.Count()) {
|
||||
caProgramList.Clear();
|
||||
if (!dynamic_cast<cMtdCamSlot *>(this))
|
||||
if (!dynamic_cast<cMtdCamSlot *>(this) || !MasterSlot()->IsDecrypting())
|
||||
SendCaPmt(CPCI_NOT_SELECTED);
|
||||
}
|
||||
}
|
||||
@ -2993,6 +3076,8 @@ void cChannelCamRelations::Load(const char *FileName)
|
||||
|
||||
void cChannelCamRelations::Save(void)
|
||||
{
|
||||
if (!*fileName)
|
||||
return;
|
||||
cMutexLock MutexLock(&mutex);
|
||||
struct stat st;
|
||||
if (stat(fileName, &st) == 0) {
|
||||
|
9
ci.h
9
ci.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: ci.h 4.12 2018/03/17 12:17:37 kls Exp $
|
||||
* $Id: ci.h 4.14 2019/05/28 14:58:08 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CI_H
|
||||
@ -254,6 +254,7 @@ private:
|
||||
cList<cCiCaProgramData> caProgramList;
|
||||
bool mtdAvailable;
|
||||
cMtdHandler *mtdHandler;
|
||||
void KeepSharedCaPids(int ProgramNumber, const int *CaSystemIds, int *CaPids);
|
||||
void NewConnection(void);
|
||||
void DeleteAllConnections(void);
|
||||
void Process(cTPDU *TPDU = NULL);
|
||||
@ -330,9 +331,9 @@ public:
|
||||
///< class function.
|
||||
cDevice *Device(void) { return assignedDevice; }
|
||||
///< Returns the device this CAM slot is currently assigned to.
|
||||
bool Devices(cVector<int> &CardIndexes);
|
||||
///< Adds the card indexes of any devices that currently use this CAM to
|
||||
///< the given CardIndexes. This can be more than one in case of MTD.
|
||||
bool Devices(cVector<int> &DeviceNumbers);
|
||||
///< Adds the numbers of any devices that currently use this CAM to
|
||||
///< the given DeviceNumbers. This can be more than one in case of MTD.
|
||||
///< Returns true if the array is not empty.
|
||||
bool WantsTsData(void) const { return caPidReceiver != NULL; }
|
||||
///< Returns true if this CAM slot wants to receive the TS data through
|
||||
|
8
config.c
8
config.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.c 4.8 2018/02/15 14:40:36 kls Exp $
|
||||
* $Id: config.c 5.1 2024/03/04 21:13:58 kls Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@ -409,6 +409,8 @@ cSetup::cSetup(void)
|
||||
SubtitleBgTransparency = 0;
|
||||
EPGLanguages[0] = -1;
|
||||
EPGScanTimeout = 5;
|
||||
EPGScanMaxChannel = 0;
|
||||
EPGPauseAfterScan = 0;
|
||||
EPGBugfixLevel = 3;
|
||||
EPGLinger = 0;
|
||||
SVDRPTimeout = 300;
|
||||
@ -637,6 +639,8 @@ bool cSetup::Parse(const char *Name, const char *Value)
|
||||
else if (!strcasecmp(Name, "SubtitleBgTransparency")) SubtitleBgTransparency = atoi(Value);
|
||||
else if (!strcasecmp(Name, "EPGLanguages")) return ParseLanguages(Value, EPGLanguages);
|
||||
else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
|
||||
else if (!strcasecmp(Name, "EPGScanMaxChannel")) EPGScanMaxChannel = atoi(Value);
|
||||
else if (!strcasecmp(Name, "EPGPauseAfterScan")) EPGPauseAfterScan = atoi(Value);
|
||||
else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
|
||||
else if (!strcasecmp(Name, "EPGLinger")) EPGLinger = atoi(Value);
|
||||
else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
|
||||
@ -769,6 +773,8 @@ bool cSetup::Save(void)
|
||||
Store("SubtitleBgTransparency", SubtitleBgTransparency);
|
||||
StoreLanguages("EPGLanguages", EPGLanguages);
|
||||
Store("EPGScanTimeout", EPGScanTimeout);
|
||||
Store("EPGScanMaxChannel", EPGScanMaxChannel);
|
||||
Store("EPGPauseAfterScan", EPGPauseAfterScan);
|
||||
Store("EPGBugfixLevel", EPGBugfixLevel);
|
||||
Store("EPGLinger", EPGLinger);
|
||||
Store("SVDRPTimeout", SVDRPTimeout);
|
||||
|
29
config.h
29
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.h 4.14 2017/12/09 14:15:58 kls Exp $
|
||||
* $Id: config.h 5.26 2025/02/26 10:35:03 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
@ -22,19 +22,21 @@
|
||||
|
||||
// VDR's own version number:
|
||||
|
||||
#define VDRVERSION "2.3.9"
|
||||
#define VDRVERSNUM 20309 // Version * 10000 + Major * 100 + Minor
|
||||
#define VDRVERSION "2.7.4"
|
||||
#define VDRVERSNUM 20704 // Version * 10000 + Major * 100 + Minor
|
||||
|
||||
// The plugin API's version number:
|
||||
|
||||
#define APIVERSION "2.3.9"
|
||||
#define APIVERSNUM 20309 // Version * 10000 + Major * 100 + Minor
|
||||
#define APIVERSION "6"
|
||||
#define APIVERSNUM 30006
|
||||
|
||||
// When loading plugins, VDR searches them by their APIVERSION, which
|
||||
// may be smaller than VDRVERSION in case there have been no changes to
|
||||
// VDR header files since the last APIVERSION. This allows compiled
|
||||
// When loading plugins, VDR searches files by their APIVERSION, which
|
||||
// is different from VDRVERSION. APIVERSION is a plain number, incremented
|
||||
// only when there are changes to the plugin API. This allows compiled
|
||||
// plugins to work with newer versions of the core VDR as long as no
|
||||
// VDR header files have changed.
|
||||
// interfaces have changed. APIVERSNUM begins with "300.." for backwards
|
||||
// compatibility and can be used in #if preprocessor statements to handle
|
||||
// version dependent code.
|
||||
|
||||
#define MAXPRIORITY 99
|
||||
#define MINPRIORITY (-MAXPRIORITY)
|
||||
@ -46,6 +48,13 @@
|
||||
|
||||
#define TIMERMACRO_TITLE "TITLE"
|
||||
#define TIMERMACRO_EPISODE "EPISODE"
|
||||
#define TIMERMACRO_BEFORE "{<}"
|
||||
#define TIMERMACRO_MATCH "{=}"
|
||||
#define TIMERMACRO_AFTER "{>}"
|
||||
|
||||
#define TIMERPATTERN_AVOID "@"
|
||||
#define TIMERPATTERN_BEGIN "^"
|
||||
#define TIMERPATTERN_END "$"
|
||||
|
||||
#define MINOSDWIDTH 480
|
||||
#define MAXOSDWIDTH 1920
|
||||
@ -284,6 +293,8 @@ public:
|
||||
int SubtitleOffset;
|
||||
int SubtitleFgTransparency, SubtitleBgTransparency;
|
||||
int EPGLanguages[I18N_MAX_LANGUAGES + 1];
|
||||
int EPGScanMaxChannel;
|
||||
int EPGPauseAfterScan;
|
||||
int EPGScanTimeout;
|
||||
int EPGBugfixLevel;
|
||||
int EPGLinger;
|
||||
|
66
cutter.c
66
cutter.c
@ -4,12 +4,11 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: cutter.c 4.6 2018/01/18 12:19:31 kls Exp $
|
||||
* $Id: cutter.c 5.4 2025/01/10 13:12:04 kls Exp $
|
||||
*/
|
||||
|
||||
#include "cutter.h"
|
||||
#include "menu.h"
|
||||
#include "recording.h"
|
||||
#include "remux.h"
|
||||
#include "videodir.h"
|
||||
|
||||
@ -232,6 +231,10 @@ private:
|
||||
int numSequences;
|
||||
off_t maxVideoFileSize;
|
||||
off_t fileSize;
|
||||
int frameErrors;
|
||||
time_t lastErrorHandling;
|
||||
cString editedRecordingName;
|
||||
cRecordingInfo *recordingInfo;
|
||||
bool suspensionLogged;
|
||||
int sequence; // cutting sequence
|
||||
int delta; // time between two frames (PTS ticks)
|
||||
@ -246,7 +249,7 @@ private:
|
||||
cPatPmtParser patPmtParser;
|
||||
bool Throttled(void);
|
||||
bool SwitchFile(bool Force = false);
|
||||
bool LoadFrame(int Index, uchar *Buffer, bool &Independent, int &Length);
|
||||
bool LoadFrame(int Index, uchar *Buffer, bool &Independent, int &Length, bool *Errors = NULL, bool *Missing = NULL);
|
||||
bool FramesAreEqual(int Index1, int Index2);
|
||||
void GetPendingPackets(uchar *Buffer, int &Length, int Index);
|
||||
// Gather all non-video TS packets from Index upward that either belong to
|
||||
@ -254,15 +257,16 @@ private:
|
||||
// and add them to the end of the given Data.
|
||||
bool FixFrame(uchar *Data, int &Length, bool Independent, int Index, bool CutIn, bool CutOut);
|
||||
bool ProcessSequence(int LastEndIndex, int BeginIndex, int EndIndex, int NextBeginIndex);
|
||||
void HandleErrors(bool Force = false);
|
||||
protected:
|
||||
virtual void Action(void);
|
||||
public:
|
||||
cCuttingThread(const char *FromFileName, const char *ToFileName);
|
||||
cCuttingThread(const char *FromFileName, const char *ToFileName, cRecordingInfo *RecordingInfo);
|
||||
virtual ~cCuttingThread();
|
||||
const char *Error(void) { return error; }
|
||||
};
|
||||
|
||||
cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName)
|
||||
cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName, cRecordingInfo *RecordingInfo)
|
||||
:cThread("video cutting", true)
|
||||
{
|
||||
error = NULL;
|
||||
@ -274,6 +278,10 @@ cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName)
|
||||
framesPerSecond = Recording.FramesPerSecond();
|
||||
suspensionLogged = false;
|
||||
fileSize = 0;
|
||||
frameErrors = 0;
|
||||
lastErrorHandling = 0;
|
||||
editedRecordingName = ToFileName;
|
||||
recordingInfo = RecordingInfo;
|
||||
sequence = 0;
|
||||
delta = int(round(PTSTICKS / framesPerSecond));
|
||||
lastVidPts = -1;
|
||||
@ -294,6 +302,10 @@ cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName)
|
||||
maxVideoFileSize = MEGABYTE(Setup.MaxVideoFileSize);
|
||||
if (isPesRecording && maxVideoFileSize > MEGABYTE(MAXVIDEOFILESIZEPES))
|
||||
maxVideoFileSize = MEGABYTE(MAXVIDEOFILESIZEPES);
|
||||
if (fromIndex->GetErrors()->Size() > 0) {
|
||||
recordingInfo->SetErrors(0); // the fromIndex has error indicators, so we reset the error count
|
||||
recordingInfo->Write();
|
||||
}
|
||||
Start();
|
||||
}
|
||||
else
|
||||
@ -328,11 +340,11 @@ bool cCuttingThread::Throttled(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cCuttingThread::LoadFrame(int Index, uchar *Buffer, bool &Independent, int &Length)
|
||||
bool cCuttingThread::LoadFrame(int Index, uchar *Buffer, bool &Independent, int &Length, bool *Errors, bool *Missing)
|
||||
{
|
||||
uint16_t FileNumber;
|
||||
off_t FileOffset;
|
||||
if (fromIndex->Get(Index, &FileNumber, &FileOffset, &Independent, &Length)) {
|
||||
if (fromIndex->Get(Index, &FileNumber, &FileOffset, &Independent, &Length, Errors, Missing)) {
|
||||
fromFile = fromFileName->SetOffset(FileNumber, FileOffset);
|
||||
if (fromFile) {
|
||||
fromFile->SetReadAhead(MEGABYTE(20));
|
||||
@ -555,7 +567,9 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn
|
||||
for (int Index = BeginIndex; Running() && Index < EndIndex; Index++) {
|
||||
bool Independent;
|
||||
int Length;
|
||||
if (LoadFrame(Index, Buffer, Independent, Length)) {
|
||||
bool Errors;
|
||||
bool Missing;
|
||||
if (LoadFrame(Index, Buffer, Independent, Length, &Errors, &Missing)) {
|
||||
// Make sure there is enough disk space:
|
||||
AssertFreeDiskSpace(-1);
|
||||
bool CutIn = !SeamlessBegin && Index == BeginIndex;
|
||||
@ -572,10 +586,12 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn
|
||||
return false;
|
||||
}
|
||||
// Write index:
|
||||
if (!DeletedFrame && !toIndex->Write(Independent, toFileName->Number(), fileSize)) {
|
||||
if (!DeletedFrame && !toIndex->Write(Independent, toFileName->Number(), fileSize, Errors, Missing)) {
|
||||
error = "toIndex";
|
||||
return false;
|
||||
}
|
||||
frameErrors += Errors + Missing;
|
||||
HandleErrors();
|
||||
// Write data:
|
||||
if (toFile->Write(Buffer, Length) < 0) {
|
||||
error = "safe_write";
|
||||
@ -596,6 +612,27 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn
|
||||
return true;
|
||||
}
|
||||
|
||||
#define ERROR_HANDLING_DELTA 1 // seconds between handling errors
|
||||
|
||||
void cCuttingThread::HandleErrors(bool Force)
|
||||
{
|
||||
if (Force || time(NULL) - lastErrorHandling >= ERROR_HANDLING_DELTA) {
|
||||
if (frameErrors > recordingInfo->Errors()) {
|
||||
recordingInfo->SetErrors(frameErrors);
|
||||
recordingInfo->Write();
|
||||
Force = true;
|
||||
}
|
||||
if (Force) {
|
||||
cStateKey StateKey;
|
||||
if (cRecordings *Recordings = cRecordings::GetRecordingsWrite(StateKey, 1)) {
|
||||
Recordings->UpdateByName(editedRecordingName);
|
||||
StateKey.Remove();
|
||||
}
|
||||
}
|
||||
lastErrorHandling = time(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void cCuttingThread::Action(void)
|
||||
{
|
||||
if (cMark *BeginMark = fromMarks.GetNextBegin()) {
|
||||
@ -604,6 +641,7 @@ void cCuttingThread::Action(void)
|
||||
if (!fromFile || !toFile)
|
||||
return;
|
||||
int LastEndIndex = -1;
|
||||
HandleErrors(true); // to make sure an initially reset error count is displayed correctly
|
||||
while (BeginMark && Running()) {
|
||||
// Suspend cutting if we have severe throughput problems:
|
||||
if (Throttled()) {
|
||||
@ -634,6 +672,7 @@ void cCuttingThread::Action(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
HandleErrors(true);
|
||||
}
|
||||
else
|
||||
esyslog("no editing marks found!");
|
||||
@ -642,6 +681,7 @@ void cCuttingThread::Action(void)
|
||||
// --- cCutter ---------------------------------------------------------------
|
||||
|
||||
cCutter::cCutter(const char *FileName)
|
||||
:recordingInfo(FileName)
|
||||
{
|
||||
cuttingThread = NULL;
|
||||
error = false;
|
||||
@ -676,8 +716,11 @@ bool cCutter::Start(void)
|
||||
if (strcmp(originalVersionName, editedVersionName) != 0) { // names must be different!
|
||||
cRecordingUserCommand::InvokeCommand(RUC_EDITINGRECORDING, editedVersionName, originalVersionName);
|
||||
if (cVideoDirectory::RemoveVideoFile(editedVersionName) && MakeDirs(editedVersionName, true)) {
|
||||
Recording.WriteInfo(editedVersionName);
|
||||
cuttingThread = new cCuttingThread(originalVersionName, editedVersionName);
|
||||
recordingInfo.Read();
|
||||
recordingInfo.SetFileName(editedVersionName);
|
||||
recordingInfo.Write();
|
||||
SetRecordingTimerId(editedVersionName, cString::sprintf("%d@%s", 0, Setup.SVDRPHostName));
|
||||
cuttingThread = new cCuttingThread(originalVersionName, editedVersionName, &recordingInfo);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -693,6 +736,7 @@ void cCutter::Stop(void)
|
||||
const char *Error = cuttingThread ? cuttingThread->Error() : NULL;
|
||||
delete cuttingThread;
|
||||
cuttingThread = NULL;
|
||||
SetRecordingTimerId(editedVersionName, NULL);
|
||||
if ((Interrupted || Error) && *editedVersionName) {
|
||||
if (Interrupted)
|
||||
isyslog("editing process has been interrupted");
|
||||
|
4
cutter.h
4
cutter.h
@ -4,12 +4,13 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: cutter.h 3.1 2013/10/05 11:34:55 kls Exp $
|
||||
* $Id: cutter.h 5.1 2024/09/19 20:21:58 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CUTTER_H
|
||||
#define __CUTTER_H
|
||||
|
||||
#include "recording.h"
|
||||
#include "thread.h"
|
||||
#include "tools.h"
|
||||
|
||||
@ -19,6 +20,7 @@ class cCutter {
|
||||
private:
|
||||
cString originalVersionName;
|
||||
cString editedVersionName;
|
||||
cRecordingInfo recordingInfo;
|
||||
cCuttingThread *cuttingThread;
|
||||
bool error;
|
||||
public:
|
||||
|
203
device.c
203
device.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: device.c 4.26 2018/01/27 14:45:08 kls Exp $
|
||||
* $Id: device.c 5.14 2024/07/06 11:19:21 kls Exp $
|
||||
*/
|
||||
|
||||
#include "device.h"
|
||||
@ -58,6 +58,11 @@ bool cDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChanne
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cDeviceHook::DeviceProvidesEIT(const cDevice *Device) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// --- cDevice ---------------------------------------------------------------
|
||||
|
||||
// The minimum number of unknown PS1 packets to consider this a "pre 1.3.19 private stream":
|
||||
@ -75,9 +80,9 @@ cDevice::cDevice(void)
|
||||
:patPmtParser(true)
|
||||
{
|
||||
cardIndex = nextCardIndex++;
|
||||
dsyslog("new device number %d", CardIndex() + 1);
|
||||
dsyslog("new device number %d (card index %d)", numDevices + 1, CardIndex() + 1);
|
||||
|
||||
SetDescription("device %d receiver", CardIndex() + 1);
|
||||
SetDescription("device %d receiver", numDevices + 1);
|
||||
|
||||
mute = false;
|
||||
volume = Setup.CurrentVolume;
|
||||
@ -90,7 +95,9 @@ cDevice::cDevice(void)
|
||||
|
||||
camSlot = NULL;
|
||||
|
||||
occupiedFrom = 0;
|
||||
occupiedTimeout = 0;
|
||||
occupiedPriority = MINPRIORITY;
|
||||
|
||||
player = NULL;
|
||||
isPlayingVideo = false;
|
||||
@ -195,6 +202,7 @@ bool cDevice::SetPrimaryDevice(int n)
|
||||
primaryDevice->MakePrimaryDevice(true);
|
||||
primaryDevice->SetVideoFormat(Setup.VideoFormat);
|
||||
primaryDevice->SetVolumeDevice(Setup.CurrentVolume);
|
||||
Setup.PrimaryDVB = n + 1;
|
||||
return true;
|
||||
}
|
||||
esyslog("ERROR: invalid primary device number: %d", n + 1);
|
||||
@ -229,11 +237,11 @@ static int GetClippedNumProvidedSystems(int AvailableBits, cDevice *Device)
|
||||
int MaxNumProvidedSystems = (1 << AvailableBits) - 1;
|
||||
int NumProvidedSystems = Device->NumProvidedSystems();
|
||||
if (NumProvidedSystems > MaxNumProvidedSystems) {
|
||||
esyslog("ERROR: device %d supports %d modulation systems but cDevice::GetDevice() currently only supports %d delivery systems which should be fixed", Device->CardIndex() + 1, NumProvidedSystems, MaxNumProvidedSystems);
|
||||
esyslog("ERROR: device %d supports %d modulation systems but cDevice::GetDevice() currently only supports %d delivery systems which should be fixed", Device->DeviceNumber() + 1, NumProvidedSystems, MaxNumProvidedSystems);
|
||||
NumProvidedSystems = MaxNumProvidedSystems;
|
||||
}
|
||||
else if (NumProvidedSystems <= 0) {
|
||||
esyslog("ERROR: device %d reported an invalid number (%d) of supported delivery systems - assuming 1", Device->CardIndex() + 1, NumProvidedSystems);
|
||||
esyslog("ERROR: device %d reported an invalid number (%d) of supported delivery systems - assuming 1", Device->DeviceNumber() + 1, NumProvidedSystems);
|
||||
NumProvidedSystems = 1;
|
||||
}
|
||||
return NumProvidedSystems;
|
||||
@ -243,7 +251,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
|
||||
{
|
||||
// Collect the current priorities of all CAM slots that can decrypt the channel:
|
||||
int NumCamSlots = CamSlots.Count();
|
||||
int SlotPriority[NumCamSlots];
|
||||
int SlotPriority[NumCamSlots + 1]; // +1 to avoid a zero sized array in case there are no CAM slots
|
||||
int NumUsableSlots = 0;
|
||||
bool InternalCamNeeded = false;
|
||||
if (Channel->Ca() >= CA_ENCRYPTED_MIN) {
|
||||
@ -271,15 +279,19 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
|
||||
if (NumUsableSlots && SlotPriority[j] > MAXPRIORITY)
|
||||
continue; // there is no CAM available in this slot
|
||||
for (int i = 0; i < numDevices; i++) {
|
||||
if (Channel->Ca() && Channel->Ca() <= CA_DVB_MAX && Channel->Ca() != device[i]->CardIndex() + 1)
|
||||
if (Channel->Ca() && Channel->Ca() <= CA_DVB_MAX && Channel->Ca() != device[i]->DeviceNumber() + 1)
|
||||
continue; // a specific card was requested, but not this one
|
||||
bool HasInternalCam = device[i]->HasInternalCam();
|
||||
if (InternalCamNeeded && !HasInternalCam)
|
||||
continue; // no CAM is able to decrypt this channel and the device uses vdr handled CAMs
|
||||
if (NumUsableSlots && !HasInternalCam && !CamSlots.Get(j)->Assign(device[i], true))
|
||||
continue; // CAM slot can't be used with this device
|
||||
bool ndr;
|
||||
if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basically able to do the job
|
||||
bool ndr = false;
|
||||
bool TunedToTransponder = device[i]->IsTunedToTransponder(Channel);
|
||||
if (TunedToTransponder || device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basically able to do the job
|
||||
bool OccupiedOtherTransponder = !TunedToTransponder && device[i]->Occupied();
|
||||
if (OccupiedOtherTransponder)
|
||||
ndr = true;
|
||||
if (NumUsableSlots && !HasInternalCam) {
|
||||
if (cCamSlot *csi = device[i]->CamSlot()) {
|
||||
cCamSlot *csj = CamSlots.Get(j);
|
||||
@ -297,10 +309,10 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
|
||||
imp <<= 1; imp |= (LiveView && NumUsableSlots && !HasInternalCam) ? !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlots.Get(j)->MasterSlotNumber()) || ndr : 0; // prefer CAMs that are known to decrypt this channel for live viewing, if we don't need to detach existing receivers
|
||||
imp <<= 1; imp |= LiveView ? !device[i]->IsPrimaryDevice() || ndr : 0; // prefer the primary device for live viewing if we don't need to detach existing receivers
|
||||
imp <<= 1; imp |= !device[i]->Receiving() && (device[i] != cTransferControl::ReceiverDevice() || device[i]->IsPrimaryDevice()) || ndr; // use receiving devices if we don't need to detach existing receivers, but avoid primary device in local transfer mode
|
||||
imp <<= 1; imp |= device[i]->Receiving(); // avoid devices that are receiving
|
||||
imp <<= 4; imp |= GetClippedNumProvidedSystems(4, device[i]) - 1; // avoid cards which support multiple delivery systems
|
||||
imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device
|
||||
imp <<= 1; imp |= device[i]->Receiving() || OccupiedOtherTransponder; // avoid devices that are receiving
|
||||
imp <<= 5; imp |= GetClippedNumProvidedSystems(5, device[i]) - 1; // avoid cards which support multiple delivery systems
|
||||
imp <<= 8; imp |= device[i]->Priority() - IDLEPRIORITY; // use the device with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used)
|
||||
imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device
|
||||
imp <<= 8; imp |= ((NumUsableSlots && !HasInternalCam) ? SlotPriority[j] : IDLEPRIORITY) - IDLEPRIORITY;// use the CAM slot with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used)
|
||||
imp <<= 1; imp |= ndr; // avoid devices if we need to detach existing receivers
|
||||
imp <<= 1; imp |= (NumUsableSlots || InternalCamNeeded) ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels
|
||||
@ -315,6 +327,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
|
||||
if (NumUsableSlots && !HasInternalCam)
|
||||
s = CamSlots.Get(j);
|
||||
}
|
||||
//dsyslog("device %d provides channel %d prio %d ndr %d imp %.8X", device[i]->DeviceNumber() + 1, Channel->Number(), Priority, ndr, imp);
|
||||
}
|
||||
}
|
||||
if (!NumUsableSlots)
|
||||
@ -420,8 +433,9 @@ cDevice *cDevice::GetDeviceForTransponder(const cChannel *Channel, int Priority)
|
||||
return d; // if any device is tuned to the transponder, we're done
|
||||
if (d->ProvidesTransponder(Channel)) {
|
||||
if (d->MaySwitchTransponder(Channel))
|
||||
Device = d; // this device may switch to the transponder without disturbing any receiver or live view
|
||||
else if (!d->Occupied() && d->MaySwitchTransponder(Channel)) { // MaySwitchTransponder() implicitly calls Occupied()
|
||||
return d; // this device may switch to the transponder without disturbing any receiver or live view
|
||||
else if (!d->Occupied(Priority) && !d->IsBonded() && d->Priority(true) < LIVEPRIORITY) { // MaySwitchTransponder() implicitly calls Occupied()
|
||||
// we select only devices with priority < LIVEPRIORITY, so device can be switched without impact on recordings or live viewing
|
||||
if (d->Priority() < Priority && (!Device || d->Priority() < Device->Priority()))
|
||||
Device = d; // use this one only if no other with less impact can be found
|
||||
}
|
||||
@ -431,6 +445,12 @@ cDevice *cDevice::GetDeviceForTransponder(const cChannel *Channel, int Priority)
|
||||
return Device;
|
||||
}
|
||||
|
||||
void cDevice::ReleaseCamSlot(void)
|
||||
{
|
||||
if (camSlot && !camSlot->IsDecrypting() && !camSlot->IsActivating())
|
||||
camSlot->Assign(NULL);
|
||||
}
|
||||
|
||||
bool cDevice::HasCi(void)
|
||||
{
|
||||
return false;
|
||||
@ -524,7 +544,7 @@ void cDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect)
|
||||
PixelAspect = 1.0;
|
||||
}
|
||||
|
||||
//#define PRINTPIDS(s) { char b[500]; char *q = b; q += sprintf(q, "%d %s ", CardIndex(), s); for (int i = 0; i < MAXPIDHANDLES; i++) q += sprintf(q, " %s%4d %d", i == ptOther ? "* " : "", pidHandles[i].pid, pidHandles[i].used); dsyslog("%s", b); }
|
||||
//#define PRINTPIDS(s) { char b[500]; char *q = b; q += sprintf(q, "%d %s ", DeviceNumber() + 1, s); for (int i = 0; i < MAXPIDHANDLES; i++) q += sprintf(q, " %s%4d %d", i == ptOther ? "* " : "", pidHandles[i].pid, pidHandles[i].used); dsyslog("%s", b); }
|
||||
#define PRINTPIDS(s)
|
||||
|
||||
bool cDevice::HasPid(int Pid) const
|
||||
@ -559,7 +579,7 @@ bool cDevice::AddPid(int Pid, ePidType PidType, int StreamType)
|
||||
// It's a special PID that may have to be switched into "tap" mode
|
||||
PRINTPIDS("A");
|
||||
if (!SetPid(&pidHandles[n], n, true)) {
|
||||
esyslog("ERROR: can't set PID %d on device %d", Pid, CardIndex() + 1);
|
||||
esyslog("ERROR: can't set PID %d on device %d", Pid, DeviceNumber() + 1);
|
||||
if (PidType <= ptTeletext)
|
||||
DetachAll(Pid);
|
||||
DelPid(Pid, PidType);
|
||||
@ -580,7 +600,7 @@ bool cDevice::AddPid(int Pid, ePidType PidType, int StreamType)
|
||||
n = a;
|
||||
}
|
||||
else {
|
||||
esyslog("ERROR: no free slot for PID %d on device %d", Pid, CardIndex() + 1);
|
||||
esyslog("ERROR: no free slot for PID %d on device %d", Pid, DeviceNumber() + 1);
|
||||
return false;
|
||||
}
|
||||
if (n >= 0) {
|
||||
@ -589,7 +609,7 @@ bool cDevice::AddPid(int Pid, ePidType PidType, int StreamType)
|
||||
pidHandles[n].used = 1;
|
||||
PRINTPIDS("C");
|
||||
if (!SetPid(&pidHandles[n], n, true)) {
|
||||
esyslog("ERROR: can't set PID %d on device %d", Pid, CardIndex() + 1);
|
||||
esyslog("ERROR: can't set PID %d on device %d", Pid, DeviceNumber() + 1);
|
||||
if (PidType <= ptTeletext)
|
||||
DetachAll(Pid);
|
||||
DelPid(Pid, PidType);
|
||||
@ -661,11 +681,11 @@ void cDevice::StartSectionHandler(void)
|
||||
void cDevice::StopSectionHandler(void)
|
||||
{
|
||||
if (sectionHandler) {
|
||||
delete sectionHandler; // automatically detaches filters
|
||||
delete nitFilter;
|
||||
delete sdtFilter;
|
||||
delete patFilter;
|
||||
delete eitFilter;
|
||||
delete sectionHandler;
|
||||
nitFilter = NULL;
|
||||
sdtFilter = NULL;
|
||||
patFilter = NULL;
|
||||
@ -717,6 +737,17 @@ bool cDevice::DeviceHooksProvidesTransponder(const cChannel *Channel) const
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cDevice::DeviceHooksProvidesEIT(void) const
|
||||
{
|
||||
cDeviceHook *Hook = deviceHooks.First();
|
||||
while (Hook) {
|
||||
if (!Hook->DeviceProvidesEIT(this))
|
||||
return false;
|
||||
Hook = deviceHooks.Next(Hook);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cDevice::ProvidesTransponder(const cChannel *Channel) const
|
||||
{
|
||||
return false;
|
||||
@ -778,7 +809,17 @@ bool cDevice::IsTunedToTransponder(const cChannel *Channel) const
|
||||
|
||||
bool cDevice::MaySwitchTransponder(const cChannel *Channel) const
|
||||
{
|
||||
return time(NULL) > occupiedTimeout && !Receiving() && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid);
|
||||
return !Occupied() && !Receiving() && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid);
|
||||
}
|
||||
|
||||
void cDevice::SetPowerSaveMode(bool On)
|
||||
{
|
||||
}
|
||||
|
||||
void cDevice::SetPowerSaveIfUnused(void)
|
||||
{
|
||||
if (!Occupied() && !Receiving() && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid))
|
||||
SetPowerSaveMode(true);
|
||||
}
|
||||
|
||||
bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
|
||||
@ -786,13 +827,14 @@ bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
|
||||
if (LiveView) {
|
||||
isyslog("switching to channel %d %s (%s)", Channel->Number(), *Channel->GetChannelID().ToString(), Channel->Name());
|
||||
cControl::Shutdown(); // prevents old channel from being shown too long if GetDevice() takes longer
|
||||
// and, if decrypted, this removes the now superfluous PIDs from the CAM, too
|
||||
}
|
||||
for (int i = 3; i--;) {
|
||||
switch (SetChannel(Channel, LiveView)) {
|
||||
case scrOk: return true;
|
||||
case scrNotAvailable: Skins.Message(mtInfo, tr("Channel not available!"));
|
||||
case scrNotAvailable: Skins.QueueMessage(mtInfo, tr("Channel not available!"));
|
||||
return false;
|
||||
case scrNoTransfer: Skins.Message(mtError, tr("Can't start Transfer Mode!"));
|
||||
case scrNoTransfer: Skins.QueueMessage(mtError, tr("Can't start Transfer Mode!"));
|
||||
return false;
|
||||
case scrFailed: break; // loop will retry
|
||||
default: esyslog("ERROR: invalid return value from SetChannel");
|
||||
@ -808,6 +850,7 @@ bool cDevice::SwitchChannel(int Direction)
|
||||
Direction = sgn(Direction);
|
||||
if (Direction) {
|
||||
cControl::Shutdown(); // prevents old channel from being shown too long if GetDevice() takes longer
|
||||
// and, if decrypted, this removes the now superfluous PIDs from the CAM, too
|
||||
int n = CurrentChannel() + Direction;
|
||||
int first = n;
|
||||
LOCK_CHANNELS_READ;
|
||||
@ -828,7 +871,7 @@ bool cDevice::SwitchChannel(int Direction)
|
||||
result = true;
|
||||
}
|
||||
else if (n != first)
|
||||
Skins.Message(mtError, tr("Channel not available!"));
|
||||
Skins.QueueMessage(mtError, tr("Channel not available!"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -839,12 +882,19 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||
cStatus::MsgChannelSwitch(this, 0, LiveView);
|
||||
|
||||
if (LiveView) {
|
||||
if (IsPrimaryDevice() && !Replaying() && !Transferring()) { // this is only for FF DVB cards!
|
||||
LOCK_CHANNELS_READ;
|
||||
if (const cChannel *ch = Channels->GetByNumber(currentChannel)) {
|
||||
if (patFilter)
|
||||
patFilter->Release(ch->Sid());
|
||||
}
|
||||
}
|
||||
StopReplay();
|
||||
DELETENULL(liveSubtitle);
|
||||
DELETENULL(dvbSubtitleConverter);
|
||||
}
|
||||
|
||||
cDevice *Device = (LiveView && IsPrimaryDevice()) ? GetDevice(Channel, LIVEPRIORITY, true) : this;
|
||||
cDevice *Device = (LiveView && IsPrimaryDevice(false)) ? GetDevice(Channel, LIVEPRIORITY, true) : this;
|
||||
|
||||
bool NeedsTransferMode = LiveView && Device != PrimaryDevice();
|
||||
// If the CAM slot wants the TS data, we need to switch to Transfer Mode:
|
||||
@ -876,11 +926,10 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||
// channel to it, for possible later decryption:
|
||||
if (camSlot)
|
||||
camSlot->AddChannel(Channel);
|
||||
SetPowerSaveMode(false);
|
||||
if (SetChannelDevice(Channel, LiveView)) {
|
||||
// Start section handling:
|
||||
if (sectionHandler) {
|
||||
if (patFilter)
|
||||
patFilter->Trigger(Channel->Sid());
|
||||
sectionHandler->SetChannel(Channel);
|
||||
sectionHandler->SetStatus(true);
|
||||
}
|
||||
@ -893,21 +942,26 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||
}
|
||||
|
||||
if (Result == scrOk) {
|
||||
if (LiveView && IsPrimaryDevice()) {
|
||||
currentChannel = Channel->Number();
|
||||
// Set the available audio tracks:
|
||||
ClrAvailableTracks();
|
||||
for (int i = 0; i < MAXAPIDS; i++)
|
||||
SetAvailableTrack(ttAudio, i, Channel->Apid(i), Channel->Alang(i));
|
||||
if (Setup.UseDolbyDigital) {
|
||||
for (int i = 0; i < MAXDPIDS; i++)
|
||||
SetAvailableTrack(ttDolby, i, Channel->Dpid(i), Channel->Dlang(i));
|
||||
if (LiveView) {
|
||||
if (IsPrimaryDevice(false))
|
||||
currentChannel = Channel->Number();
|
||||
if (IsPrimaryDevice()) {
|
||||
if (patFilter) // this is only for FF DVB cards!
|
||||
patFilter->Request(Channel->Sid());
|
||||
// Set the available audio tracks:
|
||||
ClrAvailableTracks();
|
||||
for (int i = 0; i < MAXAPIDS; i++)
|
||||
SetAvailableTrack(ttAudio, i, Channel->Apid(i), Channel->Alang(i));
|
||||
if (Setup.UseDolbyDigital) {
|
||||
for (int i = 0; i < MAXDPIDS; i++)
|
||||
SetAvailableTrack(ttDolby, i, Channel->Dpid(i), Channel->Dlang(i));
|
||||
}
|
||||
for (int i = 0; i < MAXSPIDS; i++)
|
||||
SetAvailableTrack(ttSubtitle, i, Channel->Spid(i), Channel->Slang(i));
|
||||
if (!NeedsTransferMode)
|
||||
EnsureAudioTrack(true);
|
||||
EnsureSubtitleTrack();
|
||||
}
|
||||
for (int i = 0; i < MAXSPIDS; i++)
|
||||
SetAvailableTrack(ttSubtitle, i, Channel->Spid(i), Channel->Slang(i));
|
||||
if (!NeedsTransferMode)
|
||||
EnsureAudioTrack(true);
|
||||
EnsureSubtitleTrack();
|
||||
}
|
||||
cStatus::MsgChannelSwitch(this, Channel->Number(), LiveView); // only report status if channel switch successful
|
||||
}
|
||||
@ -919,21 +973,34 @@ void cDevice::ForceTransferMode(void)
|
||||
{
|
||||
if (!cTransferControl::ReceiverDevice()) {
|
||||
LOCK_CHANNELS_READ;
|
||||
if (const cChannel *Channel = Channels->GetByNumber(CurrentChannel()))
|
||||
if (const cChannel *Channel = Channels->GetByNumber(CurrentChannel())) {
|
||||
SetPowerSaveMode(false);
|
||||
SetChannelDevice(Channel, false); // this implicitly starts Transfer Mode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int cDevice::Occupied(void) const
|
||||
int cDevice::Occupied(int Priority) const
|
||||
{
|
||||
if (Priority > occupiedPriority)
|
||||
return 0;
|
||||
int Seconds = occupiedTimeout - time(NULL);
|
||||
return Seconds > 0 ? Seconds : 0;
|
||||
}
|
||||
|
||||
void cDevice::SetOccupied(int Seconds)
|
||||
void cDevice::SetOccupied(int Seconds, int Priority, time_t From)
|
||||
{
|
||||
if (Seconds >= 0)
|
||||
occupiedTimeout = time(NULL) + min(Seconds, MAXOCCUPIEDTIMEOUT);
|
||||
if (Seconds < 0)
|
||||
return;
|
||||
if (From == 0)
|
||||
From = time(NULL);
|
||||
if (From == occupiedFrom)
|
||||
occupiedPriority = max(Priority, occupiedPriority);
|
||||
else {
|
||||
occupiedPriority = Priority;
|
||||
occupiedFrom = From;
|
||||
}
|
||||
occupiedTimeout = From + min(Seconds, MAXOCCUPIEDTIMEOUT);
|
||||
}
|
||||
|
||||
bool cDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
||||
@ -1562,7 +1629,6 @@ int cDevice::PlayTsSubtitle(const uchar *Data, int Length)
|
||||
return Length;
|
||||
}
|
||||
|
||||
//TODO detect and report continuity errors?
|
||||
int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
|
||||
{
|
||||
int Played = 0;
|
||||
@ -1626,11 +1692,13 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
|
||||
return Played;
|
||||
}
|
||||
|
||||
int cDevice::Priority(void) const
|
||||
int cDevice::Priority(bool IgnoreOccupied) const
|
||||
{
|
||||
int priority = IDLEPRIORITY;
|
||||
if (IsPrimaryDevice() && !Replaying() && HasProgramme())
|
||||
priority = TRANSFERPRIORITY; // we use the same value here, no matter whether it's actual Transfer Mode or real live viewing
|
||||
if (!IgnoreOccupied && time(NULL) <= occupiedTimeout && occupiedPriority > priority)
|
||||
priority = occupiedPriority - 1; // so timers with occupiedPriority can start
|
||||
cMutexLock MutexLock(&mutexReceiver);
|
||||
for (int i = 0; i < MAXRECEIVERS; i++) {
|
||||
if (receiver[i])
|
||||
@ -1755,7 +1823,7 @@ bool cDevice::AttachReceiver(cReceiver *Receiver)
|
||||
#ifdef WAIT_FOR_TUNER_LOCK
|
||||
#define TUNER_LOCK_TIMEOUT 5000 // ms
|
||||
if (!HasLock(TUNER_LOCK_TIMEOUT)) {
|
||||
esyslog("ERROR: device %d has no lock, can't attach receiver!", CardIndex() + 1);
|
||||
esyslog("ERROR: device %d has no lock, can't attach receiver!", DeviceNumber() + 1);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
@ -1783,11 +1851,13 @@ bool cDevice::AttachReceiver(cReceiver *Receiver)
|
||||
Receiver->scramblingTimeout = TS_SCRAMBLING_TIMEOUT;
|
||||
bool KnownToDecrypt = ChannelCamRelations.CamDecrypt(Receiver->ChannelID(), camSlot->MasterSlotNumber());
|
||||
if (KnownToDecrypt)
|
||||
Receiver->scramblingTimeout *= 10; // give it time to receive ECM/EMM
|
||||
Receiver->scramblingTimeout *= 9; // give it time to receive ECM/EMM (must be less than MAXBROKENTIMEOUT in recorder.c!)
|
||||
if (Receiver->ChannelID().Valid())
|
||||
dsyslog("CAM %d: %sknown to decrypt channel %s (scramblingTimeout = %ds)", camSlot->MasterSlotNumber(), KnownToDecrypt ? "" : "not ", *Receiver->ChannelID().ToString(), Receiver->scramblingTimeout);
|
||||
}
|
||||
}
|
||||
if (patFilter && Receiver->ChannelID().Valid())
|
||||
patFilter->Request(Receiver->ChannelID().Sid());
|
||||
Start();
|
||||
return true;
|
||||
}
|
||||
@ -1796,29 +1866,30 @@ bool cDevice::AttachReceiver(cReceiver *Receiver)
|
||||
return false;
|
||||
}
|
||||
|
||||
void cDevice::Detach(cReceiver *Receiver)
|
||||
void cDevice::Detach(cReceiver *Receiver, bool ReleaseCam)
|
||||
{
|
||||
if (!Receiver || Receiver->device != this)
|
||||
return;
|
||||
bool receiversLeft = false;
|
||||
mutexReceiver.Lock();
|
||||
for (int i = 0; i < MAXRECEIVERS; i++) {
|
||||
if (receiver[i] == Receiver) {
|
||||
if (receiver[i] == Receiver)
|
||||
receiver[i] = NULL;
|
||||
Receiver->device = NULL;
|
||||
Receiver->Activate(false);
|
||||
for (int n = 0; n < Receiver->numPids; n++)
|
||||
DelPid(Receiver->pids[n]);
|
||||
}
|
||||
else if (receiver[i])
|
||||
receiversLeft = true;
|
||||
}
|
||||
if (patFilter && Receiver->ChannelID().Valid())
|
||||
patFilter->Release(Receiver->ChannelID().Sid());
|
||||
mutexReceiver.Unlock();
|
||||
Receiver->device = NULL;
|
||||
Receiver->Activate(false);
|
||||
for (int n = 0; n < Receiver->numPids; n++)
|
||||
DelPid(Receiver->pids[n]);
|
||||
if (camSlot) {
|
||||
if (Receiver->priority > MINPRIORITY) { // priority check to avoid an infinite loop with the CAM slot's caPidReceiver
|
||||
camSlot->StartDecrypting();
|
||||
if (!camSlot->IsDecrypting() && !camSlot->IsActivating())
|
||||
camSlot->Assign(NULL);
|
||||
if (ReleaseCam)
|
||||
ReleaseCamSlot();
|
||||
}
|
||||
}
|
||||
if (!receiversLeft)
|
||||
@ -1832,8 +1903,9 @@ void cDevice::DetachAll(int Pid)
|
||||
for (int i = 0; i < MAXRECEIVERS; i++) {
|
||||
cReceiver *Receiver = receiver[i];
|
||||
if (Receiver && Receiver->WantsPid(Pid))
|
||||
Detach(Receiver);
|
||||
Detach(Receiver, false);
|
||||
}
|
||||
ReleaseCamSlot();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1841,16 +1913,17 @@ void cDevice::DetachAllReceivers(void)
|
||||
{
|
||||
cMutexLock MutexLock(&mutexReceiver);
|
||||
for (int i = 0; i < MAXRECEIVERS; i++)
|
||||
Detach(receiver[i]);
|
||||
Detach(receiver[i], false);
|
||||
ReleaseCamSlot();
|
||||
}
|
||||
|
||||
// --- cTSBuffer -------------------------------------------------------------
|
||||
|
||||
cTSBuffer::cTSBuffer(int File, int Size, int CardIndex)
|
||||
cTSBuffer::cTSBuffer(int File, int Size, int DeviceNumber)
|
||||
{
|
||||
SetDescription("device %d TS buffer", CardIndex);
|
||||
SetDescription("device %d TS buffer", DeviceNumber);
|
||||
f = File;
|
||||
cardIndex = CardIndex;
|
||||
deviceNumber = DeviceNumber;
|
||||
delivered = 0;
|
||||
ringBuffer = new cRingBufferLinear(Size, TS_SIZE, true, "TS");
|
||||
ringBuffer->SetTimeouts(100, 100);
|
||||
@ -1875,7 +1948,7 @@ void cTSBuffer::Action(void)
|
||||
int r = ringBuffer->Read(f);
|
||||
if (r < 0 && FATALERRNO) {
|
||||
if (errno == EOVERFLOW)
|
||||
esyslog("ERROR: driver buffer overflow on device %d", cardIndex);
|
||||
esyslog("ERROR: driver buffer overflow on device %d", deviceNumber);
|
||||
else {
|
||||
LOG_ERROR;
|
||||
break;
|
||||
@ -1906,7 +1979,7 @@ uchar *cTSBuffer::Get(int *Available, bool CheckAvailable)
|
||||
}
|
||||
}
|
||||
ringBuffer->Del(Count);
|
||||
esyslog("ERROR: skipped %d bytes to sync on TS packet on device %d", Count, cardIndex);
|
||||
esyslog("ERROR: skipped %d bytes to sync on TS packet on device %d", Count, deviceNumber);
|
||||
return NULL;
|
||||
}
|
||||
delivered = TS_SIZE;
|
||||
|
60
device.h
60
device.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: device.h 4.12 2017/11/02 14:47:33 kls Exp $
|
||||
* $Id: device.h 5.6 2024/07/15 14:42:22 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DEVICE_H
|
||||
@ -95,6 +95,8 @@ public:
|
||||
///< program ends.
|
||||
virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const;
|
||||
///< Returns true if the given Device can provide the given Channel's transponder.
|
||||
virtual bool DeviceProvidesEIT(const cDevice *Device) const;
|
||||
///< Returns true if the given Device can provide EIT data.
|
||||
};
|
||||
|
||||
/// The cDevice class is the base from which actual devices can be derived.
|
||||
@ -176,6 +178,9 @@ public:
|
||||
///< the transponder of the given Channel, without disturbing any receiver
|
||||
///< at priorities higher or equal to Priority.
|
||||
///< If no such device is currently available, NULL will be returned.
|
||||
///< Devices recording (Device->Priority(true) >= LIVEPRIORITY) will not be returned,
|
||||
///< even if Priority >= LIVEPRIORITY. Such higher priorities are only used to
|
||||
///< override occupied.
|
||||
static void Shutdown(void);
|
||||
///< Closes down all devices.
|
||||
///< Must be called at the end of the program.
|
||||
@ -209,8 +214,13 @@ protected:
|
||||
///< device (On = false), it should do so in this function.
|
||||
///< A derived class must call the MakePrimaryDevice() function of its
|
||||
///< base class.
|
||||
virtual bool IsBonded(void) const { return false; }
|
||||
///< Returns true if this device is bonded to an other device.
|
||||
///< Only implemented by cDvbDevice and used in GetDeviceForTransponder().
|
||||
///< May be dropped in a future version, if a better solution is found.
|
||||
///< Do not use otherwise!
|
||||
public:
|
||||
bool IsPrimaryDevice(void) const { return this == primaryDevice && HasDecoder(); }
|
||||
bool IsPrimaryDevice(bool CheckDecoder = true) const { return this == primaryDevice && (!CheckDecoder || HasDecoder()); }
|
||||
int CardIndex(void) const { return cardIndex; }
|
||||
///< Returns the card index of this device (0 ... MAXDEVICES - 1).
|
||||
int DeviceNumber(void) const;
|
||||
@ -236,6 +246,7 @@ private:
|
||||
static cList<cDeviceHook> deviceHooks;
|
||||
protected:
|
||||
bool DeviceHooksProvidesTransponder(const cChannel *Channel) const;
|
||||
bool DeviceHooksProvidesEIT(void) const;
|
||||
|
||||
// SPU facilities
|
||||
|
||||
@ -251,7 +262,9 @@ public:
|
||||
|
||||
private:
|
||||
mutable cMutex mutexChannel;
|
||||
time_t occupiedFrom;
|
||||
time_t occupiedTimeout;
|
||||
int occupiedPriority;
|
||||
protected:
|
||||
static int currentChannel;
|
||||
public:
|
||||
@ -332,7 +345,15 @@ public:
|
||||
///< Returns true if it is ok to switch to the Channel's transponder on this
|
||||
///< device, without disturbing any other activities. If an occupied timeout
|
||||
///< has been set for this device, and that timeout has not yet expired,
|
||||
///< this function returns false,
|
||||
///< this function returns false.
|
||||
virtual void SetPowerSaveMode(bool On);
|
||||
///< Puts the device into power save mode, if applicable.
|
||||
///< If On is true, power save mode shall be activated, if it is false,
|
||||
///< normal operating mode shall be restored.
|
||||
///< The default implementation does nothing.
|
||||
void SetPowerSaveIfUnused(void);
|
||||
///< Sets this device into a power save mode if it is not currently used and
|
||||
///< has implemented SetPowerSaveMode().
|
||||
bool SwitchChannel(const cChannel *Channel, bool LiveView);
|
||||
///< Switches the device to the given Channel, initiating transfer mode
|
||||
///< if necessary.
|
||||
@ -349,21 +370,16 @@ protected:
|
||||
public:
|
||||
static int CurrentChannel(void) { return primaryDevice ? currentChannel : 0; }
|
||||
///< Returns the number of the current channel on the primary device.
|
||||
#ifndef DEPRECATED_SETCURRENTCHANNEL
|
||||
#define DEPRECATED_SETCURRENTCHANNEL 1
|
||||
#endif
|
||||
#if DEPRECATED_SETCURRENTCHANNEL
|
||||
static void SetCurrentChannel(const cChannel *Channel) { currentChannel = Channel ? Channel->Number() : 0; }
|
||||
#endif
|
||||
static void SetCurrentChannel(int ChannelNumber) { currentChannel = ChannelNumber; }
|
||||
///< Sets the number of the current channel on the primary device, without
|
||||
///< actually switching to it. This can be used to correct the current
|
||||
///< channel number while replaying.
|
||||
void ForceTransferMode(void);
|
||||
///< Forces the device into transfermode for the current channel.
|
||||
int Occupied(void) const;
|
||||
///< Returns the number of seconds this device is still occupied for.
|
||||
void SetOccupied(int Seconds);
|
||||
int Occupied(int Priority = MINPRIORITY) const;
|
||||
///< Returns the number of seconds this device is still occupied for
|
||||
///< with a priority >= Priority.
|
||||
void SetOccupied(int Seconds, int Priority = MINPRIORITY, time_t From = 0);
|
||||
///< Sets the occupied timeout for this device to the given number of
|
||||
///< Seconds, This can be used to tune a device to a particular transponder
|
||||
///< and make sure it will stay there for a certain amount of time, for
|
||||
@ -371,6 +387,10 @@ public:
|
||||
///< after the device has been successfully tuned to the requested transponder.
|
||||
///< Seconds will be silently limited to MAXOCCUPIEDTIMEOUT. Values less than
|
||||
///< 0 will be silently ignored.
|
||||
///< The timeout is counted from the given From time (by default the current time).
|
||||
///< Calling this function several times with the same From time will set the
|
||||
///< priority to the maximum of the given values.
|
||||
///< Priority() may return a value >= Priority until the timeout.
|
||||
virtual bool HasLock(int TimeoutMs = 0) const;
|
||||
///< Returns true if the device has a lock on the requested transponder.
|
||||
///< Default is true, a specific device implementation may return false
|
||||
@ -450,11 +470,15 @@ public:
|
||||
///< Attaches the given filter to this device.
|
||||
void Detach(cFilter *Filter);
|
||||
///< Detaches the given filter from this device.
|
||||
const cSdtFilter *SdtFilter(void) const { return sdtFilter; }
|
||||
cSectionHandler *SectionHandler(void) const { return sectionHandler; }
|
||||
|
||||
// Common Interface facilities:
|
||||
|
||||
private:
|
||||
cCamSlot *camSlot;
|
||||
void ReleaseCamSlot(void);
|
||||
///< Releases the CAM slot if it is currently not used.
|
||||
public:
|
||||
virtual bool HasCi(void);
|
||||
///< Returns true if this device has a Common Interface.
|
||||
@ -821,9 +845,10 @@ private:
|
||||
mutable cMutex mutexReceiver;
|
||||
cReceiver *receiver[MAXRECEIVERS];
|
||||
public:
|
||||
int Priority(void) const;
|
||||
int Priority(bool IgnoreOccupied = false) const;
|
||||
///< Returns the priority of the current receiving session (-MAXPRIORITY..MAXPRIORITY),
|
||||
///< or IDLEPRIORITY if no receiver is currently active.
|
||||
///< If IgnoreOccupied is true, a priority set with SetOccupied() is ignored.
|
||||
protected:
|
||||
virtual bool OpenDvr(void);
|
||||
///< Opens the DVR of this device and prepares it to deliver a Transport
|
||||
@ -842,8 +867,11 @@ public:
|
||||
///< Returns true if we are currently receiving. The parameter has no meaning (for backwards compatibility only).
|
||||
bool AttachReceiver(cReceiver *Receiver);
|
||||
///< Attaches the given receiver to this device.
|
||||
void Detach(cReceiver *Receiver);
|
||||
void Detach(cReceiver *Receiver, bool ReleaseCam = true);
|
||||
///< Detaches the given receiver from this device.
|
||||
///< If ReleaseCam is true, the CAM slot will be released if it
|
||||
///< is no longer used. Otherwise the caller must call ReleaseCamSlot() after
|
||||
///< calling this function.
|
||||
void DetachAll(int Pid);
|
||||
///< Detaches all receivers from this device for this pid.
|
||||
virtual void DetachAllReceivers(void);
|
||||
@ -861,12 +889,12 @@ public:
|
||||
class cTSBuffer : public cThread {
|
||||
private:
|
||||
int f;
|
||||
int cardIndex;
|
||||
int deviceNumber;
|
||||
int delivered;
|
||||
cRingBufferLinear *ringBuffer;
|
||||
virtual void Action(void);
|
||||
public:
|
||||
cTSBuffer(int File, int Size, int CardIndex);
|
||||
cTSBuffer(int File, int Size, int DeviceNumber);
|
||||
virtual ~cTSBuffer();
|
||||
uchar *Get(int *Available = NULL, bool CheckAvailable = false);
|
||||
///< Returns a pointer to the first TS packet in the buffer. If Available is given,
|
||||
|
674
dvbdevice.c
674
dvbdevice.c
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user