mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Version 1.7.24
Original announce message:
VDR developer version 1.7.24 is now available at
       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.24.tar.bz2
A 'diff' against the previous version is available at
       ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.23-1.7.24.diff
MD5 checksums:
a034c5e399417dfc583483f650d003ee  vdr-1.7.24.tar.bz2
aa1a2b202da92e65945ff39470b26618  vdr-1.7.23-1.7.24.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.
From the HISTORY file:
- Updated the Italian OSD texts (thanks to Diego Pierotto).
- Fixed a high load in case a transponder can't be received.
- Improved the way DVB_API_VERSION is checked.
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed asserting there is a live programme if the primary device is bonded with
  a device that starts a recording on a different band.
- Fixed the return type of cMyDeviceHook::DeviceProvidesTransponder() in PLUGINS.html.
- Fixed a crash in a plugin using cDeviceHook when VDR ends (reported by Oliver Endriss).
- Some improvements to the Makefiles (thanks to Christian Ruppert).
- Fixed cRecording::LengthInSeconds(), which wrongfully rounded the result to full
  minutes (thanks to Christoph Haubrich).
- Symbolic links are no longer resolved in cRecordings::ScanVideoDir() (thanks to
  Sundararaj Reel).
- The epg.data file is now read in a separate thread to make the startup process
  faster in case the file is very large (suggested by Helmut Auer).
- Fixed selecting the primary device for receiving the live viewing channel in
  case it is bonded with an other device and has no receiver attached to it.
- Fixed a possible crash when canceling VDR while displaying subtitles, and the
  primary device is no longer available.
- Improved handling subtitles of BBC channels.
- No longer using tabs as delimiter in the EPG bugfix log (they were garbled in the
  log file).
- Added a missing '.' after the month in VPS strings.
- Added some missing 'const' to cDevice (thanks to Joachim Wilke).
- Fixed handling the PrimaryLimit when requesting a device for live viewing
  (reported by Uwe Scheffler).
- Removed superfluous calls to SetVideoFormat() from device constructors. This
  function is called in cDevice::SetPrimaryDevice(), anyway.
- An ongoing editing process is now canceled if either the original or the edited
  version of the recording is deleted from the Recordings menu.
- The SVDRP command DELR now won't delete a recording that is currently being edited.
- Removed code stub for obsolete SVDRP command MOVT.
- The DVB device adapters/frontends are now probed by scanning the /dev/dvb directory
  instead of looping through adapter/frontend numbers. This allows for "holes" in the
  device numbering.
- cReadDir::Next() now skips directory entries "." and "..".
- Fixed a possible deadlock in time shift mode.
- Fixed switching into time shift mode when pausing live video (thanks to Reinhard
  Nissl for helping to debug this one).
			
			
This commit is contained in:
		
				
					committed by
					
						
						Dieter Hametner
					
				
			
			
				
	
			
			
			
						parent
						
							59f0138a7d
						
					
				
				
					commit
					c2d9577b3d
				
			
							
								
								
									
										22
									
								
								CONTRIBUTORS
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								CONTRIBUTORS
									
									
									
									
									
								
							@@ -272,6 +272,8 @@ Uwe Scheffler <linux_dvb@uni.de>
 | 
			
		||||
 for helping to test new DVB-T handling
 | 
			
		||||
 for reporting a bug in switching the video format in the Setup/DVB menu
 | 
			
		||||
 for reporting a problem with frozen live view in conjunction with device bonding
 | 
			
		||||
 for reporting a problem in handling the PrimaryLimit when requesting a device for
 | 
			
		||||
 live viewing
 | 
			
		||||
 | 
			
		||||
Matjaz Thaler <matjaz.thaler@guest.arnes.si>
 | 
			
		||||
 for improving AC3 decoding when replaying DVDs
 | 
			
		||||
@@ -604,6 +606,7 @@ Helmut Auer <vdr@helmutauer.de>
 | 
			
		||||
 for a patch that was used to implement the command line options --edit and
 | 
			
		||||
 --genindex
 | 
			
		||||
 for suggesting to disable EPG processing for a while after a CLRE command
 | 
			
		||||
 for suggesting to read the epg.data file in a separate thread
 | 
			
		||||
 | 
			
		||||
Jeremy Hall <jhall@UU.NET>
 | 
			
		||||
 for fixing an incomplete initialization of the filter parameters in eit.c
 | 
			
		||||
@@ -680,6 +683,7 @@ Oliver Endriss <o.endriss@gmx.de>
 | 
			
		||||
 for his input on calculating the Aspect factor in GetOsdSize()
 | 
			
		||||
 for suggesting a better way of handling calls to realloc()
 | 
			
		||||
 for making the cutter set the 'broken link' flag for MPEG2 TS recordings
 | 
			
		||||
 for reporting a crash in a plugin using cDeviceHook when VDR ends
 | 
			
		||||
 | 
			
		||||
Reinhard Walter Buchner <rw.buchner@freenet.de>
 | 
			
		||||
 for adding some satellites to 'sources.conf'
 | 
			
		||||
@@ -1125,6 +1129,7 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
 | 
			
		||||
 for adding support for DVB-T2 to libsi
 | 
			
		||||
 for adding support for handling DVB-T2 transponders
 | 
			
		||||
 for suggesting to add member functions Adapter() and Frontend() to cDvbDevice
 | 
			
		||||
 for improving handling subtitles of BBC channels
 | 
			
		||||
 | 
			
		||||
Ralf Klueber <ralf.klueber@vodafone.com>
 | 
			
		||||
 for reporting a bug in cutting a recording if there is only a single editing mark
 | 
			
		||||
@@ -1293,6 +1298,7 @@ Reinhard Nissl <rnissl@gmx.de>
 | 
			
		||||
 for making subtitle PIDs be decrypted
 | 
			
		||||
 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
 | 
			
		||||
 | 
			
		||||
Richard Robson <richard_robson@beeb.net>
 | 
			
		||||
 for reporting freezing replay if a timer starts while in Transfer Mode from the
 | 
			
		||||
@@ -1765,6 +1771,7 @@ Joachim Wilke <vdr@joachim-wilke.de>
 | 
			
		||||
 for adding a missing 'const' to cRecording::FramesPerSecond()
 | 
			
		||||
 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
 | 
			
		||||
 | 
			
		||||
Sascha Klek <sklek@gmx.de>
 | 
			
		||||
 for reporting a problem with the '0' key in the "Day" item of the "Timers" menu
 | 
			
		||||
@@ -2267,6 +2274,8 @@ Christoph Haubrich <christoph1.haubrich@arcor.de>
 | 
			
		||||
 index file
 | 
			
		||||
 for fixing setting the start time of an edited recording
 | 
			
		||||
 for adding support for HbbTV to libsi
 | 
			
		||||
 for fixing cRecording::LengthInSeconds(), which wrongfully rounded the result to full
 | 
			
		||||
 minutes
 | 
			
		||||
 | 
			
		||||
Pekka Mauno <pekka.mauno@iki.fi>
 | 
			
		||||
 for fixing cSchedule::GetFollowingEvent() in case there is currently no present
 | 
			
		||||
@@ -2816,3 +2825,16 @@ 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
 | 
			
		||||
 | 
			
		||||
Christian Ruppert <idl0r@gentoo.org>
 | 
			
		||||
 for some improvements to the Makefiles
 | 
			
		||||
 | 
			
		||||
Ralf Schueler <dl4mw@schueler.ws>
 | 
			
		||||
 for backporting "Changed cDvbDevice::GrabImage() to use V4L" from version 1.7.3
 | 
			
		||||
 to 1.6.0-3
 | 
			
		||||
 for backporting "Added some missing 'const' keywords to avoid compilation errors
 | 
			
		||||
 with gcc 4.4" from version 1.7.8 to 1.6.0-3
 | 
			
		||||
 for backporting "Modified cSVDRP::CmdGRAB() to avoid writing into const data"
 | 
			
		||||
 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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								HISTORY
									
									
									
									
									
								
							@@ -6835,3 +6835,56 @@ Video Disk Recorder Revision History
 | 
			
		||||
  progress display.
 | 
			
		||||
- Fixed frozen live view with device bonding in case the bonded master is used for
 | 
			
		||||
  live viewing (reported by Uwe Scheffler).
 | 
			
		||||
 | 
			
		||||
2012-02-14: Version 1.6.0-3
 | 
			
		||||
 | 
			
		||||
- Changed cDvbDevice::GrabImage() to use V4L2
 | 
			
		||||
  (backport from version 1.7.3, thanks to Ralf Schueler).
 | 
			
		||||
- Added some missing 'const' keywords to avoid compilation errors with gcc 4.4
 | 
			
		||||
  (backport from version 1.7.8, thanks to Ralf Schueler).
 | 
			
		||||
- Modified cSVDRP::CmdGRAB() to avoid writing into const data
 | 
			
		||||
  (backport from version 1.7.8, thanks to Ralf Schueler).
 | 
			
		||||
- Fixed cRecordings::DelByName() to avoid compilation errors with gcc 4.4
 | 
			
		||||
  (backport from version 1.7.9, thanks to Ralf Schueler).
 | 
			
		||||
 | 
			
		||||
2012-02-19: Version 1.7.24
 | 
			
		||||
 | 
			
		||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
 | 
			
		||||
- Fixed a high load in case a transponder can't be received.
 | 
			
		||||
- Improved the way DVB_API_VERSION is checked.
 | 
			
		||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
 | 
			
		||||
- Fixed asserting there is a live programme if the primary device is bonded with
 | 
			
		||||
  a device that starts a recording on a different band.
 | 
			
		||||
- Fixed the return type of cMyDeviceHook::DeviceProvidesTransponder() in PLUGINS.html.
 | 
			
		||||
- Fixed a crash in a plugin using cDeviceHook when VDR ends (reported by Oliver Endriss).
 | 
			
		||||
- Some improvements to the Makefiles (thanks to Christian Ruppert).
 | 
			
		||||
- Fixed cRecording::LengthInSeconds(), which wrongfully rounded the result to full
 | 
			
		||||
  minutes (thanks to Christoph Haubrich).
 | 
			
		||||
- Symbolic links are no longer resolved in cRecordings::ScanVideoDir() (thanks to
 | 
			
		||||
  Sundararaj Reel).
 | 
			
		||||
- The epg.data file is now read in a separate thread to make the startup process
 | 
			
		||||
  faster in case the file is very large (suggested by Helmut Auer).
 | 
			
		||||
- Fixed selecting the primary device for receiving the live viewing channel in
 | 
			
		||||
  case it is bonded with an other device and has no receiver attached to it.
 | 
			
		||||
- Fixed a possible crash when canceling VDR while displaying subtitles, and the
 | 
			
		||||
  primary device is no longer available.
 | 
			
		||||
- Improved handling subtitles of BBC channels.
 | 
			
		||||
- No longer using tabs as delimiter in the EPG bugfix log (they were garbled in the
 | 
			
		||||
  log file).
 | 
			
		||||
- Added a missing '.' after the month in VPS strings.
 | 
			
		||||
- Added some missing 'const' to cDevice (thanks to Joachim Wilke).
 | 
			
		||||
- Fixed handling the PrimaryLimit when requesting a device for live viewing
 | 
			
		||||
  (reported by Uwe Scheffler).
 | 
			
		||||
- Removed superfluous calls to SetVideoFormat() from device constructors. This
 | 
			
		||||
  function is called in cDevice::SetPrimaryDevice(), anyway.
 | 
			
		||||
- An ongoing editing process is now canceled if either the original or the edited
 | 
			
		||||
  version of the recording is deleted from the Recordings menu.
 | 
			
		||||
- The SVDRP command DELR now won't delete a recording that is currently being edited.
 | 
			
		||||
- Removed code stub for obsolete SVDRP command MOVT.
 | 
			
		||||
- The DVB device adapters/frontends are now probed by scanning the /dev/dvb directory
 | 
			
		||||
  instead of looping through adapter/frontend numbers. This allows for "holes" in the
 | 
			
		||||
  device numbering.
 | 
			
		||||
- cReadDir::Next() now skips directory entries "." and "..".
 | 
			
		||||
- Fixed a possible deadlock in time shift mode.
 | 
			
		||||
- Fixed switching into time shift mode when pausing live video (thanks to Reinhard
 | 
			
		||||
  Nissl for helping to debug this one).
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								INSTALL
									
									
									
									
									
								
							@@ -304,7 +304,7 @@ multiple slashes).
 | 
			
		||||
Note that the file system need not be 64-bit proof, since the 'vdr'
 | 
			
		||||
program splits video files into chunks of about 2GB. You should use
 | 
			
		||||
a disk with several gigabytes of free space. One GB can store roughly
 | 
			
		||||
half an hour of video data.
 | 
			
		||||
half an hour of SD video data, or 10 minutes of HD video.
 | 
			
		||||
 | 
			
		||||
If you have more than one disk and don't want to combine them to form
 | 
			
		||||
one large logical volume, you can set up several video directories as
 | 
			
		||||
 
 | 
			
		||||
@@ -6,15 +6,15 @@
 | 
			
		||||
# See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
# how to reach the author.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Make.config.template 2.4 2011/12/04 14:41:00 kls Exp $
 | 
			
		||||
# $Id: Make.config.template 2.5 2012/01/18 12:20:51 kls Exp $
 | 
			
		||||
 | 
			
		||||
### The C compiler and options:
 | 
			
		||||
 | 
			
		||||
CC       = gcc
 | 
			
		||||
CFLAGS   = -g -O3 -Wall
 | 
			
		||||
CC       ?= gcc
 | 
			
		||||
CFLAGS   ?= -g -O3 -Wall
 | 
			
		||||
 | 
			
		||||
CXX      = g++
 | 
			
		||||
CXXFLAGS = -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
CXX      ?= g++
 | 
			
		||||
CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
ifdef PLUGIN
 | 
			
		||||
CFLAGS   += -fPIC
 | 
			
		||||
@@ -23,23 +23,24 @@ endif
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
#DVBDIR   = /usr/src/v4l-dvb/linux
 | 
			
		||||
MANDIR   = /usr/local/man
 | 
			
		||||
BINDIR   = /usr/local/bin
 | 
			
		||||
PREFIX   ?= $(DESTDIR)/usr/local
 | 
			
		||||
#DVBDIR   ?= /usr/src/v4l-dvb/linux
 | 
			
		||||
MANDIR   ?= $(PREFIX)/man
 | 
			
		||||
BINDIR   ?= $(PREFIX)/bin
 | 
			
		||||
 | 
			
		||||
LOCDIR   = ./locale
 | 
			
		||||
PLUGINDIR= ./PLUGINS
 | 
			
		||||
PLUGINLIBDIR= $(PLUGINDIR)/lib
 | 
			
		||||
VIDEODIR = /video
 | 
			
		||||
CONFDIR  = $(VIDEODIR)
 | 
			
		||||
LOCDIR       ?= ./locale
 | 
			
		||||
PLUGINDIR    ?= ./PLUGINS
 | 
			
		||||
PLUGINLIBDIR ?= $(PLUGINDIR)/lib
 | 
			
		||||
VIDEODIR     ?= /video
 | 
			
		||||
CONFDIR      ?= $(VIDEODIR)
 | 
			
		||||
 | 
			
		||||
### The remote control:
 | 
			
		||||
 | 
			
		||||
LIRC_DEVICE = /var/run/lirc/lircd
 | 
			
		||||
RCU_DEVICE  = /dev/ttyS1
 | 
			
		||||
LIRC_DEVICE ?= /var/run/lirc/lircd
 | 
			
		||||
RCU_DEVICE  ?= /dev/ttyS1
 | 
			
		||||
 | 
			
		||||
## Define if you want vdr to not run as root
 | 
			
		||||
#VDR_USER = vdr
 | 
			
		||||
#VDR_USER ?= vdr
 | 
			
		||||
 | 
			
		||||
### You don't need to touch the following:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								Makefile
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
# See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
# how to reach the author.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.23 2012/01/14 13:09:10 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.24 2012/01/18 12:19:37 kls Exp $
 | 
			
		||||
 | 
			
		||||
.DELETE_ON_ERROR:
 | 
			
		||||
 | 
			
		||||
@@ -17,10 +17,10 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
LSIDIR   = ./libsi
 | 
			
		||||
DESTDIR ?=
 | 
			
		||||
PREFIX  ?= /usr/local
 | 
			
		||||
MANDIR   = $(PREFIX)/share/man
 | 
			
		||||
BINDIR   = $(PREFIX)/bin
 | 
			
		||||
INCDIR   = $(PREFIX)/include
 | 
			
		||||
LOCDIR   = ./locale
 | 
			
		||||
MANDIR  ?= $(PREFIX)/share/man
 | 
			
		||||
BINDIR  ?= $(PREFIX)/bin
 | 
			
		||||
INCDIR  ?= $(PREFIX)/include
 | 
			
		||||
LOCDIR  ?= ./locale
 | 
			
		||||
LIBS     = -ljpeg -lpthread -ldl -lcap -lrt $(shell pkg-config --libs freetype2 fontconfig)
 | 
			
		||||
INCLUDES ?= $(shell pkg-config --cflags freetype2 fontconfig)
 | 
			
		||||
 | 
			
		||||
@@ -30,7 +30,7 @@ PLUGINLIBDIR= $(PLUGINDIR)/lib
 | 
			
		||||
VIDEODIR = /video
 | 
			
		||||
CONFDIR  = $(VIDEODIR)
 | 
			
		||||
 | 
			
		||||
DOXYGEN  = /usr/bin/doxygen
 | 
			
		||||
DOXYGEN ?= /usr/bin/doxygen
 | 
			
		||||
DOXYFILE = Doxyfile
 | 
			
		||||
 | 
			
		||||
PCDIR   ?= $(firstword $(subst :, , ${PKG_CONFIG_PATH}:$(shell pkg-config --variable=pc_path pkg-config):$(PREFIX)/lib/pkgconfig))
 | 
			
		||||
@@ -246,4 +246,3 @@ clean:
 | 
			
		||||
	-rm -rf include
 | 
			
		||||
	-rm -rf srcdoc
 | 
			
		||||
CLEAN: clean
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1993,7 +1993,7 @@ whatever actions are necessary to determine whether the given Device can
 | 
			
		||||
provide the given Channel's transponder, as in
 | 
			
		||||
 | 
			
		||||
<p><table><tr><td class="code"><pre>
 | 
			
		||||
void cMyDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const
 | 
			
		||||
bool cMyDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChannel *Channel) const
 | 
			
		||||
{
 | 
			
		||||
  if (<i>condition where Device can't provide Channel</i>)
 | 
			
		||||
     return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 1.9 2011/12/04 15:30:21 kls Exp $
 | 
			
		||||
# $Id: Makefile 1.12 2012/02/08 15:10:09 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -22,9 +22,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
@@ -51,7 +51,7 @@ DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 | 
			
		||||
 | 
			
		||||
### The object files (add further files here):
 | 
			
		||||
 | 
			
		||||
OBJS = $(PLUGIN).o bitbuffer.o dvbhdffdevice.o hdffcmd.o hdffosd.o setup.o
 | 
			
		||||
OBJS = $(PLUGIN).o dvbhdffdevice.o hdffcmd.o hdffosd.o menu.o setup.o
 | 
			
		||||
 | 
			
		||||
### The main target:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,97 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * bitbuffer.c: TODO(short description)
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: bitbuffer.c 1.1 2009/12/29 14:29:20 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "bitbuffer.h"
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
cBitBuffer::cBitBuffer(uint32_t MaxLength)
 | 
			
		||||
{
 | 
			
		||||
    mData = NULL;
 | 
			
		||||
    mMaxLength = 0;
 | 
			
		||||
    mBitPos = 0;
 | 
			
		||||
 | 
			
		||||
    if (MaxLength <= 0x10000)
 | 
			
		||||
    {
 | 
			
		||||
        mData = new uint8_t[MaxLength];
 | 
			
		||||
        if (mData)
 | 
			
		||||
        {
 | 
			
		||||
            mMaxLength = MaxLength * 8;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cBitBuffer::~cBitBuffer(void)
 | 
			
		||||
{
 | 
			
		||||
    if (mData)
 | 
			
		||||
        delete[] mData;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t * cBitBuffer::GetData(void)
 | 
			
		||||
{
 | 
			
		||||
    return mData;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t cBitBuffer::GetMaxLength(void)
 | 
			
		||||
{
 | 
			
		||||
    return mMaxLength / 8;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t cBitBuffer::GetBits(int NumBits)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cBitBuffer::SetBits(int NumBits, uint32_t Data)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t nextBitPos;
 | 
			
		||||
    uint32_t bytePos;
 | 
			
		||||
    uint32_t bitsInByte;
 | 
			
		||||
    int shift;
 | 
			
		||||
 | 
			
		||||
    if (NumBits <= 0 || NumBits > 32)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    nextBitPos = mBitPos + NumBits;
 | 
			
		||||
 | 
			
		||||
    if (nextBitPos > mMaxLength)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    bytePos = mBitPos / 8;
 | 
			
		||||
    bitsInByte = mBitPos % 8;
 | 
			
		||||
 | 
			
		||||
    mData[bytePos] &= (uint8_t) (0xFF << (8 - bitsInByte));
 | 
			
		||||
    shift = NumBits - (8 - bitsInByte);
 | 
			
		||||
    if (shift > 0)
 | 
			
		||||
        mData[bytePos] |= (uint8_t) (Data >> shift);
 | 
			
		||||
    else
 | 
			
		||||
        mData[bytePos] |= (uint8_t) (Data << (-shift));
 | 
			
		||||
    NumBits -= 8 - bitsInByte;
 | 
			
		||||
    bytePos++;
 | 
			
		||||
    while (NumBits > 0)
 | 
			
		||||
    {
 | 
			
		||||
        shift = NumBits - 8;
 | 
			
		||||
        if (shift > 0)
 | 
			
		||||
            mData[bytePos] = (uint8_t) (Data >> shift);
 | 
			
		||||
        else
 | 
			
		||||
            mData[bytePos] = (uint8_t) (Data << (-shift));
 | 
			
		||||
        NumBits -= 8;
 | 
			
		||||
        bytePos++;
 | 
			
		||||
    }
 | 
			
		||||
    mBitPos = nextBitPos;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t cBitBuffer::GetByteLength(void)
 | 
			
		||||
{
 | 
			
		||||
    return (mBitPos + 7) / 8;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cBitBuffer::SetDataByte(uint32_t Position, uint8_t Data)
 | 
			
		||||
{
 | 
			
		||||
    if (Position < mMaxLength)
 | 
			
		||||
        mData[Position] = Data;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * bitbuffer.h: TODO(short description)
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: bitbuffer.h 1.1 2009/12/29 14:27:03 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _HDFF_BITBUFFER_H_
 | 
			
		||||
#define _HDFF_BITBUFFER_H_
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
class cBitBuffer
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    uint8_t * mData;
 | 
			
		||||
    uint32_t mMaxLength;
 | 
			
		||||
    uint32_t mBitPos;
 | 
			
		||||
public:
 | 
			
		||||
    cBitBuffer(uint32_t MaxLength);
 | 
			
		||||
    ~cBitBuffer(void);
 | 
			
		||||
    uint8_t * GetData(void);
 | 
			
		||||
    uint32_t GetMaxLength(void);
 | 
			
		||||
    uint32_t GetBits(int NumBits);
 | 
			
		||||
    void SetBits(int NumBits, uint32_t Data);
 | 
			
		||||
    uint32_t GetByteLength(void);
 | 
			
		||||
    void SetDataByte(uint32_t Position, uint8_t Data);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -3,29 +3,37 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbhddevice.c 1.14 2011/08/27 09:31:45 kls Exp $
 | 
			
		||||
 * $Id: dvbhddevice.c 1.16 2012/02/08 15:10:30 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <vdr/plugin.h>
 | 
			
		||||
#include <vdr/shutdown.h>
 | 
			
		||||
#include "dvbhdffdevice.h"
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
#include "setup.h"
 | 
			
		||||
 | 
			
		||||
static const char *VERSION        = "0.0.4";
 | 
			
		||||
static const char *DESCRIPTION    = trNOOP("HD Full Featured DVB device");
 | 
			
		||||
static const char *MAINMENUENTRY  = "dvbhddevice";
 | 
			
		||||
 | 
			
		||||
class cPluginDvbhddevice : public cPlugin {
 | 
			
		||||
private:
 | 
			
		||||
  cDvbHdFfDeviceProbe *probe;
 | 
			
		||||
  bool mIsUserInactive;
 | 
			
		||||
public:
 | 
			
		||||
  cPluginDvbhddevice(void);
 | 
			
		||||
  virtual ~cPluginDvbhddevice();
 | 
			
		||||
  virtual const char *Version(void) { return VERSION; }
 | 
			
		||||
  virtual const char *Description(void) { return tr(DESCRIPTION); }
 | 
			
		||||
  virtual void MainThreadHook(void);
 | 
			
		||||
  virtual const char *MainMenuEntry(void);
 | 
			
		||||
  virtual cOsdObject *MainMenuAction(void);
 | 
			
		||||
  virtual cMenuSetupPage *SetupMenu(void);
 | 
			
		||||
  virtual bool SetupParse(const char *Name, const char *Value);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
cPluginDvbhddevice::cPluginDvbhddevice(void)
 | 
			
		||||
:   mIsUserInactive(true)
 | 
			
		||||
{
 | 
			
		||||
  probe = new cDvbHdFfDeviceProbe;
 | 
			
		||||
}
 | 
			
		||||
@@ -35,6 +43,33 @@ cPluginDvbhddevice::~cPluginDvbhddevice()
 | 
			
		||||
  delete probe;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cPluginDvbhddevice::MainThreadHook(void)
 | 
			
		||||
{
 | 
			
		||||
    bool isUserInactive = ShutdownHandler.IsUserInactive();
 | 
			
		||||
    if (isUserInactive != mIsUserInactive)
 | 
			
		||||
    {
 | 
			
		||||
        mIsUserInactive = isUserInactive;
 | 
			
		||||
        if (gHdffSetup.CecEnabled && gHdffSetup.CecTvOn)
 | 
			
		||||
        {
 | 
			
		||||
            HDFF::cHdffCmdIf * hdffCmdIf = cDvbHdFfDevice::GetHdffCmdHandler();
 | 
			
		||||
            if (!mIsUserInactive)
 | 
			
		||||
            {
 | 
			
		||||
                hdffCmdIf->CmdHdmiSendCecCommand(HDFF_CEC_COMMAND_TV_ON);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *cPluginDvbhddevice::MainMenuEntry(void)
 | 
			
		||||
{
 | 
			
		||||
  return gHdffSetup.HideMainMenu ? NULL : MAINMENUENTRY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cOsdObject *cPluginDvbhddevice::MainMenuAction(void)
 | 
			
		||||
{
 | 
			
		||||
  return new cHdffMenu(cDvbHdFfDevice::GetHdffCmdHandler());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cMenuSetupPage *cPluginDvbhddevice::SetupMenu(void)
 | 
			
		||||
{
 | 
			
		||||
  return new cHdffSetupPage(cDvbHdFfDevice::GetHdffCmdHandler());
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,11 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbhdffdevice.c 1.35 2011/12/04 15:30:42 kls Exp $
 | 
			
		||||
 * $Id: dvbhdffdevice.c 1.39 2012/02/15 13:14:49 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "dvbhdffdevice.h"
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
@@ -50,30 +52,34 @@ cDvbHdFfDevice::cDvbHdFfDevice(int Adapter, int Frontend)
 | 
			
		||||
     mHdffCmdIf->CmdAvSetAudioDownmix((HdffAudioDownmixMode_t) gHdffSetup.AudioDownmix);
 | 
			
		||||
     mHdffCmdIf->CmdMuxSetVideoOut((HdffVideoOut_t) gHdffSetup.AnalogueVideo);
 | 
			
		||||
     mHdffCmdIf->CmdHdmiSetVideoMode(gHdffSetup.GetVideoMode());
 | 
			
		||||
 | 
			
		||||
     HdffHdmiConfig_t hdmiConfig;
 | 
			
		||||
     memset(&hdmiConfig, 0, sizeof(hdmiConfig));
 | 
			
		||||
     hdmiConfig.TransmitAudio = true;
 | 
			
		||||
     hdmiConfig.ForceDviMode = false;
 | 
			
		||||
     hdmiConfig.CecEnabled = gHdffSetup.CecEnabled;
 | 
			
		||||
     strcpy(hdmiConfig.CecDeviceName, "VDR");
 | 
			
		||||
     hdmiConfig.VideoModeAdaption = (HdffVideoModeAdaption_t) gHdffSetup.VideoModeAdaption;
 | 
			
		||||
     mHdffCmdIf->CmdHdmiConfigure(&hdmiConfig);
 | 
			
		||||
     if (gHdffSetup.CecEnabled)
 | 
			
		||||
        mHdffCmdIf->CmdHdmiSendCecCommand(HDFF_CEC_COMMAND_TV_ON);
 | 
			
		||||
 | 
			
		||||
     mHdffCmdIf->CmdRemoteSetProtocol((HdffRemoteProtocol_t) gHdffSetup.RemoteProtocol);
 | 
			
		||||
     mHdffCmdIf->CmdRemoteSetAddressFilter(gHdffSetup.RemoteAddress >= 0, gHdffSetup.RemoteAddress);
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  // Video format:
 | 
			
		||||
 | 
			
		||||
  SetVideoFormat(Setup.VideoFormat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cDvbHdFfDevice::~cDvbHdFfDevice()
 | 
			
		||||
{
 | 
			
		||||
  delete spuDecoder;
 | 
			
		||||
  if (isHdffPrimary)
 | 
			
		||||
     delete mHdffCmdIf;
 | 
			
		||||
  // We're not explicitly closing any device files here, since this sometimes
 | 
			
		||||
  // caused segfaults. Besides, the program is about to terminate anyway...
 | 
			
		||||
    delete spuDecoder;
 | 
			
		||||
    if (isHdffPrimary)
 | 
			
		||||
    {
 | 
			
		||||
        if (gHdffSetup.CecEnabled && gHdffSetup.CecTvOff)
 | 
			
		||||
        {
 | 
			
		||||
            mHdffCmdIf->CmdHdmiSendCecCommand(HDFF_CEC_COMMAND_TV_OFF);
 | 
			
		||||
        }
 | 
			
		||||
        delete mHdffCmdIf;
 | 
			
		||||
    }
 | 
			
		||||
    // We're not explicitly closing any device files here, since this sometimes
 | 
			
		||||
    // caused segfaults. Besides, the program is about to terminate anyway...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cDvbHdFfDevice::MakePrimaryDevice(bool On)
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,11 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: hdffcmd.c 1.22 2011/12/04 15:31:03 kls Exp $
 | 
			
		||||
 * $Id: hdffcmd.c 1.23 2012/02/06 11:08:48 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "hdffcmd.h"
 | 
			
		||||
#include "libhdffcmd/hdffcmd.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,13 +3,12 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: hdffcmd.h 1.18 2011/12/04 15:31:23 kls Exp $
 | 
			
		||||
 * $Id: hdffcmd.h 1.19 2012/02/06 11:09:27 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _HDFF_CMD_H_
 | 
			
		||||
#define _HDFF_CMD_H_
 | 
			
		||||
 | 
			
		||||
#include "bitbuffer.h"
 | 
			
		||||
#include "libhdffcmd/hdffcmd.h"
 | 
			
		||||
 | 
			
		||||
namespace HDFF
 | 
			
		||||
 
 | 
			
		||||
@@ -4,17 +4,9 @@
 | 
			
		||||
 | 
			
		||||
VERSION = 0.1.0
 | 
			
		||||
 | 
			
		||||
ifndef $(INSTALL_PATH)
 | 
			
		||||
    INSTALL_PATH=/usr/local
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifndef $(INSTALL_LIB_PATH)
 | 
			
		||||
    INSTALL_LIB_PATH=$(INSTALL_PATH)/lib
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifndef $(INSTALL_INCLUDE_PATH)
 | 
			
		||||
    INSTALL_INCLUDE_PATH=$(INSTALL_PATH)/include
 | 
			
		||||
endif
 | 
			
		||||
INSTALL_PATH         ?= /usr/local
 | 
			
		||||
INSTALL_LIB_PATH     ?= $(INSTALL_PATH)/lib
 | 
			
		||||
INSTALL_INCLUDE_PATH ?= $(INSTALL_PATH)/include
 | 
			
		||||
 | 
			
		||||
LIB_NAME = libhdffcmd
 | 
			
		||||
 | 
			
		||||
@@ -27,9 +19,10 @@ LIB_HEADERS = hdffcmd.h hdffcmd_av.h hdffcmd_generic.h hdffcmd_hdmi.h \
 | 
			
		||||
LIB_STATIC = $(LIB_NAME).a
 | 
			
		||||
LIB_SHARED = $(LIB_NAME)-$(VERSION).so
 | 
			
		||||
 | 
			
		||||
CC     = gcc
 | 
			
		||||
CFLAGS = -g -O2 -fPIC -Wall
 | 
			
		||||
AR     = ar -r
 | 
			
		||||
CC      ?= gcc
 | 
			
		||||
CFLAGS  ?= -g -O2 -fPIC -Wall
 | 
			
		||||
AR      ?= ar
 | 
			
		||||
ARFLAGS ?= r
 | 
			
		||||
 | 
			
		||||
### Implicit rules:
 | 
			
		||||
 | 
			
		||||
@@ -50,10 +43,10 @@ $(DEPFILE): Makefile
 | 
			
		||||
all: $(LIB_STATIC) $(LIB_SHARED)
 | 
			
		||||
 | 
			
		||||
$(LIB_STATIC): $(LIB_OBJS)
 | 
			
		||||
	$(AR) $(LIB_STATIC) $(LIB_OBJS)
 | 
			
		||||
	$(AR) $(ARFLAGS) $(LIB_STATIC) $(LIB_OBJS)
 | 
			
		||||
 | 
			
		||||
$(LIB_SHARED): $(LIB_OBJS)
 | 
			
		||||
	$(CC) -fPIC -shared -o $(LIB_SHARED) $(LIB_OBJS)
 | 
			
		||||
	$(CC) $(CFLAGS) $(LDFLAGS) -fPIC -shared -o $(LIB_SHARED) $(LIB_OBJS)
 | 
			
		||||
	ln -sf $(LIB_SHARED) $(LIB_NAME).so
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,8 @@ typedef enum HdffVideoConversion_t
 | 
			
		||||
    HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9,
 | 
			
		||||
    HDFF_VIDEO_CONVERSION_PILLARBOX,
 | 
			
		||||
    HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT,
 | 
			
		||||
    HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9
 | 
			
		||||
    HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9,
 | 
			
		||||
    HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9
 | 
			
		||||
} HdffVideoConversion_t;
 | 
			
		||||
 | 
			
		||||
typedef struct HdffVideoFormat_t
 | 
			
		||||
 
 | 
			
		||||
@@ -111,6 +111,7 @@ typedef enum HdffMessageId_t
 | 
			
		||||
    HDFF_MSG_HDMI_GET_DISPLAY_INFO,
 | 
			
		||||
    HDFF_MSG_HDMI_GET_VIDEO_MODE,
 | 
			
		||||
    HDFF_MSG_HDMI_SEND_CEC_COMMAND,
 | 
			
		||||
    HDFF_MSG_HDMI_SEND_RAW_CEC_COMMAND,
 | 
			
		||||
 | 
			
		||||
    HDFF_MSG_REMOTE_SET_PROTOCOL = 0,
 | 
			
		||||
    HDFF_MSG_REMOTE_SET_ADDRESS_FILTER,
 | 
			
		||||
 
 | 
			
		||||
@@ -48,9 +48,11 @@ int HdffCmdHdmiSetVideoMode(int OsdDevice, HdffVideoMode_t VideoMode)
 | 
			
		||||
 | 
			
		||||
int HdffCmdHdmiConfigure(int OsdDevice, const HdffHdmiConfig_t * Config)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t cmdData[8];
 | 
			
		||||
    uint8_t cmdData[24];
 | 
			
		||||
    BitBuffer_t cmdBuf;
 | 
			
		||||
    osd_raw_cmd_t osd_cmd;
 | 
			
		||||
    size_t nameLen;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    BitBuffer_Init(&cmdBuf, cmdData, sizeof(cmdData));
 | 
			
		||||
    memset(&osd_cmd, 0, sizeof(osd_raw_cmd_t));
 | 
			
		||||
@@ -61,6 +63,14 @@ int HdffCmdHdmiConfigure(int OsdDevice, const HdffHdmiConfig_t * Config)
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 1, Config->ForceDviMode ? 1 : 0);
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 1, Config->CecEnabled ? 1 : 0);
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 3, Config->VideoModeAdaption);
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 6, 0); // reserved
 | 
			
		||||
    nameLen = strlen(Config->CecDeviceName);
 | 
			
		||||
    if (nameLen > 13)
 | 
			
		||||
        nameLen = 13;
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 4, nameLen);
 | 
			
		||||
    for (i = 0; i < nameLen; i++)
 | 
			
		||||
        BitBuffer_SetBits(&cmdBuf, 8, Config->CecDeviceName[i]);
 | 
			
		||||
 | 
			
		||||
    osd_cmd.cmd_len = HdffCmdSetLength(&cmdBuf);
 | 
			
		||||
    return ioctl(OsdDevice, OSD_RAW_CMD, &osd_cmd);
 | 
			
		||||
}
 | 
			
		||||
@@ -80,3 +90,31 @@ int HdffCmdHdmiSendCecCommand(int OsdDevice, HdffCecCommand_t Command)
 | 
			
		||||
    osd_cmd.cmd_len = HdffCmdSetLength(&cmdBuf);
 | 
			
		||||
    return ioctl(OsdDevice, OSD_RAW_CMD, &osd_cmd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int HdffCmdHdmiSendRawCecCommand(int OsdDevice, uint8_t Destination,
 | 
			
		||||
                                 uint8_t Opcode, const uint8_t * Operand,
 | 
			
		||||
                                 uint8_t OperandLength)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t cmdData[24];
 | 
			
		||||
    BitBuffer_t cmdBuf;
 | 
			
		||||
    osd_raw_cmd_t osd_cmd;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    if (OperandLength > 14)
 | 
			
		||||
        OperandLength = 14;
 | 
			
		||||
 | 
			
		||||
    BitBuffer_Init(&cmdBuf, cmdData, sizeof(cmdData));
 | 
			
		||||
    memset(&osd_cmd, 0, sizeof(osd_raw_cmd_t));
 | 
			
		||||
    osd_cmd.cmd_data = cmdData;
 | 
			
		||||
    HdffCmdBuildHeader(&cmdBuf, HDFF_MSG_TYPE_COMMAND, HDFF_MSG_GROUP_HDMI,
 | 
			
		||||
                       HDFF_MSG_HDMI_SEND_RAW_CEC_COMMAND);
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 4, 0); // reserved
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 4, Destination);
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 8, Opcode);
 | 
			
		||||
    BitBuffer_SetBits(&cmdBuf, 8, OperandLength);
 | 
			
		||||
    for (i = 0; i < OperandLength; i++)
 | 
			
		||||
        BitBuffer_SetBits(&cmdBuf, 8, Operand[i]);
 | 
			
		||||
 | 
			
		||||
    osd_cmd.cmd_len = HdffCmdSetLength(&cmdBuf);
 | 
			
		||||
    return ioctl(OsdDevice, OSD_RAW_CMD, &osd_cmd);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,14 +47,15 @@ typedef struct HdffHdmiConfig_t
 | 
			
		||||
    int ForceDviMode;
 | 
			
		||||
    int CecEnabled;
 | 
			
		||||
    HdffVideoModeAdaption_t VideoModeAdaption;
 | 
			
		||||
    char CecDeviceName[14];
 | 
			
		||||
} HdffHdmiConfig_t;
 | 
			
		||||
 | 
			
		||||
typedef enum HdffCecCommand_t
 | 
			
		||||
{
 | 
			
		||||
    HDFF_CEC_COMMAND_TV_ON,
 | 
			
		||||
    HDFF_CEC_COMMAND_TV_OFF,
 | 
			
		||||
    HDFF_CEC_COMMAND_TV_ACTIVE_SOURCE,
 | 
			
		||||
    HDFF_CEC_COMMAND_TV_INACTIVE_SOURCE
 | 
			
		||||
    HDFF_CEC_COMMAND_ACTIVE_SOURCE,
 | 
			
		||||
    HDFF_CEC_COMMAND_INACTIVE_SOURCE
 | 
			
		||||
} HdffCecCommand_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -64,4 +65,8 @@ int HdffCmdHdmiConfigure(int OsdDevice, const HdffHdmiConfig_t * Config);
 | 
			
		||||
 | 
			
		||||
int HdffCmdHdmiSendCecCommand(int OsdDevice, HdffCecCommand_t Command);
 | 
			
		||||
 | 
			
		||||
int HdffCmdHdmiSendRawCecCommand(int OsdDevice, uint8_t Destination,
 | 
			
		||||
                                 uint8_t Opcode, const uint8_t * Operand,
 | 
			
		||||
                                 uint8_t OperandLength);
 | 
			
		||||
 | 
			
		||||
#endif /* HDFFCMD_HDMI_H */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										65
									
								
								PLUGINS/src/dvbhddevice/menu.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								PLUGINS/src/dvbhddevice/menu.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
/*
 | 
			
		||||
 * menu.c: The DVB HD Full Featured device main menu
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
#include "setup.h"
 | 
			
		||||
 | 
			
		||||
cHdffMenu::cHdffMenu(HDFF::cHdffCmdIf * pHdffCmdIf)
 | 
			
		||||
:   cOsdMenu("dvbhddevice"),
 | 
			
		||||
    mHdffCmdIf(pHdffCmdIf)
 | 
			
		||||
{
 | 
			
		||||
    mVideoConversionItem = new cOsdItem("", osUnknown, false);
 | 
			
		||||
    Add(mVideoConversionItem);
 | 
			
		||||
    SetHelp(tr("Video Conversion"), tr("TV on"));
 | 
			
		||||
    SetVideoConversion();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cHdffMenu::~cHdffMenu()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cHdffMenu::ProcessKey(eKeys key)
 | 
			
		||||
{
 | 
			
		||||
    eOSState state = cOsdMenu::ProcessKey(key);
 | 
			
		||||
    if (state == osUnknown)
 | 
			
		||||
    {
 | 
			
		||||
        switch (key)
 | 
			
		||||
        {
 | 
			
		||||
            case kRed:
 | 
			
		||||
                gHdffSetup.SetNextVideoConversion();
 | 
			
		||||
                SetVideoConversion();
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case kGreen:
 | 
			
		||||
                mHdffCmdIf->CmdHdmiSendCecCommand(HDFF_CEC_COMMAND_TV_ON);
 | 
			
		||||
                state = osEnd;
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case kOk:
 | 
			
		||||
                state = osEnd;
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return state;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cHdffMenu::SetVideoConversion(void)
 | 
			
		||||
{
 | 
			
		||||
    HdffVideoFormat_t videoFormat;
 | 
			
		||||
    videoFormat.AutomaticEnabled = true;
 | 
			
		||||
    videoFormat.AfdEnabled = false;
 | 
			
		||||
    videoFormat.TvFormat = (HdffTvFormat_t) gHdffSetup.TvFormat;
 | 
			
		||||
    videoFormat.VideoConversion = (HdffVideoConversion_t) gHdffSetup.VideoConversion;
 | 
			
		||||
    mHdffCmdIf->CmdAvSetVideoFormat(0, &videoFormat);
 | 
			
		||||
 | 
			
		||||
    char str[128];
 | 
			
		||||
    sprintf(str, "%s: %s", tr("Video Conversion"), gHdffSetup.GetVideoConversionString());
 | 
			
		||||
    mVideoConversionItem->SetText(str);
 | 
			
		||||
    Display();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								PLUGINS/src/dvbhddevice/menu.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								PLUGINS/src/dvbhddevice/menu.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 * menu.h: The DVB HD Full Featured device main menu
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _HDFF_MENU_H_
 | 
			
		||||
#define _HDFF_MENU_H_
 | 
			
		||||
 | 
			
		||||
#include <vdr/osd.h>
 | 
			
		||||
#include <vdr/plugin.h>
 | 
			
		||||
 | 
			
		||||
#include "hdffcmd.h"
 | 
			
		||||
 | 
			
		||||
class cHdffMenu : public cOsdMenu
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    HDFF::cHdffCmdIf * mHdffCmdIf;
 | 
			
		||||
 | 
			
		||||
    cOsdItem * mVideoConversionItem;
 | 
			
		||||
 | 
			
		||||
    void SetVideoConversion(void);
 | 
			
		||||
public:
 | 
			
		||||
    cHdffMenu(HDFF::cHdffCmdIf * pHdffCmdIf);
 | 
			
		||||
    virtual ~cHdffMenu();
 | 
			
		||||
    virtual eOSState ProcessKey(eKeys Key);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -7,7 +7,7 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: VDR \n"
 | 
			
		||||
"Report-Msgid-Bugs-To: <see README>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-08-21 14:02+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-07 20:13+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-04-25 21:44+0200\n"
 | 
			
		||||
"Last-Translator: Christoph Haubrich\n"
 | 
			
		||||
"Language-Team: <see README>\n"
 | 
			
		||||
@@ -19,17 +19,11 @@ msgstr ""
 | 
			
		||||
msgid "HD Full Featured DVB device"
 | 
			
		||||
msgstr "HD Full Featured DVB device"
 | 
			
		||||
 | 
			
		||||
msgid "Off"
 | 
			
		||||
msgstr "aus"
 | 
			
		||||
msgid "Video Conversion"
 | 
			
		||||
msgstr "Bildanpassung"
 | 
			
		||||
 | 
			
		||||
msgid "Frame rate"
 | 
			
		||||
msgstr "passende Framerate"
 | 
			
		||||
 | 
			
		||||
msgid "HD Only"
 | 
			
		||||
msgstr "nur bei HD"
 | 
			
		||||
 | 
			
		||||
msgid "Always"
 | 
			
		||||
msgstr "immer"
 | 
			
		||||
msgid "TV on"
 | 
			
		||||
msgstr "TV ein"
 | 
			
		||||
 | 
			
		||||
msgid "Automatic"
 | 
			
		||||
msgstr "automatisch"
 | 
			
		||||
@@ -49,11 +43,26 @@ msgstr "CentreCutOut"
 | 
			
		||||
msgid "Always 16/9"
 | 
			
		||||
msgstr "immer 16:9"
 | 
			
		||||
 | 
			
		||||
msgid "Zoom 16/9"
 | 
			
		||||
msgstr "Zoome 16:9"
 | 
			
		||||
 | 
			
		||||
msgid "Off"
 | 
			
		||||
msgstr "aus"
 | 
			
		||||
 | 
			
		||||
msgid "Frame rate"
 | 
			
		||||
msgstr "passende Framerate"
 | 
			
		||||
 | 
			
		||||
msgid "HD Only"
 | 
			
		||||
msgstr "nur bei HD"
 | 
			
		||||
 | 
			
		||||
msgid "Always"
 | 
			
		||||
msgstr "immer"
 | 
			
		||||
 | 
			
		||||
msgid "Disabled"
 | 
			
		||||
msgstr "abgeschaltet"
 | 
			
		||||
 | 
			
		||||
msgid "Analogue only"
 | 
			
		||||
msgstr "nur Analoge Ausgänge"
 | 
			
		||||
msgstr "nur analoge Ausgänge"
 | 
			
		||||
 | 
			
		||||
msgid "HDMI only"
 | 
			
		||||
msgstr "nur HDMI"
 | 
			
		||||
@@ -73,9 +82,6 @@ msgstr "Auflösungsanpassung"
 | 
			
		||||
msgid "TV format"
 | 
			
		||||
msgstr "TV-Format"
 | 
			
		||||
 | 
			
		||||
msgid "Video Conversion"
 | 
			
		||||
msgstr "Videokonvertierung"
 | 
			
		||||
 | 
			
		||||
msgid "Analogue Video"
 | 
			
		||||
msgstr "Analoges Video"
 | 
			
		||||
 | 
			
		||||
@@ -91,6 +97,12 @@ msgstr "OSD Größe"
 | 
			
		||||
msgid "HDMI CEC"
 | 
			
		||||
msgstr "HDMI CEC"
 | 
			
		||||
 | 
			
		||||
msgid "CEC: Switch TV on"
 | 
			
		||||
msgstr "CEC: TV einschalten"
 | 
			
		||||
 | 
			
		||||
msgid "CEC: Switch TV off"
 | 
			
		||||
msgstr "CEC: TV ausschalten"
 | 
			
		||||
 | 
			
		||||
msgid "Remote Control Protocol"
 | 
			
		||||
msgstr "Fernbedienungsprotokoll"
 | 
			
		||||
 | 
			
		||||
@@ -102,3 +114,6 @@ msgstr "High Level OSD"
 | 
			
		||||
 | 
			
		||||
msgid "Allow True Color OSD"
 | 
			
		||||
msgstr "Erlaube True Color OSD"
 | 
			
		||||
 | 
			
		||||
msgid "Hide mainmenu entry"
 | 
			
		||||
msgstr "Hauptmenüeintrag verstecken"
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: VDR \n"
 | 
			
		||||
"Report-Msgid-Bugs-To: <see README>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-08-21 14:02+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-07 20:13+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-04-25 21:44+0200\n"
 | 
			
		||||
"Last-Translator: Rolf Ahrenberg\n"
 | 
			
		||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
 | 
			
		||||
@@ -19,17 +19,11 @@ msgstr ""
 | 
			
		||||
msgid "HD Full Featured DVB device"
 | 
			
		||||
msgstr "DVB-laite HD-ulostulolla"
 | 
			
		||||
 | 
			
		||||
msgid "Off"
 | 
			
		||||
msgstr "ei"
 | 
			
		||||
msgid "Video Conversion"
 | 
			
		||||
msgstr "Näyttömuoto"
 | 
			
		||||
 | 
			
		||||
msgid "Frame rate"
 | 
			
		||||
msgstr "kuvataajuuden mukaan"
 | 
			
		||||
 | 
			
		||||
msgid "HD Only"
 | 
			
		||||
msgstr "vain HD-resoluutiolla"
 | 
			
		||||
 | 
			
		||||
msgid "Always"
 | 
			
		||||
msgstr "aina"
 | 
			
		||||
msgid "TV on"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Automatic"
 | 
			
		||||
msgstr "automaattinen"
 | 
			
		||||
@@ -49,6 +43,21 @@ msgstr "center cut out"
 | 
			
		||||
msgid "Always 16/9"
 | 
			
		||||
msgstr "aina 16:9"
 | 
			
		||||
 | 
			
		||||
msgid "Zoom 16/9"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Off"
 | 
			
		||||
msgstr "ei"
 | 
			
		||||
 | 
			
		||||
msgid "Frame rate"
 | 
			
		||||
msgstr "kuvataajuuden mukaan"
 | 
			
		||||
 | 
			
		||||
msgid "HD Only"
 | 
			
		||||
msgstr "vain HD-resoluutiolla"
 | 
			
		||||
 | 
			
		||||
msgid "Always"
 | 
			
		||||
msgstr "aina"
 | 
			
		||||
 | 
			
		||||
msgid "Disabled"
 | 
			
		||||
msgstr "ei käytössä"
 | 
			
		||||
 | 
			
		||||
@@ -73,9 +82,6 @@ msgstr "Sovita näyttömoodi"
 | 
			
		||||
msgid "TV format"
 | 
			
		||||
msgstr "Näytön kuvasuhde"
 | 
			
		||||
 | 
			
		||||
msgid "Video Conversion"
 | 
			
		||||
msgstr "Näyttömuoto"
 | 
			
		||||
 | 
			
		||||
msgid "Analogue Video"
 | 
			
		||||
msgstr "Analoginen kuvalähtö"
 | 
			
		||||
 | 
			
		||||
@@ -91,6 +97,12 @@ msgstr "Kuvaruutunäytön koko"
 | 
			
		||||
msgid "HDMI CEC"
 | 
			
		||||
msgstr "Käytä HDMI CEC-toimintoa"
 | 
			
		||||
 | 
			
		||||
msgid "CEC: Switch TV on"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "CEC: Switch TV off"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Remote Control Protocol"
 | 
			
		||||
msgstr "Kaukosäätimen protokolla"
 | 
			
		||||
 | 
			
		||||
@@ -102,3 +114,6 @@ msgstr "Käytä korkean tason kuvaruutunäyttöä"
 | 
			
		||||
 | 
			
		||||
msgid "Allow True Color OSD"
 | 
			
		||||
msgstr "Salli tosivärit kuvaruutunäytölle"
 | 
			
		||||
 | 
			
		||||
msgid "Hide mainmenu entry"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: VDR\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: <see README>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-08-21 14:02+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-07 20:13+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-07-10 00:23+0100\n"
 | 
			
		||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
 | 
			
		||||
"Language-Team:  <see README>\n"
 | 
			
		||||
@@ -22,18 +22,12 @@ msgstr ""
 | 
			
		||||
msgid "HD Full Featured DVB device"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Off"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgid "Video Conversion"
 | 
			
		||||
msgstr "Conversione video"
 | 
			
		||||
 | 
			
		||||
msgid "Frame rate"
 | 
			
		||||
msgid "TV on"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "HD Only"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Always"
 | 
			
		||||
msgstr "Sempre"
 | 
			
		||||
 | 
			
		||||
msgid "Automatic"
 | 
			
		||||
msgstr "Automatica"
 | 
			
		||||
 | 
			
		||||
@@ -52,6 +46,21 @@ msgstr "CentreCutOut"
 | 
			
		||||
msgid "Always 16/9"
 | 
			
		||||
msgstr "Sempre 16:9"
 | 
			
		||||
 | 
			
		||||
msgid "Zoom 16/9"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Off"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Frame rate"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "HD Only"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Always"
 | 
			
		||||
msgstr "Sempre"
 | 
			
		||||
 | 
			
		||||
msgid "Disabled"
 | 
			
		||||
msgstr "Disabilitata"
 | 
			
		||||
 | 
			
		||||
@@ -76,9 +85,6 @@ msgstr ""
 | 
			
		||||
msgid "TV format"
 | 
			
		||||
msgstr "Formato TV"
 | 
			
		||||
 | 
			
		||||
msgid "Video Conversion"
 | 
			
		||||
msgstr "Conversione video"
 | 
			
		||||
 | 
			
		||||
msgid "Analogue Video"
 | 
			
		||||
msgstr "Video analogico"
 | 
			
		||||
 | 
			
		||||
@@ -94,6 +100,12 @@ msgstr "Dimensione OSD"
 | 
			
		||||
msgid "HDMI CEC"
 | 
			
		||||
msgstr "HDMI CEC"
 | 
			
		||||
 | 
			
		||||
msgid "CEC: Switch TV on"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "CEC: Switch TV off"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Remote Control Protocol"
 | 
			
		||||
msgstr "Protocollo controllo remoto"
 | 
			
		||||
 | 
			
		||||
@@ -105,3 +117,6 @@ msgstr "OSD alto livello"
 | 
			
		||||
 | 
			
		||||
msgid "Allow True Color OSD"
 | 
			
		||||
msgstr "Permetti OSD True Color"
 | 
			
		||||
 | 
			
		||||
msgid "Hide mainmenu entry"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: setup.c 1.14 2011/12/04 15:31:58 kls Exp $
 | 
			
		||||
 * $Id: setup.c 1.17 2012/02/08 15:14:01 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "setup.h"
 | 
			
		||||
@@ -28,10 +28,13 @@ cHdffSetup::cHdffSetup(void)
 | 
			
		||||
    AudioDownmix = HDFF_AUDIO_DOWNMIX_AUTOMATIC;
 | 
			
		||||
    OsdSize = 0;
 | 
			
		||||
    CecEnabled = 1;
 | 
			
		||||
    CecTvOn = 1;
 | 
			
		||||
    CecTvOff = 0;
 | 
			
		||||
    RemoteProtocol = 1;
 | 
			
		||||
    RemoteAddress = -1;
 | 
			
		||||
    HighLevelOsd = 1;
 | 
			
		||||
    TrueColorOsd = 1;
 | 
			
		||||
    HideMainMenu = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cHdffSetup::SetupParse(const char *Name, const char *Value)
 | 
			
		||||
@@ -45,10 +48,13 @@ bool cHdffSetup::SetupParse(const char *Name, const char *Value)
 | 
			
		||||
    else if (strcmp(Name, "AudioDownmix")      == 0) AudioDownmix      = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "OsdSize")           == 0) OsdSize           = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "CecEnabled")        == 0) CecEnabled        = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "CecTvOn")           == 0) CecTvOn           = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "CecTvOff")          == 0) CecTvOff          = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "RemoteProtocol")    == 0) RemoteProtocol    = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "RemoteAddress")     == 0) RemoteAddress     = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "HighLevelOsd")      == 0) HighLevelOsd      = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "TrueColorOsd")      == 0) TrueColorOsd      = atoi(Value);
 | 
			
		||||
    else if (strcmp(Name, "HideMainMenu")      == 0) HideMainMenu      = atoi(Value);
 | 
			
		||||
    else return false;
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
@@ -112,12 +118,74 @@ HdffVideoMode_t cHdffSetup::GetVideoMode(void)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cHdffSetup::SetNextVideoConversion(void)
 | 
			
		||||
{
 | 
			
		||||
    int nextVideoConversion = HDFF_VIDEO_CONVERSION_AUTOMATIC;
 | 
			
		||||
 | 
			
		||||
    if (TvFormat == HDFF_TV_FORMAT_16_BY_9)
 | 
			
		||||
    {
 | 
			
		||||
        switch (VideoConversion)
 | 
			
		||||
        {
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_PILLARBOX:
 | 
			
		||||
                nextVideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT:
 | 
			
		||||
                nextVideoConversion = HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9:
 | 
			
		||||
                nextVideoConversion = HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9:
 | 
			
		||||
                nextVideoConversion = HDFF_VIDEO_CONVERSION_PILLARBOX;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        switch (VideoConversion)
 | 
			
		||||
        {
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9:
 | 
			
		||||
                nextVideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9:
 | 
			
		||||
                nextVideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT:
 | 
			
		||||
                nextVideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    VideoConversion = nextVideoConversion;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char * cHdffSetup::GetVideoConversionString(void)
 | 
			
		||||
{
 | 
			
		||||
    switch (VideoConversion)
 | 
			
		||||
    {
 | 
			
		||||
        case HDFF_VIDEO_CONVERSION_AUTOMATIC:
 | 
			
		||||
        default:
 | 
			
		||||
            return tr("Automatic");
 | 
			
		||||
        case HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9:
 | 
			
		||||
            return tr("Letterbox 16/9");
 | 
			
		||||
        case HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9:
 | 
			
		||||
            return tr("Letterbox 14/9");
 | 
			
		||||
        case HDFF_VIDEO_CONVERSION_PILLARBOX:
 | 
			
		||||
            return tr("Pillarbox");
 | 
			
		||||
        case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT:
 | 
			
		||||
            return tr("CentreCutOut");
 | 
			
		||||
        case HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9:
 | 
			
		||||
            return tr("Always 16/9");
 | 
			
		||||
        case HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9:
 | 
			
		||||
            return tr("Zoom 16/9");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf)
 | 
			
		||||
{
 | 
			
		||||
    const int kResolutions = 4;
 | 
			
		||||
    const int kVideoModeAdaptions = 4;
 | 
			
		||||
    const int kTvFormats = 2;
 | 
			
		||||
    const int kVideoConversions = 6;
 | 
			
		||||
    const int kAnalogueVideos = 4;
 | 
			
		||||
    const int kAudioDownmixes = 5;
 | 
			
		||||
    const int kOsdSizes = 5;
 | 
			
		||||
@@ -145,17 +213,6 @@ cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf)
 | 
			
		||||
        "16/9",
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    static const char * VideoConversionItems[kVideoConversions] =
 | 
			
		||||
    {
 | 
			
		||||
        tr("Automatic"),
 | 
			
		||||
        tr("Letterbox 16/9"),
 | 
			
		||||
        tr("Letterbox 14/9"),
 | 
			
		||||
        tr("Pillarbox"),
 | 
			
		||||
        tr("CentreCutOut"),
 | 
			
		||||
        tr("Always 16/9"),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    static const char * AnalogueVideoItems[kAnalogueVideos] =
 | 
			
		||||
    {
 | 
			
		||||
        tr("Disabled"),
 | 
			
		||||
@@ -194,25 +251,133 @@ cHdffSetupPage::cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf)
 | 
			
		||||
 | 
			
		||||
    Add(new cMenuEditStraItem(tr("Resolution"), &mNewHdffSetup.Resolution, kResolutions, ResolutionItems));
 | 
			
		||||
    Add(new cMenuEditStraItem(tr("Video Mode Adaption"), &mNewHdffSetup.VideoModeAdaption, kVideoModeAdaptions, VideoModeAdaptionItems));
 | 
			
		||||
    Add(new cMenuEditStraItem(tr("TV format"), &mNewHdffSetup.TvFormat, kTvFormats, TvFormatItems));
 | 
			
		||||
    Add(new cMenuEditStraItem(tr("Video Conversion"), &mNewHdffSetup.VideoConversion, kVideoConversions, VideoConversionItems));
 | 
			
		||||
    mTvFormatItem = new cMenuEditStraItem(tr("TV format"), &mNewHdffSetup.TvFormat, kTvFormats, TvFormatItems);
 | 
			
		||||
    Add(mTvFormatItem);
 | 
			
		||||
    Add(new cMenuEditStraItem(tr("Analogue Video"), &mNewHdffSetup.AnalogueVideo, kAnalogueVideos, AnalogueVideoItems));
 | 
			
		||||
    Add(new cMenuEditIntItem(tr("Audio Delay (ms)"), &mNewHdffSetup.AudioDelay, 0, 500));
 | 
			
		||||
    Add(new cMenuEditStraItem(tr("Audio Downmix"), &mNewHdffSetup.AudioDownmix, kAudioDownmixes, AudioDownmixItems));
 | 
			
		||||
    Add(new cMenuEditStraItem(tr("OSD Size"), &mNewHdffSetup.OsdSize, kOsdSizes, OsdSizeItems));
 | 
			
		||||
    Add(new cMenuEditBoolItem(tr("HDMI CEC"), &mNewHdffSetup.CecEnabled));
 | 
			
		||||
    Add(new cMenuEditBoolItem(tr("CEC: Switch TV on"), &mNewHdffSetup.CecTvOn));
 | 
			
		||||
    Add(new cMenuEditBoolItem(tr("CEC: Switch TV off"), &mNewHdffSetup.CecTvOff));
 | 
			
		||||
    Add(new cMenuEditStraItem(tr("Remote Control Protocol"), &mNewHdffSetup.RemoteProtocol, kRemoteProtocols, RemoteProtocolItems));
 | 
			
		||||
    Add(new cMenuEditIntItem(tr("Remote Control Address"), &mNewHdffSetup.RemoteAddress, -1, 31));
 | 
			
		||||
    Add(new cMenuEditBoolItem(tr("High Level OSD"), &mNewHdffSetup.HighLevelOsd));
 | 
			
		||||
    Add(new cMenuEditBoolItem(tr("Allow True Color OSD"), &mNewHdffSetup.TrueColorOsd));
 | 
			
		||||
    Add(new cMenuEditBoolItem(tr("Hide mainmenu entry"), &mNewHdffSetup.HideMainMenu));
 | 
			
		||||
 | 
			
		||||
    mVideoConversion = 0;
 | 
			
		||||
    if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9)
 | 
			
		||||
    {
 | 
			
		||||
        switch (mNewHdffSetup.VideoConversion)
 | 
			
		||||
        {
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_PILLARBOX:
 | 
			
		||||
                mVideoConversion = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT:
 | 
			
		||||
                mVideoConversion = 1;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9:
 | 
			
		||||
                mVideoConversion = 2;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9:
 | 
			
		||||
                mVideoConversion = 3;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        switch (mNewHdffSetup.VideoConversion)
 | 
			
		||||
        {
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9:
 | 
			
		||||
                mVideoConversion = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9:
 | 
			
		||||
                mVideoConversion = 1;
 | 
			
		||||
                break;
 | 
			
		||||
            case HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT:
 | 
			
		||||
                mVideoConversion = 2;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    BuildVideoConversionItem();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cHdffSetupPage::~cHdffSetupPage(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cHdffSetupPage::BuildVideoConversionItem(void)
 | 
			
		||||
{
 | 
			
		||||
    const int kVideoConversions4by3 = 3;
 | 
			
		||||
    const int kVideoConversions16by9 = 4;
 | 
			
		||||
 | 
			
		||||
    static const char * VideoConversionItems4by3[kVideoConversions4by3] =
 | 
			
		||||
    {
 | 
			
		||||
        tr("Letterbox 16/9"),
 | 
			
		||||
        tr("Letterbox 14/9"),
 | 
			
		||||
        tr("CentreCutOut")
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    static const char * VideoConversionItems16by9[kVideoConversions16by9] =
 | 
			
		||||
    {
 | 
			
		||||
        tr("Pillarbox"),
 | 
			
		||||
        tr("CentreCutOut"),
 | 
			
		||||
        tr("Always 16/9"),
 | 
			
		||||
        tr("Zoom 16/9")
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    cOsdItem * item;
 | 
			
		||||
 | 
			
		||||
    cList<cOsdItem>::Del(mTvFormatItem->Next());
 | 
			
		||||
    if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9)
 | 
			
		||||
    {
 | 
			
		||||
        item = new cMenuEditStraItem(tr("Video Conversion"), &mVideoConversion,
 | 
			
		||||
                kVideoConversions16by9, VideoConversionItems16by9);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        item = new cMenuEditStraItem(tr("Video Conversion"), &mVideoConversion,
 | 
			
		||||
                kVideoConversions4by3, VideoConversionItems4by3);
 | 
			
		||||
    }
 | 
			
		||||
    Add(item, false, mTvFormatItem);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cHdffSetupPage::Store(void)
 | 
			
		||||
{
 | 
			
		||||
    if (mNewHdffSetup.TvFormat == HDFF_TV_FORMAT_16_BY_9)
 | 
			
		||||
    {
 | 
			
		||||
        switch (mVideoConversion)
 | 
			
		||||
        {
 | 
			
		||||
            case 0:
 | 
			
		||||
                mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_PILLARBOX;
 | 
			
		||||
                break;
 | 
			
		||||
            case 1:
 | 
			
		||||
                mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT;
 | 
			
		||||
                break;
 | 
			
		||||
            case 2:
 | 
			
		||||
                mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_ALWAYS_16_BY_9;
 | 
			
		||||
                break;
 | 
			
		||||
            case 3:
 | 
			
		||||
                mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_ZOOM_16_BY_9;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        switch (mVideoConversion)
 | 
			
		||||
        {
 | 
			
		||||
            case 0:
 | 
			
		||||
                mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_16_BY_9;
 | 
			
		||||
                break;
 | 
			
		||||
            case 1:
 | 
			
		||||
                mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_LETTERBOX_14_BY_9;
 | 
			
		||||
                break;
 | 
			
		||||
            case 2:
 | 
			
		||||
                mNewHdffSetup.VideoConversion = HDFF_VIDEO_CONVERSION_CENTRE_CUT_OUT;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    SetupStore("Resolution", mNewHdffSetup.Resolution);
 | 
			
		||||
    SetupStore("VideoModeAdaption", mNewHdffSetup.VideoModeAdaption);
 | 
			
		||||
    SetupStore("TvFormat", mNewHdffSetup.TvFormat);
 | 
			
		||||
@@ -222,10 +387,13 @@ void cHdffSetupPage::Store(void)
 | 
			
		||||
    SetupStore("AudioDownmix", mNewHdffSetup.AudioDownmix);
 | 
			
		||||
    SetupStore("OsdSize", mNewHdffSetup.OsdSize);
 | 
			
		||||
    SetupStore("CecEnabled", mNewHdffSetup.CecEnabled);
 | 
			
		||||
    SetupStore("CecTvOn", mNewHdffSetup.CecTvOn);
 | 
			
		||||
    SetupStore("CecTvOff", mNewHdffSetup.CecTvOff);
 | 
			
		||||
    SetupStore("RemoteProtocol", mNewHdffSetup.RemoteProtocol);
 | 
			
		||||
    SetupStore("RemoteAddress", mNewHdffSetup.RemoteAddress);
 | 
			
		||||
    SetupStore("HighLevelOsd", mNewHdffSetup.HighLevelOsd);
 | 
			
		||||
    SetupStore("TrueColorOsd", mNewHdffSetup.TrueColorOsd);
 | 
			
		||||
    SetupStore("HideMainMenu", mNewHdffSetup.HideMainMenu);
 | 
			
		||||
 | 
			
		||||
    if (mHdffCmdIf)
 | 
			
		||||
    {
 | 
			
		||||
@@ -237,7 +405,7 @@ void cHdffSetupPage::Store(void)
 | 
			
		||||
        HdffHdmiConfig_t hdmiConfig;
 | 
			
		||||
 | 
			
		||||
        videoFormat.AutomaticEnabled = true;
 | 
			
		||||
        videoFormat.AfdEnabled = true;
 | 
			
		||||
        videoFormat.AfdEnabled = false;
 | 
			
		||||
        videoFormat.TvFormat = (HdffTvFormat_t) mNewHdffSetup.TvFormat;
 | 
			
		||||
        videoFormat.VideoConversion = (HdffVideoConversion_t) mNewHdffSetup.VideoConversion;
 | 
			
		||||
        mHdffCmdIf->CmdAvSetVideoFormat(0, &videoFormat);
 | 
			
		||||
@@ -247,6 +415,7 @@ void cHdffSetupPage::Store(void)
 | 
			
		||||
 | 
			
		||||
        mHdffCmdIf->CmdMuxSetVideoOut((HdffVideoOut_t) mNewHdffSetup.AnalogueVideo);
 | 
			
		||||
 | 
			
		||||
        memset(&hdmiConfig, 0, sizeof(hdmiConfig));
 | 
			
		||||
        hdmiConfig.TransmitAudio = true;
 | 
			
		||||
        hdmiConfig.ForceDviMode = false;
 | 
			
		||||
        hdmiConfig.CecEnabled = mNewHdffSetup.CecEnabled;
 | 
			
		||||
@@ -259,3 +428,29 @@ void cHdffSetupPage::Store(void)
 | 
			
		||||
 | 
			
		||||
    gHdffSetup = mNewHdffSetup;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cHdffSetupPage::ProcessKey(eKeys key)
 | 
			
		||||
{
 | 
			
		||||
	eOSState state = cMenuSetupPage::ProcessKey(key);
 | 
			
		||||
 | 
			
		||||
	if (state == osContinue)
 | 
			
		||||
	{
 | 
			
		||||
		cOsdItem * item;
 | 
			
		||||
		switch (key)
 | 
			
		||||
		{
 | 
			
		||||
			case kLeft:
 | 
			
		||||
			case kRight:
 | 
			
		||||
				item = Get(Current());
 | 
			
		||||
				if (item == mTvFormatItem)
 | 
			
		||||
				{
 | 
			
		||||
				    mVideoConversion = 0;
 | 
			
		||||
					BuildVideoConversionItem();
 | 
			
		||||
					Display();
 | 
			
		||||
				}
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return state;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: setup.h 1.10 2011/12/04 15:32:13 kls Exp $
 | 
			
		||||
 * $Id: setup.h 1.12 2012/02/08 15:14:56 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _HDFF_SETUP_H_
 | 
			
		||||
@@ -18,6 +18,8 @@ struct cHdffSetup
 | 
			
		||||
    bool SetupParse(const char * Name, const char * Value);
 | 
			
		||||
    void GetOsdSize(int &Width, int &Height, double &PixelAspect);
 | 
			
		||||
    HdffVideoMode_t GetVideoMode(void);
 | 
			
		||||
    void SetNextVideoConversion(void);
 | 
			
		||||
    const char * GetVideoConversionString(void);
 | 
			
		||||
 | 
			
		||||
    int Resolution;
 | 
			
		||||
    int VideoModeAdaption;
 | 
			
		||||
@@ -28,11 +30,15 @@ struct cHdffSetup
 | 
			
		||||
    int AudioDownmix;
 | 
			
		||||
    int OsdSize;
 | 
			
		||||
    int CecEnabled;
 | 
			
		||||
    int CecTvOn;
 | 
			
		||||
    int CecTvOff;
 | 
			
		||||
    int RemoteProtocol;
 | 
			
		||||
    int RemoteAddress;
 | 
			
		||||
 | 
			
		||||
    int HighLevelOsd;
 | 
			
		||||
    int TrueColorOsd;
 | 
			
		||||
 | 
			
		||||
    int HideMainMenu;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern cHdffSetup gHdffSetup;
 | 
			
		||||
@@ -42,6 +48,10 @@ class cHdffSetupPage : public cMenuSetupPage
 | 
			
		||||
private:
 | 
			
		||||
    HDFF::cHdffCmdIf * mHdffCmdIf;
 | 
			
		||||
    cHdffSetup mNewHdffSetup;
 | 
			
		||||
    cOsdItem * mTvFormatItem;
 | 
			
		||||
    int mVideoConversion;
 | 
			
		||||
 | 
			
		||||
    void BuildVideoConversionItem(void);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    virtual void Store(void);
 | 
			
		||||
@@ -49,6 +59,7 @@ protected:
 | 
			
		||||
public:
 | 
			
		||||
    cHdffSetupPage(HDFF::cHdffCmdIf * pHdffCmdIf);
 | 
			
		||||
    virtual ~cHdffSetupPage(void);
 | 
			
		||||
    virtual eOSState ProcessKey(eKeys Key);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 1.7 2011/05/21 12:25:37 kls Exp $
 | 
			
		||||
# $Id: Makefile 1.8 2012/01/18 12:28:43 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -22,9 +22,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbsdffdevice.c 2.30 2011/08/27 11:33:57 kls Exp $
 | 
			
		||||
 * $Id: dvbsdffdevice.c 2.31 2012/02/15 13:15:05 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "dvbsdffdevice.h"
 | 
			
		||||
@@ -66,10 +66,6 @@ cDvbSdFfDevice::cDvbSdFfDevice(int Adapter, int Frontend, bool OutputOnly)
 | 
			
		||||
        fclose(f);
 | 
			
		||||
     }
 | 
			
		||||
  devVideoIndex = devVideoOffset >= 0 ? devVideoOffset++ : -1;
 | 
			
		||||
 | 
			
		||||
  // Video format:
 | 
			
		||||
 | 
			
		||||
  SetVideoFormat(Setup.VideoFormat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cDvbSdFfDevice::~cDvbSdFfDevice()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.7 2011/05/21 12:25:41 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.8 2012/01/18 12:29:09 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -22,9 +22,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.3 2011/02/27 10:05:01 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.4 2012/01/18 12:17:23 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -20,9 +20,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
@@ -62,7 +62,7 @@ all: libvdr-$(PLUGIN).so
 | 
			
		||||
 | 
			
		||||
# Dependencies:
 | 
			
		||||
 | 
			
		||||
MAKEDEP = g++ -MM -MG
 | 
			
		||||
MAKEDEP = $(CXX) -MM -MG
 | 
			
		||||
DEPFILE = .dependencies
 | 
			
		||||
$(DEPFILE): Makefile
 | 
			
		||||
	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
 | 
			
		||||
 
 | 
			
		||||
@@ -63,3 +63,7 @@ VDR Plugin 'pictures' Revision History
 | 
			
		||||
2012-01-08:
 | 
			
		||||
 | 
			
		||||
- Added option -o to pic2mpg.
 | 
			
		||||
 | 
			
		||||
2012-02-17:
 | 
			
		||||
 | 
			
		||||
- cReadDir::Next() now skips directory entries "." and "..".
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.7 2011/05/21 12:25:45 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.8 2012/01/18 12:30:05 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -22,9 +22,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: entry.c 2.0 2008/02/17 13:42:34 kls Exp $
 | 
			
		||||
 * $Id: entry.c 2.1 2012/02/17 14:00:28 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "entry.h"
 | 
			
		||||
@@ -48,13 +48,11 @@ void cPictureEntry::Load(void) const
 | 
			
		||||
     if (d.Ok()) {
 | 
			
		||||
        struct dirent *e;
 | 
			
		||||
        while ((e = d.Next()) != NULL) {
 | 
			
		||||
              if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
 | 
			
		||||
                 struct stat ds;
 | 
			
		||||
                 if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
 | 
			
		||||
                    if (!entries)
 | 
			
		||||
                       entries = new cList<cPictureEntry>;
 | 
			
		||||
                    entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode)));
 | 
			
		||||
                    }
 | 
			
		||||
              struct stat ds;
 | 
			
		||||
              if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
 | 
			
		||||
                 if (!entries)
 | 
			
		||||
                    entries = new cList<cPictureEntry>;
 | 
			
		||||
                 entries->Add(new cPictureEntry(e->d_name, this, S_ISDIR(ds.st_mode)));
 | 
			
		||||
                 }
 | 
			
		||||
              }
 | 
			
		||||
        if (entries)
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: pictures.c 2.3 2011/02/20 16:50:01 kls Exp $
 | 
			
		||||
 * $Id: pictures.c 2.4 2012/02/17 14:00:48 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <getopt.h>
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
#include "player.h"
 | 
			
		||||
 | 
			
		||||
static const char *VERSION       = "0.1.0";
 | 
			
		||||
static const char *VERSION       = "0.1.1";
 | 
			
		||||
static const char *DESCRIPTION   = trNOOP("A simple picture viewer");
 | 
			
		||||
static const char *MAINMENUENTRY = trNOOP("Pictures");
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.3 2011/02/27 10:05:04 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.4 2012/01/18 12:17:23 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -22,9 +22,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
@@ -64,7 +64,7 @@ all: libvdr-$(PLUGIN1).so libvdr-$(PLUGIN2).so
 | 
			
		||||
 | 
			
		||||
# Dependencies:
 | 
			
		||||
 | 
			
		||||
MAKEDEP = g++ -MM -MG
 | 
			
		||||
MAKEDEP = $(CXX) -MM -MG
 | 
			
		||||
DEPFILE = .dependencies
 | 
			
		||||
$(DEPFILE): Makefile
 | 
			
		||||
	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.7 2011/05/21 12:25:49 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.8 2012/01/18 12:30:52 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -22,9 +22,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.3 2011/02/27 10:05:08 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.4 2012/01/18 12:17:23 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -20,9 +20,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
@@ -62,7 +62,7 @@ all: libvdr-$(PLUGIN).so
 | 
			
		||||
 | 
			
		||||
# Dependencies:
 | 
			
		||||
 | 
			
		||||
MAKEDEP = g++ -MM -MG
 | 
			
		||||
MAKEDEP = $(CXX) -MM -MG
 | 
			
		||||
DEPFILE = .dependencies
 | 
			
		||||
$(DEPFILE): Makefile
 | 
			
		||||
	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a Video Disk Recorder plugin
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.3 2011/02/27 10:05:10 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.4 2012/01/18 12:17:23 kls Exp $
 | 
			
		||||
 | 
			
		||||
# The official name of this plugin.
 | 
			
		||||
# This name will be used in the '-P...' option of VDR to load the plugin.
 | 
			
		||||
@@ -20,9 +20,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								config.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: config.h 2.39 2012/01/14 13:03:53 kls Exp $
 | 
			
		||||
 * $Id: config.h 2.40 2012/01/16 09:50:03 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CONFIG_H
 | 
			
		||||
@@ -22,13 +22,13 @@
 | 
			
		||||
 | 
			
		||||
// VDR's own version number:
 | 
			
		||||
 | 
			
		||||
#define VDRVERSION  "1.7.23"
 | 
			
		||||
#define VDRVERSNUM   10723  // Version * 10000 + Major * 100 + Minor
 | 
			
		||||
#define VDRVERSION  "1.7.24"
 | 
			
		||||
#define VDRVERSNUM   10724  // Version * 10000 + Major * 100 + Minor
 | 
			
		||||
 | 
			
		||||
// The plugin API's version number:
 | 
			
		||||
 | 
			
		||||
#define APIVERSION  "1.7.23"
 | 
			
		||||
#define APIVERSNUM   10723  // Version * 10000 + Major * 100 + Minor
 | 
			
		||||
#define APIVERSION  "1.7.24"
 | 
			
		||||
#define APIVERSNUM   10724  // 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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								cutter.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								cutter.c
									
									
									
									
									
								
							@@ -4,10 +4,11 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: cutter.c 2.10 2011/12/04 12:55:53 kls Exp $
 | 
			
		||||
 * $Id: cutter.c 2.11 2012/02/16 12:08:39 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "cutter.h"
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
#include "recording.h"
 | 
			
		||||
#include "remux.h"
 | 
			
		||||
#include "videodir.h"
 | 
			
		||||
@@ -197,7 +198,8 @@ void cCuttingThread::Action(void)
 | 
			
		||||
// --- cCutter ---------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
cMutex cCutter::mutex;
 | 
			
		||||
char *cCutter::editedVersionName = NULL;
 | 
			
		||||
cString cCutter::originalVersionName;
 | 
			
		||||
cString cCutter::editedVersionName;
 | 
			
		||||
cCuttingThread *cCutter::cuttingThread = NULL;
 | 
			
		||||
bool cCutter::error = false;
 | 
			
		||||
bool cCutter::ended = false;
 | 
			
		||||
@@ -208,6 +210,7 @@ bool cCutter::Start(const char *FileName)
 | 
			
		||||
  if (!cuttingThread) {
 | 
			
		||||
     error = false;
 | 
			
		||||
     ended = false;
 | 
			
		||||
     originalVersionName = FileName;
 | 
			
		||||
     cRecording Recording(FileName);
 | 
			
		||||
 | 
			
		||||
     cMarks FromMarks;
 | 
			
		||||
@@ -229,7 +232,7 @@ bool cCutter::Start(const char *FileName)
 | 
			
		||||
           }
 | 
			
		||||
        free(s);
 | 
			
		||||
        // XXX
 | 
			
		||||
        editedVersionName = strdup(evn);
 | 
			
		||||
        editedVersionName = evn;
 | 
			
		||||
        Recording.WriteInfo();
 | 
			
		||||
        Recordings.AddByName(editedVersionName, false);
 | 
			
		||||
        cuttingThread = new cCuttingThread(FileName, editedVersionName);
 | 
			
		||||
@@ -246,27 +249,29 @@ void cCutter::Stop(void)
 | 
			
		||||
  const char *Error = cuttingThread ? cuttingThread->Error() : NULL;
 | 
			
		||||
  delete cuttingThread;
 | 
			
		||||
  cuttingThread = NULL;
 | 
			
		||||
  if ((Interrupted || Error) && editedVersionName) {
 | 
			
		||||
  if ((Interrupted || Error) && *editedVersionName) {
 | 
			
		||||
     if (Interrupted)
 | 
			
		||||
        isyslog("editing process has been interrupted");
 | 
			
		||||
     if (Error)
 | 
			
		||||
        esyslog("ERROR: '%s' during editing process", Error);
 | 
			
		||||
     RemoveVideoFile(editedVersionName); //XXX what if this file is currently being replayed?
 | 
			
		||||
     if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), editedVersionName) == 0)
 | 
			
		||||
        cControl::Shutdown();
 | 
			
		||||
     RemoveVideoFile(editedVersionName);
 | 
			
		||||
     Recordings.DelByName(editedVersionName);
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cCutter::Active(void)
 | 
			
		||||
bool cCutter::Active(const char *FileName)
 | 
			
		||||
{
 | 
			
		||||
  cMutexLock MutexLock(&mutex);
 | 
			
		||||
  if (cuttingThread) {
 | 
			
		||||
     if (cuttingThread->Active())
 | 
			
		||||
        return true;
 | 
			
		||||
        return !FileName || strcmp(FileName, originalVersionName) == 0 || strcmp(FileName, editedVersionName) == 0;
 | 
			
		||||
     error = cuttingThread->Error();
 | 
			
		||||
     Stop();
 | 
			
		||||
     if (!error)
 | 
			
		||||
        cRecordingUserCommand::InvokeCommand(RUC_EDITEDRECORDING, editedVersionName);
 | 
			
		||||
     free(editedVersionName);
 | 
			
		||||
     originalVersionName = NULL;
 | 
			
		||||
     editedVersionName = NULL;
 | 
			
		||||
     ended = true;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								cutter.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								cutter.h
									
									
									
									
									
								
							@@ -4,27 +4,32 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: cutter.h 2.2 2010/08/29 13:32:33 kls Exp $
 | 
			
		||||
 * $Id: cutter.h 2.3 2012/02/16 12:05:33 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CUTTER_H
 | 
			
		||||
#define __CUTTER_H
 | 
			
		||||
 | 
			
		||||
#include "thread.h"
 | 
			
		||||
#include "tools.h"
 | 
			
		||||
 | 
			
		||||
class cCuttingThread;
 | 
			
		||||
 | 
			
		||||
class cCutter {
 | 
			
		||||
private:
 | 
			
		||||
  static cMutex mutex;
 | 
			
		||||
  static char *editedVersionName;
 | 
			
		||||
  static cString originalVersionName;
 | 
			
		||||
  static cString editedVersionName;
 | 
			
		||||
  static cCuttingThread *cuttingThread;
 | 
			
		||||
  static bool error;
 | 
			
		||||
  static bool ended;
 | 
			
		||||
public:
 | 
			
		||||
  static bool Start(const char *FileName);
 | 
			
		||||
  static void Stop(void);
 | 
			
		||||
  static bool Active(void);
 | 
			
		||||
  static bool Active(const char *FileName = NULL);
 | 
			
		||||
         ///< Returns true if the cutter is currently active.
 | 
			
		||||
         ///< If a FileName is given, true is only returned if either the
 | 
			
		||||
         ///< original or the edited file name is equal to FileName.
 | 
			
		||||
  static bool Error(void);
 | 
			
		||||
  static bool Ended(void);
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								device.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								device.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: device.c 2.44 2011/10/16 14:36:43 kls Exp $
 | 
			
		||||
 * $Id: device.c 2.49 2012/02/15 13:15:19 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "device.h"
 | 
			
		||||
@@ -41,7 +41,8 @@ cLiveSubtitle::~cLiveSubtitle()
 | 
			
		||||
 | 
			
		||||
void cLiveSubtitle::Receive(uchar *Data, int Length)
 | 
			
		||||
{
 | 
			
		||||
  cDevice::PrimaryDevice()->PlayTs(Data, Length);
 | 
			
		||||
  if (cDevice::PrimaryDevice())
 | 
			
		||||
     cDevice::PrimaryDevice()->PlayTs(Data, Length);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- cDeviceHook -----------------------------------------------------------
 | 
			
		||||
@@ -81,8 +82,6 @@ cDevice::cDevice(void)
 | 
			
		||||
 | 
			
		||||
  SetDescription("receiver on device %d", CardIndex() + 1);
 | 
			
		||||
 | 
			
		||||
  SetVideoFormat(Setup.VideoFormat);
 | 
			
		||||
 | 
			
		||||
  mute = false;
 | 
			
		||||
  volume = Setup.CurrentVolume;
 | 
			
		||||
 | 
			
		||||
@@ -270,7 +269,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
 | 
			
		||||
          if (NumUsableSlots && !CamSlots.Get(j)->Assign(device[i], true))
 | 
			
		||||
             continue; // CAM slot can't be used with this device
 | 
			
		||||
          bool ndr;
 | 
			
		||||
          if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job
 | 
			
		||||
          if (device[i]->ProvidesChannel(Channel, (LiveView && device[i]->IsPrimaryDevice()) ? Setup.PrimaryLimit : Priority, &ndr)) { // this device is basicly able to do the job
 | 
			
		||||
             if (NumUsableSlots && device[i]->CamSlot() && device[i]->CamSlot() != CamSlots.Get(j))
 | 
			
		||||
                ndr = true; // using a different CAM slot requires detaching receivers
 | 
			
		||||
             // Put together an integer number that reflects the "impact" using
 | 
			
		||||
@@ -335,6 +334,7 @@ void cDevice::SetCamSlot(cCamSlot *CamSlot)
 | 
			
		||||
 | 
			
		||||
void cDevice::Shutdown(void)
 | 
			
		||||
{
 | 
			
		||||
  deviceHooks.Clear();
 | 
			
		||||
  primaryDevice = NULL;
 | 
			
		||||
  for (int i = 0; i < numDevices; i++) {
 | 
			
		||||
      delete device[i];
 | 
			
		||||
@@ -531,6 +531,14 @@ bool cDevice::SetPid(cPidHandle *Handle, int Type, bool On)
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cDevice::DelLivePids(void)
 | 
			
		||||
{
 | 
			
		||||
  for (int i = ptAudio; i < ptOther; i++) {
 | 
			
		||||
      if (pidHandles[i].pid)
 | 
			
		||||
         DelPid(pidHandles[i].pid, ePidType(i));
 | 
			
		||||
      }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cDevice::StartSectionHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  if (!sectionHandler) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								device.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								device.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: device.h 2.30 2011/12/04 13:38:17 kls Exp $
 | 
			
		||||
 * $Id: device.h 2.33 2012/02/14 14:42:42 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __DEVICE_H
 | 
			
		||||
@@ -354,6 +354,9 @@ protected:
 | 
			
		||||
         ///< Handle->used indicates how many receivers are using this PID.
 | 
			
		||||
         ///< Type indicates some special types of PIDs, which the device may
 | 
			
		||||
         ///< need to set in a specific way.
 | 
			
		||||
public:
 | 
			
		||||
  void DelLivePids(void);
 | 
			
		||||
         ///< Deletes the live viewing PIDs.
 | 
			
		||||
 | 
			
		||||
// Section filter facilities
 | 
			
		||||
 | 
			
		||||
@@ -436,14 +439,14 @@ public:
 | 
			
		||||
         ///< Returns the video system of the currently displayed material
 | 
			
		||||
         ///< (default is PAL).
 | 
			
		||||
  virtual void GetVideoSize(int &Width, int &Height, double &VideoAspect);
 | 
			
		||||
         ///< Returns the With, Height and VideoAspect ratio of the currently
 | 
			
		||||
         ///< Returns the Width, Height and VideoAspect ratio of the currently
 | 
			
		||||
         ///< displayed video material. Width and Height are given in pixel
 | 
			
		||||
         ///< (e.g. 720x576) and VideoAspect is e.g. 1.33333 for a 4:3 broadcast,
 | 
			
		||||
         ///< or 1.77778 for 16:9.
 | 
			
		||||
         ///< The default implementation returns 0 for Width and Height
 | 
			
		||||
         ///< and 1.0 for VideoAspect.
 | 
			
		||||
  virtual void GetOsdSize(int &Width, int &Height, double &PixelAspect);
 | 
			
		||||
         ///< Returns the With, Height and PixelAspect ratio the OSD should use
 | 
			
		||||
         ///< Returns the Width, Height and PixelAspect ratio the OSD should use
 | 
			
		||||
         ///< to best fit the resolution of the output device. If PixelAspect
 | 
			
		||||
         ///< is not 1.0, the OSD may take this as a hint to scale its
 | 
			
		||||
         ///< graphics in a way that, e.g., a circle will actually
 | 
			
		||||
@@ -495,11 +498,11 @@ public:
 | 
			
		||||
       ///< is more than one audio track.
 | 
			
		||||
  int NumSubtitleTracks(void) const;
 | 
			
		||||
       ///< Returns the number of subtitle tracks that are currently available.
 | 
			
		||||
  eTrackType GetCurrentAudioTrack(void) { return currentAudioTrack; }
 | 
			
		||||
  eTrackType GetCurrentAudioTrack(void) const { return currentAudioTrack; }
 | 
			
		||||
  bool SetCurrentAudioTrack(eTrackType Type);
 | 
			
		||||
       ///< Sets the current audio track to the given Type.
 | 
			
		||||
       ///< \return Returns true if Type is a valid audio track, false otherwise.
 | 
			
		||||
  eTrackType GetCurrentSubtitleTrack(void) { return currentSubtitleTrack; }
 | 
			
		||||
  eTrackType GetCurrentSubtitleTrack(void) const { return currentSubtitleTrack; }
 | 
			
		||||
  bool SetCurrentSubtitleTrack(eTrackType Type, bool Manual = false);
 | 
			
		||||
       ///< Sets the current subtitle track to the given Type.
 | 
			
		||||
       ///< IF Manual is true, no automatic preferred subtitle language selection
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										78
									
								
								dvbdevice.c
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								dvbdevice.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbdevice.c 2.56 2012/01/15 14:31:47 kls Exp $
 | 
			
		||||
 * $Id: dvbdevice.c 2.62 2012/02/17 12:20:34 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "dvbdevice.h"
 | 
			
		||||
@@ -502,6 +502,8 @@ void cDvbTuner::SetChannel(const cChannel *Channel)
 | 
			
		||||
     tunerStatus = tsIdle;
 | 
			
		||||
     ResetToneAndVoltage();
 | 
			
		||||
     }
 | 
			
		||||
  if (bondedTuner && device->IsPrimaryDevice())
 | 
			
		||||
     cDevice::PrimaryDevice()->DelLivePids(); // 'device' is const, so we must do it this way
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cDvbTuner::Locked(int TimeoutMs)
 | 
			
		||||
@@ -857,6 +859,7 @@ void cDvbTuner::Action(void)
 | 
			
		||||
        if (GetFrontendStatus(NewStatus))
 | 
			
		||||
           Status = NewStatus;
 | 
			
		||||
        cMutexLock MutexLock(&mutex);
 | 
			
		||||
        int WaitTime = 1000;
 | 
			
		||||
        switch (tunerStatus) {
 | 
			
		||||
          case tsIdle:
 | 
			
		||||
               break;
 | 
			
		||||
@@ -877,6 +880,7 @@ void cDvbTuner::Action(void)
 | 
			
		||||
                     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
 | 
			
		||||
          case tsLocked:
 | 
			
		||||
               if (Status & FE_REINIT) {
 | 
			
		||||
                  tunerStatus = tsSet;
 | 
			
		||||
@@ -905,9 +909,7 @@ void cDvbTuner::Action(void)
 | 
			
		||||
               break;
 | 
			
		||||
          default: esyslog("ERROR: unknown tuner status %d", tunerStatus);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        if (tunerStatus != tsTuned)
 | 
			
		||||
           newSet.TimedWait(mutex, 1000);
 | 
			
		||||
        newSet.TimedWait(mutex, WaitTime);
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1006,6 +1008,7 @@ cDvbDevice::cDvbDevice(int Adapter, int Frontend)
 | 
			
		||||
  numModulations = 0;
 | 
			
		||||
  bondedDevice = NULL;
 | 
			
		||||
  needsDetachBondedReceivers = false;
 | 
			
		||||
  tsBuffer = NULL;
 | 
			
		||||
 | 
			
		||||
  // Devices that are present on all card types:
 | 
			
		||||
 | 
			
		||||
@@ -1045,7 +1048,7 @@ cDvbDevice::~cDvbDevice()
 | 
			
		||||
 | 
			
		||||
cString cDvbDevice::DvbName(const char *Name, int Adapter, int Frontend)
 | 
			
		||||
{
 | 
			
		||||
  return cString::sprintf("%s%d/%s%d", DEV_DVB_ADAPTER, Adapter, Name, Frontend);
 | 
			
		||||
  return cString::sprintf("%s/%s%d/%s%d", DEV_DVB_BASE, DEV_DVB_ADAPTER, Adapter, Name, Frontend);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int cDvbDevice::DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError)
 | 
			
		||||
@@ -1093,28 +1096,47 @@ bool cDvbDevice::Initialize(void)
 | 
			
		||||
  new cDvbSourceParam('C', "DVB-C");
 | 
			
		||||
  new cDvbSourceParam('S', "DVB-S");
 | 
			
		||||
  new cDvbSourceParam('T', "DVB-T");
 | 
			
		||||
  cStringList Nodes;
 | 
			
		||||
  cReadDir DvbDir(DEV_DVB_BASE);
 | 
			
		||||
  if (DvbDir.Ok()) {
 | 
			
		||||
     struct dirent *a;
 | 
			
		||||
     while ((a = DvbDir.Next()) != NULL) {
 | 
			
		||||
           if (strstr(a->d_name, DEV_DVB_ADAPTER) == a->d_name) {
 | 
			
		||||
              int Adapter = strtol(a->d_name + strlen(DEV_DVB_ADAPTER), NULL, 10);
 | 
			
		||||
              cReadDir AdapterDir(AddDirectory(DEV_DVB_BASE, a->d_name));
 | 
			
		||||
              if (AdapterDir.Ok()) {
 | 
			
		||||
                 struct dirent *f;
 | 
			
		||||
                 while ((f = AdapterDir.Next()) != NULL) {
 | 
			
		||||
                       if (strstr(f->d_name, DEV_DVB_FRONTEND) == f->d_name) {
 | 
			
		||||
                          int Frontend = strtol(f->d_name + strlen(DEV_DVB_FRONTEND), NULL, 10);
 | 
			
		||||
                          Nodes.Append(strdup(cString::sprintf("%2d %2d", Adapter, Frontend)));
 | 
			
		||||
                          }
 | 
			
		||||
                       }
 | 
			
		||||
                 }
 | 
			
		||||
              }
 | 
			
		||||
           }
 | 
			
		||||
     }
 | 
			
		||||
  int Checked = 0;
 | 
			
		||||
  int Found = 0;
 | 
			
		||||
  for (int Adapter = 0; ; Adapter++) {
 | 
			
		||||
      for (int Frontend = 0; ; Frontend++) {
 | 
			
		||||
          if (Exists(Adapter, Frontend)) {
 | 
			
		||||
             if (Checked++ < MAXDVBDEVICES) {
 | 
			
		||||
                if (UseDevice(NextCardIndex())) {
 | 
			
		||||
                   if (Probe(Adapter, Frontend))
 | 
			
		||||
                      Found++;
 | 
			
		||||
                   }
 | 
			
		||||
                else
 | 
			
		||||
                   NextCardIndex(1); // skips this one
 | 
			
		||||
                }
 | 
			
		||||
             }
 | 
			
		||||
          else if (Frontend == 0)
 | 
			
		||||
             goto LastAdapter;
 | 
			
		||||
          else
 | 
			
		||||
             goto NextAdapter;
 | 
			
		||||
          }
 | 
			
		||||
      NextAdapter: ;
 | 
			
		||||
      }
 | 
			
		||||
LastAdapter:
 | 
			
		||||
  if (Nodes.Size() > 0) {
 | 
			
		||||
     Nodes.Sort();
 | 
			
		||||
     for (int i = 0; i < Nodes.Size(); i++) {
 | 
			
		||||
         int Adapter;
 | 
			
		||||
         int Frontend;
 | 
			
		||||
         if (2 == sscanf(Nodes[i], "%d %d", &Adapter, &Frontend)) {
 | 
			
		||||
            if (Exists(Adapter, Frontend)) {
 | 
			
		||||
               if (Checked++ < MAXDVBDEVICES) {
 | 
			
		||||
                  if (UseDevice(NextCardIndex())) {
 | 
			
		||||
                     if (Probe(Adapter, Frontend))
 | 
			
		||||
                        Found++;
 | 
			
		||||
                     }
 | 
			
		||||
                  else
 | 
			
		||||
                     NextCardIndex(1); // skips this one
 | 
			
		||||
                  }
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
  NextCardIndex(MAXDVBDEVICES - Checked); // skips the rest
 | 
			
		||||
  if (Found > 0)
 | 
			
		||||
     isyslog("found %d DVB device%s", Found, Found > 1 ? "s" : "");
 | 
			
		||||
@@ -1130,7 +1152,7 @@ bool cDvbDevice::QueryDeliverySystems(int fd_frontend)
 | 
			
		||||
     LOG_ERROR;
 | 
			
		||||
     return false;
 | 
			
		||||
     }
 | 
			
		||||
#if DVB_API_VERSION > 5 || DVB_API_VERSION_MINOR >= 5
 | 
			
		||||
#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) >= 0x0505
 | 
			
		||||
  dtv_property Frontend[1];
 | 
			
		||||
  memset(&Frontend, 0, sizeof(Frontend));
 | 
			
		||||
  dtv_properties CmdSeq;
 | 
			
		||||
@@ -1440,7 +1462,7 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
 | 
			
		||||
                 result = !IsPrimaryDevice() || Priority >= Setup.PrimaryLimit;
 | 
			
		||||
              }
 | 
			
		||||
           else
 | 
			
		||||
              needsDetachReceivers = true;
 | 
			
		||||
              needsDetachReceivers = Receiving(true);
 | 
			
		||||
           }
 | 
			
		||||
        if (result) {
 | 
			
		||||
           if (!BondingOk(Channel)) {
 | 
			
		||||
@@ -1452,7 +1474,7 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
 | 
			
		||||
                     }
 | 
			
		||||
                  }
 | 
			
		||||
              needsDetachBondedReceivers = true;
 | 
			
		||||
              needsDetachReceivers = true;
 | 
			
		||||
              needsDetachReceivers = Receiving(true);
 | 
			
		||||
              }
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbdevice.h 2.21 2012/01/13 11:32:45 kls Exp $
 | 
			
		||||
 * $Id: dvbdevice.h 2.23 2012/02/17 11:18:55 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __DVBDEVICE_H
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
#include <linux/dvb/version.h>
 | 
			
		||||
#include "device.h"
 | 
			
		||||
 | 
			
		||||
#if DVB_API_VERSION < 5 || (DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR < 3)
 | 
			
		||||
#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0503
 | 
			
		||||
#error VDR requires Linux DVB driver API version 5.3 or higher!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -22,7 +22,8 @@
 | 
			
		||||
#define MAXDELIVERYSYSTEMS 8
 | 
			
		||||
 | 
			
		||||
#define DEV_VIDEO         "/dev/video"
 | 
			
		||||
#define DEV_DVB_ADAPTER   "/dev/dvb/adapter"
 | 
			
		||||
#define DEV_DVB_BASE      "/dev/dvb"
 | 
			
		||||
#define DEV_DVB_ADAPTER   "adapter"
 | 
			
		||||
#define DEV_DVB_OSD       "osd"
 | 
			
		||||
#define DEV_DVB_FRONTEND  "frontend"
 | 
			
		||||
#define DEV_DVB_DVR       "dvr"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								dvbplayer.c
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								dvbplayer.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbplayer.c 2.21 2010/03/07 14:24:26 kls Exp $
 | 
			
		||||
 * $Id: dvbplayer.c 2.23 2012/02/19 10:48:02 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "dvbplayer.h"
 | 
			
		||||
@@ -87,6 +87,7 @@ class cNonBlockingFileReader : public cThread {
 | 
			
		||||
private:
 | 
			
		||||
  cUnbufferedFile *f;
 | 
			
		||||
  uchar *buffer;
 | 
			
		||||
  uchar *result;
 | 
			
		||||
  int wanted;
 | 
			
		||||
  int length;
 | 
			
		||||
  cCondWait newSet;
 | 
			
		||||
@@ -100,7 +101,7 @@ public:
 | 
			
		||||
  void Clear(void);
 | 
			
		||||
  void Request(cUnbufferedFile *File, int Length);
 | 
			
		||||
  int Result(uchar **Buffer);
 | 
			
		||||
  bool Reading(void) { return buffer; }
 | 
			
		||||
  bool Reading(void) { return result; }
 | 
			
		||||
  bool WaitForDataMs(int msToWait);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
@@ -109,6 +110,7 @@ cNonBlockingFileReader::cNonBlockingFileReader(void)
 | 
			
		||||
{
 | 
			
		||||
  f = NULL;
 | 
			
		||||
  buffer = NULL;
 | 
			
		||||
  result = NULL;
 | 
			
		||||
  wanted = length = 0;
 | 
			
		||||
  Start();
 | 
			
		||||
}
 | 
			
		||||
@@ -118,6 +120,7 @@ cNonBlockingFileReader::~cNonBlockingFileReader()
 | 
			
		||||
  newSet.Signal();
 | 
			
		||||
  Cancel(3);
 | 
			
		||||
  free(buffer);
 | 
			
		||||
  free(result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cNonBlockingFileReader::Clear(void)
 | 
			
		||||
@@ -126,6 +129,8 @@ void cNonBlockingFileReader::Clear(void)
 | 
			
		||||
  f = NULL;
 | 
			
		||||
  free(buffer);
 | 
			
		||||
  buffer = NULL;
 | 
			
		||||
  free(result);
 | 
			
		||||
  result = NULL;
 | 
			
		||||
  wanted = length = 0;
 | 
			
		||||
  Unlock();
 | 
			
		||||
}
 | 
			
		||||
@@ -137,18 +142,18 @@ void cNonBlockingFileReader::Request(cUnbufferedFile *File, int Length)
 | 
			
		||||
  wanted = Length;
 | 
			
		||||
  buffer = MALLOC(uchar, wanted);
 | 
			
		||||
  f = File;
 | 
			
		||||
  Unlock();
 | 
			
		||||
  newSet.Signal();
 | 
			
		||||
  Unlock();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int cNonBlockingFileReader::Result(uchar **Buffer)
 | 
			
		||||
{
 | 
			
		||||
  LOCK_THREAD;
 | 
			
		||||
  if (buffer && length == wanted) {
 | 
			
		||||
     *Buffer = buffer;
 | 
			
		||||
     buffer = NULL;
 | 
			
		||||
  if (result && length == wanted) {
 | 
			
		||||
     *Buffer = result;
 | 
			
		||||
     result = NULL;
 | 
			
		||||
     return wanted;
 | 
			
		||||
     }
 | 
			
		||||
  }
 | 
			
		||||
  errno = EAGAIN;
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
@@ -172,6 +177,8 @@ void cNonBlockingFileReader::Action(void)
 | 
			
		||||
              length = wanted = r; // this will forward the error status to the caller
 | 
			
		||||
              }
 | 
			
		||||
           if (length == wanted) {
 | 
			
		||||
              result = buffer;
 | 
			
		||||
              buffer = NULL;
 | 
			
		||||
              cMutexLock NewDataLock(&newDataMutex);
 | 
			
		||||
              newDataCond.Broadcast();
 | 
			
		||||
              }
 | 
			
		||||
@@ -183,9 +190,9 @@ void cNonBlockingFileReader::Action(void)
 | 
			
		||||
 | 
			
		||||
bool cNonBlockingFileReader::WaitForDataMs(int msToWait)
 | 
			
		||||
{
 | 
			
		||||
  cMutexLock NewDataLock(&newDataMutex);
 | 
			
		||||
  if (buffer && length == wanted)
 | 
			
		||||
  if (result && length == wanted)
 | 
			
		||||
     return true;
 | 
			
		||||
  cMutexLock NewDataLock(&newDataMutex);
 | 
			
		||||
  return newDataCond.TimedWait(newDataMutex, msToWait);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -209,6 +216,7 @@ private:
 | 
			
		||||
  cUnbufferedFile *replayFile;
 | 
			
		||||
  double framesPerSecond;
 | 
			
		||||
  bool isPesRecording;
 | 
			
		||||
  bool pauseLive;
 | 
			
		||||
  bool eof;
 | 
			
		||||
  bool firstPacket;
 | 
			
		||||
  ePlayModes playMode;
 | 
			
		||||
@@ -228,7 +236,7 @@ protected:
 | 
			
		||||
  virtual void Activate(bool On);
 | 
			
		||||
  virtual void Action(void);
 | 
			
		||||
public:
 | 
			
		||||
  cDvbPlayer(const char *FileName);
 | 
			
		||||
  cDvbPlayer(const char *FileName, bool PauseLive);
 | 
			
		||||
  virtual ~cDvbPlayer();
 | 
			
		||||
  bool Active(void) { return cThread::Running(); }
 | 
			
		||||
  void Pause(void);
 | 
			
		||||
@@ -249,7 +257,7 @@ public:
 | 
			
		||||
#define SPEED_MULT   12 // the speed multiplier
 | 
			
		||||
int cDvbPlayer::Speeds[] = { 0, -2, -4, -8, 1, 2, 4, 12, 0 };
 | 
			
		||||
 | 
			
		||||
cDvbPlayer::cDvbPlayer(const char *FileName)
 | 
			
		||||
cDvbPlayer::cDvbPlayer(const char *FileName, bool PauseLive)
 | 
			
		||||
:cThread("dvbplayer")
 | 
			
		||||
{
 | 
			
		||||
  nonBlockingFileReader = NULL;
 | 
			
		||||
@@ -258,6 +266,7 @@ cDvbPlayer::cDvbPlayer(const char *FileName)
 | 
			
		||||
  cRecording Recording(FileName);
 | 
			
		||||
  framesPerSecond = Recording.FramesPerSecond();
 | 
			
		||||
  isPesRecording = Recording.IsPesRecording();
 | 
			
		||||
  pauseLive = PauseLive;
 | 
			
		||||
  eof = false;
 | 
			
		||||
  firstPacket = true;
 | 
			
		||||
  playMode = pmPlay;
 | 
			
		||||
@@ -275,7 +284,7 @@ cDvbPlayer::cDvbPlayer(const char *FileName)
 | 
			
		||||
     return;
 | 
			
		||||
  ringBuffer = new cRingBufferFrame(PLAYERBUFSIZE);
 | 
			
		||||
  // Create the index file:
 | 
			
		||||
  index = new cIndexFile(FileName, false, isPesRecording);
 | 
			
		||||
  index = new cIndexFile(FileName, false, isPesRecording, pauseLive);
 | 
			
		||||
  if (!index)
 | 
			
		||||
     esyslog("ERROR: can't allocate index");
 | 
			
		||||
  else if (!index->Ok()) {
 | 
			
		||||
@@ -400,15 +409,17 @@ void cDvbPlayer::Action(void)
 | 
			
		||||
  int LastReadIFrame = -1;
 | 
			
		||||
  int SwitchToPlayFrame = 0;
 | 
			
		||||
 | 
			
		||||
  if (pauseLive)
 | 
			
		||||
     Goto(0, true);
 | 
			
		||||
  while (Running()) {
 | 
			
		||||
        if (WaitingForData)
 | 
			
		||||
           nonBlockingFileReader->WaitForDataMs(3); // this keeps the CPU load low, but reacts immediately on new data
 | 
			
		||||
           nonBlockingFileReader->WaitForDataMs(10); // this keeps the CPU load low, but reacts immediately on new data
 | 
			
		||||
        else if (Sleep) {
 | 
			
		||||
           cPoller Poller;
 | 
			
		||||
           DevicePoll(Poller, 10);
 | 
			
		||||
           Sleep = false;
 | 
			
		||||
           if (playMode == pmStill || playMode==pmPause)
 | 
			
		||||
              cCondWait::SleepMs(3);
 | 
			
		||||
           if (playMode == pmStill || playMode == pmPause)
 | 
			
		||||
              cCondWait::SleepMs(10);
 | 
			
		||||
           }
 | 
			
		||||
        {
 | 
			
		||||
          LOCK_THREAD;
 | 
			
		||||
@@ -470,7 +481,15 @@ void cDvbPlayer::Action(void)
 | 
			
		||||
                   }
 | 
			
		||||
                if (!eof) {
 | 
			
		||||
                   uchar *b = NULL;
 | 
			
		||||
                   int r = nonBlockingFileReader->Result(&b);
 | 
			
		||||
                   int Retries = 5;
 | 
			
		||||
                   int r;
 | 
			
		||||
                   while (true) {
 | 
			
		||||
                         r = nonBlockingFileReader->Result(&b);
 | 
			
		||||
                         if (r == -1 && errno == EAGAIN && --Retries)
 | 
			
		||||
                            nonBlockingFileReader->WaitForDataMs(10); 
 | 
			
		||||
                         else 
 | 
			
		||||
                            break;
 | 
			
		||||
                         }
 | 
			
		||||
                   if (r > 0) {
 | 
			
		||||
                      WaitingForData = false;
 | 
			
		||||
                      uint32_t Pts = 0;
 | 
			
		||||
@@ -821,8 +840,8 @@ bool cDvbPlayer::GetReplayMode(bool &Play, bool &Forward, int &Speed)
 | 
			
		||||
 | 
			
		||||
// --- cDvbPlayerControl -----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
cDvbPlayerControl::cDvbPlayerControl(const char *FileName)
 | 
			
		||||
:cControl(player = new cDvbPlayer(FileName))
 | 
			
		||||
cDvbPlayerControl::cDvbPlayerControl(const char *FileName, bool PauseLive)
 | 
			
		||||
:cControl(player = new cDvbPlayer(FileName, PauseLive))
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbplayer.h 2.0 2002/06/23 10:13:51 kls Exp $
 | 
			
		||||
 * $Id: dvbplayer.h 2.1 2012/02/19 11:40:36 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __DVBPLAYER_H
 | 
			
		||||
@@ -19,8 +19,11 @@ class cDvbPlayerControl : public cControl {
 | 
			
		||||
private:
 | 
			
		||||
  cDvbPlayer *player;
 | 
			
		||||
public:
 | 
			
		||||
  cDvbPlayerControl(const char *FileName);
 | 
			
		||||
  cDvbPlayerControl(const char *FileName, bool PauseLive = false);
 | 
			
		||||
       // Sets up a player for the given file.
 | 
			
		||||
       // If PauseLive is true, special care is taken to make sure the index
 | 
			
		||||
       // file of the recording is long enough to allow the player to display
 | 
			
		||||
       // the first frame in still picture mode.
 | 
			
		||||
  virtual ~cDvbPlayerControl();
 | 
			
		||||
  bool Active(void);
 | 
			
		||||
  void Stop(void);
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 * Original author: Marco Schl<68><6C>ler <marco@lordzodiac.de>
 | 
			
		||||
 * With some input from the "subtitle plugin" by Pekka Virtanen <pekka.virtanen@sci.fi>
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbsubtitle.c 2.21 2012/01/11 10:34:07 kls Exp $
 | 
			
		||||
 * $Id: dvbsubtitle.c 2.22 2012/02/13 09:48:18 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -620,7 +620,7 @@ void cDvbSubtitlePage::SetState(int State)
 | 
			
		||||
    case 0: // normal case - page update
 | 
			
		||||
         dbgpages("page update\n");
 | 
			
		||||
         break;
 | 
			
		||||
    case 1: // aquisition point - page refresh
 | 
			
		||||
    case 1: // acquisition point - page refresh
 | 
			
		||||
         dbgpages("page refresh\n");
 | 
			
		||||
         regions.Clear();
 | 
			
		||||
         break;
 | 
			
		||||
@@ -1049,7 +1049,6 @@ int cDvbSubtitleConverter::ExtractSegment(const uchar *Data, int Length, int64_t
 | 
			
		||||
            page->SetVersion(pageVersion);
 | 
			
		||||
            page->SetTimeout(pageTimeout);
 | 
			
		||||
            page->SetState(bs.GetBits(2));
 | 
			
		||||
            page->regions.Clear();
 | 
			
		||||
            bs.SkipBits(2); // reserved
 | 
			
		||||
            dbgpages("Update page id %d version %d pts %"PRId64" timeout %d state %d\n", pageId, page->Version(), page->Pts(), page->Timeout(), page->State());
 | 
			
		||||
            while (!bs.IsEOF()) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								epg.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								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.9 2012/01/12 14:31:46 kls Exp $
 | 
			
		||||
 * $Id: epg.c 2.11 2012/02/13 14:58:19 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "epg.h"
 | 
			
		||||
@@ -424,7 +424,7 @@ cString cEvent::GetVpsString(void) const
 | 
			
		||||
{
 | 
			
		||||
  char buf[25];
 | 
			
		||||
  struct tm tm_r;
 | 
			
		||||
  strftime(buf, sizeof(buf), "%d.%m %R", localtime_r(&vps, &tm_r));
 | 
			
		||||
  strftime(buf, sizeof(buf), "%d.%m. %R", localtime_r(&vps, &tm_r));
 | 
			
		||||
  return buf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -587,7 +587,7 @@ void ReportEpgBugFixStats(bool Reset)
 | 
			
		||||
     bool GotHits = false;
 | 
			
		||||
     char buffer[1024];
 | 
			
		||||
     for (int i = 0; i < MAXEPGBUGFIXSTATS; i++) {
 | 
			
		||||
         const char *delim = "\t";
 | 
			
		||||
         const char *delim = " ";
 | 
			
		||||
         tEpgBugFixStats *p = &EpgBugFixStats[i];
 | 
			
		||||
         if (p->hits) {
 | 
			
		||||
            bool PrintedStats = false;
 | 
			
		||||
@@ -604,11 +604,11 @@ void ReportEpgBugFixStats(bool Reset)
 | 
			
		||||
                      dsyslog("CHANNELS READS THIS: PLEASE TAKE A LOOK AT THE FUNCTION cEvent::FixEpgBugs()");
 | 
			
		||||
                      dsyslog("IN VDR/epg.c TO LEARN WHAT'S WRONG WITH YOUR DATA, AND FIX IT!");
 | 
			
		||||
                      dsyslog("=====================");
 | 
			
		||||
                      dsyslog("Fix\tHits\tChannels");
 | 
			
		||||
                      dsyslog("Fix Hits Channels");
 | 
			
		||||
                      GotHits = true;
 | 
			
		||||
                      }
 | 
			
		||||
                   if (!PrintedStats) {
 | 
			
		||||
                      q += snprintf(q, sizeof(buffer) - (q - buffer), "%d\t%d", i, p->hits);
 | 
			
		||||
                      q += snprintf(q, sizeof(buffer) - (q - buffer), "%-3d %-4d", i, p->hits);
 | 
			
		||||
                      PrintedStats = true;
 | 
			
		||||
                      }
 | 
			
		||||
                   q += snprintf(q, sizeof(buffer) - (q - buffer), "%s%s", delim, channel->Name());
 | 
			
		||||
@@ -1029,15 +1029,10 @@ void cSchedule::Cleanup(void)
 | 
			
		||||
 | 
			
		||||
void cSchedule::Cleanup(time_t Time)
 | 
			
		||||
{
 | 
			
		||||
  cEvent *Event = events.First();
 | 
			
		||||
  while (Event) {
 | 
			
		||||
        if (Event->HasTimer())
 | 
			
		||||
           Event = (cEvent *)Event->Next();
 | 
			
		||||
        else if (Event->EndTime() + Setup.EPGLinger * 60 + 3600 < Time) { // adding one hour for safety
 | 
			
		||||
           cEvent *e = Event;
 | 
			
		||||
           Event = (cEvent *)Event->Next();
 | 
			
		||||
           DelEvent(e);
 | 
			
		||||
           }
 | 
			
		||||
  cEvent *Event;
 | 
			
		||||
  while ((Event = events.First()) != NULL) {
 | 
			
		||||
        if (!Event->HasTimer() && Event->EndTime() + Setup.EPGLinger * 60 + 3600 < Time) // adding one hour for safety
 | 
			
		||||
           DelEvent(Event);
 | 
			
		||||
        else
 | 
			
		||||
           break;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1289,3 +1284,15 @@ const cSchedule *cSchedules::GetSchedule(const cChannel *Channel, bool AddIfMiss
 | 
			
		||||
     }
 | 
			
		||||
  return Channel->schedule != &DummySchedule? Channel->schedule : NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- cEpgDataReader --------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
cEpgDataReader::cEpgDataReader(void)
 | 
			
		||||
:cThread("epg data reader")
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cEpgDataReader::Action(void)
 | 
			
		||||
{
 | 
			
		||||
  cSchedules::Read();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								epg.h
									
									
									
									
									
								
							
							
						
						
									
										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.5 2011/02/25 14:14:38 kls Exp $
 | 
			
		||||
 * $Id: epg.h 2.6 2012/02/11 12:29:55 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __EPG_H
 | 
			
		||||
@@ -213,6 +213,12 @@ public:
 | 
			
		||||
  const cSchedule *GetSchedule(const cChannel *Channel, bool AddIfMissing = false) const;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
class cEpgDataReader : public cThread {
 | 
			
		||||
public:
 | 
			
		||||
  cEpgDataReader(void);
 | 
			
		||||
  virtual void Action(void);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
void ReportEpgBugFixStats(bool Reset = false);
 | 
			
		||||
 | 
			
		||||
#endif //__EPG_H
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,15 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for a libsi
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 2.2 2011/12/04 14:18:38 kls Exp $
 | 
			
		||||
# $Id: Makefile 2.3 2012/01/18 12:31:40 kls Exp $
 | 
			
		||||
 | 
			
		||||
### The C++ compiler and options:
 | 
			
		||||
 | 
			
		||||
CXX      ?= g++
 | 
			
		||||
CXXFLAGS ?= -O2 -g -Wall -Woverloaded-virtual
 | 
			
		||||
AR = ar
 | 
			
		||||
ARFLAGS = ru
 | 
			
		||||
RANLIB = ranlib
 | 
			
		||||
AR       ?= ar
 | 
			
		||||
ARFLAGS  ?= ru
 | 
			
		||||
RANLIB   ?= ranlib
 | 
			
		||||
 | 
			
		||||
include ../Make.global
 | 
			
		||||
-include ../Make.config
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								menu.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								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.35 2012/01/14 13:06:03 kls Exp $
 | 
			
		||||
 * $Id: menu.c 2.37 2012/02/19 11:37:55 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
@@ -2383,9 +2383,19 @@ eOSState cMenuRecordings::Delete(void)
 | 
			
		||||
           }
 | 
			
		||||
        cRecording *recording = GetRecording(ri);
 | 
			
		||||
        if (recording) {
 | 
			
		||||
           if (cCutter::Active(ri->FileName())) {
 | 
			
		||||
              if (Interface->Confirm(tr("Recording is being edited - really delete?"))) {
 | 
			
		||||
                 cCutter::Stop();
 | 
			
		||||
                 recording = Recordings.GetByName(ri->FileName()); // cCutter::Stop() might have deleted it if it was the edited version
 | 
			
		||||
                 // we continue with the code below even if recording is NULL,
 | 
			
		||||
                 // in order to have the menu updated etc.
 | 
			
		||||
                 }
 | 
			
		||||
              else
 | 
			
		||||
                 return osContinue;
 | 
			
		||||
              }
 | 
			
		||||
           if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), ri->FileName()) == 0)
 | 
			
		||||
              cControl::Shutdown();
 | 
			
		||||
           if (recording->Delete()) {
 | 
			
		||||
           if (!recording || recording->Delete()) {
 | 
			
		||||
              cReplayControl::ClearLastReplayed(ri->FileName());
 | 
			
		||||
              Recordings.DelByName(ri->FileName());
 | 
			
		||||
              cOsdMenu::Del(Current());
 | 
			
		||||
@@ -4319,13 +4329,10 @@ bool cRecordControls::PauseLiveVideo(void)
 | 
			
		||||
  Skins.Message(mtStatus, tr("Pausing live video..."));
 | 
			
		||||
  cReplayControl::SetRecording(NULL, NULL); // make sure the new cRecordControl will set cReplayControl::LastReplayed()
 | 
			
		||||
  if (Start(NULL, true)) {
 | 
			
		||||
     cCondWait::SleepMs(2000); // allow recorded file to fill up enough to start replaying
 | 
			
		||||
     cReplayControl *rc = new cReplayControl;
 | 
			
		||||
     cReplayControl *rc = new cReplayControl(true);
 | 
			
		||||
     cControl::Launch(rc);
 | 
			
		||||
     cControl::Attach();
 | 
			
		||||
     cCondWait::SleepMs(1000); // allow device to replay some frames, so we have a picture
 | 
			
		||||
     Skins.Message(mtStatus, NULL);
 | 
			
		||||
     rc->ProcessKey(kPause); // pause, allowing replay mode display
 | 
			
		||||
     return true;
 | 
			
		||||
     }
 | 
			
		||||
  Skins.Message(mtStatus, NULL);
 | 
			
		||||
@@ -4415,8 +4422,8 @@ cReplayControl *cReplayControl::currentReplayControl = NULL;
 | 
			
		||||
char *cReplayControl::fileName = NULL;
 | 
			
		||||
char *cReplayControl::title = NULL;
 | 
			
		||||
 | 
			
		||||
cReplayControl::cReplayControl(void)
 | 
			
		||||
:cDvbPlayerControl(fileName)
 | 
			
		||||
cReplayControl::cReplayControl(bool PauseLive)
 | 
			
		||||
:cDvbPlayerControl(fileName, PauseLive)
 | 
			
		||||
{
 | 
			
		||||
  currentReplayControl = this;
 | 
			
		||||
  displayReplay = NULL;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								menu.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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.3 2010/03/06 16:15:59 kls Exp $
 | 
			
		||||
 * $Id: menu.h 2.4 2012/02/19 10:51:56 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __MENU_H
 | 
			
		||||
@@ -276,7 +276,7 @@ private:
 | 
			
		||||
  void EditCut(void);
 | 
			
		||||
  void EditTest(void);
 | 
			
		||||
public:
 | 
			
		||||
  cReplayControl(void);
 | 
			
		||||
  cReplayControl(bool PauseLive = false);
 | 
			
		||||
  virtual ~cReplayControl();
 | 
			
		||||
  void Stop(void);
 | 
			
		||||
  virtual cOsdObject *GetInfo(void);
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
# See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
# how to reach the author.
 | 
			
		||||
#
 | 
			
		||||
# $Id: newplugin 2.6 2011/02/27 10:06:06 kls Exp $
 | 
			
		||||
# $Id: newplugin 2.7 2012/01/18 12:32:31 kls Exp $
 | 
			
		||||
 | 
			
		||||
$PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
 | 
			
		||||
 | 
			
		||||
@@ -81,9 +81,9 @@ CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
 | 
			
		||||
 | 
			
		||||
### The directory environment:
 | 
			
		||||
 | 
			
		||||
VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
VDRDIR ?= ../../..
 | 
			
		||||
LIBDIR ?= ../../lib
 | 
			
		||||
TMPDIR ?= /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								po/ar.po
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								po/ar.po
									
									
									
									
									
								
							@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -756,6 +756,9 @@ msgstr "حدث خطاء عند محاولة الوصول لتسجيلات"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "حذف التسجيل"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -747,6 +747,9 @@ msgstr "Error a l'accedir a la gravaci
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Esborrar gravaci<63>?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Error a l'esborrar la gravaci<63>!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -746,6 +746,9 @@ msgstr "Chyba při přístupu k nahrávkám!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Smazat nahrávku?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Chyba při mazání nahrávky!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -744,6 +744,9 @@ msgstr "Fejl ved l
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Slet optagelse?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Fejl ved sletning af optagelse!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -744,6 +744,9 @@ msgstr "Fehler beim Ansprechen der Aufzeichnung!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Aufzeichnung l<>schen?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr "Aufzeichnung wird geschnitten - trotzdem l<>schen?"
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Fehler beim L<>schen der Aufzeichnung!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -744,6 +744,9 @@ msgstr "
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -745,6 +745,9 @@ msgstr "
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "<22>Eliminar grabacion?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "<22>Error al borrar la grabaci<63>n!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -744,6 +744,9 @@ msgstr "Salvestuse taasesitus nurjus!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Kustutada salvestus?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Salvestuse kustutamine nurjus!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -747,6 +747,9 @@ msgstr "Tallenteen toistaminen epäonnistui!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Poistetaanko tallenne?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Tallenteen poistaminen epäonnistui!"
 | 
			
		||||
 | 
			
		||||
@@ -1084,7 +1087,7 @@ msgid "Setup.Replay$Show replay mode"
 | 
			
		||||
msgstr "Näytä toiston tila"
 | 
			
		||||
 | 
			
		||||
msgid "Setup.Replay$Show remaining time"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Näytä jäljellä oleva aika"
 | 
			
		||||
 | 
			
		||||
msgid "Setup.Replay$Resume ID"
 | 
			
		||||
msgstr "Tallenteen paluutunniste"
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -750,6 +750,9 @@ msgstr "Impossible d'acc
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Supprimer l'enregistrement ?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Erreur de suppression de l'enregistrement !"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -746,6 +746,9 @@ msgstr "Gre
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Obrisati snimku?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Gre<72>ka pri brisanju snimke!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2012-01-02 11:54+0200\n"
 | 
			
		||||
"Last-Translator: Istv<74>n F<>ley <ifuley@tigercomp.ro>\n"
 | 
			
		||||
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
 | 
			
		||||
@@ -747,6 +747,9 @@ msgstr "Hiba a felv
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Felv<6C>tel t<>rl<72>se?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Hiba a felv<6C>tel t<>rl<72>s<EFBFBD>n<EFBFBD>l!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								po/it_IT.po
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								po/it_IT.po
									
									
									
									
									
								
							@@ -11,8 +11,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: VDR 1.6.0\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
 | 
			
		||||
"POT-Creation-Date: 2012-01-14 14:06+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2010-06-13 00:30+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2012-01-15 19:11+0100\n"
 | 
			
		||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
 | 
			
		||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
 | 
			
		||||
"Language: it\n"
 | 
			
		||||
@@ -81,7 +81,7 @@ msgid "Rolloff"
 | 
			
		||||
msgstr "Rolloff"
 | 
			
		||||
 | 
			
		||||
msgid "PlpId"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "PlpId"
 | 
			
		||||
 | 
			
		||||
msgid "Starting EPG scan"
 | 
			
		||||
msgstr "Inizio scansione EPG"
 | 
			
		||||
@@ -751,6 +751,9 @@ msgstr "Errore accesso alla registrazione!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Eliminare la registrazione?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Errore eliminazione registrazione!"
 | 
			
		||||
 | 
			
		||||
@@ -974,10 +977,10 @@ msgstr "Freq HI LNB (MHz)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Setup.LNB$Device %d connected to sat cable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Periferica %d connessa al cavo sat"
 | 
			
		||||
 | 
			
		||||
msgid "Setup.LNB$own"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "propria"
 | 
			
		||||
 | 
			
		||||
msgid "CAM reset"
 | 
			
		||||
msgstr "Reimposta la CAM"
 | 
			
		||||
@@ -1088,7 +1091,7 @@ msgid "Setup.Replay$Show replay mode"
 | 
			
		||||
msgstr "Mostra modalità riproduzione"
 | 
			
		||||
 | 
			
		||||
msgid "Setup.Replay$Show remaining time"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Mostra tempo rimanente"
 | 
			
		||||
 | 
			
		||||
msgid "Setup.Replay$Resume ID"
 | 
			
		||||
msgstr "ID di ripristino"
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -744,6 +744,9 @@ msgstr "Klaida atidarant įrašą!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Ištrinti įrašą?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Klaida trinant įrašą!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -745,6 +745,9 @@ msgstr "Грешка при пристап до снимката!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Избриши снимка?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -748,6 +748,9 @@ msgstr "Fout bij lezen opname!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Opname verwijderen?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Fout bij verwijderen opname!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -745,6 +745,9 @@ msgstr "Feil under lesing av opptak!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Slette opptak?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Feil under sletting av opptak!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -745,6 +745,9 @@ msgstr "Bl
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Usun<75><6E> nagranie?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Bl<42>d podczas usuwania nagrania!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -745,6 +745,9 @@ msgstr "Erro a aceder 
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Eliminar grava<76><61>o?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Erro a eliminar grava<76><61>o!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -747,6 +747,9 @@ msgstr "Eroare la accesarea 
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "<22>terg <20>nregistrarea?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Eroare la <20>tergerea <20>nregistr<74>rii!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -745,6 +745,9 @@ msgstr "
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -744,6 +744,9 @@ msgstr "Chyba pri pr
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Zmaza<7A> nahr<68>vku?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Pri vymaz<61>van<61> nahr<68>vky pri<72>lo k chybe!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -745,6 +745,9 @@ msgstr "Napaka pri dostopu do posnetka!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Izbri<72>i posnetek?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Napaka pri brisanju posnetka!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2011-01-09 15:57+0100\n"
 | 
			
		||||
"Last-Translator: Milan Cvijanovi<76> <elcom_cvijo@hotmail.com>\n"
 | 
			
		||||
"Language-Team: Serbian <vdr@linuxtv.org>\n"
 | 
			
		||||
@@ -753,6 +753,9 @@ msgstr "Gre
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Obri<72>i snimku?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Gre<72>ka prilikom brisanja snimke!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -747,6 +747,9 @@ msgstr "Inspelningen g
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Ta bort inspelningen?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Inspelningen g<>r inte att ta bort!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2008-02-28 00:33+0100\n"
 | 
			
		||||
"Last-Translator: Oktay Yolge<67>en <oktay_73@yahoo.de>\n"
 | 
			
		||||
"Language-Team: Turkish <vdr@linuxtv.org>\n"
 | 
			
		||||
@@ -744,6 +744,9 @@ msgstr "Kay
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Kay<61>t<EFBFBD> sil?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "Kay<61>t silme hatas<61>!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -744,6 +744,9 @@ msgstr "Помилка доступу до запису!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "Витерти запис?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
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-01-14 14:06+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2012-02-16 13:18+0100\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"
 | 
			
		||||
@@ -747,6 +747,9 @@ msgstr "存取录像错误!"
 | 
			
		||||
msgid "Delete recording?"
 | 
			
		||||
msgstr "是否删除录像?"
 | 
			
		||||
 | 
			
		||||
msgid "Recording is being edited - really delete?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Error while deleting recording!"
 | 
			
		||||
msgstr "删除录像错误!"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										90
									
								
								recording.c
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								recording.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: recording.c 2.43 2012/01/15 11:04:24 kls Exp $
 | 
			
		||||
 * $Id: recording.c 2.50 2012/02/19 10:44:45 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "recording.h"
 | 
			
		||||
@@ -875,11 +875,11 @@ const char *cRecording::Title(char Delimiter, bool NewIndicator, int Level) cons
 | 
			
		||||
        s = name;
 | 
			
		||||
     cString Length("");
 | 
			
		||||
     if (NewIndicator) {
 | 
			
		||||
        int Seconds = max(0, LengthInSeconds());
 | 
			
		||||
        int Minutes = max(0, (LengthInSeconds() + 30) / 60);
 | 
			
		||||
        Length = cString::sprintf("%c%d:%02d",
 | 
			
		||||
                   Delimiter,
 | 
			
		||||
                   Seconds / 3600,
 | 
			
		||||
                   Seconds / 60 % 60
 | 
			
		||||
                   Minutes / 60,
 | 
			
		||||
                   Minutes % 60
 | 
			
		||||
                   );
 | 
			
		||||
        }
 | 
			
		||||
     titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%s%c%c%s",
 | 
			
		||||
@@ -1059,7 +1059,7 @@ int cRecording::LengthInSeconds(void) const
 | 
			
		||||
{
 | 
			
		||||
  int nf = NumFrames();
 | 
			
		||||
  if (nf >= 0)
 | 
			
		||||
     return int((nf / FramesPerSecond() + 30) / 60) * 60;
 | 
			
		||||
     return int(nf / FramesPerSecond());
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1109,43 +1109,38 @@ void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLev
 | 
			
		||||
  cReadDir d(DirName);
 | 
			
		||||
  struct dirent *e;
 | 
			
		||||
  while ((Foreground || Running()) && (e = d.Next()) != NULL) {
 | 
			
		||||
        if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
 | 
			
		||||
           cString buffer = AddDirectory(DirName, e->d_name);
 | 
			
		||||
           struct stat st;
 | 
			
		||||
           if (lstat(buffer, &st) == 0) {
 | 
			
		||||
              int Link = 0;
 | 
			
		||||
              if (S_ISLNK(st.st_mode)) {
 | 
			
		||||
                 if (LinkLevel > MAX_LINK_LEVEL) {
 | 
			
		||||
                    isyslog("max link level exceeded - not scanning %s", *buffer);
 | 
			
		||||
                    continue;
 | 
			
		||||
                    }
 | 
			
		||||
                 Link = 1;
 | 
			
		||||
                 buffer = ReadLink(buffer);
 | 
			
		||||
                 if (!*buffer)
 | 
			
		||||
                    continue;
 | 
			
		||||
                 if (stat(buffer, &st) != 0)
 | 
			
		||||
                    continue;
 | 
			
		||||
        cString buffer = AddDirectory(DirName, e->d_name);
 | 
			
		||||
        struct stat st;
 | 
			
		||||
        if (lstat(buffer, &st) == 0) {
 | 
			
		||||
           int Link = 0;
 | 
			
		||||
           if (S_ISLNK(st.st_mode)) {
 | 
			
		||||
              if (LinkLevel > MAX_LINK_LEVEL) {
 | 
			
		||||
                 isyslog("max link level exceeded - not scanning %s", *buffer);
 | 
			
		||||
                 continue;
 | 
			
		||||
                 }
 | 
			
		||||
              if (S_ISDIR(st.st_mode)) {
 | 
			
		||||
                 if (endswith(buffer, deleted ? DELEXT : RECEXT)) {
 | 
			
		||||
                    cRecording *r = new cRecording(buffer);
 | 
			
		||||
                    if (r->Name()) {
 | 
			
		||||
                       r->NumFrames(); // initializes the numFrames member
 | 
			
		||||
                       Lock();
 | 
			
		||||
                       Add(r);
 | 
			
		||||
                       ChangeState();
 | 
			
		||||
                       Unlock();
 | 
			
		||||
                       if (deleted) {
 | 
			
		||||
                          r->fileSizeMB = DirSizeMB(buffer);
 | 
			
		||||
                          r->deleted = time(NULL);
 | 
			
		||||
                          }
 | 
			
		||||
              Link = 1;
 | 
			
		||||
              if (stat(buffer, &st) != 0)
 | 
			
		||||
                 continue;
 | 
			
		||||
              }
 | 
			
		||||
           if (S_ISDIR(st.st_mode)) {
 | 
			
		||||
              if (endswith(buffer, deleted ? DELEXT : RECEXT)) {
 | 
			
		||||
                 cRecording *r = new cRecording(buffer);
 | 
			
		||||
                 if (r->Name()) {
 | 
			
		||||
                    r->NumFrames(); // initializes the numFrames member
 | 
			
		||||
                    Lock();
 | 
			
		||||
                    Add(r);
 | 
			
		||||
                    ChangeState();
 | 
			
		||||
                    Unlock();
 | 
			
		||||
                    if (deleted) {
 | 
			
		||||
                       r->fileSizeMB = DirSizeMB(buffer);
 | 
			
		||||
                       r->deleted = time(NULL);
 | 
			
		||||
                       }
 | 
			
		||||
                    else
 | 
			
		||||
                       delete r;
 | 
			
		||||
                    }
 | 
			
		||||
                 else
 | 
			
		||||
                    ScanVideoDir(buffer, Foreground, LinkLevel + Link);
 | 
			
		||||
                    delete r;
 | 
			
		||||
                 }
 | 
			
		||||
              else
 | 
			
		||||
                 ScanVideoDir(buffer, Foreground, LinkLevel + Link);
 | 
			
		||||
              }
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
@@ -1220,12 +1215,14 @@ void cRecordings::DelByName(const char *FileName)
 | 
			
		||||
     char *ext = strrchr(recording->fileName, '.');
 | 
			
		||||
     if (ext) {
 | 
			
		||||
        strncpy(ext, DELEXT, strlen(ext));
 | 
			
		||||
        recording->fileSizeMB = DirSizeMB(recording->FileName());
 | 
			
		||||
        recording->deleted = time(NULL);
 | 
			
		||||
        DeletedRecordings.Add(recording);
 | 
			
		||||
        if (access(recording->FileName(), F_OK) == 0) {
 | 
			
		||||
           recording->fileSizeMB = DirSizeMB(recording->FileName());
 | 
			
		||||
           recording->deleted = time(NULL);
 | 
			
		||||
           DeletedRecordings.Add(recording);
 | 
			
		||||
           recording = NULL; // to prevent it from being deleted below
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
     else
 | 
			
		||||
        delete recording;
 | 
			
		||||
     delete recording;
 | 
			
		||||
     ChangeState();
 | 
			
		||||
     TouchUpdate();
 | 
			
		||||
     }
 | 
			
		||||
@@ -1558,8 +1555,9 @@ struct tIndexTs {
 | 
			
		||||
 | 
			
		||||
#define MAXWAITFORINDEXFILE     10 // max. time to wait for the regenerated index file (seconds)
 | 
			
		||||
#define INDEXFILECHECKINTERVAL 500 // ms between checks for existence of the regenerated index file
 | 
			
		||||
#define INDEXFILETESTINTERVAL   10 // ms between tests for the size of the index file in case of pausing live video
 | 
			
		||||
 | 
			
		||||
cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording)
 | 
			
		||||
cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive)
 | 
			
		||||
:resumeFile(FileName, IsPesRecording)
 | 
			
		||||
{
 | 
			
		||||
  f = -1;
 | 
			
		||||
@@ -1570,6 +1568,12 @@ cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording)
 | 
			
		||||
  indexFileGenerator = NULL;
 | 
			
		||||
  if (FileName) {
 | 
			
		||||
     fileName = IndexFileName(FileName, isPesRecording);
 | 
			
		||||
     if (!Record && PauseLive) {
 | 
			
		||||
        // Wait until the index file contains at least two frames:
 | 
			
		||||
        time_t tmax = time(NULL) + MAXWAITFORINDEXFILE;
 | 
			
		||||
        while (time(NULL) < tmax && FileSize(fileName) < 2 * sizeof(tIndexTs))
 | 
			
		||||
              cCondWait::SleepMs(INDEXFILETESTINTERVAL);
 | 
			
		||||
        }
 | 
			
		||||
     int delta = 0;
 | 
			
		||||
     if (!Record && access(fileName, R_OK) != 0) {
 | 
			
		||||
        // Index file doesn't exist, so try to regenerate it:
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: recording.h 2.26 2011/12/04 13:38:17 kls Exp $
 | 
			
		||||
 * $Id: recording.h 2.27 2012/02/19 10:44:53 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __RECORDING_H
 | 
			
		||||
@@ -279,7 +279,7 @@ private:
 | 
			
		||||
  void ConvertToPes(tIndexTs *IndexTs, int Count);
 | 
			
		||||
  bool CatchUp(int Index = -1);
 | 
			
		||||
public:
 | 
			
		||||
  cIndexFile(const char *FileName, bool Record, bool IsPesRecording = false);
 | 
			
		||||
  cIndexFile(const char *FileName, bool Record, bool IsPesRecording = false, bool PauseLive = false);
 | 
			
		||||
  ~cIndexFile();
 | 
			
		||||
  bool Ok(void) { return index != NULL; }
 | 
			
		||||
  bool Write(bool Independent, uint16_t FileNumber, off_t FileOffset);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										66
									
								
								remote.c
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								remote.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: remote.c 2.4 2011/08/15 13:41:40 kls Exp $
 | 
			
		||||
 * $Id: remote.c 2.5 2012/01/16 16:57:00 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "remote.h"
 | 
			
		||||
@@ -317,38 +317,38 @@ uint64_t cKbdRemote::ReadKeySequence(void)
 | 
			
		||||
  if ((key1 = ReadKey()) >= 0) {
 | 
			
		||||
     k = key1;
 | 
			
		||||
     if (key1 == 0x1B) {
 | 
			
		||||
         // Start of escape sequence
 | 
			
		||||
         if ((key1 = ReadKey()) >= 0) {
 | 
			
		||||
            k <<= 8;
 | 
			
		||||
            k |= key1 & 0xFF;
 | 
			
		||||
            switch (key1) {
 | 
			
		||||
              case 0x4F: // 3-byte sequence
 | 
			
		||||
                   if ((key1 = ReadKey()) >= 0) {
 | 
			
		||||
                      k <<= 8;
 | 
			
		||||
                      k |= key1 & 0xFF;
 | 
			
		||||
                      }
 | 
			
		||||
                   break;
 | 
			
		||||
              case 0x5B: // 3- or more-byte sequence
 | 
			
		||||
                   if ((key1 = ReadKey()) >= 0) {
 | 
			
		||||
                      k <<= 8;
 | 
			
		||||
                      k |= key1 & 0xFF;
 | 
			
		||||
                      switch (key1) {
 | 
			
		||||
                        case 0x31 ... 0x3F: // more-byte sequence
 | 
			
		||||
                        case 0x5B: // strange, may apparently occur
 | 
			
		||||
                             do {
 | 
			
		||||
                                if ((key1 = ReadKey()) < 0)
 | 
			
		||||
                                   break; // Sequence ends here
 | 
			
		||||
                                k <<= 8;
 | 
			
		||||
                                k |= key1 & 0xFF;
 | 
			
		||||
                                } while (key1 != 0x7E);
 | 
			
		||||
                             break;
 | 
			
		||||
                        default: ;
 | 
			
		||||
                        }
 | 
			
		||||
                      }
 | 
			
		||||
                   break;
 | 
			
		||||
              default: ;
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
        // Start of escape sequence
 | 
			
		||||
        if ((key1 = ReadKey()) >= 0) {
 | 
			
		||||
           k <<= 8;
 | 
			
		||||
           k |= key1 & 0xFF;
 | 
			
		||||
           switch (key1) {
 | 
			
		||||
             case 0x4F: // 3-byte sequence
 | 
			
		||||
                  if ((key1 = ReadKey()) >= 0) {
 | 
			
		||||
                     k <<= 8;
 | 
			
		||||
                     k |= key1 & 0xFF;
 | 
			
		||||
                     }
 | 
			
		||||
                  break;
 | 
			
		||||
             case 0x5B: // 3- or more-byte sequence
 | 
			
		||||
                  if ((key1 = ReadKey()) >= 0) {
 | 
			
		||||
                     k <<= 8;
 | 
			
		||||
                     k |= key1 & 0xFF;
 | 
			
		||||
                     switch (key1) {
 | 
			
		||||
                       case 0x31 ... 0x3F: // more-byte sequence
 | 
			
		||||
                       case 0x5B: // strange, may apparently occur
 | 
			
		||||
                            do {
 | 
			
		||||
                               if ((key1 = ReadKey()) < 0)
 | 
			
		||||
                                  break; // Sequence ends here
 | 
			
		||||
                               k <<= 8;
 | 
			
		||||
                               k |= key1 & 0xFF;
 | 
			
		||||
                               } while (key1 != 0x7E);
 | 
			
		||||
                            break;
 | 
			
		||||
                       default: ;
 | 
			
		||||
                       }
 | 
			
		||||
                     }
 | 
			
		||||
                  break;
 | 
			
		||||
             default: ;
 | 
			
		||||
             }
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  return k;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								svdrp.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								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.13 2012/01/12 15:02:46 kls Exp $
 | 
			
		||||
 * $Id: svdrp.c 2.15 2012/02/16 12:38:19 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "svdrp.h"
 | 
			
		||||
@@ -256,8 +256,6 @@ const char *HelpPages[] = {
 | 
			
		||||
  "    used to easily activate or deactivate a timer.",
 | 
			
		||||
  "MOVC <number> <to>\n"
 | 
			
		||||
  "    Move a channel to a new position.",
 | 
			
		||||
  "MOVT <number> <to>\n"
 | 
			
		||||
  "    Move a timer to a new position.",
 | 
			
		||||
  "NEWC <settings>\n"
 | 
			
		||||
  "    Create a new channel. Settings must be in the same format as returned\n"
 | 
			
		||||
  "    by the LSTC command.",
 | 
			
		||||
@@ -664,12 +662,16 @@ void cSVDRP::CmdDELR(const char *Option)
 | 
			
		||||
        if (recording) {
 | 
			
		||||
           cRecordControl *rc = cRecordControls::GetRecordControl(recording->FileName());
 | 
			
		||||
           if (!rc) {
 | 
			
		||||
              if (recording->Delete()) {
 | 
			
		||||
                 Reply(250, "Recording \"%s\" deleted", Option);
 | 
			
		||||
                 ::Recordings.DelByName(recording->FileName());
 | 
			
		||||
              if (!cCutter::Active(recording->FileName())) {
 | 
			
		||||
                 if (recording->Delete()) {
 | 
			
		||||
                    Reply(250, "Recording \"%s\" deleted", Option);
 | 
			
		||||
                    ::Recordings.DelByName(recording->FileName());
 | 
			
		||||
                    }
 | 
			
		||||
                 else
 | 
			
		||||
                    Reply(554, "Error while deleting recording!");
 | 
			
		||||
                 }
 | 
			
		||||
              else
 | 
			
		||||
                 Reply(554, "Error while deleting recording!");
 | 
			
		||||
                 Reply(550, "Recording \"%s\" is being edited", Option);
 | 
			
		||||
              }
 | 
			
		||||
           else
 | 
			
		||||
              Reply(550, "Recording \"%s\" is in use by timer %d", Option, rc->Timer()->Index() + 1);
 | 
			
		||||
@@ -1283,12 +1285,6 @@ void cSVDRP::CmdMOVC(const char *Option)
 | 
			
		||||
     Reply(501, "Missing channel number");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cSVDRP::CmdMOVT(const char *Option)
 | 
			
		||||
{
 | 
			
		||||
  //TODO combine this with menu action
 | 
			
		||||
  Reply(502, "MOVT not yet implemented");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cSVDRP::CmdNEWC(const char *Option)
 | 
			
		||||
{
 | 
			
		||||
  if (*Option) {
 | 
			
		||||
@@ -1632,7 +1628,6 @@ void cSVDRP::Execute(char *Cmd)
 | 
			
		||||
  else if (CMD("MODC"))  CmdMODC(s);
 | 
			
		||||
  else if (CMD("MODT"))  CmdMODT(s);
 | 
			
		||||
  else if (CMD("MOVC"))  CmdMOVC(s);
 | 
			
		||||
  else if (CMD("MOVT"))  CmdMOVT(s);
 | 
			
		||||
  else if (CMD("NEWC"))  CmdNEWC(s);
 | 
			
		||||
  else if (CMD("NEWT"))  CmdNEWT(s);
 | 
			
		||||
  else if (CMD("NEXT"))  CmdNEXT(s);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								svdrp.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								svdrp.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: svdrp.h 2.1 2011/12/04 13:51:44 kls Exp $
 | 
			
		||||
 * $Id: svdrp.h 2.2 2012/02/16 12:37:53 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __SVDRP_H
 | 
			
		||||
@@ -71,7 +71,6 @@ private:
 | 
			
		||||
  void CmdMODC(const char *Option);
 | 
			
		||||
  void CmdMODT(const char *Option);
 | 
			
		||||
  void CmdMOVC(const char *Option);
 | 
			
		||||
  void CmdMOVT(const char *Option);
 | 
			
		||||
  void CmdNEWC(const char *Option);
 | 
			
		||||
  void CmdNEWT(const char *Option);
 | 
			
		||||
  void CmdNEXT(const char *Option);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								themes.c
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								themes.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: themes.c 2.1 2011/02/25 14:45:18 kls Exp $
 | 
			
		||||
 * $Id: themes.c 2.2 2012/02/17 13:57:32 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "themes.h"
 | 
			
		||||
@@ -243,37 +243,35 @@ bool cThemes::Load(const char *SkinName)
 | 
			
		||||
     cReadDir d(themesDirectory);
 | 
			
		||||
     struct dirent *e;
 | 
			
		||||
     while ((e = d.Next()) != NULL) {
 | 
			
		||||
           if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
 | 
			
		||||
              if (strstr(e->d_name, SkinName) == e->d_name && e->d_name[strlen(SkinName)] == '-') {
 | 
			
		||||
                 cString FileName = AddDirectory(themesDirectory, e->d_name);
 | 
			
		||||
                 cTheme Theme;
 | 
			
		||||
                 if (Theme.Load(*FileName, true)) {
 | 
			
		||||
                    if (char **NewBuffer = (char **)realloc(names, (numThemes + 1) * sizeof(char *))) {
 | 
			
		||||
                       names = NewBuffer;
 | 
			
		||||
                       names[numThemes] = strdup(Theme.Name());
 | 
			
		||||
                       }
 | 
			
		||||
                    else {
 | 
			
		||||
                       esyslog("ERROR: out of memory");
 | 
			
		||||
                       break;
 | 
			
		||||
                       }
 | 
			
		||||
                    if (char **NewBuffer = (char **)realloc(fileNames, (numThemes + 1) * sizeof(char *))) {
 | 
			
		||||
                       fileNames = NewBuffer;
 | 
			
		||||
                       fileNames[numThemes] = strdup(*FileName);
 | 
			
		||||
                       }
 | 
			
		||||
                    else {
 | 
			
		||||
                       esyslog("ERROR: out of memory");
 | 
			
		||||
                       break;
 | 
			
		||||
                       }
 | 
			
		||||
                    if (char **NewBuffer = (char **)realloc(descriptions, (numThemes + 1) * sizeof(char *))) {
 | 
			
		||||
                       descriptions = NewBuffer;
 | 
			
		||||
                       descriptions[numThemes] = strdup(Theme.Description());
 | 
			
		||||
                       }
 | 
			
		||||
                    else {
 | 
			
		||||
                       esyslog("ERROR: out of memory");
 | 
			
		||||
                       break;
 | 
			
		||||
                       }
 | 
			
		||||
                    numThemes++;
 | 
			
		||||
           if (strstr(e->d_name, SkinName) == e->d_name && e->d_name[strlen(SkinName)] == '-') {
 | 
			
		||||
              cString FileName = AddDirectory(themesDirectory, e->d_name);
 | 
			
		||||
              cTheme Theme;
 | 
			
		||||
              if (Theme.Load(*FileName, true)) {
 | 
			
		||||
                 if (char **NewBuffer = (char **)realloc(names, (numThemes + 1) * sizeof(char *))) {
 | 
			
		||||
                    names = NewBuffer;
 | 
			
		||||
                    names[numThemes] = strdup(Theme.Name());
 | 
			
		||||
                    }
 | 
			
		||||
                 else {
 | 
			
		||||
                    esyslog("ERROR: out of memory");
 | 
			
		||||
                    break;
 | 
			
		||||
                    }
 | 
			
		||||
                 if (char **NewBuffer = (char **)realloc(fileNames, (numThemes + 1) * sizeof(char *))) {
 | 
			
		||||
                    fileNames = NewBuffer;
 | 
			
		||||
                    fileNames[numThemes] = strdup(*FileName);
 | 
			
		||||
                    }
 | 
			
		||||
                 else {
 | 
			
		||||
                    esyslog("ERROR: out of memory");
 | 
			
		||||
                    break;
 | 
			
		||||
                    }
 | 
			
		||||
                 if (char **NewBuffer = (char **)realloc(descriptions, (numThemes + 1) * sizeof(char *))) {
 | 
			
		||||
                    descriptions = NewBuffer;
 | 
			
		||||
                    descriptions[numThemes] = strdup(Theme.Description());
 | 
			
		||||
                    }
 | 
			
		||||
                 else {
 | 
			
		||||
                    esyslog("ERROR: out of memory");
 | 
			
		||||
                    break;
 | 
			
		||||
                    }
 | 
			
		||||
                 numThemes++;
 | 
			
		||||
                 }
 | 
			
		||||
              }
 | 
			
		||||
           }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										116
									
								
								tools.c
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								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.20 2012/01/11 11:21:43 kls Exp $
 | 
			
		||||
 * $Id: tools.c 2.22 2012/02/18 15:30:35 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "tools.h"
 | 
			
		||||
@@ -384,37 +384,35 @@ bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks)
 | 
			
		||||
        if (d.Ok()) {
 | 
			
		||||
           struct dirent *e;
 | 
			
		||||
           while ((e = d.Next()) != NULL) {
 | 
			
		||||
                 if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
 | 
			
		||||
                    cString buffer = AddDirectory(FileName, e->d_name);
 | 
			
		||||
                    if (FollowSymlinks) {
 | 
			
		||||
                       struct stat st2;
 | 
			
		||||
                       if (lstat(buffer, &st2) == 0) {
 | 
			
		||||
                          if (S_ISLNK(st2.st_mode)) {
 | 
			
		||||
                             int size = st2.st_size + 1;
 | 
			
		||||
                             char *l = MALLOC(char, size);
 | 
			
		||||
                             int n = readlink(buffer, l, size - 1);
 | 
			
		||||
                             if (n < 0) {
 | 
			
		||||
                                if (errno != EINVAL)
 | 
			
		||||
                                   LOG_ERROR_STR(*buffer);
 | 
			
		||||
                                }
 | 
			
		||||
                             else {
 | 
			
		||||
                                l[n] = 0;
 | 
			
		||||
                                dsyslog("removing %s", l);
 | 
			
		||||
                                if (remove(l) < 0)
 | 
			
		||||
                                   LOG_ERROR_STR(l);
 | 
			
		||||
                                }
 | 
			
		||||
                             free(l);
 | 
			
		||||
                 cString buffer = AddDirectory(FileName, e->d_name);
 | 
			
		||||
                 if (FollowSymlinks) {
 | 
			
		||||
                    struct stat st2;
 | 
			
		||||
                    if (lstat(buffer, &st2) == 0) {
 | 
			
		||||
                       if (S_ISLNK(st2.st_mode)) {
 | 
			
		||||
                          int size = st2.st_size + 1;
 | 
			
		||||
                          char *l = MALLOC(char, size);
 | 
			
		||||
                          int n = readlink(buffer, l, size - 1);
 | 
			
		||||
                          if (n < 0) {
 | 
			
		||||
                             if (errno != EINVAL)
 | 
			
		||||
                                LOG_ERROR_STR(*buffer);
 | 
			
		||||
                             }
 | 
			
		||||
                          }
 | 
			
		||||
                       else if (errno != ENOENT) {
 | 
			
		||||
                          LOG_ERROR_STR(FileName);
 | 
			
		||||
                          return false;
 | 
			
		||||
                          else {
 | 
			
		||||
                             l[n] = 0;
 | 
			
		||||
                             dsyslog("removing %s", l);
 | 
			
		||||
                             if (remove(l) < 0)
 | 
			
		||||
                                LOG_ERROR_STR(l);
 | 
			
		||||
                             }
 | 
			
		||||
                          free(l);
 | 
			
		||||
                          }
 | 
			
		||||
                       }
 | 
			
		||||
                    dsyslog("removing %s", *buffer);
 | 
			
		||||
                    if (remove(buffer) < 0)
 | 
			
		||||
                       LOG_ERROR_STR(*buffer);
 | 
			
		||||
                    else if (errno != ENOENT) {
 | 
			
		||||
                       LOG_ERROR_STR(FileName);
 | 
			
		||||
                       return false;
 | 
			
		||||
                       }
 | 
			
		||||
                    }
 | 
			
		||||
                 dsyslog("removing %s", *buffer);
 | 
			
		||||
                 if (remove(buffer) < 0)
 | 
			
		||||
                    LOG_ERROR_STR(*buffer);
 | 
			
		||||
                 }
 | 
			
		||||
           }
 | 
			
		||||
        else {
 | 
			
		||||
@@ -442,7 +440,7 @@ bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis)
 | 
			
		||||
     bool empty = true;
 | 
			
		||||
     struct dirent *e;
 | 
			
		||||
     while ((e = d.Next()) != NULL) {
 | 
			
		||||
           if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..") && strcmp(e->d_name, "lost+found")) {
 | 
			
		||||
           if (strcmp(e->d_name, "lost+found")) {
 | 
			
		||||
              cString buffer = AddDirectory(DirName, e->d_name);
 | 
			
		||||
              struct stat st;
 | 
			
		||||
              if (stat(buffer, &st) == 0) {
 | 
			
		||||
@@ -480,24 +478,22 @@ int DirSizeMB(const char *DirName)
 | 
			
		||||
     int size = 0;
 | 
			
		||||
     struct dirent *e;
 | 
			
		||||
     while (size >= 0 && (e = d.Next()) != NULL) {
 | 
			
		||||
           if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
 | 
			
		||||
              cString buffer = AddDirectory(DirName, e->d_name);
 | 
			
		||||
              struct stat st;
 | 
			
		||||
              if (stat(buffer, &st) == 0) {
 | 
			
		||||
                 if (S_ISDIR(st.st_mode)) {
 | 
			
		||||
                    int n = DirSizeMB(buffer);
 | 
			
		||||
                    if (n >= 0)
 | 
			
		||||
                       size += n;
 | 
			
		||||
                    else
 | 
			
		||||
                       size = -1;
 | 
			
		||||
                    }
 | 
			
		||||
           cString buffer = AddDirectory(DirName, e->d_name);
 | 
			
		||||
           struct stat st;
 | 
			
		||||
           if (stat(buffer, &st) == 0) {
 | 
			
		||||
              if (S_ISDIR(st.st_mode)) {
 | 
			
		||||
                 int n = DirSizeMB(buffer);
 | 
			
		||||
                 if (n >= 0)
 | 
			
		||||
                    size += n;
 | 
			
		||||
                 else
 | 
			
		||||
                    size += st.st_size / MEGABYTE(1);
 | 
			
		||||
                 }
 | 
			
		||||
              else {
 | 
			
		||||
                 LOG_ERROR_STR(*buffer);
 | 
			
		||||
                 size = -1;
 | 
			
		||||
                    size = -1;
 | 
			
		||||
                 }
 | 
			
		||||
              else
 | 
			
		||||
                 size += st.st_size / MEGABYTE(1);
 | 
			
		||||
              }
 | 
			
		||||
           else {
 | 
			
		||||
              LOG_ERROR_STR(*buffer);
 | 
			
		||||
              size = -1;
 | 
			
		||||
              }
 | 
			
		||||
           }
 | 
			
		||||
     return size;
 | 
			
		||||
@@ -567,6 +563,14 @@ time_t LastModifiedTime(const char *FileName)
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
off_t FileSize(const char *FileName)
 | 
			
		||||
{
 | 
			
		||||
  struct stat fs;
 | 
			
		||||
  if (stat(FileName, &fs) == 0)
 | 
			
		||||
     return fs.st_size;
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- cTimeMs ---------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
cTimeMs::cTimeMs(int Ms)
 | 
			
		||||
@@ -1320,7 +1324,13 @@ cReadDir::~cReadDir()
 | 
			
		||||
 | 
			
		||||
struct dirent *cReadDir::Next(void)
 | 
			
		||||
{
 | 
			
		||||
  return directory && readdir_r(directory, &u.d, &result) == 0 ? result : NULL;
 | 
			
		||||
  if (directory) {
 | 
			
		||||
     while (readdir_r(directory, &u.d, &result) == 0 && result) {
 | 
			
		||||
           if (strcmp(result->d_name, ".") && strcmp(result->d_name, ".."))
 | 
			
		||||
              return result;
 | 
			
		||||
           }
 | 
			
		||||
     }
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- cStringList -----------------------------------------------------------
 | 
			
		||||
@@ -1362,16 +1372,14 @@ bool cFileNameList::Load(const char *Directory, bool DirsOnly)
 | 
			
		||||
     struct dirent *e;
 | 
			
		||||
     if (d.Ok()) {
 | 
			
		||||
        while ((e = d.Next()) != NULL) {
 | 
			
		||||
              if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
 | 
			
		||||
                 if (DirsOnly) {
 | 
			
		||||
                    struct stat ds;
 | 
			
		||||
                    if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
 | 
			
		||||
                       if (!S_ISDIR(ds.st_mode))
 | 
			
		||||
                          continue;
 | 
			
		||||
                       }
 | 
			
		||||
              if (DirsOnly) {
 | 
			
		||||
                 struct stat ds;
 | 
			
		||||
                 if (stat(AddDirectory(Directory, e->d_name), &ds) == 0) {
 | 
			
		||||
                    if (!S_ISDIR(ds.st_mode))
 | 
			
		||||
                       continue;
 | 
			
		||||
                    }
 | 
			
		||||
                 Append(strdup(e->d_name));
 | 
			
		||||
                 }
 | 
			
		||||
              Append(strdup(e->d_name));
 | 
			
		||||
              }
 | 
			
		||||
        Sort();
 | 
			
		||||
        return true;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								tools.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								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.14 2011/12/04 14:48:03 kls Exp $
 | 
			
		||||
 * $Id: tools.h 2.15 2012/02/18 15:29:50 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __TOOLS_H
 | 
			
		||||
@@ -224,6 +224,7 @@ char *ReadLink(const char *FileName); ///< returns a new string allocated on the
 | 
			
		||||
bool SpinUpDisk(const char *FileName);
 | 
			
		||||
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);
 | 
			
		||||
cString WeekDayName(time_t t);
 | 
			
		||||
cString WeekDayNameFull(int WeekDay);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vdr.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								vdr.c
									
									
									
									
									
								
							@@ -22,7 +22,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * The project's page is at http://www.tvdr.de
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: vdr.c 2.27 2011/12/03 15:35:09 kls Exp $
 | 
			
		||||
 * $Id: vdr.c 2.29 2012/02/19 11:37:35 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <getopt.h>
 | 
			
		||||
@@ -569,6 +569,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
 | 
			
		||||
  // Main program loop variables - need to be here to have them initialized before any EXIT():
 | 
			
		||||
 | 
			
		||||
  cEpgDataReader EpgDataReader;
 | 
			
		||||
  cOsdObject *Menu = NULL;
 | 
			
		||||
  int LastChannel = 0;
 | 
			
		||||
  int LastTimerChannel = -1;
 | 
			
		||||
@@ -633,7 +634,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
        cSchedules::SetEpgDataFileName(AddDirectory(EpgDirectory, EpgDataFileName));
 | 
			
		||||
     else
 | 
			
		||||
        cSchedules::SetEpgDataFileName(EpgDataFileName);
 | 
			
		||||
     cSchedules::Read();
 | 
			
		||||
     EpgDataReader.Start();
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  // DVB interfaces:
 | 
			
		||||
@@ -1159,7 +1160,6 @@ int main(int argc, char *argv[])
 | 
			
		||||
              }
 | 
			
		||||
           switch (state) {
 | 
			
		||||
             case osPause:  DELETE_MENU;
 | 
			
		||||
                            cControl::Shutdown(); // just in case
 | 
			
		||||
                            if (!cRecordControls::PauseLiveVideo())
 | 
			
		||||
                               Skins.Message(mtError, tr("No free DVB device to record!"));
 | 
			
		||||
                            break;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user