mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Compare commits
No commits in common. "master" and "1.7.4" have entirely different histories.
1453
CONTRIBUTORS
1453
CONTRIBUTORS
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
|||||||
#!/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;
|
|
||||||
}
|
|
||||||
}
|
|
238
INSTALL
238
INSTALL
@ -1,7 +1,7 @@
|
|||||||
Installation of the Video Disk Recorder
|
Installation of the Video Disk Recorder
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
Version 2.7
|
Version 1.7
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
Compiling and running the program:
|
Compiling and running the program:
|
||||||
@ -16,14 +16,14 @@ to Make.config and adjust the definition of DVBDIR in that file.
|
|||||||
|
|
||||||
Refer to http://linuxtv.org for more information about the Linux-DVB driver.
|
Refer to http://linuxtv.org for more information about the Linux-DVB driver.
|
||||||
|
|
||||||
VDR requires the Linux-DVB driver version that supports the S2API interface.
|
VDR requires the Linux-DVB driver version dated 2003-08-23 or higher
|
||||||
|
to work properly.
|
||||||
|
|
||||||
You will also need to install the following libraries, as well as their
|
You will also need to install the following libraries, as well as their
|
||||||
"devel" packages to get the necessary header files for compiling VDR:
|
"devel" packages to get the necessary header files for compiling VDR:
|
||||||
|
|
||||||
fontconfig
|
fontconfig
|
||||||
freetype2
|
freetype2
|
||||||
fribidi (see "BiDi support" below)
|
|
||||||
gettext
|
gettext
|
||||||
libcap
|
libcap
|
||||||
libjpeg
|
libjpeg
|
||||||
@ -36,10 +36,6 @@ and type 'make'. This should produce an executable file
|
|||||||
named 'vdr', which can be run after the DVB driver has been
|
named 'vdr', which can be run after the DVB driver has been
|
||||||
installed.
|
installed.
|
||||||
|
|
||||||
If you want to build a 32-bit version of VDR on a 64-bit machine, you can
|
|
||||||
use 'make M32=1' to do so. Note that you also need to have a Make.config file
|
|
||||||
(derived from Make.config.template) to make this work.
|
|
||||||
|
|
||||||
IMPORTANT: See "Configuration files" below for information on how
|
IMPORTANT: See "Configuration files" below for information on how
|
||||||
========= to set up the configuration files at the proper location!
|
========= to set up the configuration files at the proper location!
|
||||||
|
|
||||||
@ -47,21 +43,22 @@ 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 a LIRC compatible infrared remote control receiver you can define
|
If you have an infrared remote control unit you can define the REMOTE macro
|
||||||
the REMOTE macro to one of the following values in the 'make' call to make
|
to one of the following values in the 'make' call to make the respective control
|
||||||
the respective control the default:
|
the default:
|
||||||
|
|
||||||
|
REMOTE=RCU control via the "Remote Control Unit" receiver
|
||||||
|
(see http://www.cadsoft.de/vdr/remote.htm)
|
||||||
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)
|
||||||
|
|
||||||
Alternatively you can use the '--lirc' option at runtime.
|
Alternatively you can use the '--rcu' or '--lirc' options at runtime.
|
||||||
This option accepts an optional path to the remote control device,
|
These options accept an optional path to the remote control device,
|
||||||
the default of which can be set via the LIRC_DEVICE macro.
|
the defaults of which can be set via the RCU_DEVICE and LIRC_DEVICE macros,
|
||||||
|
respectively.
|
||||||
|
|
||||||
If you want to make your video directory available to other machines that
|
If your video directory will be on a VFAT partition, you can call VDR with
|
||||||
have limitations on directory name lengths and/or allowed characters in
|
the command line option '--vfat'.
|
||||||
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,
|
||||||
@ -70,18 +67,19 @@ messages (tail -f /var/log/messages) to see if there are any problems.
|
|||||||
|
|
||||||
The program can be controlled via a network connection to its SVDRP
|
The program can be controlled via a network connection to its SVDRP
|
||||||
port ("Simple Video Disk Recorder Protocol"). By default, it listens
|
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 2001 (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.
|
||||||
@ -93,33 +91,6 @@ 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
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Basically VDR works according to the DVB standard, but there are countries/providers
|
|
||||||
that use other standards, which in some details deviate from the DVB standard.
|
|
||||||
This makes it necessary to handle things differently in some areas, depending on
|
|
||||||
which standard is actually used. If this is the case in your area, you may need
|
|
||||||
to adjust the option "DVB/Standard compliance" in the Setup menu accordingly.
|
|
||||||
|
|
||||||
Locale
|
Locale
|
||||||
------
|
------
|
||||||
|
|
||||||
@ -141,32 +112,18 @@ in English.
|
|||||||
Note that for VDR's internationalized texts to work, the LANG environment
|
Note that for VDR's internationalized texts to work, the LANG environment
|
||||||
variable must be set to a valid locale!
|
variable must be set to a valid locale!
|
||||||
|
|
||||||
BiDi support
|
Workaround for providers not encoding their EPG data correctly
|
||||||
------------
|
--------------------------------------------------------------
|
||||||
|
|
||||||
Some languages are written right-to-left. In order to display such languages
|
According to "ETSI EN 300 468" the default character set fo SI data is
|
||||||
correctly, you need to build VDR with BIDI=1. This will link to the "fribidi"
|
|
||||||
library and implement a function that prepares bidirectional texts to be
|
|
||||||
displayed correctly. Since BiDi support adds some runtime overhead by requiring
|
|
||||||
additional memory allocation and copying, this feature is not compiled in
|
|
||||||
by default, so that users that have no need for this don't get any overhead.
|
|
||||||
|
|
||||||
Workaround for providers not encoding their DVB SI table strings correctly
|
|
||||||
--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
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 using the command line option --chartab with something
|
do this by setting the environment variable VDR_CHARSET_OVERRIDE to something
|
||||||
like ISO-8859-9.
|
like ISO-8859-9.
|
||||||
|
|
||||||
Start script with automatic restart in case of hangups:
|
Automatic restart in case of hangups:
|
||||||
-------------------------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
The VDR source directory contains a 'runvdr.template'. Just copy it as 'runvdr'
|
|
||||||
into your /usr/bin or /usr/local/bin directory and adjust it to your particular
|
|
||||||
requirements. (See the comments inside the script for more information.)
|
|
||||||
|
|
||||||
If you run VDR using the 'runvdr' shell script it will use the built-in
|
If you run VDR using the 'runvdr' shell script it will use the built-in
|
||||||
watchdog timer to restart the program in case something happens that
|
watchdog timer to restart the program in case something happens that
|
||||||
@ -175,6 +132,9 @@ call to the VDR program, be sure to NOT use the '-d' option! Otherwise
|
|||||||
VDR will go into 'daemon' mode and the initial program call will return
|
VDR will go into 'daemon' mode and the initial program call will return
|
||||||
immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
|
immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
|
||||||
option to run the actual 'vdr' program under a different user id.
|
option to run the actual 'vdr' program under a different user id.
|
||||||
|
Note that the 'runvdr' script needs to be adjusted to your particular
|
||||||
|
requirements before you can actually use it. See the comments inside
|
||||||
|
the script for more information.
|
||||||
|
|
||||||
Setting the system time:
|
Setting the system time:
|
||||||
------------------------
|
------------------------
|
||||||
@ -264,27 +224,19 @@ 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
|
||||||
at various stages of handling recordings.
|
before and after a recording is performed, and after an editing process
|
||||||
|
has finished.
|
||||||
|
|
||||||
The program will be called with two or three string parameters.
|
The program will be called with two string parameters. The first parameter
|
||||||
The first parameter is one of
|
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*
|
|
||||||
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 and third parameter (if present) contain the full name of the recording's
|
and the second parameter contains 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).
|
||||||
See the example below for the exact meaning of these parameters.
|
In the "edited" case it will be the name of the edited version.
|
||||||
|
|
||||||
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
|
||||||
@ -300,38 +252,11 @@ 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"
|
|
||||||
;;
|
|
||||||
deleted)
|
|
||||||
echo "Deleted recording $2"
|
|
||||||
;;
|
|
||||||
copying)
|
|
||||||
echo "Destination recording $2"
|
|
||||||
echo "Source recording $3"
|
|
||||||
;;
|
|
||||||
copied)
|
|
||||||
echo "Destination recording $2"
|
|
||||||
echo "Source recording $3"
|
|
||||||
;;
|
|
||||||
renamed)
|
|
||||||
echo "New name of recording $2"
|
|
||||||
echo "Old name of recording $3"
|
|
||||||
;;
|
|
||||||
moved)
|
|
||||||
echo "New path of recording $2"
|
|
||||||
echo "Old path of recording $3"
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "ERROR: unknown state: $1"
|
echo "ERROR: unknown state: $1"
|
||||||
@ -357,7 +282,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 "/srv/vdr/video". Please
|
All recordings are written into directories below "/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
|
||||||
@ -368,22 +293,39 @@ multiple slashes).
|
|||||||
Note that the file system need not be 64-bit proof, since the 'vdr'
|
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 video data.
|
||||||
Either use one of today's large terabyte disks (preferably with a backup disk
|
|
||||||
in a RAID-1 array), or use something like "mhddfs" to group several disks
|
|
||||||
into one large volume.
|
|
||||||
|
|
||||||
Note that you should not copy any non-VDR files into the video directory,
|
If you have more than one disk and don't want to combine them to form
|
||||||
|
one large logical volume, you can set up several video directories as
|
||||||
|
mount points for these disks. All of these directories must have the
|
||||||
|
same basic name and must end with a numeric part, which starts at 0 for
|
||||||
|
the main directory and has increasing values for the rest of the
|
||||||
|
directories. For example
|
||||||
|
|
||||||
|
/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.
|
||||||
well as other stuff, you may want to create a subdirectory for VDR, as in
|
|
||||||
|
|
||||||
/mydisk/video
|
|
||||||
|
|
||||||
and put your other stuff into, say,
|
|
||||||
|
|
||||||
/mydisk/otherstuff
|
|
||||||
|
|
||||||
If your video directory is mounted via a Samba share, and you are experiencing
|
If your video directory is mounted via a Samba share, and you are experiencing
|
||||||
problems with replaying in fast forward mode, you can comment out the line
|
problems with replaying in fast forward mode, you can comment out the line
|
||||||
@ -397,11 +339,9 @@ 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
|
||||||
spread around the system according to the FHS ("File system Hierarchy Standard").
|
assumed to be located in the video directory, but a different directory
|
||||||
If you prefer to have VDR built to run locally under the VDR source tree,
|
can be used with the '-c' option. Plugins assume their configuration files
|
||||||
you can copy the file Make.config.template to Make.config and set the parameter
|
in a subdirectory called "plugins" of this directory.
|
||||||
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.
|
||||||
@ -428,28 +368,6 @@ accessed using DiSEqC, you have to go to the "Setup" menu and set the "DiSEqC"
|
|||||||
parameter to "on". You also need to set up the file 'diseqc.conf' to properly
|
parameter to "on". You also need to set up the file 'diseqc.conf' to properly
|
||||||
access your DiSEqC equipment (see man vdr(5) for details).
|
access your DiSEqC equipment (see man vdr(5) for details).
|
||||||
|
|
||||||
A special form of DiSEqC is used to connect several receivers to one signal
|
|
||||||
source using only a single cable. This method, known as "Satellite Channel Routing"
|
|
||||||
according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
|
|
||||||
Distribution", "Channel Stacking System" or "Single Cable Interface") or
|
|
||||||
EN50607 (aka "JESS") uses the file "scr.conf" to specify which SCR channels
|
|
||||||
use which user band frequency.
|
|
||||||
|
|
||||||
If DVB-S devices need to be connected to the same satellite cable, but no
|
|
||||||
"Satellite Channel Routing" is available, they can be set to be "bonded" in
|
|
||||||
the Setup/LNB menu. Bonded devices can only be tuned to the same polarization
|
|
||||||
and frequency band, which reduces the number of potentially receivable channels.
|
|
||||||
|
|
||||||
Note that it doesn't make sense to use "Satellite Channel Routing" and
|
|
||||||
"Device Bonding" at the same time with the same devices. If you use either
|
|
||||||
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
|
|
||||||
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):
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
|
|
||||||
@ -484,17 +402,19 @@ for a detailed description).
|
|||||||
|
|
||||||
The recommended PC key assignments are:
|
The recommended PC key assignments are:
|
||||||
|
|
||||||
Up, Down, Left, Right Cursor keys
|
Up, Down, Left, Right Crsr keys in numeric block
|
||||||
Menu 'Home'
|
Menu 'Home' in numeric block
|
||||||
Ok 'Enter'
|
Ok 'Enter'
|
||||||
Back 'Backspace'
|
Back 'End' in numeric block
|
||||||
Red, Green, Yellow, Blue 'F1'..'F4'
|
Red, Green, Yellow, Blue 'F1'..'F4'
|
||||||
0..9 '0'..'9'
|
0..9 '0'..'9' in top row
|
||||||
Volume+/- 'PgUp', 'PgDn'
|
Power 'P'
|
||||||
Mute 'F10'
|
Volume+/- '+', '-'
|
||||||
|
Mute 'm'
|
||||||
|
|
||||||
If you want to change your key assignments later, simply delete the file
|
If you prefer different key assignments, or if the default doesn't work for
|
||||||
'remote.conf' and restart 'vdr' to get into learning mode.
|
your keyboard, simply delete the file 'remote.conf' and restart 'vdr' to get
|
||||||
|
into learning mode.
|
||||||
|
|
||||||
Generating source code documentation:
|
Generating source code documentation:
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
571
MANUAL
571
MANUAL
@ -1,7 +1,7 @@
|
|||||||
Video Disk Recorder User's Manual
|
Video Disk Recorder User's Manual
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
Version 2.7
|
Version 1.6
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
* Remote Control Keys
|
* Remote Control Keys
|
||||||
@ -24,7 +24,7 @@ Version 2.7
|
|||||||
Green - Audio New New Ins/Ovr Rewind Skip -60s -
|
Green - Audio New New Ins/Ovr Rewind Skip -60s -
|
||||||
Yellow - Pause live Delete Delete Delete Delete Skip +60s -
|
Yellow - Pause live Delete Delete Delete Delete Skip +60s -
|
||||||
Blue - Stop/Resume Mark Info - Info Stop -
|
Blue - Stop/Resume Mark Info - Info Stop -
|
||||||
0..9 Ch select - Sort(2) Day(3) Numeric inp. Sort/Exec cmd(1) Editing -
|
0..9 Ch select - Sort(2) Day(3) Numeric inp. Exec cmd(1) Editing -
|
||||||
|
|
||||||
In a numerical input field (like the response to a CAM enquiry) the keys 0..9
|
In a numerical input field (like the response to a CAM enquiry) the keys 0..9
|
||||||
are used to enter the data, and the Left key can be used to delete the last
|
are used to enter the data, and the Left key can be used to delete the last
|
||||||
@ -39,7 +39,6 @@ Version 2.7
|
|||||||
|
|
||||||
Info display information on the currently viewed programme or recording,
|
Info display information on the currently viewed programme or recording,
|
||||||
or on the current item in a menu
|
or on the current item in a menu
|
||||||
Play/Pause combined key to resume or pause replay, or pause live video
|
|
||||||
Play resume normal replay
|
Play resume normal replay
|
||||||
Pause pause replay or live video
|
Pause pause replay or live video
|
||||||
Stop stop replay
|
Stop stop replay
|
||||||
@ -50,8 +49,8 @@ Version 2.7
|
|||||||
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 (live view), next error (replay)
|
Channel+ channel up
|
||||||
Channel- channel down (live view), previous error (replay)
|
Channel- channel down
|
||||||
PrevChannel previous channel
|
PrevChannel previous channel
|
||||||
|
|
||||||
Power shutdown
|
Power shutdown
|
||||||
@ -82,7 +81,7 @@ Version 2.7
|
|||||||
Yellow Info
|
Yellow Info
|
||||||
Blue Timers menu
|
Blue Timers menu
|
||||||
|
|
||||||
(1) See "Sort Recordings" and "Processing Recordings" below.
|
(1) See "Processing Recordings" below.
|
||||||
(2) In the "Channels" menu the '0' key switches the sort mode through "by number",
|
(2) In the "Channels" menu the '0' key switches the sort mode through "by number",
|
||||||
"by name" and "by provider". Other numeric input positions the cursor to
|
"by name" and "by provider". Other numeric input positions the cursor to
|
||||||
the channel with the number entered so far. If there is no channel with that
|
the channel with the number entered so far. If there is no channel with that
|
||||||
@ -90,7 +89,7 @@ Version 2.7
|
|||||||
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 "Edit timer" menu, when on the "Day" item, the '0' key toggles between
|
(3) In the "Timers" 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 +263,7 @@ Version 2.7
|
|||||||
|
|
||||||
* Pausing live video
|
* Pausing live video
|
||||||
|
|
||||||
If you want to pause the live programme you are just watching, simply press
|
If you want to pause the live programme you are just watching, simple 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,9 +275,6 @@ Version 2.7
|
|||||||
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
|
||||||
|
|
||||||
@ -305,14 +301,6 @@ Version 2.7
|
|||||||
A previously stopped playback session can be resumed by pressing the "Blue"
|
A previously stopped playback session can be resumed by pressing the "Blue"
|
||||||
key in the "VDR" menu.
|
key in the "VDR" menu.
|
||||||
|
|
||||||
* Sort Recordings
|
|
||||||
|
|
||||||
Within the "Recordings" menu, pressing the '0' key toggles sorting between
|
|
||||||
"by time" and "by name". The selected sort mode is stored separately for each
|
|
||||||
folder (provided you have write access to that folder).
|
|
||||||
If a folder is newly created by a repeating timer, the sort mode for that
|
|
||||||
folder is initially set to "by time".
|
|
||||||
|
|
||||||
* Processing Recordings
|
* Processing Recordings
|
||||||
|
|
||||||
The configuration file 'reccmds.conf' can be used to define system commands
|
The configuration file 'reccmds.conf' can be used to define system commands
|
||||||
@ -366,35 +354,18 @@ Version 2.7
|
|||||||
- 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.
|
||||||
- 1, 3 Move an editing mark back and forward in "adaptive" mode. Pressing
|
- 4, 6 Move an editing mark back and forward. You need to first jump to
|
||||||
either of these keys for the first time moves the mark 120 seconds
|
an editing mark for this to work.
|
||||||
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.
|
||||||
first or last mark, or if there are no marks at all, these keys
|
|
||||||
jump to the very beginning or end, respectively, of the recording.
|
|
||||||
- 8 Positions replay at a point 3 seconds before the current or next
|
- 8 Positions replay at a point 3 seconds before the current or next
|
||||||
"begin" mark and starts replay.
|
"start" mark and starts replay.
|
||||||
- 2 Starts the actual cutting process.
|
- 2 Start 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 "start"
|
||||||
mark, and a triangle at the bottom means that this is an "end" mark.
|
mark, and a triangle at the bottom means that this is an "end" mark.
|
||||||
The cutting process will save all video data between "begin" and "end" marks
|
The cutting process will save all video data between "start" and "end" marks
|
||||||
into a new file (the original recording remains untouched). The new file will
|
into a new file (the original recording remains untouched). The new file will
|
||||||
have the same name as the original recording, preceded with a '%' character
|
have the same name as the original recording, preceded with a '%' character
|
||||||
(imagine the '%' somehow looking like a pair of scissors ;-). Red bars in the
|
(imagine the '%' somehow looking like a pair of scissors ;-). Red bars in the
|
||||||
@ -403,7 +374,7 @@ Version 2.7
|
|||||||
|
|
||||||
The video sequences to be saved by the cutting process are determined by an
|
The video sequences to be saved by the cutting process are determined by an
|
||||||
"even/odd" algorithm. This means that every odd numbered editing mark (i.e.
|
"even/odd" algorithm. This means that every odd numbered editing mark (i.e.
|
||||||
1, 3, 5,...) represents a "begin" mark, while every even numbered mark (2, 4,
|
1, 3, 5,...) represents a "start" mark, while every even numbered mark (2, 4,
|
||||||
6,...) is an "end" mark. Inserting or toggling a mark on or off automatically
|
6,...) is an "end" mark. Inserting or toggling a mark on or off automatically
|
||||||
adjusts the sequence to the right side of that mark.
|
adjusts the sequence to the right side of that mark.
|
||||||
|
|
||||||
@ -416,13 +387,11 @@ Version 2.7
|
|||||||
version of the recording you can use the '8' key to jump to a point just
|
version of the recording you can use the '8' key to jump to a point just
|
||||||
before the next cut and have a look at the resulting sequence.
|
before the next cut and have a look at the resulting sequence.
|
||||||
|
|
||||||
Currently editing marks can only be set at I-frames, which typically appear
|
Currently editing marks can only be set at I-frames, which typically is
|
||||||
every half of a second to a second. A "begin" mark marks the first frame of
|
every 12th frame. So editing can be done with a resolution of roughly half
|
||||||
a resulting video sequence, and an "end" mark marks the last frame of that
|
a second. A "start" mark marks the first frame of a resulting video
|
||||||
sequence. Note that the actual frame indicated by the an "end" mark will
|
sequence, and an "end" mark marks the last frame of that sequence.
|
||||||
not be included in the edited version of the recording. That's because every
|
|
||||||
recording (and every sequence of an edited recording) begins with an I-frame
|
|
||||||
and ends right before the next I-frame.
|
|
||||||
An edited recording (indicated by the '%' character) will never be deleted
|
An edited recording (indicated by the '%' character) will never be deleted
|
||||||
automatically in case the disk runs full (no matter what "lifetime" it has).
|
automatically in case the disk runs full (no matter what "lifetime" it has).
|
||||||
|
|
||||||
@ -480,8 +449,6 @@ Version 2.7
|
|||||||
"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
|
||||||
@ -503,197 +470,10 @@ Version 2.7
|
|||||||
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.
|
||||||
|
|
||||||
The "Red" key in the "Edit timer" menu opens a list of folders, which can be
|
|
||||||
used to define the file name in which the recording will be stored.
|
|
||||||
|
|
||||||
The "Yellow" key in the "Edit timer" menu toggles the timer between "Pattern"
|
|
||||||
and "Regular".
|
|
||||||
|
|
||||||
When editing the "File" field, the "Blue" key in can be used to insert useful
|
|
||||||
macros.
|
|
||||||
|
|
||||||
* Pattern timers
|
|
||||||
|
|
||||||
There are cases where it would make sense to have a more flexible kind of
|
|
||||||
recording timer. For instance, some channels that provide VPS don't always
|
|
||||||
use the exact same VPS time for a series, which is extremely annoying.
|
|
||||||
Or you might want to record all films that have a certain pattern in their
|
|
||||||
title, no matter when they are broadcast. In such cases, "pattern timers"
|
|
||||||
can help.
|
|
||||||
|
|
||||||
In the "Edit timer" menu press the Yellow button to turn a regular timer into
|
|
||||||
a pattern timer. Pressing this button again switches back to regular.
|
|
||||||
|
|
||||||
The following rules apply to pattern timers:
|
|
||||||
|
|
||||||
- Pattern timers can only work for channels that provide EPG data.
|
|
||||||
- When using pattern timers, there should always be at least one free device that
|
|
||||||
can be used to regularly receive the EPG of the pattern timer's channel.
|
|
||||||
- A pattern timer records every matching event on the given channel that overlaps
|
|
||||||
with the given start/stop time. Overlapping events are recorded in full,
|
|
||||||
even if they extend outside the given start/stop interval.
|
|
||||||
- In order to actually record an event, a pattern timer "spawns" a separate timer
|
|
||||||
that does the recording. If there are matching events that would start while
|
|
||||||
the first spawned timer is still recording (due to the start/stop margins), timers
|
|
||||||
for those events are also spawned.
|
|
||||||
- Spawned timers are marked with the flag tfSpawned.
|
|
||||||
- Spawned timers take the Priority, Lifetime and VPS settings from the pattern timer.
|
|
||||||
- The special pattern "*" matches every event. So a timer with
|
|
||||||
a start/stop time of 00:00/23:59 will record every event of that day
|
|
||||||
into separate recordings. Note that when using this pattern there should
|
|
||||||
be no other timers for the same channel, because these might interfere.
|
|
||||||
- Once a timer has been spawned, it is treated like any other regular
|
|
||||||
timer. Any changes made to the corresponding pattern timer thereafter will have
|
|
||||||
no effect on spawned timers. Note that after deleting a spawned timer,
|
|
||||||
the corresponding pattern timer may respawn it.
|
|
||||||
- Recording is done according to the event's begin/end times, either
|
|
||||||
by adding the start/stop margins (for non-VPS timers) or by using the
|
|
||||||
event's running status (for VPS timers).
|
|
||||||
- If the start/stop margins of a spawned timer are reduced because the event
|
|
||||||
before and/or after that timer's event is shorter than the respective margin,
|
|
||||||
the actual recording still uses the full margins.
|
|
||||||
- If the times of the event change, a non-VPS pattern timer automatically adjusts
|
|
||||||
itself to the new times. This also happens if the start/stop margins are changed
|
|
||||||
in the setup.
|
|
||||||
- The recording of a pattern timer is stored under the given file name, just like
|
|
||||||
regular timers do. In addition to the "TITLE" and "EPISODE" macros the file
|
|
||||||
name of a pattern timer can also use "{<}" and "{>}" to reference the part of the
|
|
||||||
event's title before and after the pattern, respectively. For instance,
|
|
||||||
if the event's title is "Abc def ghi" and the pattern is "def ", "{<}"
|
|
||||||
would contain "Abc " and "{>}" would contain "ghi" (note the matching of the
|
|
||||||
blanks). For completeness, "{=}" can be used to reference the matching
|
|
||||||
pattern itself.
|
|
||||||
- In the "Timers" menu pressing the Red button on a pattern timer only toggles the
|
|
||||||
timer between "on" and "off", even if this is a repeating timer.
|
|
||||||
- In the "Timers" menu pattern timers are sorted alphabetically to the end of the
|
|
||||||
list of timers.
|
|
||||||
- A regular timer that is currently recording can't be changed into a pattern timer.
|
|
||||||
- In the "Edit timer" menu the file name and pattern are displayed as
|
|
||||||
separate items. The Yellow button can be used to toggle between a regular
|
|
||||||
timer and a pattern timer. When going from regular to pattern, the Pattern item will
|
|
||||||
be initialized with the base part of the file name.
|
|
||||||
- The characters '^' and '$' can be used at the very beginning and end of
|
|
||||||
the pattern to anchor the pattern to the begin or end of the title.
|
|
||||||
Using both of these will match only titles that consist of exactly the given pattern,
|
|
||||||
with nothing before and nothing after it.
|
|
||||||
- The Pattern field in the "Edit timer" menu allows blanks at the end of the string,
|
|
||||||
which may help to separate the text after the matching pattern.
|
|
||||||
- If the first character of the pattern is '@', an event that matches the
|
|
||||||
rest of the pattern is only recorded if the resulting recording's file
|
|
||||||
name (without any folders) is not contained in the donerecs.data file.
|
|
||||||
This avoids duplicate recordings of the same programme. Timers spawned from
|
|
||||||
such a pattern timer are marked with the flag tfAvoid.
|
|
||||||
- When editing the "File" field of a timer, the Blue button can be pressed to
|
|
||||||
insert one of the macros "TITLE", "EPISODE", "{<}", "{=}" or "{>}",
|
|
||||||
respectively. Pressing the Blue button repeatedly loops through the available
|
|
||||||
macros. The "{...}" macros are only available for pattern timers.
|
|
||||||
- In the "Schedule" and "What's on...?" menus the events that will be recorded
|
|
||||||
by a pattern timer are marked in the same way as regular timers.
|
|
||||||
- The TIMERS column in the LCARS skin doesn't show the basic definitions of
|
|
||||||
pattern timers, it only shows timers actually spawned from pattern timers.
|
|
||||||
|
|
||||||
If the pattern is prepended with '@', the name of the resulting recording (everything
|
|
||||||
after the rightmost '~', or the entire file name, if there is no '~') will be stored
|
|
||||||
in the file donerecs.data, so that multiple recordings of the same programme can be
|
|
||||||
avoided. When using this feature, special care must be taken regarding the recording's
|
|
||||||
file name. For instance, with a combination of
|
|
||||||
|
|
||||||
pattern file name
|
|
||||||
@Columbo Movies~TITLE
|
|
||||||
|
|
||||||
if the event's title is just "Columbo", this pattern timer would only record once,
|
|
||||||
and ignore any future events with that title, even if the episode would be different.
|
|
||||||
So you may want to use the episode name, as in
|
|
||||||
|
|
||||||
pattern file name
|
|
||||||
@Columbo Movies~TITLE - EPISODE
|
|
||||||
|
|
||||||
to make the file name unique. If you have several pattern timers for the same show on
|
|
||||||
different channels, chances are that the broadcasters handle title and episode
|
|
||||||
differently, as for example in
|
|
||||||
|
|
||||||
TITLE EPISODE pattern file name
|
|
||||||
Columbo Blueprint for Murder @^Columbo$ TITLE - EPISODE
|
|
||||||
Columbo - Blueprint for Murder @^Columbo TITLE
|
|
||||||
Columbo: Blueprint for Murder @^Columbo:_ Columbo - {>}
|
|
||||||
|
|
||||||
(note the '_' in the pattern of the third example; this is just used to visualize
|
|
||||||
the blank at the end of the pattern)
|
|
||||||
|
|
||||||
In order to have the same episode result in the same recording file name on all
|
|
||||||
channels, the file name needs to be generated differently for each channel. First
|
|
||||||
you need to decide on a proper combination of title and episode name, preferably
|
|
||||||
one that is already used by one of your channels (let's say the second one).
|
|
||||||
In the first case, title and episode name are correctly put in their respective
|
|
||||||
places, and "TITLE - EPISODE" as file name will do. The second case is our common
|
|
||||||
version, where everything is in the title, so TITLE is just fine. The third case
|
|
||||||
poses a problem, because everything is in the title, but with a different separator.
|
|
||||||
Here the special macro "{>}" can be used in the file name, which contains everything
|
|
||||||
following the matching pattern. There are three macros that can be used here:
|
|
||||||
|
|
||||||
{<} everything before the matching pattern
|
|
||||||
{>} everything after the matching pattern
|
|
||||||
{=} the matching pattern itself (just for completeness)
|
|
||||||
|
|
||||||
As of VDR version 2.5.2, the characters ' ' (blank), ':' and '-' are ignored
|
|
||||||
when checking whether a particular recording has already been made by a pattern
|
|
||||||
timer, making "TITLE - EPISODE" and "TITLE: EPISODE" the same.
|
|
||||||
VDR version 2.6.6 added '/' to this list.
|
|
||||||
|
|
||||||
* Managing folders
|
|
||||||
|
|
||||||
The "Select folder" menu, which can be accessed by pressing the "Red" key in
|
|
||||||
the "Edit timer" menu, offers a list of folders that can be used for storing
|
|
||||||
a recording. In this menu, the "Green" key allows you to define a new folder
|
|
||||||
within the current one; if the "Sub folder" option is set to "yes", this will
|
|
||||||
be a folder that contains other folders (indicated by "..." following the
|
|
||||||
folder name in the list). The "Yellow" key deletes the current folder (note
|
|
||||||
that this will merely delete the folder definition stored in 'folders.conf'
|
|
||||||
and has no effect on existing timers or recordings). The "Blue" key can be
|
|
||||||
used to edit an existing folder definition. The "Red" key opens a folder that
|
|
||||||
contains sub folders, while pressing Ok selects the current folder. Once a
|
|
||||||
folder has been selected, the entire path of the timer's file name will be
|
|
||||||
replaced with the selected folder.
|
|
||||||
|
|
||||||
In the "Recordings" menu the folders of existing recordings can be renamed or
|
|
||||||
moved by pressing the "Blue" key ("Edit") while the cursor is positioned on
|
|
||||||
a folder. This will open a menu in which the folder's name and location (the
|
|
||||||
"parent" folder) can be edited. If such an operation will result in moving
|
|
||||||
more than one recording, you will be asked for confirmation.
|
|
||||||
The name, folder, priority and lifetime of an individual recording can be
|
|
||||||
changed by pressing the "Blue" key ("Info") while the cursor is positioned
|
|
||||||
on a recording, and in the resulting Info menu pressing the "Blue" key again
|
|
||||||
to bring up the "Edit recording" menu.
|
|
||||||
In the "Edit recording" menu the Red button ("Folder") allows you to select one
|
|
||||||
of your predefined folders. The Green button has multiple functions, depending
|
|
||||||
on what is currently going on with the recording. It can either stop or cancel
|
|
||||||
a cut, move or copy operation. If the button reads "Stop..." it means that the
|
|
||||||
respective operation is already happening, while "Cancel..." means that the
|
|
||||||
operation is still pending execution. If no operation is currently happening
|
|
||||||
and the recording has editing marks, the Button will read "Cut" and triggers
|
|
||||||
cutting the recording (same as pressing '2' while replaying the recording).
|
|
||||||
The Yellow button ("Delete marks") allows you to delete all editing marks from
|
|
||||||
the selected recording (if there are any and the recording is not currently
|
|
||||||
being cut). To directly edit the folder or name of the recording, position the
|
|
||||||
cursor to the respective line and press the Right key to start editing (press
|
|
||||||
Ok to confirm the edit, or Back to return to the previous value). If you want
|
|
||||||
to remove the name of the recording and make the folder name the actual
|
|
||||||
recording's name, you can position the cursor to the "Name:" field and press
|
|
||||||
the '0' key. This will take the last element of the recording's folder path
|
|
||||||
and make it the actual name of the recording. You can do this in turn until
|
|
||||||
the recording is moved all the way up to the root of the video directory.
|
|
||||||
Note that, in case you inadvertently pressed the '0' key, you can leave the
|
|
||||||
"Edit recording" menu with the "Back" key and any changes you have made so far
|
|
||||||
will not be applied. Once you are finished with editing the recording
|
|
||||||
properties, press Ok to confirm the changes.
|
|
||||||
|
|
||||||
* Parameters in the "Setup" menu
|
* Parameters in the "Setup" menu
|
||||||
|
|
||||||
Select "Setup" from the "VDR" menu to enter the setup menu. From there you can
|
Select "Setup" from the "VDR" menu to enter the setup menu. From there you can
|
||||||
@ -709,13 +489,12 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
|
|
||||||
Theme = Default Defines the "theme" to use with the current skin.
|
Theme = Default Defines the "theme" to use with the current skin.
|
||||||
|
|
||||||
Left = 8 The left and top offset of the OSD, in percent of the
|
Left = 54 The top and left offset of the OSD.
|
||||||
Top = 8 total video display width and height, respectively.
|
Top = 45 The valid ranges are left=0...672, top=0...567.
|
||||||
The valid range is 0...50%.
|
|
||||||
|
|
||||||
Width = 87 The width and height of the OSD, in percent of the
|
Width = 624 The width and height of the OSD.
|
||||||
Height = 84 total video display width and height, respectively.
|
Height = 486 The valid ranges are width=480...672, height=324...567.
|
||||||
The valid range is 50...100%.
|
The Width must be a multiple of 8.
|
||||||
|
|
||||||
Message time = 1 The time (in seconds) how long an informational
|
Message time = 1 The time (in seconds) how long an informational
|
||||||
message shall be displayed on the OSD. The valid range
|
message shall be displayed on the OSD. The valid range
|
||||||
@ -737,12 +516,11 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
Fixed font = Courier:Bold
|
Fixed font = Courier:Bold
|
||||||
The names of the various fonts to use.
|
The names of the various fonts to use.
|
||||||
|
|
||||||
Default font size = 3.8
|
Default font size = 22
|
||||||
Small font size = 3.5
|
Small font size = 18
|
||||||
Fixed font size = 3.1
|
Fixed font size = 20
|
||||||
The sizes (in percent of the total video display height)
|
The sizes (in pixel) of the various fonts. Valid range is
|
||||||
of the various fonts. The valid range is 1...10%, at
|
10...64.
|
||||||
a resolution of 0.1%.
|
|
||||||
|
|
||||||
Channel info position = bottom
|
Channel info position = bottom
|
||||||
The position of the channel info window in the OSD
|
The position of the channel info window in the OSD
|
||||||
@ -787,40 +565,6 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
Turns displaying the Recordings menu as a hierarchical
|
Turns displaying the Recordings menu as a hierarchical
|
||||||
directory structure on or off.
|
directory structure on or off.
|
||||||
|
|
||||||
Folders in timer menu = yes
|
|
||||||
Controls whether the full folder path is shown in the
|
|
||||||
"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
|
|
||||||
Controls whether the number keys can be used to enter
|
|
||||||
characters in a text input field. You may want to set this
|
|
||||||
to "no" if you are using an actual keyboard to control VDR.
|
|
||||||
|
|
||||||
Color key 0 = 0 By default, VDR assumes that the sequence of the color
|
|
||||||
Color key 1 = 1 keys on the remote control is red-green-yellow-blue. If
|
|
||||||
Color key 2 = 2 your remote control has these keys in a different sequence,
|
|
||||||
Color key 3 = 3 you can adjust these parameters to reorder the corresponding
|
|
||||||
color buttons in the menus accordingly. Note that this does
|
|
||||||
not change the functionality of the individual keys; it only
|
|
||||||
changes the sequence in which the color buttons are displayed.
|
|
||||||
|
|
||||||
EPG:
|
EPG:
|
||||||
|
|
||||||
EPG scan timeout = 5 The time (in hours) of user inactivity after which the
|
EPG scan timeout = 5 The time (in hours) of user inactivity after which the
|
||||||
@ -829,16 +573,6 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
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
|
||||||
@ -912,33 +646,27 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
from the primary DVB interface, so that the viewer will
|
from the primary DVB interface, so that the viewer will
|
||||||
be disturbed as little as possible.
|
be disturbed as little as possible.
|
||||||
|
|
||||||
Standard Compliance = 0
|
|
||||||
Defines the standard compliance mode:
|
|
||||||
0 = DVB
|
|
||||||
1 = ANSI/SCTE
|
|
||||||
2 = NORDIG
|
|
||||||
|
|
||||||
Video format = 4:3 The video format (or aspect ratio) of the tv set in use
|
Video format = 4:3 The video format (or aspect ratio) of the tv set in use
|
||||||
(4:3 or 16:9). Applies only to SD output devices.
|
(4:3 or 16:9).
|
||||||
|
|
||||||
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. Applies only to SD output devices.
|
4:3.
|
||||||
|
|
||||||
Use Dolby Digital = yes
|
Use Dolby Digital = yes
|
||||||
Controls whether Dolby Digital tracks appear in the "Audio"
|
Turns recording of the Dolby Digital audio channels on
|
||||||
menu. This is useful if you don't have the equipment to
|
or off. This may be useful if you don't have the equipment
|
||||||
replay Dolby Digital audio.
|
to replay Dolby Digital audio and want to save disk space.
|
||||||
|
If turned off, Dolby Digital tracks also don't appear in the
|
||||||
|
"Audio" menu.
|
||||||
|
|
||||||
Update channels = 5 Controls the automatic channel update function. '0' means
|
Update channels = 5 Controls the automatic channel update function. '0' means
|
||||||
no update, '1' will only update channel names, '2' will
|
no update, '1' will only update channel names, '2' will
|
||||||
only update PIDs, '3' will update channel names and PIDs,
|
only update PIDs, '3' will update channel names and PIDs,
|
||||||
'4' will perform all updates and also add newly found channels,
|
'4' will perform all updates and also add newly found channels,
|
||||||
and '5' will also add newly found transponders.
|
and '5' will also add newly found transponders.
|
||||||
Note that adding new transponders only works if the "EPG scan"
|
|
||||||
is active.
|
|
||||||
|
|
||||||
Audio languages = 0 Some tv stations broadcast various audio tracks in different
|
Audio languages = 0 Some tv stations broadcast various audio tracks in different
|
||||||
languages. This option allows you to define which language(s)
|
languages. This option allows you to define which language(s)
|
||||||
@ -976,40 +704,12 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
|
|
||||||
LNB:
|
LNB:
|
||||||
|
|
||||||
Use DiSEqC = no Generally turns DiSEqC support on or off.
|
|
||||||
|
|
||||||
SLOF = 11700 The switching frequency (in MHz) between low and
|
SLOF = 11700 The switching frequency (in MHz) between low and
|
||||||
high LOF
|
high LOF
|
||||||
Low LNB frequency = 9750 The LNB's low and high local oscillator frequencies
|
Low LNB frequency = 9750 The LNB's low and high local oscillator frequencies
|
||||||
High LNB frequency = 10600 (in MHz, these have no meaning for DVB-C receivers)
|
High LNB frequency = 10600 (in MHz, these have no meaning for DVB-C receivers)
|
||||||
|
|
||||||
Device n connected to sat cable = own
|
Use DiSEqC = no Generally turns DiSEqC support on or off.
|
||||||
Defines whether DVB-S device n has its own satellite cable,
|
|
||||||
or is "bonded" with another device. All DVB-S devices that
|
|
||||||
are connected to the same sat cable must be set to the same
|
|
||||||
number here.
|
|
||||||
|
|
||||||
Use dish positioner = no
|
|
||||||
By default, the 'P' command code in DiSEqC command sequences
|
|
||||||
is ignored. Set this parameter to 'yes' if you are using a
|
|
||||||
satellite dish positioner.
|
|
||||||
|
|
||||||
Site latitude (degrees) = 0
|
|
||||||
Site longitude (degrees) = 0
|
|
||||||
Set these to the latitude and longitude of your dish's
|
|
||||||
location if you use a satellite dish positioner. Use the
|
|
||||||
"Green" key to switch between north/south and east/west,
|
|
||||||
respectively.
|
|
||||||
|
|
||||||
Max. positioner swing (degrees) = 65
|
|
||||||
Defines the maximum angle by which the positioner can move
|
|
||||||
the dish away from due south (or north) in either direction.
|
|
||||||
The valid range is 0...90.
|
|
||||||
|
|
||||||
Positioner speed (degrees/s) = 1.5
|
|
||||||
Defines the speed at which the positioner moves the dish.
|
|
||||||
The valid range is 0.1...180. This value is used to calculate
|
|
||||||
how long it takes the positioner to reach the target position.
|
|
||||||
|
|
||||||
CAM:
|
CAM:
|
||||||
|
|
||||||
@ -1019,19 +719,7 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
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. The "Yellow" key
|
slot. The "Ok" key also opens the CAM menu.
|
||||||
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:
|
||||||
|
|
||||||
@ -1040,30 +728,21 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
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
|
Primary limit = 0 The minimum priority a timer must have to be allowed to
|
||||||
to be recorded is shorter than the respective margin.
|
use the primary DVB interface, or to force another timer
|
||||||
|
with higher priority to use the primary DVB interface.
|
||||||
|
This is mainly useful for recordings that should take
|
||||||
|
place only when there is nothing else to do, but should
|
||||||
|
never keep the user from viewing stuff on the primary
|
||||||
|
interface. On systems with only one DVB card, timers
|
||||||
|
with a priority below PrimaryLimit will never execute.
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
Record key handling = 2
|
|
||||||
Defines what happens if the Record key on the remote control
|
|
||||||
is pressed during live tv.
|
|
||||||
0 = no instant recording
|
|
||||||
1 = confirm instant recording
|
|
||||||
2 = record instantly
|
|
||||||
The default is 2.
|
|
||||||
|
|
||||||
Pause key handling = 2 Defines what happens if the Pause key on the remote control
|
|
||||||
is pressed during live tv.
|
|
||||||
0 = do not pause live video
|
|
||||||
1 = confirm pause live video
|
|
||||||
2 = pause live video
|
|
||||||
The default is 2.
|
|
||||||
|
|
||||||
Pause priority = 10 The Priority and Lifetime values used when pausing live
|
Pause priority = 10 The Priority and Lifetime values used when pausing live
|
||||||
Pause lifetime = 1 video.
|
Pause lifetime = 1 video.
|
||||||
|
|
||||||
@ -1105,15 +784,10 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
Default is 180 minutes (3 hours). The stop time of an
|
Default is 180 minutes (3 hours). The stop time of an
|
||||||
instant recording can be modified at any time by editing
|
instant recording can be modified at any time by editing
|
||||||
the respective timer in the "Timers" menu.
|
the respective timer in the "Timers" menu.
|
||||||
If this parameter is set to 0 ("present event"), only the
|
|
||||||
currently running event will be recorded, using the stop
|
|
||||||
margin and VPS setting as configured.
|
|
||||||
Note that this parameter is also used when pausing live
|
|
||||||
video!
|
|
||||||
|
|
||||||
Max. video file size = 2000
|
Max. video file size = 2000
|
||||||
The maximum size of a single recorded video file in MB.
|
The maximum size of a single recorded video file in MB.
|
||||||
The valid range is 100...1048570. Default is 2000, but
|
The valid range is 100...2000. Default is 2000, but
|
||||||
you may want to use smaller values if you are planning
|
you may want to use smaller values if you are planning
|
||||||
on archiving a recording to CD.
|
on archiving a recording to CD.
|
||||||
|
|
||||||
@ -1121,17 +795,9 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
During the actual editing process VDR writes the result
|
During the actual editing process VDR writes the result
|
||||||
into files that may grow up to MaxVideoFileSize. If you
|
into files that may grow up to MaxVideoFileSize. If you
|
||||||
prefer to have each marked sequence stored in a separate
|
prefer to have each marked sequence stored in a separate
|
||||||
file (named 00001.ts, 00002.ts, ...) you can set this
|
file (named 001.vdr, 002.vdr, ...) you can set this
|
||||||
option to 'yes'.
|
option to 'yes'.
|
||||||
|
|
||||||
Delete timeshift recording = 0
|
|
||||||
Controls whether a timeshift recording is deleted after
|
|
||||||
viewing it.
|
|
||||||
0 = no
|
|
||||||
1 = confirm
|
|
||||||
2 = yes
|
|
||||||
The default is 0.
|
|
||||||
|
|
||||||
Replay:
|
Replay:
|
||||||
|
|
||||||
Multi speed mode = no Defines the function of the "Left" and "Right" keys in
|
Multi speed mode = no Defines the function of the "Left" and "Right" keys in
|
||||||
@ -1141,88 +807,11 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
|
|
||||||
Show replay mode = no Turns displaying the current replay mode on or off.
|
Show replay mode = no Turns displaying the current replay mode on or off.
|
||||||
|
|
||||||
Show remaining time = no
|
|
||||||
Defines whether the replay progress display shows the
|
|
||||||
remaining time or the total length of the recording.
|
|
||||||
|
|
||||||
Progress display time (s) = 0
|
|
||||||
Defines how long (in seconds) the progress display is shown
|
|
||||||
when replay of a recording is started. The default value of 0
|
|
||||||
means that it will not be shown.
|
|
||||||
|
|
||||||
Pause replay when setting mark = no
|
|
||||||
Defines whether the player automatically goes into Pause
|
|
||||||
mode when setting an editing mark.
|
|
||||||
|
|
||||||
Pause replay when jumping to a mark = yes
|
|
||||||
By default replay is automatically paused whenever you jump
|
|
||||||
to an editing mark with the '7' or '9' key in order to allow
|
|
||||||
you to easily adjust those marks. If this option is set to
|
|
||||||
'no', the '9' key will not pause if you are in Play mode and
|
|
||||||
the mark you jump to is not within 3 seconds of the end of
|
|
||||||
the recording.
|
|
||||||
|
|
||||||
Skip edited parts = no Defines whether the edited parts of a recording are
|
|
||||||
automatically skipped during replay. This includes jumping
|
|
||||||
to the first mark if replay starts at the beginning of the
|
|
||||||
recording, and stopping at the last mark.
|
|
||||||
|
|
||||||
Pause replay at last mark = no
|
|
||||||
If enabled, replay of a recording will go into Pause mode
|
|
||||||
when it has reached the last "end" mark (if any). Note that
|
|
||||||
the actual position at which the pause occurs may be a couple
|
|
||||||
of frames before the last "end" mark, depending on how much
|
|
||||||
data is buffered by your output device.
|
|
||||||
|
|
||||||
Initial duration for adaptive skipping (s) = 120
|
|
||||||
Defines the number of seconds to jump from the current replay
|
|
||||||
position in either direction, when pressing the '1' or '3'
|
|
||||||
key for the first time after the "Reset timeout for adaptive
|
|
||||||
skipping".
|
|
||||||
The valid range is 10...600.
|
|
||||||
|
|
||||||
Reset timeout for adaptive skipping (s) = 3
|
|
||||||
Defines the number of seconds after which pressing the
|
|
||||||
'1' or '3' key falls back to the "Initial duration for adaptive
|
|
||||||
skipping".
|
|
||||||
The valid range is 0...10. Setting the timeout to 0 disables
|
|
||||||
the adaptive mode and makes '1' and '3' always skip the number
|
|
||||||
of seconds configured as the initial duration.
|
|
||||||
|
|
||||||
Alternate behavior for adaptive skipping = no
|
|
||||||
When skipping in adaptive mode with the '1' and '3' keys, the
|
|
||||||
distance of the skip is halved with every key press after the
|
|
||||||
first change of direction. While this allows for locating a
|
|
||||||
particular position in a recording very fast, once you make
|
|
||||||
one step too many in the current direction you have no chance
|
|
||||||
of ever reaching the desired point any more. You will have to
|
|
||||||
wait for the timeout to occur and start adaptive skipping anew.
|
|
||||||
If this option is set to 'yes', the skip distance will only be
|
|
||||||
halved if the direction actually changes. That way, even if
|
|
||||||
you missed the target point, you can still back up to it.
|
|
||||||
|
|
||||||
Use Prev/Next keys for adaptive skipping = no
|
|
||||||
Normally the Prev/Next keys jump between editing marks (or
|
|
||||||
the beginning/end of the recording). You can set this option
|
|
||||||
to 'yes' if you want to use these keys for adaptive skipping
|
|
||||||
instead.
|
|
||||||
|
|
||||||
Skip distance with Green/Yellow keys (s) = 60
|
|
||||||
Defines the number of seconds to skip in either direction
|
|
||||||
when pressing the "Green" or "Yellow" key, respectively.
|
|
||||||
The valid range is 5...600.
|
|
||||||
|
|
||||||
Skip distance with Green/Yellow keys in repeat (s) = 60
|
|
||||||
Defines the number of seconds to skip in either direction
|
|
||||||
when pressing and holding the "Green" or "Yellow" key,
|
|
||||||
respectively.
|
|
||||||
The valid range is 5...600.
|
|
||||||
|
|
||||||
Resume ID = 0 Defines an additional ID that can be used in a multi user
|
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
|
||||||
0 resulting in a file named 'resume', and any other
|
0 resulting in a file named 'resume.vdr', and any other
|
||||||
value resulting in 'resume.n'.
|
value resulting in 'resume.n.vdr'.
|
||||||
|
|
||||||
Miscellaneous:
|
Miscellaneous:
|
||||||
|
|
||||||
@ -1241,23 +830,6 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
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'
|
||||||
|
|
||||||
@ -1270,20 +842,8 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
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
|
Initial channel = 0 The number of the channel that shall be tuned to when
|
||||||
The earliest time (in milliseconds) after which the repeat
|
VDR starts. Default is 0, which means that it will
|
||||||
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
|
|
||||||
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.
|
||||||
|
|
||||||
Initial volume = -1 The volume that shall be set when VDR starts. Default
|
Initial volume = -1 The volume that shall be set when VDR starts. Default
|
||||||
@ -1291,28 +851,6 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
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
|
|
||||||
"Channel+" and "Channel-" keys) the current channel will
|
|
||||||
wrap around the beginning or end of the channel list if
|
|
||||||
this parameter is set to 'yes'.
|
|
||||||
|
|
||||||
Show channel names with source = off
|
|
||||||
If this option is turned on, channel names will be displayed
|
|
||||||
with the source appended to them, as in "ZDF (S)" (if the
|
|
||||||
option is set to "type), or "ZDF (S19.2E)" (if it is set to
|
|
||||||
"full"), where 'S' stands for "Satellite".
|
|
||||||
|
|
||||||
Emergency exit = yes If, for some reason, a recording fails because the video
|
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.,
|
||||||
VDR automatically exits in order to allow the surrounding
|
VDR automatically exits in order to allow the surrounding
|
||||||
@ -1344,3 +882,4 @@ VDR version 2.6.6 added '/' to this list.
|
|||||||
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,95 +6,44 @@
|
|||||||
# 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 5.2 2024/10/11 14:21:04 kls Exp $
|
# $Id: Make.config.template 2.1 2009/01/18 10:46:13 kls Exp $
|
||||||
|
|
||||||
### The C compiler and options:
|
### The C compiler and options:
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -g -O3 -Wall
|
CFLAGS = -g -O2 -Wall
|
||||||
|
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CXXFLAGS = -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
CXXFLAGS = -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
# Use 'make DEBUG=1 ...' to build a debug version of VDR and plugins:
|
ifdef PLUGIN
|
||||||
ifdef DEBUG
|
CFLAGS += -fPIC
|
||||||
CFLAGS += -O0
|
CXXFLAGS += -fPIC
|
||||||
CXXFLAGS += -O0
|
DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
||||||
endif
|
|
||||||
|
|
||||||
# Use 'make M32=1 ...' to build a 32-bit version of VDR on a 64-bit machine:
|
|
||||||
ifdef M32
|
|
||||||
CFLAGS += -m32
|
|
||||||
CXXFLAGS += -m32
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Default directories (adjust as necessary or desired):
|
#DVBDIR = /usr/src/v4l-dvb/linux
|
||||||
|
MANDIR = /usr/local/man
|
||||||
|
BINDIR = /usr/local/bin
|
||||||
|
|
||||||
#PREFIX = /usr/local
|
LOCDIR = ./locale
|
||||||
#VDRROOT = $(PREFIX)
|
PLUGINDIR= ./PLUGINS
|
||||||
#BINDIR = $(VDRROOT)/bin
|
PLUGINLIBDIR= $(PLUGINDIR)/lib
|
||||||
#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
|
VIDEODIR = /video
|
||||||
CACHEDIR = $(VIDEODIR)
|
|
||||||
CONFDIR = $(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
|
|
||||||
# parameters for plugins:
|
|
||||||
#PLGCFG = $(CONFDIR)/plugins.mk
|
|
||||||
|
|
||||||
### The remote control:
|
### The remote control:
|
||||||
LIRC_DEVICE = /var/run/lirc/lircd
|
|
||||||
### Use this for kernel based driver:
|
|
||||||
#LIRC_DEVICE = /dev/lirc0
|
|
||||||
|
|
||||||
### Define if you always want to use LIRC, independent of the --lirc option:
|
LIRC_DEVICE = /dev/lircd
|
||||||
#REMOTE=LIRC
|
RCU_DEVICE = /dev/ttyS1
|
||||||
|
|
||||||
### Define if you don't want keyboard remote control:
|
## Define if you want vdr to not run as root
|
||||||
#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:
|
### You don't need to touch the following:
|
||||||
#BIDI = 1
|
|
||||||
|
|
||||||
### Define if you want 'systemd' notification:
|
ifdef DVBDIR
|
||||||
#SDNOTIFY = 1
|
INCLUDES += -I$(DVBDIR)/include
|
||||||
|
|
||||||
### Fallback for plugins with old makefiles:
|
|
||||||
ifdef PLUGIN
|
|
||||||
CFLAGS += -fPIC
|
|
||||||
CXXFLAGS += -fPIC
|
|
||||||
endif
|
endif
|
||||||
|
10
Make.global
10
Make.global
@ -1,10 +0,0 @@
|
|||||||
#
|
|
||||||
# Strictly necessary Makefile options for the Video Disk Recorder
|
|
||||||
#
|
|
||||||
# See the main source file 'vdr.c' for copyright information and
|
|
||||||
# how to reach the author.
|
|
||||||
#
|
|
||||||
# $Id: Make.global 1.2 2012/12/29 12:03:01 kls Exp $
|
|
||||||
|
|
||||||
# This is just a dummy file for plugins that use old style (version 1.7.33
|
|
||||||
# or earlier) Makefiles.
|
|
280
Makefile
280
Makefile
@ -4,103 +4,45 @@
|
|||||||
# 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 5.4 2024/10/21 19:01:16 kls Exp $
|
# $Id: Makefile 2.3 2009/01/05 13:04:10 kls Exp $
|
||||||
|
|
||||||
.DELETE_ON_ERROR:
|
.DELETE_ON_ERROR:
|
||||||
|
|
||||||
# Compiler flags:
|
|
||||||
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
|
|
||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
CFLAGS ?= -g -O3 -Wall
|
CFLAGS ?= -g -O2 -Wall
|
||||||
|
|
||||||
CXX ?= g++
|
CXX ?= g++
|
||||||
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
|
CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
CXXFLAGS += $(CPPFLAGS)
|
|
||||||
|
|
||||||
CDEFINES = -D_GNU_SOURCE
|
|
||||||
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
|
||||||
|
|
||||||
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell $(PKG_CONFIG) --libs freetype2 fontconfig)
|
|
||||||
INCLUDES ?= $(shell $(PKG_CONFIG) --cflags freetype2 fontconfig)
|
|
||||||
|
|
||||||
# Directories:
|
|
||||||
|
|
||||||
CWD ?= $(shell pwd)
|
|
||||||
LSIDIR ?= $(CWD)/libsi
|
|
||||||
PLUGINDIR ?= $(CWD)/PLUGINS
|
|
||||||
|
|
||||||
# Failsafe defaults for "make LCLBLD=1":
|
|
||||||
ifdef LCLBLD
|
|
||||||
DESTDIR ?= $(CWD)
|
|
||||||
LOCDIR ?= $(CWD)/locale
|
|
||||||
HDRDIR ?= $(CWD)/include
|
|
||||||
LIBDIR ?= $(PLUGINDIR)/lib
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
LSIDIR = ./libsi
|
||||||
DESTDIR ?=
|
DESTDIR ?=
|
||||||
VIDEODIR ?= /srv/vdr/video
|
|
||||||
CONFDIR ?= /var/lib/vdr
|
|
||||||
ARGSDIR ?= /etc/vdr/conf.d
|
|
||||||
CACHEDIR ?= /var/cache/vdr
|
|
||||||
|
|
||||||
PREFIX ?= /usr/local
|
PREFIX ?= /usr/local
|
||||||
VDRROOT ?= $(PREFIX)
|
MANDIR = $(PREFIX)/share/man
|
||||||
BINDIR ?= $(VDRROOT)/bin
|
BINDIR = $(PREFIX)/bin
|
||||||
INCDIR ?= $(VDRROOT)/include
|
LOCDIR = ./locale
|
||||||
LIBDIR ?= $(VDRROOT)/lib/vdr
|
LIBS = -ljpeg -lpthread -ldl -lcap -lrt -lfreetype -lfontconfig
|
||||||
LOCDIR ?= $(VDRROOT)/share/locale
|
INCLUDES = -I/usr/include/freetype2
|
||||||
MANDIR ?= $(VDRROOT)/share/man
|
|
||||||
PCDIR ?= $(VDRROOT)/lib/pkgconfig
|
|
||||||
RESDIR ?= $(VDRROOT)/share/vdr
|
|
||||||
|
|
||||||
# Source documentation
|
PLUGINDIR= ./PLUGINS
|
||||||
|
PLUGINLIBDIR= $(PLUGINDIR)/lib
|
||||||
|
|
||||||
DOXYGEN ?= /usr/bin/doxygen
|
VIDEODIR = /video
|
||||||
|
CONFDIR = $(VIDEODIR)
|
||||||
|
|
||||||
|
DOXYGEN = /usr/bin/doxygen
|
||||||
DOXYFILE = Doxyfile
|
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
|
|
||||||
CINCLUDES += -I$(DVBDIR)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Object files
|
|
||||||
|
|
||||||
SILIB = $(LSIDIR)/libsi.a
|
SILIB = $(LSIDIR)/libsi.a
|
||||||
|
|
||||||
OBJS = args.o audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
|
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o dvbosd.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 mtd.o nit.o osdbase.o osd.o pat.o player.o plugin.o positioner.o\
|
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.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 skins.o skinsttng.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)
|
|
||||||
INCLUDES += $(CINCLUDES)
|
|
||||||
|
|
||||||
ifdef HDRDIR
|
|
||||||
HDRDIR := -I$(HDRDIR)
|
|
||||||
endif
|
|
||||||
ifndef NO_KBD
|
ifndef NO_KBD
|
||||||
DEFINES += -DREMOTE_KBD
|
DEFINES += -DREMOTE_KBD
|
||||||
endif
|
endif
|
||||||
@ -110,26 +52,19 @@ endif
|
|||||||
ifdef VDR_USER
|
ifdef VDR_USER
|
||||||
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
||||||
endif
|
endif
|
||||||
ifdef BIDI
|
|
||||||
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi)
|
|
||||||
DEFINES += -DBIDI
|
|
||||||
LIBS += $(shell $(PKG_CONFIG) --libs fribidi)
|
|
||||||
endif
|
|
||||||
ifdef SDNOTIFY
|
|
||||||
INCLUDES += $(shell $(PKG_CONFIG) --silence-errors --cflags libsystemd-daemon || $(PKG_CONFIG) --cflags libsystemd)
|
|
||||||
DEFINES += -DSDNOTIFY
|
|
||||||
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd)
|
|
||||||
endif
|
|
||||||
|
|
||||||
LIRC_DEVICE ?= /var/run/lirc/lircd
|
LIRC_DEVICE ?= /dev/lircd
|
||||||
|
RCU_DEVICE ?= /dev/ttyS1
|
||||||
|
|
||||||
|
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\" -DRCU_DEVICE=\"$(RCU_DEVICE)\"
|
||||||
|
|
||||||
|
DEFINES += -D_GNU_SOURCE
|
||||||
|
|
||||||
|
DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
||||||
|
|
||||||
DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
|
|
||||||
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
|
||||||
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
|
DEFINES += -DCONFDIR=\"$(CONFDIR)\"
|
||||||
DEFINES += -DARGSDIR=\"$(ARGSDIR)\"
|
DEFINES += -DPLUGINDIR=\"$(PLUGINLIBDIR)\"
|
||||||
DEFINES += -DCACHEDIR=\"$(CACHEDIR)\"
|
|
||||||
DEFINES += -DRESDIR=\"$(RESDIR)\"
|
|
||||||
DEFINES += -DPLUGINDIR=\"$(LIBDIR)\"
|
|
||||||
DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
||||||
|
|
||||||
# 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"):
|
||||||
@ -137,13 +72,12 @@ DEFINES += -DLOCDIR=\"$(LOCDIR)\"
|
|||||||
VDRVERSION = $(shell sed -ne '/define VDRVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
VDRVERSION = $(shell sed -ne '/define VDRVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' config.h)
|
||||||
|
|
||||||
all: vdr i18n plugins
|
all: vdr i18n
|
||||||
|
|
||||||
# Implicit rules:
|
# Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
# Dependencies:
|
# Dependencies:
|
||||||
|
|
||||||
@ -157,73 +91,41 @@ $(DEPFILE): Makefile
|
|||||||
# The main program:
|
# The main program:
|
||||||
|
|
||||||
vdr: $(OBJS) $(SILIB)
|
vdr: $(OBJS) $(SILIB)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -rdynamic $(OBJS) $(LIBS) $(LIBDIRS) $(SILIB) -o vdr
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
|
|
||||||
|
|
||||||
# The libsi library:
|
# The libsi library:
|
||||||
|
|
||||||
$(SILIB): make-libsi
|
$(SILIB):
|
||||||
@$(MAKE) --no-print-directory -C $(LSIDIR) CXXFLAGS="$(CXXFLAGS)" DEFINES="$(CDEFINES)" all
|
$(MAKE) -C $(LSIDIR) all
|
||||||
make-libsi: # empty rule makes sure the sub-make for libsi is always called
|
|
||||||
|
|
||||||
# pkg-config file:
|
|
||||||
|
|
||||||
.PHONY: vdr.pc
|
|
||||||
vdr.pc:
|
|
||||||
@echo "vdrrootdir=$(VDRROOT)" > $@
|
|
||||||
@echo "bindir=$(BINDIR)" >> $@
|
|
||||||
@echo "incdir=$(INCDIR)" >> $@
|
|
||||||
@echo "mandir=$(MANDIR)" >> $@
|
|
||||||
@echo "videodir=$(VIDEODIR)" >> $@
|
|
||||||
@echo "configdir=$(CONFDIR)" >> $@
|
|
||||||
@echo "argsdir=$(ARGSDIR)" >> $@
|
|
||||||
@echo "cachedir=$(CACHEDIR)" >> $@
|
|
||||||
@echo "resdir=$(RESDIR)" >> $@
|
|
||||||
@echo "libdir=$(LIBDIR)" >> $@
|
|
||||||
@echo "locdir=$(LOCDIR)" >> $@
|
|
||||||
@echo "plgcfg=$(PLGCFG)" >> $@
|
|
||||||
@echo "apiversion=$(APIVERSION)" >> $@
|
|
||||||
@echo "cflags=$(CFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
|
||||||
@echo "cxxflags=$(CXXFLAGS) $(CDEFINES) $(CINCLUDES) $(HDRDIR)" >> $@
|
|
||||||
@echo "" >> $@
|
|
||||||
@echo "Name: VDR" >> $@
|
|
||||||
@echo "Description: Video Disk Recorder" >> $@
|
|
||||||
@echo "URL: https://www.tvdr.de/" >> $@
|
|
||||||
@echo "Version: $(VDRVERSION)" >> $@
|
|
||||||
@echo "Cflags: \$${cflags}" >> $@
|
|
||||||
|
|
||||||
# Internationalization (I18N):
|
# Internationalization (I18N):
|
||||||
|
|
||||||
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
|
||||||
@echo MO $@
|
msgfmt -c -o $@ $<
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
@echo GT $@
|
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $^
|
||||||
$(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)
|
||||||
@echo PO $@
|
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||||
$(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
|
||||||
@echo IN $@
|
@mkdir -p $(dir $@)
|
||||||
$(Q)install -D -m644 $< $@
|
cp $< $@
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
i18n: $(I18Nmsgs)
|
i18n: $(I18Nmsgs)
|
||||||
|
|
||||||
install-i18n: i18n
|
install-i18n:
|
||||||
@mkdir -p $(DESTDIR)$(LOCDIR)
|
@mkdir -p $(DESTDIR)$(LOCDIR)
|
||||||
cp -r $(LOCALEDIR)/* $(DESTDIR)$(LOCDIR)
|
@(cd $(LOCALEDIR); cp -r --parents * $(DESTDIR)$(LOCDIR))
|
||||||
|
|
||||||
# The 'include' directory (for plugins):
|
# The 'include' directory (for plugins):
|
||||||
|
|
||||||
@ -235,80 +137,43 @@ include-dir:
|
|||||||
|
|
||||||
# Plugins:
|
# Plugins:
|
||||||
|
|
||||||
plugins: include-dir vdr.pc
|
plugins: include-dir
|
||||||
@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; echo "*** Plugin $$i:";\
|
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;\
|
||||||
# Old Makefile\
|
$(MAKE) -C "$(PLUGINDIR)/src/$$i" all || failed="$$failed $$i";\
|
||||||
if ! grep -q "PKGCFG" "$(PLUGINDIR)/src/$$i/Makefile" ; then\
|
|
||||||
echo "WARNING: plugin $$i is using an old Makefile!";\
|
|
||||||
oldmakefile="$$oldmakefile $$i";\
|
|
||||||
$(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";\
|
|
||||||
continue;\
|
|
||||||
fi;\
|
|
||||||
# New Makefile\
|
|
||||||
INCLUDES="-I$(CWD)/include"\
|
|
||||||
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" || failed="$$failed $$i";\
|
|
||||||
if [ -n "$(LCLBLD)" ] ; then\
|
|
||||||
(cd $(PLUGINDIR)/src/$$i; for l in `find -name "libvdr-*.so" -o -name "lib$$i-*.so"`; do install -D $$l $(LIBDIR)/`basename $$l`.$(APIVERSION); done);\
|
|
||||||
if [ -d $(PLUGINDIR)/src/$$i/po ]; then\
|
|
||||||
for l in `ls $(PLUGINDIR)/src/$$i/po/*.mo`; do\
|
|
||||||
install -D -m644 $$l $(LOCDIR)/`basename $$l | cut -d. -f1`/LC_MESSAGES/vdr-$$i.mo;\
|
|
||||||
done;\
|
done;\
|
||||||
fi;\
|
|
||||||
fi;\
|
|
||||||
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: vdr.pc
|
clean-plugins:
|
||||||
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" clean; done
|
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/src/$$i" clean; done
|
||||||
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
|
||||||
|
|
||||||
# Install the files (note that 'install-pc' must be first!):
|
# Install the files:
|
||||||
|
|
||||||
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes
|
install: install-bin install-conf install-doc install-plugins install-i18n
|
||||||
|
|
||||||
# VDR binary:
|
# VDR binary:
|
||||||
|
|
||||||
install-bin: vdr
|
install-bin: vdr
|
||||||
@mkdir -p $(DESTDIR)$(BINDIR)
|
@mkdir -p $(DESTDIR)$(BINDIR)
|
||||||
@cp --remove-destination vdr svdrpsend $(DESTDIR)$(BINDIR)
|
@cp --remove-destination vdr runvdr svdrpsend.pl $(DESTDIR)$(BINDIR)
|
||||||
|
|
||||||
# Configuration files:
|
# Configuration files:
|
||||||
|
|
||||||
install-dirs:
|
install-conf:
|
||||||
@mkdir -p $(DESTDIR)$(VIDEODIR)
|
@mkdir -p $(DESTDIR)$(VIDEODIR)
|
||||||
@mkdir -p $(DESTDIR)$(CONFDIR)
|
@if [ ! -d $(DESTDIR)$(CONFDIR) ]; then\
|
||||||
@mkdir -p $(DESTDIR)$(ARGSDIR)
|
mkdir -p $(DESTDIR)$(CONFDIR);\
|
||||||
@mkdir -p $(DESTDIR)$(CACHEDIR)
|
cp *.conf $(DESTDIR)$(CONFDIR);\
|
||||||
@mkdir -p $(DESTDIR)$(RESDIR)
|
fi
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
@ -317,51 +182,28 @@ 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\
|
@mkdir -p $(DESTDIR)$(PLUGINLIBDIR)
|
||||||
echo; echo "*** Plugin $$i:";\
|
@cp --remove-destination $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION) $(DESTDIR)$(PLUGINLIBDIR)
|
||||||
$(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:
|
|
||||||
|
|
||||||
install-includes: include-dir
|
|
||||||
@mkdir -p $(DESTDIR)$(INCDIR)
|
|
||||||
@cp -pLR include/vdr include/libsi $(DESTDIR)$(INCDIR)
|
|
||||||
|
|
||||||
# pkg-config file:
|
|
||||||
|
|
||||||
install-pc: vdr.pc
|
|
||||||
if [ -n "$(PCDIR)" ] ; then\
|
|
||||||
mkdir -p $(DESTDIR)$(PCDIR) ;\
|
|
||||||
cp vdr.pc $(DESTDIR)$(PCDIR) ;\
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Source documentation:
|
# Source documentation:
|
||||||
|
|
||||||
srcdoc:
|
srcdoc:
|
||||||
@cat $(DOXYFILE) > $(DOXYFILE).tmp
|
@cp $(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
|
||||||
|
|
||||||
# Housekeeping:
|
# Housekeeping:
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@$(MAKE) --no-print-directory -C $(LSIDIR) clean
|
$(MAKE) -C $(LSIDIR) clean
|
||||||
@-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~
|
-rm -f $(OBJS) $(DEPFILE) vdr core* *~
|
||||||
@-rm -rf $(LOCALEDIR) $(PODIR)/*~ $(PODIR)/*.mo $(PODIR)/*.pot
|
-rm -rf $(LOCALEDIR) $(PODIR)/*.mo $(PODIR)/*.pot
|
||||||
@-rm -rf include
|
-rm -rf include
|
||||||
@-rm -rf srcdoc
|
-rm -rf srcdoc
|
||||||
CLEAN: clean
|
CLEAN: clean
|
||||||
distclean: clean-plugins clean
|
|
||||||
|
400
PLUGINS.html
400
PLUGINS.html
@ -21,9 +21,6 @@ html, body {
|
|||||||
.modified {
|
.modified {
|
||||||
background-color: #FFDDDD;
|
background-color: #FFDDDD;
|
||||||
}
|
}
|
||||||
modified {
|
|
||||||
background-color: #FFDDDD;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -31,12 +28,15 @@ modified {
|
|||||||
<div class="center">
|
<div class="center">
|
||||||
<h1>The VDR Plugin System</h1>
|
<h1>The VDR Plugin System</h1>
|
||||||
|
|
||||||
<b>Version 2.7</b>
|
<b>Version 1.7</b>
|
||||||
<p>
|
<p>
|
||||||
Copyright © 2021 Klaus Schmidinger<br>
|
Copyright © 2009 Klaus Schmidinger<br>
|
||||||
<a href="mailto:vdr@tvdr.de">vdr@tvdr.de</a><br>
|
<a href="mailto:kls@cadsoft.de">kls@cadsoft.de</a><br>
|
||||||
<a href="https://www.tvdr.de">www.tvdr.de</a>
|
<a href="http://www.cadsoft.de/vdr">www.cadsoft.de/vdr</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="modified">
|
||||||
|
Important modifications introduced since version 1.6 are marked like this.
|
||||||
|
</div modified>
|
||||||
<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
|
||||||
to be added to the program by implementing a dynamically loadable library file.
|
to be added to the program by implementing a dynamically loadable library file.
|
||||||
@ -74,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><a href="#Additional files">Additional files</a>
|
<li><a href="#Configuration files">Configuration 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>
|
||||||
@ -96,12 +96,9 @@ 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><a href="#Electronic Program Guide">Electronic Program Guide</a>
|
|
||||||
<li><a href="#The video directory">The video directory</a>
|
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@ -165,26 +162,22 @@ 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
|
VDR/PLUGINS/lib/libvdr-hello.so.1.1.0
|
||||||
</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>, <tt>install</tt> and
|
that there is a <tt>Makefile</tt> that provides the targets <tt>all</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</tt></b></td></tr>
|
<tr><td align=center><b><tt>libvdr-</tt></b></td><td align=center><b><tt>hello</tt></b></td><td align=center><b><tt>.so.</tt></b></td><td align=center><b><tt>1.1.0</tt></b></td></tr>
|
||||||
<tr><td align=center><small>VDR plugin<br>library prefix</small></td><td align=center><small>name of<br>the plugin</small></td><td align=center><small>shared object<br>indicator</small></td><td align=center><small>API version number<br>this plugin was<br>compiled for</small></td></tr>
|
<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>
|
||||||
@ -195,11 +188,6 @@ the current VDR version. That way minor fixes to VDR, that don't require changes
|
|||||||
to the VDR header files, can be made without requiring all plugins to be
|
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.
|
||||||
@ -395,7 +383,13 @@ just like shown in the above example. This is a convention that allows the <tt>M
|
|||||||
to extract the version number when generating the file name for the distribution archive.
|
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.
|
version <tt>1.0.0</tt> once it is completely operative and well tested. Following the
|
||||||
|
Linux kernel version numbering scheme, versions with <i>even</i> release numbers
|
||||||
|
(like <tt>1.0.x</tt>, <tt>1.2.x</tt>, <tt>1.4.x</tt>...) should be stable releases,
|
||||||
|
while those with <i>odd</i> release numbers (like <tt>1.1.x</tt>, <tt>1.3.x</tt>,
|
||||||
|
<tt>1.5.x</tt>...) are usually considered "under development". The three parts of
|
||||||
|
a version number are not limited to single digits, so a version number of <tt>1.2.15</tt>
|
||||||
|
would be acceptable.
|
||||||
|
|
||||||
<hr><h2><a name="Description">Description</a></h2>
|
<hr><h2><a name="Description">Description</a></h2>
|
||||||
|
|
||||||
@ -561,8 +555,6 @@ as the <a href="#Getting started"><tt>Start()</tt></a> functions were called.
|
|||||||
|
|
||||||
<hr><h2><a name="Logging">Logging</a></h2>
|
<hr><h2><a name="Logging">Logging</a></h2>
|
||||||
|
|
||||||
<div class="blurb">Traces in the sand...</div><p>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If the plugin should print log messages, you can use <tt>dsyslog()</tt>, <tt>isyslog()</tt> or <tt>esyslog()</tt>.<br>
|
If the plugin should print log messages, you can use <tt>dsyslog()</tt>, <tt>isyslog()</tt> or <tt>esyslog()</tt>.<br>
|
||||||
<ul>
|
<ul>
|
||||||
@ -579,31 +571,6 @@ 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>
|
||||||
|
|
||||||
@ -691,6 +658,27 @@ 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>
|
||||||
@ -891,51 +879,39 @@ 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><a name="Additional files">Additional files</a></h2>
|
<hr><h2><a name="Configuration files">Configuration files</a></h2>
|
||||||
|
|
||||||
<div class="blurb">I want my own stuff!</div><p>
|
<div class="blurb">I want my own stuff!</div><p>
|
||||||
|
|
||||||
There may be situations where a plugin requires files of its own. While the plugin is
|
There may be situations where a plugin requires configuration files of its own, maybe
|
||||||
free to store such files anywhere it sees fit, it might be a good idea to put them in a common
|
for data that can't be stored in the simple <a href="#Setup parameters">setup parameters</a>
|
||||||
place, preferably where such data already exists.
|
of VDR, or maybe because it needs to launch other programs that simply need a separate
|
||||||
<p>
|
configuration file. While the plugin is free to store such files anywhere it
|
||||||
<i>configuration files</i>, maybe for data that can't be stored in the simple
|
sees fit, it might be a good idea to put them in a common place, preferably
|
||||||
<a href="#Setup parameters">setup parameters</a> of VDR, or maybe because it needs to
|
where other configuration data already exists. VDR provides the function
|
||||||
launch other programs that simply need a separate configuration file.
|
|
||||||
<p>
|
|
||||||
<i>cache files</i>, to store data so that future requests for that data can be served faster. The data
|
|
||||||
that is stored within a cache might be values that have been computed earlier or duplicates of
|
|
||||||
original values that are stored elsewhere.
|
|
||||||
<p>
|
|
||||||
<i>resource files</i>, for providing additional files, like pictures, movie clips or channel logos.
|
|
||||||
<p>
|
|
||||||
Therefore VDR provides the functions
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
const char *ConfigDirectory(const char *PluginName = NULL);
|
const char *ConfigDirectory(const char *PluginName = NULL);
|
||||||
const char *CacheDirectory(const char *PluginName = NULL);
|
|
||||||
const char *ResourceDirectory(const char *PluginName = NULL);
|
|
||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
each of which returns a string containing the directory that VDR uses for its own
|
which returns a string containing the directory that VDR uses for its own configuration
|
||||||
files (defined through the options in the call to VDR), extended by
|
files (defined through the <tt><b>-c</b></tt> option in the call to VDR), extended by
|
||||||
<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.
|
||||||
The behavior of <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt> is similar.
|
|
||||||
<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
|
||||||
needs only one extra file, it is suggested that this file be named <tt>name.*</tt>,
|
needs only one extra configuration file, it is suggested that this file be named
|
||||||
where <i>name</i> shall be the name of the plugin.
|
<tt>name.conf</tt>, where <i>name</i> shall be the name of the plugin.
|
||||||
<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
|
||||||
the functions can be given an additional string that will be appended to the returned
|
the <tt>ConfigDirectory()</tt> function can be given an additional string that will
|
||||||
directory name, as in
|
be appended to the returned directory name, as in
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
const char *MyConfigDir = ConfigDirectory(Name());
|
const char *MyConfigDir = ConfigDirectory(Name());
|
||||||
@ -946,12 +922,13 @@ 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>
|
||||||
The returned strings are statically allocated and will be overwritten by subsequent calls!
|
The returned string is statically allocated and will be overwritten by subsequent
|
||||||
|
calls to ConfigDirectory()!
|
||||||
</b>
|
</b>
|
||||||
<p>
|
<p>
|
||||||
The <tt>ConfigDirectory()</tt>, <tt>CacheDirectory()</tt> and <tt>ResourceDirectory()</tt>
|
The <tt>ConfigDirectory()</tt> function is a static member function of the <tt>cPlugin</tt>
|
||||||
functions are static member functions of the <tt>cPlugin</tt> class. This allows them to be
|
class. This allows it to be called even from outside any member function of the derived
|
||||||
called even from outside any member function of the derived plugin class, by writing
|
plugin class, by writing
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
const char *MyConfigDir = cPlugin::ConfigDirectory();
|
const char *MyConfigDir = cPlugin::ConfigDirectory();
|
||||||
@ -1161,60 +1138,6 @@ 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>
|
||||||
|
|
||||||
@ -1296,10 +1219,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, bool LiveView);
|
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
|
||||||
};
|
};
|
||||||
|
|
||||||
void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
|
void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber)
|
||||||
{
|
{
|
||||||
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());
|
||||||
@ -1557,9 +1480,8 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
cMyReceiver::cMyReceiver(int Pid)
|
cMyReceiver::cMyReceiver(int Pid)
|
||||||
:cReceiver(NULL, -1)
|
:cReceiver(tChannelID(), -1, Pid)
|
||||||
{
|
{
|
||||||
AddPid(Pid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cMyReceiver::~cMyReceiver()
|
cMyReceiver::~cMyReceiver()
|
||||||
@ -1585,8 +1507,7 @@ member functions of <tt>cReceiver</tt>.
|
|||||||
The above example sets up a receiver that wants to receive data from only one
|
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.
|
||||||
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>:
|
||||||
@ -1602,7 +1523,8 @@ 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>
|
||||||
The <tt>cReceiver</tt> must be detached from its device before it is deleted.
|
If the <tt>cReceiver</tt> isn't needed any more, it may simply be <i>deleted</i>
|
||||||
|
and will automatically detach itself from the <tt>cDevice</tt>.
|
||||||
|
|
||||||
<hr><h2><a name="Filters">Filters</a></h2>
|
<hr><h2><a name="Filters">Filters</a></h2>
|
||||||
|
|
||||||
@ -1731,7 +1653,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 thread, it can call
|
within that tread, 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);
|
||||||
@ -1757,7 +1679,7 @@ The first step in implementing a new skin is to derive a class from <tt>cSkin</t
|
|||||||
that provides the handling objects necessary to do the actual work:
|
that provides the handling objects necessary to do the actual work:
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
<p><table><tr><td class="code"><pre>
|
||||||
#include <vdr/skins.h>
|
#include "skins.h"
|
||||||
|
|
||||||
class cMySkin : public cSkin {
|
class cMySkin : public cSkin {
|
||||||
public:
|
public:
|
||||||
@ -1767,7 +1689,7 @@ public:
|
|||||||
virtual cSkinDisplayMenu *DisplayMenu(void);
|
virtual cSkinDisplayMenu *DisplayMenu(void);
|
||||||
virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
|
virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
|
||||||
virtual cSkinDisplayVolume *DisplayVolume(void);
|
virtual cSkinDisplayVolume *DisplayVolume(void);
|
||||||
virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
|
virtual cSkinDisplayMessage *DisplayTrack(int NumTracks, const char * const *Tracks);
|
||||||
virtual cSkinDisplayMessage *DisplayMessage(void);
|
virtual cSkinDisplayMessage *DisplayMessage(void);
|
||||||
};
|
};
|
||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
@ -1880,7 +1802,6 @@ 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>
|
||||||
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;
|
||||||
@ -1929,9 +1850,11 @@ 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);
|
||||||
|
<div class="modified">
|
||||||
virtual bool IsPlayingVideo(void) const;
|
virtual bool IsPlayingVideo(void) const;
|
||||||
|
</div modified>
|
||||||
virtual bool HasIBPTrickSpeed(void);
|
virtual bool HasIBPTrickSpeed(void);
|
||||||
virtual void TrickSpeed(int Speed, bool Forward);
|
virtual void TrickSpeed(int Speed);
|
||||||
virtual void Clear(void);
|
virtual void Clear(void);
|
||||||
virtual void Play(void);
|
virtual void Play(void);
|
||||||
virtual void Freeze(void);
|
virtual void Freeze(void);
|
||||||
@ -1958,7 +1881,6 @@ 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);
|
||||||
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>
|
||||||
|
|
||||||
@ -2007,21 +1929,12 @@ void cMyDevice::MakePrimaryDevice(bool On)
|
|||||||
The OSD provider object is allocated on the heap and shall not be deleted
|
The OSD provider object is allocated on the heap and shall not be deleted
|
||||||
(it will be deleted automatically in case a different device sets up an OSD
|
(it will be deleted automatically in case a different device sets up an OSD
|
||||||
provider, or when the program ends).
|
provider, or when the program ends).
|
||||||
<p>
|
|
||||||
Note that an OSD implementation need not be physically linked to the device
|
Note that an OSD implementation need not be physically linked to the device
|
||||||
in any way. All it needs to make sure is that the OSD will be visible to the
|
in any way. All it needs to make sure is that the OSD will be visible to the
|
||||||
user - whether this goes through OSD facilities of the physical device (like
|
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>
|
|
||||||
In order to be able to determine the proper size of the OSD, the device
|
|
||||||
should implement the function
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
|
||||||
virtual void GetOsdSize(int &Width, int &Height, double &Aspect);
|
|
||||||
</pre></td></tr></table><p>
|
|
||||||
|
|
||||||
By default, an OSD size of 720x480 with an aspect ratio of 1.0 is assumed.
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<b>Initializing new devices</b>
|
<b>Initializing new devices</b>
|
||||||
@ -2042,108 +1955,6 @@ 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!
|
||||||
<p>
|
|
||||||
<b>Device hooks</b>
|
|
||||||
<p>
|
|
||||||
VDR has builtin facilities that select which device is able to provide a given
|
|
||||||
transponder, or, which device may provide EIT data. However, there may be
|
|
||||||
situations where the setup is so special that it requires considerations that
|
|
||||||
exceed the scope of the core VDR code.
|
|
||||||
This is where <i>device hooks</i> can be used.
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
|
||||||
class cMyDeviceHook : public cDeviceHook {
|
|
||||||
public:
|
|
||||||
cMyDeviceHook(void);
|
|
||||||
virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const;
|
|
||||||
virtual bool DeviceProvidesEIT(const cDevice *Device) const;
|
|
||||||
};
|
|
||||||
</pre></td></tr></table><p>
|
|
||||||
|
|
||||||
In its <tt>DeviceProvidesTransponder()</tt> function the device hook can take
|
|
||||||
whatever actions are necessary to determine whether the given Device can
|
|
||||||
provide the given Channel's transponder, as in
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
|
||||||
bool cMyDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const
|
|
||||||
{
|
|
||||||
if (<i>condition where Device can't provide Channel</i>)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
</pre></td></tr></table><p>
|
|
||||||
|
|
||||||
In its <tt>DeviceProvidesEIT()</tt> function the device hook can take
|
|
||||||
whatever actions are necessary to determine whether the given Device can
|
|
||||||
provide EIT data, as in
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
|
||||||
bool cMyDeviceHook::DeviceProvidesEIT(const cDevice *Device) const
|
|
||||||
{
|
|
||||||
if (<i>condition where Device can't provide EIT data</i>)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
</pre></td></tr></table><p>
|
|
||||||
|
|
||||||
A plugin that creates a derived cDeviceHook shall do so in its <tt>Initialize()</tt>
|
|
||||||
function, as in
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
|
||||||
new cMyDeviceHook;
|
|
||||||
</pre></td></tr></table><p>
|
|
||||||
|
|
||||||
and shall not delete this object. It will be automatically deleted when the program ends.
|
|
||||||
<p>
|
|
||||||
<b>Power management</b>
|
|
||||||
<p>
|
|
||||||
A device that can be put into a power save mode can implement the function
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
|
||||||
virtual void SetPowerSaveMode(bool On);
|
|
||||||
</pre></td></tr></table><p>
|
|
||||||
|
|
||||||
If On is true, power save mode shall be activated, if it is false,
|
|
||||||
normal operating mode shall be restored.
|
|
||||||
|
|
||||||
<hr><h2><a name="Positioners">Positioners</a></h2>
|
|
||||||
|
|
||||||
<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>
|
||||||
|
|
||||||
@ -2308,11 +2119,6 @@ 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>
|
||||||
|
|
||||||
@ -2349,69 +2155,5 @@ 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.
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
In case the <i>Electronic Program Guide (EPG)</i> provided by the broadcaster
|
|
||||||
isn't sufficient for your taste, you can implement a <tt>cEpgHandler</tt> to
|
|
||||||
improve it from external sources. For instance, to replace the description
|
|
||||||
of the broadcaster's EPG with one from some external database, you could do:
|
|
||||||
|
|
||||||
<p><table><tr><td class="code"><pre>
|
|
||||||
#include <vdr/epg.h>
|
|
||||||
|
|
||||||
class cMyEpgHandler : public cEpgHandler {
|
|
||||||
public:
|
|
||||||
virtual bool SetDescription(cEvent *Event, const char *Description);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool cMyEpgHandler::SetDescription(cEvent *Event, const char *Description)
|
|
||||||
{
|
|
||||||
Event->SetDescription(DescriptionFromDatabase(Event));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
</pre></td></tr></table><p>
|
|
||||||
|
|
||||||
where <tt>DescriptionFromDatabase()</tt> would derive the description of the
|
|
||||||
given event from some external source. Note that the function returns <tt>true</tt>
|
|
||||||
to signal VDR that no other EPG handlers shall be queried after this one.
|
|
||||||
<p>
|
|
||||||
See <tt>VDR/epg.h</tt> for details.
|
|
||||||
|
|
||||||
<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,34 +0,0 @@
|
|||||||
VDR Plugin 'epgtableid0' Revision History
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
2012-03-10: Version 0.0.1
|
|
||||||
|
|
||||||
- Initial revision.
|
|
||||||
|
|
||||||
2012-12-27: Version 0.0.2
|
|
||||||
|
|
||||||
- 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,97 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for a Video Disk Recorder plugin
|
|
||||||
#
|
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
|
||||||
|
|
||||||
# The official name of this plugin.
|
|
||||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
|
||||||
# By default the main source file also carries this name.
|
|
||||||
|
|
||||||
PLUGIN = epgtableid0
|
|
||||||
|
|
||||||
### 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:
|
|
||||||
PKG_CONFIG ?= pkg-config
|
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
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
|
|
||||||
@echo CC $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
|
||||||
DEPFILE = .dependencies
|
|
||||||
$(DEPFILE): Makefile
|
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
|
||||||
|
|
||||||
-include $(DEPFILE)
|
|
||||||
|
|
||||||
### Targets:
|
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
|
||||||
@echo LD $@
|
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
|
||||||
@echo Distribution package created as $(PACKAGE).tgz
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
@ -1,19 +0,0 @@
|
|||||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
|
||||||
|
|
||||||
Written by: Klaus Schmidinger <vdr@tvdr.de>
|
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
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 special handling of EPG events with table id 0x00 has been dropped
|
|
||||||
in VDR version 1.7.26, and replaced by a more felxible "EPG Handler"
|
|
||||||
concept. You can use this plugin to get the previous functionality back.
|
|
@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
* epgtableid0.c: A plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: epgtableid0.c 4.1 2018/04/10 13:00:18 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <vdr/epg.h>
|
|
||||||
#include <vdr/plugin.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
|
||||||
static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
|
|
||||||
|
|
||||||
// --- cTable0Handler --------------------------------------------------------
|
|
||||||
|
|
||||||
class cTable0Handler : public cEpgHandler {
|
|
||||||
private:
|
|
||||||
bool Ignore(cEvent *Event) { return Event->TableID() == 0x00; }
|
|
||||||
public:
|
|
||||||
virtual bool SetEventID(cEvent *Event, tEventID EventID);
|
|
||||||
virtual bool SetStartTime(cEvent *Event, time_t StartTime);
|
|
||||||
virtual bool SetDuration(cEvent *Event, int Duration);
|
|
||||||
virtual bool SetTitle(cEvent *Event, const char *Title);
|
|
||||||
virtual bool SetShortText(cEvent *Event, const char *ShortText);
|
|
||||||
virtual bool SetDescription(cEvent *Event, const char *Description);
|
|
||||||
virtual bool SetContents(cEvent *Event, uchar *Contents);
|
|
||||||
virtual bool SetParentalRating(cEvent *Event, int ParentalRating);
|
|
||||||
virtual bool SetVps(cEvent *Event, time_t Vps);
|
|
||||||
virtual bool FixEpgBugs(cEvent *Event);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool cTable0Handler::SetEventID(cEvent *Event, tEventID EventID)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetStartTime(cEvent *Event, time_t StartTime)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetDuration(cEvent *Event, int Duration)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetTitle(cEvent *Event, const char *Title)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetShortText(cEvent *Event, const char *ShortText)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetDescription(cEvent *Event, const char *Description)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetContents(cEvent *Event, uchar *Contents)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetParentalRating(cEvent *Event, int ParentalRating)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::SetVps(cEvent *Event, time_t Vps)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTable0Handler::FixEpgBugs(cEvent *Event)
|
|
||||||
{
|
|
||||||
return Ignore(Event);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPluginEpgtableid0 ----------------------------------------------------
|
|
||||||
|
|
||||||
class cPluginEpgtableid0 : public cPlugin {
|
|
||||||
public:
|
|
||||||
virtual const char *Version(void) { return VERSION; }
|
|
||||||
virtual const char *Description(void) { return DESCRIPTION; }
|
|
||||||
virtual bool Initialize(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
bool cPluginEpgtableid0::Initialize(void)
|
|
||||||
{
|
|
||||||
new cTable0Handler;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
VDRPLUGINCREATOR(cPluginEpgtableid0); // Don't touch this!
|
|
@ -63,43 +63,6 @@ VDR Plugin 'hello' Revision History
|
|||||||
|
|
||||||
- Updated the Croatian language texts (thanks to Adrian Caval).
|
- Updated the Croatian language texts (thanks to Adrian Caval).
|
||||||
|
|
||||||
2008-09-06: Version 0.2.3
|
2008-009-06 Version 0.2.3
|
||||||
|
|
||||||
- Updated the Turkish language texts (thanks to Oktay Yolgeçen).
|
- Updated the Turkish language texts (thanks to Oktay Yolgeçen).
|
||||||
|
|
||||||
2009-12-06: Version 0.2.4
|
|
||||||
|
|
||||||
- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler).
|
|
||||||
|
|
||||||
2010-02-28: Version 0.2.5
|
|
||||||
|
|
||||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
|
||||||
|
|
||||||
2012-12-27: Version 0.2.6
|
|
||||||
|
|
||||||
- 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,56 +1,49 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.22 2008/01/13 12:59:58 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.
|
||||||
# By default the main source file also carries this name.
|
# By default the main source file also carries this name.
|
||||||
|
# IMPORTANT: the presence of this macro is important for the Make.config
|
||||||
|
# file. So it must be defined, even if it is not used here!
|
||||||
|
#
|
||||||
PLUGIN = hello
|
PLUGIN = hello
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
LOCDIR = $(call PKGCFG,locdir)
|
|
||||||
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:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
@ -58,64 +51,54 @@ OBJS = $(PLUGIN).o
|
|||||||
|
|
||||||
### The main target:
|
### The main target:
|
||||||
|
|
||||||
all: $(SOFILE) i18n
|
all: libvdr-$(PLUGIN).so i18n
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Internationalization (I18N):
|
### Internationalization (I18N):
|
||||||
|
|
||||||
PODIR = po
|
PODIR = po
|
||||||
|
LOCALEDIR = $(VDRDIR)/locale
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(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
|
||||||
@echo MO $@
|
msgfmt -c -o $@ $<
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
@echo GT $@
|
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $^
|
||||||
$(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)
|
||||||
@echo PO $@
|
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||||
install -D -m644 $< $@
|
@mkdir -p $(dir $@)
|
||||||
|
cp $< $@
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
i18n: $(I18Nmo) $(I18Npot)
|
i18n: $(I18Nmsgs)
|
||||||
|
|
||||||
install-i18n: $(I18Nmsgs)
|
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
dist: clean
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib install-i18n
|
|
||||||
|
|
||||||
dist: $(I18Npo) clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||||
|
@ -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 <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/people/kls/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm
|
||||||
|
|
||||||
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 4.1 2018/04/10 13:00:22 kls Exp $
|
* $Id: hello.c 2.1 2008/09/06 14:30:00 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 = "2.4.0";
|
static const char *VERSION = "0.2.3";
|
||||||
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");
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[])
|
|||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
{ "aaa", required_argument, NULL, 'a' },
|
{ "aaa", required_argument, NULL, 'a' },
|
||||||
{ "bbb", no_argument, NULL, 'b' },
|
{ "bbb", no_argument, NULL, 'b' },
|
||||||
{ NULL, no_argument, NULL, 0 }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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,13 +7,12 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Jordi Vilà <jvila@tinet.org>\n"
|
"Last-Translator: Jordi Vilà <jvila@tinet.org>\n"
|
||||||
"Language-Team: Catalan <vdr@linuxtv.org>\n"
|
"Language-Team: Catalanian\n"
|
||||||
"Language: ca\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Vladimír Bárta <vladimir.barta@k2atmitec.cz>\n"
|
"Last-Translator: Vladimír Bárta <vladimir.barta@k2atmitec.cz>\n"
|
||||||
"Language-Team: Czech <vdr@linuxtv.org>\n"
|
"Language-Team: Czech\n"
|
||||||
"Language: cs\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=ISO-8859-2\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
|
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
|
||||||
"Language-Team: Danish <vdr@linuxtv.org>\n"
|
"Language-Team: Danish\n"
|
||||||
"Language: da\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 <vdr@tvdr.de>, 2000
|
# Klaus Schmidinger <kls@cadsoft.de>, 2000
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\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 <vdr@tvdr.de>\n"
|
"Last-Translator: Klaus Schmidinger <kls@cadsoft.de>\n"
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
"Language-Team: German\n"
|
||||||
"Language: de\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
|
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
|
||||||
"Language-Team: Greek <vdr@linuxtv.org>\n"
|
"Language-Team: Greek\n"
|
||||||
"Language: el\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-7\n"
|
"Content-Type: text/plain; charset=ISO-8859-7\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Ruben Nunez Francisco <ruben.nunez@tang-it.com>\n"
|
"Last-Translator: Ruben Nunez Francisco <ruben.nunez@tang-it.com>\n"
|
||||||
"Language-Team: Spanish <vdr@linuxtv.org>\n"
|
"Language-Team: Spanish\n"
|
||||||
"Language: es\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,35 +1,34 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 <artlov@gmail.com>, 2004, 2015
|
# Arthur Konovalov <kasjas@hot.ee>, 2004
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\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 <artlov@gmail.com>\n"
|
"Last-Translator: Arthur Konovalov <kasjas@hot.ee>\n"
|
||||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
"Language-Team: Estonian\n"
|
||||||
"Language: et\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=ISO-8859-13\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
msgid "A friendly greeting"
|
||||||
msgstr "Sõbralik tervitus"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hello"
|
msgid "Hello"
|
||||||
msgstr "Tere"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
msgid "Greeting time (s)"
|
||||||
msgstr "Tervituse kestus (s)"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
msgid "Use alternate greeting"
|
||||||
msgstr "Vahelduv tervitus"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
msgid "Howdy folks!"
|
||||||
msgstr "Kuidas käsi käib?"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hello world!"
|
msgid "Hello world!"
|
||||||
msgstr "Tere, maailm!"
|
msgstr ""
|
||||||
|
@ -1,26 +1,25 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 <Rolf.Ahrenberg@sci.fi>, 2003
|
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2003
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\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 <Rolf.Ahrenberg@sci.fi>\n"
|
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
"Language-Team: Finnish\n"
|
||||||
"Language: fi\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
msgid "A friendly greeting"
|
||||||
msgstr "Ystävällisin terveisin"
|
msgstr "Ystävällisin terveisin"
|
||||||
|
|
||||||
msgid "Hello"
|
msgid "Hello"
|
||||||
msgstr "Hei"
|
msgstr "Hei"
|
||||||
@ -29,10 +28,10 @@ msgid "Greeting time (s)"
|
|||||||
msgstr "Tervehdysaika (s)"
|
msgstr "Tervehdysaika (s)"
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
msgid "Use alternate greeting"
|
||||||
msgstr "Käytä vaihtoehtoista tervehdystä"
|
msgstr "Käytä vaihtoehtoista tervehdystä"
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
msgid "Howdy folks!"
|
||||||
msgstr "Mitä kuuluu?"
|
msgstr "Mitä kuuluu?"
|
||||||
|
|
||||||
msgid "Hello world!"
|
msgid "Hello world!"
|
||||||
msgstr "Hei maailma!"
|
msgstr "Hei maailma!"
|
||||||
|
@ -1,39 +1,37 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2018-04-14 8:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
"Last-Translator: Nicolas Huillard <nhuillard@e-dition.fr>\n"
|
||||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
"Language-Team: French\n"
|
||||||
"Language: fr\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
msgid "A friendly greeting"
|
||||||
msgstr "Bien le bonjour"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hello"
|
msgid "Hello"
|
||||||
msgstr "Hello"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
msgid "Greeting time (s)"
|
||||||
msgstr "Durée pour le salut (s)"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
msgid "Use alternate greeting"
|
||||||
msgstr "Changer de salutation"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
msgid "Howdy folks!"
|
||||||
msgstr "Bonjour à tous !"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hello world!"
|
msgid "Hello world!"
|
||||||
msgstr "Bonjour le monde !"
|
msgstr ""
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2008-03-17 19:52+0100\n"
|
"PO-Revision-Date: 2008-03-17 19:52+0100\n"
|
||||||
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
|
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
|
||||||
"Language-Team: Croatian <vdr@linuxtv.org>\n"
|
"Language-Team: Croatian\n"
|
||||||
"Language: hr\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=ISO-8859-2\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,18 +1,17 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Istvan Koenigsberger <istvnko@hotmail.com>, Guido Josten <guido.josten@t-online.de>\n"
|
"Last-Translator: Istvan Koenigsberger <istvnko@hotmail.com>, Guido Josten <guido.josten@t-online.de>\n"
|
||||||
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
|
"Language-Team: Hungarian\n"
|
||||||
"Language: hu\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=ISO-8859-2\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2008-01-27 20:11+0100\n"
|
"PO-Revision-Date: 2008-01-27 20:11+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\n"
|
||||||
"Language: it\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
# 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.
|
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2009-12-08 12:18+0200\n"
|
|
||||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
|
||||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: lt\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Draugiškas labas"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Labas!"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Pasveikinomo laikas (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Naudoti alternatyvų pasveikinimą"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Kaip yr chebryte?"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Labas pasauli!"
|
|
@ -1,5 +1,5 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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,13 +7,12 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>\n"
|
"Last-Translator: Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>\n"
|
||||||
"Language-Team: Dutch <vdr@linuxtv.org>\n"
|
"Language-Team: Dutch\n"
|
||||||
"Language: nl\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,18 +1,17 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
|
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
|
||||||
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
|
"Language-Team: Norwegian\n"
|
||||||
"Language: nn\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,38 +1,34 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2018-02-19 00:41+0100\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Tomasz Maciej Nowak <tmn505@gmail.com>\n"
|
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
|
||||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
"Language-Team: Polish\n"
|
||||||
"Language: pl_PL\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=ISO-8859-2\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 "Przyjazne pozdrowienie"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hello"
|
msgid "Hello"
|
||||||
msgstr "Witaj"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
msgid "Greeting time (s)"
|
||||||
msgstr "Czas pozdrowienia (s)"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
msgid "Use alternate greeting"
|
||||||
msgstr "Użyj alternatywnego pozdrowienia"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
msgid "Howdy folks!"
|
||||||
msgstr "Siema ziomy!"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hello world!"
|
msgid "Hello world!"
|
||||||
msgstr "Witaj świecie!"
|
msgstr ""
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Paulo Lopes <pmml@netvita.pt>\n"
|
"Last-Translator: Paulo Lopes <pmml@netvita.pt>\n"
|
||||||
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
|
"Language-Team: Portuguese\n"
|
||||||
"Language: pt\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,18 +1,17 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
|
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
|
||||||
"Language-Team: Romanian <vdr@linuxtv.org>\n"
|
"Language-Team: Romanian\n"
|
||||||
"Language: ro\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=ISO-8859-2\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Vyacheslav Dikonov <sdiconov@mail.ru>\n"
|
"Last-Translator: Vyacheslav Dikonov <sdiconov@mail.ru>\n"
|
||||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
"Language-Team: Russian\n"
|
||||||
"Language: ru\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
# 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.
|
|
||||||
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2009-09-30 09:48+0100\n"
|
|
||||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
|
||||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
|
||||||
"Language: sk\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "Priateµský pozdrav"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "Ahoj"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "Èas pozdravu (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "Pou¾i» náhradný pozdrav"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "Ahojte v¹etci!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "Ahoj svet!"
|
|
@ -1,18 +1,17 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
|
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
|
||||||
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
|
"Language-Team: Slovenian\n"
|
||||||
"Language: sl\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=ISO-8859-2\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,18 +1,17 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||||
"Last-Translator: Tomas Prybil <tomas@prybil.se>\n"
|
"Last-Translator: Tomas Prybil <tomas@prybil.se>\n"
|
||||||
"Language-Team: Swedish <vdr@linuxtv.org>\n"
|
"Language-Team: Swedish\n"
|
||||||
"Language: sv\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||||
"PO-Revision-Date: 2008-05-12 22:34:4800\n"
|
"PO-Revision-Date: 2008-05-12 22:34:4800\n"
|
||||||
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
|
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
|
||||||
"Language-Team: Turkish <vdr@linuxtv.org>\n"
|
"Language-Team: Turkish\n"
|
||||||
"Language: tr\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-9\n"
|
"Content-Type: text/plain; charset=ISO-8859-9\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
# 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.
|
|
||||||
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
|
|
||||||
# Ramon Roca <ramon.roca@xcombo.com>, 2003
|
|
||||||
# Jordi Vilà <jvila@tinet.org>, 2003
|
|
||||||
# Nan Feng VDR <nfgx@21cn.com>, 2009
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-hello 2.6.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2012-12-18 14:04+0100\n"
|
|
||||||
"PO-Revision-Date: 2009-01-23 09:48+0800\n"
|
|
||||||
"Last-Translator: senin\n"
|
|
||||||
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
|
|
||||||
"Language: zh_CN\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A friendly greeting"
|
|
||||||
msgstr "友好的问候"
|
|
||||||
|
|
||||||
msgid "Hello"
|
|
||||||
msgstr "你好"
|
|
||||||
|
|
||||||
msgid "Greeting time (s)"
|
|
||||||
msgstr "问候时间 (s)"
|
|
||||||
|
|
||||||
msgid "Use alternate greeting"
|
|
||||||
msgstr "使用替代贺卡"
|
|
||||||
|
|
||||||
msgid "Howdy folks!"
|
|
||||||
msgstr "你好人!"
|
|
||||||
|
|
||||||
msgid "Hello world!"
|
|
||||||
msgstr "世界您好!"
|
|
@ -21,73 +21,3 @@ VDR Plugin 'osddemo' Revision History
|
|||||||
2008-04-13: Version 0.1.3
|
2008-04-13: Version 0.1.3
|
||||||
|
|
||||||
- Fixed setting the OSD level (thanks to Wolfgang Rohdewald).
|
- Fixed setting the OSD level (thanks to Wolfgang Rohdewald).
|
||||||
|
|
||||||
2011-02-20: Version 0.2.0
|
|
||||||
|
|
||||||
- Added support for TrueColor OSD.
|
|
||||||
|
|
||||||
2011-03-28: Version 0.2.1
|
|
||||||
|
|
||||||
- Added Cancel(3) to ~cTrueColorDemo() (thanks to Reinhard Nissl).
|
|
||||||
- Added a missing font deletion in cTrueColorDemo::Action() (thanks to Reinhard Nissl).
|
|
||||||
|
|
||||||
2011-04-17: Version 0.2.2
|
|
||||||
|
|
||||||
- Fixed a possible NULL pointer dereference in osddemo.c (reported by Paul Menzel).
|
|
||||||
|
|
||||||
2012-03-13: Version 0.2.3
|
|
||||||
|
|
||||||
- No longer using GetFont() (which is not thread safe) in the 'osddemo' plugin,
|
|
||||||
|
|
||||||
2012-12-27: Version 0.2.4
|
|
||||||
|
|
||||||
- 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,55 +1,47 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.11 2008/01/13 13:00:01 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.
|
||||||
# By default the main source file also carries this name.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
PLUGIN = osddemo
|
PLUGIN = osddemo
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### The version number of VDR's plugin API:
|
|
||||||
|
|
||||||
APIVERSION = $(call PKGCFG,apiversion)
|
|
||||||
|
|
||||||
### Allow user defined options to overwrite defaults:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
@ -57,33 +49,27 @@ OBJS = $(PLUGIN).o
|
|||||||
|
|
||||||
### The main target:
|
### The main target:
|
||||||
|
|
||||||
all: $(SOFILE)
|
all: libvdr-$(PLUGIN).so
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
# Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = g++ -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
|
@ -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 <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: http://www.cadsoft.de/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: http://www.cadsoft.de/vdr
|
||||||
|
|
||||||
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
|
||||||
@ -19,16 +19,4 @@ Demonstration of how a plugin can have its very own OSD setup.
|
|||||||
It's a very primitive game that opens a small window in which the
|
It's a very primitive game that opens a small window in which the
|
||||||
user can draw lines with the Up, Down, Left and Right buttons.
|
user can draw lines with the Up, Down, Left and Right buttons.
|
||||||
The color buttons are used to switch color.
|
The color buttons are used to switch color.
|
||||||
|
|
||||||
On a VDR system with TrueColor support it displays some of the
|
|
||||||
possibilities available with the TrueColor OSD. Once the "Animation"
|
|
||||||
pixmap is displayed, it can be moved around with the Up, Down, Left
|
|
||||||
and Right buttons. The Red button turns off the "Tiled Pixmaps"
|
|
||||||
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,224 +3,15 @@
|
|||||||
*
|
*
|
||||||
* 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 4.5 2020/10/14 20:32:41 kls Exp $
|
* $Id: osddemo.c 2.1 2008/04/13 12:59:57 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/osd.h>
|
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "2.4.1";
|
static const char *VERSION = "0.1.3";
|
||||||
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 {
|
||||||
@ -231,7 +22,7 @@ private:
|
|||||||
tColor color;
|
tColor color;
|
||||||
public:
|
public:
|
||||||
cLineGame(void);
|
cLineGame(void);
|
||||||
virtual ~cLineGame();
|
~cLineGame();
|
||||||
virtual void Show(void);
|
virtual void Show(void);
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
virtual eOSState ProcessKey(eKeys Key);
|
||||||
};
|
};
|
||||||
@ -239,7 +30,7 @@ public:
|
|||||||
cLineGame::cLineGame(void)
|
cLineGame::cLineGame(void)
|
||||||
{
|
{
|
||||||
osd = NULL;
|
osd = NULL;
|
||||||
x = y = 0;
|
x = y = 50;
|
||||||
color = clrRed;
|
color = clrRed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,23 +41,12 @@ cLineGame::~cLineGame()
|
|||||||
|
|
||||||
void cLineGame::Show(void)
|
void cLineGame::Show(void)
|
||||||
{
|
{
|
||||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
osd = cOsdProvider::NewOsd(100, 50, 50);
|
||||||
if (osd) {
|
if (osd) {
|
||||||
int x1 = cOsd::OsdWidth() - 1;
|
tArea Area = { 0, 0, 99, 199, 4 };
|
||||||
int y1 = cOsd::OsdHeight() - 1;
|
|
||||||
while (x1 > 0 && y1 > 0) {
|
|
||||||
tArea Area = { 0, 0, x1, y1, 4 };
|
|
||||||
if (osd->CanHandleAreas(&Area, 1) == oeOk) {
|
|
||||||
osd->SetAreas(&Area, 1);
|
osd->SetAreas(&Area, 1);
|
||||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
osd->DrawRectangle(0, 0, 99, 199, clrGray50);
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
x = osd->Width() / 2;
|
|
||||||
y = osd->Height() / 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
x1 = x1 * 9 / 10;
|
|
||||||
y1 = y1 * 9 / 10;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,420 +54,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: y = max(0, y - d); break;
|
case kUp: if (y > 0) y--; break;
|
||||||
case kDown: y = min(osd->Height() - d, y + d); break;
|
case kDown: if (y < 196) y++; break;
|
||||||
case kLeft: x = max(0, x - d); break;
|
case kLeft: if (x > 0) x--; break;
|
||||||
case kRight: x = min(osd->Width() - d, x + d); break;
|
case kRight: if (x < 96) x++; 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 + d - 1, y + d - 1, color);
|
osd->DrawRectangle(x, y, x + 3, y + 3, color);
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
state = osContinue;
|
state = osContinue;
|
||||||
}
|
}
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- cTrueColorDemo --------------------------------------------------------
|
|
||||||
|
|
||||||
class cTrueColorDemo : public cOsdObject, public cThread {
|
|
||||||
private:
|
|
||||||
cOsd *osd;
|
|
||||||
cPoint cursor;
|
|
||||||
cRect cursorLimits;
|
|
||||||
bool clockwise;
|
|
||||||
cPixmap *destroyablePixmap;
|
|
||||||
cPixmap *toggleablePixmap;
|
|
||||||
bool SetArea(void);
|
|
||||||
virtual void Action(void);
|
|
||||||
cPixmap *CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font);
|
|
||||||
public:
|
|
||||||
cTrueColorDemo(void);
|
|
||||||
virtual ~cTrueColorDemo();
|
|
||||||
virtual void Show(void);
|
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
|
||||||
};
|
|
||||||
|
|
||||||
cTrueColorDemo::cTrueColorDemo(void)
|
|
||||||
{
|
|
||||||
osd = NULL;
|
|
||||||
clockwise = true;
|
|
||||||
destroyablePixmap = NULL;
|
|
||||||
toggleablePixmap = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cTrueColorDemo::~cTrueColorDemo()
|
|
||||||
{
|
|
||||||
Cancel(3);
|
|
||||||
delete osd;
|
|
||||||
}
|
|
||||||
|
|
||||||
cPixmap *cTrueColorDemo::CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font)
|
|
||||||
{
|
|
||||||
const int h = Font->Height(s);
|
|
||||||
int w = Font->Width(s);
|
|
||||||
cPixmap *Pixmap = osd->CreatePixmap(Layer, cRect((osd->Width() - w) / 2, Line, w, h));
|
|
||||||
if (Pixmap) {
|
|
||||||
Pixmap->Clear();
|
|
||||||
Pixmap->SetAlpha(0);
|
|
||||||
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font, w);
|
|
||||||
}
|
|
||||||
return Pixmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cTrueColorDemo::Action(void)
|
|
||||||
{
|
|
||||||
cPixmap *FadeInPixmap = NULL;
|
|
||||||
cPixmap *FadeOutPixmap = NULL;
|
|
||||||
cPixmap *MovePixmap = NULL;
|
|
||||||
cPixmap *NextPixmap = NULL;
|
|
||||||
cPixmap *TilePixmap = NULL;
|
|
||||||
cPixmap *ScrollPixmap = NULL;
|
|
||||||
cPixmap *AnimPixmap = NULL;
|
|
||||||
cFont *OsdFont = cFont::CreateFont(Setup.FontOsd, Setup.FontOsdSize);
|
|
||||||
cFont *SmlFont = cFont::CreateFont(Setup.FontSml, Setup.FontSmlSize);
|
|
||||||
cFont *LrgFont = cFont::CreateFont(Setup.FontOsd, osd->Height() / 10);
|
|
||||||
int FrameTime = 40; // ms
|
|
||||||
int FadeTime = 1000; // ms
|
|
||||||
int MoveTime = 4000; // ms
|
|
||||||
int TileTime = 6000; // ms
|
|
||||||
int ScrollWaitTime = 1000; // ms
|
|
||||||
int ScrollLineTime = 200; // ms
|
|
||||||
int ScrollTotalTime = 8000; // ms
|
|
||||||
uint64_t Start = 0;
|
|
||||||
uint64_t ScrollStartTime = 0;
|
|
||||||
int ScrollLineNumber = 0;
|
|
||||||
cPoint MoveStart, MoveEnd;
|
|
||||||
cPoint TileStart, TileEnd;
|
|
||||||
cPoint ScrollStart, ScrollEnd;
|
|
||||||
int Line = osd->Height() / 20;
|
|
||||||
int StartLine = Line;
|
|
||||||
cPoint OldCursor;
|
|
||||||
int State = 0;
|
|
||||||
while (Running()) {
|
|
||||||
cPixmap::Lock();
|
|
||||||
bool Animated = false;
|
|
||||||
uint64_t Now = cTimeMs::Now();
|
|
||||||
if (FadeInPixmap) {
|
|
||||||
double t = min(double(Now - Start) / FadeTime, 1.0);
|
|
||||||
int Alpha = t * ALPHA_OPAQUE;
|
|
||||||
FadeInPixmap->SetAlpha(Alpha);
|
|
||||||
if (t >= 1)
|
|
||||||
FadeInPixmap = NULL;
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (FadeOutPixmap) {
|
|
||||||
double t = min(double(Now - Start) / FadeTime, 1.0);
|
|
||||||
int Alpha = ALPHA_OPAQUE - t * ALPHA_OPAQUE;
|
|
||||||
FadeOutPixmap->SetAlpha(Alpha);
|
|
||||||
if (t >= 1)
|
|
||||||
FadeOutPixmap = NULL;
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (MovePixmap) {
|
|
||||||
double t = min(double(Now - Start) / MoveTime, 1.0);
|
|
||||||
int x = MoveStart.X() + t * (MoveEnd.X() - MoveStart.X());
|
|
||||||
int y = MoveStart.Y() + t * (MoveEnd.Y() - MoveStart.Y());
|
|
||||||
cRect r = MovePixmap->ViewPort();
|
|
||||||
r.SetPoint(x, y);
|
|
||||||
MovePixmap->SetViewPort(r);
|
|
||||||
if (t >= 1)
|
|
||||||
MovePixmap = NULL;
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (TilePixmap) {
|
|
||||||
double t = min(double(Now - Start) / TileTime, 1.0);
|
|
||||||
int x = TileStart.X() + t * (TileEnd.X() - TileStart.X());
|
|
||||||
int y = TileStart.Y() + t * (TileEnd.Y() - TileStart.Y());
|
|
||||||
TilePixmap->SetDrawPortPoint(cPoint(x, y));
|
|
||||||
if (t >= 1) {
|
|
||||||
destroyablePixmap = TilePixmap;
|
|
||||||
TilePixmap = NULL;
|
|
||||||
}
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (ScrollPixmap) {
|
|
||||||
if (int(Now - Start) > ScrollWaitTime) {
|
|
||||||
if (ScrollStartTime) {
|
|
||||||
double t = min(double(Now - ScrollStartTime) / ScrollLineTime, 1.0);
|
|
||||||
int x = ScrollStart.X() + t * (ScrollEnd.X() - ScrollStart.X());
|
|
||||||
int y = ScrollStart.Y() + t * (ScrollEnd.Y() - ScrollStart.Y());
|
|
||||||
ScrollPixmap->SetDrawPortPoint(cPoint(x, y));
|
|
||||||
if (t >= 1) {
|
|
||||||
if (int(Now - Start) < ScrollTotalTime) {
|
|
||||||
cRect r = ScrollPixmap->DrawPort();
|
|
||||||
r.SetPoint(-r.X(), -r.Y());
|
|
||||||
ScrollPixmap->Pan(cPoint(0, 0), r);
|
|
||||||
cString s = cString::sprintf("Line %d", ++ScrollLineNumber);
|
|
||||||
ScrollPixmap->DrawRectangle(cRect(0, ScrollPixmap->ViewPort().Height(), ScrollPixmap->DrawPort().Width(), ScrollPixmap->DrawPort().Height()), clrTransparent);
|
|
||||||
ScrollPixmap->DrawText(cPoint(0, ScrollPixmap->ViewPort().Height()), s, clrYellow, clrTransparent, OsdFont);
|
|
||||||
ScrollStartTime = Now;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
FadeOutPixmap = ScrollPixmap;
|
|
||||||
ScrollPixmap = NULL;
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ScrollStartTime = Now;
|
|
||||||
}
|
|
||||||
Animated = true;
|
|
||||||
}
|
|
||||||
if (AnimPixmap) {
|
|
||||||
int d = AnimPixmap->ViewPort().Height();
|
|
||||||
if (clockwise)
|
|
||||||
d = -d;
|
|
||||||
cPoint p = AnimPixmap->DrawPort().Point().Shifted(0, d);
|
|
||||||
if (clockwise && p.Y() <= -AnimPixmap->DrawPort().Height())
|
|
||||||
p.SetY(0);
|
|
||||||
else if (!clockwise && p.Y() > 0)
|
|
||||||
p.SetY(-(AnimPixmap->DrawPort().Height() - AnimPixmap->ViewPort().Height()));
|
|
||||||
AnimPixmap->SetDrawPortPoint(p);
|
|
||||||
}
|
|
||||||
if (!Animated) {
|
|
||||||
switch (State) {
|
|
||||||
case 0: {
|
|
||||||
FadeInPixmap = CreateTextPixmap("VDR", Line, 1, clrYellow, clrTransparent, LrgFont);
|
|
||||||
if (FadeInPixmap)
|
|
||||||
Line += FadeInPixmap->DrawPort().Height();
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1: {
|
|
||||||
FadeInPixmap = CreateTextPixmap("Video Disk Recorder", Line, 3, clrYellow, clrTransparent, OsdFont);
|
|
||||||
if (FadeInPixmap)
|
|
||||||
Line += FadeInPixmap->DrawPort().Height();
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2: {
|
|
||||||
FadeInPixmap = CreateTextPixmap("True Color OSD Demo", Line, 1, clrYellow, clrTransparent, OsdFont);
|
|
||||||
if (FadeInPixmap)
|
|
||||||
Line += FadeInPixmap->DrawPort().Height();
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 3: {
|
|
||||||
NextPixmap = CreateTextPixmap("Millions of colors", Line, 1, clrYellow, clrTransparent, LrgFont);
|
|
||||||
if (NextPixmap) {
|
|
||||||
FadeInPixmap = NextPixmap;
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
StartLine = Line;
|
|
||||||
Line += NextPixmap->DrawPort().Height();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4: {
|
|
||||||
Line += osd->Height() / 10;
|
|
||||||
int w = osd->Width() / 2;
|
|
||||||
int h = osd->Height() - Line - osd->Height() / 10;
|
|
||||||
cImage Image(cSize(w, h));
|
|
||||||
for (int y = 0; y < h; y++) {
|
|
||||||
for (int x = 0; x < w; x++)
|
|
||||||
Image.SetPixel(cPoint(x, y), HsvToColor(360 * double(x) / w, 1 - double(y) / h, 1) | 0xDF000000);
|
|
||||||
}
|
|
||||||
if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, Line, w, h))) {
|
|
||||||
Pixmap->DrawImage(cPoint(0, 0), Image);
|
|
||||||
toggleablePixmap = Pixmap;
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5: {
|
|
||||||
if (NextPixmap) {
|
|
||||||
MovePixmap = NextPixmap;
|
|
||||||
MoveStart = MovePixmap->ViewPort().Point();
|
|
||||||
MoveEnd.Set(osd->Width() - MovePixmap->ViewPort().Width(), osd->Height() - MovePixmap->ViewPort().Height());
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 6: {
|
|
||||||
TilePixmap = CreateTextPixmap("Tiled Pixmaps", StartLine, 1, clrRed, clrWhite, OsdFont);
|
|
||||||
if (TilePixmap) {
|
|
||||||
TilePixmap->SetViewPort(TilePixmap->ViewPort().Grown(TilePixmap->DrawPort().Width(), TilePixmap->DrawPort().Height()));
|
|
||||||
TilePixmap->SetAlpha(200);
|
|
||||||
TilePixmap->SetTile(true);
|
|
||||||
TileStart = TilePixmap->DrawPort().Point();
|
|
||||||
TileEnd = TileStart.Shifted(TilePixmap->ViewPort().Width(), TilePixmap->ViewPort().Height());
|
|
||||||
MovePixmap = TilePixmap;
|
|
||||||
MoveStart = MovePixmap->ViewPort().Point();
|
|
||||||
MoveEnd.Set(10, osd->Height() - MovePixmap->ViewPort().Height() - 10);
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 7: {
|
|
||||||
const char *Text = "Scrolling Pixmaps";
|
|
||||||
int w = OsdFont->Width(Text);
|
|
||||||
int h = OsdFont->Height();
|
|
||||||
if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, StartLine, w, 2 * h), cRect(0, 0, w, 3 * h))) {
|
|
||||||
Pixmap->Clear();
|
|
||||||
Pixmap->DrawText(cPoint(0, 0), Text, clrYellow, clrTransparent, OsdFont);
|
|
||||||
cString s = cString::sprintf("Line %d", ++ScrollLineNumber);
|
|
||||||
Pixmap->DrawText(cPoint(0, Pixmap->ViewPort().Height()), s, clrYellow, clrTransparent, OsdFont);
|
|
||||||
ScrollPixmap = Pixmap;
|
|
||||||
ScrollStart.Set(0, 0);
|
|
||||||
ScrollEnd.Set(0, -h);
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8: {
|
|
||||||
const char *Text = "Animation";
|
|
||||||
const int Size = SmlFont->Width(Text) + 10;
|
|
||||||
const int NumDots = 12;
|
|
||||||
const int AnimFrames = NumDots;
|
|
||||||
int Rows = min(osd->MaxPixmapSize().Height() / Size, AnimFrames);
|
|
||||||
int Cols = (AnimFrames + Rows - 1) / Rows;
|
|
||||||
// Temporarily using pixmap layer 0 to have the text alpha blended:
|
|
||||||
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size * Cols, Size * Rows));
|
|
||||||
if (AnimPixmap) {
|
|
||||||
AnimPixmap->SetAlpha(0);
|
|
||||||
AnimPixmap->Clear();
|
|
||||||
const int Diameter = Size / 5;
|
|
||||||
for (int Frame = 0; Frame < AnimFrames; Frame++) {
|
|
||||||
int x0 = Frame / Rows * Size;
|
|
||||||
int y0 = Frame % Rows * Size;
|
|
||||||
AnimPixmap->DrawEllipse(cRect(x0, y0, Size, Size), 0xDDFFFFFF);
|
|
||||||
int xc = x0 + Size / 2 - Diameter / 2;
|
|
||||||
int yc = y0 + Size / 2 - Diameter / 2;
|
|
||||||
int Color = 0xFF;
|
|
||||||
int Delta = Color / NumDots / 3;
|
|
||||||
for (int a = 0; a < NumDots; a++) {
|
|
||||||
double t = 2 * M_PI * (Frame + a) / NumDots;
|
|
||||||
int x = xc + ((Size - Diameter) / 2 - 5) * cos(t);
|
|
||||||
int y = yc + ((Size - Diameter) / 2 - 5) * sin(t);
|
|
||||||
AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color));
|
|
||||||
Color -= Delta;
|
|
||||||
}
|
|
||||||
AnimPixmap->DrawText(cPoint(x0, y0), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
|
|
||||||
}
|
|
||||||
AnimPixmap->SetLayer(3); // now setting the actual pixmap layer
|
|
||||||
FadeInPixmap = AnimPixmap;
|
|
||||||
LOCK_THREAD;
|
|
||||||
OldCursor = cursor = AnimPixmap->ViewPort().Point();
|
|
||||||
cursorLimits.Set(0, 0, osd->Width(), osd->Height());
|
|
||||||
cursorLimits.SetRight(cursorLimits.Right() - Size);
|
|
||||||
cursorLimits.SetBottom(cursorLimits.Bottom() - Size);
|
|
||||||
cursorLimits.Grow(-10, -10);
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
State++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 9: {
|
|
||||||
LOCK_THREAD;
|
|
||||||
if (cursor != OldCursor) {
|
|
||||||
MovePixmap = AnimPixmap;
|
|
||||||
MoveStart = MovePixmap->ViewPort().Point();
|
|
||||||
MoveEnd = OldCursor = cursor;
|
|
||||||
MoveTime = 500;
|
|
||||||
Start = cTimeMs::Now();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
osd->Flush();
|
|
||||||
cPixmap::Unlock();
|
|
||||||
int Delta = cTimeMs::Now() - Now;
|
|
||||||
if (Delta < FrameTime)
|
|
||||||
cCondWait::SleepMs(FrameTime - Delta);
|
|
||||||
}
|
|
||||||
destroyablePixmap = NULL;
|
|
||||||
toggleablePixmap = NULL;
|
|
||||||
delete OsdFont;
|
|
||||||
delete SmlFont;
|
|
||||||
delete LrgFont;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cTrueColorDemo::SetArea(void)
|
|
||||||
{
|
|
||||||
if (osd) {
|
|
||||||
tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
|
|
||||||
return osd->SetAreas(&Area, 1) == oeOk;
|
|
||||||
}
|
|
||||||
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();
|
|
||||||
Start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eOSState cTrueColorDemo::ProcessKey(eKeys Key)
|
|
||||||
{
|
|
||||||
eOSState state = cOsdObject::ProcessKey(Key);
|
|
||||||
if (state == osUnknown) {
|
|
||||||
LOCK_PIXMAPS;
|
|
||||||
LOCK_THREAD;
|
|
||||||
const int d = 80;
|
|
||||||
switch (Key & ~k_Repeat) {
|
|
||||||
case kUp: cursor.SetY(max(cursorLimits.Top(), cursor.Y() - d)); clockwise = false; break;
|
|
||||||
case kDown: cursor.SetY(min(cursorLimits.Bottom(), cursor.Y() + d)); clockwise = true; break;
|
|
||||||
case kLeft: cursor.SetX(max(cursorLimits.Left(), cursor.X() - d)); clockwise = false; break;
|
|
||||||
case kRight: cursor.SetX(min(cursorLimits.Right(), cursor.X() + d)); clockwise = true; break;
|
|
||||||
case kRed: if (destroyablePixmap) {
|
|
||||||
osd->DestroyPixmap(destroyablePixmap);
|
|
||||||
destroyablePixmap = NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case kGreen: if (toggleablePixmap)
|
|
||||||
toggleablePixmap->SetLayer(-toggleablePixmap->Layer());
|
|
||||||
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;
|
|
||||||
default: return state;
|
|
||||||
}
|
|
||||||
state = osContinue;
|
|
||||||
}
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cPluginOsddemo --------------------------------------------------------
|
// --- cPluginOsddemo --------------------------------------------------------
|
||||||
|
|
||||||
class cPluginOsddemo : public cPlugin {
|
class cPluginOsddemo : public cPlugin {
|
||||||
@ -746,8 +131,6 @@ void cPluginOsddemo::Housekeeping(void)
|
|||||||
cOsdObject *cPluginOsddemo::MainMenuAction(void)
|
cOsdObject *cPluginOsddemo::MainMenuAction(void)
|
||||||
{
|
{
|
||||||
// Perform the action when selected from the main VDR menu.
|
// Perform the action when selected from the main VDR menu.
|
||||||
if (cOsdProvider::SupportsTrueColor())
|
|
||||||
return new cTrueColorDemo;
|
|
||||||
return new cLineGame;
|
return new cLineGame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 <Rolf.Ahrenberg@sci.fi>).
|
- Added Finnish texts (thanks to Rolf Ahrenberg <rahrenbe@cc.hut.fi>).
|
||||||
|
|
||||||
2008-01-27: Version 0.0.3
|
2008-01-27: Version 0.0.3
|
||||||
|
|
||||||
@ -33,90 +33,3 @@ VDR Plugin 'pictures' Revision History
|
|||||||
2008-03-14: Version 0.0.7
|
2008-03-14: Version 0.0.7
|
||||||
|
|
||||||
- Added Russian translations (thanks to Alexander Gross).
|
- Added Russian translations (thanks to Alexander Gross).
|
||||||
|
|
||||||
2009-12-06: Version 0.0.8
|
|
||||||
|
|
||||||
- Several code modifications to avoid compiler warnings (thanks to Winfried Köhler).
|
|
||||||
|
|
||||||
2010-02-28: Version 0.0.9
|
|
||||||
|
|
||||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
|
||||||
|
|
||||||
2011-02-20: Version 0.1.0
|
|
||||||
|
|
||||||
- Fixed reallocating memory (reported by Paul Menzel).
|
|
||||||
|
|
||||||
2011-07-23:
|
|
||||||
|
|
||||||
- Now rotating images according to the EXIF 'Orientation' parameter.
|
|
||||||
|
|
||||||
2011-08-14:
|
|
||||||
|
|
||||||
- The pic2mpg script now generates HD images (thanks to Andre Weidemann for his
|
|
||||||
support in using convert/ffmpeg). The old SD version is still available as
|
|
||||||
pic2mpg-sd.
|
|
||||||
|
|
||||||
2011-11-02:
|
|
||||||
|
|
||||||
- Fixed handling images that are rotated by 180 degrees in pic2mpg.
|
|
||||||
|
|
||||||
2012-01-08:
|
|
||||||
|
|
||||||
- Added option -o to pic2mpg.
|
|
||||||
|
|
||||||
2012-02-17:
|
|
||||||
|
|
||||||
- cReadDir::Next() now skips directory entries "." and "..".
|
|
||||||
|
|
||||||
2012-02-27: Version 0.1.2
|
|
||||||
|
|
||||||
- Removed an obsolete command line option.
|
|
||||||
|
|
||||||
2012-04-28: Version 0.1.3
|
|
||||||
|
|
||||||
- Added cPictureControl::GetHeader().
|
|
||||||
|
|
||||||
2012-12-27: Version 0.1.4
|
|
||||||
|
|
||||||
- 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,56 +1,49 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.2 2008/01/13 13:00:04 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.
|
||||||
# By default the main source file also carries this name.
|
# By default the main source file also carries this name.
|
||||||
|
# IMPORTANT: the presence of this macro is important for the Make.config
|
||||||
|
# file. So it must be defined, even if it is not used here!
|
||||||
|
#
|
||||||
PLUGIN = pictures
|
PLUGIN = pictures
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
LOCDIR = $(call PKGCFG,locdir)
|
|
||||||
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:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
@ -58,64 +51,54 @@ OBJS = $(PLUGIN).o entry.o menu.o player.o
|
|||||||
|
|
||||||
### The main target:
|
### The main target:
|
||||||
|
|
||||||
all: $(SOFILE) i18n
|
all: libvdr-$(PLUGIN).so i18n
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Internationalization (I18N):
|
### Internationalization (I18N):
|
||||||
|
|
||||||
PODIR = po
|
PODIR = po
|
||||||
|
LOCALEDIR = $(VDRDIR)/locale
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(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
|
||||||
@echo MO $@
|
msgfmt -c -o $@ $<
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
@echo GT $@
|
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $^
|
||||||
$(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)
|
||||||
@echo PO $@
|
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||||
install -D -m644 $< $@
|
@mkdir -p $(dir $@)
|
||||||
|
cp $< $@
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
i18n: $(I18Nmo) $(I18Npot)
|
i18n: $(I18Nmsgs) $(I18Npot)
|
||||||
|
|
||||||
install-i18n: $(I18Nmsgs)
|
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
dist: clean
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib install-i18n
|
|
||||||
|
|
||||||
dist: $(I18Npo) clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||||
@ -124,5 +107,4 @@ dist: $(I18Npo) clean
|
|||||||
@echo Distribution package created as $(PACKAGE).tgz
|
@echo Distribution package created as $(PACKAGE).tgz
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
||||||
|
@ -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 <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/vdr
|
||||||
|
|
||||||
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: entry.c 2.1 2012/02/17 14:00:28 kls Exp $
|
* $Id: entry.c 1.3 2008/02/17 13:42:34 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "entry.h"
|
#include "entry.h"
|
||||||
@ -48,6 +48,7 @@ void cPictureEntry::Load(void) const
|
|||||||
if (d.Ok()) {
|
if (d.Ok()) {
|
||||||
struct dirent *e;
|
struct dirent *e;
|
||||||
while ((e = d.Next()) != NULL) {
|
while ((e = d.Next()) != NULL) {
|
||||||
|
if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
|
||||||
struct stat ds;
|
struct stat ds;
|
||||||
if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
|
if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
|
||||||
if (!entries)
|
if (!entries)
|
||||||
@ -55,6 +56,7 @@ void cPictureEntry::Load(void) const
|
|||||||
entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode)));
|
entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (entries)
|
if (entries)
|
||||||
entries->Sort();
|
entries->Sort();
|
||||||
}
|
}
|
||||||
|
@ -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 4.1 2015/07/17 10:13:56 kls Exp $
|
* $Id: menu.c 1.1 2008/01/13 11:35:18 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) {
|
||||||
const cPictureEntry *pe = l->Get(Current());
|
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,49 +7,62 @@
|
|||||||
#
|
#
|
||||||
# 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 4.1 2017/10/06 14:42:18 kls Exp $
|
# $Id: pic2mpg 1.4 2008/02/29 14:34:22 kls Exp $
|
||||||
|
|
||||||
|
## TODO implement HDTV (1920 x 1080)
|
||||||
|
|
||||||
use File::Path;
|
use File::Path;
|
||||||
use File::Spec;
|
use File::Spec;
|
||||||
use Getopt::Std;
|
use Getopt::Std;
|
||||||
use Image::ExifTool qw(:Public);
|
use Image::Size;
|
||||||
|
|
||||||
$Usage = qq{
|
$Usage = qq{
|
||||||
Usage: $0 [options] picture-dir mpeg-dir
|
Usage: $0 [options] picture-dir mpeg-dir
|
||||||
$0 [options] picture-file mpeg-file
|
$0 [options] picture-file mpeg-file
|
||||||
|
|
||||||
Options: -f Force conversion
|
Options: -a Aspect ratio 4:3 (default is 16:9)
|
||||||
|
-f Force conversion
|
||||||
-h print Help
|
-h print Help
|
||||||
-o percent overscan in percent
|
-i Ignore unknown file types
|
||||||
-s size Screen size (WIDTHxHEIGHT, default is 1920x1080)
|
-n NTSC (default is PAL)
|
||||||
-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
|
-x percent X overscan in percent
|
||||||
|
-y percent Y overscan in percent
|
||||||
};
|
};
|
||||||
|
|
||||||
getopts("fho:s:v:x:") || die $Usage;
|
getopts("afhinv:x:y:") || die $Usage;
|
||||||
|
|
||||||
die $Usage if $opt_h;
|
die $Usage if $opt_h;
|
||||||
|
|
||||||
|
$Aspect = $opt_a;
|
||||||
$Force = $opt_f;
|
$Force = $opt_f;
|
||||||
$Overscan = $opt_o || 0;
|
$Ignore = $opt_i;
|
||||||
$Size = $opt_s || "1920x1080";
|
$NTSC = $opt_n;
|
||||||
$Verbose = $opt_v;
|
$Verbose = $opt_v;
|
||||||
@Exclude = split(',', $opt_x || "");
|
$OverscanX = $opt_x;
|
||||||
|
$OverscanY = $opt_y;
|
||||||
|
|
||||||
$ListFiles = $Verbose >= 1;
|
$ListFiles = $Verbose >= 1;
|
||||||
$Detailed = $Verbose >= 2;
|
$Detailed = $Verbose >= 2;
|
||||||
|
|
||||||
# Supported picture types:
|
# Screen size:
|
||||||
|
|
||||||
%PICTYPES = (
|
$SW = $NTSC ? 720 : 720;
|
||||||
bmp => 1,
|
$SH = $NTSC ? 480 : 576;
|
||||||
gif => 1,
|
|
||||||
jpeg => 1,
|
$ScreenRatio = $Aspect ? 4 / 3 : 16 / 9;
|
||||||
jpg => 1,
|
|
||||||
png => 1,
|
# Converter programs:
|
||||||
pnm => 1,
|
|
||||||
tif => 1,
|
%PNMCONV = (
|
||||||
tiff => 1,
|
bmp => "bmptopnm",
|
||||||
|
gif => "giftopnm",
|
||||||
|
jpeg => "jpegtopnm",
|
||||||
|
jpg => "jpegtopnm",
|
||||||
|
png => "pngtopnm",
|
||||||
|
pnm => "cat",
|
||||||
|
tif => "tifftopnm",
|
||||||
|
tiff => "tifftopnm",
|
||||||
);
|
);
|
||||||
|
|
||||||
# Command options:
|
# Command options:
|
||||||
@ -58,14 +71,12 @@ die "$0: missing parameter\n" unless $ARGV[0] && $ARGV[1];
|
|||||||
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
||||||
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
||||||
|
|
||||||
$Extent = $Size;
|
$verbose1 = $Detailed ? "--verbose" : "";
|
||||||
if ($Overscan > 0) {
|
$verbose2 = $Detailed ? "-v 2" : "-v 0";
|
||||||
my ($x, $y) = $Size =~ /(.*)x(.*)/;
|
$system1 = $NTSC ? "" : "--pal";
|
||||||
my $r = (100 + $Overscan) / 100;
|
$system2 = $NTSC ? "n" : "p";
|
||||||
$x = int($x * $r + 0.5);
|
$framerate = $NTSC ? "30000:1001" : "25:1";
|
||||||
$y = int($y * $r + 0.5);
|
$aspect = $Aspect ? "2" : "3";
|
||||||
$Extent = "${x}x$y";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Convert a single file:
|
# Convert a single file:
|
||||||
|
|
||||||
@ -84,14 +95,10 @@ $MPGDIR = File::Spec->rel2abs($ARGV[1]);
|
|||||||
|
|
||||||
chdir($PICDIR) || die "$PICDIR: $!\n";
|
chdir($PICDIR) || die "$PICDIR: $!\n";
|
||||||
|
|
||||||
@Pictures = `find -type f | sort`;
|
@Pictures = `find -type f`;
|
||||||
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/\/[^\/]*$//;
|
||||||
@ -128,7 +135,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";
|
||||||
Exec("rm -rf $dir");
|
!system("rm -rf $dir") || die "$dir: $!\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,22 +145,32 @@ sub ConvertFile
|
|||||||
{
|
{
|
||||||
my ($Pict, $Mpeg) = @_;
|
my ($Pict, $Mpeg) = @_;
|
||||||
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
||||||
return if (!defined $PICTYPES{$Type});
|
if (!defined $PNMCONV{$Type}) {
|
||||||
my $Exif = ImageInfo($Pict);
|
return if ($Ignore);
|
||||||
my $Orientation = $$Exif{"Orientation"};
|
die "unknown file type '$Type': '$Pict'\n";
|
||||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+)/;
|
}
|
||||||
my $Rotate = ($Degrees == 90) ? "transpose=clock" : ($Degrees == 180) ? "hflip,vflip" : ($Degrees == 270) ? "transpose=cclock" : "";
|
my ($w, $h) = imgsize($Pict);
|
||||||
$Rotate .= ',' if ($Rotate);
|
print "image size is $w x $h\n" if ($Detailed);
|
||||||
my $Background = '#000000@1';
|
if ($w / $h <= $ScreenRatio) {
|
||||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
$w = $h * $ScreenRatio;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$h = $w / $ScreenRatio;
|
||||||
|
}
|
||||||
|
my $ScaleW = $SW / $w * (100 - 2 * $OverscanX) / 100;
|
||||||
|
my $ScaleH = $SH / $h * (100 - 2 * $OverscanY) / 100;
|
||||||
$Pict = EscapeMeta($Pict);
|
$Pict = EscapeMeta($Pict);
|
||||||
$Mpeg = EscapeMeta($Mpeg);
|
$Mpeg = EscapeMeta($Mpeg);
|
||||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
print "$Pict -> $Mpeg\n" if $ListFiles;
|
||||||
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 "
|
my $Cmd = "$PNMCONV{$Type} $Pict 2> /dev/null |"
|
||||||
. ($Detailed ? "" : "2>/dev/null");
|
. "pnmscale $verbose1 --xscale=$ScaleW --yscale=$ScaleH |"
|
||||||
Exec($Cmd);
|
. "pnmpad $verbose1 --black --width $SW --height $SH |"
|
||||||
|
. "ppmntsc $verbose1 $system1 |"
|
||||||
|
. "ppmtoy4m $verbose2 -F $framerate -I p -S 420mpeg2 |"
|
||||||
|
. "mpeg2enc $verbose2 -f 3 -b 12500 -a $aspect -q 1 -n $system2 -o $Mpeg";
|
||||||
|
!system($Cmd) || die "$Cmd: $!\n";
|
||||||
$Cmd = "touch -r $Pict $Mpeg";
|
$Cmd = "touch -r $Pict $Mpeg";
|
||||||
Exec($Cmd);
|
!system($Cmd) || die "$Cmd: $!\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
sub EscapeMeta
|
sub EscapeMeta
|
||||||
@ -163,10 +180,3 @@ 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";
|
|
||||||
}
|
|
||||||
|
@ -1,193 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
# pic2mpg: Convert picture files to MPEG still frames
|
|
||||||
#
|
|
||||||
# Converts either a single picture file or all files in a
|
|
||||||
# given directory (recursively) to MPEG still frames.
|
|
||||||
#
|
|
||||||
# See the README file for copyright information and how to reach the author.
|
|
||||||
#
|
|
||||||
# $Id: pic2mpg-sd 2.1 2011/07/23 14:23:59 kls Exp $
|
|
||||||
|
|
||||||
## TODO implement HDTV (1920 x 1080)
|
|
||||||
|
|
||||||
use File::Path;
|
|
||||||
use File::Spec;
|
|
||||||
use Getopt::Std;
|
|
||||||
use Image::ExifTool qw(:Public);
|
|
||||||
use Image::Size;
|
|
||||||
|
|
||||||
$Usage = qq{
|
|
||||||
Usage: $0 [options] picture-dir mpeg-dir
|
|
||||||
$0 [options] picture-file mpeg-file
|
|
||||||
|
|
||||||
Options: -a Aspect ratio 4:3 (default is 16:9)
|
|
||||||
-f Force conversion
|
|
||||||
-h print Help
|
|
||||||
-i Ignore unknown file types
|
|
||||||
-n NTSC (default is PAL)
|
|
||||||
-v num Verbose (0=none, 1=list files, 2=detailed)
|
|
||||||
-x percent X overscan in percent
|
|
||||||
-y percent Y overscan in percent
|
|
||||||
};
|
|
||||||
|
|
||||||
getopts("afhinv:x:y:") || die $Usage;
|
|
||||||
|
|
||||||
die $Usage if $opt_h;
|
|
||||||
|
|
||||||
$Aspect = $opt_a;
|
|
||||||
$Force = $opt_f;
|
|
||||||
$Ignore = $opt_i;
|
|
||||||
$NTSC = $opt_n;
|
|
||||||
$Verbose = $opt_v;
|
|
||||||
$OverscanX = $opt_x;
|
|
||||||
$OverscanY = $opt_y;
|
|
||||||
|
|
||||||
$ListFiles = $Verbose >= 1;
|
|
||||||
$Detailed = $Verbose >= 2;
|
|
||||||
|
|
||||||
# Screen size:
|
|
||||||
|
|
||||||
$SW = $NTSC ? 720 : 720;
|
|
||||||
$SH = $NTSC ? 480 : 576;
|
|
||||||
|
|
||||||
$ScreenRatio = $Aspect ? 4 / 3 : 16 / 9;
|
|
||||||
|
|
||||||
# Converter programs:
|
|
||||||
|
|
||||||
%PNMCONV = (
|
|
||||||
bmp => "bmptopnm",
|
|
||||||
gif => "giftopnm",
|
|
||||||
jpeg => "jpegtopnm",
|
|
||||||
jpg => "jpegtopnm",
|
|
||||||
png => "pngtopnm",
|
|
||||||
pnm => "cat",
|
|
||||||
tif => "tifftopnm",
|
|
||||||
tiff => "tifftopnm",
|
|
||||||
);
|
|
||||||
|
|
||||||
# Command options:
|
|
||||||
|
|
||||||
die "$0: missing parameter\n" unless $ARGV[0] && $ARGV[1];
|
|
||||||
die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
|
|
||||||
die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
|
|
||||||
|
|
||||||
$verbose1 = $Detailed ? "--verbose" : "";
|
|
||||||
$verbose2 = $Detailed ? "-v 2" : "-v 0";
|
|
||||||
$system1 = $NTSC ? "" : "--pal";
|
|
||||||
$system2 = $NTSC ? "n" : "p";
|
|
||||||
$framerate = $NTSC ? "30000:1001" : "25:1";
|
|
||||||
$aspect = $Aspect ? "2" : "3";
|
|
||||||
|
|
||||||
# Convert a single file:
|
|
||||||
|
|
||||||
if (-f $ARGV[0]) {
|
|
||||||
die "$0: mixed file and directory ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -f $ARGV[1];
|
|
||||||
ConvertFile($ARGV[0], $ARGV[1]);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
die "$0: mixed directory and file ('$ARGV[0]' <-> '$ARGV[1]')\n" unless !-e $ARGV[1] || -d $ARGV[1];
|
|
||||||
|
|
||||||
$PICDIR = File::Spec->rel2abs($ARGV[0]);
|
|
||||||
$MPGDIR = File::Spec->rel2abs($ARGV[1]);
|
|
||||||
|
|
||||||
# Convert pictures to mpegs:
|
|
||||||
|
|
||||||
chdir($PICDIR) || die "$PICDIR: $!\n";
|
|
||||||
|
|
||||||
@Pictures = `find -type f`;
|
|
||||||
chomp(@Pictures);
|
|
||||||
|
|
||||||
for $pic (@Pictures) {
|
|
||||||
my $mpg = "$MPGDIR/$pic.mpg";
|
|
||||||
if ($Force || !-e $mpg || -M $mpg > -M $pic) {
|
|
||||||
(my $dir = $mpg) =~ s/\/[^\/]*$//;
|
|
||||||
mkpath($dir);
|
|
||||||
ConvertFile($pic, $mpg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove mpegs without pictures:
|
|
||||||
|
|
||||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
|
||||||
|
|
||||||
@Mpegs = `find -type f`;
|
|
||||||
chomp(@Mpegs);
|
|
||||||
|
|
||||||
for $mpg (@Mpegs) {
|
|
||||||
my $pic = "$PICDIR/$mpg";
|
|
||||||
$pic =~ s/\.mpg$//;
|
|
||||||
if (!-e $pic) {
|
|
||||||
print "removing $mpg\n";
|
|
||||||
unlink($mpg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove empty directories:
|
|
||||||
|
|
||||||
chdir($MPGDIR) || die "$MPGDIR: $!\n";
|
|
||||||
|
|
||||||
for ($i = 0; $i < 10; $i++) { # dirs might become empty when removing empty subdirs
|
|
||||||
@Dirs = `find -type d -empty`;
|
|
||||||
chomp(@Dirs);
|
|
||||||
last unless @Dirs;
|
|
||||||
|
|
||||||
for $dir (@Dirs) {
|
|
||||||
$dir = EscapeMeta($dir);
|
|
||||||
print "removing $dir\n";
|
|
||||||
!system("rm -rf $dir") || die "$dir: $!\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Actual file conversion:
|
|
||||||
|
|
||||||
sub ConvertFile
|
|
||||||
{
|
|
||||||
my ($Pict, $Mpeg) = @_;
|
|
||||||
(my $Type) = lc($Pict) =~ /\.([^\.]*)$/;
|
|
||||||
if (!defined $PNMCONV{$Type}) {
|
|
||||||
return if ($Ignore);
|
|
||||||
die "unknown file type '$Type': '$Pict'\n";
|
|
||||||
}
|
|
||||||
my ($w, $h) = imgsize($Pict);
|
|
||||||
print "image size is $w x $h\n" if ($Detailed);
|
|
||||||
my $Exif = ImageInfo($Pict);
|
|
||||||
my $Orientation = $$Exif{"Orientation"};
|
|
||||||
my ($Degrees) = $Orientation =~ /Rotate ([0-9]+) /;
|
|
||||||
my $Rotate = "-null";
|
|
||||||
$Rotate = "-cw" if $Degrees eq "90";
|
|
||||||
$Rotate = "-ccw" if $Degrees eq "270";
|
|
||||||
$Rotate = "-r180" if $Degrees eq "180";
|
|
||||||
print "orientation = '$Orientation' -> rotation = $Rotate\n" if ($Detailed);
|
|
||||||
($w, $h) = ($h, $w) if ($Degrees eq "90" || $Degrees eq "270");
|
|
||||||
if ($w / $h <= $ScreenRatio) {
|
|
||||||
$w = $h * $ScreenRatio;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$h = $w / $ScreenRatio;
|
|
||||||
}
|
|
||||||
my $ScaleW = $SW / $w * (100 - 2 * $OverscanX) / 100;
|
|
||||||
my $ScaleH = $SH / $h * (100 - 2 * $OverscanY) / 100;
|
|
||||||
$Pict = EscapeMeta($Pict);
|
|
||||||
$Mpeg = EscapeMeta($Mpeg);
|
|
||||||
print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
|
|
||||||
my $Cmd = "$PNMCONV{$Type} $Pict 2> /dev/null |"
|
|
||||||
. "pamflip $verbose1 $Rotate |"
|
|
||||||
. "pnmscale $verbose1 --xscale=$ScaleW --yscale=$ScaleH |"
|
|
||||||
. "pnmpad $verbose1 --black --width $SW --height $SH |"
|
|
||||||
. "ppmntsc $verbose1 $system1 |"
|
|
||||||
. "ppmtoy4m $verbose2 -F $framerate -I p -S 420mpeg2 |"
|
|
||||||
. "mpeg2enc $verbose2 -f 3 -b 12500 -a $aspect -q 1 -n $system2 -o $Mpeg";
|
|
||||||
!system($Cmd) || die "$Cmd: $!\n";
|
|
||||||
$Cmd = "touch -r $Pict $Mpeg";
|
|
||||||
!system($Cmd) || die "$Cmd: $!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub EscapeMeta
|
|
||||||
{
|
|
||||||
my $META = ' !"#$%&\'()*;<>?[\\]`{|}~';
|
|
||||||
my $s = shift;
|
|
||||||
$s =~ s/([$META])/\\$1/g;
|
|
||||||
return $s;
|
|
||||||
}
|
|
@ -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 5.1 2022/12/05 15:26:23 kls Exp $
|
* $Id: pictures.c 1.7 2008/03/14 12:57:19 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 = "2.6.1";
|
static const char *VERSION = "0.0.7";
|
||||||
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");
|
||||||
|
|
||||||
@ -82,11 +82,11 @@ bool cPluginPictures::ProcessArgs(int argc, char *argv[])
|
|||||||
// Implement command line argument processing here if applicable.
|
// Implement command line argument processing here if applicable.
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
{ "dir", required_argument, NULL, 'd' },
|
{ "dir", required_argument, NULL, 'd' },
|
||||||
{ NULL, no_argument, NULL, 0 }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) {
|
while ((c = getopt_long(argc, argv, "d:s:", long_options, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'd': strn0cpy(PictureDirectory, optarg, sizeof(PictureDirectory));
|
case 'd': strn0cpy(PictureDirectory, optarg, sizeof(PictureDirectory));
|
||||||
break;
|
break;
|
||||||
|
@ -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 5.1 2022/12/05 15:26:23 kls Exp $
|
* $Id: player.c 1.3 2008/02/09 12:13:10 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
@ -66,15 +66,8 @@ void cPicturePlayer::SetPicture(const char *FileName)
|
|||||||
length = read(f, buffer, size);
|
length = read(f, buffer, size);
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
if (length >= size) {
|
if (length >= size) {
|
||||||
int NewSize = size * 3 / 2;
|
size = size * 3 / 2;
|
||||||
if (uchar *NewBuffer = (uchar *)realloc(buffer, NewSize)) {
|
buffer = (uchar *)realloc(buffer, size);
|
||||||
buffer = NewBuffer;
|
|
||||||
size = NewSize;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOG_ERROR_STR("out of memory");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lseek(f, 0, SEEK_SET);
|
lseek(f, 0, SEEK_SET);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -96,10 +89,8 @@ 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(NULL)
|
:cControl(player = new cPicturePlayer)
|
||||||
{
|
{
|
||||||
player = new cPicturePlayer;
|
|
||||||
SetPlayer(player);
|
|
||||||
pictures = Pictures;
|
pictures = Pictures;
|
||||||
pictureEntry = PictureEntry;
|
pictureEntry = PictureEntry;
|
||||||
osd = NULL;
|
osd = NULL;
|
||||||
@ -206,14 +197,9 @@ void cPictureControl::DisplayCaption(void)
|
|||||||
osd->Flush();
|
osd->Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
cString cPictureControl::GetHeader(void)
|
|
||||||
{
|
|
||||||
return tr("Pictures");
|
|
||||||
}
|
|
||||||
|
|
||||||
eOSState cPictureControl::ProcessKey(eKeys Key)
|
eOSState cPictureControl::ProcessKey(eKeys Key)
|
||||||
{
|
{
|
||||||
switch (int(Key)) {
|
switch (Key) {
|
||||||
case kUp:
|
case kUp:
|
||||||
case kPlay: slideShowDelay.Set();
|
case kPlay: slideShowDelay.Set();
|
||||||
slideShow = true;
|
slideShow = true;
|
||||||
|
@ -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.h 2.1 2012/04/28 11:56:01 kls Exp $
|
* $Id: player.h 1.1 2008/01/13 11:29:27 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PLAYER_H
|
#ifndef _PLAYER_H
|
||||||
@ -39,7 +39,6 @@ private:
|
|||||||
public:
|
public:
|
||||||
cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow = false);
|
cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow = false);
|
||||||
virtual ~cPictureControl();
|
virtual ~cPictureControl();
|
||||||
virtual cString GetHeader(void);
|
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
virtual eOSState ProcessKey(eKeys Key);
|
||||||
static bool Active(void) { return active > 0; }
|
static bool Active(void) { return active > 0; }
|
||||||
static const char *LastDisplayed(void);
|
static const char *LastDisplayed(void);
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 <vdr@tvdr.de>, 2008
|
# Klaus Schmidinger <kls@cadsoft.de>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2008-01-12 17:38+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 <vdr@tvdr.de>\n"
|
"Last-Translator: Klaus Schmidinger <kls@cadsoft.de>\n"
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
"Language-Team: German\n"
|
||||||
"Language: de\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
# 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,19 +1,18 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 <Rolf.Ahrenberg@sci.fi>, 2008
|
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2008
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-pictures 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2008-01-12 17:38+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 <Rolf.Ahrenberg@sci.fi>\n"
|
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
"Language-Team: Finnish\n"
|
||||||
"Language: fi\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
@ -30,4 +29,4 @@ msgid "Slide show delay (s)"
|
|||||||
msgstr "Diaesityksen viive (s)"
|
msgstr "Diaesityksen viive (s)"
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
msgid "No picture directory has been defined!"
|
||||||
msgstr "Kuvahakemistoa ei ole määritelty!"
|
msgstr "Kuvahakemistoa ei ole määritelty!"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2008-01-12 17:38+0100\n"
|
||||||
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
"PO-Revision-Date: 2008-01-12 17:41+0100\n"
|
||||||
"Last-Translator: Patrice Staudt <patrice.staudt@laposte.net>\n"
|
"Last-Translator: Patrice Staudt <patrice.staudt@laposte.net>\n"
|
||||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
"Language-Team: French\n"
|
||||||
"Language: fr\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2008-01-12 17:38+0100\n"
|
||||||
"PO-Revision-Date: 2008-01-27 20:22+0100\n"
|
"PO-Revision-Date: 2008-01-27 20:22+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\n"
|
||||||
"Language: it\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
# 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.
|
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2009
|
|
||||||
#
|
|
||||||
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: 2009-12-08 12:41+0100\n"
|
|
||||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>, 2009\n"
|
|
||||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: lt\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 "Nuotraukos"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Paprasta nuotraukų naršyklė"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Nuotraukų katalogas"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Skaidrių peržiūros užlaikymas (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Nenustatytas nuotraukų katalogas!"
|
|
@ -1,34 +0,0 @@
|
|||||||
# 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,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2012-12-18 12:57+0100\n"
|
"POT-Creation-Date: 2008-01-12 17:38+0100\n"
|
||||||
"PO-Revision-Date: 2008-03-14 00:45+0100\n"
|
"PO-Revision-Date: 2008-03-14 00:45+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\n"
|
||||||
"Language: ru\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
# 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.
|
|
||||||
# Klaus Schmidinger <vdr@tvdr.de>, 2008
|
|
||||||
#
|
|
||||||
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: 2009-09-30 12:54+0100\n"
|
|
||||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
|
||||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
|
||||||
"Language: sk\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=iso-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "Pictures"
|
|
||||||
msgstr "Obrázky"
|
|
||||||
|
|
||||||
msgid "A simple picture viewer"
|
|
||||||
msgstr "Jednoduchý prehliadaè obrázkov"
|
|
||||||
|
|
||||||
msgid "Picture directory"
|
|
||||||
msgstr "Umiestnenie obrázkov"
|
|
||||||
|
|
||||||
msgid "Slide show delay (s)"
|
|
||||||
msgstr "Oneskorenie prezentácia (s)"
|
|
||||||
|
|
||||||
msgid "No picture directory has been defined!"
|
|
||||||
msgstr "Neboli preukázané ¾iadne fotky v adresári!"
|
|
@ -9,31 +9,3 @@ VDR Plugin 'servicedemo' Revision History
|
|||||||
|
|
||||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||||
so that a plain "make" will compile everything.
|
so that a plain "make" will compile everything.
|
||||||
|
|
||||||
2012-12-27: Version 0.1.3
|
|
||||||
|
|
||||||
- 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,12 +1,13 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.10 2008/01/13 13:00:07 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.
|
||||||
# By default the main source file also carries this name.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
|
PLUGIN = servicedemo # dummy name for Make.config
|
||||||
PLUGIN1 = svccli
|
PLUGIN1 = svccli
|
||||||
PLUGIN2 = svcsvr
|
PLUGIN2 = svcsvr
|
||||||
|
|
||||||
@ -14,28 +15,24 @@ PLUGIN2 = svcsvr
|
|||||||
|
|
||||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### The version number of VDR's plugin API:
|
|
||||||
|
|
||||||
APIVERSION = $(call PKGCFG,apiversion)
|
|
||||||
|
|
||||||
### Allow user defined options to overwrite defaults:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
@ -44,9 +41,9 @@ PACKAGE = vdr-$(ARCHIVE)
|
|||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
@ -59,33 +56,26 @@ all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
# Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = g++ -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
libvdr-$(PLUGIN1).so: $(PLUGIN1).o
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(PLUGIN1).o -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
libvdr-$(PLUGIN2).so: $(PLUGIN2).o
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(PLUGIN2).o -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
|
|
||||||
install -D libvdr-$(PLUGIN1).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION)
|
|
||||||
install -D libvdr-$(PLUGIN2).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
|
@ -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: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/vdr
|
||||||
|
|
||||||
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 4.1 2018/04/10 13:00:53 kls Exp $
|
* $Id: svccli.c 1.2 2007/08/15 13:18:08 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 = "2.4.0";
|
static const char *VERSION = "0.1.2";
|
||||||
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 4.1 2018/04/10 13:00:57 kls Exp $
|
* $Id: svcsvr.c 1.2 2007/08/15 13:18:59 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 = "2.4.0";
|
static const char *VERSION = "0.1.2";
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -79,85 +79,3 @@ VDR Plugin 'skincurses' Revision History
|
|||||||
2008-03-14: Version 0.1.7
|
2008-03-14: Version 0.1.7
|
||||||
|
|
||||||
- Added Russian translations (thanks to Alexander Gross).
|
- Added Russian translations (thanks to Alexander Gross).
|
||||||
|
|
||||||
2010-01-03: Version 0.1.8
|
|
||||||
|
|
||||||
- Displaying "genre" in event descriptions.
|
|
||||||
- Displaying "parental rating" in event descriptions.
|
|
||||||
|
|
||||||
2010-02-28: Version 0.1.9
|
|
||||||
|
|
||||||
- Added Lithuanian language translations (thanks to Valdemaras Pipiras).
|
|
||||||
|
|
||||||
2011-05-15: Version 0.1.10
|
|
||||||
|
|
||||||
- Avoiding a gcc 4.6 compiler error (thanks to Tobias Grimm).
|
|
||||||
|
|
||||||
2012-03-11: Version 0.1.11
|
|
||||||
|
|
||||||
- Adapted menu column widths of 'skincurses' to the wider HD OSD sizes.
|
|
||||||
|
|
||||||
2012-04-23: Version 0.1.12
|
|
||||||
|
|
||||||
- Now displaying disk usage in the title of the main and "Recordings" menu,
|
|
||||||
which is no longer done by the VDR core.
|
|
||||||
|
|
||||||
2012-12-27: Version 0.1.13
|
|
||||||
|
|
||||||
- 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,56 +1,49 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.15 2008/01/19 11:40:33 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.
|
||||||
# By default the main source file also carries this name.
|
# By default the main source file also carries this name.
|
||||||
|
# IMPORTANT: the presence of this macro is important for the Make.config
|
||||||
|
# file. So it must be defined, even if it is not used here!
|
||||||
|
#
|
||||||
PLUGIN = skincurses
|
PLUGIN = skincurses
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
LOCDIR = $(call PKGCFG,locdir)
|
|
||||||
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:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
@ -58,64 +51,54 @@ OBJS = $(PLUGIN).o
|
|||||||
|
|
||||||
### The main target:
|
### The main target:
|
||||||
|
|
||||||
all: $(SOFILE) i18n
|
all: libvdr-$(PLUGIN).so i18n
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Internationalization (I18N):
|
### Internationalization (I18N):
|
||||||
|
|
||||||
PODIR = po
|
PODIR = po
|
||||||
|
LOCALEDIR = $(VDRDIR)/locale
|
||||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||||
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
|
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(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
|
||||||
@echo MO $@
|
msgfmt -c -o $@ $<
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
@echo GT $@
|
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $^
|
||||||
$(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)
|
||||||
@echo PO $@
|
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||||
install -D -m644 $< $@
|
@mkdir -p $(dir $@)
|
||||||
|
cp $< $@
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
i18n: $(I18Nmo) $(I18Npot)
|
i18n: $(I18Nmsgs) $(I18Npot)
|
||||||
|
|
||||||
install-i18n: $(I18Nmsgs)
|
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -lncursesw -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
dist: clean
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib install-i18n
|
|
||||||
|
|
||||||
dist: $(I18Npo) clean
|
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||||
@ -124,5 +107,4 @@ dist: $(I18Npo) clean
|
|||||||
@echo Distribution package created as $(PACKAGE).tgz
|
@echo Distribution package created as $(PACKAGE).tgz
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
|
||||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
|
||||||
|
@ -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 <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/vdr
|
||||||
|
|
||||||
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,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 <vdr@tvdr.de>, 2007
|
# Klaus Schmidinger <kls@cadsoft.de>, 2007
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
"POT-Creation-Date: 2007-08-15 16:04+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 <vdr@tvdr.de>\n"
|
"Last-Translator: Klaus Schmidinger <kls@cadsoft.de>\n"
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
"Language-Team: German\n"
|
||||||
"Language: de\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
@ -19,13 +18,9 @@ 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"
|
||||||
|
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
# 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,33 +1,28 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 <Rolf.Ahrenberg@sci.fi>, 2007
|
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2007
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-skincurses 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
"POT-Creation-Date: 2007-08-14 20:54+0300\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 <Rolf.Ahrenberg@sci.fi>\n"
|
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
"Language-Team: Finnish\n"
|
||||||
"Language: fi\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
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 "
|
||||||
|
|
||||||
msgid "Text mode"
|
msgid "Text mode"
|
||||||
msgstr "Teksti"
|
msgstr "Teksti"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
"POT-Creation-Date: 2007-08-15 16:04+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\n"
|
||||||
"Language: it\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
@ -19,13 +18,9 @@ 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,33 +0,0 @@
|
|||||||
# 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.
|
|
||||||
# Valdemaras Pipiras <varas@ambernet.lt>, 2010
|
|
||||||
#
|
|
||||||
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: 2010-02-22 18:18+0200\n"
|
|
||||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
|
||||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
|
||||||
"Language: lt\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 "Tekstinis apvalkalas"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Išjungti garsą"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Garsas "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Tekstinis ręžimas"
|
|
@ -1,35 +0,0 @@
|
|||||||
# 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,17 +1,16 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de>
|
# Copyright (C) 2008 Klaus Schmidinger <kls@cadsoft.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 2.6.0\n"
|
"Project-Id-Version: VDR 1.6.0\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||||
"POT-Creation-Date: 2021-07-01 17:28+0200\n"
|
"POT-Creation-Date: 2007-08-15 16:04+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\n"
|
||||||
"Language: ru\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
@ -20,13 +19,9 @@ 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 "³àÞÜÚÞáâì"
|
||||||
|
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
# 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.
|
|
||||||
# Klaus Schmidinger <vdr@tvdr.de>, 2007
|
|
||||||
#
|
|
||||||
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: 2009-09-30 12:52+0100\n"
|
|
||||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
|
||||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
|
||||||
"Language: sk\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=iso-8859-2\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
msgid "A text only skin"
|
|
||||||
msgstr "Iba text vzhµadu"
|
|
||||||
|
|
||||||
msgid "errors"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Key$Mute"
|
|
||||||
msgstr "Stlmi» zvuk"
|
|
||||||
|
|
||||||
#. TRANSLATORS: note the trailing blank!
|
|
||||||
msgid "Volume "
|
|
||||||
msgstr "Hlasitos» "
|
|
||||||
|
|
||||||
msgid "Text mode"
|
|
||||||
msgstr "Textový re¾im"
|
|
@ -3,16 +3,15 @@
|
|||||||
*
|
*
|
||||||
* 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 5.1 2021/07/01 15:40:46 kls Exp $
|
* $Id: skincurses.c 1.23 2008/03/14 12:57:14 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
#include <vdr/osd.h>
|
#include <vdr/osd.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
#include <vdr/skins.h>
|
#include <vdr/skins.h>
|
||||||
#include <vdr/videodir.h>
|
|
||||||
|
|
||||||
static const char *VERSION = "2.4.3";
|
static const char *VERSION = "0.1.7";
|
||||||
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,15 +19,13 @@ 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; }
|
||||||
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
||||||
virtual void DrawText(cPixmap *Pixmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const cCursesFont Font = cCursesFont(); // w/o the '= cCursesFont()' gcc 4.6 complains - can anybody explain why this is necessary?
|
static const cCursesFont Font;
|
||||||
|
|
||||||
// --- cCursesOsd ------------------------------------------------------------
|
// --- cCursesOsd ------------------------------------------------------------
|
||||||
|
|
||||||
@ -60,7 +57,9 @@ static int ScOsdHeight = 20;
|
|||||||
class cCursesOsd : public cOsd {
|
class cCursesOsd : public cOsd {
|
||||||
private:
|
private:
|
||||||
WINDOW *savedRegion;
|
WINDOW *savedRegion;
|
||||||
cVector<int> colorPairs;
|
WINDOW *window;
|
||||||
|
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);
|
||||||
@ -77,34 +76,40 @@ 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
|
|
||||||
|
|
||||||
int begy, begx;
|
window = subwin(stdscr, ScOsdHeight, ScOsdWidth, 0, 0);
|
||||||
int maxy, maxx;
|
syncok(window, true);
|
||||||
getmaxyx(stdscr, maxy, maxx);
|
|
||||||
getbegyx(stdscr, begy, begx);
|
|
||||||
ScOsdWidth = maxx - begx;
|
|
||||||
ScOsdHeight = maxy - begy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cCursesOsd::~cCursesOsd()
|
cCursesOsd::~cCursesOsd()
|
||||||
{
|
{
|
||||||
erase();
|
if (window) {
|
||||||
|
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;
|
||||||
int i = colorPairs.IndexOf(color);
|
for (int i = 0; i < MaxColorPairs; i++) {
|
||||||
if (i < 0) {
|
if (!colorPairs[i]) {
|
||||||
colorPairs.Append(color);
|
colorPairs[i] = color;
|
||||||
i = colorPairs.Size() - 1;
|
|
||||||
init_pair(i + 1, colorFg, colorBg);
|
init_pair(i + 1, colorFg, colorBg);
|
||||||
|
//XXX??? attron(COLOR_PAIR(WHITE_ON_BLUE));
|
||||||
|
wattrset(window, COLOR_PAIR(i + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (color == colorPairs[i]) {
|
||||||
|
wattrset(window, COLOR_PAIR(i + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
attrset(COLOR_PAIR(i + 1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
|
||||||
@ -114,14 +119,13 @@ 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);
|
||||||
if (savedRegion)
|
copywin(window, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
||||||
copywin(stdscr, savedRegion, y1, x1, 0, 0, y2 - y1, x2 - x1, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::RestoreRegion(void)
|
void cCursesOsd::RestoreRegion(void)
|
||||||
{
|
{
|
||||||
if (savedRegion) {
|
if (savedRegion) {
|
||||||
overwrite(savedRegion, stdscr);
|
copywin(savedRegion, window, 0, 0, savedRegion->_begy, savedRegion->_begx, savedRegion->_maxy - savedRegion->_begy, savedRegion->_maxx - savedRegion->_begx, false);
|
||||||
delwin(savedRegion);
|
delwin(savedRegion);
|
||||||
savedRegion = NULL;
|
savedRegion = NULL;
|
||||||
}
|
}
|
||||||
@ -161,22 +165,18 @@ void cCursesOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetColor(ColorFg, ColorBg);
|
SetColor(ColorFg, ColorBg);
|
||||||
mvaddnstr(y, x, s, Width ? Width : ScOsdWidth - x);
|
wmove(window, y, x); // ncurses wants 'y' before '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);
|
||||||
int dx = x2 - x1;
|
for (int y = y1; y <= y2; y++) {
|
||||||
int dy = y2 - y1;
|
wmove(window, y, x1); // ncurses wants 'y' before 'x'!
|
||||||
if (dx >= dy) {
|
whline(window, ' ', x2 - x1 + 1);
|
||||||
for (int y = y1; y <= y2; y++)
|
|
||||||
mvhline(y, x1, ' ', dx + 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (int x = x1; x <= x2; x++)
|
|
||||||
mvvline(y1, x, ' ', dy + 1);
|
|
||||||
}
|
}
|
||||||
|
wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work
|
||||||
}
|
}
|
||||||
|
|
||||||
void cCursesOsd::Flush(void)
|
void cCursesOsd::Flush(void)
|
||||||
@ -261,9 +261,6 @@ void cSkinCursesDisplayChannel::Flush(void)
|
|||||||
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
|
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
|
||||||
private:
|
private:
|
||||||
cOsd *osd;
|
cOsd *osd;
|
||||||
cString title;
|
|
||||||
int lastDiskUsageState;
|
|
||||||
void DrawTitle(void);
|
|
||||||
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
|
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
|
||||||
void SetTextScrollbar(void);
|
void SetTextScrollbar(void);
|
||||||
public:
|
public:
|
||||||
@ -287,7 +284,6 @@ public:
|
|||||||
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
|
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
|
||||||
{
|
{
|
||||||
osd = new cCursesOsd(0, 0);
|
osd = new cCursesOsd(0, 0);
|
||||||
lastDiskUsageState = -1;
|
|
||||||
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,16 +331,9 @@ void cSkinCursesDisplayMenu::Clear(void)
|
|||||||
textScroller.Reset();
|
textScroller.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::DrawTitle(void)
|
|
||||||
{
|
|
||||||
bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
|
|
||||||
osd->DrawText(0, 0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, clrBlack, clrCyan, &Font, ScOsdWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetTitle(const char *Title)
|
void cSkinCursesDisplayMenu::SetTitle(const char *Title)
|
||||||
{
|
{
|
||||||
title = Title;
|
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, ScOsdWidth);
|
||||||
DrawTitle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||||
@ -385,13 +374,13 @@ void cSkinCursesDisplayMenu::SetItem(const char *Text, int Index, bool Current,
|
|||||||
for (int i = 0; i < MaxTabs; i++) {
|
for (int i = 0; i < MaxTabs; i++) {
|
||||||
const char *s = GetTabbedText(Text, i);
|
const char *s = GetTabbedText(Text, i);
|
||||||
if (s) {
|
if (s) {
|
||||||
int xt = Tab(i) / AvgCharWidth();// Tab() is in "pixel" - see also skins.c!!!
|
int xt = Tab(i) / 12;// Tab() is in "pixel" - see also skins.c!!!
|
||||||
osd->DrawText(xt, y, s, ColorFg, ColorBg, &Font, ScOsdWidth - 2 - xt);
|
osd->DrawText(xt, y, s, ColorFg, ColorBg, &Font, ScOsdWidth - 2 - xt);
|
||||||
}
|
}
|
||||||
if (!Tab(i + 1))
|
if (!Tab(i + 1))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
SetEditableWidth(ScOsdWidth - 2 - Tab(1) / AvgCharWidth()); // Tab() is in "pixel" - see also skins.c!!!
|
SetEditableWidth(ScOsdWidth - 2 - Tab(1) / 12); // Tab() is in "pixel" - see also skins.c!!!
|
||||||
}
|
}
|
||||||
|
|
||||||
void cSkinCursesDisplayMenu::SetScrollbar(int Total, int Offset)
|
void cSkinCursesDisplayMenu::SetScrollbar(int Total, int Offset)
|
||||||
@ -405,17 +394,14 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
|||||||
return;
|
return;
|
||||||
int y = 2;
|
int y = 2;
|
||||||
cTextScroller ts;
|
cTextScroller ts;
|
||||||
cString t = cString::sprintf("%s %s - %s", *Event->GetDateString(), *Event->GetTimeString(), *Event->GetEndTimeString());
|
char t[32];
|
||||||
|
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());
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
||||||
}
|
}
|
||||||
y += ts.Height();
|
y += ts.Height();
|
||||||
if (Event->ParentalRating()) {
|
|
||||||
cString buffer = cString::sprintf(" %s ", *Event->GetParentalRatingString());
|
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
|
|
||||||
}
|
|
||||||
y += 1;
|
y += 1;
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
|
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->Title(), &Font, clrCyan, clrBackground);
|
||||||
y += ts.Height();
|
y += ts.Height();
|
||||||
@ -423,13 +409,6 @@ void cSkinCursesDisplayMenu::SetEvent(const cEvent *Event)
|
|||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
|
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Event->ShortText(), &Font, clrYellow, clrBackground);
|
||||||
y += ts.Height();
|
y += ts.Height();
|
||||||
}
|
}
|
||||||
for (int i = 0; Event->Contents(i); i++) {
|
|
||||||
const char *s = Event->ContentToString(Event->Contents(i));
|
|
||||||
if (!isempty(s)) {
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
|
|
||||||
y += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
y += 1;
|
y += 1;
|
||||||
if (!isempty(Event->Description())) {
|
if (!isempty(Event->Description())) {
|
||||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
|
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Event->Description(), &Font, clrCyan, clrBackground);
|
||||||
@ -444,22 +423,10 @@ 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;
|
||||||
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
|
char t[32];
|
||||||
|
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()) {
|
|
||||||
cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
|
|
||||||
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();
|
||||||
if (isempty(Title))
|
if (isempty(Title))
|
||||||
@ -470,13 +437,6 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
|
|||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
|
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, Info->ShortText(), &Font, clrYellow, clrBackground);
|
||||||
y += ts.Height();
|
y += ts.Height();
|
||||||
}
|
}
|
||||||
for (int i = 0; Info->GetEvent()->Contents(i); i++) {
|
|
||||||
const char *s = Info->GetEvent()->ContentToString(Info->GetEvent()->Contents(i));
|
|
||||||
if (!isempty(s)) {
|
|
||||||
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, s, &Font, clrYellow, clrBackground);
|
|
||||||
y += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
y += 1;
|
y += 1;
|
||||||
if (!isempty(Info->Description())) {
|
if (!isempty(Info->Description())) {
|
||||||
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
|
textScroller.Set(osd, 0, y, ScOsdWidth - 2, ScOsdHeight - y - 2, Info->Description(), &Font, clrCyan, clrBackground);
|
||||||
@ -492,8 +452,6 @@ void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
|
|||||||
|
|
||||||
void cSkinCursesDisplayMenu::Flush(void)
|
void cSkinCursesDisplayMenu::Flush(void)
|
||||||
{
|
{
|
||||||
if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
|
|
||||||
DrawTitle();
|
|
||||||
cString date = DayDateTime();
|
cString date = DayDateTime();
|
||||||
osd->DrawText(ScOsdWidth - Utf8StrLen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
osd->DrawText(ScOsdWidth - Utf8StrLen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
|
||||||
osd->Flush();
|
osd->Flush();
|
||||||
@ -620,7 +578,6 @@ 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;
|
||||||
@ -833,8 +790,12 @@ 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.
|
||||||
if (initscr())
|
WINDOW *w = initscr();
|
||||||
|
if (w) {
|
||||||
|
ScOsdWidth = w->_maxx - w->_begx + 1;
|
||||||
|
ScOsdHeight = w->_maxy - w->_begy + 1;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
70
PLUGINS/src/sky/HISTORY
Normal file
70
PLUGINS/src/sky/HISTORY
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
VDR Plugin 'sky' Revision History
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
2002-12-01: Version 0.0.1
|
||||||
|
|
||||||
|
- Initial revision.
|
||||||
|
|
||||||
|
2002-12-13: Version 0.1.0
|
||||||
|
|
||||||
|
- Changed setting of CXX and CXXFLAGS variables in Makefile.
|
||||||
|
|
||||||
|
2003-05-09: Version 0.1.1
|
||||||
|
|
||||||
|
- Changed Start() to Initialize().
|
||||||
|
|
||||||
|
2004-01-04: Version 0.2.0
|
||||||
|
|
||||||
|
- Implemented automatic PID switching and channel detection
|
||||||
|
|
||||||
|
2004-02-15: Version 0.3.0
|
||||||
|
|
||||||
|
- Now using the actual channel IDs a derived from the data stream.
|
||||||
|
- Switched EPG data retrieval to http://www.bleb.org.
|
||||||
|
- Added automatic DST detection to getskyepg.pl.
|
||||||
|
- Fixed handling receivers, so that a recording on the same channel
|
||||||
|
won't interrupt an ongoing Transfer mode.
|
||||||
|
|
||||||
|
2004-10-16: Version 0.3.1
|
||||||
|
|
||||||
|
- Improved buffer handling.
|
||||||
|
|
||||||
|
2004-12-12: Version 0.3.2
|
||||||
|
|
||||||
|
- Changed Apid access in cChannel.
|
||||||
|
|
||||||
|
2004-12-19: Version 0.3.3
|
||||||
|
|
||||||
|
- Made several functions threadsafe.
|
||||||
|
- Removed delay_ms(), using cCondWait::SleepMs() instead.
|
||||||
|
|
||||||
|
2005-09-17: Version 0.3.4
|
||||||
|
|
||||||
|
- Added a missing include statement.
|
||||||
|
|
||||||
|
2006-03-26: Version 0.3.5
|
||||||
|
|
||||||
|
- Fixed format string handling.
|
||||||
|
|
||||||
|
2006-12-02: Version 0.3.5 (version number not increased)
|
||||||
|
|
||||||
|
- Made the getskyepg.pl script send a user agent message to
|
||||||
|
the server, according to the rules at http://bleb.org/tv/data/listings.
|
||||||
|
If your version of 'wget' doesn't support the -U option to set the user agent,
|
||||||
|
use the new option -U of getskyepg.pl to have the information added to the URL
|
||||||
|
as a query string.
|
||||||
|
- The getskyepg.pl script now replaces "&" with "&".
|
||||||
|
|
||||||
|
2007-08-15: Version 0.3.6
|
||||||
|
|
||||||
|
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||||
|
so that a plain "make" will compile everything.
|
||||||
|
|
||||||
|
2008-03-22: Version 0.3.7
|
||||||
|
|
||||||
|
- Removed the full path from the 'logger' call in the getskyepg.pl script (this
|
||||||
|
program is apparently "on the move" through the file system...).
|
||||||
|
|
||||||
|
2008-09-07: Version 0.3.8
|
||||||
|
|
||||||
|
- Fixed renamed constants (thanks to Udo Richter).
|
83
PLUGINS/src/sky/Makefile
Normal file
83
PLUGINS/src/sky/Makefile
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
#
|
||||||
|
# Makefile for a Video Disk Recorder plugin
|
||||||
|
#
|
||||||
|
# $Id: Makefile 1.11 2008/01/13 13:00:16 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 = sky
|
||||||
|
|
||||||
|
### 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 C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
|
### The directory environment:
|
||||||
|
|
||||||
|
VDRDIR = ../../..
|
||||||
|
LIBDIR = ../../lib
|
||||||
|
TMPDIR = /tmp
|
||||||
|
|
||||||
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
|
### The name of the distribution archive:
|
||||||
|
|
||||||
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
|
### The object files (add further files here):
|
||||||
|
|
||||||
|
OBJS = $(PLUGIN).o
|
||||||
|
|
||||||
|
### The main target:
|
||||||
|
|
||||||
|
all: libvdr-$(PLUGIN).so
|
||||||
|
|
||||||
|
### Implicit rules:
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
|
|
||||||
|
# Dependencies:
|
||||||
|
|
||||||
|
MAKEDEP = g++ -MM -MG
|
||||||
|
DEPFILE = .dependencies
|
||||||
|
$(DEPFILE): Makefile
|
||||||
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
|
-include $(DEPFILE)
|
||||||
|
|
||||||
|
### Targets:
|
||||||
|
|
||||||
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
|
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* *~
|
49
PLUGINS/src/sky/README
Normal file
49
PLUGINS/src/sky/README
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||||
|
|
||||||
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
|
Project's homepage: www.cadsoft.de/vdr
|
||||||
|
|
||||||
|
Latest version available at: www.cadsoft.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 'sky' plugin implements a new device for VDR, which is based on the
|
||||||
|
MPEG2 encoder card described at linuxtv.org/mpeg2/kfir.xml. It
|
||||||
|
allows you to connect the analog a/v output of your Sky Digibox to VDR,
|
||||||
|
so that you can enjoy the full recording flexibility of VDR with your
|
||||||
|
Sky subscription. Note that this is NOT something that does anything
|
||||||
|
illegal, like decrypting the Sky programme without a subscription. You
|
||||||
|
will need a Sky Digibox and a valid subscription in order to use this
|
||||||
|
plugin.
|
||||||
|
|
||||||
|
The 'kfir' module must be loaded with the option 'streamtype=4' to make it
|
||||||
|
produce a Transport Stream.
|
||||||
|
|
||||||
|
The Digibox is remotely controlled through VDR via LIRC (see lirc.org).
|
||||||
|
The file lircd.conf.sky contains the remote control codes necessary to
|
||||||
|
control the Digibox.
|
||||||
|
|
||||||
|
In order to access the Sky channels VDR needs to know the channel number
|
||||||
|
under which each channel is stored in the Sky Digibox. These numbers are
|
||||||
|
stored in the file 'channels.conf.sky', together with the channel IDs as
|
||||||
|
derived from the actual channel data and the names under which the EPG
|
||||||
|
data for each channel can be found (see below). Copy this file to your
|
||||||
|
plugins config directory, in a subdirectory named 'sky', as in
|
||||||
|
|
||||||
|
/video/plugins/sky/channels.conf.sky
|
||||||
|
|
||||||
|
The Sky EPG is available on the Internet at http://www.bleb.org.
|
||||||
|
The Perl script getskyepg.pl extracts the EPG data from these pages
|
||||||
|
and sends it to VDR via an SVDRP connection. The channel names as
|
||||||
|
used on the bleb.org pages are defined in the channels.conf.sky file.
|
||||||
|
You can keep your EPG data up-to-date by entering a call to getskyepg.pl
|
||||||
|
into your /etc/crontab. Call 'getskyepg.pl -h' for a list of options.
|
||||||
|
The getskyepg.pl script requires the programs /usr/bin/wget and /usr/bin/logger
|
||||||
|
to be installed on your system.
|
34
PLUGINS/src/sky/channels.conf.sky
Normal file
34
PLUGINS/src/sky/channels.conf.sky
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Sky channel definitions
|
||||||
|
#
|
||||||
|
# Syntax:
|
||||||
|
#
|
||||||
|
# ChannelID:ChannelNumber:EPGname
|
||||||
|
#
|
||||||
|
# where
|
||||||
|
#
|
||||||
|
# ChannelID is the channel ID as derived from the actual channel
|
||||||
|
# data as broadcast in the data stream (see man vdr(5)).
|
||||||
|
#
|
||||||
|
# ChannelNumber is the number of this channel as you have to
|
||||||
|
# enter it on the DigiBox remote control.
|
||||||
|
#
|
||||||
|
# EPGname is the name of the page at www.bleb.org that has EPG
|
||||||
|
# data for this channel (without the '.xml'). If no such
|
||||||
|
# page exists, 'x' is entered.
|
||||||
|
#
|
||||||
|
S28.2E-2-2027-4705:106:sky_one
|
||||||
|
S28.2E-2-2027-5104:107:sky_two
|
||||||
|
S28.2E-2-2044-10070:118:itv2
|
||||||
|
S28.2E-2-2023-4905:130:scifi
|
||||||
|
S28.2E-2-2025-5904:127:paramount
|
||||||
|
S28.2E-2-2009-6201:551:discovery
|
||||||
|
S28.2E-2-2030-4809:310:sky_cinema
|
||||||
|
S28.2E-2-2007-4303:301:sky_movies1
|
||||||
|
S28.2E-2-2007-4302:302:sky_movies2
|
||||||
|
S28.2E-2-2007-4403:303:sky_movies3
|
||||||
|
S28.2E-2-2011-4402:304:sky_movies4
|
||||||
|
S28.2E-2-2011-4503:305:sky_movies5
|
||||||
|
S28.2E-2-2011-4502:306:sky_movies6
|
||||||
|
S28.2E-2-2030-4603:307:sky_movies7
|
||||||
|
S28.2E-2-2007-5502:308:sky_movies8
|
||||||
|
S28.2E-2-2030-4602:309:sky_movies9
|
260
PLUGINS/src/sky/getskyepg.pl
Executable file
260
PLUGINS/src/sky/getskyepg.pl
Executable file
@ -0,0 +1,260 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# getskyepg.pl: Get EPG data for Sky channels from the Internet
|
||||||
|
#
|
||||||
|
# Connects to a running VDR instance via SVDRP, gets the channel data
|
||||||
|
# for the Sky channels and connects to Internet web pages to extract the
|
||||||
|
# EPG data for these channels. The result is sent to VDR via SVDRP.
|
||||||
|
#
|
||||||
|
# See the README file for copyright information and how to reach the author.
|
||||||
|
#
|
||||||
|
# $Id: getskyepg.pl 1.7 2008/03/22 10:17:42 kls Exp $
|
||||||
|
|
||||||
|
use Getopt::Std;
|
||||||
|
use Time::Local;
|
||||||
|
|
||||||
|
$Usage = qq{
|
||||||
|
Usage: $0 [options]
|
||||||
|
|
||||||
|
Options: -c filename channel config file name (default: channels.conf.sky)
|
||||||
|
-d hostname destination hostname (default: localhost)
|
||||||
|
-p port SVDRP port number (default: 2001)
|
||||||
|
-S source channel source (default: S28.2E)
|
||||||
|
-D days days to get EPG for (1..7, default: 2)
|
||||||
|
-U use this if your version of 'wget' doesn't support -U
|
||||||
|
};
|
||||||
|
|
||||||
|
die $Usage if (!getopts("c:d:D:hp:S:U") || $opt_h);
|
||||||
|
|
||||||
|
$Conf = $opt_c || "channels.conf.sky";
|
||||||
|
$Dest = $opt_d || "localhost";
|
||||||
|
$Port = $opt_p || 2001;
|
||||||
|
$Source = $opt_S || "S28.2E";
|
||||||
|
$Days = $opt_D || 2;
|
||||||
|
$User = $opt_U;
|
||||||
|
|
||||||
|
# See "Rules for using this data" on http://bleb.org/tv/data/listings.
|
||||||
|
# In case you modify this script in a way that changes its behavior
|
||||||
|
# towards the www.bleb.org website, please replace 'vdrbugs@cadsoft.de'
|
||||||
|
# with your own email address! That way Andrew Flegg <andrew@bleb.org>,
|
||||||
|
# who runs that web site, can contact you in case of problems.
|
||||||
|
$IDENT = "VDR::getskyepg.pl, http://www.cadsoft.de/vdr - vdrbugs\@cadsoft.de";
|
||||||
|
$GAP = 2;
|
||||||
|
|
||||||
|
$SkyWebPage = "www.bleb.org/tv/data/listings";
|
||||||
|
$WGET = "/usr/bin/wget -q -O-";
|
||||||
|
$WGET .= " -U '$IDENT'" unless $User;
|
||||||
|
$LOGGER = "logger -t SKYEPG";
|
||||||
|
|
||||||
|
$DST = -3600; # Daylight Saving Time offset
|
||||||
|
$SecsInDay = 86400;
|
||||||
|
|
||||||
|
@Channels = ();
|
||||||
|
|
||||||
|
$idxSource = 0;
|
||||||
|
$idxNumber = 1;
|
||||||
|
$idxName = 2;
|
||||||
|
|
||||||
|
Error("days out of range: $Days") unless (1 <= $Days && $Days <= 7);
|
||||||
|
|
||||||
|
sub Log
|
||||||
|
{
|
||||||
|
system("$LOGGER '@_'");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub Error
|
||||||
|
{
|
||||||
|
Log(@_);
|
||||||
|
die "$0: @_\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GetChannels
|
||||||
|
{
|
||||||
|
open(CHANNELS, $Conf) || Error("$Conf: $!");
|
||||||
|
while (<CHANNELS>) {
|
||||||
|
chomp;
|
||||||
|
next if (/^#/);
|
||||||
|
my @a = split(":");
|
||||||
|
push(@Channels, [@a]) unless ($a[$idxName] eq "x");
|
||||||
|
}
|
||||||
|
close(CHANNELS);
|
||||||
|
}
|
||||||
|
|
||||||
|
GetChannels();
|
||||||
|
|
||||||
|
sub GetPage
|
||||||
|
{
|
||||||
|
my $channel = shift;
|
||||||
|
my $day = shift;
|
||||||
|
$day--;
|
||||||
|
my $url = "http://$SkyWebPage/$day/$channel.xml";
|
||||||
|
$url .= "?$IDENT" if $User;
|
||||||
|
Log("reading $url");
|
||||||
|
my @page = split("\n", `$WGET '$url'`);
|
||||||
|
Log("received " . ($#page + 1) . " lines");
|
||||||
|
return @page;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ReplaceTags
|
||||||
|
{
|
||||||
|
my $s = shift;
|
||||||
|
$s =~ s/&/&/g;
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub StripWhitespace
|
||||||
|
{
|
||||||
|
my $s = shift;
|
||||||
|
$s =~ s/\s*(.*)\s*/$1/;
|
||||||
|
$s =~ s/\s+/ /g;
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub Extract
|
||||||
|
{
|
||||||
|
my $s = shift;
|
||||||
|
my $t = shift;
|
||||||
|
$s =~ /<$t>([^<]*)<\/$t>/;
|
||||||
|
return ReplaceTags(StripWhitespace($1));
|
||||||
|
}
|
||||||
|
|
||||||
|
# In order to get the duration we need to buffer the last event:
|
||||||
|
$Id = "";
|
||||||
|
$Time = 0;
|
||||||
|
$Title = "";
|
||||||
|
$Subtitle = "";
|
||||||
|
$Desc = "";
|
||||||
|
|
||||||
|
sub GetEpgData
|
||||||
|
{
|
||||||
|
my ($channel, $channelID) = @_;
|
||||||
|
my $numEvents = 0;
|
||||||
|
SVDRPsend("C $channelID");
|
||||||
|
$Time = 0;
|
||||||
|
for $day (1 .. $Days) {
|
||||||
|
my $dt = 0;
|
||||||
|
my @page = GetPage($channel, $day);
|
||||||
|
my $data = "";
|
||||||
|
for $line (@page) {
|
||||||
|
chomp($line);
|
||||||
|
if ($line =~ /<programme>/) {
|
||||||
|
$data = "";
|
||||||
|
}
|
||||||
|
elsif ($line =~ /<\/programme>/) {
|
||||||
|
my $title = Extract($data, "title");
|
||||||
|
my $subtitle = Extract($data, "subtitle");
|
||||||
|
my $desc = Extract($data, "desc");
|
||||||
|
my $start = Extract($data, "start");
|
||||||
|
# 'end' is useless, because it is sometimes missing :-(
|
||||||
|
# my $end = Extract($data, "end");
|
||||||
|
if (!$subtitle) {
|
||||||
|
# They sometimes write all info into the description, as in
|
||||||
|
# Episode: some description.
|
||||||
|
# Why don't they just fill in the data correctly?
|
||||||
|
my ($s, $d) = ($desc =~ /([^:]*)[:](.*)/);
|
||||||
|
if ($s && $d) {
|
||||||
|
$subtitle = $s;
|
||||||
|
$desc = $d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# 'start' and 'end' as time of day isn't of much use here, since
|
||||||
|
# the page for one day contains data that actually belongs to the
|
||||||
|
# next day (after midnight). Oh well, lets reconstruct the missing
|
||||||
|
# information:
|
||||||
|
$start = "0" . $start if (length($start) < 4);
|
||||||
|
my ($h, $m) = ($start =~ /(..)(..)/);
|
||||||
|
$dt = $SecsInDay if ($h > 12);
|
||||||
|
# convert to time_t:
|
||||||
|
my @gmt = gmtime;
|
||||||
|
$gmt[0] = 0; # seconds
|
||||||
|
$gmt[1] = $m; # minutes
|
||||||
|
$gmt[2] = $h; # hours
|
||||||
|
$time = timegm(@gmt) + ($day - 1) * $SecsInDay + ($h < 12 ? $dt : 0);
|
||||||
|
# compensate for DST:
|
||||||
|
$time += $DST if (localtime($time))[8];
|
||||||
|
# create EPG data:
|
||||||
|
if ($Time) {
|
||||||
|
$duration = $time - $Time;
|
||||||
|
SVDRPsend("E $Id $Time $duration");
|
||||||
|
SVDRPsend("T $Title");
|
||||||
|
SVDRPsend("S $Subtitle");
|
||||||
|
SVDRPsend("D $Desc");
|
||||||
|
SVDRPsend("e");
|
||||||
|
$numEvents++;
|
||||||
|
}
|
||||||
|
# buffer the last event:
|
||||||
|
$Id = $time / 60 % 0xFFFF; # this gives us unique ids for every minute of over 6 weeks
|
||||||
|
$Time = $time;
|
||||||
|
$Title = $title;
|
||||||
|
$Subtitle = $subtitle;
|
||||||
|
$Desc = $desc;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$data .= $line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sleep($GAP);
|
||||||
|
}
|
||||||
|
SVDRPsend("c");
|
||||||
|
Log("generated $numEvents EPG events");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ProcessEpg
|
||||||
|
{
|
||||||
|
for (@Channels) {
|
||||||
|
my $channel = @$_[$idxName];
|
||||||
|
my $channelID = @$_[$idxSource];
|
||||||
|
Log("processing channel $channel - $channelID");
|
||||||
|
SVDRPsend("PUTE");
|
||||||
|
SVDRPreceive(354);
|
||||||
|
GetEpgData($channel, $channelID);
|
||||||
|
SVDRPsend(".");
|
||||||
|
SVDRPreceive(250);
|
||||||
|
}
|
||||||
|
Log("done");
|
||||||
|
}
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# TODO: make this a Perl module??? What about Error()???
|
||||||
|
|
||||||
|
use Socket;
|
||||||
|
|
||||||
|
$Timeout = 300; # max. seconds to wait for response
|
||||||
|
|
||||||
|
$SIG{ALRM} = sub { Error("timeout"); };
|
||||||
|
alarm($Timeout);
|
||||||
|
|
||||||
|
$iaddr = inet_aton($Dest) || Error("no host: $Dest");
|
||||||
|
$paddr = sockaddr_in($Port, $iaddr);
|
||||||
|
|
||||||
|
$proto = getprotobyname('tcp');
|
||||||
|
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || Error("socket: $!");
|
||||||
|
connect(SOCK, $paddr) || Error("connect: $!");
|
||||||
|
select(SOCK); $| = 1;
|
||||||
|
SVDRPreceive(220);
|
||||||
|
ProcessEpg();
|
||||||
|
SVDRPsend("QUIT");
|
||||||
|
|
||||||
|
sub SVDRPsend
|
||||||
|
{
|
||||||
|
my $s = shift;
|
||||||
|
print SOCK "$s\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub SVDRPreceive
|
||||||
|
{
|
||||||
|
my $expect = shift | 0;
|
||||||
|
my @a = ();
|
||||||
|
while (<SOCK>) {
|
||||||
|
s/\s*$//; # 'chomp' wouldn't work with "\r\n"
|
||||||
|
push(@a, $_);
|
||||||
|
if (substr($_, 3, 1) ne "-") {
|
||||||
|
my $code = substr($_, 0, 3);
|
||||||
|
Error("expected SVDRP code $expect, but received $code") if ($code != $expect);
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return @a;
|
||||||
|
}
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
299
PLUGINS/src/sky/lircd.conf.sky
Normal file
299
PLUGINS/src/sky/lircd.conf.sky
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
# Copyright (C) 1999 Christoph Bartelmus
|
||||||
|
#
|
||||||
|
# You may only use this file if you make it available to others,
|
||||||
|
# i.e. if you send it to <lirc@bartelmus.de>
|
||||||
|
#
|
||||||
|
# this config file was automatically generated
|
||||||
|
# using lirc-0.6.4-CVS(serial) on Mon Jul 9 08:14:04 2001
|
||||||
|
#
|
||||||
|
# contributed by Steve Davies <steve@daviesfam.org>
|
||||||
|
#
|
||||||
|
# brand: sky
|
||||||
|
# model no. of remote control:
|
||||||
|
# supported devices: 34000 20
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
begin remote
|
||||||
|
|
||||||
|
name SKY
|
||||||
|
flags CONST_LENGTH|RAW_CODES
|
||||||
|
eps 30
|
||||||
|
aeps 100
|
||||||
|
ptrail 0
|
||||||
|
repeat 0 0
|
||||||
|
gap 149692
|
||||||
|
frequency 36000
|
||||||
|
duty_cycle 50
|
||||||
|
|
||||||
|
begin raw_codes
|
||||||
|
|
||||||
|
name 0
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444
|
||||||
|
|
||||||
|
name 1
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
888
|
||||||
|
|
||||||
|
name 2
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 888
|
||||||
|
444
|
||||||
|
|
||||||
|
name 3
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 888 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name 4
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 888 888 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name 5
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 888 888 888
|
||||||
|
|
||||||
|
name 6
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 888
|
||||||
|
444
|
||||||
|
|
||||||
|
name 7
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 888 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name 8
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 888 888 444 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name 9
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 888 888 444 444 888
|
||||||
|
|
||||||
|
name RED
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 444 444 888 888 444 444 888 888
|
||||||
|
|
||||||
|
name GREEN
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 444 444 888 888 444 444 444 444 888 444
|
||||||
|
|
||||||
|
name YELLOW
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 444 444 888 888 444 444 444 444 444 444
|
||||||
|
|
||||||
|
name BLUE
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 444 444 444 444 888 444 444 444 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name TEXT
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 888 444 444 444 444 444 444 888 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name BACKUP
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 888 888 444 444 444 444 444 444 444 444 888 444 444
|
||||||
|
|
||||||
|
name HELP
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 888 888 444 444 444 444 444 444 444 444 444 444 888
|
||||||
|
|
||||||
|
name CURSOR-LEFT
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 888 888 888 444
|
||||||
|
|
||||||
|
name CURSOR-DOWN
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 888 444 444 888
|
||||||
|
|
||||||
|
name CURSOR-RIGHT
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 888 888 444 444
|
||||||
|
|
||||||
|
name CURSOR-UP
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 888 444 444 444 444 444
|
||||||
|
|
||||||
|
name SELECT
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 888 888 888 444 444 444 444 888 444 444 444
|
||||||
|
|
||||||
|
name CHANNEL-DOWN
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 888 888 444 444 444 444 444 444 888
|
||||||
|
|
||||||
|
name CHANNEL-UP
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 888 888 444 444 444 444 444 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name I
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 888 444 444 888 444 444 888 888 888 444 444
|
||||||
|
|
||||||
|
name ONOFF
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 888 444 444 888 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name SKY
|
||||||
|
2664 888 444 444 444 444 444 888 444 888 888 444 444 444 444 444
|
||||||
|
444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444 444 888 888 444 444 444 444 444 444 444 444 444 444 444 444
|
||||||
|
444
|
||||||
|
|
||||||
|
name TV
|
||||||
|
2830 724 583 333 553 339
|
||||||
|
548 791 543 795 977 357
|
||||||
|
527 364 524 367 524 368
|
||||||
|
522 369 521 370 520 371
|
||||||
|
519 372 519 372 519 372
|
||||||
|
518 372 518 374 963 818
|
||||||
|
516 376 510 381 509 382
|
||||||
|
954 828 508 407 481
|
||||||
|
|
||||||
|
name SKY
|
||||||
|
2829 726 580 336 551 340
|
||||||
|
547 791 540 798 977 366
|
||||||
|
519 364 523 367 521 370
|
||||||
|
521 370 520 371 520 371
|
||||||
|
520 371 519 372 518 373
|
||||||
|
517 374 517 374 957 825
|
||||||
|
512 379 512 380 513 377
|
||||||
|
511 381 506 410 477 413
|
||||||
|
483
|
||||||
|
|
||||||
|
name MUTE
|
||||||
|
2567 429 751 447 743 456
|
||||||
|
1335 464 734 466 1325 496
|
||||||
|
697 504 693 506 1284 513
|
||||||
|
681 518 681 517 679 520
|
||||||
|
678 26288 2533 462 734 489
|
||||||
|
705 470 1323 501 695 503
|
||||||
|
1287 511 683 516 683 518
|
||||||
|
1277 522 676 521 678 521
|
||||||
|
675 523 675 26286 2533 465
|
||||||
|
731 491 702 499 1293 504
|
||||||
|
692 507 1280 518 683 516
|
||||||
|
679 524 1272 522 675 529
|
||||||
|
670 523 682 517 675 26286
|
||||||
|
2532 465 729 493 702 473
|
||||||
|
1318 506 688 509 1282 517
|
||||||
|
680 519 677 524 1274 523
|
||||||
|
676
|
||||||
|
|
||||||
|
name VOLUME-UP
|
||||||
|
2568 430 766 433 1342 456
|
||||||
|
734 489 708 466 1326 497
|
||||||
|
699 505 686 508 1286 512
|
||||||
|
688 510 683 516 682 516
|
||||||
|
681 26284 2540 481 711 488
|
||||||
|
1301 498 703 495 695 504
|
||||||
|
1284 516 682 516 684 515
|
||||||
|
1276 522 675 523 675 524
|
||||||
|
674 524 675 26286 2532 490
|
||||||
|
709 489 1300 500 689 509
|
||||||
|
695 517 1270 516 683 520
|
||||||
|
675 519 1274 529 668 525
|
||||||
|
675 524 673 526 672 26288
|
||||||
|
2532 466 731 491 1300 499
|
||||||
|
695 503 692 509 1277 520
|
||||||
|
681 518 679 519 1278 520
|
||||||
|
675
|
||||||
|
|
||||||
|
name VOLUME-DOWN
|
||||||
|
2562 434 1348 451 1332 465
|
||||||
|
733 489 704 496 1296 504
|
||||||
|
690 507 694 511 1281 511
|
||||||
|
683 523 677 515 679 520
|
||||||
|
680 25687 2533 464 1330 491
|
||||||
|
1295 505 693 506 689 510
|
||||||
|
1293 505 684 516 678 520
|
||||||
|
1276 523 677 520 675 524
|
||||||
|
673 526 674 25686 2531 467
|
||||||
|
1324 498 1292 506 691 509
|
||||||
|
683 515 1280 518 678 521
|
||||||
|
675 523 1273 525 674 527
|
||||||
|
672 525 673 527 671 25685
|
||||||
|
2531 467 1320 501 1288 511
|
||||||
|
687 511 688 512 1282 516
|
||||||
|
678 521 675 524 1273
|
||||||
|
|
||||||
|
name TVGUIDE
|
||||||
|
2834 720 586 330 554 338
|
||||||
|
548 794 539 796 975 360
|
||||||
|
528 363 521 371 519 371
|
||||||
|
520 371 519 375 514 374
|
||||||
|
517 374 516 375 513 379
|
||||||
|
511 380 510 381 949 387
|
||||||
|
500 836 505 387 945 391
|
||||||
|
493 868 469 422 468
|
||||||
|
|
||||||
|
name BOXOFFICE
|
||||||
|
2833 745 564 329 555 338
|
||||||
|
548 790 545 793 982 352
|
||||||
|
529 362 526 365 522 370
|
||||||
|
519 371 519 372 519 372
|
||||||
|
518 373 517 374 513 378
|
||||||
|
515 376 507 384 506 385
|
||||||
|
945 390 496 396 498 392
|
||||||
|
496 419 468 847 936
|
||||||
|
|
||||||
|
name SERVICES
|
||||||
|
2829 725 585 330 555 338
|
||||||
|
548 798 537 794 979 356
|
||||||
|
528 368 522 363 523 369
|
||||||
|
521 370 521 370 520 370
|
||||||
|
520 371 520 371 520 371
|
||||||
|
519 372 519 372 518 373
|
||||||
|
964 371 517 375 513 377
|
||||||
|
511 404 489 402 485 828
|
||||||
|
514
|
||||||
|
|
||||||
|
name INTERACTIVE
|
||||||
|
2829 726 591 324 553 340
|
||||||
|
550 788 542 796 981 354
|
||||||
|
532 359 522 369 522 369
|
||||||
|
520 372 518 373 518 373
|
||||||
|
516 375 515 375 513 379
|
||||||
|
515 375 510 381 948 389
|
||||||
|
498 392 504 412 470 867
|
||||||
|
916 866 913
|
||||||
|
|
||||||
|
end raw_codes
|
||||||
|
|
||||||
|
end remote
|
303
PLUGINS/src/sky/sky.c
Normal file
303
PLUGINS/src/sky/sky.c
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
/*
|
||||||
|
* sky.c: A plugin for the Video Disk Recorder
|
||||||
|
*
|
||||||
|
* See the README file for copyright information and how to reach the author.
|
||||||
|
*
|
||||||
|
* $Id: sky.c 2.1 2008/09/07 11:54:07 kls Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <vdr/device.h>
|
||||||
|
#include <vdr/plugin.h>
|
||||||
|
#include <vdr/sources.h>
|
||||||
|
|
||||||
|
static const char *VERSION = "0.3.8";
|
||||||
|
static const char *DESCRIPTION = "Sky Digibox interface";
|
||||||
|
|
||||||
|
// --- cDigiboxDevice --------------------------------------------------------
|
||||||
|
|
||||||
|
#define DUMMYAPID 80
|
||||||
|
#define DUMMYVPID 160
|
||||||
|
|
||||||
|
class cSkyChannel : public cListObject {
|
||||||
|
public:
|
||||||
|
tChannelID channelID;
|
||||||
|
int digiboxChannelNumber;
|
||||||
|
bool Parse(const char *s);
|
||||||
|
};
|
||||||
|
|
||||||
|
bool cSkyChannel::Parse(const char *s)
|
||||||
|
{
|
||||||
|
char *id = NULL;
|
||||||
|
if (2 == sscanf(s, "%a[^:]:%d", &id, &digiboxChannelNumber))
|
||||||
|
channelID = tChannelID::FromString(id);
|
||||||
|
free(id);
|
||||||
|
return digiboxChannelNumber && channelID.Valid();
|
||||||
|
}
|
||||||
|
|
||||||
|
class cSkyChannels : public cConfig<cSkyChannel> {
|
||||||
|
public:
|
||||||
|
cSkyChannel *GetSkyChannel(const cChannel *Channel);
|
||||||
|
};
|
||||||
|
|
||||||
|
cSkyChannel *cSkyChannels::GetSkyChannel(const cChannel *Channel)
|
||||||
|
{
|
||||||
|
tChannelID ChannelID = Channel->GetChannelID();
|
||||||
|
for (cSkyChannel *sc = First(); sc; sc = Next(sc)) {
|
||||||
|
if (ChannelID == sc->channelID)
|
||||||
|
return sc;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cSkyChannels SkyChannels;
|
||||||
|
|
||||||
|
class cDigiboxDevice : public cDevice {
|
||||||
|
private:
|
||||||
|
int source;
|
||||||
|
int digiboxChannelNumber;
|
||||||
|
int fd_dvr;
|
||||||
|
int apid, vpid;
|
||||||
|
cTSBuffer *tsBuffer;
|
||||||
|
int fd_lirc;
|
||||||
|
void LircSend(const char *s);
|
||||||
|
void LircSend(int n);
|
||||||
|
protected:
|
||||||
|
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
|
||||||
|
virtual bool OpenDvr(void);
|
||||||
|
virtual void CloseDvr(void);
|
||||||
|
virtual bool GetTSPacket(uchar *&Data);
|
||||||
|
public:
|
||||||
|
cDigiboxDevice(void);
|
||||||
|
virtual ~cDigiboxDevice();
|
||||||
|
virtual bool ProvidesSource(int Source) const;
|
||||||
|
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
||||||
|
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsSetChannel = NULL) const;
|
||||||
|
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
||||||
|
};
|
||||||
|
|
||||||
|
cDigiboxDevice::cDigiboxDevice(void)
|
||||||
|
{
|
||||||
|
source = cSource::FromString("S28.2E");//XXX parameter???
|
||||||
|
digiboxChannelNumber = 0;
|
||||||
|
fd_dvr = -1;
|
||||||
|
apid = vpid = 0;
|
||||||
|
struct sockaddr_un addr;
|
||||||
|
addr.sun_family = AF_UNIX;
|
||||||
|
strn0cpy(addr.sun_path, "/dev/lircd", sizeof(addr.sun_path));//XXX parameter???
|
||||||
|
fd_lirc = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||||
|
if (fd_lirc >= 0) {
|
||||||
|
if (connect(fd_lirc, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
|
LOG_ERROR;
|
||||||
|
close(fd_lirc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
cDigiboxDevice::~cDigiboxDevice()
|
||||||
|
{
|
||||||
|
if (fd_lirc >= 0)
|
||||||
|
close(fd_lirc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cDigiboxDevice::LircSend(const char *s)
|
||||||
|
{
|
||||||
|
char buf[100];
|
||||||
|
snprintf(buf, sizeof(buf), "SEND_ONCE SKY %s\n", s);
|
||||||
|
dsyslog(buf);//XXX
|
||||||
|
if (write(fd_lirc, buf, strlen(buf)) < 0)
|
||||||
|
LOG_ERROR;//XXX _STR
|
||||||
|
cCondWait::SleepMs(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cDigiboxDevice::LircSend(int n)
|
||||||
|
{
|
||||||
|
char buf[10];
|
||||||
|
snprintf(buf, sizeof(buf), "%d", n);
|
||||||
|
char *p = buf;
|
||||||
|
while (*p) {
|
||||||
|
char q[10];
|
||||||
|
sprintf(q, "%c", *p);
|
||||||
|
LircSend(q);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::SetPid(cPidHandle *Handle, int Type, bool On)
|
||||||
|
{
|
||||||
|
//dsyslog("SetPid %d %d", Handle->pid, On);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::OpenDvr(void)
|
||||||
|
{
|
||||||
|
CloseDvr();
|
||||||
|
fd_dvr = open("/dev/video2", O_RDONLY | O_NONBLOCK);//XXX parameter???
|
||||||
|
if (fd_dvr >= 0)
|
||||||
|
tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1);
|
||||||
|
return fd_dvr >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cDigiboxDevice::CloseDvr(void)
|
||||||
|
{
|
||||||
|
if (fd_dvr >= 0) {
|
||||||
|
close(fd_dvr);
|
||||||
|
fd_dvr = -1;
|
||||||
|
delete tsBuffer;
|
||||||
|
tsBuffer = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::GetTSPacket(uchar *&Data)
|
||||||
|
{
|
||||||
|
if (tsBuffer) {
|
||||||
|
Data = tsBuffer->Get();
|
||||||
|
if (Data) {
|
||||||
|
// insert the actual PIDs:
|
||||||
|
int Pid = (((uint16_t)Data[1] & TS_PID_MASK_HI) << 8) | Data[2];
|
||||||
|
if (Pid == DUMMYAPID)
|
||||||
|
Pid = apid;
|
||||||
|
else if (Pid == DUMMYVPID)
|
||||||
|
Pid = vpid;
|
||||||
|
Data[1] = ((Pid >> 8) & 0xFF) | (Data[1] & ~TS_PID_MASK_HI);
|
||||||
|
Data[2] = Pid & 0xFF;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::ProvidesSource(int Source) const
|
||||||
|
{
|
||||||
|
return source == Source;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::ProvidesTransponder(const cChannel *Channel) const
|
||||||
|
{
|
||||||
|
return false; // can't provide any actual transponder
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
bool hasPriority = Priority < 0 || Priority > this->Priority();
|
||||||
|
bool needsDetachReceivers = true;
|
||||||
|
|
||||||
|
cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
|
||||||
|
if (SkyChannel) {
|
||||||
|
if (Receiving(true)) {
|
||||||
|
if (digiboxChannelNumber == SkyChannel->digiboxChannelNumber) {
|
||||||
|
needsDetachReceivers = false;
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result = hasPriority;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result = hasPriority;
|
||||||
|
}
|
||||||
|
if (NeedsDetachReceivers)
|
||||||
|
*NeedsDetachReceivers = needsDetachReceivers;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cDigiboxDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
||||||
|
{
|
||||||
|
if (fd_lirc >= 0 && !Receiving(true)) { // if we are receiving the channel is already set!
|
||||||
|
cSkyChannel *SkyChannel = SkyChannels.GetSkyChannel(Channel);
|
||||||
|
if (SkyChannel) {
|
||||||
|
digiboxChannelNumber = SkyChannel->digiboxChannelNumber;
|
||||||
|
apid = Channel->Apid(0);
|
||||||
|
vpid = Channel->Vpid();
|
||||||
|
//XXX only when recording??? -> faster channel switching!
|
||||||
|
LircSend("SKY"); // makes sure the Digibox is "on"
|
||||||
|
//XXX lircprint(fd_lirc, "BACKUP");
|
||||||
|
//XXX lircprint(fd_lirc, "BACKUP");
|
||||||
|
//XXX lircprint(fd_lirc, "BACKUP");
|
||||||
|
LircSend(digiboxChannelNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- cPluginSky ------------------------------------------------------------
|
||||||
|
|
||||||
|
class cPluginSky : public cPlugin {
|
||||||
|
private:
|
||||||
|
// Add any member variables or functions you may need here.
|
||||||
|
public:
|
||||||
|
cPluginSky(void);
|
||||||
|
virtual ~cPluginSky();
|
||||||
|
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 Initialize(void);
|
||||||
|
virtual void Housekeeping(void);
|
||||||
|
virtual cMenuSetupPage *SetupMenu(void);
|
||||||
|
virtual bool SetupParse(const char *Name, const char *Value);
|
||||||
|
};
|
||||||
|
|
||||||
|
cPluginSky::cPluginSky(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!
|
||||||
|
}
|
||||||
|
|
||||||
|
cPluginSky::~cPluginSky()
|
||||||
|
{
|
||||||
|
// Clean up after yourself!
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *cPluginSky::CommandLineHelp(void)
|
||||||
|
{
|
||||||
|
// Return a string that describes all known command line options.
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cPluginSky::ProcessArgs(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
// Implement command line argument processing here if applicable.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cPluginSky::Initialize(void)
|
||||||
|
{
|
||||||
|
// Initialize any background activities the plugin shall perform.
|
||||||
|
const char *ConfigDir = ConfigDirectory(Name());
|
||||||
|
if (ConfigDir) {
|
||||||
|
if (SkyChannels.Load(AddDirectory(ConfigDir, "channels.conf.sky"), true)) {
|
||||||
|
new cDigiboxDevice;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
esyslog("ERROR: can't get config directory");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cPluginSky::Housekeeping(void)
|
||||||
|
{
|
||||||
|
// Perform any cleanup or other regular tasks.
|
||||||
|
}
|
||||||
|
|
||||||
|
cMenuSetupPage *cPluginSky::SetupMenu(void)
|
||||||
|
{
|
||||||
|
// Return a setup menu in case the plugin supports one.
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cPluginSky::SetupParse(const char *Name, const char *Value)
|
||||||
|
{
|
||||||
|
// Parse your own setup parameters and store their values.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
VDRPLUGINCREATOR(cPluginSky); // Don't touch this!
|
@ -44,42 +44,3 @@ VDR Plugin 'status' Revision History
|
|||||||
2008-02-16: Version 0.3.0
|
2008-02-16: Version 0.3.0
|
||||||
|
|
||||||
- Added new cStatus functions.
|
- Added new cStatus functions.
|
||||||
|
|
||||||
2012-03-11: Version 0.3.1
|
|
||||||
|
|
||||||
- Added new parameter LiveView to ChannelSwitch() (reported by Udo Richter).
|
|
||||||
|
|
||||||
2012-12-27: Version 0.3.2
|
|
||||||
|
|
||||||
- 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,55 +1,47 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.15 2008/01/13 13:00:18 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.
|
||||||
# By default the main source file also carries this name.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
PLUGIN = status
|
PLUGIN = status
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### The version number of VDR's plugin API:
|
|
||||||
|
|
||||||
APIVERSION = $(call PKGCFG,apiversion)
|
|
||||||
|
|
||||||
### Allow user defined options to overwrite defaults:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
@ -57,33 +49,27 @@ OBJS = $(PLUGIN).o
|
|||||||
|
|
||||||
### The main target:
|
### The main target:
|
||||||
|
|
||||||
all: $(SOFILE)
|
all: libvdr-$(PLUGIN).so
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
# Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = g++ -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
|
@ -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 <vdr@tvdr.de>
|
Written by: Klaus Schmidinger <kls@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: www.cadsoft.de/people/kls/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm
|
||||||
|
|
||||||
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 5.4 2025/02/12 21:18:53 kls Exp $
|
* $Id: status.c 1.10 2008/02/16 15:41:05 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
#include <vdr/status.h>
|
#include <vdr/status.h>
|
||||||
|
|
||||||
static const char *VERSION = "2.6.1";
|
static const char *VERSION = "0.3.0";
|
||||||
static const char *DESCRIPTION = "Status monitor test";
|
static const char *DESCRIPTION = "Status monitor test";
|
||||||
static const char *MAINMENUENTRY = NULL;
|
static const char *MAINMENUENTRY = NULL;
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ static const char *MAINMENUENTRY = NULL;
|
|||||||
class cStatusTest : public cStatus {
|
class cStatusTest : public cStatus {
|
||||||
protected:
|
protected:
|
||||||
virtual void TimerChange(const cTimer *Timer, eTimerChange Change);
|
virtual void TimerChange(const cTimer *Timer, eTimerChange Change);
|
||||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView);
|
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
|
||||||
virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
|
virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
|
||||||
virtual void Replaying(const cControl *Control, const char *Name, const char *FileName, bool On);
|
virtual void Replaying(const cControl *Control, const char *Name, const char *FileName, bool On);
|
||||||
virtual void SetVolume(int Volume, bool Absolute);
|
virtual void SetVolume(int Volume, bool Absolute);
|
||||||
@ -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 OsdStatusMessage2(eMessageType Type, const char *Message);
|
virtual void OsdStatusMessage(const char *Message);
|
||||||
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
|
virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
|
||||||
virtual void OsdItem2(const char *Text, int Index, bool Selectable);
|
virtual void OsdItem(const char *Text, int Index);
|
||||||
virtual void OsdCurrentItem2(const char *Text, int Index);
|
virtual void OsdCurrentItem(const char *Text);
|
||||||
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);
|
||||||
@ -41,9 +41,9 @@ void cStatusTest::TimerChange(const cTimer *Timer, eTimerChange Change)
|
|||||||
dsyslog("status: cStatusTest::TimerChange %s %d", Timer ? *Timer->ToText(true) : "-", Change);
|
dsyslog("status: cStatusTest::TimerChange %s %d", Timer ? *Timer->ToText(true) : "-", Change);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView)
|
void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber)
|
||||||
{
|
{
|
||||||
dsyslog("status: cStatusTest::ChannelSwitch %d %d %d", Device->CardIndex(), ChannelNumber, LiveView);
|
dsyslog("status: cStatusTest::ChannelSwitch %d %d", Device->CardIndex(), ChannelNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
|
void cStatusTest::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
|
||||||
@ -86,9 +86,9 @@ void cStatusTest::OsdTitle(const char *Title)
|
|||||||
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
|
dsyslog("status: cStatusTest::OsdTitle '%s'", Title);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::OsdStatusMessage2(eMessageType Type, const char *Message)
|
void cStatusTest::OsdStatusMessage(const char *Message)
|
||||||
{
|
{
|
||||||
dsyslog("status: cStatusTest::OsdStatusMessage2 %d '%s'", Type, Message);
|
dsyslog("status: cStatusTest::OsdStatusMessage '%s'", Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
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::OsdItem2(const char *Text, int Index, bool Selected)
|
void cStatusTest::OsdItem(const char *Text, int Index)
|
||||||
{
|
{
|
||||||
dsyslog("status: cStatusTest::OsdItem2 %s %d %d", Text, Index, Selected);
|
//dsyslog("status: cStatusTest::OsdItem %s %d", Text, Index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::OsdCurrentItem2(const char *Text, int Index)
|
void cStatusTest::OsdCurrentItem(const char *Text)
|
||||||
{
|
{
|
||||||
dsyslog("status: cStatusTest::OsdCurrentItem %s %d", Text, Index);
|
dsyslog("status: cStatusTest::OsdCurrentItem %s", Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
void cStatusTest::OsdTextItem(const char *Text, bool Scroll)
|
||||||
|
@ -13,31 +13,3 @@ VDR Plugin 'svdrpdemo' Revision History
|
|||||||
|
|
||||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||||
so that a plain "make" will compile everything.
|
so that a plain "make" will compile everything.
|
||||||
|
|
||||||
2012-12-27: Version 0.0.4
|
|
||||||
|
|
||||||
- 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,55 +1,47 @@
|
|||||||
#
|
#
|
||||||
# Makefile for a Video Disk Recorder plugin
|
# Makefile for a Video Disk Recorder plugin
|
||||||
#
|
#
|
||||||
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $
|
# $Id: Makefile 1.9 2008/01/13 13:00:20 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.
|
||||||
# By default the main source file also carries this name.
|
# By default the main source file also carries this name.
|
||||||
|
#
|
||||||
PLUGIN = svdrpdemo
|
PLUGIN = svdrpdemo
|
||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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')
|
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||||
|
|
||||||
|
### The C++ compiler and options:
|
||||||
|
|
||||||
|
CXX ?= g++
|
||||||
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
VDRDIR = ../../..
|
||||||
PKG_CONFIG ?= pkg-config
|
LIBDIR = ../../lib
|
||||||
PKGCFG = $(if $(VDRDIR),$(shell $(PKG_CONFIG) --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." $(PKG_CONFIG) --variable=$(1) vdr))
|
TMPDIR = /tmp
|
||||||
LIBDIR = $(call PKGCFG,libdir)
|
|
||||||
PLGCFG = $(call PKGCFG,plgcfg)
|
|
||||||
#
|
|
||||||
TMPDIR ?= /tmp
|
|
||||||
|
|
||||||
### The compiler options:
|
|
||||||
|
|
||||||
export CFLAGS = $(call PKGCFG,cflags)
|
|
||||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
|
||||||
|
|
||||||
### The version number of VDR's plugin API:
|
|
||||||
|
|
||||||
APIVERSION = $(call PKGCFG,apiversion)
|
|
||||||
|
|
||||||
### Allow user defined options to overwrite defaults:
|
### Allow user defined options to overwrite defaults:
|
||||||
|
|
||||||
-include $(PLGCFG)
|
-include $(VDRDIR)/Make.config
|
||||||
|
|
||||||
|
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||||
|
|
||||||
|
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||||
|
|
||||||
### The name of the distribution archive:
|
### The name of the distribution archive:
|
||||||
|
|
||||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||||
PACKAGE = vdr-$(ARCHIVE)
|
PACKAGE = vdr-$(ARCHIVE)
|
||||||
|
|
||||||
### The name of the shared object file:
|
|
||||||
|
|
||||||
SOFILE = libvdr-$(PLUGIN).so
|
|
||||||
|
|
||||||
### Includes and Defines (add further entries here):
|
### Includes and Defines (add further entries here):
|
||||||
|
|
||||||
INCLUDES +=
|
INCLUDES += -I$(VDRDIR)/include
|
||||||
|
|
||||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
@ -57,33 +49,27 @@ OBJS = $(PLUGIN).o
|
|||||||
|
|
||||||
### The main target:
|
### The main target:
|
||||||
|
|
||||||
all: $(SOFILE)
|
all: libvdr-$(PLUGIN).so
|
||||||
|
|
||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||||
$(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) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
libvdr-$(PLUGIN).so: $(OBJS)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
|
||||||
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib
|
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||||
|
@ -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 <Klaus.Schmidinger@tvdr.de>
|
Written by: Klaus Schmidinger <Klaus.Schmidinger@cadsoft.de>
|
||||||
|
|
||||||
Project's homepage: https://www.tvdr.de
|
Project's homepage: http://www.cadsoft.de/vdr
|
||||||
|
|
||||||
Latest version available at: https://www.tvdr.de
|
Latest version available at: http://www.cadsoft.de/vdr
|
||||||
|
|
||||||
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 4.1 2018/04/10 13:01:07 kls Exp $
|
* $Id: svdrpdemo.c 1.3 2007/08/15 13:19:57 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "2.4.0";
|
static const char *VERSION = "0.0.3";
|
||||||
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 {
|
||||||
|
15
README
15
README
@ -4,7 +4,10 @@ Video Disk Recorder ('VDR')
|
|||||||
These files contain the source code of the "Video Disk Recorder",
|
These files contain the source code of the "Video Disk Recorder",
|
||||||
which is based on the DVB driver of the LinuxTV project (http://linuxtv.org).
|
which is based on the DVB driver of the LinuxTV project (http://linuxtv.org).
|
||||||
For details about the "Video Disk Recorder" project please
|
For details about the "Video Disk Recorder" project please
|
||||||
refer to https://www.tvdr.de.
|
refer to http://www.cadsoft.de/vdr.
|
||||||
|
|
||||||
|
There is also a remote control unit described on those
|
||||||
|
Web pages, which can be used within this program.
|
||||||
|
|
||||||
Please see the INSTALL file for details on how to install
|
Please see the INSTALL file for details on how to install
|
||||||
this program on your computer.
|
this program on your computer.
|
||||||
@ -14,7 +17,7 @@ The MANUAL file describes how to operate the VDR.
|
|||||||
The CONTRIBUTORS file lists all the people who have contributed to the
|
The CONTRIBUTORS file lists all the people who have contributed to the
|
||||||
development of VDR.
|
development of VDR.
|
||||||
|
|
||||||
The author can be contacted at vdr@tvdr.de.
|
The author can be contacted at kls@cadsoft.de.
|
||||||
|
|
||||||
Yet another "set-top box"?
|
Yet another "set-top box"?
|
||||||
--------------------------
|
--------------------------
|
||||||
@ -31,11 +34,3 @@ file management and even "on disk editing". The menus
|
|||||||
of commercial set-top boxes usually are a lot more fancy than
|
of commercial set-top boxes usually are a lot more fancy than
|
||||||
the ones in this system, but here we have the full source code
|
the ones in this system, but here we have the full source code
|
||||||
and can modify the menus in whatever way desired.
|
and can modify the menus in whatever way desired.
|
||||||
|
|
||||||
If you actually use VDR, please add yourself to the "VDR User Counter"
|
|
||||||
at https://www.tvdr.de/counter.htm. You can also like VDR on facebook
|
|
||||||
at https://www.facebook.com/VideoDiskRecorder.
|
|
||||||
|
|
||||||
|
|
||||||
"VDR Video Disk Recorder" is a registered trademark of Klaus Schmidinger.
|
|
||||||
"TVDR TV Done Right" is a registered trademark of Klaus Schmidinger.
|
|
||||||
|
@ -52,5 +52,5 @@ How to maintain an existing language file
|
|||||||
|
|
||||||
Once you have created or updated a translation file, please
|
Once you have created or updated a translation file, please
|
||||||
send it to the maintainer of the respective plugin (in case
|
send it to the maintainer of the respective plugin (in case
|
||||||
it belongs to a plugin) or to vdr@tvdr.de (for core VDR
|
it belongs to a plugin) or to kls@cadsoft.de (for core VDR
|
||||||
language files).
|
language files).
|
||||||
|
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