1
0
mirror of https://github.com/vdr-projects/vdr.git synced 2025-03-01 10:50:46 +00:00

Version 1.7.28

Original announce message:
VDR developer version 1.7.28 is now available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.28.tar.bz2

A 'diff' against the previous version is available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.27-1.7.28.diff

MD5 checksums:

3ccff2dcc42d112e23dd64f2c39f02f1  vdr-1.7.28.tar.bz2
7249ead4aca4b24e53d49d11c67e1613  vdr-1.7.27-1.7.28.diff

WARNING:
========

This is a developer version. Even though I use it in my productive
environment. I strongly recommend that you only use it under controlled
conditions and for testing and debugging.

The new default skin "LCARS" displays the signal strengths and qualities of
all devices in its main menu. For devices that have an stb0899 frontend chip
(like the TT-budget S2-3200) retrieving this information from the driver is
rather slow, which results in a sluggish response to user input in the main
menu. To speed this up you may want to apply the patches from

From the HISTORY file:
- Fixed cPixmapMemory::DrawEllipse() for quadrants -1 and -4.
- Fixed getting the maximum short channel name length in case there are no short names
  at all (reported by Derek Kelly).
- The new function cDevice::DeviceType() returns a string identifying the type of
  the given device.
- Now limiting the number of characters of a channel's (short) name to 16 in the
  schedules menus, to keep that column from getting overly wide in case there is
  a channel with a very long name that has no short name.
- Fixed EPG scan on systems with only a single DVB device that use software output
  (reported by Juergen Lock).
- Skins can now inquire the menu category for which their cSkinDisplayMenu is currently
  being used. This can be done either through a call to cSkinDisplayMenu::MenuCategory()
  or by reimplementing cSkinDisplayMenu::SetMenuCategory(). This information allows a
  skin to use special icons or decorations for the various types of menus in VDR.
- The new setup option "DVB/Standard compliance" can be used to switch between different
  variations of the DVB standard (thanks to Rolf Ahrenberg). Currently there is "DVB"
  (for the original DVB standard) and "ANSI/SCTE", which is used to properly handle
  certain private stream types.
- The disk usage is no longer automatically added to the title of the main and
  "Recordings" menus. This has always been a mekeshift solution and it is now up
  to the individual skin if, where and how it wants to display this information.
  A skin can use the new cVideoDiskUsage class to implement such a display. For
  compatibility, the default skins "Classic VDR", "ST:TNG Panels" and "Text mode"
  (i.e. curses) have been changed to behave like before. Other skins may want to
  display the disk usage in totally different ways.
- A cOsdMenu can now handle skins that display different numbers of items in the
  various menu categories.
- OSD and skin are now reinitialized after a plugin setup page has been confirmed,
  to have them react immediately in case any change to a plugin's setup parameter
  has an effect on the OSD.
- The Timers list is now marked as modified whenever a recording starts or ends.
- Fixed cDevice::StillPicture(), making sure it doesn't call the derived class's
  function if no buffer has been allocated (reported by Marcus Roscher).
- Fixed the SVDRP command UPDR, which didn't update the global recordings list
  (reported by Lars Hanisch).
- cControl::Control() now has an additional boolean parameter, which can be set to
  true to get the current player control even if it is hidden.
- The new functions cControl::GetRecording() and cControl::GetHeader() can be used
  to retrieve information about what the current player is playing.
- Fixed a possible high CPU load when pausing replay (thanks to Reinhard Nissl).
- Fixed character comparisons in cSubtitleObject::DecodeCharacterString() (reported
  by Reinhard Mantey).
- Renamed the function cString::sprintf(const char *fmt, va_list &ap) to vsprintf(),
  because it might inadvertently be called with a 'char *' as the second argument on
  some compilers and cause a crash (reported by Sundararaj Reel).
- Removed the "bondedMasterFailed" mechanism from cDvbTuner, because it caused
  problems with the EPG scan in case a transponder is not receivable in a setup with
  bonded devices (reported by Michael Schneider).
- Making sure setup strings don't contain any newline characters (thanks to Joachim
  Wilke).
- The new member function cSkinDisplayReplay::SetRecording() allows a skin to display
  more information about the currently played recording.
- Fixed a mismatched 'delete' in cSchedules::SetEpgDataFileName() (thanks to Reinhard
  Mantey).
- The DrawText() functions of the OSD now accept the new alignment flag taBorder,
  which triggers keeping a proper distance from the edge that taLeft or taRight
  aligns to.
- Fixed checking for UTF-8 support in cFont::Bidi() (reported by Torsten Lang).
- If a recording has no info file, the 'title' of the recording's info is now set
  to the recording's name.
- cVector::Clear() now reinitializes any previously used members.
- Fixed resetting CAMs (thanks to Marco Skambraks).
- The new function RgbShade() (include osd.h) can be used to generate a brighter or
  darker version of a given color.
- The new class cSortedTimers can be used to quickly get a list of all timers, sorted
  by their start time.
- The new skin "LCARS" is an enhanced version of the "ST:TNG" skin (which is still
  there in its original layout, for those who don't like the LCARS skin, or can't use
  it due to OSD limitations). The LCARS skin utilizes the new "menu category" feature
  to display additional information on the main menu page. It shows upcoming timers
  and the system's devices, as well as which device is recording which timers. The
  upper pane of the main menu displays the programme data in live and replay mode,
  and a progress bar. An indicator on the right side of the device list shows which
  device is currently used for live viewing, and whether it is in transfer mode.
  The individual device displays show the device number, the device type, which CAM
  (if any ) is currently assigned to the device, and the signal strength and quality.
  On the left side of the OSD there is a permanent display of the current date and
  time, the disk usage and the system load.
  "LCARS" is the new default skin of VDR. It requires at least a 4bpp (16 color) full
  screen OSD, but you can still operate it if your OSD can handle only fewer colors
  (in which case you may want to switch to the "ST:TNG" or "Classic VDR" skin).
- Finally removed the code marked with __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS
  and LEGACY_CRECEIVER.
- Now making sure that the "small font" is never larger than the "osd font".
- Fixed font handling with fontconfig 2.9.0 or newer (thanks to Joerg Bornkessel).
- Extended the interface to the script that gets called for recordings, so that in
  the "edited" case it also provides the name of the original recording (thanks to
  Christian Richter).
- Added DeleteEvent() to the EPG handler interface, so that an EPG handler can trigger
  deleting of an event (thanks to Christian Kaiser).
- Speeded up opening menus on systems with many (several thousands) of recordings, by
  caching the information whether a recording is stored on the video directory file
  system within the cRecording data (based on a patch from Torsten Lang).
This commit is contained in:
Klaus Schmidinger 2012-06-03 12:44:00 +02:00 committed by Dieter Hametner
parent 19b952728e
commit 5500959f4f
87 changed files with 3813 additions and 726 deletions

@ -1140,6 +1140,7 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
for suggesting to change the Green button in the "Edit timer" menu from "Once"
to "Single"
for fixing reduced bpp support for DVB subtitles
for implementing "DVB Standard compliance" handling
Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark
@ -1309,6 +1310,7 @@ Reinhard Nissl <rnissl@gmx.de>
for making cEITScanner process new transponders before old ones, to make sure
transponder changes are recognized
for helping to debug switching into time shift mode when pausing live video
for fixing a possible high CPU load when pausing replay
Richard Robson <richard_robson@beeb.net>
for reporting freezing replay if a timer starts while in Transfer Mode from the
@ -1782,6 +1784,7 @@ Joachim Wilke <vdr@joachim-wilke.de>
for modifying cCharSetConv so that it can be used to convert from "whatever VDR uses"
to a given code
for adding some missing 'const' to cDevice
for making sure setup strings don't contain any newline characters
Sascha Klek <sklek@gmx.de>
for reporting a problem with the '0' key in the "Day" item of the "Timers" menu
@ -2591,6 +2594,9 @@ Sundararaj Reel <sundararaj.reel@googlemail.com>
for reporting a memory leak in cRecordings::ScanVideoDir() in case there are too
many link levels
for reporting a bug in cListBase::Move() in case From and To are equal
for reporting a problem with the function cString::sprintf(const char *fmt, va_list &ap),
that might inadvertently be called with a 'char *' as the second argument on some
compilers and cause a crash
Ales Jurik <ajurik@quick.cz>
for reporting broken SI data on Czech/Slovak channels after changing the default
@ -2663,6 +2669,8 @@ Derek Kelly (user.vdr@gmail.com)
could not be determined after resuming recording
for reporting a problem with detecting frames for channels that split frames into
several payloads
for reporting a problem with getting the maximum short channel name length in case there
are no short names at all
Marcel Unbehaun <frostworks@gmx.de>
for adding cRecordingInfo::GetEvent()
@ -2720,6 +2728,7 @@ Lars Hanisch <dvb@flensrocker.de>
for suggesting to assign the source character 'V' to "Analog Video"
for a patch that was used to implement SCR (Satellite Channel Routing)
for implementing the SVDRP command 'UPDR'
for reporting that the SVDRP command UPDR didn't update the global recordings list
Alex Lasnier <alex@fepg.org>
for adding tuning support for ATSC devices
@ -2771,6 +2780,7 @@ Dominik Strasser <dominik@die-strassers.de>
Joerg Bornkessel <hd_brummy@gentoo.org>
for adding LDFLAGS to the linker calls in the Makefiles
for fixing font handling with fontconfig 2.9.0 or newer
Andreas Oberritter <obi@opendreambox.org>
for suggesting to retrieve the include path to the freetype2 header files
@ -2790,6 +2800,8 @@ Gerald Dachs <vdr@dachsweb.de>
Juergen Lock <vdr-l@jelal.kn-bremen.de>
for fixing cUnbufferedFile::Seek() in case it is compiled without USE_FADVISE
for reporting a problem with EPG scan on systems with only a single DVB device that
use software output
Sergiu Dotenco <sergiu.dotenco@googlemail.com>
for reporting a missing initialization in sDvbSpuRect
@ -2849,6 +2861,9 @@ Torsten Lang <info@torstenlang.de>
of EPG data from BSkyB's "MTV MUSIC"
for suggesting to make BIDI support check at runtime whether the system runs with
UTF-8
for reporting a bug in checking for UTF-8 support in cFont::Bidi()
for a patch that was used to implement caching the information whether a recording
is stored on the video directory file system within the cRecording data
Christian Ruppert <idl0r@gentoo.org>
for some improvements to the Makefiles
@ -2862,3 +2877,26 @@ Ralf Schueler <dl4mw@schueler.ws>
from version 1.7.8 to 1.6.0-3
for backporting "Fixed cRecordings::DelByName() to avoid compilation errors with
gcc 4.4" from version 1.7.9 to 1.6.0-3
Marcus Roscher <dad401@gmx.de>
for reporting a problem with cDevice::StillPicture(), which called the derived class's
function even if no buffer has been allocated
Reinhard Mantey <geronimo013@gmx.de>
for reporting a problem with character comparisons in
cSubtitleObject::DecodeCharacterString()
for fixing a mismatched 'delete' in cSchedules::SetEpgDataFileName()
Michael Schneider <vdrportal_midas@gmx.de>
for reporting a problem with the EPG scan in case a transponder is not receivable in
a setup with bonded devices
Marco Skambraks <marco@ammec.de>
for fixing resetting CAMs
Christian Richter <cr@crichter.net>
for extending the interface to the script that gets called for recordings, so that in
the "edited" case it also provides the name of the original recording
Christian Kaiser <christian.kaiser@teleservice.com>
for adding DeleteEvent() to the EPG handler interface

98
HISTORY

@ -6603,7 +6603,7 @@ Video Disk Recorder Revision History
- Now using pkg-config to get fribidi, freetype and fontconfig cflags and libs (thanks
to Ville Skyttä).
- The Makefile now also installs the include files (thanks to Ville Skyttä).
- Added handling of "ANSI/SCTE 57" descriptors (thanks too Rolf Ahrenberg).
- Added handling of "ANSI/SCTE 57" descriptors (thanks to Rolf Ahrenberg).
- Avoiding an unecessary call to Recordings.ResetResume() (thanks to Reinhard
Nissl).
@ -7051,3 +7051,99 @@ Video Disk Recorder Revision History
- Reverted some improvements to Make.config.template (thanks to Christian Ruppert).
- Fixed handling IDLEPRIORITY in cDvbDevice::ProvidesChannel() (thanks to Frank
Schmirler).
2012-06-03: Version 1.7.28
- Fixed cPixmapMemory::DrawEllipse() for quadrants -1 and -4.
- Fixed getting the maximum short channel name length in case there are no short names
at all (reported by Derek Kelly).
- The new function cDevice::DeviceType() returns a string identifying the type of
the given device.
- Now limiting the number of characters of a channel's (short) name to 16 in the
schedules menus, to keep that column from getting overly wide in case there is
a channel with a very long name that has no short name.
- Fixed EPG scan on systems with only a single DVB device that use software output
(reported by Juergen Lock).
- Skins can now inquire the menu category for which their cSkinDisplayMenu is currently
being used. This can be done either through a call to cSkinDisplayMenu::MenuCategory()
or by reimplementing cSkinDisplayMenu::SetMenuCategory(). This information allows a
skin to use special icons or decorations for the various types of menus in VDR.
- The new setup option "DVB/Standard compliance" can be used to switch between different
variations of the DVB standard (thanks to Rolf Ahrenberg). Currently there is "DVB"
(for the original DVB standard) and "ANSI/SCTE", which is used to properly handle
certain private stream types.
- The disk usage is no longer automatically added to the title of the main and
"Recordings" menus. This has always been a mekeshift solution and it is now up
to the individual skin if, where and how it wants to display this information.
A skin can use the new cVideoDiskUsage class to implement such a display. For
compatibility, the default skins "Classic VDR", "ST:TNG Panels" and "Text mode"
(i.e. curses) have been changed to behave like before. Other skins may want to
display the disk usage in totally different ways.
- A cOsdMenu can now handle skins that display different numbers of items in the
various menu categories.
- OSD and skin are now reinitialized after a plugin setup page has been confirmed,
to have them react immediately in case any change to a plugin's setup parameter
has an effect on the OSD.
- The Timers list is now marked as modified whenever a recording starts or ends.
- Fixed cDevice::StillPicture(), making sure it doesn't call the derived class's
function if no buffer has been allocated (reported by Marcus Roscher).
- Fixed the SVDRP command UPDR, which didn't update the global recordings list
(reported by Lars Hanisch).
- cControl::Control() now has an additional boolean parameter, which can be set to
true to get the current player control even if it is hidden.
- The new functions cControl::GetRecording() and cControl::GetHeader() can be used
to retrieve information about what the current player is playing.
- Fixed a possible high CPU load when pausing replay (thanks to Reinhard Nissl).
- Fixed character comparisons in cSubtitleObject::DecodeCharacterString() (reported
by Reinhard Mantey).
- Renamed the function cString::sprintf(const char *fmt, va_list &ap) to vsprintf(),
because it might inadvertently be called with a 'char *' as the second argument on
some compilers and cause a crash (reported by Sundararaj Reel).
- Removed the "bondedMasterFailed" mechanism from cDvbTuner, because it caused
problems with the EPG scan in case a transponder is not receivable in a setup with
bonded devices (reported by Michael Schneider).
- Making sure setup strings don't contain any newline characters (thanks to Joachim
Wilke).
- The new member function cSkinDisplayReplay::SetRecording() allows a skin to display
more information about the currently played recording.
- Fixed a mismatched 'delete' in cSchedules::SetEpgDataFileName() (thanks to Reinhard
Mantey).
- The DrawText() functions of the OSD now accept the new alignment flag taBorder,
which triggers keeping a proper distance from the edge that taLeft or taRight
aligns to.
- Fixed checking for UTF-8 support in cFont::Bidi() (reported by Torsten Lang).
- If a recording has no info file, the 'title' of the recording's info is now set
to the recording's name.
- cVector::Clear() now reinitializes any previously used members.
- Fixed resetting CAMs (thanks to Marco Skambraks).
- The new function RgbShade() (include osd.h) can be used to generate a brighter or
darker version of a given color.
- The new class cSortedTimers can be used to quickly get a list of all timers, sorted
by their start time.
- The new skin "LCARS" is an enhanced version of the "ST:TNG" skin (which is still
there in its original layout, for those who don't like the LCARS skin, or can't use
it due to OSD limitations). The LCARS skin utilizes the new "menu category" feature
to display additional information on the main menu page. It shows upcoming timers
and the system's devices, as well as which device is recording which timers. The
upper pane of the main menu displays the programme data in live and replay mode,
and a progress bar. An indicator on the right side of the device list shows which
device is currently used for live viewing, and whether it is in transfer mode.
The individual device displays show the device number, the device type, which CAM
(if any ) is currently assigned to the device, and the signal strength and quality.
On the left side of the OSD there is a permanent display of the current date and
time, the disk usage and the system load.
"LCARS" is the new default skin of VDR. It requires at least a 4bpp (16 color) full
screen OSD, but you can still operate it if your OSD can handle only fewer colors
(in which case you may want to switch to the "ST:TNG" or "Classic VDR" skin).
- Finally removed the code marked with __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS
and LEGACY_CRECEIVER.
- Now making sure that the "small font" is never larger than the "osd font".
- Fixed font handling with fontconfig 2.9.0 or newer (thanks to Joerg Bornkessel).
- Extended the interface to the script that gets called for recordings, so that in
the "edited" case it also provides the name of the original recording (thanks to
Christian Richter).
- Added DeleteEvent() to the EPG handler interface, so that an EPG handler can trigger
deleting of an event (thanks to Christian Kaiser).
- Speeded up opening menus on systems with many (several thousands) of recordings, by
caching the information whether a recording is stored on the video directory file
system within the cRecording data (based on a patch from Torsten Lang).

17
INSTALL

@ -88,6 +88,15 @@ 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.
Standard compliance
-------------------
Basically VDR works according to the DVB standard, but there are countries/providers
that use other standards, which in some details deviate from the DVB standard.
This makes it necessary to handle things differently in some areas, depending on
which standard is actually used. If this is the case in your area, you may need
to adjust the option "DVB/Standard compliance" in the Setup menu accordingly.
Locale
------
@ -235,8 +244,8 @@ You can use the '-r' option to define a program or script that gets called
before and after a recording is performed, and after an editing process
has finished.
The program will be called with two string parameters. The first parameter
is one of
The program will be called with two or three (in case of "edited") string
parameters. The first parameter is one of
before if this is *before* a recording starts
after if this is *after* a recording has finished
@ -244,7 +253,8 @@ is one of
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).
In the "edited" case it will be the name of the edited version.
In the "edited" case it will be the name of the edited version (second
parameter) and the name of the source version (third parameter).
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
@ -265,6 +275,7 @@ case "$1" in
;;
edited)
echo "Edited recording $2"
echo "Source recording $3"
;;
*)
echo "ERROR: unknown state: $1"

5
MANUAL

@ -674,6 +674,11 @@ Version 1.6
from the primary DVB interface, so that the viewer will
be disturbed as little as possible.
Standard Compliance = 0
Defines the standard compliance mode:
0 = DVB
1 = ANSI/SCTE
Video format = 4:3 The video format (or aspect ratio) of the tv set in use
(4:3 or 16:9).

@ -4,7 +4,7 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: Makefile 2.26 2012/03/11 15:33:57 kls Exp $
# $Id: Makefile 2.27 2012/04/15 13:21:31 kls Exp $
.DELETE_ON_ERROR:
@ -44,7 +44,7 @@ OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o d
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o\
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
skinclassic.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
ifndef NO_KBD

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: dvbhdffdevice.c 1.41 2012/03/07 13:52:41 kls Exp $
* $Id: dvbhdffdevice.c 1.43 2012/05/08 11:40:32 kls Exp $
*/
#include <stdint.h>
@ -50,7 +50,7 @@ cDvbHdFfDevice::cDvbHdFfDevice(int Adapter, int Frontend)
mHdffCmdIf = new HDFF::cHdffCmdIf(fd_osd);
/* reset some stuff in case the VDR was killed before and had no chance
to clean up. */
to clean up. */
mHdffCmdIf->CmdOsdReset();
mHdffCmdIf->CmdAvSetVideoSpeed(0, 100);
@ -183,68 +183,72 @@ void cDvbHdFfDevice::GetOsdSize(int &Width, int &Height, double &PixelAspect)
gHdffSetup.GetOsdSize(Width, Height, PixelAspect);
}
/*TODO obsolete?
bool cDvbHdFfDevice::SetAudioBypass(bool On)
{
if (setTransferModeForDolbyDigital != 1)
return false;
return ioctl(fd_audio, AUDIO_SET_BYPASS_MODE, On) == 0;
}
TODO*/
bool cDvbHdFfDevice::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;
}
}
if (Type == ptPcr)
mHdffCmdIf->CmdAvSetPcrPid(0, Handle->pid);
else if (Type == ptVideo) {
if (Handle->streamType == 0x1B)
mHdffCmdIf->CmdAvSetVideoPid(0, Handle->pid, HDFF_VIDEO_STREAM_H264);
else
mHdffCmdIf->CmdAvSetVideoPid(0, Handle->pid, HDFF_VIDEO_STREAM_MPEG2);
}
else if (Type == ptAudio)
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_MPEG1);
else if (Type == ptDolby)
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_AC3);
if (!(Type <= ptDolby && Handle->used <= 1)) {
pesFilterParams.pid = Handle->pid;
pesFilterParams.input = DMX_IN_FRONTEND;
pesFilterParams.output = DMX_OUT_TS_TAP;
pesFilterParams.pes_type= DMX_PES_OTHER;
pesFilterParams.flags = DMX_IMMEDIATE_START;
if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
LOG_ERROR;
return false;
}
}
//printf("SetPid Type %d, On %d, PID %5d, streamtype %d, handle %d, used %d\n", Type, On, Handle->pid, Handle->streamType, Handle->handle, Handle->used);
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;
}
}
if (Type == ptPcr)
mHdffCmdIf->CmdAvSetPcrPid(0, Handle->pid);
else if (Type == ptVideo) {
if (Handle->streamType == 0x1B)
mHdffCmdIf->CmdAvSetVideoPid(0, Handle->pid, HDFF_VIDEO_STREAM_H264);
else
mHdffCmdIf->CmdAvSetVideoPid(0, Handle->pid, HDFF_VIDEO_STREAM_MPEG2);
}
else if (Type == ptAudio) {
if (Handle->streamType == 0x03)
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_MPEG1);
else if (Handle->streamType == 0x04)
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_MPEG2);
else if (Handle->streamType == SI::AC3DescriptorTag)
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_AC3);
else if (Handle->streamType == SI::EnhancedAC3DescriptorTag)
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_EAC3);
else if (Handle->streamType == 0x0F)
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_AAC);
else if (Handle->streamType == 0x11)
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_HE_AAC);
else
mHdffCmdIf->CmdAvSetAudioPid(0, Handle->pid, HDFF_AUDIO_STREAM_MPEG1);
}
if (!(Type <= ptDolby && Handle->used <= 1)) {
pesFilterParams.pid = Handle->pid;
pesFilterParams.input = DMX_IN_FRONTEND;
pesFilterParams.output = DMX_OUT_TS_TAP;
pesFilterParams.pes_type= DMX_PES_OTHER;
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 == ptPcr)
mHdffCmdIf->CmdAvSetPcrPid(0, 0);
else if (Type == ptVideo)
mHdffCmdIf->CmdAvSetVideoPid(0, 0, HDFF_VIDEO_STREAM_MPEG1);
else if (Type == ptAudio)
mHdffCmdIf->CmdAvSetAudioPid(0, 0, HDFF_AUDIO_STREAM_MPEG1);
else if (Type == ptDolby)
mHdffCmdIf->CmdAvSetAudioPid(0, 0, HDFF_AUDIO_STREAM_AC3);
//TODO missing setting to 0x1FFF??? see cDvbDevice::SetPid()
close(Handle->handle);
Handle->handle = -1;
else if (!Handle->used) {
CHECK(ioctl(Handle->handle, DMX_STOP));
if (Type == ptPcr)
mHdffCmdIf->CmdAvSetPcrPid(0, 0);
else if (Type == ptVideo)
mHdffCmdIf->CmdAvSetVideoPid(0, 0, HDFF_VIDEO_STREAM_MPEG1);
else if (Type == ptAudio)
mHdffCmdIf->CmdAvSetAudioPid(0, 0, HDFF_AUDIO_STREAM_MPEG1);
else if (Type == ptDolby)
mHdffCmdIf->CmdAvSetAudioPid(0, 0, HDFF_AUDIO_STREAM_AC3);
//TODO missing setting to 0x1FFF??? see cDvbDevice::SetPid()
close(Handle->handle);
Handle->handle = -1;
}
}
return true;
}
return true;
}
void cDvbHdFfDevice::TurnOffLiveMode(bool LiveView)
@ -286,6 +290,8 @@ bool cDvbHdFfDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
if (CamSlot() && !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), CamSlot()->SlotNumber()))
StartTransferMode |= LiveView && IsPrimaryDevice() && Channel->Ca() >= CA_ENCRYPTED_MIN;
//printf("SetChannelDevice Transfer %d, Live %d\n", StartTransferMode, LiveView);
bool TurnOnLivePIDs = !StartTransferMode && LiveView;
// Turn off live PIDs if necessary:
@ -301,13 +307,10 @@ bool cDvbHdFfDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
// PID settings:
if (TurnOnLivePIDs) {
//SetAudioBypass(false);//TODO obsolete?
if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(vpid, ptVideo, Channel->Vtype()) && AddPid(apid, ptAudio))) {
if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(vpid, ptVideo, Channel->Vtype()) && AddPid(apid ? apid : dpid, ptAudio, apid ? 0 : Channel->Dtype(0)))) {
esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1);
return false;
}
if (IsPrimaryDevice())
AddPid(Channel->Tpid(), ptTeletext);//TODO obsolete?
}
else if (StartTransferMode)
cControl::Launch(new cTransferControl(this, Channel));
@ -338,27 +341,31 @@ void cDvbHdFfDevice::SetDigitalAudioDevice(bool On)
void cDvbHdFfDevice::SetAudioTrackDevice(eTrackType Type)
{
//printf("SetAudioTrackDevice %d\n", Type);
const tTrackId *TrackId = GetTrack(Type);
if (TrackId && TrackId->id) {
if (IS_AUDIO_TRACK(Type)) {
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)) {
pidHandles[ptDolby].pid = TrackId->id;
SetPid(&pidHandles[ptDolby], ptDolby, true);
//printf("SetAudioTrackDevice %d\n", Type);
const tTrackId *TrackId = GetTrack(Type);
if (TrackId && TrackId->id) {
int streamType = 0;
cChannel * channel = Channels.GetByNumber(CurrentChannel());
if (channel) {
if (IS_AUDIO_TRACK(Type))
streamType = channel->Atype(Type - ttAudioFirst);
else if (IS_DOLBY_TRACK(Type))
streamType = channel->Dtype(Type - ttDolbyFirst);
}
}
//printf("SetAudioTrackDevice new %d %d, current %d\n", TrackId->id, streamType, pidHandles[ptAudio].pid);
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;
pidHandles[ptAudio].streamType = streamType;
SetPid(&pidHandles[ptAudio], ptAudio, true);
if (CamSlot()) {
CamSlot()->SetPid(pidHandles[ptAudio].pid, true);
CamSlot()->StartDecrypting();
}
}
}
}
bool cDvbHdFfDevice::CanReplay(void) const

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: hdffosd.c 1.12 2011/12/04 15:31:41 kls Exp $
* $Id: hdffosd.c 1.15 2012/05/17 13:29:50 kls Exp $
*/
#include "hdffosd.h"
@ -40,7 +40,6 @@ private:
int mDispHeight;
bool shown;
bool mChanged;
bool mBitmapModified;
uint32_t mDisplay;
tFontFace mFontFaces[MAX_NUM_FONTFACES];
tFont mFonts[MAX_NUM_FONTS];
@ -53,7 +52,6 @@ protected:
public:
cHdffOsd(int Left, int Top, HDFF::cHdffCmdIf * pHdffCmdIf, uint Level);
virtual ~cHdffOsd();
cBitmap *GetBitmap(int Area);
virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
virtual eOsdError SetAreas(const tArea *Areas, int NumAreas);
virtual void SaveRegion(int x1, int y1, int x2, int y2);
@ -79,9 +77,8 @@ cHdffOsd::cHdffOsd(int Left, int Top, HDFF::cHdffCmdIf * pHdffCmdIf, uint Level)
mTop = Top;
shown = false;
mChanged = false;
mBitmapModified = false;
mBitmapPalette = HDFF_INVALID_HANDLE;
config.FontKerning = false;
config.FontKerning = true;
config.FontAntialiasing = Setup.AntiAlias ? true : false;
mHdffCmdIf->CmdOsdConfigure(&config);
@ -126,14 +123,6 @@ cHdffOsd::~cHdffOsd()
mHdffCmdIf->CmdOsdDeleteDisplay(mDisplay);
}
cBitmap * cHdffOsd::GetBitmap(int Area)
{
//printf("GetBitmap %d\n", Area);
mChanged = true;
mBitmapModified = true;
return cOsd::GetBitmap(Area);
}
eOsdError cHdffOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
{
eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas);
@ -150,6 +139,9 @@ eOsdError cHdffOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
eOsdError cHdffOsd::SetAreas(const tArea *Areas, int NumAreas)
{
eOsdError error;
cBitmap * bitmap;
for (int i = 0; i < NumAreas; i++)
{
//printf("SetAreas %d: %d %d %d %d %d\n", i, Areas[i].x1, Areas[i].y1, Areas[i].x2, Areas[i].y2, Areas[i].bpp);
@ -160,7 +152,14 @@ eOsdError cHdffOsd::SetAreas(const tArea *Areas, int NumAreas)
mHdffCmdIf->CmdOsdRenderDisplay(mDisplay);
shown = false;
}
return cOsd::SetAreas(Areas, NumAreas);
error = cOsd::SetAreas(Areas, NumAreas);
for (int i = 0; (bitmap = GetBitmap(i)) != NULL; i++)
{
bitmap->Clean();
}
return error;
}
void cHdffOsd::SetActive(bool On)
@ -186,25 +185,22 @@ void cHdffOsd::SaveRegion(int x1, int y1, int x2, int y2)
{
mHdffCmdIf->CmdOsdSaveRegion(mDisplay, mLeft + x1, mTop + y1, x2 - x1 + 1, y2 - y1 + 1);
mChanged = true;
mBitmapModified = false;
}
void cHdffOsd::RestoreRegion(void)
{
mHdffCmdIf->CmdOsdRestoreRegion(mDisplay);
mChanged = true;
mBitmapModified = false;
}
void cHdffOsd::DrawPixel(int x, int y, tColor Color)
{
//printf("DrawPixel\n");
mBitmapModified = false;
}
void cHdffOsd::DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg, tColor ColorBg, bool ReplacePalette, bool Overlay)
{
//printf("DrawBitmap %d %d %d\n", x, y, Overlay);
//printf("DrawBitmap %d %d %d x %d\n", x, y, Bitmap.Width(), Bitmap.Height());
int i;
int numColors;
const tColor * colors = Bitmap.Colors(numColors);
@ -230,37 +226,21 @@ void cHdffOsd::DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg, t
mHdffCmdIf->CmdOsdSetPaletteColors(mBitmapPalette,
HDFF_COLOR_FORMAT_ARGB, 0, numColors, mBitmapColors);
}
mHdffCmdIf->CmdOsdDrawBitmap(mDisplay, mLeft + x, mTop + y,
(uint8_t *) Bitmap.Data(0, 0), Bitmap.Width(), Bitmap.Height(),
Bitmap.Width() * Bitmap.Height(), HDFF_COLOR_TYPE_CLUT8, mBitmapPalette);
#if 0
uint32_t * tmpBitmap = new uint32_t[Bitmap.Width() * Bitmap.Height()];
for (int ix = 0; ix < Bitmap.Width(); ix++)
int width = Bitmap.Width();
int height = Bitmap.Height();
int chunk = MAX_BITMAP_SIZE / width;
if (chunk > height)
chunk = height;
for (int yc = 0; yc < height; yc += chunk)
{
for (int iy = 0; iy < Bitmap.Height(); iy++)
{
const tIndex * pixel = Bitmap.Data(ix, iy);
tColor color = Bitmap.Color(*pixel);
if (!Overlay || *pixel != 0)
{
if (ColorFg || ColorBg)
{
if (*pixel == 0)
color = ColorBg;
else if (*pixel == 1)
color = ColorFg;
}
tmpBitmap[Bitmap.Width() * iy + ix] = color;
}
}
int hc = chunk;
if (yc + hc > height)
hc = height - yc;
mHdffCmdIf->CmdOsdDrawBitmap(mDisplay, mLeft + x, mTop + y + yc,
(uint8_t *) Bitmap.Data(0, yc), width, hc,
width * hc, HDFF_COLOR_TYPE_CLUT8, mBitmapPalette);
}
mHdffCmdIf->CmdOsdDrawBitmap(mDisplay, mLeft + x, mTop + y,
(uint8_t *) tmpBitmap, Bitmap.Width(), Bitmap.Height(),
Bitmap.Width() * Bitmap.Height() * 4, HDFF::colorTypeARGB8888, InvalidHandle);
delete[] tmpBitmap;
#endif
mChanged = true;
mBitmapModified = false;
}
void cHdffOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width, int Height, int Alignment)
@ -365,11 +345,16 @@ void cHdffOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Colo
if (Width)
{
if ((Alignment & taLeft) != 0)
;
{
if ((Alignment & taBorder) != 0)
x += max(h / TEXT_ALIGN_BORDER, 1);
}
else if ((Alignment & taRight) != 0)
{
if (w < Width)
x += Width - w;
if ((Alignment & taBorder) != 0)
x -= max(h / TEXT_ALIGN_BORDER, 1);
}
else
{ // taCentered
@ -413,14 +398,12 @@ void cHdffOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Colo
mHdffCmdIf->CmdOsdSetDisplayClippingArea(mDisplay, false, 0, 0, 0, 0);
//Font->DrawText(this, x, y, s, ColorFg, ColorBg, limit);
mChanged = true;
mBitmapModified = false;
}
void cHdffOsd::DrawRectangle(int x1, int y1, int x2, int y2, tColor Color)
{
mHdffCmdIf->CmdOsdDrawRectangle(mDisplay, mLeft + x1, mTop + y1, x2 - x1 + 1, y2 - y1 + 1, Color);
mChanged = true;
mBitmapModified = false;
}
void cHdffOsd::DrawEllipse(int x1, int y1, int x2, int y2, tColor Color, int Quadrants)
@ -511,14 +494,12 @@ void cHdffOsd::DrawEllipse(int x1, int y1, int x2, int y2, tColor Color, int Qua
}
mHdffCmdIf->CmdOsdDrawEllipse(mDisplay, mLeft + cx, mTop + cy, rx, ry, Color, flags);
mChanged = true;
mBitmapModified = false;
}
void cHdffOsd::DrawSlope(int x1, int y1, int x2, int y2, tColor Color, int Type)
{
//printf("DrawSlope\n");
mChanged = true;
mBitmapModified = false;
}
void cHdffOsd::Flush(void)
@ -526,23 +507,30 @@ void cHdffOsd::Flush(void)
if (!Active())
return;
if (!mChanged)
return;
//printf("Flush\n");
if (mBitmapModified)
cBitmap * Bitmap;
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++)
{
cBitmap *Bitmap;
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++)
int x1;
int y1;
int x2;
int y2;
if (Bitmap->Dirty(x1, y1, x2, y2))
{
//printf("dirty %d %d, %d %d\n", x1, y1, x2, y2);
DrawBitmap(0, 0, *Bitmap);
Bitmap->Clean();
}
}
if (!mChanged)
return;
mHdffCmdIf->CmdOsdRenderDisplay(mDisplay);
mChanged = false;
mBitmapModified = false;
}

@ -71,3 +71,7 @@ VDR Plugin 'pictures' Revision History
2012-02-27: Version 0.1.2
- Removed an obsolete command line option.
2012-04-2r8 Version 0.1.3
- Added cPictureControl::GetHeader().

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: pictures.c 2.5 2012/02/27 11:40:15 kls Exp $
* $Id: pictures.c 2.6 2012/04/28 11:58:42 kls Exp $
*/
#include <getopt.h>
@ -11,7 +11,7 @@
#include "menu.h"
#include "player.h"
static const char *VERSION = "0.1.2";
static const char *VERSION = "0.1.3";
static const char *DESCRIPTION = trNOOP("A simple picture viewer");
static const char *MAINMENUENTRY = trNOOP("Pictures");

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: player.c 2.1 2011/02/20 17:15:25 kls Exp $
* $Id: player.c 2.2 2012/04/28 11:58:15 kls Exp $
*/
#include "player.h"
@ -204,6 +204,11 @@ void cPictureControl::DisplayCaption(void)
osd->Flush();
}
cString cPictureControl::GetHeader(void)
{
return tr("Pictures");
}
eOSState cPictureControl::ProcessKey(eKeys Key)
{
switch (Key) {

@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: player.h 2.0 2008/01/12 16:21:57 kls Exp $
* $Id: player.h 2.1 2012/04/28 11:56:01 kls Exp $
*/
#ifndef _PLAYER_H
@ -39,6 +39,7 @@ private:
public:
cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow = false);
virtual ~cPictureControl();
virtual cString GetHeader(void);
virtual eOSState ProcessKey(eKeys Key);
static bool Active(void) { return active > 0; }
static const char *LastDisplayed(void);

@ -96,3 +96,8 @@ VDR Plugin 'skincurses' Revision History
2012-03-11: Version 0.1.11
- Adapted menu column widths of 'skincurses' to the wider HD OSD sizes.
2012-04-23: Version 0.1.12
- Now displaying disk usage in the title of the main and "Recordings" menu,
which is no longer done by the VDR core.

@ -3,15 +3,16 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id: skincurses.c 2.8 2012/03/11 14:42:52 kls Exp $
* $Id: skincurses.c 2.9 2012/04/23 08:53:13 kls Exp $
*/
#include <ncurses.h>
#include <vdr/osd.h>
#include <vdr/plugin.h>
#include <vdr/skins.h>
#include <vdr/videodir.h>
static const char *VERSION = "0.1.11";
static const char *VERSION = "0.1.12";
static const char *DESCRIPTION = trNOOP("A text only skin");
static const char *MAINMENUENTRY = NULL;
@ -262,6 +263,9 @@ void cSkinCursesDisplayChannel::Flush(void)
class cSkinCursesDisplayMenu : public cSkinDisplayMenu {
private:
cOsd *osd;
cString title;
int lastDiskUsageState;
void DrawTitle(void);
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
void SetTextScrollbar(void);
public:
@ -285,6 +289,7 @@ public:
cSkinCursesDisplayMenu::cSkinCursesDisplayMenu(void)
{
osd = new cCursesOsd(0, 0);
lastDiskUsageState = -1;
osd->DrawRectangle(0, 0, ScOsdWidth - 1, ScOsdHeight - 1, clrBackground);
}
@ -332,9 +337,16 @@ void cSkinCursesDisplayMenu::Clear(void)
textScroller.Reset();
}
void cSkinCursesDisplayMenu::DrawTitle(void)
{
bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
osd->DrawText(0, 0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, clrBlack, clrCyan, &Font, ScOsdWidth);
}
void cSkinCursesDisplayMenu::SetTitle(const char *Title)
{
osd->DrawText(0, 0, Title, clrBlack, clrCyan, &Font, ScOsdWidth);
title = Title;
DrawTitle();
}
void cSkinCursesDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
@ -475,6 +487,8 @@ void cSkinCursesDisplayMenu::SetText(const char *Text, bool FixedFont)
void cSkinCursesDisplayMenu::Flush(void)
{
if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
DrawTitle();
cString date = DayDateTime();
osd->DrawText(ScOsdWidth - Utf8StrLen(date) - 2, 0, date, clrBlack, clrCyan, &Font);
osd->Flush();

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: channels.c 2.21 2012/03/11 13:29:06 kls Exp $
* $Id: channels.c 2.22 2012/04/01 09:27:08 kls Exp $
*/
#include "channels.h"
@ -955,7 +955,7 @@ int cChannels::MaxShortChannelNameLength(void)
if (!maxShortChannelNameLength) {
for (cChannel *channel = First(); channel; channel = Next(channel)) {
if (!channel->GroupSep())
maxShortChannelNameLength = max(Utf8StrLen(channel->ShortName()), maxShortChannelNameLength);
maxShortChannelNameLength = max(Utf8StrLen(channel->ShortName(true)), maxShortChannelNameLength);
}
}
return maxShortChannelNameLength;

3
ci.c

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: ci.c 2.8 2012/02/29 10:24:41 kls Exp $
* $Id: ci.c 2.9 2012/05/29 11:13:40 kls Exp $
*/
#include "ci.h"
@ -1715,6 +1715,7 @@ bool cCamSlot::Reset(void)
if (ciAdapter->Reset(slotIndex)) {
resetTime = time(NULL);
dbgprotocol("ok.\n");
lastModuleStatus = msReset;
return true;
}
dbgprotocol("failed!\n");

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.c 2.20 2012/02/29 10:15:54 kls Exp $
* $Id: config.c 2.22 2012/05/11 11:06:57 kls Exp $
*/
#include "config.h"
@ -309,9 +309,9 @@ cSetupLine::cSetupLine(void)
cSetupLine::cSetupLine(const char *Name, const char *Value, const char *Plugin)
{
name = strdup(Name);
value = strdup(Value);
plugin = Plugin ? strdup(Plugin) : NULL;
name = strreplace(strdup(Name), '\n', 0);
value = strreplace(strdup(Value), '\n', 0);
plugin = Plugin ? strreplace(strdup(Plugin), '\n', 0) : NULL;
}
cSetupLine::~cSetupLine()
@ -391,6 +391,7 @@ cSetup::cSetup(void)
SetSystemTime = 0;
TimeSource = 0;
TimeTransponder = 0;
StandardCompliance = STANDARD_DVB;
MarginStart = 2;
MarginStop = 10;
AudioLanguages[0] = -1;
@ -585,6 +586,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "SetSystemTime")) SetSystemTime = atoi(Value);
else if (!strcasecmp(Name, "TimeSource")) TimeSource = cSource::FromString(Value);
else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value);
else if (!strcasecmp(Name, "StandardCompliance")) StandardCompliance = atoi(Value);
else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value);
else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value);
else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages);
@ -682,6 +684,7 @@ bool cSetup::Save(void)
Store("SetSystemTime", SetSystemTime);
Store("TimeSource", cSource::ToString(TimeSource));
Store("TimeTransponder", TimeTransponder);
Store("StandardCompliance", StandardCompliance);
Store("MarginStart", MarginStart);
Store("MarginStop", MarginStop);
StoreLanguages("AudioLanguages", AudioLanguages);

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.h 2.45 2012/03/11 10:41:44 kls Exp $
* $Id: config.h 2.47 2012/04/15 10:45:32 kls Exp $
*/
#ifndef __CONFIG_H
@ -22,13 +22,13 @@
// VDR's own version number:
#define VDRVERSION "1.7.27"
#define VDRVERSNUM 10727 // Version * 10000 + Major * 100 + Minor
#define VDRVERSION "1.7.28"
#define VDRVERSNUM 10728 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number:
#define APIVERSION "1.7.27"
#define APIVERSNUM 10727 // Version * 10000 + Major * 100 + Minor
#define APIVERSION "1.7.28"
#define APIVERSNUM 10728 // Version * 10000 + Major * 100 + Minor
// When loading plugins, VDR searches them by their APIVERSION, which
// may be smaller than VDRVERSION in case there have been no changes to
@ -52,6 +52,16 @@
#define MaxSkinName 16
#define MaxThemeName 16
// Basically VDR works according to the DVB standard, but there are countries/providers
// that use other standards, which in some details deviate from the DVB standard.
// This makes it necessary to handle things differently in some areas, depending on
// which standard is actually used. The following macros are used to distinguish
// these cases (make sure to adjust cMenuSetupDVB::standardComplianceTexts accordingly
// when adding a new standard):
#define STANDARD_DVB 0
#define STANDARD_ANSISCTE 1
typedef uint32_t in_addr_t; //XXX from /usr/include/netinet/in.h (apparently this is not defined on systems with glibc < 2.2)
class cSVDRPhost : public cListObject {
@ -255,6 +265,7 @@ public:
int SetSystemTime;
int TimeSource;
int TimeTransponder;
int StandardCompliance;
int MarginStart, MarginStop;
int AudioLanguages[I18N_MAX_LANGUAGES + 1];
int DisplaySubtitles;

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: cutter.c 2.11 2012/02/16 12:08:39 kls Exp $
* $Id: cutter.c 2.12 2012/06/02 13:46:55 kls Exp $
*/
#include "cutter.h"
@ -270,7 +270,7 @@ bool cCutter::Active(const char *FileName)
error = cuttingThread->Error();
Stop();
if (!error)
cRecordingUserCommand::InvokeCommand(RUC_EDITEDRECORDING, editedVersionName);
cRecordingUserCommand::InvokeCommand(RUC_EDITEDRECORDING, editedVersionName, originalVersionName);
originalVersionName = NULL;
editedVersionName = NULL;
ended = true;

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.c 2.58 2012/03/13 09:48:14 kls Exp $
* $Id: device.c 2.60 2012/04/26 09:40:36 kls Exp $
*/
#include "device.h"
@ -162,6 +162,11 @@ int cDevice::DeviceNumber(void) const
return -1;
}
cString cDevice::DeviceType(void) const
{
return "";
}
cString cDevice::DeviceName(void) const
{
return "";
@ -1176,8 +1181,10 @@ void cDevice::StillPicture(const uchar *Data, int Length)
return;
}
}
StillPicture(buf, Size);
free(buf);
if (buf) {
StillPicture(buf, Size);
free(buf);
}
}
}

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.h 2.38 2012/03/13 10:17:16 kls Exp $
* $Id: device.h 2.39 2012/04/04 09:48:21 kls Exp $
*/
#ifndef __DEVICE_H
@ -201,6 +201,12 @@ public:
///< Returns the card index of this device (0 ... MAXDEVICES - 1).
int DeviceNumber(void) const;
///< Returns the number of this device (0 ... numDevices).
virtual cString DeviceType(void) const;
///< Returns a string identifying the type of this device (like "DVB-S").
///< If this device can receive different delivery systems, the returned
///< string shall be that of the currently used system.
///< The length of the returned string should not exceed 6 characters.
///< The default implementation returns an empty string.
virtual cString DeviceName(void) const;
///< Returns a string identifying the name of this device.
///< The default implementation returns an empty string.

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: dvbdevice.c 2.69 2012/03/25 10:41:45 kls Exp $
* $Id: dvbdevice.c 2.71 2012/05/09 08:33:59 kls Exp $
*/
#include "dvbdevice.h"
@ -285,6 +285,7 @@ class cDvbTuner : public cThread {
private:
static cMutex bondMutex;
enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked };
int frontendType;
const cDvbDevice *device;
int fd_frontend;
int adapter, frontend;
@ -302,7 +303,6 @@ private:
cCondVar newSet;
cDvbTuner *bondedTuner;
bool bondedMaster;
bool bondedMasterFailed;
bool SetFrontendType(const cChannel *Channel);
cString GetBondingParams(const cChannel *Channel = NULL) const;
void ClearEventQueue(void) const;
@ -314,6 +314,7 @@ private:
public:
cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend);
virtual ~cDvbTuner();
int FrontendType(void) const { return frontendType; }
bool Bond(cDvbTuner *Tuner);
void UnBond(void);
bool BondingOk(const cChannel *Channel, bool ConsiderOccupied = false) const;
@ -331,6 +332,7 @@ cMutex cDvbTuner::bondMutex;
cDvbTuner::cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend)
{
frontendType = SYS_UNDEFINED;
device = Device;
fd_frontend = Fd_Frontend;
adapter = Adapter;
@ -345,7 +347,6 @@ cDvbTuner::cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int
tunerStatus = tsIdle;
bondedTuner = NULL;
bondedMaster = false;
bondedMasterFailed = false;
SetDescription("tuner on frontend %d/%d", adapter, frontend);
Start();
}
@ -435,12 +436,8 @@ cDvbTuner *cDvbTuner::GetBondedMaster(void)
if (!bondedTuner)
return this; // an unbonded tuner is always "master"
cMutexLock MutexLock(&bondMutex);
if (bondedMaster) {
if (!bondedMasterFailed)
return this;
else
bondedMaster = false;
}
if (bondedMaster)
return this;
// This tuner is bonded, but it's not the master, so let's see if there is a master at all:
if (cDvbTuner *t = bondedTuner) {
while (t != this) {
@ -450,18 +447,9 @@ cDvbTuner *cDvbTuner::GetBondedMaster(void)
}
}
// None of the other bonded tuners is master, so make this one the master:
cDvbTuner *t = this;
if (bondedMasterFailed) {
// This one has failed, so switch to the next one:
t = bondedTuner;
t->bondedMasterFailed = false;
cMutexLock MutexLock(&t->mutex);
t->channel = channel;
t->tunerStatus = tsSet;
}
t->bondedMaster = true;
dsyslog("tuner %d/%d is now bonded master", t->adapter, t->frontend);
return t;
bondedMaster = true;
dsyslog("tuner %d/%d is now bonded master", adapter, frontend);
return this;
}
bool cDvbTuner::IsTunedTo(const cChannel *Channel) const
@ -733,7 +721,7 @@ bool cDvbTuner::SetFrontend(void)
cDvbTransponderParameters dtp(channel.Parameters());
// Determine the required frontend type:
int frontendType = GetRequiredDeliverySystem(&channel, &dtp);
frontendType = GetRequiredDeliverySystem(&channel, &dtp);
if (frontendType == SYS_UNDEFINED)
return false;
@ -875,9 +863,6 @@ void cDvbTuner::Action(void)
isyslog("frontend %d/%d timed out while tuning to channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder());
lastTimeoutReport = time(NULL);
}
cMutexLock MutexLock(&bondMutex);
if (bondedTuner && bondedMaster)
bondedMasterFailed = true; // give an other tuner a chance in case the sat cable was disconnected
continue;
}
WaitTime = 100; // allows for a quick change from tsTuned to tsLocked
@ -977,7 +962,7 @@ int cDvbDevice::setTransferModeForDolbyDigital = 1;
cMutex cDvbDevice::bondMutex;
const char *DeliverySystemNames[] = {
"UNDEFINED",
"",
"DVB-C",
"DVB-C",
"DVB-T",
@ -1090,6 +1075,17 @@ bool cDvbDevice::Probe(int Adapter, int Frontend)
return true;
}
cString cDvbDevice::DeviceType(void) const
{
if (dvbTuner) {
if (dvbTuner->FrontendType() != SYS_UNDEFINED)
return DeliverySystemNames[dvbTuner->FrontendType()];
if (numDeliverySystems)
return DeliverySystemNames[deliverySystems[0]]; // to have some reasonable default
}
return "";
}
cString cDvbDevice::DeviceName(void) const
{
return frontendInfo.name;

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: dvbdevice.h 2.25 2012/03/13 10:11:15 kls Exp $
* $Id: dvbdevice.h 2.26 2012/03/31 11:13:31 kls Exp $
*/
#ifndef __DVBDEVICE_H
@ -138,6 +138,7 @@ public:
int Adapter(void) const { return adapter; }
int Frontend(void) const { return frontend; }
virtual bool Ready(void);
virtual cString DeviceType(void) const;
virtual cString DeviceName(void) const;
static bool BondDevices(const char *Bondings);
///< Bonds the devices as defined in the given Bondings string.

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: dvbplayer.c 2.26 2012/03/12 14:36:55 kls Exp $
* $Id: dvbplayer.c 2.27 2012/05/06 11:02:35 kls Exp $
*/
#include "dvbplayer.h"
@ -408,7 +408,7 @@ void cDvbPlayer::Action(void)
Goto(0, true);
while (Running()) {
if (WaitingForData)
nonBlockingFileReader->WaitForDataMs(3); // this keeps the CPU load low, but reacts immediately on new data
WaitingForData = !nonBlockingFileReader->WaitForDataMs(3); // this keeps the CPU load low, but reacts immediately on new data
else if (Sleep) {
cPoller Poller;
DevicePoll(Poller, 10);

@ -7,7 +7,7 @@
* Original author: Marco Schluessler <marco@lordzodiac.de>
* With some input from the "subtitle plugin" by Pekka Virtanen <pekka.virtanen@sci.fi>
*
* $Id: dvbsubtitle.c 2.31 2012/03/16 11:56:56 kls Exp $
* $Id: dvbsubtitle.c 2.32 2012/05/08 08:17:17 kls Exp $
*/
@ -217,7 +217,7 @@ void cSubtitleObject::DecodeCharacterString(const uchar *Data, int NumberOfCodes
char txt[NumberOfCodes + 1];
char *p = txt;
for (int i = 2; i < NumberOfCodes; ++i) {
char c = Data[i * 2 + 1] & 0xFF;
uchar c = Data[i * 2 + 1] & 0xFF;
if (c == 0)
break;
if (' ' <= c && c <= '~' || c == '\n' || 0xA0 <= c)

7
eit.c

@ -8,7 +8,7 @@
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
*
* $Id: eit.c 2.16 2012/03/14 10:11:15 kls Exp $
* $Id: eit.c 2.17 2012/06/02 14:05:22 kls Exp $
*/
#include "eit.h"
@ -290,6 +290,11 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
channel->SetLinkChannels(LinkChannels);
Modified = true;
EpgHandlers.HandleEvent(pEvent);
if (EpgHandlers.DeleteEvent(pEvent)) {
pSchedule->DelEvent(pEvent);
pEvent = NULL;
}
}
if (Tid == 0x4E) {
if (Empty && getSectionNumber() == 0)

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: eitscan.c 2.6 2012/03/07 13:54:34 kls Exp $
* $Id: eitscan.c 2.7 2012/04/07 14:39:28 kls Exp $
*/
#include "eitscan.h"
@ -148,7 +148,7 @@ void cEITScanner::Process(void)
if (Channel) {
if (!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= CA_ENCRYPTED_MIN) {
if (Device->ProvidesTransponder(Channel)) {
if (!Device->Receiving()) {
if (Device->Priority() < 0) {
bool MaySwitchTransponder = Device->MaySwitchTransponder(Channel);
if (MaySwitchTransponder || Device->ProvidesTransponderExclusively(Channel) && now - lastActivity > Setup.EPGScanTimeout * 3600) {
if (!MaySwitchTransponder) {

15
epg.c

@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
* $Id: epg.c 2.12 2012/03/10 13:14:27 kls Exp $
* $Id: epg.c 2.14 2012/06/02 14:08:12 kls Exp $
*/
#include "epg.h"
@ -1125,7 +1125,7 @@ cSchedulesLock::~cSchedulesLock()
// --- cSchedules ------------------------------------------------------------
cSchedules cSchedules::schedules;
const char *cSchedules::epgDataFileName = NULL;
char *cSchedules::epgDataFileName = NULL;
time_t cSchedules::lastCleanup = time(NULL);
time_t cSchedules::lastDump = time(NULL);
time_t cSchedules::modified = 0;
@ -1137,7 +1137,7 @@ const cSchedules *cSchedules::Schedules(cSchedulesLock &SchedulesLock)
void cSchedules::SetEpgDataFileName(const char *FileName)
{
delete epgDataFileName;
free(epgDataFileName);
epgDataFileName = FileName ? strdup(FileName) : NULL;
}
@ -1429,6 +1429,15 @@ void cEpgHandlers::HandleEvent(cEvent *Event)
}
}
bool cEpgHandlers::DeleteEvent(const cEvent *Event)
{
for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
if (eh->DeleteEvent(Event))
return true;
}
return false;
}
void cEpgHandlers::SortSchedule(cSchedule *Schedule)
{
for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {

8
epg.h

@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
* $Id: epg.h 2.8 2012/03/10 13:50:10 kls Exp $
* $Id: epg.h 2.10 2012/06/02 14:07:51 kls Exp $
*/
#ifndef __EPG_H
@ -192,7 +192,7 @@ class cSchedules : public cList<cSchedule> {
private:
cRwLock rwlock;
static cSchedules schedules;
static const char *epgDataFileName;
static char *epgDataFileName;
static time_t lastCleanup;
static time_t lastDump;
static time_t modified;
@ -258,6 +258,9 @@ public:
virtual bool HandleEvent(cEvent *Event) { return false; }
///< After all modifications of the Event have been done, the EPG handler
///< can take a final look at it.
virtual bool DeleteEvent(const cEvent *Event) { return false; }
///< After the complete processing of the Event is finished, an EPG handler
///< can decide that this Event shall be deleted from its schedule.
virtual bool SortSchedule(cSchedule *Schedule) { return false; }
///< Sorts the Schedule after the complete table has been processed.
virtual bool DropOutdated(cSchedule *Schedule, time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version) { return false; }
@ -280,6 +283,7 @@ public:
void SetVps(cEvent *Event, time_t Vps);
void FixEpgBugs(cEvent *Event);
void HandleEvent(cEvent *Event);
bool DeleteEvent(const cEvent *Event);
void SortSchedule(cSchedule *Schedule);
void DropOutdated(cSchedule *Schedule, time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version);
};

9
font.c

@ -6,7 +6,7 @@
*
* BiDi support by Osama Alrawab <alrawab@hotmail.com> @2008 Tripoli-Libya.
*
* $Id: font.c 2.10 2012/03/02 10:47:45 kls Exp $
* $Id: font.c 2.13 2012/06/02 13:38:28 kls Exp $
*/
#include "font.h"
@ -412,7 +412,7 @@ const cFont *cFont::GetFont(eDvbFont Font)
if (!fonts[Font]) {
switch (Font) {
case fontOsd: SetFont(Font, Setup.FontOsd, Setup.FontOsdSize); break;
case fontSml: SetFont(Font, Setup.FontSml, Setup.FontSmlSize); break;
case fontSml: SetFont(Font, Setup.FontSml, min(Setup.FontSmlSize, Setup.FontOsdSize)); break;
case fontFix: SetFont(Font, Setup.FontFix, Setup.FontFixSize); break;
default: esyslog("ERROR: unknown Font %d (%s %d)", Font, __FUNCTION__, __LINE__);
}
@ -482,7 +482,8 @@ cString cFont::GetFontFileName(const char *FontName)
FcPatternAddBool(pat, FC_SCALABLE, FcTrue);
FcConfigSubstitute(NULL, pat, FcMatchPattern);
FcDefaultSubstitute(pat);
FcFontSet *fontset = FcFontSort(NULL, pat, FcFalse, NULL, NULL);
FcResult fresult;
FcFontSet *fontset = FcFontSort(NULL, pat, FcFalse, NULL, &fresult);
if (fontset) {
for (int i = 0; i < fontset->nfont; i++) {
FcBool scalable;
@ -508,7 +509,7 @@ cString cFont::GetFontFileName(const char *FontName)
#ifdef BIDI
cString cFont::Bidi(const char *Ltr)
{
if (cCharSetConv::SystemCharacterTable()) { // bidi requires UTF-8
if (!cCharSetConv::SystemCharacterTable()) { // bidi requires UTF-8
fribidi_set_mirroring(true);
fribidi_set_reorder_nsm(false);
FriBidiCharSet fribidiCharset = FRIBIDI_CHAR_SET_UTF8;

156
menu.c

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.c 2.45 2012/03/13 13:14:38 kls Exp $
* $Id: menu.c 2.54 2012/05/12 13:08:23 kls Exp $
*/
#include "menu.h"
@ -34,7 +34,6 @@
#define MAXWAIT4EPGINFO 3 // seconds
#define MODETIMEOUT 3 // seconds
#define DISKSPACECHEK 5 // seconds between disk space checks
#define NEWTIMERLIMIT 120 // seconds until the start time of a new timer created from the Schedule menu,
// within which it will go directly into the "Edit timer" menu to allow
// further parameter settings
@ -47,50 +46,10 @@
#define CAMRESPONSETIMEOUT 5 // seconds to wait for a response from a CAM
#define MINFREEDISK 300 // minimum free disk space (in MB) required to start recording
#define NODISKSPACEDELTA 300 // seconds between "Not enough disk space to start recording!" messages
#define MAXCHNAMWIDTH 16 // maximum number of characters of channels' short names shown in schedules menus
#define CHNUMWIDTH (numdigits(Channels.MaxNumber()) + 1)
#define CHNAMWIDTH (Channels.MaxShortChannelNameLength() + 1)
// --- cFreeDiskSpace --------------------------------------------------------
#define MB_PER_MINUTE 25.75 // this is just an estimate!
class cFreeDiskSpace {
private:
static time_t lastDiskSpaceCheck;
static int lastFreeMB;
static cString freeDiskSpaceString;
public:
static bool HasChanged(bool ForceCheck = false);
static const char *FreeDiskSpaceString(void) { HasChanged(); return freeDiskSpaceString; }
};
time_t cFreeDiskSpace::lastDiskSpaceCheck = 0;
int cFreeDiskSpace::lastFreeMB = 0;
cString cFreeDiskSpace::freeDiskSpaceString;
cFreeDiskSpace FreeDiskSpace;
bool cFreeDiskSpace::HasChanged(bool ForceCheck)
{
if (ForceCheck || time(NULL) - lastDiskSpaceCheck > DISKSPACECHEK) {
int FreeMB;
int Percent = VideoDiskSpace(&FreeMB);
lastDiskSpaceCheck = time(NULL);
if (ForceCheck || FreeMB != lastFreeMB) {
int MBperMinute = Recordings.MBperMinute();
if (MBperMinute <= 0)
MBperMinute = MB_PER_MINUTE;
int Minutes = int(double(FreeMB) / MBperMinute);
int Hours = Minutes / 60;
Minutes %= 60;
freeDiskSpaceString = cString::sprintf("%s %d%% - %2d:%02d %s", tr("Disk"), Percent, Hours, Minutes, tr("free"));
lastFreeMB = FreeMB;
return true;
}
}
return false;
}
#define CHNAMWIDTH (min(MAXCHNAMWIDTH, Channels.MaxShortChannelNameLength() + 1))
// --- cMenuEditCaItem -------------------------------------------------------
@ -213,6 +172,7 @@ public:
cMenuEditChannel::cMenuEditChannel(cChannel *Channel, bool New)
:cOsdMenu(tr("Edit channel"), 16)
{
SetMenuCategory(mcChannel);
channel = Channel;
sourceParam = NULL;
*name = 0;
@ -390,6 +350,7 @@ public:
cMenuChannels::cMenuChannels(void)
:cOsdMenu(tr("Channels"), CHNUMWIDTH)
{
SetMenuCategory(mcChannel);
number = 0;
Setup();
Channels.IncBeingEdited();
@ -585,6 +546,7 @@ eOSState cMenuChannels::ProcessKey(eKeys Key)
cMenuText::cMenuText(const char *Title, const char *Text, eDvbFont Font)
:cOsdMenu(Title)
{
SetMenuCategory(mcText);
text = NULL;
font = Font;
SetText(Text);
@ -673,6 +635,7 @@ public:
cMenuEditFolder::cMenuEditFolder(const char *Dir, cList<cNestedItem> *List, cNestedItem *Folder)
:cOsdMenu(Folder ? tr("Edit folder") : tr("New folder"), 12)
{
SetMenuCategory(mcFolder);
list = List;
folder = Folder;
if (folder) {
@ -745,6 +708,7 @@ eOSState cMenuEditFolder::ProcessKey(eKeys Key)
cMenuFolder::cMenuFolder(const char *Title, cNestedItemList *NestedItemList, const char *Path)
:cOsdMenu(Title)
{
SetMenuCategory(mcFolder);
list = nestedItemList = NestedItemList;
firstFolder = NULL;
editing = false;
@ -756,6 +720,7 @@ cMenuFolder::cMenuFolder(const char *Title, cNestedItemList *NestedItemList, con
cMenuFolder::cMenuFolder(const char *Title, cList<cNestedItem> *List, cNestedItemList *NestedItemList, const char *Dir, const char *Path)
:cOsdMenu(Title)
{
SetMenuCategory(mcFolder);
list = List;
nestedItemList = NestedItemList;
dir = Dir;
@ -906,6 +871,7 @@ eOSState cMenuFolder::ProcessKey(eKeys Key)
cMenuEditTimer::cMenuEditTimer(cTimer *Timer, bool New)
:cOsdMenu(tr("Edit timer"), 12)
{
SetMenuCategory(mcTimer);
file = NULL;
day = firstday = NULL;
timer = Timer;
@ -1104,6 +1070,7 @@ public:
cMenuTimers::cMenuTimers(void)
:cOsdMenu(tr("Timers"), 2, CHNUMWIDTH, 10, 6, 6)
{
SetMenuCategory(mcTimer);
helpKeys = -1;
for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer)) {
timer->SetEventFromSchedule(); // make sure the event is current
@ -1242,6 +1209,7 @@ eOSState cMenuTimers::ProcessKey(eKeys Key)
cMenuEvent::cMenuEvent(const cEvent *Event, bool CanSwitch, bool Buttons)
:cOsdMenu(tr("Event"))
{
SetMenuCategory(mcEvent);
event = Event;
if (event) {
cChannel *channel = Channels.GetByChannelID(event->ChannelID(), true);
@ -1389,6 +1357,7 @@ const cEvent *cMenuWhatsOn::scheduleEvent = NULL;
cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentChannelNr)
:cOsdMenu(Now ? tr("What's on now?") : tr("What's on next?"), CHNUMWIDTH, CHNAMWIDTH, 6, 4)
{
SetMenuCategory(mcSchedule);
now = Now;
helpKeys = -1;
timerState = 0;
@ -1553,6 +1522,7 @@ public:
cMenuSchedule::cMenuSchedule(void)
:cOsdMenu("")
{
SetMenuCategory(mcSchedule);
now = next = false;
otherChannel = 0;
helpKeys = -1;
@ -1810,6 +1780,7 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key)
cMenuCommands::cMenuCommands(const char *Title, cList<cNestedItem> *Commands, const char *Parameters)
:cOsdMenu(Title)
{
SetMenuCategory(mcCommand);
result = NULL;
SetHasHotkeys();
commands = Commands;
@ -1939,6 +1910,7 @@ public:
cMenuCam::cMenuCam(cCamSlot *CamSlot)
:cOsdMenu("", 1) // tab necessary for enquiry!
{
SetMenuCategory(mcCam);
camSlot = CamSlot;
ciMenu = NULL;
ciEnquiry = NULL;
@ -2118,6 +2090,7 @@ public:
cMenuRecording::cMenuRecording(const cRecording *Recording, bool WithButtons)
:cOsdMenu(tr("Recording info"))
{
SetMenuCategory(mcRecording);
recording = Recording;
withButtons = WithButtons;
if (withButtons)
@ -2212,13 +2185,13 @@ void cMenuRecordingItem::IncrementCounter(bool New)
cMenuRecordings::cMenuRecordings(const char *Base, int Level, bool OpenSubMenus)
:cOsdMenu(Base ? Base : tr("Recordings"), 9, 6, 6)
{
SetMenuCategory(mcRecording);
base = Base ? strdup(Base) : NULL;
level = Setup.RecordingDirs ? Level : -1;
Recordings.StateChanged(recordingsState); // just to get the current state
helpKeys = -1;
Display(); // this keeps the higher level menus from showing up briefly when pressing 'Back' during replay
Set();
SetFreeDiskDisplay(true);
if (Current() < 0)
SetCurrent(First());
else if (OpenSubMenus && cReplayControl::LastReplayed() && Open(true))
@ -2233,16 +2206,6 @@ cMenuRecordings::~cMenuRecordings()
free(base);
}
bool cMenuRecordings::SetFreeDiskDisplay(bool Force)
{
if (FreeDiskSpace.HasChanged(Force)) {
//XXX -> skin function!!!
SetTitle(cString::sprintf("%s - %s", base ? base : tr("Recordings"), FreeDiskSpace.FreeDiskSpaceString()));
return true;
}
return false;
}
void cMenuRecordings::SetHelpKeys(void)
{
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
@ -2305,7 +2268,6 @@ void cMenuRecordings::Set(bool Refresh)
}
}
free(LastItemText);
Refresh |= SetFreeDiskDisplay(Refresh);
if (Refresh)
Display();
}
@ -2343,7 +2305,7 @@ eOSState cMenuRecordings::Play(void)
else {
cRecording *recording = GetRecording(ri);
if (recording) {
cReplayControl::SetRecording(recording->FileName(), recording->Title());
cReplayControl::SetRecording(recording->FileName());
return osReplay;
}
}
@ -2411,7 +2373,7 @@ eOSState cMenuRecordings::Delete(void)
Recordings.DelByName(ri->FileName());
cOsdMenu::Del(Current());
SetHelpKeys();
SetFreeDiskDisplay(true);
cVideoDiskUsage::ForceCheck();
Display();
if (!Count())
return osBack;
@ -2484,8 +2446,6 @@ eOSState cMenuRecordings::ProcessKey(eKeys Key)
Display();
}
if (!HasSubMenu()) {
if (HadSubMenu)
SetFreeDiskDisplay();
if (Key != kNone)
SetHelpKeys();
}
@ -2767,6 +2727,7 @@ private:
void Setup(void);
const char *videoDisplayFormatTexts[3];
const char *updateChannelsTexts[6];
const char *standardComplianceTexts[2];
public:
cMenuSetupDVB(void);
virtual eOSState ProcessKey(eKeys Key);
@ -2789,6 +2750,8 @@ cMenuSetupDVB::cMenuSetupDVB(void)
updateChannelsTexts[3] = tr("names and PIDs");
updateChannelsTexts[4] = tr("add new channels");
updateChannelsTexts[5] = tr("add new transponders");
standardComplianceTexts[0] = "DVB";
standardComplianceTexts[1] = "ANSI/SCTE";
SetSection(tr("DVB"));
SetHelp(NULL, tr("Button$Audio"), tr("Button$Subtitles"), NULL);
@ -2802,6 +2765,7 @@ void cMenuSetupDVB::Setup(void)
Clear();
Add(new cMenuEditIntItem( tr("Setup.DVB$Primary DVB interface"), &data.PrimaryDVB, 1, cDevice::NumDevices()));
Add(new cMenuEditStraItem(tr("Setup.DVB$Standard compliance"), &data.StandardCompliance, 2, standardComplianceTexts));
Add(new cMenuEditBoolItem(tr("Setup.DVB$Video format"), &data.VideoFormat, "4:3", "16:9"));
if (data.VideoFormat == 0)
Add(new cMenuEditStraItem(tr("Setup.DVB$Video display format"), &data.VideoDisplayFormat, 3, videoDisplayFormatTexts));
@ -3222,8 +3186,13 @@ eOSState cMenuSetupPlugins::ProcessKey(eKeys Key)
}
}
}
else if (state == osContinue)
else if (state == osContinue) {
Store();
// Reinitialize OSD and skin, in case any plugin setup change has an influence on these:
cOsdProvider::UpdateOsdSize(true);
SetDisplayMenu();
Display();
}
}
return state;
}
@ -3242,6 +3211,7 @@ public:
cMenuSetup::cMenuSetup(void)
:cOsdMenu("")
{
SetMenuCategory(mcSetup);
Set();
}
@ -3326,6 +3296,7 @@ cOsdObject *cMenuMain::pluginOsdObject = NULL;
cMenuMain::cMenuMain(eOSState State)
:cOsdMenu("")
{
SetMenuCategory(mcMain);
replaying = false;
stopReplayItem = NULL;
cancelEditingItem = NULL;
@ -3394,13 +3365,6 @@ bool cMenuMain::Update(bool Force)
{
bool result = false;
// Title with disk usage:
if (FreeDiskSpace.HasChanged(Force)) {
//XXX -> skin function!!!
SetTitle(cString::sprintf("%s - %s", tr("VDR"), FreeDiskSpace.FreeDiskSpaceString()));
result = true;
}
bool NewReplaying = cControl::Control() != NULL;
if (Force || NewReplaying != replaying) {
replaying = NewReplaying;
@ -4130,6 +4094,8 @@ eOSState cDisplaySubtitleTracks::ProcessKey(eKeys Key)
cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause)
{
// Whatever happens here, the timers will be modified in some way...
Timers.SetModified();
// We're going to manipulate an event here, so we need to prevent
// others from modifying any EPG data:
cSchedulesLock SchedulesLock;
@ -4144,7 +4110,6 @@ cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause)
if (!timer) {
timer = new cTimer(true, Pause);
Timers.Add(timer);
Timers.SetModified();
instantId = cString::sprintf(cDevice::NumDevices() > 1 ? "%s - %d" : "%s", timer->Channel()->Name(), device->CardIndex() + 1);
}
timer->SetPending(true);
@ -4166,9 +4131,8 @@ cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause)
}
else {
Timers.Del(timer);
Timers.SetModified();
if (!cReplayControl::LastReplayed()) // an instant recording, maybe from cRecordControls::PauseLiveVideo()
cReplayControl::SetRecording(fileName, Recording.Name());
cReplayControl::SetRecording(fileName);
}
timer = NULL;
return;
@ -4183,7 +4147,7 @@ cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause)
Recording.WriteInfo();
cStatus::MsgRecording(device, Recording.Name(), Recording.FileName(), true);
if (!Timer && !cReplayControl::LastReplayed()) // an instant recording, maybe from cRecordControls::PauseLiveVideo()
cReplayControl::SetRecording(fileName, Recording.Name());
cReplayControl::SetRecording(fileName);
Recordings.AddByName(fileName);
return;
}
@ -4194,7 +4158,6 @@ cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause)
timer->SetDeferred(DEFERTIMER);
if (!Timer) {
Timers.Del(timer);
Timers.SetModified();
timer = NULL;
}
}
@ -4244,6 +4207,7 @@ void cRecordControl::Stop(bool ExecuteUserCommand)
cStatus::MsgRecording(device, NULL, fileName, false);
if (ExecuteUserCommand)
cRecordingUserCommand::InvokeCommand(RUC_AFTERRECORDING, fileName);
Timers.SetModified();
}
}
@ -4337,7 +4301,7 @@ void cRecordControls::Stop(const char *InstantId)
bool cRecordControls::PauseLiveVideo(void)
{
Skins.Message(mtStatus, tr("Pausing live video..."));
cReplayControl::SetRecording(NULL, NULL); // make sure the new cRecordControl will set cReplayControl::LastReplayed()
cReplayControl::SetRecording(NULL); // make sure the new cRecordControl will set cReplayControl::LastReplayed()
if (Start(NULL, true)) {
cReplayControl *rc = new cReplayControl(true);
cControl::Launch(rc);
@ -4373,6 +4337,15 @@ cRecordControl *cRecordControls::GetRecordControl(const char *FileName)
return NULL;
}
cRecordControl *cRecordControls::GetRecordControl(const cTimer *Timer)
{
for (int i = 0; i < MAXRECORDCONTROLS; i++) {
if (RecordControls[i] && RecordControls[i]->Timer() == Timer)
return RecordControls[i];
}
return NULL;
}
void cRecordControls::Process(time_t t)
{
for (int i = 0; i < MAXRECORDCONTROLS; i++) {
@ -4429,8 +4402,7 @@ bool cRecordControls::StateChanged(int &State)
// --- cReplayControl --------------------------------------------------------
cReplayControl *cReplayControl::currentReplayControl = NULL;
char *cReplayControl::fileName = NULL;
char *cReplayControl::title = NULL;
cString cReplayControl::fileName;
cReplayControl::cReplayControl(bool PauseLive)
:cDvbPlayerControl(fileName, PauseLive)
@ -4460,7 +4432,7 @@ cReplayControl::~cReplayControl()
void cReplayControl::Stop(void)
{
if (Setup.DelTimeshiftRec && fileName) {
if (Setup.DelTimeshiftRec && *fileName) {
cRecordControl* rc = cRecordControls::GetRecordControl(fileName);
if (rc && rc->InstantId()) {
if (Active()) {
@ -4473,7 +4445,7 @@ void cReplayControl::Stop(void)
Timers.SetModified();
}
cDvbPlayerControl::Stop();
cRecording *recording = Recordings.GetByName(fileName);;
cRecording *recording = Recordings.GetByName(fileName);
if (recording) {
if (recording->Delete()) {
Recordings.DelByName(fileName);
@ -4490,17 +4462,14 @@ void cReplayControl::Stop(void)
cDvbPlayerControl::Stop();
}
void cReplayControl::SetRecording(const char *FileName, const char *Title)
void cReplayControl::SetRecording(const char *FileName)
{
free(fileName);
free(title);
fileName = FileName ? strdup(FileName) : NULL;
title = Title ? strdup(Title) : NULL;
fileName = FileName;
}
const char *cReplayControl::NowReplaying(void)
{
return currentReplayControl ? fileName : NULL;
return currentReplayControl ? *fileName : NULL;
}
const char *cReplayControl::LastReplayed(void)
@ -4510,10 +4479,8 @@ const char *cReplayControl::LastReplayed(void)
void cReplayControl::ClearLastReplayed(const char *FileName)
{
if (fileName && FileName && strcmp(fileName, FileName) == 0) {
free(fileName);
if (*fileName && FileName && strcmp(fileName, FileName) == 0)
fileName = NULL;
}
}
void cReplayControl::ShowTimed(int Seconds)
@ -4585,8 +4552,10 @@ bool cReplayControl::ShowProgress(bool Initial)
visible = true;
}
if (Initial) {
if (title)
displayReplay->SetTitle(title);
if (*fileName) {
if (cRecording *Recording = Recordings.GetByName(fileName))
displayReplay->SetRecording(Recording);
}
lastCurrent = lastTotal = -1;
}
if (Current != lastCurrent || Total != lastTotal) {
@ -4758,7 +4727,7 @@ void cReplayControl::MarkMove(bool Forward)
void cReplayControl::EditCut(void)
{
if (fileName) {
if (*fileName) {
Hide();
if (!cCutter::Active()) {
if (!marks.Count())
@ -4800,6 +4769,13 @@ cOsdObject *cReplayControl::GetInfo(void)
return NULL;
}
const cRecording *cReplayControl::GetRecording(void)
{
if (const cRecording *Recording = Recordings.GetByName(LastReplayed()))
return Recording;
return NULL;
}
eOSState cReplayControl::ProcessKey(eKeys Key)
{
if (!Active())

12
menu.h

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.h 2.5 2012/03/08 13:11:40 kls Exp $
* $Id: menu.h 2.9 2012/05/12 11:48:04 kls Exp $
*/
#ifndef __MENU_H
@ -196,7 +196,6 @@ private:
int level;
int recordingsState;
int helpKeys;
bool SetFreeDiskDisplay(bool Force = false);
void SetHelpKeys(void);
void Set(bool Refresh = false);
bool Open(bool OpenSubMenus = false);
@ -243,6 +242,9 @@ public:
static bool PauseLiveVideo(void);
static const char *GetInstantId(const char *LastInstantId);
static cRecordControl *GetRecordControl(const char *FileName);
static cRecordControl *GetRecordControl(const cTimer *Timer);
///< Returns the cRecordControl for the given Timer.
///< If there is no cRecordControl for Timer, NULL is returned.
static void Process(time_t t);
static void ChannelDataModified(cChannel *Channel);
static bool Active(void);
@ -267,8 +269,7 @@ private:
void TimeSearch(void);
void ShowTimed(int Seconds = 0);
static cReplayControl *currentReplayControl;
static char *fileName;
static char *title;
static cString fileName;
void ShowMode(void);
bool ShowProgress(bool Initial);
void MarkToggle(void);
@ -281,11 +282,12 @@ public:
virtual ~cReplayControl();
void Stop(void);
virtual cOsdObject *GetInfo(void);
virtual const cRecording *GetRecording(void);
virtual eOSState ProcessKey(eKeys Key);
virtual void Show(void);
virtual void Hide(void);
bool Visible(void) { return visible; }
static void SetRecording(const char *FileName, const char *Title);
static void SetRecording(const char *FileName);
static const char *NowReplaying(void);
static const char *LastReplayed(void);
static void ClearLastReplayed(const char *FileName);

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menuitems.c 2.13 2012/03/13 11:21:57 kls Exp $
* $Id: menuitems.c 2.14 2012/04/08 11:20:37 kls Exp $
*/
#include "menuitems.h"
@ -1126,6 +1126,7 @@ eOSState cMenuEditMapItem::ProcessKey(eKeys Key)
cMenuSetupPage::cMenuSetupPage(void)
:cOsdMenu("", 33)
{
SetMenuCategory(mcSetup);
plugin = NULL;
}

38
osd.c

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osd.c 2.27 2012/03/05 10:28:01 kls Exp $
* $Id: osd.c 2.31 2012/06/02 13:32:38 kls Exp $
*/
#include "osd.h"
@ -40,6 +40,16 @@ tColor HsvToColor(double H, double S, double V)
}
}
tColor RgbShade(tColor Color, double Factor)
{
double f = fabs(constrain(Factor, -1.0, 1.0));
double w = Factor > 0 ? f * 0xFF : 0;
return (Color & 0xFF000000) |
(min(0xFF, int((1 - f) * ((Color >> 16) & 0xFF) + w + 0.5)) << 16) |
(min(0xFF, int((1 - f) * ((Color >> 8) & 0xFF) + w + 0.5)) << 8) |
(min(0xFF, int((1 - f) * ( Color & 0xFF) + w + 0.5)) );
}
#define USE_ALPHA_LUT
#ifdef USE_ALPHA_LUT
// Alpha blending with lookup table (by Reinhard Nissl <rnissl@gmx.de>)
@ -553,11 +563,15 @@ void cBitmap::DrawText(int x, int y, const char *s, tColor ColorFg, tColor Color
if (Width || Height) {
limit = x + cw - x0;
if (Width) {
if ((Alignment & taLeft) != 0)
;
if ((Alignment & taLeft) != 0) {
if ((Alignment & taBorder) != 0)
x += max(h / TEXT_ALIGN_BORDER, 1);
}
else if ((Alignment & taRight) != 0) {
if (w < Width)
x += Width - w;
if ((Alignment & taBorder) != 0)
x -= max(h / TEXT_ALIGN_BORDER, 1);
}
else { // taCentered
if (w < Width)
@ -1280,11 +1294,15 @@ void cPixmapMemory::DrawText(const cPoint &Point, const char *s, tColor ColorFg,
if (Width || Height) {
limit = x + cw;
if (Width) {
if ((Alignment & taLeft) != 0)
;
if ((Alignment & taLeft) != 0) {
if ((Alignment & taBorder) != 0)
x += max(h / TEXT_ALIGN_BORDER, 1);
}
else if ((Alignment & taRight) != 0) {
if (w < Width)
x += Width - w;
if ((Alignment & taBorder) != 0)
x -= max(h / TEXT_ALIGN_BORDER, 1);
}
else { // taCentered
if (w < Width)
@ -1382,10 +1400,10 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
case 0:
case 6: DrawRectangle(cRect(cx - x, cy - y, 2 * x + 1, 1), Color); if (Quadrants == 6) break;
case 8: DrawRectangle(cRect(cx - x, cy + y, 2 * x + 1, 1), Color); break;
case -1: DrawRectangle(cRect(cx + x, cy - y, x2 - x + 1, 1), Color); break;
case -1: DrawRectangle(cRect(cx + x, cy - y, rx - x + 1, 1), Color); break;
case -2: DrawRectangle(cRect(x1, cy - y, cx - x - x1 + 1, 1), Color); break;
case -3: DrawRectangle(cRect(x1, cy + y, cx - x - x1 + 1, 1), Color); break;
case -4: DrawRectangle(cRect(cx + x, cy + y, x2 - x + 1, 1), Color); break;
case -4: DrawRectangle(cRect(cx + x, cy + y, rx - x + 1, 1), Color); break;
default: ;
}
y++;
@ -1417,10 +1435,10 @@ void cPixmapMemory::DrawEllipse(const cRect &Rect, tColor Color, int Quadrants)
case 0:
case 6: DrawRectangle(cRect(cx - x, cy - y, 2 * x + 1, 1), Color); if (Quadrants == 6) break;
case 8: DrawRectangle(cRect(cx - x, cy + y, 2 * x + 1, 1), Color); break;
case -1: DrawRectangle(cRect(cx + x, cy - y, x2 - x + 1, 1), Color); break;
case -1: DrawRectangle(cRect(cx + x, cy - y, rx - x + 1, 1), Color); break;
case -2: DrawRectangle(cRect(x1, cy - y, cx - x - x1 + 1, 1), Color); break;
case -3: DrawRectangle(cRect(x1, cy + y, cx - x - x1 + 1, 1), Color); break;
case -4: DrawRectangle(cRect(cx + x, cy + y, x2 - x + 1, 1), Color); break;
case -4: DrawRectangle(cRect(cx + x, cy + y, rx - x + 1, 1), Color); break;
default: ;
}
x++;
@ -1988,7 +2006,7 @@ void cOsdProvider::UpdateOsdSize(bool Force)
Setup.FontSmlSize = int(round(Height * Setup.FontSmlSizeP));
cFont::SetFont(fontOsd, Setup.FontOsd, Setup.FontOsdSize);
cFont::SetFont(fontFix, Setup.FontFix, Setup.FontFixSize);
cFont::SetFont(fontSml, Setup.FontSml, Setup.FontSmlSize);
cFont::SetFont(fontSml, Setup.FontSml, min(Setup.FontSmlSize, Setup.FontOsdSize));
oldWidth = Width;
oldHeight = Height;
oldAspect = Aspect;

12
osd.h

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osd.h 2.15 2011/12/04 13:38:17 kls Exp $
* $Id: osd.h 2.17 2012/06/02 10:32:38 kls Exp $
*/
#ifndef __OSD_H
@ -25,6 +25,7 @@
#define ALPHA_TRANSPARENT 0x00
#define ALPHA_OPAQUE 0xFF
#define IS_OPAQUE(c) ((c >> 24) == ALPHA_OPAQUE)
#define TEXT_ALIGN_BORDER 10 // fraction of the font height used for sizing border
enum {
//AARRGGBB
@ -69,6 +70,14 @@ inline tColor RgbToColor(double R, double G, double B)
return RgbToColor(uint8_t(0xFF * R), uint8_t(0xFF * G), uint8_t(0xFF * B));
}
tColor RgbShade(tColor Color, double Factor);
///< Returns a brighter (Factor > 0) or darker (Factor < 0) version
///< of the given Color.
///< If Factor is 0.0, the return value is the unchanged Color,
///< If Factor is 1.0, white is returned.
///< If Factor is -1.0, black is returned.
///< The alpha value of Color is returned unchanged.
tColor HsvToColor(double H, double S, double V);
///< Converts the given Hue (0..360), Saturation (0..1) and Value (0..1)
///< to an RGB tColor value. The alpha value of the result is 0x00, so
@ -151,6 +160,7 @@ enum eTextAlignment { taCenter = 0x00,
taRight = 0x02,
taTop = 0x04,
taBottom = 0x08,
taBorder = 0x10, // keeps some distance from the left or right alignment edge
taDefault = taTop | taLeft
};

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osdbase.c 2.4 2012/03/02 15:49:57 kls Exp $
* $Id: osdbase.c 2.6 2012/04/23 09:41:22 kls Exp $
*/
#include "osdbase.h"
@ -72,14 +72,15 @@ void cOsdObject::Show(void)
cSkinDisplayMenu *cOsdMenu::displayMenu = NULL;
int cOsdMenu::displayMenuCount = 0;
int cOsdMenu::displayMenuItems = 0;//XXX dynamic???
cOsdMenu::cOsdMenu(const char *Title, int c0, int c1, int c2, int c3, int c4)
{
isMenu = true;
digit = 0;
hasHotkeys = false;
displayMenuItems = 0;
title = NULL;
menuCategory = mcUnknown;
SetTitle(Title);
SetCols(c0, c1, c2, c3, c4);
first = 0;
@ -103,6 +104,11 @@ cOsdMenu::~cOsdMenu()
DELETENULL(displayMenu);
}
void cOsdMenu::SetMenuCategory(eMenuCategory MenuCategory)
{
menuCategory = MenuCategory;
}
void cOsdMenu::SetDisplayMenu(void)
{
if (displayMenu) {
@ -110,7 +116,6 @@ void cOsdMenu::SetDisplayMenu(void)
delete displayMenu;
}
displayMenu = Skins.Current()->DisplayMenu();
displayMenuItems = displayMenu->MaxItems();
}
const char *cOsdMenu::hk(const char *s)
@ -212,6 +217,9 @@ void cOsdMenu::Display(void)
displayMenu->SetMessage(mtStatus, NULL);
displayMenu->Clear();
cStatus::MsgOsdClear();
if (menuCategory != displayMenu->MenuCategory())
displayMenu->SetMenuCategory(menuCategory);
displayMenuItems = displayMenu->MaxItems();
displayMenu->SetTabs(cols[0], cols[1], cols[2], cols[3], cols[4]);//XXX
displayMenu->SetTitle(title);
cStatus::MsgOsdTitle(title);

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: osdbase.h 2.2 2012/03/02 15:49:57 kls Exp $
* $Id: osdbase.h 2.4 2012/04/23 09:40:07 kls Exp $
*/
#ifndef __OSDBASE_H
@ -86,10 +86,11 @@ class cOsdMenu : public cOsdObject, public cList<cOsdItem> {
private:
static cSkinDisplayMenu *displayMenu;
static int displayMenuCount;
static int displayMenuItems;
int displayMenuItems;
char *title;
int cols[cSkinDisplayMenu::MaxTabs];
int first, current, marked;
eMenuCategory menuCategory;
cOsdMenu *subMenu;
const char *helpRed, *helpGreen, *helpYellow, *helpBlue;
bool helpDisplayed;
@ -128,6 +129,7 @@ public:
cOsdMenu(const char *Title, int c0 = 0, int c1 = 0, int c2 = 0, int c3 = 0, int c4 = 0);
virtual ~cOsdMenu();
virtual bool NeedsFastResponse(void) { return subMenu ? subMenu->NeedsFastResponse() : cOsdObject::NeedsFastResponse(); }
void SetMenuCategory(eMenuCategory MenuCategory);
int Current(void) const { return current; }
void Add(cOsdItem *Item, bool Current = false, cOsdItem *After = NULL);
void Ins(cOsdItem *Item, bool Current = false, cOsdItem *Before = NULL);

68
pat.c

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: pat.c 2.17 2012/03/02 10:56:45 kls Exp $
* $Id: pat.c 2.18 2012/04/15 09:54:53 kls Exp $
*/
#include "pat.h"
@ -456,37 +456,47 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
}
break;
case 0x80: // STREAMTYPE_USER_PRIVATE - DigiCipher II VIDEO (ANSI/SCTE 57)
Vpid = esPid;
Ppid = pmt.getPCRPid();
Vtype = 0x02; // compression based upon MPEG-2
ProcessCaDescriptors = true;
break;
case 0x81: // STREAMTYPE_USER_PRIVATE - ATSC A/53 AUDIO (ANSI/SCTE 57)
{
char lang[MAXLANGCODE1] = { 0 };
SI::Descriptor *d;
for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) {
switch (d->getDescriptorTag()) {
case SI::ISO639LanguageDescriptorTag: {
SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
strn0cpy(lang, I18nNormalizeLanguageCode(ld->languageCode), MAXLANGCODE1);
}
break;
default: ;
case 0x80: // STREAMTYPE_USER_PRIVATE
if (Setup.StandardCompliance == STANDARD_ANSISCTE) { // DigiCipher II VIDEO (ANSI/SCTE 57)
Vpid = esPid;
Ppid = pmt.getPCRPid();
Vtype = 0x02; // compression based upon MPEG-2
ProcessCaDescriptors = true;
break;
}
// fall through
case 0x81: // STREAMTYPE_USER_PRIVATE
if (Setup.StandardCompliance == STANDARD_ANSISCTE) { // ATSC A/53 AUDIO (ANSI/SCTE 57)
char lang[MAXLANGCODE1] = { 0 };
SI::Descriptor *d;
for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) {
switch (d->getDescriptorTag()) {
case SI::ISO639LanguageDescriptorTag: {
SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
strn0cpy(lang, I18nNormalizeLanguageCode(ld->languageCode), MAXLANGCODE1);
}
break;
default: ;
}
delete d;
}
delete d;
if (NumDpids < MAXDPIDS) {
Dpids[NumDpids] = esPid;
Dtypes[NumDpids] = SI::AC3DescriptorTag;
strn0cpy(DLangs[NumDpids], lang, MAXLANGCODE1);
NumDpids++;
}
ProcessCaDescriptors = true;
break;
}
if (NumDpids < MAXDPIDS) {
Dpids[NumDpids] = esPid;
Dtypes[NumDpids] = SI::AC3DescriptorTag;
strn0cpy(DLangs[NumDpids], lang, MAXLANGCODE1);
NumDpids++;
// fall through
case 0x82: // STREAMTYPE_USER_PRIVATE
if (Setup.StandardCompliance == STANDARD_ANSISCTE) { // STANDARD SUBTITLE (ANSI/SCTE 27)
//TODO
break;
}
ProcessCaDescriptors = true;
}
break;
case 0x82 ... 0xFF: // STREAMTYPE_USER_PRIVATE
// fall through
case 0x83 ... 0xFF: // STREAMTYPE_USER_PRIVATE
{
char lang[MAXLANGCODE1] = { 0 };
bool IsAc3 = false;

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: player.c 2.0 2007/07/20 15:25:24 kls Exp $
* $Id: player.c 2.2 2012/04/28 11:52:50 kls Exp $
*/
#include "player.h"
@ -60,10 +60,20 @@ cOsdObject *cControl::GetInfo(void)
return NULL;
}
cControl *cControl::Control(void)
const cRecording *cControl::GetRecording(void)
{
return NULL;
}
cString cControl::GetHeader(void)
{
return "";
}
cControl *cControl::Control(bool Hidden)
{
cMutexLock MutexLock(&mutex);
return (control && !control->hidden) ? control : NULL;
return (control && (!control->hidden || Hidden)) ? control : NULL;
}
void cControl::Launch(cControl *Control)

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: player.h 2.4 2009/03/08 12:29:10 kls Exp $
* $Id: player.h 2.6 2012/04/28 13:04:17 kls Exp $
*/
#ifndef __PLAYER_H
@ -86,13 +86,28 @@ public:
virtual ~cControl();
virtual void Hide(void) = 0;
virtual cOsdObject *GetInfo(void);
///< Returns an OSD object that displays information about the currently
///< played programme. If no such information is available, NULL will be
///< returned.
virtual const cRecording *GetRecording(void);
///< Returns the cRecording that is currently being replayed, or NULL if
///< this player is not playing a cRecording.
virtual cString GetHeader(void);
///< This can be used by players that don't play a cRecording, but rather
///< do something completely different. The resulting string may be used by
///< skins as a last resort, in case they want to display the state of the
///< current player. The return value is expected to be a short, single line
///< string. The default implementation returns an empty string.
double FramesPerSecond(void) { return player->FramesPerSecond(); }
bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false) { return player->GetIndex(Current, Total, SnapToIFrame); }
bool GetReplayMode(bool &Play, bool &Forward, int &Speed) { return player->GetReplayMode(Play, Forward, Speed); }
static void Launch(cControl *Control);
static void Attach(void);
static void Shutdown(void);
static cControl *Control(void);
static cControl *Control(bool Hidden = false);
///< Returns the current replay control (if any) in case it is currently
///< visible. If Hidden is true, the control will be returned even if it is
///< currently hidden.
};
#endif //__PLAYER_H

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-10-16 11:16-0400\n"
"Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n"
"Language-Team: Arabic <ar@li.org>\n"
@ -517,12 +517,6 @@ msgstr "المستخدم 8"
msgid "Key$User9"
msgstr "المستخدم 9"
msgid "Disk"
msgstr "القرص الصلب"
msgid "free"
msgstr "مساحة حرة"
msgid "Free To Air"
msgstr "غير مشفر"
@ -944,6 +938,9 @@ msgstr "الترجمة"
msgid "Setup.DVB$Primary DVB interface"
msgstr "كرت الستالايت الاولى"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "نوع الفيديو "
@ -1174,9 +1171,6 @@ msgstr " ايقاف التسجيل "
msgid "Schedule"
msgstr "جدولة"
msgid "VDR"
msgstr ""
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " ايقاف الاعادة"
@ -1307,6 +1301,24 @@ msgstr "الصوت "
msgid "Classic VDR"
msgstr "VDR تقليدى "
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG شاشة "
@ -1370,3 +1382,9 @@ msgstr "اضغط اى زر لالغاء اعادة التشغيل"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "البرنامج سيقوم بالاغلاق بعد%s دقيقة "
msgid "Disk"
msgstr "القرص الصلب"
msgid "free"
msgstr "مساحة حرة"

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Catalan <vdr@linuxtv.org>\n"
@ -512,12 +512,6 @@ msgstr "Usuari 8"
msgid "Key$User9"
msgstr "Usuari 9"
msgid "Disk"
msgstr "Disc"
msgid "free"
msgstr "lliure"
msgid "Free To Air"
msgstr "No codificat"
@ -926,6 +920,9 @@ msgstr "Subt
msgid "Setup.DVB$Primary DVB interface"
msgstr "Tarja DVB primària"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Format del vídeo"
@ -1150,9 +1147,6 @@ msgstr " Aturar la gravaci
msgid "Schedule"
msgstr "Guia de Programació"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Aturar la reproducció"
@ -1282,6 +1276,24 @@ msgstr "Volum "
msgid "Classic VDR"
msgstr "VDR clasico"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "Quadres ST:TNG"
@ -1344,3 +1356,9 @@ msgstr "Prem qualsevol tecla per cancel
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR s'apagarà en %s minuts"
msgid "Disk"
msgstr "Disc"
msgid "free"
msgstr "lliure"

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2010-05-06 11:00+0200\n"
"Last-Translator: Radek Šťastný <dedkus@gmail.com>\n"
"Language-Team: Czech <vdr@linuxtv.org>\n"
@ -511,12 +511,6 @@ msgstr "Uživatel8"
msgid "Key$User9"
msgstr "Uživatel9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "volno"
msgid "Free To Air"
msgstr "volný"
@ -925,6 +919,9 @@ msgstr "Titulky"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Primární DVB zařízení"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Formát videa"
@ -1149,9 +1146,6 @@ msgstr " Zastavit nahrávání "
msgid "Schedule"
msgstr "Program (EPG)"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Zastavit přehrávání"
@ -1281,6 +1275,24 @@ msgstr "Hlasitost "
msgid "Classic VDR"
msgstr "Klasické VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG konzola"
@ -1343,3 +1355,9 @@ msgstr "Jakákoliv klávesa zruší restart"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR se vypne za %s minut"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "volno"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
"Language-Team: Danish <vdr@linuxtv.org>\n"
@ -509,12 +509,6 @@ msgstr "Bruger8"
msgid "Key$User9"
msgstr "Bruger9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "fri"
msgid "Free To Air"
msgstr "Free To Air"
@ -923,6 +917,9 @@ msgstr "Undertekster"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Primær DVB enhed"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Video format"
@ -1147,9 +1144,6 @@ msgstr " Stop optagelse "
msgid "Schedule"
msgstr "Programoversigt"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Stop afspilning"
@ -1279,6 +1273,24 @@ msgstr "Lydstyrke "
msgid "Classic VDR"
msgstr "Klassisk VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG konsol"
@ -1341,3 +1353,9 @@ msgstr "Tryk vilk
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR slukker om %s minutter"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "fri"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2010-01-16 16:46+0100\n"
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n"
@ -509,12 +509,6 @@ msgstr "Benutzer8"
msgid "Key$User9"
msgstr "Benutzer9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "frei"
msgid "Free To Air"
msgstr "frei empfangbar"
@ -923,6 +917,9 @@ msgstr "Untertitel"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Primäres DVB-Interface"
msgid "Setup.DVB$Standard compliance"
msgstr "Standardkonformität"
msgid "Setup.DVB$Video format"
msgstr "Videoformat"
@ -1147,9 +1144,6 @@ msgstr " Aufzeichnung beenden "
msgid "Schedule"
msgstr "Programm"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Wiedergabe beenden"
@ -1279,6 +1273,24 @@ msgstr "Lautst
msgid "Classic VDR"
msgstr "Klassischer VDR"
msgid "DISK"
msgstr "PLATTE"
msgid "LOAD"
msgstr "LAST"
msgid "TIMERS"
msgstr "TIMER"
msgid "DEVICES"
msgstr "EMPFÄNGER"
msgid "LIVE"
msgstr "LIVE"
msgid "PLAY"
msgstr "WIEDERGABE"
msgid "ST:TNG Panels"
msgstr "ST:TNG-Konsolen"
@ -1341,3 +1353,9 @@ msgstr "Taste dr
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR wird in %s Minuten abgeschaltet"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "frei"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
"Language-Team: Greek <vdr@linuxtv.org>\n"
@ -509,12 +509,6 @@ msgstr ""
msgid "Key$User9"
msgstr ""
msgid "Disk"
msgstr "Äßóêïò"
msgid "free"
msgstr "Åëåýèåñïò"
msgid "Free To Air"
msgstr ""
@ -923,6 +917,9 @@ msgstr ""
msgid "Setup.DVB$Primary DVB interface"
msgstr "Êýñéá DVB êÜñôá"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "ÌïñöÞ ïèüíçò"
@ -1147,9 +1144,6 @@ msgstr "
msgid "Schedule"
msgstr "Ðñüãñáììá"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " ÔÝëïò áíáðáñáãùãÞò"
@ -1279,6 +1273,24 @@ msgstr "
msgid "Classic VDR"
msgstr "Êëáóéêü VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ÌïñöÝò ST:TNG"
@ -1341,3 +1353,9 @@ msgstr ""
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr ""
msgid "Disk"
msgstr "Äßóêïò"
msgid "free"
msgstr "Åëåýèåñïò"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n"
@ -510,12 +510,6 @@ msgstr "Usuario 8"
msgid "Key$User9"
msgstr "Usuario 9"
msgid "Disk"
msgstr "Disco"
msgid "free"
msgstr "libre"
msgid "Free To Air"
msgstr "en abierto"
@ -924,6 +918,9 @@ msgstr "Subt
msgid "Setup.DVB$Primary DVB interface"
msgstr "Interfaz DVB primario"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Formato de vídeo"
@ -1148,9 +1145,6 @@ msgstr " Parar grabaci
msgid "Schedule"
msgstr "Guía de Programación"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Parar reprodución"
@ -1280,6 +1274,24 @@ msgstr "Volumen "
msgid "Classic VDR"
msgstr "VDR clásico"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "Paneles ST:TNG"
@ -1342,3 +1354,9 @@ msgstr "Pulse cualquier tecla para cancelar reinicio"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR se apagará en %s minutos"
msgid "Disk"
msgstr "Disco"
msgid "free"
msgstr "libre"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
@ -509,12 +509,6 @@ msgstr "Lisaklahv8"
msgid "Key$User9"
msgstr "Lisaklahv9"
msgid "Disk"
msgstr "Ketas"
msgid "free"
msgstr "vaba"
msgid "Free To Air"
msgstr "FTA"
@ -923,6 +917,9 @@ msgstr "Subtiitrid"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Esmane DVB seade"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "TV külgsuhe"
@ -1147,9 +1144,6 @@ msgstr " Lõpetada salvestamine "
msgid "Schedule"
msgstr "Kava"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Lõpetada taasesitamine"
@ -1279,6 +1273,24 @@ msgstr "Helitugevus "
msgid "Classic VDR"
msgstr "Classic VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG Panels"
@ -1341,3 +1353,9 @@ msgstr "Restardi katkestamiseks vajuta suvalist klahvi"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR lülitub välja %s minuti pärast"
msgid "Disk"
msgstr "Ketas"
msgid "free"
msgstr "vaba"

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2007-08-15 15:52+0200\n"
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n"
@ -512,12 +512,6 @@ msgstr "Lisänäppäin 8"
msgid "Key$User9"
msgstr "Lisänäppäin 9"
msgid "Disk"
msgstr "Levy"
msgid "free"
msgstr "vapaana"
msgid "Free To Air"
msgstr "vapaa"
@ -926,6 +920,9 @@ msgstr "Tekstitys"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Ensisijainen DVB-sovitin"
msgid "Setup.DVB$Standard compliance"
msgstr "Noudatettava standardi"
msgid "Setup.DVB$Video format"
msgstr "Kuvasuhde"
@ -1150,9 +1147,6 @@ msgstr " Lopeta tallennus "
msgid "Schedule"
msgstr "Ohjelmisto"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Lopeta toisto"
@ -1282,6 +1276,24 @@ msgstr "Äänenvoimakkuus "
msgid "Classic VDR"
msgstr "Klassinen VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG konsoli"
@ -1344,3 +1356,9 @@ msgstr "Peru uudelleenkäynnistys painamalla mitä tahansa näppäintä"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR sammuu %s minuutin kuluttua"
msgid "Disk"
msgstr "Levy"
msgid "free"
msgstr "vapaana"

@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-02-27 18:14+0100\n"
"Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n"
"Language-Team: French <vdr@linuxtv.org>\n"
@ -515,12 +515,6 @@ msgstr "Utilisateur8"
msgid "Key$User9"
msgstr "Utilisateur9"
msgid "Disk"
msgstr "Disque"
msgid "free"
msgstr "restant"
msgid "Free To Air"
msgstr "En clair"
@ -929,6 +923,9 @@ msgstr "Sous-titres"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Carte DVB primaire"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Format vidéo"
@ -1153,9 +1150,6 @@ msgstr " Arr
msgid "Schedule"
msgstr "Programmes"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Arrêter la lecture"
@ -1285,6 +1279,24 @@ msgstr "Volume "
msgid "Classic VDR"
msgstr "VDR classique"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "Consoles ST:TNG"
@ -1347,3 +1359,9 @@ msgstr "Appuyer sur une touche pour annuler le red
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR s'arrêtera dans %s minutes"
msgid "Disk"
msgstr "Disque"
msgid "free"
msgstr "restant"

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-03-17 19:00+0100\n"
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
"Language-Team: Croatian <vdr@linuxtv.org>\n"
@ -511,12 +511,6 @@ msgstr "Korisnik8"
msgid "Key$User9"
msgstr "Korisnik9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "slobodno"
msgid "Free To Air"
msgstr "Slobodno"
@ -925,6 +919,9 @@ msgstr "Titlovi"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Primarni DVB ureðaj"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Video format"
@ -1149,9 +1146,6 @@ msgstr " Prekini snimanje "
msgid "Schedule"
msgstr "Raspored"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Prekini reprodukciju"
@ -1281,6 +1275,24 @@ msgstr "Glasno
msgid "Classic VDR"
msgstr "Klasièni VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG Panele"
@ -1343,3 +1355,9 @@ msgstr "Pritisnite jednu tipku za poni
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR æe se iskljuèiti za %s minuta"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "slobodno"

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2012-01-02 11:54+0200\n"
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
@ -512,12 +512,6 @@ msgstr "Felhaszn
msgid "Key$User9"
msgstr "Felhasználó9"
msgid "Disk"
msgstr "Lemez"
msgid "free"
msgstr "szabad"
msgid "Free To Air"
msgstr "Kódolatlan"
@ -926,6 +920,9 @@ msgstr "Feliratok"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Elsõ DVB interface"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Video formátum"
@ -1151,9 +1148,6 @@ msgstr " Felv
msgid "Schedule"
msgstr "Mûsorújság"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Lejátszást befejzni"
@ -1283,6 +1277,24 @@ msgstr "Hanger
msgid "Classic VDR"
msgstr "Klasszikus VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG Konzol"
@ -1345,3 +1357,9 @@ msgstr "Nyomj egy gombot az
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "A VDR leáll %s perc múlva"
msgid "Disk"
msgstr "Lemez"
msgid "free"
msgstr "szabad"

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2012-03-19 01:08+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n"
@ -516,12 +516,6 @@ msgstr "Utente8"
msgid "Key$User9"
msgstr "Utente9"
msgid "Disk"
msgstr "Disco"
msgid "free"
msgstr "disponibili"
msgid "Free To Air"
msgstr "in chiaro"
@ -930,6 +924,9 @@ msgstr "Sottotitoli"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Scheda DVB primaria"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Formato video"
@ -1154,9 +1151,6 @@ msgstr " Ferma registrazione "
msgid "Schedule"
msgstr "Programmi"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Ferma riproduzione"
@ -1286,6 +1280,24 @@ msgstr "Volume "
msgid "Classic VDR"
msgstr "VDR Classico"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "Consolle ST:TNG"
@ -1348,3 +1360,9 @@ msgstr "Premi un tasto per annullare il riavvio"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR si spegnerà tra %s minuti"
msgid "Disk"
msgstr "Disco"
msgid "free"
msgstr "disponibili"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.16\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2010-10-30 11:55+0200\n"
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
@ -509,12 +509,6 @@ msgstr "Vartotojas8"
msgid "Key$User9"
msgstr "Vartotojas9"
msgid "Disk"
msgstr "Diskas"
msgid "free"
msgstr "laisva"
msgid "Free To Air"
msgstr "Nekoduotas kanalas"
@ -923,6 +917,9 @@ msgstr "Subtitrai"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Pirminiė DVB įvestis"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Video formatas"
@ -1147,9 +1144,6 @@ msgstr " Sustabdyti įrašinėjimą "
msgid "Schedule"
msgstr "Programa"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Sustabdyti kartojimą"
@ -1279,6 +1273,24 @@ msgstr "Garsas "
msgid "Classic VDR"
msgstr "Klasikinis VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG Skydeliai"
@ -1341,3 +1353,9 @@ msgstr "Paspauskit bet kurį mygtuką kad sustabdytumėte perkrovimą"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR išsijungs per %s minutes"
msgid "Disk"
msgstr "Diskas"
msgid "free"
msgstr "laisva"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR-1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2010-03-11 00:54+0100\n"
"Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n"
"Language-Team: Macedonian <en@li.org>\n"
@ -510,12 +510,6 @@ msgstr "Корисник8"
msgid "Key$User9"
msgstr "Корисник9"
msgid "Disk"
msgstr "Диск"
msgid "free"
msgstr "слободен"
msgid "Free To Air"
msgstr "Слободно"
@ -924,6 +918,9 @@ msgstr "Титл"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Примарен DVB уред"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Видео формат"
@ -1148,9 +1145,6 @@ msgstr " Запри снимање "
msgid "Schedule"
msgstr "Распоред"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Запри пуштање"
@ -1280,6 +1274,24 @@ msgstr "Глас"
msgid "Classic VDR"
msgstr "Класичен VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG Панели"
@ -1342,3 +1354,9 @@ msgstr "Притиснете копче за откажување на рест
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR ќе се исклучи за %s минути"
msgid "Disk"
msgstr "Диск"
msgid "free"
msgstr "слободен"

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-02-26 17:20+0100\n"
"Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n"
"Language-Team: Dutch <vdr@linuxtv.org>\n"
@ -513,12 +513,6 @@ msgstr "Gebruiker8"
msgid "Key$User9"
msgstr "Gebruiker9"
msgid "Disk"
msgstr "Schijf"
msgid "free"
msgstr "vrij"
msgid "Free To Air"
msgstr "Vrij te ontvangen"
@ -927,6 +921,9 @@ msgstr "Ondertiteling"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Eerste DVB kaart"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Videoformaat"
@ -1151,9 +1148,6 @@ msgstr " Stop opnemen "
msgid "Schedule"
msgstr "Programmagids"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Stop afspelen"
@ -1283,6 +1277,24 @@ msgstr "Volume "
msgid "Classic VDR"
msgstr "VDR Klassiek"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG Consoles"
@ -1345,3 +1357,9 @@ msgstr "Druk een willekeurige toets om herstarten af te breken"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR zal na %s minuten uitschakelen"
msgid "Disk"
msgstr "Schijf"
msgid "free"
msgstr "vrij"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
@ -510,12 +510,6 @@ msgstr ""
msgid "Key$User9"
msgstr ""
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "ledig"
msgid "Free To Air"
msgstr ""
@ -924,6 +918,9 @@ msgstr ""
msgid "Setup.DVB$Primary DVB interface"
msgstr "Hoved DVB-enhet"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "TV-Format"
@ -1148,9 +1145,6 @@ msgstr " Stopp opptak fra "
msgid "Schedule"
msgstr "Programmer"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Stopp avspilling"
@ -1280,6 +1274,24 @@ msgstr "Volum "
msgid "Classic VDR"
msgstr ""
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr ""
@ -1342,3 +1354,9 @@ msgstr ""
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr ""
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "ledig"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-03-09 12:59+0100\n"
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
"Language-Team: Polish <vdr@linuxtv.org>\n"
@ -510,12 +510,6 @@ msgstr "U
msgid "Key$User9"
msgstr "U¿ytkownik 9"
msgid "Disk"
msgstr "Dysk"
msgid "free"
msgstr "wolnego"
msgid "Free To Air"
msgstr "nieszyfrowany"
@ -924,6 +918,9 @@ msgstr "Napisy"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Pierwszy interfejs DVB"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Format obrazu"
@ -1148,9 +1145,6 @@ msgstr " Zatrzymaj nagrywanie "
msgid "Schedule"
msgstr "Program"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Zatrzymaj odtwarzanie"
@ -1280,6 +1274,24 @@ msgstr "G
msgid "Classic VDR"
msgstr "Klasyczny VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "Panel ST:TNG"
@ -1342,3 +1354,9 @@ msgstr "Naci
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR zostanie wy³±czony za %s minut"
msgid "Disk"
msgstr "Dysk"
msgid "free"
msgstr "wolnego"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.15\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2010-03-28 22:49+0100\n"
"Last-Translator: Cris Silva <hudokkow@gmail.com>\n"
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
@ -510,12 +510,6 @@ msgstr "Defini
msgid "Key$User9"
msgstr "Definição9"
msgid "Disk"
msgstr "Disco"
msgid "free"
msgstr "livre"
msgid "Free To Air"
msgstr "FTA"
@ -924,6 +918,9 @@ msgstr "Legendas"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Placa DVB primária"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Formato de vídeo"
@ -1148,9 +1145,6 @@ msgstr " Parar grava
msgid "Schedule"
msgstr "Programação"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Parar reprodução"
@ -1280,6 +1274,24 @@ msgstr "Volume "
msgid "Classic VDR"
msgstr "VDR Clássico"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "Consola ST:TNG"
@ -1342,3 +1354,9 @@ msgstr "Pressione qualquer tecla para cancelar o reinicio"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "O VDR vai desligar daqui a %s minutos"
msgid "Disk"
msgstr "Disco"
msgid "free"
msgstr "livre"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.12\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2011-03-10 23:52+0100\n"
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
"Language-Team: Romanian <vdr@linuxtv.org>\n"
@ -512,12 +512,6 @@ msgstr "Utilizator8"
msgid "Key$User9"
msgstr "Utilizator9"
msgid "Disk"
msgstr "Disc"
msgid "free"
msgstr "liber"
msgid "Free To Air"
msgstr "FTA (necriptat)"
@ -926,6 +920,9 @@ msgstr "Subtitrare"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Dispozitiv DVB primar"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Format video"
@ -1150,9 +1147,6 @@ msgstr " Opre
msgid "Schedule"
msgstr "Program (EPG)"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Opreºte redarea"
@ -1282,6 +1276,24 @@ msgstr "Volum "
msgid "Classic VDR"
msgstr "VDR clasic"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "Cons. ST:TNG"
@ -1344,3 +1356,9 @@ msgstr "Ap
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR se va închide în %s minute"
msgid "Disk"
msgstr "Disc"
msgid "free"
msgstr "liber"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-12-15 14:37+0100\n"
"Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
"Language-Team: Russian <vdr@linuxtv.org>\n"
@ -510,12 +510,6 @@ msgstr "
msgid "Key$User9"
msgstr "¿ÞÛì×ÞÒÐâÕÛì9"
msgid "Disk"
msgstr "´ØáÚ"
msgid "free"
msgstr "áÒÞÑÞÔÝÞ"
msgid "Free To Air"
msgstr "FTA (ÝÕ×ÐÚÞÔØàÞÒÐÝÞ)"
@ -924,6 +918,9 @@ msgstr "
msgid "Setup.DVB$Primary DVB interface"
msgstr "¾áÝÞÒÝÞÕ DVB-ãáâàÞÙáâÒÞ"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "ÄÞàÜÐâ ÒØÔÕÞ"
@ -1148,9 +1145,6 @@ msgstr "
msgid "Schedule"
msgstr "ÂÕÛÕÓØÔ"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " ¿àÕÚàÐâØâì ÒÞáßàÞØ×ÒÕÔÕÝØÕ"
@ -1280,6 +1274,24 @@ msgstr "
msgid "Classic VDR"
msgstr "ºÛÐááØçÕáÚØÙ"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG ßÐÝÕÛØ"
@ -1342,3 +1354,9 @@ msgstr "
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR ÒëÚÛîçØâáï çÕàÕ× %s ÜØÝãâ"
msgid "Disk"
msgstr "´ØáÚ"
msgid "free"
msgstr "áÒÞÑÞÔÝÞ"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.16\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2011-02-15 16:29+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <vdr@linuxtv.org>\n"
@ -509,12 +509,6 @@ msgstr "U
msgid "Key$User9"
msgstr "U¾ívateµ9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "volne"
msgid "Free To Air"
msgstr "volne ¹íriteµný"
@ -923,6 +917,9 @@ msgstr "Titulky"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Hlavné DVB rozhranie"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Formát videa"
@ -1147,9 +1144,6 @@ msgstr " Zastavi
msgid "Schedule"
msgstr "TV program"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Zastavi» prehrávanie"
@ -1279,6 +1273,24 @@ msgstr "Hlasitos
msgid "Classic VDR"
msgstr "Klasické VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG panely"
@ -1341,3 +1353,9 @@ msgstr "ktor
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR sa vypne za %s minút"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "volne"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-02-28 19:44+0100\n"
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
@ -510,12 +510,6 @@ msgstr "Uporabnik8"
msgid "Key$User9"
msgstr "Uporabnik9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "prosto"
msgid "Free To Air"
msgstr "nekodiran"
@ -924,6 +918,9 @@ msgstr "Podnapisi"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Primarna naprava"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Video format"
@ -1148,9 +1145,6 @@ msgstr " Prekini snemanje "
msgid "Schedule"
msgstr "Program"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Prekini predvajanje"
@ -1280,6 +1274,24 @@ msgstr "Glasnost "
msgid "Classic VDR"
msgstr "Klasièni VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG Konsola"
@ -1342,3 +1354,9 @@ msgstr "Pritisni katerokoli tipko za preklic ponovnega zagona"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR se bo zaustavil v %s minutah"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "prosto"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.1\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2011-01-09 15:57+0100\n"
"Last-Translator: Milan Cvijanoviæ <elcom_cvijo@hotmail.com>\n"
"Language-Team: Serbian <vdr@linuxtv.org>\n"
@ -511,12 +511,6 @@ msgstr "Korisnik8"
msgid "Key$User9"
msgstr "Korisnik9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "slobodno"
msgid "Free To Air"
msgstr "Slobodno"
@ -942,6 +936,9 @@ msgstr "Titlovi"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Primarni DVB ureðaj"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Video format"
@ -1171,9 +1168,6 @@ msgstr " Zaustavi snimanje "
msgid "Schedule"
msgstr "Raspored Programa"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Zaustavi reprodukciju"
@ -1305,6 +1299,24 @@ msgstr "Ja
msgid "Classic VDR"
msgstr "Klasièni VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG Panele"
@ -1368,3 +1380,9 @@ msgstr "Pritisni jedan taster za poni
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR se iskljuèuje za %s minuta"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "slobodno"

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-03-12 18:25+0100\n"
"Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n"
"Language-Team: Swedish <vdr@linuxtv.org>\n"
@ -512,12 +512,6 @@ msgstr "Anv
msgid "Key$User9"
msgstr "Användare9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "ledigt"
msgid "Free To Air"
msgstr "Okodad"
@ -926,6 +920,9 @@ msgstr "Knapp$Textning"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Primär DVB enhet"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Video format"
@ -1150,9 +1147,6 @@ msgstr " Avsluta inspelning "
msgid "Schedule"
msgstr "Program"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Avsluta uppspelning"
@ -1282,6 +1276,24 @@ msgstr "Volym "
msgid "Classic VDR"
msgstr "Klassisk VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG konsol"
@ -1344,3 +1356,9 @@ msgstr "Tryck valfri knapp f
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR kommer att stängas ned om %s minuter"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "ledigt"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2008-02-28 00:33+0100\n"
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
"Language-Team: Turkish <vdr@linuxtv.org>\n"
@ -509,12 +509,6 @@ msgstr "Kullan
msgid "Key$User9"
msgstr "Kullanýcý9"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "boþ"
msgid "Free To Air"
msgstr "Þifresiz"
@ -923,6 +917,9 @@ msgstr "Altyaz
msgid "Setup.DVB$Primary DVB interface"
msgstr "Primer DVB arayüzü"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Video formatý"
@ -1147,9 +1144,6 @@ msgstr "
msgid "Schedule"
msgstr "Program"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Gösteriþi bitir"
@ -1279,6 +1273,24 @@ msgstr "Vol
msgid "Classic VDR"
msgstr "Klasik VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG paneli"
@ -1341,3 +1353,9 @@ msgstr "Yeniden ba
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR %s dakikada kapanacak"
msgid "Disk"
msgstr "Disk"
msgid "free"
msgstr "boþ"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.7.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2010-04-25 16:35+0200\n"
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
"Language-Team: Ukrainian <vdr@linuxtv.org>\n"
@ -509,12 +509,6 @@ msgstr "Користувач8"
msgid "Key$User9"
msgstr "Користувач8"
msgid "Disk"
msgstr "Диск"
msgid "free"
msgstr "вільно"
msgid "Free To Air"
msgstr "FTA (незакодовано)"
@ -923,6 +917,9 @@ msgstr "Субтитри"
msgid "Setup.DVB$Primary DVB interface"
msgstr "Основний DVB-пристрій"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "Формат відео"
@ -1147,9 +1144,6 @@ msgstr " Зупинити запис "
msgid "Schedule"
msgstr "Телегід"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr " Зупинити програвання"
@ -1279,6 +1273,24 @@ msgstr "Гучність "
msgid "Classic VDR"
msgstr "Класичний VDR"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG панелі"
@ -1341,3 +1353,9 @@ msgstr "Натисніть будь-яку кнопку для відміни п
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR виключиться через %s хвилин"
msgid "Disk"
msgstr "Диск"
msgid "free"
msgstr "вільно"

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2012-03-08 14:37+0100\n"
"POT-Creation-Date: 2012-06-02 15:10+0200\n"
"PO-Revision-Date: 2009-09-23 23:50+0800\n"
"Last-Translator: Nan Feng <nfgx@21cn.com>\n"
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
@ -512,12 +512,6 @@ msgstr "用户8"
msgid "Key$User9"
msgstr "用户9"
msgid "Disk"
msgstr "硬盘已使用"
msgid "free"
msgstr "可录像时间"
msgid "Free To Air"
msgstr "剩余空间"
@ -926,6 +920,9 @@ msgstr "字幕"
msgid "Setup.DVB$Primary DVB interface"
msgstr "使用中卫星卡接口"
msgid "Setup.DVB$Standard compliance"
msgstr ""
msgid "Setup.DVB$Video format"
msgstr "视频格式"
@ -1150,9 +1147,6 @@ msgstr "是否停止录像?"
msgid "Schedule"
msgstr "任务列表"
msgid "VDR"
msgstr "VDR"
#. TRANSLATORS: note the leading blank!
msgid " Stop replaying"
msgstr "停止回放"
@ -1282,6 +1276,24 @@ msgstr "音量调整"
msgid "Classic VDR"
msgstr "经典VDR面板"
msgid "DISK"
msgstr ""
msgid "LOAD"
msgstr ""
msgid "TIMERS"
msgstr ""
msgid "DEVICES"
msgstr ""
msgid "LIVE"
msgstr ""
msgid "PLAY"
msgstr ""
msgid "ST:TNG Panels"
msgstr "ST:TNG 面板"
@ -1344,3 +1356,9 @@ msgstr "请按任意键重启"
#, c-format
msgid "VDR will shut down in %s minutes"
msgstr "VDR系统将要在%s分钟关闭"
msgid "Disk"
msgstr "硬盘已使用"
msgid "free"
msgstr "可录像时间"

@ -4,27 +4,13 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: receiver.c 2.5 2012/02/29 11:49:36 kls Exp $
* $Id: receiver.c 2.7 2012/06/02 13:20:38 kls Exp $
*/
#include "receiver.h"
#include <stdio.h>
#include "tools.h"
#ifdef LEGACY_CRECEIVER
cReceiver::cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1, const int *Pids2, const int *Pids3)
{
device = NULL;
channelID = ChannelID;
priority = constrain(Priority, MINPRIORITY, MAXPRIORITY);
numPids = 0;
AddPid(Pid);
AddPids(Pids1);
AddPids(Pids2);
AddPids(Pids3);
}
#endif
cReceiver::cReceiver(const cChannel *Channel, int Priority)
{
device = NULL;
@ -83,7 +69,7 @@ bool cReceiver::SetPids(const cChannel *Channel)
AddPids(Channel->Dpids()) &&
AddPids(Channel->Spids());
}
return true;
return true;
}
bool cReceiver::WantsPid(int Pid)

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: receiver.h 2.6 2012/03/11 15:25:40 kls Exp $
* $Id: receiver.h 2.8 2012/06/02 13:20:44 kls Exp $
*/
#ifndef __RECEIVER_H
@ -14,8 +14,6 @@
#define MAXRECEIVEPIDS 64 // the maximum number of PIDs per receiver
//#define LEGACY_CRECEIVER // Code enclosed with this macro is deprecated and may be removed in a future version
class cReceiver {
friend class cDevice;
private:
@ -40,9 +38,6 @@ protected:
///< will be delivered only ONCE, so the cReceiver must make sure that
///< it will be able to buffer the data if necessary.
public:
#ifdef LEGACY_CRECEIVER
cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1 = NULL, const int *Pids2 = NULL, const int *Pids3 = NULL);
#endif
cReceiver(const cChannel *Channel = NULL, int Priority = MINPRIORITY);
///< Creates a new receiver for the given Channel with the given Priority.
///< If Channel is not NULL, its pids are set by a call to SetPids().
@ -62,7 +57,7 @@ public:
///< Adds the given Pids to the list of PIDs of this receiver.
bool SetPids(const cChannel *Channel);
///< Sets the PIDs of this receiver to those of the given Channel,
///< replacing and previously stored PIDs. If Channel is NULL, all
///< replacing any previously stored PIDs. If Channel is NULL, all
///< PIDs will be cleared. Parameters in the Setup may control whether
///< certain types of PIDs (like Dolby Digital, for instance) are
///< actually set. The Channel's ID is stored and can later be retrieved

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: recording.c 2.53 2012/03/13 13:17:57 kls Exp $
* $Id: recording.c 2.56 2012/06/03 09:51:27 kls Exp $
*/
#include "recording.h"
@ -153,7 +153,7 @@ void AssertFreeDiskSpace(int Priority, bool Force)
cRecording *r = DeletedRecordings.First();
cRecording *r0 = NULL;
while (r) {
if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only remove recordings that will actually increase the free video disk space
if (r->IsOnVideoDirectoryFileSystem()) { // only remove recordings that will actually increase the free video disk space
if (!r0 || r->Start() < r0->Start())
r0 = r;
}
@ -180,7 +180,7 @@ void AssertFreeDiskSpace(int Priority, bool Force)
cRecording *r = Recordings.First();
cRecording *r0 = NULL;
while (r) {
if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only delete recordings that will actually increase the free video disk space
if (r->IsOnVideoDirectoryFileSystem()) { // only delete recordings that will actually increase the free video disk space
if (!r->IsEdited() && r->Lifetime() < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
if ((r->Lifetime() == 0 && Priority > r->Priority()) || // the recording has no guaranteed lifetime and the new recording has higher priority
(r->Lifetime() > 0 && (time(NULL) - r->Start()) / SECSINDAY >= r->Lifetime())) { // the recording's guaranteed lifetime has expired
@ -617,6 +617,7 @@ cRecording::cRecording(cTimer *Timer, const cEvent *Event)
channel = Timer->Channel()->Number();
instanceId = InstanceId;
isPesRecording = false;
isOnVideoDirectoryFileSystem = -1; // unknown
framesPerSecond = DEFAULTFRAMESPERSECOND;
numFrames = -1;
deleted = 0;
@ -677,6 +678,7 @@ cRecording::cRecording(const char *FileName)
priority = MAXPRIORITY; // assume maximum in case there is no info file
lifetime = MAXLIFETIME;
isPesRecording = false;
isOnVideoDirectoryFileSystem = -1; // unknown
framesPerSecond = DEFAULTFRAMESPERSECOND;
numFrames = -1;
deleted = 0;
@ -723,7 +725,9 @@ cRecording::cRecording(const char *FileName)
}
fclose(f);
}
else if (errno != ENOENT)
else if (errno == ENOENT)
info->ownEvent->SetTitle(name);
else
LOG_ERROR_STR(*InfoFileName);
#ifdef SUMMARYFALLBACK
// fall back to the old 'summary.vdr' if there was no 'info.vdr':
@ -950,6 +954,13 @@ bool cRecording::IsEdited(void) const
return *s == '%';
}
bool cRecording::IsOnVideoDirectoryFileSystem(void) const
{
if (isOnVideoDirectoryFileSystem < 0)
isOnVideoDirectoryFileSystem = ::IsOnVideoDirectoryFileSystem(FileName());
return isOnVideoDirectoryFileSystem;
}
void cRecording::ReadInfo(void)
{
info->Read();
@ -1251,7 +1262,7 @@ int cRecordings::TotalFileSizeMB(void)
LOCK_THREAD;
for (cRecording *recording = First(); recording; recording = Next(recording)) {
int FileSizeMB = recording->FileSizeMB();
if (FileSizeMB > 0 && IsOnVideoDirectoryFileSystem(recording->FileName()))
if (FileSizeMB > 0 && recording->IsOnVideoDirectoryFileSystem())
size += FileSizeMB;
}
return size;
@ -1263,7 +1274,7 @@ double cRecordings::MBperMinute(void)
int length = 0;
LOCK_THREAD;
for (cRecording *recording = First(); recording; recording = Next(recording)) {
if (IsOnVideoDirectoryFileSystem(recording->FileName())) {
if (recording->IsOnVideoDirectoryFileSystem()) {
int FileSizeMB = recording->FileSizeMB();
if (FileSizeMB > 0) {
int LengthInSeconds = recording->LengthInSeconds();
@ -1422,13 +1433,17 @@ cMark *cMarks::GetNext(int Position)
const char *cRecordingUserCommand::command = NULL;
void cRecordingUserCommand::InvokeCommand(const char *State, const char *RecordingFileName)
void cRecordingUserCommand::InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName)
{
if (command) {
cString cmd = cString::sprintf("%s %s \"%s\"", command, State, *strescape(RecordingFileName, "\\\"$"));
isyslog("executing '%s'", *cmd);
SystemExec(cmd);
}
cString cmd;
if (SourceFileName)
cmd = cString::sprintf("%s %s \"%s\" \"%s\"", command, State, *strescape(RecordingFileName, "\\\"$"), *strescape(SourceFileName, "\\\"$"));
else
cmd = cString::sprintf("%s %s \"%s\"", command, State, *strescape(RecordingFileName, "\\\"$"));
isyslog("executing '%s'", *cmd);
SystemExec(cmd);
}
}
// --- cIndexFileGenerator ---------------------------------------------------

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: recording.h 2.30 2012/03/13 12:41:05 kls Exp $
* $Id: recording.h 2.33 2012/06/03 09:49:09 kls Exp $
*/
#ifndef __RECORDING_H
@ -22,8 +22,6 @@
#define TIMERMACRO_TITLE "TITLE"
#define TIMERMACRO_EPISODE "EPISODE"
//#define __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS // Code enclosed with this macro is deprecated and may be removed in a future version
extern bool VfatFileSystem;
extern int InstanceId;
@ -93,6 +91,7 @@ private:
int channel;
int instanceId;
bool isPesRecording;
mutable int isOnVideoDirectoryFileSystem; // -1 = unknown, 0 = no, 1 = yes
double framesPerSecond;
cRecordingInfo *info;
cRecording(const cRecording&); // can't copy cRecording
@ -100,9 +99,6 @@ private:
static char *StripEpisodeName(char *s);
char *SortName(void) const;
int GetResume(void) const;
#ifdef __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS
public:
#endif
time_t start;
int priority;
int lifetime;
@ -135,6 +131,7 @@ public:
bool IsNew(void) const { return GetResume() <= 0; }
bool IsEdited(void) const;
bool IsPesRecording(void) const { return isPesRecording; }
bool IsOnVideoDirectoryFileSystem(void) const;
void ReadInfo(void);
bool WriteInfo(void);
void SetStartTime(time_t Start);
@ -208,9 +205,6 @@ class cMark : public cListObject {
friend class cMarks; // for sorting
private:
double framesPerSecond;
#ifdef __RECORDING_H_DEPRECATED_DIRECT_MEMBER_ACCESS
public:
#endif
int position;
cString comment;
public:
@ -251,7 +245,7 @@ private:
static const char *command;
public:
static void SetCommand(const char *Command) { command = Command; }
static void InvokeCommand(const char *State, const char *RecordingFileName);
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName = NULL);
};
// The maximum size of a single frame (up to HDTV 1920x1080):

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: skinclassic.c 2.6 2011/08/21 11:02:06 kls Exp $
* $Id: skinclassic.c 2.7 2012/04/23 08:48:03 kls Exp $
*/
#include "skinclassic.h"
@ -12,6 +12,7 @@
#include "i18n.h"
#include "osd.h"
#include "themes.h"
#include "videodir.h"
#define ScrollWidth (Setup.FontOsdSize / 4)
#define TextFrame (Setup.FontOsdSize / 10)
@ -170,7 +171,10 @@ private:
int y0, y1, y2, y3, y4, y5;
int lineHeight;
int dateWidth;
cString title;
cString lastDate;
int lastDiskUsageState;
void DrawTitle(void);
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
void SetTextScrollbar(void);
public:
@ -196,6 +200,7 @@ cSkinClassicDisplayMenu::cSkinClassicDisplayMenu(void)
{
const cFont *font = cFont::GetFont(fontOsd);
lineHeight = font->Height();
lastDiskUsageState = -1;
dateWidth = 0;
x0 = 0;
x1 = x0 + 2 * TextSpacing;
@ -270,10 +275,17 @@ void cSkinClassicDisplayMenu::Clear(void)
osd->DrawRectangle(x0, y1, x3 - 1, y4 - 1, Theme.Color(clrBackground));
}
void cSkinClassicDisplayMenu::SetTitle(const char *Title)
void cSkinClassicDisplayMenu::DrawTitle(void)
{
const cFont *font = cFont::GetFont(fontOsd);
osd->DrawText(x0, y0, Title, Theme.Color(clrMenuTitleFg), Theme.Color(clrMenuTitleBg), font, x3 - x0 - dateWidth);
bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
osd->DrawText(x0, y0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, Theme.Color(clrMenuTitleFg), Theme.Color(clrMenuTitleBg), font, x3 - x0 - dateWidth);
}
void cSkinClassicDisplayMenu::SetTitle(const char *Title)
{
title = Title;
DrawTitle();
}
void cSkinClassicDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
@ -422,6 +434,8 @@ const cFont *cSkinClassicDisplayMenu::GetTextAreaFont(bool FixedFont) const
void cSkinClassicDisplayMenu::Flush(void)
{
if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
DrawTitle();
cString date = DayDateTime();
if (!*lastDate || strcmp(date, lastDate)) {
const cFont *font = cFont::GetFont(fontOsd);

2114
skinlcars.c Normal file

File diff suppressed because it is too large Load Diff

27
skinlcars.h Normal file

@ -0,0 +1,27 @@
/*
* skinlcars.h: A VDR skin with Star Trek's "LCARS" layout
*
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: skinlcars.h 1.1 2012/04/15 13:17:35 kls Exp $
*/
#ifndef __SKINLCARS_H
#define __SKINLCARS_H
#include "skins.h"
class cSkinLCARS : public cSkin {
public:
cSkinLCARS(void);
virtual const char *Description(void);
virtual cSkinDisplayChannel *DisplayChannel(bool WithInfo);
virtual cSkinDisplayMenu *DisplayMenu(void);
virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
virtual cSkinDisplayVolume *DisplayVolume(void);
virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
virtual cSkinDisplayMessage *DisplayMessage(void);
};
#endif //__SKINLCARS_H

13
skins.c

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: skins.c 2.5 2012/03/11 14:36:11 kls Exp $
* $Id: skins.c 2.10 2012/06/02 11:44:14 kls Exp $
*/
#include "skins.h"
@ -67,9 +67,15 @@ cSkinDisplay::~cSkinDisplay()
cSkinDisplayMenu::cSkinDisplayMenu(void)
{
menuCategory = mcUndefined;
SetTabs(0);
}
void cSkinDisplayMenu::SetMenuCategory(eMenuCategory MenuCategory)
{
menuCategory = MenuCategory;
}
void cSkinDisplayMenu::SetTabs(int Tab1, int Tab2, int Tab3, int Tab4, int Tab5)
{
tabs[0] = 0;
@ -166,6 +172,11 @@ cSkinDisplayReplay::cSkinDisplayReplay(void)
marks = NULL;
}
void cSkinDisplayReplay::SetRecording(const cRecording *Recording)
{
SetTitle(Recording->Title());
}
void cSkinDisplayReplay::SetMarks(const cMarks *Marks)
{
marks = Marks;

20
skins.h

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: skins.h 2.2 2012/03/11 14:38:23 kls Exp $
* $Id: skins.h 2.5 2012/05/12 11:10:30 kls Exp $
*/
#ifndef __SKINS_H
@ -72,6 +72,8 @@ public:
*/
};
enum eMenuCategory { mcUndefined = -1, mcUnknown = 0, mcMain, mcSchedule, mcChannel, mcTimer, mcRecording, mcPlugin, mcSetup, mcCommand, mcEvent, mcText, mcFolder, mcCam };
class cSkinDisplayMenu : public cSkinDisplay {
///< This class implements the general purpose menu display, which is
///< used throughout the program to display information and let the
@ -92,6 +94,7 @@ class cSkinDisplayMenu : public cSkinDisplay {
public:
enum { MaxTabs = 6 };
private:
eMenuCategory menuCategory;
int tabs[MaxTabs];
protected:
cTextScroller textScroller;
@ -104,6 +107,16 @@ protected:
///< part can be found, NULL will be returned.
public:
cSkinDisplayMenu(void);
eMenuCategory MenuCategory(void) const { return menuCategory; }
///< Returns the menu category, set by a previous call to SetMenuCategory().
virtual void SetMenuCategory(eMenuCategory MenuCategory);
///< Sets the current menu category. This allows skins to handle known
///< types of menus in different ways, for instance by displaying icons
///< or special decorations.
///< A derived class can reimplement this function to be informed of any
///< changes in the menu category. If it does, it shall call the base class
///< function in order to set the members accordingly for later calls to the
///< MenuCategory() function.
virtual void SetTabs(int Tab1, int Tab2 = 0, int Tab3 = 0, int Tab4 = 0, int Tab5 = 0);
///< Sets the tab columns to the given values, which are the number of
///< characters in each column.
@ -200,6 +213,11 @@ public:
virtual void SetMarks(const cMarks *Marks);
///< Sets the editing marks to Marks, which shall be used to display the
///< progress bar through a cProgressBar object.
virtual void SetRecording(const cRecording *Recording);
///< Sets the recording that is currently being played.
///< The default implementation calls SetTitle() with the title and short
///< text of the Recording. A derived class can use any information provided
///< by the given Recording and display it.
virtual void SetTitle(const char *Title) = 0;
///< Sets the title of the recording.
virtual void SetMode(bool Play, bool Forward, int Speed) = 0;

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: skinsttng.c 2.14 2012/03/11 14:06:05 kls Exp $
* $Id: skinsttng.c 2.15 2012/04/23 08:39:11 kls Exp $
*/
// "Star Trek: The Next Generation"(R) is a registered trademark of Paramount Pictures
@ -16,6 +16,7 @@
#include "osd.h"
#include "menu.h"
#include "themes.h"
#include "videodir.h"
#include "symbols/arrowdown.xpm"
#include "symbols/arrowup.xpm"
@ -401,8 +402,11 @@ private:
int lineHeight;
tColor frameColor;
int currentIndex;
cString title;
bool message;
cString lastDate;
int lastDiskUsageState;
void DrawTitle(void);
void DrawScrollbar(int Total, int Offset, int Shown, int Top, int Height, bool CanScrollUp, bool CanScrollDown);
void SetTextScrollbar(void);
public:
@ -429,6 +433,7 @@ cSkinSTTNGDisplayMenu::cSkinSTTNGDisplayMenu(void)
const cFont *font = cFont::GetFont(fontOsd);
lineHeight = font->Height();
frameColor = Theme.Color(clrMenuFrame);
lastDiskUsageState = -1;
currentIndex = -1;
message = false;
x0 = 0;
@ -548,15 +553,22 @@ void cSkinSTTNGDisplayMenu::Clear(void)
osd->DrawRectangle(x1, y3, x7 - 1, y4 - 1, Theme.Color(clrBackground));
}
void cSkinSTTNGDisplayMenu::SetTitle(const char *Title)
void cSkinSTTNGDisplayMenu::DrawTitle(void)
{
const cFont *font = cFont::GetFont(fontOsd);
const char *VDR = " VDR";
bool WithDisk = MenuCategory() == mcMain || MenuCategory() == mcRecording;
int w = font->Width(VDR);
osd->DrawText(x3 + TextSpacing, y0, Title, Theme.Color(clrMenuTitle), frameColor, font, x4 - w - x3 - TextSpacing);
osd->DrawText(x3 + TextSpacing, y0, WithDisk ? cString::sprintf("%s - %s", *title, *cVideoDiskUsage::String()) : title, Theme.Color(clrMenuTitle), frameColor, font, x4 - w - x3 - TextSpacing);
osd->DrawText(x4 - w, y0, VDR, frameColor, clrBlack, font, w, lineHeight);
}
void cSkinSTTNGDisplayMenu::SetTitle(const char *Title)
{
title = Title;
DrawTitle();
}
void cSkinSTTNGDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue)
{
cString date = DayDateTime();
@ -749,6 +761,8 @@ const cFont *cSkinSTTNGDisplayMenu::GetTextAreaFont(bool FixedFont) const
void cSkinSTTNGDisplayMenu::Flush(void)
{
if (cVideoDiskUsage::HasChanged(lastDiskUsageState))
DrawTitle();
if (!message) {
cString date = DayDateTime();
if (!*lastDate || strcmp(date, lastDate)) {

34
svdrp.c

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
* $Id: svdrp.c 2.16 2012/03/04 12:05:56 kls Exp $
* $Id: svdrp.c 2.19 2012/05/12 11:55:18 kls Exp $
*/
#include "svdrp.h"
@ -432,7 +432,7 @@ void cSVDRP::Reply(int Code, const char *fmt, ...)
if (Code != 0) {
va_list ap;
va_start(ap, fmt);
cString buffer = cString::sprintf(fmt, ap);
cString buffer = cString::vsprintf(fmt, ap);
va_end(ap);
const char *s = buffer;
while (s && *s) {
@ -662,14 +662,14 @@ void cSVDRP::CmdDELR(const char *Option)
{
if (*Option) {
if (isnumber(Option)) {
cRecording *recording = Recordings.Get(strtol(Option, NULL, 10) - 1);
cRecording *recording = recordings.Get(strtol(Option, NULL, 10) - 1);
if (recording) {
cRecordControl *rc = cRecordControls::GetRecordControl(recording->FileName());
if (!rc) {
if (!cCutter::Active(recording->FileName())) {
if (recording->Delete()) {
Reply(250, "Recording \"%s\" deleted", Option);
::Recordings.DelByName(recording->FileName());
Recordings.DelByName(recording->FileName());
}
else
Reply(554, "Error while deleting recording!");
@ -681,7 +681,7 @@ void cSVDRP::CmdDELR(const char *Option)
Reply(550, "Recording \"%s\" is in use by timer %d", Option, rc->Timer()->Index() + 1);
}
else
Reply(550, "Recording \"%s\" not found%s", Option, Recordings.Count() ? "" : " (use LSTR before deleting)");
Reply(550, "Recording \"%s\" not found%s", Option, recordings.Count() ? "" : " (use LSTR before deleting)");
}
else
Reply(501, "Error in recording number \"%s\"", Option);
@ -723,7 +723,7 @@ void cSVDRP::CmdEDIT(const char *Option)
{
if (*Option) {
if (isnumber(Option)) {
cRecording *recording = Recordings.Get(strtol(Option, NULL, 10) - 1);
cRecording *recording = recordings.Get(strtol(Option, NULL, 10) - 1);
if (recording) {
cMarks Marks;
if (Marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording()) && Marks.Count()) {
@ -740,7 +740,7 @@ void cSVDRP::CmdEDIT(const char *Option)
Reply(554, "No editing marks defined");
}
else
Reply(550, "Recording \"%s\" not found%s", Option, Recordings.Count() ? "" : " (use LSTR before editing)");
Reply(550, "Recording \"%s\" not found%s", Option, recordings.Count() ? "" : " (use LSTR before editing)");
}
else
Reply(501, "Error in recording number \"%s\"", Option);
@ -1076,10 +1076,10 @@ void cSVDRP::CmdLSTE(const char *Option)
void cSVDRP::CmdLSTR(const char *Option)
{
bool recordings = Recordings.Update(true);
recordings.Update(true);
if (*Option) {
if (isnumber(Option)) {
cRecording *recording = Recordings.Get(strtol(Option, NULL, 10) - 1);
cRecording *recording = recordings.Get(strtol(Option, NULL, 10) - 1);
if (recording) {
FILE *f = fdopen(file, "w");
if (f) {
@ -1097,11 +1097,11 @@ void cSVDRP::CmdLSTR(const char *Option)
else
Reply(501, "Error in recording number \"%s\"", Option);
}
else if (recordings) {
cRecording *recording = Recordings.First();
else if (recordings.Count()) {
cRecording *recording = recordings.First();
while (recording) {
Reply(recording == Recordings.Last() ? 250 : -250, "%d %s", recording->Index() + 1, recording->Title(' ', true));
recording = Recordings.Next(recording);
Reply(recording == recordings.Last() ? 250 : -250, "%d %s", recording->Index() + 1, recording->Title(' ', true));
recording = recordings.Next(recording);
}
}
else
@ -1367,11 +1367,11 @@ void cSVDRP::CmdPLAY(const char *Option)
char c = *option;
*option = 0;
if (isnumber(num)) {
cRecording *recording = Recordings.Get(strtol(num, NULL, 10) - 1);
cRecording *recording = recordings.Get(strtol(num, NULL, 10) - 1);
if (recording) {
if (c)
option = skipspace(++option);
cReplayControl::SetRecording(NULL, NULL);
cReplayControl::SetRecording(NULL);
cControl::Shutdown();
if (*option) {
int pos = 0;
@ -1383,13 +1383,13 @@ void cSVDRP::CmdPLAY(const char *Option)
else
resume.Save(pos);
}
cReplayControl::SetRecording(recording->FileName(), recording->Title());
cReplayControl::SetRecording(recording->FileName());
cControl::Launch(new cReplayControl);
cControl::Attach();
Reply(250, "Playing recording \"%s\" [%s]", num, recording->Title());
}
else
Reply(550, "Recording \"%s\" not found%s", num, Recordings.Count() ? "" : " (use LSTR before playing)");
Reply(550, "Recording \"%s\" not found%s", num, recordings.Count() ? "" : " (use LSTR before playing)");
}
else
Reply(501, "Error in recording number \"%s\"", num);

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: svdrp.h 2.2 2012/02/16 12:37:53 kls Exp $
* $Id: svdrp.h 2.3 2012/04/26 10:30:06 kls Exp $
*/
#ifndef __SVDRP_H
@ -43,7 +43,7 @@ class cSVDRP {
private:
cSocket socket;
cFile file;
cRecordings Recordings;
cRecordings recordings;
cPUTEhandler *PUTEhandler;
int numChars;
int length;

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: thread.c 2.3 2009/04/13 13:50:39 kls Exp $
* $Id: thread.c 2.4 2012/05/08 11:15:57 kls Exp $
*/
#include "thread.h"
@ -239,7 +239,7 @@ void cThread::SetDescription(const char *Description, ...)
if (Description) {
va_list ap;
va_start(ap, Description);
description = strdup(cString::sprintf(Description, ap));
description = strdup(cString::vsprintf(Description, ap));
va_end(ap);
}
}

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: timers.c 2.8 2012/02/27 09:38:41 kls Exp $
* $Id: timers.c 2.9 2012/04/25 09:02:03 kls Exp $
*/
#include "timers.h"
@ -142,7 +142,7 @@ cTimer& cTimer::operator= (const cTimer &Timer)
int cTimer::Compare(const cListObject &ListObject) const
{
cTimer *ti = (cTimer *)&ListObject;
const cTimer *ti = (const cTimer *)&ListObject;
time_t t1 = StartTime();
time_t t2 = ti->StartTime();
int r = t1 - t2;
@ -820,3 +820,18 @@ void cTimers::DeleteExpired(void)
}
lastDeleteExpired = time(NULL);
}
// --- cSortedTimers ---------------------------------------------------------
static int CompareTimers(const void *a, const void *b)
{
return (*(const cTimer **)a)->Compare(**(const cTimer **)b);
}
cSortedTimers::cSortedTimers(void)
:cVector(Timers.Count())
{
for (const cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer))
Append(Timer);
Sort(CompareTimers);
}

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: timers.h 2.3 2012/02/20 15:52:57 kls Exp $
* $Id: timers.h 2.4 2012/04/15 13:21:31 kls Exp $
*/
#ifndef __TIMERS_H
@ -135,4 +135,9 @@ public:
extern cTimers Timers;
class cSortedTimers : public cVector<const cTimer *> {
public:
cSortedTimers(void);
};
#endif //__TIMERS_H

13
tools.c

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.c 2.22 2012/02/18 15:30:35 kls Exp $
* $Id: tools.c 2.24 2012/05/12 13:29:20 kls Exp $
*/
#include "tools.h"
@ -958,7 +958,7 @@ cString cString::sprintf(const char *fmt, ...)
return cString(buffer, true);
}
cString cString::sprintf(const char *fmt, va_list &ap)
cString cString::vsprintf(const char *fmt, va_list &ap)
{
char *buffer;
if (!fmt || vasprintf(&buffer, fmt, ap) < 0) {
@ -1042,6 +1042,15 @@ cString DateString(time_t t)
return buf;
}
cString ShortDateString(time_t t)
{
char buf[32];
struct tm tm_r;
tm *tm = localtime_r(&t, &tm_r);
strftime(buf, sizeof(buf), "%d.%m.%y", tm);
return buf;
}
cString TimeString(time_t t)
{
char buf[25];

22
tools.h

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.h 2.16 2012/02/29 10:41:00 kls Exp $
* $Id: tools.h 2.21 2012/05/20 13:58:06 kls Exp $
*/
#ifndef __TOOLS_H
@ -177,7 +177,7 @@ public:
cString &operator=(const char *String);
cString &Truncate(int Index); ///< Truncate the string at the given Index (if Index is < 0 it is counted from the end of the string).
static cString sprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
static cString sprintf(const char *fmt, va_list &ap);
static cString vsprintf(const char *fmt, va_list &ap);
};
ssize_t safe_read(int filedes, void *buffer, size_t size);
@ -228,13 +228,26 @@ void TouchFile(const char *FileName);
time_t LastModifiedTime(const char *FileName);
off_t FileSize(const char *FileName); ///< returns the size of the given file, or -1 in case of an error (e.g. if the file doesn't exist)
cString WeekDayName(int WeekDay);
///< Converts the given WeekDay (0=Sunday, 1=Monday, ...) to a three letter
///< day name.
cString WeekDayName(time_t t);
///< Converts the week day of the given time to a three letter day name.
cString WeekDayNameFull(int WeekDay);
///< Converts the given WeekDay (0=Sunday, 1=Monday, ...) to a full
///< day name.
cString WeekDayNameFull(time_t t);
///< Converts the week day of the given time to a full day name.
cString DayDateTime(time_t t = 0);
///< Converts the given time to a string of the form "www dd.mm. hh:mm".
///< If no time is given, the current time is taken.
cString TimeToString(time_t t);
///< Converts the given time to a string of the form "www mmm dd hh:mm:ss yyyy".
cString DateString(time_t t);
///< Converts the given time to a string of the form "www dd.mm.yyyy".
cString ShortDateString(time_t t);
///< Converts the given time to a string of the form "dd.mm.yy".
cString TimeString(time_t t);
///< Converts the given time to a string of the form "hh:mm".
uchar *RgbToJpeg(uchar *Mem, int Width, int Height, int &Size, int Quality = 100);
///< Converts the given Memory to a JPEG image and returns a pointer
///< to the resulting image. Mem must point to a data block of exactly
@ -457,6 +470,7 @@ public:
};
template<class T> class cVector {
///< cVector may only be used for *simple* types, like int or pointers - not for class objects that allocate additional memory!
private:
mutable int allocated;
mutable int size;
@ -515,7 +529,7 @@ public:
virtual void Append(T Data)
{
if (size >= allocated)
Realloc(allocated * 4 / 2); // increase size by 50%
Realloc(allocated * 3 / 2); // increase size by 50%
data[size++] = Data;
}
virtual void Remove(int Index)
@ -526,6 +540,8 @@ public:
}
virtual void Clear(void)
{
for (int i = 0; i < size; i++)
data[i] = T(0);
size = 0;
}
void Sort(__compar_fn_t Compare)

4
vdr.c

@ -22,7 +22,7 @@
*
* The project's page is at http://www.tvdr.de
*
* $Id: vdr.c 2.35 2012/03/14 09:09:19 kls Exp $
* $Id: vdr.c 2.36 2012/04/26 09:23:41 kls Exp $
*/
#include <getopt.h>
@ -56,6 +56,7 @@
#include "recording.h"
#include "shutdown.h"
#include "skinclassic.h"
#include "skinlcars.h"
#include "skinsttng.h"
#include "sourceparams.h"
#include "sources.h"
@ -677,6 +678,7 @@ int main(int argc, char *argv[])
// Default skins:
new cSkinLCARS;
new cSkinSTTNG;
new cSkinClassic;
Skins.SetCurrent(Setup.OSDSkin);

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: videodir.c 2.0 2008/02/16 13:00:03 kls Exp $
* $Id: videodir.c 2.1 2012/04/22 15:03:10 kls Exp $
*/
#include "videodir.h"
@ -241,3 +241,43 @@ bool IsOnVideoDirectoryFileSystem(const char *FileName)
} while (Dir.Next());
return false;
}
// --- cVideoDiskUsage -------------------------------------------------------
#define DISKSPACECHEK 5 // seconds between disk space checks
#define MB_PER_MINUTE 25.75 // this is just an estimate!
int cVideoDiskUsage::state = 0;
time_t cVideoDiskUsage::lastChecked = 0;
int cVideoDiskUsage::usedPercent = 0;
int cVideoDiskUsage::freeMB = 0;
int cVideoDiskUsage::freeMinutes = 0;
bool cVideoDiskUsage::HasChanged(int &State)
{
if (time(NULL) - lastChecked > DISKSPACECHEK) {
int FreeMB;
int UsedPercent = VideoDiskSpace(&FreeMB);
if (FreeMB != freeMB) {
usedPercent = UsedPercent;
freeMB = FreeMB;
int MBperMinute = Recordings.MBperMinute();
if (MBperMinute <= 0)
MBperMinute = MB_PER_MINUTE;
freeMinutes = int(double(FreeMB) / MBperMinute);
state++;
}
lastChecked = time(NULL);
}
if (State != state) {
State = state;
return true;
}
return false;
}
cString cVideoDiskUsage::String(void)
{
HasChanged(state);
return cString::sprintf("%s %d%% - %2d:%02d %s", tr("Disk"), usedPercent, freeMinutes / 60, freeMinutes % 60, tr("free"));
}

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: videodir.h 2.0 2008/02/16 12:53:11 kls Exp $
* $Id: videodir.h 2.1 2012/04/22 15:07:56 kls Exp $
*/
#ifndef __VIDEODIR_H
@ -25,4 +25,42 @@ cString PrefixVideoFileName(const char *FileName, char Prefix);
void RemoveEmptyVideoDirectories(void);
bool IsOnVideoDirectoryFileSystem(const char *FileName);
class cVideoDiskUsage {
private:
static int state;
static time_t lastChecked;
static int usedPercent;
static int freeMB;
static int freeMinutes;
public:
static bool HasChanged(int &State);
///< Returns true if the usage of the video disk space has changed since the last
///< call to this function with the given State variable. The caller should
///< initialize State to -1, and it will be set to the current internal state
///< value of the video disk usage checker upon return. Future calls with the same
///< State variable can then quickly check for changes.
static void ForceCheck(void) { lastChecked = 0; }
///< To avoid unnecessary load, the video disk usage is only actually checked
///< every DISKSPACECHEK seconds. Calling ForceCheck() makes sure that the next call
///< to HasChanged() will check the disk usage immediately. This is useful in case
///< some files have been deleted and the result shall be displayed instantly.
static cString String(void);
///< Returns a localized string of the form "Disk nn% - hh:mm free".
///< This function is mainly for use in skins that want to retain the display of the
///< free disk space in the menu title, as was the case until VDR version 1.7.27.
///< An implicit call to HasChanged() is done in this function, to make sure the
///< returned value is up to date.
static int UsedPercent(void) { return usedPercent; }
///< Returns the used space of the video disk in percent.
///< The caller should call HasChanged() first, to make sure the value is up to date.
static int FreeMB(void) { return freeMB; }
///< Returns the amount of free space on the video disk in MB.
///< The caller should call HasChanged() first, to make sure the value is up to date.
static int FreeMinutes(void) { return freeMinutes; }
///< Returns the number of minutes that can still be recorded on the video disk.
///< This is an estimate and depends on the data rate of the existing recordings.
///< There is no guarantee that this value will actually be met.
///< The caller should call HasChanged() first, to make sure the value is up to date.
};
#endif //__VIDEODIR_H