mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Compare commits
1266 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 | ||
|
a2b6b142d8 | ||
|
55408b73ca | ||
|
f4b60f0b68 | ||
|
a1af84f29a | ||
|
0e1956bb29 | ||
|
64e8a34281 | ||
|
043929d850 | ||
|
af3cb1c9c3 | ||
|
c6796ac6df | ||
|
6b4911c6a2 | ||
|
ec0e368a7f | ||
|
1275de1b07 | ||
|
746ce7d406 | ||
|
bb4b6901ad | ||
|
a7fdd3c165 | ||
|
1f9832b449 | ||
|
75648e80cf | ||
|
8a7540321d | ||
|
adc7056c9e | ||
|
b1b4a12848 | ||
|
7b77f400a1 | ||
|
4d7455e783 | ||
|
66d66b31dc | ||
|
9c3ce0048a | ||
|
3a3a233994 | ||
|
d5db0c5ba7 | ||
|
dd6c37c13d | ||
|
e4af94d3f9 | ||
|
bf497f4aae | ||
|
6600478675 | ||
|
bbbc36a1e6 | ||
|
361d642660 | ||
|
a72806a0ba | ||
|
a1c53eae1e | ||
|
a4343bdfd9 | ||
|
940e4a7c4d | ||
|
3090d8146f | ||
|
78831a72d5 | ||
|
68f0f24670 | ||
|
6b9c5aa1ac | ||
|
902c83ece3 | ||
|
30650b9c13 | ||
|
5976079fd3 | ||
|
1e3f146707 | ||
|
015b269c21 | ||
|
802544662d | ||
|
41c247b8ff | ||
|
b2d3c92da9 | ||
|
bc295040d0 | ||
|
c441a634a5 | ||
|
c71c3115cc | ||
|
5ae8d1a7a3 | ||
|
0055eeeeb8 | ||
|
5443fd4219 | ||
|
626ae82fee | ||
|
4fd2870720 | ||
|
a9e32ad0a5 | ||
|
165eae9c31 | ||
|
a343b375df | ||
|
28b6ee47e3 | ||
|
ae41be85c8 | ||
|
e7936c8595 | ||
|
5467bc4f24 | ||
|
477fb7dc20 | ||
|
05bfa4b476 | ||
|
630cc496ea | ||
|
c3af5a69da | ||
|
7455fbd2ad | ||
|
ea217de338 | ||
|
1492f6dbc4 | ||
|
e757f10e44 | ||
|
c868265397 | ||
|
e5e0315d34 | ||
|
0224fc5210 | ||
|
b96277e28a | ||
|
b5d8f68b87 | ||
|
0a47b30528 | ||
|
26a40bc174 | ||
|
990bc6a11f | ||
|
91774cf074 | ||
|
9d5ce204aa | ||
|
a9d82331e6 | ||
|
8dcff164fa | ||
|
54b721ebde | ||
|
d19a3fc3b8 | ||
|
950b248220 | ||
|
bc3b6ed601 | ||
|
33bbff2aa5 | ||
|
5c94900026 | ||
|
e02a0a8c88 | ||
|
d8523b0db8 | ||
|
d74dd7a60a | ||
|
c08ed3ce44 | ||
|
19275aa8bb | ||
|
7bbbfb0dee | ||
|
ef7018cca4 | ||
|
f2a2c67152 | ||
|
9719766007 | ||
|
32fb2e8a3e | ||
|
363dee6846 | ||
|
a28d92d049 | ||
|
39294e0147 | ||
|
027ae738a8 | ||
|
ce5e23f209 | ||
|
139a93156b | ||
|
9cf7328452 | ||
|
0bccf29254 | ||
|
ede2e89670 | ||
|
56117751a8 | ||
|
1bce499383 | ||
|
699c073d85 | ||
|
95947a29d5 | ||
|
70f48e6ca3 | ||
|
0a2c88c288 | ||
|
c70d62aeb4 | ||
|
a4a3c63779 | ||
|
a98f6ca354 | ||
|
deb96b372e | ||
|
360d8fe6b1 | ||
|
93102b45e0 | ||
|
fd3bf51f7d | ||
|
79314ab98f | ||
|
38fed8c901 | ||
|
081e9eb45f | ||
|
c0b8666d1f | ||
|
210df9d835 | ||
|
dc775bc5f8 | ||
|
ec47c4f932 | ||
|
25d28e7421 | ||
|
2c74a31afe | ||
|
bae02358a3 | ||
|
f97a59597f | ||
|
6edfcda43a | ||
|
c9c15a727d | ||
|
5324809a91 | ||
|
f69b920dbc | ||
|
a4c851f759 | ||
|
2751e239eb | ||
|
0af3ed548c | ||
|
7cdd4877c3 | ||
|
37acfbd372 | ||
|
e7cd3f0b33 | ||
|
354910faab | ||
|
0f1f277819 | ||
|
3b1b5bde68 | ||
|
82813f48c4 | ||
|
0b9870959b | ||
|
4100b47b37 | ||
|
43c828f8ca | ||
|
b01a1ee818 | ||
|
50211c706a | ||
|
ce42e42ed7 | ||
|
34f572f792 | ||
|
44287ca25e | ||
|
6bed5368e6 | ||
|
4591dcad2c | ||
|
dbcea07600 | ||
|
b76601482f | ||
|
8e9d445248 | ||
|
7d1dde01ba | ||
|
79b57feab6 | ||
|
1a92ae77a0 | ||
|
84b8ea8395 | ||
|
9491948f04 | ||
|
073268bd45 | ||
|
7cfce2fffa | ||
|
a1fda4f218 | ||
|
1a31974789 | ||
|
3d63936a36 | ||
|
2e9060d549 | ||
|
467829af32 | ||
|
9cd28b2ded | ||
|
686831caf5 | ||
|
1efd5e6b7e | ||
|
f90edc1e8b | ||
|
d1ff365767 | ||
|
6132a46768 | ||
|
1f541487e0 | ||
|
1a160e7afe | ||
|
016e10c1b0 | ||
|
6d52c80273 | ||
|
63a32ce483 | ||
|
7170c20c7e | ||
|
7e6667f58f | ||
|
67cb53d587 | ||
|
e622854789 | ||
|
792b9dc45f | ||
|
fe535d25e5 | ||
|
c4cc5e613c | ||
|
0a5a7893a5 | ||
|
f39d31631b | ||
|
8d3ae53bcd | ||
|
d6f57259fa | ||
|
112bfa5897 | ||
|
da105e3bda | ||
|
2e8815ece8 | ||
|
830e30e2fb | ||
|
d60336ba96 | ||
|
44813e56a5 | ||
|
b313d88db1 | ||
|
9e808255f8 | ||
|
fe57c16f6f | ||
|
2d9eb7e25d | ||
|
b7be7c900a | ||
|
e2756f8e9a | ||
|
367557039a | ||
|
31b0feae14 | ||
|
2cc25e65f4 | ||
|
3f9cdea1c1 | ||
|
71601e363e | ||
|
9b9d15438e | ||
|
6121095a30 | ||
|
6773ab35d2 | ||
|
196f2af596 | ||
|
d1ddb39781 | ||
|
882273d508 | ||
|
0aba3abaeb | ||
|
1c7c2f50b0 | ||
|
f345908f77 | ||
|
ab9e7d50a3 | ||
|
834ac04c3b | ||
|
e2ba3d09a5 | ||
|
bac0ca39ba | ||
|
68acf8815c | ||
|
736f2fed42 | ||
|
fdbbbd146a | ||
|
bac165a751 | ||
|
3d488bcf1c | ||
|
39c9fc1199 | ||
|
99dfe9f66a | ||
|
03d6fbec0a | ||
|
5c8d366975 | ||
|
26252c37cd | ||
|
b6080634cc | ||
|
f91468ff9b | ||
|
22cb026e5e | ||
|
be4cdcf170 | ||
|
fd85701a84 | ||
|
1135a1f9d5 | ||
|
d71544d797 | ||
|
08066065e3 | ||
|
a9bd3ca0dc | ||
|
031bbcef40 | ||
|
d6c26af696 | ||
|
12308b3c29 | ||
|
85ae27e372 | ||
|
ce6c90a450 | ||
|
1172937e8a | ||
|
146f2cbd4d | ||
|
8ea018404a | ||
|
5d249c1ae5 | ||
|
09e64c24f2 | ||
|
462e094783 | ||
|
8a09e90f02 | ||
|
bfc3f1f4b2 | ||
|
2b20b9e064 | ||
|
3427e224e3 | ||
|
cf1474fc19 | ||
|
e6068912a4 | ||
|
e59b5bf1af | ||
|
6f315bc235 | ||
|
2491984da3 | ||
|
f1bef11f45 | ||
|
4e46d2bb3b | ||
|
a384d14f92 | ||
|
471c1cc044 | ||
|
1cdbdc548a | ||
|
0f18bd0a6a | ||
|
14f97d0f2a | ||
|
75f28cb0cb | ||
|
9e58503aee | ||
|
18f0ce26fd | ||
|
bc0de5dbc5 | ||
|
4e3325b7f7 | ||
|
3284e941c6 | ||
|
aa40223ff2 | ||
|
04edd69b7a | ||
|
50d268538e | ||
|
3cd5294d8a | ||
|
8a7bc6a0bb | ||
|
894a392640 | ||
|
c3b0347556 | ||
|
2b9e988dd5 | ||
|
b6af7a9cf9 | ||
|
d14adc1e68 | ||
|
5499d5ae84 | ||
|
0a40ce6f9d | ||
|
15927fd097 | ||
|
c17328da87 | ||
|
165aa63d2e | ||
|
fa701228d7 | ||
|
7aef23e97f | ||
|
e6592e6201 | ||
|
38ee88e5ee | ||
|
7d49075079 | ||
|
577d43facf | ||
|
909e6c6249 | ||
|
62596f991e | ||
|
fd7ccc7627 | ||
|
0bcf5d6da6 | ||
|
57513db5c4 | ||
|
70eb639c41 | ||
|
52b1e2a9ff | ||
|
a4b657b040 | ||
|
371e60238a | ||
|
cc306290da | ||
|
eb7816259c | ||
|
735fb20ac6 | ||
|
a429eefbe7 | ||
|
f53815c6ee | ||
|
f2fceac341 | ||
|
968c2ede0d | ||
|
a90a977d68 | ||
|
7ab61f6732 | ||
|
7aae78e8a7 | ||
|
77a1ff8b00 | ||
|
9e6ca94a72 | ||
|
5aa16b7489 | ||
|
d48355c305 | ||
|
519ecddc52 | ||
|
c73e635936 | ||
|
1ed2b21aaa | ||
|
1786dc714d | ||
|
cc1494bfb6 | ||
|
7b1f643977 | ||
|
01b1137284 | ||
|
d99d408fd8 | ||
|
e1d05f0a0f | ||
|
c36d3f5145 | ||
|
ac953f5327 | ||
|
a2b5d4e02b | ||
|
83b139e7ba | ||
|
62494e735f | ||
|
7b3c905a46 | ||
|
ddc4a26457 | ||
|
2457dce862 | ||
|
0c19df09d9 | ||
|
c298cd5714 | ||
|
60d5d9762b | ||
|
22106f6dd3 | ||
|
89f5244007 | ||
|
d34abd6665 | ||
|
fb37e93b04 | ||
|
888c33c890 | ||
|
434bc96c74 | ||
|
9c100c8d0a | ||
|
2eb23cb9f4 | ||
|
9c9c1d9e19 | ||
|
42bdf852da | ||
|
b547141f7a | ||
|
0633053d5d | ||
|
3a71b2e887 | ||
|
cdb5e90515 | ||
|
b5128a6e1c | ||
|
ac7fa82b2f | ||
|
a7fa43fd39 | ||
|
890e57cfab | ||
|
f656e7f6a9 | ||
|
3104f123ca | ||
|
f041cf97a2 | ||
|
8225d3758f | ||
|
202a6b3072 | ||
|
5b88d0bfac | ||
|
8b57eacd1b | ||
|
18e7903b78 | ||
|
5d8302b147 | ||
|
2e8f4b8d21 | ||
|
9c13f76b66 | ||
|
f3e6d39382 | ||
|
4ffd2d6ccd | ||
|
1b2a62623c | ||
|
ad45f801d5 | ||
|
f60d90aeb6 | ||
|
8a519202a8 | ||
|
9c9e200df5 | ||
|
b3b0747328 | ||
|
8f9ff2cfe0 | ||
|
ea94337f96 | ||
|
3e06c99a0a | ||
|
f2807bc782 | ||
|
6464eff516 | ||
|
e1acb774c6 | ||
|
de6d37134c | ||
|
93ec1a9df2 | ||
|
0703fbf527 | ||
|
0e5de67d5f | ||
|
d993d51367 | ||
|
3909ce39ef | ||
|
e8cd0ed7c5 | ||
|
85969bc0bd | ||
|
659f67f04f | ||
|
e2d0f3f845 | ||
|
ed766859d7 | ||
|
5503161fdc | ||
|
e83b09b4eb | ||
|
2e34a10e93 | ||
|
aa838791bf | ||
|
4a6f714153 | ||
|
f736d3a3de | ||
|
471b287f70 | ||
|
1c4865147a | ||
|
b3bc711ed2 | ||
|
ef09e376b1 | ||
|
0a5eb88696 | ||
|
63372cd4aa | ||
|
b9f0e39b1b | ||
|
ebab5f3ec1 | ||
|
6749e4ead9 | ||
|
58c4fd5a0b | ||
|
fccebc816d | ||
|
bf7cc2c04f | ||
|
7f195606ee | ||
|
91e0151674 | ||
|
4aa496b079 | ||
|
4fcd3ba56e | ||
|
77c0de71c4 | ||
|
7c40f797dc | ||
|
189f694710 | ||
|
b02c8b606c | ||
|
24c9e45789 | ||
|
53db7fdc50 | ||
|
70aa4e4247 | ||
|
b26898e6e1 | ||
|
0c2316b638 | ||
|
f42cbac237 | ||
|
b06d9cce37 | ||
|
be92ad13ab | ||
|
3bb447cf8d | ||
|
66c65beea7 | ||
|
be9a6de0ef | ||
|
b3954aefd5 | ||
|
555fe68a01 | ||
|
1ddda558b0 | ||
|
db47cdaa1a | ||
|
7062583ab4 | ||
|
b454a0777f | ||
|
6ba9de491c | ||
|
24b38eb812 | ||
|
14e37ed124 | ||
|
cee82d8659 | ||
|
f5bbf06b60 | ||
|
6b229d7d5f | ||
|
67fff7f4fc | ||
|
6e35f47a3e | ||
|
6514649439 | ||
|
77340e9273 | ||
|
35f73199d4 | ||
|
34c79fdc50 | ||
|
c8e789e12a | ||
|
77173b7057 | ||
|
7fac1d4ae2 | ||
|
52620f147b | ||
|
f3d583b124 | ||
|
fc0094231d | ||
|
aacdeba5d9 | ||
|
761fb103b7 | ||
|
afc17c1168 | ||
|
bfdd611fde | ||
|
ffeb43a38a | ||
|
93f4852ba3 | ||
|
4e460da371 | ||
|
6feb8d8875 | ||
|
57222002b2 | ||
|
4fc8101910 | ||
|
011a984951 | ||
|
105ad61b6f | ||
|
23ea3dcb48 | ||
|
a4b8729e6a | ||
|
687b93b215 | ||
|
8af9abbbb9 | ||
|
25e2dbf031 | ||
|
af56e53315 | ||
|
7a114d640c | ||
|
c5071cc87b | ||
|
0990c279c7 | ||
|
76c32d60f9 | ||
|
ebdac2ddfc | ||
|
caf708b618 | ||
|
40aaf784b9 | ||
|
db1ca2c854 | ||
|
a9f1297022 | ||
|
f8058586f9 | ||
|
ad1352f109 | ||
|
df03740741 | ||
|
a437a3d743 | ||
|
927aa49576 | ||
|
de1ce0b27d | ||
|
a9e1ca63dd | ||
|
4cd251fc48 | ||
|
6d59e2866b | ||
|
da13903228 | ||
|
585f622886 | ||
|
0de69c3899 | ||
|
0238234c52 | ||
|
8b2f500d2a | ||
|
a30563634d | ||
|
e5fde77e56 | ||
|
bfb9c8fddd | ||
|
0402ce9b8e | ||
|
e2f0edd8f6 | ||
|
4f1404e991 | ||
|
9813a9164b | ||
|
b9ba7000bb | ||
|
4c304467ba | ||
|
6a9502ab17 | ||
|
9eda923269 | ||
|
47a6f8fbff | ||
|
c2826000bb | ||
|
7cea5df074 | ||
|
8b9e1f513f | ||
|
fdbf796b6b | ||
|
5ac41bf091 | ||
|
e158021a4d | ||
|
549c499501 | ||
|
838566ea41 | ||
|
6e2f0f695f | ||
|
6f9929b1c0 | ||
|
35d4ceaf37 | ||
|
2e41129c36 | ||
|
1df6a87249 | ||
|
e02d608bce | ||
|
7008aeaf22 | ||
|
ac44e6f2ae | ||
|
1d869c4b36 | ||
|
e7c86c6760 | ||
|
dbf342df3c | ||
|
3cf87dfe8a | ||
|
ea5e373df6 | ||
|
c7256c1c11 | ||
|
7cbced0c12 | ||
|
a84defe86f | ||
|
9dbd953cc2 | ||
|
ea613e6b26 | ||
|
16dd077fb2 | ||
|
4da70bbab1 | ||
|
566c6fa464 | ||
|
b95b85fee4 | ||
|
63ee17701a | ||
|
00e2415b81 | ||
|
6a8a2cf5fb | ||
|
c949ad35cc | ||
|
ae4ffacbda | ||
|
1379b621f7 | ||
|
089b5eb212 | ||
|
7c877edd2d | ||
|
4e22b62192 | ||
|
21c8829783 | ||
|
20791e4d95 | ||
|
f6283b8e91 | ||
|
b936cb366f | ||
|
31e334a332 | ||
|
7a2d3d993c | ||
|
a9acab6b7e | ||
|
a8cbe3a56d | ||
|
dfb9862460 | ||
|
215fde71a3 | ||
|
4bee872c09 | ||
|
e8f557ae5f | ||
|
d7462ae5ad | ||
|
a48a0543c8 | ||
|
ff4aed2227 | ||
|
39f6b6fc6b | ||
|
0b5085f4f0 | ||
|
512cd24e53 | ||
|
83a8d5a561 | ||
|
26fbb921f5 | ||
|
589f5519d7 | ||
|
3592293cca | ||
|
4312dfcf41 | ||
|
94ced5845a | ||
|
a16391ecb0 | ||
|
4ea90cefe8 | ||
|
97eb54738f | ||
|
641acd5709 | ||
|
856f67b4ac | ||
|
71778859a7 | ||
|
47b09cce5d | ||
|
c9fb7eb4d6 | ||
|
3870322888 | ||
|
396f8c96af | ||
|
9bd415d58e | ||
|
8bc6bcf86e | ||
|
54b3135d59 | ||
|
446c3b4cfd | ||
|
adf0dac2c3 | ||
|
1caa78a3e7 | ||
|
e61e1ed425 | ||
|
01d7269904 | ||
|
7c72f79329 | ||
|
bf52b1a2e3 | ||
|
2bdb599fbc | ||
|
3971cc6e88 | ||
|
209b850067 | ||
|
7251fefa89 | ||
|
3c72be23f0 | ||
|
699454ad7f | ||
|
e8fb500819 | ||
|
d6c10fec7b | ||
|
f34be6f5f0 | ||
|
b931724b75 | ||
|
bd6da13a67 | ||
|
f52e8759c5 | ||
|
2090ed6f7c | ||
|
246d5412e0 | ||
|
9b1b6b3ce4 | ||
|
c8c14e31d8 | ||
|
4d0a1db4ac | ||
|
a0f63d40c6 | ||
|
f0537ea0f1 | ||
|
9492231058 | ||
|
c385d5bf0c | ||
|
d377c778a7 | ||
|
17b12a32b0 | ||
|
99321b371a | ||
|
58c9fdc8c5 | ||
|
7fc654eb21 | ||
|
a0a4421278 | ||
|
7a359a958e | ||
|
cd10b439d0 | ||
|
5b76eec1af | ||
|
f55aee0fc1 | ||
|
21957f6e38 | ||
|
fc697bfdb1 | ||
|
818763b332 | ||
|
cc6c05fcf2 | ||
|
f6adb32202 | ||
|
4e1a01959d | ||
|
435978648b | ||
|
c354540a31 | ||
|
8d98b9193b | ||
|
d8e8941c77 | ||
|
d32498f65f | ||
|
29537da370 | ||
|
cbe8542622 | ||
|
fd3bf6c3d2 | ||
|
53ef55410c | ||
|
4263a1a410 | ||
|
37d2bf4d9a | ||
|
6bd7123072 | ||
|
c979ef393b | ||
|
0e4b404102 | ||
|
89de3b6c01 | ||
|
1682e2708d | ||
|
71fb3e84da | ||
|
3bb55dfdde | ||
|
497553d985 | ||
|
d336191ed1 | ||
|
cf7f25fe50 | ||
|
b6b66acfc7 | ||
|
d962999161 | ||
|
ac25275b10 | ||
|
965feab54f | ||
|
f30ac5075e | ||
|
649351c2c4 | ||
|
a465820c1c | ||
|
c191acaa3d | ||
|
65f6e9ae98 | ||
|
495f197327 | ||
|
8d6c1f3e54 | ||
|
5e805b5dfd | ||
|
b7f4536fe1 | ||
|
b6d407a212 | ||
|
e724d871b2 | ||
|
a5d524b7e6 | ||
|
eac63172e5 | ||
|
4477a0171e | ||
|
a033ebf167 | ||
|
66a2bf9906 | ||
|
9bd2b9901f | ||
|
21b564805d | ||
|
87acd119ce | ||
|
1b61b7f5bc | ||
|
4118097e73 | ||
|
ec7fac3c0d | ||
|
cee221e843 | ||
|
a8ae0d2f7c | ||
|
7100e4c209 | ||
|
ccbe1905a1 | ||
|
3488050173 | ||
|
6213afa230 | ||
|
cb6c2f7125 | ||
|
552b1e542f | ||
|
bc72b7e6cd | ||
|
f3ca6f2083 | ||
|
c8ef40ee92 | ||
|
aa17488a5b | ||
|
38a15ef510 | ||
|
b526a70071 | ||
|
d08777ed87 | ||
|
f7645402ff | ||
|
a67fe0663d | ||
|
16c931453d | ||
|
0a0db91018 | ||
|
4e65807dc5 | ||
|
4a3d74e511 | ||
|
5cca94d1b3 | ||
|
5b94631467 | ||
|
6f43287d07 | ||
|
023f9366ef | ||
|
9711380e57 | ||
|
37da7d9961 | ||
|
f53913f144 | ||
|
926f980d87 | ||
|
3b7ae17055 | ||
|
4f76862ff1 | ||
|
2b792e3519 | ||
|
670e5a1eb6 | ||
|
889547de72 | ||
|
366ef1b812 | ||
|
993dc45922 | ||
|
db8cf38b5b | ||
|
f3eb300bb0 | ||
|
02bf57ba71 | ||
|
aaffda3119 | ||
|
4da13b57ec | ||
|
4d8f68e906 | ||
|
64c81d24dc | ||
|
2966432870 | ||
|
01c44e8b2c | ||
|
1983983214 | ||
|
f239934bf9 | ||
|
e0448bded8 | ||
|
030b41c370 | ||
|
3766a71741 | ||
|
65cc35f7f9 | ||
|
df4e5a1072 | ||
|
5c47a0033e | ||
|
4c5f7bc80e | ||
|
85027db9b9 | ||
|
9e47d589e2 | ||
|
bb4035f812 | ||
|
24e46b3604 | ||
|
ce94ced9d3 | ||
|
b5fefa2f9e | ||
|
037b10b4e9 | ||
|
680838947b | ||
|
f13e8a156e | ||
|
bcdbfe95e7 | ||
|
8260adafc2 | ||
|
851318c9b4 | ||
|
39ad232ee5 | ||
|
20654b12ed | ||
|
a353b544cd | ||
|
7d181c2e35 | ||
|
eda593934d | ||
|
a88ca5d4e5 | ||
|
0cce3f7c87 | ||
|
f7c0216ed0 | ||
|
fb60a3e836 | ||
|
4056de5d1c | ||
|
3ca58a42e7 | ||
|
212a2fea41 | ||
|
a3daf79d6f | ||
|
9177e4b7f8 | ||
|
54d81f0b8f | ||
|
7076f20b44 | ||
|
30e10239ca | ||
|
ff27cca4fe | ||
|
4c827ff8a4 | ||
|
8cc4f36690 | ||
|
bb47d52f95 | ||
|
cd2ed6cfe7 | ||
|
2502068015 | ||
|
bd478955e6 | ||
|
2de75c3e9f | ||
|
b4d8d93534 | ||
|
92888b3e57 | ||
|
441ee74ff1 | ||
|
410968304c | ||
|
11e04d4228 | ||
|
62dfd2f996 | ||
|
9455b9a2b0 | ||
|
d2cfd52013 | ||
|
78d338ffce | ||
|
764308667d | ||
|
b6b9a148c6 | ||
|
8ef71dbbdf | ||
|
e5295be30a | ||
|
027ec5a63f | ||
|
4aaaa97ade | ||
|
cc2e3bfeb0 | ||
|
cda320549d | ||
|
a41f3b1351 | ||
|
6dd788f484 | ||
|
a2b018d72b | ||
|
d2ef44f8f5 | ||
|
d8ba7158bc | ||
|
8146386c30 | ||
|
c1a56702f9 | ||
|
d8626d8b47 | ||
|
a5701717e0 | ||
|
4b931c7fd6 | ||
|
9d2367d967 | ||
|
c9e5b13789 | ||
|
0b85bb8053 | ||
|
245ae52d36 | ||
|
7f66e1573e | ||
|
b16437e784 | ||
|
1bad5d1e6f | ||
|
bb7d8b3b5b | ||
|
45f660e358 | ||
|
250419d2c9 | ||
|
d95804fec3 | ||
|
7fa0d338eb | ||
|
06e414aacb | ||
|
573cf3fc8b | ||
|
0364b026cf | ||
|
9fe795ca61 | ||
|
36e4202c14 | ||
|
a9c9b76aeb | ||
|
a5426b58c6 | ||
|
a906cd52df | ||
|
79dad980cf | ||
|
01c26a5c6c | ||
|
cfb62845ec | ||
|
8281be1480 | ||
|
b833de1761 | ||
|
956ac7e70d | ||
|
b2ae3062ab | ||
|
5b720a4fdb | ||
|
1ba20fa20f | ||
|
abde1d04ae | ||
|
db98ecf54e | ||
|
6a8a790312 | ||
|
904903f8d5 | ||
|
c984204944 | ||
|
7a3f809f5c | ||
|
a9099cb4d3 | ||
|
89dc592727 | ||
|
a5a8bf0164 | ||
|
d1d157d755 | ||
|
fef409fe23 | ||
|
16d37090dc | ||
|
e6d52e3455 | ||
|
188fe74c8a | ||
|
36dfa5cb8f | ||
|
2d850b14e2 |
830
CONTRIBUTORS
830
CONTRIBUTORS
File diff suppressed because it is too large
Load Diff
34
Doxyfile.filter
Normal file
34
Doxyfile.filter
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Filter source files for use with Doxygen.
|
||||||
|
#
|
||||||
|
# Escapes special characters in comments marked with "///<".
|
||||||
|
#
|
||||||
|
# Usage: Doxyfile.filter filename
|
||||||
|
#
|
||||||
|
# See the main source file 'vdr.c' for copyright information and
|
||||||
|
# how to reach the author.
|
||||||
|
#
|
||||||
|
# $Id: Doxyfile.filter 2.1 2013/02/17 10:54:05 kls Exp $
|
||||||
|
|
||||||
|
$TAG = "///<";
|
||||||
|
|
||||||
|
while (<>) {
|
||||||
|
$t = $_;
|
||||||
|
$p = index($t, $TAG);
|
||||||
|
if ($p >= 0) {
|
||||||
|
$p += length($TAG);
|
||||||
|
print substr($t, 0, $p);
|
||||||
|
$quote = 0;
|
||||||
|
while (1) {
|
||||||
|
$s = substr($t, $p++, 1);
|
||||||
|
last if ($s eq "");
|
||||||
|
$quote ^= 1 if ($s eq '"');
|
||||||
|
print "\\" if (!$quote && $s =~ /[\\\@<>]/);
|
||||||
|
print $s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print $t;
|
||||||
|
}
|
||||||
|
}
|
174
INSTALL
174
INSTALL
@ -1,7 +1,7 @@
|
|||||||
Installation of the Video Disk Recorder
|
Installation of the Video Disk Recorder
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
Version 1.7
|
Version 2.7
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
Compiling and running the program:
|
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
|
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.
|
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
|
If you have a LIRC compatible infrared remote control receiver you can define
|
||||||
to one of the following values in the 'make' call to make the respective control
|
the REMOTE macro to one of the following values in the 'make' call to make
|
||||||
the default:
|
the respective control the default:
|
||||||
|
|
||||||
REMOTE=LIRC control via the "Linux Infrared Remote Control"
|
REMOTE=LIRC control via the "Linux Infrared Remote Control"
|
||||||
(see http://www.lirc.org)
|
(see http://www.lirc.org)
|
||||||
@ -58,8 +58,10 @@ Alternatively you can use the '--lirc' option at runtime.
|
|||||||
This option accepts an optional path to the remote control device,
|
This option accepts an optional path to the remote control device,
|
||||||
the default of which can be set via the LIRC_DEVICE macro.
|
the default of which can be set via the LIRC_DEVICE macro.
|
||||||
|
|
||||||
If your video directory will be on a VFAT partition, you can call VDR with
|
If you want to make your video directory available to other machines that
|
||||||
the command line option '--vfat'.
|
have limitations on directory name lengths and/or allowed characters in
|
||||||
|
directory names, you can call VDR with the command line option '--dirnames'
|
||||||
|
(see man vdr(1) for details).
|
||||||
|
|
||||||
When running, the 'vdr' program writes status information into the
|
When running, the 'vdr' program writes status information into the
|
||||||
system log file, which is usually /var/log/messages (or /var/log/user.log,
|
system log file, which is usually /var/log/messages (or /var/log/user.log,
|
||||||
@ -71,16 +73,15 @@ port ("Simple Video Disk Recorder Protocol"). By default, it listens
|
|||||||
on port 6419 (use the --port=PORT option to change this). For details
|
on port 6419 (use the --port=PORT option to change this). For details
|
||||||
about the SVDRP syntax see the source file 'svdrp.c'.
|
about the SVDRP syntax see the source file 'svdrp.c'.
|
||||||
|
|
||||||
WARNING: DUE TO THE OPEN SVDRP PORT THIS PROGRAM MAY CONSTITUTE A
|
|
||||||
======= POTENTIAL SECURITY HAZARD! IF YOU ARE NOT RUNNING VDR IN
|
|
||||||
A CONTROLLED ENVIRONMENT, YOU MAY WANT TO DISABLE SVDRP
|
|
||||||
BY USING '--port=0'!
|
|
||||||
|
|
||||||
The file 'svdrphosts.conf' can be used to define which hosts are allowed
|
The file 'svdrphosts.conf' can be used to define which hosts are allowed
|
||||||
to access the SVDRP port. By default only localhost (127.0.0.1) is granted
|
to access the SVDRP port. By default only localhost (127.0.0.1) is granted
|
||||||
access. If you want to give other hosts access to your SVDRP port you need to
|
access. If you want to give other hosts access to your SVDRP port you need to
|
||||||
add their IP numbers to 'svdrphosts.conf'.
|
add their IP numbers to 'svdrphosts.conf'.
|
||||||
|
|
||||||
|
You can disable SVDRP access entirely by either running VDR with '--port=0',
|
||||||
|
or by removing all entries (including 127.0.0.1 for the localhost) from
|
||||||
|
'svdrphosts.conf'.
|
||||||
|
|
||||||
If the program shall run as a daemon, use the --daemon option. This
|
If the program shall run as a daemon, use the --daemon option. This
|
||||||
will completely detach it from the terminal and will continue as a
|
will completely detach it from the terminal and will continue as a
|
||||||
background process.
|
background process.
|
||||||
@ -92,6 +93,24 @@ vdr:123:respawn:/usr/local/bin/vdr --terminal=/dev/tty8 -w 60
|
|||||||
|
|
||||||
See the man page vdr(1) for complete information about all command line options.
|
See the man page vdr(1) for complete information about all command line options.
|
||||||
|
|
||||||
|
Output devices
|
||||||
|
--------------
|
||||||
|
|
||||||
|
VDR by itself doesn't produce any audio or video output. In order to watch
|
||||||
|
live tv or recordings, you will need to use a plugin that supports the actual
|
||||||
|
hardware in your system, for instance:
|
||||||
|
|
||||||
|
Plugin: Device:
|
||||||
|
|
||||||
|
dvbsddevice Full-Featured SD DVB cards (Fujitsu-Siemens Design)
|
||||||
|
ftp://ftp.tvdr.de/vdr/Plugins
|
||||||
|
dvbhddevice Full-featured HD DVB cards (Technotrend TT S2-6400)
|
||||||
|
https://bitbucket.org/powARman/dvbhddevice
|
||||||
|
rpihddevice Raspberry Pi
|
||||||
|
https://projects.vdr-developer.org/git/vdr-plugin-rpihddevice.git
|
||||||
|
|
||||||
|
See https://linuxtv.org/vdrwiki/index.php/Output_devices for more.
|
||||||
|
|
||||||
Standard compliance
|
Standard compliance
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
@ -132,14 +151,14 @@ displayed correctly. Since BiDi support adds some runtime overhead by requiring
|
|||||||
additional memory allocation and copying, this feature is not compiled in
|
additional memory allocation and copying, this feature is not compiled in
|
||||||
by default, so that users that have no need for this don't get any overhead.
|
by default, so that users that have no need for this don't get any overhead.
|
||||||
|
|
||||||
Workaround for providers not encoding their EPG data correctly
|
Workaround for providers not encoding their DVB SI table strings correctly
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
According to "ETSI EN 300 468" the default character set fo SI data is
|
According to "ETSI EN 300 468" the default character set for SI data is
|
||||||
ISO6937. But unfortunately some broadcasters actually use ISO-8859-9 or
|
ISO6937. But unfortunately some broadcasters actually use ISO-8859-9 or
|
||||||
other encodings, but fail to correctly announce that.
|
other encodings, but fail to correctly announce that.
|
||||||
Users who want to set the default character set to something different can
|
Users who want to set the default character set to something different can
|
||||||
do this by setting the environment variable VDR_CHARSET_OVERRIDE to something
|
do this by using the command line option --chartab with something
|
||||||
like ISO-8859-9.
|
like ISO-8859-9.
|
||||||
|
|
||||||
Start script with automatic restart in case of hangups:
|
Start script with automatic restart in case of hangups:
|
||||||
@ -245,23 +264,27 @@ Executing commands before and after a recording:
|
|||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
|
|
||||||
You can use the '-r' option to define a program or script that gets called
|
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
|
at various stages of handling recordings.
|
||||||
has finished or a recording has been deleted.
|
|
||||||
|
|
||||||
The program will be called with two or three (in case of "edited") string
|
The program will be called with two or three string parameters.
|
||||||
parameters. The first parameter is one of
|
The first parameter is one of
|
||||||
|
|
||||||
before if this is *before* a recording starts
|
before if this is *before* a recording starts
|
||||||
|
started if this is after a recording has *started*
|
||||||
after if this is *after* a recording has finished
|
after if this is *after* a recording has finished
|
||||||
|
editing if this is before *editing* a recording
|
||||||
edited if this is after a recording has been *edited*
|
edited if this is after a recording has been *edited*
|
||||||
deleted if this is after a recording has been *deleted*
|
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).
|
directory (which may not yet exists at that moment in the "before" case).
|
||||||
In the "edited" case it will be the name of the edited version (second
|
See the example below for the exact meaning of these parameters.
|
||||||
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".
|
|
||||||
|
|
||||||
Within this program you can do anything you would like to do before and/or
|
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
|
after a recording or after an editing process. However, the program must return
|
||||||
@ -277,9 +300,16 @@ case "$1" in
|
|||||||
before)
|
before)
|
||||||
echo "Before recording $2"
|
echo "Before recording $2"
|
||||||
;;
|
;;
|
||||||
|
started)
|
||||||
|
echo "Started recording $2"
|
||||||
|
;;
|
||||||
after)
|
after)
|
||||||
echo "After recording $2"
|
echo "After recording $2"
|
||||||
;;
|
;;
|
||||||
|
editing)
|
||||||
|
echo "Editing recording $2"
|
||||||
|
echo "Source recording $3"
|
||||||
|
;;
|
||||||
edited)
|
edited)
|
||||||
echo "Edited recording $2"
|
echo "Edited recording $2"
|
||||||
echo "Source recording $3"
|
echo "Source recording $3"
|
||||||
@ -287,6 +317,22 @@ case "$1" in
|
|||||||
deleted)
|
deleted)
|
||||||
echo "Deleted recording $2"
|
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"
|
echo "ERROR: unknown state: $1"
|
||||||
;;
|
;;
|
||||||
@ -311,7 +357,7 @@ This program must be given to VDR with the '-a' option, as in
|
|||||||
The video data directory:
|
The video data directory:
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
All recordings are written into directories below "/video". Please
|
All recordings are written into directories below "/srv/vdr/video". Please
|
||||||
make sure this directory exists, and that the user who runs the 'vdr'
|
make sure this directory exists, and that the user who runs the 'vdr'
|
||||||
program has read and write access to that directory.
|
program has read and write access to that directory.
|
||||||
If you prefer a different location for your video files, you can use
|
If you prefer a different location for your video files, you can use
|
||||||
@ -323,41 +369,17 @@ Note that the file system need not be 64-bit proof, since the 'vdr'
|
|||||||
program splits video files into chunks of about 2GB. You should use
|
program splits video files into chunks of about 2GB. You should use
|
||||||
a disk with several gigabytes of free space. One GB can store roughly
|
a disk with several gigabytes of free space. One GB can store roughly
|
||||||
half an hour of SD video data, or 10 minutes of HD video.
|
half an hour of SD video data, or 10 minutes of HD video.
|
||||||
|
Either use one of today's large terabyte disks (preferably with a backup disk
|
||||||
|
in a RAID-1 array), or use something like "mhddfs" to group several disks
|
||||||
|
into one large volume.
|
||||||
|
|
||||||
If you have more than one disk and don't want to combine them to form
|
Note that you should not copy any non-VDR files into the video directory,
|
||||||
one large logical volume, you can set up several video directories as
|
|
||||||
mount points for these disks. All of these directories must have the
|
|
||||||
same basic name and must end with a numeric part, which starts at 0 for
|
|
||||||
the main directory and has increasing values for the rest of the
|
|
||||||
directories. For example
|
|
||||||
|
|
||||||
/video0
|
|
||||||
/video1
|
|
||||||
/video2
|
|
||||||
|
|
||||||
would be a setup with three directories. You can use more than one
|
|
||||||
numeric digit, and the directories need not be directly under '/':
|
|
||||||
|
|
||||||
/mnt/MyVideos/vdr.00
|
|
||||||
/mnt/MyVideos/vdr.01
|
|
||||||
/mnt/MyVideos/vdr.02
|
|
||||||
...
|
|
||||||
/mnt/MyVideos/vdr.11
|
|
||||||
|
|
||||||
would set up twelve disks (wow, what a machine that would be!).
|
|
||||||
|
|
||||||
To use such a multi directory setup, you need to add the '-v' option
|
|
||||||
with the name of the basic directory when running 'vdr':
|
|
||||||
|
|
||||||
vdr -v /video0
|
|
||||||
|
|
||||||
Note that you should not copy any non-VDR files into the /videoX directories,
|
|
||||||
since this might cause a lot of unnecessary disk access when VDR cleans up those
|
since this might cause a lot of unnecessary disk access when VDR cleans up those
|
||||||
directories and there is a large number of files and/or subdirectories in
|
directories and there is a large number of files and/or subdirectories in
|
||||||
there. If you have a large disk that you want to use for VDR's video data as
|
there. If you have a large disk that you want to use for VDR's video data as
|
||||||
well as other stuff, you may want to create a subdirectory for VDR, as in
|
well as other stuff, you may want to create a subdirectory for VDR, as in
|
||||||
|
|
||||||
/mydisk/video0
|
/mydisk/video
|
||||||
|
|
||||||
and put your other stuff into, say,
|
and put your other stuff into, say,
|
||||||
|
|
||||||
@ -375,9 +397,11 @@ Configuration files:
|
|||||||
|
|
||||||
There are several configuration files that hold information about
|
There are several configuration files that hold information about
|
||||||
channels, remote control keys, timers etc. By default these files are
|
channels, remote control keys, timers etc. By default these files are
|
||||||
assumed to be located in the video directory, but a different directory
|
spread around the system according to the FHS ("File system Hierarchy Standard").
|
||||||
can be used with the '-c' option. Plugins assume their configuration files
|
If you prefer to have VDR built to run locally under the VDR source tree,
|
||||||
in a subdirectory called "plugins" of this directory.
|
you can copy the file Make.config.template to Make.config and set the parameter
|
||||||
|
LCLBLD=1. If you also want to have all data files under one single directory,
|
||||||
|
set ONEDIR=1 in Make.config.
|
||||||
|
|
||||||
For starters just copy all *.conf files from the VDR directory into your
|
For starters just copy all *.conf files from the VDR directory into your
|
||||||
video directory.
|
video directory.
|
||||||
@ -396,15 +420,6 @@ As a starting point you can copy the 'channels.conf' file that comes with the
|
|||||||
VDR archive into your video directory (or into your config directory,
|
VDR archive into your video directory (or into your config directory,
|
||||||
respectively, in case you have redirected it with the -c option).
|
respectively, in case you have redirected it with the -c option).
|
||||||
|
|
||||||
If you prefer to have your system set up according to the FHS
|
|
||||||
("File system Hierarchy Standard") and thus have your files spread
|
|
||||||
all over the place ;-), you can do this by copying the file Make.config.template
|
|
||||||
to Make.config in the VDR source directory, and activating the line
|
|
||||||
|
|
||||||
#USEFHS = 1
|
|
||||||
|
|
||||||
in that file.
|
|
||||||
|
|
||||||
Setting up DiSEqC:
|
Setting up DiSEqC:
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
@ -416,8 +431,9 @@ access your DiSEqC equipment (see man vdr(5) for details).
|
|||||||
A special form of DiSEqC is used to connect several receivers to one signal
|
A special form of DiSEqC is used to connect several receivers to one signal
|
||||||
source using only a single cable. This method, known as "Satellite Channel Routing"
|
source using only a single cable. This method, known as "Satellite Channel Routing"
|
||||||
according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
|
according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
|
||||||
Distribution", "Channel Stacking System" or "Single Cable Interface") uses
|
Distribution", "Channel Stacking System" or "Single Cable Interface") or
|
||||||
the file "scr.conf" to specify which SCR channels use which user band frequency.
|
EN50607 (aka "JESS") uses the file "scr.conf" to specify which SCR channels
|
||||||
|
use which user band frequency.
|
||||||
|
|
||||||
If DVB-S devices need to be connected to the same satellite cable, but no
|
If DVB-S devices need to be connected to the same satellite cable, but no
|
||||||
"Satellite Channel Routing" is available, they can be set to be "bonded" in
|
"Satellite Channel Routing" is available, they can be set to be "bonded" in
|
||||||
@ -429,6 +445,10 @@ Note that it doesn't make sense to use "Satellite Channel Routing" and
|
|||||||
of these methods, it is necessary that your devices are always created in the
|
of these methods, it is necessary that your devices are always created in the
|
||||||
same sequence when the drivers are loaded. You may need to configure some
|
same sequence when the drivers are loaded. You may need to configure some
|
||||||
proper "udev" rules to make sure this happens.
|
proper "udev" rules to make sure this happens.
|
||||||
|
If you use "Device Bonding" and you add devices to your setup that don't
|
||||||
|
provide DVB-S and take up a position in which there used to be a bonded DVB-S
|
||||||
|
device, make sure you open, adjust (if necessary) and confirm the Setup/LNB
|
||||||
|
menu to have the device bondings set correctly again.
|
||||||
|
|
||||||
Running VDR with DVB-C (cable) or DVB-T (terrestrial):
|
Running VDR with DVB-C (cable) or DVB-T (terrestrial):
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
@ -464,19 +484,17 @@ for a detailed description).
|
|||||||
|
|
||||||
The recommended PC key assignments are:
|
The recommended PC key assignments are:
|
||||||
|
|
||||||
Up, Down, Left, Right Crsr keys in numeric block
|
Up, Down, Left, Right Cursor keys
|
||||||
Menu 'Home' in numeric block
|
Menu 'Home'
|
||||||
Ok 'Enter'
|
Ok 'Enter'
|
||||||
Back 'End' in numeric block
|
Back 'Backspace'
|
||||||
Red, Green, Yellow, Blue 'F1'..'F4'
|
Red, Green, Yellow, Blue 'F1'..'F4'
|
||||||
0..9 '0'..'9' in top row
|
0..9 '0'..'9'
|
||||||
Power 'P'
|
Volume+/- 'PgUp', 'PgDn'
|
||||||
Volume+/- '+', '-'
|
Mute 'F10'
|
||||||
Mute 'm'
|
|
||||||
|
|
||||||
If you prefer different key assignments, or if the default doesn't work for
|
If you want to change your key assignments later, simply delete the file
|
||||||
your keyboard, simply delete the file 'remote.conf' and restart 'vdr' to get
|
'remote.conf' and restart 'vdr' to get into learning mode.
|
||||||
into learning mode.
|
|
||||||
|
|
||||||
Generating source code documentation:
|
Generating source code documentation:
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
409
MANUAL
409
MANUAL
@ -1,7 +1,7 @@
|
|||||||
Video Disk Recorder User's Manual
|
Video Disk Recorder User's Manual
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
Version 1.6
|
Version 2.7
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
* Remote Control Keys
|
* Remote Control Keys
|
||||||
@ -50,8 +50,8 @@ Version 1.6
|
|||||||
Next Next/previous channel group (in live tv mode)
|
Next Next/previous channel group (in live tv mode)
|
||||||
Prev or next/previous editing mark (in replay mode)
|
Prev or next/previous editing mark (in replay mode)
|
||||||
|
|
||||||
Channel+ channel up
|
Channel+ channel up (live view), next error (replay)
|
||||||
Channel- channel down
|
Channel- channel down (live view), previous error (replay)
|
||||||
PrevChannel previous channel
|
PrevChannel previous channel
|
||||||
|
|
||||||
Power shutdown
|
Power shutdown
|
||||||
@ -90,7 +90,7 @@ Version 1.6
|
|||||||
be treated as part of that number, not as a sort mode toggle. If no numeric
|
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'
|
key has been pressed for more than one second, the number is reset and '0'
|
||||||
functions as sort mode toggle again.
|
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,
|
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).
|
the keys '1'...'7' can be used to toggle the individual days ('1' is Monday).
|
||||||
|
|
||||||
@ -264,7 +264,7 @@ Version 1.6
|
|||||||
|
|
||||||
* Pausing live video
|
* Pausing live video
|
||||||
|
|
||||||
If you want to pause the live programme you are just watching, simple press
|
If you want to pause the live programme you are just watching, simply press
|
||||||
"Menu/Yellow" or "Pause" on your remote control. VDR will start an instant
|
"Menu/Yellow" or "Pause" on your remote control. VDR will start an instant
|
||||||
recording of the current channel (just as if you had pressed "Menu/Red" or
|
recording of the current channel (just as if you had pressed "Menu/Red" or
|
||||||
"Record") and immediately begin replaying that recording. Replay will be
|
"Record") and immediately begin replaying that recording. Replay will be
|
||||||
@ -276,6 +276,9 @@ Version 1.6
|
|||||||
in the "Setup/Recording" menu. Recording time will be the same as for
|
in the "Setup/Recording" menu. Recording time will be the same as for
|
||||||
any other instant recording, so by default it will record 3 hours (which
|
any other instant recording, so by default it will record 3 hours (which
|
||||||
should be enough for any normal broadcast).
|
should be enough for any normal broadcast).
|
||||||
|
Note that the timer that is created for recording the paused live video will
|
||||||
|
always record on the local VDR, even if an "SVDRP default host" has been
|
||||||
|
set for normal timer recordings.
|
||||||
|
|
||||||
* Replaying a Recording
|
* Replaying a Recording
|
||||||
|
|
||||||
@ -363,15 +366,30 @@ Version 1.6
|
|||||||
- 0 Toggles an editing mark. If the mark indicator shows a red triangle,
|
- 0 Toggles an editing mark. If the mark indicator shows a red triangle,
|
||||||
the current mark is deleted. Otherwise a new mark is set at the
|
the current mark is deleted. Otherwise a new mark is set at the
|
||||||
current position.
|
current position.
|
||||||
- 4, 6 Move an editing mark back and forward. You need to first jump to
|
- 1, 3 Move an editing mark back and forward in "adaptive" mode. Pressing
|
||||||
an editing mark for this to work.
|
either of these keys for the first time moves the mark 120 seconds
|
||||||
|
in the given direction (configurable via "Setup/Replay/Initial
|
||||||
|
duration for adaptive skipping"). Further presses of the same key
|
||||||
|
keep moving the mark by the same value. Once the other key is
|
||||||
|
pressed, the value is divided by 2 (hence the name "adaptive") with
|
||||||
|
every further press of either key. Pressing '1' and '3'
|
||||||
|
alternatingly divides the distance all the way down to a single
|
||||||
|
I-frame. That way a particular place in a recording (for instance
|
||||||
|
the beginning or end of a commercial break) can be found very
|
||||||
|
quickly. If none of these two keys is pressed for a while
|
||||||
|
(configurable via "Setup/Replay/Reset timeout for adaptive
|
||||||
|
skipping") the distance falls back to the initial value.
|
||||||
|
If replay is not in Pause mode, or if there is no mark at the
|
||||||
|
current position, the skip is performed without moving any mark.
|
||||||
|
- 4, 6 Move an editing mark back and forward by one I-frame. You need to
|
||||||
|
first jump to an editing mark for this to work.
|
||||||
- 7, 9 Jump back and forward between editing marks. Replay goes into still
|
- 7, 9 Jump back and forward between editing marks. Replay goes into still
|
||||||
mode after jumping to a mark. If the current position is at the
|
mode after jumping to a mark. If the current position is at the
|
||||||
first or last mark, or if there are no marks at all, these keys
|
first or last mark, or if there are no marks at all, these keys
|
||||||
jump to the very beginning or end, respectively, of the recording.
|
jump to the very beginning or end, respectively, of the recording.
|
||||||
- 8 Positions replay at a point 3 seconds before the current or next
|
- 8 Positions replay at a point 3 seconds before the current or next
|
||||||
"begin" mark and starts replay.
|
"begin" mark and starts replay.
|
||||||
- 2 Start the actual cutting process.
|
- 2 Starts the actual cutting process.
|
||||||
|
|
||||||
Editing marks are represented by black, vertical lines in the progress display.
|
Editing marks are represented by black, vertical lines in the progress display.
|
||||||
A small black triangle at the top of the mark means that this is a "begin"
|
A small black triangle at the top of the mark means that this is a "begin"
|
||||||
@ -462,6 +480,8 @@ Version 1.6
|
|||||||
"forever", and a value of 0 means that this recording can be
|
"forever", and a value of 0 means that this recording can be
|
||||||
deleted any time if a recording with a higher priority needs disk
|
deleted any time if a recording with a higher priority needs disk
|
||||||
space.
|
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
|
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
|
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
|
time, so it is possible to have a "repeating timer" store all its
|
||||||
@ -483,6 +503,9 @@ Version 1.6
|
|||||||
the name of the recording.
|
the name of the recording.
|
||||||
First day: The date of the first day when this timer shall start recording
|
First day: The date of the first day when this timer shall start recording
|
||||||
(only available for repeating timers).
|
(only available for repeating timers).
|
||||||
|
Record on: The name of the remote VDR this timer shall record on (only available
|
||||||
|
if there are any remote VDRs connected to this VDR). If this field
|
||||||
|
is empty, the timer will record on the local VDR.
|
||||||
|
|
||||||
A timer can also be programmed by pressing the "Red" key on the "Schedule",
|
A timer can also be programmed by pressing the "Red" key on the "Schedule",
|
||||||
"Now", "Next" or "Event" menus.
|
"Now", "Next" or "Event" menus.
|
||||||
@ -490,6 +513,140 @@ Version 1.6
|
|||||||
The "Red" key in the "Edit timer" menu opens a list of folders, which can be
|
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.
|
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
|
* Managing folders
|
||||||
|
|
||||||
The "Select folder" menu, which can be accessed by pressing the "Red" key in
|
The "Select folder" menu, which can be accessed by pressing the "Red" key in
|
||||||
@ -500,9 +657,42 @@ Version 1.6
|
|||||||
folder name in the list). The "Yellow" key deletes the current folder (note
|
folder name in the list). The "Yellow" key deletes the current folder (note
|
||||||
that this will merely delete the folder definition stored in 'folders.conf'
|
that this will merely delete the folder definition stored in 'folders.conf'
|
||||||
and has no effect on existing timers or recordings). The "Blue" key can be
|
and has no effect on existing timers or recordings). The "Blue" key can be
|
||||||
used to edit an existing folder definition. The "Red" key selects the current
|
used to edit an existing folder definition. The "Red" key opens a folder that
|
||||||
folder, or enters a sub folder. Once a folder has been selected, the entire
|
contains sub folders, while pressing Ok selects the current folder. Once a
|
||||||
path of the timer's file name will be replaced with the selected folder.
|
folder has been selected, the entire path of the timer's file name will be
|
||||||
|
replaced with the selected folder.
|
||||||
|
|
||||||
|
In the "Recordings" menu the folders of existing recordings can be renamed or
|
||||||
|
moved by pressing the "Blue" key ("Edit") while the cursor is positioned on
|
||||||
|
a folder. This will open a menu in which the folder's name and location (the
|
||||||
|
"parent" folder) can be edited. If such an operation will result in moving
|
||||||
|
more than one recording, you will be asked for confirmation.
|
||||||
|
The name, folder, priority and lifetime of an individual recording can be
|
||||||
|
changed by pressing the "Blue" key ("Info") while the cursor is positioned
|
||||||
|
on a recording, and in the resulting Info menu pressing the "Blue" key again
|
||||||
|
to bring up the "Edit recording" menu.
|
||||||
|
In the "Edit recording" menu the Red button ("Folder") allows you to select one
|
||||||
|
of your predefined folders. The Green button has multiple functions, depending
|
||||||
|
on what is currently going on with the recording. It can either stop or cancel
|
||||||
|
a cut, move or copy operation. If the button reads "Stop..." it means that the
|
||||||
|
respective operation is already happening, while "Cancel..." means that the
|
||||||
|
operation is still pending execution. If no operation is currently happening
|
||||||
|
and the recording has editing marks, the Button will read "Cut" and triggers
|
||||||
|
cutting the recording (same as pressing '2' while replaying the recording).
|
||||||
|
The Yellow button ("Delete marks") allows you to delete all editing marks from
|
||||||
|
the selected recording (if there are any and the recording is not currently
|
||||||
|
being cut). To directly edit the folder or name of the recording, position the
|
||||||
|
cursor to the respective line and press the Right key to start editing (press
|
||||||
|
Ok to confirm the edit, or Back to return to the previous value). If you want
|
||||||
|
to remove the name of the recording and make the folder name the actual
|
||||||
|
recording's name, you can position the cursor to the "Name:" field and press
|
||||||
|
the '0' key. This will take the last element of the recording's folder path
|
||||||
|
and make it the actual name of the recording. You can do this in turn until
|
||||||
|
the recording is moved all the way up to the root of the video directory.
|
||||||
|
Note that, in case you inadvertently pressed the '0' key, you can leave the
|
||||||
|
"Edit recording" menu with the "Back" key and any changes you have made so far
|
||||||
|
will not be applied. Once you are finished with editing the recording
|
||||||
|
properties, press Ok to confirm the changes.
|
||||||
|
|
||||||
* Parameters in the "Setup" menu
|
* Parameters in the "Setup" menu
|
||||||
|
|
||||||
@ -601,6 +791,23 @@ Version 1.6
|
|||||||
Controls whether the full folder path is shown in the
|
Controls whether the full folder path is shown in the
|
||||||
"Timers" menu, or just the basic recording name.
|
"Timers" menu, or just the basic recording name.
|
||||||
|
|
||||||
|
Always sort folders first = yes
|
||||||
|
In the "Recordings" menu folders are always listed before
|
||||||
|
plain recordings. Set this option to "no" if you want folders
|
||||||
|
to be interspersed with recordings when sorted alphabetically.
|
||||||
|
|
||||||
|
Default sort mode for recordings = by time
|
||||||
|
Controls whether recordings are sorted by time or by name.
|
||||||
|
If a particular sort mode has been selected for a folder by
|
||||||
|
pressing '0', the default no longer applies to that folder.
|
||||||
|
|
||||||
|
Sorting direction for recordings = ascending
|
||||||
|
When recordings are sorted "by time", they appear in ascending
|
||||||
|
order (i.e. "oldest" to "newest"). If this parameter is set to
|
||||||
|
"descending", they will be presented "newest" to "oldest.
|
||||||
|
Note that in the latter case, if "Always sort folders first"
|
||||||
|
is "yes", folders will appear in reverse alphabetical order.
|
||||||
|
|
||||||
Number keys for characters = yes
|
Number keys for characters = yes
|
||||||
Controls whether the number keys can be used to enter
|
Controls whether the number keys can be used to enter
|
||||||
characters in a text input field. You may want to set this
|
characters in a text input field. You may want to set this
|
||||||
@ -622,6 +829,16 @@ Version 1.6
|
|||||||
A value of '0' completely turns off scanning on both single
|
A value of '0' completely turns off scanning on both single
|
||||||
and multiple card systems.
|
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.
|
EPG bugfix level = 3 Some tv stations transmit weirdly formatted EPG data.
|
||||||
VDR attempts to fix these bugs up to the given level:
|
VDR attempts to fix these bugs up to the given level:
|
||||||
0 = no EPG fixing
|
0 = no EPG fixing
|
||||||
@ -699,15 +916,16 @@ Version 1.6
|
|||||||
Defines the standard compliance mode:
|
Defines the standard compliance mode:
|
||||||
0 = DVB
|
0 = DVB
|
||||||
1 = ANSI/SCTE
|
1 = ANSI/SCTE
|
||||||
|
2 = NORDIG
|
||||||
|
|
||||||
Video format = 4:3 The video format (or aspect ratio) of the tv set in use
|
Video format = 4:3 The video format (or aspect ratio) of the tv set in use
|
||||||
(4:3 or 16:9).
|
(4:3 or 16:9). Applies only to SD output devices.
|
||||||
|
|
||||||
Video display format = letterbox
|
Video display format = letterbox
|
||||||
The display format to use for playing wide screen video on
|
The display format to use for playing wide screen video on
|
||||||
a 4:3 tv set ("pan & scan", "letterbox" or "center cut out").
|
a 4:3 tv set ("pan & scan", "letterbox" or "center cut out").
|
||||||
This option is only available if "Video format" is set to
|
This option is only available if "Video format" is set to
|
||||||
4:3.
|
4:3. Applies only to SD output devices.
|
||||||
|
|
||||||
Use Dolby Digital = yes
|
Use Dolby Digital = yes
|
||||||
Controls whether Dolby Digital tracks appear in the "Audio"
|
Controls whether Dolby Digital tracks appear in the "Audio"
|
||||||
@ -771,6 +989,28 @@ Version 1.6
|
|||||||
are connected to the same sat cable must be set to the same
|
are connected to the same sat cable must be set to the same
|
||||||
number here.
|
number here.
|
||||||
|
|
||||||
|
Use dish positioner = no
|
||||||
|
By default, the 'P' command code in DiSEqC command sequences
|
||||||
|
is ignored. Set this parameter to 'yes' if you are using a
|
||||||
|
satellite dish positioner.
|
||||||
|
|
||||||
|
Site latitude (degrees) = 0
|
||||||
|
Site longitude (degrees) = 0
|
||||||
|
Set these to the latitude and longitude of your dish's
|
||||||
|
location if you use a satellite dish positioner. Use the
|
||||||
|
"Green" key to switch between north/south and east/west,
|
||||||
|
respectively.
|
||||||
|
|
||||||
|
Max. positioner swing (degrees) = 65
|
||||||
|
Defines the maximum angle by which the positioner can move
|
||||||
|
the dish away from due south (or north) in either direction.
|
||||||
|
The valid range is 0...90.
|
||||||
|
|
||||||
|
Positioner speed (degrees/s) = 1.5
|
||||||
|
Defines the speed at which the positioner moves the dish.
|
||||||
|
The valid range is 0.1...180. This value is used to calculate
|
||||||
|
how long it takes the positioner to reach the target position.
|
||||||
|
|
||||||
CAM:
|
CAM:
|
||||||
|
|
||||||
n CAM Name Shows the CAM slots that are present in this system, where
|
n CAM Name Shows the CAM slots that are present in this system, where
|
||||||
@ -779,7 +1019,19 @@ Version 1.6
|
|||||||
if it is in the process of being reset, its current status
|
if it is in the process of being reset, its current status
|
||||||
is displayed. The "Red" key can be pressed to enter the CAM
|
is displayed. The "Red" key can be pressed to enter the CAM
|
||||||
menu, and the "Green" key triggers a reset of the selected
|
menu, and the "Green" key triggers a reset of the selected
|
||||||
slot. The "Ok" key also opens the CAM menu.
|
slot. The "Ok" key also opens the CAM menu. The "Yellow" key
|
||||||
|
assigns the selected CAM to a device and switches it to the
|
||||||
|
current channel. The CAM/device combination remains tuned to
|
||||||
|
the current channel until the smart card in the CAM has been
|
||||||
|
activated and thus starts to descramble, or until a recording
|
||||||
|
needs this device. Pressing the "Yellow" key while a CAM is
|
||||||
|
in activation mode cancels the activation. The activation mode
|
||||||
|
remains in effect even if you switch to a different channel
|
||||||
|
(provided there is more than one device in the system) or
|
||||||
|
watch a recording. To activate your smart card simply switch
|
||||||
|
to the channel you want to watch, open the "Setup/CAM" menu,
|
||||||
|
select the CAM that contains the smart card (in case you
|
||||||
|
have more than one CAM) and press the "Yellow" key.
|
||||||
|
|
||||||
Recording:
|
Recording:
|
||||||
|
|
||||||
@ -788,14 +1040,22 @@ Version 1.6
|
|||||||
after the official end time it shall stop recording.
|
after the official end time it shall stop recording.
|
||||||
These margins are added automatically to timers that
|
These margins are added automatically to timers that
|
||||||
are created from the EPG data.
|
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 priority = 50 The default Priority and Lifetime values used when
|
||||||
Default lifetime = 99 creating a new timer event. A Lifetime value of 99
|
Default lifetime = 99 creating a new timer event. A Lifetime value of 99
|
||||||
means that this recording will never be deleted
|
means that this recording will never be deleted
|
||||||
automatically.
|
automatically.
|
||||||
|
|
||||||
Pause priority = 10 The Priority and Lifetime values used when pausing live
|
Record key handling = 2
|
||||||
Pause lifetime = 1 video.
|
Defines what happens if the Record key on the remote control
|
||||||
|
is pressed during live tv.
|
||||||
|
0 = no instant recording
|
||||||
|
1 = confirm instant recording
|
||||||
|
2 = record instantly
|
||||||
|
The default is 2.
|
||||||
|
|
||||||
Pause key handling = 2 Defines what happens if the Pause key on the remote control
|
Pause key handling = 2 Defines what happens if the Pause key on the remote control
|
||||||
is pressed during live tv.
|
is pressed during live tv.
|
||||||
@ -804,6 +1064,9 @@ Version 1.6
|
|||||||
2 = pause live video
|
2 = pause live video
|
||||||
The default is 2.
|
The default is 2.
|
||||||
|
|
||||||
|
Pause priority = 10 The Priority and Lifetime values used when pausing live
|
||||||
|
Pause lifetime = 1 video.
|
||||||
|
|
||||||
Use episode name = yes Repeating timers use the EPG's 'Episode name' information
|
Use episode name = yes Repeating timers use the EPG's 'Episode name' information
|
||||||
to create recording file names in a hierarchical structure
|
to create recording file names in a hierarchical structure
|
||||||
(for instance to gather all episodes of a series in a
|
(for instance to gather all episodes of a series in a
|
||||||
@ -891,6 +1154,70 @@ Version 1.6
|
|||||||
Defines whether the player automatically goes into Pause
|
Defines whether the player automatically goes into Pause
|
||||||
mode when setting an editing mark.
|
mode when setting an editing mark.
|
||||||
|
|
||||||
|
Pause replay when jumping to a mark = yes
|
||||||
|
By default replay is automatically paused whenever you jump
|
||||||
|
to an editing mark with the '7' or '9' key in order to allow
|
||||||
|
you to easily adjust those marks. If this option is set to
|
||||||
|
'no', the '9' key will not pause if you are in Play mode and
|
||||||
|
the mark you jump to is not within 3 seconds of the end of
|
||||||
|
the recording.
|
||||||
|
|
||||||
|
Skip edited parts = no Defines whether the edited parts of a recording are
|
||||||
|
automatically skipped during replay. This includes jumping
|
||||||
|
to the first mark if replay starts at the beginning of the
|
||||||
|
recording, and stopping at the last mark.
|
||||||
|
|
||||||
|
Pause replay at last mark = no
|
||||||
|
If enabled, replay of a recording will go into Pause mode
|
||||||
|
when it has reached the last "end" mark (if any). Note that
|
||||||
|
the actual position at which the pause occurs may be a couple
|
||||||
|
of frames before the last "end" mark, depending on how much
|
||||||
|
data is buffered by your output device.
|
||||||
|
|
||||||
|
Initial duration for adaptive skipping (s) = 120
|
||||||
|
Defines the number of seconds to jump from the current replay
|
||||||
|
position in either direction, when pressing the '1' or '3'
|
||||||
|
key for the first time after the "Reset timeout for adaptive
|
||||||
|
skipping".
|
||||||
|
The valid range is 10...600.
|
||||||
|
|
||||||
|
Reset timeout for adaptive skipping (s) = 3
|
||||||
|
Defines the number of seconds after which pressing the
|
||||||
|
'1' or '3' key falls back to the "Initial duration for adaptive
|
||||||
|
skipping".
|
||||||
|
The valid range is 0...10. Setting the timeout to 0 disables
|
||||||
|
the adaptive mode and makes '1' and '3' always skip the number
|
||||||
|
of seconds configured as the initial duration.
|
||||||
|
|
||||||
|
Alternate behavior for adaptive skipping = no
|
||||||
|
When skipping in adaptive mode with the '1' and '3' keys, the
|
||||||
|
distance of the skip is halved with every key press after the
|
||||||
|
first change of direction. While this allows for locating a
|
||||||
|
particular position in a recording very fast, once you make
|
||||||
|
one step too many in the current direction you have no chance
|
||||||
|
of ever reaching the desired point any more. You will have to
|
||||||
|
wait for the timeout to occur and start adaptive skipping anew.
|
||||||
|
If this option is set to 'yes', the skip distance will only be
|
||||||
|
halved if the direction actually changes. That way, even if
|
||||||
|
you missed the target point, you can still back up to it.
|
||||||
|
|
||||||
|
Use Prev/Next keys for adaptive skipping = no
|
||||||
|
Normally the Prev/Next keys jump between editing marks (or
|
||||||
|
the beginning/end of the recording). You can set this option
|
||||||
|
to 'yes' if you want to use these keys for adaptive skipping
|
||||||
|
instead.
|
||||||
|
|
||||||
|
Skip distance with Green/Yellow keys (s) = 60
|
||||||
|
Defines the number of seconds to skip in either direction
|
||||||
|
when pressing the "Green" or "Yellow" key, respectively.
|
||||||
|
The valid range is 5...600.
|
||||||
|
|
||||||
|
Skip distance with Green/Yellow keys in repeat (s) = 60
|
||||||
|
Defines the number of seconds to skip in either direction
|
||||||
|
when pressing and holding the "Green" or "Yellow" key,
|
||||||
|
respectively.
|
||||||
|
The valid range is 5...600.
|
||||||
|
|
||||||
Resume ID = 0 Defines an additional ID that can be used in a multi user
|
Resume ID = 0 Defines an additional ID that can be used in a multi user
|
||||||
environment, so that every user has his/her own resume
|
environment, so that every user has his/her own resume
|
||||||
files for each recording. The valid range is 0...99, with
|
files for each recording. The valid range is 0...99, with
|
||||||
@ -914,6 +1241,23 @@ Version 1.6
|
|||||||
connection after which the connection is automatically
|
connection after which the connection is automatically
|
||||||
closed. Default is 300, a value of 0 means no timeout.
|
closed. Default is 300, a value of 0 means no timeout.
|
||||||
|
|
||||||
|
SVDRP peering = off Activates automatic connections between VDRs in the same
|
||||||
|
network. If set to "any hosts" this VDR will establish
|
||||||
|
connections with any available hosts. If set to "only
|
||||||
|
default host" this VDR will only connect to the VDR with
|
||||||
|
the name defined in "SVDRP default host". If no default
|
||||||
|
host has been defined, the behavior is the same as with
|
||||||
|
"any hosts". To switch from "off" to "only default host",
|
||||||
|
you may need to select "any hosts" first and confirm the
|
||||||
|
dialog by pressing "Ok" in order to be able to select a
|
||||||
|
default host.
|
||||||
|
|
||||||
|
SVDRP host name The name of this VDR, which is used when connecting VDRs
|
||||||
|
via SVDRP. By default, the machine's host name is used.
|
||||||
|
|
||||||
|
SVDRP default host The name of the VDR to be used by default when creating a
|
||||||
|
new timer.
|
||||||
|
|
||||||
Zap timeout = 3 The time (in seconds) until a channel counts as "previous"
|
Zap timeout = 3 The time (in seconds) until a channel counts as "previous"
|
||||||
for switching with '0'
|
for switching with '0'
|
||||||
|
|
||||||
@ -926,6 +1270,18 @@ Version 1.6
|
|||||||
key. Note that the total maximum is also limited by
|
key. Note that the total maximum is also limited by
|
||||||
the "OSD/Channel info time" parameter.
|
the "OSD/Channel info time" parameter.
|
||||||
|
|
||||||
|
Remote control repeat delay = 300
|
||||||
|
The earliest time (in milliseconds) after which the repeat
|
||||||
|
function of the remote control kicks in if a key is held
|
||||||
|
pressed down for a while. If the remote control in use
|
||||||
|
has a repeat delay that is longer than that given in this
|
||||||
|
parameter, that longer delay will prevail.
|
||||||
|
Remote control repeat delta = 100
|
||||||
|
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 delta
|
||||||
|
will prevail.
|
||||||
Initial channel = The channel ID of the channel that shall be tuned to when
|
Initial channel = The channel ID of the channel that shall be tuned to when
|
||||||
VDR starts. Default is empty, which means that it will
|
VDR starts. Default is empty, which means that it will
|
||||||
tune to the channel that was on before VDR was stopped.
|
tune to the channel that was on before VDR was stopped.
|
||||||
@ -935,15 +1291,27 @@ Version 1.6
|
|||||||
VDR was stopped will be used. The valid range is from
|
VDR was stopped will be used. The valid range is from
|
||||||
0 (silent) to 255 (loudest).
|
0 (silent) to 255 (loudest).
|
||||||
|
|
||||||
|
Volume steps = 51 The number of steps the volume will use when moving from
|
||||||
|
the lowest to the highest value. The valid range is from
|
||||||
|
5 to 255.
|
||||||
|
|
||||||
|
Volume linearize = 0 How to linearize the volume control. The valid range is
|
||||||
|
from -20 to 20. A value of 0 results in no linearization.
|
||||||
|
The higher this value is, the more fine grained the control
|
||||||
|
of the volume is for low sound levels. Lower values do the
|
||||||
|
same for high sound levels. This allows you to adjust the
|
||||||
|
more or less linear volume control of your sound card.
|
||||||
|
|
||||||
Channels wrap = no During zapping with the "Up" and "Down" keys (or the
|
Channels wrap = no During zapping with the "Up" and "Down" keys (or the
|
||||||
"Channel+" and "Channel-" keys) the current channel will
|
"Channel+" and "Channel-" keys) the current channel will
|
||||||
wrap around the beginning or end of the channel list if
|
wrap around the beginning or end of the channel list if
|
||||||
this parameter is set to 'yes'.
|
this parameter is set to 'yes'.
|
||||||
|
|
||||||
Show channel names with source = no
|
Show channel names with source = off
|
||||||
If this option is turned on, channel names will be displayed
|
If this option is turned on, channel names will be displayed
|
||||||
with the source appended to them, as in "ZDF (S)", where
|
with the source appended to them, as in "ZDF (S)" (if the
|
||||||
'S' stands for "Satellite".
|
option is set to "type), or "ZDF (S19.2E)" (if it is set to
|
||||||
|
"full"), where 'S' stands for "Satellite".
|
||||||
|
|
||||||
Emergency exit = yes If, for some reason, a recording fails because the video
|
Emergency exit = yes If, for some reason, a recording fails because the video
|
||||||
data stream is broken, or the CAM doesn't decrypt etc.,
|
data stream is broken, or the CAM doesn't decrypt etc.,
|
||||||
@ -976,4 +1344,3 @@ Version 1.6
|
|||||||
DEFINING THESE COMMANDS AND MAKE SURE THEY DON'T HARM YOUR SYSTEM,
|
DEFINING THESE COMMANDS AND MAKE SURE THEY DON'T HARM YOUR SYSTEM,
|
||||||
ESPECIALLY IF YOU ARE RUNNING VDR UNDER A HIGH PRIVILEGED USER ID
|
ESPECIALLY IF YOU ARE RUNNING VDR UNDER A HIGH PRIVILEGED USER ID
|
||||||
(LIKE 'root').
|
(LIKE 'root').
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
# See the main source file 'vdr.c' for copyright information and
|
# See the main source file 'vdr.c' for copyright information and
|
||||||
# how to reach the author.
|
# how to reach the author.
|
||||||
#
|
#
|
||||||
# $Id: Make.config.template 2.14 2012/12/28 09:55:22 kls Exp $
|
# $Id: Make.config.template 5.2 2024/10/11 14:21:04 kls Exp $
|
||||||
|
|
||||||
### The C compiler and options:
|
### The C compiler and options:
|
||||||
|
|
||||||
@ -14,48 +14,87 @@ CC = gcc
|
|||||||
CFLAGS = -g -O3 -Wall
|
CFLAGS = -g -O3 -Wall
|
||||||
|
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CXXFLAGS = $(CFLAGS) -Werror=overloaded-virtual -Wno-parentheses
|
CXXFLAGS = -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
CFLAGS += -fPIC
|
# Use 'make DEBUG=1 ...' to build a debug version of VDR and plugins:
|
||||||
|
ifdef DEBUG
|
||||||
|
CFLAGS += -O0
|
||||||
|
CXXFLAGS += -O0
|
||||||
|
endif
|
||||||
|
|
||||||
# Use 'make M32=1 ...' to build a 32-bit version of VDR on a 64-bit machine:
|
# Use 'make M32=1 ...' to build a 32-bit version of VDR on a 64-bit machine:
|
||||||
ifdef M32
|
ifdef M32
|
||||||
CFLAGS += -m32
|
CFLAGS += -m32
|
||||||
|
CXXFLAGS += -m32
|
||||||
endif
|
endif
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
PREFIX = /usr/local
|
# Default directories (adjust as necessary or desired):
|
||||||
#DVBDIR = /usr/src/v4l-dvb/linux
|
|
||||||
MANDIR = $(PREFIX)/man
|
#PREFIX = /usr/local
|
||||||
BINDIR = $(PREFIX)/bin
|
#VDRROOT = $(PREFIX)
|
||||||
|
#BINDIR = $(VDRROOT)/bin
|
||||||
|
#INCDIR = $(VDRROOT)/include
|
||||||
|
#LIBDIR = $(VDRROOT)/lib
|
||||||
|
#LOCDIR = $(VDRROOT)/locale
|
||||||
|
#MANDIR = $(VDRROOT)/man
|
||||||
|
#PCDIR = $(VDRROOT)/pkgconfig
|
||||||
|
#RESDIR = $(VDRROOT)/share
|
||||||
|
#DVBDIR = /usr/include
|
||||||
|
|
||||||
|
#VIDEODIR = /srv/vdr/video
|
||||||
|
#CONFDIR = /var/lib/vdr
|
||||||
|
#ARGSDIR = /etc/vdr/conf.d
|
||||||
|
#CACHEDIR = /var/cache/vdr
|
||||||
|
|
||||||
|
# Overrides for preset/legacy configurations:
|
||||||
|
|
||||||
|
# Use 'make LCLBLD=1' to build locale and plugin files under the source directory:
|
||||||
|
ifdef LCLBLD
|
||||||
|
LOCDIR = $(CWD)/locale
|
||||||
|
PLUGINDIR = $(CWD)/PLUGINS
|
||||||
|
ifndef PLUGIN # don't overwrite for plugins with old makefiles
|
||||||
|
LIBDIR = $(PLUGINDIR)/lib
|
||||||
|
endif
|
||||||
|
HDRDIR = $(CWD)/include
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Use 'make ONEDIR=1' to have all data in one single directory:
|
||||||
|
ifdef ONEDIR
|
||||||
|
VIDEODIR = /video
|
||||||
|
CACHEDIR = $(VIDEODIR)
|
||||||
|
CONFDIR = $(VIDEODIR)
|
||||||
|
ARGSDIR = $(VIDEODIR)/conf.d
|
||||||
|
RESDIR = $(VIDEODIR)
|
||||||
|
endif
|
||||||
|
|
||||||
# Use this if you want to have a central place where you configure compile time
|
# Use this if you want to have a central place where you configure compile time
|
||||||
# parameters for plugins:
|
# parameters for plugins:
|
||||||
#PLGCFG = /etc/vdr/plugins.conf
|
#PLGCFG = $(CONFDIR)/plugins.mk
|
||||||
|
|
||||||
# By default locale and plugin files are built under the source directory:
|
|
||||||
INCDIR = $(CWD)/include
|
|
||||||
LOCDIR = $(CWD)/locale
|
|
||||||
PLUGINDIR = $(CWD)/PLUGINS
|
|
||||||
LIBDIR = $(PLUGINDIR)/lib
|
|
||||||
# By default VDR requires only one single directory to operate:
|
|
||||||
VIDEODIR = /video
|
|
||||||
# Activate the following line to build VDR according to the FHS ("File system Hierarchy Standard"):
|
|
||||||
#USEFHS = 1
|
|
||||||
ifdef USEFHS
|
|
||||||
VIDEODIR = /srv/vdr/video
|
|
||||||
CONFDIR = /var/lib/vdr
|
|
||||||
CACHEDIR = /var/cache/vdr
|
|
||||||
RESDIR = $(PREFIX)/share/vdr
|
|
||||||
INCDIR = $(PREFIX)/include
|
|
||||||
LOCDIR = $(PREFIX)/share/locale
|
|
||||||
LIBDIR = $(PREFIX)/lib/vdr
|
|
||||||
endif
|
|
||||||
|
|
||||||
### The remote control:
|
### The remote control:
|
||||||
|
|
||||||
LIRC_DEVICE = /var/run/lirc/lircd
|
LIRC_DEVICE = /var/run/lirc/lircd
|
||||||
|
### Use this for kernel based driver:
|
||||||
|
#LIRC_DEVICE = /dev/lirc0
|
||||||
|
|
||||||
## Define if you want vdr to not run as root
|
### Define if you always want to use LIRC, independent of the --lirc option:
|
||||||
|
#REMOTE=LIRC
|
||||||
|
|
||||||
|
### Define if you don't want keyboard remote control:
|
||||||
|
#NO_KBD = 1
|
||||||
|
|
||||||
|
### Define if you want vdr to not run as root:
|
||||||
#VDR_USER = vdr
|
#VDR_USER = vdr
|
||||||
|
|
||||||
|
### Define if you want to compile in 'bidi' support:
|
||||||
|
#BIDI = 1
|
||||||
|
|
||||||
|
### Define if you want 'systemd' notification:
|
||||||
|
#SDNOTIFY = 1
|
||||||
|
|
||||||
|
### Fallback for plugins with old makefiles:
|
||||||
|
ifdef PLUGIN
|
||||||
|
CFLAGS += -fPIC
|
||||||
|
CXXFLAGS += -fPIC
|
||||||
|
endif
|
||||||
|
258
Makefile
258
Makefile
@ -4,67 +4,103 @@
|
|||||||
# See the main source file 'vdr.c' for copyright information and
|
# See the main source file 'vdr.c' for copyright information and
|
||||||
# how to reach the author.
|
# how to reach the author.
|
||||||
#
|
#
|
||||||
# $Id: Makefile 2.47 2012/12/30 11:18:18 kls Exp $
|
# $Id: Makefile 5.4 2024/10/21 19:01:16 kls Exp $
|
||||||
|
|
||||||
.DELETE_ON_ERROR:
|
.DELETE_ON_ERROR:
|
||||||
|
|
||||||
# Compiler flags:
|
# Compiler flags:
|
||||||
|
|
||||||
|
PKG_CONFIG ?= pkg-config
|
||||||
|
|
||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
CFLAGS ?= -g -O3 -Wall
|
CFLAGS ?= -g -O3 -Wall
|
||||||
|
|
||||||
CXX ?= g++
|
CXX ?= g++
|
||||||
CXXFLAGS ?= $(CFLAGS) -Werror=overloaded-virtual -Wno-parentheses
|
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
||||||
|
CXXFLAGS += $(CPPFLAGS)
|
||||||
CFLAGS += -fPIC
|
|
||||||
|
|
||||||
CDEFINES = -D_GNU_SOURCE
|
CDEFINES = -D_GNU_SOURCE
|
||||||
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_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)
|
||||||
|
|
||||||
# Directories:
|
# Directories:
|
||||||
|
|
||||||
CWD = .
|
CWD ?= $(shell pwd)
|
||||||
LSIDIR = ./libsi
|
LSIDIR ?= $(CWD)/libsi
|
||||||
DESTDIR ?=
|
PLUGINDIR ?= $(CWD)/PLUGINS
|
||||||
PREFIX ?= /usr/local
|
|
||||||
MANDIR ?= $(PREFIX)/share/man
|
|
||||||
BINDIR ?= $(PREFIX)/bin
|
|
||||||
INCDIR ?= $(CWD)/include
|
|
||||||
LOCDIR ?= $(CWD)/locale
|
|
||||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell pkg-config --libs freetype2 fontconfig)
|
|
||||||
INCLUDES ?= $(shell pkg-config --cflags freetype2 fontconfig)
|
|
||||||
|
|
||||||
PLUGINDIR= $(CWD)/PLUGINS
|
# Failsafe defaults for "make LCLBLD=1":
|
||||||
LIBDIR = $(PLUGINDIR)/lib
|
ifdef LCLBLD
|
||||||
|
DESTDIR ?= $(CWD)
|
||||||
|
LOCDIR ?= $(CWD)/locale
|
||||||
|
HDRDIR ?= $(CWD)/include
|
||||||
|
LIBDIR ?= $(PLUGINDIR)/lib
|
||||||
|
endif
|
||||||
|
|
||||||
# By default VDR requires only one single directory to operate:
|
DESTDIR ?=
|
||||||
VIDEODIR = /video
|
VIDEODIR ?= /srv/vdr/video
|
||||||
# See Make.config.template if you want to build VDR according to the FHS ("File system Hierarchy Standard")
|
CONFDIR ?= /var/lib/vdr
|
||||||
|
ARGSDIR ?= /etc/vdr/conf.d
|
||||||
|
CACHEDIR ?= /var/cache/vdr
|
||||||
|
|
||||||
DOXYGEN ?= /usr/bin/doxygen
|
PREFIX ?= /usr/local
|
||||||
DOXYFILE = Doxyfile
|
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
|
||||||
|
|
||||||
PCDIR ?= $(firstword $(subst :, , ${PKG_CONFIG_PATH}:$(shell pkg-config --variable=pc_path pkg-config):$(PREFIX)/lib/pkgconfig))
|
# Source documentation
|
||||||
|
|
||||||
|
DOXYGEN ?= /usr/bin/doxygen
|
||||||
|
DOXYFILE = Doxyfile
|
||||||
|
|
||||||
|
# User configuration
|
||||||
|
|
||||||
-include Make.config
|
-include Make.config
|
||||||
|
|
||||||
|
# Output control
|
||||||
|
|
||||||
|
ifdef VERBOSE
|
||||||
|
Q =
|
||||||
|
else
|
||||||
|
Q = @
|
||||||
|
endif
|
||||||
|
export Q
|
||||||
|
|
||||||
|
# Mandatory compiler flags:
|
||||||
|
|
||||||
|
CFLAGS += -fPIC
|
||||||
|
CXXFLAGS += -fPIC
|
||||||
|
|
||||||
|
# Common include files:
|
||||||
|
|
||||||
ifdef DVBDIR
|
ifdef DVBDIR
|
||||||
CFLAGS += -I$(DVBDIR)
|
CINCLUDES += -I$(DVBDIR)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
UP3 = $(if $(findstring "$(LIBDIR)-$(LOCDIR)","$(CWD)/PLUGINS/lib-$(CWD)/locale"),../../../,)
|
# Object files
|
||||||
|
|
||||||
SILIB = $(LSIDIR)/libsi.a
|
SILIB = $(LSIDIR)/libsi.a
|
||||||
|
|
||||||
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
|
OBJS = args.o audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
|
||||||
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
|
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
|
||||||
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o\
|
lirc.o menu.o menuitems.o mtd.o nit.o osdbase.o osd.o pat.o player.o plugin.o positioner.o\
|
||||||
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
|
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
|
||||||
skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
||||||
timers.o tools.o transfer.o vdr.o videodir.o
|
timers.o tools.o transfer.o vdr.o videodir.o
|
||||||
|
|
||||||
DEFINES += $(CDEFINES)
|
DEFINES += $(CDEFINES)
|
||||||
|
INCLUDES += $(CINCLUDES)
|
||||||
|
|
||||||
|
ifdef HDRDIR
|
||||||
|
HDRDIR := -I$(HDRDIR)
|
||||||
|
endif
|
||||||
ifndef NO_KBD
|
ifndef NO_KBD
|
||||||
DEFINES += -DREMOTE_KBD
|
DEFINES += -DREMOTE_KBD
|
||||||
endif
|
endif
|
||||||
@ -75,9 +111,14 @@ ifdef VDR_USER
|
|||||||
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
||||||
endif
|
endif
|
||||||
ifdef BIDI
|
ifdef BIDI
|
||||||
INCLUDES += $(shell pkg-config --cflags fribidi)
|
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi)
|
||||||
DEFINES += -DBIDI
|
DEFINES += -DBIDI
|
||||||
LIBS += $(shell pkg-config --libs fribidi)
|
LIBS += $(shell $(PKG_CONFIG) --libs fribidi)
|
||||||
|
endif
|
||||||
|
ifdef SDNOTIFY
|
||||||
|
INCLUDES += $(shell $(PKG_CONFIG) --silence-errors --cflags libsystemd-daemon || $(PKG_CONFIG) --cflags libsystemd)
|
||||||
|
DEFINES += -DSDNOTIFY
|
||||||
|
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LIRC_DEVICE ?= /var/run/lirc/lircd
|
LIRC_DEVICE ?= /var/run/lirc/lircd
|
||||||
@ -85,17 +126,12 @@ LIRC_DEVICE ?= /var/run/lirc/lircd
|
|||||||
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
|
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
|
||||||
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
||||||
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
|
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
|
||||||
|
DEFINES += -DARGSDIR=\"$(ARGSDIR)\"
|
||||||
DEFINES += -DCACHEDIR=\"$(CACHEDIR)\"
|
DEFINES += -DCACHEDIR=\"$(CACHEDIR)\"
|
||||||
DEFINES += -DRESDIR=\"$(RESDIR)\"
|
DEFINES += -DRESDIR=\"$(RESDIR)\"
|
||||||
DEFINES += -DPLUGINDIR=\"$(LIBDIR)\"
|
DEFINES += -DPLUGINDIR=\"$(LIBDIR)\"
|
||||||
DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
||||||
|
|
||||||
# Default values for directories:
|
|
||||||
|
|
||||||
CONFDIRDEF = $(firstword $(CONFDIR) $(VIDEODIR))
|
|
||||||
CACHEDIRDEF = $(firstword $(CACHEDIR) $(VIDEODIR))
|
|
||||||
RESDIRDEF = $(firstword $(RESDIR) $(CONFDIRDEF))
|
|
||||||
|
|
||||||
# The version numbers of VDR and the plugin API (taken from VDR's "config.h"):
|
# The version numbers of VDR and the plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
VDRVERSION = $(shell sed -ne '/define VDRVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
VDRVERSION = $(shell sed -ne '/define VDRVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||||
@ -106,7 +142,8 @@ all: vdr i18n plugins
|
|||||||
# Implicit rules:
|
# Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
# Dependencies:
|
# Dependencies:
|
||||||
|
|
||||||
@ -120,33 +157,38 @@ $(DEPFILE): Makefile
|
|||||||
# The main program:
|
# The main program:
|
||||||
|
|
||||||
vdr: $(OBJS) $(SILIB)
|
vdr: $(OBJS) $(SILIB)
|
||||||
$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
|
||||||
|
|
||||||
# The libsi library:
|
# The libsi library:
|
||||||
|
|
||||||
$(SILIB):
|
$(SILIB): make-libsi
|
||||||
$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
|
@$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
|
||||||
|
make-libsi: # empty rule makes sure the sub-make for libsi is always called
|
||||||
|
|
||||||
# pkg-config file:
|
# pkg-config file:
|
||||||
|
|
||||||
.PHONY: vdr.pc
|
.PHONY: vdr.pc
|
||||||
vdr.pc:
|
vdr.pc:
|
||||||
@echo "bindir=$(BINDIR)" > $@
|
@echo "vdrrootdir=$(VDRROOT)" > $@
|
||||||
|
@echo "bindir=$(BINDIR)" >> $@
|
||||||
|
@echo "incdir=$(INCDIR)" >> $@
|
||||||
@echo "mandir=$(MANDIR)" >> $@
|
@echo "mandir=$(MANDIR)" >> $@
|
||||||
@echo "configdir=$(CONFDIRDEF)" >> $@
|
|
||||||
@echo "videodir=$(VIDEODIR)" >> $@
|
@echo "videodir=$(VIDEODIR)" >> $@
|
||||||
@echo "cachedir=$(CACHEDIRDEF)" >> $@
|
@echo "configdir=$(CONFDIR)" >> $@
|
||||||
@echo "resdir=$(RESDIRDEF)" >> $@
|
@echo "argsdir=$(ARGSDIR)" >> $@
|
||||||
@echo "libdir=$(UP3)$(LIBDIR)" >> $@
|
@echo "cachedir=$(CACHEDIR)" >> $@
|
||||||
@echo "locdir=$(UP3)$(LOCDIR)" >> $@
|
@echo "resdir=$(RESDIR)" >> $@
|
||||||
|
@echo "libdir=$(LIBDIR)" >> $@
|
||||||
|
@echo "locdir=$(LOCDIR)" >> $@
|
||||||
@echo "plgcfg=$(PLGCFG)" >> $@
|
@echo "plgcfg=$(PLGCFG)" >> $@
|
||||||
@echo "apiversion=$(APIVERSION)" >> $@
|
@echo "apiversion=$(APIVERSION)" >> $@
|
||||||
@echo "cflags=$(CFLAGS) $(CDEFINES) -I$(UP3)$(INCDIR)" >> $@
|
@echo "cflags=$(CFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
||||||
@echo "cxxflags=$(CXXFLAGS) $(CDEFINES) -I$(UP3)$(INCDIR)" >> $@
|
@echo "cxxflags=$(CXXFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
||||||
@echo "" >> $@
|
@echo "" >> $@
|
||||||
@echo "Name: VDR" >> $@
|
@echo "Name: VDR" >> $@
|
||||||
@echo "Description: Video Disk Recorder" >> $@
|
@echo "Description: Video Disk Recorder" >> $@
|
||||||
@echo "URL: http://www.tvdr.de/" >> $@
|
@echo "URL: https://www.tvdr.de/" >> $@
|
||||||
@echo "Version: $(VDRVERSION)" >> $@
|
@echo "Version: $(VDRVERSION)" >> $@
|
||||||
@echo "Cflags: \$${cflags}" >> $@
|
@echo "Cflags: \$${cflags}" >> $@
|
||||||
|
|
||||||
@ -155,29 +197,33 @@ vdr.pc:
|
|||||||
PODIR = po
|
PODIR = po
|
||||||
LOCALEDIR = locale
|
LOCALEDIR = locale
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||||
|
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||||
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr.mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr.mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||||
I18Npot = $(PODIR)/vdr.pot
|
I18Npot = $(PODIR)/vdr.pot
|
||||||
|
|
||||||
%.mo: %.po
|
%.mo: %.po
|
||||||
msgfmt -c -o $@ $<
|
@echo MO $@
|
||||||
|
$(Q)msgfmt -c -o $@ $<
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
|
@echo GT $@
|
||||||
|
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
%.po: $(I18Npot)
|
||||||
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
@echo PO $@
|
||||||
|
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
|
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
|
||||||
@mkdir -p $(dir $@)
|
@echo IN $@
|
||||||
cp $< $@
|
$(Q)install -D -m644 $< $@
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
i18n: $(I18Nmsgs) $(I18Npot)
|
i18n: $(I18Nmsgs)
|
||||||
|
|
||||||
install-i18n:
|
install-i18n: i18n
|
||||||
@mkdir -p $(DESTDIR)$(LOCDIR)
|
@mkdir -p $(DESTDIR)$(LOCDIR)
|
||||||
@(cd $(LOCALEDIR); cp -r --parents * $(DESTDIR)$(LOCDIR))
|
cp -r $(LOCALEDIR)/* $(DESTDIR)$(LOCDIR)
|
||||||
|
|
||||||
# The 'include' directory (for plugins):
|
# The 'include' directory (for plugins):
|
||||||
|
|
||||||
@ -192,45 +238,54 @@ include-dir:
|
|||||||
plugins: include-dir vdr.pc
|
plugins: include-dir vdr.pc
|
||||||
@failed="";\
|
@failed="";\
|
||||||
noapiv="";\
|
noapiv="";\
|
||||||
|
oldmakefile="";\
|
||||||
for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
||||||
echo "*** Plugin $$i:";\
|
echo; echo "*** Plugin $$i:";\
|
||||||
|
# No APIVERSION: Skip\
|
||||||
if ! grep -q "\$$(LIBDIR)/.*\$$(APIVERSION)" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
if ! grep -q "\$$(LIBDIR)/.*\$$(APIVERSION)" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
||||||
echo "ERROR: plugin $$i doesn't honor APIVERSION - not compiled!";\
|
echo "ERROR: plugin $$i doesn't honor APIVERSION - not compiled!";\
|
||||||
noapiv="$$noapiv $$i";\
|
noapiv="$$noapiv $$i";\
|
||||||
continue;\
|
continue;\
|
||||||
fi;\
|
fi;\
|
||||||
newmakefile=`grep "PKGCFG" "$(PLUGINDIR)/src/$$i/Makefile"`;\
|
# Old Makefile\
|
||||||
if [ -z "$$newmakefile" ]; then\
|
if ! grep -q "PKGCFG" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
||||||
echo "********************************************************************";\
|
echo "WARNING: plugin $$i is using an old Makefile!";\
|
||||||
echo "* Your plugin \"$$i\" is using an old Makefile!";\
|
oldmakefile="$$oldmakefile $$i";\
|
||||||
echo "* While this currently still works, it is strongly recommended";\
|
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" CFLAGS="$(CFLAGS) $(CDEFINES) $(CINCLUDES)" CXXFLAGS="$(CXXFLAGS) $(CDEFINES) $(CINCLUDES)" LIBDIR="$(PLUGINDIR)/lib" VDRDIR="$(CWD)" all || failed="$$failed $$i";\
|
||||||
echo "* that you convert that Makefile to the new style used since";\
|
continue;\
|
||||||
echo "* VDR version 1.7.35. Support for old style Makefiles may be dropped";\
|
fi;\
|
||||||
echo "* in future versions of VDR.";\
|
# New Makefile\
|
||||||
echo "********************************************************************";\
|
INCLUDES="-I$(CWD)/include"\
|
||||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" CXXFLAGS="$(CXXFLAGS)" VDRDIR=$(UP3) LIBDIR=../../lib all || failed="$$failed $$i";\
|
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" || failed="$$failed $$i";\
|
||||||
else\
|
if [ -n "$(LCLBLD)" ] ; then\
|
||||||
target=all;\
|
(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 [ "$(LIBDIR)" = "$(CWD)/PLUGINS/lib" ] && [ "$(LOCDIR)" = "$(CWD)/locale" ]; then\
|
if [ -d $(PLUGINDIR)/src/$$i/po ]; then\
|
||||||
target="install";\
|
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;\
|
||||||
|
done;\
|
||||||
fi;\
|
fi;\
|
||||||
includes=;\
|
|
||||||
if [ "$(INCDIR)" != "$(CWD)/include" ]; then\
|
|
||||||
includes="INCLUDES=-I$(UP3)/include";\
|
|
||||||
fi;\
|
|
||||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(UP3) $$includes $$target || failed="$$failed $$i";\
|
|
||||||
fi;\
|
fi;\
|
||||||
done;\
|
done;\
|
||||||
|
# Conclusion\
|
||||||
if [ -n "$$noapiv" ] ; then echo; echo "*** plugins without APIVERSION:$$noapiv"; echo; fi;\
|
if [ -n "$$noapiv" ] ; then echo; echo "*** plugins without APIVERSION:$$noapiv"; echo; fi;\
|
||||||
|
if [ -n "$$oldmakefile" ] ; then\
|
||||||
|
echo; echo "*** plugins with old Makefile:$$oldmakefile"; echo;\
|
||||||
|
echo "**********************************************************************";\
|
||||||
|
echo "*** While this currently still works, it is strongly recommended";\
|
||||||
|
echo "*** that you convert old Makefiles to the new style used since";\
|
||||||
|
echo "*** VDR version 1.7.36. Support for old style Makefiles may be dropped";\
|
||||||
|
echo "*** in future versions of VDR.";\
|
||||||
|
echo "**********************************************************************";\
|
||||||
|
fi;\
|
||||||
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; exit 1; fi
|
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; exit 1; fi
|
||||||
|
|
||||||
clean-plugins:
|
clean-plugins: vdr.pc
|
||||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" clean; done
|
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" clean; done
|
||||||
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
||||||
|
|
||||||
# Install the files:
|
# Install the files (note that 'install-pc' must be first!):
|
||||||
|
|
||||||
install: install-bin install-dirs install-conf install-doc install-plugins install-i18n install-includes install-pc
|
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes
|
||||||
|
|
||||||
# VDR binary:
|
# VDR binary:
|
||||||
|
|
||||||
@ -242,13 +297,18 @@ install-bin: vdr
|
|||||||
|
|
||||||
install-dirs:
|
install-dirs:
|
||||||
@mkdir -p $(DESTDIR)$(VIDEODIR)
|
@mkdir -p $(DESTDIR)$(VIDEODIR)
|
||||||
@mkdir -p $(DESTDIR)$(CONFDIRDEF)
|
@mkdir -p $(DESTDIR)$(CONFDIR)
|
||||||
@mkdir -p $(DESTDIR)$(CACHEDIRDEF)
|
@mkdir -p $(DESTDIR)$(ARGSDIR)
|
||||||
@mkdir -p $(DESTDIR)$(RESDIRDEF)
|
@mkdir -p $(DESTDIR)$(CACHEDIR)
|
||||||
|
@mkdir -p $(DESTDIR)$(RESDIR)
|
||||||
install-conf:
|
|
||||||
@cp -n *.conf $(DESTDIR)$(CONFDIRDEF)
|
|
||||||
|
|
||||||
|
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:
|
# Documentation:
|
||||||
|
|
||||||
@ -257,13 +317,20 @@ install-doc:
|
|||||||
@mkdir -p $(DESTDIR)$(MANDIR)/man5
|
@mkdir -p $(DESTDIR)$(MANDIR)/man5
|
||||||
@gzip -c vdr.1 > $(DESTDIR)$(MANDIR)/man1/vdr.1.gz
|
@gzip -c vdr.1 > $(DESTDIR)$(MANDIR)/man1/vdr.1.gz
|
||||||
@gzip -c vdr.5 > $(DESTDIR)$(MANDIR)/man5/vdr.5.gz
|
@gzip -c vdr.5 > $(DESTDIR)$(MANDIR)/man5/vdr.5.gz
|
||||||
|
@gzip -c svdrpsend.1 > $(DESTDIR)$(MANDIR)/man1/svdrpsend.1.gz
|
||||||
|
|
||||||
# Plugins:
|
# Plugins:
|
||||||
|
|
||||||
install-plugins: plugins
|
install-plugins: plugins
|
||||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
@-for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
|
||||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(UP3) DESTDIR=$(DESTDIR) install;\
|
echo; echo "*** Plugin $$i:";\
|
||||||
done
|
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(CWD) DESTDIR=$(DESTDIR) install;\
|
||||||
|
done
|
||||||
|
@if [ -d $(PLUGINDIR)/lib ] ; then\
|
||||||
|
for i in `find $(PLUGINDIR)/lib -name 'lib*-*.so.$(APIVERSION)'`; do\
|
||||||
|
install -D $$i $(DESTDIR)$(LIBDIR);\
|
||||||
|
done;\
|
||||||
|
fi
|
||||||
|
|
||||||
# Includes:
|
# Includes:
|
||||||
|
|
||||||
@ -274,16 +341,17 @@ install-includes: include-dir
|
|||||||
# pkg-config file:
|
# pkg-config file:
|
||||||
|
|
||||||
install-pc: vdr.pc
|
install-pc: vdr.pc
|
||||||
if [ -n "$(PCDIR)" ] ; then \
|
if [ -n "$(PCDIR)" ] ; then\
|
||||||
mkdir -p $(DESTDIR)$(PCDIR) ; \
|
mkdir -p $(DESTDIR)$(PCDIR) ;\
|
||||||
cp vdr.pc $(DESTDIR)$(PCDIR) ; \
|
cp vdr.pc $(DESTDIR)$(PCDIR) ;\
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Source documentation:
|
# Source documentation:
|
||||||
|
|
||||||
srcdoc:
|
srcdoc:
|
||||||
@cp $(DOXYFILE) $(DOXYFILE).tmp
|
@cat $(DOXYFILE) > $(DOXYFILE).tmp
|
||||||
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
|
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
|
||||||
|
@chmod +x $(DOXYFILE).filter
|
||||||
$(DOXYGEN) $(DOXYFILE).tmp
|
$(DOXYGEN) $(DOXYFILE).tmp
|
||||||
@rm $(DOXYFILE).tmp
|
@rm $(DOXYFILE).tmp
|
||||||
|
|
||||||
@ -292,7 +360,7 @@ srcdoc:
|
|||||||
clean:
|
clean:
|
||||||
@$(MAKE) --no-print-directory -C $(LSIDIR) clean
|
@$(MAKE) --no-print-directory -C $(LSIDIR) clean
|
||||||
@-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~
|
@-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 include
|
||||||
@-rm -rf srcdoc
|
@-rm -rf srcdoc
|
||||||
CLEAN: clean
|
CLEAN: clean
|
||||||
|
311
PLUGINS.html
311
PLUGINS.html
@ -31,14 +31,11 @@ modified {
|
|||||||
<div class="center">
|
<div class="center">
|
||||||
<h1>The VDR Plugin System</h1>
|
<h1>The VDR Plugin System</h1>
|
||||||
|
|
||||||
<b>Version 1.7</b>
|
<b>Version 2.7</b>
|
||||||
<p>
|
<p>
|
||||||
Copyright © 2009 Klaus Schmidinger<br>
|
Copyright © 2021 Klaus Schmidinger<br>
|
||||||
<a href="mailto:kls@tvdr.de">kls@tvdr.de</a><br>
|
<a href="mailto:vdr@tvdr.de">vdr@tvdr.de</a><br>
|
||||||
<a href="http://www.tvdr.de">www.tvdr.de</a>
|
<a href="https://www.tvdr.de">www.tvdr.de</a>
|
||||||
</div>
|
|
||||||
<div class="center">
|
|
||||||
<modified>Important modifications introduced since version 1.6 are marked like this.</modified>
|
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
VDR provides an easy to use plugin interface that allows additional functionality
|
VDR provides an easy to use plugin interface that allows additional functionality
|
||||||
@ -77,15 +74,15 @@ structures and allows it to hook itself into specific areas to perform special a
|
|||||||
<li><a href="#Main menu entry">Main menu entry</a>
|
<li><a href="#Main menu entry">Main menu entry</a>
|
||||||
<li><a href="#User interaction">User interaction</a>
|
<li><a href="#User interaction">User interaction</a>
|
||||||
<li><a href="#Housekeeping">Housekeeping</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="#Activity">Activity</a>
|
||||||
<li><a href="#Wakeup">Wakeup</a>
|
<li><a href="#Wakeup">Wakeup</a>
|
||||||
<li><a href="#Setup parameters">Setup parameters</a>
|
<li><a href="#Setup parameters">Setup parameters</a>
|
||||||
<li><a href="#The Setup menu">The Setup menu</a>
|
<li><a href="#The Setup menu">The Setup menu</a>
|
||||||
<li><modified><a href="#Additional files">Additional files</modified></a>
|
<li><a href="#Additional files">Additional files</a>
|
||||||
<li><a href="#Internationalization">Internationalization</a>
|
<li><a href="#Internationalization">Internationalization</a>
|
||||||
<li><a href="#Custom services">Custom services</a>
|
<li><a href="#Custom services">Custom services</a>
|
||||||
<li><a href="#SVDRP commands">SVDRP commands</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="#Loading plugins into VDR">Loading plugins into VDR</a>
|
||||||
<li><a href="#Building the distribution package">Building the distribution package</a>
|
<li><a href="#Building the distribution package">Building the distribution package</a>
|
||||||
</ul>
|
</ul>
|
||||||
@ -99,10 +96,12 @@ structures and allows it to hook itself into specific areas to perform special a
|
|||||||
<li><a href="#Skins">Skins</a>
|
<li><a href="#Skins">Skins</a>
|
||||||
<li><a href="#Themes">Themes</a>
|
<li><a href="#Themes">Themes</a>
|
||||||
<li><a href="#Devices">Devices</a>
|
<li><a href="#Devices">Devices</a>
|
||||||
|
<li><a href="#Positioners">Positioners</a>
|
||||||
<li><a href="#Audio">Audio</a>
|
<li><a href="#Audio">Audio</a>
|
||||||
<li><a href="#Remote Control">Remote Control</a>
|
<li><a href="#Remote Control">Remote Control</a>
|
||||||
<li><a href="#Conditional Access">Conditional Access</a>
|
<li><a href="#Conditional Access">Conditional Access</a>
|
||||||
<li><modified><a href="#Electronic Program Guide">Electronic Program Guide</modified></a>
|
<li><a href="#Electronic Program Guide">Electronic Program Guide</a>
|
||||||
|
<li><a href="#The video directory">The video directory</a>
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@ -166,22 +165,26 @@ is used:
|
|||||||
VDR/PLUGINS/src
|
VDR/PLUGINS/src
|
||||||
VDR/PLUGINS/src/hello
|
VDR/PLUGINS/src/hello
|
||||||
VDR/PLUGINS/lib
|
VDR/PLUGINS/lib
|
||||||
VDR/PLUGINS/lib/libvdr-hello.so.1.1.0
|
VDR/PLUGINS/lib/libvdr-hello.so.1
|
||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
The <tt>src</tt> directory contains one subdirectory for each plugin, which carries
|
The <tt>src</tt> directory contains one subdirectory for each plugin, which carries
|
||||||
the name of that plugin (in the above example that would be <tt>hello</tt>).
|
the name of that plugin (in the above example that would be <tt>hello</tt>).
|
||||||
What's inside the individual source directory of a
|
What's inside the individual source directory of a
|
||||||
plugin is entirely up to the author of that plugin. The only prerequisites are
|
plugin is entirely up to the author of that plugin. The only prerequisites are
|
||||||
that there is a <tt>Makefile</tt> that provides the targets <tt>all</tt> and
|
that there is a <tt>Makefile</tt> that provides the targets <tt>all</tt>, <tt>install</tt> and
|
||||||
<tt>clean</tt>, and that a call to <tt>make all</tt> actually produces a dynamically
|
<tt>clean</tt>, and that a call to <tt>make all</tt> actually produces a dynamically
|
||||||
loadable library file for that plugin (we'll get to the details later).
|
loadable library file for that plugin (we'll get to the details later).
|
||||||
|
The dynamically loadable library file for the plugin shall be located directly under
|
||||||
|
the plugin's source directory.
|
||||||
|
See the section <a href="#Initializing a new plugin directory">Initializing a new plugin directory</a>
|
||||||
|
for how to generate an example Makefile.
|
||||||
<p>
|
<p>
|
||||||
The <tt>lib</tt> directory contains the dynamically loadable libraries of all
|
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
|
available plugins. Note that the names of these files are created by concatenating
|
||||||
<p>
|
<p>
|
||||||
<table border=2>
|
<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>
|
<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>
|
</table>
|
||||||
<p>
|
<p>
|
||||||
@ -192,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
|
to the VDR header files, can be made without requiring all plugins to be
|
||||||
recompiled.
|
recompiled.
|
||||||
<p>
|
<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
|
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
|
is not used, the path to the plugin directory has be be given to VDR through the
|
||||||
<b><tt>-L</tt></b> option.
|
<b><tt>-L</tt></b> option.
|
||||||
@ -387,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.
|
to extract the version number when generating the file name for the distribution archive.
|
||||||
<p>
|
<p>
|
||||||
A new plugin project should start with version number <tt>0.0.1</tt> and should reach
|
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
|
version <tt>1.0.0</tt> once it is completely operative and well tested.
|
||||||
Linux kernel version numbering scheme, versions with <i>even</i> release numbers
|
|
||||||
(like <tt>1.0.x</tt>, <tt>1.2.x</tt>, <tt>1.4.x</tt>...) should be stable releases,
|
|
||||||
while those with <i>odd</i> release numbers (like <tt>1.1.x</tt>, <tt>1.3.x</tt>,
|
|
||||||
<tt>1.5.x</tt>...) are usually considered "under development". The three parts of
|
|
||||||
a version number are not limited to single digits, so a version number of <tt>1.2.15</tt>
|
|
||||||
would be acceptable.
|
|
||||||
|
|
||||||
<hr><h2><a name="Description">Description</a></h2>
|
<hr><h2><a name="Description">Description</a></h2>
|
||||||
|
|
||||||
@ -569,7 +571,7 @@ If the plugin should print log messages, you can use <tt>dsyslog()</tt>, <tt>isy
|
|||||||
<li><tt>esyslog()</tt> prints the log message only if the log level of vdr is set to 1 or above.
|
<li><tt>esyslog()</tt> prints the log message only if the log level of vdr is set to 1 or above.
|
||||||
</ul>
|
</ul>
|
||||||
The output of this log is the syslog of the system vdr is running on.
|
The output of this log is the syslog of the system vdr is running on.
|
||||||
The logmessage can be formatted like <tt>printf()</tt>, as in
|
The log message can be formatted like <tt>printf()</tt>, as in
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
esyslog("pluginname: error #%d has occurred", ErrorNumber);
|
esyslog("pluginname: error #%d has occurred", ErrorNumber);
|
||||||
@ -577,6 +579,31 @@ esyslog("pluginname: error #%d has occurred", ErrorNumber);
|
|||||||
|
|
||||||
Note that the log messages will be given as provided, the plugin's name will not
|
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.
|
automatically be added, so make sure your log messages are obvious enough.
|
||||||
|
<p>
|
||||||
|
Only use the above logging functions for occasional log messages. Do not use
|
||||||
|
them unconditionally for frequent messages that produce long sequences of lines
|
||||||
|
in the log file every few seconds. That might make it hard to work on other plugins
|
||||||
|
or the core VDR code, watching their log entries while they are permanently
|
||||||
|
interspersed with unrelated stuff.<br>
|
||||||
|
<br>
|
||||||
|
The recommended behavior for a plugin that does logging is to implement a command
|
||||||
|
line option that controls the level of log messages, preferably '-l N, --log=N',
|
||||||
|
where 'N' is in the range 0...3, with 0 meaning no logging whatsoever, 1 log only
|
||||||
|
errors, 2 log errors and informational messages, and 3 also log debug information.<br>
|
||||||
|
<br>
|
||||||
|
If a plugin can output extensive data for special debugging purposes (either to
|
||||||
|
the log file or stdout/stderr), this should be enabled by setting proper switches
|
||||||
|
in one of its source files (see for example how the communication between VDR and
|
||||||
|
CAMs can be monitored in VDR/ci.c).<br>
|
||||||
|
<br>
|
||||||
|
Under no circumstances must a plugin print anything to stdout or stderr during
|
||||||
|
normal operation! The only exceptions being special debug information as described
|
||||||
|
above, fatal error messages that will cause VDR to abort, or if it is the sole
|
||||||
|
purpose of the plugin to display something on stdout, like for instance the
|
||||||
|
<i>skincurses</i> plugin, which displays the OSD at the console.<br>
|
||||||
|
<br>
|
||||||
|
Please make any log messages in <b>ENGLISH</b>! Logs are usually sent to the developers
|
||||||
|
of a program, and they may not be able to read them if they are in an exotic language.
|
||||||
|
|
||||||
<hr><h2><a name="Main menu entry">Main menu entry</a></h2>
|
<hr><h2><a name="Main menu entry">Main menu entry</a></h2>
|
||||||
|
|
||||||
@ -664,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.
|
the plugin should launch a separate thread to do this.
|
||||||
</b>
|
</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>
|
<hr><h2><a name="Activity">Activity</a></h2>
|
||||||
|
|
||||||
<div class="blurb">Now is not a good time!</div><p>
|
<div class="blurb">Now is not a good time!</div><p>
|
||||||
@ -885,70 +891,51 @@ You can first assign the temporary values to the global variables and then do th
|
|||||||
your setup parameters and use that one to copy all parameters with one single statement
|
your setup parameters and use that one to copy all parameters with one single statement
|
||||||
(like VDR does with its cSetup class).
|
(like VDR does with its cSetup class).
|
||||||
|
|
||||||
<hr><h2><modified><a name="Additional files">Additional files</a></modified></h2>
|
<hr><h2><a name="Additional files">Additional files</a></h2>
|
||||||
|
|
||||||
<div class="blurb">I want my own stuff!</div><p>
|
<div class="blurb">I want my own stuff!</div><p>
|
||||||
|
|
||||||
<modified>
|
|
||||||
There may be situations where a plugin requires files of its own. While the plugin is
|
There may be situations where a plugin requires files of its own. While the plugin is
|
||||||
free to store such files anywhere it sees fit, it might be a good idea to put them in a common
|
free to store such files anywhere it sees fit, it might be a good idea to put them in a common
|
||||||
place, preferably where such data already exists.
|
place, preferably where such data already exists.
|
||||||
</modified>
|
|
||||||
<p>
|
<p>
|
||||||
<modified>
|
|
||||||
<i>configuration files</i>, maybe for data that can't be stored in the simple
|
<i>configuration files</i>, maybe for data that can't be stored in the simple
|
||||||
<a href="#Setup parameters">setup parameters</a> of VDR, or maybe because it needs to
|
<a href="#Setup parameters">setup parameters</a> of VDR, or maybe because it needs to
|
||||||
launch other programs that simply need a separate configuration file.
|
launch other programs that simply need a separate configuration file.
|
||||||
</modified>
|
|
||||||
<p>
|
<p>
|
||||||
<modified>
|
|
||||||
<i>cache files</i>, to store data so that future requests for that data can be served faster. The data
|
<i>cache files</i>, to store data so that future requests for that data can be served faster. The data
|
||||||
that is stored within a cache might be values that have been computed earlier or duplicates of
|
that is stored within a cache might be values that have been computed earlier or duplicates of
|
||||||
original values that are stored elsewhere.
|
original values that are stored elsewhere.
|
||||||
</modified>
|
|
||||||
<p>
|
<p>
|
||||||
<modified>
|
|
||||||
<i>resource files</i>, for providing additional files, like pictures, movie clips or channel logos.
|
<i>resource files</i>, for providing additional files, like pictures, movie clips or channel logos.
|
||||||
</modified>
|
|
||||||
<p>
|
<p>
|
||||||
<modified>
|
Therefore VDR provides the functions
|
||||||
Threfore VDR provides the functions
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
<modified>
|
|
||||||
const char *ConfigDirectory(const char *PluginName = NULL);
|
const char *ConfigDirectory(const char *PluginName = NULL);
|
||||||
const char *CacheDirectory(const char *PluginName = NULL);
|
const char *CacheDirectory(const char *PluginName = NULL);
|
||||||
const char *ResourceDirectory(const char *PluginName = NULL);
|
const char *ResourceDirectory(const char *PluginName = NULL);
|
||||||
</modified>
|
|
||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
<modified>
|
|
||||||
each of which returns a string containing the directory that VDR uses for its own
|
each of which returns a string containing the directory that VDR uses for its own
|
||||||
files (defined through the options in the call to VDR), extended by
|
files (defined through the options in the call to VDR), extended by
|
||||||
</modified>
|
|
||||||
<tt>"/plugins"</tt>. So assuming the VDR configuration directory is <tt>/video</tt>
|
<tt>"/plugins"</tt>. So assuming the VDR configuration directory is <tt>/video</tt>
|
||||||
(the default if no <tt><b>-c</b></tt> or <tt><b>-v</b></tt> option is given),
|
(the default if no <tt><b>-c</b></tt> or <tt><b>-v</b></tt> option is given),
|
||||||
a call to <tt>ConfigDirectory()</tt> will return <tt>/video/plugins</tt>. The first
|
a call to <tt>ConfigDirectory()</tt> will return <tt>/video/plugins</tt>. The first
|
||||||
call to <tt>ConfigDirectory()</tt> will automatically make sure that the <tt>plugins</tt>
|
call to <tt>ConfigDirectory()</tt> will automatically make sure that the <tt>plugins</tt>
|
||||||
subdirectory will exist. If, for some reason, this cannot be achieved, <tt>NULL</tt>
|
subdirectory will exist. If, for some reason, this cannot be achieved, <tt>NULL</tt>
|
||||||
will be returned.
|
will be returned.
|
||||||
<modified>
|
The behavior of <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt> is similar.
|
||||||
The behavoir of <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt> is similar.
|
|
||||||
</modified>
|
|
||||||
<p>
|
<p>
|
||||||
The additional <tt>plugins</tt> directory is used to keep files from plugins apart
|
The additional <tt>plugins</tt> directory is used to keep files from plugins apart
|
||||||
from those of VDR itself, making sure there will be no name clashes. If a plugin
|
from those of VDR itself, making sure there will be no name clashes. If a plugin
|
||||||
<modified>
|
|
||||||
needs only one extra file, it is suggested that this file be named <tt>name.*</tt>,
|
needs only one extra file, it is suggested that this file be named <tt>name.*</tt>,
|
||||||
where <i>name</i> shall be the name of the plugin.
|
where <i>name</i> shall be the name of the plugin.
|
||||||
</modified>
|
|
||||||
<p>
|
<p>
|
||||||
If a plugin needs more than one such file, it is suggested that the plugin stores
|
If a plugin needs more than one such file, it is suggested that the plugin stores
|
||||||
these in a subdirectory of its own, named after the plugin. To easily get such a name
|
these in a subdirectory of its own, named after the plugin. To easily get such a name
|
||||||
<modified>
|
|
||||||
the functions can be given an additional string that will be appended to the returned
|
the functions can be given an additional string that will be appended to the returned
|
||||||
directory name, as in
|
directory name, as in
|
||||||
</modified>
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
const char *MyConfigDir = ConfigDirectory(Name());
|
const char *MyConfigDir = ConfigDirectory(Name());
|
||||||
@ -959,16 +946,12 @@ plugin's name. Again, VDR will make sure that the requested directory will exist
|
|||||||
(or return <tt>NULL</tt> in case of an error).
|
(or return <tt>NULL</tt> in case of an error).
|
||||||
<p>
|
<p>
|
||||||
<b>
|
<b>
|
||||||
<modified>
|
|
||||||
The returned strings are statically allocated and will be overwritten by subsequent calls!
|
The returned strings are statically allocated and will be overwritten by subsequent calls!
|
||||||
</modified>
|
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
<modified>
|
|
||||||
The <tt>ConfigDirectory()</tt>, <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt>
|
The <tt>ConfigDirectory()</tt>, <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt>
|
||||||
functions are static member functions of the <tt>cPlugin</tt> class. This allows them to be
|
functions are static member functions of the <tt>cPlugin</tt> class. This allows them to be
|
||||||
called even from outside any member function of the derived plugin class, by writing
|
called even from outside any member function of the derived plugin class, by writing
|
||||||
</modified>
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
const char *MyConfigDir = cPlugin::ConfigDirectory();
|
const char *MyConfigDir = cPlugin::ConfigDirectory();
|
||||||
@ -1178,6 +1161,60 @@ The returned string may consist of several lines, separated by the newline chara
|
|||||||
('<tt>\n</tt>'). Each of these lines will be preceded with the <tt>ReplyCode</tt>
|
('<tt>\n</tt>'). Each of these lines will be preceded with the <tt>ReplyCode</tt>
|
||||||
when presenting them to the caller, and the continuation character ('<tt>-</tt>')
|
when presenting them to the caller, and the continuation character ('<tt>-</tt>')
|
||||||
will be set for all but the last one.
|
will be set for all but the last one.
|
||||||
|
<p>
|
||||||
|
<b>The SVDRP functions are called from the separate "SVDRP server handler" thread.
|
||||||
|
Therefore the plugin needs to take care of proper <a href="#Locking">locking</a> if it accesses any
|
||||||
|
global data.</b>
|
||||||
|
|
||||||
|
<hr><h2><a name="Locking">Locking</a></h2>
|
||||||
|
|
||||||
|
<div class="blurb">U can't touch this</div><p>
|
||||||
|
|
||||||
|
When accessing global data structures, proper locking is absolutely necessary.
|
||||||
|
<p>
|
||||||
|
There are several macros that allow for easy locking and unlocking. They all
|
||||||
|
follow the naming convention <tt>LOCK_*_READ|WRITE</tt>, where <tt>'*'</tt> is the name
|
||||||
|
of the global data structure, which can be one of <tt>TIMERS</tt>, <tt>CHANNELS</tt>,
|
||||||
|
<tt>RECORDINGS</tt> or <tt>SCHEDULES</tt>. To implicitly avoid deadlocks in case you
|
||||||
|
need to lock more than one structure, always make sure you use these macros in
|
||||||
|
this sequence!
|
||||||
|
<p>
|
||||||
|
Using one of these macros sets a lock on the structure, creates a local pointer to the
|
||||||
|
respective structure and makes sure the lock is released at the end of the current
|
||||||
|
block:
|
||||||
|
|
||||||
|
<p><table><tr><td class="code"><pre>
|
||||||
|
if (some condition) {
|
||||||
|
LOCK_TIMERS_READ; // creates local const cTimers *Timers
|
||||||
|
for (const cTimer *Timer = Timers->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>
|
<hr><h2><a name="Loading plugins into VDR">Loading plugins into VDR</a></h2>
|
||||||
|
|
||||||
@ -1259,10 +1296,10 @@ If a plugin wants to get informed on various events in VDR, it can derive a clas
|
|||||||
|
|
||||||
class cMyStatusMonitor : public cStatus {
|
class cMyStatusMonitor : public cStatus {
|
||||||
protected:
|
protected:
|
||||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber<modified>, bool LiveView</modified>);
|
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
|
||||||
};
|
};
|
||||||
|
|
||||||
void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber<modified>, bool LiveView</modified>)
|
void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
|
||||||
{
|
{
|
||||||
if (ChannelNumber)
|
if (ChannelNumber)
|
||||||
dsyslog("channel switched to %d on DVB %d", ChannelNumber, Device->CardIndex());
|
dsyslog("channel switched to %d on DVB %d", ChannelNumber, Device->CardIndex());
|
||||||
@ -1520,8 +1557,9 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
cMyReceiver::cMyReceiver(int Pid)
|
cMyReceiver::cMyReceiver(int Pid)
|
||||||
:cReceiver(tChannelID(), -1, Pid)
|
:cReceiver(NULL, -1)
|
||||||
{
|
{
|
||||||
|
AddPid(Pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
cMyReceiver::~cMyReceiver()
|
cMyReceiver::~cMyReceiver()
|
||||||
@ -1548,7 +1586,7 @@ The above example sets up a receiver that wants to receive data from only one
|
|||||||
PID (for example the Teletext PID). In order to not interfere with other recording
|
PID (for example the Teletext PID). In order to not interfere with other recording
|
||||||
operations, it sets its priority to <tt>-1</tt> (any negative value will allow
|
operations, it sets its priority to <tt>-1</tt> (any negative value will allow
|
||||||
a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time
|
a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time
|
||||||
<modified>in favor of a timer recording or live viewing</modified>).
|
in favor of a timer recording or live viewing).
|
||||||
<p>
|
<p>
|
||||||
Once a <tt>cReceiver</tt> has been created, it needs to be <i>attached</i> to
|
Once a <tt>cReceiver</tt> has been created, it needs to be <i>attached</i> to
|
||||||
a <tt>cDevice</tt>:
|
a <tt>cDevice</tt>:
|
||||||
@ -1564,9 +1602,7 @@ the receiver is attached to the device that actually receives the current live
|
|||||||
video stream (this may be different from the primary device in case of <i>Transfer
|
video stream (this may be different from the primary device in case of <i>Transfer
|
||||||
Mode</i>).
|
Mode</i>).
|
||||||
<p>
|
<p>
|
||||||
<modified>
|
|
||||||
The <tt>cReceiver</tt> must be detached from its device before it is deleted.
|
The <tt>cReceiver</tt> must be detached from its device before it is deleted.
|
||||||
</modified>
|
|
||||||
|
|
||||||
<hr><h2><a name="Filters">Filters</a></h2>
|
<hr><h2><a name="Filters">Filters</a></h2>
|
||||||
|
|
||||||
@ -1695,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.
|
function, or any of the skin classes a plugin might implement.
|
||||||
<p>
|
<p>
|
||||||
If a plugin runs a separate thread and wants to issue a message directly from
|
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>
|
<p><table><tr><td class="code"><pre>
|
||||||
int cSkins::QueueMessage(eMessageType Type, const char *s, int Seconds = 0, int Timeout = 0);
|
int cSkins::QueueMessage(eMessageType Type, const char *s, int Seconds = 0, int Timeout = 0);
|
||||||
@ -1844,7 +1880,7 @@ If the new device can receive, it most likely needs to provide a way of
|
|||||||
selecting which channel it shall tune to:
|
selecting which channel it shall tune to:
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
<modified>virtual int NumProvidedSystems(void) const;</modified>
|
virtual int NumProvidedSystems(void) const;
|
||||||
virtual bool ProvidesSource(int Source) const;
|
virtual bool ProvidesSource(int Source) const;
|
||||||
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
||||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const;
|
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const;
|
||||||
@ -1893,9 +1929,9 @@ virtual bool HasDecoder(void) const;
|
|||||||
virtual bool CanReplay(void) const;
|
virtual bool CanReplay(void) const;
|
||||||
virtual bool SetPlayMode(ePlayMode PlayMode);
|
virtual bool SetPlayMode(ePlayMode PlayMode);
|
||||||
virtual int64_t GetSTC(void);
|
virtual int64_t GetSTC(void);
|
||||||
<modified>virtual bool IsPlayingVideo(void) const;</modified>
|
virtual bool IsPlayingVideo(void) const;
|
||||||
virtual bool HasIBPTrickSpeed(void);
|
virtual bool HasIBPTrickSpeed(void);
|
||||||
virtual void TrickSpeed(int Speed);
|
virtual void TrickSpeed(int Speed, bool Forward);
|
||||||
virtual void Clear(void);
|
virtual void Clear(void);
|
||||||
virtual void Play(void);
|
virtual void Play(void);
|
||||||
virtual void Freeze(void);
|
virtual void Freeze(void);
|
||||||
@ -1922,7 +1958,7 @@ the functions
|
|||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
|
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
|
||||||
<modified>virtual int ReadFilter(int Handle, void *Buffer, size_t Length);</modified>
|
virtual int ReadFilter(int Handle, void *Buffer, size_t Length);
|
||||||
virtual void CloseFilter(int Handle);
|
virtual void CloseFilter(int Handle);
|
||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
@ -1978,7 +2014,6 @@ user - whether this goes through OSD facilities of the physical device (like
|
|||||||
a "full featured" DVB card) or through a graphics adapter that overlays its
|
a "full featured" DVB card) or through a graphics adapter that overlays its
|
||||||
output with the video signal, doesn't matter.
|
output with the video signal, doesn't matter.
|
||||||
<p>
|
<p>
|
||||||
<div class="modified">
|
|
||||||
In order to be able to determine the proper size of the OSD, the device
|
In order to be able to determine the proper size of the OSD, the device
|
||||||
should implement the function
|
should implement the function
|
||||||
|
|
||||||
@ -1987,7 +2022,6 @@ virtual void GetOsdSize(int &Width, int &Height, double &Aspect);
|
|||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
By default, an OSD size of 720x480 with an aspect ratio of 1.0 is assumed.
|
By default, an OSD size of 720x480 with an aspect ratio of 1.0 is assumed.
|
||||||
</div modified>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<b>Initializing new devices</b>
|
<b>Initializing new devices</b>
|
||||||
@ -2008,21 +2042,21 @@ Nothing needs to be done to shut down the devices. VDR will automatically
|
|||||||
shut down (delete) all devices when the program terminates. It is therefore
|
shut down (delete) all devices when the program terminates. It is therefore
|
||||||
important that the devices are created on the heap, using the <tt>new</tt>
|
important that the devices are created on the heap, using the <tt>new</tt>
|
||||||
operator!
|
operator!
|
||||||
|
|
||||||
<div class="modified">
|
|
||||||
<p>
|
<p>
|
||||||
<b>Device hooks</b>
|
<b>Device hooks</b>
|
||||||
<p>
|
<p>
|
||||||
VDR has builtin facilities that select which device is able to provide a given
|
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
|
transponder, or, which device may provide EIT data. However, there may be
|
||||||
that it requires considerations that exceed the scope of the core VDR code.
|
situations where the setup is so special that it requires considerations that
|
||||||
This is where <i>device hooks</i> can be used.
|
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>
|
<p><table><tr><td class="code"><pre>
|
||||||
class cMyDeviceHook : public cDeviceHook {
|
class cMyDeviceHook : public cDeviceHook {
|
||||||
public:
|
public:
|
||||||
cMyDeviceHook(void);
|
cMyDeviceHook(void);
|
||||||
virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const;
|
virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const;
|
||||||
|
virtual bool DeviceProvidesEIT(const cDevice *Device) const;
|
||||||
};
|
};
|
||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
@ -2039,6 +2073,19 @@ bool cMyDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChan
|
|||||||
}
|
}
|
||||||
</pre></td></tr></table><p>
|
</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>
|
A plugin that creates a derived cDeviceHook shall do so in its <tt>Initialize()</tt>
|
||||||
function, as in
|
function, as in
|
||||||
|
|
||||||
@ -2047,7 +2094,56 @@ new cMyDeviceHook;
|
|||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
and shall not delete this object. It will be automatically deleted when the program ends.
|
and shall not delete this object. It will be automatically deleted when the program ends.
|
||||||
</div modified>
|
<p>
|
||||||
|
<b>Power management</b>
|
||||||
|
<p>
|
||||||
|
A device that can be put into a power save mode can implement the function
|
||||||
|
|
||||||
|
<p><table><tr><td class="code"><pre>
|
||||||
|
virtual void SetPowerSaveMode(bool On);
|
||||||
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
|
If On is true, power save mode shall be activated, if it is false,
|
||||||
|
normal operating mode shall be restored.
|
||||||
|
|
||||||
|
<hr><h2><a name="Positioners">Positioners</a></h2>
|
||||||
|
|
||||||
|
<div class="blurb">Now you see me - now you don't!</div><p>
|
||||||
|
|
||||||
|
If you are using a positioner (also known as "motor" or "rotor") to move your
|
||||||
|
satellite dish to receive various satellites, you will be using the 'P' command
|
||||||
|
in the <tt>diseqc.conf</tt> file. This command sends the necessary data to the
|
||||||
|
positioner to move the dish to the satellite's orbital position. By default VDR
|
||||||
|
uses its builtin DiSEqC positioner control. If your positioner requires a different
|
||||||
|
method of controlling (like maybe via a serial link), you can derive a class
|
||||||
|
from <tt>cPositioner</tt>, as in
|
||||||
|
|
||||||
|
<p><table><tr><td class="code"><pre>
|
||||||
|
#include <vdr/positioner.h>
|
||||||
|
|
||||||
|
class cMyPositioner : public cPositioner {
|
||||||
|
public:
|
||||||
|
cMyPositioner(void);
|
||||||
|
virtual void Drive(ePositionerDirection Direction);
|
||||||
|
virtual void Step(ePositionerDirection Direction, uint Steps = 1);
|
||||||
|
virtual void Halt(void);
|
||||||
|
virtual void SetLimit(ePositionerDirection Direction);
|
||||||
|
virtual void DisableLimits(void);
|
||||||
|
virtual void EnableLimits(void);
|
||||||
|
virtual void StorePosition(uint Number);
|
||||||
|
virtual void RecalcPositions(uint Number);
|
||||||
|
virtual void GotoPosition(uint Number, int Longitude);
|
||||||
|
virtual void GotoAngle(int Longitude);
|
||||||
|
};
|
||||||
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
|
See the implementation of <tt>cDiseqcPositioner</tt> in <tt>diseqc.c</tt> for details.
|
||||||
|
<p>
|
||||||
|
You should create your derived positioner object in the
|
||||||
|
<a href="#Getting started"><tt>Start()</tt></a> function of your plugin.
|
||||||
|
Note that the object has to be created on the heap (using <tt>new</tt>),
|
||||||
|
and you shall not delete it at any point (it will be deleted automatically
|
||||||
|
when the program ends).
|
||||||
|
|
||||||
<hr><h2><a name="Audio">Audio</a></h2>
|
<hr><h2><a name="Audio">Audio</a></h2>
|
||||||
|
|
||||||
@ -2212,6 +2308,11 @@ Put(uint64 Code, bool Repeat = false, bool Release = false);
|
|||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
The other parameters have the same meaning as in the first version of this function.
|
The other parameters have the same meaning as in the first version of this function.
|
||||||
|
<p>
|
||||||
|
If your remote control has a repeat function that automatically repeats key events
|
||||||
|
if a key is held pressed down for a while, your derived class should use the global
|
||||||
|
parameters <tt>Setup.RcRepeatDelay</tt> and <tt>Setup.RcRepeatDelta</tt> to allow
|
||||||
|
users to configure the behavior of this function.
|
||||||
|
|
||||||
<hr><h2><a name="Conditional Access">Conditional Access</a></h2>
|
<hr><h2><a name="Conditional Access">Conditional Access</a></h2>
|
||||||
|
|
||||||
@ -2248,7 +2349,6 @@ virtual bool Assign(cDevice *Device, bool Query = false);
|
|||||||
|
|
||||||
See the description of this function in <tt>ci.h</tt> for details.
|
See the description of this function in <tt>ci.h</tt> for details.
|
||||||
|
|
||||||
<div class="modified">
|
|
||||||
<hr><h2><a name="Electronic Program Guide">Electronic Program Guide</a></h2>
|
<hr><h2><a name="Electronic Program Guide">Electronic Program Guide</a></h2>
|
||||||
|
|
||||||
<div class="blurb">The grass is always greener on the other side...</div><p>
|
<div class="blurb">The grass is always greener on the other side...</div><p>
|
||||||
@ -2278,7 +2378,40 @@ where <tt>DescriptionFromDatabase()</tt> would derive the description of the
|
|||||||
to signal VDR that no other EPG handlers shall be queried after this one.
|
to signal VDR that no other EPG handlers shall be queried after this one.
|
||||||
<p>
|
<p>
|
||||||
See <tt>VDR/epg.h</tt> for details.
|
See <tt>VDR/epg.h</tt> for details.
|
||||||
</div modified>
|
|
||||||
|
<hr><h2><a name="The video directory">The video directory</a></h2>
|
||||||
|
|
||||||
|
<div class="blurb">Bits and pieces...</div><p>
|
||||||
|
|
||||||
|
By default VDR assumes that the video directory consists of one large
|
||||||
|
volume, on which it can store its recordings. If you want to distribute your
|
||||||
|
recordings over several physical drives, you can derive from <tt>cVideoDirectory</tt>,
|
||||||
|
as in
|
||||||
|
|
||||||
|
<p><table><tr><td class="code"><pre>
|
||||||
|
#include <vdr/videodir.h>
|
||||||
|
|
||||||
|
class cMyVideoDirectory : public cVideoDirectory {
|
||||||
|
public:
|
||||||
|
cMyVideoDirectory(void);
|
||||||
|
virtual ~cMyVideoDirectory();
|
||||||
|
virtual int FreeMB(int *UsedMB = NULL);
|
||||||
|
virtual bool Register(const char *FileName);
|
||||||
|
virtual bool Rename(const char *OldName, const char *NewName);
|
||||||
|
virtual bool Move(const char *FromName, const char *ToName);
|
||||||
|
virtual bool Remove(const char *Name);
|
||||||
|
virtual void Cleanup(const char *IgnoreFiles[] = NULL);
|
||||||
|
virtual bool Contains(const char *Name);
|
||||||
|
};
|
||||||
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
|
See the description in <tt>videodir.h</tt> for details.
|
||||||
|
<p>
|
||||||
|
You should create your derived video directory object in the
|
||||||
|
<a href="#Getting started"><tt>Start()</tt></a> function of your plugin.
|
||||||
|
Note that the object has to be created on the heap (using <tt>new</tt>),
|
||||||
|
and you shall not delete it at any point (it will be deleted automatically
|
||||||
|
when the program ends).
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
@ -1,35 +0,0 @@
|
|||||||
VDR Plugin 'dvbsddevice' Revision History
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
2009-12-28: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2010-01-04: Version 0.0.2
|
|
||||||
|
|
||||||
- Calling the MakePrimaryDevice() function of the base class to allow
|
|
||||||
the cDevice to stop displaying subtitles.
|
|
||||||
- Added support for DVB cards with multiple fontends.
|
|
||||||
|
|
||||||
2010-01-30: Version 0.0.3
|
|
||||||
|
|
||||||
- The PCR pid is now recorded for channels where this is different from the
|
|
||||||
video PID.
|
|
||||||
|
|
||||||
2011-04-17: Version 0.0.4
|
|
||||||
|
|
||||||
- Removed an obsolete local variable in dvbsdffosd.c (thanks to Paul Menzel).
|
|
||||||
|
|
||||||
2011-08-27: Version 0.0.5
|
|
||||||
|
|
||||||
- Added option --outputonly to use the device only for output (thanks to Udo Richter).
|
|
||||||
|
|
||||||
2012-03-07: Version 0.0.6
|
|
||||||
|
|
||||||
- Removed the call to EITScanner.UsesDevice(this) from dvbsddevice.c, because
|
|
||||||
the code following these calls is only executed if LiveView is true, which is
|
|
||||||
never the case when the EITScanner switches to a channel.
|
|
||||||
|
|
||||||
2012-12-27: Version 0.0.7
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
@ -1,94 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 1.18 2012/12/29 10:28:45 kls Exp $
|
|
||||||
|
|
||||||
# The official name of this plugin.
|
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
|
||||||
# By default the main source file also carries this name.
|
|
||||||
|
|
||||||
PLUGIN = dvbsddevice
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### The version number of VDR's plugin API:
|
|
||||||
|
|
||||||
APIVERSION = $(call PKGCFG,apiversion)
|
|
||||||
|
|
||||||
### Allow user defined options to overwrite defaults:
|
|
||||||
|
|
||||||
-include $(PLGCFG)
|
|
||||||
|
|
||||||
### The name of the distribution archive:
|
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
|
||||||
|
|
||||||
INCLUDES +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o dvbsdffdevice.o dvbsdffosd.o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE)
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Targets:
|
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,20 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: http://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: ftp://ftp.tvdr.de/vdr
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
See the file COPYING for more information.
|
|
||||||
|
|
||||||
Description:
|
|
||||||
|
|
||||||
The 'dvbsddevice' plugin implements the output device for the
|
|
||||||
"Full Featured" DVB cards based on the TechnoTrend/Fujitsu-Siemens
|
|
||||||
design. This code was originally part of the core VDR source, and
|
|
||||||
was moved into this plugin in VDR version 1.7.11.
|
|
@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* dvbsddevice.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: dvbsddevice.c 1.7 2012/12/27 10:32:23 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
#include "dvbsdffdevice.h"
|
|
||||||
|
|
||||||
static const char *VERSION = "0.0.7";
|
|
||||||
static const char *DESCRIPTION = "SD Full Featured DVB device";
|
|
||||||
|
|
||||||
class cPluginDvbsddevice : public cPlugin {
|
|
||||||
private:
|
|
||||||
cDvbSdFfDeviceProbe *probe;
|
|
||||||
public:
|
|
||||||
cPluginDvbsddevice(void);
|
|
||||||
virtual ~cPluginDvbsddevice();
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual const char *CommandLineHelp(void);
|
|
||||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
|
||||||
};
|
|
||||||
|
|
||||||
cPluginDvbsddevice::cPluginDvbsddevice(void)
|
|
||||||
{
|
|
||||||
probe = new cDvbSdFfDeviceProbe;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPluginDvbsddevice::~cPluginDvbsddevice()
|
|
||||||
{
|
|
||||||
delete probe;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cPluginDvbsddevice::CommandLineHelp(void)
|
|
||||||
{
|
|
||||||
return " -o --outputonly do not receive, just use as output device\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginDvbsddevice::ProcessArgs(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
static struct option long_options[] = {
|
|
||||||
{ "outputonly", no_argument, NULL, 'o' },
|
|
||||||
{ NULL, no_argument, NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
int c;
|
|
||||||
while ((c = getopt_long(argc, argv, "", long_options, NULL)) != -1) {
|
|
||||||
switch (c) {
|
|
||||||
case 'o': probe->SetOutputOnly(true);
|
|
||||||
break;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginDvbsddevice); // Don't touch this!
|
|
@ -1,792 +0,0 @@
|
|||||||
/*
|
|
||||||
* dvbsdffdevice.h: The DVB SD Full Featured device interface
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: dvbsdffdevice.c 2.33 2012/03/11 13:32:42 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "dvbsdffdevice.h"
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <linux/videodev2.h>
|
|
||||||
#include <linux/dvb/audio.h>
|
|
||||||
#include <linux/dvb/dmx.h>
|
|
||||||
#include <linux/dvb/video.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <vdr/eitscan.h>
|
|
||||||
#include <vdr/transfer.h>
|
|
||||||
#include "dvbsdffosd.h"
|
|
||||||
|
|
||||||
// --- cDvbSdFfDevice --------------------------------------------------------
|
|
||||||
|
|
||||||
int cDvbSdFfDevice::devVideoOffset = -1;
|
|
||||||
|
|
||||||
cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly)
|
|
||||||
:cDvbDevice(Adapter, Frontend)
|
|
||||||
{
|
|
||||||
spuDecoder = NULL;
|
|
||||||
digitalAudio = false;
|
|
||||||
playMode = pmNone;
|
|
||||||
outputOnly = OutputOnly;
|
|
||||||
|
|
||||||
// Devices that are only present on cards with decoders:
|
|
||||||
|
|
||||||
fd_osd = DvbOpen(DEV_DVB_OSD, adapter, frontend, O_RDWR);
|
|
||||||
fd_video = DvbOpen(DEV_DVB_VIDEO, adapter, frontend, O_RDWR | O_NONBLOCK);
|
|
||||||
fd_audio = DvbOpen(DEV_DVB_AUDIO, adapter, frontend, O_RDWR | O_NONBLOCK);
|
|
||||||
fd_stc = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR);
|
|
||||||
|
|
||||||
// The offset of the /dev/video devices:
|
|
||||||
|
|
||||||
if (devVideoOffset < 0) { // the first one checks this
|
|
||||||
FILE *f = NULL;
|
|
||||||
char buffer[PATH_MAX];
|
|
||||||
for (int ofs = 0; ofs < 100; ofs++) {
|
|
||||||
snprintf(buffer, sizeof(buffer), "/proc/video/dev/video%d", ofs);
|
|
||||||
if ((f = fopen(buffer, "r")) != NULL) {
|
|
||||||
if (fgets(buffer, sizeof(buffer), f)) {
|
|
||||||
if (strstr(buffer, "DVB Board")) { // found the _first_ DVB card
|
|
||||||
devVideoOffset = ofs;
|
|
||||||
dsyslog("video device offset is %d", devVideoOffset);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (devVideoOffset < 0)
|
|
||||||
devVideoOffset = 0;
|
|
||||||
if (f)
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
devVideoIndex = devVideoOffset >= 0 ? devVideoOffset++ : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cDvbSdFfDevice::~cDvbSdFfDevice()
|
|
||||||
{
|
|
||||||
delete spuDecoder;
|
|
||||||
// We're not explicitly closing any device files here, since this sometimes
|
|
||||||
// caused segfaults. Besides, the program is about to terminate anyway...
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::MakePrimaryDevice(bool On)
|
|
||||||
{
|
|
||||||
if (On)
|
|
||||||
new cDvbOsdProvider(fd_osd);
|
|
||||||
cDvbDevice::MakePrimaryDevice(On);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::HasDecoder(void) const
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::AvoidRecording(void) const
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
cSpuDecoder *cDvbSdFfDevice::GetSpuDecoder(void)
|
|
||||||
{
|
|
||||||
if (!spuDecoder && IsPrimaryDevice())
|
|
||||||
spuDecoder = new cDvbSpuDecoder();
|
|
||||||
return spuDecoder;
|
|
||||||
}
|
|
||||||
|
|
||||||
uchar *cDvbSdFfDevice::GrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY)
|
|
||||||
{
|
|
||||||
if (devVideoIndex < 0)
|
|
||||||
return NULL;
|
|
||||||
char buffer[PATH_MAX];
|
|
||||||
snprintf(buffer, sizeof(buffer), "%s%d", DEV_VIDEO, devVideoIndex);
|
|
||||||
int videoDev = open(buffer, O_RDWR);
|
|
||||||
if (videoDev >= 0) {
|
|
||||||
uchar *result = NULL;
|
|
||||||
// set up the size and RGB
|
|
||||||
v4l2_format fmt;
|
|
||||||
memset(&fmt, 0, sizeof(fmt));
|
|
||||||
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
||||||
fmt.fmt.pix.width = SizeX;
|
|
||||||
fmt.fmt.pix.height = SizeY;
|
|
||||||
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
|
|
||||||
fmt.fmt.pix.field = V4L2_FIELD_ANY;
|
|
||||||
if (ioctl(videoDev, VIDIOC_S_FMT, &fmt) == 0) {
|
|
||||||
v4l2_requestbuffers reqBuf;
|
|
||||||
memset(&reqBuf, 0, sizeof(reqBuf));
|
|
||||||
reqBuf.count = 2;
|
|
||||||
reqBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
||||||
reqBuf.memory = V4L2_MEMORY_MMAP;
|
|
||||||
if (ioctl(videoDev, VIDIOC_REQBUFS, &reqBuf) >= 0) {
|
|
||||||
v4l2_buffer mbuf;
|
|
||||||
memset(&mbuf, 0, sizeof(mbuf));
|
|
||||||
mbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
||||||
mbuf.memory = V4L2_MEMORY_MMAP;
|
|
||||||
if (ioctl(videoDev, VIDIOC_QUERYBUF, &mbuf) == 0) {
|
|
||||||
int msize = mbuf.length;
|
|
||||||
unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0);
|
|
||||||
if (mem && mem != (unsigned char *)-1) {
|
|
||||||
v4l2_buffer buf;
|
|
||||||
memset(&buf, 0, sizeof(buf));
|
|
||||||
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
||||||
buf.memory = V4L2_MEMORY_MMAP;
|
|
||||||
buf.index = 0;
|
|
||||||
if (ioctl(videoDev, VIDIOC_QBUF, &buf) == 0) {
|
|
||||||
v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
||||||
if (ioctl (videoDev, VIDIOC_STREAMON, &type) == 0) {
|
|
||||||
memset(&buf, 0, sizeof(buf));
|
|
||||||
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
||||||
buf.memory = V4L2_MEMORY_MMAP;
|
|
||||||
buf.index = 0;
|
|
||||||
if (ioctl(videoDev, VIDIOC_DQBUF, &buf) == 0) {
|
|
||||||
if (ioctl(videoDev, VIDIOC_STREAMOFF, &type) == 0) {
|
|
||||||
// make RGB out of BGR:
|
|
||||||
int memsize = fmt.fmt.pix.width * fmt.fmt.pix.height;
|
|
||||||
unsigned char *mem1 = mem;
|
|
||||||
for (int i = 0; i < memsize; i++) {
|
|
||||||
unsigned char tmp = mem1[2];
|
|
||||||
mem1[2] = mem1[0];
|
|
||||||
mem1[0] = tmp;
|
|
||||||
mem1 += 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Quality < 0)
|
|
||||||
Quality = 100;
|
|
||||||
|
|
||||||
dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, fmt.fmt.pix.width, fmt.fmt.pix.height);
|
|
||||||
if (Jpeg) {
|
|
||||||
// convert to JPEG:
|
|
||||||
result = RgbToJpeg(mem, fmt.fmt.pix.width, fmt.fmt.pix.height, Size, Quality);
|
|
||||||
if (!result)
|
|
||||||
esyslog("ERROR: failed to convert image to JPEG");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// convert to PNM:
|
|
||||||
char buf[32];
|
|
||||||
snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", fmt.fmt.pix.width, fmt.fmt.pix.height);
|
|
||||||
int l = strlen(buf);
|
|
||||||
int bytes = memsize * 3;
|
|
||||||
Size = l + bytes;
|
|
||||||
result = MALLOC(uchar, Size);
|
|
||||||
if (result) {
|
|
||||||
memcpy(result, buf, l);
|
|
||||||
memcpy(result + l, mem, bytes);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: failed to convert image to PNM");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: video device VIDIOC_STREAMOFF failed");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: video device VIDIOC_DQBUF failed");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: video device VIDIOC_STREAMON failed");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: video device VIDIOC_QBUF failed");
|
|
||||||
munmap(mem, msize);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: failed to memmap video device");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: video device VIDIOC_QUERYBUF failed");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: video device VIDIOC_REQBUFS failed");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
esyslog("ERROR: video device VIDIOC_S_FMT failed");
|
|
||||||
close(videoDev);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LOG_ERROR_STR(buffer);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
|
|
||||||
{
|
|
||||||
cDevice::SetVideoDisplayFormat(VideoDisplayFormat);
|
|
||||||
if (Setup.VideoFormat) {
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
switch (VideoDisplayFormat) {
|
|
||||||
case vdfPanAndScan:
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_PAN_SCAN));
|
|
||||||
break;
|
|
||||||
case vdfLetterBox:
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_LETTER_BOX));
|
|
||||||
break;
|
|
||||||
case vdfCenterCutOut:
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_DISPLAY_FORMAT, VIDEO_CENTER_CUT_OUT));
|
|
||||||
break;
|
|
||||||
default: esyslog("ERROR: unknown video display format %d", VideoDisplayFormat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::SetVideoFormat(bool VideoFormat16_9)
|
|
||||||
{
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
|
|
||||||
SetVideoDisplayFormat(eVideoDisplayFormat(Setup.VideoDisplayFormat));
|
|
||||||
}
|
|
||||||
|
|
||||||
eVideoSystem cDvbSdFfDevice::GetVideoSystem(void)
|
|
||||||
{
|
|
||||||
eVideoSystem VideoSystem = vsPAL;
|
|
||||||
if (fd_video >= 0) {
|
|
||||||
video_size_t vs;
|
|
||||||
if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
|
|
||||||
if (vs.h == 480 || vs.h == 240)
|
|
||||||
VideoSystem = vsNTSC;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LOG_ERROR;
|
|
||||||
}
|
|
||||||
return VideoSystem;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::GetVideoSize(int &Width, int &Height, double &VideoAspect)
|
|
||||||
{
|
|
||||||
if (fd_video >= 0) {
|
|
||||||
video_size_t vs;
|
|
||||||
if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
|
|
||||||
Width = vs.w;
|
|
||||||
Height = vs.h;
|
|
||||||
switch (vs.aspect_ratio) {
|
|
||||||
default:
|
|
||||||
case VIDEO_FORMAT_4_3: VideoAspect = 4.0 / 3.0; break;
|
|
||||||
case VIDEO_FORMAT_16_9: VideoAspect = 16.0 / 9.0; break;
|
|
||||||
case VIDEO_FORMAT_221_1: VideoAspect = 2.21; break;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LOG_ERROR;
|
|
||||||
}
|
|
||||||
cDevice::GetVideoSize(Width, Height, VideoAspect);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect)
|
|
||||||
{
|
|
||||||
if (fd_video >= 0) {
|
|
||||||
video_size_t vs;
|
|
||||||
if (ioctl(fd_video, VIDEO_GET_SIZE, &vs) == 0) {
|
|
||||||
Width = 720;
|
|
||||||
if (vs.h != 480 && vs.h != 240)
|
|
||||||
Height = 576; // PAL
|
|
||||||
else
|
|
||||||
Height = 480; // NTSC
|
|
||||||
switch (Setup.VideoFormat ? vs.aspect_ratio : VIDEO_FORMAT_4_3) {
|
|
||||||
default:
|
|
||||||
case VIDEO_FORMAT_4_3: PixelAspect = 4.0 / 3.0; break;
|
|
||||||
case VIDEO_FORMAT_221_1: // FF DVB cards only distinguish between 4:3 and 16:9
|
|
||||||
case VIDEO_FORMAT_16_9: PixelAspect = 16.0 / 9.0; break;
|
|
||||||
}
|
|
||||||
PixelAspect /= double(Width) / Height;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LOG_ERROR;
|
|
||||||
}
|
|
||||||
cDevice::GetOsdSize(Width, Height, PixelAspect);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::SetAudioBypass(bool On)
|
|
||||||
{
|
|
||||||
if (setTransferModeForDolbyDigital != 1)
|
|
||||||
return false;
|
|
||||||
return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ptAudio ptVideo ptPcr ptTeletext ptDolby ptOther
|
|
||||||
static dmx_pes_type_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_PCR, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::SetPid(cPidHandle *Handle, int Type, bool On)
|
|
||||||
{
|
|
||||||
if (Handle->pid) {
|
|
||||||
dmx_pes_filter_params pesFilterParams;
|
|
||||||
memset(&pesFilterParams, 0, sizeof(pesFilterParams));
|
|
||||||
if (On) {
|
|
||||||
if (Handle->handle < 0) {
|
|
||||||
Handle->handle = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR | O_NONBLOCK, true);
|
|
||||||
if (Handle->handle < 0) {
|
|
||||||
LOG_ERROR;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pesFilterParams.pid = Handle->pid;
|
|
||||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
|
||||||
pesFilterParams.output = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP;
|
|
||||||
pesFilterParams.pes_type= PesTypes[Type < ptOther ? Type : ptOther];
|
|
||||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
|
||||||
if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
|
|
||||||
LOG_ERROR;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!Handle->used) {
|
|
||||||
CHECK(ioctl(Handle->handle, DMX_STOP));
|
|
||||||
if (Type <= ptTeletext) {
|
|
||||||
pesFilterParams.pid = 0x1FFF;
|
|
||||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
|
||||||
pesFilterParams.output = DMX_OUT_DECODER;
|
|
||||||
pesFilterParams.pes_type= PesTypes[Type];
|
|
||||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
|
||||||
CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams));
|
|
||||||
if (PesTypes[Type] == DMX_PES_VIDEO) // let's only do this once
|
|
||||||
SetPlayMode(pmNone); // necessary to switch a PID from DMX_PES_VIDEO/AUDIO to DMX_PES_OTHER
|
|
||||||
}
|
|
||||||
close(Handle->handle);
|
|
||||||
Handle->handle = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::ProvidesSource(int Source) const
|
|
||||||
{
|
|
||||||
if (outputOnly)
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return cDvbDevice::ProvidesSource(Source);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::TurnOffLiveMode(bool LiveView)
|
|
||||||
{
|
|
||||||
if (LiveView) {
|
|
||||||
// Avoid noise while switching:
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Turn off live PIDs:
|
|
||||||
|
|
||||||
DetachAll(pidHandles[ptAudio].pid);
|
|
||||||
DetachAll(pidHandles[ptVideo].pid);
|
|
||||||
DetachAll(pidHandles[ptPcr].pid);
|
|
||||||
DetachAll(pidHandles[ptTeletext].pid);
|
|
||||||
DelPid(pidHandles[ptAudio].pid);
|
|
||||||
DelPid(pidHandles[ptVideo].pid);
|
|
||||||
DelPid(pidHandles[ptPcr].pid, ptPcr);
|
|
||||||
DelPid(pidHandles[ptTeletext].pid);
|
|
||||||
DelPid(pidHandles[ptDolby].pid);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
|
||||||
{
|
|
||||||
int apid = Channel->Apid(0);
|
|
||||||
int vpid = Channel->Vpid();
|
|
||||||
int dpid = Channel->Dpid(0);
|
|
||||||
|
|
||||||
bool DoTune = !IsTunedToTransponder(Channel);
|
|
||||||
|
|
||||||
bool pidHandlesVideo = pidHandles[ptVideo].pid == vpid;
|
|
||||||
bool pidHandlesAudio = pidHandles[ptAudio].pid == apid;
|
|
||||||
|
|
||||||
bool TurnOffLivePIDs = DoTune
|
|
||||||
|| !IsPrimaryDevice()
|
|
||||||
|| LiveView // for a new live view the old PIDs need to be turned off
|
|
||||||
|| pidHandlesVideo // for recording the PIDs must be shifted from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
|
|
||||||
;
|
|
||||||
|
|
||||||
bool StartTransferMode = IsPrimaryDevice() && !DoTune
|
|
||||||
&& (LiveView && HasPid(vpid ? vpid : apid) && (!pidHandlesVideo || (!pidHandlesAudio && (dpid ? pidHandles[ptAudio].pid != dpid : true)))// the PID is already set as DMX_PES_OTHER
|
|
||||||
|| !LiveView && (pidHandlesVideo || pidHandlesAudio) // a recording is going to shift the PIDs from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
|
|
||||||
);
|
|
||||||
if (CamSlot() && !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlot()->SlotNumber()))
|
|
||||||
StartTransferMode |= LiveView && IsPrimaryDevice() && Channel->Ca() >= CA_ENCRYPTED_MIN;
|
|
||||||
|
|
||||||
bool TurnOnLivePIDs = !StartTransferMode && LiveView;
|
|
||||||
|
|
||||||
// Turn off live PIDs if necessary:
|
|
||||||
|
|
||||||
if (TurnOffLivePIDs)
|
|
||||||
TurnOffLiveMode(LiveView);
|
|
||||||
|
|
||||||
// Set the tuner:
|
|
||||||
|
|
||||||
if (!cDvbDevice::SetChannelDevice(Channel, LiveView))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// PID settings:
|
|
||||||
|
|
||||||
if (TurnOnLivePIDs) {
|
|
||||||
SetAudioBypass(false);
|
|
||||||
if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(vpid, ptVideo) && AddPid(apid, ptAudio))) {
|
|
||||||
esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (IsPrimaryDevice())
|
|
||||||
AddPid(Channel->Tpid(), ptTeletext);
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true)); // actually one would expect 'false' here, but according to Marco Schluessler <marco@lordzodiac.de> this works
|
|
||||||
// to avoid missing audio after replaying a DVD; with 'false' there is an audio disturbance when switching
|
|
||||||
// between two channels on the same transponder on DVB-S
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
|
|
||||||
}
|
|
||||||
else if (StartTransferMode)
|
|
||||||
cControl::Launch(new cTransferControl(this, Channel));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cDvbSdFfDevice::GetAudioChannelDevice(void)
|
|
||||||
{
|
|
||||||
audio_status_t as;
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_GET_STATUS, &as));
|
|
||||||
return as.channel_select;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::SetAudioChannelDevice(int AudioChannel)
|
|
||||||
{
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AudioChannel));
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::SetVolumeDevice(int Volume)
|
|
||||||
{
|
|
||||||
if (digitalAudio)
|
|
||||||
Volume = 0;
|
|
||||||
audio_mixer_t am;
|
|
||||||
// conversion for linear volume response:
|
|
||||||
am.volume_left = am.volume_right = 2 * Volume - Volume * Volume / 255;
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_MIXER, &am));
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::SetDigitalAudioDevice(bool On)
|
|
||||||
{
|
|
||||||
if (digitalAudio != On) {
|
|
||||||
if (digitalAudio)
|
|
||||||
cCondWait::SleepMs(1000); // Wait until any leftover digital data has been flushed
|
|
||||||
digitalAudio = On;
|
|
||||||
SetVolumeDevice(On || IsMute() ? 0 : CurrentVolume());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::SetAudioTrackDevice(eTrackType Type)
|
|
||||||
{
|
|
||||||
const tTrackId *TrackId = GetTrack(Type);
|
|
||||||
if (TrackId && TrackId->id) {
|
|
||||||
SetAudioBypass(false);
|
|
||||||
if (IS_AUDIO_TRACK(Type) || (IS_DOLBY_TRACK(Type) && SetAudioBypass(true))) {
|
|
||||||
if (pidHandles[ptAudio].pid && pidHandles[ptAudio].pid != TrackId->id) {
|
|
||||||
DetachAll(pidHandles[ptAudio].pid);
|
|
||||||
if (CamSlot())
|
|
||||||
CamSlot()->SetPid(pidHandles[ptAudio].pid, false);
|
|
||||||
pidHandles[ptAudio].pid = TrackId->id;
|
|
||||||
SetPid(&pidHandles[ptAudio], ptAudio, true);
|
|
||||||
if (CamSlot()) {
|
|
||||||
CamSlot()->SetPid(pidHandles[ptAudio].pid, true);
|
|
||||||
CamSlot()->StartDecrypting();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (IS_DOLBY_TRACK(Type)) {
|
|
||||||
if (setTransferModeForDolbyDigital == 0)
|
|
||||||
return;
|
|
||||||
// Currently this works only in Transfer Mode
|
|
||||||
ForceTransferMode();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::CanReplay(void) const
|
|
||||||
{
|
|
||||||
return cDevice::CanReplay();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::SetPlayMode(ePlayMode PlayMode)
|
|
||||||
{
|
|
||||||
if (PlayMode != pmExtern_THIS_SHOULD_BE_AVOIDED && fd_video < 0 && fd_audio < 0) {
|
|
||||||
// reopen the devices
|
|
||||||
fd_video = DvbOpen(DEV_DVB_VIDEO, adapter, frontend, O_RDWR | O_NONBLOCK);
|
|
||||||
fd_audio = DvbOpen(DEV_DVB_AUDIO, adapter, frontend, O_RDWR | O_NONBLOCK);
|
|
||||||
SetVideoFormat(Setup.VideoFormat);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (PlayMode) {
|
|
||||||
case pmNone:
|
|
||||||
// special handling to return from PCM replay:
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_PLAY));
|
|
||||||
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_STOP, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_STOP, true));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
|
|
||||||
break;
|
|
||||||
case pmAudioVideo:
|
|
||||||
case pmAudioOnlyBlack:
|
|
||||||
if (playMode == pmNone)
|
|
||||||
TurnOffLiveMode(true);
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_PLAY));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_PLAY));
|
|
||||||
break;
|
|
||||||
case pmAudioOnly:
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_STOP, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_PLAY));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
|
|
||||||
break;
|
|
||||||
case pmVideoOnly:
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_STOP, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_PLAY));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_PLAY));
|
|
||||||
break;
|
|
||||||
case pmExtern_THIS_SHOULD_BE_AVOIDED:
|
|
||||||
close(fd_video);
|
|
||||||
close(fd_audio);
|
|
||||||
fd_video = fd_audio = -1;
|
|
||||||
break;
|
|
||||||
default: esyslog("ERROR: unknown playmode %d", PlayMode);
|
|
||||||
}
|
|
||||||
playMode = PlayMode;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t cDvbSdFfDevice::GetSTC(void)
|
|
||||||
{
|
|
||||||
if (fd_stc >= 0) {
|
|
||||||
struct dmx_stc stc;
|
|
||||||
stc.num = 0;
|
|
||||||
if (ioctl(fd_stc, DMX_GET_STC, &stc) == -1) {
|
|
||||||
esyslog("ERROR: stc %d: %m", CardIndex() + 1);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return stc.stc / stc.base;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::TrickSpeed(int Speed)
|
|
||||||
{
|
|
||||||
if (fd_video >= 0)
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_SLOWMOTION, Speed));
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::Clear(void)
|
|
||||||
{
|
|
||||||
if (fd_video >= 0)
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
|
|
||||||
if (fd_audio >= 0)
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
|
|
||||||
cDevice::Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::Play(void)
|
|
||||||
{
|
|
||||||
if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) {
|
|
||||||
if (fd_audio >= 0)
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (fd_audio >= 0) {
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_CONTINUE));
|
|
||||||
}
|
|
||||||
if (fd_video >= 0)
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_CONTINUE));
|
|
||||||
}
|
|
||||||
cDevice::Play();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::Freeze(void)
|
|
||||||
{
|
|
||||||
if (playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) {
|
|
||||||
if (fd_audio >= 0)
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_PAUSE));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (fd_audio >= 0) {
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_PAUSE));
|
|
||||||
}
|
|
||||||
if (fd_video >= 0)
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_FREEZE));
|
|
||||||
}
|
|
||||||
cDevice::Freeze();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::Mute(void)
|
|
||||||
{
|
|
||||||
if (fd_audio >= 0) {
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
|
|
||||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
|
|
||||||
}
|
|
||||||
cDevice::Mute();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfDevice::StillPicture(const uchar *Data, int Length)
|
|
||||||
{
|
|
||||||
if (!Data || Length < TS_SIZE)
|
|
||||||
return;
|
|
||||||
if (Data[0] == 0x47) {
|
|
||||||
// TS data
|
|
||||||
cDevice::StillPicture(Data, Length);
|
|
||||||
}
|
|
||||||
else if (Data[0] == 0x00 && Data[1] == 0x00 && Data[2] == 0x01 && (Data[3] & 0xF0) == 0xE0) {
|
|
||||||
// PES data
|
|
||||||
char *buf = MALLOC(char, Length);
|
|
||||||
if (!buf)
|
|
||||||
return;
|
|
||||||
int i = 0;
|
|
||||||
int blen = 0;
|
|
||||||
while (i < Length - 6) {
|
|
||||||
if (Data[i] == 0x00 && Data[i + 1] == 0x00 && Data[i + 2] == 0x01) {
|
|
||||||
int len = Data[i + 4] * 256 + Data[i + 5];
|
|
||||||
if ((Data[i + 3] & 0xF0) == 0xE0) { // video packet
|
|
||||||
// skip PES header
|
|
||||||
int offs = i + 6;
|
|
||||||
// skip header extension
|
|
||||||
if ((Data[i + 6] & 0xC0) == 0x80) {
|
|
||||||
// MPEG-2 PES header
|
|
||||||
if (Data[i + 8] >= Length)
|
|
||||||
break;
|
|
||||||
offs += 3;
|
|
||||||
offs += Data[i + 8];
|
|
||||||
len -= 3;
|
|
||||||
len -= Data[i + 8];
|
|
||||||
if (len < 0 || offs + len > Length)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// MPEG-1 PES header
|
|
||||||
while (offs < Length && len > 0 && Data[offs] == 0xFF) {
|
|
||||||
offs++;
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
if (offs <= Length - 2 && len >= 2 && (Data[offs] & 0xC0) == 0x40) {
|
|
||||||
offs += 2;
|
|
||||||
len -= 2;
|
|
||||||
}
|
|
||||||
if (offs <= Length - 5 && len >= 5 && (Data[offs] & 0xF0) == 0x20) {
|
|
||||||
offs += 5;
|
|
||||||
len -= 5;
|
|
||||||
}
|
|
||||||
else if (offs <= Length - 10 && len >= 10 && (Data[offs] & 0xF0) == 0x30) {
|
|
||||||
offs += 10;
|
|
||||||
len -= 10;
|
|
||||||
}
|
|
||||||
else if (offs < Length && len > 0) {
|
|
||||||
offs++;
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (blen + len > Length) // invalid PES length field
|
|
||||||
break;
|
|
||||||
memcpy(&buf[blen], &Data[offs], len);
|
|
||||||
i = offs + len;
|
|
||||||
blen += len;
|
|
||||||
}
|
|
||||||
else if (Data[i + 3] >= 0xBD && Data[i + 3] <= 0xDF) // other PES packets
|
|
||||||
i += len + 6;
|
|
||||||
else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
video_still_picture sp = { buf, blen };
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// non-PES data
|
|
||||||
video_still_picture sp = { (char *)Data, Length };
|
|
||||||
CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::Poll(cPoller &Poller, int TimeoutMs)
|
|
||||||
{
|
|
||||||
Poller.Add((playMode == pmAudioOnly || playMode == pmAudioOnlyBlack) ? fd_audio : fd_video, true);
|
|
||||||
return Poller.Poll(TimeoutMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDevice::Flush(int TimeoutMs)
|
|
||||||
{
|
|
||||||
//TODO actually this function should wait until all buffered data has been processed by the card, but how?
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cDvbSdFfDevice::PlayVideo(const uchar *Data, int Length)
|
|
||||||
{
|
|
||||||
return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cDvbSdFfDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
|
|
||||||
{
|
|
||||||
return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cDvbSdFfDevice::PlayTsVideo(const uchar *Data, int Length)
|
|
||||||
{
|
|
||||||
return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cDvbSdFfDevice::PlayTsAudio(const uchar *Data, int Length)
|
|
||||||
{
|
|
||||||
return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cDvbSdFfDeviceProbe ---------------------------------------------------
|
|
||||||
|
|
||||||
cDvbSdFfDeviceProbe::cDvbSdFfDeviceProbe(void)
|
|
||||||
{
|
|
||||||
outputOnly = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cDvbSdFfDeviceProbe::Probe(int Adapter, int Frontend)
|
|
||||||
{
|
|
||||||
static uint32_t SubsystemIds[] = {
|
|
||||||
0x110A0000, // Fujitsu Siemens DVB-C
|
|
||||||
0x13C20000, // Technotrend/Hauppauge WinTV DVB-S rev1.X or Fujitsu Siemens DVB-C
|
|
||||||
0x13C20001, // Technotrend/Hauppauge WinTV DVB-T rev1.X
|
|
||||||
0x13C20002, // Technotrend/Hauppauge WinTV DVB-C rev2.X
|
|
||||||
0x13C20003, // Technotrend/Hauppauge WinTV Nexus-S rev2.X
|
|
||||||
0x13C20004, // Galaxis DVB-S rev1.3
|
|
||||||
0x13C20006, // Fujitsu Siemens DVB-S rev1.6
|
|
||||||
0x13C20008, // Technotrend/Hauppauge DVB-T
|
|
||||||
0x13C2000A, // Technotrend/Hauppauge WinTV Nexus-CA rev1.X
|
|
||||||
0x13C2000E, // Technotrend/Hauppauge WinTV Nexus-S rev2.3
|
|
||||||
0x13C21002, // Technotrend/Hauppauge WinTV DVB-S rev1.3 SE
|
|
||||||
0x00000000
|
|
||||||
};
|
|
||||||
uint32_t SubsystemId = GetSubsystemId(Adapter, Frontend);
|
|
||||||
for (uint32_t *sid = SubsystemIds; *sid; sid++) {
|
|
||||||
if (*sid == SubsystemId) {
|
|
||||||
dsyslog("creating cDvbSdFfDevice");
|
|
||||||
new cDvbSdFfDevice(Adapter, Frontend, outputOnly);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
@ -1,115 +0,0 @@
|
|||||||
/*
|
|
||||||
* dvbsdffdevice.h: The DVB SD Full Featured device interface
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: dvbsdffdevice.h 2.14 2012/12/03 13:43:55 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __DVBSDFFDEVICE_H
|
|
||||||
#define __DVBSDFFDEVICE_H
|
|
||||||
|
|
||||||
#include <vdr/dvbdevice.h>
|
|
||||||
#include <vdr/dvbspu.h>
|
|
||||||
|
|
||||||
/// The cDvbSdFfDevice implements a DVB device which can be accessed through the Linux DVB driver API.
|
|
||||||
|
|
||||||
class cDvbSdFfDevice : public cDvbDevice {
|
|
||||||
private:
|
|
||||||
int fd_osd, fd_audio, fd_video, fd_stc;
|
|
||||||
bool outputOnly;
|
|
||||||
protected:
|
|
||||||
virtual void MakePrimaryDevice(bool On);
|
|
||||||
public:
|
|
||||||
cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly);
|
|
||||||
virtual ~cDvbSdFfDevice();
|
|
||||||
virtual bool HasDecoder(void) const;
|
|
||||||
virtual bool AvoidRecording(void) const;
|
|
||||||
|
|
||||||
// SPU facilities
|
|
||||||
|
|
||||||
private:
|
|
||||||
cDvbSpuDecoder *spuDecoder;
|
|
||||||
public:
|
|
||||||
virtual cSpuDecoder *GetSpuDecoder(void);
|
|
||||||
|
|
||||||
// Channel facilities
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual bool ProvidesSource(int Source) const;
|
|
||||||
private:
|
|
||||||
void TurnOffLiveMode(bool LiveView);
|
|
||||||
protected:
|
|
||||||
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
|
||||||
|
|
||||||
// PID handle facilities
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool SetAudioBypass(bool On);
|
|
||||||
protected:
|
|
||||||
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
|
|
||||||
|
|
||||||
// Image Grab facilities
|
|
||||||
|
|
||||||
private:
|
|
||||||
static int devVideoOffset;
|
|
||||||
int devVideoIndex;
|
|
||||||
public:
|
|
||||||
virtual uchar *GrabImage(int &Size, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1);
|
|
||||||
|
|
||||||
// Video format facilities
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat);
|
|
||||||
virtual void SetVideoFormat(bool VideoFormat16_9);
|
|
||||||
virtual eVideoSystem GetVideoSystem(void);
|
|
||||||
virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect);
|
|
||||||
virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect);
|
|
||||||
|
|
||||||
// Track facilities
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void SetAudioTrackDevice(eTrackType Type);
|
|
||||||
|
|
||||||
// Audio facilities
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool digitalAudio;
|
|
||||||
protected:
|
|
||||||
virtual int GetAudioChannelDevice(void);
|
|
||||||
virtual void SetAudioChannelDevice(int AudioChannel);
|
|
||||||
virtual void SetVolumeDevice(int Volume);
|
|
||||||
virtual void SetDigitalAudioDevice(bool On);
|
|
||||||
|
|
||||||
// Player facilities
|
|
||||||
|
|
||||||
protected:
|
|
||||||
ePlayMode playMode;
|
|
||||||
virtual bool CanReplay(void) const;
|
|
||||||
virtual bool SetPlayMode(ePlayMode PlayMode);
|
|
||||||
virtual int PlayVideo(const uchar *Data, int Length);
|
|
||||||
virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
|
|
||||||
virtual int PlayTsVideo(const uchar *Data, int Length);
|
|
||||||
virtual int PlayTsAudio(const uchar *Data, int Length);
|
|
||||||
public:
|
|
||||||
virtual int64_t GetSTC(void);
|
|
||||||
virtual void TrickSpeed(int Speed);
|
|
||||||
virtual void Clear(void);
|
|
||||||
virtual void Play(void);
|
|
||||||
virtual void Freeze(void);
|
|
||||||
virtual void Mute(void);
|
|
||||||
virtual void StillPicture(const uchar *Data, int Length);
|
|
||||||
virtual bool Poll(cPoller &Poller, int TimeoutMs = 0);
|
|
||||||
virtual bool Flush(int TimeoutMs = 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
class cDvbSdFfDeviceProbe : public cDvbDeviceProbe {
|
|
||||||
private:
|
|
||||||
bool outputOnly;
|
|
||||||
public:
|
|
||||||
cDvbSdFfDeviceProbe(void);
|
|
||||||
void SetOutputOnly(bool On) { outputOnly = On; }
|
|
||||||
virtual bool Probe(int Adapter, int Frontend);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //__DVBSDFFDEVICE_H
|
|
@ -1,211 +0,0 @@
|
|||||||
/*
|
|
||||||
* dvbsdffosd.c: Implementation of the DVB SD Full Featured On Screen Display
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: dvbsdffosd.c 2.3 2011/04/17 12:55:09 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "dvbsdffosd.h"
|
|
||||||
#include <linux/dvb/osd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/unistd.h>
|
|
||||||
#include <vdr/tools.h>
|
|
||||||
|
|
||||||
// --- cDvbSdFfOsd -----------------------------------------------------------
|
|
||||||
|
|
||||||
#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
|
|
||||||
#define MAXOSDMEMORY 92000 // number of bytes available to the OSD (for unmodified DVB cards)
|
|
||||||
|
|
||||||
class cDvbSdFfOsd : public cOsd {
|
|
||||||
private:
|
|
||||||
int osdDev;
|
|
||||||
int osdMem;
|
|
||||||
bool shown;
|
|
||||||
void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL);
|
|
||||||
protected:
|
|
||||||
virtual void SetActive(bool On);
|
|
||||||
public:
|
|
||||||
cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level);
|
|
||||||
virtual ~cDvbSdFfOsd();
|
|
||||||
virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
|
|
||||||
virtual eOsdError SetAreas(const tArea *Areas, int NumAreas);
|
|
||||||
virtual void Flush(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cDvbSdFfOsd::cDvbSdFfOsd(int Left, int Top, int OsdDev, uint Level)
|
|
||||||
:cOsd(Left, Top, Level)
|
|
||||||
{
|
|
||||||
osdDev = OsdDev;
|
|
||||||
shown = false;
|
|
||||||
if (osdDev < 0)
|
|
||||||
esyslog("ERROR: invalid OSD device handle (%d)!", osdDev);
|
|
||||||
else {
|
|
||||||
osdMem = MAXOSDMEMORY;
|
|
||||||
#ifdef OSD_CAP_MEMSIZE
|
|
||||||
// modified DVB cards may have more OSD memory:
|
|
||||||
osd_cap_t cap;
|
|
||||||
cap.cmd = OSD_CAP_MEMSIZE;
|
|
||||||
if (ioctl(osdDev, OSD_GET_CAPABILITY, &cap) == 0)
|
|
||||||
osdMem = cap.val;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cDvbSdFfOsd::~cDvbSdFfOsd()
|
|
||||||
{
|
|
||||||
SetActive(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfOsd::SetActive(bool On)
|
|
||||||
{
|
|
||||||
if (On != Active()) {
|
|
||||||
cOsd::SetActive(On);
|
|
||||||
if (On) {
|
|
||||||
// must clear all windows here to avoid flashing effects - doesn't work if done
|
|
||||||
// in Flush() only for the windows that are actually used...
|
|
||||||
for (int i = 0; i < MAXNUMWINDOWS; i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
Cmd(OSD_Clear);
|
|
||||||
}
|
|
||||||
if (GetBitmap(0)) // only flush here if there are already bitmaps
|
|
||||||
Flush();
|
|
||||||
}
|
|
||||||
else if (shown) {
|
|
||||||
for (int i = 0; GetBitmap(i); i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
Cmd(OSD_Close);
|
|
||||||
}
|
|
||||||
shown = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eOsdError cDvbSdFfOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
|
|
||||||
{
|
|
||||||
eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas);
|
|
||||||
if (Result == oeOk) {
|
|
||||||
if (NumAreas > MAXNUMWINDOWS)
|
|
||||||
return oeTooManyAreas;
|
|
||||||
int TotalMemory = 0;
|
|
||||||
for (int i = 0; i < NumAreas; i++) {
|
|
||||||
if (Areas[i].bpp != 1 && Areas[i].bpp != 2 && Areas[i].bpp != 4 && Areas[i].bpp != 8)
|
|
||||||
return oeBppNotSupported;
|
|
||||||
if ((Areas[i].Width() & (8 / Areas[i].bpp - 1)) != 0)
|
|
||||||
return oeWrongAlignment;
|
|
||||||
if (Areas[i].Width() < 1 || Areas[i].Height() < 1 || Areas[i].Width() > 720 || Areas[i].Height() > 576)
|
|
||||||
return oeWrongAreaSize;
|
|
||||||
TotalMemory += Areas[i].Width() * Areas[i].Height() / (8 / Areas[i].bpp);
|
|
||||||
}
|
|
||||||
if (TotalMemory > osdMem)
|
|
||||||
return oeOutOfMemory;
|
|
||||||
}
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
eOsdError cDvbSdFfOsd::SetAreas(const tArea *Areas, int NumAreas)
|
|
||||||
{
|
|
||||||
if (shown) {
|
|
||||||
for (int i = 0; GetBitmap(i); i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
Cmd(OSD_Close);
|
|
||||||
}
|
|
||||||
shown = false;
|
|
||||||
}
|
|
||||||
return cOsd::SetAreas(Areas, NumAreas);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data)
|
|
||||||
{
|
|
||||||
if (osdDev >= 0) {
|
|
||||||
osd_cmd_t dc;
|
|
||||||
dc.cmd = cmd;
|
|
||||||
dc.color = color;
|
|
||||||
dc.x0 = x0;
|
|
||||||
dc.y0 = y0;
|
|
||||||
dc.x1 = x1;
|
|
||||||
dc.y1 = y1;
|
|
||||||
dc.data = (void *)data;
|
|
||||||
ioctl(osdDev, OSD_SEND_CMD, &dc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbSdFfOsd::Flush(void)
|
|
||||||
{
|
|
||||||
if (!Active())
|
|
||||||
return;
|
|
||||||
cBitmap *Bitmap;
|
|
||||||
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
if (!shown)
|
|
||||||
Cmd(OSD_Open, Bitmap->Bpp(), Left() + Bitmap->X0(), Top() + Bitmap->Y0(), Left() + Bitmap->X0() + Bitmap->Width() - 1, Top() + Bitmap->Y0() + Bitmap->Height() - 1, (void *)1); // initially hidden!
|
|
||||||
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
|
|
||||||
if (!shown || Bitmap->Dirty(x1, y1, x2, y2)) {
|
|
||||||
if (!shown) {
|
|
||||||
x1 = y1 = 0;
|
|
||||||
x2 = Bitmap->Width() - 1;
|
|
||||||
y2 = Bitmap->Height() - 1;
|
|
||||||
}
|
|
||||||
//TODO Workaround: apparently the bitmap sent to the driver always has to be a multiple
|
|
||||||
//TODO of 8 bits wide, and (dx * dy) also has to be a multiple of 8.
|
|
||||||
//TODO Fix driver (should be able to handle any size bitmaps!)
|
|
||||||
while ((x1 > 0 || x2 < Bitmap->Width() - 1) && ((x2 - x1) & 7) != 7) {
|
|
||||||
if (x2 < Bitmap->Width() - 1)
|
|
||||||
x2++;
|
|
||||||
else if (x1 > 0)
|
|
||||||
x1--;
|
|
||||||
}
|
|
||||||
//TODO "... / 2" <==> Bpp???
|
|
||||||
while ((y1 > 0 || y2 < Bitmap->Height() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
|
|
||||||
if (y2 < Bitmap->Height() - 1)
|
|
||||||
y2++;
|
|
||||||
else if (y1 > 0)
|
|
||||||
y1--;
|
|
||||||
}
|
|
||||||
while ((x1 > 0 || x2 < Bitmap->Width() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
|
|
||||||
if (x2 < Bitmap->Width() - 1)
|
|
||||||
x2++;
|
|
||||||
else if (x1 > 0)
|
|
||||||
x1--;
|
|
||||||
}
|
|
||||||
// commit colors:
|
|
||||||
int NumColors;
|
|
||||||
const tColor *Colors = Bitmap->Colors(NumColors);
|
|
||||||
if (Colors) {
|
|
||||||
//TODO this should be fixed in the driver!
|
|
||||||
tColor colors[NumColors];
|
|
||||||
for (int i = 0; i < NumColors; i++) {
|
|
||||||
// convert AARRGGBB to AABBGGRR (the driver expects the colors the wrong way):
|
|
||||||
colors[i] = (Colors[i] & 0xFF000000) | ((Colors[i] & 0x0000FF) << 16) | (Colors[i] & 0x00FF00) | ((Colors[i] & 0xFF0000) >> 16);
|
|
||||||
}
|
|
||||||
Colors = colors;
|
|
||||||
//TODO end of stuff that should be fixed in the driver
|
|
||||||
Cmd(OSD_SetPalette, 0, NumColors - 1, 0, 0, 0, Colors);
|
|
||||||
}
|
|
||||||
// commit modified data:
|
|
||||||
Cmd(OSD_SetBlock, Bitmap->Width(), x1, y1, x2, y2, Bitmap->Data(x1, y1));
|
|
||||||
}
|
|
||||||
Bitmap->Clean();
|
|
||||||
}
|
|
||||||
if (!shown) {
|
|
||||||
// Showing the windows in a separate loop to avoid seeing them come up one after another
|
|
||||||
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
Cmd(OSD_MoveWindow, 0, Left() + Bitmap->X0(), Top() + Bitmap->Y0());
|
|
||||||
}
|
|
||||||
shown = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cDvbOsdProvider -------------------------------------------------------
|
|
||||||
|
|
||||||
cDvbOsdProvider::cDvbOsdProvider(int OsdDev)
|
|
||||||
{
|
|
||||||
osdDev = OsdDev;
|
|
||||||
}
|
|
||||||
|
|
||||||
cOsd *cDvbOsdProvider::CreateOsd(int Left, int Top, uint Level)
|
|
||||||
{
|
|
||||||
return new cDvbSdFfOsd(Left, Top, osdDev, Level);
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
/*
|
|
||||||
* dvbsdffosd.h: Implementation of the DVB SD Full Featured On Screen Display
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: dvbsdffosd.h 2.2 2012/12/03 13:43:55 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __DVBSDFFODF_H
|
|
||||||
#define __DVBSDFFODF_H
|
|
||||||
|
|
||||||
#include <vdr/osd.h>
|
|
||||||
|
|
||||||
class cDvbOsdProvider : public cOsdProvider {
|
|
||||||
private:
|
|
||||||
int osdDev;
|
|
||||||
public:
|
|
||||||
cDvbOsdProvider(int OsdDev);
|
|
||||||
virtual cOsd *CreateOsd(int Left, int Top, uint Level);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //__DVBSDFFODF_H
|
|
@ -8,3 +8,27 @@ VDR Plugin 'epgtableid0' Revision History
|
|||||||
2012-12-27: Version 0.0.2
|
2012-12-27: Version 0.0.2
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-01-12: Version 0.0.3
|
||||||
|
|
||||||
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-03-31: Version 2.0.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2015-02-19: Version 2.2.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2018-04-15: Version 2.4.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2021-12-27: Version 2.6.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 1.11 2012/12/29 10:28:58 kls Exp $
|
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||||
@ -16,8 +16,9 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
|||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
PKG_CONFIG ?= pkg-config
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
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)
|
PLGCFG = $(call PKGCFG,plgcfg)
|
||||||
#
|
#
|
||||||
TMPDIR ?= /tmp
|
TMPDIR ?= /tmp
|
||||||
@ -61,24 +62,26 @@ all: $(SOFILE)
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
$(SOFILE): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
install-lib: $(SOFILE)
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib
|
install: install-lib
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <kls@tvdr.de>
|
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
|
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
|
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.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: epgtableid0.c 1.2 2012/12/27 10:32:52 kls Exp $
|
* $Id: epgtableid0.c 4.1 2018/04/10 13:00:18 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/epg.h>
|
#include <vdr/epg.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.0.2";
|
static const char *VERSION = "2.4.0";
|
||||||
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
|
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
|
||||||
|
|
||||||
// --- cTable0Handler --------------------------------------------------------
|
// --- cTable0Handler --------------------------------------------------------
|
||||||
|
@ -78,3 +78,28 @@ VDR Plugin 'hello' Revision History
|
|||||||
2012-12-27: Version 0.2.6
|
2012-12-27: Version 0.2.6
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-01-12: Version 0.2.7
|
||||||
|
|
||||||
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-03-31: Version 2.0.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2015-02-19: Version 2.2.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2018-04-15: Version 2.4.0
|
||||||
|
|
||||||
|
- Updated the French OSD texts (thanks to Bernard Jaulin).
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2021-12-27: Version 2.6.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 2.16 2012/12/28 10:09:20 kls Exp $
|
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||||
@ -16,9 +16,10 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
|||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
PKG_CONFIG ?= pkg-config
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||||
LOCDIR = $(DESTDIR)$(call PKGCFG,locdir)
|
LIBDIR = $(call PKGCFG,libdir)
|
||||||
|
LOCDIR = $(call PKGCFG,locdir)
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
PLGCFG = $(call PKGCFG,plgcfg)
|
||||||
#
|
#
|
||||||
TMPDIR ?= /tmp
|
TMPDIR ?= /tmp
|
||||||
@ -62,14 +63,15 @@ all: $(SOFILE) i18n
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
@ -78,20 +80,23 @@ $(DEPFILE): Makefile
|
|||||||
PODIR = po
|
PODIR = po
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||||
I18Nmsgs = $(addprefix $(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||||
|
|
||||||
%.mo: %.po
|
%.mo: %.po
|
||||||
msgfmt -c -o $@ $<
|
@echo MO $@
|
||||||
|
$(Q)msgfmt -c -o $@ $<
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
@echo GT $@
|
||||||
|
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
%.po: $(I18Npot)
|
||||||
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
@echo PO $@
|
||||||
|
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
$(I18Nmsgs): $(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||||
install -D -m644 $< $@
|
install -D -m644 $< $@
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
@ -102,10 +107,11 @@ install-i18n: $(I18Nmsgs)
|
|||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
$(SOFILE): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
install-lib: $(SOFILE)
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib install-i18n
|
install: install-lib install-i18n
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <kls@tvdr.de>
|
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
|
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
|
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.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: hello.c 2.4 2012/12/27 10:35:04 kls Exp $
|
* $Id: hello.c 4.1 2018/04/10 13:00:22 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -12,7 +12,7 @@
|
|||||||
#include <vdr/interface.h>
|
#include <vdr/interface.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.2.6";
|
static const char *VERSION = "2.4.0";
|
||||||
static const char *DESCRIPTION = trNOOP("A friendly greeting");
|
static const char *DESCRIPTION = trNOOP("A friendly greeting");
|
||||||
static const char *MAINMENUENTRY = trNOOP("Hello");
|
static const char *MAINMENUENTRY = trNOOP("Hello");
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
||||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
||||||
@ -7,7 +7,7 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Mogens Elneff <mogens@elneff.dk>, 2004
|
# Mogens Elneff <mogens@elneff.dk>, 2004
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Klaus Schmidinger <kls@tvdr.de>, 2000
|
# Klaus Schmidinger <vdr@tvdr.de>, 2000
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
|
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Dimitrios Dimitrakos <mail@dimitrios.de>, 2002
|
# Dimitrios Dimitrakos <mail@dimitrios.de>, 2002
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Ruben Nunez Francisco <ruben.nunez@tang-it.com>, 2002
|
# Ruben Nunez Francisco <ruben.nunez@tang-it.com>, 2002
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,35 +1,35 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Arthur Konovalov <kasjas@hot.ee>, 2004
|
# Arthur Konovalov <artlov@gmail.com>, 2004, 2015
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Arthur Konovalov <kasjas@hot.ee>\n"
|
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||||
"Language: et\n"
|
"Language: et\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-13\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
msgid "A friendly greeting"
|
||||||
msgstr ""
|
msgstr "Sõbralik tervitus"
|
||||||
|
|
||||||
msgid "Hello"
|
msgid "Hello"
|
||||||
msgstr ""
|
msgstr "Tere"
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
msgid "Greeting time (s)"
|
||||||
msgstr ""
|
msgstr "Tervituse kestus (s)"
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
msgid "Use alternate greeting"
|
||||||
msgstr ""
|
msgstr "Vahelduv tervitus"
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
msgid "Howdy folks!"
|
||||||
msgstr ""
|
msgstr "Kuidas käsi käib?"
|
||||||
|
|
||||||
msgid "Hello world!"
|
msgid "Hello world!"
|
||||||
msgstr ""
|
msgstr "Tere, maailm!"
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Hannu Savolainen <hannu@opensound.com>, 2002
|
# Hannu Savolainen <hannu@opensound.com>, 2002
|
||||||
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
|
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
|
||||||
# Niko Tarnanen <niko.tarnanen@hut.fi>, 2003
|
# Niko Tarnanen <niko.tarnanen@hut.fi>, 2003
|
||||||
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2003
|
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2003
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||||
"Language: fi\n"
|
"Language: fi\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Jean-Claude Repetto <jc@repetto.org>, 2001
|
# Jean-Claude Repetto <jc@repetto.org>, 2001
|
||||||
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003
|
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003
|
||||||
# Gregoire Favre <greg@magma.unil.ch>, 2003
|
# Gregoire Favre <greg@magma.unil.ch>, 2003
|
||||||
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005
|
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005
|
||||||
|
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2018
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2018-04-14 8:34+0200\n"
|
||||||
"Last-Translator: Nicolas Huillard <nhuillard@e-dition.fr>\n"
|
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
||||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -20,19 +21,19 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
msgid "A friendly greeting"
|
||||||
msgstr ""
|
msgstr "Bien le bonjour"
|
||||||
|
|
||||||
msgid "Hello"
|
msgid "Hello"
|
||||||
msgstr ""
|
msgstr "Hello"
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
msgid "Greeting time (s)"
|
||||||
msgstr ""
|
msgstr "Durée pour le salut (s)"
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
msgid "Use alternate greeting"
|
||||||
msgstr ""
|
msgstr "Changer de salutation"
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
msgid "Howdy folks!"
|
||||||
msgstr ""
|
msgstr "Bonjour à tous !"
|
||||||
|
|
||||||
msgid "Hello world!"
|
msgid "Hello world!"
|
||||||
msgstr ""
|
msgstr "Bonjour le monde !"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Adrian Caval <anrxc@sysphere.org>, 2008
|
# Adrian Caval <anrxc@sysphere.org>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2008-03-17 19:52+0100\n"
|
"PO-Revision-Date: 2008-03-17 19:52+0100\n"
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Istvan Koenigsberger <istvnko@hotmail.com>, 2002
|
# Istvan Koenigsberger <istvnko@hotmail.com>, 2002
|
||||||
# Guido Josten <guido.josten@t-online.de>, 2002
|
# Guido Josten <guido.josten@t-online.de>, 2002
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2008-01-27 20:11+0100\n"
|
"PO-Revision-Date: 2008-01-27 20:11+0100\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2009-12-08 12:18+0200\n"
|
"PO-Revision-Date: 2009-12-08 12:18+0200\n"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, 2001
|
# Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, 2001
|
||||||
# Hans Dingemans <hans.dingemans@tacticalops.nl>, 2003
|
# Hans Dingemans <hans.dingemans@tacticalops.nl>, 2003
|
||||||
@ -7,7 +7,7 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Jørgen Tvedt <pjtvedt@online.no>, 2001
|
# Jørgen Tvedt <pjtvedt@online.no>, 2001
|
||||||
# Truls Slevigen <truls@slevigen.no>, 2002
|
# Truls Slevigen <truls@slevigen.no>, 2002
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,35 +1,38 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Michael Rakowski <mrak@gmx.de>, 2002
|
# Michael Rakowski <mrak@gmx.de>, 2002
|
||||||
|
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2018-02-19 00:41+0100\n"
|
||||||
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
|
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||||
"Language: pl\n"
|
"Language: pl_PL\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||||
|
"X-Generator: Poedit 2.0.6\n"
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
msgid "A friendly greeting"
|
||||||
msgstr ""
|
msgstr "Przyjazne pozdrowienie"
|
||||||
|
|
||||||
msgid "Hello"
|
msgid "Hello"
|
||||||
msgstr ""
|
msgstr "Witaj"
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
msgid "Greeting time (s)"
|
||||||
msgstr ""
|
msgstr "Czas pozdrowienia (s)"
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
msgid "Use alternate greeting"
|
||||||
msgstr ""
|
msgstr "Użyj alternatywnego pozdrowienia"
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
msgid "Howdy folks!"
|
||||||
msgstr ""
|
msgstr "Siema ziomy!"
|
||||||
|
|
||||||
msgid "Hello world!"
|
msgid "Hello world!"
|
||||||
msgstr ""
|
msgstr "Witaj świecie!"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Paulo Lopes <pmml@netvita.pt>, 2001
|
# Paulo Lopes <pmml@netvita.pt>, 2001
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Paul Lacatus <paul@campina.iiruc.ro>, 2002
|
# Paul Lacatus <paul@campina.iiruc.ro>, 2002
|
||||||
# Lucian Muresan <lucianm@users.sourceforge.net>, 2004
|
# Lucian Muresan <lucianm@users.sourceforge.net>, 2004
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Vyacheslav Dikonov <sdiconov@mail.ru>, 2004
|
# Vyacheslav Dikonov <sdiconov@mail.ru>, 2004
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2009-09-30 09:48+0100\n"
|
"PO-Revision-Date: 2009-09-30 09:48+0100\n"
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Miha Setina <mihasetina@softhome.net>, 2000
|
# Miha Setina <mihasetina@softhome.net>, 2000
|
||||||
# Matjaz Thaler <matjaz.thaler@guest.arnes.si>, 2003
|
# Matjaz Thaler <matjaz.thaler@guest.arnes.si>, 2003
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Tomas Prybil <tomas@prybil.se>, 2002
|
# Tomas Prybil <tomas@prybil.se>, 2002
|
||||||
# Jan Ekholm <chakie@infa.abo.fi>, 2003
|
# Jan Ekholm <chakie@infa.abo.fi>, 2003
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Oktay Yolgeçen <oktay_73@yahoo.de>, 2007
|
# Oktay Yolgeçen <oktay_73@yahoo.de>, 2007
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2008-05-12 22:34:4800\n"
|
"PO-Revision-Date: 2008-05-12 22:34:4800\n"
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
||||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
||||||
# Jordi Vilà <jvila@tinet.org>, 2003
|
# Jordi Vilà <jvila@tinet.org>, 2003
|
||||||
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
|
# Nan Feng VDR <nfgx@21cn.com>, 2009
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 0.2.5\n"
|
"Project-Id-Version: vdr-hello 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
||||||
"PO-Revision-Date: 2009-01-23 09:48+0800\n"
|
"PO-Revision-Date: 2009-01-23 09:48+0800\n"
|
||||||
|
@ -42,3 +42,52 @@ VDR Plugin 'osddemo' Revision History
|
|||||||
2012-12-27: Version 0.2.4
|
2012-12-27: Version 0.2.4
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-01-12: Version 0.2.5
|
||||||
|
|
||||||
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-02-13: Version 0.3.0
|
||||||
|
|
||||||
|
- Added demos of the DrawEllipse() and DrawSlope() function (press '1' or '2',
|
||||||
|
respectively).
|
||||||
|
|
||||||
|
2013-02-19: Version 0.3.1
|
||||||
|
|
||||||
|
- The demos can now also be ended with the "Back" key.
|
||||||
|
|
||||||
|
2013-03-31: Version 2.0.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2014-02-06: Version 2.1.2
|
||||||
|
|
||||||
|
- Fixed flickering if subtitles are active while the OSD demo is running.
|
||||||
|
- Fixed a possible crash in the OSD demo (reported by Christopher Reimer).
|
||||||
|
|
||||||
|
2015-02-19: Version 2.2.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2015-03-08: Version 2.3.1
|
||||||
|
|
||||||
|
- Now using cOsd::MaxPixmapSize().
|
||||||
|
- Fixed a vertical black line in the "TiledPixmaps" area on the rpihddevice OSD with
|
||||||
|
1280x800 pixel (thanks to Thomas Reufer).
|
||||||
|
- Added a demo case for storing images (thanks to Thomas Reufer).
|
||||||
|
|
||||||
|
2018-04-15: Version 2.4.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2020-10-12: Version 2.4.1
|
||||||
|
|
||||||
|
- Added test cases for alignment of semi-circles (press key '4').
|
||||||
|
|
||||||
|
2021-12-27: Version 2.6.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 2.14 2012/12/29 10:29:04 kls Exp $
|
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||||
@ -16,8 +16,9 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
|||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
PKG_CONFIG ?= pkg-config
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
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)
|
PLGCFG = $(call PKGCFG,plgcfg)
|
||||||
#
|
#
|
||||||
TMPDIR ?= /tmp
|
TMPDIR ?= /tmp
|
||||||
@ -61,24 +62,26 @@ all: $(SOFILE)
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
$(SOFILE): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
install-lib: $(SOFILE)
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib
|
install: install-lib
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <kls@tvdr.de>
|
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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -26,4 +26,9 @@ pixmap is displayed, it can be moved around with the Up, Down, Left
|
|||||||
and Right buttons. The Red button turns off the "Tiled Pixmaps"
|
and Right buttons. The Red button turns off the "Tiled Pixmaps"
|
||||||
display, and the Green button toggles the color display.
|
display, and the Green button toggles the color display.
|
||||||
|
|
||||||
|
In both variants of the demo, pressing the '1' key displays all
|
||||||
|
possible ellipses that can be drawn with the DrawEllipse() function,
|
||||||
|
while pressing the '2' key shows all possible slopes the DrawSlope()
|
||||||
|
function can draw.
|
||||||
|
|
||||||
Press Ok to close the window.
|
Press Ok to close the window.
|
||||||
|
@ -3,16 +3,224 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: osddemo.c 2.7 2012/12/27 10:36:21 kls Exp $
|
* $Id: osddemo.c 4.5 2020/10/14 20:32:41 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/osd.h>
|
#include <vdr/osd.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.2.4";
|
static const char *VERSION = "2.4.1";
|
||||||
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
||||||
static const char *MAINMENUENTRY = "Osd Demo";
|
static const char *MAINMENUENTRY = "Osd Demo";
|
||||||
|
|
||||||
|
// --- DrawEllipses ----------------------------------------------------------
|
||||||
|
|
||||||
|
void DrawEllipse(cOsd *Osd, int x1, int y1, int x2, int y2, int Quadrants)
|
||||||
|
{
|
||||||
|
Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen);
|
||||||
|
Osd->DrawEllipse(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Quadrants);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawEllipses(cOsd *Osd)
|
||||||
|
{
|
||||||
|
int xa = 0;
|
||||||
|
int ya = 0;
|
||||||
|
int xb = Osd->Width() - 1;
|
||||||
|
int yb = Osd->Height() - 1;
|
||||||
|
int x0 = xa;
|
||||||
|
int x5 = xb;
|
||||||
|
int x1 = x0 + (xb - xa) / 5;
|
||||||
|
int x2 = x0 + (xb - xa) * 2 / 5;
|
||||||
|
int x3 = x0 + (xb - xa) * 3 / 5;
|
||||||
|
int x4 = x0 + (xb - xa) * 4 / 5;
|
||||||
|
int y0 = ya;
|
||||||
|
int y4 = yb;
|
||||||
|
int y2 = (y0 + y4) / 2;
|
||||||
|
int y1 = (y0 + y2) / 2;
|
||||||
|
int y3 = (y2 + y4) / 2;
|
||||||
|
Osd->DrawRectangle(xa, ya, xb, yb, clrGray50);
|
||||||
|
DrawEllipse(Osd, x4, y0, x5, y4, 0);
|
||||||
|
DrawEllipse(Osd, x2, y1, x3, y2, 1);
|
||||||
|
DrawEllipse(Osd, x1, y1, x2, y2, 2);
|
||||||
|
DrawEllipse(Osd, x1, y2, x2, y3, 3);
|
||||||
|
DrawEllipse(Osd, x2, y2, x3, y3, 4);
|
||||||
|
DrawEllipse(Osd, x3, y1, x4, y3, 5);
|
||||||
|
DrawEllipse(Osd, x1, y0, x3, y1, 6);
|
||||||
|
DrawEllipse(Osd, x0, y1, x1, y3, 7);
|
||||||
|
DrawEllipse(Osd, x1, y3, x3, y4, 8);
|
||||||
|
DrawEllipse(Osd, x3, y0, x4, y1, -1);
|
||||||
|
DrawEllipse(Osd, x0, y0, x1, y1, -2);
|
||||||
|
DrawEllipse(Osd, x0, y3, x1, y4, -3);
|
||||||
|
DrawEllipse(Osd, x3, y3, x4, y4, -4);
|
||||||
|
Osd->Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- DrawSlopes ------------------------------------------------------------
|
||||||
|
|
||||||
|
void DrawSlope(cOsd *Osd, int x1, int y1, int x2, int y2, int Type)
|
||||||
|
{
|
||||||
|
Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen);
|
||||||
|
Osd->DrawSlope(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawSlopes(cOsd *Osd)
|
||||||
|
{
|
||||||
|
int xa = 0;
|
||||||
|
int ya = 0;
|
||||||
|
int xb = Osd->Width() - 1;
|
||||||
|
int yb = Osd->Height() - 1;
|
||||||
|
int x0 = xa;
|
||||||
|
int x4 = xb;
|
||||||
|
int x2 = (x0 + x4) / 2;
|
||||||
|
int x1 = (x0 + x2) / 2;
|
||||||
|
int x3 = (x2 + x4) / 2;
|
||||||
|
int y0 = ya;
|
||||||
|
int y3 = yb;
|
||||||
|
int y2 = (y0 + y3) / 2;
|
||||||
|
int y1 = (y0 + y2) / 2;
|
||||||
|
Osd->DrawRectangle(xa, ya, xb, yb, clrGray50);
|
||||||
|
DrawSlope(Osd, x0, y0, x2, y1, 0);
|
||||||
|
DrawSlope(Osd, x2, y0, x4, y1, 1);
|
||||||
|
DrawSlope(Osd, x0, y1, x2, y2, 2);
|
||||||
|
DrawSlope(Osd, x2, y1, x4, y2, 3);
|
||||||
|
DrawSlope(Osd, x0, y2, x1, y3, 4);
|
||||||
|
DrawSlope(Osd, x1, y2, x2, y3, 5);
|
||||||
|
DrawSlope(Osd, x2, y2, x3, y3, 6);
|
||||||
|
DrawSlope(Osd, x3, y2, x4, y3, 7);
|
||||||
|
Osd->Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- DrawImages ------------------------------------------------------------
|
||||||
|
|
||||||
|
struct tOsdImageRef {
|
||||||
|
int image;
|
||||||
|
cSize size;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NUMOSDIMAGES 16
|
||||||
|
#define NUMOSDIMAGEVARIANTS 8
|
||||||
|
|
||||||
|
void DrawImages(cOsd *Osd)
|
||||||
|
{
|
||||||
|
// Create images:
|
||||||
|
cImage *images[NUMOSDIMAGEVARIANTS];
|
||||||
|
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++) {
|
||||||
|
images[i] = new cImage(cSize(
|
||||||
|
i == 0 || i == 1 ? Osd->MaxPixmapSize().Width() + 1 : rand() % Osd->Width(),
|
||||||
|
i == 0 || i == 2 ? Osd->MaxPixmapSize().Height() + 1 : rand() % Osd->Height()));
|
||||||
|
for (int x = 0; x < images[i]->Width(); x++) {
|
||||||
|
for (int y = 0; y < images[i]->Height(); y++) {
|
||||||
|
images[i]->SetPixel(cPoint(x, y),
|
||||||
|
(!x || !y || x == images[i]->Width() - 1 || y == images[i]->Height() - 1) ? clrWhite :
|
||||||
|
(x > images[i]->Width() / 2 ?
|
||||||
|
(y > images[i]->Height() / 2 ? clrBlue : clrGreen) :
|
||||||
|
(y > images[i]->Height() / 2 ? clrRed : clrYellow)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Store images:
|
||||||
|
tOsdImageRef osdImages[NUMOSDIMAGES];
|
||||||
|
for (int i = 0; i < NUMOSDIMAGES; i++) {
|
||||||
|
osdImages[i].image = cOsdProvider::StoreImage(*images[i % NUMOSDIMAGEVARIANTS]);
|
||||||
|
osdImages[i].size.Set(images[i % NUMOSDIMAGEVARIANTS]->Size());
|
||||||
|
}
|
||||||
|
// Delete images:
|
||||||
|
for (int i = 0; i < NUMOSDIMAGEVARIANTS; i++)
|
||||||
|
delete images[i];
|
||||||
|
// Draw images:
|
||||||
|
for (int i = 0; i < NUMOSDIMAGES; i++)
|
||||||
|
Osd->DrawImage(cPoint(rand() % (Osd->Width() + osdImages[i].size.Width()), rand() % (Osd->Height() + osdImages[i].size.Height())).Shifted(-osdImages[i].size.Width(), -osdImages[i].size.Height()), osdImages[i].image);
|
||||||
|
// Drop image references:
|
||||||
|
for (int i = 0; i < NUMOSDIMAGES; i++)
|
||||||
|
cOsdProvider::DropImage(osdImages[i].image);
|
||||||
|
Osd->Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- DrawEllipseAlignments -------------------------------------------------
|
||||||
|
|
||||||
|
void DrawEllipseAlignments(cOsd *Osd)
|
||||||
|
{
|
||||||
|
cFont *Font = cFont::CreateFont(Setup.FontOsd, 20);
|
||||||
|
int xa = 0;
|
||||||
|
int ya = 0;
|
||||||
|
int xb = Osd->Width() - 1;
|
||||||
|
int yb = Osd->Height() - 1;
|
||||||
|
Osd->DrawRectangle(xa, ya, xb, yb, clrBlack);
|
||||||
|
int d = 50;
|
||||||
|
int a = d / 2 + 1;
|
||||||
|
int t = a * 2;
|
||||||
|
int n = 30;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||||
|
Osd->DrawEllipse(a, t - d / 2, a + d - 1, t, clrGreen, 6);
|
||||||
|
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d / 2, clrGreen, 8);
|
||||||
|
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||||
|
a += d + 5;
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
d = 50;
|
||||||
|
a = d * 3;
|
||||||
|
n = 20;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||||
|
Osd->DrawEllipse(t - d / 2, a, t, a + d - 1, clrGreen, 7);
|
||||||
|
Osd->DrawEllipse(t + d, a, t + d + d / 2, a + d - 1, clrGreen, 5);
|
||||||
|
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||||
|
a += d + 5;
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
d = 50;
|
||||||
|
a = d * 3;
|
||||||
|
t = d * 5;
|
||||||
|
n = 30;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||||
|
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 2);
|
||||||
|
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 3);
|
||||||
|
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||||
|
a += d + 5;
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
d = 50;
|
||||||
|
a = d * 3;
|
||||||
|
t = d * 9;
|
||||||
|
n = 30;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
Osd->DrawRectangle(a, t, a + d - 1, t + d - 1, clrGreen);
|
||||||
|
Osd->DrawEllipse(a, t - d, a + d - 1, t, clrGreen, 1);
|
||||||
|
Osd->DrawEllipse(a, t + d, a + d - 1, t + d + d, clrGreen, 4);
|
||||||
|
Osd->DrawText(a + d / 3, t + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||||
|
a += d + 5;
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
d = 50;
|
||||||
|
a = d * 12;
|
||||||
|
t = d * 5;
|
||||||
|
n = 20;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||||
|
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 2);
|
||||||
|
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 1);
|
||||||
|
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||||
|
a += d + 5;
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
d = 50;
|
||||||
|
a = d * 12;
|
||||||
|
t = d * 9;
|
||||||
|
n = 20;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
Osd->DrawRectangle(t, a, t + d - 1, a + d - 1, clrGreen);
|
||||||
|
Osd->DrawEllipse(t - d, a, t, a + d - 1, clrGreen, 3);
|
||||||
|
Osd->DrawEllipse(t + d, a, t + d + d, a + d - 1, clrGreen, 4);
|
||||||
|
Osd->DrawText(t + d / 3, a + d / 3, itoa(d), clrRed, clrGreen, Font);
|
||||||
|
a += d + 5;
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
Osd->Flush();
|
||||||
|
delete Font;
|
||||||
|
}
|
||||||
|
|
||||||
// --- cLineGame -------------------------------------------------------------
|
// --- cLineGame -------------------------------------------------------------
|
||||||
|
|
||||||
class cLineGame : public cOsdObject {
|
class cLineGame : public cOsdObject {
|
||||||
@ -31,7 +239,7 @@ public:
|
|||||||
cLineGame::cLineGame(void)
|
cLineGame::cLineGame(void)
|
||||||
{
|
{
|
||||||
osd = NULL;
|
osd = NULL;
|
||||||
x = y = 50;
|
x = y = 0;
|
||||||
color = clrRed;
|
color = clrRed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,12 +250,23 @@ cLineGame::~cLineGame()
|
|||||||
|
|
||||||
void cLineGame::Show(void)
|
void cLineGame::Show(void)
|
||||||
{
|
{
|
||||||
osd = cOsdProvider::NewOsd(100, 50, 50);
|
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
||||||
if (osd) {
|
if (osd) {
|
||||||
tArea Area = { 0, 0, 99, 199, 4 };
|
int x1 = cOsd::OsdWidth() - 1;
|
||||||
osd->SetAreas(&Area, 1);
|
int y1 = cOsd::OsdHeight() - 1;
|
||||||
osd->DrawRectangle(0, 0, 99, 199, clrGray50);
|
while (x1 > 0 && y1 > 0) {
|
||||||
osd->Flush();
|
tArea Area = { 0, 0, x1, y1, 4 };
|
||||||
|
if (osd->CanHandleAreas(&Area, 1) == oeOk) {
|
||||||
|
osd->SetAreas(&Area, 1);
|
||||||
|
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
||||||
|
osd->Flush();
|
||||||
|
x = osd->Width() / 2;
|
||||||
|
y = osd->Height() / 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
x1 = x1 * 9 / 10;
|
||||||
|
y1 = y1 * 9 / 10;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,19 +274,25 @@ eOSState cLineGame::ProcessKey(eKeys Key)
|
|||||||
{
|
{
|
||||||
eOSState state = cOsdObject::ProcessKey(Key);
|
eOSState state = cOsdObject::ProcessKey(Key);
|
||||||
if (state == osUnknown) {
|
if (state == osUnknown) {
|
||||||
|
const int d = 4;
|
||||||
switch (Key & ~k_Repeat) {
|
switch (Key & ~k_Repeat) {
|
||||||
case kUp: if (y > 0) y--; break;
|
case kUp: y = max(0, y - d); break;
|
||||||
case kDown: if (y < 196) y++; break;
|
case kDown: y = min(osd->Height() - d, y + d); break;
|
||||||
case kLeft: if (x > 0) x--; break;
|
case kLeft: x = max(0, x - d); break;
|
||||||
case kRight: if (x < 96) x++; break;
|
case kRight: x = min(osd->Width() - d, x + d); break;
|
||||||
case kRed: color = clrRed; break;
|
case kRed: color = clrRed; break;
|
||||||
case kGreen: color = clrGreen; break;
|
case kGreen: color = clrGreen; break;
|
||||||
case kYellow: color = clrYellow; break;
|
case kYellow: color = clrYellow; break;
|
||||||
case kBlue: color = clrBlue; break;
|
case kBlue: color = clrBlue; break;
|
||||||
|
case k1: DrawEllipses(osd);
|
||||||
|
return osContinue;
|
||||||
|
case k2: DrawSlopes(osd);
|
||||||
|
return osContinue;
|
||||||
|
case kBack:
|
||||||
case kOk: return osEnd;
|
case kOk: return osEnd;
|
||||||
default: return state;
|
default: return state;
|
||||||
}
|
}
|
||||||
osd->DrawRectangle(x, y, x + 3, y + 3, color);
|
osd->DrawRectangle(x, y, x + d - 1, y + d - 1, color);
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
state = osContinue;
|
state = osContinue;
|
||||||
}
|
}
|
||||||
@ -84,6 +309,7 @@ private:
|
|||||||
bool clockwise;
|
bool clockwise;
|
||||||
cPixmap *destroyablePixmap;
|
cPixmap *destroyablePixmap;
|
||||||
cPixmap *toggleablePixmap;
|
cPixmap *toggleablePixmap;
|
||||||
|
bool SetArea(void);
|
||||||
virtual void Action(void);
|
virtual void Action(void);
|
||||||
cPixmap *CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font);
|
cPixmap *CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font);
|
||||||
public:
|
public:
|
||||||
@ -115,7 +341,7 @@ cPixmap *cTrueColorDemo::CreateTextPixmap(const char *s, int Line, int Layer, tC
|
|||||||
if (Pixmap) {
|
if (Pixmap) {
|
||||||
Pixmap->Clear();
|
Pixmap->Clear();
|
||||||
Pixmap->SetAlpha(0);
|
Pixmap->SetAlpha(0);
|
||||||
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font);
|
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font, w);
|
||||||
}
|
}
|
||||||
return Pixmap;
|
return Pixmap;
|
||||||
}
|
}
|
||||||
@ -241,7 +467,7 @@ void cTrueColorDemo::Action(void)
|
|||||||
State++;
|
State++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1: {
|
case 1: {
|
||||||
FadeInPixmap = CreateTextPixmap("Video Disk Recorder", Line, 3, clrYellow, clrTransparent, OsdFont);
|
FadeInPixmap = CreateTextPixmap("Video Disk Recorder", Line, 3, clrYellow, clrTransparent, OsdFont);
|
||||||
if (FadeInPixmap)
|
if (FadeInPixmap)
|
||||||
Line += FadeInPixmap->DrawPort().Height();
|
Line += FadeInPixmap->DrawPort().Height();
|
||||||
@ -332,16 +558,20 @@ void cTrueColorDemo::Action(void)
|
|||||||
const int Size = SmlFont->Width(Text) + 10;
|
const int Size = SmlFont->Width(Text) + 10;
|
||||||
const int NumDots = 12;
|
const int NumDots = 12;
|
||||||
const int AnimFrames = NumDots;
|
const int AnimFrames = NumDots;
|
||||||
|
int Rows = min(osd->MaxPixmapSize().Height() / Size, AnimFrames);
|
||||||
|
int Cols = (AnimFrames + Rows - 1) / Rows;
|
||||||
// Temporarily using pixmap layer 0 to have the text alpha blended:
|
// Temporarily using pixmap layer 0 to have the text alpha blended:
|
||||||
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size, Size * AnimFrames));
|
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size * Cols, Size * Rows));
|
||||||
if (AnimPixmap) {
|
if (AnimPixmap) {
|
||||||
AnimPixmap->SetAlpha(0);
|
AnimPixmap->SetAlpha(0);
|
||||||
AnimPixmap->Clear();
|
AnimPixmap->Clear();
|
||||||
const int Diameter = Size / 5;
|
const int Diameter = Size / 5;
|
||||||
int xc = Size / 2 - Diameter / 2;
|
|
||||||
for (int Frame = 0; Frame < AnimFrames; Frame++) {
|
for (int Frame = 0; Frame < AnimFrames; Frame++) {
|
||||||
AnimPixmap->DrawEllipse(cRect(0, Frame * Size, Size, Size), 0xDDFFFFFF);
|
int x0 = Frame / Rows * Size;
|
||||||
int yc = Frame * Size + Size / 2 - Diameter / 2;
|
int y0 = Frame % Rows * Size;
|
||||||
|
AnimPixmap->DrawEllipse(cRect(x0, y0, Size, Size), 0xDDFFFFFF);
|
||||||
|
int xc = x0 + Size / 2 - Diameter / 2;
|
||||||
|
int yc = y0 + Size / 2 - Diameter / 2;
|
||||||
int Color = 0xFF;
|
int Color = 0xFF;
|
||||||
int Delta = Color / NumDots / 3;
|
int Delta = Color / NumDots / 3;
|
||||||
for (int a = 0; a < NumDots; a++) {
|
for (int a = 0; a < NumDots; a++) {
|
||||||
@ -351,7 +581,7 @@ void cTrueColorDemo::Action(void)
|
|||||||
AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color));
|
AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color));
|
||||||
Color -= Delta;
|
Color -= Delta;
|
||||||
}
|
}
|
||||||
AnimPixmap->DrawText(cPoint(0, Frame * Size), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
|
AnimPixmap->DrawText(cPoint(x0, y0), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
|
||||||
}
|
}
|
||||||
AnimPixmap->SetLayer(3); // now setting the actual pixmap layer
|
AnimPixmap->SetLayer(3); // now setting the actual pixmap layer
|
||||||
FadeInPixmap = AnimPixmap;
|
FadeInPixmap = AnimPixmap;
|
||||||
@ -385,18 +615,28 @@ void cTrueColorDemo::Action(void)
|
|||||||
if (Delta < FrameTime)
|
if (Delta < FrameTime)
|
||||||
cCondWait::SleepMs(FrameTime - Delta);
|
cCondWait::SleepMs(FrameTime - Delta);
|
||||||
}
|
}
|
||||||
|
destroyablePixmap = NULL;
|
||||||
|
toggleablePixmap = NULL;
|
||||||
delete OsdFont;
|
delete OsdFont;
|
||||||
delete SmlFont;
|
delete SmlFont;
|
||||||
delete LrgFont;
|
delete LrgFont;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cTrueColorDemo::Show(void)
|
bool cTrueColorDemo::SetArea(void)
|
||||||
{
|
{
|
||||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop(), 50);
|
|
||||||
if (osd) {
|
if (osd) {
|
||||||
tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
|
tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
|
||||||
if (osd->SetAreas(&Area, 1) == oeOk) {
|
return osd->SetAreas(&Area, 1) == oeOk;
|
||||||
osd->DrawRectangle(0, 0, osd->Width() -1 , osd->Height() - 1, clrGray50);
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cTrueColorDemo::Show(void)
|
||||||
|
{
|
||||||
|
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
||||||
|
if (osd) {
|
||||||
|
if (SetArea()) {
|
||||||
|
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
Start();
|
Start();
|
||||||
}
|
}
|
||||||
@ -423,6 +663,23 @@ eOSState cTrueColorDemo::ProcessKey(eKeys Key)
|
|||||||
case kGreen: if (toggleablePixmap)
|
case kGreen: if (toggleablePixmap)
|
||||||
toggleablePixmap->SetLayer(-toggleablePixmap->Layer());
|
toggleablePixmap->SetLayer(-toggleablePixmap->Layer());
|
||||||
break;
|
break;
|
||||||
|
case k1: Cancel(3);
|
||||||
|
SetArea();
|
||||||
|
DrawEllipses(osd);
|
||||||
|
break;
|
||||||
|
case k2: Cancel(3);
|
||||||
|
SetArea();
|
||||||
|
DrawSlopes(osd);
|
||||||
|
break;
|
||||||
|
case k3: Cancel(3);
|
||||||
|
SetArea();
|
||||||
|
DrawImages(osd);
|
||||||
|
break;
|
||||||
|
case k4: Cancel(3);
|
||||||
|
SetArea();
|
||||||
|
DrawEllipseAlignments(osd);
|
||||||
|
return osContinue;
|
||||||
|
case kBack:
|
||||||
case kOk: return osEnd;
|
case kOk: return osEnd;
|
||||||
default: return state;
|
default: return state;
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ VDR Plugin 'pictures' Revision History
|
|||||||
|
|
||||||
- Fixed the Play function (when used from a directory in the pictures menu
|
- Fixed the Play function (when used from a directory in the pictures menu
|
||||||
it always started with the next directory).
|
it always started with the next directory).
|
||||||
- Added Finnish texts (thanks to Rolf Ahrenberg <rahrenbe@cc.hut.fi>).
|
- Added Finnish texts (thanks to Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>).
|
||||||
|
|
||||||
2008-01-27: Version 0.0.3
|
2008-01-27: Version 0.0.3
|
||||||
|
|
||||||
@ -79,3 +79,44 @@ VDR Plugin 'pictures' Revision History
|
|||||||
2012-12-27: Version 0.1.4
|
2012-12-27: Version 0.1.4
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-01-12: Version 0.1.5
|
||||||
|
|
||||||
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-03-31: Version 2.0.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2013-07-01:
|
||||||
|
|
||||||
|
- Added option -x to pic2mpg.
|
||||||
|
|
||||||
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2015-02-19: Version 2.2.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2015-07-23: Version 2.3.1
|
||||||
|
|
||||||
|
- Added a missing 'const'.
|
||||||
|
|
||||||
|
2017-10-06: Version 2.3.2
|
||||||
|
|
||||||
|
- Adapted the pic2mpg script to new ffmpeg options.
|
||||||
|
- No longer using 'convert' to scale/rotate the pictures.
|
||||||
|
|
||||||
|
2018-04-15: Version 2.4.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2021-12-27: Version 2.6.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2022-12-05: Version 2.6.1
|
||||||
|
|
||||||
|
Fixed initializing cPictureControl.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 2.16 2012/12/28 10:09:29 kls Exp $
|
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||||
@ -16,9 +16,10 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
|||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
PKG_CONFIG ?= pkg-config
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||||
LOCDIR = $(DESTDIR)$(call PKGCFG,locdir)
|
LIBDIR = $(call PKGCFG,libdir)
|
||||||
|
LOCDIR = $(call PKGCFG,locdir)
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
PLGCFG = $(call PKGCFG,plgcfg)
|
||||||
#
|
#
|
||||||
TMPDIR ?= /tmp
|
TMPDIR ?= /tmp
|
||||||
@ -62,14 +63,15 @@ all: $(SOFILE) i18n
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
@ -78,20 +80,23 @@ $(DEPFILE): Makefile
|
|||||||
PODIR = po
|
PODIR = po
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||||
I18Nmsgs = $(addprefix $(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||||
|
|
||||||
%.mo: %.po
|
%.mo: %.po
|
||||||
msgfmt -c -o $@ $<
|
@echo MO $@
|
||||||
|
$(Q)msgfmt -c -o $@ $<
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
@echo GT $@
|
||||||
|
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
%.po: $(I18Npot)
|
||||||
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
@echo PO $@
|
||||||
|
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
$(I18Nmsgs): $(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||||
install -D -m644 $< $@
|
install -D -m644 $< $@
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
@ -102,10 +107,11 @@ install-i18n: $(I18Nmsgs)
|
|||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
$(SOFILE): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
install-lib: $(SOFILE)
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib install-i18n
|
install: install-lib install-i18n
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <kls@tvdr.de>
|
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
|
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
|
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.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: menu.c 1.1 2008/01/13 11:35:18 kls Exp $
|
* $Id: menu.c 4.1 2015/07/17 10:13:56 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -85,7 +85,7 @@ eOSState cPictureMenu::SelectItem(const char *Path, bool SlideShow)
|
|||||||
if (Item) {
|
if (Item) {
|
||||||
const cList<cPictureEntry> *l = pictureEntry->Entries();
|
const cList<cPictureEntry> *l = pictureEntry->Entries();
|
||||||
if (l) {
|
if (l) {
|
||||||
cPictureEntry *pe = l->Get(Current());
|
const cPictureEntry *pe = l->Get(Current());
|
||||||
if (pe) {
|
if (pe) {
|
||||||
if (SlideShow) {
|
if (SlideShow) {
|
||||||
cControl::Launch(new cPictureControl(pictures, pe, true));
|
cControl::Launch(new cPictureControl(pictures, pe, true));
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#
|
#
|
||||||
# See the README file for copyright information and how to reach the author.
|
# See the README file for copyright information and how to reach the author.
|
||||||
#
|
#
|
||||||
# $Id: pic2mpg 2.4 2012/01/08 13:27:17 kls Exp $
|
# $Id: pic2mpg 4.1 2017/10/06 14:42:18 kls Exp $
|
||||||
|
|
||||||
use File::Path;
|
use File::Path;
|
||||||
use File::Spec;
|
use File::Spec;
|
||||||
@ -23,9 +23,10 @@ Options: -f Force conversion
|
|||||||
-o percent overscan in percent
|
-o percent overscan in percent
|
||||||
-s size Screen size (WIDTHxHEIGHT, default is 1920x1080)
|
-s size Screen size (WIDTHxHEIGHT, default is 1920x1080)
|
||||||
-v num Verbose (0=none, 1=list files, 2=detailed)
|
-v num Verbose (0=none, 1=list files, 2=detailed)
|
||||||
|
-x dir[,...] eXclude the given directories
|
||||||
};
|
};
|
||||||
|
|
||||||
getopts("fho:s:v:") || die $Usage;
|
getopts("fho:s:v:x:") || die $Usage;
|
||||||
|
|
||||||
die $Usage if $opt_h;
|
die $Usage if $opt_h;
|
||||||
|
|
||||||
@ -33,13 +34,14 @@ $Force = $opt_f;
|
|||||||
$Overscan = $opt_o || 0;
|
$Overscan = $opt_o || 0;
|
||||||
$Size = $opt_s || "1920x1080";
|
$Size = $opt_s || "1920x1080";
|
||||||
$Verbose = $opt_v;
|
$Verbose = $opt_v;
|
||||||
|
@Exclude = split(',', $opt_x || "");
|
||||||
|
|
||||||
$ListFiles = $Verbose >= 1;
|
$ListFiles = $Verbose >= 1;
|
||||||
$Detailed = $Verbose >= 2;
|
$Detailed = $Verbose >= 2;
|
||||||
|
|
||||||
# Supported picture types:
|
# Supported picture types:
|
||||||
|
|
||||||
%PICTYPES = (
|
%PICTYPES = (
|
||||||
bmp => 1,
|
bmp => 1,
|
||||||
gif => 1,
|
gif => 1,
|
||||||
jpeg => 1,
|
jpeg => 1,
|
||||||
@ -85,7 +87,11 @@ chdir($PICDIR) || die "$PICDIR: $!\n";
|
|||||||
@Pictures = `find -type f | sort`;
|
@Pictures = `find -type f | sort`;
|
||||||
chomp(@Pictures);
|
chomp(@Pictures);
|
||||||
|
|
||||||
|
PIC:
|
||||||
for $pic (@Pictures) {
|
for $pic (@Pictures) {
|
||||||
|
for (@Exclude) {
|
||||||
|
next PIC if ($pic =~ /\/$_\//);
|
||||||
|
}
|
||||||
my $mpg = "$MPGDIR/$pic.mpg";
|
my $mpg = "$MPGDIR/$pic.mpg";
|
||||||
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
||||||
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
||||||
@ -122,7 +128,7 @@ for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subd
|
|||||||
for $dir (@Dirs) {
|
for $dir (@Dirs) {
|
||||||
$dir = EscapeMeta($dir);
|
$dir = EscapeMeta($dir);
|
||||||
print "removing $dir\n";
|
print "removing $dir\n";
|
||||||
!system("rm -rf $dir") || die "$dir: $!\n";
|
Exec("rm -rf $dir");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,18 +141,19 @@ sub ConvertFile
|
|||||||
return if (!defined $PICTYPES{$Type});
|
return if (!defined $PICTYPES{$Type});
|
||||||
my $Exif = ImageInfo($Pict);
|
my $Exif = ImageInfo($Pict);
|
||||||
my $Orientation = $$Exif{"Orientation"};
|
my $Orientation = $$Exif{"Orientation"};
|
||||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+)/;
|
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+)/;
|
||||||
my $Rotate = $Degrees ? "-rotate $Degrees" : "";
|
my $Rotate = ($Degrees == 90) ? "transpose=clock" : ($Degrees == 180) ? "hflip,vflip" : ($Degrees == 270) ? "transpose=cclock" : "";
|
||||||
|
$Rotate .= ',' if ($Rotate);
|
||||||
|
my $Background = '#000000@1';
|
||||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
||||||
$Pict = EscapeMeta($Pict);
|
$Pict = EscapeMeta($Pict);
|
||||||
$Mpeg = EscapeMeta($Mpeg);
|
$Mpeg = EscapeMeta($Mpeg);
|
||||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
||||||
my $Cmd = "convert $Pict -background '#000000' $Rotate -resize $Size -gravity center -extent $Extent ppm:- | "
|
my $Cmd = "ffmpeg -i $Pict -vf '${Rotate}scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:$Background' -c:v libx264 -pix_fmt yuv420p -f mpegts -y $Mpeg "
|
||||||
. "ffmpeg -f image2pipe -vcodec ppm -i pipe:0 -an -vcodec libx264 -vpre baseline -s $Size -qscale 2 -f mpegts -y $Mpeg "
|
|
||||||
. ($Detailed ? "" : "2>/dev/null");
|
. ($Detailed ? "" : "2>/dev/null");
|
||||||
!system($Cmd) || die "$Cmd: $!\n";
|
Exec($Cmd);
|
||||||
$Cmd = "touch -r $Pict $Mpeg";
|
$Cmd = "touch -r $Pict $Mpeg";
|
||||||
!system($Cmd) || die "$Cmd: $!\n";
|
Exec($Cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub EscapeMeta
|
sub EscapeMeta
|
||||||
@ -156,3 +163,10 @@ sub EscapeMeta
|
|||||||
$s =~ s/([$META])/\\$1/g;
|
$s =~ s/([$META])/\\$1/g;
|
||||||
return $s;
|
return $s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub Exec
|
||||||
|
{
|
||||||
|
my $Cmd = shift;
|
||||||
|
print "==> '$Cmd'\n" if ($Verbose);
|
||||||
|
!system($Cmd) || die "$Cmd: $!\n";
|
||||||
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: pictures.c 2.7 2012/12/27 10:37:07 kls Exp $
|
* $Id: pictures.c 5.1 2022/12/05 15:26:23 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -11,7 +11,7 @@
|
|||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
|
|
||||||
static const char *VERSION = "0.1.4";
|
static const char *VERSION = "2.6.1";
|
||||||
static const char *DESCRIPTION = trNOOP("A simple picture viewer");
|
static const char *DESCRIPTION = trNOOP("A simple picture viewer");
|
||||||
static const char *MAINMENUENTRY = trNOOP("Pictures");
|
static const char *MAINMENUENTRY = trNOOP("Pictures");
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: player.c 2.2 2012/04/28 11:58:15 kls Exp $
|
* $Id: player.c 5.1 2022/12/05 15:26:23 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
@ -96,8 +96,10 @@ int cPictureControl::active = 0;
|
|||||||
cString cPictureControl::lastDisplayed;
|
cString cPictureControl::lastDisplayed;
|
||||||
|
|
||||||
cPictureControl::cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow)
|
cPictureControl::cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow)
|
||||||
:cControl(player = new cPicturePlayer)
|
:cControl(NULL)
|
||||||
{
|
{
|
||||||
|
player = new cPicturePlayer;
|
||||||
|
SetPlayer(player);
|
||||||
pictures = Pictures;
|
pictures = Pictures;
|
||||||
pictureEntry = PictureEntry;
|
pictureEntry = PictureEntry;
|
||||||
osd = NULL;
|
osd = NULL;
|
||||||
@ -211,7 +213,7 @@ cString cPictureControl::GetHeader(void)
|
|||||||
|
|
||||||
eOSState cPictureControl::ProcessKey(eKeys Key)
|
eOSState cPictureControl::ProcessKey(eKeys Key)
|
||||||
{
|
{
|
||||||
switch (Key) {
|
switch (int(Key)) {
|
||||||
case kUp:
|
case kUp:
|
||||||
case kPlay: slideShowDelay.Set();
|
case kPlay: slideShowDelay.Set();
|
||||||
slideShow = true;
|
slideShow = true;
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Klaus Schmidinger <kls@tvdr.de>, 2008
|
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 0.1.3\n"
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||||
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
|
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
|
33
PLUGINS/src/pictures/po/et_EE.po
Normal file
33
PLUGINS/src/pictures/po/et_EE.po
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# VDR plugin language source file.
|
||||||
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
|
# This file is distributed under the same license as the VDR package.
|
||||||
|
# Arthur Konovalov <artlov@gmail.com>, 2015
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
|
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||||
|
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||||
|
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||||
|
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||||
|
"Language: et\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
msgid "Pictures"
|
||||||
|
msgstr "Pildid"
|
||||||
|
|
||||||
|
msgid "A simple picture viewer"
|
||||||
|
msgstr "Lihtne pildivaatur"
|
||||||
|
|
||||||
|
msgid "Picture directory"
|
||||||
|
msgstr "Pildikaust"
|
||||||
|
|
||||||
|
msgid "Slide show delay (s)"
|
||||||
|
msgstr "Slaidiseanssi viide (s)"
|
||||||
|
|
||||||
|
msgid "No picture directory has been defined!"
|
||||||
|
msgstr "Pildikaust on määramata!"
|
@ -1,15 +1,15 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2008
|
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 0.1.3\n"
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||||
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||||
"Language: fi\n"
|
"Language: fi\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Patrice Staudt <patrice.staudt@laposte.net>, 2008
|
# Patrice Staudt <patrice.staudt@laposte.net>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 0.1.3\n"
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 0.1.3\n"
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||||
"PO-Revision-Date: 2008-01-27 20:22+0100\n"
|
"PO-Revision-Date: 2008-01-27 20:22+0100\n"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 0.1.3\n"
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||||
"PO-Revision-Date: 2009-12-08 12:41+0100\n"
|
"PO-Revision-Date: 2009-12-08 12:41+0100\n"
|
||||||
|
34
PLUGINS/src/pictures/po/pl_PL.po
Normal file
34
PLUGINS/src/pictures/po/pl_PL.po
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# VDR plugin language source file.
|
||||||
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
|
# This file is distributed under the same license as the VDR package.
|
||||||
|
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
|
"POT-Creation-Date: 2018-02-19 00:48+0100\n"
|
||||||
|
"PO-Revision-Date: 2018-02-19 00:53+0100\n"
|
||||||
|
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||||
|
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||||
|
"Language: pl_PL\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||||
|
"X-Generator: Poedit 2.0.6\n"
|
||||||
|
|
||||||
|
msgid "Pictures"
|
||||||
|
msgstr "Zdjęcia"
|
||||||
|
|
||||||
|
msgid "A simple picture viewer"
|
||||||
|
msgstr "Prosta przeglądarka zdjęć"
|
||||||
|
|
||||||
|
msgid "Picture directory"
|
||||||
|
msgstr "Katalog ze zdjęciami"
|
||||||
|
|
||||||
|
msgid "Slide show delay (s)"
|
||||||
|
msgstr "Pokaz slajdów opóźnienie (s)"
|
||||||
|
|
||||||
|
msgid "No picture directory has been defined!"
|
||||||
|
msgstr "Nie zdefiniowano katalogu ze zdjęciami!"
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 0.1.3\n"
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||||
"PO-Revision-Date: 2008-03-14 00:45+0100\n"
|
"PO-Revision-Date: 2008-03-14 00:45+0100\n"
|
||||||
@ -28,7 +28,7 @@ msgid "Picture directory"
|
|||||||
msgstr "ºÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ"
|
msgstr "ºÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ"
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
msgid "Slide show delay (s)"
|
||||||
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
|
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
msgid "No picture directory has been defined!"
|
||||||
msgstr "½Õ ÞßàÕÔÕÛñÝ ÚÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ!"
|
msgstr "½Õ ÞßàÕÔÕÛñÝ ÚÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ!"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Klaus Schmidinger <kls@tvdr.de>, 2008
|
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 0.1.3\n"
|
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
||||||
"PO-Revision-Date: 2009-09-30 12:54+0100\n"
|
"PO-Revision-Date: 2009-09-30 12:54+0100\n"
|
||||||
|
@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
@ -1,14 +0,0 @@
|
|||||||
VDR Plugin 'rcu' Revision History
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
2012-02-27: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2012-03-07: Version 0.0.2
|
|
||||||
|
|
||||||
- Added new parameter LiveView to ChannelSwitch().
|
|
||||||
|
|
||||||
2012-12-27: Version 0.0.3
|
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
|
@ -1,94 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 1.11 2012/12/29 10:29:09 kls Exp $
|
|
||||||
|
|
||||||
# The official name of this plugin.
|
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
|
||||||
# By default the main source file also carries this name.
|
|
||||||
|
|
||||||
PLUGIN = rcu
|
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
|
||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
|
||||||
|
|
||||||
### The directory environment:
|
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### The version number of VDR's plugin API:
|
|
||||||
|
|
||||||
APIVERSION = $(call PKGCFG,apiversion)
|
|
||||||
|
|
||||||
### Allow user defined options to overwrite defaults:
|
|
||||||
|
|
||||||
-include $(PLGCFG)
|
|
||||||
|
|
||||||
### The name of the distribution archive:
|
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
|
||||||
|
|
||||||
INCLUDES +=
|
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
|
||||||
|
|
||||||
### The object files (add further files here):
|
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o
|
|
||||||
|
|
||||||
### The main target:
|
|
||||||
|
|
||||||
all: $(SOFILE)
|
|
||||||
|
|
||||||
### Implicit rules:
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Targets:
|
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,19 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: http://www.tvdr.de/remote.htm
|
|
||||||
|
|
||||||
Latest version available at: http://www.tvdr.de
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
See the file COPYING for more information.
|
|
||||||
|
|
||||||
Description:
|
|
||||||
============
|
|
||||||
|
|
||||||
The "Remote Control Unit" used to be part of the core VDR source
|
|
||||||
code, and has been moved into a separate plugin in version 1.7.25.
|
|
@ -1,420 +0,0 @@
|
|||||||
/*
|
|
||||||
* rcu.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: rcu.c 1.3 2012/12/27 10:37:31 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <termios.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
#include <vdr/remote.h>
|
|
||||||
#include <vdr/status.h>
|
|
||||||
#include <vdr/thread.h>
|
|
||||||
#include <vdr/tools.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "0.0.3";
|
|
||||||
static const char *DESCRIPTION = "Remote Control Unit";
|
|
||||||
|
|
||||||
#define REPEATLIMIT 150 // ms
|
|
||||||
#define REPEATDELAY 350 // ms
|
|
||||||
#define HANDSHAKETIMEOUT 20 // ms
|
|
||||||
#define DEFAULTDEVICE "/dev/ttyS1"
|
|
||||||
|
|
||||||
class cRcuRemote : public cRemote, private cThread, private cStatus {
|
|
||||||
private:
|
|
||||||
enum { modeH = 'h', modeB = 'b', modeS = 's' };
|
|
||||||
int f;
|
|
||||||
unsigned char dp, code, mode;
|
|
||||||
int number;
|
|
||||||
unsigned int data;
|
|
||||||
bool receivedCommand;
|
|
||||||
bool SendCommand(unsigned char Cmd);
|
|
||||||
int ReceiveByte(int TimeoutMs = 0);
|
|
||||||
bool SendByteHandshake(unsigned char c);
|
|
||||||
bool SendByte(unsigned char c);
|
|
||||||
bool SendData(unsigned int n);
|
|
||||||
void SetCode(unsigned char Code);
|
|
||||||
void SetMode(unsigned char Mode);
|
|
||||||
void SetNumber(int n, bool Hex = false);
|
|
||||||
void SetPoints(unsigned char Dp, bool On);
|
|
||||||
void SetString(const char *s);
|
|
||||||
bool DetectCode(unsigned char *Code);
|
|
||||||
virtual void Action(void);
|
|
||||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
|
|
||||||
virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
|
|
||||||
public:
|
|
||||||
cRcuRemote(const char *DeviceName);
|
|
||||||
virtual ~cRcuRemote();
|
|
||||||
virtual bool Ready(void);
|
|
||||||
virtual bool Initialize(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cRcuRemote::cRcuRemote(const char *DeviceName)
|
|
||||||
:cRemote("RCU")
|
|
||||||
,cThread("RCU remote control")
|
|
||||||
{
|
|
||||||
dp = 0;
|
|
||||||
mode = modeB;
|
|
||||||
code = 0;
|
|
||||||
number = 0;
|
|
||||||
data = 0;
|
|
||||||
receivedCommand = false;
|
|
||||||
if ((f = open(DeviceName, O_RDWR | O_NONBLOCK)) >= 0) {
|
|
||||||
struct termios t;
|
|
||||||
if (tcgetattr(f, &t) == 0) {
|
|
||||||
cfsetspeed(&t, B9600);
|
|
||||||
cfmakeraw(&t);
|
|
||||||
if (tcsetattr(f, TCSAFLUSH, &t) == 0) {
|
|
||||||
SetNumber(8888);
|
|
||||||
const char *Setup = GetSetup();
|
|
||||||
if (Setup) {
|
|
||||||
code = *Setup;
|
|
||||||
SetCode(code);
|
|
||||||
isyslog("connecting to %s remote control using code %c", Name(), code);
|
|
||||||
}
|
|
||||||
Start();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LOG_ERROR_STR(DeviceName);
|
|
||||||
close(f);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LOG_ERROR_STR(DeviceName);
|
|
||||||
f = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cRcuRemote::~cRcuRemote()
|
|
||||||
{
|
|
||||||
Cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cRcuRemote::Ready(void)
|
|
||||||
{
|
|
||||||
return f >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cRcuRemote::Initialize(void)
|
|
||||||
{
|
|
||||||
if (f >= 0) {
|
|
||||||
unsigned char Code = '0';
|
|
||||||
isyslog("trying codes for %s remote control...", Name());
|
|
||||||
for (;;) {
|
|
||||||
if (DetectCode(&Code)) {
|
|
||||||
code = Code;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isyslog("established connection to %s remote control using code %c", Name(), code);
|
|
||||||
char buffer[16];
|
|
||||||
snprintf(buffer, sizeof(buffer), "%c", code);
|
|
||||||
PutSetup(buffer);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cRcuRemote::Action(void)
|
|
||||||
{
|
|
||||||
#pragma pack(1)
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
unsigned short address;
|
|
||||||
unsigned int command;
|
|
||||||
} data;
|
|
||||||
unsigned char raw[6];
|
|
||||||
} buffer;
|
|
||||||
#pragma pack()
|
|
||||||
|
|
||||||
time_t LastCodeRefresh = 0;
|
|
||||||
cTimeMs FirstTime;
|
|
||||||
unsigned char LastCode = 0, LastMode = 0;
|
|
||||||
uint64_t LastCommand = ~0; // 0x00 might be a valid command
|
|
||||||
unsigned int LastData = 0;
|
|
||||||
bool repeat = false;
|
|
||||||
|
|
||||||
while (Running() && f >= 0) {
|
|
||||||
if (ReceiveByte(REPEATLIMIT) == 'X') {
|
|
||||||
for (int i = 0; i < 6; i++) {
|
|
||||||
int b = ReceiveByte();
|
|
||||||
if (b >= 0) {
|
|
||||||
buffer.raw[i] = b;
|
|
||||||
if (i == 5) {
|
|
||||||
unsigned short Address = ntohs(buffer.data.address); // the PIC sends bytes in "network order"
|
|
||||||
uint64_t Command = ntohl(buffer.data.command);
|
|
||||||
if (code == 'B' && Address == 0x0000 && Command == 0x00004000)
|
|
||||||
// Well, well, if it isn't the "d-box"...
|
|
||||||
// This remote control sends the above command before and after
|
|
||||||
// each keypress - let's just drop this:
|
|
||||||
break;
|
|
||||||
Command |= uint64_t(Address) << 32;
|
|
||||||
if (Command != LastCommand) {
|
|
||||||
LastCommand = Command;
|
|
||||||
repeat = false;
|
|
||||||
FirstTime.Set();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (FirstTime.Elapsed() < REPEATDELAY)
|
|
||||||
break; // repeat function kicks in after a short delay
|
|
||||||
repeat = true;
|
|
||||||
}
|
|
||||||
Put(Command, repeat);
|
|
||||||
receivedCommand = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (repeat) { // the last one was a repeat, so let's generate a release
|
|
||||||
Put(LastCommand, false, true);
|
|
||||||
repeat = false;
|
|
||||||
LastCommand = ~0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
unsigned int d = data;
|
|
||||||
if (d != LastData) {
|
|
||||||
SendData(d);
|
|
||||||
LastData = d;
|
|
||||||
}
|
|
||||||
unsigned char c = code;
|
|
||||||
if (c != LastCode) {
|
|
||||||
SendCommand(c);
|
|
||||||
LastCode = c;
|
|
||||||
}
|
|
||||||
unsigned char m = mode;
|
|
||||||
if (m != LastMode) {
|
|
||||||
SendCommand(m);
|
|
||||||
LastMode = m;
|
|
||||||
}
|
|
||||||
LastCommand = ~0;
|
|
||||||
}
|
|
||||||
if (!repeat && code && time(NULL) - LastCodeRefresh > 60) {
|
|
||||||
SendCommand(code); // in case the PIC listens to the wrong code
|
|
||||||
LastCodeRefresh = time(NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int cRcuRemote::ReceiveByte(int TimeoutMs)
|
|
||||||
{
|
|
||||||
// Returns the byte if one was received within a timeout, -1 otherwise
|
|
||||||
if (cFile::FileReady(f, TimeoutMs)) {
|
|
||||||
unsigned char b;
|
|
||||||
if (safe_read(f, &b, 1) == 1)
|
|
||||||
return b;
|
|
||||||
else
|
|
||||||
LOG_ERROR;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cRcuRemote::SendByteHandshake(unsigned char c)
|
|
||||||
{
|
|
||||||
if (f >= 0) {
|
|
||||||
int w = write(f, &c, 1);
|
|
||||||
if (w == 1) {
|
|
||||||
for (int reply = ReceiveByte(HANDSHAKETIMEOUT); reply >= 0;) {
|
|
||||||
if (reply == c)
|
|
||||||
return true;
|
|
||||||
else if (reply == 'X') {
|
|
||||||
// skip any incoming RC code - it will come again
|
|
||||||
for (int i = 6; i--;) {
|
|
||||||
if (ReceiveByte() < 0)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LOG_ERROR;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cRcuRemote::SendByte(unsigned char c)
|
|
||||||
{
|
|
||||||
for (int retry = 5; retry--;) {
|
|
||||||
if (SendByteHandshake(c))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cRcuRemote::SendData(unsigned int n)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 4; i++) {
|
|
||||||
if (!SendByte(n & 0x7F))
|
|
||||||
return false;
|
|
||||||
n >>= 8;
|
|
||||||
}
|
|
||||||
return SendCommand(mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cRcuRemote::SetCode(unsigned char Code)
|
|
||||||
{
|
|
||||||
code = Code;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cRcuRemote::SetMode(unsigned char Mode)
|
|
||||||
{
|
|
||||||
mode = Mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cRcuRemote::SendCommand(unsigned char Cmd)
|
|
||||||
{
|
|
||||||
return SendByte(Cmd | 0x80);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cRcuRemote::SetNumber(int n, bool Hex)
|
|
||||||
{
|
|
||||||
number = n;
|
|
||||||
if (!Hex) {
|
|
||||||
char buf[8];
|
|
||||||
sprintf(buf, "%4d", n & 0xFFFF);
|
|
||||||
n = 0;
|
|
||||||
for (char *d = buf; *d; d++) {
|
|
||||||
if (*d == ' ')
|
|
||||||
*d = 0xF;
|
|
||||||
n = (n << 4) | ((*d - '0') & 0x0F);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unsigned int m = 0;
|
|
||||||
for (int i = 0; i < 4; i++) {
|
|
||||||
m <<= 8;
|
|
||||||
m |= ((i & 0x03) << 5) | (n & 0x0F) | (((dp >> i) & 0x01) << 4);
|
|
||||||
n >>= 4;
|
|
||||||
}
|
|
||||||
data = m;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cRcuRemote::SetString(const char *s)
|
|
||||||
{
|
|
||||||
const char *chars = mode == modeH ? "0123456789ABCDEF" : "0123456789-EHLP ";
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
for (int i = 0; *s && i < 4; s++, i++) {
|
|
||||||
n <<= 4;
|
|
||||||
for (const char *c = chars; *c; c++) {
|
|
||||||
if (*c == *s) {
|
|
||||||
n |= c - chars;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SetNumber(n, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cRcuRemote::SetPoints(unsigned char Dp, bool On)
|
|
||||||
{
|
|
||||||
if (On)
|
|
||||||
dp |= Dp;
|
|
||||||
else
|
|
||||||
dp &= ~Dp;
|
|
||||||
SetNumber(number);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cRcuRemote::DetectCode(unsigned char *Code)
|
|
||||||
{
|
|
||||||
// Caller should initialize 'Code' to 0 and call DetectCode()
|
|
||||||
// until it returns true. Whenever DetectCode() returns false
|
|
||||||
// and 'Code' is not 0, the caller can use 'Code' to display
|
|
||||||
// a message like "Trying code '%c'". If false is returned and
|
|
||||||
// 'Code' is 0, all possible codes have been tried and the caller
|
|
||||||
// can either stop calling DetectCode() (and give some error
|
|
||||||
// message), or start all over again.
|
|
||||||
if (*Code < 'A' || *Code > 'D') {
|
|
||||||
*Code = 'A';
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (*Code <= 'D') {
|
|
||||||
SetMode(modeH);
|
|
||||||
char buf[5];
|
|
||||||
sprintf(buf, "C0D%c", *Code);
|
|
||||||
SetString(buf);
|
|
||||||
SetCode(*Code);
|
|
||||||
cCondWait::SleepMs(2 * REPEATDELAY);
|
|
||||||
if (receivedCommand) {
|
|
||||||
SetMode(modeB);
|
|
||||||
SetString("----");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (*Code < 'D') {
|
|
||||||
(*Code)++;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*Code = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cRcuRemote::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
|
|
||||||
{
|
|
||||||
if (ChannelNumber && LiveView)
|
|
||||||
SetNumber(cDevice::CurrentChannel());
|
|
||||||
}
|
|
||||||
|
|
||||||
void cRcuRemote::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
|
|
||||||
{
|
|
||||||
SetPoints(1 << Device->DeviceNumber(), Device->Receiving());
|
|
||||||
}
|
|
||||||
|
|
||||||
class cPluginRcu : public cPlugin {
|
|
||||||
private:
|
|
||||||
// Add any member variables or functions you may need here.
|
|
||||||
const char *device;
|
|
||||||
public:
|
|
||||||
cPluginRcu(void);
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual const char *CommandLineHelp(void);
|
|
||||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
|
||||||
virtual bool Start(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cPluginRcu::cPluginRcu(void)
|
|
||||||
{
|
|
||||||
// Initialize any member variables here.
|
|
||||||
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
|
|
||||||
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
|
|
||||||
device = DEFAULTDEVICE;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cPluginRcu::CommandLineHelp(void)
|
|
||||||
{
|
|
||||||
// Return a string that describes all known command line options.
|
|
||||||
return " -d DEV, --device=DEV set the device to use (default is " DEFAULTDEVICE ")\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginRcu::ProcessArgs(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
// Implement command line argument processing here if applicable.
|
|
||||||
static struct option long_options[] = {
|
|
||||||
{ "dev", required_argument, NULL, 'd' },
|
|
||||||
{ NULL, no_argument, NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
int c;
|
|
||||||
while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) {
|
|
||||||
switch (c) {
|
|
||||||
case 'd': device = optarg;
|
|
||||||
break;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cPluginRcu::Start(void)
|
|
||||||
{
|
|
||||||
// Start any background activities the plugin shall perform.
|
|
||||||
new cRcuRemote(device);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginRcu); // Don't touch this!
|
|
@ -13,3 +13,27 @@ VDR Plugin 'servicedemo' Revision History
|
|||||||
2012-12-27: Version 0.1.3
|
2012-12-27: Version 0.1.3
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-01-12: Version 0.1.4
|
||||||
|
|
||||||
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-03-31: Version 2.0.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2015-02-19: Version 2.2.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2018-04-15: Version 2.4.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2021-12-27: Version 2.6.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 2.12 2012/12/29 10:29:15 kls Exp $
|
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||||
@ -17,8 +17,9 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ pr
|
|||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
PKG_CONFIG ?= pkg-config
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
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)
|
PLGCFG = $(call PKGCFG,plgcfg)
|
||||||
#
|
#
|
||||||
TMPDIR ?= /tmp
|
TMPDIR ?= /tmp
|
||||||
@ -58,28 +59,31 @@ all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
|
||||||
|
|
||||||
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
|
||||||
|
|
||||||
install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
||||||
install -D libvdr-$(PLUGIN1).so $(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION)
|
install -D libvdr-$(PLUGIN1).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION)
|
||||||
install -D libvdr-$(PLUGIN2).so $(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION)
|
install -D libvdr-$(PLUGIN2).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib
|
install: install-lib
|
||||||
|
|
||||||
|
@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
|
|||||||
|
|
||||||
Written by: Udo Richter <udo_richter@gmx.de>
|
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
|
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
|
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.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: svccli.c 2.1 2012/12/27 10:37:57 kls Exp $
|
* $Id: svccli.c 4.1 2018/04/10 13:00:53 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <vdr/interface.h>
|
#include <vdr/interface.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.1.3";
|
static const char *VERSION = "2.4.0";
|
||||||
static const char *DESCRIPTION = "Service demo client";
|
static const char *DESCRIPTION = "Service demo client";
|
||||||
static const char *MAINMENUENTRY = "Service demo";
|
static const char *MAINMENUENTRY = "Service demo";
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ struct AddService_v1_0 {
|
|||||||
int sum;
|
int sum;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- cPluginSvcCli ----------------------------------------------------------
|
// --- cPluginSvcCli ---------------------------------------------------------
|
||||||
|
|
||||||
cOsdObject *cPluginSvcCli::MainMenuAction(void)
|
cOsdObject *cPluginSvcCli::MainMenuAction(void)
|
||||||
{
|
{
|
||||||
|
@ -3,14 +3,14 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: svcsvr.c 2.1 2012/12/27 10:38:19 kls Exp $
|
* $Id: svcsvr.c 4.1 2018/04/10 13:00:57 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <vdr/interface.h>
|
#include <vdr/interface.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.1.3";
|
static const char *VERSION = "2.4.0";
|
||||||
static const char *DESCRIPTION = "Service demo server";
|
static const char *DESCRIPTION = "Service demo server";
|
||||||
|
|
||||||
class cPluginSvcSvr : public cPlugin {
|
class cPluginSvcSvr : public cPlugin {
|
||||||
@ -29,7 +29,7 @@ struct AddService_v1_0 {
|
|||||||
int sum;
|
int sum;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- cPluginSvcSvr ----------------------------------------------------------
|
// --- cPluginSvcSvr ---------------------------------------------------------
|
||||||
|
|
||||||
bool cPluginSvcSvr::Service(const char *Id, void *Data)
|
bool cPluginSvcSvr::Service(const char *Id, void *Data)
|
||||||
{
|
{
|
||||||
|
@ -105,3 +105,59 @@ VDR Plugin 'skincurses' Revision History
|
|||||||
2012-12-27: Version 0.1.13
|
2012-12-27: Version 0.1.13
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-01-12: Version 0.1.14
|
||||||
|
|
||||||
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-03-03: Version 0.1.15
|
||||||
|
|
||||||
|
- The "Recording info" page now displays the name of the channel (if available)
|
||||||
|
from which this recording was taken.
|
||||||
|
|
||||||
|
2013-03-31: Version 2.0.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2015-02-08: Version 2.1.2
|
||||||
|
|
||||||
|
- Added a missing trailing blank in some translations.
|
||||||
|
|
||||||
|
2015-02-19: Version 2.2.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2016-12-22: Version 2.3.2
|
||||||
|
|
||||||
|
- Added cFont::Width(void) to get the default character width and allow stretched
|
||||||
|
font drawing in high level OSDs (dummy for skincurses).
|
||||||
|
- Fixed truncated date/time strings in the skins on multi-byte UTF-8 systems
|
||||||
|
(reported by Sergey Chernyavskiy).
|
||||||
|
|
||||||
|
2018-04-15: Version 2.4.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2019-03-12: Version 2.4.1
|
||||||
|
|
||||||
|
- Changes for ncurses version 6 (thanks to Ulrick Eckhardt).
|
||||||
|
|
||||||
|
2020-05-11: Version 2.4.2
|
||||||
|
|
||||||
|
- Fixed 'Changes for ncurses version 6'.
|
||||||
|
- Reacting to changes in screen size.
|
||||||
|
- Simplified color handling.
|
||||||
|
- Using 'stdscr' directly instead of an additional window.
|
||||||
|
|
||||||
|
2021-07-01: Version 2.4.3
|
||||||
|
|
||||||
|
- The number of errors (if any) of a recording is now displayed in the recording's
|
||||||
|
Info menu.
|
||||||
|
|
||||||
|
2021-12-27: Version 2.6.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 2.16 2012/12/28 10:09:36 kls Exp $
|
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||||
@ -16,9 +16,10 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
|||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
PKG_CONFIG ?= pkg-config
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
||||||
LOCDIR = $(DESTDIR)$(call PKGCFG,locdir)
|
LIBDIR = $(call PKGCFG,libdir)
|
||||||
|
LOCDIR = $(call PKGCFG,locdir)
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
PLGCFG = $(call PKGCFG,plgcfg)
|
||||||
#
|
#
|
||||||
TMPDIR ?= /tmp
|
TMPDIR ?= /tmp
|
||||||
@ -62,14 +63,15 @@ all: $(SOFILE) i18n
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
@ -78,20 +80,23 @@ $(DEPFILE): Makefile
|
|||||||
PODIR = po
|
PODIR = po
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
||||||
I18Nmsgs = $(addprefix $(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
|
||||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||||
|
|
||||||
%.mo: %.po
|
%.mo: %.po
|
||||||
msgfmt -c -o $@ $<
|
@echo MO $@
|
||||||
|
$(Q)msgfmt -c -o $@ $<
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
@echo GT $@
|
||||||
|
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
%.po: $(I18Npot)
|
||||||
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
@echo PO $@
|
||||||
|
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
$(I18Nmsgs): $(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||||
install -D -m644 $< $@
|
install -D -m644 $< $@
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
@ -102,10 +107,11 @@ install-i18n: $(I18Nmsgs)
|
|||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
$(SOFILE): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
install-lib: $(SOFILE)
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib install-i18n
|
install: install-lib install-i18n
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <kls@tvdr.de>
|
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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Klaus Schmidinger <kls@tvdr.de>, 2007
|
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-skincurses 0.1.12\n"
|
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-15 16:07+0200\n"
|
"PO-Revision-Date: 2007-08-15 16:07+0200\n"
|
||||||
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
|
"Last-Translator: Klaus Schmidinger <vdr@tvdr.de>\n"
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -19,11 +19,15 @@ msgstr ""
|
|||||||
msgid "A text only skin"
|
msgid "A text only skin"
|
||||||
msgstr "Eine reine Text-Oberfläche"
|
msgstr "Eine reine Text-Oberfläche"
|
||||||
|
|
||||||
|
msgid "errors"
|
||||||
|
msgstr "Fehler"
|
||||||
|
|
||||||
msgid "Key$Mute"
|
msgid "Key$Mute"
|
||||||
msgstr "Stumm"
|
msgstr "Stumm"
|
||||||
|
|
||||||
|
#. TRANSLATORS: note the trailing blank!
|
||||||
msgid "Volume "
|
msgid "Volume "
|
||||||
msgstr "Lautstärke"
|
msgstr "Lautstärke "
|
||||||
|
|
||||||
msgid "Text mode"
|
msgid "Text mode"
|
||||||
msgstr "Text-Modus"
|
msgstr "Text-Modus"
|
||||||
|
33
PLUGINS/src/skincurses/po/et_EE.po
Normal file
33
PLUGINS/src/skincurses/po/et_EE.po
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# VDR plugin language source file.
|
||||||
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
|
# This file is distributed under the same license as the VDR package.
|
||||||
|
# Arthur Konovalov <artlov@gmail.com>, 2015
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
|
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||||
|
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
||||||
|
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||||
|
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||||
|
"Language: et\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
msgid "A text only skin"
|
||||||
|
msgstr "Tekstipõhine kest"
|
||||||
|
|
||||||
|
msgid "errors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Key$Mute"
|
||||||
|
msgstr "Hääletu"
|
||||||
|
|
||||||
|
#. TRANSLATORS: note the trailing blank!
|
||||||
|
msgid "Volume "
|
||||||
|
msgstr "Helitugevus "
|
||||||
|
|
||||||
|
msgid "Text mode"
|
||||||
|
msgstr "Tekst"
|
@ -1,15 +1,15 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2007
|
# Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>, 2007
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-skincurses 0.1.12\n"
|
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
"PO-Revision-Date: 2007-08-14 20:48+0300\n"
|
||||||
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
"Last-Translator: Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>\n"
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||||
"Language: fi\n"
|
"Language: fi\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -19,9 +19,13 @@ msgstr ""
|
|||||||
msgid "A text only skin"
|
msgid "A text only skin"
|
||||||
msgstr "Tekstipohjainen ulkoasu"
|
msgstr "Tekstipohjainen ulkoasu"
|
||||||
|
|
||||||
|
msgid "errors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Key$Mute"
|
msgid "Key$Mute"
|
||||||
msgstr "Mykistys"
|
msgstr "Mykistys"
|
||||||
|
|
||||||
|
#. TRANSLATORS: note the trailing blank!
|
||||||
msgid "Volume "
|
msgid "Volume "
|
||||||
msgstr "Äänenvoimakkuus "
|
msgstr "Äänenvoimakkuus "
|
||||||
|
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
# Diego Pierotto <vdr-italian@tiscali.it>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-skincurses 0.1.12\n"
|
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||||
"PO-Revision-Date: 2008-01-27 20:35+0100\n"
|
"PO-Revision-Date: 2008-01-27 20:35+0100\n"
|
||||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||||
@ -19,9 +19,13 @@ msgstr ""
|
|||||||
msgid "A text only skin"
|
msgid "A text only skin"
|
||||||
msgstr "Una interfaccia solo testo"
|
msgstr "Una interfaccia solo testo"
|
||||||
|
|
||||||
|
msgid "errors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Key$Mute"
|
msgid "Key$Mute"
|
||||||
msgstr "Muto"
|
msgstr "Muto"
|
||||||
|
|
||||||
|
#. TRANSLATORS: note the trailing blank!
|
||||||
msgid "Volume "
|
msgid "Volume "
|
||||||
msgstr "Volume "
|
msgstr "Volume "
|
||||||
|
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2010
|
# Valdemaras Pipiras <varas@ambernet.lt>, 2010
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-skincurses 0.1.12\n"
|
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||||
"PO-Revision-Date: 2010-02-22 18:18+0200\n"
|
"PO-Revision-Date: 2010-02-22 18:18+0200\n"
|
||||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||||
@ -19,9 +19,13 @@ msgstr ""
|
|||||||
msgid "A text only skin"
|
msgid "A text only skin"
|
||||||
msgstr "Tekstinis apvalkalas"
|
msgstr "Tekstinis apvalkalas"
|
||||||
|
|
||||||
|
msgid "errors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Key$Mute"
|
msgid "Key$Mute"
|
||||||
msgstr "Išjungti garsą"
|
msgstr "Išjungti garsą"
|
||||||
|
|
||||||
|
#. TRANSLATORS: note the trailing blank!
|
||||||
msgid "Volume "
|
msgid "Volume "
|
||||||
msgstr "Garsas "
|
msgstr "Garsas "
|
||||||
|
|
||||||
|
35
PLUGINS/src/skincurses/po/pl_PL.po
Normal file
35
PLUGINS/src/skincurses/po/pl_PL.po
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# VDR plugin language source file.
|
||||||
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
|
# This file is distributed under the same license as the VDR package.
|
||||||
|
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
|
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||||
|
"PO-Revision-Date: 2018-02-19 01:02+0100\n"
|
||||||
|
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
||||||
|
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||||
|
"Language: pl_PL\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||||
|
"X-Generator: Poedit 2.0.6\n"
|
||||||
|
|
||||||
|
msgid "A text only skin"
|
||||||
|
msgstr "Skóra tekstowa"
|
||||||
|
|
||||||
|
msgid "errors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Key$Mute"
|
||||||
|
msgstr "Wycisz"
|
||||||
|
|
||||||
|
#. TRANSLATORS: note the trailing blank!
|
||||||
|
msgid "Volume "
|
||||||
|
msgstr "Głośność "
|
||||||
|
|
||||||
|
msgid "Text mode"
|
||||||
|
msgstr "Tryb tekstowy"
|
@ -1,13 +1,13 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
# Alexander Gross <Bikalexander@gmail.com>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-skincurses 0.1.12\n"
|
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||||
"PO-Revision-Date: 2008-03-14 00:21+0100\n"
|
"PO-Revision-Date: 2008-03-14 00:21+0100\n"
|
||||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
|
||||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||||
@ -20,11 +20,15 @@ msgstr ""
|
|||||||
msgid "A text only skin"
|
msgid "A text only skin"
|
||||||
msgstr "¿àÞáâÞ âÕÚáâÞÒëÙ ØÝâÕàäÕÙá"
|
msgstr "¿àÞáâÞ âÕÚáâÞÒëÙ ØÝâÕàäÕÙá"
|
||||||
|
|
||||||
|
msgid "errors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Key$Mute"
|
msgid "Key$Mute"
|
||||||
msgstr "²ëÚÛ. ÓàÞÜÚÞáâì"
|
msgstr "²ëÚÛ. ÓàÞÜÚÞáâì"
|
||||||
|
|
||||||
|
#. TRANSLATORS: note the trailing blank!
|
||||||
msgid "Volume "
|
msgid "Volume "
|
||||||
msgstr "³àÞÜÚÞáâì"
|
msgstr "³àÞÜÚÞáâì "
|
||||||
|
|
||||||
msgid "Text mode"
|
msgid "Text mode"
|
||||||
msgstr "ÀÕÖØÜ âÕÚáâÐ"
|
msgstr "ÀÕÖØÜ âÕÚáâÐ"
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2008 Klaus Schmidinger <kls@tvdr.de>
|
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
||||||
# This file is distributed under the same license as the VDR package.
|
# This file is distributed under the same license as the VDR package.
|
||||||
# Klaus Schmidinger <kls@tvdr.de>, 2007
|
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-skincurses 0.1.12\n"
|
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
||||||
"PO-Revision-Date: 2009-09-30 12:52+0100\n"
|
"PO-Revision-Date: 2009-09-30 12:52+0100\n"
|
||||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||||
@ -19,11 +19,15 @@ msgstr ""
|
|||||||
msgid "A text only skin"
|
msgid "A text only skin"
|
||||||
msgstr "Iba text vzhµadu"
|
msgstr "Iba text vzhµadu"
|
||||||
|
|
||||||
|
msgid "errors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Key$Mute"
|
msgid "Key$Mute"
|
||||||
msgstr "Stlmi» zvuk"
|
msgstr "Stlmi» zvuk"
|
||||||
|
|
||||||
|
#. TRANSLATORS: note the trailing blank!
|
||||||
msgid "Volume "
|
msgid "Volume "
|
||||||
msgstr "Hlasitos»"
|
msgstr "Hlasitos» "
|
||||||
|
|
||||||
msgid "Text mode"
|
msgid "Text mode"
|
||||||
msgstr "Textový re¾im"
|
msgstr "Textový re¾im"
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: skincurses.c 2.10 2012/12/27 10:38:43 kls Exp $
|
* $Id: skincurses.c 5.1 2021/07/01 15:40:46 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
@ -12,7 +12,7 @@
|
|||||||
#include <vdr/skins.h>
|
#include <vdr/skins.h>
|
||||||
#include <vdr/videodir.h>
|
#include <vdr/videodir.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.1.13";
|
static const char *VERSION = "2.4.3";
|
||||||
static const char *DESCRIPTION = trNOOP("A text only skin");
|
static const char *DESCRIPTION = trNOOP("A text only skin");
|
||||||
static const char *MAINMENUENTRY = NULL;
|
static const char *MAINMENUENTRY = NULL;
|
||||||
|
|
||||||
@ -20,6 +20,7 @@ static const char *MAINMENUENTRY = NULL;
|
|||||||
|
|
||||||
class cCursesFont : public cFont {
|
class cCursesFont : public cFont {
|
||||||
public:
|
public:
|
||||||
|
virtual int Width(void) const { return 1; }
|
||||||
virtual int Width(uint c) const { return 1; }
|
virtual int Width(uint c) const { return 1; }
|
||||||
virtual int Width(const char *s) const { return s ? Utf8StrLen(s) : 0; }
|
virtual int Width(const char *s) const { return s ? Utf8StrLen(s) : 0; }
|
||||||
virtual int Height(void) const { return 1; }
|
virtual int Height(void) const { return 1; }
|
||||||
@ -59,9 +60,7 @@ static int ScOsdHeight = 20;
|
|||||||
class cCursesOsd : public cOsd {
|
class cCursesOsd : public cOsd {
|
||||||
private:
|
private:
|
||||||
WINDOW *savedRegion;
|
WINDOW *savedRegion;
|
||||||
WINDOW *window;
|
cVector<int> colorPairs;
|
||||||
enum { MaxColorPairs = 16 };
|
|
||||||
int colorPairs[MaxColorPairs];
|
|
||||||
void SetColor(int colorFg, int colorBg = clrBackground);
|
void SetColor(int colorFg, int colorBg = clrBackground);
|
||||||
public:
|
public:
|
||||||
cCursesOsd(int Left, int Top);
|
cCursesOsd(int Left, int Top);
|
||||||
@ -78,40 +77,34 @@ cCursesOsd::cCursesOsd(int Left, int Top)
|
|||||||
{
|
{
|
||||||
savedRegion = NULL;
|
savedRegion = NULL;
|
||||||
|
|
||||||
memset(colorPairs, 0x00, sizeof(colorPairs));
|
|
||||||
start_color();
|
start_color();
|
||||||
leaveok(stdscr, true);
|
leaveok(stdscr, true);
|
||||||
|
refresh(); // to react on changes to screen size
|
||||||
|
|
||||||
window = subwin(stdscr, ScOsdHeight, ScOsdWidth, 0, 0);
|
int begy, begx;
|
||||||
syncok(window, true);
|
int maxy, maxx;
|
||||||
|
getmaxyx(stdscr, maxy, maxx);
|
||||||
|
getbegyx(stdscr, begy, begx);
|
||||||
|
ScOsdWidth = maxx - begx;
|
||||||
|
ScOsdHeight = maxy - begy;
|
||||||
}
|
}
|
||||||
|
|
||||||
cCursesOsd::~cCursesOsd()
|
cCursesOsd::~cCursesOsd()
|
||||||
{
|
{
|
||||||
if (window) {
|
erase();
|
||||||
werase(window);
|
Flush();
|
||||||
Flush();
|
|
||||||
delwin(window);
|
|
||||||
window = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::SetColor(int colorFg, int colorBg)
|
void cCursesOsd::SetColor(int colorFg, int colorBg)
|
||||||
{
|
{
|
||||||
int color = (colorBg << 16) | colorFg | 0x80000000;
|
int color = (colorBg << 16) | colorFg | 0x80000000;
|
||||||
for (int i = 0; i < MaxColorPairs; i++) {
|
int i = colorPairs.IndexOf(color);
|
||||||
if (!colorPairs[i]) {
|
if (i < 0) {
|
||||||
colorPairs[i] = color;
|
colorPairs.Append(color);
|
||||||
init_pair(i + 1, colorFg, colorBg);
|
i = colorPairs.Size() - 1;
|
||||||
//XXX??? attron(COLOR_PAIR(WHITE_ON_BLUE));
|
init_pair(i + 1, colorFg, colorBg);
|
||||||
wattrset(window, COLOR_PAIR(i + 1));
|
}
|
||||||
break;
|
attrset(COLOR_PAIR(i + 1));
|
||||||
}
|
|
||||||
else if (color == colorPairs[i]) {
|
|
||||||
wattrset(window, COLOR_PAIR(i + 1));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||||
@ -121,13 +114,14 @@ void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
|||||||
savedRegion = NULL;
|
savedRegion = NULL;
|
||||||
}
|
}
|
||||||
savedRegion = newwin(y2 - y1 + 1, x2 - x1 + 1, y1, x1);
|
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)
|
void cCursesOsd::RestoreRegion(void)
|
||||||
{
|
{
|
||||||
if (savedRegion) {
|
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);
|
delwin(savedRegion);
|
||||||
savedRegion = NULL;
|
savedRegion = NULL;
|
||||||
}
|
}
|
||||||
@ -167,18 +161,22 @@ void cCursesOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetColor(ColorFg, ColorBg);
|
SetColor(ColorFg, ColorBg);
|
||||||
wmove(window, y, x); // ncurses wants 'y' before 'x'!
|
mvaddnstr(y, x, s, Width ? Width : ScOsdWidth - x);
|
||||||
waddnstr(window, s, Width ? Width : ScOsdWidth - x);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
|
void cCursesOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
|
||||||
{
|
{
|
||||||
SetColor(Color, Color);
|
SetColor(Color, Color);
|
||||||
for (int y = y1; y <= y2; y++) {
|
int dx = x2 - x1;
|
||||||
wmove(window, y, x1); // ncurses wants 'y' before 'x'!
|
int dy = y2 - y1;
|
||||||
whline(window, ' ', x2 - x1 + 1);
|
if (dx >= dy) {
|
||||||
}
|
for (int y = y1; y <= y2; y++)
|
||||||
wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work
|
mvhline(y, x1, ' ', dx + 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (int x = x1; x <= x2; x++)
|
||||||
|
mvvline(y1, x, ' ', dy + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::Flush(void)
|
void cCursesOsd::Flush(void)
|
||||||
@ -407,8 +405,7 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
|||||||
return;
|
return;
|
||||||
int y = 2;
|
int y = 2;
|
||||||
cTextScroller ts;
|
cTextScroller ts;
|
||||||
char t[32];
|
cString t = cString::sprintf("%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
||||||
snprintf(t, sizeof(t), "%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||||
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
if (Event->Vps() && Event->Vps() != Event->StartTime()) {
|
||||||
cString buffer = cString::sprintf(" VPS: %s", *Event->GetVpsString());
|
cString buffer = cString::sprintf(" VPS: %s", *Event->GetVpsString());
|
||||||
@ -447,13 +444,21 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
|
|||||||
const cRecordingInfo *Info = Recording->Info();
|
const cRecordingInfo *Info = Recording->Info();
|
||||||
int y = 2;
|
int y = 2;
|
||||||
cTextScroller ts;
|
cTextScroller ts;
|
||||||
char t[32];
|
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
|
||||||
snprintf(t, sizeof(t), "%s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()));
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
|
||||||
y += ts.Height();
|
y += ts.Height();
|
||||||
|
int xt = ScOsdWidth;
|
||||||
if (Info->GetEvent()->ParentalRating()) {
|
if (Info->GetEvent()->ParentalRating()) {
|
||||||
cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
|
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;
|
y += 1;
|
||||||
const char *Title = Info->Title();
|
const char *Title = Info->Title();
|
||||||
@ -615,6 +620,7 @@ void cSkinCursesDisplayVolume::SetVolume(int Current, int Total, bool Mute)
|
|||||||
osd->DrawText(0, 0, tr("Key$Mute"), clrGreen, clrBackground, &Font);
|
osd->DrawText(0, 0, tr("Key$Mute"), clrGreen, clrBackground, &Font);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// TRANSLATORS: note the trailing blank!
|
||||||
const char *Prompt = tr("Volume ");
|
const char *Prompt = tr("Volume ");
|
||||||
int l = Utf8StrLen(Prompt);
|
int l = Utf8StrLen(Prompt);
|
||||||
int p = (ScOsdWidth - l) * Current / Total;
|
int p = (ScOsdWidth - l) * Current / Total;
|
||||||
@ -827,12 +833,8 @@ bool cPluginSkinCurses::ProcessArgs(int argc, char *argv[])
|
|||||||
bool cPluginSkinCurses::Initialize(void)
|
bool cPluginSkinCurses::Initialize(void)
|
||||||
{
|
{
|
||||||
// Initialize any background activities the plugin shall perform.
|
// Initialize any background activities the plugin shall perform.
|
||||||
WINDOW *w = initscr();
|
if (initscr())
|
||||||
if (w) {
|
|
||||||
ScOsdWidth = w->_maxx - w->_begx + 1;
|
|
||||||
ScOsdHeight = w->_maxy - w->_begy + 1;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,3 +52,34 @@ VDR Plugin 'status' Revision History
|
|||||||
2012-12-27: Version 0.3.2
|
2012-12-27: Version 0.3.2
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-01-12: Version 0.3.3
|
||||||
|
|
||||||
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-03-31: Version 2.0.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2015-02-19: Version 2.2.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2018-04-15: Version 2.4.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2021-12-27: Version 2.6.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2025-02-10: Version 2.6.1
|
||||||
|
|
||||||
|
- Added cStatus::OsdItem2().
|
||||||
|
- Activated logging of OsdItem2().
|
||||||
|
- Added cStatus::OsdCurrentItem2().
|
||||||
|
- Added cStatus::OsdStatusMessage2().
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 2.13 2012/12/29 10:29:20 kls Exp $
|
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||||
@ -16,8 +16,9 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
|||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
PKG_CONFIG ?= pkg-config
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
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)
|
PLGCFG = $(call PKGCFG,plgcfg)
|
||||||
#
|
#
|
||||||
TMPDIR ?= /tmp
|
TMPDIR ?= /tmp
|
||||||
@ -61,24 +62,26 @@ all: $(SOFILE)
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
$(SOFILE): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
install-lib: $(SOFILE)
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib
|
install: install-lib
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <kls@tvdr.de>
|
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
|
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
|
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.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: status.c 2.2 2012/12/27 10:39:26 kls Exp $
|
* $Id: status.c 5.4 2025/02/12 21:18:53 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
#include <vdr/status.h>
|
#include <vdr/status.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.3.2";
|
static const char *VERSION = "2.6.1";
|
||||||
static const char *DESCRIPTION = "Status monitor test";
|
static const char *DESCRIPTION = "Status monitor test";
|
||||||
static const char *MAINMENUENTRY = NULL;
|
static const char *MAINMENUENTRY = NULL;
|
||||||
|
|
||||||
@ -27,10 +27,10 @@ protected:
|
|||||||
virtual void SetSubtitleTrack(int Index, const char * const *Tracks);
|
virtual void SetSubtitleTrack(int Index, const char * const *Tracks);
|
||||||
virtual void OsdClear(void);
|
virtual void OsdClear(void);
|
||||||
virtual void OsdTitle(const char *Title);
|
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 OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
|
||||||
virtual void OsdItem(const char *Text, int Index);
|
virtual void OsdItem2(const char *Text, int Index, bool Selectable);
|
||||||
virtual void OsdCurrentItem(const char *Text);
|
virtual void OsdCurrentItem2(const char *Text, int Index);
|
||||||
virtual void OsdTextItem(const char *Text, bool Scroll);
|
virtual void OsdTextItem(const char *Text, bool Scroll);
|
||||||
virtual void OsdChannel(const char *Text);
|
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);
|
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);
|
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)
|
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);
|
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)
|
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
||||||
|
@ -17,3 +17,27 @@ VDR Plugin 'svdrpdemo' Revision History
|
|||||||
2012-12-27: Version 0.0.4
|
2012-12-27: Version 0.0.4
|
||||||
|
|
||||||
- Adapted Makefile to changes introduced in recent VDR versions.
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-01-12: Version 0.0.5
|
||||||
|
|
||||||
|
- Adapted Makefile to changes introduced in recent VDR versions.
|
||||||
|
|
||||||
|
2013-03-31: Version 2.0.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2015-02-19: Version 2.2.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2018-04-15: Version 2.4.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
|
||||||
|
2021-12-27: Version 2.6.0
|
||||||
|
|
||||||
|
- Official release.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 2.13 2012/12/29 10:29:24 kls Exp $
|
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
||||||
|
|
||||||
# The official name of this plugin.
|
# The official name of this plugin.
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||||
@ -16,8 +16,9 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
|
|||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
|
PKG_CONFIG ?= pkg-config
|
||||||
LIBDIR = $(DESTDIR)$(call PKGCFG,libdir)
|
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)
|
PLGCFG = $(call PKGCFG,plgcfg)
|
||||||
#
|
#
|
||||||
TMPDIR ?= /tmp
|
TMPDIR ?= /tmp
|
||||||
@ -61,24 +62,26 @@ all: $(SOFILE)
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
@echo CC $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
$(SOFILE): $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@echo LD $@
|
||||||
|
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
install-lib: $(SOFILE)
|
||||||
install -D $^ $(LIBDIR)/$^.$(APIVERSION)
|
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||||
|
|
||||||
install: install-lib
|
install: install-lib
|
||||||
|
|
||||||
|
@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
|
|||||||
|
|
||||||
Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
|
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
|
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
|
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.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: svdrpdemo.c 2.1 2012/12/27 10:39:48 kls Exp $
|
* $Id: svdrpdemo.c 4.1 2018/04/10 13:01:07 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.0.4";
|
static const char *VERSION = "2.4.0";
|
||||||
static const char *DESCRIPTION = "How to add SVDRP support to a plugin";
|
static const char *DESCRIPTION = "How to add SVDRP support to a plugin";
|
||||||
|
|
||||||
class cPluginSvdrpdemo : public cPlugin {
|
class cPluginSvdrpdemo : public cPlugin {
|
||||||
|
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