Compare commits

..

No commits in common. "master" and "2.1.10" have entirely different histories.

240 changed files with 9783 additions and 23704 deletions

View File

@ -275,7 +275,7 @@ Aaron Holtzman
Wolfgang Henselmann-Weiss <Wolfgang_Henselmann@betaresearch.de> Wolfgang Henselmann-Weiss <Wolfgang_Henselmann@betaresearch.de>
for fixing calculating the timeout value in cFile::FileReady() for fixing calculating the timeout value in cFile::FileReady()
Uwe Scheffler <scheffler.u@web.de> Uwe Scheffler <linux_dvb@uni.de>
for his help in keeping 'channels.conf.cable' and 'channels.conf.terr' up to date for his help in keeping 'channels.conf.cable' and 'channels.conf.terr' up to date
for helping to test new DVB-T handling for helping to test new DVB-T handling
for reporting a bug in switching the video format in the Setup/DVB menu for reporting a bug in switching the video format in the Setup/DVB menu
@ -283,9 +283,6 @@ Uwe Scheffler <scheffler.u@web.de>
for reporting a problem in handling the PrimaryLimit when requesting a device for for reporting a problem in handling the PrimaryLimit when requesting a device for
live viewing live viewing
for reporting a black screen while a "Recording started" message is displayed for reporting a black screen while a "Recording started" message is displayed
for reporting a problem with the lock on the Channels list in cDisplayChannel still
being held when Flush() was called
for reporting a problem with failed tuning in SCR systems
Matjaz Thaler <matjaz.thaler@guest.arnes.si> Matjaz Thaler <matjaz.thaler@guest.arnes.si>
for improving AC3 decoding when replaying DVDs for improving AC3 decoding when replaying DVDs
@ -717,10 +714,6 @@ Oliver Endriss <o.endriss@gmx.de>
to detect the frame type to detect the frame type
for suggesting to ignore channels with an RID that is not 0 when checking for obsolete for suggesting to ignore channels with an RID that is not 0 when checking for obsolete
channels channels
for fixing a possible stack overflow in cListBase::Sort()
for reporting a crash when deleting a recording
for reporting a problem with sluggish setting of editing marks and a jumping progress
display with very short recordings
Reinhard Walter Buchner <rw.buchner@freenet.de> Reinhard Walter Buchner <rw.buchner@freenet.de>
for adding some satellites to 'sources.conf' for adding some satellites to 'sources.conf'
@ -1204,9 +1197,6 @@ Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>
for the "binary skip" patch for the "binary skip" patch
for adding support for LCN (Logical Channel Numbers) for adding support for LCN (Logical Channel Numbers)
for suggesting to change the naming of "binary skip mode" to "adaptive skip mode" for suggesting to change the naming of "binary skip mode" to "adaptive skip mode"
for adding a Status parameter to the interface of cDevice::SignalStats() and
cDvbDevice::SignalStats()
for reporting a possible crash when scaling bitmaps with very small factors
Ralf Klueber <ralf.klueber@vodafone.com> Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark for reporting a bug in cutting a recording if there is only a single editing mark
@ -1226,9 +1216,6 @@ Peter Bieringer <pb@bieringer.de>
for suggesting to ignore lines tagged with '#' in the 'info.vdr' file of a recording for suggesting to ignore lines tagged with '#' in the 'info.vdr' file of a recording
for reporting a problem with the backslash ('\') in parameters when executing for reporting a problem with the backslash ('\') in parameters when executing
external commands external commands
for making the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public
for adding some missing user command calls for copying, renaming and moving recordings
for fixing scaling subtitles with anti-aliasing
Alexander Damhuis <ad@phonedation.de> Alexander Damhuis <ad@phonedation.de>
for reporting problems when deleting a timer that is currently recording for reporting problems when deleting a timer that is currently recording
@ -1856,7 +1843,6 @@ Lucian Muresan <lucianm@users.sourceforge.net>
for exporting some libsi functions for exporting some libsi functions
for suggesting to add functions to cDevice that allow derived output devices to for suggesting to add functions to cDevice that allow derived output devices to
implement scaling the video to a given size and location implement scaling the video to a given size and location
for sorting sources.conf by continuous azimuth
Mattias Grönlund <Mattias@Gronlund.net> Mattias Grönlund <Mattias@Gronlund.net>
for pointing out a missing cleanup at program exit in case there is a problem for pointing out a missing cleanup at program exit in case there is a problem
@ -2075,8 +2061,6 @@ Ville Skytt
for reporting a possible NULL pointer dereference in cCiSession::SendData() for reporting a possible NULL pointer dereference in cCiSession::SendData()
for reporting a superfluous assignment in cPipe::Open() for reporting a superfluous assignment in cPipe::Open()
for avoiding unnecessary pkg-config warnings in plugin Makefiles for avoiding unnecessary pkg-config warnings in plugin Makefiles
for fixing building VDR with systemd >= 230
for avoiding some duplicate code and unnecessary work in nit.c
Steffen Beyer <cpunk@reactor.de> Steffen Beyer <cpunk@reactor.de>
for fixing setting the colored button help after deleting a recording in case the next for fixing setting the colored button help after deleting a recording in case the next
@ -2124,10 +2108,6 @@ Martin Wache <M.Wache@gmx.net>
device, which avoids a busy loop on very fast machines device, which avoids a busy loop on very fast machines
for fixing a possible crash when loading an invalid XPM file for fixing a possible crash when loading an invalid XPM file
for suggesting to speed up anti-aliased font rendering by caching the blend indexes for suggesting to speed up anti-aliased font rendering by caching the blend indexes
for extending the option "Setup/Miscellaneous/Show channel names with source" to
"type" or "full"
for making the "Channels" menu indicate whether a channel is encrypted or a radio
channel
Matthias Lenk <matthias.lenk@amd.com> Matthias Lenk <matthias.lenk@amd.com>
for reporting an out-of-bounds memory access with audio language ids for reporting an out-of-bounds memory access with audio language ids
@ -2187,9 +2167,8 @@ Hardy Flor <HFlor@web.de>
Harald Milz <hm@seneca.muc.de> Harald Milz <hm@seneca.muc.de>
for his CUTR patch, which was used as a base to implement the SVDRP command EDIT for his CUTR patch, which was used as a base to implement the SVDRP command EDIT
for reporting a bug in parsing the '-l' command line option
Marko Mäkelä <marko.makela@iki.fi> Marko Mäkelä <marko.makela@hut.fi>
for making repeat keys be ignored when waiting for a keypress to cancel an operation for making repeat keys be ignored when waiting for a keypress to cancel an operation
for reporting that a menu was automatically closed when a replay ends for reporting that a menu was automatically closed when a replay ends
for suggesting to ignore k_Repeat when deciding whether the same key has been for suggesting to ignore k_Repeat when deciding whether the same key has been
@ -2200,18 +2179,6 @@ Marko M
for suggesting to simplify some conditional expressions in skinlcars.c and skinsttng.c for suggesting to simplify some conditional expressions in skinlcars.c and skinsttng.c
for reporting some uninitialized item area coordinates in cSkinLCARSDisplayMenu for reporting some uninitialized item area coordinates in cSkinLCARSDisplayMenu
for reporting a problem with the video directory not being set correctly with --edit for reporting a problem with the video directory not being set correctly with --edit
for reporting a compiler warning about the use of strncpy() in strreplace()
for adding support for kernel based LIRC driver
for reporting a possible heap-use-after-free in cDvbTuner::Action()
for reporting a flaw in initializing cDvbPlayerControl and cTransferControl
for reporting a possible call to poll() in cSectionHandler::Action() without any
filters
for avoiding the memcpy() call in cGlyph::cGlyph() if the bitmap is empty
for avoiding unnecessary processing in cDvbSubtitleConverter::FinishPage() if there
are no areas
for avoiding a zero sized array in cDevice::GetDevice()
for reporting a crash when deleting a recording that is currently being edited, and
then immediately deleting the edited version, too
Patrick Rother <krd-vdr@gulu.net> Patrick Rother <krd-vdr@gulu.net>
for reporting a bug in defining timers that only differ in the day of week for reporting a bug in defining timers that only differ in the day of week
@ -2355,7 +2322,6 @@ Andr
for reporting a bug in selecting the last replayed recording in the Recordings menu for reporting a bug in selecting the last replayed recording in the Recordings menu
in case there are folders and plain recordings with names that differ only in in case there are folders and plain recordings with names that differ only in
non-alphanumeric characters non-alphanumeric characters
for reporting a problem with permanently looping through PMT PIDs on a SatIP receiver
Jürgen Schilling <juergen_schilling@web.de> Jürgen Schilling <juergen_schilling@web.de>
for reporting that color buttons were displayed in the recording info menu if it for reporting that color buttons were displayed in the recording info menu if it
@ -2457,23 +2423,6 @@ Christoph Haubrich <christoph1.haubrich@arcor.de>
"Edit recording" menu "Edit recording" menu
for suggesting to add a confirmation before renaming a recording to its folder name for suggesting to add a confirmation before renaming a recording to its folder name
for reporting a problem with data loss in case renaming a recording fails for reporting a problem with data loss in case renaming a recording fails
for adding support for HEVC-video and AC-4-audio
for implementing anti-aliasing for cPixmap::DrawSlope() and cPixmap::DrawEllipse()
for reporting an unnecessary double call to Display() in cMenuRecording::RefreshRecording()
for reporting too much memory being allocated in the cImage constructors
for making the 'Edit path' dialog also show the total size of all recordings in that path
for suggesting to make cRecordingInfo::Errors() return -1 for old recordings, and
reporting a missing 'const'
for reporting that the edited recording is not deleted in case of an error
for reporting missing '0x09=H.265 video, 0x19 = AC4 audio' in vdr.5
for reporting a problem with the call to EpgHandlers.EndSegmentTransfer()
for fixing handling zero bytes in cH264Parser
for implementing parsing frame rate and image size for MPEG2, H.264 and H.265
for reporting a bug in generating the index file in the cutter
for adding the frame width, height, scan type and aspect ratio of a recording to the 'F'
tag of the 'info' file
for adding a workaround in detecting frame height for channels with wrong crop parameters
for reporting duplicate component entries in the info of an ongoing recording
Pekka Mauno <pekka.mauno@iki.fi> Pekka Mauno <pekka.mauno@iki.fi>
for fixing cSchedule::GetFollowingEvent() in case there is currently no present for fixing cSchedule::GetFollowingEvent() in case there is currently no present
@ -2524,13 +2473,6 @@ Tobias Grimm <tobias.grimm@e-tobi.net>
numbers use a decimal point numbers use a decimal point
for adding dependency on 'i18n' to 'install-i18n' in the VDR Makefile for adding dependency on 'i18n' to 'install-i18n' in the VDR Makefile
for adding a manual page for 'svdrpsend' for adding a manual page for 'svdrpsend'
for adding a missing dependency to the Makefile to avoid error messages in the
clean-plugins target
for adding optional verbose output to the libsi Makefile
for making the call to pkg_config configurable via the PKG_CONFIG macro
for fixing a typo in svdrp.c
for suggesting to add CPPFLAGS to CXXFLAGS to allow extra preprocessor flags to be
given when doing make
Helge Lenz <h.lenz@gmx.de> Helge Lenz <h.lenz@gmx.de>
for reporting a bug in setting the 'Delta' parameter when calling the shutdown for reporting a bug in setting the 'Delta' parameter when calling the shutdown
@ -2552,50 +2494,6 @@ Nino Gerbino <ngerb@interfree.it>
Markus Ehrnsperger <markus.ehrnsperger@googlemail.com> Markus Ehrnsperger <markus.ehrnsperger@googlemail.com>
for reporting a problem with missing 'INCLUDES += -I$(DVBDIR)/include' in an existing for reporting a problem with missing 'INCLUDES += -I$(DVBDIR)/include' in an existing
Make.config Make.config
for reporting a bug in error handling when loading a plugin
for reporting a possible crash in cIndexFile::GetClosestIFrame()
for reporting a missing 'const' in cTimers::GetTimerForEvent()
for suggesting to add a chapter about locking to PLUGINS.html
for fixing unnecessary interruption of ongoing recordings if timers avoided the
transfer mode receiver device
for reporting broken video data streams on systems without output device when switching
live channel to a different transponder while recording
for fixing a possible crash in cDevice::StopSectionHandler()
for making using a dummy OSD if no OSD provider is available not be considered an error
any more
for removing syslog calls in child process after fork()
for adding the move constructor to cString for better performance
for fixing handling primary device on headless systems
for adding a 15 second grace period before actually stopping a VPS timer
for making the primary device no longer start unnecessary threads if it doesn't have
a decoder
for improving handling present/following data for VPS timers
for making logging event status changes also show the previous status
for making a device always being kept occupied if a timer is in VPS margin or needs the
transponder
for suggesting to enable unused devices to be put into a power save mode
for a patch that was used to implement power save mode for cDvbDevice
for suggesting to add 'lnbPowerTurnedOn = false' to cDvbTuner::ProvidesFrontend()
for reporting a crash in strreplace() for multiple replacements with strings of
different lengths
for suggesting to add the lines from 'Fixed a timeout in cDvbDevice while tuning after
the frontend has been reopened' to cDvbTuner::ProvidesFrontend()
for improving the error message when closing a frontend
for reporting a problem in cSchedule::Sort(), in case hasRunning was true, but there
was no event with RunningStatus() >= SI::RunningStatusPausing
for reporting problem with duplicate events if they are moved to a lower table ID and
at the same time get a new event ID
for reporting a bug in handling negative values in cSource::Position() on
systems where 'int' is 64 bit
for suggesting a fix for expiring of one-time VPS timers in case there is more than
one event with the same VPS time
for fixing handling margins for timers that are not VPS controlled and not spawned
for implementing cStatus::OsdItem2() with the information whether the item is selectable
for reporting an improper call of cStatus::OsdCurrentItem() before cStatus::OsdItem2()
for fixing unnecessary calls to DisplayCurrent() for editable menu items
for implementing cStatus::OsdCurrentItem2() with the index of the current item
for adding missing calls to cStatus::MsgOsdStatusMessage() and implementing
cStatus::OsdStatusMessage2() with the type of the message
Werner Färber <w.faerber@gmx.de> Werner Färber <w.faerber@gmx.de>
for reporting a bug in handling the cPluginManager::Active() result when pressing for reporting a bug in handling the cPluginManager::Active() result when pressing
@ -2713,15 +2611,6 @@ J
for adding HandledExternally() to the EPG handler interface for adding HandledExternally() to the EPG handler interface
for adding IsUpdate() to the EPG handler interface for adding IsUpdate() to the EPG handler interface
for adding Begin/EndSegmentTransfer() to the EPG handler interface for adding Begin/EndSegmentTransfer() to the EPG handler interface
for making cEpgHandlers::BeginSegmentTransfer() boolean
for suggesting to change tEventID back to u_int32_t
for adding the 'aux' member to cEvent
for reporting a possible deadlock when quickly zapping through encrypted channels
for a patch that was used to implement cStatus::MarksModified()
for suggesting to no longer log unaligned marks in cMarks::Align()
for reporting some warnings from g++ 7.2.0 regarding fixed buffer sizes in
cMenuEditTimeItem::Set() and cCountdown::Update()
for fixing symmetry of Begin/EndSegmentTransfer() calls in cEIT::cEIT()
Peter Pinnau <vdr@unterbrecher.de> Peter Pinnau <vdr@unterbrecher.de>
for reporting that 'uint32_t' requires including stdint.h in font.h on some systems for reporting that 'uint32_t' requires including stdint.h in font.h on some systems
@ -2828,38 +2717,10 @@ Benjamin Hess <benjamin.h@gmx.ch>
for enhancing the SVDRP command CLRE to allow clearing the EPG data of a particular for enhancing the SVDRP command CLRE to allow clearing the EPG data of a particular
channel channel
Winfried Köhler <nvdec@quantentunnel.de> Winfried Koehler <w_koehl@gmx.de>
for fixing finding new transponders for fixing finding new transponders
for fixing wrong value for TableIdBAT in libsi/si.h
for reporting a compiler warning in calculations involving FramesPerSecond() for reporting a compiler warning in calculations involving FramesPerSecond()
for making several code modifications to avoid compiler warnings
for improving the description of the transponder parameters in vdr.5
for reporting a necessary fix in the description of cReceiver in PLUGINS.html,
regarding detaching a receiver from its device before deleting it
for fixing some copy&paste errors in PLUGINS.html for fixing some copy&paste errors in PLUGINS.html
for fixing the size of cChannel::dtypes[]
for adding a device hook for detecting whether a device provides EIT data
for improving deleting plugins in case the plugin uses its own memory management
for reporting a bug in handling newline characters in ci.c's CopyString()
for reporting a bug in checking the return value of the Open() call in
cFileName::SetOffset()
for adding initialization of cDvbFrontend::frontendInfo
for improving handling missing VDRPluginDestroyer()
for fixing a compiler warning
for fixing handling $(PKG_CONFIG) in newplugin
for using __cplusplus instead of DISABLE_TEMPLATES_COLLIDING_WITH_STL, and using
std::min(), std::max() and std::swap() is available
for adding some missing "AUTO" values to vdr.5
for fixing default values for DVB-T
for adding missing rounding when dividing frequencies in processing the NIT
for suggesting to add note about not messing with event ids in EPG handlers
for adding a missing initialization of cChannel::nameSourceMode
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
for reporting a compiler warning with gcc 14.1.0
for suggesting to remove defining DEPRECATED_* macros with value 0, because this
is the preprocessor's default
for suggesting a fix for handling negative values in cSource::Position() on
systems where 'int' is 64 bit
Hans-Werner Hilse <hilse@web.de> Hans-Werner Hilse <hilse@web.de>
for adding the command line option --userdump to enable core dumps in case VDR for adding the command line option --userdump to enable core dumps in case VDR
@ -2926,6 +2787,13 @@ Michael Nork <mnork0@gmx.net>
binary distributions to have full control over whether or not to use the --vfat binary distributions to have full control over whether or not to use the --vfat
option at runtime option at runtime
Winfried Köhler <w_koehl@gmx.de>
for fixing wrong value for TableIdBAT in libsi/si.h
for making several code modifications to avoid compiler warnings
for improving the description of the transponder parameters in vdr.5
for reporting a necessary fix in the description of cReceiver in PLUGINS.html,
regarding detaching a receiver from its device before deleting it
Igor M. Liplianin <liplianin@tut.by> Igor M. Liplianin <liplianin@tut.by>
for a patch that was used to convert VDR to the S2API driver API for a patch that was used to convert VDR to the S2API driver API
@ -2949,20 +2817,6 @@ Johann Friedrichs <johann.friedrichs@web.de>
for fixing loading the setup.conf file in case a parameter contains the '#' character for fixing loading the setup.conf file in case a parameter contains the '#' character
for reporting that the "Resume" button in the main menu was active even if the for reporting that the "Resume" button in the main menu was active even if the
respective recording did not exist respective recording did not exist
for fixing a double deletion of a cTimer in case HandleRemoteModifications() returned
false
for reporting an invalid lock sequence in the epgsearch plugin, which turned out to
be an abandoned member of class cSchedulesLock
for fixing handling VPS events outside the LingerLimit, which could cause recordings to
stop prematurely
for fixing handling timers during the change from DST to winter time
for fixing a possible crash with plugins that retrieve player information after a
replay has been stopped, but before the replay control has been destroyed
for reporting a problem in processing SVDRP client responses in case the caller doesn't
want the actual response strings
for reporting a bug in handling the tfRecording flag in the SVDRP commands MODT and UPDT
for adding a missing '-D' to the 'plugins' target of the Makefile
for adding code for the 'qks' audio track
Timo Helkio <timolavi@mbnet.fi> Timo Helkio <timolavi@mbnet.fi>
for reporting a hangup when replaying a TS recording with subtitles activated for reporting a hangup when replaying a TS recording with subtitles activated
@ -2988,10 +2842,6 @@ Derek Kelly <user.vdr@gmail.com>
for reporting a missing template for DVBDIR in Make.config.template for reporting a missing template for DVBDIR in Make.config.template
for suggesting to add ARGSDIR to the ONEDIR section of Make.config.template for suggesting to add ARGSDIR to the ONEDIR section of Make.config.template
for suggesting to change the naming of "binary skip mode" to "adaptive skip mode" for suggesting to change the naming of "binary skip mode" to "adaptive skip mode"
for suggesting to make the -u option also accept a numerical user id
for reporting a problem with abs() in gcc6+ when called with an unsigned variable
for reporting a deadlock after the fix for a race between SVDRP CHAN and
cDevice::HasProgramme()
Marcel Unbehaun <frostworks@gmx.de> Marcel Unbehaun <frostworks@gmx.de>
for adding cRecordingInfo::GetEvent() for adding cRecordingInfo::GetEvent()
@ -3023,14 +2873,6 @@ Manuel Reimer <Manuel.Reimer@gmx.de>
order to avoid discontinuities order to avoid discontinuities
for setting the environment variables HOME, USER, LOGNAME and SHELL accordingly for setting the environment variables HOME, USER, LOGNAME and SHELL accordingly
when switching to a less privileged user id when switching to a less privileged user id
for reporting a bug in moving channels between number groups in SVDRP's MOVC command
for fixing compatibility with current versions of glibc
for suggesting to make the SVDRP command DELC accept a channel id
for reporting a crash in the SVDRP command CLRE in case a non-existing channel
number is given
for reporting that LSTE doesn't work after PUTE in case a channel didn't already
have EPG data
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
Rene van den Braken <rene@vandenbraken.name> Rene van den Braken <rene@vandenbraken.name>
for reporting a bug in writing the PCR pid into the PMT in for reporting a bug in writing the PCR pid into the PMT in
@ -3080,11 +2922,6 @@ Lars Hanisch <dvb@flensrocker.de>
for making VDR read command line options from *.conf files in /etc/vdr/conf.d for making VDR read command line options from *.conf files in /etc/vdr/conf.d
for adding a missing backslash to the help text of the SVDRP command MOVR for adding a missing backslash to the help text of the SVDRP command MOVR
for fixing a memory leak in case of broken Extended Event Descriptors for fixing a memory leak in case of broken Extended Event Descriptors
for adding a 'const' version of cTimers::GetTimer()
for fixing a typo in the description of cTimers::GetTimersRead()
for suggesting to use dynamic buffering in handling CA descriptors to avoid a
possible buffer overflow
for suggesting to make APIVERSION a simple number, independent from VDRVERSION
Alex Lasnier <alex@fepg.org> Alex Lasnier <alex@fepg.org>
for adding tuning support for ATSC devices for adding tuning support for ATSC devices
@ -3127,7 +2964,6 @@ Christopher Reimer <vdr@creimer.net>
for reporting a possible crash in the OSD demo for reporting a possible crash in the OSD demo
for adding support for systemd for adding support for systemd
for suggesting to replace VDR_CHARSET_OVERRIDE with a command line option for suggesting to replace VDR_CHARSET_OVERRIDE with a command line option
for making the recorder skip empty adaptation field TS packets
Stefan Huskamp <coca_cola1@gmx.de> Stefan Huskamp <coca_cola1@gmx.de>
for suggesting to make entering characters via the number keys for suggesting to make entering characters via the number keys
@ -3167,13 +3003,6 @@ Frank Neumann <fnu@yavdr.org>
for reporting a problem with tuning timeouts when using SCR with multiple tuners for reporting a problem with tuning timeouts when using SCR with multiple tuners
for fixing the German translation of "VDR will shut down in %s minutes" for fixing the German translation of "VDR will shut down in %s minutes"
for adding support for "Satellite Channel Routing" (SCR) according to EN50607 ("JESS") for adding support for "Satellite Channel Routing" (SCR) according to EN50607 ("JESS")
for suggesting to make the Setup/CAM menu display which device an individual CAM
is currently assigned to
for reporting a problem with the default return value of cEpgHandler::BeginSegmentTransfer()
in derived classes that don't implement this function
for reporting uninitialized variable SdWatchdog in vdr.c
for suggesting to use readdir() instead of readdir_r(), if GLIBC version 2.24 or
newer is used
Gerald Dachs <vdr@dachsweb.de> Gerald Dachs <vdr@dachsweb.de>
for reporting a problem with checking for minimum line length of 21 characters in for reporting a problem with checking for minimum line length of 21 characters in
@ -3239,10 +3068,6 @@ Frank Niederwipper <f.niederwipper@gmail.com>
Chris Mayo <aklhfex@gmail.com> Chris Mayo <aklhfex@gmail.com>
for reporting a problem with detecting frames on radio channels for reporting a problem with detecting frames on radio channels
for fixing the link to "svdrpsend (1)" in the vdr.1 man page for fixing the link to "svdrpsend (1)" in the vdr.1 man page
for updating links in the INSTALL file
for reporting double slashes in file names processed with AddDirectory()
for using the 'example' macro in vdr.5
for fixing the install target in case of multiple jobs
Dominic Evans <oldmanuk@gmail.com> Dominic Evans <oldmanuk@gmail.com>
for making the SVDRP command LSTC accepts channel IDs for making the SVDRP command LSTC accepts channel IDs
@ -3332,7 +3157,6 @@ Oliver Schinagl <oliver@schinagl.nl>
Andrey Pridvorov <ua0lnj@bk.ru> Andrey Pridvorov <ua0lnj@bk.ru>
for reporting a problem with detecting frames in H.264 video, and pointing towards for reporting a problem with detecting frames in H.264 video, and pointing towards
a better way of doing it a better way of doing it
for updating the Russian OSD texts
Jens Vogel <jens.vogel@akjv.de> Jens Vogel <jens.vogel@akjv.de>
for suggesting to make cPatPmtParser::ParsePmt() also recognize stream type 0x81 for suggesting to make cPatPmtParser::ParsePmt() also recognize stream type 0x81
@ -3374,16 +3198,6 @@ Mike Hay <mike.hay@linenshorts.com>
Stefan Hofmann <stefan.hofmann@t-online.de> Stefan Hofmann <stefan.hofmann@t-online.de>
for suggesting to implement support for remote controls that only have a combined for suggesting to implement support for remote controls that only have a combined
"Play/Pause" key instead of separate keys for "Play" and "Pause" "Play/Pause" key instead of separate keys for "Play" and "Pause"
for a fix for compilers that don't like non-constant format strings
for suggesting to implement jumping between errors while replaying a recording
for adding vdrrootdir and incdir to vdr.pc
for fixing some typos in the translation files
for adding 1 to Utf8BufSize() for worst case
for adding a header to the backtrace
for adding parameter checks to strn0cpy()
for making the info files of recordings only be re-read if they have been modified
for reporting missing setting the file name of the info file after renaming a recording
for adding '~' to the list of delimiters in cTextWrapper
Stefan Blochberger <Stefan.Blochberger@gmx.de> Stefan Blochberger <Stefan.Blochberger@gmx.de>
for suggesting to automatically display the progress display whenever replay of a for suggesting to automatically display the progress display whenever replay of a
@ -3406,7 +3220,6 @@ Malte Forkel <malte.forkel@berlin.de>
Marc Perrudin <vdr@ekass.net> Marc Perrudin <vdr@ekass.net>
for translating OSD texts to the French language for translating OSD texts to the French language
for adding support for the systemd watchdog
Bernard Jaulin <bernard.jaulin@gmail.com> Bernard Jaulin <bernard.jaulin@gmail.com>
for translating OSD texts to the French language for translating OSD texts to the French language
@ -3423,37 +3236,6 @@ Matthias Senzel <matthias.senzel@t-online.de>
for reporting a bug in switching channels in the Schedule menu after going through for reporting a bug in switching channels in the Schedule menu after going through
various Now and Schedule menus for different channels various Now and Schedule menus for different channels
for the "jumpingseconds" patch for the "jumpingseconds" patch
for reporting a bug in drawing very long menu titles in the LCARS skin
for reporting and helping to debug a crash when stopping VDR
for reporting a crash when moving a recording between different volumes
for reporting a deadlock when moving a folder containing several recordings between
different volumes
for fixing a lengthy write lock on the Recordings list in case of moving a folder with
more than one recording
for implementing the parameter "OSD/Sorting direction for recordings"
for suggesting to stay in the original folder when moving a recording to a different
folder
for reporting problem with locking the Recordings list in the cutting process
for suggesting to change the log message ""ERROR: copying directory '%s' to '%s' ended
prematurely" from "error" to "info"
for suggesting to allow opening a folder when selecting a folder for a recording or
timer, even if it doesn't contain any subfolders
for reporting a possible locking problem in cMenuPathEdit::ApplyChanges() when the
lock is held while the error message is displayed
for reporting that the info of a newly edited recording was not available immediately
after starting the editing process
for reporting a problem with setting the initial offset of the cursor in a list menu
for reporting a high CPU load during replay with active progress display
for reporting that the lock on the Channels list in cDisplayChannel was still held
when Flush() was called
for reporting that if an error occurs while recording, the respective entry in the list
of recordings was not updated immediately
for fixing restoring the volume at program start
for fixing height calculation in progress display
for fixing an unnecessary double display of the current menu item in page up/down
for fixing an unnecessary double display of menu items in the Recordings menu
for reporting a bug in handling cSkinDisplayMenu::GetTextAreaFont()
for reporting characters being cut off while editing in the LCARS skin
Marek Nazarko <mnazarko@gmail.com> Marek Nazarko <mnazarko@gmail.com>
for translating OSD texts to the Polish language for translating OSD texts to the Polish language
@ -3480,7 +3262,6 @@ Stefan Braun <louis.braun@gmx.de>
for suggesting to add the menu category mcRecordingEdit for marking menus that edit for suggesting to add the menu category mcRecordingEdit for marking menus that edit
recording properties recording properties
for suggesting to make cRecording::GetResume() public for suggesting to make cRecording::GetResume() public
for implementing the possibility for skins to display horizontal menus
Jochen Dolze <vdr@dolze.de> Jochen Dolze <vdr@dolze.de>
for changing cThread::SetIOPriority() from "best effort class" to "idle class" in order for changing cThread::SetIOPriority() from "best effort class" to "idle class" in order
@ -3530,26 +3311,6 @@ Thomas Reufer <thomas@reufer.ch>
skipping" skipping"
for suggesting to change the return value of cOsd::RenderPixmaps() from cPixmapMemory for suggesting to change the return value of cOsd::RenderPixmaps() from cPixmapMemory
to cPixmap to cPixmap
for adding detection of 24fps
for suggesting to add some comment to cPixmap about the relation between OSD,
ViewPort and DrawPort
for suggesting to reduce the priority of the "video directory scanner" thread
for making the 'newplugin' script create the 'po' subdirectory for translations
for suggesting to add a note to the description of cFont::Size(), regarding possible
differences between it and cFont::Height()
for making the cPlayer member functions FramesPerSecond, GetIndex and GetReplayMode
'const'
for fixing resuming replay at a given position, which was off by one frame
for improving handling frame numbers to have a smoother progress display during
replay of recordings with B-frames
for fixing replaying recordings to their very end, if they don't end with an I-frame
for implementing a frame parser for H.265 (HEVC) recordings
for adding cFont::Width(void) to get the default character width and allow stretched
font drawing in high level OSDs
for fixing regenerating the index of audio recordings
for implementing the SVDRP commands 'LSTD' and 'PRIM'
for adding some comments regarding font height
for reporting a possible problem with plugins calling IsOpen() in ~cDisplayChannel()
Eike Sauer <EikeSauer@t-online.de> Eike Sauer <EikeSauer@t-online.de>
for reporting a problem with channels that need more than 5 TS packets for detecting for reporting a problem with channels that need more than 5 TS packets for detecting
@ -3577,9 +3338,6 @@ Tony Houghton <h@realh.co.uk>
Christian Winkler <winkler_chr@yahoo.de> Christian Winkler <winkler_chr@yahoo.de>
for reporting a problem with transfer mode on full featured DVB cards for encrypted for reporting a problem with transfer mode on full featured DVB cards for encrypted
channels that have no audio pid channels that have no audio pid
for reporting a problem when selecting a device/CAM combination for live viewing, if
the CAM that is known to decrypt the requested channel can not be assigned to the
primary device
Dietmar Spingler <d_spingler@gmx.de> Dietmar Spingler <d_spingler@gmx.de>
for reporting a problem that led to a fix in detaching receivers from devices in case for reporting a problem that led to a fix in detaching receivers from devices in case
@ -3587,14 +3345,6 @@ Dietmar Spingler <d_spingler@gmx.de>
for reporting a problem that led to a fix with EMM pids not being properly reset for for reporting a problem that led to a fix with EMM pids not being properly reset for
CAMs that need to receive the TS CAMs that need to receive the TS
for suggesting to add the channel name to log messages that reference a channel for suggesting to add the channel name to log messages that reference a channel
for suggesting to provide a way of using no DVB devices at all
for suggesting that the -V and -h options should list the plugins in alphabetical order
for suggesting to implement the setup option "Recording/Record key handling"
for suggesting to cache the channel/CAM relations in the file 'cam.data'
for suggesting to optionally list the channels with channel ids in the SVDRP command LSTC
for suggesting to include the channel ID in log messages about switching channels
for reporting a problem with the SVDRP command CHAN while the channel display is open
for suggesting to automatically close the CAM menu when the current channel is switched
Stefan Schallenberg <infos@nafets.de> Stefan Schallenberg <infos@nafets.de>
for adding the functions IndexOf(), InsertUnique(), AppendUnique() and RemoveElement() for adding the functions IndexOf(), InsertUnique(), AppendUnique() and RemoveElement()
@ -3603,218 +3353,32 @@ Stefan Schallenberg <infos@nafets.de>
Claus Muus <email@clausmuus.de> Claus Muus <email@clausmuus.de>
for adding the new parameters "Setup/Miscellaneous/Volume steps" and for adding the new parameters "Setup/Miscellaneous/Volume steps" and
".../Volume linearize" ".../Volume linearize"
for reporting multiple recording entries in case a recording is started during the
initial reading of the video directory
for reporting that getting the lock for removing deleted recordings may fail if the
disk is full
Dieter Ferdinand <dieter.ferdinand@gmx.de> Dieter Ferdinand <dieter.ferdinand@gmx.de>
for reporting a problem with jumping to an absolute position via the Red key in for reporting a problem with jumping to an absolute position via the Red key in
case replay was paused case replay was paused
for reporting a problem with the system getting unresponsive when removing a huge for reporting a problem with the system getting unresponsive when removing a huge
number of files in the thread that removes deleted recordings number of files in the thread that removes deleted recordings
for suggesting to call the script that gets called for recordings also right before a
recording is edited
Jasmin Jessich <jasmin@anw.at> Jasmin Jessich <jasmin@anw.at>
for modifying the CAM API so that it is possible to implement CAMs that can be freely for modifying the CAM API so that it is possible to implement CAMs that can be freely
assigned to any devices assigned to any devices
for writing the ddci2 plugin and for valuable input and help with testing and
debugging MTD support
for fixing selecting delivery system names in case of undefined indexes
for fixing detecting the inclusion of STL header files in tools.h
for help and suggestions when implementing debug output for checking the correct
sequence of locking global lists
for suggesting to use $(Q) to control Makefile verbosity
for adding handling DEBUG to the Make.config.template file, in order to control
code optimization
for suggesting to change the macros used to control deprecated code or functions
to numeric values (0 and 1), so that they can be controlled at compile time, without
having to edit the actual source code
Martin Schirrmacher <schirrmie@gmail.com> Martin Schirrmacher <schirrmie@gmail.com>
for suggesting to provide a way for skin plugins to get informed about the currently for suggesting to provide a way for skin plugins to get informed about the currently
used sort mode of a menu used sort mode of a menu
Mario Fenneis <admin@mediastreambox.at>
for translating OSD texts to the Hungarian language
Clemens Brauers <vdr@admin-cb.de> Clemens Brauers <vdr@admin-cb.de>
for modifying runvdr.template to improve compatibility with the "bash" and "dash" shells for modifying runvdr.template to improve compatibility with the "bash" and "dash" shells
Stefan Herdler <herdler@gmx.de> Stefan Herdler <herdler@gmx.de>
for fixing cMarks::GetNextBegin() and cMarks::GetNextEnd() for fixing cMarks::GetNextBegin() and cMarks::GetNextEnd()
for reporting that pausing replay at the last editing mark actually paused one I-frame
too early
for reporting a bug in using the default sort mode in a video directory without a
".sort" file
for reporting faulty memory handling in cString::Append()
for adding failsafe defaults for 'make LCLBLD=1' to the Makefile
for reporting the index file of a recording not being regenerated in case it is
present, but empty
for reporting a missing check for self-assignment in the move assignment operator
for modifying handling channel names with source to make it thread safe
for fixing setting T2 system ID from NIT
Tobias Faust <tobias.faust@gmx.de> Tobias Faust <tobias.faust@gmx.de>
for the original "jumpingseconds" patch for the original "jumpingseconds" patch
Erik Oomen <oomen.e@gmail.com> Erik Oomen <oomen.e@gmail.com>
for translating OSD texts to the Dutch language for translating OSD texts to the Dutch language
Magnus Sirwiö <sirwio@hotmail.com>
for translating OSD texts to the Swedish language
Albert Danis <a.danis@gmx.de>
for developing and improving several formulas used in controlling positioners
for translating OSD texts to the Hungarian language
for fixing the German translation of "Zap timeout"
for unifying the German translations of "StreamId" and "T2SystemId"
for improving the German translations of "EPG bugfix level"", "StreamId" and
"T2SystemId"
Tomasz Maciej Nowak <tmn505@gmail.com>
for translating OSD texts to the Polish language
Gabriel Bonich <gbonich@gmail.com>
for translating OSD texts to the Spanish language
Daniel Ribeiro <drwyrm@gmail.com>
for reporting a problem with setting the source value of newly created channels, in
case the NIT is received from a different, but very close satellite position, and
for helping to debug this
Janne Pänkälä <epankala@gmail.com>
for reporting that some broadcasters use the character 0x0D in EPG texts
Stefan Pöschel <basic.master@gmx.de>
for coding the AFFcleaner, parts of which were used to make the recorder skip empty
adaptation field TS packets
Robert Hannebauer <vdr@hannebauer.org>
for fixing an overflow of PIDs in a receiver
for fixing opening the UDP port in peerdemo
Aitugan Sarbassov <isarbassov@gmail.com>
for adding 'S58.5E Kazsat 3' to sources.conf
Sergey Chernyavskiy <glenvt18@gmail.com>
for reporting truncated date/time strings in the skins on multi-byte UTF-8
for adding a short sleep to cTSBuffer::Action() to avoid high CPU usage
for making the SVDRP commands that deal with recordings use a unique id for each
recording
Frank Richter <kulpstur@t-online.de>
for adding 'S3W ABS-3A' to sources.conf
Daniel Scheller <d.scheller@gmx.net>
for reporting a problem with detecting whether a CAM replies to queries, which didn't
work on some systems since the implementation of RI_HOST_CONTROL
Onur Sentürk <onur@sentek.org>
for making the MTD mapper avoid immediately reusing unique PIDs when switching channels
for fixing handling shared CA pids
for fixing handling the S2SatelliteDeliverySystemDescriptor for transponders broadcasting
in "backwards compatibility mode" according to ETSI EN 300 468
for pointing out some potentially mistakable code in cSectionHandler::SetStatus()
for adding periodic calls to malloc_trim(0) to reduce memory consumption
Helmut Binder <cco@aon.at>
for improving calculating signal strength and quality
for fixing switching through encrypted channels with the Up/Down keys
for deactivating MTD support if a non MCD capable CAM is inserted after removing
a previously used CAM that is MCD capable
for fixing accessing the actual frontend on multi frontend devices
for fixing processing the last entry in the scan list of the EIT scanner
for fixing processing transponder data in the NIT
for fixing triggering the SDT filter when parsing the NIT
for reporting a bug in processing SI::T2DeliverySystemDescriptor when typecasting it
over an SI::ExtensionDescriptor
for fixing mapping SIDs in MTD
for fixing updating the checksum in the CA table after mapping EMM PIDs for MTD
for fixing a compiler warning in ExchangeChars()
for suggesting to add __attribute__((packed)) to tIndexPes and tIndexTs
for helping with the implementation of retuning if the received transponder's SDT
doesn't contain the expected values for NID and TID
for adding the language code for Bulgarian
for a patch that was used as a base for fixing handling multi part ExtendedEventDescriptors
where only the first part contains information about the character table
for suggesting to check and report whether the given value is valid when setting the
override character table
for adding codes for more languages and special audio tracks
for adding cMtdCamSlot::TsPostProcess()
for adding cMtdHandler::StopDecrypting()
for adding support for detecting new channels broadcast in HEVC
for adding support for detecting 'advanced codec digital radio sound service'
for adding handling shared PMT pids and multiple PMT sections
for changing the country code in the generated ParentalRatingDescriptor from 'DEU' to
'902' to make it valid for all countries
for adjusting device selection in GetDeviceForTransponder() to that in GetDevice()
for adding CRC check of the CAT in cCaPidReceiver::Receive()
for reporting that the 'else if' branch in cDevice::GetDeviceForTransponder() hasn't
been active since version 1.7.29
for fixing handling inactive shared CA pids
for implementing handling multi packet CATs with MTD
for adding checking the symbol rate to cDvbTuner::IsTunedTo(), which apparently got
lost in version 1.7.13
for adding a check for an empty command in cDvbTuner::GetSignalStats() to avoid a
possible error message
for initializing the status variable in cDvbTuner::GetFrontendStatus() and
cDvbTuner::GetSignalStats() to avoid problems with drivers that don't do this
for fixing "read incomplete section" errors
for fixing generating the HashId in cEIT::cEIT()
for fixing a bug in handling shared PMTs, where after the first pass not all SIDs of a
PMT pid were checked any more
for reporting a problem with PMT handling in case locking the Channels list times out
for avoiding a lengthy lock on the Channels list when starting a recording
for preventing switching devices for pattern timers
for pointing out that cChannel::Transponder(void) is called very often
for fixing flushing old data from the section handler
for removing unused declaration of cDvbTuner::SetFrontendType()
for fixing handling incomplete multi-packet CAT
for fixing a memory leak in handling the NIT
for reporting a possible memory leak in creating fonts
for fixing a possible deadlock in cDevice::DetachAllReceivers()
Ulrich Eckhardt <uli@uli-eckhardt.de>
for reporting a problem with shutdown after user inactivity in case a plugin is
keeping the OSD open
Stian B. Barmen <stian@barmen.nu>
for reporting missing EPG data on channels from Canal Digital Norway
Jürgen Schneider <jsffm@web.de>
for reporting a possible discrepancy of the primary device number in the LSTD and
PRIM commands
for adding support for EAC3 audio from other sources
for reporting a crash if a pattern timer spawns a timer that uses EPISODE and the
event has no short text
for reporting a bug in VPS handling when spawning a pattern timer, in case Setup.UseVps
is false
for reporting an endless spawning of pattern timers in case the spawned timer doesn't
use VPS and fully overlaps a second event that is longer than the original one
for reporting a missing EPISODE macro expansion in case the event doesn't yet have a
short text when generating the pattern timer file name
for reporting a problem with spawned timers jumping to the next event in case
Setup.EPGLinger is very small
Stefan Verse <Verse@amotronics.de>
for fixing an occasional black screen when switching channels
Jens Schleusener <Jens.Schleusener@fossies.org>
for reporting several typos
Bernd Kuhls <bernd.kuhls@t-online.de>
for fixing possible compilation errors with libjpeg
Ulf Grüne <ulf.gruene@t-online.de>
for reporting the need for more than 15 modulation systems in cDevice::GetDevice()
Timo Weingärtner <timo@tiwe.de>
for reporting an integer overflow in calculating the disk use percentage if there's
more than 20TB of recordings
Jose Angel <joseangelpp@gmail.com>
for reporting a bug in default values for DVB-T
Andreas Baierl <post@andreasbaierl.de>
for implementing scaling images
for reporting a problem in the progress display when switching from "pause" to
"slow back"

1533
HISTORY

File diff suppressed because it is too large Load Diff

82
INSTALL
View File

@ -1,7 +1,7 @@
Installation of the Video Disk Recorder Installation of the Video Disk Recorder
--------------------------------------- ---------------------------------------
Version 2.7 Version 2.0
----------- -----------
Compiling and running the program: Compiling and running the program:
@ -47,9 +47,9 @@ By default the 'vdr' program can be controlled via the PC keyboard.
If you want to disable control via the keyboard, you can add NO_KBD=1 If you want to disable control via the keyboard, you can add NO_KBD=1
to the 'make' call, or use the '--no-kbd' option at runtime. to the 'make' call, or use the '--no-kbd' option at runtime.
If you have 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=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)
@ -73,15 +73,16 @@ port ("Simple Video Disk Recorder Protocol"). By default, it listens
on port 6419 (use the --port=PORT option to change this). For details on port 6419 (use the --port=PORT option to change this). For details
about the SVDRP syntax see the source file 'svdrp.c'. about the SVDRP syntax see the source file 'svdrp.c'.
WARNING: DUE TO THE OPEN SVDRP PORT THIS PROGRAM MAY CONSTITUTE A
======= POTENTIAL SECURITY HAZARD! IF YOU ARE NOT RUNNING VDR IN
A CONTROLLED ENVIRONMENT, YOU MAY WANT TO DISABLE SVDRP
BY USING '--port=0'!
The file 'svdrphosts.conf' can be used to define which hosts are allowed The file 'svdrphosts.conf' can be used to define which hosts are allowed
to access the SVDRP port. By default only localhost (127.0.0.1) is granted to access the SVDRP port. By default only localhost (127.0.0.1) is granted
access. If you want to give other hosts access to your SVDRP port you need to access. If you want to give other hosts access to your SVDRP port you need to
add their IP numbers to 'svdrphosts.conf'. add their IP numbers to 'svdrphosts.conf'.
You can disable SVDRP access entirely by either running VDR with '--port=0',
or by removing all entries (including 127.0.0.1 for the localhost) from
'svdrphosts.conf'.
If the program shall run as a daemon, use the --daemon option. This If the program shall run as a daemon, use the --daemon option. This
will completely detach it from the terminal and will continue as a will completely detach it from the terminal and will continue as a
background process. background process.
@ -93,24 +94,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 Standard compliance
------------------- -------------------
@ -151,10 +134,10 @@ displayed correctly. Since BiDi support adds some runtime overhead by requiring
additional memory allocation and copying, this feature is not compiled in additional memory allocation and copying, this feature is not compiled in
by default, so that users that have no need for this don't get any overhead. by default, so that users that have no need for this don't get any overhead.
Workaround for providers not encoding their DVB SI table strings correctly Workaround for providers not encoding their EPG data correctly
-------------------------------------------------------------------------- --------------------------------------------------------------
According to "ETSI EN 300 468" the default character set for SI data is According to "ETSI EN 300 468" the default character set fo 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
@ -264,27 +247,24 @@ 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 or a recording has been deleted.
The program will be called with two or three string parameters. The program will be called with two or three (in case of "edited") string
The first parameter is one of parameters. The first parameter is one of
before if this is *before* a recording starts before if this is *before* a recording starts
started if this is after a recording has *started* started if this is after a recording has *started*
after if this is *after* a recording has finished after if this is *after* a recording has finished
editing if this is before *editing* a recording
edited if this is after a recording has been *edited* edited if this is after a recording has been *edited*
deleted if this is after a recording has been *deleted* deleted if this is after a recording has been *deleted*
copying if this is before *copying* a recording
copied if this is after a recording has been *copied*
renamed if this is after a recording has been *renamed*
moved if this is after a recording has been *moved*
(note that a move across file system borders triggers a sequence
of "copying", "copied" and "deleted")
and the second 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 (second
parameter) and the name of the source version (third parameter).
In the "deleted" case the extension of the directory name is ".del"
instead of ".rec".
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
@ -306,10 +286,6 @@ case "$1" in
after) after)
echo "After recording $2" echo "After recording $2"
;; ;;
editing)
echo "Editing recording $2"
echo "Source recording $3"
;;
edited) edited)
echo "Edited recording $2" echo "Edited recording $2"
echo "Source recording $3" echo "Source recording $3"
@ -317,22 +293,6 @@ case "$1" in
deleted) deleted)
echo "Deleted recording $2" echo "Deleted recording $2"
;; ;;
copying)
echo "Destination recording $2"
echo "Source recording $3"
;;
copied)
echo "Destination recording $2"
echo "Source recording $3"
;;
renamed)
echo "New name of recording $2"
echo "Old name of recording $3"
;;
moved)
echo "New path of recording $2"
echo "Old path of recording $3"
;;
*) *)
echo "ERROR: unknown state: $1" echo "ERROR: unknown state: $1"
;; ;;

215
MANUAL
View File

@ -1,7 +1,7 @@
Video Disk Recorder User's Manual Video Disk Recorder User's Manual
--------------------------------- ---------------------------------
Version 2.7 Version 2.0
----------- -----------
* Remote Control Keys * Remote Control Keys
@ -50,8 +50,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
@ -90,7 +90,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 +264,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 +276,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
@ -480,8 +477,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,9 +498,6 @@ 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.
@ -513,140 +505,6 @@ Version 2.7
The "Red" key in the "Edit timer" menu opens a list of folders, which can be The "Red" key in the "Edit timer" menu opens a list of folders, which can be
used to define the file name in which the recording will be stored. used to define the file name in which the recording will be stored.
The "Yellow" key in the "Edit timer" menu toggles the timer between "Pattern"
and "Regular".
When editing the "File" field, the "Blue" key in can be used to insert useful
macros.
* Pattern timers
There are cases where it would make sense to have a more flexible kind of
recording timer. For instance, some channels that provide VPS don't always
use the exact same VPS time for a series, which is extremely annoying.
Or you might want to record all films that have a certain pattern in their
title, no matter when they are broadcast. In such cases, "pattern timers"
can help.
In the "Edit timer" menu press the Yellow button to turn a regular timer into
a pattern timer. Pressing this button again switches back to regular.
The following rules apply to pattern timers:
- Pattern timers can only work for channels that provide EPG data.
- When using pattern timers, there should always be at least one free device that
can be used to regularly receive the EPG of the pattern timer's channel.
- A pattern timer records every matching event on the given channel that overlaps
with the given start/stop time. Overlapping events are recorded in full,
even if they extend outside the given start/stop interval.
- In order to actually record an event, a pattern timer "spawns" a separate timer
that does the recording. If there are matching events that would start while
the first spawned timer is still recording (due to the start/stop margins), timers
for those events are also spawned.
- Spawned timers are marked with the flag tfSpawned.
- Spawned timers take the Priority, Lifetime and VPS settings from the pattern timer.
- The special pattern "*" matches every event. So a timer with
a start/stop time of 00:00/23:59 will record every event of that day
into separate recordings. Note that when using this pattern there should
be no other timers for the same channel, because these might interfere.
- Once a timer has been spawned, it is treated like any other regular
timer. Any changes made to the corresponding pattern timer thereafter will have
no effect on spawned timers. Note that after deleting a spawned timer,
the corresponding pattern timer may respawn it.
- Recording is done according to the event's begin/end times, either
by adding the start/stop margins (for non-VPS timers) or by using the
event's running status (for VPS timers).
- If the start/stop margins of a spawned timer are reduced because the event
before and/or after that timer's event is shorter than the respective margin,
the actual recording still uses the full margins.
- If the times of the event change, a non-VPS pattern timer automatically adjusts
itself to the new times. This also happens if the start/stop margins are changed
in the setup.
- The recording of a pattern timer is stored under the given file name, just like
regular timers do. In addition to the "TITLE" and "EPISODE" macros the file
name of a pattern timer can also use "{<}" and "{>}" to reference the part of the
event's title before and after the pattern, respectively. For instance,
if the event's title is "Abc def ghi" and the pattern is "def ", "{<}"
would contain "Abc " and "{>}" would contain "ghi" (note the matching of the
blanks). For completeness, "{=}" can be used to reference the matching
pattern itself.
- In the "Timers" menu pressing the Red button on a pattern timer only toggles the
timer between "on" and "off", even if this is a repeating timer.
- In the "Timers" menu pattern timers are sorted alphabetically to the end of the
list of timers.
- A regular timer that is currently recording can't be changed into a pattern timer.
- In the "Edit timer" menu the file name and pattern are displayed as
separate items. The Yellow button can be used to toggle between a regular
timer and a pattern timer. When going from regular to pattern, the Pattern item will
be initialized with the base part of the file name.
- The characters '^' and '$' can be used at the very beginning and end of
the pattern to anchor the pattern to the begin or end of the title.
Using both of these will match only titles that consist of exactly the given pattern,
with nothing before and nothing after it.
- The Pattern field in the "Edit timer" menu allows blanks at the end of the string,
which may help to separate the text after the matching pattern.
- If the first character of the pattern is '@', an event that matches the
rest of the pattern is only recorded if the resulting recording's file
name (without any folders) is not contained in the donerecs.data file.
This avoids duplicate recordings of the same programme. Timers spawned from
such a pattern timer are marked with the flag tfAvoid.
- When editing the "File" field of a timer, the Blue button can be pressed to
insert one of the macros "TITLE", "EPISODE", "{<}", "{=}" or "{>}",
respectively. Pressing the Blue button repeatedly loops through the available
macros. The "{...}" macros are only available for pattern timers.
- In the "Schedule" and "What's on...?" menus the events that will be recorded
by a pattern timer are marked in the same way as regular timers.
- The TIMERS column in the LCARS skin doesn't show the basic definitions of
pattern timers, it only shows timers actually spawned from pattern timers.
If the pattern is prepended with '@', the name of the resulting recording (everything
after the rightmost '~', or the entire file name, if there is no '~') will be stored
in the file donerecs.data, so that multiple recordings of the same programme can be
avoided. When using this feature, special care must be taken regarding the recording's
file name. For instance, with a combination of
pattern file name
@Columbo Movies~TITLE
if the event's title is just "Columbo", this pattern timer would only record once,
and ignore any future events with that title, even if the episode would be different.
So you may want to use the episode name, as in
pattern file name
@Columbo Movies~TITLE - EPISODE
to make the file name unique. If you have several pattern timers for the same show on
different channels, chances are that the broadcasters handle title and episode
differently, as for example in
TITLE EPISODE pattern file name
Columbo Blueprint for Murder @^Columbo$ TITLE - EPISODE
Columbo - Blueprint for Murder @^Columbo TITLE
Columbo: Blueprint for Murder @^Columbo:_ Columbo - {>}
(note the '_' in the pattern of the third example; this is just used to visualize
the blank at the end of the pattern)
In order to have the same episode result in the same recording file name on all
channels, the file name needs to be generated differently for each channel. First
you need to decide on a proper combination of title and episode name, preferably
one that is already used by one of your channels (let's say the second one).
In the first case, title and episode name are correctly put in their respective
places, and "TITLE - EPISODE" as file name will do. The second case is our common
version, where everything is in the title, so TITLE is just fine. The third case
poses a problem, because everything is in the title, but with a different separator.
Here the special macro "{>}" can be used in the file name, which contains everything
following the matching pattern. There are three macros that can be used here:
{<} everything before the matching pattern
{>} everything after the matching pattern
{=} the matching pattern itself (just for completeness)
As of VDR version 2.5.2, the characters ' ' (blank), ':' and '-' are ignored
when checking whether a particular recording has already been made by a pattern
timer, making "TITLE - EPISODE" and "TITLE: EPISODE" the same.
VDR version 2.6.6 added '/' to this list.
* Managing folders * Managing folders
The "Select folder" menu, which can be accessed by pressing the "Red" key in The "Select folder" menu, which can be accessed by pressing the "Red" key in
@ -796,18 +654,6 @@ VDR version 2.6.6 added '/' to this list.
plain recordings. Set this option to "no" if you want folders plain recordings. Set this option to "no" if you want folders
to be interspersed with recordings when sorted alphabetically. to be interspersed with recordings when sorted alphabetically.
Default sort mode for recordings = by time
Controls whether recordings are sorted by time or by name.
If a particular sort mode has been selected for a folder by
pressing '0', the default no longer applies to that folder.
Sorting direction for recordings = ascending
When recordings are sorted "by time", they appear in ascending
order (i.e. "oldest" to "newest"). If this parameter is set to
"descending", they will be presented "newest" to "oldest.
Note that in the latter case, if "Always sort folders first"
is "yes", folders will appear in reverse alphabetical order.
Number keys for characters = yes Number keys for characters = yes
Controls whether the number keys can be used to enter Controls whether the number keys can be used to enter
characters in a text input field. You may want to set this characters in a text input field. You may want to set this
@ -829,16 +675,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
@ -1040,22 +876,14 @@ 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
to be recorded is shorter than the respective margin.
Default priority = 50 The default Priority and Lifetime values used when Default priority = 50 The default Priority and Lifetime values used when
Default lifetime = 99 creating a new timer event. A Lifetime value of 99 Default lifetime = 99 creating a new timer event. A Lifetime value of 99
means that this recording will never be deleted means that this recording will never be deleted
automatically. automatically.
Record key handling = 2 Pause priority = 10 The Priority and Lifetime values used when pausing live
Defines what happens if the Record key on the remote control Pause lifetime = 1 video.
is pressed during live tv.
0 = no instant recording
1 = confirm instant recording
2 = record instantly
The default is 2.
Pause key handling = 2 Defines what happens if the Pause key on the remote control Pause key handling = 2 Defines what happens if the Pause key on the remote control
is pressed during live tv. is pressed during live tv.
@ -1064,9 +892,6 @@ VDR version 2.6.6 added '/' to this list.
2 = pause live video 2 = pause live video
The default is 2. The default is 2.
Pause priority = 10 The Priority and Lifetime values used when pausing live
Pause lifetime = 1 video.
Use episode name = yes Repeating timers use the EPG's 'Episode name' information Use episode name = yes Repeating timers use the EPG's 'Episode name' information
to create recording file names in a hierarchical structure to create recording file names in a hierarchical structure
(for instance to gather all episodes of a series in a (for instance to gather all episodes of a series in a
@ -1241,23 +1066,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'
@ -1280,7 +1088,7 @@ VDR version 2.6.6 added '/' to this list.
The time (in milliseconds) between two subsequent key The time (in milliseconds) between two subsequent key
presses generated by the remote control's repeat function. presses generated by the remote control's repeat function.
If the remote control in use has a repeat delta that is If the remote control in use has a repeat delta that is
longer than that given in this parameter, that longer delta longer than that given in this parameter, that longer delay
will prevail. will prevail.
Initial channel = The channel ID of the channel that shall be tuned to when Initial channel = The channel ID of the channel that shall be tuned to when
VDR starts. Default is empty, which means that it will VDR starts. Default is empty, which means that it will
@ -1307,11 +1115,10 @@ VDR version 2.6.6 added '/' to this list.
wrap around the beginning or end of the channel list if wrap around the beginning or end of the channel list if
this parameter is set to 'yes'. this parameter is set to 'yes'.
Show channel names with source = off Show channel names with source = no
If this option is turned on, channel names will be displayed If this option is turned on, channel names will be displayed
with the source appended to them, as in "ZDF (S)" (if the with the source appended to them, as in "ZDF (S)", where
option is set to "type), or "ZDF (S19.2E)" (if it is set to 'S' stands for "Satellite".
"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.,

View File

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

View File

@ -4,26 +4,23 @@
# 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 3.6 2015/02/09 12:28:24 kls Exp $
.DELETE_ON_ERROR: .DELETE_ON_ERROR:
# Compiler flags: # Compiler flags:
PKG_CONFIG ?= pkg-config
CC ?= gcc CC ?= gcc
CFLAGS ?= -g -O3 -Wall CFLAGS ?= -g -O3 -Wall
CXX ?= g++ CXX ?= g++
CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses CXXFLAGS ?= -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses
CXXFLAGS += $(CPPFLAGS)
CDEFINES = -D_GNU_SOURCE CDEFINES = -D_GNU_SOURCE
CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE CDEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell $(PKG_CONFIG) --libs freetype2 fontconfig) LIBS = -ljpeg -lpthread -ldl -lcap -lrt $(shell pkg-config --libs freetype2 fontconfig)
INCLUDES ?= $(shell $(PKG_CONFIG) --cflags freetype2 fontconfig) INCLUDES ?= $(shell pkg-config --cflags freetype2 fontconfig)
# Directories: # Directories:
@ -31,14 +28,6 @@ CWD ?= $(shell pwd)
LSIDIR ?= $(CWD)/libsi LSIDIR ?= $(CWD)/libsi
PLUGINDIR ?= $(CWD)/PLUGINS PLUGINDIR ?= $(CWD)/PLUGINS
# Failsafe defaults for "make LCLBLD=1":
ifdef LCLBLD
DESTDIR ?= $(CWD)
LOCDIR ?= $(CWD)/locale
HDRDIR ?= $(CWD)/include
LIBDIR ?= $(PLUGINDIR)/lib
endif
DESTDIR ?= DESTDIR ?=
VIDEODIR ?= /srv/vdr/video VIDEODIR ?= /srv/vdr/video
CONFDIR ?= /var/lib/vdr CONFDIR ?= /var/lib/vdr
@ -46,14 +35,13 @@ ARGSDIR ?= /etc/vdr/conf.d
CACHEDIR ?= /var/cache/vdr CACHEDIR ?= /var/cache/vdr
PREFIX ?= /usr/local PREFIX ?= /usr/local
VDRROOT ?= $(PREFIX) BINDIR ?= $(PREFIX)/bin
BINDIR ?= $(VDRROOT)/bin INCDIR ?= $(PREFIX)/include
INCDIR ?= $(VDRROOT)/include LIBDIR ?= $(PREFIX)/lib/vdr
LIBDIR ?= $(VDRROOT)/lib/vdr LOCDIR ?= $(PREFIX)/share/locale
LOCDIR ?= $(VDRROOT)/share/locale MANDIR ?= $(PREFIX)/share/man
MANDIR ?= $(VDRROOT)/share/man PCDIR ?= $(PREFIX)/lib/pkgconfig
PCDIR ?= $(VDRROOT)/lib/pkgconfig RESDIR ?= $(PREFIX)/share/vdr
RESDIR ?= $(VDRROOT)/share/vdr
# Source documentation # Source documentation
@ -64,15 +52,6 @@ DOXYFILE = Doxyfile
-include Make.config -include Make.config
# Output control
ifdef VERBOSE
Q =
else
Q = @
endif
export Q
# Mandatory compiler flags: # Mandatory compiler flags:
CFLAGS += -fPIC CFLAGS += -fPIC
@ -90,7 +69,7 @@ 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 = args.o audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\ dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
lirc.o menu.o menuitems.o 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 positioner.o\
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\ receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\ skinclassic.o skinlcars.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
timers.o tools.o transfer.o vdr.o videodir.o timers.o tools.o transfer.o vdr.o videodir.o
@ -111,14 +90,14 @@ ifdef VDR_USER
DEFINES += -DVDR_USER=\"$(VDR_USER)\" DEFINES += -DVDR_USER=\"$(VDR_USER)\"
endif endif
ifdef BIDI ifdef BIDI
INCLUDES += $(shell $(PKG_CONFIG) --cflags fribidi) INCLUDES += $(shell pkg-config --cflags fribidi)
DEFINES += -DBIDI DEFINES += -DBIDI
LIBS += $(shell $(PKG_CONFIG) --libs fribidi) LIBS += $(shell pkg-config --libs fribidi)
endif endif
ifdef SDNOTIFY ifdef SDNOTIFY
INCLUDES += $(shell $(PKG_CONFIG) --silence-errors --cflags libsystemd-daemon || $(PKG_CONFIG) --cflags libsystemd) INCLUDES += $(shell pkg-config --cflags libsystemd-daemon)
DEFINES += -DSDNOTIFY DEFINES += -DSDNOTIFY
LIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libsystemd-daemon || $(PKG_CONFIG) --libs libsystemd) LIBS += $(shell pkg-config --libs libsystemd-daemon)
endif endif
LIRC_DEVICE ?= /var/run/lirc/lircd LIRC_DEVICE ?= /var/run/lirc/lircd
@ -142,8 +121,7 @@ all: vdr i18n plugins
# Implicit rules: # Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
# Dependencies: # Dependencies:
@ -157,8 +135,7 @@ $(DEPFILE): Makefile
# The main program: # The main program:
vdr: $(OBJS) $(SILIB) vdr: $(OBJS) $(SILIB)
@echo LD $@ $(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
$(Q)$(CXX) $(CXXFLAGS) -rdynamic $(LDFLAGS) $(OBJS) $(LIBS) $(SILIB) -o vdr
# The libsi library: # The libsi library:
@ -170,9 +147,7 @@ make-libsi: # empty rule makes sure the sub-make for libsi is always called
.PHONY: vdr.pc .PHONY: vdr.pc
vdr.pc: vdr.pc:
@echo "vdrrootdir=$(VDRROOT)" > $@ @echo "bindir=$(BINDIR)" > $@
@echo "bindir=$(BINDIR)" >> $@
@echo "incdir=$(INCDIR)" >> $@
@echo "mandir=$(MANDIR)" >> $@ @echo "mandir=$(MANDIR)" >> $@
@echo "videodir=$(VIDEODIR)" >> $@ @echo "videodir=$(VIDEODIR)" >> $@
@echo "configdir=$(CONFDIR)" >> $@ @echo "configdir=$(CONFDIR)" >> $@
@ -188,7 +163,7 @@ vdr.pc:
@echo "" >> $@ @echo "" >> $@
@echo "Name: VDR" >> $@ @echo "Name: VDR" >> $@
@echo "Description: Video Disk Recorder" >> $@ @echo "Description: Video Disk Recorder" >> $@
@echo "URL: https://www.tvdr.de/" >> $@ @echo "URL: http://www.tvdr.de/" >> $@
@echo "Version: $(VDRVERSION)" >> $@ @echo "Version: $(VDRVERSION)" >> $@
@echo "Cflags: \$${cflags}" >> $@ @echo "Cflags: \$${cflags}" >> $@
@ -202,21 +177,17 @@ I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr.mo, $(notdir
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 --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
%.po: $(I18Npot) %.po: $(I18Npot)
@echo PO $@ msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@ @touch $@
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo $(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
@echo IN $@ install -D -m644 $< $@
$(Q)install -D -m644 $< $@
.PHONY: i18n .PHONY: i18n
i18n: $(I18Nmsgs) i18n: $(I18Nmsgs)
@ -258,7 +229,7 @@ plugins: include-dir vdr.pc
INCLUDES="-I$(CWD)/include"\ INCLUDES="-I$(CWD)/include"\
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" || failed="$$failed $$i";\ $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" || failed="$$failed $$i";\
if [ -n "$(LCLBLD)" ] ; then\ 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);\ (cd $(PLUGINDIR)/src/$$i; for l in `find -name "libvdr-*.so" -o -name "lib$$i-*.so"`; do install $$l $(LIBDIR)/`basename $$l`.$(APIVERSION); done);\
if [ -d $(PLUGINDIR)/src/$$i/po ]; then\ if [ -d $(PLUGINDIR)/src/$$i/po ]; then\
for l in `ls $(PLUGINDIR)/src/$$i/po/*.mo`; do\ 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;\ install -D -m644 $$l $(LOCDIR)/`basename $$l | cut -d. -f1`/LC_MESSAGES/vdr-$$i.mo;\
@ -279,13 +250,13 @@ plugins: include-dir vdr.pc
fi;\ 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) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR="$(CWD)" clean; done
@-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION) @-rm -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION)
# Install the files (note that 'install-pc' must be first!): # Install the files (note that 'install-pc' must be first!):
install: install-pc install-bin install-conf install-doc install-plugins install-i18n install-includes install: install-pc install-bin install-dirs install-conf install-doc install-plugins install-i18n install-includes
# VDR binary: # VDR binary:
@ -302,13 +273,8 @@ install-dirs:
@mkdir -p $(DESTDIR)$(CACHEDIR) @mkdir -p $(DESTDIR)$(CACHEDIR)
@mkdir -p $(DESTDIR)$(RESDIR) @mkdir -p $(DESTDIR)$(RESDIR)
install-conf: install-dirs install-conf:
# 'cp -n' may be broken, so let's do it the hard way @cp -pn *.conf $(DESTDIR)$(CONFDIR)
@for i in *.conf; do\
if ! [ -e $(DESTDIR)$(CONFDIR)/$$i ] ; then\
cp -p $$i $(DESTDIR)$(CONFDIR);\
fi\
done
# Documentation: # Documentation:
@ -323,7 +289,6 @@ install-doc:
install-plugins: plugins install-plugins: plugins
@-for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\ @-for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do\
echo; echo "*** Plugin $$i:";\
$(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(CWD) DESTDIR=$(DESTDIR) install;\ $(MAKE) --no-print-directory -C "$(PLUGINDIR)/src/$$i" VDRDIR=$(CWD) DESTDIR=$(DESTDIR) install;\
done done
@if [ -d $(PLUGINDIR)/lib ] ; then\ @if [ -d $(PLUGINDIR)/lib ] ; then\
@ -351,7 +316,6 @@ install-pc: vdr.pc
srcdoc: srcdoc:
@cat $(DOXYFILE) > $(DOXYFILE).tmp @cat $(DOXYFILE) > $(DOXYFILE).tmp
@echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp @echo PROJECT_NUMBER = $(VDRVERSION) >> $(DOXYFILE).tmp
@chmod +x $(DOXYFILE).filter
$(DOXYGEN) $(DOXYFILE).tmp $(DOXYGEN) $(DOXYFILE).tmp
@rm $(DOXYFILE).tmp @rm $(DOXYFILE).tmp
@ -360,7 +324,7 @@ srcdoc:
clean: clean:
@$(MAKE) --no-print-directory -C $(LSIDIR) clean @$(MAKE) --no-print-directory -C $(LSIDIR) clean
@-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~ @-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~
@-rm -rf $(LOCALEDIR) $(PODIR)/*~ $(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

View File

@ -31,11 +31,14 @@ 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 2.1</b>
<p> <p>
Copyright &copy; 2021 Klaus Schmidinger<br> Copyright &copy; 2013 Klaus Schmidinger<br>
<a href="mailto:vdr@tvdr.de">vdr@tvdr.de</a><br> <a href="mailto:vdr@tvdr.de">vdr@tvdr.de</a><br>
<a href="https://www.tvdr.de">www.tvdr.de</a> <a href="http://www.tvdr.de">www.tvdr.de</a>
</div>
<div class="center">
<modified>Important modifications introduced since version 2.0 are marked like this.</modified>
</div> </div>
<p> <p>
VDR provides an easy to use plugin interface that allows additional functionality VDR provides an easy to use plugin interface that allows additional functionality
@ -74,6 +77,7 @@ 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>
@ -82,7 +86,6 @@ structures and allows it to hook itself into specific areas to perform special 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 +99,12 @@ structures and allows it to hook itself into specific areas to perform special a
<li><a href="#Skins">Skins</a> <li><a href="#Skins">Skins</a>
<li><a href="#Themes">Themes</a> <li><a href="#Themes">Themes</a>
<li><a href="#Devices">Devices</a> <li><a href="#Devices">Devices</a>
<li><a href="#Positioners">Positioners</a> <li><modified><a href="#Positioners">Positioners</a></modified>
<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="#Electronic Program Guide">Electronic Program Guide</a>
<li><a href="#The video directory">The video directory</a> <li><modified><a href="#The video directory">The video directory</a></modified>
</ul> </ul>
</ul> </ul>
@ -165,7 +168,7 @@ 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
@ -184,7 +187,7 @@ The <tt>lib</tt> directory contains the dynamically loadable libraries of all
available plugins. Note that the names of these files are created by concatenating 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 +198,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 +393,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>
@ -579,31 +583,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 +670,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>
@ -1161,60 +1161,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-&gt;First(); Timer; Timer = Timers-&gt;Next(Timer)) {
// do something with Timer
}
}
</pre></td></tr></table><p>
Note the naming convention: TIMERS -&gt; Timers etc.
<p>
The <tt>LOCK_*_READ</tt> macros create pointers that are '<tt>const</tt>', while
the <tt>LOCK_*_WRITE</tt> macros allow modifications to the data structures.
Both wait indefinitely to obtain the lock. However, if <tt>LOCK_*_WRITE</tt> is
used twice in the same block, the second call will not obtain a lock and
immediately return <tt>NULL</tt>, which may lead to a crash. In such cases a
warning and backtrace is logged.
<p>
You may keep pointers to objects in such lists, even after releasing
the lock. However, you may only access such objects if you are
holding a proper lock again. If an object has been deleted from the list
while you did not hold a lock (for instance by an other thread), the
object will still be there, but no longer within this list (it is then
stored in the ListGarbageCollector for a few seconds). That way even if you
access the object after it has been deleted, you won't cause a segfault.
You can call the Contains() function to check whether an object you are
holding a pointer to is still in the list. Note that the garbage collector
is purged when the usual housekeeping is done.
<p>
See tools.h, class <tt>cListBase</tt> for more documentation and information on how
to use locking with timeouts, and thread.h, classes <tt>cStateLock</tt> and
<tt>cStateKey</tt> on how to easily react to changes in such lists.
<hr><h2><a name="Loading plugins into VDR">Loading plugins into VDR</a></h2> <hr><h2><a name="Loading plugins into VDR">Loading plugins into VDR</a></h2>
@ -1731,7 +1677,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);
@ -1931,7 +1877,7 @@ virtual bool SetPlayMode(ePlayMode PlayMode);
virtual int64_t GetSTC(void); virtual int64_t GetSTC(void);
virtual bool IsPlayingVideo(void) const; virtual bool IsPlayingVideo(void) const;
virtual bool HasIBPTrickSpeed(void); virtual bool HasIBPTrickSpeed(void);
virtual void TrickSpeed(int Speed, bool Forward); virtual void TrickSpeed(int Speed<modified>, bool Forward</modified>);
virtual void Clear(void); virtual void Clear(void);
virtual void Play(void); virtual void Play(void);
virtual void Freeze(void); virtual void Freeze(void);
@ -2046,9 +1992,8 @@ operator!
<b>Device hooks</b> <b>Device hooks</b>
<p> <p>
VDR has builtin facilities that select which device is able to provide a given VDR has builtin facilities that select which device is able to provide a given
transponder, or, which device may provide EIT data. However, there may be transponder. However, there may be situations where the setup is so special
situations where the setup is so special that it requires considerations that that it requires considerations that exceed the scope of the core VDR code.
exceed the scope of the core VDR code.
This is where <i>device hooks</i> can be used. This is where <i>device hooks</i> can be used.
<p><table><tr><td class="code"><pre> <p><table><tr><td class="code"><pre>
@ -2056,7 +2001,6 @@ class cMyDeviceHook : public cDeviceHook {
public: public:
cMyDeviceHook(void); cMyDeviceHook(void);
virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const; virtual bool DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const;
virtual bool DeviceProvidesEIT(const cDevice *Device) const;
}; };
</pre></td></tr></table><p> </pre></td></tr></table><p>
@ -2073,19 +2017,6 @@ bool cMyDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChan
} }
</pre></td></tr></table><p> </pre></td></tr></table><p>
In its <tt>DeviceProvidesEIT()</tt> function the device hook can take
whatever actions are necessary to determine whether the given Device can
provide EIT data, as in
<p><table><tr><td class="code"><pre>
bool cMyDeviceHook::DeviceProvidesEIT(const cDevice *Device) const
{
if (<i>condition where Device can't provide EIT data</i>)
return false;
return true;
}
</pre></td></tr></table><p>
A plugin that creates a derived cDeviceHook shall do so in its <tt>Initialize()</tt> A plugin that creates a derived cDeviceHook shall do so in its <tt>Initialize()</tt>
function, as in function, as in
@ -2094,18 +2025,8 @@ new cMyDeviceHook;
</pre></td></tr></table><p> </pre></td></tr></table><p>
and shall not delete this object. It will be automatically deleted when the program ends. and shall not delete this object. It will be automatically deleted when the program ends.
<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.
<div class="modified">
<hr><h2><a name="Positioners">Positioners</a></h2> <hr><h2><a name="Positioners">Positioners</a></h2>
<div class="blurb">Now you see me - now you don't!</div><p> <div class="blurb">Now you see me - now you don't!</div><p>
@ -2144,6 +2065,7 @@ You should create your derived positioner object in the
Note that the object has to be created on the heap (using <tt>new</tt>), 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 and you shall not delete it at any point (it will be deleted automatically
when the program ends). when the program ends).
</div modified>
<hr><h2><a name="Audio">Audio</a></h2> <hr><h2><a name="Audio">Audio</a></h2>
@ -2379,6 +2301,7 @@ to signal VDR that no other EPG handlers shall be queried after this one.
<p> <p>
See <tt>VDR/epg.h</tt> for details. See <tt>VDR/epg.h</tt> for details.
<div class="modified">
<hr><h2><a name="The video directory">The video directory</a></h2> <hr><h2><a name="The video directory">The video directory</a></h2>
<div class="blurb">Bits and pieces...</div><p> <div class="blurb">Bits and pieces...</div><p>
@ -2412,6 +2335,7 @@ You should create your derived video directory object in the
Note that the object has to be created on the heap (using <tt>new</tt>), 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 and you shall not delete it at any point (it will be deleted automatically
when the program ends). when the program ends).
</div modified>
</body> </body>
</html> </html>

View File

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

View File

@ -0,0 +1,61 @@
VDR Plugin 'dvbsddevice' Revision History
-----------------------------------------
2009-12-28: Version 0.0.1
- Initial revision.
2010-01-04: Version 0.0.2
- Calling the MakePrimaryDevice() function of the base class to allow
the cDevice to stop displaying subtitles.
- Added support for DVB cards with multiple fontends.
2010-01-30: Version 0.0.3
- The PCR pid is now recorded for channels where this is different from the
video PID.
2011-04-17: Version 0.0.4
- Removed an obsolete local variable in dvbsdffosd.c (thanks to Paul Menzel).
2011-08-27: Version 0.0.5
- Added option --outputonly to use the device only for output (thanks to Udo Richter).
2012-03-07: Version 0.0.6
- Removed the call to EITScanner.UsesDevice(this) from dvbsddevice.c, because
the code following these calls is only executed if LiveView is true, which is
never the case when the EITScanner switches to a channel.
2012-12-27: Version 0.0.7
- Adapted Makefile to changes introduced in recent VDR versions.
2013-01-12: Version 0.0.8
- Adapted Makefile to changes introduced in recent VDR versions.
2013-01-25: Version 0.0.9
- Returning 0 from cDvbSdFfDevice::NumProvidedSystems() if option --outputonly is given.
2013-03-31: Version 2.0.0
- Official release.
2013-08-22: Version 2.0.1
- Fixed handling the -o option (short form of --outputonly; problem reported by
Mario Edelmann).
2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
- cDevice::TrickSpeed() now has an additional parameter named Forward.
2014-03-15: Version 2.1.2
- The function cDevice::GetVideoSystem() has been deprecated.

View File

@ -0,0 +1,94 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
# By default the main source file also carries this name.
PLUGIN = dvbsddevice
### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_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 dvbsdffdevice.o dvbsdffosd.o
### The main target:
all: $(SOFILE)
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
MAKEDEP = $(CXX) -MM -MG
DEPFILE = .dependencies
$(DEPFILE): Makefile
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-include $(DEPFILE)
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
install: install-lib
dist: clean
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@mkdir $(TMPDIR)/$(ARCHIVE)
@cp -a * $(TMPDIR)/$(ARCHIVE)
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@echo Distribution package created as $(PACKAGE).tgz
clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~

View File

@ -0,0 +1,20 @@
This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
Project's homepage: http://www.tvdr.de
Latest version available at: ftp://ftp.tvdr.de/vdr
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
See the file COPYING for more information.
Description:
The 'dvbsddevice' plugin implements the output device for the
"Full Featured" DVB cards based on the TechnoTrend/Fujitsu-Siemens
design. This code was originally part of the core VDR source, and
was moved into this plugin in VDR version 1.7.11.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -20,15 +20,3 @@ VDR Plugin 'epgtableid0' Revision History
2014-01-01: Version 2.1.1 2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles. - Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $ # $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,8 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: # Use package data if installed...otherwise assume we're under the VDR source directory:
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))
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) LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg) PLGCFG = $(call PKGCFG,plgcfg)
# #
@ -62,8 +61,7 @@ all: $(SOFILE)
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -77,8 +75,7 @@ $(DEPFILE): Makefile
### Targets: ### Targets:
$(SOFILE): $(OBJS) $(SOFILE): $(OBJS)
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE) install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de> Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -3,13 +3,13 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: epgtableid0.c 4.1 2018/04/10 13:00:18 kls Exp $ * $Id: epgtableid0.c 3.1 2014/01/01 13:29:54 kls Exp $
*/ */
#include <vdr/epg.h> #include <vdr/epg.h>
#include <vdr/plugin.h> #include <vdr/plugin.h>
static const char *VERSION = "2.4.0"; static const char *VERSION = "2.1.1";
static const char *DESCRIPTION = "EPG handler for events with table id 0x00"; static const char *DESCRIPTION = "EPG handler for events with table id 0x00";
// --- cTable0Handler -------------------------------------------------------- // --- cTable0Handler --------------------------------------------------------

View File

@ -90,16 +90,3 @@ VDR Plugin 'hello' Revision History
2014-01-01: Version 2.1.1 2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles. - Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Updated the French OSD texts (thanks to Bernard Jaulin).
- Official release.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $ # $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,8 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: # Use package data if installed...otherwise assume we're under the VDR source directory:
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))
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) LIBDIR = $(call PKGCFG,libdir)
LOCDIR = $(call PKGCFG,locdir) LOCDIR = $(call PKGCFG,locdir)
PLGCFG = $(call PKGCFG,plgcfg) PLGCFG = $(call PKGCFG,plgcfg)
@ -63,8 +62,7 @@ all: $(SOFILE) i18n
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -84,16 +82,13 @@ I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
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 --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot) %.po: $(I18Npot)
@echo PO $@ msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@ @touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -107,8 +102,7 @@ install-i18n: $(I18Nmsgs)
### Targets: ### Targets:
$(SOFILE): $(OBJS) $(SOFILE): $(OBJS)
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE) install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de> Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -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 3.1 2014/01/01 13:29:54 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 = "2.1.1";
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");

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,19 +1,18 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de> # Copyright (C) 2013 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package. # This file is distributed under the same license as the VDR package.
# Jean-Claude Repetto <jc@repetto.org>, 2001 # Jean-Claude Repetto <jc@repetto.org>, 2001
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003 # Olivier Jacques <jacquesolivier@hotmail.com>, 2003
# Gregoire Favre <greg@magma.unil.ch>, 2003 # Gregoire Favre <greg@magma.unil.ch>, 2003
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005 # Nicolas Huillard <nhuillard@e-dition.fr>, 2005
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2018
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-hello 2.6.0\n" "Project-Id-Version: vdr-hello 0.2.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n" "POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 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 <vdr@linuxtv.org>\n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -21,19 +20,19 @@ msgstr ""
"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 ""

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,38 +1,35 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de> # Copyright (C) 2013 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package. # This file is distributed under the same license as the VDR package.
# Michael Rakowski <mrak@gmx.de>, 2002 # Michael Rakowski <mrak@gmx.de>, 2002
# Tomasz Maciej Nowak <tmn505@gmail.com>, 2018
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-hello 2.6.0\n" "Project-Id-Version: vdr-hello 0.2.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 14:04+0100\n" "POT-Creation-Date: 2012-12-18 14:04+0100\n"
"PO-Revision-Date: 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 <vdr@linuxtv.org>\n"
"Language: pl_PL\n" "Language: 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 ""

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -68,26 +68,3 @@ VDR Plugin 'osddemo' Revision History
- Fixed flickering if subtitles are active while the OSD demo is running. - Fixed flickering if subtitles are active while the OSD demo is running.
- Fixed a possible crash in the OSD demo (reported by Christopher Reimer). - Fixed a possible crash in the OSD demo (reported by Christopher Reimer).
2015-02-19: Version 2.2.0
- Official release.
2015-03-08: Version 2.3.1
- Now using cOsd::MaxPixmapSize().
- Fixed a vertical black line in the "TiledPixmaps" area on the rpihddevice OSD with
1280x800 pixel (thanks to Thomas Reufer).
- Added a demo case for storing images (thanks to Thomas Reufer).
2018-04-15: Version 2.4.0
- Official release.
2020-10-12: Version 2.4.1
- Added test cases for alignment of semi-circles (press key '4').
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $ # $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,8 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: # Use package data if installed...otherwise assume we're under the VDR source directory:
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))
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) LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg) PLGCFG = $(call PKGCFG,plgcfg)
# #
@ -62,8 +61,7 @@ all: $(SOFILE)
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -77,8 +75,7 @@ $(DEPFILE): Makefile
### Targets: ### Targets:
$(SOFILE): $(OBJS) $(SOFILE): $(OBJS)
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE) install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de> Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -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: osddemo.c 4.5 2020/10/14 20:32:41 kls Exp $ * $Id: osddemo.c 3.3 2014/02/06 11:51:53 kls Exp $
*/ */
#include <vdr/osd.h> #include <vdr/osd.h>
#include <vdr/plugin.h> #include <vdr/plugin.h>
static const char *VERSION = "2.4.1"; static const char *VERSION = "2.1.2";
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";
@ -90,137 +90,6 @@ void DrawSlopes(cOsd *Osd)
Osd->Flush(); 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 {
@ -341,7 +210,7 @@ cPixmap *cTrueColorDemo::CreateTextPixmap(const char *s, int Line, int Layer, tC
if (Pixmap) { if (Pixmap) {
Pixmap->Clear(); Pixmap->Clear();
Pixmap->SetAlpha(0); Pixmap->SetAlpha(0);
Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font, w); Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font);
} }
return Pixmap; return Pixmap;
} }
@ -558,20 +427,16 @@ void cTrueColorDemo::Action(void)
const int Size = SmlFont->Width(Text) + 10; const int Size = SmlFont->Width(Text) + 10;
const int NumDots = 12; const int NumDots = 12;
const int AnimFrames = NumDots; const int AnimFrames = NumDots;
int Rows = min(osd->MaxPixmapSize().Height() / Size, AnimFrames);
int Cols = (AnimFrames + Rows - 1) / Rows;
// Temporarily using pixmap layer 0 to have the text alpha blended: // Temporarily using pixmap layer 0 to have the text alpha blended:
AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size * Cols, Size * Rows)); AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size, Size * AnimFrames));
if (AnimPixmap) { if (AnimPixmap) {
AnimPixmap->SetAlpha(0); AnimPixmap->SetAlpha(0);
AnimPixmap->Clear(); AnimPixmap->Clear();
const int Diameter = Size / 5; const int Diameter = Size / 5;
int xc = Size / 2 - Diameter / 2;
for (int Frame = 0; Frame < AnimFrames; Frame++) { for (int Frame = 0; Frame < AnimFrames; Frame++) {
int x0 = Frame / Rows * Size; AnimPixmap->DrawEllipse(cRect(0, Frame * Size, Size, Size), 0xDDFFFFFF);
int y0 = Frame % Rows * Size; int yc = Frame * Size + Size / 2 - Diameter / 2;
AnimPixmap->DrawEllipse(cRect(x0, y0, Size, Size), 0xDDFFFFFF);
int xc = x0 + Size / 2 - Diameter / 2;
int yc = y0 + Size / 2 - Diameter / 2;
int Color = 0xFF; int Color = 0xFF;
int Delta = Color / NumDots / 3; int Delta = Color / NumDots / 3;
for (int a = 0; a < NumDots; a++) { for (int a = 0; a < NumDots; a++) {
@ -581,7 +446,7 @@ void cTrueColorDemo::Action(void)
AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color)); AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color));
Color -= Delta; Color -= Delta;
} }
AnimPixmap->DrawText(cPoint(x0, y0), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter); AnimPixmap->DrawText(cPoint(0, Frame * Size), Text, clrBlack, clrTransparent, SmlFont, Size, Size, taCenter);
} }
AnimPixmap->SetLayer(3); // now setting the actual pixmap layer AnimPixmap->SetLayer(3); // now setting the actual pixmap layer
FadeInPixmap = AnimPixmap; FadeInPixmap = AnimPixmap;
@ -671,14 +536,6 @@ eOSState cTrueColorDemo::ProcessKey(eKeys Key)
SetArea(); SetArea();
DrawSlopes(osd); DrawSlopes(osd);
break; break;
case k3: Cancel(3);
SetArea();
DrawImages(osd);
break;
case k4: Cancel(3);
SetArea();
DrawEllipseAlignments(osd);
return osContinue;
case kBack: case kBack:
case kOk: return osEnd; case kOk: return osEnd;
default: return state; default: return state;

View File

@ -95,28 +95,3 @@ VDR Plugin 'pictures' Revision History
2014-01-01: Version 2.1.1 2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles. - Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2015-02-19: Version 2.2.0
- Official release.
2015-07-23: Version 2.3.1
- Added a missing 'const'.
2017-10-06: Version 2.3.2
- Adapted the pic2mpg script to new ffmpeg options.
- No longer using 'convert' to scale/rotate the pictures.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.
2022-12-05: Version 2.6.1
Fixed initializing cPictureControl.

View File

@ -1,7 +1,7 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $ # $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,8 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: # Use package data if installed...otherwise assume we're under the VDR source directory:
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))
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) LIBDIR = $(call PKGCFG,libdir)
LOCDIR = $(call PKGCFG,locdir) LOCDIR = $(call PKGCFG,locdir)
PLGCFG = $(call PKGCFG,plgcfg) PLGCFG = $(call PKGCFG,plgcfg)
@ -63,8 +62,7 @@ all: $(SOFILE) i18n
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -84,16 +82,13 @@ I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
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 --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot) %.po: $(I18Npot)
@echo PO $@ msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@ @touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -107,8 +102,7 @@ install-i18n: $(I18Nmsgs)
### Targets: ### Targets:
$(SOFILE): $(OBJS) $(SOFILE): $(OBJS)
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE) install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de> Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -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));

View File

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

View File

@ -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 3.1 2014/01/01 13:29:54 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 = "2.1.1";
static const char *DESCRIPTION = trNOOP("A simple picture viewer"); static const char *DESCRIPTION = trNOOP("A simple picture viewer");
static const char *MAINMENUENTRY = trNOOP("Pictures"); static const char *MAINMENUENTRY = trNOOP("Pictures");

View File

@ -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 3.1 2014/02/08 12:48:12 kls Exp $
*/ */
#include "player.h" #include "player.h"
@ -96,10 +96,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;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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!"

View File

@ -1,11 +1,11 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de> # Copyright (C) 2013 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package. # This file is distributed under the same license as the VDR package.
# Alexander Gross <Bikalexander@gmail.com>, 2008 # Alexander Gross <Bikalexander@gmail.com>, 2008
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-pictures 2.6.0\n" "Project-Id-Version: vdr-pictures 0.1.3\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2012-12-18 12:57+0100\n" "POT-Creation-Date: 2012-12-18 12:57+0100\n"
"PO-Revision-Date: 2008-03-14 00:45+0100\n" "PO-Revision-Date: 2008-03-14 00:45+0100\n"
@ -28,7 +28,7 @@ msgid "Picture directory"
msgstr "ºÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ" msgstr "ºÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ"
msgid "Slide show delay (s)" msgid "Slide show delay (s)"
msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)" msgstr "·ÐÔÕàÖÚÐ áÛÐÙÔ-èÞã (áÕÚ)"
msgid "No picture directory has been defined!" msgid "No picture directory has been defined!"
msgstr "½Õ ÞßàÕÔÕÛñÝ ÚÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ!" msgstr "½Õ ÞßàÕÔÕÛñÝ ÚÐâÐÛÞÓ Ø×ÞÑàÐÖÕÝØÙ!"

View File

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

340
PLUGINS/src/rcu/COPYING Normal file
View File

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

26
PLUGINS/src/rcu/HISTORY Normal file
View File

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

94
PLUGINS/src/rcu/Makefile Normal file
View File

@ -0,0 +1,94 @@
#
# Makefile for a Video Disk Recorder plugin
#
# $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
# By default the main source file also carries this name.
PLUGIN = rcu
### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory:
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_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
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies:
MAKEDEP = $(CXX) -MM -MG
DEPFILE = .dependencies
$(DEPFILE): Makefile
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-include $(DEPFILE)
### Targets:
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
install: install-lib
dist: clean
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@mkdir $(TMPDIR)/$(ARCHIVE)
@cp -a * $(TMPDIR)/$(ARCHIVE)
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@echo Distribution package created as $(PACKAGE).tgz
clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~

19
PLUGINS/src/rcu/README Normal file
View File

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

420
PLUGINS/src/rcu/rcu.c Normal file
View File

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

View File

@ -25,15 +25,3 @@ VDR Plugin 'servicedemo' Revision History
2014-01-01: Version 2.1.1 2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles. - Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $ # $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -17,8 +17,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN1).c | awk '{ pr
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: # Use package data if installed...otherwise assume we're under the VDR source directory:
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))
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) LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg) PLGCFG = $(call PKGCFG,plgcfg)
# #
@ -59,8 +58,7 @@ all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -74,12 +72,10 @@ $(DEPFILE): Makefile
### Targets: ### Targets:
libvdr-$(PLUGIN1).so: $(PLUGIN1).o libvdr-$(PLUGIN1).so: $(PLUGIN1).o
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
libvdr-$(PLUGIN2).so: $(PLUGIN2).o libvdr-$(PLUGIN2).so: $(PLUGIN2).o
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so install-lib: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
install -D libvdr-$(PLUGIN1).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION) install -D libvdr-$(PLUGIN1).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN1).so.$(APIVERSION)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Udo Richter <udo_richter@gmx.de> Written by: Udo Richter <udo_richter@gmx.de>
Project's homepage: https://www.tvdr.de Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -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 3.1 2014/01/01 13:29:54 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 = "2.1.1";
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";

View File

@ -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 3.1 2014/01/01 13:29:54 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 = "2.1.1";
static const char *DESCRIPTION = "Service demo server"; static const char *DESCRIPTION = "Service demo server";
class cPluginSvcSvr : public cPlugin { class cPluginSvcSvr : public cPlugin {

View File

@ -126,38 +126,3 @@ VDR Plugin 'skincurses' Revision History
2015-02-08: Version 2.1.2 2015-02-08: Version 2.1.2
- Added a missing trailing blank in some translations. - Added a missing trailing blank in some translations.
2015-02-19: Version 2.2.0
- Official release.
2016-12-22: Version 2.3.2
- Added cFont::Width(void) to get the default character width and allow stretched
font drawing in high level OSDs (dummy for skincurses).
- Fixed truncated date/time strings in the skins on multi-byte UTF-8 systems
(reported by Sergey Chernyavskiy).
2018-04-15: Version 2.4.0
- Official release.
2019-03-12: Version 2.4.1
- Changes for ncurses version 6 (thanks to Ulrick Eckhardt).
2020-05-11: Version 2.4.2
- Fixed 'Changes for ncurses version 6'.
- Reacting to changes in screen size.
- Simplified color handling.
- Using 'stdscr' directly instead of an additional window.
2021-07-01: Version 2.4.3
- The number of errors (if any) of a recording is now displayed in the recording's
Info menu.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $ # $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,8 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: # Use package data if installed...otherwise assume we're under the VDR source directory:
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))
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) LIBDIR = $(call PKGCFG,libdir)
LOCDIR = $(call PKGCFG,locdir) LOCDIR = $(call PKGCFG,locdir)
PLGCFG = $(call PKGCFG,plgcfg) PLGCFG = $(call PKGCFG,plgcfg)
@ -63,8 +62,7 @@ all: $(SOFILE) i18n
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -84,16 +82,13 @@ I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
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 --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot) %.po: $(I18Npot)
@echo PO $@ msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@ @touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@ -107,8 +102,7 @@ install-i18n: $(I18Nmsgs)
### Targets: ### Targets:
$(SOFILE): $(OBJS) $(SOFILE): $(OBJS)
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
install-lib: $(SOFILE) install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de> Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -1,13 +1,13 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2021 Klaus Schmidinger <vdr@tvdr.de> # Copyright (C) 2013 Klaus Schmidinger <vdr@tvdr.de>
# This file is distributed under the same license as the VDR package. # This file is distributed under the same license as the VDR package.
# Klaus Schmidinger <vdr@tvdr.de>, 2007 # Klaus Schmidinger <vdr@tvdr.de>, 2007
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-skincurses 2.6.0\n" "Project-Id-Version: vdr-skincurses 0.1.12\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2021-07-01 17:28+0200\n" "POT-Creation-Date: 2015-02-08 11:16+0100\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 <vdr@tvdr.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n" "Language-Team: German <vdr@linuxtv.org>\n"
@ -19,9 +19,6 @@ 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"

View File

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

View File

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

View File

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

View File

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

View File

@ -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"

View File

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

View File

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

View File

@ -3,7 +3,7 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: skincurses.c 5.1 2021/07/01 15:40:46 kls Exp $ * $Id: skincurses.c 3.2 2015/02/08 10:19:00 kls Exp $
*/ */
#include <ncurses.h> #include <ncurses.h>
@ -12,7 +12,7 @@
#include <vdr/skins.h> #include <vdr/skins.h>
#include <vdr/videodir.h> #include <vdr/videodir.h>
static const char *VERSION = "2.4.3"; static const char *VERSION = "2.1.2";
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,7 +20,6 @@ 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; }
@ -60,7 +59,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 +78,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) {
Flush(); werase(window);
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));
attrset(COLOR_PAIR(i + 1)); break;
}
else if (color == colorPairs[i]) {
wattrset(window, COLOR_PAIR(i + 1));
break;
}
}
} }
void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2) void cCursesOsd::SaveRegion(int x1, int y1, int x2, int y2)
@ -114,14 +121,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 +167,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); wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work
}
else {
for (int x = x1; x <= x2; x++)
mvvline(y1, x, ' ', dy + 1);
}
} }
void cCursesOsd::Flush(void) void cCursesOsd::Flush(void)
@ -405,7 +407,8 @@ 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());
@ -447,18 +450,9 @@ void cSkinCursesDisplayMenu::SetRecording(const cRecording *Recording)
cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : ""); cString t = cString::sprintf("%s %s %s", *DateString(Recording->Start()), *TimeString(Recording->Start()), Info->ChannelName() ? Info->ChannelName() : "");
ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground); ts.Set(osd, 0, y, ScOsdWidth, ScOsdHeight - y - 2, t, &Font, clrYellow, clrBackground);
y += ts.Height(); y += ts.Height();
int xt = ScOsdWidth;
if (Info->GetEvent()->ParentalRating()) { if (Info->GetEvent()->ParentalRating()) {
cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString()); cString buffer = cString::sprintf(" %s ", *Info->GetEvent()->GetParentalRatingString());
int w = Utf8StrLen(buffer); osd->DrawText(ScOsdWidth - Utf8StrLen(buffer), y, buffer, clrBlack, clrYellow, &Font);
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();
@ -833,8 +827,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;
} }

View File

@ -64,22 +64,3 @@ VDR Plugin 'status' Revision History
2014-01-01: Version 2.1.1 2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles. - Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.
2025-02-10: Version 2.6.1
- Added cStatus::OsdItem2().
- Activated logging of OsdItem2().
- Added cStatus::OsdCurrentItem2().
- Added cStatus::OsdStatusMessage2().

View File

@ -1,7 +1,7 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $ # $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,8 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: # Use package data if installed...otherwise assume we're under the VDR source directory:
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))
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) LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg) PLGCFG = $(call PKGCFG,plgcfg)
# #
@ -62,8 +61,7 @@ all: $(SOFILE)
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -77,8 +75,7 @@ $(DEPFILE): Makefile
### Targets: ### Targets:
$(SOFILE): $(OBJS) $(SOFILE): $(OBJS)
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE) install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <vdr@tvdr.de> Written by: Klaus Schmidinger <vdr@tvdr.de>
Project's homepage: https://www.tvdr.de Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -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 3.1 2014/01/01 13:29:54 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 = "2.1.1";
static const char *DESCRIPTION = "Status monitor test"; static const char *DESCRIPTION = "Status monitor test";
static const char *MAINMENUENTRY = NULL; static const char *MAINMENUENTRY = NULL;
@ -27,10 +27,10 @@ protected:
virtual void SetSubtitleTrack(int Index, const char * const *Tracks); virtual void SetSubtitleTrack(int Index, const char * const *Tracks);
virtual void OsdClear(void); virtual void OsdClear(void);
virtual void OsdTitle(const char *Title); virtual void OsdTitle(const char *Title);
virtual void 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);
@ -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)

View File

@ -29,15 +29,3 @@ VDR Plugin 'svdrpdemo' Revision History
2014-01-01: Version 2.1.1 2014-01-01: Version 2.1.1
- Avoiding unnecessary pkg-config warnings in plugin Makefiles. - Avoiding unnecessary pkg-config warnings in plugin Makefiles.
2015-02-19: Version 2.2.0
- Official release.
2018-04-15: Version 2.4.0
- Official release.
2021-12-27: Version 2.6.0
- Official release.

View File

@ -1,7 +1,7 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 4.3 2020/06/22 15:08:46 kls Exp $ # $Id: Makefile 3.1 2014/01/01 13:29:54 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -16,8 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: # Use package data if installed...otherwise assume we're under the VDR source directory:
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))
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) LIBDIR = $(call PKGCFG,libdir)
PLGCFG = $(call PKGCFG,plgcfg) PLGCFG = $(call PKGCFG,plgcfg)
# #
@ -62,8 +61,7 @@ all: $(SOFILE)
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
@echo CC $@ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -77,8 +75,7 @@ $(DEPFILE): Makefile
### Targets: ### Targets:
$(SOFILE): $(OBJS) $(SOFILE): $(OBJS)
@echo LD $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
install-lib: $(SOFILE) install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

View File

@ -2,9 +2,9 @@ This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de> Written by: Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
Project's homepage: https://www.tvdr.de Project's homepage: http://www.tvdr.de
Latest version available at: https://www.tvdr.de Latest version available at: http://www.tvdr.de
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -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 3.1 2014/01/01 13:29:54 kls Exp $
*/ */
#include <vdr/plugin.h> #include <vdr/plugin.h>
static const char *VERSION = "2.4.0"; static const char *VERSION = "2.1.1";
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 {

6
README
View File

@ -4,7 +4,7 @@ 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.tvdr.de.
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.
@ -32,10 +32,6 @@ 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. "VDR Video Disk Recorder" is a registered trademark of Klaus Schmidinger.
"TVDR TV Done Right" is a registered trademark of Klaus Schmidinger. "TVDR TV Done Right" is a registered trademark of Klaus Schmidinger.

View File

@ -10,7 +10,7 @@ Plugins:
- Implemented a universal plugin interface. See the file PLUGINS.html - Implemented a universal plugin interface. See the file PLUGINS.html
for a detailed description. The man page vdr(1) describes the new options '-L' for a detailed description. The man page vdr(1) describes the new options '-L'
and '-P' used to load plugins. and '-P' used to load plugins.
See https://www.tvdr.de/plugins.htm for a list of available plugins. See http://www.tvdr.de/plugins.htm for a list of available plugins.
- Rearranged the remote control key handling to allow plugins to implement - Rearranged the remote control key handling to allow plugins to implement
additional types of remote controls (see PLUGINS.html, section "Remote Control"). additional types of remote controls (see PLUGINS.html, section "Remote Control").
The previously used files 'keys.conf' and 'keys-pc.conf' have been replaced The previously used files 'keys.conf' and 'keys-pc.conf' have been replaced

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