mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Version 1.5.1
- Added cDevice::HasCi() so that devices with Common Interface can be avoided when tuning to an FTA channel, thus preserving the CAM resources even on budget DVB cards (suggested by Petri Helin). - Fixed i18n characters for the Hungarian texts (thanks to Thomas Günther). - Now using cPipe instead of popen() in cCommand::Execute() to avoid problems with open file handles when starting background commands (thanks to Reinhard Nissl). - Removed 'assert(0)' from cDvbSpuDecoder::setTime() (thanks to Marco Schlüßler). - Fixed a possible crash when loading an invalid XPM file (thanks to Martin Wache). - Updated satellite names in 'sources.conf' (thanks to Thilo Wunderlich). - Adapted 'libsi' to DVB-S2 (thanks to Marco Schlüßler). - Fixed handling error status in cDvbTuner::GetFrontendStatus() (thanks to Reinhard Nissl). - Shutdown handling has been rewritten (thanks to Udo Richter). - Plugins can now implement the new function WakeupTime() to request VDR to wake up at a particular time (thanks to Udo Richter). - The HUP signal now forces a restart of VDR (thanks to Udo Richter). - cThread::EmergencyExit() has been replaced by ShutdownHandler.RequestEmergencyExit(). - Several references to "button" in a remote control context have been changed to "key" (based on a report from Marko Mäkelä regarding the "Menu button closes" text). The "MenuButtonCloses" parameter in 'setup.conf' has therefore been renamed to "MenuKeyCloses", accordingly. This will result in an "unknown config parameter: MenuButtonCloses" error message in the log file, so you may want to remove that entry from your 'setup.conf' file. - Simplified the error handling in cDvbTuner::GetFrontendStatus() (based on a discussion with Reinhard Nissl). - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). - Increased the maximum number of DVB devices to 8 (thanks to Rolf Ahrenberg). - The new Setup parameter "Channel entry timeout" can be used to customize the time since the last keypress until a numerically entered channel number is considered complete, and the channel is switched (suggested by Helmut Auer). Setting this parameter to 0 turns off the automatic channel switching, and the user will have to confirm the entry by pressing the "Ok" key.
This commit is contained in:
		
							
								
								
									
										21
									
								
								CONTRIBUTORS
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								CONTRIBUTORS
									
									
									
									
									
								
							@@ -360,6 +360,7 @@ Norbert Schmidt <nschmidt-nrw@t-online.de>
 | 
			
		||||
Thilo Wunderlich <wunderlich@speedway.org>
 | 
			
		||||
 for his help in keeping 'channels.conf' up to date
 | 
			
		||||
 for reporting a problem with accessing the epg.data file before it is fully written
 | 
			
		||||
 for updating satellite names in 'sources.conf'
 | 
			
		||||
 | 
			
		||||
Stephan Schreiber <stephan@sschreiber.de>
 | 
			
		||||
 for his support in keeping the Premiere World channels up to date in 'channels.conf.cable'
 | 
			
		||||
@@ -583,6 +584,7 @@ Helmut Auer <vdr@helmutauer.de>
 | 
			
		||||
 for suggesting to reduce the logging for the SVDRP GRAB command
 | 
			
		||||
 for reporting that the shutdown script is given a reboot time in the past if there
 | 
			
		||||
 is a recording going on or about to start, and the user insists in shutting down now
 | 
			
		||||
 for suggesting to make the channel entry timeout configurable
 | 
			
		||||
 | 
			
		||||
Jeremy Hall <jhall@UU.NET>
 | 
			
		||||
 for fixing an incomplete initialization of the filter parameters in eit.c
 | 
			
		||||
@@ -1008,13 +1010,14 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
 | 
			
		||||
 cPluginManager::Active() in menu.c to "restart anyway?"
 | 
			
		||||
 for adding --remove-destination to the 'cp' command for binaries in the Makefiles of
 | 
			
		||||
 the plugins
 | 
			
		||||
 for increasing the maximum number of DVB devices to 8
 | 
			
		||||
 | 
			
		||||
Ralf Klueber <ralf.klueber@vodafone.com>
 | 
			
		||||
 for reporting a bug in cutting a recording if there is only a single editing mark
 | 
			
		||||
 for reporting a bug in handling a channels.conf that contains a ":@nnn" line as
 | 
			
		||||
 its last entry
 | 
			
		||||
 | 
			
		||||
Hermann Gausterer <mrq1@gmx.net>
 | 
			
		||||
Hermann Gausterer <vdr@mrq1.org>
 | 
			
		||||
 for suggesting to switch to the recording channel in case the current channel
 | 
			
		||||
 becomes unavailable
 | 
			
		||||
 | 
			
		||||
@@ -1114,6 +1117,9 @@ Reinhard Nissl <rnissl@gmx.de>
 | 
			
		||||
 for changing the behaviour when hitting the end of a recording in fast forward mode
 | 
			
		||||
 for suggesting to give the cRemote::CallPlugin() function a boolean return value
 | 
			
		||||
 for fixing a possible crash in remux.c on 64-bit machines
 | 
			
		||||
 for making cCommand::Execute() use cPipe instead of popen() to avoid problems
 | 
			
		||||
 with open file handles when starting background commands
 | 
			
		||||
 for fixing handling error status in cDvbTuner::GetFrontendStatus()
 | 
			
		||||
 | 
			
		||||
Richard Robson <richard_robson@beeb.net>
 | 
			
		||||
 for reporting freezing replay if a timer starts while in Transfer Mode from the
 | 
			
		||||
@@ -1387,6 +1393,8 @@ Marco Schl
 | 
			
		||||
 replay has been stopped
 | 
			
		||||
 for reporting a problem with displaying the replay mode symbol in case of "Multi
 | 
			
		||||
 speed mode"
 | 
			
		||||
 for removing 'assert(0)' from cDvbSpuDecoder::setTime()
 | 
			
		||||
 for adapting 'libsi' to DVB-S2
 | 
			
		||||
 | 
			
		||||
J<EFBFBD>rgen Schmitz <j.schmitz@web.de>
 | 
			
		||||
 for reporting a bug in displaying the current channel when switching via the SVDRP
 | 
			
		||||
@@ -1479,6 +1487,10 @@ Udo Richter <udo_richter@gmx.de>
 | 
			
		||||
 for some hints on how to improve handling cPluginManager::Active()
 | 
			
		||||
 for fixing a possible segfault if VDR gets terminated while a message is displayed
 | 
			
		||||
 for reporting an error in the INSTALL section on retrying shutdown later
 | 
			
		||||
 for rewriting shutdown handling
 | 
			
		||||
 for implementing cPlugin::WakeupTime() to allow plugins to request VDR to wake
 | 
			
		||||
 up at a particular time
 | 
			
		||||
 for making the HUP signal force a restart of VDR
 | 
			
		||||
 | 
			
		||||
Sven Kreiensen <svenk@kammer.uni-hannover.de>
 | 
			
		||||
 for his help in keeping 'channels.conf.terr' up to date
 | 
			
		||||
@@ -1692,6 +1704,7 @@ Henrik Niehaus <henrik.niehaus@gmx.de>
 | 
			
		||||
Martin Wache <M.Wache@gmx.net>
 | 
			
		||||
 for adding a sleep in cDvbPlayer::Action() in case there is no data to send to the
 | 
			
		||||
 device, which avoids a busy loop on very fast machines
 | 
			
		||||
 for fixing a possible crash when loading an invalid XPM file
 | 
			
		||||
 | 
			
		||||
Matthias Lenk <matthias.lenk@amd.com>
 | 
			
		||||
 for reporting an out-of-bounds memory access with audio language ids
 | 
			
		||||
@@ -1720,6 +1733,7 @@ Thomas G
 | 
			
		||||
 for reporting a bug in the initial setting of the time transponder setup parameter
 | 
			
		||||
 for suggesting to extend the version number reported with the '-V' option to also
 | 
			
		||||
 show the current APIVERSION
 | 
			
		||||
 for fixing i18n characters for the Hungarian texts
 | 
			
		||||
 | 
			
		||||
David Woodhouse <dwmw2@infradead.org>
 | 
			
		||||
 for his help in replacing the get/put_unaligned() macros from asm/unaligned.h with
 | 
			
		||||
@@ -1744,6 +1758,7 @@ Marko M
 | 
			
		||||
 for suggesting to ignore k_Repeat when deciding whether the same key has been
 | 
			
		||||
 pressed in string input fields
 | 
			
		||||
 for fixing missing ',' in the Italian and Polish OSD texts
 | 
			
		||||
 for pointing out that "Menu button closes" should actually be "Menu key closes"
 | 
			
		||||
 | 
			
		||||
Patrick Rother <krd-vdr@gulu.net>
 | 
			
		||||
 for reporting a bug in defining timers that only differ in the day of week
 | 
			
		||||
@@ -2050,3 +2065,7 @@ J
 | 
			
		||||
 | 
			
		||||
Peter Pinnau <vdr@unterbrecher.de>
 | 
			
		||||
 for reporting that 'uint32_t' requires uncluding stdint.h in font.h on some systems
 | 
			
		||||
 | 
			
		||||
Petri Helin <phelin@googlemail.com>
 | 
			
		||||
 for suggesting to avoid budget DVB cards with Common Interface when tuning to an
 | 
			
		||||
 FTA channel
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								HISTORY
									
									
									
									
									
								
							@@ -5081,3 +5081,56 @@ Video Disk Recorder Revision History
 | 
			
		||||
  without valid CA ids VDR can't decide which CAM slot to use. However, since VDR now
 | 
			
		||||
  automatically determines which CAM can decrypt which channel, setting fixed
 | 
			
		||||
  channel/device relations should no longer be necessary.
 | 
			
		||||
  IF AN ENCRYPTED CHANNEL CAN'T BE DECRYPTED AND YOU HAVE A CA VALUE IN THE RANGE
 | 
			
		||||
  0...F FOR THAT CHANNEL, SET IT TO 0 (FTA) AND TUNE TO THE CHANNEL AGAIN.
 | 
			
		||||
 | 
			
		||||
2007-01-28: Version 1.4.5-1
 | 
			
		||||
 | 
			
		||||
- Fixed i18n characters for the Hungarian texts (thanks to Thomas G<>nther).
 | 
			
		||||
- Now using cPipe instead of popen() in cCommand::Execute() to avoid problems
 | 
			
		||||
  with open file handles when starting background commands (thanks to Reinhard
 | 
			
		||||
  Nissl).
 | 
			
		||||
 | 
			
		||||
2007-02-24: Version 1.4.5-2
 | 
			
		||||
 | 
			
		||||
- Removed 'assert(0)' from cDvbSpuDecoder::setTime() (thanks to Marco Schl<68><6C>ler).
 | 
			
		||||
- Fixed a possible crash when loading an invalid XPM file (thanks to Martin Wache).
 | 
			
		||||
- Updated satellite names in 'sources.conf' (thanks to Thilo Wunderlich).
 | 
			
		||||
- Fixed handling error status in cDvbTuner::GetFrontendStatus() (thanks to
 | 
			
		||||
  Reinhard Nissl).
 | 
			
		||||
 | 
			
		||||
2007-02-25: Version 1.5.1
 | 
			
		||||
 | 
			
		||||
- Added cDevice::HasCi() so that devices with Common Interface can be avoided
 | 
			
		||||
  when tuning to an FTA channel, thus preserving the CAM resources even on budget
 | 
			
		||||
  DVB cards (suggested by Petri Helin).
 | 
			
		||||
- Fixed i18n characters for the Hungarian texts (thanks to Thomas G<>nther).
 | 
			
		||||
- Now using cPipe instead of popen() in cCommand::Execute() to avoid problems
 | 
			
		||||
  with open file handles when starting background commands (thanks to Reinhard
 | 
			
		||||
  Nissl).
 | 
			
		||||
- Removed 'assert(0)' from cDvbSpuDecoder::setTime() (thanks to Marco Schl<68><6C>ler).
 | 
			
		||||
- Fixed a possible crash when loading an invalid XPM file (thanks to Martin Wache).
 | 
			
		||||
- Updated satellite names in 'sources.conf' (thanks to Thilo Wunderlich).
 | 
			
		||||
- Adapted 'libsi' to DVB-S2 (thanks to Marco Schl<68><6C>ler).
 | 
			
		||||
- Fixed handling error status in cDvbTuner::GetFrontendStatus() (thanks to
 | 
			
		||||
  Reinhard Nissl).
 | 
			
		||||
- Shutdown handling has been rewritten (thanks to Udo Richter).
 | 
			
		||||
- Plugins can now implement the new function WakeupTime() to request VDR to wake
 | 
			
		||||
  up at a particular time (thanks to Udo Richter).
 | 
			
		||||
- The HUP signal now forces a restart of VDR (thanks to Udo Richter).
 | 
			
		||||
- cThread::EmergencyExit() has been replaced by ShutdownHandler.RequestEmergencyExit().
 | 
			
		||||
- Several references to "button" in a remote control context have been changed
 | 
			
		||||
  to "key" (based on a report from Marko M<>kel<65> regarding the "Menu button closes"
 | 
			
		||||
  text). The "MenuButtonCloses" parameter in 'setup.conf' has therefore been
 | 
			
		||||
  renamed to "MenuKeyCloses", accordingly. This will result in an "unknown config
 | 
			
		||||
  parameter: MenuButtonCloses" error message in the log file, so you may want to
 | 
			
		||||
  remove that entry from your 'setup.conf' file.
 | 
			
		||||
- Simplified the error handling in cDvbTuner::GetFrontendStatus() (based on a
 | 
			
		||||
  discussion with Reinhard Nissl).
 | 
			
		||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
 | 
			
		||||
- Increased the maximum number of DVB devices to 8 (thanks to Rolf Ahrenberg).
 | 
			
		||||
- The new Setup parameter "Channel entry timeout" can be used to customize the time
 | 
			
		||||
  since the last keypress until a numerically entered channel number is considered
 | 
			
		||||
  complete, and the channel is switched (suggested by Helmut Auer). Setting this
 | 
			
		||||
  parameter to 0 turns off the automatic channel switching, and the user will
 | 
			
		||||
  have to confirm the entry by pressing the "Ok" key.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										47
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								INSTALL
									
									
									
									
									
								
							@@ -160,30 +160,33 @@ and the next timer event is at least MinEventTimeout minutes in the future
 | 
			
		||||
(see the Setup parameters in MANUAL).
 | 
			
		||||
 | 
			
		||||
The command given in the '-s' option will be called with five parameters.
 | 
			
		||||
The first one is the time (in UTC) of the next timer event (as a time_t
 | 
			
		||||
type number), and the second one is the number of seconds from the current
 | 
			
		||||
time until the next timer event. Your program can choose which one to use
 | 
			
		||||
for programming some sort of hardware device that makes sure the computer
 | 
			
		||||
will be restarted in time before the next timer event. Your program must
 | 
			
		||||
also initiate the actual shutdown procedure of the computer. After this
 | 
			
		||||
your program should return to VDR. VDR will not automatically exit after
 | 
			
		||||
calling the shutdown program, but will rather continue normally until it
 | 
			
		||||
receives a SIGTERM when the computer is actually shut down. So in case
 | 
			
		||||
the shutdown fails, or the shutdown program for some reason decides not to
 | 
			
		||||
perform a shutdown, VDR will stay up and running and will call the shutdown
 | 
			
		||||
program again after another five minutes.
 | 
			
		||||
 | 
			
		||||
If there are currently no timers active, both parameters will be '0'.
 | 
			
		||||
In that case the program shall not set the hardware for automatic restart
 | 
			
		||||
and only perform the system shutdown. A program that uses the second parameter
 | 
			
		||||
to set the hardware for restart must therefore also check whether the first
 | 
			
		||||
parameter is '0'.
 | 
			
		||||
The first one is the time (in UTC) of the next timer event or plugin wakeup
 | 
			
		||||
time (as a time_t type number), and the second one is the number of
 | 
			
		||||
seconds from the current time until the next timer event. Your program can
 | 
			
		||||
choose which one to use for programming some sort of hardware device that
 | 
			
		||||
makes sure the computer will be restarted in time before the next timer
 | 
			
		||||
event. Your program must also initiate the actual shutdown procedure of the
 | 
			
		||||
computer. VDR will not automatically exit after calling the shutdown
 | 
			
		||||
program, but will rather continue normally until it receives a SIGTERM when
 | 
			
		||||
the computer is actually shut down. So in case the shutdown fails, or the
 | 
			
		||||
shutdown program for some reason decides not to perform a shutdown, VDR
 | 
			
		||||
will stay up and running and will call the shutdown program again after a
 | 
			
		||||
while. The command will be started in a separate background session, so it
 | 
			
		||||
can continue to run even after VDR has terminated.
 | 
			
		||||
 | 
			
		||||
The third parameter contains the number of the channel that will be recorded
 | 
			
		||||
by the next timer (or 0 if no timer is present), and the fourth parameter
 | 
			
		||||
contains the file name of the recording as defined in the timer (or an empty
 | 
			
		||||
string if no timer is present). These can be used by the shutdown program to
 | 
			
		||||
show that information on some display interface etc.
 | 
			
		||||
If there are currently no timers active and there is no plugin wakeup
 | 
			
		||||
time, both parameters will be '0'. In that case the program shall not set
 | 
			
		||||
the hardware for automatic restart and only perform the system shutdown.
 | 
			
		||||
A program that uses the second parameter to set the hardware for restart
 | 
			
		||||
must therefore also check whether the first parameter is '0'.
 | 
			
		||||
 | 
			
		||||
If the wakeup time is given by a timer, the third parameter will be the
 | 
			
		||||
number of the channel that will be recorded, otherwise it will be 0. The
 | 
			
		||||
fourth parameter contains the file name of the recording as defined in the
 | 
			
		||||
timer, the name of the plugin that requested the wakeup time, or an empty
 | 
			
		||||
string if no wakeup time is present. These can be used by the shutdown
 | 
			
		||||
program to show that information on some display interface etc.
 | 
			
		||||
 | 
			
		||||
The fifth parameter indicates the reason why the shutdown was requested.
 | 
			
		||||
'0' means this is an automatic shutdown due to some timeout, while '1' means
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										87
									
								
								MANUAL
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								MANUAL
									
									
									
									
									
								
							@@ -112,7 +112,7 @@ Version 1.4
 | 
			
		||||
  "Ok" here opens the "Edit timer" menu.
 | 
			
		||||
 | 
			
		||||
  Textual options, like channel names or recording file names, can be edited
 | 
			
		||||
  by pressing the "Right" button (which puts brackets around the current
 | 
			
		||||
  by pressing the "Right" key (which puts brackets around the current
 | 
			
		||||
  character as in "[R]TL"), selecting the desired character position with
 | 
			
		||||
  "Left" and "Right", and changing the character with the "Up" and "Down"
 | 
			
		||||
  keys. "Ok" then confirms the changes. The "Red" key toggles between
 | 
			
		||||
@@ -120,7 +120,7 @@ Version 1.4
 | 
			
		||||
  insert and overwrite mode. The "Yellow" key deletes the current character
 | 
			
		||||
  (or the one to the right of the cursor in insert mode).
 | 
			
		||||
 | 
			
		||||
  The "Red", "Green", "Yellow" and "Blue" buttons have special meanings
 | 
			
		||||
  The "Red", "Green", "Yellow" and "Blue" keys have special meanings
 | 
			
		||||
  in various menus and are listed at the bottom of the on-screen-display.
 | 
			
		||||
 | 
			
		||||
  At any point in the menu system, pressing the "Menu" key again will
 | 
			
		||||
@@ -137,22 +137,22 @@ Version 1.4
 | 
			
		||||
  displays detailed information about the selected programme. Pressing "Ok"
 | 
			
		||||
  again (or pressing "Back") gets you back into the "Schedule" menu.
 | 
			
		||||
 | 
			
		||||
  From the "Schedule" menu, the "Green" button opens the "What's on now?"
 | 
			
		||||
  From the "Schedule" menu, the "Green" key opens the "What's on now?"
 | 
			
		||||
  menu, which displays all programmes that are currently running on all
 | 
			
		||||
  channels that broadcast their programme information on the current
 | 
			
		||||
  transponder, or from channels that have been current lately (VDR stores
 | 
			
		||||
  all information it gathers in an internal list). The more channels you
 | 
			
		||||
  have been switching through lately, the longer this list will be.
 | 
			
		||||
  The "Yellow" button opens the "What's on next?" menu, which lists all
 | 
			
		||||
  The "Yellow" key opens the "What's on next?" menu, which lists all
 | 
			
		||||
  programmes that will start next on all channels.
 | 
			
		||||
 | 
			
		||||
  Inside the "What's on now/next?" menus the "Green" button toggles between
 | 
			
		||||
  the "Now" and "Next" display, and the "Yellow" button takes you to the
 | 
			
		||||
  Inside the "What's on now/next?" menus the "Green" key toggles between
 | 
			
		||||
  the "Now" and "Next" display, and the "Yellow" key takes you to the
 | 
			
		||||
  "Schedule" menu of the current channel in the list.
 | 
			
		||||
 | 
			
		||||
  The "Red" button allows you to instantly program a timer to record the
 | 
			
		||||
  selected programme. After pressing this button, the current event will
 | 
			
		||||
  be marked with 'T', and the function of the "Red" button will change from
 | 
			
		||||
  The "Red" key allows you to instantly program a timer to record the
 | 
			
		||||
  selected programme. After pressing this key, the current event will
 | 
			
		||||
  be marked with 'T', and the function of the "Red" key will change from
 | 
			
		||||
  "Record" to "Timer". Pressing "Red" on an event marked with 'T' will open
 | 
			
		||||
  the "Edit timer" menu for this timer, where you can make any modifications
 | 
			
		||||
  you may want to apply. Note that the Start and Stop time are offset by the
 | 
			
		||||
@@ -167,7 +167,7 @@ Version 1.4
 | 
			
		||||
  directly into the "Edit timer" menu in order to allow the user to make further
 | 
			
		||||
  changes to timer parameters before the actual recording starts.
 | 
			
		||||
 | 
			
		||||
  The "Blue" button can be pressed to switch to the channel with the selected
 | 
			
		||||
  The "Blue" key can be pressed to switch to the channel with the selected
 | 
			
		||||
  programme.
 | 
			
		||||
 | 
			
		||||
  The following markers in these menus give additional information about the
 | 
			
		||||
@@ -192,14 +192,14 @@ Version 1.4
 | 
			
		||||
 | 
			
		||||
  1. With no On Screen Menu displayed press the "Up" or "Down" key to switch
 | 
			
		||||
     to the next higher or lower channel.
 | 
			
		||||
  2. Press the "Menu" button to bring up the On Screen Menu, select "Channels"
 | 
			
		||||
  2. Press the "Menu" key to bring up the On Screen Menu, select "Channels"
 | 
			
		||||
     and browse through the list with the "Up" and "Down" key; to switch to the
 | 
			
		||||
     selected channel press "Ok".
 | 
			
		||||
  3. Directly type in the channel number with the numeric keys ('0'..'9');
 | 
			
		||||
     if no key is pressed for about one second, the digits collected so
 | 
			
		||||
     far will define the channel number.
 | 
			
		||||
  4. From the "Now", "Next" and "Event" menus (accessible through the "Schedule"
 | 
			
		||||
     menu) by pressing the "Blue" button.
 | 
			
		||||
     menu) by pressing the "Blue" key.
 | 
			
		||||
 | 
			
		||||
  Pressing the '0' key in normal viewing mode toggles between the current and
 | 
			
		||||
  the previous channel. A channel is considered "previous" if it has been
 | 
			
		||||
@@ -210,15 +210,15 @@ Version 1.4
 | 
			
		||||
  'current/next' information will be displayed below this line. This display
 | 
			
		||||
  automatically goes away after about five seconds, or if any key is pressed.
 | 
			
		||||
  To bring up the channel display without switching channels you can press
 | 
			
		||||
  the "Ok" button.
 | 
			
		||||
  the "Ok" key.
 | 
			
		||||
 | 
			
		||||
* Selecting audio tracks
 | 
			
		||||
 | 
			
		||||
  If the current channel or recording provides different audio tracks (for
 | 
			
		||||
  different languages or Dolby Digital), the "Green" button in the "VDR" menu can
 | 
			
		||||
  different languages or Dolby Digital), the "Green" key in the "VDR" menu can
 | 
			
		||||
  be pressed to bring up the "Audio" menu. Within this menu, the "Up" and "Down"
 | 
			
		||||
  keys can be used to switch between the audio tracks. If your remote control has
 | 
			
		||||
  a dedicated "Audio" button, the first press of that button brings up the "Audio"
 | 
			
		||||
  a dedicated "Audio" key, the first press of that key brings up the "Audio"
 | 
			
		||||
  menu, and every further press switches to the next available audio track.
 | 
			
		||||
 | 
			
		||||
  The "Left" and "Right" keys can be used to switch between "mono left", "stereo"
 | 
			
		||||
@@ -242,7 +242,7 @@ Version 1.4
 | 
			
		||||
  If the 'channels.conf' file contains "group separators" you can switch
 | 
			
		||||
  through these groups by pressing the "Left" and "Right" key while no
 | 
			
		||||
  menu is being displayed. The channel display will show the name of the
 | 
			
		||||
  group, and if you press the "Ok" button while the group name is being
 | 
			
		||||
  group, and if you press the "Ok" key while the group name is being
 | 
			
		||||
  displayed, you will switch to the first channel of that group.
 | 
			
		||||
 | 
			
		||||
  Channel groups can be whatever you decide them to be. You can either
 | 
			
		||||
@@ -251,11 +251,11 @@ Version 1.4
 | 
			
		||||
 | 
			
		||||
* Instant Recording
 | 
			
		||||
 | 
			
		||||
  You can start recording the current channel by pressing the "Red" button
 | 
			
		||||
  You can start recording the current channel by pressing the "Red" key
 | 
			
		||||
  in the "VDR" menu. This will create a timer event named "@channelname" that
 | 
			
		||||
  starts at the current time and by default records for 3 hours.
 | 
			
		||||
  If you want to modify the recording time you need to edit the timer.
 | 
			
		||||
  Stop instant recording by pressing the "Menu" button and selecting
 | 
			
		||||
  Stop instant recording by pressing the "Menu" key and selecting
 | 
			
		||||
  "Stop Recording", or by disabling the timer. The default priority, lifetime
 | 
			
		||||
  and recording time can be defined in the "Setup/Recording" menu.
 | 
			
		||||
 | 
			
		||||
@@ -267,7 +267,7 @@ Version 1.4
 | 
			
		||||
  "Record") and immediately begin replaying that recording. Replay will be
 | 
			
		||||
  put into "pause" mode, so you can attend to whatever it was that disturbed
 | 
			
		||||
  your live viewing session. Once you're back, simply press the "Up" or "Play"
 | 
			
		||||
  button and you'll be watching the current channel in time shift mode, right
 | 
			
		||||
  key and you'll be watching the current channel in time shift mode, right
 | 
			
		||||
  from the point where you left off. The instant recording VDR has started
 | 
			
		||||
  will use the parameters for "Pause priority" and "Pause lifetime" as defined
 | 
			
		||||
  in the "Setup/Recording" menu. Recording time will be the same as for
 | 
			
		||||
@@ -277,12 +277,12 @@ Version 1.4
 | 
			
		||||
* Replaying a Recording
 | 
			
		||||
 | 
			
		||||
  All recordings are listed in the "Recordings" menu. Browse through the
 | 
			
		||||
  list with the "Up" and "Down" button and press "Ok" (or the "Red" button)
 | 
			
		||||
  list with the "Up" and "Down" key and press "Ok" (or the "Red" key)
 | 
			
		||||
  to start playback. New recordings are marked with an '*'.
 | 
			
		||||
  If the Setup parameter RecordingDirs has been set and there are recordings
 | 
			
		||||
  from repeating timers organized in a subdirectory structure, only the
 | 
			
		||||
  directory is displayed and it can be opened by pressing "Ok" (or the "Red"
 | 
			
		||||
  button). A directory entry displays the total number of recordings within
 | 
			
		||||
  key). A directory entry displays the total number of recordings within
 | 
			
		||||
  that directory (and any possible subdirectory thereof) as well as the total
 | 
			
		||||
  number of new recordings (as opposed to a recording's entry, which displays
 | 
			
		||||
  the date and time of the recording).
 | 
			
		||||
@@ -295,15 +295,15 @@ Version 1.4
 | 
			
		||||
  the order in which they were broadcast.
 | 
			
		||||
 | 
			
		||||
  Playback can be stopped via the "VDR" menu by selecting "Stop replaying",
 | 
			
		||||
  or by pressing the "Blue" button outside the menu.
 | 
			
		||||
  or by pressing the "Blue" key outside the menu.
 | 
			
		||||
  A previously stopped playback session can be resumed by pressing the "Blue"
 | 
			
		||||
  button in the "VDR" menu.
 | 
			
		||||
  key in the "VDR" menu.
 | 
			
		||||
 | 
			
		||||
* Processing Recordings
 | 
			
		||||
 | 
			
		||||
  The configuration file 'reccmds.conf' can be used to define system commands
 | 
			
		||||
  that can be applied to the recording that is currently highlighted in the
 | 
			
		||||
  "Recordings" menu. The "Red" button in the "Recordings" menu opens the "Recording
 | 
			
		||||
  "Recordings" menu. The "Red" key in the "Recordings" menu opens the "Recording
 | 
			
		||||
  commands" menu if there are commands defined in the file 'reccmds.conf'. Pressing
 | 
			
		||||
  one of the keys '1'..'9' in the "Recordings" menu executes the corresponding
 | 
			
		||||
  command from 'reccmds.conf' (see also "Executing system commands" below).
 | 
			
		||||
@@ -322,20 +322,20 @@ Version 1.4
 | 
			
		||||
    Right   Runs playback forward or backward at a higher speed; press
 | 
			
		||||
            again to resume normal speed. If in Pause mode, runs forward or
 | 
			
		||||
            backward at a slower speed; press again to return to pause mode.
 | 
			
		||||
            Pressing and holding down the button performs the function until
 | 
			
		||||
            the button is released again.
 | 
			
		||||
            Pressing and holding down the key performs the function until
 | 
			
		||||
            the key is released again.
 | 
			
		||||
            If "Multi Speed Mode" has been enabled in the "Setup" menu, the
 | 
			
		||||
            function of these buttons changes in a way that gives you three
 | 
			
		||||
            function of these keys changes in a way that gives you three
 | 
			
		||||
            fast and slow speeds, through which you can switch by pressing
 | 
			
		||||
            the respective button several times.
 | 
			
		||||
            the respective key several times.
 | 
			
		||||
  - Red     Jump to a specific location. Enter the time you want to jump to
 | 
			
		||||
            and then press "Left" or "Right" to jump relative to the current
 | 
			
		||||
            position, "Up" to jump to an absolute position, and "Down" to
 | 
			
		||||
            jump and pause at an absolute position.
 | 
			
		||||
  - Green
 | 
			
		||||
    Yellow  Skips about 60 seconds back or forward.
 | 
			
		||||
            Pressing and holding down the button performs the function until
 | 
			
		||||
            the button is released again.
 | 
			
		||||
            Pressing and holding down the key performs the function until
 | 
			
		||||
            the key is released again.
 | 
			
		||||
  - Ok      Brings up the replay progress display, which shows the date,
 | 
			
		||||
            time and title of the recording, a progress bar and the
 | 
			
		||||
            current and total time of the recording.
 | 
			
		||||
@@ -469,7 +469,7 @@ Version 1.4
 | 
			
		||||
  First day: The date of the first day when this timer shall start recording
 | 
			
		||||
             (only available for repeating timers).
 | 
			
		||||
 | 
			
		||||
  A timer can also be programmed by pressing the "Red" button on the "Schedule",
 | 
			
		||||
  A timer can also be programmed by pressing the "Red" key on the "Schedule",
 | 
			
		||||
  "Now", "Next" or "Event" menus.
 | 
			
		||||
 | 
			
		||||
* Parameters in the "Setup" menu
 | 
			
		||||
@@ -513,7 +513,7 @@ Version 1.4
 | 
			
		||||
  Info on channel switch = yes
 | 
			
		||||
                         Turns the display of the current/next information on
 | 
			
		||||
                         or off when switching the channel. The information is
 | 
			
		||||
                         always displayed when pressing the "Ok" button in
 | 
			
		||||
                         always displayed when pressing the "Ok" key in
 | 
			
		||||
                         normal viewing mode.
 | 
			
		||||
 | 
			
		||||
  Timeout requested channel info = yes
 | 
			
		||||
@@ -535,10 +535,10 @@ Version 1.4
 | 
			
		||||
                               (first) line of the list directly to the first (last)
 | 
			
		||||
                               one.
 | 
			
		||||
 | 
			
		||||
  Menu button closes = no
 | 
			
		||||
                         If set to "yes", pressing the "Menu" button while there is
 | 
			
		||||
  Menu key closes = no
 | 
			
		||||
                         If set to "yes", pressing the "Menu" key while there is
 | 
			
		||||
                         anything displayed on the OSD will close the OSD. If set
 | 
			
		||||
                         to "no", the "Menu" button will open the main menu after
 | 
			
		||||
                         to "no", the "Menu" key will open the main menu after
 | 
			
		||||
                         closing a temporary display, like, for instance, the channel
 | 
			
		||||
                         display.
 | 
			
		||||
 | 
			
		||||
@@ -607,7 +607,7 @@ Version 1.4
 | 
			
		||||
                         different languages, the preferred languages are checked
 | 
			
		||||
                         in the given order to decide which one to take.
 | 
			
		||||
 | 
			
		||||
  Scan                   The "Red" button in the "Setup/EPG" menu can be used to
 | 
			
		||||
  Scan                   The "Red" key in the "Setup/EPG" menu can be used to
 | 
			
		||||
                         force an EPG scan on a single DVB card system. If pressed,
 | 
			
		||||
                         and the primary DVB device is currently not recording or
 | 
			
		||||
                         replaying, it will loop through the transponders once and
 | 
			
		||||
@@ -711,7 +711,7 @@ Version 1.4
 | 
			
		||||
                         yes = use it (and create subdirectories)
 | 
			
		||||
 | 
			
		||||
  Use VPS = 0            Defines whether a timer that is created from an EPG entry
 | 
			
		||||
                         (by pressing the "Record" (red) button in the "Schedules"
 | 
			
		||||
                         (by pressing the "Record" (red) key in the "Schedules"
 | 
			
		||||
                         or "What's on now/next?" menu) will automatically use VPS
 | 
			
		||||
                         if the event it is created for has a VPS time.
 | 
			
		||||
 | 
			
		||||
@@ -723,7 +723,7 @@ Version 1.4
 | 
			
		||||
 | 
			
		||||
  Mark instant recording = yes
 | 
			
		||||
                         Defines whether an "instant recording" (started by
 | 
			
		||||
                         pressing the "Red" button in the "VDR" menu) will be
 | 
			
		||||
                         pressing the "Red" key in the "VDR" menu) will be
 | 
			
		||||
                         marked with a '@' character to make it distinguishable
 | 
			
		||||
                         from timer recordings in the "Recordings" menu.
 | 
			
		||||
 | 
			
		||||
@@ -786,9 +786,18 @@ Version 1.4
 | 
			
		||||
                         connection after which the connection is automatically
 | 
			
		||||
                         closed. Default is 300, a value of 0 means no timeout.
 | 
			
		||||
 | 
			
		||||
  Zap Timeout = 3        The time (in seconds) until a channel counts as "previous"
 | 
			
		||||
  Zap timeout = 3        The time (in seconds) until a channel counts as "previous"
 | 
			
		||||
                         for switching with '0'
 | 
			
		||||
 | 
			
		||||
  Channel entry timeout = 1000
 | 
			
		||||
                         The time (in milliseconds) after the last keypress until
 | 
			
		||||
                         a numerically entered channel number is considered
 | 
			
		||||
                         complete, and the channel is switched. Default is 1000,
 | 
			
		||||
                         a value of 0 turns this off, so a numerically entered
 | 
			
		||||
                         channel number then needs to be confirmed with the "Ok"
 | 
			
		||||
                         key. Note that the total maximum is also limited by
 | 
			
		||||
                         the "OSD/Channel info time" parameter.
 | 
			
		||||
 | 
			
		||||
  Initial channel = 0    The number of the channel that shall be tuned to when
 | 
			
		||||
                         VDR starts. Default is 0, which means that it will
 | 
			
		||||
                         tune to the channel that was on before VDR was stopped.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
# See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
# how to reach the author.
 | 
			
		||||
#
 | 
			
		||||
# $Id: Makefile 1.96 2006/11/11 13:55:32 kls Exp $
 | 
			
		||||
# $Id: Makefile 1.97 2007/02/24 13:23:12 kls Exp $
 | 
			
		||||
 | 
			
		||||
.DELETE_ON_ERROR:
 | 
			
		||||
 | 
			
		||||
@@ -35,7 +35,7 @@ SILIB    = $(LSIDIR)/libsi.a
 | 
			
		||||
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o dvbosd.o\
 | 
			
		||||
       dvbplayer.o dvbspu.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
 | 
			
		||||
       lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
 | 
			
		||||
       receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o\
 | 
			
		||||
       receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
 | 
			
		||||
       skinclassic.o skins.o skinsttng.o sources.o spu.o status.o svdrp.o themes.o thread.o\
 | 
			
		||||
       timers.o tools.o transfer.o vdr.o videodir.o
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								PLUGINS.html
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								PLUGINS.html
									
									
									
									
									
								
							@@ -6,7 +6,7 @@
 | 
			
		||||
 | 
			
		||||
<center><h1>The VDR Plugin System</h1></center>
 | 
			
		||||
 | 
			
		||||
<center><b>Version 1.5.0</b></center>
 | 
			
		||||
<center><b>Version 1.5.1</b></center>
 | 
			
		||||
<p>
 | 
			
		||||
<center>
 | 
			
		||||
Copyright © 2006 Klaus Schmidinger<br>
 | 
			
		||||
@@ -14,9 +14,12 @@ Copyright © 2006 Klaus Schmidinger<br>
 | 
			
		||||
<a href="http://www.cadsoft.de/vdr">www.cadsoft.de/vdr</a>
 | 
			
		||||
</center>
 | 
			
		||||
<p>
 | 
			
		||||
<!--X1.5.0--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
 | 
			
		||||
<!--X1.5.0--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
 | 
			
		||||
Important modifications introduced in version 1.5.0 are marked like this.
 | 
			
		||||
<!--X1.5.0--></td></tr></table>
 | 
			
		||||
<!--X1.5.1--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
 | 
			
		||||
Important modifications introduced in version 1.5.1 are marked like this.
 | 
			
		||||
<!--X1.5.1--></td></tr></table>
 | 
			
		||||
<p>
 | 
			
		||||
VDR provides an easy to use plugin interface that allows additional functionality
 | 
			
		||||
to be added to the program by implementing a dynamically loadable library file.
 | 
			
		||||
@@ -55,6 +58,9 @@ structures and allows it to hook itself into specific areas to perform special a
 | 
			
		||||
<li><a href="#Housekeeping">Housekeeping</a>
 | 
			
		||||
<li><a href="#Main thread hook">Main thread hook</a>
 | 
			
		||||
<li><a href="#Activity">Activity</a>
 | 
			
		||||
<!--X1.5.1--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
 | 
			
		||||
<li><a href="#Wakeup">Wakeup</a>
 | 
			
		||||
<!--X1.5.1--></td></tr></table>
 | 
			
		||||
<li><a href="#Setup parameters">Setup parameters</a>
 | 
			
		||||
<li><a href="#The Setup menu">The Setup menu</a>
 | 
			
		||||
<li><a href="#Configuration files">Configuration files</a>
 | 
			
		||||
@@ -76,7 +82,7 @@ structures and allows it to hook itself into specific areas to perform special a
 | 
			
		||||
<li><a href="#Devices">Devices</a>
 | 
			
		||||
<li><a href="#Audio">Audio</a>
 | 
			
		||||
<li><a href="#Remote Control">Remote Control</a>
 | 
			
		||||
<!--X1.5.0--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
 | 
			
		||||
<!--X1.5.0--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
 | 
			
		||||
<li><a href="#Conditional Access">Conditional Access</a>
 | 
			
		||||
<!--X1.5.0--></td></tr></table>
 | 
			
		||||
</ul>
 | 
			
		||||
@@ -675,6 +681,41 @@ be queried, and further prompts may show up. If all prompts have been confirmed,
 | 
			
		||||
the shutdown will take place. As soon as one prompt is not confirmed, no
 | 
			
		||||
further plugins will be queried and no shutdown will be done.
 | 
			
		||||
 | 
			
		||||
<!--X1.5.1--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
 | 
			
		||||
<a name="Wakeup"><hr><h2>Wakeup</h2>
 | 
			
		||||
 | 
			
		||||
<center><i><b>Wake me up before you go-go</b></i></center><p>
 | 
			
		||||
 | 
			
		||||
If a plugin wants to schedule activity for a later time, or wants to perform
 | 
			
		||||
periodic activity at a certain time at night, and if VDR shall wake up from
 | 
			
		||||
shutdown at that time, the plugin can implement the function
 | 
			
		||||
 | 
			
		||||
<p><table><tr><td bgcolor=#F0F0F0><pre>
 | 
			
		||||
virtual time_t WakeupTime(void);
 | 
			
		||||
</pre></td></tr></table><p>
 | 
			
		||||
 | 
			
		||||
which shall return the time of the next custom wakeup time, or 0 if no wakeup
 | 
			
		||||
is planned. VDR will pass the most recent wakeup time of all plugins, or the next
 | 
			
		||||
timer time, whichever comes first, to the shutdown script. The following sample
 | 
			
		||||
will wake up VDR every night at 1:00:
 | 
			
		||||
 | 
			
		||||
<p><table><tr><td bgcolor=#F0F0F0><pre>
 | 
			
		||||
time_t MyPlugin::WakeupTime(void)
 | 
			
		||||
{
 | 
			
		||||
  time_t Now = time(NULL);
 | 
			
		||||
  time_t Time = cTimer::SetTime(Now, cTimer::TimeToInt(100));
 | 
			
		||||
  if (Time <= Now)
 | 
			
		||||
     Time = cTimer::IncDay(Time, 1);
 | 
			
		||||
  return Time;
 | 
			
		||||
}
 | 
			
		||||
</pre></td></tr></table><p>
 | 
			
		||||
 | 
			
		||||
After wakeup, the plugin shall continue to return the wakeup time and shall
 | 
			
		||||
return a string when <tt>Active()</tt> is called at that time, otherwise VDR may shut down
 | 
			
		||||
again instantly. If <tt>WakeupTime()</tt> returns a time that is not in
 | 
			
		||||
the future, the time will be ignored.
 | 
			
		||||
<!--X1.5.1--></td></tr></table>
 | 
			
		||||
 | 
			
		||||
<a name="Setup parameters"><hr><h2>Setup parameters</h2>
 | 
			
		||||
 | 
			
		||||
<center><i><b>Remember me...</b></i></center><p>
 | 
			
		||||
@@ -2046,7 +2087,7 @@ Put(uint64 Code, bool Repeat = false, bool Release = false);
 | 
			
		||||
 | 
			
		||||
The other parameters have the same meaning as in the first version of this function.
 | 
			
		||||
 | 
			
		||||
<!--X1.5.0--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
 | 
			
		||||
<!--X1.5.0--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
 | 
			
		||||
<a name="Conditional Access"><hr><h2>Conditional Access</h2>
 | 
			
		||||
 | 
			
		||||
<center><i><b>Members only!</b></i></center><p>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								config.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								config.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: config.c 1.146 2006/07/22 11:57:51 kls Exp $
 | 
			
		||||
 * $Id: config.c 1.150 2007/02/25 13:58:45 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
@@ -67,8 +67,8 @@ const char *cCommand::Execute(const char *Parameters)
 | 
			
		||||
     asprintf(&cmdbuf, "%s %s", command, Parameters);
 | 
			
		||||
  const char *cmd = cmdbuf ? cmdbuf : command;
 | 
			
		||||
  dsyslog("executing command '%s'", cmd);
 | 
			
		||||
  FILE *p = popen(cmd, "r");
 | 
			
		||||
  if (p) {
 | 
			
		||||
  cPipe p;
 | 
			
		||||
  if (p.Open(cmd, "r")) {
 | 
			
		||||
     int l = 0;
 | 
			
		||||
     int c;
 | 
			
		||||
     while ((c = fgetc(p)) != EOF) {
 | 
			
		||||
@@ -78,7 +78,7 @@ const char *cCommand::Execute(const char *Parameters)
 | 
			
		||||
           }
 | 
			
		||||
     if (result)
 | 
			
		||||
        result[l] = 0;
 | 
			
		||||
     pclose(p);
 | 
			
		||||
     p.Close();
 | 
			
		||||
     }
 | 
			
		||||
  else
 | 
			
		||||
     esyslog("ERROR: can't open pipe for command '%s'", cmd);
 | 
			
		||||
@@ -222,7 +222,7 @@ cSetup::cSetup(void)
 | 
			
		||||
  TimeoutRequChInfo = 1;
 | 
			
		||||
  MenuScrollPage = 1;
 | 
			
		||||
  MenuScrollWrap = 0;
 | 
			
		||||
  MenuButtonCloses = 0;
 | 
			
		||||
  MenuKeyCloses = 0;
 | 
			
		||||
  MarkInstantRecord = 1;
 | 
			
		||||
  strcpy(NameInstantRecord, "TITLE EPISODE");
 | 
			
		||||
  InstantRecordTime = 180;
 | 
			
		||||
@@ -242,6 +242,7 @@ cSetup::cSetup(void)
 | 
			
		||||
  EPGLinger = 0;
 | 
			
		||||
  SVDRPTimeout = 300;
 | 
			
		||||
  ZapTimeout = 3;
 | 
			
		||||
  ChannelEntryTimeout = 1000;
 | 
			
		||||
  PrimaryLimit = 0;
 | 
			
		||||
  DefaultPriority = 50;
 | 
			
		||||
  DefaultLifetime = 99;
 | 
			
		||||
@@ -267,6 +268,7 @@ cSetup::cSetup(void)
 | 
			
		||||
  SplitEditedFiles = 0;
 | 
			
		||||
  MinEventTimeout = 30;
 | 
			
		||||
  MinUserInactivity = 300;
 | 
			
		||||
  NextWakeupTime = 0;
 | 
			
		||||
  MultiSpeedMode = 0;
 | 
			
		||||
  ShowReplayMode = 0;
 | 
			
		||||
  ResumeID = 0;
 | 
			
		||||
@@ -383,7 +385,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
 | 
			
		||||
  else if (!strcasecmp(Name, "TimeoutRequChInfo"))   TimeoutRequChInfo  = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "MenuScrollPage"))      MenuScrollPage     = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "MenuScrollWrap"))      MenuScrollWrap     = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "MenuButtonCloses"))    MenuButtonCloses   = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "MenuKeyCloses"))       MenuKeyCloses      = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "MarkInstantRecord"))   MarkInstantRecord  = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "NameInstantRecord"))   strn0cpy(NameInstantRecord, Value, MaxFileName);
 | 
			
		||||
  else if (!strcasecmp(Name, "InstantRecordTime"))   InstantRecordTime  = atoi(Value);
 | 
			
		||||
@@ -403,6 +405,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
 | 
			
		||||
  else if (!strcasecmp(Name, "EPGLinger"))           EPGLinger          = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "SVDRPTimeout"))        SVDRPTimeout       = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "ZapTimeout"))          ZapTimeout         = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "ChannelEntryTimeout")) ChannelEntryTimeout= atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "PrimaryLimit"))        PrimaryLimit       = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "DefaultPriority"))     DefaultPriority    = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "DefaultLifetime"))     DefaultLifetime    = atoi(Value);
 | 
			
		||||
@@ -428,6 +431,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
 | 
			
		||||
  else if (!strcasecmp(Name, "SplitEditedFiles"))    SplitEditedFiles   = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "MinEventTimeout"))     MinEventTimeout    = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "MinUserInactivity"))   MinUserInactivity  = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "NextWakeupTime"))      NextWakeupTime     = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "MultiSpeedMode"))      MultiSpeedMode     = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "ShowReplayMode"))      ShowReplayMode     = atoi(Value);
 | 
			
		||||
  else if (!strcasecmp(Name, "ResumeID"))            ResumeID           = atoi(Value);
 | 
			
		||||
@@ -451,7 +455,7 @@ bool cSetup::Save(void)
 | 
			
		||||
  Store("TimeoutRequChInfo",  TimeoutRequChInfo);
 | 
			
		||||
  Store("MenuScrollPage",     MenuScrollPage);
 | 
			
		||||
  Store("MenuScrollWrap",     MenuScrollWrap);
 | 
			
		||||
  Store("MenuButtonCloses",   MenuButtonCloses);
 | 
			
		||||
  Store("MenuKeyCloses",      MenuKeyCloses);
 | 
			
		||||
  Store("MarkInstantRecord",  MarkInstantRecord);
 | 
			
		||||
  Store("NameInstantRecord",  NameInstantRecord);
 | 
			
		||||
  Store("InstantRecordTime",  InstantRecordTime);
 | 
			
		||||
@@ -471,6 +475,7 @@ bool cSetup::Save(void)
 | 
			
		||||
  Store("EPGLinger",          EPGLinger);
 | 
			
		||||
  Store("SVDRPTimeout",       SVDRPTimeout);
 | 
			
		||||
  Store("ZapTimeout",         ZapTimeout);
 | 
			
		||||
  Store("ChannelEntryTimeout",ChannelEntryTimeout);
 | 
			
		||||
  Store("PrimaryLimit",       PrimaryLimit);
 | 
			
		||||
  Store("DefaultPriority",    DefaultPriority);
 | 
			
		||||
  Store("DefaultLifetime",    DefaultLifetime);
 | 
			
		||||
@@ -496,6 +501,7 @@ bool cSetup::Save(void)
 | 
			
		||||
  Store("SplitEditedFiles",   SplitEditedFiles);
 | 
			
		||||
  Store("MinEventTimeout",    MinEventTimeout);
 | 
			
		||||
  Store("MinUserInactivity",  MinUserInactivity);
 | 
			
		||||
  Store("NextWakeupTime",     NextWakeupTime);
 | 
			
		||||
  Store("MultiSpeedMode",     MultiSpeedMode);
 | 
			
		||||
  Store("ShowReplayMode",     ShowReplayMode);
 | 
			
		||||
  Store("ResumeID",           ResumeID);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								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 1.283 2007/01/07 14:09:31 kls Exp $
 | 
			
		||||
 * $Id: config.h 1.287 2007/02/25 13:58:59 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CONFIG_H
 | 
			
		||||
@@ -21,13 +21,13 @@
 | 
			
		||||
 | 
			
		||||
// VDR's own version number:
 | 
			
		||||
 | 
			
		||||
#define VDRVERSION  "1.5.0"
 | 
			
		||||
#define VDRVERSNUM   10500  // Version * 10000 + Major * 100 + Minor
 | 
			
		||||
#define VDRVERSION  "1.5.1"
 | 
			
		||||
#define VDRVERSNUM   10501  // Version * 10000 + Major * 100 + Minor
 | 
			
		||||
 | 
			
		||||
// The plugin API's version number:
 | 
			
		||||
 | 
			
		||||
#define APIVERSION  "1.5.0"
 | 
			
		||||
#define APIVERSNUM   10500  // Version * 10000 + Major * 100 + Minor
 | 
			
		||||
#define APIVERSION  "1.5.1"
 | 
			
		||||
#define APIVERSNUM   10501  // 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
 | 
			
		||||
@@ -206,7 +206,7 @@ public:
 | 
			
		||||
  int TimeoutRequChInfo;
 | 
			
		||||
  int MenuScrollPage;
 | 
			
		||||
  int MenuScrollWrap;
 | 
			
		||||
  int MenuButtonCloses;
 | 
			
		||||
  int MenuKeyCloses;
 | 
			
		||||
  int MarkInstantRecord;
 | 
			
		||||
  char NameInstantRecord[MaxFileName];
 | 
			
		||||
  int InstantRecordTime;
 | 
			
		||||
@@ -225,6 +225,7 @@ public:
 | 
			
		||||
  int EPGLinger;
 | 
			
		||||
  int SVDRPTimeout;
 | 
			
		||||
  int ZapTimeout;
 | 
			
		||||
  int ChannelEntryTimeout;
 | 
			
		||||
  int PrimaryLimit;
 | 
			
		||||
  int DefaultPriority, DefaultLifetime;
 | 
			
		||||
  int PausePriority, PauseLifetime;
 | 
			
		||||
@@ -244,6 +245,7 @@ public:
 | 
			
		||||
  int MaxVideoFileSize;
 | 
			
		||||
  int SplitEditedFiles;
 | 
			
		||||
  int MinEventTimeout, MinUserInactivity;
 | 
			
		||||
  time_t NextWakeupTime;
 | 
			
		||||
  int MultiSpeedMode;
 | 
			
		||||
  int ShowReplayMode;
 | 
			
		||||
  int ResumeID;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								device.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								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 1.138 2007/01/07 13:41:07 kls Exp $
 | 
			
		||||
 * $Id: device.c 1.139 2007/01/13 12:05:00 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "device.h"
 | 
			
		||||
@@ -334,6 +334,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
 | 
			
		||||
             imp <<= 8; imp |= min(max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF);              // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
 | 
			
		||||
             imp <<= 1; imp |= ndr;                                                                                  // avoid devices if we need to detach existing receivers
 | 
			
		||||
             imp <<= 1; imp |= device[i]->IsPrimaryDevice();                                                         // avoid the primary device
 | 
			
		||||
             imp <<= 1; imp |= NumUsableSlots ? 0 : device[i]->HasCi();                                              // avoid cards with Common Interface for FTA channels
 | 
			
		||||
             imp <<= 1; imp |= device[i]->HasDecoder();                                                              // avoid full featured cards
 | 
			
		||||
             imp <<= 1; imp |= NumUsableSlots ? !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), j + 1) : 0; // prefer CAMs that are known to decrypt this channel
 | 
			
		||||
             if (imp < Impact) {
 | 
			
		||||
@@ -367,6 +368,11 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
 | 
			
		||||
  return d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cDevice::HasCi(void)
 | 
			
		||||
{
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cDevice::SetCamSlot(cCamSlot *CamSlot)
 | 
			
		||||
{
 | 
			
		||||
  camSlot = CamSlot;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								device.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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 1.80 2007/01/03 14:14:29 kls Exp $
 | 
			
		||||
 * $Id: device.h 1.81 2007/01/13 11:33:57 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __DEVICE_H
 | 
			
		||||
@@ -314,6 +314,8 @@ private:
 | 
			
		||||
  time_t startScrambleDetection;
 | 
			
		||||
  cCamSlot *camSlot;
 | 
			
		||||
public:
 | 
			
		||||
  virtual bool HasCi(void);
 | 
			
		||||
         ///< Returns true if this device has a Common Interface.
 | 
			
		||||
  void SetCamSlot(cCamSlot *CamSlot);
 | 
			
		||||
         ///< Sets the given CamSlot to be used with this device.
 | 
			
		||||
  cCamSlot *CamSlot(void) const { return camSlot; }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								dvbdevice.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								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 1.161 2007/01/05 11:09:51 kls Exp $
 | 
			
		||||
 * $Id: dvbdevice.c 1.164 2007/02/25 11:46:52 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "dvbdevice.h"
 | 
			
		||||
@@ -155,15 +155,12 @@ bool cDvbTuner::GetFrontendStatus(fe_status_t &Status, int TimeoutMs)
 | 
			
		||||
              ; // just to clear the event queue - we'll read the actual status below
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  do {
 | 
			
		||||
     int stat = ioctl(fd_frontend, FE_READ_STATUS, &Status);
 | 
			
		||||
     if (stat == 0)
 | 
			
		||||
        return true;
 | 
			
		||||
     if (stat < 0) {
 | 
			
		||||
        if (errno == EINTR)
 | 
			
		||||
           continue;
 | 
			
		||||
  while (1) {
 | 
			
		||||
        if (ioctl(fd_frontend, FE_READ_STATUS, &Status) != -1)
 | 
			
		||||
           return true;
 | 
			
		||||
        if (errno != EINTR)
 | 
			
		||||
           break;
 | 
			
		||||
        }
 | 
			
		||||
     } while (0);
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -509,6 +506,11 @@ cSpuDecoder *cDvbDevice::GetSpuDecoder(void)
 | 
			
		||||
  return spuDecoder;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cDvbDevice::HasCi(void)
 | 
			
		||||
{
 | 
			
		||||
  return ciAdapter;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uchar *cDvbDevice::GrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY)
 | 
			
		||||
{
 | 
			
		||||
  if (devVideoIndex < 0)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbdevice.h 1.42 2007/01/05 10:39:52 kls Exp $
 | 
			
		||||
 * $Id: dvbdevice.h 1.44 2007/02/25 12:23:57 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __DVBDEVICE_H
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
#error VDR requires Linux DVB driver API version 3!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define MAXDVBDEVICES  4
 | 
			
		||||
#define MAXDVBDEVICES  8
 | 
			
		||||
 | 
			
		||||
class cDvbTuner;
 | 
			
		||||
 | 
			
		||||
@@ -84,6 +84,11 @@ protected:
 | 
			
		||||
protected:
 | 
			
		||||
  virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
 | 
			
		||||
 | 
			
		||||
// Common Interface facilities:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  virtual bool HasCi(void);
 | 
			
		||||
 | 
			
		||||
// Image Grab facilities
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								dvbspu.c
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								dvbspu.c
									
									
									
									
									
								
							@@ -8,7 +8,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * parts of this file are derived from the OMS program.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: dvbspu.c 1.21 2006/04/17 12:45:05 kls Exp $
 | 
			
		||||
 * $Id: dvbspu.c 1.22 2007/02/03 10:13:18 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "dvbspu.h"
 | 
			
		||||
@@ -504,9 +504,8 @@ int cDvbSpuDecoder::setTime(uint32_t pts)
 | 
			
		||||
                default:
 | 
			
		||||
                    esyslog("invalid sequence in control header (%.2x)",
 | 
			
		||||
                            spu[i]);
 | 
			
		||||
                    assert(0);
 | 
			
		||||
                    i++;
 | 
			
		||||
                    break;
 | 
			
		||||
                    Empty();
 | 
			
		||||
                    return 0;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (fodd != 0 && feven != 0) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										240
									
								
								i18n.c
									
									
									
									
									
								
							
							
						
						
									
										240
									
								
								i18n.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: i18n.c 1.286 2007/01/07 12:19:15 kls Exp $
 | 
			
		||||
 * $Id: i18n.c 1.291 2007/02/25 13:59:28 kls Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Translations provided by:
 | 
			
		||||
 *
 | 
			
		||||
@@ -119,7 +119,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "iso8859-7",
 | 
			
		||||
    "iso8859-1",
 | 
			
		||||
    "iso8859-2",
 | 
			
		||||
    "iso8859-1",
 | 
			
		||||
    "iso8859-2",
 | 
			
		||||
    "iso8859-1",
 | 
			
		||||
    "iso8859-5",
 | 
			
		||||
    "iso8859-2",
 | 
			
		||||
@@ -231,7 +231,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Timers",
 | 
			
		||||
    "Timer-e",
 | 
			
		||||
    "Id<EFBFBD>z<EFBFBD>t<EFBFBD>",
 | 
			
		||||
    "Id<EFBFBD>z<EFBFBD>t<EFBFBD>",
 | 
			
		||||
    "Temporitzadors",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Termini",
 | 
			
		||||
@@ -385,7 +385,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "<EFBFBD>ndra timer",
 | 
			
		||||
    "Modificare timer",
 | 
			
		||||
    "Id<EFBFBD>z<EFBFBD>t<EFBFBD> megv<67>ltoztat<61>sa",
 | 
			
		||||
    "Id<EFBFBD>z<EFBFBD>t<EFBFBD> megv<67>ltoztat<61>sa",
 | 
			
		||||
    "Editar temporitzador",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Ure<EFBFBD>ivanje termina",
 | 
			
		||||
@@ -694,7 +694,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "Timer",
 | 
			
		||||
    "Timer",
 | 
			
		||||
    "Id<EFBFBD>z<EFBFBD>t<EFBFBD>",
 | 
			
		||||
    "Id<EFBFBD>z<EFBFBD>t<EFBFBD>",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
@@ -936,7 +936,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "N<EFBFBD>sta",
 | 
			
		||||
    "Urm<EFBFBD>tor",
 | 
			
		||||
    "K<EFBFBD>vetkez<EFBFBD>",
 | 
			
		||||
    "K<EFBFBD>vetkez<EFBFBD>",
 | 
			
		||||
    "Seg<EFBFBD>ent",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Slijedi",
 | 
			
		||||
@@ -1157,7 +1157,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;?",
 | 
			
		||||
    "Ta bort timern?",
 | 
			
		||||
    "<EFBFBD>terg timer-ul?",
 | 
			
		||||
    "Id<EFBFBD>z<EFBFBD>t<EFBFBD> t<>rl<72>se?",
 | 
			
		||||
    "Id<EFBFBD>z<EFBFBD>t<EFBFBD> t<>rl<72>se?",
 | 
			
		||||
    "Esborrar el temporitzador?",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?",
 | 
			
		||||
    "Obrisati termin?",
 | 
			
		||||
@@ -1341,6 +1341,28 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "Optagelse igang - genstart alligevel?",
 | 
			
		||||
    "Syst<EFBFBD>m je zanepr<70>zdn<64>n - p<>esto restartovat?",
 | 
			
		||||
  },
 | 
			
		||||
  { "Editing - restart anyway?",
 | 
			
		||||
    "Schnitt l<>uft - trotzdem neu starten?",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
  },
 | 
			
		||||
  { "Recording - shut down anyway?",
 | 
			
		||||
    "Aufnahme l<>uft - trotzdem ausschalten?",
 | 
			
		||||
    "Snemanje - zares izklopi?",
 | 
			
		||||
@@ -1377,7 +1399,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> %ld <20><><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?",
 | 
			
		||||
    "Inspelning startar om %ld minuter, vill du avsluta?",
 | 
			
		||||
    "<EFBFBD>nregistrez peste %ld minute - <20>nchid, totu<74>i?",
 | 
			
		||||
    "Felv<EFBFBD>tel %ld perc mulva kezd<7A>dik - m<>gis kikapcsolni?",
 | 
			
		||||
    "Felv<EFBFBD>tel %ld perc mulva kezd<7A>dik - m<>gis kikapcsolni?",
 | 
			
		||||
    "Hi ha una gravaci<63> en %ld minuts - Apagar de totes maneres?",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %ld <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?",
 | 
			
		||||
    "Snimanje za %ld minuta - svejedno isklju<6A>iti?",
 | 
			
		||||
@@ -1407,6 +1429,116 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "Tryk vilk<6C>rlig tast for at annullere sluk",
 | 
			
		||||
    "Jak<EFBFBD>koliv kl<6B>vesa zru<72><75> vypnut<75>",
 | 
			
		||||
  },
 | 
			
		||||
  { "Press any key to cancel restart",
 | 
			
		||||
    "Taste dr<64>cken, um Neustart abzubrechen",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
  },
 | 
			
		||||
  { "VDR will shut down later - press Power to force",
 | 
			
		||||
    "VDR schaltet sp<73>ter aus - Power zum erzwingen",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "VDR sammuu my<6D>hemmin - pakota virtakytkimell<6C>",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
  },
 | 
			
		||||
  { "VDR will shut down in %s minutes",
 | 
			
		||||
    "VDR wird in %s Minuten ausschalten",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "VDR sammuu %s minuutin kuluttua",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
  },
 | 
			
		||||
  { "Editing - shut down anyway?",
 | 
			
		||||
    "Schnitt l<>uft - trotzdem ausschalten?",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "Leikkaus kesken - sammutetaanko?",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
  },
 | 
			
		||||
  { "Plugin %s wakes up in %ld min, continue?",
 | 
			
		||||
    "Plugin %s wacht in %ld Min auf, weiter?",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "Laajennos %s her<65><72> %ld minuutin kuluttua - sammutetaanko?",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
  },
 | 
			
		||||
  // Channel parameters:
 | 
			
		||||
  { "Name",
 | 
			
		||||
    "Name",
 | 
			
		||||
@@ -2149,7 +2281,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
 | 
			
		||||
    "F<EFBFBD>rsta dag",
 | 
			
		||||
    "Prima zi",
 | 
			
		||||
    "Els<EFBFBD> nap",
 | 
			
		||||
    "Els<EFBFBD> nap",
 | 
			
		||||
    "Primer dia",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Prvi dan",
 | 
			
		||||
@@ -2172,7 +2304,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!",
 | 
			
		||||
    "Kanalen anv<6E>nds av en timer!",
 | 
			
		||||
    "Canalul este utilizat de un timer!",
 | 
			
		||||
    "Az ad<61>t az id<69>z<EFBFBD>t<EFBFBD> haszn<7A>lja!",
 | 
			
		||||
    "Az ad<61>t az id<69>z<EFBFBD>t<EFBFBD> haszn<7A>lja!",
 | 
			
		||||
    "Canal en <20>s per un temporitzador!",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!",
 | 
			
		||||
    "Program je trenutno zauzet terminom za snimanje",
 | 
			
		||||
@@ -2304,7 +2436,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "strax VPS inspelning...",
 | 
			
		||||
    "Urmeaz<EFBFBD> o <20>nregistrare VPS!",
 | 
			
		||||
    "VPS-felv<6C>tel r<>gt<67>n kezd<7A>dik!",
 | 
			
		||||
    "VPS-felv<6C>tel r<>gt<67>n kezd<7A>dik!",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "VPS-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
@@ -2348,7 +2480,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!",
 | 
			
		||||
    "Kanalen <20>r inte tillg<6C>nglig!",
 | 
			
		||||
    "Canal indisponibil",
 | 
			
		||||
    "Az ad<61> nem el<65>rhet<65>",
 | 
			
		||||
    "Az ad<61> nem el<65>rhet<65>",
 | 
			
		||||
    "Canal no disponible!",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!",
 | 
			
		||||
    "Program nije dostupan!",
 | 
			
		||||
@@ -2370,7 +2502,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!",
 | 
			
		||||
    "Kanalinst<EFBFBD>llningarna <20>r ej unika!",
 | 
			
		||||
    "Parametrii canalului nu sunt univoci!",
 | 
			
		||||
    "Az ad<61>be<62>ll<6C>t<EFBFBD>sok nem egy<67>rtelm<6C>ek",
 | 
			
		||||
    "Az ad<61>be<62>ll<6C>t<EFBFBD>sok nem egy<67>rtelm<6C>ek",
 | 
			
		||||
    "Propietats del canal duplicades!",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!",
 | 
			
		||||
    "Parametri programa nisu jednozna<6E>ni!",
 | 
			
		||||
@@ -2524,7 +2656,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "Otillr<EFBFBD>cklingt diskutrymme f<>r inspelning!",
 | 
			
		||||
    "Insuficient spa<70>iul pe disc pentru <20>nregistrare!",
 | 
			
		||||
    "Nincs elegend<6E> hely a felv<6C>telre",
 | 
			
		||||
    "Nincs elegend<6E> hely a felv<6C>telre",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
@@ -3186,7 +3318,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>)",
 | 
			
		||||
    "Tid f<>r meddelanden (sek)",
 | 
			
		||||
    "Timp afi<66>are mesaje (sec)",
 | 
			
		||||
    "Inform<EFBFBD>ci<EFBFBD> felt<6C>ntet<65>s<EFBFBD>nek id<69>tartama",
 | 
			
		||||
    "Inform<EFBFBD>ci<EFBFBD> felt<6C>ntet<65>s<EFBFBD>nek id<69>tartama",
 | 
			
		||||
    "Durada dels missatges (s)",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>)",
 | 
			
		||||
    "Vrijeme prikaza poruka (s)",
 | 
			
		||||
@@ -3208,7 +3340,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Anv<EFBFBD>nd liten font",
 | 
			
		||||
    "Utilizare fonturi mici",
 | 
			
		||||
    "Kisbet<EFBFBD>t haszn<7A>lni",
 | 
			
		||||
    "Kisbet<EFBFBD>t haszn<7A>lni",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Koristi mala slova",
 | 
			
		||||
@@ -3252,7 +3384,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "skin beroende",
 | 
			
		||||
    "dep. de skin",
 | 
			
		||||
    "Men<EFBFBD> n<>zet<65>t<EFBFBD>l f<>gg<67>en",
 | 
			
		||||
    "Men<EFBFBD> n<>zet<65>t<EFBFBD>l f<>gg<67>en",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
 | 
			
		||||
    "ovisno o povr<76>ini",
 | 
			
		||||
@@ -3318,7 +3450,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (<28>)",
 | 
			
		||||
    "Kanal information (s)",
 | 
			
		||||
    "Durata afi<66><69>rii info-canal (s)",
 | 
			
		||||
    "Ad<EFBFBD>sinform<EFBFBD>ci<EFBFBD> felt<6C>ntet<65>s<EFBFBD>nek id<69>tartama (s)",
 | 
			
		||||
    "Ad<EFBFBD>sinform<EFBFBD>ci<EFBFBD> felt<6C>ntet<65>s<EFBFBD>nek id<69>tartama (s)",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>)",
 | 
			
		||||
    "Vrijeme prikaza informacije o programu (s)",
 | 
			
		||||
@@ -3414,7 +3546,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "Scroll rundt",
 | 
			
		||||
    "Z konce na za<7A><61>tek",
 | 
			
		||||
  },
 | 
			
		||||
  { "Setup.OSD$Menu button closes",
 | 
			
		||||
  { "Setup.OSD$Menu key closes",
 | 
			
		||||
    "Menu-Taste schlie<69>t",
 | 
			
		||||
    "Meni gumb zapre meni",
 | 
			
		||||
    "Usare il bottone Menu per chiudere",
 | 
			
		||||
@@ -3472,7 +3604,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EPG <20><> <20><><EFBFBD><EFBFBD>",
 | 
			
		||||
    "EPG s<>kning timeout",
 | 
			
		||||
    "Interval achizi<7A>ie EPG (h)",
 | 
			
		||||
    "Fennmaradt id<69> az EPG-<2D>j<EFBFBD>t<EFBFBD>sig (h)",
 | 
			
		||||
    "Fennmaradt id<69> az EPG-<2D>j<EFBFBD>t<EFBFBD>sig (h)",
 | 
			
		||||
    "M<EFBFBD>xim d'Hores a cercar per la Guia",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>)",
 | 
			
		||||
    "Vrijeme do EPG pregleda (h)",
 | 
			
		||||
@@ -3538,7 +3670,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "St<EFBFBD>ll in systemtid",
 | 
			
		||||
    "Potrive<EFBFBD>te ceasul sistem",
 | 
			
		||||
    "Az id<69> be<62>ll<6C>t<EFBFBD>sa",
 | 
			
		||||
    "Az id<69> be<62>ll<6C>t<EFBFBD>sa",
 | 
			
		||||
    "Ajustar l'hora del sistema",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Podesi vrijeme sistema",
 | 
			
		||||
@@ -3560,7 +3692,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Anv<EFBFBD>nd klockan fr<66>n transponder",
 | 
			
		||||
    "Preia ora din transponder",
 | 
			
		||||
    "Id<EFBFBD>h<EFBFBD>z tartoz<6F> Transponder",
 | 
			
		||||
    "Id<EFBFBD>h<EFBFBD>z tartoz<6F> Transponder",
 | 
			
		||||
    "Usar el temps del m<>ltiplex",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Transponder za pode<64>avanje sata",
 | 
			
		||||
@@ -3626,7 +3758,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DVB <20><><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Prim<EFBFBD>r DVB enhet",
 | 
			
		||||
    "Dispozitiv DVB primar",
 | 
			
		||||
    "Els<EFBFBD> DVB interface",
 | 
			
		||||
    "Els<EFBFBD> DVB interface",
 | 
			
		||||
    "Tarja DVB prim<69>ria",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DVB-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Primarni DVB ure<72>aj",
 | 
			
		||||
@@ -4000,7 +4132,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD> LNB-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (MHz)",
 | 
			
		||||
    "<EFBFBD>vre LNB frekvens (MHz)",
 | 
			
		||||
    "Frecvn<EFBFBD><EFBFBD> LNB superioar<61> (MHz)",
 | 
			
		||||
    "Fels<EFBFBD> LNB-frekvencia (MHZ)",
 | 
			
		||||
    "Fels<EFBFBD> LNB-frekvencia (MHZ)",
 | 
			
		||||
    "Freq<EFBFBD><EFBFBD>ncia LNB alta (MHz)",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>)",
 | 
			
		||||
    "Gornja LNB frekv. (MHz)",
 | 
			
		||||
@@ -4044,7 +4176,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>)",
 | 
			
		||||
    "Marginal f<>r start (min)",
 | 
			
		||||
    "Marj<EFBFBD> la pornire (min)",
 | 
			
		||||
    "Id<EFBFBD>eltol<EFBFBD>d<EFBFBD>s a kezd<7A>sn<73>l (perc)",
 | 
			
		||||
    "Id<EFBFBD>eltol<EFBFBD>d<EFBFBD>s a kezd<7A>sn<73>l (perc)",
 | 
			
		||||
    "Marge d'inici de gravaci<63> (min)",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>)",
 | 
			
		||||
    "Rezerva na po<70>etku snimanja (min)",
 | 
			
		||||
@@ -4066,7 +4198,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>)",
 | 
			
		||||
    "Marginal f<>r stopp (min)",
 | 
			
		||||
    "Marj<EFBFBD> la oprire (min)",
 | 
			
		||||
    "Id<EFBFBD>eltol<EFBFBD>d<EFBFBD>s a befejez<65>sn<73>l (perc)",
 | 
			
		||||
    "Id<EFBFBD>eltol<EFBFBD>d<EFBFBD>s a befejez<65>sn<73>l (perc)",
 | 
			
		||||
    "Marge de fi de gravaci<63> (min)",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>)",
 | 
			
		||||
    "Rezerva na kraju (min)",
 | 
			
		||||
@@ -4242,7 +4374,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VPS (<28>)",
 | 
			
		||||
    "VPS marginal (s)",
 | 
			
		||||
    "Marj<EFBFBD> de timp la utilizare VPS (s)",
 | 
			
		||||
    "Id<EFBFBD>eltol<EFBFBD>d<EFBFBD>s VPS-n<>l (s)",
 | 
			
		||||
    "Id<EFBFBD>eltol<EFBFBD>d<EFBFBD>s VPS-n<>l (s)",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> VPS (<28><><EFBFBD>)",
 | 
			
		||||
    "Vremenska rezerva kod VPS (s)",
 | 
			
		||||
@@ -4308,7 +4440,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>)",
 | 
			
		||||
    "Direktinspelning l<>ngd (min)",
 | 
			
		||||
    "Timpul de <20>nregistare imediat<61> (min)",
 | 
			
		||||
    "Felv<EFBFBD>tel id<69>tartama (perc)",
 | 
			
		||||
    "Felv<EFBFBD>tel id<69>tartama (perc)",
 | 
			
		||||
    "Temps de gravaci<63> instant<6E>nia (min)",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>)",
 | 
			
		||||
    "Trajanje direktnog snimanja (min)",
 | 
			
		||||
@@ -4440,7 +4572,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>)",
 | 
			
		||||
    "Minsta h<>ndelse-pause (min)",
 | 
			
		||||
    "Durat<EFBFBD> minim<69> emisiuni (min)",
 | 
			
		||||
    "Id<EFBFBD>zit<EFBFBD>sek k<>z<EFBFBD>tti id<69>tartam (perc)",
 | 
			
		||||
    "Id<EFBFBD>zit<EFBFBD>sek k<>z<EFBFBD>tti id<69>tartam (perc)",
 | 
			
		||||
    "Temps m<>nim en pausa (min)",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>)",
 | 
			
		||||
    "Minimalno vrijeme pauze",
 | 
			
		||||
@@ -4514,6 +4646,28 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "Zap timeout (s)",
 | 
			
		||||
    "<EFBFBD>asov<EFBFBD> limit Zap (s)",
 | 
			
		||||
  },
 | 
			
		||||
  { "Setup.Miscellaneous$Channel entry timeout (ms)",
 | 
			
		||||
    "Zeitlimit f<>r Kanaleingabe (ms)",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "",// TODO
 | 
			
		||||
  },
 | 
			
		||||
  { "Setup.Miscellaneous$Initial channel",
 | 
			
		||||
    "Kanal beim Einschalten",
 | 
			
		||||
    "Privzeti kanal",
 | 
			
		||||
@@ -4550,7 +4704,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "Ljudstyrka vid uppstart",
 | 
			
		||||
    "Volumul la pornire",
 | 
			
		||||
    "Hanger<EFBFBD> a bekapcsol<6F>sn<73>l",
 | 
			
		||||
    "Hanger<EFBFBD> a bekapcsol<6F>sn<73>l",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
@@ -4572,7 +4726,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "som f<>rut",
 | 
			
		||||
    "ca mai <20>nainte",
 | 
			
		||||
    "ahogy az el<65>bb",
 | 
			
		||||
    "ahogy az el<65>bb",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
@@ -4640,7 +4794,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    " <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0123456789-.#~,/_@abcdefghijklmnopqrstuvwxyz",
 | 
			
		||||
    " abcdefghijklmnopqrstuvwxyz<79><7A><EFBFBD>0123456789-.#~,/_@",
 | 
			
		||||
    " a<><61>bcdefghi<68>jklmnopqrs<72>t<EFBFBD>uvwxyz0123456789-.#~,/_@",
 | 
			
		||||
    " a<>bcde<64>fghi<68>jklmno<6E><6F><EFBFBD>pqrstu<74><75><EFBFBD>vwxyz0123456789-.,#~,/_@",
 | 
			
		||||
    " a<>bcde<64>fghi<68>jklmno<6E><6F><EFBFBD>pqrstu<74><75><EFBFBD>vwxyz0123456789-.,#~,/_@",
 | 
			
		||||
    " a<>bc<62>de<64><65>fghi<68>jklmno<6E>pqrstu<74>vwxyz0123456789-.,#~,/_@<40>",
 | 
			
		||||
    " abcdefghijklmnopqrstuvwxyz<79><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0123456789-.#~,/_@",
 | 
			
		||||
    " abc<62><63>d<EFBFBD>efghijklmnopqrs<72>tuvwxyz<79>0123456789-.#~,/_@", // hrv
 | 
			
		||||
@@ -4663,7 +4817,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    " 0\t-.#~,/_@1\tabc<EFBFBD><EFBFBD>2\tdef3\tghi4\tjkl5\tmno<EFBFBD>6\tpqrs7\ttuv8\twxyz",
 | 
			
		||||
    " 0\t-.#~,/_@1\ta<EFBFBD><EFBFBD>bc2\tdef3\tghi<EFBFBD>4\tjkl5\tmno6\tpqrs<EFBFBD>7\tt<EFBFBD>uv8\twxyz9",
 | 
			
		||||
    " 0\t-.#~,/_@1\ta<EFBFBD>bc2\tde<EFBFBD>3\tghi<EFBFBD>4\tjkl5\tmno<EFBFBD><EFBFBD><EFBFBD>6\tpqrs7\ttu<EFBFBD><EFBFBD><EFBFBD>v8\twxyz9",
 | 
			
		||||
    " 0\t-.#~,/_@1\ta<EFBFBD>bc2\tde<EFBFBD>f3\tghi<EFBFBD>4\tjkl5\tmno<EFBFBD><EFBFBD><EFBFBD>6\tpqrs7\ttu<EFBFBD><EFBFBD><EFBFBD>v8\twxyz9",
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
    "",//TODO
 | 
			
		||||
@@ -4708,7 +4862,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RC",
 | 
			
		||||
    "Steg1: identifiering av kod",
 | 
			
		||||
    "Faza 1: Detec<65>ia tipului telecomenzii",
 | 
			
		||||
    "Els<EFBFBD> l<>p<EFBFBD>s: t<>vir<69>ny<6E>t<EFBFBD> k<>dj<64>nak meghat<61>roz<6F>sa",
 | 
			
		||||
    "Els<EFBFBD> l<>p<EFBFBD>s: t<>vir<69>ny<6E>t<EFBFBD> k<>dj<64>nak meghat<61>roz<6F>sa",
 | 
			
		||||
    "Fase 1: Detectant el tipus de receptor",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD> 1: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Faza 1: detektiranje k<>da daljinskog upravlja<6A>a.",
 | 
			
		||||
@@ -5347,7 +5501,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Snabbspolning fram<61>t",
 | 
			
		||||
    "Derulare <20>nainte",
 | 
			
		||||
    "El<EFBFBD>re p<>rgetni",
 | 
			
		||||
    "El<EFBFBD>re p<>rgetni",
 | 
			
		||||
    "Endavant r<>pidament",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Naprijed",
 | 
			
		||||
@@ -5391,7 +5545,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "N<EFBFBD>sta",
 | 
			
		||||
    "Urm<EFBFBD>tor",
 | 
			
		||||
    "El<EFBFBD>re",
 | 
			
		||||
    "El<EFBFBD>re",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
@@ -5429,7 +5583,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "Ligar",
 | 
			
		||||
    "Arr<EFBFBD>t",
 | 
			
		||||
    "Power",
 | 
			
		||||
    "Virtakytkin",
 | 
			
		||||
    "Virta",
 | 
			
		||||
    "Wy<EFBFBD><EFBFBD>cz",
 | 
			
		||||
    "Apagar",
 | 
			
		||||
    "K<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
@@ -5501,7 +5655,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "F<EFBFBD>rra kanalen",
 | 
			
		||||
    "Canal anterior",
 | 
			
		||||
    "Az el<65>z<EFBFBD> ad<61>s",
 | 
			
		||||
    "Az el<65>z<EFBFBD> ad<61>s",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "",// TODO
 | 
			
		||||
@@ -5523,7 +5677,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+",
 | 
			
		||||
    "Volym+",
 | 
			
		||||
    "Volum+",
 | 
			
		||||
    "Hanger<EFBFBD>+",
 | 
			
		||||
    "Hanger<EFBFBD>+",
 | 
			
		||||
    "Volum +",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +",
 | 
			
		||||
    "Glasnije", // hrv "Glasnocca +"
 | 
			
		||||
@@ -5545,7 +5699,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-",
 | 
			
		||||
    "Volym-",
 | 
			
		||||
    "Volum-",
 | 
			
		||||
    "Hanger<EFBFBD>-",
 | 
			
		||||
    "Hanger<EFBFBD>-",
 | 
			
		||||
    "Volum -",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -",
 | 
			
		||||
    "Ti<EFBFBD>e", // hrv Glasnocca -"
 | 
			
		||||
@@ -5561,7 +5715,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "Sem som",
 | 
			
		||||
    "Coupure du son",
 | 
			
		||||
    "Lyd av",
 | 
			
		||||
    "<EFBFBD><EFBFBD>net<EFBFBD>n",
 | 
			
		||||
    "Mykistys",
 | 
			
		||||
    "Wycisz",
 | 
			
		||||
    "Mudo",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
@@ -5832,7 +5986,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ",
 | 
			
		||||
    "Volym ",
 | 
			
		||||
    "Volum ",
 | 
			
		||||
    "Hanger<EFBFBD>",
 | 
			
		||||
    "Hanger<EFBFBD>",
 | 
			
		||||
    "Volum ",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ",
 | 
			
		||||
    "Glasno<EFBFBD>a ",
 | 
			
		||||
@@ -6052,7 +6206,7 @@ const tI18nPhrase Phrases[] = {
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
 | 
			
		||||
    "Pausar direktinspelningen",
 | 
			
		||||
    "Trec <20>n pauz<75> emisiunea transmis<69>...",
 | 
			
		||||
    "Az <20>l<EFBFBD> ad<61>s meg<65>ll<6C>tva...",
 | 
			
		||||
    "Az <20>l<EFBFBD> ad<61>s meg<65>ll<6C>tva...",
 | 
			
		||||
    "Pausa d'emissi<73> en directe...",
 | 
			
		||||
    "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...",
 | 
			
		||||
    "Zaustavljanje <20>ivog signala...",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								keys.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								keys.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: keys.h 1.10 2006/10/14 10:41:20 kls Exp $
 | 
			
		||||
 * $Id: keys.h 1.11 2007/02/25 10:49:35 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __KEYS_H
 | 
			
		||||
@@ -74,6 +74,7 @@ enum eKeys { // "Up" and "Down" must be the first two keys!
 | 
			
		||||
#define ISRAWKEY(k)      ((k) != kNone && ((k) & k_Flags) == 0)
 | 
			
		||||
#define NORMALKEY(k)     (eKeys((k) & ~k_Repeat))
 | 
			
		||||
#define ISMODELESSKEY(k) (RAWKEY(k) > k9)
 | 
			
		||||
#define ISREALKEY(k)     (k != kNone && k != k_Plugin)
 | 
			
		||||
 | 
			
		||||
#define BASICKEY(k)      (eKeys((k) & 0xFFFF))
 | 
			
		||||
#define KBDKEY(k)        (eKeys(((k) << 16) | kKbd))
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
 *   the Free Software Foundation; either version 2 of the License, or     *
 | 
			
		||||
 *   (at your option) any later version.                                   *
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 *   $Id: descriptor.c 1.21 2006/05/28 14:25:30 kls Exp $
 | 
			
		||||
 *   $Id: descriptor.c 1.22 2007/02/03 11:45:58 kls Exp $
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
 | 
			
		||||
@@ -418,8 +418,16 @@ int SatelliteDeliverySystemDescriptor::getPolarization() const {
 | 
			
		||||
   return s->polarization;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SatelliteDeliverySystemDescriptor::getModulation() const {
 | 
			
		||||
   return s->modulation;
 | 
			
		||||
int SatelliteDeliverySystemDescriptor::getModulationSystem() const {
 | 
			
		||||
   return s->modulation_system;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SatelliteDeliverySystemDescriptor::getModulationType() const {
 | 
			
		||||
   return s->modulation_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SatelliteDeliverySystemDescriptor::getRollOff() const {
 | 
			
		||||
   return s->roll_off;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SatelliteDeliverySystemDescriptor::getSymbolRate() const {
 | 
			
		||||
@@ -462,6 +470,18 @@ int TerrestrialDeliverySystemDescriptor::getFrequency() const {
 | 
			
		||||
   return (HILO(s->frequency_hi) << 16) | HILO(s->frequency_lo);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TerrestrialDeliverySystemDescriptor::getPriority() const {
 | 
			
		||||
   return s->priority;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TerrestrialDeliverySystemDescriptor::getTimeSlicingIndicator() const {
 | 
			
		||||
   return s->time_slicing_indicator;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TerrestrialDeliverySystemDescriptor::getMpeFecIndicator() const {
 | 
			
		||||
   return s->mpe_fec_indicator;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TerrestrialDeliverySystemDescriptor::getBandwidth() const {
 | 
			
		||||
   return s->bandwidth;
 | 
			
		||||
}
 | 
			
		||||
@@ -794,6 +814,41 @@ int AncillaryDataDescriptor::getAncillaryDataIdentifier() const {
 | 
			
		||||
   return s->ancillary_data_identifier;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void S2SatelliteDeliverySystemDescriptor::Parse() {
 | 
			
		||||
   int offset=0;
 | 
			
		||||
   input_stream_identifier=0;
 | 
			
		||||
   data.setPointerAndOffset<const descr_s2_satellite_delivery_system>(s, offset);
 | 
			
		||||
   if (s->scrambling_sequence_selector)
 | 
			
		||||
      data.setPointerAndOffset<const descr_scrambling_sequence_selector>(sss, offset);
 | 
			
		||||
   if (s->multiple_input_stream_flag)
 | 
			
		||||
      input_stream_identifier = *data.getData(offset++);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int S2SatelliteDeliverySystemDescriptor::getScramblingSequenceSelector() const {
 | 
			
		||||
   return s->scrambling_sequence_selector;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int S2SatelliteDeliverySystemDescriptor::getMultipleInputStreamFlag() const {
 | 
			
		||||
   return s->multiple_input_stream_flag;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int S2SatelliteDeliverySystemDescriptor::getBackwardsCompatibilityIndicator() const {
 | 
			
		||||
   return s->backwards_compatibility_indicator;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int S2SatelliteDeliverySystemDescriptor::getScramblingSequenceIndex() const {
 | 
			
		||||
   return sss == NULL ? 0 : (sss->scrambling_sequence_index_hi_lo << 16) | HILO(sss->scrambling_sequence_index_lo);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ExtensionDescriptor::Parse() {
 | 
			
		||||
   int offset=0;
 | 
			
		||||
   data.setPointerAndOffset<const descr_extension>(s, offset);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ExtensionDescriptor::getExtensionDescriptorTag() const {
 | 
			
		||||
   return s->descriptor_tag_extension;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int PremiereContentTransmissionDescriptor::getOriginalNetworkId() const {
 | 
			
		||||
   return HILO(s->original_network_id);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
 *   the Free Software Foundation; either version 2 of the License, or     *
 | 
			
		||||
 *   (at your option) any later version.                                   *
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 *   $Id: descriptor.h 1.15 2006/05/28 14:25:30 kls Exp $
 | 
			
		||||
 *   $Id: descriptor.h 1.16 2007/02/03 11:45:58 kls Exp $
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
 | 
			
		||||
@@ -210,7 +210,9 @@ public:
 | 
			
		||||
   int getOrbitalPosition() const;
 | 
			
		||||
   int getWestEastFlag() const;
 | 
			
		||||
   int getPolarization() const;
 | 
			
		||||
   int getModulation() const;
 | 
			
		||||
   int getModulationSystem() const;
 | 
			
		||||
   int getModulationType() const;
 | 
			
		||||
   int getRollOff() const;
 | 
			
		||||
   int getSymbolRate() const;
 | 
			
		||||
   int getFecInner() const;
 | 
			
		||||
protected:
 | 
			
		||||
@@ -236,6 +238,9 @@ class TerrestrialDeliverySystemDescriptor : public Descriptor {
 | 
			
		||||
public:
 | 
			
		||||
   int getFrequency() const;
 | 
			
		||||
   int getBandwidth() const;
 | 
			
		||||
   int getPriority() const;
 | 
			
		||||
   int getTimeSlicingIndicator() const;
 | 
			
		||||
   int getMpeFecIndicator() const;
 | 
			
		||||
   int getConstellation() const;
 | 
			
		||||
   int getHierarchy() const;
 | 
			
		||||
   int getCodeRateHP() const;
 | 
			
		||||
@@ -484,6 +489,30 @@ private:
 | 
			
		||||
   const descr_ancillary_data *s;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class S2SatelliteDeliverySystemDescriptor : public Descriptor {
 | 
			
		||||
public:
 | 
			
		||||
   int getScramblingSequenceSelector() const;
 | 
			
		||||
   int getMultipleInputStreamFlag() const;
 | 
			
		||||
   int getBackwardsCompatibilityIndicator() const;
 | 
			
		||||
   int getScramblingSequenceIndex() const;
 | 
			
		||||
   int getInputStreamIdentifier() const { return input_stream_identifier; }
 | 
			
		||||
protected:
 | 
			
		||||
   virtual void Parse();
 | 
			
		||||
private:
 | 
			
		||||
   const descr_s2_satellite_delivery_system *s;
 | 
			
		||||
   const descr_scrambling_sequence_selector *sss;
 | 
			
		||||
   int input_stream_identifier;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ExtensionDescriptor : public Descriptor {
 | 
			
		||||
public:
 | 
			
		||||
   int getExtensionDescriptorTag() const;
 | 
			
		||||
protected:
 | 
			
		||||
   virtual void Parse();
 | 
			
		||||
private:
 | 
			
		||||
   const descr_extension *s;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Private DVB Descriptor  Premiere.de
 | 
			
		||||
// 0xF2  Content Transmission Descriptor
 | 
			
		||||
// http://dvbsnoop.sourceforge.net/examples/example-private-section.html
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										209
									
								
								libsi/headers.h
									
									
									
									
									
								
							
							
						
						
									
										209
									
								
								libsi/headers.h
									
									
									
									
									
								
							@@ -10,7 +10,7 @@
 | 
			
		||||
 *   the Free Software Foundation; either version 2 of the License, or     *
 | 
			
		||||
 *   (at your option) any later version.                                   *
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 *   $Id: headers.h 1.8 2006/09/02 20:25:16 kls Exp $
 | 
			
		||||
 *   $Id: headers.h 1.9 2007/02/03 11:45:58 kls Exp $
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
 | 
			
		||||
@@ -942,9 +942,13 @@ struct descr_satellite_delivery_system {
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char west_east_flag                         :1;
 | 
			
		||||
   u_char polarization                           :2;
 | 
			
		||||
   u_char modulation                             :5;
 | 
			
		||||
   u_char roll_off                               :2;
 | 
			
		||||
   u_char modulation_system                      :1;
 | 
			
		||||
   u_char modulation_type                        :2;
 | 
			
		||||
#else
 | 
			
		||||
   u_char modulation                             :5;
 | 
			
		||||
   u_char modulation_type                        :2;
 | 
			
		||||
   u_char modulation_system                      :1;
 | 
			
		||||
   u_char roll_off                               :2;
 | 
			
		||||
   u_char polarization                           :2;
 | 
			
		||||
   u_char west_east_flag                         :1;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1349,9 +1353,15 @@ struct descr_terrestrial_delivery {
 | 
			
		||||
   u_char frequency_lo_lo                        :8;
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char bandwidth                              :3;
 | 
			
		||||
   u_char reserved1                              :5;
 | 
			
		||||
   u_char priority                               :1;
 | 
			
		||||
   u_char time_slicing_indicator                 :1;
 | 
			
		||||
   u_char mpe_fec_indicator                      :1;
 | 
			
		||||
   u_char reserved1                              :2;
 | 
			
		||||
#else
 | 
			
		||||
   u_char reserved1                              :5;
 | 
			
		||||
   u_char reserved1                              :2;
 | 
			
		||||
   u_char mpe_fec_indicator                      :1;
 | 
			
		||||
   u_char time_slicing_indicator                 :1;
 | 
			
		||||
   u_char priority                               :1;
 | 
			
		||||
   u_char bandwidth                              :3;
 | 
			
		||||
#endif
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
@@ -1492,10 +1502,10 @@ struct descr_data_broadcast {
 | 
			
		||||
   /* TBD */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x65 ca_system_descriptor */
 | 
			
		||||
/* 0x65 scrambling_descriptor */
 | 
			
		||||
 | 
			
		||||
#define DESCR_CA_SYSTEM_LEN XX
 | 
			
		||||
struct descr_ca_system {
 | 
			
		||||
#define DESCR_SCRAMBLING_LEN XX
 | 
			
		||||
struct descr_scrambling {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
   /* TBD */
 | 
			
		||||
@@ -1628,6 +1638,189 @@ struct descr_service_identifier {
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x72 service_availbility_descriptor */
 | 
			
		||||
 | 
			
		||||
struct descr_service_availbility {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char availability_flag                      :1;
 | 
			
		||||
   u_char reserved                               :7;
 | 
			
		||||
#else
 | 
			
		||||
   u_char reserved                               :7;
 | 
			
		||||
   u_char availability_flag                      :1;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x73 default_authority_descriptor (ETSI TS 102 323) */
 | 
			
		||||
 | 
			
		||||
struct descr_default_authority {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x74 related_content_descriptor (ETSI TS 102 323) */
 | 
			
		||||
 | 
			
		||||
struct descr_related_content {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x75 tva_id_descriptor (ETSI TS 102 323) */
 | 
			
		||||
 | 
			
		||||
struct descr_tva_id {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x76 content_identifier_descriptor (ETSI TS 102 323) */
 | 
			
		||||
 | 
			
		||||
struct descr_content_identifier {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x77 time_slice_fec_identifier_descriptor (ETSI EN 301 192) */
 | 
			
		||||
 | 
			
		||||
struct descr_time_slice_fec_identifier {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char time_slicing                           :1;
 | 
			
		||||
   u_char mpe_fec                                :2;
 | 
			
		||||
   u_char reserved                               :2;
 | 
			
		||||
   u_char frame_size                             :3;
 | 
			
		||||
#else
 | 
			
		||||
   u_char frame_size                             :3;
 | 
			
		||||
   u_char reserved                               :2;
 | 
			
		||||
   u_char mpe_fec                                :2;
 | 
			
		||||
   u_char time_slicing                           :1;
 | 
			
		||||
#endif
 | 
			
		||||
   u_char max_burst_duration                     :8;
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char max_average_rate                       :4;
 | 
			
		||||
   u_char time_slice_fec_id                      :4;
 | 
			
		||||
#else
 | 
			
		||||
   u_char time_slice_fec_id                      :4;
 | 
			
		||||
   u_char max_average_rate                       :4;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x78 ecm_repetition_rate_descriptor (ETSI EN 301 192) */
 | 
			
		||||
 | 
			
		||||
struct descr_ecm_repetition_rate {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
   u_char ca_system_id_hi                        :8;
 | 
			
		||||
   u_char ca_system_id_lo                        :8;
 | 
			
		||||
   u_char ecm_repetition_rate_hi                 :8;
 | 
			
		||||
   u_char ecm_repetition_rate_lo                 :8;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x79 s2_satellite_delivery_system_descriptor */
 | 
			
		||||
 | 
			
		||||
struct descr_s2_satellite_delivery_system {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char scrambling_sequence_selector           :1;
 | 
			
		||||
   u_char multiple_input_stream_flag             :1;
 | 
			
		||||
   u_char backwards_compatibility_indicator      :1;
 | 
			
		||||
   u_char reserved                               :5;
 | 
			
		||||
#else
 | 
			
		||||
   u_char reserved                               :5;
 | 
			
		||||
   u_char backwards_compatibility_indicator      :1;
 | 
			
		||||
   u_char multiple_input_stream_flag             :1;
 | 
			
		||||
   u_char scrambling_sequence_selector           :1;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct descr_scrambling_sequence_selector {
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char reserved                               :6;
 | 
			
		||||
   u_char scrambling_sequence_index_hi_lo        :2;
 | 
			
		||||
#else
 | 
			
		||||
   u_char scrambling_sequence_index_hi_lo        :2;
 | 
			
		||||
   u_char reserved                               :6;
 | 
			
		||||
#endif
 | 
			
		||||
   u_char scrambling_sequence_index_lo_hi        :8;
 | 
			
		||||
   u_char scrambling_sequence_index_lo_lo        :8;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x7A enhanced_ac3_descriptor */
 | 
			
		||||
 | 
			
		||||
struct descr_enhanced_ac3 {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char component_type_flag                    :1;
 | 
			
		||||
   u_char bsid_flag                              :1;
 | 
			
		||||
   u_char mainid_flag                            :1;
 | 
			
		||||
   u_char asvc_flag                              :1;
 | 
			
		||||
   u_char mixinfoexists                          :1;
 | 
			
		||||
   u_char substream1_flag                        :1;
 | 
			
		||||
   u_char substream2_flag                        :1;
 | 
			
		||||
   u_char substream3_flag                        :1;
 | 
			
		||||
#else
 | 
			
		||||
   u_char substream3_flag                        :1;
 | 
			
		||||
   u_char substream2_flag                        :1;
 | 
			
		||||
   u_char substream1_flag                        :1;
 | 
			
		||||
   u_char mixinfoexists                          :1;
 | 
			
		||||
   u_char asvc_flag                              :1;
 | 
			
		||||
   u_char mainid_flag                            :1;
 | 
			
		||||
   u_char bsid_flag                              :1;
 | 
			
		||||
   u_char component_type_flag                    :1;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x7B dts_descriptor */
 | 
			
		||||
 | 
			
		||||
struct descr_dts {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char sample_rate_code                       :4;
 | 
			
		||||
   u_char bit_rate_code                          :6;
 | 
			
		||||
   u_char nblks                                  :7;
 | 
			
		||||
   u_char fsize_hi                               :6;
 | 
			
		||||
   u_char fsize_lo                               :8;
 | 
			
		||||
   u_char surround_mode                          :6;
 | 
			
		||||
   u_char lfe_flag                               :1;
 | 
			
		||||
   u_char extended_surround_flag                 :2;
 | 
			
		||||
#else
 | 
			
		||||
   u_char extended_surround_flag                 :2;
 | 
			
		||||
   u_char lfe_flag                               :1;
 | 
			
		||||
   u_char surround_mode                          :6;
 | 
			
		||||
   u_char fsize_lo                               :8;
 | 
			
		||||
   u_char fsize_hi                               :6;
 | 
			
		||||
   u_char nblks                                  :7;
 | 
			
		||||
   u_char bit_rate_code                          :6;
 | 
			
		||||
   u_char sample_rate_code                       :4;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 0x7C aac_descriptor */
 | 
			
		||||
 | 
			
		||||
struct descr_aac {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
   u_char profile_and_level                      :8;
 | 
			
		||||
#if BYTE_ORDER == BIG_ENDIAN
 | 
			
		||||
   u_char aac_type_flag                          :1;
 | 
			
		||||
   u_char reserved                               :7;
 | 
			
		||||
#else
 | 
			
		||||
   u_char reserved                               :7;
 | 
			
		||||
   u_char aac_type_flag                          :1;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
/* 0x7F extension_descriptor */
 | 
			
		||||
 | 
			
		||||
struct descr_extension {
 | 
			
		||||
   u_char descriptor_tag                         :8;
 | 
			
		||||
   u_char descriptor_length                      :8;
 | 
			
		||||
   u_char descriptor_tag_extension               :8;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* MHP 0x00 application_descriptor */
 | 
			
		||||
 | 
			
		||||
#define DESCR_APPLICATION_LEN 3
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								libsi/si.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								libsi/si.c
									
									
									
									
									
								
							@@ -6,7 +6,7 @@
 | 
			
		||||
 *   the Free Software Foundation; either version 2 of the License, or     *
 | 
			
		||||
 *   (at your option) any later version.                                   *
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 *   $Id: si.c 1.16 2006/04/14 10:53:44 kls Exp $
 | 
			
		||||
 *   $Id: si.c 1.17 2007/02/03 11:45:58 kls Exp $
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
 | 
			
		||||
@@ -425,6 +425,12 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain,
 | 
			
		||||
         case AncillaryDataDescriptorTag:
 | 
			
		||||
            d=new AncillaryDataDescriptor();
 | 
			
		||||
            break;
 | 
			
		||||
         case S2SatelliteDeliverySystemDescriptorTag:
 | 
			
		||||
            d=new S2SatelliteDeliverySystemDescriptor();
 | 
			
		||||
            break;
 | 
			
		||||
         case ExtensionDescriptorTag:
 | 
			
		||||
            d=new ExtensionDescriptor();
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
         //note that it is no problem to implement one
 | 
			
		||||
         //of the unimplemented descriptors.
 | 
			
		||||
@@ -459,12 +465,23 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain,
 | 
			
		||||
         case PartialTransportStreamDescriptorTag:
 | 
			
		||||
         case DataBroadcastDescriptorTag:
 | 
			
		||||
         case DataBroadcastIdDescriptorTag:
 | 
			
		||||
         case CaSystemDescriptorTag:
 | 
			
		||||
         case ScramblingDescriptorTag:
 | 
			
		||||
         case AC3DescriptorTag:
 | 
			
		||||
         case DSNGDescriptorTag:
 | 
			
		||||
         case AnnouncementSupportDescriptorTag:
 | 
			
		||||
         case AdaptationFieldDataDescriptorTag:
 | 
			
		||||
         case TransportStreamDescriptorTag:
 | 
			
		||||
 | 
			
		||||
         //defined in ETSI EN 300 468 v 1.7.1
 | 
			
		||||
         case DefaultAuthorityDescriptorTag:
 | 
			
		||||
         case RelatedContentDescriptorTag:
 | 
			
		||||
         case TVAIdDescriptorTag:
 | 
			
		||||
         case ContentIdentifierDescriptorTag:
 | 
			
		||||
         case TimeSliceFecIdentifierDescriptorTag:
 | 
			
		||||
         case ECMRepetitionRateDescriptorTag:
 | 
			
		||||
         case EnhancedAC3DescriptorTag:
 | 
			
		||||
         case DTSDescriptorTag:
 | 
			
		||||
         case AACDescriptorTag:
 | 
			
		||||
         default:
 | 
			
		||||
            if (!returnUnimplemetedDescriptor)
 | 
			
		||||
               return 0;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								libsi/si.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								libsi/si.h
									
									
									
									
									
								
							@@ -6,7 +6,7 @@
 | 
			
		||||
 *   the Free Software Foundation; either version 2 of the License, or     *
 | 
			
		||||
 *   (at your option) any later version.                                   *
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 *   $Id: si.h 1.15 2006/05/27 13:07:20 kls Exp $
 | 
			
		||||
 *   $Id: si.h 1.16 2007/02/03 11:47:25 kls Exp $
 | 
			
		||||
 *                                                                         *
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
 | 
			
		||||
@@ -108,7 +108,7 @@ enum DescriptorTag {
 | 
			
		||||
               FrequencyListDescriptorTag = 0x62,
 | 
			
		||||
               PartialTransportStreamDescriptorTag = 0x63,
 | 
			
		||||
               DataBroadcastDescriptorTag = 0x64,
 | 
			
		||||
               CaSystemDescriptorTag = 0x65,
 | 
			
		||||
               ScramblingDescriptorTag = 0x65,
 | 
			
		||||
               DataBroadcastIdDescriptorTag = 0x66,
 | 
			
		||||
               TransportStreamDescriptorTag = 0x67,
 | 
			
		||||
               DSNGDescriptorTag = 0x68,
 | 
			
		||||
@@ -122,6 +122,19 @@ enum DescriptorTag {
 | 
			
		||||
               AdaptationFieldDataDescriptorTag = 0x70,
 | 
			
		||||
               ServiceIdentifierDescriptorTag = 0x71,
 | 
			
		||||
               ServiceAvailabilityDescriptorTag = 0x72,
 | 
			
		||||
  // defined by ETSI (EN 300 468) v 1.7.1
 | 
			
		||||
               DefaultAuthorityDescriptorTag = 0x73,
 | 
			
		||||
               RelatedContentDescriptorTag = 0x74,
 | 
			
		||||
               TVAIdDescriptorTag = 0x75,
 | 
			
		||||
               ContentIdentifierDescriptorTag = 0x76,
 | 
			
		||||
               TimeSliceFecIdentifierDescriptorTag = 0x77,
 | 
			
		||||
               ECMRepetitionRateDescriptorTag = 0x78,
 | 
			
		||||
               S2SatelliteDeliverySystemDescriptorTag = 0x79,
 | 
			
		||||
               EnhancedAC3DescriptorTag = 0x7A,
 | 
			
		||||
               DTSDescriptorTag = 0x7B,
 | 
			
		||||
               AACDescriptorTag = 0x7C,
 | 
			
		||||
               ExtensionDescriptorTag = 0x7F,
 | 
			
		||||
 | 
			
		||||
 // Defined by ETSI TS 102 812 (MHP)
 | 
			
		||||
               // They once again start with 0x00 (see page 234, MHP specification)
 | 
			
		||||
               MHP_ApplicationDescriptorTag = 0x00,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								menu.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								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 1.447 2007/01/07 12:19:48 kls Exp $
 | 
			
		||||
 * $Id: menu.c 1.450 2007/02/25 14:04:33 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
@@ -22,6 +22,7 @@
 | 
			
		||||
#include "plugin.h"
 | 
			
		||||
#include "recording.h"
 | 
			
		||||
#include "remote.h"
 | 
			
		||||
#include "shutdown.h"
 | 
			
		||||
#include "sources.h"
 | 
			
		||||
#include "status.h"
 | 
			
		||||
#include "themes.h"
 | 
			
		||||
@@ -2206,7 +2207,7 @@ void cMenuSetupOSD::Set(void)
 | 
			
		||||
  Add(new cMenuEditBoolItem(tr("Setup.OSD$Timeout requested channel info"), &data.TimeoutRequChInfo));
 | 
			
		||||
  Add(new cMenuEditBoolItem(tr("Setup.OSD$Scroll pages"),           &data.MenuScrollPage));
 | 
			
		||||
  Add(new cMenuEditBoolItem(tr("Setup.OSD$Scroll wraps"),           &data.MenuScrollWrap));
 | 
			
		||||
  Add(new cMenuEditBoolItem(tr("Setup.OSD$Menu button closes"),     &data.MenuButtonCloses));
 | 
			
		||||
  Add(new cMenuEditBoolItem(tr("Setup.OSD$Menu key closes"),        &data.MenuKeyCloses));
 | 
			
		||||
  Add(new cMenuEditBoolItem(tr("Setup.OSD$Recording directories"),  &data.RecordingDirs));
 | 
			
		||||
  SetCurrent(Get(current));
 | 
			
		||||
  Display();
 | 
			
		||||
@@ -2661,6 +2662,7 @@ cMenuSetupMisc::cMenuSetupMisc(void)
 | 
			
		||||
  Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Min. user inactivity (min)"), &data.MinUserInactivity));
 | 
			
		||||
  Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$SVDRP timeout (s)"),          &data.SVDRPTimeout));
 | 
			
		||||
  Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Zap timeout (s)"),            &data.ZapTimeout));
 | 
			
		||||
  Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Channel entry timeout (ms)"), &data.ChannelEntryTimeout, 0));
 | 
			
		||||
  Add(new cMenuEditChanItem(tr("Setup.Miscellaneous$Initial channel"),            &data.InitialChannel, tr("Setup.Miscellaneous$as before")));
 | 
			
		||||
  Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Initial volume"),             &data.InitialVolume, -1, 255, tr("Setup.Miscellaneous$as before")));
 | 
			
		||||
}
 | 
			
		||||
@@ -2770,10 +2772,8 @@ void cMenuSetup::Set(void)
 | 
			
		||||
 | 
			
		||||
eOSState cMenuSetup::Restart(void)
 | 
			
		||||
{
 | 
			
		||||
  if (Interface->Confirm(tr("Really restart?"))
 | 
			
		||||
     && (!cRecordControls::Active() || Interface->Confirm(tr("Recording - restart anyway?")))
 | 
			
		||||
     && !cPluginManager::Active(tr("restart anyway?"))) {
 | 
			
		||||
     cThread::EmergencyExit(true);
 | 
			
		||||
  if (Interface->Confirm(tr("Really restart?")) && ShutdownHandler.ConfirmRestart(true)) {
 | 
			
		||||
     ShutdownHandler.Exit(1);
 | 
			
		||||
     return osEnd;
 | 
			
		||||
     }
 | 
			
		||||
  return osContinue;
 | 
			
		||||
@@ -3090,8 +3090,6 @@ static void SetTrackDescriptions(int LiveChannel)
 | 
			
		||||
 | 
			
		||||
// --- cDisplayChannel -------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#define DIRECTCHANNELTIMEOUT 1000 //ms
 | 
			
		||||
 | 
			
		||||
cDisplayChannel *cDisplayChannel::currentDisplayChannel = NULL;
 | 
			
		||||
 | 
			
		||||
cDisplayChannel::cDisplayChannel(int Number, bool Switched)
 | 
			
		||||
@@ -3290,7 +3288,7 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key)
 | 
			
		||||
         Refresh();
 | 
			
		||||
         break;
 | 
			
		||||
    case kNone:
 | 
			
		||||
         if (number && lastTime.Elapsed() > DIRECTCHANNELTIMEOUT) {
 | 
			
		||||
         if (number && Setup.ChannelEntryTimeout && int(lastTime.Elapsed()) > Setup.ChannelEntryTimeout) {
 | 
			
		||||
            channel = Channels.GetByNumber(number);
 | 
			
		||||
            if (channel)
 | 
			
		||||
               NewChannel = channel;
 | 
			
		||||
@@ -3699,7 +3697,7 @@ bool cRecordControls::Start(cTimer *Timer, bool Pause)
 | 
			
		||||
     if (device) {
 | 
			
		||||
        dsyslog("switching device %d to channel %d", device->DeviceNumber() + 1, channel->Number());
 | 
			
		||||
        if (!device->SwitchChannel(channel, false)) {
 | 
			
		||||
           cThread::EmergencyExit(true);
 | 
			
		||||
           ShutdownHandler.RequestEmergencyExit();
 | 
			
		||||
           return false;
 | 
			
		||||
           }
 | 
			
		||||
        if (!Timer || Timer->Matches()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
# See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
# how to reach the author.
 | 
			
		||||
#
 | 
			
		||||
# $Id: newplugin 1.30 2006/09/09 12:38:35 kls Exp $
 | 
			
		||||
# $Id: newplugin 1.31 2007/02/24 13:23:08 kls Exp $
 | 
			
		||||
 | 
			
		||||
$PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
 | 
			
		||||
 | 
			
		||||
@@ -169,6 +169,7 @@ public:
 | 
			
		||||
  virtual void Housekeeping(void);
 | 
			
		||||
  virtual void MainThreadHook(void);
 | 
			
		||||
  virtual cString Active(void);
 | 
			
		||||
  virtual time_t WakeupTime(void);
 | 
			
		||||
  virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
 | 
			
		||||
  virtual cOsdObject *MainMenuAction(void);
 | 
			
		||||
  virtual cMenuSetupPage *SetupMenu(void);
 | 
			
		||||
@@ -236,6 +237,12 @@ cString cPlugin${PLUGIN_CLASS}::Active(void)
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
time_t cPlugin${PLUGIN_CLASS}::WakeupTime(void)
 | 
			
		||||
{
 | 
			
		||||
  // Return custom wakeup time for shutdown script
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cOsdObject *cPlugin${PLUGIN_CLASS}::MainMenuAction(void)
 | 
			
		||||
{
 | 
			
		||||
  // Perform the action when selected from the main VDR menu.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								osd.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								osd.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: osd.c 1.67 2006/02/26 14:31:31 kls Exp $
 | 
			
		||||
 * $Id: osd.c 1.68 2007/02/17 16:05:52 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "osd.h"
 | 
			
		||||
@@ -218,14 +218,17 @@ bool cBitmap::LoadXpm(const char *FileName)
 | 
			
		||||
                 int w, h, n, c;
 | 
			
		||||
                 if (4 != sscanf(s, "%d %d %d %d", &w, &h, &n, &c)) {
 | 
			
		||||
                    esyslog("ERROR: faulty 'values' line in XPM file '%s'", FileName);
 | 
			
		||||
                    isXpm = false;
 | 
			
		||||
                    break;
 | 
			
		||||
                    }
 | 
			
		||||
                 lines = h + n + 1;
 | 
			
		||||
                 Xpm = MALLOC(char *, lines);
 | 
			
		||||
                 memset(Xpm, 0, lines * sizeof(char*));
 | 
			
		||||
                 }
 | 
			
		||||
              char *q = strchr(s, '"');
 | 
			
		||||
              if (!q) {
 | 
			
		||||
                 esyslog("ERROR: missing quotes in XPM file '%s'", FileName);
 | 
			
		||||
                 isXpm = false;
 | 
			
		||||
                 break;
 | 
			
		||||
                 }
 | 
			
		||||
              *q = 0;
 | 
			
		||||
@@ -233,16 +236,21 @@ bool cBitmap::LoadXpm(const char *FileName)
 | 
			
		||||
                 Xpm[index++] = strdup(s);
 | 
			
		||||
              else {
 | 
			
		||||
                 esyslog("ERROR: too many lines in XPM file '%s'", FileName);
 | 
			
		||||
                 isXpm = false;
 | 
			
		||||
                 break;
 | 
			
		||||
                 }
 | 
			
		||||
              }
 | 
			
		||||
           }
 | 
			
		||||
     if (index == lines)
 | 
			
		||||
        Result = SetXpm(Xpm);
 | 
			
		||||
     else
 | 
			
		||||
        esyslog("ERROR: too few lines in XPM file '%s'", FileName);
 | 
			
		||||
     for (int i = 0; i < index; i++)
 | 
			
		||||
         free(Xpm[i]);
 | 
			
		||||
     if (isXpm) {
 | 
			
		||||
        if (index == lines)
 | 
			
		||||
           Result = SetXpm(Xpm);
 | 
			
		||||
        else
 | 
			
		||||
           esyslog("ERROR: too few lines in XPM file '%s'", FileName);
 | 
			
		||||
        }
 | 
			
		||||
     if (Xpm) {
 | 
			
		||||
        for (int i = 0; i < index; i++)
 | 
			
		||||
            free(Xpm[i]);
 | 
			
		||||
        }
 | 
			
		||||
     free(Xpm);
 | 
			
		||||
     fclose(f);
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								plugin.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								plugin.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: plugin.c 1.24 2006/10/14 09:49:16 kls Exp $
 | 
			
		||||
 * $Id: plugin.c 1.25 2007/02/24 13:44:23 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "plugin.h"
 | 
			
		||||
@@ -80,6 +80,11 @@ cString cPlugin::Active(void)
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
time_t cPlugin::WakeupTime(void)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *cPlugin::MainMenuEntry(void)
 | 
			
		||||
{
 | 
			
		||||
  return NULL;
 | 
			
		||||
@@ -403,6 +408,26 @@ bool cPluginManager::Active(const char *Prompt)
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cPlugin *cPluginManager::GetNextWakeupPlugin(void)
 | 
			
		||||
{
 | 
			
		||||
  cPlugin *NextPlugin = NULL;
 | 
			
		||||
  if (pluginManager) {
 | 
			
		||||
     time_t Now = time(NULL);
 | 
			
		||||
     time_t Next = 0;
 | 
			
		||||
     for (cDll *dll = pluginManager->dlls.First(); dll; dll = pluginManager->dlls.Next(dll)) {
 | 
			
		||||
         cPlugin *p = dll->Plugin();
 | 
			
		||||
         if (p) {
 | 
			
		||||
            time_t t = p->WakeupTime();
 | 
			
		||||
            if (t > Now && (!Next || t < Next)) {
 | 
			
		||||
               Next = t;
 | 
			
		||||
               NextPlugin = p;
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
  return NextPlugin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cPluginManager::HasPlugins(void)
 | 
			
		||||
{
 | 
			
		||||
  return pluginManager && pluginManager->dlls.Count();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								plugin.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								plugin.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: plugin.h 1.13 2006/04/17 09:18:16 kls Exp $
 | 
			
		||||
 * $Id: plugin.h 1.14 2007/02/24 13:45:28 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __PLUGIN_H
 | 
			
		||||
@@ -41,6 +41,7 @@ public:
 | 
			
		||||
  virtual void Housekeeping(void);
 | 
			
		||||
  virtual void MainThreadHook(void);
 | 
			
		||||
  virtual cString Active(void);
 | 
			
		||||
  virtual time_t WakeupTime(void);
 | 
			
		||||
 | 
			
		||||
  virtual const char *MainMenuEntry(void);
 | 
			
		||||
  virtual cOsdObject *MainMenuAction(void);
 | 
			
		||||
@@ -93,6 +94,7 @@ public:
 | 
			
		||||
  void Housekeeping(void);
 | 
			
		||||
  void MainThreadHook(void);
 | 
			
		||||
  static bool Active(const char *Prompt = NULL);
 | 
			
		||||
  static cPlugin *GetNextWakeupPlugin(void);
 | 
			
		||||
  static bool HasPlugins(void);
 | 
			
		||||
  static cPlugin *GetPlugin(int Index);
 | 
			
		||||
  static cPlugin *GetPlugin(const char *Name);
 | 
			
		||||
 
 | 
			
		||||
@@ -4,13 +4,14 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: recorder.c 1.18 2007/01/05 10:43:09 kls Exp $
 | 
			
		||||
 * $Id: recorder.c 1.19 2007/02/24 16:36:24 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "recorder.h"
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include "shutdown.h"
 | 
			
		||||
 | 
			
		||||
#define RECORDERBUFSIZE  MEGABYTE(5)
 | 
			
		||||
 | 
			
		||||
@@ -117,7 +118,7 @@ void cFileWriter::Action(void)
 | 
			
		||||
           }
 | 
			
		||||
        else if (time(NULL) - t > MAXBROKENTIMEOUT) {
 | 
			
		||||
           esyslog("ERROR: video data stream broken");
 | 
			
		||||
           cThread::EmergencyExit(true);
 | 
			
		||||
           ShutdownHandler.RequestEmergencyExit();
 | 
			
		||||
           t = time(NULL);
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								remote.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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 1.55 2006/12/02 11:12:42 kls Exp $
 | 
			
		||||
 * $Id: remote.c 1.56 2007/02/24 13:23:12 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "remote.h"
 | 
			
		||||
@@ -31,6 +31,7 @@ cMutex cRemote::mutex;
 | 
			
		||||
cCondVar cRemote::keyPressed;
 | 
			
		||||
const char *cRemote::keyMacroPlugin = NULL;
 | 
			
		||||
const char *cRemote::callPlugin = NULL;
 | 
			
		||||
time_t cRemote::lastActivity = 0;
 | 
			
		||||
 | 
			
		||||
cRemote::cRemote(const char *Name)
 | 
			
		||||
{
 | 
			
		||||
@@ -183,6 +184,7 @@ eKeys cRemote::Get(int WaitMs, char **UnknownCode)
 | 
			
		||||
            out = 0;
 | 
			
		||||
         if ((k & k_Repeat) != 0)
 | 
			
		||||
            repeatTimeout.Set(REPEATTIMEOUT);
 | 
			
		||||
         lastActivity = time(NULL);
 | 
			
		||||
         return k;
 | 
			
		||||
         }
 | 
			
		||||
      else if (!WaitMs || !keyPressed.TimedWait(mutex, WaitMs) && repeatTimeout.TimedOut())
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								remote.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								remote.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: remote.h 1.38 2006/12/02 11:12:49 kls Exp $
 | 
			
		||||
 * $Id: remote.h 1.39 2007/02/24 15:53:00 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __REMOTE_H
 | 
			
		||||
@@ -28,6 +28,7 @@ private:
 | 
			
		||||
  static char *unknownCode;
 | 
			
		||||
  static cMutex mutex;
 | 
			
		||||
  static cCondVar keyPressed;
 | 
			
		||||
  static time_t lastActivity;
 | 
			
		||||
  static const char *keyMacroPlugin;
 | 
			
		||||
  static const char *callPlugin;
 | 
			
		||||
  char *name;
 | 
			
		||||
@@ -61,6 +62,8 @@ public:
 | 
			
		||||
      ///< plugin name will be reset to NULL by this call.
 | 
			
		||||
  static bool HasKeys(void);
 | 
			
		||||
  static eKeys Get(int WaitMs = 1000, char **UnknownCode = NULL);
 | 
			
		||||
  static time_t LastActivity(void) { return lastActivity; }
 | 
			
		||||
      ///< Absolute time when last key was delivered by Get().
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
class cRemotes : public cList<cRemote> {};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								remux.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								remux.c
									
									
									
									
									
								
							@@ -11,13 +11,13 @@
 | 
			
		||||
 * The cRepacker family's code was originally written by Reinhard Nissl <rnissl@gmx.de>,
 | 
			
		||||
 * and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: remux.c 1.57 2006/12/01 14:46:25 kls Exp $
 | 
			
		||||
 * $Id: remux.c 1.58 2007/02/24 16:36:10 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "remux.h"
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include "channels.h"
 | 
			
		||||
#include "thread.h"
 | 
			
		||||
#include "shutdown.h"
 | 
			
		||||
#include "tools.h"
 | 
			
		||||
 | 
			
		||||
ePesHeader AnalyzePesHeader(const uchar *Data, int Count, int &PesPayloadOffset, bool *ContinuationHeader)
 | 
			
		||||
@@ -2011,7 +2011,7 @@ int cRemux::Put(const uchar *Data, int Count)
 | 
			
		||||
        esyslog("ERROR: no useful data seen within %d byte of video stream", skipped);
 | 
			
		||||
        skipped = -1;
 | 
			
		||||
        if (exitOnFailure)
 | 
			
		||||
           cThread::EmergencyExit(true);
 | 
			
		||||
           ShutdownHandler.RequestEmergencyExit();
 | 
			
		||||
        }
 | 
			
		||||
     else
 | 
			
		||||
        skipped += used;
 | 
			
		||||
@@ -2059,7 +2059,7 @@ uchar *cRemux::Get(int &Count, uchar *PictureType)
 | 
			
		||||
                  if (pt < I_FRAME || B_FRAME < pt) {
 | 
			
		||||
                     esyslog("ERROR: unknown picture type '%d'", pt);
 | 
			
		||||
                     if (++numUPTerrors > MAXNUMUPTERRORS && exitOnFailure)
 | 
			
		||||
                        cThread::EmergencyExit(true);
 | 
			
		||||
                        ShutdownHandler.RequestEmergencyExit();
 | 
			
		||||
                     }
 | 
			
		||||
                  else if (!synced) {
 | 
			
		||||
                     if (pt == I_FRAME) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										250
									
								
								shutdown.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								shutdown.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,250 @@
 | 
			
		||||
/*
 | 
			
		||||
 * shutdown.c: Handling of shutdown and inactivity
 | 
			
		||||
 *
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * Original version written by Udo Richter <udo_richter@gmx.de>.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: shutdown.c 1.1 2007/02/24 17:24:11 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "shutdown.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include "channels.h"
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "cutter.h"
 | 
			
		||||
#include "i18n.h"
 | 
			
		||||
#include "interface.h"
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
#include "plugin.h"
 | 
			
		||||
#include "timers.h"
 | 
			
		||||
#include "tools.h"
 | 
			
		||||
 | 
			
		||||
cShutdownHandler ShutdownHandler;
 | 
			
		||||
 | 
			
		||||
cCountdown::cCountdown(void)
 | 
			
		||||
{
 | 
			
		||||
  timeout = 0;
 | 
			
		||||
  counter = 0;
 | 
			
		||||
  timedOut = false;
 | 
			
		||||
  message = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cCountdown::Start(const char *Message, int Seconds)
 | 
			
		||||
{
 | 
			
		||||
  timeout = time(NULL) + Seconds;
 | 
			
		||||
  counter = -1;
 | 
			
		||||
  timedOut = false;
 | 
			
		||||
  message = Message;
 | 
			
		||||
  Update();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cCountdown::Cancel(void)
 | 
			
		||||
{
 | 
			
		||||
  if (timeout) {
 | 
			
		||||
     timeout = 0;
 | 
			
		||||
     timedOut = false;
 | 
			
		||||
     Skins.Message(mtStatus, NULL);
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cCountdown::Done(void)
 | 
			
		||||
{
 | 
			
		||||
  if (timedOut) {
 | 
			
		||||
     Cancel();
 | 
			
		||||
     return true;
 | 
			
		||||
     }
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cCountdown::Update(void)
 | 
			
		||||
{
 | 
			
		||||
  if (timeout) {
 | 
			
		||||
     int NewCounter = (timeout - time(NULL) + 9) / 10;
 | 
			
		||||
     if (NewCounter <= 0)
 | 
			
		||||
        timedOut = true;
 | 
			
		||||
     if (counter != NewCounter) {
 | 
			
		||||
        counter = NewCounter;
 | 
			
		||||
        char time[10];
 | 
			
		||||
        snprintf(time, sizeof(time), "%d:%d0", counter > 0 ? counter / 6 : 0, counter > 0 ? counter % 6 : 0);
 | 
			
		||||
        cString Message = cString::sprintf(message, time);
 | 
			
		||||
        Skins.Message(mtStatus, Message);
 | 
			
		||||
        return true;
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cShutdownHandler::cShutdownHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  activeTimeout = 0;
 | 
			
		||||
  retry = 0;
 | 
			
		||||
  shutdownCommand = NULL;
 | 
			
		||||
  exitCode = -1;
 | 
			
		||||
  emergencyExitRequested = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cShutdownHandler::~cShutdownHandler()
 | 
			
		||||
{
 | 
			
		||||
  free(shutdownCommand);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cShutdownHandler::RequestEmergencyExit(void)
 | 
			
		||||
{
 | 
			
		||||
  esyslog("initiating emergency exit");
 | 
			
		||||
  emergencyExitRequested = true;
 | 
			
		||||
  Exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cShutdownHandler::CheckManualStart(int ManualStart)
 | 
			
		||||
{
 | 
			
		||||
  time_t Delta = Setup.NextWakeupTime ? Setup.NextWakeupTime - time(NULL) : 0;
 | 
			
		||||
 | 
			
		||||
  if (!Setup.NextWakeupTime || abs(Delta) > ManualStart) {
 | 
			
		||||
     // Apparently the user started VDR manually
 | 
			
		||||
     dsyslog("assuming manual start of VDR");
 | 
			
		||||
     // Set inactive after MinUserInactivity
 | 
			
		||||
     SetUserInactiveTimeout();
 | 
			
		||||
     }
 | 
			
		||||
  else
 | 
			
		||||
     // Set inactive from now on
 | 
			
		||||
     SetUserInactive();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cShutdownHandler::SetShutdownCommand(const char *ShutdownCommand)
 | 
			
		||||
{
 | 
			
		||||
  free(shutdownCommand);
 | 
			
		||||
  shutdownCommand = ShutdownCommand ? strdup(ShutdownCommand) : NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cShutdownHandler::CallShutdownCommand(time_t WakeupTime, int Channel, const char *File, bool UserShutdown)
 | 
			
		||||
{
 | 
			
		||||
  time_t Delta = WakeupTime ? WakeupTime - time(NULL) : 0;
 | 
			
		||||
  cString cmd = cString::sprintf("%s %ld %ld %d \"%s\" %d", shutdownCommand, WakeupTime, Delta, Channel, *strescape(File, "\"$"), UserShutdown);
 | 
			
		||||
  isyslog("executing '%s'", *cmd);
 | 
			
		||||
  if (SystemExec(cmd, true) == 0)
 | 
			
		||||
     Setup.NextWakeupTime = WakeupTime; // Remember this wakeup time for comparison on reboot
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cShutdownHandler::SetUserInactiveTimeout(int Seconds, bool Force)
 | 
			
		||||
{
 | 
			
		||||
  if (!Setup.MinUserInactivity && !Force) {
 | 
			
		||||
     activeTimeout = 0;
 | 
			
		||||
     return;
 | 
			
		||||
     }
 | 
			
		||||
  if (Seconds < 0)
 | 
			
		||||
     Seconds = Setup.MinUserInactivity * 60;
 | 
			
		||||
  activeTimeout = time(NULL) + Seconds;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cShutdownHandler::ConfirmShutdown(bool Interactive)
 | 
			
		||||
{
 | 
			
		||||
  if (!shutdownCommand) {
 | 
			
		||||
     if (Interactive)
 | 
			
		||||
        Skins.Message(mtError, tr("Can't shutdown - option '-s' not given!"));
 | 
			
		||||
     return false;
 | 
			
		||||
     }
 | 
			
		||||
  if (cCutter::Active()) {
 | 
			
		||||
     if (!Interactive || !Interface->Confirm(tr("Editing - shut down anyway?")))
 | 
			
		||||
        return false;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  cTimer *timer = Timers.GetNextActiveTimer();
 | 
			
		||||
  time_t Next = timer ? timer->StartTime() : 0;
 | 
			
		||||
  time_t Delta = timer ? Next - time(NULL) : 0;
 | 
			
		||||
 | 
			
		||||
  if (cRecordControls::Active() || (Next && Delta <= 0)) {
 | 
			
		||||
     // VPS recordings in timer end margin may cause Delta <= 0
 | 
			
		||||
     if (!Interactive || !Interface->Confirm(tr("Recording - shut down anyway?")))
 | 
			
		||||
        return false;
 | 
			
		||||
     }
 | 
			
		||||
  else if (Next && Delta <= Setup.MinEventTimeout * 60) {
 | 
			
		||||
     // Timer within Min Event Timeout
 | 
			
		||||
     if (!Interactive)
 | 
			
		||||
        return false;
 | 
			
		||||
     cString buf = cString::sprintf(tr("Recording in %ld minutes, shut down anyway?"), Delta / 60);
 | 
			
		||||
     if (!Interface->Confirm(buf))
 | 
			
		||||
        return false;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  if (cPluginManager::Active(Interactive ? tr("shut down anyway?") : NULL))
 | 
			
		||||
     return false;
 | 
			
		||||
 | 
			
		||||
  cPlugin *Plugin = cPluginManager::GetNextWakeupPlugin();
 | 
			
		||||
  Next = Plugin ? Plugin->WakeupTime() : 0;
 | 
			
		||||
  Delta = Next ? Next - time(NULL) : 0;
 | 
			
		||||
  if (Next && Delta <= Setup.MinEventTimeout * 60) {
 | 
			
		||||
     // Plugin wakeup within Min Event Timeout
 | 
			
		||||
     if (!Interactive)
 | 
			
		||||
        return false;
 | 
			
		||||
     cString buf = cString::sprintf(tr("Plugin %s wakes up in %ld min, continue?"), Plugin->Name(), Delta / 60);
 | 
			
		||||
     if (!Interface->Confirm(buf))
 | 
			
		||||
        return false;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cShutdownHandler::ConfirmRestart(bool Interactive)
 | 
			
		||||
{
 | 
			
		||||
  if (cCutter::Active()) {
 | 
			
		||||
     if (!Interactive || !Interface->Confirm(tr("Editing - restart anyway?")))
 | 
			
		||||
        return false;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  cTimer *timer = Timers.GetNextActiveTimer();
 | 
			
		||||
  time_t Next  = timer ? timer->StartTime() : 0;
 | 
			
		||||
  time_t Delta = timer ? Next - time(NULL) : 0;
 | 
			
		||||
 | 
			
		||||
  if (cRecordControls::Active() || (Next && Delta <= 0)) {
 | 
			
		||||
     // VPS recordings in timer end margin may cause Delta <= 0
 | 
			
		||||
     if (!Interactive || !Interface->Confirm(tr("Recording - restart anyway?")))
 | 
			
		||||
        return false;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  if (cPluginManager::Active(Interactive ? tr("restart anyway?") : NULL))
 | 
			
		||||
     return false;
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cShutdownHandler::DoShutdown(bool Force)
 | 
			
		||||
{
 | 
			
		||||
  time_t Now = time(NULL);
 | 
			
		||||
  cTimer *timer = Timers.GetNextActiveTimer();
 | 
			
		||||
  cPlugin *Plugin = cPluginManager::GetNextWakeupPlugin();
 | 
			
		||||
 | 
			
		||||
  time_t Next = timer ? timer->StartTime() : 0;
 | 
			
		||||
  time_t NextPlugin = Plugin ? Plugin->WakeupTime() : 0;
 | 
			
		||||
  if (NextPlugin && (!Next || Next > NextPlugin)) {
 | 
			
		||||
     Next = NextPlugin;
 | 
			
		||||
     timer = NULL;
 | 
			
		||||
     }
 | 
			
		||||
  time_t Delta = Next ? Next - Now : 0;
 | 
			
		||||
 | 
			
		||||
  if (Next && Delta < Setup.MinEventTimeout * 60) {
 | 
			
		||||
     if (!Force)
 | 
			
		||||
        return false;
 | 
			
		||||
     Delta = Setup.MinEventTimeout * 60;
 | 
			
		||||
     Next = Now + Delta;
 | 
			
		||||
     timer = NULL;
 | 
			
		||||
     dsyslog("reboot at %s", *TimeToString(Next));
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  if (Next && timer) {
 | 
			
		||||
     dsyslog("next timer event at %s", *TimeToString(Next));
 | 
			
		||||
     CallShutdownCommand(Next, timer->Channel()->Number(), timer->File(), Force);
 | 
			
		||||
     }
 | 
			
		||||
  else if (Next && Plugin) {
 | 
			
		||||
     CallShutdownCommand(Next, 0, Plugin->Name(), Force);
 | 
			
		||||
     dsyslog("next plugin wakeup at %s", *TimeToString(Next));
 | 
			
		||||
     }
 | 
			
		||||
  else
 | 
			
		||||
     CallShutdownCommand(Next, 0, "", Force); // Next should always be 0 here. Just for safety, pass it.
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										112
									
								
								shutdown.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								shutdown.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,112 @@
 | 
			
		||||
/*
 | 
			
		||||
 * shutdown.h: Handling of shutdown and inactivity
 | 
			
		||||
 *
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * Original version written by Udo Richter <udo_richter@gmx.de>.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: shutdown.h 1.1 2007/02/24 17:23:59 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __SHUTDOWN_H
 | 
			
		||||
#define __SHUTDOWN_H
 | 
			
		||||
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
class cCountdown {
 | 
			
		||||
private:
 | 
			
		||||
  time_t timeout;      ///< 5-minute countdown timer
 | 
			
		||||
  int counter;         ///< last shown time in 10s units
 | 
			
		||||
  bool timedOut;       ///< countdown did run down to 0 and was not canceled
 | 
			
		||||
  const char *message; ///< message to display, %s is placeholder for time
 | 
			
		||||
public:
 | 
			
		||||
  cCountdown(void);
 | 
			
		||||
  void Start(const char *Message, int Seconds);
 | 
			
		||||
       ///< Start the 5 minute shutdown warning countdown.
 | 
			
		||||
  void Cancel(void);
 | 
			
		||||
       ///< Cancel the 5 minute shutdown warning countdown.
 | 
			
		||||
  bool Done(void);
 | 
			
		||||
       ///< Check if countdown timer has run out without canceling.
 | 
			
		||||
  operator bool(void) const { return timeout != 0; }
 | 
			
		||||
       ///< Check if countdown is running.
 | 
			
		||||
  bool Update(void);
 | 
			
		||||
       ///< Update status display of the countdown.
 | 
			
		||||
       ///< Returns true on actual update.
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
class cShutdownHandler {
 | 
			
		||||
private:
 | 
			
		||||
  time_t activeTimeout;
 | 
			
		||||
       ///< Time when VDR will become non-interactive. 0 means never.
 | 
			
		||||
  time_t retry;
 | 
			
		||||
       ///< Time for retrying the shutdown.
 | 
			
		||||
  char *shutdownCommand;
 | 
			
		||||
       ///< Command for shutting down VDR.
 | 
			
		||||
  int exitCode;
 | 
			
		||||
       ///< Exit code, if VDR exit was requested, or -1 if not requested.
 | 
			
		||||
  bool emergencyExitRequested;
 | 
			
		||||
       ///< The requested exit is an emergency exit.
 | 
			
		||||
public:
 | 
			
		||||
  cCountdown countdown;
 | 
			
		||||
  cShutdownHandler(void);
 | 
			
		||||
  ~cShutdownHandler();
 | 
			
		||||
  void Exit(int ExitCode) { exitCode = ExitCode; }
 | 
			
		||||
       ///< Set VDR exit code and initiate end of VDR main loop.
 | 
			
		||||
       ///< This will exit VDR without any confirmation.
 | 
			
		||||
  bool DoExit(void) { return exitCode >= 0; }
 | 
			
		||||
       ///< Check if an exit code was set, and VDR should exit.
 | 
			
		||||
  int GetExitCode(void) { return exitCode >= 0 ? exitCode : 0; }
 | 
			
		||||
       ///< Get the currently set exit code of VDR.
 | 
			
		||||
  bool EmergencyExitRequested(void) { return emergencyExitRequested; }
 | 
			
		||||
       ///< Returns true if an emergency exit was requested.
 | 
			
		||||
  void RequestEmergencyExit(void);
 | 
			
		||||
       ///< Requests an emergency exit of the VDR main loop.
 | 
			
		||||
  void CheckManualStart(int ManualStart);
 | 
			
		||||
       ///< Check whether the next timer is in ManualStart time window.
 | 
			
		||||
       ///< If yes, assume non-interactive use.
 | 
			
		||||
  void SetShutdownCommand(const char *ShutdownCommand);
 | 
			
		||||
       ///< Set the command string for shutdown command.
 | 
			
		||||
  void CallShutdownCommand(time_t WakeupTime, int Channel, const char *File, bool UserShutdown);
 | 
			
		||||
       ///< Call the shutdown command with the given parameters.
 | 
			
		||||
  bool IsUserInactive(time_t AtTime = 0) { return activeTimeout && activeTimeout <= (AtTime ? AtTime : time(NULL)); }
 | 
			
		||||
       ///< Check whether VDR is in interactive mode or non-interactive mode (waiting for shutdown).
 | 
			
		||||
       ///< AtTime checks whether VDR will probably be inactive at that time.
 | 
			
		||||
  time_t GetUserInactiveTime(void) { return activeTimeout; }
 | 
			
		||||
       ///< Time when user will become non-inactive, or 0 if never.
 | 
			
		||||
  void SetUserInactiveTimeout(int Seconds = -1, bool Force = false);
 | 
			
		||||
       ///< Set the time when VDR will switch into non-interactive mode or power down.
 | 
			
		||||
       ///< -1 means Setup.MinUserInactivity in the future.
 | 
			
		||||
       ///< Otherwise, seconds in the future.
 | 
			
		||||
       ///< If MinUserInactivity = 0 and Force = false, Seconds is ignored and VDR will
 | 
			
		||||
       ///< stay interactive forever.
 | 
			
		||||
  void SetUserInactive(void) { SetUserInactiveTimeout(0, true); }
 | 
			
		||||
       ///< Set VDR manually into non-interactive mode.
 | 
			
		||||
  bool Retry(time_t AtTime = 0) { return retry <= (AtTime ? AtTime : time(NULL)); }
 | 
			
		||||
       ///< Check whether its time to re-try the shutdown.
 | 
			
		||||
       ///< AtTime checks whether VDR will probably be inactive at that time.
 | 
			
		||||
  time_t GetRetry(void) { return retry; }
 | 
			
		||||
       ///< Time when shutdown retry block ends.
 | 
			
		||||
  void SetRetry(int Seconds) { retry = time(NULL) + Seconds; }
 | 
			
		||||
       ///< Set shutdown retry so that VDR will not try to automatically shut down
 | 
			
		||||
       ///< within Seconds.
 | 
			
		||||
  bool ConfirmShutdown(bool Ask);
 | 
			
		||||
       ///< Check for background activity that blocks shutdown.
 | 
			
		||||
       ///< Returns immediately and without user interaction if Ask = false.
 | 
			
		||||
       ///< Asks for confirmation if Ask = true.
 | 
			
		||||
       ///< Returns true if ready for shutdown.
 | 
			
		||||
  bool ConfirmRestart(bool Ask);
 | 
			
		||||
       ///< Check for background activity that blocks restart.
 | 
			
		||||
       ///< Returns immediately and without user interaction if Ask = false.
 | 
			
		||||
       ///< Asks for confirmation if Ask = true.
 | 
			
		||||
       ///< Returns true if ready for restart.
 | 
			
		||||
  bool DoShutdown(bool Force);
 | 
			
		||||
       ///< Call the shutdown script with data of the next pending timer.
 | 
			
		||||
       ///< Fails if Force = false and a timer is running or within MinEventTimeout.
 | 
			
		||||
       ///< Always calls shutdown on Force = true.
 | 
			
		||||
       ///< Returns true on success.
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
extern cShutdownHandler ShutdownHandler;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										26
									
								
								sources.conf
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								sources.conf
									
									
									
									
									
								
							@@ -38,7 +38,7 @@ S38E    Paksat 1
 | 
			
		||||
S39E    Hellas Sat 2
 | 
			
		||||
S40E    Express AM1
 | 
			
		||||
S42E    Turksat 1C/2A
 | 
			
		||||
S45E    PAS 12
 | 
			
		||||
S45E    Intelsat 12
 | 
			
		||||
S49E    Yamal 202
 | 
			
		||||
S53E    Express AM 22
 | 
			
		||||
S55E    Insat 3E & Intelsat 702
 | 
			
		||||
@@ -48,9 +48,9 @@ S60E    Intelsat 904
 | 
			
		||||
S62E    Intelsat 902
 | 
			
		||||
S64E    Intelsat 906
 | 
			
		||||
S66E    Intelsat 704
 | 
			
		||||
S68.5E  PAS 7/10
 | 
			
		||||
S68.5E  Intelsat 7/10
 | 
			
		||||
S70.5E  Eutelsat W5
 | 
			
		||||
S72E    PAS 4
 | 
			
		||||
S72E    Intelsat 4
 | 
			
		||||
 | 
			
		||||
# Asia
 | 
			
		||||
 | 
			
		||||
@@ -98,8 +98,8 @@ S158E   Superbird A
 | 
			
		||||
S160E   Optus B1
 | 
			
		||||
S162E   Superbird B2
 | 
			
		||||
S164E   Optus A3
 | 
			
		||||
S166E   PAS 8
 | 
			
		||||
S169E   PAS 2
 | 
			
		||||
S166E   Intelsat 8
 | 
			
		||||
S169E   Intelsat 2
 | 
			
		||||
S172E   AMC 23
 | 
			
		||||
S180E   Intelsat 701
 | 
			
		||||
S177W   NSS 5
 | 
			
		||||
@@ -125,12 +125,12 @@ S31.5W  Intelsat 801
 | 
			
		||||
S34.5W  Intelsat 903
 | 
			
		||||
S37.5W  Telstar 11 & AMC 12
 | 
			
		||||
S40.5W  NSS 806
 | 
			
		||||
S43W    PAS 3R/6B
 | 
			
		||||
S45W    PAS 1R
 | 
			
		||||
S43W    Intelsat 3R/6B
 | 
			
		||||
S45W    Intelsat 1R
 | 
			
		||||
S50W    Intelsat 705
 | 
			
		||||
S53W    Intelsat 707
 | 
			
		||||
S55.5W  Intelsat 805
 | 
			
		||||
S58W    PAS 9
 | 
			
		||||
S58W    Intelsat 9
 | 
			
		||||
S61W    Amazonas
 | 
			
		||||
 | 
			
		||||
# America
 | 
			
		||||
@@ -151,13 +151,13 @@ S84W    Brasilsat B3
 | 
			
		||||
S85W    AMC 2
 | 
			
		||||
S85.1W  XM 3
 | 
			
		||||
S87W    AMC3
 | 
			
		||||
S89W    Intelsat Americas 8
 | 
			
		||||
S89W    Galaxy 28
 | 
			
		||||
S91W    Galaxy 11 & Nimiq 1
 | 
			
		||||
S91.5W  DirecTV 2
 | 
			
		||||
S92W    Brasilsat B4
 | 
			
		||||
S93W    Intelsat Americas 6
 | 
			
		||||
S93W    Galaxy 26
 | 
			
		||||
S95W    Galaxy 3C
 | 
			
		||||
S97W    Intelsat Americas 5
 | 
			
		||||
S97W    Galaxy 25
 | 
			
		||||
S99W    Galaxy 4R
 | 
			
		||||
S99.2W  Spaceway 2
 | 
			
		||||
S101W   DirecTV 1R/4S/8 & AMC4
 | 
			
		||||
@@ -168,11 +168,11 @@ S110W   DirecTV 5 & Echostar 6/8/10
 | 
			
		||||
S111.1W Anik F2
 | 
			
		||||
S113W   Solidaridad 2
 | 
			
		||||
S119W   Echostar 7 & DirecTV 7S
 | 
			
		||||
S121W   Echostar 9 & Intelsat Americas 13
 | 
			
		||||
S121W   Echostar 9 & Galaxy 23
 | 
			
		||||
S123W   Galaxy 10R
 | 
			
		||||
S125W   Galaxy 14
 | 
			
		||||
S127W   Galaxy 13/Horizons 1
 | 
			
		||||
S129W   Echostar 5 & Intelsat Americas 7
 | 
			
		||||
S129W   Echostar 5 & Galaxy 27
 | 
			
		||||
S131W   AMC 11
 | 
			
		||||
S133W   Galaxy15/1R
 | 
			
		||||
S135W   AMC 10
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								thread.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								thread.c
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: thread.c 1.59 2007/01/05 10:44:22 kls Exp $
 | 
			
		||||
 * $Id: thread.c 1.60 2007/02/24 16:13:33 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "thread.h"
 | 
			
		||||
@@ -200,7 +200,6 @@ void cMutex::Unlock(void)
 | 
			
		||||
// --- cThread ---------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
tThreadId cThread::mainThreadId = 0;
 | 
			
		||||
bool cThread::emergencyExitRequested = false;
 | 
			
		||||
 | 
			
		||||
cThread::cThread(const char *Description)
 | 
			
		||||
{
 | 
			
		||||
@@ -320,14 +319,6 @@ void cThread::Cancel(int WaitSeconds)
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cThread::EmergencyExit(bool Request)
 | 
			
		||||
{
 | 
			
		||||
  if (!Request)
 | 
			
		||||
     return emergencyExitRequested;
 | 
			
		||||
  esyslog("initiating emergency exit");
 | 
			
		||||
  return emergencyExitRequested = true; // yes, it's an assignment, not a comparison!
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tThreadId cThread::ThreadId(void)
 | 
			
		||||
{
 | 
			
		||||
  return syscall(__NR_gettid);
 | 
			
		||||
@@ -505,7 +496,7 @@ int cPipe::Close(void)
 | 
			
		||||
 | 
			
		||||
// --- SystemExec ------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
int SystemExec(const char *Command)
 | 
			
		||||
int SystemExec(const char *Command, bool Detached)
 | 
			
		||||
{
 | 
			
		||||
  pid_t pid;
 | 
			
		||||
 | 
			
		||||
@@ -515,14 +506,24 @@ int SystemExec(const char *Command)
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  if (pid > 0) { // parent process
 | 
			
		||||
     int status;
 | 
			
		||||
     if (waitpid(pid, &status, 0) < 0) {
 | 
			
		||||
     int status = 0;
 | 
			
		||||
     if (!Detached && waitpid(pid, &status, 0) < 0) {
 | 
			
		||||
        LOG_ERROR;
 | 
			
		||||
        return -1;
 | 
			
		||||
        }
 | 
			
		||||
     return status;
 | 
			
		||||
     }
 | 
			
		||||
  else { // child process
 | 
			
		||||
     if (Detached) {
 | 
			
		||||
        // Start a new session
 | 
			
		||||
        pid_t sid = setsid();
 | 
			
		||||
        if (sid < 0)
 | 
			
		||||
           LOG_ERROR;
 | 
			
		||||
        // close STDIN and re-open as /dev/null
 | 
			
		||||
        int devnull = open("/dev/null", O_RDONLY);
 | 
			
		||||
        if (devnull < 0 || dup2(devnull, 0) < 0)
 | 
			
		||||
           LOG_ERROR;
 | 
			
		||||
        }
 | 
			
		||||
     int MaxPossibleFileDescriptors = getdtablesize();
 | 
			
		||||
     for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++)
 | 
			
		||||
         close(i); //close all dup'ed filedescriptors
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								thread.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								thread.h
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 * See the main source file 'vdr.c' for copyright information and
 | 
			
		||||
 * how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: thread.h 1.38 2007/01/05 10:44:38 kls Exp $
 | 
			
		||||
 * $Id: thread.h 1.39 2007/02/24 16:13:28 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __THREAD_H
 | 
			
		||||
@@ -84,7 +84,6 @@ private:
 | 
			
		||||
  cMutex mutex;
 | 
			
		||||
  char *description;
 | 
			
		||||
  static tThreadId mainThreadId;
 | 
			
		||||
  static bool emergencyExitRequested;
 | 
			
		||||
  static void *StartThread(cThread *Thread);
 | 
			
		||||
protected:
 | 
			
		||||
  void SetPriority(int Priority);
 | 
			
		||||
@@ -118,7 +117,6 @@ public:
 | 
			
		||||
       ///< If the thread is already running, nothing happens.
 | 
			
		||||
  bool Active(void);
 | 
			
		||||
       ///< Checks whether the thread is still alive.
 | 
			
		||||
  static bool EmergencyExit(bool Request = false);
 | 
			
		||||
  static tThreadId ThreadId(void);
 | 
			
		||||
  static tThreadId IsMainThread(void) { return ThreadId() == mainThreadId; }
 | 
			
		||||
  static void SetMainThreadId(void);
 | 
			
		||||
@@ -175,7 +173,9 @@ public:
 | 
			
		||||
 | 
			
		||||
// SystemExec() implements a 'system()' call that closes all unnecessary file
 | 
			
		||||
// descriptors in the child process.
 | 
			
		||||
// With Detached=true, calls command in background and in a separate session,
 | 
			
		||||
// with stdin connected to /dev/null.
 | 
			
		||||
 | 
			
		||||
int SystemExec(const char *Command);
 | 
			
		||||
int SystemExec(const char *Command, bool Detached = false);
 | 
			
		||||
 | 
			
		||||
#endif //__THREAD_H
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								vdr.1
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								vdr.1
									
									
									
									
									
								
							@@ -8,7 +8,7 @@
 | 
			
		||||
.\" License as specified in the file COPYING that comes with the
 | 
			
		||||
.\" vdr distribution.
 | 
			
		||||
.\"
 | 
			
		||||
.\" $Id: vdr.1 1.28 2007/01/07 14:03:56 kls Exp $
 | 
			
		||||
.\" $Id: vdr.1 1.29 2007/02/24 17:40:20 kls Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.TH vdr 1 "07 Jan 2007" "1.4.5" "Video Disk Recorder"
 | 
			
		||||
.SH NAME
 | 
			
		||||
@@ -153,6 +153,14 @@ Print version information and exit.
 | 
			
		||||
.BI \-w\  sec ,\ \-\-watchdog= sec
 | 
			
		||||
Activate the watchdog timer with a timeout of \fIsec\fR seconds.
 | 
			
		||||
A value of \fB0\fR (default) disables the watchdog.
 | 
			
		||||
.SH SIGNALS
 | 
			
		||||
.TP
 | 
			
		||||
.B SIGINT, SIGTERM
 | 
			
		||||
Program exits with status 0.
 | 
			
		||||
.TP
 | 
			
		||||
.B SIGHUP
 | 
			
		||||
Program exits with status 1. This can be used to force a reload, for example
 | 
			
		||||
if an update has been installed.
 | 
			
		||||
.SH EXIT STATUS
 | 
			
		||||
.TP
 | 
			
		||||
.B 0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										225
									
								
								vdr.c
									
									
									
									
									
								
							
							
						
						
									
										225
									
								
								vdr.c
									
									
									
									
									
								
							@@ -22,7 +22,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * The project's page is at http://www.cadsoft.de/vdr
 | 
			
		||||
 *
 | 
			
		||||
 * $Id: vdr.c 1.283 2007/01/05 10:46:14 kls Exp $
 | 
			
		||||
 * $Id: vdr.c 1.285 2007/02/25 11:27:36 kls Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <getopt.h>
 | 
			
		||||
@@ -54,6 +54,7 @@
 | 
			
		||||
#include "plugin.h"
 | 
			
		||||
#include "rcu.h"
 | 
			
		||||
#include "recording.h"
 | 
			
		||||
#include "shutdown.h"
 | 
			
		||||
#include "skinclassic.h"
 | 
			
		||||
#include "skinsttng.h"
 | 
			
		||||
#include "sources.h"
 | 
			
		||||
@@ -66,20 +67,23 @@
 | 
			
		||||
#define MINCHANNELWAIT     10 // seconds to wait between failed channel switchings
 | 
			
		||||
#define ACTIVITYTIMEOUT    60 // seconds before starting housekeeping
 | 
			
		||||
#define SHUTDOWNWAIT      300 // seconds to wait in user prompt before automatic shutdown
 | 
			
		||||
#define SHUTDOWNRETRY     360 // seconds before trying again to shut down
 | 
			
		||||
#define SHUTDOWNFORCEPROMPT 5 // seconds to wait in user prompt to allow forcing shutdown
 | 
			
		||||
#define SHUTDOWNCANCELROMPT 5 // seconds to wait in user prompt to allow canceling shutdown
 | 
			
		||||
#define RESTARTCANCELPROMPT 5 // seconds to wait in user prompt before restarting on SIGHUP
 | 
			
		||||
#define MANUALSTART       600 // seconds the next timer must be in the future to assume manual start
 | 
			
		||||
#define CHANNELSAVEDELTA  600 // seconds before saving channels.conf after automatic modifications
 | 
			
		||||
#define DEVICEREADYTIMEOUT 30 // seconds to wait until all devices are ready
 | 
			
		||||
#define MENUTIMEOUT       120 // seconds of user inactivity after which an OSD display is closed
 | 
			
		||||
#define SHUTDOWNRETRY     300 // seconds before trying again to shut down
 | 
			
		||||
#define TIMERCHECKDELTA    10 // seconds between checks for timers that need to see their channel
 | 
			
		||||
#define TIMERDEVICETIMEOUT  8 // seconds before a device used for timer check may be reused
 | 
			
		||||
#define TIMERLOOKAHEADTIME 60 // seconds before a non-VPS timer starts and the channel is switched if possible
 | 
			
		||||
#define VPSLOOKAHEADTIME   24 // hours within which VPS timers will make sure their events are up to date
 | 
			
		||||
#define VPSUPTODATETIME  3600 // seconds before the event or schedule of a VPS timer needs to be refreshed
 | 
			
		||||
 | 
			
		||||
#define EXIT(v) { ExitCode = (v); goto Exit; }
 | 
			
		||||
#define EXIT(v) { ShutdownHandler.Exit(v); goto Exit; }
 | 
			
		||||
 | 
			
		||||
static int Interrupted = 0;
 | 
			
		||||
static int LastSignal = 0;
 | 
			
		||||
 | 
			
		||||
static bool SetUser(const char *UserName)
 | 
			
		||||
{
 | 
			
		||||
@@ -138,10 +142,18 @@ static bool SetKeepCaps(bool On)
 | 
			
		||||
 | 
			
		||||
static void SignalHandler(int signum)
 | 
			
		||||
{
 | 
			
		||||
  if (signum != SIGPIPE) {
 | 
			
		||||
     Interrupted = signum;
 | 
			
		||||
     Interface->Interrupt();
 | 
			
		||||
     }
 | 
			
		||||
  isyslog("caught signal %d", signum);
 | 
			
		||||
  switch (signum) {
 | 
			
		||||
    case SIGPIPE:
 | 
			
		||||
         break;
 | 
			
		||||
    case SIGHUP:
 | 
			
		||||
         LastSignal = signum;
 | 
			
		||||
         break;
 | 
			
		||||
    default:
 | 
			
		||||
         LastSignal = signum;
 | 
			
		||||
         Interface->Interrupt();
 | 
			
		||||
         ShutdownHandler.Exit(0);
 | 
			
		||||
    }
 | 
			
		||||
  signal(signum, SignalHandler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -184,7 +196,6 @@ int main(int argc, char *argv[])
 | 
			
		||||
  bool MuteAudio = false;
 | 
			
		||||
  int WatchdogTimeout = DEFAULTWATCHDOG;
 | 
			
		||||
  const char *Terminal = NULL;
 | 
			
		||||
  const char *Shutdown = NULL;
 | 
			
		||||
 | 
			
		||||
  bool UseKbd = true;
 | 
			
		||||
  const char *LircDevice = NULL;
 | 
			
		||||
@@ -205,7 +216,6 @@ int main(int argc, char *argv[])
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  cPluginManager PluginManager(DEFAULTPLUGINDIR);
 | 
			
		||||
  int ExitCode = 0;
 | 
			
		||||
 | 
			
		||||
  static struct option long_options[] = {
 | 
			
		||||
      { "audio",    required_argument, NULL, 'a' },
 | 
			
		||||
@@ -313,7 +323,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
                    break;
 | 
			
		||||
          case 'r': cRecordingUserCommand::SetCommand(optarg);
 | 
			
		||||
                    break;
 | 
			
		||||
          case 's': Shutdown = optarg;
 | 
			
		||||
          case 's': ShutdownHandler.SetShutdownCommand(optarg);
 | 
			
		||||
                    break;
 | 
			
		||||
          case 't': Terminal = optarg;
 | 
			
		||||
                    if (access(Terminal, R_OK | W_OK) < 0) {
 | 
			
		||||
@@ -498,10 +508,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
  int PreviousChannel[2] = { 1, 1 };
 | 
			
		||||
  int PreviousChannelIndex = 0;
 | 
			
		||||
  time_t LastChannelChanged = time(NULL);
 | 
			
		||||
  time_t LastActivity = 0;
 | 
			
		||||
  int MaxLatencyTime = 0;
 | 
			
		||||
  bool ForceShutdown = false;
 | 
			
		||||
  bool UserShutdown = false;
 | 
			
		||||
  bool InhibitEpgScan = false;
 | 
			
		||||
  bool IsInfoMenu = false;
 | 
			
		||||
  cSkin *CurrentSkin = NULL;
 | 
			
		||||
@@ -596,6 +603,10 @@ int main(int argc, char *argv[])
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  // Check for timers in automatic start time window:
 | 
			
		||||
 | 
			
		||||
  ShutdownHandler.CheckManualStart(MANUALSTART);
 | 
			
		||||
 | 
			
		||||
  // User interface:
 | 
			
		||||
 | 
			
		||||
  Interface = new cInterface(SVDRPport);
 | 
			
		||||
@@ -668,12 +679,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
 | 
			
		||||
#define DELETE_MENU ((IsInfoMenu &= (Menu == NULL)), delete Menu, Menu = NULL)
 | 
			
		||||
 | 
			
		||||
  while (!Interrupted) {
 | 
			
		||||
        // Handle emergency exits:
 | 
			
		||||
        if (cThread::EmergencyExit()) {
 | 
			
		||||
           esyslog("emergency exit requested - shutting down");
 | 
			
		||||
           break;
 | 
			
		||||
           }
 | 
			
		||||
  while (!ShutdownHandler.DoExit()) {
 | 
			
		||||
#ifdef DEBUGRINGBUFFERS
 | 
			
		||||
        cRingBufferLinear::PrintDebugRBL();
 | 
			
		||||
#endif
 | 
			
		||||
@@ -856,9 +862,13 @@ int main(int argc, char *argv[])
 | 
			
		||||
        // User Input:
 | 
			
		||||
        cOsdObject *Interact = Menu ? Menu : cControl::Control();
 | 
			
		||||
        eKeys key = Interface->GetKey(!Interact || !Interact->NeedsFastResponse());
 | 
			
		||||
        if (NORMALKEY(key) != kNone) {
 | 
			
		||||
        if (ISREALKEY(key)) {
 | 
			
		||||
           EITScanner.Activity();
 | 
			
		||||
           LastActivity = time(NULL);
 | 
			
		||||
           // Cancel shutdown countdown:
 | 
			
		||||
           if (ShutdownHandler.countdown)
 | 
			
		||||
              ShutdownHandler.countdown.Cancel();
 | 
			
		||||
           // Set user active for MinUserInactivity time in the future:
 | 
			
		||||
           ShutdownHandler.SetUserInactiveTimeout();
 | 
			
		||||
           }
 | 
			
		||||
        // Keys that must work independent of any interactive mode:
 | 
			
		||||
        switch (key) {
 | 
			
		||||
@@ -875,7 +885,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
                  else
 | 
			
		||||
                     WasOpen = false;
 | 
			
		||||
                  }
 | 
			
		||||
               if (!WasOpen || !WasMenu && !Setup.MenuButtonCloses)
 | 
			
		||||
               if (!WasOpen || !WasMenu && !Setup.MenuKeyCloses)
 | 
			
		||||
                  Menu = new cMenuMain;
 | 
			
		||||
               }
 | 
			
		||||
               break;
 | 
			
		||||
@@ -996,37 +1006,32 @@ int main(int argc, char *argv[])
 | 
			
		||||
                  }
 | 
			
		||||
               break;
 | 
			
		||||
          // Power off:
 | 
			
		||||
          case kPower: {
 | 
			
		||||
          case kPower:
 | 
			
		||||
               isyslog("Power button pressed");
 | 
			
		||||
               DELETE_MENU;
 | 
			
		||||
               if (!Shutdown) {
 | 
			
		||||
                  Skins.Message(mtError, tr("Can't shutdown - option '-s' not given!"));
 | 
			
		||||
               // Check for activity, request power button again if active:
 | 
			
		||||
               if (!ShutdownHandler.ConfirmShutdown(false) && Skins.Message(mtWarning, tr("VDR will shut down later - press Power to force"), SHUTDOWNFORCEPROMPT) != kPower) {
 | 
			
		||||
                  // Not pressed power - set VDR to be non-interactive and power down later:
 | 
			
		||||
                  ShutdownHandler.SetUserInactive();
 | 
			
		||||
                  break;
 | 
			
		||||
                  }
 | 
			
		||||
               LastActivity = 1; // not 0, see below!
 | 
			
		||||
               UserShutdown = true;
 | 
			
		||||
               if (cRecordControls::Active()) {
 | 
			
		||||
                  if (!Interface->Confirm(tr("Recording - shut down anyway?")))
 | 
			
		||||
                     break;
 | 
			
		||||
                  }
 | 
			
		||||
               if (cPluginManager::Active(tr("shut down anyway?")))
 | 
			
		||||
               // No activity or power button pressed twice - ask for confirmation:
 | 
			
		||||
               if (!ShutdownHandler.ConfirmShutdown(true)) {
 | 
			
		||||
                  // Non-confirmed background activity - set VDR to be non-interactive and power down later:
 | 
			
		||||
                  ShutdownHandler.SetUserInactive();
 | 
			
		||||
                  break;
 | 
			
		||||
               if (!cRecordControls::Active()) {
 | 
			
		||||
                  cTimer *timer = Timers.GetNextActiveTimer();
 | 
			
		||||
                  time_t Next  = timer ? timer->StartTime() : 0;
 | 
			
		||||
                  time_t Delta = timer ? Next - time(NULL) : 0;
 | 
			
		||||
                  if (Next && Delta <= Setup.MinEventTimeout * 60) {
 | 
			
		||||
                     char *buf;
 | 
			
		||||
                     asprintf(&buf, tr("Recording in %ld minutes, shut down anyway?"), Delta / 60);
 | 
			
		||||
                     bool confirm = Interface->Confirm(buf);
 | 
			
		||||
                     free(buf);
 | 
			
		||||
                     if (!confirm)
 | 
			
		||||
                        break;
 | 
			
		||||
                     }
 | 
			
		||||
                  }
 | 
			
		||||
               ForceShutdown = true;
 | 
			
		||||
               // Ask the final question:
 | 
			
		||||
               if (!Interface->Confirm(tr("Press any key to cancel shutdown"), SHUTDOWNCANCELROMPT, true))
 | 
			
		||||
                  // If final question was canceled, continue to be active:
 | 
			
		||||
                  break;
 | 
			
		||||
               // Ok, now call the shutdown script:
 | 
			
		||||
               ShutdownHandler.DoShutdown(true);
 | 
			
		||||
               // Set VDR to be non-interactive and power down again later:
 | 
			
		||||
               ShutdownHandler.SetUserInactive();
 | 
			
		||||
               // Do not attempt to automatically shut down for a while:
 | 
			
		||||
               ShutdownHandler.SetRetry(SHUTDOWNRETRY);
 | 
			
		||||
               break;
 | 
			
		||||
               }
 | 
			
		||||
          default: break;
 | 
			
		||||
          }
 | 
			
		||||
        Interact = Menu ? Menu : cControl::Control(); // might have been closed in the mean time
 | 
			
		||||
@@ -1041,7 +1046,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
                    continue;
 | 
			
		||||
                    }
 | 
			
		||||
                 }
 | 
			
		||||
              else if (time(NULL) - LastActivity > MENUTIMEOUT)
 | 
			
		||||
              else if (time(NULL) - cRemote::LastActivity() > MENUTIMEOUT)
 | 
			
		||||
                 state = osEnd;
 | 
			
		||||
              }
 | 
			
		||||
           switch (state) {
 | 
			
		||||
@@ -1143,77 +1148,55 @@ int main(int argc, char *argv[])
 | 
			
		||||
                 Skins.Message(mtInfo, tr("Editing process finished"));
 | 
			
		||||
              }
 | 
			
		||||
           }
 | 
			
		||||
        if (!Interact && ((!cRecordControls::Active() && !cCutter::Active() && (!Interface->HasSVDRPConnection() || UserShutdown)) || ForceShutdown)) {
 | 
			
		||||
           time_t Now = time(NULL);
 | 
			
		||||
           if (Now - LastActivity > ACTIVITYTIMEOUT) {
 | 
			
		||||
              // Shutdown:
 | 
			
		||||
              if (Shutdown && (Setup.MinUserInactivity || LastActivity == 1) && Now - LastActivity > Setup.MinUserInactivity * 60) {
 | 
			
		||||
                 cTimer *timer = Timers.GetNextActiveTimer();
 | 
			
		||||
                 time_t Next  = timer ? timer->StartTime() : 0;
 | 
			
		||||
                 time_t Delta = timer ? Next - Now : 0;
 | 
			
		||||
                 if (!LastActivity) {
 | 
			
		||||
                    if (!timer || Delta > MANUALSTART) {
 | 
			
		||||
                       // Apparently the user started VDR manually
 | 
			
		||||
                       dsyslog("assuming manual start of VDR");
 | 
			
		||||
                       LastActivity = Now;
 | 
			
		||||
                       continue; // don't run into the actual shutdown procedure below
 | 
			
		||||
                       }
 | 
			
		||||
                    else
 | 
			
		||||
                       LastActivity = 1;
 | 
			
		||||
                    }
 | 
			
		||||
                 if (timer && Delta < Setup.MinEventTimeout * 60 && ForceShutdown) {
 | 
			
		||||
                    Delta = Setup.MinEventTimeout * 60;
 | 
			
		||||
                    Next = Now + Delta;
 | 
			
		||||
                    timer = NULL;
 | 
			
		||||
                    dsyslog("reboot at %s", *TimeToString(Next));
 | 
			
		||||
                    }
 | 
			
		||||
                 if (!ForceShutdown && cPluginManager::Active()) {
 | 
			
		||||
                    LastActivity = Now - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later
 | 
			
		||||
                    continue;
 | 
			
		||||
                    }
 | 
			
		||||
                 if (!Next || Delta > Setup.MinEventTimeout * 60 || ForceShutdown) {
 | 
			
		||||
                    ForceShutdown = false;
 | 
			
		||||
                    if (timer)
 | 
			
		||||
                       dsyslog("next timer event at %s", *TimeToString(Next));
 | 
			
		||||
                    if (WatchdogTimeout > 0)
 | 
			
		||||
                       signal(SIGALRM, SIG_IGN);
 | 
			
		||||
                    if (Interface->Confirm(tr("Press any key to cancel shutdown"), UserShutdown ? 5 : SHUTDOWNWAIT, true)) {
 | 
			
		||||
                       cControl::Shutdown();
 | 
			
		||||
                       int Channel = timer ? timer->Channel()->Number() : 0;
 | 
			
		||||
                       const char *File = timer ? timer->File() : "";
 | 
			
		||||
                       if (timer)
 | 
			
		||||
                          Delta = Next - time(NULL); // compensates for Confirm() timeout
 | 
			
		||||
                       char *cmd;
 | 
			
		||||
                       asprintf(&cmd, "%s %ld %ld %d \"%s\" %d", Shutdown, Next, Delta, Channel, *strescape(File, "\"$"), UserShutdown);
 | 
			
		||||
                       isyslog("executing '%s'", cmd);
 | 
			
		||||
                       SystemExec(cmd);
 | 
			
		||||
                       free(cmd);
 | 
			
		||||
                       LastActivity = time(NULL) - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later
 | 
			
		||||
                       }
 | 
			
		||||
                    else {
 | 
			
		||||
                      LastActivity = Now;
 | 
			
		||||
                      if (WatchdogTimeout > 0) {
 | 
			
		||||
                         alarm(WatchdogTimeout);
 | 
			
		||||
                         if (signal(SIGALRM, Watchdog) == SIG_IGN)
 | 
			
		||||
                            signal(SIGALRM, SIG_IGN);
 | 
			
		||||
                         }
 | 
			
		||||
                      }
 | 
			
		||||
                    UserShutdown = false;
 | 
			
		||||
                    continue; // skip the rest of the housekeeping for now
 | 
			
		||||
                    }
 | 
			
		||||
                 }
 | 
			
		||||
              // Disk housekeeping:
 | 
			
		||||
              RemoveDeletedRecordings();
 | 
			
		||||
              cSchedules::Cleanup();
 | 
			
		||||
              // Plugins housekeeping:
 | 
			
		||||
              PluginManager.Housekeeping();
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
        // SIGHUP shall cause a restart:
 | 
			
		||||
        if (LastSignal == SIGHUP) {
 | 
			
		||||
           if (ShutdownHandler.ConfirmRestart(true) && Interface->Confirm(tr("Press any key to cancel restart"), RESTARTCANCELPROMPT, true))
 | 
			
		||||
              EXIT(1);
 | 
			
		||||
           LastSignal = 0;
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
        // Update the shutdown countdown:
 | 
			
		||||
        if (ShutdownHandler.countdown && ShutdownHandler.countdown.Update()) {
 | 
			
		||||
           if (!ShutdownHandler.ConfirmShutdown(false))
 | 
			
		||||
              ShutdownHandler.countdown.Cancel();
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
        if (!Interact && !cRecordControls::Active() && !cCutter::Active() && !Interface->HasSVDRPConnection() && cRemote::LastActivity() > ACTIVITYTIMEOUT) {
 | 
			
		||||
           // Handle housekeeping tasks
 | 
			
		||||
 | 
			
		||||
           // Shutdown:
 | 
			
		||||
           // Check whether VDR will be ready for shutdown in SHUTDOWNWAIT seconds:
 | 
			
		||||
           time_t Soon = time(NULL) + SHUTDOWNWAIT;
 | 
			
		||||
           if (ShutdownHandler.IsUserInactive(Soon) && ShutdownHandler.Retry(Soon) && !ShutdownHandler.countdown) {
 | 
			
		||||
              if (ShutdownHandler.ConfirmShutdown(false))
 | 
			
		||||
                 // Time to shut down - start final countdown:
 | 
			
		||||
                 ShutdownHandler.countdown.Start(tr("VDR will shut down in %s minutes"), SHUTDOWNWAIT); // the placeholder is really %s!
 | 
			
		||||
              // Dont try to shut down again for a while:
 | 
			
		||||
              ShutdownHandler.SetRetry(SHUTDOWNRETRY);
 | 
			
		||||
              }
 | 
			
		||||
           // Countdown run down to 0?
 | 
			
		||||
           if (ShutdownHandler.countdown.Done()) {
 | 
			
		||||
              // Timed out, now do a final check:
 | 
			
		||||
              if (ShutdownHandler.IsUserInactive() && ShutdownHandler.ConfirmShutdown(false))
 | 
			
		||||
                 ShutdownHandler.DoShutdown(false);
 | 
			
		||||
              // Do this again a bit later:
 | 
			
		||||
              ShutdownHandler.SetRetry(SHUTDOWNRETRY);
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
           // Disk housekeeping:
 | 
			
		||||
           RemoveDeletedRecordings();
 | 
			
		||||
           cSchedules::Cleanup();
 | 
			
		||||
           // Plugins housekeeping:
 | 
			
		||||
           PluginManager.Housekeeping();
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
        // Main thread hooks of plugins:
 | 
			
		||||
        PluginManager.MainThreadHook();
 | 
			
		||||
        }
 | 
			
		||||
  if (Interrupted)
 | 
			
		||||
     isyslog("caught signal %d", Interrupted);
 | 
			
		||||
 | 
			
		||||
  if (ShutdownHandler.EmergencyExitRequested())
 | 
			
		||||
     esyslog("emergency exit requested - shutting down");
 | 
			
		||||
 | 
			
		||||
Exit:
 | 
			
		||||
 | 
			
		||||
@@ -1227,7 +1210,7 @@ Exit:
 | 
			
		||||
  Remotes.Clear();
 | 
			
		||||
  Audios.Clear();
 | 
			
		||||
  Skins.Clear();
 | 
			
		||||
  if (ExitCode != 2) {
 | 
			
		||||
  if (ShutdownHandler.GetExitCode() != 2) {
 | 
			
		||||
     Setup.CurrentChannel = cDevice::CurrentChannel();
 | 
			
		||||
     Setup.CurrentVolume  = cDevice::CurrentVolume();
 | 
			
		||||
     Setup.Save();
 | 
			
		||||
@@ -1238,14 +1221,12 @@ Exit:
 | 
			
		||||
  ReportEpgBugFixStats();
 | 
			
		||||
  if (WatchdogTimeout > 0)
 | 
			
		||||
     dsyslog("max. latency time %d seconds", MaxLatencyTime);
 | 
			
		||||
  isyslog("exiting");
 | 
			
		||||
  isyslog("exiting, exit code %d", ShutdownHandler.GetExitCode());
 | 
			
		||||
  if (ShutdownHandler.EmergencyExitRequested())
 | 
			
		||||
     esyslog("emergency exit!");
 | 
			
		||||
  if (SysLogLevel > 0)
 | 
			
		||||
     closelog();
 | 
			
		||||
  if (HasStdin)
 | 
			
		||||
     tcsetattr(STDIN_FILENO, TCSANOW, &savedTm);
 | 
			
		||||
  if (cThread::EmergencyExit()) {
 | 
			
		||||
     esyslog("emergency exit!");
 | 
			
		||||
     return 1;
 | 
			
		||||
     }
 | 
			
		||||
  return ExitCode;
 | 
			
		||||
  return ShutdownHandler.GetExitCode();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user