summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS28
-rw-r--r--HISTORY46
-rw-r--r--INSTALL3
-rw-r--r--Makefile4
-rw-r--r--PLUGINS.html4
-rw-r--r--PLUGINS/src/hello/i18n.c26
-rw-r--r--channels.conf26
-rw-r--r--config.h6
-rw-r--r--cutter.c5
-rw-r--r--device.c17
-rw-r--r--device.h7
-rw-r--r--dvbdevice.c4
-rw-r--r--dvbdevice.h4
-rw-r--r--epg.c4
-rw-r--r--font.c11
-rw-r--r--font.h8
-rw-r--r--fontfix-iso8859-1.c2
-rw-r--r--fontfix-iso8859-13.c2
-rw-r--r--fontfix-iso8859-15.c2
-rw-r--r--fontfix-iso8859-2.c2
-rw-r--r--fontfix-iso8859-5.c2
-rw-r--r--fontfix-iso8859-7.c2
-rw-r--r--fontosd-iso8859-1.c2
-rw-r--r--fontosd-iso8859-13.c2
-rw-r--r--fontosd-iso8859-15.c2
-rw-r--r--fontosd-iso8859-2.c3
-rw-r--r--fontosd-iso8859-5.c2
-rw-r--r--fontosd-iso8859-7.c2
-rw-r--r--fontsml-iso8859-1.c2
-rw-r--r--fontsml-iso8859-13.c2
-rw-r--r--fontsml-iso8859-15.c2
-rw-r--r--fontsml-iso8859-2.c2
-rw-r--r--fontsml-iso8859-5.c2
-rw-r--r--fontsml-iso8859-7.c2
-rw-r--r--genfontfile.c2
-rw-r--r--i18n.c276
-rw-r--r--i18n.h4
-rw-r--r--menu.c8
-rw-r--r--menuitems.c6
-rw-r--r--osd.c8
-rw-r--r--osd.h6
-rw-r--r--osdbase.c14
-rw-r--r--recording.c3
-rw-r--r--remux.c349
-rwxr-xr-xrunvdr11
-rw-r--r--skinclassic.c17
-rw-r--r--skins.c12
-rw-r--r--skins.h15
-rw-r--r--skinsttng.c20
-rw-r--r--symbols/arrowdown.xpm2
-rw-r--r--symbols/arrowup.xpm2
-rw-r--r--symbols/audio.xpm2
-rw-r--r--symbols/audioleft.xpm2
-rw-r--r--symbols/audioright.xpm2
-rw-r--r--symbols/audiostereo.xpm2
-rw-r--r--symbols/dolbydigital.xpm2
-rw-r--r--symbols/encrypted.xpm2
-rw-r--r--symbols/ffwd.xpm2
-rw-r--r--symbols/ffwd1.xpm2
-rw-r--r--symbols/ffwd2.xpm2
-rw-r--r--symbols/ffwd3.xpm2
-rw-r--r--symbols/frew.xpm2
-rw-r--r--symbols/frew1.xpm2
-rw-r--r--symbols/frew2.xpm2
-rw-r--r--symbols/frew3.xpm2
-rw-r--r--symbols/mute.xpm2
-rw-r--r--symbols/pause.xpm2
-rw-r--r--symbols/play.xpm2
-rw-r--r--symbols/radio.xpm2
-rw-r--r--symbols/recording.xpm2
-rw-r--r--symbols/sfwd.xpm2
-rw-r--r--symbols/sfwd1.xpm2
-rw-r--r--symbols/sfwd2.xpm2
-rw-r--r--symbols/sfwd3.xpm2
-rw-r--r--symbols/srew.xpm2
-rw-r--r--symbols/srew1.xpm2
-rw-r--r--symbols/srew2.xpm2
-rw-r--r--symbols/srew3.xpm2
-rw-r--r--symbols/teletext.xpm2
-rw-r--r--symbols/volume.xpm2
-rw-r--r--timers.c11
-rw-r--r--tools.c174
-rw-r--r--tools.h13
-rw-r--r--transfer.c3
-rw-r--r--transfer.h3
-rw-r--r--vdr.c16
86 files changed, 962 insertions, 311 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index b6234d2..7a65cee 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -215,6 +215,7 @@ Stefan Huelswitt <huels@iname.com>
path names
for suggesting that the SVDRP command GRAB should allow file names without extension
again
+ for reporting a problem with channel up/down switching on single card systems
Ulrich Röder <roeder@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than 27500
@@ -270,6 +271,7 @@ Artur Skawina <skawina@geocities.com>
for improving the font file generation in the Makefile
for pointing out a problem with the ERR macro defined by ncurses.h
for a patch that contained a fix for checking toFile in cCuttingThread::Action()
+ for improving cUnbufferedFile
Werner Fink <werner@suse.de>
for making I/O more robust by handling EINTR
@@ -548,6 +550,8 @@ Helmut Auer <vdr@helmutauer.de>
for suggesting to give a message when an instant recording is started
fpr suggesting to retry a shutdown after a while
for separating the 'install' target into several individual targets
+ for reporting a problem with scrolling with Up/Down in case there are non-selectable
+ items at the beginning of the menu
Jeremy Hall <jhall@UU.NET>
for fixing an incomplete initialization of the filter parameters in eit.c
@@ -843,6 +847,8 @@ Ludwig Nussel <ludwig.nussel@web.de>
Thomas Koch <tom@harhar.net>
for his support in keeping the Premiere World channels up to date in 'channels.conf'
for implementing the SVDRP command STAT
+ for reporting a problem with "pending" timers that blocked others that actually
+ could record
Stefan Hußfeldt <vdr@marvin.on-luebeck.de>
for his help in keeping 'channels.conf.cable' up to date
@@ -880,6 +886,8 @@ Christian Jacobsen <christian.jacobsen@stageholding.de>
for reporting a problem in case a station defines all 32 audio PIDs
for suggestions and experiments regarding the buffer reserve in cTransfer
for reporting a problem with 'summary.vdr' files with more than two empty lines
+ for reporting a problem with multiple entries of the same subdirectory in the
+ "Recordings" menu
Andreas Mair <Andreas.Mair@linogate.com>
for reporting a short display of the main menu if a plugin displays its own OSD and
@@ -944,6 +952,7 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
for a patch that was used to implement automatic cursor advance when entering text
via the numeric keys
for reporting a problem with expired timers when shutting down via the Power key
+ for fixing handling the "Blue" key in the "Schedule" menu for the current channel
Ralf Klueber <ralf.klueber@vodafone.com>
for reporting a bug in cutting a recording if there is only a single editing mark
@@ -1040,6 +1049,7 @@ Reinhard Nissl <rnissl@gmx.de>
DiSEqC data) if the lock is lost
for fixing handling TS packets in cTS2PES
for adding a mutex to synchronize cDevice::PlayPesPacket() and SetCurrentAudioTrack()
+ for a suggestion that lead to implementing cDevice::Transferring()
Richard Robson <richard_robson@beeb.net>
for reporting freezing replay if a timer starts while in Transfer Mode from the
@@ -1061,6 +1071,7 @@ Robert Bartl <robert@bartl.priv.at>
Sebastian Frei <sebastian@schnapsleichen.de>
for his support in keeping 'channels.conf' up-to-date.
+ for suggesting to rename the Makefile target 'plugins-clean' to 'clean-plugins'
Rene Bartsch <ml@bartschnet.de>
for reporting a bug in setting the primary device in case none of the devices
@@ -1292,6 +1303,9 @@ Marco Schlüßler <marco@lordzodiac.de>
for figuring out some obscure length bytes the the CA PMT Reply data of AlphaCrypt CAMs
for fixing handling OSD areas that have invalid sizes
for removing unused variables in skinclassic.c and skinsttng.c
+ for removing leftover 'needsBufferReserve' variable from cTransfer
+ for adding an 'Id' parameter to cDevice::PlayAudio() to allow plugins to easier
+ process the audio data
Jürgen Schmitz <j.schmitz@web.de>
for reporting a bug in displaying the current channel when switching via the SVDRP
@@ -1330,6 +1344,7 @@ Kimmo Tykkala <tykkala@iki.fi>
Arthur Konovalov <kasjas@hot.ee>
for translating OSD texts to the Estonian language
for fixing a missing ',' in the Greek OSD texts
+ for fixing a missing ',' in the Swedish OSD texts
Milos Kapoun <m.kapoun@cra.cz>
for suggesting to skip code table info in SI data
@@ -1351,6 +1366,10 @@ Udo Richter <udo_richter@gmx.de>
for making the Makefile report a summary of failed plugins
for reporting a problem with the new handling of k_Repeat keypresses in channel
switching
+ for reporting a problem with auto advance in string entry fields when pressing
+ Up/Down in insert mode
+ for fixing handling the "Setup/OSD/Menu button closes" option when set to 'yes' in
+ case a replay is active
Sven Kreiensen <svenk@kammer.uni-hannover.de>
for his help in keeping 'channels.conf.terr' up to date
@@ -1414,6 +1433,7 @@ Darren Salt <linux@youmustbejoking.demon.co.uk>
for suggesting to write grabbed images to the SVDRP connection encoded in base64
for suggesting to open the file handle in the SVDRP GRAB command in a way that
it won't follow symbolic links, and to canonicalize the file name
+ for making all font and image data 'const'
Sean Carlos <seanc@libero.it>
for translating OSD texts to the Italian language
@@ -1494,6 +1514,7 @@ Ville Skyttä <ville.skytta@iki.fi>
for removing the obsolete "ca.conf" section from vdr.1
for making the cLircRemote try to reestablish the connection to the LIRC daemon
in case it breaks
+ for enabling generating a core dump if VDR is run with a different user id
Steffen Beyer <cpunk@reactor.de>
for fixing setting the colored button help after deleting a recording in case the next
@@ -1590,6 +1611,7 @@ Alexander Rieger <Alexander.Rieger@inka.de>
for fixing handling color buttons in cMenuEditStrItem
for making the '.update' file in the video directory be touched when a recording is
added or deleted, so that other VDR instances can update their lists
+ for adding cSkin::GetTextAreaWidth() and cSkin::GetTextAreaFont()
Philip Prindeville <philipp_subx@redfish-solutions.com>
for updates to 'sources.conf'
@@ -1710,3 +1732,9 @@ Daniel Karsubka <dkar@gmx.de>
Suur Karu <suurkaru@fastmail.fm>
for reporting a problem with the tuning timeout for channels that have low symbol
rates
+
+Ronny Kornexl <ronny.kornexl@online.de>
+ for reporting a problem with setting "No title" for broken event data
+
+Bárta Vladimír <vladimir.barta@k2atmitec.cz>
+ for translating OSD texts to the Czech language
diff --git a/HISTORY b/HISTORY
index 62ab4db..0302c8f 100644
--- a/HISTORY
+++ b/HISTORY
@@ -4270,3 +4270,49 @@ Video Disk Recorder Revision History
system, it is now tried again after 5 minutes (suggested by Helmut Auer).
- Separated the 'install' target into several individual targets; renamed the
'plugins-install' target to 'install-plugins' (thanks to Helmut Auer).
+
+2006-02-05: Version 1.3.42
+
+- Removed leftover 'needsBufferReserve' variable from cTransfer (thanks to Marco
+ Schlüßler).
+- Fixed setting "No title" for broken event data (reported by Ronny Kornexl).
+- Fixed channel up/down switching on single card systems (reported by Stefan
+ Huelswitt).
+- Fixed handling "pending" timers that blocked others that actually could record
+ (reported by Thomas Koch).
+- Speeded up cVideoRepacker (thanks to Reinhard Nissl).
+- Added an 'Id' parameter to cDevice::PlayAudio() to allow plugins to easier
+ process the audio data (thanks to Marco Schlüßler).
+- Added Czech language texts (thanks to Bárta Vladimír).
+ Plugin authors may want to add the new entries to their I18N texts and contact
+ the translators to have their texts translated. Note that there are now 21
+ different OSD languages, so please make sure you have 21 versions for each of
+ your texts.
+- Updated the Polish OSD texts (thanks to Jaroslaw Swierczynski).
+- Fixed auto advance in string entry fields when pressing Up/Down in insert mode
+ (reported by Udo Richter).
+- Fixed handling the "Setup/OSD/Menu button closes" option when set to 'yes' in
+ case a replay is active (thanks to Udo Richter).
+- Improved cUnbufferedFile; USE_FADVISE is now defined in tools.c by default, so
+ if you don't want to use "fadvise" you need to comment out that line (thanks to
+ Artur Skawina).
+- Fixed a missing ',' in the Swedish OSD texts (thanks to Arthur Konovalov).
+- cDevice::Transferring() can now be used to determine whether the (primary)
+ device is currently playing in Transfer Mode (based on a suggestion by
+ Reinhard Nissl).
+- The 'runvdr' script no longer uses the $VDRUSR environment variable to set
+ the user id under which 'vdr' shall run. Just add the '-u username' option
+ when you call 'runvdr'.
+- Fixed multiple entries of the same subdirectory in the "Recordings" menu
+ (reported by Christian Jacobsen).
+- Enabled generating a core dump if VDR is run with a different user id (thanks
+ to Ville Skyttä).
+- Fixed handling the "Blue" key in the "Schedule" menu for the current channel
+ (thanks to Rolf Ahrenberg).
+- Renamed the Makefile target 'plugins-clean' to 'clean-plugins' (suggested by
+ Sebastian Frei).
+- Made all font and image data 'const' (thanks to Darren Salt).
+- Fixed scrolling with Up/Down in case there are non-selectable items at the
+ beginning or end of the menu (reported by Helmut Auer).
+- Added cSkin::GetTextAreaWidth() and cSkin::GetTextAreaFont(), so that a plugin
+ that wants to do special text formatting can do so (thanks to Alexander Rieger).
diff --git a/INSTALL b/INSTALL
index 3be9c34..c4b2a59 100644
--- a/INSTALL
+++ b/INSTALL
@@ -136,7 +136,8 @@ watchdog timer to restart the program in case something happens that
causes a program hangup. If you change the command line options for the
call to the VDR program, be sure to NOT use the '-d' option! Otherwise
VDR will go into 'deamon' mode and the initial program call will return
-immediately!
+immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
+option to run the actual 'vdr' program under a different user id.
Setting the system time:
------------------------
diff --git a/Makefile b/Makefile
index a642751..60373a3 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
-# $Id: Makefile 1.84 2006/01/29 14:50:34 kls Exp $
+# $Id: Makefile 1.85 2006/02/05 13:37:11 kls Exp $
.DELETE_ON_ERROR:
@@ -193,7 +193,7 @@ plugins: include-dir
done;\
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; fi
-plugins-clean:
+clean-plugins:
@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/src/$$i" clean; done
@-rm -f $(PLUGINDIR)/lib/libvdr-*.so.$(VDRVERSION)
diff --git a/PLUGINS.html b/PLUGINS.html
index bec5127..9515174 100644
--- a/PLUGINS.html
+++ b/PLUGINS.html
@@ -175,7 +175,7 @@ is not used, the path to the plugin directory has be be given to VDR through the
<p>
The VDR <tt>Makefile</tt> contains the target <tt>plugins</tt>, which calls
<tt>make all</tt> in every directory found under <tt>VDR/PLUGINS/src</tt>,
-plus the target <tt>plugins-clean</tt>, which calls <tt>make clean</tt> in
+plus the target <tt>clean-plugins</tt>, which calls <tt>make clean</tt> in
each of these directories.
<p>
If you download a plugin <a href="#Building the distribution package">package</a>
@@ -187,7 +187,7 @@ and will unpack into a directory named
<p>
<tt>hello-0.0.1</tt>
<p>
-To use the <tt>plugins</tt> and <tt>plugins-clean</tt> targets from the VDR <tt>Makefile</tt>
+To use the <tt>plugins</tt> and <tt>clean-plugins</tt> targets from the VDR <tt>Makefile</tt>
you need to unpack such an archive into the <tt>VDR/PLUGINS/src</tt> directory and
create a symbolic link with the basic plugin name, as in
diff --git a/PLUGINS/src/hello/i18n.c b/PLUGINS/src/hello/i18n.c
index 304233b..62446a6 100644
--- a/PLUGINS/src/hello/i18n.c
+++ b/PLUGINS/src/hello/i18n.c
@@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
- * $Id: i18n.c 1.4 2004/01/16 13:28:23 kls Exp $
+ * $Id: i18n.c 1.5 2006/02/04 10:51:41 kls Exp $
*/
#include "i18n.h"
@@ -26,6 +26,10 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"¿àØÒÕâ!",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "Ahoj",
},
{ "Hello world!",
"Hallo Welt!",
@@ -44,6 +48,10 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"·ÔàÐÒáâÒãÙ ÜØà!",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "Ahoj svìte!",
},
{ "Howdy folks!",
"Tach zusammen!",
@@ -62,6 +70,10 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"ºÐÚ ßÞÖØÒÐÕâÕ?",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "Nazdar vespolek!",
},
{ "A friendly greeting",
"Ein freundlicher Gruß",
@@ -80,6 +92,10 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "Pøátelský pozdrav",
},
{ "Greeting time (s)",
"Dauer des Grußes (s)",
@@ -98,6 +114,10 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "Èas pozdravu (s)",
},
{ "Use alternate greeting",
"Alternativen Gruß verwenden",
@@ -116,6 +136,10 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "Pou¾ít alternativní pozdrav",
},
{ NULL }
};
diff --git a/channels.conf b/channels.conf
index f1fdbc9..54550c4 100644
--- a/channels.conf
+++ b/channels.conf
@@ -1,3 +1,5 @@
+: first line
+: second line
RTL Television,RTL;RTL World:12187:hC34:S19.2E:27500:163:104=deu:105:0:12003:1:1089:0
SAT.1;ProSiebenSat.1:12480:vC34:S19.2E:27500:1791:1792=deu;1795=deu:34:0:46:133:33:0
ProSieben;ProSiebenSat.1:12480:vC34:S19.2E:27500:255:256=deu;257=deu:32:0:898:133:33:0
@@ -13,10 +15,10 @@ SÜDWEST Ferns. BW;ARD:11836:hC34:S19.2E:27500:801:802=deu:804:0:28113:1:1101:0
Phoenix;ARD:11836:hC34:S19.2E:27500:901:902=deu:904:0:28114:1:1101:0
ZDF;ZDFvision:11953:hC34:S19.2E:27500:110:120=deu,121=2ch;125=dd:130:0:28006:1:1079:0
3sat;ZDFvision:11953:hC34:S19.2E:27500:210:220=deu,221=2ch;225=dd:230:0:28007:1:1079:0
-KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320=deu:330:0:28008:1:1079:0
+KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320:0:0:28008:1:1079:0
arte;ARD:11836:hC34:S19.2E:27500:401:402=deu,403=fra:404:0:28109:1:1101:0
-ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:1762,D05,1702,1801:13001:1:1117:0
-ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu;503=deu:505:1762,D05,1702,1801:13002:1:1117:0
+ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:0:13001:1:1117:0
+ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu,502=deu;503=deu:505:1762,D05,1702,1801:13002:1:1117:0
ZDFinfokanal;ZDFvision:11953:hC34:S19.2E:27500:610:620=deu:130:0:28011:1:1079:0
CNN Int.;CNN:11778:vC34:S19.2E:27500:165:100=eng:47:0:28522:1:1068:0
Super RTL,S RTL;RTL World:12187:hC34:S19.2E:27500:165:120=deu:65:0:12040:1:1089:0
@@ -28,7 +30,7 @@ DSF;BetaDigital:12480:vC34:S19.2E:27500:1023:1024=deu:39:0:900:133:33:0
HSE24,HSE24;BetaDigital:12480:vC34:S19.2E:27500:1279:1280=deu:37:0:40:133:33:0
Bloomberg TV Germany;Bloomberg:12551:vC56:S19.2E:22000:162:99=deu:0:0:12160:1:1108:0
EURONEWS;CSAT:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,91=rus,98=por,99=deu:0:0:8004:1:1070:0
-rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28205:1:1073:0
+rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:501:502=deu:504:0:28205:1:1073:0
Sky News:11597:vC56:S19.2E:22000:305+131:306=eng:0:0:28707:1:1026:0
Veronica/JETIX;CANALDIGITAAL:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,100:5020:53:1109:0
BVN;CANALDIGITAAL:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0
@@ -45,14 +47,14 @@ MDR FERNSEHEN;ARD:12109:hC34:S19.2E:27500:401:402=deu:404:0:28204:1:1073:0
rbb Berlin;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0
:Premiere World
PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1801,1722,1702:8:133:2:0
-PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu,513=deu;515=deu:32:1:10:133:2:0
-PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu,1793=deu;1795=deu:32:1:11:133:2:0
+PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu,513=deu;515=deu:32:1801,1722,1702:10:133:2:0
+PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu,1793=deu;1795=deu:32:1801,1722,1702:11:133:2:0
PREMIERE 3,PREM 3;PREMIERE:11797:hC34:S19.2E:27500:2303:2304=deu,2305=deu:32:1722,1702,1801:43:133:2:0
-PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1:9:133:2:0
+PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1801,1722,1702:9:133:2:0
PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu:32:1722,1702,1801:29:133:2:0
PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1702,1722,1801:41:133:2:0
PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1801,1702,1722:20:133:2:0
-DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1:34:133:17:0
+DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1801,1722,1702:34:133:17:0
:Premiere Direkt
PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0
:PW Erotic
@@ -113,14 +115,14 @@ ParaComedy 1;BSkyB:12187:hC23:S28.2E:27500:518+8190:666=eng,686=NAR:582:960,961:
Paramount;BSkyB:11526:vC23:S28.2E:27500:2317+2306:2318=eng:2319:960,961:50305:2:2404:0
ParaComedy 2;BSkyB:11914:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:4504:2:2011:0
Discovery;BSkyB:11875:hC23:S28.2E:27500:2308:2310=eng,2311=NAR:2309:960,961:6201:2:2009:0
-Sky Movies 1;BSkyB:11836:hC23:S28.2E:27500:518+8190:646=eng,653=NAR;686=eng:582:960,961:4303:2:2007:0
-Sky Movies 2;BSkyB:11836:hC23:S28.2E:27500:519+8190:647=eng,667=NAR;687=eng:583:960,961:4302:2:2007:0
-Sky Movies 3;BSkyB:11836:hC23:S28.2E:27500:520+8190:648=eng,654=NAR;688=eng:584:960,961:4403:2:2007:0
+Sky Movies 1;BSkyB:11836:hC23:S28.2E:27500:518+8190:646=eng,653=NAR;666=eng:582:960,961:4303:2:2007:0
+Sky Movies 2;BSkyB:11836:hC23:S28.2E:27500:519+8190:647=eng,655=NAR;667=eng:583:960,961:4302:2:2007:0
+Sky Movies 3;BSkyB:11836:hC23:S28.2E:27500:520+8190:648=eng,654=NAR;668=eng:584:960,961:4403:2:2007:0
Sky Movies 4;BSkyB:11914:hC23:S28.2E:27500:512+8190:640=eng,660=NAR:576:960,961:4402:2:2011:0
Sky Movies 5;BSkyB:11914:hC23:S28.2E:27500:515+8190:643=eng,663=NAR:579:960,961:4503:2:2011:0
Sky Movies 6;BSkyB:11914:hC23:S28.2E:27500:513+8190:641=eng,661=NAR:577:960,961:4502:2:2011:0
Sky Movies 7;BSkyB:12285:vC23:S28.2E:27500:515+8190:643=eng,663=NAR:579:960,961:4603:2:2030:0
-Sky Movies 8;BSkyB:11836:hC23:S28.2E:27500:515+8190:643=eng,663=NAR:579:960,961:5502:2:2007:0
+Sky Movies 8;BSkyB:11836:hC23:S28.2E:27500:515+8190:643=eng,656=NAR:579:960,961:5502:2:2007:0
Sky Movies 9;BSkyB:12285:vC23:S28.2E:27500:518+8190:646=eng,666=NAR:582:960,961:4602:2:2030:0
Sky Cinema 1;BSkyB:12285:vC23:S28.2E:27500:519+8190:647=eng,667=NAR:583:960,961:4809:2:2030:0
Sky Cinema 2;BSkyB:12285:vC23:S28.2E:27500:517+8190:645=eng,665=NAR:581:960,961:4802:2:2030:0
diff --git a/config.h b/config.h
index 9920d00..187767f 100644
--- a/config.h
+++ b/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.242 2006/01/27 13:27:41 kls Exp $
+ * $Id: config.h 1.243 2006/01/29 17:24:53 kls Exp $
*/
#ifndef __CONFIG_H
@@ -19,8 +19,8 @@
#include "i18n.h"
#include "tools.h"
-#define VDRVERSION "1.3.41"
-#define VDRVERSNUM 10341 // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION "1.3.42"
+#define VDRVERSNUM 10342 // Version * 10000 + Major * 100 + Minor
#define MAXPRIORITY 99
#define MAXLIFETIME 99
diff --git a/cutter.c b/cutter.c
index 6d3a152..cb5afd3 100644
--- a/cutter.c
+++ b/cutter.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: cutter.c 1.12 2006/01/27 13:45:00 kls Exp $
+ * $Id: cutter.c 1.14 2006/02/05 11:06:47 kls Exp $
*/
#include "cutter.h"
@@ -66,6 +66,8 @@ void cCuttingThread::Action(void)
toFile = toFileName->Open();
if (!fromFile || !toFile)
return;
+ fromFile->SetReadAhead(MEGABYTE(20));
+ toFile->SetReadAhead(MEGABYTE(20));
int Index = Mark->position;
Mark = fromMarks.Next(Mark);
int FileSize = 0;
@@ -90,6 +92,7 @@ void cCuttingThread::Action(void)
if (fromIndex->Get(Index++, &FileNumber, &FileOffset, &PictureType, &Length)) {
if (FileNumber != CurrentFileNumber) {
fromFile = fromFileName->SetOffset(FileNumber, FileOffset);
+ fromFile->SetReadAhead(MEGABYTE(20));
CurrentFileNumber = FileNumber;
}
if (fromFile) {
diff --git a/device.c b/device.c
index 0f19e3b..6a03ade 100644
--- a/device.c
+++ b/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.121 2006/01/08 11:39:37 kls Exp $
+ * $Id: device.c 1.123 2006/02/04 14:58:24 kls Exp $
*/
#include "device.h"
@@ -924,12 +924,17 @@ bool cDevice::Replaying(void) const
return player != NULL;
}
+bool cDevice::Transferring(void) const
+{
+ return dynamic_cast<cTransfer *>(player) != NULL;
+}
+
bool cDevice::AttachPlayer(cPlayer *Player)
{
if (CanReplay()) {
if (player)
Detach(player);
- if (!dynamic_cast<cTransfer *>(Player))
+ if (!Transferring())
ClrAvailableTracks();
pesAssembler->Reset();
player = Player;
@@ -977,7 +982,7 @@ int cDevice::PlayVideo(const uchar *Data, int Length)
return -1;
}
-int cDevice::PlayAudio(const uchar *Data, int Length)
+int cDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
{
return -1;
}
@@ -1000,7 +1005,7 @@ int cDevice::PlayPesPacket(const uchar *Data, int Length, bool VideoOnly)
case 0xC0 ... 0xDF: // audio
SetAvailableTrack(ttAudio, c - 0xC0, c);
if (!VideoOnly && c == availableTracks[currentAudioTrack].id) {
- w = PlayAudio(Start, d);
+ w = PlayAudio(Start, d, c);
if (FirstLoop)
Audios.PlayAudio(Data, Length, c);
}
@@ -1026,7 +1031,7 @@ pre_1_3_19_PrivateStreamDeteced:
if (Setup.UseDolbyDigital) {
SetAvailableTrack(ttDolby, SubStreamIndex, SubStreamId);
if (!VideoOnly && SubStreamId == availableTracks[currentAudioTrack].id) {
- w = PlayAudio(Start, d);
+ w = PlayAudio(Start, d, SubStreamId);
if (FirstLoop)
Audios.PlayAudio(Data, Length, SubStreamId);
}
@@ -1035,7 +1040,7 @@ pre_1_3_19_PrivateStreamDeteced:
case 0xA0: // LPCM
SetAvailableTrack(ttAudio, SubStreamIndex, SubStreamId);
if (!VideoOnly && SubStreamId == availableTracks[currentAudioTrack].id) {
- w = PlayAudio(Start, d);
+ w = PlayAudio(Start, d, SubStreamId);
if (FirstLoop)
Audios.PlayAudio(Data, Length, SubStreamId);
}
diff --git a/device.h b/device.h
index eb409f9..e6e436b 100644
--- a/device.h
+++ b/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.70 2006/01/08 10:10:26 kls Exp $
+ * $Id: device.h 1.72 2006/02/04 14:22:08 kls Exp $
*/
#ifndef __DEVICE_H
@@ -424,9 +424,10 @@ protected:
///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN).
///< \return Returns the number of bytes actually taken from Data, or -1
///< in case of an error.
- virtual int PlayAudio(const uchar *Data, int Length);
+ virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
///< Plays the given data block as audio.
///< Data points to exactly one complete PES packet of the given Length.
+ ///< Id indicates the type of audio data this packet holds.
///< PlayAudio() shall process the packet either as a whole (returning
///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN).
///< \return Returns the number of bytes actually taken from Data, or -1
@@ -483,6 +484,8 @@ public:
///< guaranteed to always receive complete PES packets.
bool Replaying(void) const;
///< Returns true if we are currently replaying.
+ bool Transferring(void) const;
+ ///< Returns true if we are currently in Transfer Mode.
void StopReplay(void);
///< Stops the current replay session (if any).
bool AttachPlayer(cPlayer *Player);
diff --git a/dvbdevice.c b/dvbdevice.c
index ee8c623..f5f5f4e 100644
--- a/dvbdevice.c
+++ b/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.151 2006/01/28 15:37:01 kls Exp $
+ * $Id: dvbdevice.c 1.152 2006/02/04 10:21:51 kls Exp $
*/
#include "dvbdevice.h"
@@ -1169,7 +1169,7 @@ int cDvbDevice::PlayVideo(const uchar *Data, int Length)
return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
}
-int cDvbDevice::PlayAudio(const uchar *Data, int Length)
+int cDvbDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
{
return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
}
diff --git a/dvbdevice.h b/dvbdevice.h
index cc9d126..ac84a94 100644
--- a/dvbdevice.h
+++ b/dvbdevice.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbdevice.h 1.37 2005/12/29 13:33:12 kls Exp $
+ * $Id: dvbdevice.h 1.38 2006/02/04 10:21:51 kls Exp $
*/
#ifndef __DVBDEVICE_H
@@ -119,7 +119,7 @@ protected:
virtual bool CanReplay(void) const;
virtual bool SetPlayMode(ePlayMode PlayMode);
virtual int PlayVideo(const uchar *Data, int Length);
- virtual int PlayAudio(const uchar *Data, int Length);
+ virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
public:
virtual int64_t GetSTC(void);
virtual void TrickSpeed(int Speed);
diff --git a/epg.c b/epg.c
index d69158e..efc5455 100644
--- a/epg.c
+++ b/epg.c
@@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
*
- * $Id: epg.c 1.57 2006/01/29 14:17:33 kls Exp $
+ * $Id: epg.c 1.58 2006/02/03 13:16:54 kls Exp $
*/
#include "epg.h"
@@ -321,7 +321,7 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
}
}
break;
- case 'e': if (!Event->Title())
+ case 'e': if (Event && !Event->Title())
Event->SetTitle(tr("No title"));
Event = NULL;
break;
diff --git a/font.c b/font.c
index 6269f2b..87440d2 100644
--- a/font.c
+++ b/font.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: font.c 1.11 2005/01/14 13:25:35 kls Exp $
+ * $Id: font.c 1.12 2006/02/05 13:49:10 kls Exp $
*/
#include "config.h"
@@ -35,9 +35,10 @@
#include "fontfix-iso8859-15.c"
#include "fontosd-iso8859-15.c"
#include "fontsml-iso8859-15.c"
+
// --- cFont -----------------------------------------------------------------
-static void *FontData[eDvbCodeSize][eDvbFontSize] = {
+static const void *const FontData[eDvbCodeSize][eDvbFontSize] = {
{ FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1 },
{ FontOsd_iso8859_2, FontFix_iso8859_2, FontSml_iso8859_2 },
{ FontOsd_iso8859_5, FontFix_iso8859_5, FontSml_iso8859_5 },
@@ -58,12 +59,12 @@ static const char *FontCode[eDvbCodeSize] = {
eDvbCode cFont::code = code_iso8859_1;
cFont *cFont::fonts[eDvbFontSize] = { NULL };
-cFont::cFont(void *Data)
+cFont::cFont(const void *Data)
{
SetData(Data);
}
-void cFont::SetData(void *Data)
+void cFont::SetData(const void *Data)
{
if (Data) {
height = ((tCharData *)Data)->height;
@@ -112,7 +113,7 @@ void cFont::SetCode(eDvbCode Code)
}
}
-void cFont::SetFont(eDvbFont Font, void *Data)
+void cFont::SetFont(eDvbFont Font, const void *Data)
{
delete fonts[Font];
fonts[Font] = new cFont(Data ? Data : FontData[code][Font]);
diff --git a/font.h b/font.h
index b5a21a3..2a10429 100644
--- a/font.h
+++ b/font.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: font.h 1.11 2005/03/19 15:51:19 kls Exp $
+ * $Id: font.h 1.12 2006/02/05 13:46:36 kls Exp $
*/
#ifndef __FONT_H
@@ -43,9 +43,9 @@ private:
const tCharData *data[NUMCHARS];
int height;
public:
- cFont(void *Data);
+ cFont(const void *Data);
virtual ~cFont() {}
- void SetData(void *Data);
+ void SetData(const void *Data);
virtual int Width(unsigned char c) const { return data[c]->width; }
///< Returns the width of the given character.
virtual int Width(const char *s) const;
@@ -59,7 +59,7 @@ public:
const tCharData *CharData(unsigned char c) const { return data[c]; }
static bool SetCode(const char *Code);
static void SetCode(eDvbCode Code);
- static void SetFont(eDvbFont Font, void *Data = NULL);
+ static void SetFont(eDvbFont Font, const void *Data = NULL);
static const cFont *GetFont(eDvbFont Font);
};
diff --git a/fontfix-iso8859-1.c b/fontfix-iso8859-1.c
index 9b806ca..42a4c99 100644
--- a/fontfix-iso8859-1.c
+++ b/fontfix-iso8859-1.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_1[][28] = {
+static const cFont::tPixelData FontFix_iso8859_1[][28] = {
{ // 32
15, 26,
0x00000000, // ...............
diff --git a/fontfix-iso8859-13.c b/fontfix-iso8859-13.c
index f6b3abe..f42be8d 100644
--- a/fontfix-iso8859-13.c
+++ b/fontfix-iso8859-13.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_13[][28] = {
+static const cFont::tPixelData FontFix_iso8859_13[][28] = {
{ // 32
15, 26,
0x00000000, // ...............
diff --git a/fontfix-iso8859-15.c b/fontfix-iso8859-15.c
index 25a1efa..c4c5aa0 100644
--- a/fontfix-iso8859-15.c
+++ b/fontfix-iso8859-15.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_15[][28] = {
+static const cFont::tPixelData FontFix_iso8859_15[][28] = {
{ // 32
15, 26,
0x00000000, // ...............
diff --git a/fontfix-iso8859-2.c b/fontfix-iso8859-2.c
index e27bbdf..c5862d7 100644
--- a/fontfix-iso8859-2.c
+++ b/fontfix-iso8859-2.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_2[][28] = {
+static const cFont::tPixelData FontFix_iso8859_2[][28] = {
{ // 32
15, 26,
0x00000000, // ...............
diff --git a/fontfix-iso8859-5.c b/fontfix-iso8859-5.c
index e8cb4e5..b9939c9 100644
--- a/fontfix-iso8859-5.c
+++ b/fontfix-iso8859-5.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_5[][26] = {
+static const cFont::tPixelData FontFix_iso8859_5[][26] = {
{ // 32
15, 24,
0x00000000, // ...............
diff --git a/fontfix-iso8859-7.c b/fontfix-iso8859-7.c
index 5ba6da9..3ef21c2 100644
--- a/fontfix-iso8859-7.c
+++ b/fontfix-iso8859-7.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_7[][26] = {
+static const cFont::tPixelData FontFix_iso8859_7[][26] = {
{ // 32
11, 24,
0x00000000, // ...........
diff --git a/fontosd-iso8859-1.c b/fontosd-iso8859-1.c
index f2d2ced..67e286d 100644
--- a/fontosd-iso8859-1.c
+++ b/fontosd-iso8859-1.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_1[][29] = {
+static const cFont::tPixelData FontOsd_iso8859_1[][29] = {
{ // 32
6, 27,
0x00000000, // ......
diff --git a/fontosd-iso8859-13.c b/fontosd-iso8859-13.c
index 1179eba..29a5d78 100644
--- a/fontosd-iso8859-13.c
+++ b/fontosd-iso8859-13.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_13[][29] = {
+static const cFont::tPixelData FontOsd_iso8859_13[][29] = {
{ // 32
6, 27,
0x00000000, // ......
diff --git a/fontosd-iso8859-15.c b/fontosd-iso8859-15.c
index ee2d3b5..f3008b7 100644
--- a/fontosd-iso8859-15.c
+++ b/fontosd-iso8859-15.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_15[][29] = {
+static const cFont::tPixelData FontOsd_iso8859_15[][29] = {
{ // 32
6, 27,
0x00000000, // ......
diff --git a/fontosd-iso8859-2.c b/fontosd-iso8859-2.c
index e61e9a8..c5f6640 100644
--- a/fontosd-iso8859-2.c
+++ b/fontosd-iso8859-2.c
@@ -1,4 +1,3 @@
-
/*
* iso8859-2 modified iso8859-1 (Drazen Dupor 23.05.2004).
*
@@ -10,7 +9,7 @@
*
*/
-cFont::tPixelData FontOsd_iso8859_2[][29] = {
+static const cFont::tPixelData FontOsd_iso8859_2[][29] = {
{ // 32
6, 27,
0x00000000, // ......
diff --git a/fontosd-iso8859-5.c b/fontosd-iso8859-5.c
index a8de8fd..d155a32 100644
--- a/fontosd-iso8859-5.c
+++ b/fontosd-iso8859-5.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_5[][24] = {
+static const cFont::tPixelData FontOsd_iso8859_5[][24] = {
{ // 32
6, 22,
0x00000000, // ......
diff --git a/fontosd-iso8859-7.c b/fontosd-iso8859-7.c
index ef49b32..4fd47fb 100644
--- a/fontosd-iso8859-7.c
+++ b/fontosd-iso8859-7.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_7[][27] = {
+static const cFont::tPixelData FontOsd_iso8859_7[][27] = {
{ // 32
12, 25,
0x00000000, // ............
diff --git a/fontsml-iso8859-1.c b/fontsml-iso8859-1.c
index d9c80a0..028d152 100644
--- a/fontsml-iso8859-1.c
+++ b/fontsml-iso8859-1.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_1[][24] = {
+static const cFont::tPixelData FontSml_iso8859_1[][24] = {
{ // 32
5, 22,
0x00000000, // .....
diff --git a/fontsml-iso8859-13.c b/fontsml-iso8859-13.c
index 061b5cc..738816a 100644
--- a/fontsml-iso8859-13.c
+++ b/fontsml-iso8859-13.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_13[][24] = {
+static const cFont::tPixelData FontSml_iso8859_13[][24] = {
{ // 32
5, 22,
0x00000000, // .....
diff --git a/fontsml-iso8859-15.c b/fontsml-iso8859-15.c
index 55776d2..27333bd 100644
--- a/fontsml-iso8859-15.c
+++ b/fontsml-iso8859-15.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_15[][24] = {
+static const cFont::tPixelData FontSml_iso8859_15[][24] = {
{ // 32
5, 22,
0x00000000, // .....
diff --git a/fontsml-iso8859-2.c b/fontsml-iso8859-2.c
index 9f09d3b..af1d8a8 100644
--- a/fontsml-iso8859-2.c
+++ b/fontsml-iso8859-2.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_2[][25] = {
+static const cFont::tPixelData FontSml_iso8859_2[][25] = {
{ // 32
5, 23,
0x00000000, // .....
diff --git a/fontsml-iso8859-5.c b/fontsml-iso8859-5.c
index f7b57d3..786b070 100644
--- a/fontsml-iso8859-5.c
+++ b/fontsml-iso8859-5.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_5[][27] = {
+static const cFont::tPixelData FontSml_iso8859_5[][27] = {
{ // 32
5, 25,
0x00000000, // .....
diff --git a/fontsml-iso8859-7.c b/fontsml-iso8859-7.c
index cd8d693..a95f8f1 100644
--- a/fontsml-iso8859-7.c
+++ b/fontsml-iso8859-7.c
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_7[][22] = {
+static const cFont::tPixelData FontSml_iso8859_7[][22] = {
{ // 32
9, 20,
0x00000000, // .........
diff --git a/genfontfile.c b/genfontfile.c
index 9189167..9dc6bce 100644
--- a/genfontfile.c
+++ b/genfontfile.c
@@ -371,7 +371,7 @@ main(int argc, char *argv[])
exit(1);
}
- printf("%s[][%d] = {\n", varname, fontinfo->max_ascent + fontinfo->max_descent + 2);
+ printf("static const %s[][%d] = {\n", varname, fontinfo->max_ascent + fontinfo->max_descent + 2);
for (c = 32; c < 256; c++) {
getMetric(fontinfo, c, &tgi);
printGlyph(fontinfo, c);
diff --git a/i18n.c b/i18n.c
index c061a1a..ad9b797 100644
--- a/i18n.c
+++ b/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.244 2006/01/28 10:38:33 kls Exp $
+ * $Id: i18n.c 1.247 2006/02/04 14:17:54 kls Exp $
*
* Translations provided by:
*
@@ -26,6 +26,7 @@
* Croatian Drazen Dupor <drazen.dupor@dupor.com>, Dino Ravnic <dino.ravnic@fer.hr>
* Estonian Arthur Konovalov <kasjas@hot.ee>
* Danish Mogens Elneff <mogens@elneff.dk>
+ * Czech Vladimír Bárta <vladimir.barta@k2atmitec.cz>
*
*/
@@ -101,6 +102,7 @@ const tI18nPhrase Phrases[] = {
"Hrvatski",
"Eesti",
"Dansk",
+ "Èesky", //Czech
},
// The character set needed for this language (this MUST be the second phrase!):
{ "iso8859-15",
@@ -123,6 +125,7 @@ const tI18nPhrase Phrases[] = {
"iso8859-2",
"iso8859-13",
"iso8859-1",
+ "iso8859-2",
},
// The 3-letter names of the language (this MUST be the third phrase!):
{ "eng,dos",
@@ -145,6 +148,7 @@ const tI18nPhrase Phrases[] = {
"hrv",
"est",
"dan",
+ "cze,ces",
},
// Menu titles:
{ "VDR",
@@ -167,6 +171,7 @@ const tI18nPhrase Phrases[] = {
"VDR",
"VDR",
"VDR",
+ "VDR",
},
{ "Schedule",
"Programm",
@@ -188,6 +193,7 @@ const tI18nPhrase Phrases[] = {
"Raspored",
"Kava",
"Programoversigt",
+ "Program (EPG)",
},
{ "Channels",
"Kanäle",
@@ -209,6 +215,7 @@ const tI18nPhrase Phrases[] = {
"Programi",
"Kanalid",
"Kanaler",
+ "Kanály",
},
{ "Timers",
"Timer",
@@ -230,6 +237,7 @@ const tI18nPhrase Phrases[] = {
"Termini",
"Taimer",
"Timere",
+ "Èasovaèe",
},
{ "Recordings",
"Aufzeichnungen",
@@ -251,6 +259,7 @@ const tI18nPhrase Phrases[] = {
"Snimke",
"Salvestused",
"Optagelser",
+ "Nahrávky",
},
{ "Recording info",
"Aufzeichnung",
@@ -272,6 +281,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"Salvestuse info",
"Optagelses info",
+ "Detail nahrávky",
},
{ "Setup",
"Einstellungen",
@@ -293,6 +303,7 @@ const tI18nPhrase Phrases[] = {
"Konfiguracija",
"Sätted",
"Indstillinger",
+ "Nastavení",
},
{ "Commands",
"Befehle",
@@ -314,6 +325,7 @@ const tI18nPhrase Phrases[] = {
"Naredbe",
"Käsud",
"Kommandoer",
+ "Pøíkazy",
},
{ "Recording commands",
"Befehle für Aufzeichnungen",
@@ -335,6 +347,7 @@ const tI18nPhrase Phrases[] = {
"Naredbe za snimanje",
"Salvestuse käsud",
"Optage kommandoer",
+ "Pøíkazy nahrávání",
},
{ "Edit channel",
"Kanal editieren",
@@ -356,6 +369,7 @@ const tI18nPhrase Phrases[] = {
"Ureðivanje programa",
"Kanali muutmine",
"Rediger kanal",
+ "Editace kanálu",
},
{ "Edit timer",
"Timer editieren",
@@ -377,6 +391,7 @@ const tI18nPhrase Phrases[] = {
"Ureðivanje termina",
"Taimeri muutmine",
"Rediger timer",
+ "Editace èasovaèe",
},
{ "Event",
"Sendung",
@@ -398,6 +413,7 @@ const tI18nPhrase Phrases[] = {
"Emisija",
"Sündmus",
"Udsendelse",
+ "Událost",
},
{ "Info",
"Info",
@@ -419,6 +435,7 @@ const tI18nPhrase Phrases[] = {
"Info",
"Info",
"Info",
+ "Info",
},
{ "Schedule - %s",
"Programm - %s",
@@ -440,6 +457,7 @@ const tI18nPhrase Phrases[] = {
"Raspored - %s",
"Ajakava - %s",
"Program - %s",
+ "Program - %s",
},
{ "This event - %s",
"Diese Sendung - %s",
@@ -461,6 +479,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"See sündmus - %s",
"Denne udsendelse - %s",
+ "Tato událost - %s",
},
{ "This event - all channels",
"Diese Sendung - alle Kanäle",
@@ -482,6 +501,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"See sündmus - kõik kanalid",
"Denne udsendelse - alle kanaler",
+ "Tato událost - v¹echny kanály",
},
{ "All events - all channels",
"Alle Sendungen - alle Kanäle",
@@ -503,6 +523,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"Kõik sündmused - kõik kanalid",
"Alle udsendelser - alle kanaler",
+ "V¹echny událost - v¹echny kanály",
},
{ "What's on now?",
"Was läuft jetzt?",
@@ -524,6 +545,7 @@ const tI18nPhrase Phrases[] = {
"©to je trenutno na programu?",
"Hetkel eetris",
"Hvad vises nu?",
+ "Aktuální program",
},
{ "What's on next?",
"Was läuft als nächstes?",
@@ -545,6 +567,7 @@ const tI18nPhrase Phrases[] = {
"©to slijedi?",
"Järgmisena eetris",
"Hvad vises som det næste?",
+ "Následující program",
},
{ "Summary",
"Inhalt",
@@ -566,6 +589,7 @@ const tI18nPhrase Phrases[] = {
"Sadr¾aj",
"Ülevaade",
"Omtale",
+ "Obsah",
},
// Button texts (should not be more than 10 characters!):
{ "Button$Edit",
@@ -588,6 +612,7 @@ const tI18nPhrase Phrases[] = {
"Promijeni",
"Muuda",
"Rediger",
+ "Editace",
},
{ "Button$New",
"Neu",
@@ -609,6 +634,7 @@ const tI18nPhrase Phrases[] = {
"Novi",
"Uus",
"Ny",
+ "Nový",
},
{ "Button$Delete",
"Löschen",
@@ -630,6 +656,7 @@ const tI18nPhrase Phrases[] = {
"Obri¹i",
"Kustuta",
"Slet",
+ "Smazat",
},
{ "Button$Mark",
"Markieren",
@@ -651,6 +678,7 @@ const tI18nPhrase Phrases[] = {
"Oznaèi",
"Siirda",
"Markér",
+ "Oznaèit",
},
{ "Button$On/Off",
"Ein/Aus",
@@ -672,6 +700,7 @@ const tI18nPhrase Phrases[] = {
"De-/Aktiviraj",
"On/Off",
"Til/Fra",
+ "Zap./Vyp.",
},
{ "Timer",
"Timer",
@@ -682,7 +711,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"Ajastin",
- "Timer",// TODO
+ "Timer",
"Programa",
"",// TODO
"",// TODO
@@ -693,6 +722,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"Taimer",
"Timer",
+ "Èasovaè",
},
{ "Button$Record",
"Aufnehmen",
@@ -714,6 +744,7 @@ const tI18nPhrase Phrases[] = {
"Snimi",
"Salvesta",
"Optag",
+ "Nahrát",
},
{ "Button$Play",
"Wiedergabe",
@@ -735,6 +766,7 @@ const tI18nPhrase Phrases[] = {
"Start",
"Start",
"Afspil",
+ "Pøehrát",
},
{ "Button$Pause",
"Pause",
@@ -756,6 +788,7 @@ const tI18nPhrase Phrases[] = {
"Pauza",
"Paus",
"Pause",
+ "Zastavit",
},
{ "Button$Rewind",
"Anfang",
@@ -777,6 +810,7 @@ const tI18nPhrase Phrases[] = {
"Na poèetak",
"Algusesse",
"Forfra",
+ "Na zaèátek",
},
{ "Button$Stop",
"Beenden",
@@ -798,6 +832,7 @@ const tI18nPhrase Phrases[] = {
"Stop",
"Stopp",
"Stop",
+ "Ukonèit",
},
{ "Button$Resume",
"Weiter",
@@ -819,6 +854,7 @@ const tI18nPhrase Phrases[] = {
"Nastavi",
"Jätka",
"Fortsæt",
+ "Pokraèovat",
},
{ "Button$Open",
"Öffnen",
@@ -840,6 +876,7 @@ const tI18nPhrase Phrases[] = {
"Otvori",
"Ava",
"Åbn",
+ "Otevøít",
},
{ "Button$Switch",
"Umschalten",
@@ -861,6 +898,7 @@ const tI18nPhrase Phrases[] = {
"Prebaci",
"Vali",
"Skift",
+ "Pøepnout",
},
{ "Button$Now",
"Jetzt",
@@ -882,6 +920,7 @@ const tI18nPhrase Phrases[] = {
"Trenutno",
"Nüüd",
"Nu",
+ "Nyní",
},
{ "Button$Next",
"Nächste",
@@ -903,6 +942,7 @@ const tI18nPhrase Phrases[] = {
"Slijedi",
"Tulekul",
"Næste",
+ "Dal¹í",
},
{ "Button$Schedule",
"Programm",
@@ -924,6 +964,7 @@ const tI18nPhrase Phrases[] = {
"Raspored",
"Ajakava",
"Program",
+ "Program",
},
{ "Button$ABC/abc",
"ABC/abc",
@@ -945,6 +986,7 @@ const tI18nPhrase Phrases[] = {
"ABC/abc",
"ABC/abc",
"ABC/abc",
+ "ABC/abc",
},
{ "Button$Insert",
"Einfügen",
@@ -966,6 +1008,7 @@ const tI18nPhrase Phrases[] = {
"Umetni",
"Lisa (INS)",
"Indsæt",
+ "Vlo¾it",
},
{ "Button$Overwrite",
"Überschreiben",
@@ -987,6 +1030,7 @@ const tI18nPhrase Phrases[] = {
"Prepi¹i",
"Asenda (OVR)",
"Overskriv",
+ "Pøepsat",
},
{ "Button$Menu",
"Menü",
@@ -1008,6 +1052,7 @@ const tI18nPhrase Phrases[] = {
"Izbor",
"Menüü",
"Menu",
+ "Menu",
},
{ "Button$Reset",
"Reset",
@@ -1029,6 +1074,7 @@ const tI18nPhrase Phrases[] = {
"Reset",
"Nullimine",
"Nulstille",
+ "Reset",
},
{ "Button$Scan",
"Scan",
@@ -1050,6 +1096,7 @@ const tI18nPhrase Phrases[] = {
"Pretra¾i",
"Uuenda",
"Skan",
+ "Snímat",
},
{ "Button$Audio",
"Audio",
@@ -1071,6 +1118,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"Audio",
"Audio",
+ "Zvuk",
},
// Confirmations:
{ "Delete channel?",
@@ -1093,6 +1141,7 @@ const tI18nPhrase Phrases[] = {
"Obrisati program?",
"Kustutan kanali?",
"Slet kanal?",
+ "Smazat kanál?",
},
{ "Delete timer?",
"Timer löschen?",
@@ -1114,6 +1163,7 @@ const tI18nPhrase Phrases[] = {
"Obrisati termin?",
"Kustutan taimeri?",
"Slet timer?",
+ "Smazat èasovaè?",
},
{ "Delete recording?",
"Aufzeichnung löschen?",
@@ -1135,6 +1185,7 @@ const tI18nPhrase Phrases[] = {
"Obrisati snimku?",
"Kustutan salvestuse?",
"Slet optagelse?",
+ "Smazat nahrávku?",
},
{ "Timer still recording - really delete?",
"Timer zeichnet auf - trotzdem löschen?",
@@ -1156,6 +1207,7 @@ const tI18nPhrase Phrases[] = {
"Jo¹ snimam - zaista obrisati?",
"Salvestus aktiivne - kustutan?",
"Timerstyret optagelse i gang - slet alligevel?",
+ "Probíhá nahrávání - opravdu smazat?",
},
{ "Stop recording?",
"Aufzeichnung beenden?",
@@ -1177,6 +1229,7 @@ const tI18nPhrase Phrases[] = {
"Zaustaviti snimanje?",
"Lõpetan salvestamise?",
"Stop optagelse?",
+ "Ukonèit nahrávání?",
},
{ "Cancel editing?",
"Schneiden abbrechen?",
@@ -1198,6 +1251,7 @@ const tI18nPhrase Phrases[] = {
"Otkazati ureðivanje?",
"Tühistan muudatuse?",
"Afbryd redigering?",
+ "Zru¹it editaci?",
},
{ "Really restart?",
"Wirklich neu starten?",
@@ -1219,6 +1273,7 @@ const tI18nPhrase Phrases[] = {
"Zaista ponovo pokrenuti?",
"Restart?",
"Vil du virkelig genstarte?",
+ "Opravdu restartovat?",
},
{ "Recording - restart anyway?",
"Aufnahme läuft - trotzdem neu starten?",
@@ -1240,6 +1295,7 @@ const tI18nPhrase Phrases[] = {
"Snimanje traje - svejedno restart sistema?",
"Salvestamine aktiivne - restart?",
"Optagelse igang - genstart alligevel?",
+ "Systém je zaneprázdnìn - pøesto restartovat?",
},
{ "Recording - shut down anyway?",
"Aufnahme läuft - trotzdem ausschalten?",
@@ -1261,6 +1317,7 @@ const tI18nPhrase Phrases[] = {
"Snimanje traje - svejedno iskljuèiti?",
"Salvestamine aktiivne - lülitan välja?",
"Optagelse igang - sluk alligevel?",
+ "Systém je zaneprázdnìn - pøesto vypnout?",
},
{ "Recording in %d minutes, shut down anyway?",
"Aufnahme in %d Minuten - trotzdem ausschalten?",
@@ -1282,6 +1339,7 @@ const tI18nPhrase Phrases[] = {
"Snimanje za %d minuta - svejedno iskljuèiti?",
"Salvestamine algab %d minuti pärast - lülitan välja?",
"Optagelse om %d minutter - sluk alligevel?",
+ "Nahrávání zaène za %d minut - pøesto vypnout?",
},
{ "Press any key to cancel shutdown",
"Taste drücken, um Shutdown abzubrechen",
@@ -1303,6 +1361,7 @@ const tI18nPhrase Phrases[] = {
"Pritisnite tipku ako ne ¾elite ugasiti sistem",
"Vajuta suvalist klahvi väljalülitamise tühistamiseks",
"Tryk vilkårlig tast for at annullere sluk",
+ "Jakákoliv klávesa zru¹í vypnutí",
},
// Channel parameters:
{ "Name",
@@ -1325,6 +1384,7 @@ const tI18nPhrase Phrases[] = {
"Naziv",
"Nimi",
"Navn",
+ "Název",
},
{ "Frequency",
"Frequenz",
@@ -1346,6 +1406,7 @@ const tI18nPhrase Phrases[] = {
"Frekvencija",
"Sagedus",
"Frekvens",
+ "Frekvence",
},
{ "Polarization",
"Polarisation",
@@ -1367,6 +1428,7 @@ const tI18nPhrase Phrases[] = {
"Polarizacija",
"Polarisatsioon",
"Polarisation",
+ "Polarizace",
},
{ "Source",
"Quelle",
@@ -1388,6 +1450,7 @@ const tI18nPhrase Phrases[] = {
"Izvor",
"Allikas",
"Kilde",
+ "Zdroj",
},
{ "Srate",
"Srate",
@@ -1409,6 +1472,7 @@ const tI18nPhrase Phrases[] = {
"Srate", // hrv
"Srate",
"Srate",
+ "Srate",
},
{ "Vpid",
"Vpid",
@@ -1430,6 +1494,7 @@ const tI18nPhrase Phrases[] = {
"Vpid",
"Vpid",
"Vpid",
+ "Vpid",
},
{ "Ppid",
"Ppid",
@@ -1451,6 +1516,7 @@ const tI18nPhrase Phrases[] = {
"Ppid",
"Ppid",
"Ppid",
+ "Ppid",
},
{ "Apid1",
"Apid1",
@@ -1472,6 +1538,7 @@ const tI18nPhrase Phrases[] = {
"Apid1", // hrv
"Apid1",
"Apid1",
+ "Apid1",
},
{ "Apid2",
"Apid2",
@@ -1493,6 +1560,7 @@ const tI18nPhrase Phrases[] = {
"Apid2", // hrv
"Apid2",
"Apid2",
+ "Apid2",
},
{ "Dpid1",
"Dpid1",
@@ -1514,6 +1582,7 @@ const tI18nPhrase Phrases[] = {
"Dpid1", // hrv
"Dpid1",
"Dpid1",
+ "Dpid1",
},
{ "Dpid2",
"Dpid2",
@@ -1535,6 +1604,7 @@ const tI18nPhrase Phrases[] = {
"Dpid2", // hrv
"Dpid2",
"Dpid2",
+ "Dpid2",
},
{ "Tpid",
"Tpid",
@@ -1556,6 +1626,7 @@ const tI18nPhrase Phrases[] = {
"Tpid", // hrv
"Tpid",
"Tpid",
+ "Tpid",
},
{ "CA",
"CA",
@@ -1577,6 +1648,7 @@ const tI18nPhrase Phrases[] = {
"Kodiranje (CA)",
"CA",
"CA",
+ "CA",
},
{ "Free To Air",
"frei empfangbar",
@@ -1590,7 +1662,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"en abierto",
"",//TODO
- "Otwarta transmisja",
+ "otwarty przekaz",
"",//TODO
"",//TODO
"",//TODO
@@ -1598,6 +1670,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"FTA",
"Free To Air",
+ "volný",
},
{ "encrypted",
"verschlüsselt",
@@ -1619,6 +1692,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"krüptitud",
"kodet",
+ "kódovaný",
},
{ "Sid",
"Sid",
@@ -1640,6 +1714,7 @@ const tI18nPhrase Phrases[] = {
"Sid", // hrv
"Sid",
"Sid",
+ "Sid",
},
{ "Inversion",
"Inversion",
@@ -1661,6 +1736,7 @@ const tI18nPhrase Phrases[] = {
"Inverzija",
"Inversioon",
"Inversion",
+ "Inversion",
},
{ "Bandwidth",
"Bandwidth",
@@ -1682,6 +1758,7 @@ const tI18nPhrase Phrases[] = {
"Bandwidth", // hrv "Pojasna ¹irina",
"Ribalaius",
"Båndbredde",
+ "©íøka pásma",
},
{ "CoderateH",
"CoderateH",
@@ -1703,6 +1780,7 @@ const tI18nPhrase Phrases[] = {
"CoderateH", // hrv
"CoderateH",
"CoderateH",
+ "CoderateH",
},
{ "CoderateL",
"CoderateL",
@@ -1724,6 +1802,7 @@ const tI18nPhrase Phrases[] = {
"CoderateL", // hrv
"CoderateL",
"CoderateL",
+ "CoderateL",
},
{ "Modulation",
"Modulation",
@@ -1745,6 +1824,7 @@ const tI18nPhrase Phrases[] = {
"Modulacija",
"Modulatsioon",
"Modulation",
+ "Modulace",
},
{ "Transmission",
"Transmission",
@@ -1766,6 +1846,7 @@ const tI18nPhrase Phrases[] = {
"Prijenos",
"Transmissioon",
"Transmission",
+ "Pøenos",
},
{ "Guard",
"Guard",
@@ -1787,6 +1868,7 @@ const tI18nPhrase Phrases[] = {
"Za¹tita",
"Guard",
"Guard",
+ "Guard",
},
{ "Hierarchy",
"Hierarchy",
@@ -1808,6 +1890,7 @@ const tI18nPhrase Phrases[] = {
"Hijerarhija",
"Hierarhia",
"Hierarki",
+ "Hierarchy",
},
// Timer parameters:
{ "Active",
@@ -1830,6 +1913,7 @@ const tI18nPhrase Phrases[] = {
"Aktivan",
"Aktiivne",
"Aktiv",
+ "Aktivní",
},
{ "Channel",
"Kanal",
@@ -1851,6 +1935,7 @@ const tI18nPhrase Phrases[] = {
"Program",
"Kanal",
"Kanal",
+ "Kanál",
},
{ "Day",
"Tag",
@@ -1872,6 +1957,7 @@ const tI18nPhrase Phrases[] = {
"Dan",
"Päev",
"Dag",
+ "Den",
},
{ "Start",
"Anfang",
@@ -1893,6 +1979,7 @@ const tI18nPhrase Phrases[] = {
"Poèetak",
"Start",
"Start",
+ "Zaèátek",
},
{ "Stop",
"Ende",
@@ -1914,6 +2001,7 @@ const tI18nPhrase Phrases[] = {
"Kraj",
"Stopp",
"Stop",
+ "Konec",
},
{ "VPS",
"VPS",
@@ -1935,6 +2023,7 @@ const tI18nPhrase Phrases[] = {
"VPS", // hrv
"VPS",
"VPS",
+ "VPS",
},
{ "Priority",
"Priorität",
@@ -1956,6 +2045,7 @@ const tI18nPhrase Phrases[] = {
"Prioritet",
"Prioriteet",
"Prioritet",
+ "Priorita",
},
{ "Lifetime",
"Lebensdauer",
@@ -1977,6 +2067,7 @@ const tI18nPhrase Phrases[] = {
"Trajanje",
"Eluiga",
"Levetid",
+ "®ivotnost",
},
{ "File",
"Datei",
@@ -1998,6 +2089,7 @@ const tI18nPhrase Phrases[] = {
"Datoteka",
"Fail",
"Fil",
+ "Soubor",
},
{ "First day",
"Erster Tag",
@@ -2019,6 +2111,7 @@ const tI18nPhrase Phrases[] = {
"Prvi dan",
"Esimene päev",
"Første dag",
+ "První den",
},
// Error messages:
{ "Channel is being used by a timer!",
@@ -2041,6 +2134,7 @@ const tI18nPhrase Phrases[] = {
"Program je trenutno zauzet terminom za snimanje",
"Kanal on taimeri kasutuses!",
"Kanal anvendes af en timer!",
+ "Kanál je dr¾ený èasovaèem nahrávek!",
},
{ "Can't switch channel!",
"Kanal kann nicht umgeschaltet werden!",
@@ -2062,6 +2156,7 @@ const tI18nPhrase Phrases[] = {
"Ne mogu prebaciti program!",
"Kanali vahetus ei ole võimalik!",
"Kan ikke skifte kanal!",
+ "Kanál nelze pøepnout!",
},
{ "Timer is recording!",
"Timer zeichnet gerade auf!",
@@ -2083,6 +2178,7 @@ const tI18nPhrase Phrases[] = {
"Snimanje po definiranom terminu!",
"Taimeriga salvestamine aktiivne!",
"Timer optager nu!",
+ "Èasovaè právì nahrává!",
},
{ "Error while accessing recording!",
"Fehler beim Ansprechen der Aufzeichnung!",
@@ -2104,6 +2200,7 @@ const tI18nPhrase Phrases[] = {
"Gre¹ka pri pristupanju snimke!",
"Salvestuse taasesitus ebaõnnestus!",
"Fejl ved læsning af optagelse!",
+ "Chyba pøi pøístupu k nahrávkám!",
},
{ "Error while deleting recording!",
"Fehler beim Löschen der Aufzeichnung!",
@@ -2125,6 +2222,7 @@ const tI18nPhrase Phrases[] = {
"Gre¹ka pri brisanju snimke!",
"Salvestuse kustutamine ebaõnnestus!",
"Fejl ved sletning af optagelse!",
+ "Chyba pøi mazání nahrávky!",
},
{ "*** Invalid Channel ***",
"*** Ungültiger Kanal ***",
@@ -2146,6 +2244,7 @@ const tI18nPhrase Phrases[] = {
"*** Neispravan program ***",
"*** Vigane kanal ***",
"*** Ugyldig kanal! ***",
+ "*** Neplatný kanál ***",
},
{ "No free DVB device to record!",
"Keine freie DVB-Karte zum Aufnehmen!",
@@ -2167,6 +2266,7 @@ const tI18nPhrase Phrases[] = {
"Nema slobodnog DVB ureðaja za snimanje!",
"Puudub vaba DVB seade salvestamiseks!",
"Ingen fri DVB enhed til optagelse!",
+ "®ádná DVB karta není volná pro nahrávání",
},
{ "Channel not available!",
"Kanal nicht verfügbar!",
@@ -2188,6 +2288,7 @@ const tI18nPhrase Phrases[] = {
"Program nije dostupan!",
"Kanal ei ole kättesaadav!",
"Kanal er ikke tilgængelig!",
+ "Kanál není dostupný!",
},
{ "Channel settings are not unique!",
"Kanaleinstellungen sind nicht eindeutig!",
@@ -2209,6 +2310,7 @@ const tI18nPhrase Phrases[] = {
"Parametri programa nisu jednoznaèni!",
"Kanaliseaded ei ole unikaalsed!",
"Kanalindstillinger er ikke entydige!",
+ "Nastavení kanálù nejsou unikátní!",
},
{ "Channel locked (recording)!",
"Kanal blockiert (zeichnet auf)!",
@@ -2230,6 +2332,7 @@ const tI18nPhrase Phrases[] = {
"Program blokiran (snimanje)!",
"Kanal lukus (salvestamine aktiivne)!",
"Kanal blokeret (optagelse i gang)",
+ "Kanál je blokovaný (nahrává se)!",
},
{ "Can't start Transfer Mode!",
"Transfer-Mode kann nicht gestartet werden!",
@@ -2251,6 +2354,7 @@ const tI18nPhrase Phrases[] = {
"Ne mogu zapoèeti 'prijenosni' naèin!",
"Siirdemooduse start ebaõnnestus!",
"Kan ikke starte Transfer Mode!",
+ "Nelze zaèít s pøenosem",
},
{ "No editing marks defined!",
"Keine Schnittmarken gesetzt!",
@@ -2272,6 +2376,7 @@ const tI18nPhrase Phrases[] = {
"Nijedna prekidna toèka nije postavljena!",
"Redigeerimise markerid puuduvad!",
"Der er ikke sat nogen redigeringsmærker!",
+ "Nejsou definovány editaèní znaèky!",
},
{ "Can't start editing process!",
"Schnitt kann nicht gestartet werden!",
@@ -2293,6 +2398,7 @@ const tI18nPhrase Phrases[] = {
"Ne mogu zapoèeti ureðivanje!",
"Redigeerimise start ebaõnnestus!",
"Kan ikke starte redigeringsprocessen!",
+ "Nelze zaèít editaèní proces!",
},
{ "Editing process already active!",
"Schnitt bereits aktiv!",
@@ -2314,6 +2420,7 @@ const tI18nPhrase Phrases[] = {
"Ureðivanje je veæ aktivirano!",
"Redigeerimine juba aktiivne!",
"Redigeringsproces er allerede aktiv!",
+ "Editaèní proces je ji¾ aktivní!",
},
{ "Can't shutdown - option '-s' not given!",
"Shutdown unmöglich - Option '-s' fehlt!",
@@ -2335,6 +2442,7 @@ const tI18nPhrase Phrases[] = {
"Ga¹enje nemoguæe - nedostaje opcija '-s'!",
"Väljalülitamine ebaõnnestus - '-s' parameeter puudub!",
"Kan ikke slukke - parameter '-s' ikke angivet!",
+ "Vypnutí není mo¾né - chbí volba '-s'!",
},
{ "Not enough disk space to start recording!",
"Nicht genügend Plattenplatz für Aufnahme!",
@@ -2345,7 +2453,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"Tallennustilan puute estää tallennuksen!",
- "",//TODO
+ "Brak miejsca na dysku do nagrywania!",
"",//TODO
"",//TODO
"",//TODO
@@ -2356,6 +2464,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"Ebapiisavalt kettaruumi salvestamise alustamiseks!",
"For lidt harddisk plads til optagelse!",
+ "Nedostatek volného místa k zapoèetí nahrávání!",
},
{ "Low disk space!",
"Platte beinahe voll!",
@@ -2377,6 +2486,7 @@ const tI18nPhrase Phrases[] = {
"Nedovoljno prostora na disku",
"Kõvaketas täis!",
"Kun lidt diskplads tilbage!",
+ "Disk bude brzy zaplnìn!",
},
{ "Opening CAM menu...",
"CAM-Menü wird geöffnet...",
@@ -2398,6 +2508,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"CAM-menüü avamine...",
"Åbner CAM menu...",
+ "Otevírá se menu CAM...",
},
{ "Can't open CAM menu!",
"CAM-Menü kann nicht geöffnet werden!",
@@ -2419,6 +2530,7 @@ const tI18nPhrase Phrases[] = {
"Ne mogu otvoriti CAM izbor!",
"Ei saa avada CAM menüüd!",
"Kan ikke åbne CAM menuen!",
+ "Menu CAM není dostupné",
},
{ "Resetting CAM...",
"CAM wird zurückgesetzt...",
@@ -2440,6 +2552,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"CAM mooduli taaskäivitus...",
"Nulstiller CAM...",
+ "Restartuje se CAM...",
},
{ "Can't reset CAM!",
"CAM-Reset fehlgeschlagen!",
@@ -2461,6 +2574,7 @@ const tI18nPhrase Phrases[] = {
"Ne mogu resetirati CAM",
"CAM mooduli taaskäivitus ebaõnnestus!",
"Kan ikke nulstille CAM!",
+ "CAM modul nelze restartovat!",
},
{ "CAM has been reset",
"CAM wurde zurückgesetzt",
@@ -2482,6 +2596,7 @@ const tI18nPhrase Phrases[] = {
"CAM je resetiran",
"CAM mooduli taaskäivitus tehtud",
"CAM er blevet nulstillet",
+ "CAM byl restartován",
},
{ "Please enter %d digits!",
"Bitte geben Sie %d Ziffern ein!",
@@ -2503,6 +2618,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"Palun sisesta %d numbrit!",
"Indtast venligst %d cifre!",
+ "Prosím vlo¾te %d znakù!",
},
{ "No audio available!",
"Kein Audio verfügbar!",
@@ -2516,7 +2632,7 @@ const tI18nPhrase Phrases[] = {
"D¼wiêk nie jest dostêpny!",
"¡No hay audio disponible!",
"Ìç äéáèÝóéìïò Þ÷ïò",
- "Ljud saknas!"
+ "Ljud saknas!",
"Lipseºte sunetul!",
"",//TODO
"",//TODO
@@ -2524,6 +2640,7 @@ const tI18nPhrase Phrases[] = {
"Audio nedostupan",
"Audio kättesaamatu!",
"Ingen lyd tilgængelig!",
+ "Zvuk není dostupný!",
},
// Setup pages:
{ "OSD",
@@ -2546,6 +2663,7 @@ const tI18nPhrase Phrases[] = {
"OSD",
"Ekraanimenüü",
"OSD",
+ "OSD",
},
{ "EPG",
"EPG",
@@ -2567,6 +2685,7 @@ const tI18nPhrase Phrases[] = {
"Pregled emisija (EPG)",
"EPG",
"EPG",
+ "EPG",
},
{ "DVB",
"DVB",
@@ -2588,6 +2707,7 @@ const tI18nPhrase Phrases[] = {
"DVB",
"DVB",
"DVB",
+ "DVB",
},
{ "LNB",
"LNB",
@@ -2609,6 +2729,7 @@ const tI18nPhrase Phrases[] = {
"LNB",
"LNB",
"LNB",
+ "LNB",
},
{ "CICAM",
"CICAM",
@@ -2630,6 +2751,7 @@ const tI18nPhrase Phrases[] = {
"CICAM",
"CICAM",
"CICAM",
+ "CICAM",
},
{ "Recording",
"Aufnahme",
@@ -2651,6 +2773,7 @@ const tI18nPhrase Phrases[] = {
"Snimanje",
"Salvestamine",
"Optagelse",
+ "Nahrávání",
},
{ "Replay",
"Wiedergabe",
@@ -2672,6 +2795,7 @@ const tI18nPhrase Phrases[] = {
"Reprodukcija",
"Taasesitus",
"Afspilning",
+ "Pøehrávání",
},
{ "Miscellaneous",
"Sonstiges",
@@ -2693,6 +2817,7 @@ const tI18nPhrase Phrases[] = {
"Ostalo",
"Muud sätted",
"Diverse",
+ "Rùzné",
},
{ "Plugins",
"Plugins",
@@ -2714,6 +2839,7 @@ const tI18nPhrase Phrases[] = {
"Dodaci (Plugins)",
"Laiendusmoodulid",
"Plugins",
+ "Moduly",
},
{ "Plugin",
"Plugin",
@@ -2735,6 +2861,7 @@ const tI18nPhrase Phrases[] = {
"Plugin",
"Laiendusmoodul",
"Plugin",
+ "Modul",
},
{ "Restart",
"Neustart",
@@ -2756,6 +2883,7 @@ const tI18nPhrase Phrases[] = {
"Restart sistema",
"Restart",
"Genstart",
+ "Restart",
},
// Setup parameters:
{ "Setup.OSD$Language",
@@ -2778,6 +2906,7 @@ const tI18nPhrase Phrases[] = {
"Jezik",
"Keel",
"Sprog",
+ "Jazyk",
},
{ "Setup.OSD$Skin",
"Oberfläche",
@@ -2799,6 +2928,7 @@ const tI18nPhrase Phrases[] = {
"Povr¹ina",
"Kest",
"Skin",
+ "Vzhled",
},
{ "Setup.OSD$Theme",
"Thema",
@@ -2820,6 +2950,7 @@ const tI18nPhrase Phrases[] = {
"Tema",
"Teema",
"Tema",
+ "Téma",
},
{ "Setup.OSD$Left",
"Links",
@@ -2841,6 +2972,7 @@ const tI18nPhrase Phrases[] = {
"Lijevo",
"Vasakule",
"Venstre",
+ "Vlevo",
},
{ "Setup.OSD$Top",
"Oben",
@@ -2862,6 +2994,7 @@ const tI18nPhrase Phrases[] = {
"Gore",
"Ülesse",
"Top",
+ "Nahoøe",
},
{ "Setup.OSD$Width",
"Breite",
@@ -2883,6 +3016,7 @@ const tI18nPhrase Phrases[] = {
"©irina",
"Laius",
"Bredde",
+ "©íøka",
},
{ "Setup.OSD$Height",
"Höhe",
@@ -2904,6 +3038,7 @@ const tI18nPhrase Phrases[] = {
"Visina",
"Kõrgus",
"Højde",
+ "Vý¹ka",
},
{ "Setup.OSD$Message time (s)",
"Anzeigedauer für Nachrichten (s)",
@@ -2925,6 +3060,7 @@ const tI18nPhrase Phrases[] = {
"Vrijeme prikaza poruka (s)",
"Teate esitusaeg (s)",
"Tid beskeder skal vises (s)",
+ "Èas zobrazení zpávy (s)",
},
{ "Setup.OSD$Use small font",
"Kleine Schrift benutzen",
@@ -2946,6 +3082,7 @@ const tI18nPhrase Phrases[] = {
"Koristi mala slova",
"Väikese fondi kasutamine",
"Anvend lille skrift",
+ "Pou¾ívat malé písmo",
},
{ "never",
"nie",
@@ -2967,6 +3104,7 @@ const tI18nPhrase Phrases[] = {
"nikada",
"mitte kunagi",
"aldrig",
+ "nikdy",
},
{ "skin dependent",
"je nach Oberfläche",
@@ -2988,6 +3126,7 @@ const tI18nPhrase Phrases[] = {
"ovisno o povr¹ini",
"kestast sõltuv",
"skin afhængig",
+ "podle vzhledu",
},
{ "always",
"immer",
@@ -3009,6 +3148,7 @@ const tI18nPhrase Phrases[] = {
"uvijek",
"alati",
"altid",
+ "v¾dy",
},
{ "Setup.OSD$Channel info position",
"Kanal-Info Position",
@@ -3030,6 +3170,7 @@ const tI18nPhrase Phrases[] = {
"Pozicija informacije o programu",
"Kanaliinfo asukoht",
"Placering af kanalinfo",
+ "Pozice informace o kanálu",
},
{ "Setup.OSD$Channel info time (s)",
"Anzeigedauer für Kanal-Info (s)",
@@ -3051,6 +3192,7 @@ const tI18nPhrase Phrases[] = {
"Vrijeme prikaza informacije o programu (s)",
"Kanaliinfo esitusaeg (s)",
"Tid kanalinfo skal vises (s)",
+ "Èas zobr. informace o kanálu (s)",
},
{ "Setup.OSD$Info on channel switch",
"Info beim Kanalwechsel",
@@ -3072,6 +3214,7 @@ const tI18nPhrase Phrases[] = {
"Informacije kod promjene kanala",
"Kanaliinfo näitamine",
"Info ved kanalskift",
+ "Informace pøi zmìnì kanálu",
},
{ "Setup.OSD$Timeout requested channel info",
"Angeforderte Kanalinfo schließen",
@@ -3093,6 +3236,7 @@ const tI18nPhrase Phrases[] = {
"", // TODO
"Kanaliinfo kuvamise ajapiirang",
"Timeout ved anmodet kanal info",
+ "Èasový limit informace o kanálu",
},
{ "Setup.OSD$Scroll pages",
"Seitenweise scrollen",
@@ -3114,6 +3258,7 @@ const tI18nPhrase Phrases[] = {
"Listaj po stranicama",
"Lehekülje kerimine",
"Scroll sidevis",
+ "Rolovat strany",
},
{ "Setup.OSD$Scroll wraps",
"Rundum scrollen",
@@ -3135,6 +3280,7 @@ const tI18nPhrase Phrases[] = {
"S kraja skoèi na poèetak",
"Ridade kerimine",
"Scroll rundt",
+ "Z konce na zaèátek",
},
{ "Setup.OSD$Menu button closes",
"Menu-Taste schließt",
@@ -3156,6 +3302,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"Sulgemine Menüü klahviga",
"Menu taste lukker",
+ "Klávesa Menu zavírá",
},
{ "Setup.OSD$Sort timers",
"Timer sortieren",
@@ -3177,6 +3324,7 @@ const tI18nPhrase Phrases[] = {
"Sortiraj termine",
"Taimeri sorteerimine",
"Sorter timere",
+ "Tøídìní èasovaèù",
},
{ "Setup.OSD$Recording directories",
"Aufnahmeverzeichnisse",
@@ -3198,6 +3346,7 @@ const tI18nPhrase Phrases[] = {
"Imenik za snimke",
"Kausta nime salvestamine",
"Optagelser i foldere",
+ "Seznam nahrávek",
},
{ "Setup.EPG$EPG scan timeout (h)",
"Zeit bis EPG Scan (h)",
@@ -3219,6 +3368,7 @@ const tI18nPhrase Phrases[] = {
"Vrijeme do EPG pregleda (h)",
"EPG skaneerimise viide (h)",
"Tid før EPG skanning (t)",
+ "Èasový limit pro snímání EPG (h)",
},
{ "Setup.EPG$EPG bugfix level",
"EPG Fehlerbereinigung",
@@ -3240,6 +3390,7 @@ const tI18nPhrase Phrases[] = {
"Nivo popravka EPG gre¹aka",
"EPG veaparanduse tase",
"Niveau for EPG fejlrettelse",
+ "EPG úroveò chyb",
},
{ "Setup.EPG$EPG linger time (min)",
"Alte EPG-Daten anzeigen (min)",// TODO
@@ -3261,6 +3412,7 @@ const tI18nPhrase Phrases[] = {
"Prika¾i stare EPG podatke (min)",
"Vana EPG viide (min)",
"Vise gammel EPG info (min)",
+ "Ukazovat star¹í EPG data (min)",
},
{ "Setup.EPG$Set system time",
"Systemzeit stellen",
@@ -3282,6 +3434,7 @@ const tI18nPhrase Phrases[] = {
"Podesi vrijeme sistema",
"Kella sünkroniseerimine",
"Indstil system tid",
+ "Nastavit systémový èas",
},
{ "Setup.EPG$Use time from transponder",
"Transponder für Systemzeit",
@@ -3303,6 +3456,7 @@ const tI18nPhrase Phrases[] = {
"Transponder za pode¹avanje sata",
"Kella sünkroniseerimise transponder",
"Anvend tid fra transponder",
+ "Pou¾ít èas z kanálu",
},
{ "Setup.EPG$Preferred languages", // note the plural
"Bevorzugte Sprachen",
@@ -3324,6 +3478,7 @@ const tI18nPhrase Phrases[] = {
"Preferirani jezici",
"Eelistatuid keeli",
"Foretrukne sprog",
+ "Preferované jazyky",
},
{ "Setup.EPG$Preferred language", // note the singular
"Bevorzugte Sprache",
@@ -3345,6 +3500,7 @@ const tI18nPhrase Phrases[] = {
"Preferirani jezik",
"Eelistatud keel",
"Foretrukket sprog",
+ "Preferovaný jazyk",
},
{ "Setup.DVB$Primary DVB interface",
"Primäres DVB Interface",
@@ -3366,6 +3522,7 @@ const tI18nPhrase Phrases[] = {
"Primarni DVB ureðaj",
"Esmane DVB seade",
"Primær DVB enhed",
+ "Primární DVB interface",
},
{ "Setup.DVB$Video display format",
"Video Anzeige-Format",
@@ -3387,6 +3544,7 @@ const tI18nPhrase Phrases[] = {
"Format video prikaza",
"Video kuvamise formaat",
"Video display format",
+ "Formát zobrazení videa",
},
{ "pan&scan",
"pan&scan",
@@ -3408,6 +3566,7 @@ const tI18nPhrase Phrases[] = {
"pan&scan",
"pan&scan",
"pan&scan",
+ "pan&scan",
},
{ "letterbox",
"letterbox",
@@ -3429,6 +3588,7 @@ const tI18nPhrase Phrases[] = {
"letterbox",
"letterbox",
"letterbox",
+ "letterbox",
},
{ "center cut out",
"center cut out",
@@ -3450,6 +3610,7 @@ const tI18nPhrase Phrases[] = {
"center cut out",
"center cut out",
"center cut out",
+ "dostøedu oøíznout",
},
{ "Setup.DVB$Video format",
"Video Format",
@@ -3471,6 +3632,7 @@ const tI18nPhrase Phrases[] = {
"Video format",
"TV külgsuhe",
"Video format",
+ "Formát videa",
},
{ "Setup.DVB$Use Dolby Digital",
"Dolby Digital Ton benutzen",
@@ -3492,6 +3654,7 @@ const tI18nPhrase Phrases[] = {
"Koristi Dolby Digital",
"Dolby Digital kasutamine",
"Anvend Dolby Digital",
+ "Pou¾ívat zvuk v Dolby Digital",
},
{ "Setup.DVB$Update channels",
"Kanäle aktualisieren",
@@ -3513,6 +3676,7 @@ const tI18nPhrase Phrases[] = {
"Aktualiziraj programe",
"Kanalite uuendamine",
"Opdatér kanaler",
+ "Aktualizace kanálù",
},
{ "names only",
"nur Namen",
@@ -3534,6 +3698,7 @@ const tI18nPhrase Phrases[] = {
"samo imena",
"ainult nimed",
"kun navne",
+ "jen názvy",
},
{ "names and PIDs",
"Namen und PIDs",
@@ -3555,6 +3720,7 @@ const tI18nPhrase Phrases[] = {
"imena i identifikatore (PIDs)",
"nimi ja PID-id",
"navne og PIDs",
+ "názvy a PIDs",
},
{ "add new channels",
"neue Kanäle hinzufügen",
@@ -3576,6 +3742,7 @@ const tI18nPhrase Phrases[] = {
"dodaj nove programe",
"lisa uued kanalid",
"tilf. ny kanaler",
+ "pøidat nové kanály",
},
{ "add new transponders",
"neue Transponder hinzufügen",
@@ -3597,6 +3764,7 @@ const tI18nPhrase Phrases[] = {
"dodaj nove transpondere", // hrv TODO transponderi == odasiljaèi?
"lisa uued transponderid",
"tilf. ny transp.",
+ "pøidat nové transpondéry",
},
{ "Setup.DVB$Audio languages", // note the plural
"Audio Sprachen",
@@ -3618,6 +3786,7 @@ const tI18nPhrase Phrases[] = {
"Audio jezici",
"Audio keeli",
"Audio sprog (ant.)",
+ "Jazyky zvuku",
},
{ "Setup.DVB$Audio language", // note the singular
"Audio Sprache",
@@ -3639,6 +3808,7 @@ const tI18nPhrase Phrases[] = {
"Audio jezik",
"Audio keel",
"Audio sprog",
+ "Jazyk zvuku",
},
{ "Setup.LNB$SLOF (MHz)",
"SLOF (MHz)",
@@ -3660,6 +3830,7 @@ const tI18nPhrase Phrases[] = {
"Frekv. preklopa SLOF (MHz)",
"SLOF (MHz)",
"SLOF (MHz)",
+ "SLOF (MHz)",
},
{ "Setup.LNB$Low LNB frequency (MHz)",
"Untere LNB-Frequenz (MHz)",
@@ -3681,6 +3852,7 @@ const tI18nPhrase Phrases[] = {
"Donja LNB frekv. (MHz)",
"Alumine (LO) LNB sagedus (MHz)",
"Nedre LNB frekvens (MHz)",
+ "Dolní frekvence LNB (MHz)",
},
{ "Setup.LNB$High LNB frequency (MHz)",
"Obere LNB-Frequenz (MHz)",
@@ -3702,6 +3874,7 @@ const tI18nPhrase Phrases[] = {
"Gornja LNB frekv. (MHz)",
"Ülemine (HI) LNB sagedus (MHz)",
"Øvre LNB frekvens (MHz)",
+ "Horní frekvence LNB (MHz)",
},
{ "Setup.LNB$Use DiSEqC",
"DiSEqC benutzen",
@@ -3723,6 +3896,7 @@ const tI18nPhrase Phrases[] = {
"Koristi DiSEqC",
"DiSEqC kasutamine",
"Anvend DiSEqC",
+ "Pou¾ívat DiSEqC",
},
{ "Setup.CICAM$CICAM DVB",
"CICAM DVB",
@@ -3744,6 +3918,7 @@ const tI18nPhrase Phrases[] = {
"CICAM DVB",
"CICAM DVB",
"CICAM DVB",
+ "CICAM DVB",
},
{ "Setup.Recording$Margin at start (min)",
"Zeitpuffer bei Anfang (min)",
@@ -3765,6 +3940,7 @@ const tI18nPhrase Phrases[] = {
"Rezerva na poèetku snimanja (min)",
"Salvestamise algusvaru (min)",
"Margin ved start (min)",
+ "Nahrávat pøed zaèátkem (min)",
},
{ "Setup.Recording$Margin at stop (min)",
"Zeitpuffer bei Ende (min)",
@@ -3786,6 +3962,7 @@ const tI18nPhrase Phrases[] = {
"Rezerva na kraju (min)",
"Salvestamise lõpuvaru (min)",
"Margin ved stop (min)",
+ "Nahrávat po konci (min)",
},
{ "Setup.Recording$Primary limit",
"Primär-Limit",
@@ -3807,6 +3984,7 @@ const tI18nPhrase Phrases[] = {
"Standardno ogranièenje",
"Esmane prioriteet",
"Primær grænse",
+ "Primární limit",
},
{ "Setup.Recording$Default priority",
"Default Priorität",
@@ -3828,6 +4006,7 @@ const tI18nPhrase Phrases[] = {
"Standardni prioritet",
"Vaikimisi prioriteet",
"Standard prioritet",
+ "Výchozí priorita",
},
{ "Setup.Recording$Default lifetime (d)",
"Default Lebensdauer (d)",
@@ -3849,6 +4028,7 @@ const tI18nPhrase Phrases[] = {
"Standardno trajanje (d)",
"Salvestuse eluiga (päevi)",
"Standard levetid (d)",
+ "Výchozí ¾ivotnost",
},
{ "Setup.Recording$Pause priority",
"Pause Priorität",
@@ -3870,6 +4050,7 @@ const tI18nPhrase Phrases[] = {
"Prioritet pauze",
"Pausi prioriteet",
"Pause prioritet",
+ "Priorita pøeru¹ení",
},
{ "Setup.Recording$Pause lifetime (d)",
"Pause Lebensdauer (d)",
@@ -3891,6 +4072,7 @@ const tI18nPhrase Phrases[] = {
"Trajanje pauze (d)",
"Pausi eluiga (päevi)",
"Pause levetid (d)",
+ "®ivotnost pøeru¹ení (d)",
},
{ "Setup.Recording$Use episode name",
"Episodenname verwenden",
@@ -3912,6 +4094,7 @@ const tI18nPhrase Phrases[] = {
"Koristi ime epizode",
"Episoodi nime kasutamine",
"Anvend udsendelsesnavn",
+ "Pou¾ívat název epizody",
},
{ "Setup.Recording$Use VPS",
"VPS benutzen",
@@ -3933,6 +4116,7 @@ const tI18nPhrase Phrases[] = {
"Koristi VPS",
"VPS-i kasutamine",
"Anvend VPS",
+ "Pou¾ívat VPS",
},
{ "Setup.Recording$VPS margin (s)",
"Zeitpuffer bei VPS (s)",
@@ -3954,6 +4138,7 @@ const tI18nPhrase Phrases[] = {
"Vremenska rezerva kod VPS (s)",
"VPS-i algusvaru (s)",
"VPS margin (s)",
+ "Èasová rezerva pro VPS (s)",
},
{ "Setup.Recording$Mark instant recording",
"Direktaufzeichnung markieren",
@@ -3975,6 +4160,7 @@ const tI18nPhrase Phrases[] = {
"Oznaèi direktno snimanje",
"Otsesalvestuse märgistamine",
"Markér direkte optagelse",
+ "Oznaèit okam¾ité nahrávky",
},
{ "Setup.Recording$Name instant recording",
"Direktaufzeichnung benennen",
@@ -3996,6 +4182,7 @@ const tI18nPhrase Phrases[] = {
"Imenuj direktno snimanje",
"Otsesalvestuse nimi",
"Navngiv direkte optagelse",
+ "Pojmenovat okam¾ité nahrávky",
},
{ "Setup.Recording$Instant rec. time (min)",
"Dauer der Direktaufzeichnung (min)",
@@ -4017,6 +4204,7 @@ const tI18nPhrase Phrases[] = {
"Trajanje direktnog snimanja (min)",
"Otsesalvestuse kestus (min)",
"Længde af direkte optagelse (min)",
+ "Délka okam¾itého nahrávání (min)",
},
{ "Setup.Recording$Max. video file size (MB)",
"Max. Video Dateigröße (MB)",
@@ -4038,6 +4226,7 @@ const tI18nPhrase Phrases[] = {
"Maksimalna velièina datoteke (MB)",
"Maksimaalne failisuurus (MB)",
"Max. video filstørrelse (MB)",
+ "Maximální velikost nahrávky (MB)",
},
{ "Setup.Recording$Split edited files",
"Editierte Dateien aufteilen",
@@ -4059,6 +4248,7 @@ const tI18nPhrase Phrases[] = {
"Podijeli ureðene datoteke",
"Redigeeritud failide tükeldamine",
"Opdel redigerede filer",
+ "Dìlit editované soubory",
},
{ "Setup.Replay$Multi speed mode",
"MultiSpeed Modus",
@@ -4080,6 +4270,7 @@ const tI18nPhrase Phrases[] = {
"MultiSpeed naèin",
"Multi-kiiruse moodus",
"Multi hastighedsmodus",
+ "Vícerychlostní mód",
},
{ "Setup.Replay$Show replay mode",
"Wiedergabestatus anzeigen",
@@ -4101,6 +4292,7 @@ const tI18nPhrase Phrases[] = {
"Prika¾i naèin prikazivanja",
"Korduse moodus",
"Vis afspilningsmodus",
+ "Zobrazit re¾im pøehrávání",
},
{ "Setup.Replay$Resume ID",
"Wiedergabe ID",
@@ -4122,6 +4314,7 @@ const tI18nPhrase Phrases[] = {
"ID nastavka",
"Jätkamise ID",
"Genoptagelses ID",
+ "ID obnovení",
},
{ "Setup.Miscellaneous$Min. event timeout (min)",
"Mindest Event Pause (min)",
@@ -4143,6 +4336,7 @@ const tI18nPhrase Phrases[] = {
"Minimalno vrijeme pauze",
"Min. sündmuse kestus (min)",
"Mindste hændelsespause (min)",
+ "Min. pauza mezi událostmi (min)",
},
{ "Setup.Miscellaneous$Min. user inactivity (min)",
"Mindest Benutzer-Inaktivität (min)",
@@ -4164,6 +4358,7 @@ const tI18nPhrase Phrases[] = {
"Minimalno vrijeme neaktivnosti (min)",
"Min. kasutaja tegevusetus (min)",
"Min. bruger inaktivitet (min)",
+ "Èasový limit neaktivnosti (min)",
},
{ "Setup.Miscellaneous$SVDRP timeout (s)",
"SVDRP Timeout (s)",
@@ -4185,6 +4380,7 @@ const tI18nPhrase Phrases[] = {
"SVDRP vrijeme neaktivnosti",
"SVDRP ooteaeg (s)",
"SVDRP timeout (s)",
+ "Èasový limit SVDRP (s)",
},
{ "Setup.Miscellaneous$Zap timeout (s)",
"Zap Timeout (s)",
@@ -4206,6 +4402,7 @@ const tI18nPhrase Phrases[] = {
"",// hrv TODO
"Kanalivahetuse ooteaeg (s)",
"Zap timeout (s)",
+ "Èasový limit Zap (s)",
},
// The days of the week:
{ "MTWTFSS",
@@ -4228,6 +4425,7 @@ const tI18nPhrase Phrases[] = {
"PUSÈPSN", // hrv
"ETKNRLP",
"MTOTFLS",
+ "PUSÈPSN",
},
{ "MonTueWedThuFriSatSun", // must all be 3 letters!
"MonDieMitDonFreSamSon",
@@ -4249,6 +4447,7 @@ const tI18nPhrase Phrases[] = {
"PonUtoSriÈetPetSubNed", // hrv
" E T K N R L P ",
"ManTirOnsTorFreLørSøn",
+ "Po Út St Èt Pá So Ne ",
},
// The allowed characters in strings:
{ " abcdefghijklmnopqrstuvwxyz0123456789-.#~,/_@",
@@ -4271,6 +4470,7 @@ const tI18nPhrase Phrases[] = {
" abcèædðefghijklmnopqrs¹tuvwxyz¾0123456789-.#~,/_@", // hrv
" abcdefghijklmnopqrsðzþtuvwõäöüxyå0123456789-.#~,/_@",
" abcdefghijklmnopqrstuvwxyzæøå0123456789-.#~,/_@",
+ " aábcèdïeéìfghiíjklmnòoópqrøs¹t»uúùvwxyýz¾0123456789-.#~,/_@",
},
// The character maps for entering letters via the numeric keys:
{ " 0\t-.#~,/_@1\tabc2\tdef3\tghi4\tjkl5\tmno6\tpqrs7\ttuv8\twxyz9",
@@ -4293,6 +4493,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
" 0\t-.#~,/_@1\tabcäå2\tdef3\tghi4\tjkl5\tmnoõö6\tpqrsð7\ttuvü8\twxyzþ9",
" 0\t-.#~,/_@1\tabcæå2\tdef3\tghi4\tjkl5\tmnoø6\tpqrs7\ttuv8\twxyz9",
+ " 0\t-.#~,/_@1\tabcáè2\tdefïéì3\tghií4\tjkl5\tmnoòó6\tpqrsø¹7\ttuv»úù8\twxyzý¾9",
},
// Learning keys:
{ "Learning Remote Control Keys",
@@ -4315,6 +4516,7 @@ const tI18nPhrase Phrases[] = {
"Uèenje kôda daljinskog upravljaèa",
"Kaugjuhtimispuldi õpetamine",
"Lærer fjernbetjeningstaster",
+ "Uèení kódù dálkového ovládání",
},
{ "Phase 1: Detecting RC code type",
"Phase 1: FB Code feststellen",
@@ -4336,6 +4538,7 @@ const tI18nPhrase Phrases[] = {
"Faza 1: detektiranje kôda daljinskog upravljaèa.",
"Aste 1: Kodeerimissüsteemi tuvastamine",
"Fase 1: Detekterer fjernbetjenings-kodetype",
+ "Fáze 1: Detekce typu kódu",
},
{ "Press any key on the RC unit",
"Eine Taste auf der FB drücken",
@@ -4357,6 +4560,7 @@ const tI18nPhrase Phrases[] = {
"Pritisnite tipku na daljinskom upravljaèu",
"Vajuta puldil suvalist klahvi",
"Tryk vilkårlig tast på fjernbetjeningen",
+ "Stisknìte libovolnou klávesu ovládání",
},
{ "RC code detected!",
"FB Code erkannt!",
@@ -4378,6 +4582,7 @@ const tI18nPhrase Phrases[] = {
"Kôd daljinskog upravljaèa je prepoznat!",
"Kodeerimissüsteem tuvastatud!",
"Fjernbetjenings-kodetype fundet!",
+ "Kód byl detekován!",
},
{ "Do not press any key...",
"Keine Taste drücken...",
@@ -4399,6 +4604,7 @@ const tI18nPhrase Phrases[] = {
"Ne pritiskajte tipku...",
"Ära vajuta puldil ühtki klahvi...",
"Tryk ikke på nogen tast...",
+ "Nemaèkejte ¾ádné klávesy...",
},
{ "Phase 2: Learning specific key codes",
"Phase 2: Einzelne Tastencodes lernen",
@@ -4420,6 +4626,7 @@ const tI18nPhrase Phrases[] = {
"Faza 2: Uèenje posebnih kôdova",
"Aste 2: Klahvide õpetamine",
"Fase 2: Lær individuelle tast koder",
+ "Fáze 2: Uèení konkrétního kódu kláves",
},
{ "Press key for '%s'",
"Taste für '%s' drücken",
@@ -4441,6 +4648,7 @@ const tI18nPhrase Phrases[] = {
"Pritisnite tipku za '%s'",
"Vajuta klahvile '%s'",
"Tryk tasten for '%s'",
+ "Stisknìte klávesu pro '%s'",
},
{ "Press 'Up' to confirm",
"'Auf' drücken zum Bestätigen",
@@ -4462,6 +4670,7 @@ const tI18nPhrase Phrases[] = {
"Pritisnite 'Gore' za potvrdu",
"Kinnitamiseks vajuta 'Üles'",
"Tryk 'Op' for at bekræfte",
+ "Stisknìte 'Nahoru' pro potvrzení",
},
{ "Press 'Down' to continue",
"'Ab' drücken zum Weitermachen",
@@ -4483,6 +4692,7 @@ const tI18nPhrase Phrases[] = {
"Pritisnite 'Dolje' za nastavak",
"Jätkamiseks vajuta 'Alla'",
"Tryk 'Ned' for at fortsætte",
+ "Stisknìte 'Dolù' pro pokraèování",
},
{ "(press 'Up' to go back)",
"('Auf' drücken um zurückzugehen)",
@@ -4504,6 +4714,7 @@ const tI18nPhrase Phrases[] = {
"(pritisnite 'Gore' za nazad)",
"(tagasiminekuks vajuta 'Üles')",
"(tryk 'Op' for at gå tilbage)",
+ "(stisknìte 'Nahoru' pro zpìt)",
},
{ "(press 'Down' to end key definition)",
"('Ab' drücken zum Beenden)",
@@ -4525,6 +4736,7 @@ const tI18nPhrase Phrases[] = {
"(pritisnite 'Dolje' za kraj)",
"(lõpetamiseks vajuta 'Alla')",
"(tryk 'Ned' for at afslutte indlæringen)",
+ "(stisknìte 'Dolù' pro ukonèení)",
},
{ "(press 'Menu' to skip this key)",
"('Menü' drücken zum Überspringen)",
@@ -4546,6 +4758,7 @@ const tI18nPhrase Phrases[] = {
"pritisnite 'Izbor' da preskoèite ovu tipku",
"(selle klahvi vahelejätmiseks vajuta 'Menüü')",
"(tryk 'Menu' for at springe denne tast over)",
+ "(stisknìte 'Menu' pro pøeskoèení definice klávesy)",
},
{ "Phase 3: Saving key codes",
"Phase 3: Codes abspeichern",
@@ -4567,6 +4780,7 @@ const tI18nPhrase Phrases[] = {
"Faza 3: Spremanje kôdova tipki",
"Aste 3: Klavhikoodide salvestamine",
"Fase 3: Gemmer tast koder",
+ "Fáze 3: Ulo¾ení kódù",
},
{ "Press 'Up' to save, 'Down' to cancel",
"'Auf' speichert, 'Ab' bricht ab",
@@ -4588,6 +4802,7 @@ const tI18nPhrase Phrases[] = {
"'Gore' za potvrdu, 'Dolje' za prekid",
"Salvestamiseks vajuta 'Üles' ja katkestamiseks 'Alla'",
"Tryk 'Op' for at gemme, 'Ned' for at annullere",
+ "Stisknìte 'Nahoru' pro ulo¾ení, 'Dolù' pro zru¹ení",
},
// Key names:
{ "Key$Up",
@@ -4610,6 +4825,7 @@ const tI18nPhrase Phrases[] = {
"Gore",
"Üles",
"Op",
+ "Nahoru",
},
{ "Key$Down",
"Ab",
@@ -4631,6 +4847,7 @@ const tI18nPhrase Phrases[] = {
"Dolje",
"Alla",
"Ned",
+ "Dolù",
},
{ "Key$Menu",
"Menü",
@@ -4652,6 +4869,7 @@ const tI18nPhrase Phrases[] = {
"Izbor",
"Menüü",
"Menu",
+ "Menu",
},
{ "Key$Ok",
"Ok",
@@ -4673,6 +4891,7 @@ const tI18nPhrase Phrases[] = {
"Ok",
"Ok",
"Ok",
+ "Ok",
},
{ "Key$Back",
"Zurück",
@@ -4694,6 +4913,7 @@ const tI18nPhrase Phrases[] = {
"Nazad",
"Tagasi",
"Tilbage",
+ "Zpìt",
},
{ "Key$Left",
"Links",
@@ -4715,6 +4935,7 @@ const tI18nPhrase Phrases[] = {
"Lijevo",
"Vasakule",
"Venstre",
+ "Vlevo",
},
{ "Key$Right",
"Rechts",
@@ -4736,6 +4957,7 @@ const tI18nPhrase Phrases[] = {
"Desno",
"Paremale",
"Højre",
+ "Vpravo",
},
{ "Key$Red",
"Rot",
@@ -4757,6 +4979,7 @@ const tI18nPhrase Phrases[] = {
"Crveno",
"Punane",
"Rød",
+ "Èervený",
},
{ "Key$Green",
"Grün",
@@ -4778,6 +5001,7 @@ const tI18nPhrase Phrases[] = {
"Zeleno",
"Roheline",
"Grøn",
+ "Zelený",
},
{ "Key$Yellow",
"Gelb",
@@ -4799,6 +5023,7 @@ const tI18nPhrase Phrases[] = {
"®uto",
"Kollane",
"Gul",
+ "®lutý",
},
{ "Key$Blue",
"Blau",
@@ -4820,6 +5045,7 @@ const tI18nPhrase Phrases[] = {
"Plavo",
"Sinine",
"Blå",
+ "Modrý",
},
{ "Key$Info",
"Info",
@@ -4841,6 +5067,7 @@ const tI18nPhrase Phrases[] = {
"Info",
"Info",
"Info",
+ "Info",
},
{ "Key$Play",
"Wiedergabe",
@@ -4862,6 +5089,7 @@ const tI18nPhrase Phrases[] = {
"Start",
"Start",
"Afspil",
+ "Pøehrát",
},
{ "Key$Pause",
"Pause",
@@ -4883,6 +5111,7 @@ const tI18nPhrase Phrases[] = {
"Pauza",
"Paus",
"Pause",
+ "Pøeru¹it",
},
{ "Key$Stop",
"Stop",
@@ -4904,6 +5133,7 @@ const tI18nPhrase Phrases[] = {
"Stop",
"Stopp",
"Stop",
+ "Zastavit",
},
{ "Key$Record",
"Aufnehmen",
@@ -4925,6 +5155,7 @@ const tI18nPhrase Phrases[] = {
"Snimaj",
"Salvestamine",
"Optag",
+ "Nahrát",
},
{ "Key$FastFwd",
"Vorlauf",
@@ -4946,6 +5177,7 @@ const tI18nPhrase Phrases[] = {
"Naprijed",
"Edasikerimine",
"Spol fremad",
+ "Dopøedu",
},
{ "Key$FastRew",
"Rücklauf",
@@ -4967,6 +5199,7 @@ const tI18nPhrase Phrases[] = {
"Nazad",
"Tagasikerimine",
"Spol tilbage",
+ "Dozadu",
},
{ "Key$Power",
"Ausschalten",
@@ -4988,6 +5221,7 @@ const tI18nPhrase Phrases[] = {
"Iskljuèi",
"Toide",
"Sluk",
+ "Vypínaè",
},
{ "Key$Channel+",
"Kanal+",
@@ -5009,6 +5243,7 @@ const tI18nPhrase Phrases[] = {
"Program +",
"Kanal+",
"Kanal+",
+ "Kanál+",
},
{ "Key$Channel-",
"Kanal-",
@@ -5030,6 +5265,7 @@ const tI18nPhrase Phrases[] = {
"Program -",
"Kanal-",
"Kanal-",
+ "Kanál-",
},
{ "Key$Volume+",
"Lautstärke+",
@@ -5051,6 +5287,7 @@ const tI18nPhrase Phrases[] = {
"Glasnije", // hrv "Glasnocca +"
"Helitugevus+",
"Lydstyrke+",
+ "Hlasitost+",
},
{ "Key$Volume-",
"Lautstärke-",
@@ -5072,6 +5309,7 @@ const tI18nPhrase Phrases[] = {
"Ti¹e", // hrv Glasnocca -"
"Helitugevus-",
"Lydstyrke-",
+ "Hlasitost-",
},
{ "Key$Mute",
"Stumm",
@@ -5093,6 +5331,7 @@ const tI18nPhrase Phrases[] = {
"Bez zvuka",
"Hääletu",
"Sluk lyd",
+ "Ticho",
},
{ "Key$Audio",
"Audio",
@@ -5114,6 +5353,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"Audio",
"Audio",
+ "Zvuk",
},
// Miscellaneous:
{ "yes",
@@ -5136,6 +5376,7 @@ const tI18nPhrase Phrases[] = {
"da",
"jah",
"ja",
+ "ano",
},
{ "no",
"nein",
@@ -5157,6 +5398,7 @@ const tI18nPhrase Phrases[] = {
"ne",
"ei",
"nej",
+ "ne",
},
{ "off",
"aus",
@@ -5178,6 +5420,7 @@ const tI18nPhrase Phrases[] = {
"ugasi",
"välja",
"fra",
+ "vyp.",
},
{ "none",
"keine",
@@ -5199,6 +5442,7 @@ const tI18nPhrase Phrases[] = {
"nijedan",
"tühi",
"ingen",
+ "¾ádný",
},
{ "auto",
"auto",
@@ -5220,6 +5464,7 @@ const tI18nPhrase Phrases[] = {
"automatski",
"automaatne",
"automatisk",
+ "auto",
},
{ "top",
"oben",
@@ -5241,6 +5486,7 @@ const tI18nPhrase Phrases[] = {
"gore",
"üleval",
"top",
+ "hahoøe",
},
{ "bottom",
"unten",
@@ -5262,6 +5508,7 @@ const tI18nPhrase Phrases[] = {
"dolje",
"all",
"bund",
+ "dole",
},
{ "Disk",
"Disk",
@@ -5283,6 +5530,7 @@ const tI18nPhrase Phrases[] = {
"Disk",
"Ketas",
"Disk",
+ "Disk",
},
{ "free",
"frei",
@@ -5304,6 +5552,7 @@ const tI18nPhrase Phrases[] = {
"slobodno",
"vaba",
"fri",
+ "volno",
},
{ "Jump: ", // note the trailing blank
"Springen: ",
@@ -5325,6 +5574,7 @@ const tI18nPhrase Phrases[] = {
"Skoèi: ",
"Hüpe: ",
"Hop: ",
+ "Skok: ",
},
{ "Volume ", // note the trailing blank
"Lautstärke ",
@@ -5346,6 +5596,7 @@ const tI18nPhrase Phrases[] = {
"Glasnoæa ",
"Helitugevus ",
"Lydstyrke ",
+ "Hlasitost ",
},
{ " Stop replaying", // note the leading blank!
" Wiedergabe beenden",
@@ -5367,6 +5618,7 @@ const tI18nPhrase Phrases[] = {
" Prekini reprodukciju",
" Lõpeta taasesitamine",
" Stop afspilning",
+ " Zastavit pøehrávání",
},
{ " Stop recording ", // note the leading and trailing blanks!
" Aufzeichnung beenden ",
@@ -5388,6 +5640,7 @@ const tI18nPhrase Phrases[] = {
" Prekini snimanje ",
" Lõpeta salvestamine ",
" Stop optagelse ",
+ " Zastavit nahrávání ",
},
{ " Cancel editing", // note the leading blank!
" Schneiden abbrechen",
@@ -5409,6 +5662,7 @@ const tI18nPhrase Phrases[] = {
" Prekini ureðivanje",
" Katkesta monteerimine",
" Afbryd redigering",
+ " Zru¹it editaci",
},
{ "Switching primary DVB...",
"Primäres Interface wird umgeschaltet...",
@@ -5430,6 +5684,7 @@ const tI18nPhrase Phrases[] = {
"Preklapanje primarnog DVB ureðaja...",
"Esmase DVB seadme ümberlülitus...",
"Skifter primær DVB enhed...",
+ "Pøepnout primární DVB...",
},
{ "Up/Dn for new location - OK to move",
"Auf/Ab für neue Position - dann OK",
@@ -5451,6 +5706,7 @@ const tI18nPhrase Phrases[] = {
"Gore/Dolje na novu poziciju - zatim OK",
"'Üles/Alla' uus asukoht - 'OK' kinnitus",
"Op/Ned for ny placering - OK for at flytte",
+ "Nahoru/Dolu pro novou pozici - Ok pøesune",
},
{ "Editing process started",
"Schnitt gestartet",
@@ -5472,6 +5728,7 @@ const tI18nPhrase Phrases[] = {
"Rezanje je zapoèeto",
"Redigeerimine algas",
"Redigeringsproces startet",
+ "Editaèní proces zaèal",
},
{ "Editing process finished",
"Schnitt beendet",
@@ -5493,6 +5750,7 @@ const tI18nPhrase Phrases[] = {
"Rezanje zavr¹eno",
"Redigeerimine lõpetatud",
"Redigeringsproces afsluttet",
+ "Editaèní proces skonèil",
},
{ "Editing process failed!",
"Schnitt gescheitert!",
@@ -5514,6 +5772,7 @@ const tI18nPhrase Phrases[] = {
"Rezanje neuspje¹no!",
"Redigeerimine ebaõnnestus",
"Redigeringsproces fejlede!",
+ "Editaèní proces selhal!",
},
{ "Recording started",
"Aufzeichnung gestartet",
@@ -5535,6 +5794,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"Salvestamine algas",
"Optagelse startet",
+ "Zaèalo nahrávání",
},
{ "Pausing live video...",
"Live-Signal wird angehalten...",
@@ -5556,6 +5816,7 @@ const tI18nPhrase Phrases[] = {
"Zaustavljanje ¾ivog signala...",
"Saate edastamise peatamine...",
"Pausere live udsendelse...",
+ "Pøeru¹uje se bì¾ící program ...",
},
{ "Starting EPG scan",
"Beginne mit EPG-Scan",
@@ -5577,6 +5838,7 @@ const tI18nPhrase Phrases[] = {
"Poèinjem EPG-scan",
"EPG skaneerimine käivitatud",
"Starter EPG skanning",
+ "Zaèíná prohledávání EPG",
},
{ "This plugin has no setup parameters!",
"Dieses Plugin hat keine Setup-Parameter!",
@@ -5598,6 +5860,7 @@ const tI18nPhrase Phrases[] = {
"Ovaj dodatak (Plugin) nema parametara!",
"Sellel laienudusmoodulil ei ole seadeid!",
"Denne plugin har ingen parametre",
+ "Modul nemá konfiguraèní parametry!",
},
{ "Classic VDR",
"Klassischer VDR",
@@ -5619,6 +5882,7 @@ const tI18nPhrase Phrases[] = {
"Klasièni VDR",
"Klassikaline VDR",
"Klassisk VDR",
+ "Klasické VDR",
},
{ "ST:TNG Panels",
"ST:TNG Konsolen",
@@ -5640,6 +5904,7 @@ const tI18nPhrase Phrases[] = {
"ST:TNG Konzole",
"ST:TNG konsool",
"ST:TNG konsol",
+ "ST:TNG konzola",
},
{ "No title",
"Kein Titel",
@@ -5661,6 +5926,7 @@ const tI18nPhrase Phrases[] = {
"Bez titla",
"Pealkiri puudub",
"Ingen titel",
+ "Bez názvu",
},
{ NULL }
};
diff --git a/i18n.h b/i18n.h
index a179514..0cbf728 100644
--- a/i18n.h
+++ b/i18n.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: i18n.h 1.16 2005/09/09 14:50:35 kls Exp $
+ * $Id: i18n.h 1.17 2006/02/04 10:41:16 kls Exp $
*/
#ifndef __I18N_H
@@ -12,7 +12,7 @@
#include <stdio.h>
-const int I18nNumLanguages = 20;
+const int I18nNumLanguages = 21;
typedef const char *tI18nPhrase[I18nNumLanguages];
diff --git a/menu.c b/menu.c
index 4aa5397..d9c6b04 100644
--- a/menu.c
+++ b/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.407 2006/01/29 14:04:37 kls Exp $
+ * $Id: menu.c 1.410 2006/02/05 13:31:08 kls Exp $
*/
#include "menu.h"
@@ -1437,7 +1437,7 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key)
case kYellow: if (schedules)
return AddSubMenu(new cMenuWhatsOn(schedules, false, cMenuWhatsOn::CurrentChannel()));
break;
- case kBlue: if (Count())
+ case kBlue: if (Count() && otherChannel)
return Switch();
break;
case kOk: if (Count())
@@ -3083,7 +3083,7 @@ cChannel *cDisplayChannel::NextAvailableChannel(cChannel *Channel, int Direction
if (Direction) {
while (Channel) {
Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel);
- if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, 0))
+ if (Channel && !Channel->GroupSep() && (cDevice::PrimaryDevice()->ProvidesChannel(Channel, Setup.PrimaryLimit) || cDevice::GetDevice(Channel, 0)))
return Channel;
}
}
@@ -3326,7 +3326,7 @@ cDisplayTracks::cDisplayTracks(void)
:cOsdObject(true)
{
cDevice::PrimaryDevice()->EnsureAudioTrack();
- SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice() ? cDevice::CurrentChannel() : 0);
+ SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring() ? cDevice::CurrentChannel() : 0);
currentDisplayTracks = this;
numTracks = track = 0;
audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
diff --git a/menuitems.c b/menuitems.c
index 455070d..e238066 100644
--- a/menuitems.c
+++ b/menuitems.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menuitems.c 1.30 2006/01/21 12:27:14 kls Exp $
+ * $Id: menuitems.c 1.31 2006/02/04 12:47:08 kls Exp $
*/
#include "menuitems.h"
@@ -345,7 +345,7 @@ eOSState cMenuEditStrItem::ProcessKey(eKeys Key)
bool SameKey = Key == lastKey;
if (Key != kNone)
lastKey = Key;
- else if (!newchar && autoAdvanceTimeout.TimedOut()) {
+ else if (!newchar && k0 <= NORMALKEY(lastKey) && NORMALKEY(lastKey) <= k9 && autoAdvanceTimeout.TimedOut()) {
AdvancePos();
newchar = true;
currentChar = NULL;
@@ -427,7 +427,7 @@ eOSState cMenuEditStrItem::ProcessKey(eKeys Key)
value[pos] = toupper(Inc(tolower(value[pos]), NORMALKEY(Key) == kUp));
else
value[pos] = Inc( value[pos], NORMALKEY(Key) == kUp);
- newchar = true;
+ newchar = false;
}
else
return cMenuEditItem::ProcessKey(Key);
diff --git a/osd.c b/osd.c
index 46f0a74..40b60e1 100644
--- a/osd.c
+++ b/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.65 2005/12/30 15:42:04 kls Exp $
+ * $Id: osd.c 1.66 2006/02/05 13:46:37 kls Exp $
*/
#include "osd.h"
@@ -112,7 +112,7 @@ cBitmap::cBitmap(const char *FileName)
LoadXpm(FileName);
}
-cBitmap::cBitmap(char *Xpm[])
+cBitmap::cBitmap(const char *const Xpm[])
{
bitmap = NULL;
x0 = 0;
@@ -251,9 +251,9 @@ bool cBitmap::LoadXpm(const char *FileName)
return Result;
}
-bool cBitmap::SetXpm(char *Xpm[], bool IgnoreNone)
+bool cBitmap::SetXpm(const char *const Xpm[], bool IgnoreNone)
{
- char **p = Xpm;
+ const char *const *p = Xpm;
int w, h, n, c;
if (4 != sscanf(*p, "%d %d %d %d", &w, &h, &n, &c)) {
esyslog("ERROR: faulty 'values' line in XPM: '%s'", *p);
diff --git a/osd.h b/osd.h
index 9156393..d716df8 100644
--- a/osd.h
+++ b/osd.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: osd.h 1.50 2005/12/18 12:56:21 kls Exp $
+ * $Id: osd.h 1.51 2006/02/05 13:46:37 kls Exp $
*/
#ifndef __OSD_H
@@ -112,7 +112,7 @@ public:
///< this offset (unless specified otherwise).
cBitmap(const char *FileName);
///< Creates a bitmap and loads an XPM image from the given file.
- cBitmap(char *Xpm[]);
+ cBitmap(const char *const Xpm[]);
///< Creates a bitmap from the given XPM data.
virtual ~cBitmap();
int X0(void) const { return x0; }
@@ -140,7 +140,7 @@ public:
bool LoadXpm(const char *FileName);
///< Calls SetXpm() with the data from the file FileName.
///< Returns true if the operation was successful.
- bool SetXpm(char *Xpm[], bool IgnoreNone = false);
+ bool SetXpm(const char *const Xpm[], bool IgnoreNone = false);
///< Sets this bitmap to the given XPM data. Any previous bitmap or
///< palette data will be overwritten with the new data.
///< If IgnoreNone is true, a "none" color entry will be ignored.
diff --git a/osdbase.c b/osdbase.c
index d81c33b..65b66cb 100644
--- a/osdbase.c
+++ b/osdbase.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: osdbase.c 1.28 2006/01/08 11:40:02 kls Exp $
+ * $Id: osdbase.c 1.29 2006/02/05 14:37:03 kls Exp $
*/
#include "osdbase.h"
@@ -280,6 +280,12 @@ void cOsdMenu::CursorUp(void)
return;
while (--tmpCurrent != current) {
if (tmpCurrent < 0) {
+ if (first > 0) {
+ // make non-selectable items at the beginning visible:
+ first = 0;
+ Display();
+ return;
+ }
if (Setup.MenuScrollWrap)
tmpCurrent = last + 1;
else
@@ -312,6 +318,12 @@ void cOsdMenu::CursorDown(void)
return;
while (++tmpCurrent != current) {
if (tmpCurrent > last) {
+ if (first < last - displayMenuItems) {
+ // make non-selectable items at the end visible:
+ first = last - displayMenuItems + 1;
+ Display();
+ return;
+ }
if (Setup.MenuScrollWrap)
tmpCurrent = -1;
else
diff --git a/recording.c b/recording.c
index 5c57e18..e7efba0 100644
--- a/recording.c
+++ b/recording.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recording.c 1.133 2006/01/20 17:18:59 kls Exp $
+ * $Id: recording.c 1.134 2006/02/05 12:34:08 kls Exp $
*/
#include "recording.h"
@@ -604,6 +604,7 @@ char *cRecording::SortName(void) const
{
if (!sortBuffer) {
char *s = StripEpisodeName(strdup(FileName() + strlen(VideoDirectory) + 1));
+ strreplace(s, '/', 'a'); // some locales ignore '/' when sorting
int l = strxfrm(NULL, s, 0) + 1;
sortBuffer = MALLOC(char, l);
strxfrm(sortBuffer, s, l);
diff --git a/remux.c b/remux.c
index c48e5f9..31ad719 100644
--- a/remux.c
+++ b/remux.c
@@ -11,7 +11,7 @@
* 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.53 2006/01/08 11:40:16 kls Exp $
+ * $Id: remux.c 1.54 2006/02/03 16:19:02 kls Exp $
*/
#include "remux.h"
@@ -248,6 +248,14 @@ private:
scanPicture
};
int state;
+ void HandleStartCode(const uchar *const Data, cRingBufferLinear *const ResultBuffer, const uchar *&Payload, const uchar StreamID, const ePesHeader MpegLevel);
+ inline bool ScanDataForStartCodeSlow(const uchar *const Data);
+ inline bool ScanDataForStartCodeFast(const uchar *&Data, const uchar *Limit);
+ inline bool ScanDataForStartCode(const uchar *&Data, int &Done, int &Todo);
+ inline void AdjustCounters(const int Delta, int &Done, int &Todo);
+ inline bool ScanForEndOfPictureSlow(const uchar *&Data);
+ inline bool ScanForEndOfPictureFast(const uchar *&Data, const uchar *Limit);
+ inline bool ScanForEndOfPicture(const uchar *&Data, const uchar *Limit);
public:
cVideoRepacker(void);
virtual void Reset(void);
@@ -267,6 +275,162 @@ void cVideoRepacker::Reset(void)
state = syncing;
}
+void cVideoRepacker::HandleStartCode(const uchar *const Data, cRingBufferLinear *const ResultBuffer, const uchar *&Payload, const uchar StreamID, const ePesHeader MpegLevel)
+{
+ // synchronisation is detected some bytes after frame start.
+ const int SkippedBytesLimit = 4;
+
+ // which kind of start code have we got?
+ switch (*Data) {
+ case 0xB9 ... 0xFF: // system start codes
+ LOG("cVideoRepacker: found system start code: stream seems to be scrambled or not demultiplexed");
+ break;
+ case 0xB0 ... 0xB1: // reserved start codes
+ case 0xB6:
+ LOG("cVideoRepacker: found reserved start code: stream seems to be scrambled");
+ break;
+ case 0xB4: // sequence error code
+ LOG("cVideoRepacker: found sequence error code: stream seems to be damaged");
+ case 0xB2: // user data start code
+ case 0xB5: // extension start code
+ break;
+ case 0xB7: // sequence end code
+ case 0xB3: // sequence header code
+ case 0xB8: // group start code
+ case 0x00: // picture start code
+ if (state == scanPicture) {
+ // the above start codes indicate that the current picture is done. So
+ // push out the packet to start a new packet for the next picuture. If
+ // the byte count get's negative then the current buffer ends in a
+ // partitial start code that must be stripped off, as it shall be put
+ // in the next packet.
+ PushOutPacket(ResultBuffer, Payload, Data - 3 - Payload);
+ // go on with syncing to the next picture
+ state = syncing;
+ }
+ if (state == syncing) {
+ if (initiallySyncing) // omit report for the typical initial case
+ initiallySyncing = false;
+ else if (skippedBytes > SkippedBytesLimit) // report that syncing dropped some bytes
+ LOG("cVideoRepacker: skipped %d bytes to sync on next picture", skippedBytes - SkippedBytesLimit);
+ skippedBytes = 0;
+ // if there is a PES header available, then use it ...
+ if (pesHeaderBackupLen > 0) {
+ // ISO 13818-1 says:
+ // In the case of video, if a PTS is present in a PES packet header
+ // it shall refer to the access unit containing the first picture start
+ // code that commences in this PES packet. A picture start code commences
+ // in PES packet if the first byte of the picture start code is present
+ // in the PES packet.
+ memcpy(pesHeader, pesHeaderBackup, pesHeaderBackupLen);
+ pesHeaderLen = pesHeaderBackupLen;
+ pesHeaderBackupLen = 0;
+ }
+ else {
+ // ... otherwise create a continuation PES header
+ pesHeaderLen = 0;
+ pesHeader[pesHeaderLen++] = 0x00;
+ pesHeader[pesHeaderLen++] = 0x00;
+ pesHeader[pesHeaderLen++] = 0x01;
+ pesHeader[pesHeaderLen++] = StreamID; // video stream ID
+ pesHeader[pesHeaderLen++] = 0x00; // length still unknown
+ pesHeader[pesHeaderLen++] = 0x00; // length still unknown
+
+ if (MpegLevel == phMPEG2) {
+ pesHeader[pesHeaderLen++] = 0x80;
+ pesHeader[pesHeaderLen++] = 0x00;
+ pesHeader[pesHeaderLen++] = 0x00;
+ }
+ else
+ pesHeader[pesHeaderLen++] = 0x0F;
+ }
+ // append the first three bytes of the start code
+ pesHeader[pesHeaderLen++] = 0x00;
+ pesHeader[pesHeaderLen++] = 0x00;
+ pesHeader[pesHeaderLen++] = 0x01;
+ // the next packet's payload will begin with the fourth byte of
+ // the start code (= the actual code)
+ Payload = Data;
+ // as there is no length information available, assume the
+ // maximum we can hold in one PES packet
+ packetTodo = maxPacketSize - pesHeaderLen;
+ // go on with finding the picture data
+ state++;
+ }
+ break;
+ case 0x01 ... 0xAF: // slice start codes
+ if (state == findPicture) {
+ // go on with scanning the picture data
+ state++;
+ }
+ break;
+ }
+}
+
+bool cVideoRepacker::ScanDataForStartCodeSlow(const uchar *const Data)
+{
+ scanner <<= 8;
+ bool FoundStartCode = (scanner == 0x00000100);
+ scanner |= *Data;
+ return FoundStartCode;
+}
+
+bool cVideoRepacker::ScanDataForStartCodeFast(const uchar *&Data, const uchar *Limit)
+{
+ Limit--;
+
+ while (Data < Limit && (Data = (const uchar *)memchr(Data, 0x01, Limit - Data))) {
+ if (Data[-2] || Data[-1])
+ Data += 3;
+ else {
+ scanner = 0x00000100 | *++Data;
+ return true;
+ }
+ }
+
+ Data = Limit;
+ unsigned long *Scanner = (unsigned long *)(Data - 3);
+ scanner = ntohl(*Scanner);
+ return false;
+}
+
+bool cVideoRepacker::ScanDataForStartCode(const uchar *&Data, int &Done, int &Todo)
+{
+ const uchar *const DataOrig = Data;
+ const int MinDataSize = 4;
+
+ if (Todo < MinDataSize || (state != syncing && packetTodo < MinDataSize))
+ return ScanDataForStartCodeSlow(Data);
+
+ int Limit = Todo;
+ if (state != syncing && Limit > packetTodo)
+ Limit = packetTodo;
+
+ if (ScanDataForStartCodeSlow(Data))
+ return true;
+
+ if (ScanDataForStartCodeSlow(++Data)) {
+ AdjustCounters(1, Done, Todo);
+ return true;
+ }
+ ++Data;
+
+ bool FoundStartCode = ScanDataForStartCodeFast(Data, DataOrig + Limit);
+ AdjustCounters(Data - DataOrig, Done, Todo);
+ return FoundStartCode;
+}
+
+void cVideoRepacker::AdjustCounters(const int Delta, int &Done, int &Todo)
+{
+ Done += Delta;
+ Todo -= Delta;
+
+ if (state <= syncing)
+ skippedBytes += Delta;
+ else
+ packetTodo -= Delta;
+}
+
void cVideoRepacker::Repack(cRingBufferLinear *ResultBuffer, const uchar *Data, int Count)
{
// synchronisation is detected some bytes after frame start.
@@ -300,98 +464,9 @@ void cVideoRepacker::Repack(cRingBufferLinear *ResultBuffer, const uchar *Data,
if (state <= syncing)
skippedBytes++;
// did we reach a start code?
- scanner <<= 8;
- if (scanner != 0x00000100)
- scanner |= *data;
- else {
- scanner |= *data;
-
- // which kind of start code have we got?
- switch (*data) {
- case 0xB9 ... 0xFF: // system start codes
- LOG("cVideoRepacker: found system start code: stream seems to be scrambled or not demultiplexed");
- break;
- case 0xB0 ... 0xB1: // reserved start codes
- case 0xB6:
- LOG("cVideoRepacker: found reserved start code: stream seems to be scrambled");
- break;
- case 0xB4: // sequence error code
- LOG("cVideoRepacker: found sequence error code: stream seems to be damaged");
- case 0xB2: // user data start code
- case 0xB5: // extension start code
- break;
- case 0xB7: // sequence end code
- case 0xB3: // sequence header code
- case 0xB8: // group start code
- case 0x00: // picture start code
- if (state == scanPicture) {
- // the above start codes indicate that the current picture is done. So
- // push out the packet to start a new packet for the next picuture. If
- // the byte count get's negative then the current buffer ends in a
- // partitial start code that must be stripped off, as it shall be put
- // in the next packet.
- PushOutPacket(ResultBuffer, payload, data - 3 - payload);
- // go on with syncing to the next picture
- state = syncing;
- }
- if (state == syncing) {
- if (initiallySyncing) // omit report for the typical initial case
- initiallySyncing = false;
- else if (skippedBytes > SkippedBytesLimit) // report that syncing dropped some bytes
- LOG("cVideoRepacker: skipped %d bytes to sync on next picture", skippedBytes - SkippedBytesLimit);
- skippedBytes = 0;
- // if there is a PES header available, then use it ...
- if (pesHeaderBackupLen > 0) {
- // ISO 13818-1 says:
- // In the case of video, if a PTS is present in a PES packet header
- // it shall refer to the access unit containing the first picture start
- // code that commences in this PES packet. A picture start code commences
- // in PES packet if the first byte of the picture start code is present
- // in the PES packet.
- memcpy(pesHeader, pesHeaderBackup, pesHeaderBackupLen);
- pesHeaderLen = pesHeaderBackupLen;
- pesHeaderBackupLen = 0;
- }
- else {
- // ... otherwise create a continuation PES header
- pesHeaderLen = 0;
- pesHeader[pesHeaderLen++] = 0x00;
- pesHeader[pesHeaderLen++] = 0x00;
- pesHeader[pesHeaderLen++] = 0x01;
- pesHeader[pesHeaderLen++] = Data[3]; // video stream ID
- pesHeader[pesHeaderLen++] = 0x00; // length still unknown
- pesHeader[pesHeaderLen++] = 0x00; // length still unknown
-
- if (mpegLevel == phMPEG2) {
- pesHeader[pesHeaderLen++] = 0x80;
- pesHeader[pesHeaderLen++] = 0x00;
- pesHeader[pesHeaderLen++] = 0x00;
- }
- else
- pesHeader[pesHeaderLen++] = 0x0F;
- }
- // append the first three bytes of the start code
- pesHeader[pesHeaderLen++] = 0x00;
- pesHeader[pesHeaderLen++] = 0x00;
- pesHeader[pesHeaderLen++] = 0x01;
- // the next packet's payload will begin with the fourth byte of
- // the start code (= the actual code)
- payload = data;
- // as there is no length information available, assume the
- // maximum we can hold in one PES packet
- packetTodo = maxPacketSize - pesHeaderLen;
- // go on with finding the picture data
- state++;
- }
- break;
- case 0x01 ... 0xAF: // slice start codes
- if (state == findPicture) {
- // go on with scanning the picture data
- state++;
- }
- break;
- }
- }
+ if (ScanDataForStartCode(data, done, todo))
+ HandleStartCode(data, ResultBuffer, payload, Data[3], mpegLevel);
+ // move on
data++;
done++;
todo--;
@@ -501,6 +576,79 @@ void cVideoRepacker::Repack(cRingBufferLinear *ResultBuffer, const uchar *Data,
}
}
+bool cVideoRepacker::ScanForEndOfPictureSlow(const uchar *&Data)
+{
+ localScanner <<= 8;
+ localScanner |= *Data++;
+ // check start codes which follow picture data
+ switch (localScanner) {
+ case 0x00000100: // picture start code
+ case 0x000001B8: // group start code
+ case 0x000001B3: // sequence header code
+ case 0x000001B7: // sequence end code
+ return true;
+ }
+ return false;
+}
+
+bool cVideoRepacker::ScanForEndOfPictureFast(const uchar *&Data, const uchar *Limit)
+{
+ Limit--;
+
+ while (Data < Limit && (Data = (const uchar *)memchr(Data, 0x01, Limit - Data))) {
+ if (Data[-2] || Data[-1])
+ Data += 3;
+ else {
+ localScanner = 0x00000100 | *++Data;
+ // check start codes which follow picture data
+ switch (localScanner) {
+ case 0x00000100: // picture start code
+ case 0x000001B8: // group start code
+ case 0x000001B3: // sequence header code
+ case 0x000001B7: // sequence end code
+ Data++;
+ return true;
+ default:
+ Data += 3;
+ }
+ }
+ }
+
+ Data = Limit + 1;
+ unsigned long *LocalScanner = (unsigned long *)(Data - 4);
+ localScanner = ntohl(*LocalScanner);
+ return false;
+}
+
+bool cVideoRepacker::ScanForEndOfPicture(const uchar *&Data, const uchar *Limit)
+{
+ const uchar *const DataOrig = Data;
+ const int MinDataSize = 4;
+ bool FoundEndOfPicture;
+
+ if (Limit - Data <= MinDataSize) {
+ FoundEndOfPicture = false;
+ while (Data < Limit) {
+ if (ScanForEndOfPictureSlow(Data)) {
+ FoundEndOfPicture = true;
+ break;
+ }
+ }
+ }
+ else {
+ FoundEndOfPicture = true;
+ if (!ScanForEndOfPictureSlow(Data)) {
+ if (!ScanForEndOfPictureSlow(Data)) {
+ if (!ScanForEndOfPictureFast(Data, Limit))
+ FoundEndOfPicture = false;
+ }
+ }
+ }
+
+ localStart += (Data - DataOrig);
+ return FoundEndOfPicture;
+}
+
int cVideoRepacker::BreakAt(const uchar *Data, int Count)
{
if (initiallySyncing)
@@ -522,19 +670,8 @@ int cVideoRepacker::BreakAt(const uchar *Data, int Count)
const uchar *data = Data + PesPayloadOffset + localStart;
const uchar *limit = Data + Count;
// scan data
- while (data < limit) {
- localStart++;
- localScanner <<= 8;
- localScanner |= *data++;
- // check start codes which follow picture data
- switch (localScanner) {
- case 0x00000100: // picture start code
- case 0x000001B8: // group start code
- case 0x000001B3: // sequence header code
- case 0x000001B7: // sequence end code
- return data - Data;
- }
- }
+ if (ScanForEndOfPicture(data, limit))
+ return data - Data;
}
// just fill up packet and append next start code
return PesPayloadOffset + packetTodo + 4;
diff --git a/runvdr b/runvdr
index b03a63b..355549c 100755
--- a/runvdr
+++ b/runvdr
@@ -5,12 +5,9 @@
# If VDR exits abnormally, the driver will be reloaded
# and VDR restarted.
#
-# Set the environment variable VDRUSR to the user id you
-# want VDR to run with. If VDRUSR is not set, VDR will run
-# as user 'vdr'.
-#
# Since this script loads the DVB driver, it must be started
-# as user 'root'.
+# as user 'root'. Add the option "-u username" to run VDR
+# under the given user name.
#
# Any command line parameters will be passed on to the
# actual 'vdr' program.
@@ -18,11 +15,11 @@
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
-# $Id: runvdr 1.15 2005/12/31 16:04:53 kls Exp $
+# $Id: runvdr 1.16 2006/02/04 15:20:48 kls Exp $
DVBDIR="../DVB/driver"
VDRPRG="./vdr"
-VDRCMD="$VDRPRG -u $VDRUSR -w 60 $*"
+VDRCMD="$VDRPRG -w 60 $*"
LSMOD="`/sbin/lsmod | grep -w '^dvb' | wc -l`"
KILL="/usr/bin/killall -q -TERM"
diff --git a/skinclassic.c b/skinclassic.c
index 18851a8..f471b30 100644
--- a/skinclassic.c
+++ b/skinclassic.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: skinclassic.c 1.13 2006/01/01 14:37:58 kls Exp $
+ * $Id: skinclassic.c 1.14 2006/02/05 14:51:39 kls Exp $
*/
#include "skinclassic.h"
@@ -169,6 +169,8 @@ public:
virtual void SetEvent(const cEvent *Event);
virtual void SetRecording(const cRecording *Recording);
virtual void SetText(const char *Text, bool FixedFont);
+ virtual int GetTextAreaWidth(void) const;
+ virtual const cFont *GetTextAreaFont(bool FixedFont) const;
virtual void Flush(void);
};
@@ -357,11 +359,20 @@ void cSkinClassicDisplayMenu::SetRecording(const cRecording *Recording)
void cSkinClassicDisplayMenu::SetText(const char *Text, bool FixedFont)
{
- const cFont *font = cFont::GetFont(FixedFont ? fontFix : fontOsd);
- textScroller.Set(osd, x0, y2, x1 - x0 - 2 * ScrollWidth, y3 - y2, Text, font, Theme.Color(clrMenuText), Theme.Color(clrBackground));
+ textScroller.Set(osd, x0, y2, GetTextAreaWidth(), y3 - y2, Text, GetTextAreaFont(FixedFont), Theme.Color(clrMenuText), Theme.Color(clrBackground));
SetScrollbar();
}
+int cSkinClassicDisplayMenu::GetTextAreaWidth(void) const
+{
+ return x1 - x0 - 2 * ScrollWidth;
+}
+
+const cFont *cSkinClassicDisplayMenu::GetTextAreaFont(bool FixedFont) const
+{
+ return cFont::GetFont(FixedFont ? fontFix : fontOsd);
+}
+
void cSkinClassicDisplayMenu::Flush(void)
{
cString date = DayDateTime();
diff --git a/skins.c b/skins.c
index e65d290..0952b11 100644
--- a/skins.c
+++ b/skins.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: skins.c 1.7 2006/01/08 11:40:18 kls Exp $
+ * $Id: skins.c 1.8 2006/02/05 14:53:04 kls Exp $
*/
#include "skins.h"
@@ -108,6 +108,16 @@ const char *cSkinDisplayMenu::GetTabbedText(const char *s, int Tab)
return buffer;
}
+int cSkinDisplayMenu::GetTextAreaWidth(void) const
+{
+ return 0;
+}
+
+const cFont *cSkinDisplayMenu::GetTextAreaFont(bool) const
+{
+ return NULL;
+}
+
// --- cSkinDisplayReplay::cProgressBar --------------------------------------
cSkinDisplayReplay::cProgressBar::cProgressBar(int Width, int Height, int Current, int Total, const cMarks *Marks, tColor ColorSeen, tColor ColorRest, tColor ColorSelected, tColor ColorMark, tColor ColorCurrent)
diff --git a/skins.h b/skins.h
index f862cc1..96f2821 100644
--- a/skins.h
+++ b/skins.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: skins.h 1.10 2006/01/08 11:40:21 kls Exp $
+ * $Id: skins.h 1.11 2006/02/05 14:59:57 kls Exp $
*/
#ifndef __SKINS_H
@@ -160,6 +160,19 @@ public:
///< the Scroll() function will be called to drive scrolling that text if
///< necessary.
//XXX ??? virtual void SetHelp(const char *Help) = 0;
+ virtual int GetTextAreaWidth(void) const;
+ ///< Returns the width in pixel of the area which is used to display text
+ ///< with SetText(). The width of the area is the width of the central area
+ ///< minus the width of any possibly displayed scroll-bar or other decoration.
+ ///< The default implementation returns 0. Therefore a caller of this method
+ ///< must be prepared to receive 0 if the plugin doesn't implement this method.
+ virtual const cFont *GetTextAreaFont(bool FixedFont) const;
+ ///< Returns a pointer to the font which is used to display text with SetText().
+ ///< The parameter FixedFont has the same meaning as in SetText(). The default
+ ///< implementation returns NULL. Therefore a caller of this method must be
+ ///< prepared to receive NULL if the plugin doesn't implement this method.
+ ///< The returned pointer is valid a long as the instance of cSkinDisplayMenu
+ ///< exists.
};
class cSkinDisplayReplay : public cSkinDisplay {
diff --git a/skinsttng.c b/skinsttng.c
index 1e2d8cd..97e8fc8 100644
--- a/skinsttng.c
+++ b/skinsttng.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: skinsttng.c 1.16 2006/01/01 14:38:14 kls Exp $
+ * $Id: skinsttng.c 1.18 2006/02/05 14:51:39 kls Exp $
*/
// Star Trek: The Next Generation® is a registered trademark of Paramount Pictures
@@ -347,6 +347,8 @@ public:
virtual void SetEvent(const cEvent *Event);
virtual void SetRecording(const cRecording *Recording);
virtual void SetText(const char *Text, bool FixedFont);
+ virtual int GetTextAreaWidth(void) const;
+ virtual const cFont *GetTextAreaFont(bool FixedFont) const;
virtual void Flush(void);
};
@@ -618,10 +620,20 @@ void cSkinSTTNGDisplayMenu::SetRecording(const cRecording *Recording)
void cSkinSTTNGDisplayMenu::SetText(const char *Text, bool FixedFont)
{
+ textScroller.Set(osd, x3, y3, GetTextAreaWidth(), y4 - y3, Text, GetTextAreaFont(FixedFont), Theme.Color(clrMenuText), Theme.Color(clrBackground));
+ SetScrollbar();
+}
+
+int cSkinSTTNGDisplayMenu::GetTextAreaWidth(void) const
+{
+ return x4 - x3;
+}
+
+const cFont *cSkinSTTNGDisplayMenu::GetTextAreaFont(bool FixedFont) const
+{
const cFont *font = cFont::GetFont(FixedFont ? fontFix : fontOsd);
font = cFont::GetFont(fontSml);//XXX -> make a way to let the text define which font to use
- textScroller.Set(osd, x3, y3, x4 - x3, y4 - y3, Text, font, Theme.Color(clrMenuText), Theme.Color(clrBackground));
- SetScrollbar();
+ return font;
}
void cSkinSTTNGDisplayMenu::Flush(void)
@@ -721,7 +733,7 @@ void cSkinSTTNGDisplayReplay::SetTitle(const char *Title)
osd->DrawText(x3 + 5, y0, Title, Theme.Color(clrReplayTitle), frameColor, cFont::GetFont(fontSml), x4 - x3 - 5);
}
-static char **ReplaySymbols[2][2][5] = {
+static const char *const *ReplaySymbols[2][2][5] = {
{ { pause_xpm, srew_xpm, srew1_xpm, srew2_xpm, srew3_xpm },
{ pause_xpm, sfwd_xpm, sfwd1_xpm, sfwd2_xpm, sfwd3_xpm }, },
{ { play_xpm, frew_xpm, frew1_xpm, frew2_xpm, frew3_xpm },
diff --git a/symbols/arrowdown.xpm b/symbols/arrowdown.xpm
index a3f49cd..8ef6b0a 100644
--- a/symbols/arrowdown.xpm
+++ b/symbols/arrowdown.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * arrowdown_xpm[] = {
+static const char *const arrowdown_xpm[] = {
"12 12 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/arrowup.xpm b/symbols/arrowup.xpm
index a177b4a..9ee2e6c 100644
--- a/symbols/arrowup.xpm
+++ b/symbols/arrowup.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * arrowup_xpm[] = {
+static const char *const arrowup_xpm[] = {
"12 12 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/audio.xpm b/symbols/audio.xpm
index 26f7cab..44021ad 100644
--- a/symbols/audio.xpm
+++ b/symbols/audio.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * audio_xpm[] = {
+static const char *const audio_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/audioleft.xpm b/symbols/audioleft.xpm
index 3536c25..8f68360 100644
--- a/symbols/audioleft.xpm
+++ b/symbols/audioleft.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * audioleft_xpm[] = {
+static const char *const audioleft_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/audioright.xpm b/symbols/audioright.xpm
index fc03cd3..b349792 100644
--- a/symbols/audioright.xpm
+++ b/symbols/audioright.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * audioright_xpm[] = {
+static const char *const audioright_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/audiostereo.xpm b/symbols/audiostereo.xpm
index fdd7b84..4c59a5e 100644
--- a/symbols/audiostereo.xpm
+++ b/symbols/audiostereo.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * audiostereo_xpm[] = {
+static const char *const audiostereo_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/dolbydigital.xpm b/symbols/dolbydigital.xpm
index e51709e..432b476 100644
--- a/symbols/dolbydigital.xpm
+++ b/symbols/dolbydigital.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * dolbydigital_xpm[] = {
+static const char *const dolbydigital_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/encrypted.xpm b/symbols/encrypted.xpm
index f2ae082..fc3178b 100644
--- a/symbols/encrypted.xpm
+++ b/symbols/encrypted.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * encrypted_xpm[] = {
+static const char *const encrypted_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/ffwd.xpm b/symbols/ffwd.xpm
index 7d1edc2..fb39329 100644
--- a/symbols/ffwd.xpm
+++ b/symbols/ffwd.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * ffwd_xpm[] = {
+static const char *const ffwd_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/ffwd1.xpm b/symbols/ffwd1.xpm
index f78db80..4b81436 100644
--- a/symbols/ffwd1.xpm
+++ b/symbols/ffwd1.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * ffwd1_xpm[] = {
+static const char *const ffwd1_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/ffwd2.xpm b/symbols/ffwd2.xpm
index f117fc2..19e62d1 100644
--- a/symbols/ffwd2.xpm
+++ b/symbols/ffwd2.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * ffwd2_xpm[] = {
+static const char *const ffwd2_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/ffwd3.xpm b/symbols/ffwd3.xpm
index 8b9e9b0..2bc65bd 100644
--- a/symbols/ffwd3.xpm
+++ b/symbols/ffwd3.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * ffwd3_xpm[] = {
+static const char *const ffwd3_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/frew.xpm b/symbols/frew.xpm
index d8a6c47..3583735 100644
--- a/symbols/frew.xpm
+++ b/symbols/frew.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * frew_xpm[] = {
+static const char *const frew_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/frew1.xpm b/symbols/frew1.xpm
index 493c229..4aab792 100644
--- a/symbols/frew1.xpm
+++ b/symbols/frew1.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * frew1_xpm[] = {
+static const char *const frew1_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/frew2.xpm b/symbols/frew2.xpm
index 81fc0ee..707edfc 100644
--- a/symbols/frew2.xpm
+++ b/symbols/frew2.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * frew2_xpm[] = {
+static const char *const frew2_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/frew3.xpm b/symbols/frew3.xpm
index 19b183c..95a3d15 100644
--- a/symbols/frew3.xpm
+++ b/symbols/frew3.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * frew3_xpm[] = {
+static const char *const frew3_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/mute.xpm b/symbols/mute.xpm
index 0f1292f..90fb79c 100644
--- a/symbols/mute.xpm
+++ b/symbols/mute.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * mute_xpm[] = {
+static const char *const mute_xpm[] = {
"26 20 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/pause.xpm b/symbols/pause.xpm
index c1d82c3..945b794 100644
--- a/symbols/pause.xpm
+++ b/symbols/pause.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * pause_xpm[] = {
+static const char *const pause_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/play.xpm b/symbols/play.xpm
index 0e088f8..ca27fa3 100644
--- a/symbols/play.xpm
+++ b/symbols/play.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * play_xpm[] = {
+static const char *const play_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/radio.xpm b/symbols/radio.xpm
index f4d1fc9..a14b0a9 100644
--- a/symbols/radio.xpm
+++ b/symbols/radio.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * radio_xpm[] = {
+static const char *const radio_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/recording.xpm b/symbols/recording.xpm
index ea7bbd6..155df61 100644
--- a/symbols/recording.xpm
+++ b/symbols/recording.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * recording_xpm[] = {
+static const char *const recording_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/sfwd.xpm b/symbols/sfwd.xpm
index 38468e5..e79c69b 100644
--- a/symbols/sfwd.xpm
+++ b/symbols/sfwd.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * sfwd_xpm[] = {
+static const char *const sfwd_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/sfwd1.xpm b/symbols/sfwd1.xpm
index f07801b..67cf6ce 100644
--- a/symbols/sfwd1.xpm
+++ b/symbols/sfwd1.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * sfwd1_xpm[] = {
+static const char *const sfwd1_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/sfwd2.xpm b/symbols/sfwd2.xpm
index 784744a..a90bb92 100644
--- a/symbols/sfwd2.xpm
+++ b/symbols/sfwd2.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * sfwd2_xpm[] = {
+static const char *const sfwd2_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/sfwd3.xpm b/symbols/sfwd3.xpm
index 05abde6..e03965c 100644
--- a/symbols/sfwd3.xpm
+++ b/symbols/sfwd3.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * sfwd3_xpm[] = {
+static const char *const sfwd3_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/srew.xpm b/symbols/srew.xpm
index 4dbae7e..05b9dc1 100644
--- a/symbols/srew.xpm
+++ b/symbols/srew.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * srew_xpm[] = {
+static const char *const srew_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/srew1.xpm b/symbols/srew1.xpm
index 101cdf7..43de690 100644
--- a/symbols/srew1.xpm
+++ b/symbols/srew1.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * srew1_xpm[] = {
+static const char *const srew1_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/srew2.xpm b/symbols/srew2.xpm
index f664532..f06a1e3 100644
--- a/symbols/srew2.xpm
+++ b/symbols/srew2.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * srew2_xpm[] = {
+static const char *const srew2_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/srew3.xpm b/symbols/srew3.xpm
index b82a6c7..b881980 100644
--- a/symbols/srew3.xpm
+++ b/symbols/srew3.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * srew3_xpm[] = {
+static const char *const srew3_xpm[] = {
"28 26 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/teletext.xpm b/symbols/teletext.xpm
index 49fc3c2..345ab9e 100644
--- a/symbols/teletext.xpm
+++ b/symbols/teletext.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * teletext_xpm[] = {
+static const char *const teletext_xpm[] = {
"27 18 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/symbols/volume.xpm b/symbols/volume.xpm
index 9cbc0b2..c6186fe 100644
--- a/symbols/volume.xpm
+++ b/symbols/volume.xpm
@@ -1,5 +1,5 @@
/* XPM */
-static char * volume_xpm[] = {
+static const char *const volume_xpm[] = {
"28 14 2 1",
". c #FFFFFF",
"+ c #000000",
diff --git a/timers.c b/timers.c
index ab42680..e5b9ea6 100644
--- a/timers.c
+++ b/timers.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: timers.c 1.45 2006/01/28 15:09:05 kls Exp $
+ * $Id: timers.c 1.46 2006/02/03 15:20:14 kls Exp $
*/
#include "timers.h"
@@ -535,13 +535,22 @@ cTimer *cTimers::GetTimer(cTimer *Timer)
cTimer *cTimers::GetMatch(time_t t)
{
+ static int LastPending = -1;
cTimer *t0 = NULL;
for (cTimer *ti = First(); ti; ti = Next(ti)) {
if (!ti->Recording() && ti->Matches(t)) {
+ if (ti->Pending()) {
+ if (ti->Index() > LastPending)
+ LastPending = ti->Index();
+ else
+ continue;
+ }
if (!t0 || ti->Priority() > t0->Priority())
t0 = ti;
}
}
+ if (!t0)
+ LastPending = -1;
return t0;
}
diff --git a/tools.c b/tools.c
index 031c120..fb88789 100644
--- a/tools.c
+++ b/tools.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: tools.c 1.112 2006/01/20 14:01:28 kls Exp $
+ * $Id: tools.c 1.114 2006/02/05 11:05:56 kls Exp $
*/
#include "tools.h"
@@ -1054,10 +1054,9 @@ bool cSafeFile::Close(void)
// --- cUnbufferedFile -------------------------------------------------------
-//#define USE_FADVISE
+#define USE_FADVISE
-#define READ_AHEAD MEGABYTE(2)
-#define WRITE_BUFFER MEGABYTE(10)
+#define WRITE_BUFFER KILOBYTE(800)
cUnbufferedFile::cUnbufferedFile(void)
{
@@ -1073,8 +1072,17 @@ int cUnbufferedFile::Open(const char *FileName, int Flags, mode_t Mode)
{
Close();
fd = open(FileName, Flags, Mode);
- begin = end = ahead = -1;
+ curpos = 0;
+#ifdef USE_FADVISE
+ begin = lastpos = ahead = 0;
+ cachedstart = 0;
+ cachedend = 0;
+ readahead = KILOBYTE(128);
written = 0;
+ totwritten = 0;
+ if (fd >= 0)
+ posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM); // we could use POSIX_FADV_SEQUENTIAL, but we do our own readahead, disabling the kernel one.
+#endif
return fd;
}
@@ -1082,16 +1090,9 @@ int cUnbufferedFile::Close(void)
{
#ifdef USE_FADVISE
if (fd >= 0) {
- if (ahead > end)
- end = ahead;
- if (begin >= 0 && end > begin) {
- //dsyslog("close buffer: %d (flush: %d bytes, %ld-%ld)", fd, written, begin, end);
- if (written)
- fdatasync(fd);
- posix_fadvise(fd, begin, end - begin, POSIX_FADV_DONTNEED);
- }
- begin = end = ahead = -1;
- written = 0;
+ if (totwritten) // if we wrote anything make sure the data has hit the disk before
+ fdatasync(fd); // calling fadvise, as this is our last chance to un-cache it.
+ posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
}
#endif
int OldFd = fd;
@@ -1099,45 +1100,84 @@ int cUnbufferedFile::Close(void)
return close(OldFd);
}
+// When replaying and going e.g. FF->PLAY the position jumps back 2..8M
+// hence we do not want to drop recently accessed data at once.
+// We try to handle the common cases such as PLAY->FF->PLAY, small
+// jumps, moving editing marks etc.
+
+#define FADVGRAN KILOBYTE(4) // AKA fadvise-chunk-size; PAGE_SIZE or getpagesize(2) would also work.
+#define READCHUNK MEGABYTE(8)
+
+void cUnbufferedFile::SetReadAhead(size_t ra)
+{
+ readahead = ra;
+}
+
+int cUnbufferedFile::FadviseDrop(off_t Offset, off_t Len)
+{
+ // rounding up the window to make sure that not PAGE_SIZE-aligned data gets freed.
+ return posix_fadvise(fd, Offset - (FADVGRAN - 1), Len + (FADVGRAN - 1) * 2, POSIX_FADV_DONTNEED);
+}
+
off_t cUnbufferedFile::Seek(off_t Offset, int Whence)
{
- if (fd >= 0)
- return lseek(fd, Offset, Whence);
- return -1;
+ if (Whence == SEEK_SET && Offset == curpos)
+ return curpos;
+ curpos = lseek(fd, Offset, Whence);
+ return curpos;
}
ssize_t cUnbufferedFile::Read(void *Data, size_t Size)
{
if (fd >= 0) {
#ifdef USE_FADVISE
- off_t pos = lseek(fd, 0, SEEK_CUR);
- // jump forward - adjust end position
- if (pos > end)
- end = pos;
- // after adjusting end - don't clear more than previously requested
- if (end > ahead)
- end = ahead;
- // jump backward - drop read ahead of previous run
- if (pos < begin)
- end = ahead;
- if (begin >= 0 && end > begin)
- posix_fadvise(fd, begin - KILOBYTE(200), end - begin + KILOBYTE(200), POSIX_FADV_DONTNEED);//XXX macros/parameters???
- begin = pos;
+ off_t jumped = curpos-lastpos; // nonzero means we're not at the last offset
+ if ((cachedstart < cachedend) && (curpos < cachedstart || curpos > cachedend)) {
+ // current position is outside the cached window -- invalidate it.
+ FadviseDrop(cachedstart, cachedend-cachedstart);
+ cachedstart = curpos;
+ cachedend = curpos;
+ }
+ cachedstart = min(cachedstart, curpos);
#endif
ssize_t bytesRead = safe_read(fd, Data, Size);
#ifdef USE_FADVISE
if (bytesRead > 0) {
- pos += bytesRead;
- end = pos;
- // this seems to trigger a non blocking read - this
- // may or may not have been finished when we will be called next time.
- // If it is not finished we can't release the not yet filled buffers.
- // So this is commented out till we find a better solution.
- //posix_fadvise(fd, pos, READ_AHEAD, POSIX_FADV_WILLNEED);
- ahead = pos + READ_AHEAD;
+ curpos += bytesRead;
+ cachedend = max(cachedend, curpos);
+
+ // Read ahead:
+ // no jump? (allow small forward jump still inside readahead window).
+ if (jumped >= 0 && jumped <= (off_t)readahead) {
+ // Trigger the readahead IO, but only if we've used at least
+ // 1/2 of the previously requested area. This avoids calling
+ // fadvise() after every read() call.
+ if (ahead - curpos < (off_t)(readahead / 2)) {
+ posix_fadvise(fd, curpos, readahead, POSIX_FADV_WILLNEED);
+ ahead = curpos + readahead;
+ cachedend = max(cachedend, ahead);
+ }
+ if (readahead < Size * 32) { // automagically tune readahead size.
+ readahead = Size * 32;
+ }
+ }
+ else
+ ahead = curpos; // jumped -> we really don't want any readahead, otherwise e.g. fast-rewind gets in trouble.
}
- else
- end = pos;
+
+ if (cachedstart < cachedend) {
+ if (curpos - cachedstart > READCHUNK * 2) {
+ // current position has moved forward enough, shrink tail window.
+ FadviseDrop(cachedstart, curpos - READCHUNK - cachedstart);
+ cachedstart = curpos - READCHUNK;
+ }
+ else if (cachedend > ahead && cachedend - curpos > READCHUNK * 2) {
+ // current position has moved back enough, shrink head window.
+ FadviseDrop(curpos + READCHUNK, cachedend - curpos + READCHUNK);
+ cachedend = curpos + READCHUNK;
+ }
+ }
+ lastpos = curpos;
#endif
return bytesRead;
}
@@ -1147,28 +1187,46 @@ ssize_t cUnbufferedFile::Read(void *Data, size_t Size)
ssize_t cUnbufferedFile::Write(const void *Data, size_t Size)
{
if (fd >=0) {
-#ifdef USE_FADVISE
- off_t pos = lseek(fd, 0, SEEK_CUR);
-#endif
ssize_t bytesWritten = safe_write(fd, Data, Size);
#ifdef USE_FADVISE
- if (bytesWritten >= 0) {
+ if (bytesWritten > 0) {
+ begin = min(begin, curpos);
+ curpos += bytesWritten;
written += bytesWritten;
- if (begin >= 0) {
- if (pos < begin)
- begin = pos;
- }
- else
- begin = pos;
- if (pos + bytesWritten > end)
- end = pos + bytesWritten;
+ lastpos = max(lastpos, curpos);
if (written > WRITE_BUFFER) {
- //dsyslog("flush buffer: %d (%d bytes, %ld-%ld)", fd, written, begin, end);
- fdatasync(fd);
- if (begin >= 0 && end > begin)
- posix_fadvise(fd, begin, end - begin, POSIX_FADV_DONTNEED);
- begin = end = -1;
+ if (lastpos > begin) {
+ // Now do three things:
+ // 1) Start writeback of begin..lastpos range
+ // 2) Drop the already written range (by the previous fadvise call)
+ // 3) Handle nonpagealigned data.
+ // This is why we double the WRITE_BUFFER; the first time around the
+ // last (partial) page might be skipped, writeback will start only after
+ // second call; the third call will still include this page and finally
+ // drop it from cache.
+ off_t headdrop = min(begin, WRITE_BUFFER * 2L);
+ posix_fadvise(fd, begin - headdrop, lastpos - begin + headdrop, POSIX_FADV_DONTNEED);
+ }
+ begin = lastpos = curpos;
+ totwritten += written;
written = 0;
+ // The above fadvise() works when writing slowly (recording), but could
+ // leave cached data around when writing at a high rate, e.g. when cutting,
+ // because by the time we try to flush the cached pages (above) the data
+ // can still be dirty - we are faster than the disk I/O.
+ // So we do another round of flushing, just like above, but at larger
+ // intervals -- this should catch any pages that couldn't be released
+ // earlier.
+ if (totwritten > MEGABYTE(32)) {
+ // It seems in some setups, fadvise() does not trigger any I/O and
+ // a fdatasync() call would be required do all the work (reiserfs with some
+ // kind of write gathering enabled), but the syncs cause (io) load..
+ // Uncomment the next line if you think you need them.
+ //fdatasync(fd);
+ off_t headdrop = min(curpos - totwritten, totwritten * 2L);
+ posix_fadvise(fd, curpos - totwritten - headdrop, totwritten + headdrop, POSIX_FADV_DONTNEED);
+ totwritten = 0;
+ }
}
}
#endif
diff --git a/tools.h b/tools.h
index 7e57744..a52ced8 100644
--- a/tools.h
+++ b/tools.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: tools.h 1.90 2006/01/15 16:19:56 kls Exp $
+ * $Id: tools.h 1.92 2006/02/04 14:27:05 kls Exp $
*/
#ifndef __TOOLS_H
@@ -242,15 +242,22 @@ public:
class cUnbufferedFile {
private:
int fd;
+ off_t curpos;
+ off_t cachedstart;
+ off_t cachedend;
off_t begin;
- off_t end;
+ off_t lastpos;
off_t ahead;
- ssize_t written;
+ size_t readahead;
+ size_t written;
+ size_t totwritten;
+ int FadviseDrop(off_t Offset, off_t Len);
public:
cUnbufferedFile(void);
~cUnbufferedFile();
int Open(const char *FileName, int Flags, mode_t Mode = DEFFILEMODE);
int Close(void);
+ void SetReadAhead(size_t ra);
off_t Seek(off_t Offset, int Whence);
ssize_t Read(void *Data, size_t Size);
ssize_t Write(const void *Data, size_t Size);
diff --git a/transfer.c b/transfer.c
index b8313df..afaccd1 100644
--- a/transfer.c
+++ b/transfer.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: transfer.c 1.32 2006/01/28 14:23:38 kls Exp $
+ * $Id: transfer.c 1.33 2006/01/29 17:24:39 kls Exp $
*/
#include "transfer.h"
@@ -20,7 +20,6 @@ cTransfer::cTransfer(int VPid, const int *APids, const int *DPids, const int *SP
{
ringBuffer = new cRingBufferLinear(TRANSFERBUFSIZE, TS_SIZE * 2, true, "Transfer");
remux = new cRemux(VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids);
- needsBufferReserve = Setup.UseDolbyDigital && VPid != 0 && DPids && DPids[0] != 0;
}
cTransfer::~cTransfer()
diff --git a/transfer.h b/transfer.h
index fa88f12..7210ac0 100644
--- a/transfer.h
+++ b/transfer.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: transfer.h 1.10 2005/08/13 10:16:02 kls Exp $
+ * $Id: transfer.h 1.11 2006/01/29 17:24:43 kls Exp $
*/
#ifndef __TRANSFER_H
@@ -20,7 +20,6 @@ class cTransfer : public cReceiver, public cPlayer, public cThread {
private:
cRingBufferLinear *ringBuffer;
cRemux *remux;
- bool needsBufferReserve;
protected:
virtual void Activate(bool On);
virtual void Receive(uchar *Data, int Length);
diff --git a/vdr.c b/vdr.c
index 3913f62..5e17a37 100644
--- a/vdr.c
+++ b/vdr.c
@@ -22,7 +22,7 @@
*
* The project's page is at http://www.cadsoft.de/vdr
*
- * $Id: vdr.c 1.246 2006/01/29 14:35:31 kls Exp $
+ * $Id: vdr.c 1.249 2006/02/05 12:57:10 kls Exp $
*/
#include <getopt.h>
@@ -97,6 +97,10 @@ static bool SetUser(const char *UserName)
fprintf(stderr, "vdr: cannot set user id %u: %s\n", (unsigned int)user->pw_uid, strerror(errno));
return false;
}
+ if (prctl(PR_SET_DUMPABLE, 2, 0, 0, 0) < 0) {
+ fprintf(stderr, "vdr: warning - cannot set dumpable: %s\n", strerror(errno));
+ // always non-fatal, and will not work with kernel < 2.6.13
+ }
}
return true;
}
@@ -709,7 +713,7 @@ int main(int argc, char *argv[])
if (Channel->Modification(CHANNELMOD_RETUNE)) {
cRecordControls::ChannelDataModified(Channel);
if (Channel->Number() == cDevice::CurrentChannel()) {
- if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice()) {
+ if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring()) {
if (cDevice::ActualDevice()->ProvidesTransponder(Channel)) { // avoids retune on devices that don't really access the transponder
isyslog("retuning due to modification of channel %d", Channel->Number());
Channels.SwitchTo(Channel->Number());
@@ -796,8 +800,12 @@ int main(int argc, char *argv[])
bool WasMenu = Interact && Interact->IsMenu();
if (Menu)
DELETE_MENU;
- else if (cControl::Control() && cOsd::IsOpen())
- cControl::Control()->Hide();
+ else if (cControl::Control()) {
+ if (cOsd::IsOpen())
+ cControl::Control()->Hide();
+ else
+ WasOpen = false;
+ }
if (!WasOpen || !WasMenu && !Setup.MenuButtonCloses)
Menu = new cMenuMain;
}