summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS38
-rw-r--r--HISTORY46
-rw-r--r--MANUAL6
-rw-r--r--PLUGINS.html35
-rwxr-xr-xPLUGINS/src/sky/getskyepg.pl4
-rw-r--r--channels.conf53
-rw-r--r--channels.conf.cable277
-rw-r--r--ci.c5
-rw-r--r--ci.h4
-rw-r--r--config.c5
-rw-r--r--config.h5
-rw-r--r--device.c35
-rw-r--r--dvbdevice.c24
-rw-r--r--dvbosd.c4
-rw-r--r--dvbplayer.c9
-rw-r--r--eit.c51
-rw-r--r--eit.h3
-rw-r--r--i18n.c175
-rw-r--r--interface.c8
-rw-r--r--libdtv/libsi/include/libsi.h248
-rw-r--r--libdtv/libsi/include/si_tables.h156
-rw-r--r--libdtv/libsi/si_debug_services.c130
-rw-r--r--libdtv/libsi/si_debug_services.h34
-rw-r--r--libdtv/libsi/si_parser.c430
-rw-r--r--lirc.c26
-rw-r--r--lirc.h3
-rw-r--r--menu.c3
-rw-r--r--menuitems.c47
-rw-r--r--osd.c8
-rw-r--r--osdbase.c6
-rw-r--r--rcu.c7
-rw-r--r--rcu.h3
-rw-r--r--recording.c29
-rw-r--r--remote.h3
-rw-r--r--tools.c14
-rw-r--r--transfer.c9
-rw-r--r--vdr.c38
37 files changed, 1464 insertions, 517 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 09a2bd6..fad8e0b 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -49,6 +49,8 @@ Martin Hammerschmid <martin@hammerschmid.com>
for adding a missing 'public' keyword in device.h
for pointing out a bug in displaying the group separators in the channel display
for reporting a problem with a missing initialization of 'number' in cChannel
+ for implementing a "resume ID" which allows several users to each have their own
+ resume.vdr files
Bastian Guse <bastian@nocopy.de>
for writing the FORMATS entry for timers.conf
@@ -163,6 +165,10 @@ Stefan Huelswitt <huels@iname.com>
encrypted channel
for reporting a problem with timers when channel IDs have a 'source' that is 0
for reporting a new/delete malloc/free mismatch in ringbuffer.c
+ for reporting a crash in case the index file can't be accessed any more during replay
+ for adapting VDR to 'libdtv' version 0.0.5
+ for reporting a bug in handling of Ca parameters with values <= MAXDEVICES, which
+ don't indicate an actual encrypted channel
Ulrich Röder <roeder@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than
@@ -219,6 +225,8 @@ Werner Fink <werner@suse.de>
for improving thread locking in the ring buffer to avoid possible race conditions
under heavy load
for improving keyboard detection
+ for adding some missing cAudio handling calls
+ for replacing the 'for' loops in StripAudioPackets() with memset() calls
Rolf Hakenes <hakenes@hippomi.de>
for providing 'libdtv' and adapting the EIT mechanisms to it
@@ -240,6 +248,7 @@ Simon Bauschulte <SemiSchwabe@Brutzel.de>
Andy Grobb <Charly98@01019freenet.de>
for completing storing the current audio volume in the setup.conf file
for fixing the EPG display in case Setup.ShowInfoOnChSwitch is set to "no"
+ for reporting a bug in handling min/max borders when entering integer values
Thomas Heiligenmann <thomas@heiligenmann.de>
for implementing the SVDRP commands LSTR and DELR
@@ -444,6 +453,9 @@ Oliver Endriss <o.endriss@gmx.de>
for providing examples for 'diseqc.conf'
for improving deleting stale lock files
for fixing high CPU load in 'Transfer Mode'
+ for making the "Left" and "Right" buttons set the cursor to the first or last
+ list item even if the list consist only of a single page, like, for instance,
+ the Main menu
Reinhard Walter Buchner <rw.buchner@freenet.de>
for adding some satellites to 'sources.conf'
@@ -471,6 +483,8 @@ Gerhard Steiner <steiner@mail.austria.com>
shall be executed from the "Recordings" menu
for suggesting to interpret the character '|' in the description texts of EPG
records as a newline character
+ for reporting a bug in displaying messages in the status line in case they exceed
+ the OSD width
Jaakko Hyvätti <jaakko@hyvatti.iki.fi>
for translating OSD texts to the Finnish language
@@ -553,3 +567,27 @@ Torsten Herz <torsten.herz@web.de>
Steffen Becker <stbecker@rbg.informatik.tu-darmstadt.de>
for reporting a problem with CPU load peaks (in the EPG scanner)
+
+Florian Bartels <Florian.Bartels@envisage.de>
+ for reporting a faulty behaviour of the "Mute" key in case the channel display
+ is visible
+
+Sascha Volkenandt <sascha@akv-soft.de>
+ for helping to fix a faulty behaviour of the "Mute" key in case the channel display
+ is visible
+ for making the 'epg.data' file being read after all plugins have been started
+
+Malcolm Caldwell <malcolm.caldwell@ntu.edu.au>
+ for modifying LOF handling to allow for C-band reception
+
+Ludwig Nussel <ludwig.nussel@web.de>
+ for making the LIRC thread avoid high CPU load in case the connection to LIRC gets lost
+ for fixing handling repeat function with LIRC
+ for reporting a problem with the LIRC remote control trying to learn keys even if it
+ couldn't connect to the LIRC daemon
+
+Thomas Koch <tom@harhar.net>
+ for his support in keeping the Premiere World channels up to date in 'channels.conf'
+
+Stefan Hußfeldt <vdr@marvin.on-luebeck.de>
+ for his help in keeping 'channels.conf.cable' up to date
diff --git a/HISTORY b/HISTORY
index a5c70f0..7e69524 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1987,3 +1987,49 @@ Video Disk Recorder Revision History
- Modified the EPG scanner to avoid CPU load peaks (thanks to Steffen Becker for
reporting this one).
- Fixed support for Viaccess CAMs (thanks to Axel Gruber for helping to debug this).
+
+2003-04-13: Version 1.1.27
+
+- The CAM is now accessed only if the current channel actually has a non-zero Ca
+ value, and CAM access is completely suppressed during replay, which avoids
+ problems in case the CAM is attached to the primary DVB device.
+- The "Left" and "Right" buttons now set the cursor to the first or last list item
+ even if the list consist only of a single page, like, for instance, the Main menu
+ (thanks to Oliver Endriss).
+- Made the log message "OSD window width must be a multiple of 4..." a debug message
+ instead of an error message, so it can be avoided by using a log level less than 3.
+- Updated Greek language texts (thanks to Dimitrios Dimitrakos).
+- Fixed faulty behaviour of the "Mute" key in case the channel display is visible
+ (thanks to Florian Bartels for reporting this one and Sascha Volkenandt for
+ helping to fix it).
+- Modified LOF handling to allow for C-band reception (thanks to Malcolm Caldwell).
+- Added some missing cAudio handling calls (thanks to Werner Fink).
+- Replaced the 'for' loops in StripAudioPackets() with memset() calls (thanks to
+ Werner Fink).
+- Further increased the timeout until an index file is considerd no longer to be
+ written.
+- Fixed a crash in case the index file can't be accessed any more during replay
+ (thanks to Stefan Huelswitt for reporting this one).
+- Fixed displaying messages in the status line in case they exceed the OSD width
+ (thanks to Gerhard Steiner for reporting this one).
+- Avoiding high CPU load in case the connection to LIRC gets lost (thanks to
+ Ludwig Nussel).
+- Fixed handling repeat function with LIRC (thanks to Ludwig Nussel).
+- Fixed handling min/max borders when entering integer values (thanks to Andy
+ Grobb for reporting this one).
+- Implemented a "resume ID" which allows several users to each have their own
+ resume.vdr files (thanks to Martin Hammerschmid). This parameter can be set in
+ the "Setup/Replay" menu (see MANUAL for details).
+- Now using 'libdtv' version 0.0.5 (thanks to Rolf Hakenes for the new version
+ and Stefan Huelswitt for adapting VDR to it).
+- If no device with an MPEG decoder can be found at startup, the first device
+ is now used as primary device (just to have some device).
+- Adjusted some Premiere channels in 'channels.conf' (thanks to Thomas Koch).
+- Updated 'channels.conf.cable' (thanks to Stefan Hußfeldt).
+- The 'epg.data' file is now read after all plugins have been started (thanks
+ to Sascha Volkenandt).
+- The LIRC remote control no longer tries to learn keys if it can't connect to
+ the LIRC daemon (thanks to Ludwig Nussel for reporting this one). The same
+ applies to the RCU remote control in case of errors during startup.
+- Fixed handling of Ca parameters with values <= MAXDEVICES, which don't indicate
+ an actual encrypted channel (thanks to Stefan Huelswitt for reporting this one).
diff --git a/MANUAL b/MANUAL
index 73a1b6e..b5f00d1 100644
--- a/MANUAL
+++ b/MANUAL
@@ -589,6 +589,12 @@ Video Disk Recorder User's Manual
Show replay mode = no Turns displaying the current replay mode on or off.
+ Resume ID = 0 Defines an additional ID that can be used in a multi user
+ environment, so that every user has his/her own resume
+ files for each recording. The valid range is 0...99, with
+ 0 resulting in a file named 'resume.vdr', and any other
+ value resulting in 'resume.n.vdr'.
+
Miscellaneous:
Min. event timeout = 30
diff --git a/PLUGINS.html b/PLUGINS.html
index fe65130..d6c3776 100644
--- a/PLUGINS.html
+++ b/PLUGINS.html
@@ -21,18 +21,18 @@ VDR program and present itself to the user.
The <i>internal</i> interface provides the plugin code access to VDR's internal data
structures and allows it to hook itself into specific areas to perform special actions.
<p>
-<!--X1.1.13--><table width=100%><tr><td bgcolor=#0000AA>&nbsp;</td><td width=100%>
-Important modifications introduced in version 1.1.13 are marked like this.
-<!--X1.1.13--></td></tr></table>
-<!--X1.1.14--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%>
+<!--X1.1.14--><table width=100%><tr><td bgcolor=#0000AA>&nbsp;</td><td width=100%>
Important modifications introduced in version 1.1.14 are marked like this.
<!--X1.1.14--></td></tr></table>
-<!--X1.1.15--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%>
+<!--X1.1.15--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%>
Important modifications introduced in version 1.1.15 are marked like this.
<!--X1.1.15--></td></tr></table>
-<!--X1.1.17--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%>
+<!--X1.1.17--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%>
Important modifications introduced in version 1.1.17 are marked like this.
<!--X1.1.17--></td></tr></table>
+<!--X1.1.27--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%>
+Important modifications introduced in version 1.1.27 are marked like this.
+<!--X1.1.27--></td></tr></table>
<hr>
<h1>Table Of Contents</h1>
@@ -506,7 +506,7 @@ in the call to VDR.
If the user selects the main menu entry of a plugin, VDR calls the function
-<!--X1.1.17--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%>
+<!--X1.1.17--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%>
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
virtual cOsdObject *MainMenuAction(void);
</pre></td></tr></table><p>
@@ -1011,7 +1011,6 @@ bool DevicePoll(cPoller &amp;Poller, int TimeoutMs = 0);
</pre></td></tr></table><p>
to determine whether the device is ready for further data.
-<!--X1.1.13--><table width=100%><tr><td bgcolor=#0000AA>&nbsp;</td><td width=100%>
<p>
If the player can provide more than a single audio track, it can implement the
following functions to make them available:
@@ -1022,9 +1021,8 @@ virtual const char **GetAudioTracks(int *CurrentTrack = NULL);
virtual void SetAudioTrack(int Index);
</pre></td></tr></table><p>
-<!--X1.1.13--></td></tr></table>
<p>
-<!--X1.1.15--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%>
+<!--X1.1.15--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%>
If there is an additional audio track that has to be replayed with external hardware,
the player shall call its member function
@@ -1260,7 +1258,6 @@ virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
These functions will be called with the desired source or channel and shall return whether
this device can provide the requested source or channel and whether tuning to it was successful,
repectively.
-<!--X1.1.13--><table width=100%><tr><td bgcolor=#0000AA>&nbsp;</td><td width=100%>
<p>
<b>Audio selection</b>
<p>
@@ -1273,7 +1270,6 @@ virtual const char **GetAudioTracksDevice(int *CurrentTrack = NULL) const;
virtual void SetAudioTrackDevice(int Index);
</pre></td></tr></table><p>
-<!--X1.1.13--></td></tr></table>
<p>
<b>Recording</b>
<p>
@@ -1307,7 +1303,7 @@ The functions to implement replaying capabilites are
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
virtual bool HasDecoder(void) const;
-<!--X1.1.14--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%>
+<!--X1.1.14--><table width=100%><tr><td bgcolor=#0000AA>&nbsp;</td><td width=100%>
virtual bool CanReplay(void) const;
<!--X1.1.14--></td></tr></table>
virtual bool SetPlayMode(ePlayMode PlayMode);
@@ -1369,7 +1365,7 @@ shut down (delete) all devices when the program terminates. It is therefore
important that the devices are created on the heap, using the <tt>new</tt>
operator!
-<!--X1.1.15--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%>
+<!--X1.1.15--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%>
<a name="Dolby Digital"><hr><h2>Dolby Digital</h2>
<center><i><b>"The stereo effect may only be experienced if stereo equipment is used!"</b></i></center><p>
@@ -1480,6 +1476,17 @@ the incoming data (by calling your <tt>Action()</tt> function).
In case you need to do any other setup steps, like opening a file or initializing
member variables, you should do so before calling <tt>Start()</tt>.
<p>
+<!--X1.1.27--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%>
+If your remote control for some reason can't work (maybe because it was unable to
+open some file handle it requires) it can implement the virtual function
+
+<p><table><tr><td bgcolor=#F0F0F0><pre><br>
+virtual bool Ready(void);
+</pre></td></tr></table><p>
+
+and have it return <i>false</i>. In that case VDR will not try to learn keys from
+that remote control.
+<!--X1.1.27--></td></tr></table>
VDR will handle everything necessary to learn the key mappings of your remote
control. In order to do so, it will first call the virtual function <tt>Initialize()</tt>,
in which you should take all necessary steps to make sure your remote control
diff --git a/PLUGINS/src/sky/getskyepg.pl b/PLUGINS/src/sky/getskyepg.pl
index 7fd7bd0..46c2d7f 100755
--- a/PLUGINS/src/sky/getskyepg.pl
+++ b/PLUGINS/src/sky/getskyepg.pl
@@ -8,7 +8,7 @@
#
# See the README file for copyright information and how to reach the author.
#
-# $Id: getskyepg.pl 1.1 2002/11/10 10:05:17 kls Exp $
+# $Id: getskyepg.pl 1.2 2003/04/02 16:21:47 kls Exp $
use Getopt::Std;
use Time::Local;
@@ -33,7 +33,7 @@ $SkyWebPage = "www.ananova.com/tv/frontpage.html";
$WGET = "/usr/bin/wget -q -O-";
$LOGGER = "/usr/bin/logger -t SKYEPG";
-$DST = 0; ##XXX TODO find out whether DST is active!
+$DST = -3600; ##XXX TODO find out whether DST is active!
$SecsInDay = 86400;
$MaxFrequency = 1000;
diff --git a/channels.conf b/channels.conf
index 0dc0a28..2f0c7eb 100644
--- a/channels.conf
+++ b/channels.conf
@@ -18,7 +18,7 @@ arte:11836:h:S19.2E:27500:401:402:404:0:28109:0:0:0
ORF1:12692:h:S19.2E:22000:160:161:165:102:13001:0:0:0
ORF2:12692:h:S19.2E:22000:500:501:505:102:13002:0:0:0
ZDF.info:11954:h:S19.2E:27500:610:620:0:0:28011:0:0:0
-CNN:12168:v:S19.2E:27500:165:100:0:0:28512:0:0:0
+CNN:11778:v:S19.2E:27500:165:100:0:0:28522:0:0:0
Super RTL:12188:h:S19.2E:27500:165:120:65:0:12040:0:0:0
VOX:12188:h:S19.2E:27500:167:136:71:0:12060:0:0:0
:#DW TV:10788:v:S19.2E:22000:305:306:0:0:8905:0:0:0
@@ -29,10 +29,11 @@ HOT:12480:v:S19.2E:27500:1279:1280:0:0:40:0:0:0
Bloomberg TV Germany:12552:v:S19.2E:22000:162:99:0:0:12160:0:0:0
Bloomberg TV France:11817:v:S19.2E:27500:163:92:0:0:8004:0:0:0
Bloomberg TV Spain:12168:v:S19.2E:27500:167:112:0:0:12721:0:0:0
-Sky News:12552:v:S19.2E:22000:305:306:0:0:3995:0:0:0
+Sky News:11597:v:S19.2E:22000:305:306:0:0:28707:0:0:0
Fox Kids Netherlands:12574:h:S19.2E:22000:163:92:0:0:5020:0:0:0
Alice:12610:v:S19.2E:22000:162:96:0:0:12200:0:0:0
n-tv:12670:v:S19.2E:22000:162:96:55:0:12730:0:0:0
+Al Jazeera:11568:v:S19.2E:22000:55:56:0:0:9021:0:0:0
Grand Tourisme:12670:v:S19.2E:22000:289:290:0:0:17300:0:0:0
TW1:12692:h:S19.2E:22000:166:167:0:0:13013:0:0:0
Eurosport:11954:h:S19.2E:27500:410:420:0:0:28009:0:0:0
@@ -68,20 +69,24 @@ Goldstar TV:11758:h:S19.2E:27500:3839:3840:0:101:518:0:0:0
Classica:11758:h:S19.2E:27500:767:768:0:101:15:0:0:0
Sonnenklar TV:12090:v:S19.2E:27500:1023:1024:0:0:32:0:0:0
:Premiere Direkt
-Premiere Direkt 1A:12031:h:S19.2E:27500:511:512,513;515:0:101:177:0:0:0
-Premiere Direkt 1B:11719:h:S19.2E:27500:1023:1024,1025;1027:0:101:182:0:0:0
-Premiere Direkt 2A:12031:h:S19.2E:27500:255:256;259:0:101:176:0:0:0
-Premiere Direkt 2B:11719:h:S19.2E:27500:767:768;769:0:101:181:0:0:0
-Premiere Direkt 3A:11719:h:S19.2E:27500:511:512;515:0:101:180:0:0:0
-Premiere Direkt 3B:11719:h:S19.2E:27500:1279:1280;1283:0:101:183:0:0:0
-Premiere Direkt 4A:12031:h:S19.2E:27500:2815:2816:0:101:18:0:0:0
-:#Premiere Direkt 4B:12070:h:S19.2E:27500:1535:1536:0:101:216:0:0:0
+Premiere Direkt Portal:12031:h:S19.2E:27500:2815:2816:0:101:18:0:0:0
+Premiere Direkt 1A:11719:h:S19.2E:27500:2047:2048:0:101:240:0:0:0
+Premiere Direkt 1B:11719:h:S19.2E:27500:2303:2304:0:101:241:0:0:0
+Premiere Direkt 1C:11719:h:S19.2E:27500:2559:2560:0:101:242:0:0:0
+Premiere Direkt 2A:11719:h:S19.2E:27500:2815:2816:0:101:243:0:0:0
+Premiere Direkt 2B:11719:h:S19.2E:27500:3071:3072:0:101:244:0:0:0
+Premiere Direkt 2C:12031:h:S19.2E:27500:3071:3072:0:101:208:0:0:0
+Premiere Direkt 2D:11719:h:S19.2E:27500:3327:3328:0:101:245:0:0:0
+Premiere Direkt 3A:12031:h:S19.2E:27500:3327:3328:0:101:209:0:0:0
+Premiere Direkt 3B:12031:h:S19.2E:27500:2303:2304:0:101:210:0:0:0
+Premiere Direkt 3C:11758:h:S19.2E:27500:511:512:0:101:211:0:0:0
+Premiere Direkt 3D:12070:h:S19.2E:27500:511:512:0:101:212:0:0:0
:PW Erotic
Beate-Uhse.TV:12071:h:S19.2E:27500:1023:1024:0:101:21:0:0:0
-Premiere Erotik 1:12031:h:S19.2E:27500:1279:1280:0:101:513:0:0:0
-Premiere Erotik 2:11719:h:S19.2E:27500:1535:1536:0:101:778:0:0:0
-Premiere Erotik 3:11719:h:S19.2E:27500:1791:1792:0:101:779:0:0:0
-Premiere Erotik 4:11719:h:S19.2E:27500:3583:3584:0:101:780:0:0:0
+Premiere Erotik 1:12031:h:S19.2E:27500:1279:1280:2:101:513:0:0:0
+Premiere Erotik 2:12070:h:0:27500:1535:1536:0:101:778:0:0:0
+Premiere Erotik 3:12070:h:0:27500:1791:1792:0:101:779:0:0:0
+Premiere Erotik 4:12070:h:0:27500:3583:3584:0:101:780:0:0:0
:Sportsworld
Premiere Sport 1:11720:h:S19.2E:27500:255:256,257:0:101:17:0:0:0
Premiere Sport 2:12031:h:S19.2E:27500:3839:3840:0:101:27:0:0:0
@@ -97,16 +102,16 @@ N24:12480:v:S19.2E:27500:2047:2048:0:0:47:0:0:0
CNBC:11954:h:S19.2E:27500:510:520:0:0:28010:0:0:0
Liberty TV.com:12610:v:S19.2E:22000:941:943,942:0:0:12199:0:0:0
:Premiere Bundesliga
-BL-Konferenz:12031:h:S19.2E:27500:2303:2304,2305:0:101:210:0:0:0
-BuLi 1:11719:h:S19.2E:27500:255:256,257:0:101:17:0:0:0
-BuLi 2:11719:h:S19.2E:27500:2047:2048,2049:0:101:240:0:0:0
-BuLi 3:11719:h:S19.2E:27500:2303:2304,2305:0:101:241:0:0:0
-BuLi 4:11719:h:S19.2E:27500:2559:2560,2561:0:101:242:0:0:0
-BuLi 5:11719:h:S19.2E:27500:2815:2816,2817:0:101:243:0:0:0
-BuLi 6:11719:h:S19.2E:27500:3071:3072,3073:0:101:244:0:0:0
-BuLi 7:11719:h:S19.2E:27500:3327:3328,3329:0:101:245:0:0:0
-BuLi 8:12031:h:S19.2E:27500:3071:3072,3073:0:101:208:0:0:0
-BuLi 9:12031:h:S19.2E:27500:3327:3328,3329:0:101:209:0:0:0
+BL-Konferenz:12031:h:S19.2E:27500:2303:2304,2305:0:101:210:0:0:1
+BuLi 1:11719:h:S19.2E:27500:255:256,257:0:101:17:0:0:1
+BuLi 2:11719:h:S19.2E:27500:2047:2048,2049:0:101:240:0:0:1
+BuLi 3:11719:h:S19.2E:27500:2303:2304,2305:0:101:241:0:0:1
+BuLi 4:11719:h:S19.2E:27500:2559:2560,2561:0:101:242:0:0:1
+BuLi 5:11719:h:S19.2E:27500:2815:2816,2817:0:101:243:0:0:1
+BuLi 6:11719:h:S19.2E:27500:3071:3072,3073:0:101:244:0:0:1
+BuLi 7:11719:h:S19.2E:27500:3327:3328,3329:0:101:245:0:0:1
+BuLi 8:12031:h:S19.2E:27500:3071:3072,3073:0:101:208:0:0:1
+BuLi 9:12031:h:S19.2E:27500:3327:3328,3329:0:101:209:0:0:1
:-
Mosaico:11934:v:S19.2E:27500:165:100:0:0:29010:0:0:0
Andalucia TV:11934:v:S19.2E:27500:166:104:0:0:29011:0:0:0
diff --git a/channels.conf.cable b/channels.conf.cable
index 58dc20d..a5567d5 100644
--- a/channels.conf.cable
+++ b/channels.conf.cable
@@ -1,204 +1,169 @@
Das Erste:410:M64:C:6900:101:102:104:0:28106:0:0:0
ZDF:394:M64:C:6900:110:120:130:0:28006:0:0:0
3sat:394:M64:C:6900:210:220:230:0:28007:0:0:0
-arte:410:M64:C:6900:401:402:404:0:28109:0:0:0
-ZDF.info:394:M64:C:6900:610:620:0:0:28011:0:0:0
-ZDF.doku:394:M64:C:6900:660:670:0:0:28014:0:0:0
-ZDF Theaterkanal:394:M64:C:6900:1110:1120:130:0:28016:0:0:0
+arte:410:M64:C:6900:401:402,403:404:0:28109:0:0:0
+ZDFinfokanal:394:M64:C:6900:610:620:130:0:28011:0:0:0
+ZDFdokukanal:394:M64:C:6900:660:670:130:0:28014:0:0:0
+ZDFtheaterkanal:394:M64:C:6900:1110:1120:130:0:28016:0:0:0
EinsExtra:426:M64:C:6900:101:102:0:0:28201:0:0:0
EinsFestival:426:M64:C:6900:201:202:0:0:28202:0:0:0
EinsMuXx:426:M64:C:6900:301:302:0:0:28203:0:0:0
Phoenix:410:M64:C:6900:901:902:904:0:28114:0:0:0
-KI.KA:394:M64:C:6900:310:320:330:0:28008:0:0:0
+KiKa:394:M64:C:6900:310:320:330:0:28008:0:0:0
EuroNews:394:M64:C:6900:2221:2233:768:0:28015:0:0:0
CNBC:394:M64:C:6900:510:520:530:0:28010:0:0:0
Eurosport:394:M64:C:6900:410:420:430:0:28009:0:0:0
:Regionalprogramme
-B1 Berlin:426:M64:C:6900:601:602:604:0:28206:0:0:0
+SFB1:426:M64:C:6900:601:602:604:0:28206:0:0:0
ORB-Fernsehen:426:M64:C:6900:501:502:504:0:28205:0:0:0
N3:426:M64:C:6900:2401:2402:2404:0:28224:0:0:0
MDR FERNSEHEN:426:M64:C:6900:401:402:404:0:28204:0:0:0
WDR FERNSEHEN:410:M64:C:6900:601:602:604:0:28111:0:0:0
hessen fernsehen:410:M64:C:6900:301:302:304:0:28108:0:0:0
BR-alpha:410:M64:C:6900:701:702:704:0:28112:0:0:0
-Bayerisches FS:410:M64:C:6900:201:202:204:0:28107:0:0:0
+Bayerisches FS:410:M64:C:6900:201:202:125:0:28107:0:0:0
SR Fernsehen Suedwest:410:M64:C:6900:501:502:504:0:28110:0:0:0
SuedWest BW:410:M64:C:6900:801:802:804:0:28113:0:0:0
SuedWest RP:426:M64:C:6900:3101:3102:3104:0:28231:0:0:0
:Hauptprogramme Premiere
-Premiere START:370:M64:C:6900:255:256:32:101:8:0:0:0
-Premiere 1:370:M64:C:6900:511:512;515:0:101:10:0:0:0
-Premiere 2:370:M64:C:6900:1791:1792;1795:0:101:11:0:0:0
-Premiere 3:370:M64:C:6900:2303:2304:0:101:43:0:0:0
-Premiere 4:370:M64:C:6900:767:768:0:101:9:0:0:0
-Premiere 5:370:M64:C:6900:1279:1280:0:101:29:0:0:0
-Premiere 6:370:M64:C:6900:1535:1536:0:101:41:0:0:0
-Premiere 7:370:M64:C:6900:1023:1024:0:101:20:0:0:0
-Premiere SERIE:378:M64:C:6900:1023:1024:0:101:16:0:0:0
-Premiere Nostalgie:378:M64:C:6900:2559:2560:0:101:516:0:0:0
+PREMIERE START:370:M64:C:6900:255:256:32:101:8:0:0:0
+PREMIERE 1:370:M64:C:6900:511:512;515:0:101:10:0:0:0
+PREMIERE 2:370:M64:C:6900:1791:1792,1793;1795:0:101:11:0:0:0
+PREMIERE 3:370:M64:C:6900:2303:2304,2305:0:101:43:0:0:0
+PREMIERE 4:370:M64:C:6900:767:768,769:0:101:9:0:0:0
+PREMIERE 5:370:M64:C:6900:1279:1280,1281:0:101:29:0:0:0
+PREMIERE 6:370:M64:C:6900:1535:1536:0:101:41:0:0:0
+PREMIERE 7:370:M64:C:6900:1023:1024:0:101:20:0:0:0
+PREMIERE SERIE:378:M64:C:6900:1023:1024:0:101:16:0:0:0
+PREMIERE Nostalgie:378:M64:C:6900:2559:2560:0:101:516:0:0:0
13 TH STREET:354:M64:C:6900:2303:2304:0:101:42:0:0:0
-Studio Universal:354:M64:C:6900:2047:2048:0:101:36:0:0:0
-Krimi & Co:378:M64:C:6900:1535:1536:0:101:23:0:0:0
+STUDIO UNIVERSAL:354:M64:C:6900:2047:2048:0:101:36:0:0:0
+MGM:354:M64:C:6900:767:768,769:0:101:515:0:0:0
+PREMIERE KRIMI:378:M64:C:6900:1535:1536:0:101:23:0:0:0
Disney Channel:354:M64:C:6900:2559:2560:0:101:34:0:0:0
-Discovery Channel:378:M64:C:6900:1791:1792:0:101:14:0:0:0
-PLANET:354:M64:C:6900:1791:1792:0:101:13:0:0:0
+DISCOVERY CHANNEL:354:M64:C:6900:1023:1024:0:101:14:0:0:0
+PLANET:354:M64:C:6900:1535:1536:0:101:13:0:0:0
Fox Kids:354:M64:C:6900:1279:1280:0:101:28:0:0:0
Junior:354:M64:C:6900:255:256:0:101:19:0:0:0
K-TOON:354:M64:C:6900:511:512:0:101:12:0:0:0
-HEIMATKANAL:354:M64:C:6900:1535:1536:0:101:22:0:0:0
-GOLDSTAR TV:354:M64:C:6900:3839:3840:0:101:518:0:0:0
-CLASSICA:354:M64:C:6900:767:768:0:101:15:0:0:0
-:DIGIKABEL D
-Avante:113:M64:C:6900:741:742,743:0:101:53404:0:0:0
-BBC Prime:113:M64:C:6900:761:762:763:101:53406:0:0:0
-Club:113:M64:C:6900:711:712,713:0:101:53401:0:0:0
-Eurosport News:113:M64:C:6900:771:772:0:101:53407:0:0:0
-BibelTV:113:M64:C:6900:731:732:0:1:53403:0:0:0
-Liberty TV:113:M64:C:6900:721:722,723:0:101:53402:0:0:0
-TW1:113:M64:C:6900:751:752:0:101:53405:0:0:0
-MTV Base:113:M64:C:6900:781:782:0:101:53408:0:0:0
-:DIGIKABEL INT
-Canal 24 Horas:121:M64:C:6900:991:992:0:101:53509:0:0:0
-Gala TV:121:M64:C:6900:931:932:0:101:53503:0:0:0
-Kanal 7:121:M64:C:6900:941:942:0:101:53504:0:0:0
-Rai 1:121:M64:C:6900:951:952:0:101:53505:0:0:0
-Rai 2:121:M64:C:6900:961:962:0:101:53506:0:0:0
-Rai 3:121:M64:C:6900:971:972:0:101:53507:0:0:0
-Show TV:121:M64:C:6900:911:912:0:101:53501:0:0:0
-TGRT:121:M64:C:6900:921:922:0:101:53502:0:0:0
-TVEi:121:M64:C:6900:981:982:0:101:53508:0:0:0
-:DIGIKABEL SO
-Fox Kids:121:M64:C:6900:931:932,933:0:101:53523:0:0:0
-Kanal 7:121:M64:C:6900:941:942:0:101:53524:0:0:0
-Show TV:121:M64:C:6900:911:912:0:101:53521:0:0:0
-TGRT:121:M64:C:6900:921:922:0:101:53522:0:0:0
-:DIGIKABEL SW
-Canal 24 Horas:121:M64:C:6900:991:992:0:101:53535:0:0:0
-Rai 1:121:M64:C:6900:951:952:0:101:53531:0:0:0
-Rai 2:121:M64:C:6900:961:962:0:101:53532:0:0:0
-Rai 3:121:M64:C:6900:971:972:0:101:53533:0:0:0
-TVEi:121:M64:C:6900:981:982:0:101:53534:0:0:0
-:Diverse TV-Sender
-Sonnenklar TV:402:M64:C:6900:0:0:0:101:32:0:0:0
-TV Polonia:434:M64:C:6900:641:642:0:101:53204:0:0:0
-Kanal D:434:M64:C:6900:651:652:0:101:53205:0:0:0
-RTP international:434:M64:C:6900:661:662:0:101:53206:0:0:0
-ERT-Sat:434:M64:C:6900:691:692:0:101:53209:0:0:0
-CNE:434:M64:C:6900:4056:4057:0:101:53208:0:0:0
-ZEE TV:442:M64:C:6900:517:773:0:101:53301:0:0:0
-NTV i:442:M64:C:6900:514:515:0:101:53302:0:0:0
-ATV:434:M64:C:6900:631:632:0:101:53203:0:0:0
-TW1:610:M64:C:6900:6106:6107:0:101:6106:0:0:0
-:Digit. Bouquet "Kabel Berlin"
-Parlamentsfernsehen:610:M64:C:6900:33:36:47:0:6100:0:0:0
-DW-tv:610:M64:C:6900:634:632:0:0:6101:0:0:0
-Kanal 7:610:M64:C:6900:49:52:0:101:6103:0:0:0
-Euronews:610:M64:C:6900:597:592:0:101:6104:0:0:0
-Travel:610:M64:C:6900:595:594:0:101:6105:0:0:0
-VH1 Classic:610:M64:C:6900:604:603:0:101:6106:0:0:1
-Nuvolari:618:M64:C:6900:1011:1012:0:101:50101:0:0:0
-Alice:618:M64:C:6900:1031:1032:0:101:50103:0:0:0
-Leonardo:618:M64:C:6900:1041:1042:0:101:50104:0:0:0
-Club:618:M64:C:6900:1051:1052:0:101:50105:0:0:0
-Avante:618:M64:C:6900:1061:1062:0:101:50106:0:0:0
-BBC Prime:618:M64:C:6900:1091:1092:0:101:50109:0:0:0
-Eurosport News:618:M64:C:6900:1101:1102:0:101:50110:0:0:0
+HEIMATKANAL:386:M64:C:6900:1279:1280:0:101:22:0:0:0
+GOLDSTAR TV:386:M64:C:6900:3839:3840:0:101:518:0:0:0
+CLASSICA:386:M64:C:6900:767:768:0:101:15:0:0:0
:Premiere Sport
-PREMIERE SPORT 1:362:M64:C:6900:255:256,258:0:101:17:0:0:0
+PREMIERE SPORT 1:362:M64:C:6900:255:256,257:0:101:17:0:0:0
PREMIERE SPORT 2:378:M64:C:6900:3839:3840,3841:0:101:27:0:0:0
:Premiere Bundesliga
-BuLi Opt 1:362:M64:C:6900:255:256:0:101:17:0:0:1
-BuLi Opt 2:362:M64:C:6900:2047:2048:0:101:240:0:0:0
-BuLi Opt 3:362:M64:C:6900:2303:2304:0:101:241:0:0:0
-BuLi Opt 4:362:M64:C:6900:2559:2560:0:101:242:0:0:0
-BuLi Opt 5:362:M64:C:6900:2815:2816:0:101:243:0:0:0
-BuLi Opt 6:362:M64:C:6900:3071:3072:0:101:244:0:0:0
-BuLi Opt 7:362:M64:C:6900:3327:3328:0:101:245:0:0:0
-BuLi Opt 8:378:M64:C:6900:3071:3072:0:101:208:0:0:0
-BuLi Opt 9:378:M64:C:6900:3327:3328:0:101:209:0:0:0
-BuLi Opt 10:378:M64:C:6900:2303:2304:0:101:210:0:0:0
+Spiel 1:362:M64:C:6900:255:256:0:101:17:0:0:1
:Premiere CL
UEFA CL 1:362:M64:C:6900:255:256,257:0:101:17:0:0:2
-UEFA CL 2:386:M64:C:6900:255:256:0:101:211:0:0:0
:Premiere Formel 1
F1 Portal 1:362:M64:C:6900:255:256:0:101:17:0:0:3
-F1 Supersignal:362:M64:C:6900:2047:2048:0:101:240:0:0:1
-F1 Cockpit Kanal:362:M64:C:6900:2303:2304:0:101:241:0:0:1
-F1 Boxengasse:362:M64:C:6900:2559:2560:0:101:242:0:0:1
-F1 Verfolgerfeld:362:M64:C:6900:2815:2816:0:101:243:0:0:1
-F1 Infokanal:362:M64:C:6900:3071:3072:0:101:244:0:0:1
+:Premiere Direkt
+PREMIERE DIREKT:378:M64:C:6900:2815:2816,2817;2819:0:101:18:0:0:0
:Premiere Direkt 1
-PREMIERE DIREKT 1A:378:M64:C:6900:511:512,513;515:0:101:177:0:0:0
-PREMIERE DIREKT 1B:362:M64:C:6900:1023:1024,1025;1027:0:101:182:0:0:0
+PREMIERE DIREKT 1A:362:M64:C:6900:2047:2048,2049;2051:0:101:240:0:0:0
+PREMIERE DIREKT 1B:362:M64:C:6900:2303:2304,2305;2307:0:101:241:0:0:0
+PREMIERE DIREKT 1C:362:M64:C:6900:2559:2560,2561;2563:0:101:242:0:0:0
:Premiere Direkt 2
-PREMIERE DIREKT 2A:378:M64:C:6900:255:256,257;259:0:101:176:0:0:0
-PREMIERE DIREKT 2B:362:M64:C:6900:767:768,769;771:0:101:181:0:0:0
+PREMIERE DIREKT 2A:362:M64:C:6900:2815:2816,2817;2819:0:101:243:0:0:0
+PREMIERE DIREKT 2B:362:M64:C:6900:3071:3072,3073;3075:0:101:244:0:0:0
+PREMIERE DIREKT 2C:362:M64:C:6900:3327:3328,3329;3331:0:101:245:0:0:0
+PREMIERE DIREKT 2D:378:M64:C:6900:3071:3072,3073;3075:0:101:208:0:0:0
:Premiere Direkt 3
-PREMIERE DIREKT 3A:362:M64:C:6900:1279:1280,1281;1283:0:101:183:0:0:0
-PREMIERE DIREKT 3B:362:M64:C:6900:511:512,513;515:0:101:180:0:0:0
-:Premiere Direkt 4
-PREMIERE DIREKT 4A:378:M64:C:6900:2815:2816,2817:0:101:18:0:0:0
-PREMIERE DIREKT 4B:386:M64:C:6900:1535:1536,1537:0:101:216:0:0:0
+PREMIERE DIREKT 3A:378:M64:C:6900:3327:3328,3329;3331:0:101:209:0:0:0
+PREMIERE DIREKT 3B:378:M64:C:6900:2303:2304,2305;2307:0:101:210:0:0:0
+PREMIERE DIREKT 3C:354:M64:C:6900:511:512,513;515:0:101:211:0:0:0
+PREMIERE DIREKT 3D:386:M64:C:6900:511:512,513;515:0:101:212:0:0:0
:Premiere Erotik
-BEATE-UHSE.TV:354:M64:C:6900:1023:1024:0:101:21:0:0:0
+BEATE-UHSE.TV:386:M64:C:6900:1023:1024:0:101:21:0:0:0
PREMIERE EROTIK 1:378:M64:C:6900:1279:1280:0:101:513:0:0:0
-PREMIERE EROTIK 2:362:M64:C:6900:1535:1536:0:101:778:0:0:0
-PREMIERE EROTIK 3:362:M64:C:6900:1791:1792:0:101:779:0:0:0
-PREMIERE EROTIK 4:362:M64:C:6900:3583:3584:0:101:780:0:0:0
+PREMIERE EROTIK 2:386:M64:C:6900:1535:1536:0:101:778:0:0:0
+PREMIERE EROTIK 3:386:M64:C:6900:1791:1792:0:101:779:0:0:0
+PREMIERE EROTIK 4:386:M64:C:6900:3583:3584:0:101:780:0:0:0
+:NEU
+Test-R:410:M64:C:6900:701:702:125:0:28130:0:0:0
+Test-R:410:M64:C:6900:901:902:125:0:28130:0:0:1
+ARD-Online-Kanal:426:M64:C:6900:0:1801,1805:0:101:28218:0:0:0
+TestS33:402:M64:C:6900:1211:1212:0:101:53001:0:0:0
+Test S 38:442:M64:C:6900:513:514:0:101:53301:0:0:0
+:DIGIKABEL D
+Club:113:M64:C:6900:711:712,713:0:101:53401:0:0:0
+Liberty TV:113:M64:C:6900:721:722,723:0:101:53402:0:0:0
+Einstein TV:113:M64:C:6900:701:702:0:101:53410:0:0:0
+BibelTV:113:M64:C:6900:731:732:0:101:53403:0:0:0
+Avante:113:M64:C:6900:741:742,743:0:101:53404:0:0:0
+TW1:113:M64:C:6900:751:752:753:101:53405:0:0:0
+:DIGIKABEL INT
+Extreme Sports:113:M64:C:6900:791:792,793:0:101:53409:0:0:0
+BBC Prime:113:M64:C:6900:761:762:763:101:53406:0:0:0
+Eurosport News:113:M64:C:6900:771:772:774:101:53407:0:0:0
+MTV Base:113:M64:C:6900:781:782:0:101:53408:0:0:0
+ATV 2:434:M64:C:6900:631:632:633:101:53203:0:0:0
+Show TV:402:M64:C:6900:1111:1112:0:101:53501:0:0:0
+TGRT:402:M64:C:6900:1121:1122:0:101:53502:0:0:0
+Kanal D:434:M64:C:6900:651:652:653:101:53205:0:0:0
+Fox Kids - RUS:434:M64:C:6900:671:672:0:101:53207:0:0:0
+Kanal 7:402:M64:C:6900:1131:1132:0:101:53504:0:0:0
+ERT-Sat:434:M64:C:6900:691:692:693:101:53209:0:0:0
+PCNE:121:M64:C:6900:911:912:0:101:53208:0:0:0
+Rai 1:402:M64:C:6900:1141:1142:1143:101:53505:0:0:0
+Rai 2:402:M64:C:6900:1151:1152:1153:101:53506:0:0:0
+Rai 3:402:M64:C:6900:1161:1162:1163:101:53507:0:0:0
+Alice:121:M64:C:6900:961:962:0:101:53601:0:0:0
+Leonardo:121:M64:C:6900:951:952:0:101:53523:0:0:0
+Nuvolari:121:M64:C:6900:941:942:0:101:53211:0:0:0
+TV Polonia:434:M64:C:6900:641:642:643:101:53204:0:0:0
+TVEi:434:M64:C:6900:681:682:683:101:53508:0:0:0
+Canal 24 Horas:434:M64:C:6900:601:602:603:101:53509:0:0:0
+RTP Internacional:434:M64:C:6900:661:662:663:101:53206:0:0:0
+RTVi:434:M64:C:6900:611:612:0:101:53201:0:0:0
+Nashe Kino:434:M64:C:6900:621:622:0:101:53202:0:0:0
+Detski Mir:121:M64:C:6900:931:932:0:101:53503:0:0:0
+Fox Kids:434:M64:C:6900:671:673:0:101:53210:0:0:0
+RTR Planeta:121:M64:C:6900:921:922:0:101:53212:0:0:0
:Radio-Sender (FTV)
+B5 aktuell:410:M64:C:6900:0:3101:0:0:28121:0:0:0
+Bayern 1:410:M64:C:6900:0:3601:0:0:28126:0:0:0
+Bayern 4 Klassik:410:M64:C:6900:0:3001:0:0:28120:0:0:0
+DLF-Köln:394:M64:C:6900:0:810:0:0:28013:0:0:0
+DLR-Berlin:394:M64:C:6900:0:710:0:0:28012:0:0:0
Fritz:426:M64:C:6900:0:901:0:0:28209:0:0:0
-SPUTNIK:426:M64:C:6900:0:1201:0:0:28212:0:0:0
+hr2:410:M64:C:6900:0:3301:0:0:28123:0:0:0
+hr-chronos:410:M64:C:6900:0:3201:0:0:28122:0:0:0
+hr-klassik:410:M64:C:6900:0:3401:0:0:28124:0:0:0
HR XXL:410:M64:C:6900:0:3501:0:0:28125:0:0:0
JUMP:426:M64:C:6900:0:1001:0:0:28210:0:0:0
MDR info:426:M64:C:6900:0:1101:0:0:28211:0:0:0
MDR KULTUR:426:M64:C:6900:0:801:0:0:28208:0:0:0
-Radio 3:426:M64:C:6900:0:701:0:0:28207:0:0:0
+NDR Info:410:M64:C:6900:0:3701:0:0:28127:0:0:0
+NDR Kultur:426:M64:C:6900:0:701:0:0:28207:0:0:0
+NordwestRadio:410:M64:C:6900:0:3801:0:0:28128:0:0:0
+Österreich 1:394:M64:C:6900:0:169:0:0:28017:0:0:0
RADIOmultikulti:426:M64:C:6900:0:1301:0:0:28213:0:0:0
+SPUTNIK:426:M64:C:6900:0:1201:0:0:28212:0:0:0
+SR 1:410:M64:C:6900:0:3901:0:0:28129:0:0:0
SWR2:426:M64:C:6900:0:1401:0:0:28214:0:0:0
WDR 3:426:M64:C:6900:0:1501:0:0:28215:0:0:0
-WDR Radio 5:426:M64:C:6900:0:1601:0:0:28216:0:0:0
-Bayern 4 Klassik:410:M64:C:6900:0:3001:0:0:28120:0:0:0
-B5 aktuell:410:M64:C:6900:0:3101:0:0:28121:0:0:0
-NordwestRadio:410:M64:C:6900:0:3801:0:0:28128:0:0:0
-Bayern 1:410:M64:C:6900:0:3601:0:0:28126:0:0:0
-NDR Info:410:M64:C:6900:0:3701:0:0:28127:0:0:0
-SR 1:410:M64:C:6900:0:3901:0:0:28129:0:0:0
-hr-klassik:410:M64:C:6900:0:3401:0:0:28124:0:0:0
-hr2:410:M64:C:6900:0:3301:0:0:28123:0:0:0
-hr-chronos:410:M64:C:6900:0:3201:0:0:28122:0:0:0
-DLF-Köln:394:M64:C:6900:0:810:0:0:28013:0:0:0
-DLR-Berlin:394:M64:C:6900:0:710:0:0:28012:0:0:0
-Österreich 1:394:M64:C:6900:0:169:0:0:28017:0:0:0
-Radio GoldStar:354:M64:C:6900:0:368:0:0:171:0:0:0
+WDR 5:426:M64:C:6900:0:1601:0:0:28216:0:0:0
:Radio-Sender (PPV)
-ALTERNATIVE ROCK:370:M64:C:6900:1:544:0:101:154:0:0:0
-DEUTSCHE HITS:370:M64:C:6900:1:800:0:101:151:0:0:0
-HITLISTE:370:M64:C:6900:1:784:0:101:150:0:0:0
-HIP HOP/R&B:370:M64:C:6900:1:576:0:101:159:0:0:0
-DANCE:370:M64:C:6900:1:304:0:101:165:0:0:0
-HARD ROCK:370:M64:C:6900:1:816:0:101:152:0:0:0
-LOVE SONGS:370:M64:C:6900:1:592:0:101:156:0:0:0
-FILM & MUSICAL:378:M64:C:6900:1:592:0:101:145:0:0:0
-EASY LISTENING:378:M64:C:6900:1:608:0:101:146:0:0:0
-JAZZ:378:M64:C:6900:1:640:0:101:148:0:0:0
-KLASSIK POPULÄR:378:M64:C:6900:1:624:0:101:147:0:0:0
-ORCHESTRALE WERKE:378:M64:C:6900:1:560:0:101:158:0:0:0
-CLASSIC ROCK:370:M64:C:6900:1:352:0:101:163:0:0:0
-CHILLOUT:370:M64:C:6900:1:400:0:101:157:0:0:0
-SCHLAGER:370:M64:C:6900:1:384:0:101:162:0:0:0
-GOLD:370:M64:C:6900:1:320:0:101:166:0:0:0
-OLD GOLD:362:M64:C:6900:1:336:0:101:167:0:0:0
-SOUL CLASSICS:362:M64:C:6900:1:352:0:101:153:0:0:0
-LATIN:362:M64:C:6900:1:368:0:101:155:0:0:0
-NEW COUNTRY:362:M64:C:6900:1:384:0:101:164:0:0:0
-COUNTRY:362:M64:C:6900:1:656:0:101:149:0:0:0
-All Jazz:442:M64:C:6900:1:535:0:101:53350:0:0:0
-Cristal New Age:442:M64:C:6900:1:536:0:101:53351:0:0:0
-Movie Sounds:442:M64:C:6900:1:537:0:101:53352:0:0:0
-Sinfonica:442:M64:C:6900:1:538:0:101:53353:0:0:0
-Opernfestival:442:M64:C:6900:1:539:0:101:53354:0:0:0
-Barock Fantasie:442:M64:C:6900:1:540:0:101:53355:0:0:0
-Musica Camerata:442:M64:C:6900:1:541:0:101:53356:0:0:0
-Musica Antica:442:M64:C:6900:1:542:0:101:53357:0:0:0
-Adagio:442:M64:C:6900:1:543:0:101:53358:0:0:0
-Jazz legends:442:M64:C:6900:1:544:0:101:53359:0:0:0
+ALTERNATIVE ROCK:370:M64:C:6900:0:544:0:101:154:0:0:0
+CLASSIC ROCK:370:M64:C:6900:0:352:0:101:163:0:0:0
+COOL & EASY:370:M64:C:6900:0:400:0:101:157:0:0:0
+COUNTRY:362:M64:C:6900:0:656:0:101:149:0:0:0
+DANCE:370:M64:C:6900:0:304:0:101:165:0:0:0
+DEUTSCHE HITS:370:M64:C:6900:0:800:0:101:151:0:0:0
+EASY LISTENING:378:M64:C:6900:0:608:0:101:146:0:0:0
+FILM & MUSICAL:378:M64:C:6900:0:592:0:101:145:0:0:0
+GOLD:370:M64:C:6900:0:320:0:101:166:0:0:0
+HARD ROCK:370:M64:C:6900:0:816:0:101:152:0:0:0
+HIP HOP/R&B:370:M64:C:6900:0:576:0:101:159:0:0:0
+HITLISTE:370:M64:C:6900:0:784:0:101:150:0:0:0
+JAZZ:378:M64:C:6900:0:640:0:101:148:0:0:0
+KLASSIK POPULÄR:378:M64:C:6900:0:624:0:101:147:0:0:0
+LATIN:362:M64:C:6900:0:368:0:101:155:0:0:0
+LOVE SONGS:370:M64:C:6900:0:592:0:101:156:0:0:0
+NEW COUNTRY:362:M64:C:6900:0:384:0:101:164:0:0:0
+OLD GOLD:362:M64:C:6900:0:336:0:101:167:0:0:0
+ORCHESTRALE WERKE:378:M64:C:6900:0:560:0:101:158:0:0:0
+SCHLAGER:370:M64:C:6900:0:384:0:101:162:0:0:0
+SOUL CLASSICS:362:M64:C:6900:0:352:0:101:153:0:0:0
diff --git a/ci.c b/ci.c
index 62bbed7..a3d64df 100644
--- a/ci.c
+++ b/ci.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: ci.c 1.8 2003/03/16 22:32:47 kls Exp $
+ * $Id: ci.c 1.9 2003/03/23 15:18:40 kls Exp $
*/
/* XXX TODO
@@ -1273,6 +1273,7 @@ void cCiCaPmt::AddCaDescriptor(int Length, uint8_t *Data)
cCiHandler::cCiHandler(int Fd, int NumSlots)
{
numSlots = NumSlots;
+ enabled = true;
for (int i = 0; i < MAX_CI_SESSION; i++)
sessions[i] = NULL;
tpl = new cCiTransportLayer(Fd, numSlots);
@@ -1425,6 +1426,8 @@ int cCiHandler::CloseAllSessions(int Slot)
bool cCiHandler::Process(void)
{
+ if (!enabled)
+ return false;
bool result = true;
cMutexLock MutexLock(&mutex);
for (int Slot = 0; Slot < numSlots; Slot++) {
diff --git a/ci.h b/ci.h
index 255292a..a9f27f1 100644
--- a/ci.h
+++ b/ci.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: ci.h 1.3 2003/02/16 10:55:21 kls Exp $
+ * $Id: ci.h 1.4 2003/03/23 15:18:40 kls Exp $
*/
#ifndef __CI_H
@@ -80,6 +80,7 @@ class cCiHandler {
private:
cMutex mutex;
int numSlots;
+ bool enabled;
cCiSession *sessions[MAX_CI_SESSION];
cCiTransportLayer *tpl;
cCiTransportConnection *tc;
@@ -95,6 +96,7 @@ private:
public:
~cCiHandler();
static cCiHandler *CreateCiHandler(const char *FileName);
+ void SetEnabled(bool Enabled) { enabled = Enabled; }
bool Process(void);
bool EnterMenu(int Slot);
cCiMenu *GetMenu(void);
diff --git a/config.c b/config.c
index e1d982a..ff7a4c0 100644
--- a/config.c
+++ b/config.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: config.c 1.112 2002/11/02 13:13:49 kls Exp $
+ * $Id: config.c 1.113 2003/04/12 09:37:48 kls Exp $
*/
#include "config.h"
@@ -280,6 +280,7 @@ cSetup::cSetup(void)
MinUserInactivity = 120;
MultiSpeedMode = 0;
ShowReplayMode = 0;
+ ResumeID = 0;
memset(CaCaps, sizeof(CaCaps), 0);
CurrentChannel = -1;
CurrentVolume = MAXVOLUME;
@@ -428,6 +429,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value);
else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
+ else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value);
else if (!strcasecmp(Name, "CaCaps")) return ParseCaCaps(Value);
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value);
@@ -474,6 +476,7 @@ bool cSetup::Save(void)
Store("MinUserInactivity", MinUserInactivity);
Store("MultiSpeedMode", MultiSpeedMode);
Store("ShowReplayMode", ShowReplayMode);
+ Store("ResumeID", ResumeID);
StoreCaCaps("CaCaps");
Store("CurrentChannel", CurrentChannel);
Store("CurrentVolume", CurrentVolume);
diff --git a/config.h b/config.h
index 2060458..ac40ff4 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.150 2003/03/09 10:01:02 kls Exp $
+ * $Id: config.h 1.152 2003/04/12 09:35:50 kls Exp $
*/
#ifndef __CONFIG_H
@@ -19,7 +19,7 @@
#include "device.h"
#include "tools.h"
-#define VDRVERSION "1.1.26"
+#define VDRVERSION "1.1.27"
#define MAXPRIORITY 99
#define MAXLIFETIME 99
@@ -229,6 +229,7 @@ public:
int MinEventTimeout, MinUserInactivity;
int MultiSpeedMode;
int ShowReplayMode;
+ int ResumeID;
int CaCaps[MAXDEVICES][MAXCACAPS];
int CurrentChannel;
int CurrentVolume;
diff --git a/device.c b/device.c
index 0f99e13..67da457 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.37 2003/03/09 14:05:23 kls Exp $
+ * $Id: device.c 1.39 2003/04/12 11:51:04 kls Exp $
*/
#include "device.h"
@@ -106,19 +106,14 @@ bool cDevice::SetPrimaryDevice(int n)
{
n--;
if (0 <= n && n < numDevices && device[n]) {
- if (device[n]->HasDecoder()) {
- isyslog("setting primary device to %d", n + 1);
- if (primaryDevice)
- primaryDevice->MakePrimaryDevice(false);
- primaryDevice = device[n];
- primaryDevice->MakePrimaryDevice(true);
- return true;
- }
- else
- esyslog("ERROR: device number %d has no MPEG decoder", n + 1);
+ isyslog("setting primary device to %d", n + 1);
+ if (primaryDevice)
+ primaryDevice->MakePrimaryDevice(false);
+ primaryDevice = device[n];
+ primaryDevice->MakePrimaryDevice(true);
+ return true;
}
- else
- esyslog("ERROR: invalid primary device number: %d", n + 1);
+ esyslog("ERROR: invalid primary device number: %d", n + 1);
return false;
}
@@ -422,9 +417,16 @@ bool cDevice::ToggleMute(void)
{
int OldVolume = volume;
mute = !mute;
- SetVolume(0, mute);
+ //XXX why is it necessary to use different sequences???
+ if (mute) {
+ SetVolume(0, mute);
+ Audios.MuteAudio(mute); // Mute external audio after analog audio
+ }
+ else {
+ Audios.MuteAudio(mute); // Enable external audio before analog audio
+ SetVolume(0, mute);
+ }
volume = OldVolume;
- Audios.MuteAudio(mute);
return mute;
}
@@ -478,10 +480,12 @@ void cDevice::Clear(void)
void cDevice::Play(void)
{
+ Audios.MuteAudio(mute);
}
void cDevice::Freeze(void)
{
+ Audios.MuteAudio(true);
}
void cDevice::Mute(void)
@@ -520,6 +524,7 @@ void cDevice::Detach(cPlayer *Player)
player = NULL;
SetPlayMode(pmNone);
playerDetached = true;
+ Audios.ClearAudio();
}
}
diff --git a/dvbdevice.c b/dvbdevice.c
index ba60870..9bbac2d 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.46 2003/02/16 15:10:39 kls Exp $
+ * $Id: dvbdevice.c 1.51 2003/04/12 15:06:11 kls Exp $
*/
#include "dvbdevice.h"
@@ -196,6 +196,7 @@ bool cDvbTuner::SetFrontend(void)
CHECK(ioctl(fd_frontend, FE_SET_TONE, tone));
}
+ frequency = abs(frequency); // Allow for C-band, where the frequency is less than the LOF
Frontend.frequency = frequency * 1000UL;
Frontend.inversion = fe_spectral_inversion_t(channel.Inversion());
Frontend.u.qpsk.symbol_rate = channel.Srate() * 1000UL;
@@ -263,7 +264,7 @@ void cDvbTuner::Action(void)
}
}
if (tunerStatus >= tsLocked) {
- if (ciHandler) {
+ if (ciHandler && channel.Ca()) {
if (ciHandler->Process()) {
if (tunerStatus != tsCam) {//XXX TODO update in case the CA descriptors have changed
uchar buffer[2048];
@@ -396,7 +397,8 @@ bool cDvbDevice::Initialize(void)
void cDvbDevice::MakePrimaryDevice(bool On)
{
- cDvbOsd::SetDvbDevice(On ? this : NULL);
+ if (HasDecoder())
+ cDvbOsd::SetDvbDevice(On ? this : NULL);
}
bool cDvbDevice::HasDecoder(void) const
@@ -712,7 +714,7 @@ int cDvbDevice::NumAudioTracksDevice(void) const
int n = 0;
if (aPid1)
n++;
- if (!Ca() && aPid2 && aPid1 != aPid2) // a Ca recording session blocks switching live audio tracks
+ if (Ca() <= MAXDEVICES && aPid2 && aPid1 != aPid2) // a Ca recording session blocks switching live audio tracks
n++;
return n;
}
@@ -744,7 +746,7 @@ bool cDvbDevice::CanReplay(void) const
if (Receiving())
return false;
#endif
- return cDevice::CanReplay() && !Ca(); // we can only replay if there is no Ca recording going on
+ return cDevice::CanReplay() && Ca() <= MAXDEVICES; // we can only replay if there is no Ca recording going on
}
bool cDvbDevice::SetPlayMode(ePlayMode PlayMode)
@@ -773,11 +775,15 @@ bool cDvbDevice::SetPlayMode(ePlayMode PlayMode)
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
if (siProcessor)
siProcessor->SetStatus(true);
+ if (ciHandler)
+ ciHandler->SetEnabled(true);
break;
case pmAudioVideo:
case pmAudioOnlyBlack:
if (siProcessor)
siProcessor->SetStatus(false);
+ if (ciHandler)
+ ciHandler->SetEnabled(false);
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo));
@@ -788,6 +794,8 @@ bool cDvbDevice::SetPlayMode(ePlayMode PlayMode)
case pmAudioOnly:
if (siProcessor)
siProcessor->SetStatus(false);
+ if (ciHandler)
+ ciHandler->SetEnabled(false);
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
CHECK(ioctl(fd_audio, AUDIO_STOP, true));
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
@@ -799,6 +807,8 @@ bool cDvbDevice::SetPlayMode(ePlayMode PlayMode)
case pmExtern_THIS_SHOULD_BE_AVOIDED:
if (siProcessor)
siProcessor->SetStatus(false);
+ if (ciHandler)
+ ciHandler->SetEnabled(false);
close(fd_video);
close(fd_audio);
fd_video = fd_audio = -1;
@@ -820,6 +830,7 @@ void cDvbDevice::Clear(void)
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
if (fd_audio >= 0)
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
+ cDevice::Clear();
}
void cDvbDevice::Play(void)
@@ -834,6 +845,7 @@ void cDvbDevice::Play(void)
if (fd_video >= 0)
CHECK(ioctl(fd_video, VIDEO_CONTINUE));
}
+ cDevice::Play();
}
void cDvbDevice::Freeze(void)
@@ -848,6 +860,7 @@ void cDvbDevice::Freeze(void)
if (fd_video >= 0)
CHECK(ioctl(fd_video, VIDEO_FREEZE));
}
+ cDevice::Freeze();
}
void cDvbDevice::Mute(void)
@@ -856,6 +869,7 @@ void cDvbDevice::Mute(void)
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
}
+ cDevice::Mute();
}
void cDvbDevice::StillPicture(const uchar *Data, int Length)
diff --git a/dvbosd.c b/dvbosd.c
index 428a3f0..3d57362 100644
--- a/dvbosd.c
+++ b/dvbosd.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbosd.c 1.20 2003/03/09 09:59:13 kls Exp $
+ * $Id: dvbosd.c 1.21 2003/04/12 12:10:12 kls Exp $
*/
#include "dvbosd.h"
@@ -19,7 +19,7 @@ cDvbOsd::cDvbOsd(int x, int y)
:cOsdBase(x, y)
{
osdDev = dvbDevice ? dvbDevice->OsdDeviceHandle() : -1;
- if (osdDev < 0)
+ if (dvbDevice && osdDev < 0)
esyslog("ERROR: illegal OSD device handle (%d)!", osdDev);
}
diff --git a/dvbplayer.c b/dvbplayer.c
index 5aff351..f71c69c 100644
--- a/dvbplayer.c
+++ b/dvbplayer.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbplayer.c 1.18 2003/02/15 10:38:59 kls Exp $
+ * $Id: dvbplayer.c 1.19 2003/03/30 12:51:51 kls Exp $
*/
#include "dvbplayer.h"
@@ -324,11 +324,8 @@ void cDvbPlayer::StripAudioPackets(uchar *b, int Length, uchar Except)
case 0xC0 ... 0xC1: // audio
if (c == 0xC1)
canToggleAudioTrack = true;
- if (!Except || c != Except) {
- int n = l;
- for (int j = i; j < Length && n--; j++)
- b[j] = 0x00;
- }
+ if (!Except || c != Except)
+ memset(&b[i], 0x00, min(l, Length-i));
break;
case 0xE0 ... 0xEF: // video
break;
diff --git a/eit.c b/eit.c
index 4274085..ff5dd42 100644
--- a/eit.c
+++ b/eit.c
@@ -16,7 +16,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
- * $Id: eit.c 1.67 2003/03/16 11:20:05 kls Exp $
+ * $Id: eit.c 1.68 2003/04/12 11:27:31 kls Exp $
***************************************************************************/
#include "eit.h"
@@ -1011,29 +1011,37 @@ private:
int length;
uchar *data;
public:
- cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, int Length, uchar *Data);
+ cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, int CaPid, int Length, uchar *Data);
virtual ~cCaDescriptor();
int Length(void) const { return length; }
const uchar *Data(void) const { return data; }
};
-cCaDescriptor::cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, int Length, uchar *Data)
+cCaDescriptor::cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, int CaPid, int Length, uchar *Data)
{
source = Source;
transponder = Transponder;
serviceId = ServiceId;
caSystem = CaSystem;
- length = Length;
+ length = Length + 6;
data = MALLOC(uchar, length);
- memcpy(data, Data, length);
- /*//XXX just while debugging...
+ data[0] = DESCR_CA;
+ data[1] = length - 2;
+ data[2] = (caSystem >> 8) & 0xFF;
+ data[3] = caSystem & 0xFF;
+ data[4] = ((CaPid >> 8) & 0xFF) | 0xE0;
+ data[5] = CaPid & 0xFF;
+ if (Length)
+ memcpy(&data[6], Data, Length);
+//#define DEBUG_CA_DESCRIPTORS 1
+#ifdef DEBUG_CA_DESCRIPTORS
char buffer[1024];
char *q = buffer;
q += sprintf(q, "CAM: %04X %5d %4d", source, transponder, serviceId);
for (int i = 0; i < length; i++)
q += sprintf(q, " %02X", data[i]);
dsyslog(buffer);
- *///XXX
+#endif
}
cCaDescriptor::~cCaDescriptor()
@@ -1312,16 +1320,13 @@ void cSIProcessor::Action()
if (pid == pmtPid && buf[0] == 0x02 && currentSource && currentTransponder) {
struct Pid *pi = siParsePMT(buf);
if (pi) {
- for (struct LIST *d = (struct LIST *)pi->Descriptors; d; d = (struct LIST *)xSucc(d)) {
- if (DescriptorTag(d) == DESCR_CA) {
- uchar *Data = ((ConditionalAccessDescriptor *)d)->Data;
- int CaSystem = (Data[2] << 8) | Data[3];
- if (!caDescriptors->Get(currentSource, currentTransponder, pi->ProgramID, CaSystem)) {
- cMutexLock MutexLock(&caDescriptorsMutex);
- caDescriptors->Add(new cCaDescriptor(currentSource, currentTransponder, pi->ProgramID, CaSystem, ((ConditionalAccessDescriptor *)d)->Amount, Data));
- }
- //XXX update???
- }
+ struct Descriptor *d;
+ for (d = (struct Descriptor *)pi->Descriptors->Head; d; d = (struct Descriptor *)xSucc(d))
+ NewCaDescriptor(d, pi->ProgramID);
+ // Also scan the PidInfo list for descriptors - some broadcasts send them only here.
+ for (struct PidInfo *p = (struct PidInfo *)pi->InfoList->Head; p; p = (struct PidInfo *)xSucc(p)) {
+ for (d = (struct Descriptor *)p->Descriptors->Head; d; d = (struct Descriptor *)xSucc(d))
+ NewCaDescriptor(d, pi->ProgramID);
}
}
xMemFreeAll(NULL);
@@ -1438,6 +1443,18 @@ void cSIProcessor::TriggerDump(void)
lastDump = 0;
}
+void cSIProcessor::NewCaDescriptor(struct Descriptor *d, int ProgramID)
+{
+ if (DescriptorTag(d) == DESCR_CA) {
+ struct CaDescriptor *cd = (struct CaDescriptor *)d;
+ if (!caDescriptors->Get(currentSource, currentTransponder, ProgramID, cd->CA_type)) {
+ cMutexLock MutexLock(&caDescriptorsMutex);
+ caDescriptors->Add(new cCaDescriptor(currentSource, currentTransponder, ProgramID, cd->CA_type, cd->CA_PID, cd->DataLength, cd->Data));
+ }
+ //XXX update???
+ }
+}
+
int cSIProcessor::GetCaDescriptors(int Source, int Transponder, int ServiceId, int BufSize, uchar *Data)
{
if (BufSize > 0 && Data) {
diff --git a/eit.h b/eit.h
index 17fa909..e956b01 100644
--- a/eit.h
+++ b/eit.h
@@ -16,7 +16,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
- * $Id: eit.h 1.24 2003/02/02 14:07:39 kls Exp $
+ * $Id: eit.h 1.25 2003/04/12 10:59:26 kls Exp $
***************************************************************************/
#ifndef __EIT_H
@@ -158,6 +158,7 @@ private:
bool AddFilter(unsigned short pid, u_char tid);
bool DelFilter(unsigned short pid, u_char tid);
bool ShutDownFilters(void);
+ void NewCaDescriptor(struct Descriptor *d, int ProgramID);
public:
cSIProcessor(const char *FileName);
~cSIProcessor();
diff --git a/i18n.c b/i18n.c
index 3dc42b0..506e0a5 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.103 2003/01/26 11:46:46 kls Exp $
+ * $Id: i18n.c 1.105 2003/04/12 09:39:35 kls Exp $
*
* Translations provided by:
*
@@ -210,7 +210,7 @@ const tI18nPhrase Phrases[] = {
"Nauhoituskomennot",
"",// TODO
"",// TODO
- "",// TODO
+ "Entoles gia egrafes",// TODO
"Inspelningskommandon",
"",// TODO
"",// TODO
@@ -226,7 +226,7 @@ const tI18nPhrase Phrases[] = {
"Muokkaa kanavaa",
"Ustawienie kanalu",
"Modificar canal",
- "Prosarmoges kanaliou",
+ "Prosarmogi kanaliou",
"Ändra kanal",
"Editare canale",
"Csatornák beállítása",
@@ -242,7 +242,7 @@ const tI18nPhrase Phrases[] = {
"Muokkaa ajastusta",
"Ustawienie timerow",
"Modificar timer",
- "Prosarmoges programmatismou",
+ "Prosarmogi Programmatismou",
"Ändra timer",
"Editare timere",
"Felvétel beprogramozásának megváltoztatása",
@@ -306,7 +306,7 @@ const tI18nPhrase Phrases[] = {
"Nykyinen ohjelma",
"Program biezacy",
"¿Qué hay ahora?",
- "Ti pezi tora",
+ "Trexon Programma",
"Vilket program sänds nu?",
"Programul actual?",
"Mi megy most?",
@@ -322,7 +322,7 @@ const tI18nPhrase Phrases[] = {
"Seuraava ohjelma",
"Program nastepny",
"¿Qué hay proximo?",
- "Ti tha peksi meta",
+ "Epomeno Programma",
"Vilket är nästa program?",
"Programul urmator?",
"Mi következik?",
@@ -371,7 +371,7 @@ const tI18nPhrase Phrases[] = {
"Poista",
"Usunac",
"Borrar",
- "Swisimo",
+ "Diagrafi",
"Ta bort",
"Sterge",
"Törölni",
@@ -387,7 +387,7 @@ const tI18nPhrase Phrases[] = {
"Merkitse",
"Zaznaczyc",
"Marcar",
- "Markarisma",
+ "Epilogi",
"Märk",
"Marcheaza",
"Megjelölni",
@@ -403,7 +403,7 @@ const tI18nPhrase Phrases[] = {
"Päällä/Pois",
"Zal./ Wyl.",
"On/Off",
- "Energo/Klisto",
+ "Anoixto/Kleisto",
"På/Av",
"Pornit/Oprit",
"Be/Ki",
@@ -435,7 +435,7 @@ const tI18nPhrase Phrases[] = {
"Toista",
"Odtwarzac",
"Play",
- "Anametadosi",
+ "Anaparagogi",
"Spela upp",
"Redare",
"Lejátszani",
@@ -611,7 +611,7 @@ const tI18nPhrase Phrases[] = {
"Avaa",
"Wyrzucenie",
"Eyectar",
- "Apovoli",
+ "Exsagogi",
"Mata ut",
"Ejecteaza",
"Kidobni",
@@ -691,7 +691,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "Epanafora",
"",//TODO
"",//TODO
"",//TODO
@@ -708,7 +708,7 @@ const tI18nPhrase Phrases[] = {
"Poistetaanko kanava?",
"Usunac kanal?",
"¿Eliminar canal?",
- "Na sviso to kanali?",
+ "Diagrafi Kanaliou?",
"Ta bort kanalen?",
"Sterg canalul?",
"Csatorna törlése?",
@@ -724,7 +724,7 @@ const tI18nPhrase Phrases[] = {
"Poistetaanko ajastus?",
"Usunac timer?",
"¿Eliminar timer?",
- "Svisimo tou programmitismou?",
+ "Diagrafi programmitismou?",
"Ta bort timern?",
"Sterg timer-ul?",
"Felvétel beprogramozásának törlése?",
@@ -740,7 +740,7 @@ const tI18nPhrase Phrases[] = {
"Poistetaanko nauhoitus?",
"Usunac nagranie?",
"¿Eliminar grabacion?",
- "Svisimo tis egrafis?",
+ "Svisimo egrafis?",
"Ta bort inspelningen?",
"Sterg inregistrarea?",
"Felvétel törlése?",
@@ -756,7 +756,7 @@ const tI18nPhrase Phrases[] = {
"Ajastin nauhoittaa - poistetaanko silti?",
"Nagrywanie w trakcie - napewno usunac?",
"¿Timer activo - de verdad eliminarlo?",
- "Ginete akoma programmatismeni egrafi - na svisti sigoura?",
+ "Programmatismos se exselixsi - Diagrafi sigoura?",
"Timerstyrd inspelning pågår - Avbryta ändå?",
"Timer-ul in inregistrare - sterg?",
"Felvétel folyamatban van - mégis törölni?",
@@ -804,7 +804,7 @@ const tI18nPhrase Phrases[] = {
"Peruutetaanko muokkaus?",
"Zakonczyc montaz?",
"¿Cancelar modificación?",
- "Akirosi alagon?",
+ "Akirosi kopsimatos?",
"Avbryta editeringen?",
"Opresc editarea?",
"Vágást befejezni?",
@@ -836,7 +836,7 @@ const tI18nPhrase Phrases[] = {
"Nauhoitus käynnissä - aloitetaanko alusta?",
"Nagrywanie w trakcie - rzeczywiscie nowy start?",
"¿Grabando - reiniciar?",
- "Ginete egrafi - na gini epanekinisi sigoura?",
+ "Ginete egrafi - Telika na ginei epanekinisi?",
"Inspelning pågår, vill du starta om i alla fall?",
"In inregistrare - repornesc?",
"Felvétel folyamatban van - mégis újraindítani?",
@@ -852,7 +852,7 @@ const tI18nPhrase Phrases[] = {
"Nauhoitus kesken - lopetetaanko se?",
"Nagrywanie w trakcie - mimo to wylaczyc?",
"¿Grabando - apagar?",
- "Ginete egrafi - na stamatisi i litourgia sigoura?",
+ "Ginete egrafi - Telika na ginei termatismos?",
"Inspelning pågår, vill du avbryta i alla fall?",
"In inregistrare - opresc?",
"Felvétel folyamatban van - mégis kikapcsolni?",
@@ -868,7 +868,7 @@ const tI18nPhrase Phrases[] = {
"Nauhoitus alkaisi %d min. kuluttua - sammutetaanko silti?",
"Nagrywanie za %d minut - mimo to wylaczyc?",
"¿Grabando en %d minutos, de verdad cortar?",
- "Anamenete egrafi se %d lepta - na stamatisi i litourgia sigoura?",
+ "Anamenete egrafi se %d lepta - Telika na termatistei?",
"Inspelning startar om %d minuter, vill du avsluta?",
"Inregistrez in %d minute, opresc?",
"Felvétel %d perc mulva kezdödik - mégis kikapcsolni?",
@@ -884,7 +884,7 @@ const tI18nPhrase Phrases[] = {
"Peruuta pysäytys painamalla jotakin näppäintä",
"Dowolny przycisk zatrzyma wylaczanie",
"Pulse una tecla para interrumpir corte",
- "Piese ena pliktro na stamatisi to katevasma",
+ "Piese ena pliktro na akirothei o termatismos",
"Tryck valfri knapp för att avbryta nedstängning",
"Apasa orice tasta pentru a anula inchiderea",
"Nyomj egy gombot a leállás megállításához",
@@ -949,7 +949,7 @@ const tI18nPhrase Phrases[] = {
"Lähde",
"",//TODO
"",//TODO
- "",//TODO
+ "Pigi",//TODO
"Källa",
"",//TODO
"",//TODO
@@ -1383,7 +1383,7 @@ const tI18nPhrase Phrases[] = {
"Kanava on ajastimen käytössä!",
"Kanal jest zajety przez timer nagran",
"¡Canal está ocupado por un timer!",
- "To kanali xrisimopiite apo programmatismeni thesi",
+ "To kanali xrisimopiite apo kapoion programmatismo!",
"Kanalen används av en timer!",
"Canalul este utilizat de un timer!",
"Csatornát más használja!",
@@ -1399,7 +1399,7 @@ const tI18nPhrase Phrases[] = {
"Kanavan vaihtaminen ei mahdollista!",
"Kanal nie moze byc teraz przelaczony!",
"¡No puedo cambiar canal!",
- "Den mporo na pao sto kanali!",
+ "Adinati i allagi kanaliou!",
"Omöjligt att byta kanal!",
"Nu pot comuta canalul!",
"Csatornát nem lehet átkapcsolni!",
@@ -1431,7 +1431,7 @@ const tI18nPhrase Phrases[] = {
"Nauhoituksen toistaminen epäonnistui!",
"Blad - brak dostepu do nagrania!",
"¡Error al accesar la grabación!",
- "Lathos stin evresi tis egrafis!",
+ "Provlima stin prospelasi egrafis!",
"Det går inte att läsa inspelningen",
"Eroare in timpul accesarii inregistrarii",
"Hiba a felvétel hozzáférésénél",
@@ -1447,7 +1447,7 @@ const tI18nPhrase Phrases[] = {
"Nauhoituksen poistaminen epäonnistui!",
"Blad przy usuwaniu nagrania!",
"¡Error al borrar la grabación!",
- "Lathos stin prospathia na svisti i egrafi!",
+ "Provlima sto svisimo egrafis !",
"Det går inte att ta bort inspelningen",
"Eroare in timpul stergerii inregistrarii!",
"Hiba a felvétel törlésénél!",
@@ -1463,7 +1463,7 @@ const tI18nPhrase Phrases[] = {
"*** Virheellinen kanavavalinta! ***",
"*** Niewazny kanal ***",
"*** Canal inválido ***",
- "*** Kanali akiro ***",
+ "*** Akiro Kanali ***",
"*** Felaktig kanal ***",
"*** Canal invalid ***",
"*** Érvénytelen csatorna ***",
@@ -1479,7 +1479,7 @@ const tI18nPhrase Phrases[] = {
"Ei vapaata vastaanotinta nauhoitusta varten!",
"Brak wolnej karty DVB do nagrywania!",
"¡No hay dispositivo DVB disponible para grabar!",
- "Den iparxi elevteri DVB Karta gia egrafi!",
+ "Den periseuei DVB Karta gia egrafi!",
"Det finns ingen ledig DVB enhet för inspelning!",
"Nu mai sunt dispozitive DVB pentru inregistrare!",
"Nincs szabad DVB kártya a felvételhez!",
@@ -1495,7 +1495,7 @@ const tI18nPhrase Phrases[] = {
"Kanavaa ei voi katsoa nyt!",
"",//TODO
"",//TODO
- "",//TODO
+ "To kanali den ine diathesimo",
"Kanalen ej tillgänglig!",
"",//TODO
"",//TODO
@@ -1511,7 +1511,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "Ta kanalia stin lista den ine monadika!",
"Kanalinställningarna är ej unika!",
"",//TODO
"",//TODO
@@ -1527,7 +1527,7 @@ const tI18nPhrase Phrases[] = {
"Kanava lukittu (nauhoitusta varten)!",
"Kanal zablokowany (nagrywanie w toku)!",
"¡Canal bloqueado (grabando)!",
- "To kanali ine mplokarismeno (Ginete egrafi)!",
+ "To kanali ine klidomeno (Ginete egrafi)!",
"Kanalen är låst (inspelning pågår)!",
"Canal blocat (inregistrare)!",
"Csatorna hozzáférhetetlen (felvétel)!",
@@ -1543,7 +1543,7 @@ const tI18nPhrase Phrases[] = {
"Käsittämättömiä teknisiä ongelmia!",
"Tryb transferowy jest niemozliwy!",
"¡No puedo iniciar modo de transferencia!",
- "Den mpori na arxisi to Transfer-Mode!",
+ "Adinamia ekinisis katastasis metaforas!",
"Kan inte starta Transfer Mode!",
"Nu pot porni Modul de Transfer!",
"Transfer-Mode nem indítható!",
@@ -1559,7 +1559,7 @@ const tI18nPhrase Phrases[] = {
"Muokkauksen aloittaminen ei onnistu!",
"Uruchamianie montazu jest niemozliwe!",
"¡No puedo iniciar proceso de modificación!",
- "Den mpori na arxisi to kopsimo tis tenias!",
+ "Adinamia ekinisis tis epexsergasias!",
"Kan inte starta editering!",
"Nu pot porni procesul de editare!",
"A vágás nem indítható!",
@@ -1575,7 +1575,7 @@ const tI18nPhrase Phrases[] = {
"Muokkaus on jo käynnissä!",
"Montaz w toku!",
"¡Proceso de modificación ya fue iniciado!",
- "To kopsimo ti tenias ini idi se litourgia!",
+ "Epexsergasia vriskete se exselixsi!",
"Editering är redan aktiv!",
"Procesul de editare este activ!",
"A vágás már aktivált!",
@@ -1591,7 +1591,7 @@ const tI18nPhrase Phrases[] = {
"Ei voida sammuttaa '-s' parametria ei annettu!",
"Wylaczenie niemozliwe - brak opcji '-s'!",
"¡No puedo cortar - opción '-s' absente!",
- "Den mporo na kliso ton ipologisti. Lipi i parametros '-s'!",
+ "Adinaton na ginei termatismos. Aniparkti i parametros '-s'!",
"Kan inte avsluta, måste använda flagga '-s'",
"Nu pot opri calculatorul - vezi optiunea '-s'",
"A leállítás nem lehetséges - Opció '-s' hiányzik!",
@@ -1623,7 +1623,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "Den mpori na aniksi to CAM menou!",
"",//TODO
"",//TODO
"",//TODO
@@ -1639,7 +1639,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "Adinato na gini epanafora sto CAM",
"",//TODO
"",//TODO
"",//TODO
@@ -1655,7 +1655,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
- "",//TODO
+ "Sto CAM egine apanafora",
"",//TODO
"",//TODO
"",//TODO
@@ -1945,7 +1945,7 @@ const tI18nPhrase Phrases[] = {
"Valikkojen rullaus",
"Przesuwac stronami",
"Desplazar página entera",
- "Scroll selidas",
+ "Kilisi selidas",
"Bläddra sidor",
"Deruleaza pagini",
"Oldalanként léptetmi",
@@ -1977,7 +1977,7 @@ const tI18nPhrase Phrases[] = {
"Nauhoitushakemistot",
"Wykaz nagran",
"Directorios para grabación",
- "Fakeli egrafon",
+ "Fakeloi egrafon",
"Kataloger för inspelningar",
"Directoare inregistrari",
"Felvételek listája",
@@ -1993,7 +1993,7 @@ const tI18nPhrase Phrases[] = {
"Ohjelmatied. odotusaika (h)",
"Czas do skanu EPG (h)",
"Tiempo hasta exploración EPG (h)",
- "Xronos mexri sarosi EPG se Ores",
+ "Xronos mexri eksetasi EPG se Ores",
"EPG sökning timeout",
"Timeout EPG",
"Fennmaradt idö az EPG-g (h)",
@@ -2041,7 +2041,7 @@ const tI18nPhrase Phrases[] = {
"Vastaanota kellonaika lähettimeltä",
"Transponder do ustawiania czasu",
"Transponder para reloj de sistema",
- "Transponder gia sintonismo tis oras",
+ "Anametadotis gia sintonismo tis oras",
"Använd klockan från transponder",
"Preia ceasul din transponder",
"Idöhöz tartozó Transponder",
@@ -2201,7 +2201,7 @@ const tI18nPhrase Phrases[] = {
"PrimaryLimit",
"Pierwotny limit",
"L'mite primario",
- "Protevon limit",
+ "Protevon orio",
"Primär gräns",
"Limita Primara",
"Primér-határ",
@@ -2265,7 +2265,7 @@ const tI18nPhrase Phrases[] = {
"Merkitse välitön nauh.",
"Zaznaczyc natychm. nagranie",
"Marcar grabaciones instantáneas",
- "Markarisma apevthias egrafis",
+ "Epilogi trexon egrafis",
"Märk direktinspelning",
"Inregistrare imediata",
"Direktfelvétel megjelölése",
@@ -2281,7 +2281,7 @@ const tI18nPhrase Phrases[] = {
"Nimeä välitön nauh.",
"Nazwac natychm. nagranie",
"Nombrar grabaciones instantáneas",
- "eponomasi apevthias egrafis",
+ "eponomasi trexon egrafis",
"Namnge direktinspelning",
"Nume inregistrare imediata",
"Direktfelvétel megnevezése",
@@ -2297,7 +2297,7 @@ const tI18nPhrase Phrases[] = {
"Pikanauhoituksen pituus (min)",
"",//TODO
"",//TODO
- "",//TODO
+ "Stigmiees egrafes xronos (lepta)",
"Direktinspelning längd (min)",
"Timpul de inregistarea imediata (min)",
"Felvétel idötartama",
@@ -2345,7 +2345,7 @@ const tI18nPhrase Phrases[] = {
"Paloittele muokatut",
"Dzielic montowane pliki",
"Quebrar ficheros",
- "Diamelisma epeksergasm. arxeion",
+ "Diamelisma epeksergasmenon arxeion",
"Dela upp editerade filer",
"Separare fisiere editate",
"Feldolgozott File-k felosztása",
@@ -2361,7 +2361,7 @@ const tI18nPhrase Phrases[] = {
"Moninopeustila",
"Tryb wielopredkosciowy",
"Modo multi-velocidad",
- "Multispeed modus",
+ "Multispeed mode",
"Multispeed mode",
"Mod multi-rata",
"MultiSpeed funkció",
@@ -2377,11 +2377,27 @@ const tI18nPhrase Phrases[] = {
"Näytä toiston tila",
"Wyswietlac status odtwarzania",
"Mostrar modo de replay",
- "Endiksi status anametadosis",
+ "Endiksi katastasis anametadosis",
"Visa uppspelnings mode",
"Afiseaza modul de redare",
"Lejátszás feltüntetése",
},
+ { "Setup.Replay$Resume ID",
+ "Wiedergabe ID",
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ "Resume ID",// TODO
+ },
{ "Setup.Miscellaneous$Min. event timeout (min)",
"Mindest Event Pause (min)",
"Najmanjsi cas dogodka (min)",
@@ -2492,7 +2508,7 @@ const tI18nPhrase Phrases[] = {
"Kaukosäätimen näppäinten opettelu (%s)",
"Nauka kodu pilota (%s)",
"Aprendiendo teclas del telemando (%s)",
- "Ekmathisi Remote Control (%s)",
+ "Ekmathisi pliktron tilexirismou (%s)",
"Inlärning av fjärrkontrollsknappar (%s)",
"Invatare taste telecomanda (%s)",
"Távirányító betanítása (%s)",
@@ -2508,7 +2524,7 @@ const tI18nPhrase Phrases[] = {
"Vaihe 1: Lähetystavan selvittäminen",
"Faza 1: Detekcja typu kodu",
"Fase 1: Detectando tipo de receptor",
- "Phasi 1: Dilosi RC Code",
+ "Phasi 1: Anixneusi kodika RC",
"Steg1: identifiering av RC kod",
"Faza 1: Detectie tip telecomanda",
"Elsö lépés: távirányító kódjának meghatározása",
@@ -2524,7 +2540,7 @@ const tI18nPhrase Phrases[] = {
"Paina mitä tahansa kaukosäätimen näppäintä",
"Nacisnac klawisz pilota",
"Pulse una tecla en el telemando",
- "Pata ena pliktro sto RC",
+ "Piese ena pliktro sto tilexiristirio",
"Tryck valfri tangent på fjärrkontrollen",
"Apasati o tasta pe telecomanda",
"Nyomjon meg egy gombot a távirányítón",
@@ -2540,7 +2556,7 @@ const tI18nPhrase Phrases[] = {
"Näppäinpainallus vastaanotettu!",
"Kod pilota zostal poznany!",
"¡Código detectado!",
- "Evresi RC Code!",
+ "Evrethike kodikas RC!",
"RC koden detekterad!",
"S-a detectat tipul telecomenzii!",
"Távirányító kódja felismerve!",
@@ -2556,7 +2572,7 @@ const tI18nPhrase Phrases[] = {
"Älä paina mitään näppäintä...",
"Nie naciskac klawiszy...",
"No pulse tecla...",
- "Min patas Pliktra...",
+ "Min piezeis pliktra...",
"Tryck inte på någon knapp...",
"Nu apasati nicio tasta...",
"Ne nyomjon meg gombot...",
@@ -2588,7 +2604,7 @@ const tI18nPhrase Phrases[] = {
"Paina näppäintä toiminnolle '%s'",
"Nacisnac klawisz dla '%s'",
"Pulsar tecla para '%s'",
- "Pata to pliktro gia '%s'",
+ "Piese to pliktro gia '%s'",
"Tryck på knappen för '%s'",
"Apasati tasta pentru '%s'",
"'%s' gomb megnyomása",
@@ -2604,7 +2620,7 @@ const tI18nPhrase Phrases[] = {
"Paina 'Ylös' hyväksyäksesi",
"Nacisnac 'Gora' do potwierdzenia",
"Pulse 'Arriba' para confirmar",
- "Pata 'pano' gia apodoxi",
+ "Piese 'pano' gia apodoxi",
"Tryck 'Upp' för att bekräfta",
"Apsati 'Sus' pentru confirmare",
"'Fel' megnyomása az elfogadáshoz",
@@ -2620,7 +2636,7 @@ const tI18nPhrase Phrases[] = {
"Paina 'Alas' jatkaaksesi",
"Nacisnac 'Dol' zeby kontynuowac",
"Pulse 'Abajo' para confirmar",
- "Pata 'kato' gia sinexia",
+ "Piese 'kato' gia sinexia",
"Tryck 'Ner' för att bekräfta",
"Apasati jos pentru continuare",
"'Le' megnyomása a folytatáshoz",
@@ -2636,7 +2652,7 @@ const tI18nPhrase Phrases[] = {
"(paina 'Ylös' palataksesi takaisin)",
"(Nacisnac 'Gora' cofa)",
"(Pulse 'Arriba' para retornar)",
- "(Pata 'pano' gia na pas piso)",
+ "(Piese 'pano' gia epistrofi",
"(Tryck 'Upp' för att backa)",
"(Apsati 'Sus' pentru revenire)",
"(´Fel' megnyomása a visszatéréshez)",
@@ -2652,7 +2668,7 @@ const tI18nPhrase Phrases[] = {
"(paina 'Alas' lopettaaksesi näppäinten opettelun)",
"(Nacisnac 'Dol' by zakonczyc)",
"(Pulse 'Abajo' para terminar programación teclas)",
- "(Pata 'Kato' gia termatismo)",
+ "(Piese 'Kato' gia termatismo diloseon plktron)",
"(Tryck 'Ner' för att avsluta knapp definition)",
"(Apasati 'Jos' pentru terminare)",
"('Le' megnyomása a befejezéshez)",
@@ -2668,7 +2684,7 @@ const tI18nPhrase Phrases[] = {
"(Paina 'Valikko' jos näppäintä ei ole)",
"",// TODO
"",// TODO
- "",// TODO
+ "Pata 'Menou' gia prosperasi aftou tou pliktrou",
"",// TODO
"",// TODO
"",// TODO
@@ -2700,7 +2716,7 @@ const tI18nPhrase Phrases[] = {
"Paina 'Ylös' tallettaaksesi ja 'Alas' peruuttaaksesi",
"'Gora' zapamietuje, 'Dol' przerywa",
"Pulse 'Arriba' para guarder, 'Abajo' para anular",
- "'Kato' apothikevsi, 'Pano' akirosi",
+ "'Pano' apothikevsi, 'Kato' akirosi",
"Tryck 'Upp' för att spara, 'Ner' för att avsluta",
"Apsati 'Sus' pentru salvare, 'Jos' pentru anulare",
"'Fel' mentés, 'Le´ mégse",
@@ -2893,7 +2909,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "Anametadosi",
"Spela upp",
"",// TODO
"",// TODO
@@ -2909,7 +2925,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "Dialima",
"Pausa",
"",// TODO
"",// TODO
@@ -2925,7 +2941,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "Terma",
"Stoppa",
"",// TODO
"",// TODO
@@ -2941,7 +2957,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "Egrafi",
"Spela in",
"",// TODO
"",// TODO
@@ -2957,7 +2973,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "Girisma mprosta",
"Spola framåt",
"",// TODO
"",// TODO
@@ -2973,7 +2989,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "Girisma piso",
"Spola bakåt",
"",// TODO
"",// TODO
@@ -3005,7 +3021,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "Kanali+",
"Kanal+",
"",// TODO
"",// TODO
@@ -3021,7 +3037,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "Kanali-",
"Kanal-",
"",// TODO
"",// TODO
@@ -3069,7 +3085,7 @@ const tI18nPhrase Phrases[] = {
"Äänen vaimennus",
"Cisza",
"Mudo",
- "Mougko",
+ "Siopilo",
"Ljud Av",
"Mut(e)",
"Csend",
@@ -3118,7 +3134,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "klisto",
"av",
"",// TODO
"",// TODO
@@ -3134,7 +3150,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "kanena",
"",// TODO
"",// TODO
"",// TODO
@@ -3150,7 +3166,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
- "",// TODO
+ "aftomato",
"",// TODO
"",// TODO
"",// TODO
@@ -3294,7 +3310,7 @@ const tI18nPhrase Phrases[] = {
" Peruuta muokkaus",
" Przerwac montaz",
" Anular modificación",
- " Diakopi kopsimatos",
+ " Akirosi epexsergasias",
" Avbryt editering",
" Opreste editare",
" Vágást megszakítani",
@@ -3342,7 +3358,7 @@ const tI18nPhrase Phrases[] = {
"Muokkaus aloitettu",
"Uruchomiony proces montazu",
"Proceso modificación iniciado",
- "Arxi kopsimatos",
+ "Arxi epexsergasias",
"Editering startad",
"Procesul de editare a inceput",
"Vágás elindítva",
@@ -3358,7 +3374,7 @@ const tI18nPhrase Phrases[] = {
"Muokkaus lopetettu",
"Proces montazu zakonczony",
"Proceso modificacion terminado",
- "To kopsimo termatistike",
+ "I epexsergasia teliose",
"Editering avslutad",
"Procesul de editare s-a terminat",
"Vágás befejezve",
@@ -3374,7 +3390,7 @@ const tI18nPhrase Phrases[] = {
"Muokkaus epäonnistui!",
"Bledny proces montazu!",
"Modificación ha fallado!",
- "Kopsimo apetixe!",
+ "I epexsergasia apetixe!",
"Editeringsprocessen misslyckades",
"Proces de editare nereusit",
"Vágás sikertelen!",
@@ -3390,7 +3406,7 @@ const tI18nPhrase Phrases[] = {
"haetaan nauhoituksia...",
"Skan nagran...",
"buscando grabaciones...",
- "Ginete sarosi egrafon...",
+ "Eksetasi egrafon...",
"Söker igenom inspelningarna...",
"Caut inregistrari...",
"Felvett adások böngészése...",
@@ -3406,7 +3422,7 @@ const tI18nPhrase Phrases[] = {
"Tällä laajennoksella ei ole asetuksia!",
"",// TODO
"",// TODO
- "",// TODO
+ "Afto to plugin den exi parametrous",
"",// TODO
"",// TODO
"",// TODO
@@ -3496,4 +3512,3 @@ const char * const * I18nLanguages(void)
{
return &Phrases[0][0];
}
-
diff --git a/interface.c b/interface.c
index 7466a9a..9245c85 100644
--- a/interface.c
+++ b/interface.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: interface.c 1.61 2002/12/06 14:13:16 kls Exp $
+ * $Id: interface.c 1.63 2003/04/12 14:17:49 kls Exp $
*/
#include "interface.h"
@@ -264,7 +264,7 @@ void cInterface::Status(const char *s, eDvbColor FgColor, eDvbColor BgColor)
int Line = (abs(height) == 1) ? 0 : -2;
ClearEol(0, Line, s ? BgColor : clrBackground);
if (s) {
- int x = (Width() - strlen(s)) / 2;
+ int x = (Width() - int(strlen(s))) / 2;
if (x < 0)
x = 0;
Write(x, Line, s, FgColor, BgColor);
@@ -411,6 +411,10 @@ void cInterface::QueryKeys(cRemote *Remote)
void cInterface::LearnKeys(void)
{
for (cRemote *Remote = Remotes.First(); Remote; Remote = Remotes.Next(Remote)) {
+ if (!Remote->Ready()) {
+ esyslog("ERROR: remote control %s not ready!", Remote->Name());
+ continue;
+ }
bool known = Keys.KnowsRemote(Remote->Name());
dsyslog("remote control %s - %s", Remote->Name(), known ? "keys known" : "learning keys");
if (!known) {
diff --git a/libdtv/libsi/include/libsi.h b/libdtv/libsi/include/libsi.h
index 8e9e260..715d18b 100644
--- a/libdtv/libsi/include/libsi.h
+++ b/libdtv/libsi/include/libsi.h
@@ -4,11 +4,13 @@
/// ///
//////////////////////////////////////////////////////////////
-// $Revision: 1.6 $
-// $Date: 2002/01/30 17:04:13 $
+// $Revision: 1.7 $
+// $Date: 2003/02/04 18:45:36 $
// $Author: hakenes $
//
-// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
+// (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the
+// GNU GPL with contribution of Oleg Assovski,
+// www.satmania.com
//
// libsi is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -38,9 +40,9 @@
/* Program Identifier */
#define PID_PAT 0x00 /* Program Association Table */
-#define PID_BAT 0x01 /* Bouquet Association Table */
#define PID_CAT 0x01 /* Conditional Access Table */
#define PID_NIT 0x10 /* Network Information Table */
+#define PID_BAT 0x11 /* Bouquet Association Table */
#define PID_SDT 0x11 /* Service Description Table */
#define PID_EIT 0x12 /* Event Information Table */
#define PID_RST 0x13 /* Running Status Table */
@@ -75,12 +77,13 @@
#define TID_TOT 0x73 /* Time Offset Section */
#define TID_CA_ECM_0 0x80
#define TID_CA_ECM_1 0x81
+#define TID_CA_EMM 0x82
-#define TID_BAT 0x01 /* Bouquet Association Section */
+#define TID_BAT 0x4A /* Bouquet Association Section */
#define TID_EIT 0x12 /* Event Information Section */
-#define TID_RST 0x13 /* Running Status Section */
-#define TID_ST 0x14 /* Stuffung Section */
+#define TID_RST 0x71 /* Running Status Section */
+#define TID_ST 0x72 /* Stuffing Section */
/* 0xFF */ /* Reserved for future use */
/* Descriptor Identifier */
@@ -160,6 +163,40 @@
#define MAX_SECTION_BUFFER 4096
+/* NetworkInfo structure (used to store NIT/BAT information) */
+
+struct NetworkInfo {
+ struct NODE Node;
+ unsigned short ID; // NetworkID / BouquetID
+ struct LIST *Descriptors;
+ struct LIST *TransportStreams;
+};
+
+#define CreateNetworkInfo(ni, id) \
+ do { \
+ xCreateNode (ni, NULL); \
+ (ni)->ID = id; \
+ (ni)->Descriptors = xNewList(NULL); \
+ (ni)->TransportStreams = NULL; \
+ } while(0)
+
+/* TransportStream structure (NIT/BAT TS loop member) */
+
+struct TransportStream {
+ struct NODE Node;
+ int TransportStreamID;
+ unsigned short OriginalNetworkID;
+ struct LIST *Descriptors;
+};
+
+#define CreateTransportStream(ts, tsid, onid) \
+ do { \
+ xCreateNode (ts, NULL); \
+ (ts)->TransportStreamID = tsid; \
+ (ts)->OriginalNetworkID = onid; \
+ (ts)->Descriptors = xNewList(NULL); \
+ } while(0)
+
/* Strukturen zur Aufnahme der SDT und EIT Informationen */
struct Service {
@@ -305,38 +342,32 @@ struct PidInfo {
#define STREAMTYPE_13818_D 13
#define STREAMTYPE_13818_AUX 14
-/* Descriptors */
-
-#define DescriptorTag(x) ((struct Descriptor *)(x))->Tag
-struct Descriptor {
- struct NODE Node;
- unsigned short Tag;
+struct Tot {
+ time_t UTC;
+ time_t Bias;
+ struct LIST *Descriptors;
};
+#define CreateTot(tot, utc) \
+ do \
+ { \
+ xMemAlloc(sizeof(struct Tot), &tot); \
+ tot->UTC = utc; \
+ tot->Bias = ((utc - time(NULL) + 1800)/3600)*3600; \
+ tot->Descriptors = xNewList(NULL); \
+ } while (0)
-/* ConditionalAccessDescriptor */
-struct ConditionalAccessDescriptor {
+/* Descriptors */
+
+#define DescriptorTag(x) ((struct Descriptor *)(x))->Tag
+
+struct Descriptor {
struct NODE Node;
unsigned short Tag;
- unsigned short Amount; /* Data */
- unsigned char *Data;
};
-#define CreateConditionalAccessDescriptor(descr, amount, data) \
- do \
- { \
- unsigned char *tmpptr; \
- \
- xMemAlloc (amount, &tmpptr); \
- memcpy (tmpptr, data, amount); \
- xCreateNode (((struct ConditionalAccessDescriptor *)descr), NULL); \
- ((struct ConditionalAccessDescriptor *)descr)->Tag = DESCR_CA; \
- ((struct ConditionalAccessDescriptor *)descr)->Amount = amount; \
- ((struct ConditionalAccessDescriptor *)descr)->Data = tmpptr; \
- } while (0)
-
/* Iso639LanguageDescriptor */
@@ -434,19 +465,23 @@ struct AncillaryDataDescriptor {
/* BouquetNameDescriptor */
+/*
+ the same used instead of NetworkNameDescriptor because their structures
+ are identical. We pass 'tag' parameter to distinguish between them later
+*/
struct BouquetNameDescriptor {
struct NODE Node; /* Node enthält Namen */
unsigned short Tag;
};
-#define CreateBouquetNameDescriptor(descr, text) \
+#define CreateBouquetNameDescriptor(descr, text, tag) \
do \
{ \
xCreateNode (((struct BouquetNameDescriptor *)descr), NULL); \
((struct NODE *)descr)->Name = text; \
((struct NODE *)descr)->HashKey = xHashKey (text); \
- ((struct BouquetNameDescriptor *)descr)->Tag = DESCR_BOUQUET_NAME; \
+ ((struct BouquetNameDescriptor *)descr)->Tag = tag; \
} while (0)
@@ -514,6 +549,33 @@ struct CaIdentifierDescriptor {
((struct CaIdentifierDescriptor *)descr)->SystemID[num] = id
#define GetCaIdentifierID(descr, num) (((struct CaIdentifierDescriptor *)descr)->SystemID[num])
+/* CaDescriptor */
+
+struct CaDescriptor {
+ struct NODE Node;
+ unsigned short Tag;
+ unsigned short CA_type;
+ unsigned short CA_PID;
+ unsigned int ProviderID;
+ unsigned short DataLength;
+ unsigned char *Data;
+};
+
+#define CreateCaDescriptor(descr, typ, capid, len) \
+ do \
+ { \
+ xCreateNode (((struct CaDescriptor *)descr), NULL); \
+ ((struct CaDescriptor *)descr)->Tag = DESCR_CA; \
+ ((struct CaDescriptor *)descr)->CA_type = typ; \
+ ((struct CaDescriptor *)descr)->CA_PID = capid; \
+ ((struct CaDescriptor *)descr)->ProviderID = 0; \
+ ((struct CaDescriptor *)descr)->DataLength = len; \
+ xMemAlloc (len+1, &((struct CaDescriptor *)descr)->Data); \
+ } while (0)
+
+#define SetCaData(descr, num, id) \
+ ((struct CaDescriptor *)descr)->Data[num] = id
+#define GetCaData(descr, num) (((struct CaDescriptor *)descr)->Data[num])
/* StreamIdentifierDescriptor */
@@ -968,6 +1030,122 @@ struct SubtitlingItem {
xAddTail (((struct SubtitlingDescriptor *)desc)->Items, item); \
} while (0)
+/* SatelliteDeliverySystemDescriptor */
+
+struct SatelliteDeliverySystemDescriptor {
+ struct NODE Node;
+ unsigned short Tag;
+ long Frequency;
+ short OrbitalPosition;
+ char Polarization;
+ long SymbolRate;
+ char FEC;
+};
+
+#define CreateSatelliteDeliverySystemDescriptor(descr, freq, orb, polar, sr, fec) \
+ do \
+ { \
+ xCreateNode (((struct SatelliteDeliverySystemDescriptor *)descr), NULL); \
+ ((struct SatelliteDeliverySystemDescriptor *)descr)->Tag = DESCR_SAT_DEL_SYS; \
+ ((struct SatelliteDeliverySystemDescriptor *)descr)->Frequency = freq; \
+ ((struct SatelliteDeliverySystemDescriptor *)descr)->OrbitalPosition = orb; \
+ ((struct SatelliteDeliverySystemDescriptor *)descr)->Polarization = polar; \
+ ((struct SatelliteDeliverySystemDescriptor *)descr)->SymbolRate = sr; \
+ ((struct SatelliteDeliverySystemDescriptor *)descr)->FEC = fec; \
+ } while (0)
+
+/* ServiceListDescriptor */
+
+struct ServiceListDescriptor {
+ struct NODE Node;
+ unsigned short Tag;
+ struct LIST *ServiceList;
+};
+
+#define CreateServiceListDescriptor(descr) \
+ do \
+ { \
+ xCreateNode (((struct ServiceListDescriptor *)descr), NULL); \
+ ((struct ServiceListDescriptor *)descr)->Tag = DESCR_SERVICE_LIST; \
+ ((struct ServiceListDescriptor *)descr)->ServiceList = xNewList(NULL); \
+ } while (0)
+
+struct ServiceListEntry {
+ struct NODE Node;
+ int ServiceID;
+ unsigned short ServiceType;
+};
+
+#define AddServiceListEntry(descr, id, typ) \
+ do \
+ { \
+ struct ServiceListEntry *newent; \
+ \
+ xCreateNode (newent, NULL); \
+ newent->ServiceID = id; \
+ newent->ServiceType = typ; \
+ xAddTail (((struct ServiceListDescriptor *)descr)->ServiceList, newent); \
+ } while (0)
+
+/* LocalTimeOffsetDescriptor */
+
+struct LocalTimeOffsetDescriptor {
+ struct NODE Node;
+ unsigned short Tag;
+ struct LIST *LocalTimeOffsets;
+};
+
+#define CreateLocalTimeOffsetDescriptor(descr) \
+ do \
+ { \
+ xCreateNode (((struct LocalTimeOffsetDescriptor *)descr), NULL); \
+ ((struct LocalTimeOffsetDescriptor *)descr)->Tag = DESCR_LOCAL_TIME_OFF; \
+ ((struct LocalTimeOffsetDescriptor *)descr)->LocalTimeOffsets = xNewList(NULL); \
+ } while (0)
+
+struct LocalTimeOffsetEntry {
+ struct NODE Node;
+ char CountryCode[4];
+ char RegionID;
+ time_t CurrentOffset;
+ time_t ChangeTime;
+ time_t NextOffset;
+};
+
+#define CreateLocalTimeOffsetEntry(newent, code1, code2, code3, reg, co, ct, no) \
+ do \
+ { \
+ xCreateNode (newent, NULL); \
+ newent->CountryCode[0] = code1; \
+ newent->CountryCode[1] = code2; \
+ newent->CountryCode[2] = code3; \
+ newent->CountryCode[3] = '\0'; \
+ newent->RegionID = reg; \
+ newent->CurrentOffset = co; \
+ newent->ChangeTime = ct; \
+ newent->NextOffset = no; \
+ } while (0)
+
+#define AddLocalTimeOffsetEntry(descr, code1, code2, code3, reg, co, ct, no) \
+ do \
+ { \
+ struct LocalTimeOffsetEntry *newent; \
+ \
+ xCreateNode (newent, NULL); \
+ newent->CountryCode[0] = code1; \
+ newent->CountryCode[1] = code2; \
+ newent->CountryCode[2] = code3; \
+ newent->CountryCode[3] = '\0'; \
+ newent->RegionID = reg; \
+ newent->CurrentOffset = co; \
+ newent->ChangeTime = ct; \
+ newent->NextOffset = no; \
+ xAddTail (((struct LocalTimeOffsetDescriptor *)descr)->LocalTimeOffsets, newent); \
+ } while (0)
+
+#define timezonecmp(ptoe,cod,reg) \
+ (strncmp(ptoe->CountryCode, cod, 3) || (ptoe->RegionID != reg))
+
/* Prototypes */
@@ -979,13 +1157,17 @@ extern "C" {
/* si_parser.c */
struct LIST *siParsePAT (u_char *);
+struct LIST *siParseCAT (u_char *);
struct Pid *siParsePMT (u_char *);
struct LIST *siParseSDT (u_char *);
+struct LIST *siParseNIT (u_char *);
struct LIST *siParseEIT (u_char *);
time_t siParseTDT (u_char *);
+struct Tot *siParseTOT (u_char *);
void siParseDescriptors (struct LIST *, u_char *, int, u_char);
void siParseDescriptor (struct LIST *, u_char *);
char *siGetDescriptorText (u_char *, int);
+char *siGetDescriptorName (u_char *, int);
u_long crc32 (char *data, int len);
/* si_debug_services.c */
@@ -999,6 +1181,8 @@ void siDebugPids (char *, struct LIST *);
void siDebugDescriptors (char *, struct LIST *);
void siDebugEitServices (struct LIST *);
void siDebugEitEvents (char *, struct LIST *);
+void siDumpDescriptor (void *);
+void siDumpSection (void *);
#ifdef __cplusplus
}
diff --git a/libdtv/libsi/include/si_tables.h b/libdtv/libsi/include/si_tables.h
index dfda3bf..b7cfea2 100644
--- a/libdtv/libsi/include/si_tables.h
+++ b/libdtv/libsi/include/si_tables.h
@@ -5,11 +5,13 @@
/// ///
//////////////////////////////////////////////////////////////
-// $Revision: 1.3 $
-// $Date: 2001/10/07 10:24:46 $
+// $Revision: 1.4 $
+// $Date: 2003/02/04 18:45:36 $
// $Author: hakenes $
//
-// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
+// (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the
+// GNU GPL with contribution of Oleg Assovski,
+// www.satmania.com
//
// libsi is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -32,12 +34,22 @@
#define BcdTimeToSeconds(x) ((3600 * ((10*((x##_h & 0xF0)>>4)) + (x##_h & 0xF))) + \
(60 * ((10*((x##_m & 0xF0)>>4)) + (x##_m & 0xF))) + \
((10*((x##_s & 0xF0)>>4)) + (x##_s & 0xF)))
+#define BcdTimeToMinutes(x) ((60 * ((10*((x##_h & 0xF0)>>4)) + (x##_h & 0xF))) + \
+ (((10*((x##_m & 0xF0)>>4)) + (x##_m & 0xF))))
+#define BcdCharToInt(x) (10*((x & 0xF0)>>4) + (x & 0xF))
+#define CheckBcdChar(x) ((((x & 0xF0)>>4) <= 9) && \
+ ((x & 0x0F) <= 9))
+#define CheckBcdSignedChar(x) ((((x & 0xF0)>>4) >= 0) && (((x & 0xF0)>>4) <= 9) && \
+ ((x & 0x0F) >= 0) && ((x & 0x0F) <= 9))
#define TableHasMoreSections(x) (((pat_t *)(x))->last_section_number > ((pat_t *)(x))->section_number)
#define GetTableId(x) ((pat_t *)(x))->table_id
#define GetSectionNumber(x) ((pat_t *)(x))->section_number
#define GetLastSectionNumber(x) ((pat_t *)(x))->last_section_number
#define GetServiceId(x) (((eit_t *)(x))->service_id_hi << 8) | ((eit_t *)(x))->service_id_lo
+#define GetSegmentLastSectionNumber(x) ((eit_t *)(x))->segment_last_section_number
+#define GetLastTableId(x) ((eit_t *)(x))->segment_last_table_id
+#define GetSectionLength(x) HILO(((pat_t *)(x))->section_length)
/*
*
@@ -113,7 +125,37 @@ typedef struct {
* applicable.
*
*/
- /* TO BE DONE */
+#define CAT_LEN 8
+
+typedef struct {
+ u_char table_id :8;
+#if BYTE_ORDER == BIG_ENDIAN
+ u_char section_syntax_indicator :1;
+ u_char dummy :1; // has to be 0
+ u_char :2;
+ u_char section_length_hi :4;
+#else
+ u_char section_length_hi :4;
+ u_char :2;
+ u_char dummy :1; // has to be 0
+ u_char section_syntax_indicator :1;
+#endif
+ u_char section_length_lo :8;
+ u_char reserved_1 :8;
+ u_char reserved_2 :8;
+#if BYTE_ORDER == BIG_ENDIAN
+ u_char :2;
+ u_char version_number :5;
+ u_char current_next_indicator :1;
+#else
+ u_char current_next_indicator :1;
+ u_char version_number :5;
+ u_char :2;
+#endif
+ u_char section_number :8;
+ u_char last_section_number :8;
+} cat_t;
+
/*
*
* 3) Program Map Table (PMT):
@@ -297,7 +339,7 @@ typedef struct {
* bouquet.
*
*/
- /* TO BE DONE */
+/* SEE NIT (It has the same structure but has different allowed descriptors) */
/*
*
* 2) Service Description Table (SDT):
@@ -339,6 +381,9 @@ typedef struct {
u_char :8;
} sdt_t;
+#define GetSDTTransportStreamId(x) (HILO(((sdt_t *) x)->transport_stream_id))
+#define GetSDTOriginalNetworkId(x) (HILO(((sdt_t *) x)->original_network_id))
+
#define SDT_DESCR_LEN 5
typedef struct {
@@ -483,7 +528,36 @@ typedef struct {
* to the frequent updating of the time information.
*
*/
- /* TO BE DONE */
+#define TOT_LEN 10
+
+typedef struct {
+ u_char table_id :8;
+#if BYTE_ORDER == BIG_ENDIAN
+ u_char section_syntax_indicator :1;
+ u_char :3;
+ u_char section_length_hi :4;
+#else
+ u_char section_length_hi :4;
+ u_char :3;
+ u_char section_syntax_indicator :1;
+#endif
+ u_char section_length_lo :8;
+ u_char utc_mjd_hi :8;
+ u_char utc_mjd_lo :8;
+ u_char utc_time_h :8;
+ u_char utc_time_m :8;
+ u_char utc_time_s :8;
+#if BYTE_ORDER == BIG_ENDIAN
+ u_char :4;
+ u_char descriptors_loop_length_hi :4;
+#else
+ u_char descriptors_loop_length_hi :4;
+ u_char :4;
+#endif
+ u_char descriptors_loop_length_lo :8;
+} tot_t;
+
+
/*
*
* 7) Stuffing Table (ST):
@@ -545,6 +619,25 @@ typedef struct descr_gen_struct {
#define GetDescriptorLength(x) (((descr_gen_t *) x)->descriptor_length+DESCR_GEN_LEN)
+/* 0x09 ca_descriptor */
+
+#define DESCR_CA_LEN 6
+typedef struct descr_ca_struct {
+ u_char descriptor_tag :8;
+ u_char descriptor_length :8;
+ u_char CA_type_hi :8;
+ u_char CA_type_lo :8;
+#if BYTE_ORDER == BIG_ENDIAN
+ u_char reserved :3;
+ u_char CA_PID_hi :5;
+#else
+ u_char CA_PID_hi :5;
+ u_char reserved :3;
+#endif
+ u_char CA_PID_lo :8;
+} descr_ca_t;
+#define CastCaDescriptor(x) ((descr_ca_t *)(x))
+
/* 0x0A iso_639_language_descriptor */
#define DESCR_ISO_639_LANGUAGE_LEN 5
@@ -560,25 +653,31 @@ typedef struct descr_iso_639_language_struct {
/* 0x40 network_name_descriptor */
-#define DESCR_NETWORK_NAME_LEN XX
+#define DESCR_NETWORK_NAME_LEN 2
typedef struct descr_network_name_struct {
u_char descriptor_tag :8;
u_char descriptor_length :8;
- /* TBD */
} descr_network_name_t;
#define CastNetworkNameDescriptor(x) ((descr_network_name_t *)(x))
/* 0x41 service_list_descriptor */
-#define DESCR_SERVICE_LIST_LEN XX
+#define DESCR_SERVICE_LIST_LEN 2
typedef struct descr_service_list_struct {
u_char descriptor_tag :8;
u_char descriptor_length :8;
- /* TBD */
} descr_service_list_t;
#define CastServiceListDescriptor(x) ((descr_service_list_t *)(x))
+#define DESCR_SERVICE_LIST_LOOP_LEN 3
+typedef struct descr_service_list_loop_struct {
+ u_char service_id_hi :8;
+ u_char service_id_lo :8;
+ u_char service_type :8;
+} descr_service_list_loop_t;
+#define CastServiceListDescriptorLoop(x) ((descr_service_list_loop_t *)(x))
+
/* 0x42 stuffing_descriptor */
@@ -604,13 +703,13 @@ typedef struct descr_satellite_delivery_system_struct {
u_char orbital_position1 :8;
u_char orbital_position2 :8;
#if BYTE_ORDER == BIG_ENDIAN
- u_char modulation :5;
- u_char polarization :2;
- u_char west_east_flag :1;
-#else
u_char west_east_flag :1;
u_char polarization :2;
u_char modulation :5;
+#else
+ u_char modulation :5;
+ u_char polarization :2;
+ u_char west_east_flag :1;
#endif
u_char symbol_rate1 :8;
u_char symbol_rate2 :8;
@@ -964,14 +1063,39 @@ typedef struct descr_telephone_struct {
/* 0x58 local_time_offset_descriptor */
-#define DESCR_LOCAL_TIME_OFFSET_LEN XX
+#define DESCR_LOCAL_TIME_OFFSET_LEN 2
typedef struct descr_local_time_offset_struct {
u_char descriptor_tag :8;
u_char descriptor_length :8;
- /* TBD */
} descr_local_time_offset_t;
#define CastLocalTimeOffsetDescriptor(x) ((descr_local_time_offset_t *)(x))
+#define LOCAL_TIME_OFFSET_ENTRY_LEN 15
+typedef struct local_time_offset_entry_struct {
+ u_char country_code1 :8;
+ u_char country_code2 :8;
+ u_char country_code3 :8;
+#if BYTE_ORDER == BIG_ENDIAN
+ u_char country_region_id :6;
+ u_char :1;
+ u_char local_time_offset_polarity :1;
+#else
+ u_char local_time_offset_polarity :1;
+ u_char :1;
+ u_char country_region_id :6;
+#endif
+ u_char local_time_offset_h :8;
+ u_char local_time_offset_m :8;
+ u_char time_of_change_mjd_hi :8;
+ u_char time_of_change_mjd_lo :8;
+ u_char time_of_change_time_h :8;
+ u_char time_of_change_time_m :8;
+ u_char time_of_change_time_s :8;
+ u_char next_time_offset_h :8;
+ u_char next_time_offset_m :8;
+} local_time_offset_entry_t ;
+#define CastLocalTimeOffsetEntry(x) ((local_time_offset_entry_t *)(x))
+
/* 0x59 subtitling_descriptor */
diff --git a/libdtv/libsi/si_debug_services.c b/libdtv/libsi/si_debug_services.c
index ae2a92a..ac8de34 100644
--- a/libdtv/libsi/si_debug_services.c
+++ b/libdtv/libsi/si_debug_services.c
@@ -4,11 +4,13 @@
/// ///
//////////////////////////////////////////////////////////////
-// $Revision: 1.4 $
-// $Date: 2001/10/07 10:24:46 $
+// $Revision: 1.5 $
+// $Date: 2003/02/04 18:45:35 $
// $Author: hakenes $
//
-// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
+// (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the
+// GNU GPL with contribution of Oleg Assovski,
+// www.satmania.com
//
// libsi is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -26,11 +28,13 @@
// Boston, MA 02111-1307, USA.
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "../liblx/liblx.h"
#include "libsi.h"
+#include "si_tables.h"
#include "si_debug_services.h"
@@ -208,6 +212,8 @@ void siDebugPids (char *Prepend, struct LIST *PidList)
printf ("%s ProgramID: %d\n", Prepend, Pid->ProgramID);
printf ("%s PcrPid: %d\n", Prepend, Pid->PcrPID);
printf ("%s PmtVersion: %d\n", Prepend, Pid->PmtVersion);
+ sprintf (NewPrepend, "%s ", Prepend);
+ siDebugDescriptors (NewPrepend, Pid->Descriptors);
xForeach (Pid->InfoList, PidInfo)
{
@@ -256,6 +262,11 @@ void siDebugDescriptors (char *Prepend, struct LIST *Descriptors)
printf ("\n");
break;
+ case DESCR_NW_NAME:
+ printf ("%sDescriptor: Network Name\n", Prepend);
+ printf ("%s Name: %s\n", Prepend, xName (Descriptor));
+ break;
+
case DESCR_BOUQUET_NAME:
printf ("%sDescriptor: Bouquet Name\n", Prepend);
printf ("%s Name: %s\n", Prepend, xName (Descriptor));
@@ -336,12 +347,38 @@ void siDebugDescriptors (char *Prepend, struct LIST *Descriptors)
case DESCR_CA_IDENT:
printf ("%sDescriptor: Conditional Access Identity\n", Prepend);
{
- int j;
+ int j,k;
for (j = 0; j < ((struct CaIdentifierDescriptor *)Descriptor)->Amount; j++)
- printf ("%s SystemID: 0x%04x\n", Prepend, GetCaIdentifierID (Descriptor, j));
+ {
+ printf ("%s SystemID: 0x%04x", Prepend, GetCaIdentifierID (Descriptor, j));
+ k = GetCaIdentifierID (Descriptor, j) >> 8;
+ if (k < 0 || k > MAX_CA_IDENT) printf (" (unknown)\n");
+ else printf (" (%s)\n", CaIdents[k]);
+ }
}
break;
+ case DESCR_CA:
+ {
+ int j,k;
+
+ printf ("%sDescriptor: Conditional Access\n", Prepend);
+ printf ("%s CA type: 0x%04x", Prepend, (((struct CaDescriptor *)Descriptor)->CA_type));
+ k = (((struct CaDescriptor *)Descriptor)->CA_type) >> 8;
+ if (k < 0 || k > MAX_CA_IDENT) printf (" (unknown)\n");
+ else printf (" (%s)\n", CaIdents[k]);
+ printf ("%s CA PID: %d\n", Prepend, (((struct CaDescriptor *)Descriptor)->CA_PID));
+ printf ("%s ProviderID: 0x%04X\n", Prepend, (((struct CaDescriptor *)Descriptor)->ProviderID));
+ if (((struct CaDescriptor *)Descriptor)->DataLength > 0)
+ {
+ printf ("%s CA data:", Prepend);
+ for (j = 0; j < ((struct CaDescriptor *)Descriptor)->DataLength; j++)
+ printf (" 0x%02x", GetCaData (Descriptor, j));
+ printf ("\n");
+ }
+ }
+ break;
+
case DESCR_CONTENT:
printf ("%sDescriptor: Content\n", Prepend);
{
@@ -489,16 +526,57 @@ void siDebugDescriptors (char *Prepend, struct LIST *Descriptors)
}
break;
- case DESCR_NW_NAME:
+ case DESCR_SAT_DEL_SYS:
+ {
+ struct SatelliteDeliverySystemDescriptor *sds =
+ (struct SatelliteDeliverySystemDescriptor *)Descriptor;
+
+ printf ("%sDescriptor: Satellite Delivery System\n", Prepend);
+ printf ("%s Frequency: %ld\n", Prepend, sds->Frequency);
+ printf ("%s OrbitalPosition: %d\n", Prepend, sds->OrbitalPosition);
+ printf ("%s Polarization: %c\n", Prepend, sds->Polarization);
+ printf ("%s SymbolRate: %ld\n", Prepend, sds->SymbolRate);
+ printf ("%s FEC: %c\n", Prepend, sds->FEC);
+ }
+ break;
+
case DESCR_SERVICE_LIST:
+ {
+ struct ServiceListEntry *Entry;
+
+ printf ("%sDescriptor: Service List\n", Prepend);
+ xForeach (((struct ServiceListDescriptor *)Descriptor)->ServiceList, Entry)
+ {
+ printf ("%s Entry:\n");
+ printf ("%s ServiceID: %d\n", Prepend, Entry->ServiceID);
+ printf ("%s ServiceType: %04x\n", Prepend, Entry->ServiceType);
+ }
+ }
+ break;
+
+ case DESCR_LOCAL_TIME_OFF:
+ {
+ struct LocalTimeOffsetEntry *Offset;
+
+ printf ("%sDescriptor: Local Time Offset\n", Prepend);
+ xForeach (((struct LocalTimeOffsetDescriptor *)Descriptor)->LocalTimeOffsets, Offset)
+ {
+ printf ("%s Offset:\n");
+ printf ("%s CountryCode: %s\n", Offset->CountryCode);
+ printf ("%s RegionID: %c\n", Offset->RegionID);
+ printf ("%s CurrentOffset: %ld\n", Offset->CurrentOffset);
+ printf ("%s ChangeTime: %ld\n", Offset->ChangeTime);
+ printf ("%s NextOffset: %ld\n", Offset->NextOffset);
+ }
+ }
+ break;
+
case DESCR_STUFFING:
- case DESCR_SAT_DEL_SYS:
case DESCR_CABLE_DEL_SYS:
case DESCR_VBI_DATA:
case DESCR_VBI_TELETEXT:
case DESCR_MOSAIC:
case DESCR_TELEPHONE:
- case DESCR_LOCAL_TIME_OFF:
case DESCR_TERR_DEL_SYS:
case DESCR_ML_NW_NAME:
case DESCR_ML_BQ_NAME:
@@ -527,3 +605,39 @@ void siDebugDescriptors (char *Prepend, struct LIST *Descriptors)
return;
}
+void siDumpDescriptor (void * Descriptor)
+{
+ int Length, i;
+ unsigned char *ptr;
+
+ Length = GetDescriptorLength (Descriptor);
+ for (i = 0, ptr = (char*) Descriptor; i < Length; i++) {
+ if ((i % 8) == 0)
+ printf ("\n");
+ printf ("0x%02X ", (unsigned int) ptr[i]);
+ }
+ printf ( "\n");
+}
+
+void siDumpSection (void *Section)
+{
+ int Length, i;
+ unsigned char *ptr;
+ char str[9];
+
+ Length = GetSectionLength (Section) + 3;
+ for (i = 0, ptr = (unsigned char*) Section, memset (str, 0, 9); i < Length; i++) {
+ if ((i % 8) == 0)
+ {
+ printf (" %s\n", str);
+ memset (str, 0, 8);
+ }
+ printf ("0x%02X ", (unsigned int) ptr[i]);
+ if (ptr[i] < 0x20 || (ptr[i] > 'z' && ptr[i] < ((unsigned char )'À')) )
+ str[i % 8] = '.';
+ else
+ str[i % 8] = ptr[i];
+ }
+ printf (" %*s\n", (8 - ((abs(i - 1) % 8) ? (abs(i - 1) % 8) : 8)) * 5, str);
+}
+
diff --git a/libdtv/libsi/si_debug_services.h b/libdtv/libsi/si_debug_services.h
index cd4f196..404f3c7 100644
--- a/libdtv/libsi/si_debug_services.h
+++ b/libdtv/libsi/si_debug_services.h
@@ -4,8 +4,8 @@
/// ///
//////////////////////////////////////////////////////////////
-// $Revision: 1.1 $
-// $Date: 2001/06/25 12:29:47 $
+// $Revision: 1.2 $
+// $Date: 2003/02/04 18:45:35 $
// $Author: hakenes $
//
// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
@@ -197,7 +197,7 @@ static struct content_type ContentTypes[] = {
};
#define CONTENT_TYPE_NUMBER 79
-static char StreamTypes[][70] = {
+static char *StreamTypes[] = {
"ITU-T|ISO/IEC Reserved",
"ISO/IEC Video",
"13818-2 Video or 11172-2 constrained parameter video stream",
@@ -215,3 +215,31 @@ static char StreamTypes[][70] = {
"ITU-T Rec. H.222.0 | ISO 13818-1 Reserved",
"User private"
};
+
+static char *CaIdents[] = {
+ "Standardized systems",
+ "Canal Plus",
+ "CCETT",
+ "Deutsche Telecom",
+ "Eurodec",
+ "France Telecom",
+ "Irdeto",
+ "Jerrold/GI",
+ "Matra Communication",
+ "News Datacom",
+ "Nokia",
+ "Norwegian Telekom",
+ "NTL",
+ "Philips",
+ "Scientific Atlanta",
+ "Sony",
+ "Tandberg Television",
+ "Thomson",
+ "TV/Com",
+ "HPT - Croatian Post and Telecommunications",
+ "HRT - Croatian Radio and Television",
+ "IBM",
+ "Nera",
+ "BetaTechnik"
+};
+#define MAX_CA_IDENT 24
diff --git a/libdtv/libsi/si_parser.c b/libdtv/libsi/si_parser.c
index ccca6e5..e8cf8b2 100644
--- a/libdtv/libsi/si_parser.c
+++ b/libdtv/libsi/si_parser.c
@@ -4,11 +4,13 @@
/// ///
//////////////////////////////////////////////////////////////
-// $Revision: 1.6 $
-// $Date: 2002/01/30 17:04:13 $
+// $Revision: 1.8 $
+// $Date: 2003/02/04 18:45:35 $
// $Author: hakenes $
//
-// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
+// (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the
+// GNU GPL with contribution of Oleg Assovski,
+// www.satmania.com
//
// libsi is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -52,7 +54,7 @@ struct LIST *siParsePAT (u_char *Buffer)
Pat = (pat_t *) Buffer; Ptr = Buffer;
if (Pat->table_id != TID_PAT) {
-// fprintf (stderr, "PAT: wrong TID %d\n", Pat->table_id);
+ // fprintf (stderr, "PAT: wrong TID %d\n", Pat->table_id);
return NULL;
}
@@ -83,6 +85,43 @@ struct LIST *siParsePAT (u_char *Buffer)
}
+struct LIST *siParseCAT (u_char *Buffer)
+{
+ cat_t *Cat;
+ u_char *Ptr;
+ int SectionLength;
+ int TransportStreamID;
+ int CatVersion;
+ struct Descriptor *Descriptor;
+ struct LIST *DescriptorList = NULL;
+
+ if (!Buffer) return NULL;
+
+ Cat = (cat_t *) Buffer; Ptr = Buffer;
+
+ if (Cat->table_id != TID_CAT) {
+ // fprintf (stderr, "CAT: wrong TID %d\n", Cat->table_id);
+ return NULL;
+ }
+
+ SectionLength = HILO (Cat->section_length) + 3 - CAT_LEN - 4;
+
+ if (crc32 (Ptr, HILO (Cat->section_length) + 3)) return (NULL);
+
+ CatVersion = Cat->version_number;
+
+ Ptr += CAT_LEN;
+
+ if (SectionLength >= 0)
+ {
+ DescriptorList = xNewList (NULL);
+ siParseDescriptors (DescriptorList, Ptr, SectionLength, Cat->table_id);
+ }
+
+ return (DescriptorList);
+}
+
+
struct Pid *siParsePMT (u_char *Buffer)
{
pmt_t *Pmt;
@@ -101,7 +140,7 @@ struct Pid *siParsePMT (u_char *Buffer)
Pmt = (pmt_t *) Buffer; Ptr = Buffer;
if (Pmt->table_id != TID_PMT) {
-// fprintf (stderr, "PMT: wrong TID %d\n", Pmt->table_id);
+ // fprintf (stderr, "PMT: wrong TID %d\n", Pmt->table_id);
return NULL;
}
@@ -147,6 +186,89 @@ struct Pid *siParsePMT (u_char *Buffer)
}
+struct LIST *siParseNIT (u_char *Buffer)
+{
+ nit_t *Nit;
+ nit_mid_t *NitMid;
+ nit_ts_t *TSDesc;
+ u_char *Ptr;
+ int SectionLength, LoopLength, Loop2Length;
+ int TransportStreamID;
+ int NitVersion;
+ int NetworkID;
+ struct TransportStream *TransportStream;
+ struct LIST *TSList = NULL;
+ struct LIST *Networks;
+ struct NetworkInfo *Network;
+
+ if (!Buffer) return NULL;
+
+ Nit = (nit_t *) Buffer;
+ Ptr = Buffer;
+
+ if (Nit->table_id != TID_NIT_ACT && Nit->table_id != TID_NIT_OTH && Nit->table_id != TID_BAT) {
+ return NULL;
+ }
+
+ SectionLength = HILO (Nit->section_length) + 3 - NIT_LEN - 4;
+
+ if (crc32 (Ptr, HILO (Nit->section_length) + 3)) return (NULL);
+
+ NitVersion = Nit->version_number;
+ NetworkID = HILO (Nit->network_id);
+ if (NetworkID == 65535)
+ NetworkID = 0;
+ CreateNetworkInfo (Network, NetworkID);
+ Networks = xNewList (NULL);
+ xAddTail (Networks, Network);
+
+ Ptr += NIT_LEN;
+
+ LoopLength = HILO (Nit->network_descriptor_length);
+// fprintf (stderr, "table 0x%X, SectionLen = %d, LoopLen = %d\n",
+// Nit->table_id, SectionLength, LoopLength);
+ if (LoopLength > SectionLength - SDT_DESCR_LEN)
+ return (Networks);
+
+ if (LoopLength <= SectionLength) {
+ if (SectionLength >= 0) siParseDescriptors (Network->Descriptors, Ptr, LoopLength, Nit->table_id);
+ SectionLength -= LoopLength;
+ Ptr += LoopLength;
+ NitMid = (nit_mid_t *) Ptr;
+ LoopLength = HILO (NitMid->transport_stream_loop_length);
+// fprintf (stderr, "table 0x%X, TS LoopLen = %d\n",
+// Nit->table_id, LoopLength);
+ if ((SectionLength > 0) && (LoopLength <= SectionLength)) {
+ SectionLength -= SIZE_NIT_MID;
+ Ptr += SIZE_NIT_MID;
+ while (LoopLength > 0) {
+ TSDesc = (nit_ts_t *) Ptr;
+ CreateTransportStream (TransportStream, HILO(TSDesc->transport_stream_id), HILO(TSDesc->original_network_id));
+ if (TransportStream->TransportStreamID == 65535)
+ TransportStream->TransportStreamID = 0;
+ if (TransportStream->OriginalNetworkID == 65535)
+ TransportStream->OriginalNetworkID = 0;
+ Loop2Length = HILO (TSDesc->transport_descriptors_length);
+// fprintf (stderr, "table 0x%X, TSdesc LoopLen = %d\n",
+// Nit->table_id, Loop2Length);
+ Ptr += NIT_TS_LEN;
+ if (Loop2Length <= LoopLength) {
+ if (LoopLength >= 0) siParseDescriptors (TransportStream->Descriptors, Ptr, Loop2Length, Nit->table_id);
+ }
+ if (!Network->TransportStreams)
+ Network->TransportStreams = xNewList (NULL);
+ xAddTail (Network->TransportStreams, TransportStream);
+ LoopLength -= Loop2Length + NIT_TS_LEN;
+ SectionLength -= Loop2Length + NIT_TS_LEN;
+ Ptr += Loop2Length;
+ }
+ }
+ }
+
+ return (Networks);
+}
+
+
struct LIST *siParseSDT (u_char *Buffer)
{
sdt_t *Sdt;
@@ -164,7 +286,7 @@ struct LIST *siParseSDT (u_char *Buffer)
Sdt = (sdt_t *) Buffer; Ptr = Buffer;
if (Sdt->table_id != TID_SDT_ACT && Sdt->table_id != TID_SDT_OTH) {
-// fprintf (stderr, "SDT: wrong TID %d\n", Sdt->table_id);
+ // fprintf (stderr, "SDT: wrong TID %d\n", Sdt->table_id);
return NULL;
}
@@ -250,7 +372,7 @@ struct LIST *siParseEIT (u_char *Buffer)
Eit->table_id <= TID_EIT_ACT_SCH + 0x0F) &&
!(Eit->table_id >= TID_EIT_OTH_SCH &&
Eit->table_id <= TID_EIT_OTH_SCH + 0x0F)) {
-// fprintf (stderr, "EIT: wrong TID %d\n", Eit->table_id);
+ // fprintf (stderr, "EIT: wrong TID %d\n", Eit->table_id);
return NULL;
}
@@ -331,7 +453,7 @@ time_t siParseTDT (u_char *Buffer)
Tdt = (tdt_t *) Buffer; Ptr = Buffer;
if (Tdt->table_id != TID_TDT) {
-// fprintf (stderr, "TDT: wrong TID %d\n", Tdt->table_id);
+ // fprintf (stderr, "TDT: wrong TID %d\n", Tdt->table_id);
return 0;
}
@@ -344,6 +466,44 @@ time_t siParseTDT (u_char *Buffer)
}
+struct Tot *siParseTOT (u_char *Buffer)
+{
+ tot_t *Tot;
+ u_char *Ptr;
+ int SectionLength, LoopLength;
+ struct Tot *table;
+ time_t CurrentTime;
+
+ if (!Buffer) return NULL;
+
+ Tot = (tot_t *) Buffer;
+ Ptr = Buffer;
+
+ if (Tot->table_id != TID_TOT) {
+ return NULL;
+ }
+
+ if (crc32 (Ptr, HILO (Tot->section_length) + 3)) return (NULL);
+// SectionLength = HILO (Tot->section_length) + 3 - TOT_LEN - 4;
+
+ CurrentTime = MjdToEpochTime (Tot->utc_mjd) +
+ BcdTimeToSeconds (Tot->utc_time);
+ LoopLength = HILO (Tot->descriptors_loop_length);
+ if (!LoopLength)
+ return NULL;
+
+ CreateTot (table, CurrentTime);
+
+ Ptr += TOT_LEN;
+
+ siParseDescriptors (table->Descriptors, Ptr, LoopLength, Tot->table_id);
+
+ // fprintf (stderr, "TOT Bias: %d\n", table->Bias);
+ return (table);
+}
+
+static u_char TempTableID = 0;
+
void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
int Length, u_char TableID)
{
@@ -352,6 +512,7 @@ void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
DescriptorLength = 0;
Ptr = Buffer;
+ TempTableID = TableID;
while (DescriptorLength < Length)
{
@@ -362,15 +523,17 @@ void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
case TID_NIT_ACT: case TID_NIT_OTH:
switch (GetDescriptorTag(Ptr))
{
- case DESCR_NW_NAME:
- case DESCR_SERVICE_LIST:
- case DESCR_STUFFING:
case DESCR_SAT_DEL_SYS:
case DESCR_CABLE_DEL_SYS:
+ case DESCR_SERVICE_LIST:
+ case DESCR_PRIV_DATA_SPEC:
+// fprintf (stderr, "Got descriptor with tag = 0x%X\n", GetDescriptorTag(Ptr));
+// siDumpDescriptor (Ptr);
+ case DESCR_NW_NAME:
+ case DESCR_STUFFING:
case DESCR_LINKAGE:
case DESCR_TERR_DEL_SYS:
case DESCR_ML_NW_NAME:
- case DESCR_PRIV_DATA_SPEC:
case DESCR_CELL_LIST:
case DESCR_CELL_FREQ_LINK:
case DESCR_ANNOUNCEMENT_SUPPORT:
@@ -378,8 +541,7 @@ void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
break;
default:
- /* fprintf (stderr, "forbidden descriptor 0x%x in NIT\n",
- GetDescriptorTag(Ptr));*/
+ // fprintf (stderr, "forbidden descriptor 0x%x in NIT\n", GetDescriptorTag(Ptr));
break;
}
break;
@@ -396,12 +558,12 @@ void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
case DESCR_CA_IDENT:
case DESCR_ML_BQ_NAME:
case DESCR_PRIV_DATA_SPEC:
+ // fprintf (stderr, "Got descriptor with tag = 0x%X\n", GetDescriptorTag(Ptr));
siParseDescriptor (Descriptors, Ptr);
break;
default:
- /*fprintf (stderr, "forbidden descriptor 0x%x in BAT\n",
- GetDescriptorTag(Ptr));*/
+ // fprintf (stderr, "forbidden descriptor 0x%x in BAT\n", GetDescriptorTag(Ptr));
break;
}
break;
@@ -426,8 +588,7 @@ void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
break;
default:
- /* fprintf (stderr, "forbidden descriptor 0x%x in SDT\n",
- GetDescriptorTag(Ptr)); */
+ // fprintf (stderr, "forbidden descriptor 0x%x in SDT\n", GetDescriptorTag(Ptr));
break;
}
break;
@@ -470,8 +631,7 @@ void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
break;
default:
- /*fprintf (stderr, "forbidden descriptor 0x%x in EIT\n",
- GetDescriptorTag(Ptr));*/
+ // fprintf (stderr, "forbidden descriptor 0x%x in EIT\n", GetDescriptorTag(Ptr));
break;
}
break;
@@ -484,8 +644,7 @@ void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
break;
default:
- /*fprintf (stderr, "forbidden descriptor 0x%x in TOT\n",
- GetDescriptorTag(Ptr));*/
+ // fprintf (stderr, "forbidden descriptor 0x%x in TOT\n", GetDescriptorTag(Ptr));
break;
}
break;
@@ -522,15 +681,28 @@ void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
break;
default:
- /* fprintf (stderr, "forbidden descriptor 0x%x in PMT\n",
- GetDescriptorTag(Ptr)); */
+ // fprintf (stderr, "forbidden descriptor 0x%x in PMT\n", GetDescriptorTag(Ptr));
+ break;
+ }
+ break;
+
+ case TID_CAT:
+ switch (GetDescriptorTag(Ptr))
+ {
+ case DESCR_CA_SYSTEM:
+ case DESCR_CA:
+ case DESCR_CA_IDENT:
+ siParseDescriptor (Descriptors, Ptr);
+ break;
+
+ default:
+ // fprintf (stderr, "forbidden descriptor 0x%x in CAT\n", GetDescriptorTag(Ptr));
break;
}
break;
default:
- fprintf (stderr, "descriptor 0x%x in unsupported table 0x%x\n",
- GetDescriptorTag(Ptr), TableID);
+ // fprintf (stderr, "descriptor 0x%x in unsupported table 0x%x\n", GetDescriptorTag(Ptr), TableID);
break;
}
DescriptorLength += GetDescriptorLength (Ptr);
@@ -550,6 +722,7 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
if (!Descriptors || !Buffer) return;
Ptr = Buffer;
+// fprintf (stderr, "Got descriptor with tag = 0x%X\n", GetDescriptorTag(Buffer));
switch (GetDescriptorTag(Buffer))
{
@@ -558,10 +731,12 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
CastAncillaryDataDescriptor(Buffer)->ancillary_data_identifier);
break;
+ case DESCR_NW_NAME:
case DESCR_BOUQUET_NAME:
- Text = siGetDescriptorText (Buffer + DESCR_BOUQUET_NAME_LEN,
+ Text = siGetDescriptorName (Buffer + DESCR_BOUQUET_NAME_LEN,
GetDescriptorLength (Buffer) - DESCR_BOUQUET_NAME_LEN);
- CreateBouquetNameDescriptor (Descriptor, Text);
+// fprintf (stderr, "Got descriptor with tag = 0x%X, text = '%s'\n", GetDescriptorTag(Buffer), Text);
+ CreateBouquetNameDescriptor (Descriptor, Text, GetDescriptorTag(Buffer));
break;
case DESCR_COMPONENT:
@@ -577,9 +752,9 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
break;
case DESCR_SERVICE:
- Text = siGetDescriptorText (Buffer + DESCR_SERVICE_LEN,
+ Text = siGetDescriptorName (Buffer + DESCR_SERVICE_LEN,
CastServiceDescriptor(Buffer)->provider_name_length);
- Text2 = siGetDescriptorText (Buffer + DESCR_SERVICE_LEN +
+ Text2 = siGetDescriptorName (Buffer + DESCR_SERVICE_LEN +
CastServiceDescriptor(Buffer)->provider_name_length + 1,
*((u_char *)(Buffer + DESCR_SERVICE_LEN +
CastServiceDescriptor(Buffer)->provider_name_length)));
@@ -598,7 +773,7 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
break;
case DESCR_SHORT_EVENT:
- Text = siGetDescriptorText (Buffer + DESCR_SHORT_EVENT_LEN,
+ Text = siGetDescriptorName (Buffer + DESCR_SHORT_EVENT_LEN,
CastShortEventDescriptor(Buffer)->event_name_length);
Text2 = siGetDescriptorText (Buffer + DESCR_SHORT_EVENT_LEN +
CastShortEventDescriptor(Buffer)->event_name_length + 1,
@@ -623,6 +798,7 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
CastExtendedEventDescriptor(Buffer)->lang_code3, Text);
Length = CastExtendedEventDescriptor(Buffer)->length_of_items;
Ptr += DESCR_EXTENDED_EVENT_LEN;
+// printf ("EEDesc #%d, %s\n", CastExtendedEventDescriptor(Buffer)->descriptor_number, Text);
while ((Length > 0) && (Length < GetDescriptorLength (Buffer)))
{
Text = siGetDescriptorText (Ptr + ITEM_EXTENDED_EVENT_LEN,
@@ -631,6 +807,7 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
CastExtendedEventItem(Ptr)->item_description_length + 1,
*((u_char *)(Ptr + ITEM_EXTENDED_EVENT_LEN +
CastExtendedEventItem(Ptr)->item_description_length)));
+// printf ("EEItem #%d, %s, %s\n", CastExtendedEventDescriptor(Buffer)->descriptor_number, Text, Text2);
AddExtendedEventItem (Descriptor, Text2, Text);
Length -= ITEM_EXTENDED_EVENT_LEN + CastExtendedEventItem(Ptr)->item_description_length +
*((u_char *)(Ptr + ITEM_EXTENDED_EVENT_LEN +
@@ -642,15 +819,85 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
break;
case DESCR_CA_IDENT:
- CreateCaIdentifierDescriptor (Descriptor,
- (GetDescriptorLength(Buffer) - DESCR_CA_IDENTIFIER_LEN) / 2);
Length = GetDescriptorLength (Buffer) - DESCR_CA_IDENTIFIER_LEN;
+ CreateCaIdentifierDescriptor (Descriptor, Length / 2);
Ptr += DESCR_CA_IDENTIFIER_LEN; i = 0;
while (Length > 0)
- { SetCaIdentifierID(Descriptor, i, *((u_short *) Ptr));
+ { SetCaIdentifierID(Descriptor, i, ((*((u_char *) Ptr)<<8) + *((u_char *) (Ptr+1))));
Length -= 2; Ptr += 2; i++; }
break;
+ case DESCR_CA:
+ {
+ struct CaDescriptor *CD;
+
+ Length = GetDescriptorLength (Buffer) - DESCR_CA_LEN;
+ CreateCaDescriptor (Descriptor,
+ HILO(CastCaDescriptor(Buffer)->CA_type),
+ HILO(CastCaDescriptor(Buffer)->CA_PID), Length);
+ Ptr += DESCR_CA_LEN; i = 0;
+ while (Length > 0)
+ { SetCaData(Descriptor, i, *Ptr);
+ Length --; Ptr ++; i++; }
+
+ /*
+ * The following analyses are more or less directly copied from
+ * MultiDec 8.4b Sources. Thanx to Espresso for his great work !!
+ */
+ CD = (struct CaDescriptor *) Descriptor;
+
+ // fprintf (stderr, "TableID: %02x - CA - Type: 0x%04x, PID: %d\n", TempTableID, CD->CA_type, CD->CA_PID);
+
+ if ((CD->CA_type >> 8) == 0x01) /* SECA */
+ {
+ CD->ProviderID = (GetCaData (CD, 0) << 8) | GetCaData (CD, 1);
+ }
+ else if ((CD->CA_type >> 8) == 0x05) /* Viaccess ? (France Telecom) */
+ {
+ i=0;
+ while (i < CD->DataLength)
+ {
+ if ((GetCaData (CD, i) == 0x14) && (GetCaData (CD, i+1) == 0x03))
+ {
+ CD->ProviderID = (GetCaData (CD, i+2) << 16) |
+ (GetCaData (CD, i+3) << 8) |
+ (GetCaData (CD, i+4) & 0xf0);
+ i = CD->DataLength;
+ }
+ i++;
+ }
+ }
+ if (CD->CA_type==0x0100) /* SECA 1 */
+ {
+ /* bptr=MyPtr+19;
+
+ i=19;
+ while ( i+4 < ca_info->len ) {
+ if ( (*bptr&0xE0) == 0xE0 ) {
+ CA_ECM=(( *bptr&0x1f)<<8)+*(bptr+1);
+ Prov_Ident = ( *(bptr+2)<<8) | *(bptr+3);
+ j=0;
+ while ( j < ProgrammNeu[ProgrammNummer].CA_Anzahl ) {
+ if (( ProgrammNeu[ProgrammNummer].CA_System[j].CA_Typ == CA_Typ )
+ && ( ProgrammNeu[ProgrammNummer].CA_System[j].ECM == CA_ECM )) break;
+ j++;
+ };
+
+ if ( j < MAX_CA_SYSTEMS ) {
+ if ( j >= ProgrammNeu[ProgrammNummer].CA_Anzahl )
+ ProgrammNeu[ProgrammNummer].CA_Anzahl++;
+ ProgrammNeu[ProgrammNummer].CA_System[j].CA_Typ =CA_Typ;
+ ProgrammNeu[ProgrammNummer].CA_System[j].ECM =CA_ECM ;
+ ProgrammNeu[ProgrammNummer].CA_System[j].Provider_Id = Prov_Ident;
+ };
+ }
+ i+=0x0f;
+ bptr+=0x0f;
+ }; */
+ }
+ }
+ break;
+
case DESCR_CONTENT:
CreateContentDescriptor (Descriptor,
(GetDescriptorLength(Buffer) - DESCR_CONTENT_LEN) / 2);
@@ -705,12 +952,6 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
HILO (CastTimeShiftedEventDescriptor(Ptr)->reference_event_id));
break;
- case DESCR_CA:
- CreateConditionalAccessDescriptor (Descriptor,
- *(Ptr + 1) + 2, // we'll need the entire raw data!
- Ptr);
- break;
-
case DESCR_ISO_639_LANGUAGE:
CreateIso639LanguageDescriptor (Descriptor,
CastIso639LanguageDescriptor(Buffer)->lang_code1,
@@ -789,6 +1030,80 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
}
break;
+ case DESCR_SAT_DEL_SYS:
+// fprintf (stderr, "got descriptor 0x%x\n", GetDescriptorTag(Buffer));
+ {
+ descr_satellite_delivery_system_t *sds;
+ sds = (descr_satellite_delivery_system_t *) Ptr;
+ if (CheckBcdChar (sds->frequency1) && CheckBcdChar (sds->frequency2) &&
+ CheckBcdChar (sds->frequency3) && CheckBcdChar (sds->frequency4) &&
+ CheckBcdChar (sds->orbital_position1) &&
+ CheckBcdChar (sds->orbital_position2) &&
+ CheckBcdChar (sds->symbol_rate1) && CheckBcdChar (sds->symbol_rate1) &&
+ CheckBcdChar (sds->symbol_rate3) && (sds->fec_inner != 0) && (sds->modulation == 1))
+ {
+ CreateSatelliteDeliverySystemDescriptor (Descriptor,
+ BcdCharToInt (sds->frequency1) * 10 * 1000 * 1000 +
+ BcdCharToInt (sds->frequency2) * 100 * 1000 +
+ BcdCharToInt (sds->frequency3) * 1000 +
+ BcdCharToInt (sds->frequency4) * 10,
+ (sds->west_east_flag ? 1 : -1) *
+ (BcdCharToInt (sds->orbital_position1) * 100 +
+ BcdCharToInt (sds->orbital_position2)),
+ sds->polarization,
+ BcdCharToInt (sds->symbol_rate1) * 10 * 1000 +
+ BcdCharToInt (sds->symbol_rate2) * 100 +
+ BcdCharToInt (sds->symbol_rate3),
+ sds->fec_inner);
+ }
+ /* else
+ {
+ fprintf (stderr, "Illegal sds descriptor\n");
+ siDumpDescriptor (Buffer);
+ } */
+ }
+ break;
+
+ case DESCR_SERVICE_LIST:
+// fprintf (stderr, "got descriptor 0x%x\n", GetDescriptorTag(Buffer));
+ CreateServiceListDescriptor (Descriptor);
+ Length = GetDescriptorLength (Buffer) - DESCR_SERVICE_LIST_LEN;
+ Ptr += DESCR_SERVICE_LIST_LEN;
+ while (Length > 0)
+ {
+ AddServiceListEntry (Descriptor,
+ HILO (CastServiceListDescriptorLoop(Ptr)->service_id),
+ CastServiceListDescriptorLoop(Ptr)->service_type);
+ Length -= DESCR_SERVICE_LIST_LEN;
+ Ptr += DESCR_SERVICE_LIST_LEN;
+ }
+ break;
+
+ case DESCR_LOCAL_TIME_OFF:
+ CreateLocalTimeOffsetDescriptor (Descriptor);
+ Length = GetDescriptorLength (Buffer) - DESCR_LOCAL_TIME_OFFSET_LEN;
+ Ptr += DESCR_LOCAL_TIME_OFFSET_LEN;
+ while (Length > 0)
+ {
+ time_t ct, co, no;
+ ct = MjdToEpochTime (CastLocalTimeOffsetEntry(Ptr)->time_of_change_mjd) +
+ BcdTimeToSeconds (CastLocalTimeOffsetEntry(Ptr)->time_of_change_time);
+ co = (BcdCharToInt(CastLocalTimeOffsetEntry(Ptr)->local_time_offset_h) * 3600 +
+ BcdCharToInt(CastLocalTimeOffsetEntry(Ptr)->local_time_offset_m) * 60) *
+ ((CastLocalTimeOffsetEntry(Ptr)->local_time_offset_polarity) ? -1 : 1);
+ no = (BcdCharToInt(CastLocalTimeOffsetEntry(Ptr)->next_time_offset_h) * 3600 +
+ BcdCharToInt(CastLocalTimeOffsetEntry(Ptr)->next_time_offset_m) * 60) *
+ ((CastLocalTimeOffsetEntry(Ptr)->local_time_offset_polarity) ? -1 : 1);
+ AddLocalTimeOffsetEntry (Descriptor,
+ CastLocalTimeOffsetEntry(Ptr)->country_code1,
+ CastLocalTimeOffsetEntry(Ptr)->country_code2,
+ CastLocalTimeOffsetEntry(Ptr)->country_code3,
+ CastLocalTimeOffsetEntry(Ptr)->country_region_id, co, ct, no);
+ Length -= LOCAL_TIME_OFFSET_ENTRY_LEN;
+ Ptr += LOCAL_TIME_OFFSET_ENTRY_LEN;
+ }
+ break;
+
case DESCR_VIDEO_STREAM:
case DESCR_AUDIO_STREAM:
case DESCR_HIERARCHY:
@@ -804,15 +1119,11 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
case DESCR_SMOOTHING_BUFFER:
case DESCR_STD:
case DESCR_IBP:
- case DESCR_NW_NAME:
- case DESCR_SERVICE_LIST:
- case DESCR_SAT_DEL_SYS:
case DESCR_CABLE_DEL_SYS:
case DESCR_VBI_DATA:
case DESCR_VBI_TELETEXT:
case DESCR_MOSAIC:
case DESCR_TELEPHONE:
- case DESCR_LOCAL_TIME_OFF:
case DESCR_TERR_DEL_SYS:
case DESCR_ML_NW_NAME:
case DESCR_ML_BQ_NAME:
@@ -833,6 +1144,8 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
case DESCR_CELL_FREQ_LINK:
case DESCR_ANNOUNCEMENT_SUPPORT:
default:
+// fprintf (stderr, "Unsupported descriptor with tag = 0x%02X\n", GetDescriptorTag(Ptr));
+// siDumpDescriptor (Buffer);
/* fprintf (stderr, "unsupported descriptor 0x%x\n",
GetDescriptorTag(Buffer)); */
break;
@@ -845,14 +1158,19 @@ void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
/*
* ToDo: ETSI conformal text definition
*/
-char *siGetDescriptorText (u_char *Buffer, int Length)
+#define GDT_TEXT_DESCRIPTOR 0
+#define GDT_NAME_DESCRIPTOR 1
+char *siGetDescriptorTextHandler (u_char *, int , int );
+
+char *siGetDescriptorTextHandler (u_char *Buffer, int Length, int type)
{
char *tmp, *result;
int i;
if ((Length < 0) || (Length > 4095))
return (xSetText ("text error"));
- if (*Buffer == 0x05 || (*Buffer >= 0x20 && *Buffer <= 0xff))
+/* ASSENIZATION: removing coding detection - suppose they are all ANSI */
+ // if (*Buffer == 0x05 || (*Buffer >= 0x20 && *Buffer <= 0xff))
{
xMemAlloc (Length+1, &result);
tmp = result;
@@ -860,15 +1178,16 @@ char *siGetDescriptorText (u_char *Buffer, int Length)
{
if (*Buffer == 0) break;
- if ((*Buffer >= ' ' && *Buffer <= '~') ||
+ if ((*Buffer >= ' ' && *Buffer <= '~') || (*Buffer == '\n') ||
(*Buffer >= 0xa0 && *Buffer <= 0xff)) *tmp++ = *Buffer;
- if (*Buffer == 0x8A || *Buffer == '\n') *tmp++ = '\n';
+ if (*Buffer == 0x8A) *tmp++ = '\n';
if (*Buffer == 0x86 || *Buffer == 0x87) *tmp++ = ' ';
+ if ((*Buffer == 0x86 || *Buffer == 0x87) && !(GDT_NAME_DESCRIPTOR & type)) *tmp++ = ' ';
Buffer++;
}
*tmp = '\0';
}
- else
+ /* else
{
switch (*Buffer)
{
@@ -881,11 +1200,22 @@ char *siGetDescriptorText (u_char *Buffer, int Length)
case 0x12: result = xSetText ("Coding according to KSC 5601"); break;
default: result = xSetText ("Unknown coding"); break;
}
- }
+ } */
return (result);
}
+char *siGetDescriptorText (u_char *Buffer, int Length)
+{
+ return siGetDescriptorTextHandler (Buffer, Length, GDT_TEXT_DESCRIPTOR);
+}
+
+char *siGetDescriptorName (u_char *Buffer, int Length)
+{
+ return siGetDescriptorTextHandler (Buffer, Length, GDT_NAME_DESCRIPTOR);
+}
+
+
// CRC32 lookup table for polynomial 0x04c11db7
static u_long crc_table[256] = {
diff --git a/lirc.c b/lirc.c
index f120743..b7f5b93 100644
--- a/lirc.c
+++ b/lirc.c
@@ -6,7 +6,7 @@
*
* LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16.
*
- * $Id: lirc.c 1.1 2002/09/29 13:16:33 kls Exp $
+ * $Id: lirc.c 1.4 2003/04/12 14:37:17 kls Exp $
*/
#include "lirc.h"
@@ -41,6 +41,11 @@ cLircRemote::~cLircRemote()
Cancel();
}
+bool cLircRemote::Ready(void)
+{
+ return f >= 0;
+}
+
void cLircRemote::Action(void)
{
dsyslog("LIRC remote control thread started (pid=%d)", getpid());
@@ -50,34 +55,49 @@ void cLircRemote::Action(void)
char buf[LIRC_BUFFER_SIZE];
char LastKeyName[LIRC_KEY_BUF] = "";
bool repeat = false;
+ int timeout = -1;
for (; f >= 0;) {
LOCK_THREAD;
- if (cFile::FileReady(f, REPEATLIMIT) && safe_read(f, buf, sizeof(buf)) > 21) {
+ bool ready = cFile::FileReady(f, timeout);
+ int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1;
+
+ if (ready) {
+ if (ret <= 21) {
+ esyslog("ERROR: lircd connection lost");
+ close(f);
+ f = -1;
+ break;
+ }
int count;
char KeyName[LIRC_KEY_BUF];
sscanf(buf, "%*x %x %29s", &count, KeyName); // '29' in '%29s' is LIRC_KEY_BUF-1!
int Now = time_ms();
if (count == 0) {
+ if (repeat)
+ Put(LastKeyName, false, true);
strcpy(LastKeyName, KeyName);
repeat = false;
FirstTime = Now;
+ timeout = -1;
}
else {
if (Now - FirstTime < REPEATDELAY)
continue; // repeat function kicks in after a short delay
repeat = true;
+ timeout = REPEATDELAY;
}
LastTime = Now;
Put(KeyName, repeat);
}
else if (repeat) { // the last one was a repeat, so let's generate a release
- if (time_ms() - LastTime > REPEATDELAY) {
+ if (time_ms() - LastTime >= REPEATDELAY) {
Put(LastKeyName, false, true);
repeat = false;
*LastKeyName = 0;
+ timeout = -1;
}
}
}
diff --git a/lirc.h b/lirc.h
index ff58f31..cd3c780 100644
--- a/lirc.h
+++ b/lirc.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: lirc.h 1.1 2002/09/28 14:11:04 kls Exp $
+ * $Id: lirc.h 1.2 2003/04/12 14:15:20 kls Exp $
*/
#ifndef __LIRC_H
@@ -21,6 +21,7 @@ private:
public:
cLircRemote(char *DeviceName);
virtual ~cLircRemote();
+ virtual bool Ready(void);
};
#endif //__LIRC_H
diff --git a/menu.c b/menu.c
index 1a34e42..e63d707 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.234 2003/02/09 12:55:38 kls Exp $
+ * $Id: menu.c 1.235 2003/04/12 09:40:48 kls Exp $
*/
#include "menu.h"
@@ -2208,6 +2208,7 @@ cMenuSetupReplay::cMenuSetupReplay(void)
SetSection(tr("Replay"));
Add(new cMenuEditBoolItem(tr("Setup.Replay$Multi speed mode"), &data.MultiSpeedMode));
Add(new cMenuEditBoolItem(tr("Setup.Replay$Show replay mode"), &data.ShowReplayMode));
+ Add(new cMenuEditIntItem(tr("Setup.Replay$Resume ID"), &data.ResumeID, 0, 99));
}
// --- cMenuSetupMisc --------------------------------------------------------
diff --git a/menuitems.c b/menuitems.c
index 56b9199..d680ff9 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.12 2003/01/18 13:34:40 kls Exp $
+ * $Id: menuitems.c 1.13 2003/04/12 09:21:33 kls Exp $
*/
#include "menuitems.h"
@@ -62,27 +62,30 @@ eOSState cMenuEditIntItem::ProcessKey(eKeys Key)
eOSState state = cMenuEditItem::ProcessKey(Key);
if (state == osUnknown) {
- int newValue;
- if (k0 <= Key && Key <= k9) {
- if (fresh) {
- *value = 0;
- fresh = false;
- }
- newValue = *value * 10 + (Key - k0);
- }
- else if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly?
- newValue = *value - 1;
- fresh = true;
- }
- else if (NORMALKEY(Key) == kRight) {
- newValue = *value + 1;
- fresh = true;
- }
- else {
- if (*value < min) { *value = min; Set(); }
- if (*value > max) { *value = max; Set(); }
- return state;
- }
+ int newValue = *value;
+ Key = NORMALKEY(Key);
+ switch (Key) {
+ case kNone: break;
+ case k0 ... k9:
+ if (fresh) {
+ *value = 0;
+ fresh = false;
+ }
+ newValue = *value * 10 + (Key - k0);
+ break;
+ case kLeft: // TODO might want to increase the delta if repeated quickly?
+ newValue = *value - 1;
+ fresh = true;
+ break;
+ case kRight:
+ newValue = *value + 1;
+ fresh = true;
+ break;
+ default:
+ if (*value < min) { *value = min; Set(); }
+ if (*value > max) { *value = max; Set(); }
+ return state;
+ }
if ((!fresh || min <= newValue) && newValue <= max) {
*value = newValue;
Set();
diff --git a/osd.c b/osd.c
index 7622955..d048f5c 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.39 2002/12/08 13:17:13 kls Exp $
+ * $Id: osd.c 1.40 2003/03/23 15:41:54 kls Exp $
*/
#include "osd.h"
@@ -535,8 +535,6 @@ void cOsdMenu::CursorDown(void)
void cOsdMenu::PageUp(void)
{
- if (Count() <= MAXOSDITEMS)
- return;
current -= MAXOSDITEMS;
first -= MAXOSDITEMS;
if (first < 0)
@@ -551,13 +549,11 @@ void cOsdMenu::PageUp(void)
void cOsdMenu::PageDown(void)
{
- if (Count() <= MAXOSDITEMS)
- return;
current += MAXOSDITEMS;
first += MAXOSDITEMS;
if (current > Count() - 1) {
current = Count() - 1;
- first = Count() - MAXOSDITEMS;
+ first = max(0, Count() - MAXOSDITEMS);
}
if (SpecialItem(current)) {
current += (current < Count() - 1) ? 1 : -1;
diff --git a/osdbase.c b/osdbase.c
index e16b27b..8093b96 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.7 2002/08/25 10:02:36 kls Exp $
+ * $Id: osdbase.c 1.8 2003/03/23 15:53:29 kls Exp $
*/
#include "osdbase.h"
@@ -355,7 +355,7 @@ tWindowHandle cOsdBase::Create(int x, int y, int w, int h, int Bpp, bool ClearWi
if (x >= 0 && y >= 0 && w > 0 && h > 0 && (Bpp == 1 || Bpp == 2 || Bpp == 4 || Bpp == 8)) {
if ((w & 0x03) != 0) {
w += 4 - (w & 0x03);
- esyslog("ERROR: OSD window width must be a multiple of 4 - increasing to %d", w);
+ dsyslog("OSD window width must be a multiple of 4 - increasing to %d", w);
}
cWindow *win = new cWindow(numWindows, x, y, w, h, Bpp, ClearWithBackground, Tiled);
if (OpenWindow(win)) {
@@ -474,7 +474,7 @@ void cOsdBase::Relocate(tWindowHandle Window, int x, int y, int NewWidth, int Ne
if (NewWidth > 0 && NewHeight > 0) {
if ((NewWidth & 0x03) != 0) {
NewWidth += 4 - (NewWidth & 0x03);
- esyslog("ERROR: OSD window width must be a multiple of 4 - increasing to %d", NewWidth);
+ dsyslog("OSD window width must be a multiple of 4 - increasing to %d", NewWidth);
}
CloseWindow(w);
cWindow *NewWindow = new cWindow(w->Handle(), x, y, NewWidth, NewHeight, w->Bpp(), w->ClearWithBackground(), w->Tiled());
diff --git a/rcu.c b/rcu.c
index 4157c0d..5c76a35 100644
--- a/rcu.c
+++ b/rcu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: rcu.c 1.3 2002/12/07 12:22:40 kls Exp $
+ * $Id: rcu.c 1.4 2003/04/12 14:37:13 kls Exp $
*/
#include "rcu.h"
@@ -55,6 +55,11 @@ cRcuRemote::~cRcuRemote()
Cancel();
}
+bool cRcuRemote::Ready(void)
+{
+ return f >= 0;
+}
+
bool cRcuRemote::Initialize(void)
{
if (f >= 0) {
diff --git a/rcu.h b/rcu.h
index d314275..534ca3d 100644
--- a/rcu.h
+++ b/rcu.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: rcu.h 1.2 2002/12/07 12:21:25 kls Exp $
+ * $Id: rcu.h 1.3 2003/04/12 14:36:09 kls Exp $
*/
#ifndef __RCU_H
@@ -39,6 +39,7 @@ private:
public:
cRcuRemote(char *DeviceName);
virtual ~cRcuRemote();
+ virtual bool Ready(void);
virtual bool Initialize(void);
};
diff --git a/recording.c b/recording.c
index e14bb43..261bee8 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.72 2003/01/06 15:36:12 kls Exp $
+ * $Id: recording.c 1.75 2003/04/12 09:51:44 kls Exp $
*/
#include "recording.h"
@@ -42,7 +42,7 @@
#define NAMEFORMAT "%s/%s/" nameFORMAT
// end of implementation for brain dead systems
-#define RESUMEFILESUFFIX "/resume.vdr"
+#define RESUMEFILESUFFIX "/resume%s%s.vdr"
#define SUMMARYFILESUFFIX "/summary.vdr"
#define MARKSFILESUFFIX "/marks.vdr"
@@ -154,7 +154,7 @@ cResumeFile::cResumeFile(const char *FileName)
fileName = MALLOC(char, strlen(FileName) + strlen(RESUMEFILESUFFIX) + 1);
if (fileName) {
strcpy(fileName, FileName);
- strcat(fileName, RESUMEFILESUFFIX);
+ sprintf(fileName + strlen(fileName), RESUMEFILESUFFIX, Setup.ResumeID ? "." : "", Setup.ResumeID ? itoa(Setup.ResumeID) : "");
}
else
esyslog("ERROR: can't allocate memory for resume file name");
@@ -768,7 +768,7 @@ void cRecordingUserCommand::InvokeCommand(const char *State, const char *Recordi
#define MAXINDEXCATCHUP 2 // seconds
// The minimum age of an index file for considering it no longer to be written:
-#define MININDEXAGE 60 // seconds
+#define MININDEXAGE 300 // seconds
cIndexFile::cIndexFile(const char *FileName, bool Record)
:resumeFile(FileName)
@@ -848,6 +848,7 @@ cIndexFile::~cIndexFile()
bool cIndexFile::CatchUp(int Index)
{
+ // returns true unless something really goes wrong, so that 'index' becomes NULL
if (index && f >= 0) {
for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) {
struct stat buf;
@@ -856,7 +857,7 @@ bool cIndexFile::CatchUp(int Index)
// apparently the index file is not being written any more
close(f);
f = -1;
- return false;
+ break;
}
int newLast = buf.st_size / sizeof(tIndex) - 1;
if (newLast > last) {
@@ -889,13 +890,12 @@ bool cIndexFile::CatchUp(int Index)
}
else
LOG_ERROR_STR(fileName);
- if (Index >= last)
- sleep(1);
- else
- return true;
+ if (Index < last)
+ break;
+ sleep(1);
}
}
- return false;
+ return index != NULL;
}
bool cIndexFile::Write(uchar PictureType, uchar FileNumber, int FileOffset)
@@ -915,8 +915,7 @@ bool cIndexFile::Write(uchar PictureType, uchar FileNumber, int FileOffset)
bool cIndexFile::Get(int Index, uchar *FileNumber, int *FileOffset, uchar *PictureType, int *Length)
{
- if (index) {
- CatchUp(Index);
+ if (CatchUp(Index)) {
if (Index >= 0 && Index < last) {
*FileNumber = index[Index].number;
*FileOffset = index[Index].offset;
@@ -938,8 +937,7 @@ bool cIndexFile::Get(int Index, uchar *FileNumber, int *FileOffset, uchar *Pictu
int cIndexFile::GetNextIFrame(int Index, bool Forward, uchar *FileNumber, int *FileOffset, int *Length, bool StayOffEnd)
{
- if (index) {
- CatchUp();
+ if (CatchUp()) {
int d = Forward ? 1 : -1;
for (;;) {
Index += d;
@@ -976,8 +974,7 @@ int cIndexFile::GetNextIFrame(int Index, bool Forward, uchar *FileNumber, int *F
int cIndexFile::Get(uchar FileNumber, int FileOffset)
{
- if (index) {
- CatchUp();
+ if (CatchUp()) {
//TODO implement binary search!
int i;
for (i = 0; i < last; i++) {
diff --git a/remote.h b/remote.h
index 7908b1d..f26be16 100644
--- a/remote.h
+++ b/remote.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remote.h 1.24 2002/12/15 15:49:06 kls Exp $
+ * $Id: remote.h 1.25 2003/04/12 14:14:49 kls Exp $
*/
#ifndef __REMOTE_H
@@ -37,6 +37,7 @@ protected:
bool Put(const char *Code, bool Repeat = false, bool Release = false);
public:
virtual ~cRemote();
+ virtual bool Ready(void) { return true; }
virtual bool Initialize(void) { return true; }
const char *Name(void) { return name; }
static void SetLearning(cRemote *Learning) { learning = Learning; }
diff --git a/tools.c b/tools.c
index ff462ba..21ec526 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.76 2002/11/24 20:17:31 kls Exp $
+ * $Id: tools.c 1.77 2003/04/06 15:31:45 kls Exp $
*/
#include "tools.h"
@@ -620,11 +620,13 @@ bool cFile::FileReady(int FileDes, int TimeoutMs)
struct timeval timeout;
FD_ZERO(&set);
FD_SET(FileDes, &set);
- if (TimeoutMs < 100)
- TimeoutMs = 100;
- timeout.tv_sec = TimeoutMs / 1000;
- timeout.tv_usec = (TimeoutMs % 1000) * 1000;
- return select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0 && FD_ISSET(FileDes, &set);
+ if (TimeoutMs >= 0) {
+ if (TimeoutMs < 100)
+ TimeoutMs = 100;
+ timeout.tv_sec = TimeoutMs / 1000;
+ timeout.tv_usec = (TimeoutMs % 1000) * 1000;
+ }
+ return select(FD_SETSIZE, &set, NULL, NULL, (TimeoutMs >= 0) ? &timeout : NULL) > 0 && FD_ISSET(FileDes, &set);
}
bool cFile::FileReadyForWriting(int FileDes, int TimeoutMs)
diff --git a/transfer.c b/transfer.c
index 4e8c303..9354e58 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.10 2003/02/15 14:12:41 kls Exp $
+ * $Id: transfer.c 1.11 2003/03/30 12:52:11 kls Exp $
*/
#include "transfer.h"
@@ -133,11 +133,8 @@ void cTransfer::StripAudioPackets(uchar *b, int Length, uchar Except)
case 0xC0 ... 0xC1: // audio
if (c == 0xC1)
canToggleAudioTrack = true;
- if (!Except || c != Except) {
- int n = l;
- for (int j = i; j < Length && n--; j++)
- b[j] = 0x00;
- }
+ if (!Except || c != Except)
+ memset(&b[i], 0x00, min(l, Length-i));
break;
case 0xE0 ... 0xEF: // video
break;
diff --git a/vdr.c b/vdr.c
index 50b1a29..3f0a7f0 100644
--- a/vdr.c
+++ b/vdr.c
@@ -22,7 +22,7 @@
*
* The project's page is at http://www.cadsoft.de/people/kls/vdr
*
- * $Id: vdr.c 1.146 2003/03/09 14:07:46 kls Exp $
+ * $Id: vdr.c 1.149 2003/04/12 13:57:45 kls Exp $
*/
#include <getopt.h>
@@ -354,8 +354,6 @@ int main(int argc, char *argv[])
cDvbDevice::Initialize();
- cSIProcessor::Read();
-
// Start plugins:
if (!PluginManager.StartPlugins())
@@ -364,21 +362,32 @@ int main(int argc, char *argv[])
// Primary device:
cDevice::SetPrimaryDevice(Setup.PrimaryDVB);
- if (!cDevice::PrimaryDevice()) {
+ if (!cDevice::PrimaryDevice() || !cDevice::PrimaryDevice()->HasDecoder()) {
+ if (cDevice::PrimaryDevice() && !cDevice::PrimaryDevice()->HasDecoder())
+ isyslog("device %d has no MPEG decoder", cDevice::PrimaryDevice()->DeviceNumber() + 1);
for (int i = 0; i < cDevice::NumDevices(); i++) {
cDevice *d = cDevice::GetDevice(i);
if (d && d->HasDecoder()) {
isyslog("trying device number %d instead", i + 1);
- if (cDevice::SetPrimaryDevice(i + 1))
+ if (cDevice::SetPrimaryDevice(i + 1)) {
Setup.PrimaryDVB = i + 1;
+ break;
+ }
}
}
- }
- if (!cDevice::PrimaryDevice()) {
- const char *msg = "no primary device found - giving up!";
- fprintf(stderr, "vdr: %s\n", msg);
- esyslog("ERROR: %s", msg);
- return 2;
+ if (!cDevice::PrimaryDevice()) {
+ const char *msg = "no primary device found - using first device!";
+ fprintf(stderr, "vdr: %s\n", msg);
+ esyslog("ERROR: %s", msg);
+ if (!cDevice::SetPrimaryDevice(0))
+ return 2;
+ if (!cDevice::PrimaryDevice()) {
+ const char *msg = "no primary device found - giving up!";
+ fprintf(stderr, "vdr: %s\n", msg);
+ esyslog("ERROR: %s", msg);
+ return 2;
+ }
+ }
}
// OSD:
@@ -416,6 +425,8 @@ int main(int argc, char *argv[])
cEITScanner EITScanner;
+ cSIProcessor::Read();
+
// Signal handlers:
if (signal(SIGHUP, SignalHandler) == SIG_IGN) signal(SIGHUP, SIG_IGN);
@@ -530,14 +541,17 @@ int main(int argc, char *argv[])
case kVolDn:
case kMute:
if (key == kMute) {
- if (!cDevice::PrimaryDevice()->ToggleMute() && !Menu)
+ if (!cDevice::PrimaryDevice()->ToggleMute() && !Menu) {
+ key = kNone; // nobody else needs to see these keys
break; // no need to display "mute off"
+ }
}
else
cDevice::PrimaryDevice()->SetVolume(NORMALKEY(key) == kVolDn ? -VOLUMEDELTA : VOLUMEDELTA);
if (!Interface->IsOpen())
Menu = Temp = cDisplayVolume::Create();
cDisplayVolume::Process(key);
+ key = kNone; // nobody else needs to see these keys
break;
// Power off:
case kPower: isyslog("Power button pressed");