diff options
author | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2003-05-18 18:00:00 +0200 |
---|---|---|
committer | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2003-05-18 18:00:00 +0200 |
commit | 3bd9a7ccf355e445685ff115464a4e684a8c4211 (patch) | |
tree | 8b0a44d0c40e939967c73ec6ebe18776b51c9dcb | |
parent | c84022554aaacc9b1c3d9627501cdbb8276871f6 (diff) | |
download | vdr-patch-lnbsharing-3bd9a7ccf355e445685ff115464a4e684a8c4211.tar.gz vdr-patch-lnbsharing-3bd9a7ccf355e445685ff115464a4e684a8c4211.tar.bz2 |
Version 1.1.32vdr-1.1.32
- Removed a faulty parameter initialization in menu.c (thanks to Lauri Tischler for
reporting this one).
- Re-implemented the WaitForPut/WaitForGet stuff in cRingBuffer, since some plugins
actually need this. By default the buffer does not wait; if a plugin needs the
waiting functionality it can call the new SetTimeouts() function.
- Moved the call to cPlugin::Start() further up in vdr.c, to make sure it gets
called before trying to learn the keys (problem reported by Oliver Endriss).
- No longer starting the editing process if no marks have been set (thanks to
Matthias Raus for reporting this one).
- Added Catalanian language texts (thanks to Marc Rovira Vall and Ramon Roca).
Plugin authors may want to add the new entries to their I18N texts and contact
the translators to have their texts translated. Note that there are now 16
different OSD languages, so please make sure you have 16 versions for each of
your texts.
- Moved the detection of a broken video data stream from the cDevice into the
cRecorder to avoid problems with cReceivers that want to receive from PIDs
that are currently not transmitting (thanks to Marcel Wiesweg for reporting
this one).
- Fixed setting the locking pid after a timed wait (thanks to Andreas Schultz).
- Avoiding spurious section filter settings after a channel switch.
- Updated 'channels.conf.cable' (thanks to Stefan Hußfeldt).
- Fixed reading 'epg.data' for channels with non-zero RID (thanks to Oliver
Endriss for reporting this one).
- Fixed EPG bugfix statistics to avoid log entires for undefined channels (thanks
to Lars Bläser for reporting this one).
- No longer waiting inside cIndexFile::CatchUp() to avoid shortly blocking replay
at the end of a recording.
-rw-r--r-- | CONTRIBUTORS | 17 | ||||
-rw-r--r-- | HISTORY | 32 | ||||
-rw-r--r-- | PLUGINS.html | 38 | ||||
-rw-r--r-- | channels.conf | 4 | ||||
-rw-r--r-- | channels.conf.cable | 11 | ||||
-rw-r--r-- | config.h | 6 | ||||
-rw-r--r-- | device.c | 15 | ||||
-rw-r--r-- | eit.c | 43 | ||||
-rw-r--r-- | eit.h | 3 | ||||
-rw-r--r-- | i18n.c | 340 | ||||
-rw-r--r-- | i18n.h | 4 | ||||
-rw-r--r-- | menu.c | 8 | ||||
-rw-r--r-- | recorder.c | 13 | ||||
-rw-r--r-- | recording.c | 90 | ||||
-rw-r--r-- | ringbuffer.c | 51 | ||||
-rw-r--r-- | ringbuffer.h | 11 | ||||
-rw-r--r-- | thread.c | 3 | ||||
-rw-r--r-- | transfer.c | 4 | ||||
-rw-r--r-- | vdr.c | 12 |
19 files changed, 521 insertions, 184 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 42b074d..d31a118 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -204,6 +204,7 @@ Andreas Schultz <aschultz@warp10.net> for suggesting to separate the startup of a plugin into an "early" and a "late" phase for changing C++ style comments in libdtv into C style to avoid warnings in gcc 3.x for implementing the TerrestrialDeliverySystemDescriptor in libdtv + for fixing setting the locking pid after a timed wait Aaron Holtzman for writing 'ac3dec' @@ -467,6 +468,9 @@ Oliver Endriss <o.endriss@gmx.de> the Main menu for reporting a bug in setting the PCR-PID in case it is equal to one of the other PIDs + for reporting a problem with cPlugin::Start() being called after trying to learn + the remote control keys + for reporting a bug in reading 'epg.data' for channels with non-zero RID Reinhard Walter Buchner <rw.buchner@freenet.de> for adding some satellites to 'sources.conf' @@ -475,6 +479,7 @@ Reinhard Walter Buchner <rw.buchner@freenet.de> Lauri Tischler <lauri.tischler@efore.fi> for helping to test and debug the new channel source and DiSEqC handling + for reporting a faulty parameter initialization in menu.c Andy Carter <fruit@ukgateway.net> for helping to test new DVB-T handling @@ -572,6 +577,8 @@ Jan Ekholm <chakie@infa.abo.fi> Marcel Wiesweg <marcel.wiesweg@gmx.de> for pointing out a problem with high CPU load during replay for reporting broken support for raw OSDs of plugins + for reporting a problem with cReceivers that want to receive from PIDs that are + currently not transmitting Torsten Herz <torsten.herz@web.de> for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu @@ -652,3 +659,13 @@ Juri Haberland <juri@koschikode.com> Alfred Zastrow <vdr@zastrow4u.de> for suggesting to implement separate PausePriority and PauseLifetime parameters for the recordings created when pausing live video + +Matthias Raus <matthias-raus@web.de> + for reporting a problem with starting the editing process if no marks have been set + +Marc Rovira Vall <tm05462@salleURL.edu> and Ramon Roca <ramon.roca@xcombo.com> + for translating OSD texts to the Catalanian language + +Lars Bläser <LBlaeser@hofheim.de> + for reporting a bug in EPG bugfix statistics which made log entires for undefined + channels @@ -2116,7 +2116,7 @@ Video Disk Recorder Revision History (suggested by Andreas Schultz). Plugin authors should please read the section about "Getting started" in PLUGINS.html and adapt their code if applicable. - Implemented the CableDeliverySystemDescriptor and TerrestrialDeliverySystemDescriptor - in libdtv (thanks to Sven Grothklags and Andreas Schultz) + in libdtv (thanks to Sven Grothklags and Andreas Schultz). - Fixed keeping live video active in case the primary device doesn't have an MPEG decoder (thanks to Wolfgang Goeller for reporting this one). - Implemented cDevice::ActualDevice(), which returns the actual receiving device in @@ -2142,3 +2142,33 @@ Video Disk Recorder Revision History created when pausing live video (suggested by Alfred Zastrow). - Changed C++ style comments in libdtv into C style to avoid warnings in gcc 3.x (thanks to Andreas Schultz). + +2003-05-18: Version 1.1.32 + +- Removed a faulty parameter initialization in menu.c (thanks to Lauri Tischler for + reporting this one). +- Re-implemented the WaitForPut/WaitForGet stuff in cRingBuffer, since some plugins + actually need this. By default the buffer does not wait; if a plugin needs the + waiting functionality it can call the new SetTimeouts() function. +- Moved the call to cPlugin::Start() further up in vdr.c, to make sure it gets + called before trying to learn the keys (problem reported by Oliver Endriss). +- No longer starting the editing process if no marks have been set (thanks to + Matthias Raus for reporting this one). +- Added Catalanian language texts (thanks to Marc Rovira Vall and Ramon Roca). + Plugin authors may want to add the new entries to their I18N texts and contact + the translators to have their texts translated. Note that there are now 16 + different OSD languages, so please make sure you have 16 versions for each of + your texts. +- Moved the detection of a broken video data stream from the cDevice into the + cRecorder to avoid problems with cReceivers that want to receive from PIDs + that are currently not transmitting (thanks to Marcel Wiesweg for reporting + this one). +- Fixed setting the locking pid after a timed wait (thanks to Andreas Schultz). +- Avoiding spurious section filter settings after a channel switch. +- Updated 'channels.conf.cable' (thanks to Stefan Hußfeldt). +- Fixed reading 'epg.data' for channels with non-zero RID (thanks to Oliver + Endriss for reporting this one). +- Fixed EPG bugfix statistics to avoid log entires for undefined channels (thanks + to Lars Bläser for reporting this one). +- No longer waiting inside cIndexFile::CatchUp() to avoid shortly blocking replay + at the end of a recording. diff --git a/PLUGINS.html b/PLUGINS.html index bd1a0d0..b632b61 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.15--><table width=100%><tr><td bgcolor=#0000AA> </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=#00AA00> </td><td width=100%> +<!--X1.1.17--><table width=100%><tr><td bgcolor=#0000AA> </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=#AA0000> </td><td width=100%> +<!--X1.1.27--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%> Important modifications introduced in version 1.1.27 are marked like this. <!--X1.1.27--></td></tr></table> -<!--X1.1.31--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<!--X1.1.31--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%> Important modifications introduced in version 1.1.31 are marked like this. <!--X1.1.31--></td></tr></table> +<!--X1.1.32--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +Important modifications introduced in version 1.1.32 are marked like this. +<!--X1.1.32--></td></tr></table> <hr> <h1>Table Of Contents</h1> @@ -284,7 +284,7 @@ The <b>constructor</b> shall initialize any member variables the plugin defines, <b>must not access any global structures of VDR</b>. It also must not create any threads or other large data structures. These things are done in the -<!--X1.1.31--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<!--X1.1.31--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%> <a href="#Getting started"><tt>Initialize()</tt></a> or <a href="#Getting started"><tt>Start()</tt></a> <!--X1.1.31--></td></tr></table> @@ -460,18 +460,20 @@ thread of its own), or wants to make use of <a href="#Internationalization">inte it needs to implement one of the functions <p><table><tr><td bgcolor=#F0F0F0><pre><br> -<!--X1.1.31--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%><pre> +<!--X1.1.31--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%><pre> virtual bool Initialize(void); <!--X1.1.31--></pre></td></tr></table> virtual bool Start(void); </pre></td></tr></table><p> which are called once for each plugin at program startup. -<!--X1.1.31--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<!--X1.1.31--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%> +<!--X1.1.32--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> The difference between these two functions is that <tt>Initialize()</tt> is -called early at program startup, while <tt>Start()</tt> is called after everything -else has been set up, right before the main program loop is entered. Inside the -<tt>Start()</tt> function of any plugin it is guaranteed that the <tt>Initialize()</tt> +called early at program startup, while <tt>Start()</tt> is called after the primary +device and user interface has been set up, but before the main program loop is entered. +<!--X1.1.32--></td></tr></table> +Inside the <tt>Start()</tt> function of any plugin it is guaranteed that the <tt>Initialize()</tt> functions of all plugins have already been called. For many plugins it probably doesn't matter which of these functions they implement, but it may be of importance for, e.g., plugins that implement devices. Such plugins should create their cDevice @@ -527,7 +529,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=#00AA00> </td><td width=100%> +<!--X1.1.17--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%> <p><table><tr><td bgcolor=#F0F0F0><pre><br> virtual cOsdObject *MainMenuAction(void); </pre></td></tr></table><p> @@ -1044,7 +1046,6 @@ virtual void SetAudioTrack(int Index); </pre></td></tr></table><p> <p> -<!--X1.1.15--><table width=100%><tr><td bgcolor=#0000AA> </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 @@ -1053,7 +1054,6 @@ void PlayAudio(const uchar *Data, int Length); </pre></td></tr></table><p> where <tt>Data</tt> points to a complete audio PES packet of <tt>Length</tt> bytes. -<!--X1.1.15--></td></tr></table> <p> The second part needed here is a control object that receives user input from the main program loop and reacts on this by telling the player what to do: @@ -1200,7 +1200,7 @@ a <tt>cDevice</tt>: <p><table><tr><td bgcolor=#F0F0F0><pre><br> cMyReceiver *Receiver = new cMyReceiver(123); -<!--X1.1.31--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<!--X1.1.31--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%> cDevice::ActualDevice()->AttachReceiver(Receiver); <!--X1.1.31--></td></tr></table> </pre></td></tr></table><p> @@ -1372,7 +1372,7 @@ needed. <p> <b>Initializing new devices</b> <p> -<!--X1.1.31--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<!--X1.1.31--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%> A derived cDevice class shall implement a static function in which it determines whether the necessary hardware to run this sort of device is actually present in this machine (or whatever other prerequisites @@ -1391,7 +1391,6 @@ 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=#00AA00> </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> @@ -1434,7 +1433,6 @@ will need to copy it for later processing in your thread. <p> The <tt>Mute()</tt> and <tt>Clear()</tt> functions will be called whenever the audio shall be muted, or any buffered data shall be cleared, respectively. -<!--X1.1.15--></td></tr></table> <a name="Remote Control"><hr><h2>Remote Control</h2> @@ -1502,7 +1500,7 @@ 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=#AA0000> </td><td width=100%> +<!--X1.1.27--><table width=100%><tr><td bgcolor=#00AA00> </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 diff --git a/channels.conf b/channels.conf index fb73f57..03b71aa 100644 --- a/channels.conf +++ b/channels.conf @@ -44,8 +44,8 @@ EinsMuXx:12110:h:S19.2E:27500:301:302:0:0:28203:0:0:0 ZDF Theaterkanal:11954:h:S19.2E:27500:1110:1120:0:0:28016:0:0:0 ZDF.doku:11954:h:S19.2E:27500:660:670:0:0:28014:0:0:0 MDR:12110:h:S19.2E:27500:401:402:404:0:28204:0:0:0 -ORB:12110:h:S19.2E:27500:501:502:504:0:28205:0:0:0 -B1:12110:h:S19.2E:27500:601:602:604:0:28206:0:0:0 +RBB Brandenburg:12110:h:S19.2E:27500:501:502:504:0:28205:0:0:0 +RBB Berlin:12110:h:S19.2E:27500:601:602:604:0:28206:0:0:0 :Premiere World Premiere Start:11797:h:S19.2E:27500:255:256:0:101:8:0:0:0 Premiere 1:11797:h:S19.2E:27500:511:512,513;515:0:101:10:0:0:0 diff --git a/channels.conf.cable b/channels.conf.cable index a5567d5..aed98d1 100644 --- a/channels.conf.cable +++ b/channels.conf.cable @@ -45,19 +45,12 @@ 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: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,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 -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 -:Premiere Formel 1 -F1 Portal 1:362:M64:C:6900:255:256:0:101:17:0:0:3 :Premiere Direkt PREMIERE DIREKT:378:M64:C:6900:2815:2816,2817;2819:0:101:18:0:0:0 :Premiere Direkt 1 @@ -65,14 +58,14 @@ 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:362:M64:C:6900:2815:2816,2817;2819:0:101:243:0:0:0 +PREMIERE DIREKT 2A:354:M64:C:6900:511:512,513;515:0:101:211: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: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 3C:362:M64:C:6900:2815:2816,2817;2819:0:101:243: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:386:M64:C:6900:1023:1024:0:101:21:0:0:0 @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.158 2003/05/11 13:45:44 kls Exp $ + * $Id: config.h 1.159 2003/05/16 12:27:58 kls Exp $ */ #ifndef __CONFIG_H @@ -19,8 +19,8 @@ #include "device.h" #include "tools.h" -#define VDRVERSION "1.1.31" -#define VDRVERSNUM 10131 // Version * 10000 + Major * 100 + Minor +#define VDRVERSION "1.1.32" +#define VDRVERSNUM 10132 // Version * 10000 + Major * 100 + Minor #define MAXPRIORITY 99 #define MAXLIFETIME 99 @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.42 2003/05/11 08:53:09 kls Exp $ + * $Id: device.c 1.43 2003/05/16 13:26:43 kls Exp $ */ #include "device.h" @@ -25,10 +25,6 @@ // The default priority for non-primary devices: #define DEFAULTPRIORITY -2 -// The maximum time we wait before assuming that a recorded video data stream -// is broken: -#define MAXBROKENTIMEOUT 30 // seconds - int cDevice::numDevices = 0; int cDevice::useDevice = 0; int cDevice::nextCardIndex = 0; @@ -656,7 +652,6 @@ void cDevice::Action(void) dsyslog("receiver thread started on device %d (pid=%d)", CardIndex() + 1, getpid()); if (OpenDvr()) { - time_t t = time(NULL); active = true; for (; active;) { // Read data from the DVR device: @@ -671,18 +666,10 @@ void cDevice::Action(void) receiver[i]->Receive(b, TS_SIZE); } Unlock(); - t = time(NULL); } } else break; - - //XXX+ put this into the recorder??? or give the receiver a flag whether it wants this? - if (time(NULL) - t > MAXBROKENTIMEOUT) { - esyslog("ERROR: video data stream broken on device %d", CardIndex() + 1); - cThread::EmergencyExit(true); - t = time(NULL); - } } CloseDvr(); } @@ -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.75 2003/05/11 11:25:04 kls Exp $ + * $Id: eit.c 1.78 2003/05/18 14:10:25 kls Exp $ ***************************************************************************/ #include "eit.h" @@ -434,27 +434,33 @@ static void ReportEpgBugFixStats(bool Reset = false) const char *delim = "\t"; tEpgBugFixStats *p = &EpgBugFixStats[i]; if (p->hits) { - if (!GotHits) { - dsyslog("====================="); - dsyslog("EPG bugfix statistics"); - dsyslog("====================="); - dsyslog("IF SOMEBODY WHO IS IN CHARGE OF THE EPG DATA FOR ONE OF THE LISTED"); - dsyslog("CHANNELS READS THIS: PLEASE TAKE A LOOK AT THE FUNCTION cEventInfo::FixEpgBugs()"); - dsyslog("IN VDR/eit.c TO LEARN WHAT'S WRONG WITH YOUR DATA, AND FIX IT!"); - dsyslog("====================="); - dsyslog("Fix\tHits\tChannels"); - GotHits = true; - } + bool PrintedStats = false; char *q = buffer; - q += snprintf(q, sizeof(buffer) - (q - buffer), "%d\t%d", i, p->hits); + *buffer = 0; for (int c = 0; c < p->n; c++) { cChannel *channel = Channels.GetByChannelID(p->channelIDs[c], true); if (channel) { + if (!GotHits) { + dsyslog("====================="); + dsyslog("EPG bugfix statistics"); + dsyslog("====================="); + dsyslog("IF SOMEBODY WHO IS IN CHARGE OF THE EPG DATA FOR ONE OF THE LISTED"); + dsyslog("CHANNELS READS THIS: PLEASE TAKE A LOOK AT THE FUNCTION cEventInfo::FixEpgBugs()"); + dsyslog("IN VDR/eit.c TO LEARN WHAT'S WRONG WITH YOUR DATA, AND FIX IT!"); + dsyslog("====================="); + dsyslog("Fix\tHits\tChannels"); + GotHits = true; + } + if (!PrintedStats) { + q += snprintf(q, sizeof(buffer) - (q - buffer), "%d\t%d", i, p->hits); + PrintedStats = true; + } q += snprintf(q, sizeof(buffer) - (q - buffer), "%s%s", delim, channel->Name()); delim = ", "; } } - dsyslog("%s", buffer); + if (*buffer) + dsyslog("%s", buffer); } if (Reset) p->hits = p->n = 0; @@ -807,6 +813,7 @@ cSchedules::~cSchedules() /** */ const cSchedule *cSchedules::AddChannelID(tChannelID channelid) { + channelid.ClrRid(); const cSchedule *p = GetSchedule(channelid); if (!p) { Add(new cSchedule(channelid)); @@ -1073,6 +1080,7 @@ cSIProcessor::cSIProcessor(const char *FileName) masterSIProcessor = numSIProcessors == 0; // the first one becomes the 'master' currentSource = 0; currentTransponder = 0; + statusCount = 0; pmtIndex = 0; pmtPid = 0; filters = NULL; @@ -1150,6 +1158,7 @@ const char *cSIProcessor::GetEpgDataFileName(void) void cSIProcessor::SetStatus(bool On) { LOCK_THREAD; + statusCount++; ShutDownFilters(); pmtIndex = 0; pmtPid = 0; @@ -1176,6 +1185,7 @@ void cSIProcessor::Action() time_t lastCleanup = time(NULL); time_t lastPmtScan = time(NULL); + int oldStatusCount = 0; active = true; while(active) @@ -1208,6 +1218,7 @@ void cSIProcessor::Action() } // set up pfd structures for all active filter + Lock(); pollfd pfd[MAX_FILTERS]; int NumUsedFilters = 0; for (int a = 0; a < MAX_FILTERS ; a++) @@ -1219,6 +1230,8 @@ void cSIProcessor::Action() NumUsedFilters++; } } + oldStatusCount = statusCount; + Unlock(); // wait until data becomes ready from the bitfilter if (poll(pfd, NumUsedFilters, 1000) != 0) @@ -1239,6 +1252,8 @@ void cSIProcessor::Action() //dsyslog("Received pid 0x%04X with table ID 0x%02X and length of %4d\n", pid, buf[0], seclen); cMutexLock MutexLock(&schedulesMutex); // since the xMem... stuff is not thread safe, we need to use a "global" mutex LOCK_THREAD; + if (statusCount != oldStatusCount) + break; switch (pid) { case 0x00: @@ -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.28 2003/04/21 13:22:06 kls Exp $ + * $Id: eit.h 1.29 2003/05/17 09:15:56 kls Exp $ ***************************************************************************/ #ifndef __EIT_H @@ -148,6 +148,7 @@ private: bool masterSIProcessor; int currentSource; int currentTransponder; + int statusCount; int pmtIndex; int pmtPid; SIP_FILTER *filters; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.c 1.108 2003/05/11 13:54:23 kls Exp $ + * $Id: i18n.c 1.110 2003/05/16 13:02:08 kls Exp $ * * Translations provided by: * @@ -21,6 +21,7 @@ * Swedish Tomas Prybil <tomas@prybil.se> and Jan Ekholm <chakie@infa.abo.fi> * Romanian Paul Lacatus <paul@campina.iiruc.ro> * Hungarian Istvan Koenigsberger <istvnko@hotmail.com> and Guido Josten <guido.josten@t-online.de> + * Catalanian Marc Rovira Vall <tm05462@salleURL.edu> and Ramon Roca <ramon.roca@xcombo.com> * */ @@ -85,6 +86,7 @@ const tI18nPhrase Phrases[] = { "Svenska", "Romaneste", "Magyar", + "Català", }, // Menu titles: { "VDR", @@ -102,6 +104,7 @@ const tI18nPhrase Phrases[] = { "VDR", "VDR", "VDR", + "VDR", }, { "Schedule", "Programm", @@ -113,11 +116,12 @@ const tI18nPhrase Phrases[] = { "Programmer", "Ohjelmat", "Program", - "Programa", + "Guía de Programación", "Programma", "Program", "Program", "Program", + "Guia de Programació", }, { "Channels", "Kanäle", @@ -134,6 +138,7 @@ const tI18nPhrase Phrases[] = { "Kanaler", "Canale", "Csatornák", + "Canals", }, { "Timers", "Timer", @@ -150,6 +155,7 @@ const tI18nPhrase Phrases[] = { "Timers", "Timere", "Felvétel beprogramozása", + "Temporitzadors", }, { "Recordings", "Aufzeichnungen", @@ -166,6 +172,7 @@ const tI18nPhrase Phrases[] = { "Inspelningar", "Inregistrari", "Felvett adások", + "Veure programes gravats", }, { "Setup", "Einstellungen", @@ -182,6 +189,7 @@ const tI18nPhrase Phrases[] = { "Inställningar", "Setari", "Beállítások", + "Configuració", }, { "Commands", "Befehle", @@ -198,6 +206,7 @@ const tI18nPhrase Phrases[] = { "Kommandon", "Comenzi", "Parancsok", + "Ordres", }, { "Recording commands", "Befehle für Aufzeichnungen", @@ -209,11 +218,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "Nauhoituskomennot", "",// TODO - "",// TODO + "Órdenes de grabación", "Entoles gia egrafes",// TODO "Inspelningskommandon", "",// TODO "",// TODO + "Ordres de gravació", }, { "Edit channel", "Kanal editieren", @@ -230,6 +240,7 @@ const tI18nPhrase Phrases[] = { "Ändra kanal", "Editare canale", "Csatornák beállítása", + "Editar canal", }, { "Edit timer", "Timer editieren", @@ -246,6 +257,7 @@ const tI18nPhrase Phrases[] = { "Ändra timer", "Editare timere", "Felvétel beprogramozásának megváltoztatása", + "Editar temporitzador", }, { "Event", "Sendung", @@ -262,6 +274,7 @@ const tI18nPhrase Phrases[] = { "Sändning", "Evenimente", "Adás", + "Event", }, { "Summary", "Inhalt", @@ -278,6 +291,7 @@ const tI18nPhrase Phrases[] = { "Sammandrag", "Cuprins", "Tartalom", + "Sinopsi", }, { "Schedule - %s", "Programm - %s", @@ -294,6 +308,7 @@ const tI18nPhrase Phrases[] = { "Program - %s", "Program - %s", "Program - %s", + "Guia de Programació - %s", }, { "What's on now?", "Was läuft jetzt?", @@ -310,6 +325,7 @@ const tI18nPhrase Phrases[] = { "Vilket program sänds nu?", "Programul actual?", "Mi megy most?", + "Que fan ara?", }, { "What's on next?", "Was läuft als nächstes?", @@ -326,6 +342,7 @@ const tI18nPhrase Phrases[] = { "Vilket är nästa program?", "Programul urmator?", "Mi következik?", + "Que fan després?", }, // Button texts (should not be more than 10 characters!): { "Edit", @@ -343,6 +360,7 @@ const tI18nPhrase Phrases[] = { "Ändra", "Modificare", "Beállítani", + "Editar", }, { "New", "Neu", @@ -359,6 +377,7 @@ const tI18nPhrase Phrases[] = { "Ny", "Nou", "Új", + "Nou", }, { "Delete", "Löschen", @@ -375,6 +394,7 @@ const tI18nPhrase Phrases[] = { "Ta bort", "Sterge", "Törölni", + "Esborrar", }, { "Mark", "Markieren", @@ -391,6 +411,7 @@ const tI18nPhrase Phrases[] = { "Märk", "Marcheaza", "Megjelölni", + "Marcar", }, { "On/Off", "Ein/Aus", @@ -407,6 +428,7 @@ const tI18nPhrase Phrases[] = { "På/Av", "Pornit/Oprit", "Be/Ki", + "On/Off", }, { "Record", "Aufnehmen", @@ -423,6 +445,7 @@ const tI18nPhrase Phrases[] = { "Inspelning", "Inregistrare", "Felvenni", + "Gravar", }, { "Play", "Wiedergabe", @@ -439,6 +462,7 @@ const tI18nPhrase Phrases[] = { "Spela upp", "Redare", "Lejátszani", + "Reproduir", }, { "Rewind", "Anfang", @@ -455,6 +479,7 @@ const tI18nPhrase Phrases[] = { "Återspolning", "Inapoi", "Vissza az elejére", + "Enrera", }, { "Button$Stop", "Beenden", @@ -471,6 +496,7 @@ const tI18nPhrase Phrases[] = { "Stopp", "Stop", "Stop", + "Parar", }, { "Resume", "Weiter", @@ -487,6 +513,7 @@ const tI18nPhrase Phrases[] = { "Fortsätt", "Reia", "Tovább", + "Continuar", }, { "Summary", "Inhalt", @@ -503,6 +530,7 @@ const tI18nPhrase Phrases[] = { "Sammandrag", "Cuprins", "Tartalom", + "Resum", }, { "Open", "Öffnen", @@ -519,6 +547,7 @@ const tI18nPhrase Phrases[] = { "Öppna", "Deschide", "Kinyitni", + "Obrir", }, { "Switch", "Umschalten", @@ -535,6 +564,7 @@ const tI18nPhrase Phrases[] = { "Byt", "Schimba", "Átkapcsolni", + "Canviar", }, { "Now", "Jetzt", @@ -551,6 +581,7 @@ const tI18nPhrase Phrases[] = { "Nu", "Acum", "Most", + "Ara", }, { "Next", "Nächste", @@ -567,6 +598,7 @@ const tI18nPhrase Phrases[] = { "Nästa", "Urmator", "Következö", + "Següent", }, { "Button$Schedule", "Programm", @@ -583,6 +615,7 @@ const tI18nPhrase Phrases[] = { "Program", "Program", "Program", + "Programar", }, { "Language", "Sprache", @@ -594,11 +627,12 @@ const tI18nPhrase Phrases[] = { "Språk", "Kieli", "Jezyk", - "Lengua", + "Idioma", "Glosa", "Språk", "Limba", "Nyelv", + "Idioma", }, { "Eject", "Auswerfen", @@ -610,11 +644,12 @@ const tI18nPhrase Phrases[] = { "Eject", "Avaa", "Wyrzucenie", - "Eyectar", + "Expulsar", "Exsagogi", "Mata ut", "Ejecteaza", "Kidobni", + "Expulsar", }, { "ABC/abc", "ABC/abc", @@ -631,6 +666,7 @@ const tI18nPhrase Phrases[] = { "ABC/abc", "ABC/abc", "ABC/abc", + "ABC/abc", }, { "Insert", "Einfügen", @@ -642,11 +678,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "Lisää", "",// TODO - "",// TODO + "Insertar", "Isodos", "Infoga", "Insereaza", "Beilleszteni", + "Insertar", }, { "Overwrite", "Überschreiben", @@ -658,11 +695,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "Korvaa", "",// TODO - "",// TODO + "Sobreescribir", "Epanagrafi", "Skriv över", "Suprascrie", "Átírni", + "Sobrescriure", }, { "Menu", "Menü", @@ -674,11 +712,12 @@ const tI18nPhrase Phrases[] = { "Meny", "Valikko", "Menu", - "Menu", + "Menú", "Menou", "Meny", "Meniu", "Menü", + "Menú", }, { "Reset", "Reset", @@ -690,11 +729,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO - "",//TODO + "Reiniciar", "Epanafora", "",//TODO "",//TODO "",//TODO + "Reiniciar", }, // Confirmations: { "Delete channel?", @@ -712,6 +752,7 @@ const tI18nPhrase Phrases[] = { "Ta bort kanalen?", "Sterg canalul?", "Csatorna törlése?", + "Esborrar el canal?", }, { "Delete timer?", "Timer löschen?", @@ -728,6 +769,7 @@ const tI18nPhrase Phrases[] = { "Ta bort timern?", "Sterg timer-ul?", "Felvétel beprogramozásának törlése?", + "Esborrar el temporitzador?", }, { "Delete recording?", "Aufzeichnung löschen?", @@ -744,6 +786,7 @@ const tI18nPhrase Phrases[] = { "Ta bort inspelningen?", "Sterg inregistrarea?", "Felvétel törlése?", + "Esborrar gravació?" }, { "Timer still recording - really delete?", "Timer zeichnet auf - trotzdem löschen?", @@ -760,6 +803,7 @@ const tI18nPhrase Phrases[] = { "Timerstyrd inspelning pågår - Avbryta ändå?", "Timer-ul in inregistrare - sterg?", "Felvétel folyamatban van - mégis törölni?", + "Temporitzador activat - Esborrar de totes maneres?", }, { "Stop recording?", "Aufzeichnung beenden?", @@ -776,6 +820,7 @@ const tI18nPhrase Phrases[] = { "Stanna inspelning?", "Opresc inregistrarea?", "Felvétel befejezni?", + "Parar la gravació?", }, { "on primary interface", "auf dem primären Interface", @@ -792,6 +837,7 @@ const tI18nPhrase Phrases[] = { "från det första enheten?", "pe prima interfata", "az elsö kártyán", + "a la interfície primària", }, { "Cancel editing?", "Schneiden abbrechen?", @@ -808,6 +854,7 @@ const tI18nPhrase Phrases[] = { "Avbryta editeringen?", "Opresc editarea?", "Vágást befejezni?", + "Cancel.lar l'edició?", }, { "Really restart?", "Wirklich neu starten?", @@ -824,6 +871,7 @@ const tI18nPhrase Phrases[] = { "Vill du verkligen starta om?", "Esti sigur de repornire?", "Tényleg újraindítani?", + "Segur que vols reiniciar?", }, { "Recording - restart anyway?", "Aufnahme läuft - trotzdem neu starten?", @@ -835,11 +883,12 @@ const tI18nPhrase Phrases[] = { "Gjør opptak - starte på nytt likevel?", "Nauhoitus käynnissä - aloitetaanko alusta?", "Nagrywanie w trakcie - rzeczywiscie nowy start?", - "¿Grabando - reiniciar?", + "Grabando - ¿reiniciar?", "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?", + "Estic gravant - reiniciar de totes maneres?" }, { "Recording - shut down anyway?", "Aufnahme läuft - trotzdem ausschalten?", @@ -851,11 +900,12 @@ const tI18nPhrase Phrases[] = { "Gjør opptak - slå av likevel?", "Nauhoitus kesken - lopetetaanko se?", "Nagrywanie w trakcie - mimo to wylaczyc?", - "¿Grabando - apagar?", + "Grabando - ¿apagar?", "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?", + "Gravant - Apagar de totes maneres?", }, { "Recording in %d minutes, shut down anyway?", "Aufnahme in %d Minuten - trotzdem ausschalten?", @@ -867,11 +917,12 @@ const tI18nPhrase Phrases[] = { "Skal gjøre opptak om %d minutter - slå av likevel?", "Nauhoitus alkaisi %d min. kuluttua - sammutetaanko silti?", "Nagrywanie za %d minut - mimo to wylaczyc?", - "¿Grabando en %d minutos, de verdad cortar?", + "Grabando en %d minutos, ¿de verdad apagar?", "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?", + "Hi ha una gravació en %d minuts - Apagar de totes maneres?", }, { "Press any key to cancel shutdown", "Taste drücken um Shutdown abzubrechen", @@ -883,11 +934,12 @@ const tI18nPhrase Phrases[] = { "Trykk en tast for ikke å slå av", "Peruuta pysäytys painamalla jotakin näppäintä", "Dowolny przycisk zatrzyma wylaczanie", - "Pulse una tecla para interrumpir corte", + "Pulse una tecla para interrumpir apagar", "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", + "Prem qualsevol tecla per cancel.lar l'aturada", }, // Channel parameters: { "Name", @@ -905,6 +957,7 @@ const tI18nPhrase Phrases[] = { "Namn", "Nume", "Név", + "Nom", }, { "Frequency", "Frequenz", @@ -921,6 +974,7 @@ const tI18nPhrase Phrases[] = { "Frekvens", "Frecventa", "Frekvencia", + "Freqüència", }, { "Polarization", "Polarisation", @@ -937,6 +991,7 @@ const tI18nPhrase Phrases[] = { "Polarisation", "Polarizare", "Polarizáció", + "Polarització", }, { "Source", "Quelle", @@ -953,6 +1008,7 @@ const tI18nPhrase Phrases[] = { "Källa", "",//TODO "",//TODO + "Origen", }, { "Srate", "Srate", @@ -969,6 +1025,7 @@ const tI18nPhrase Phrases[] = { "Srate", "Rata simboluri", "Srate", + "Srate", }, { "Vpid", "Vpid", @@ -985,6 +1042,7 @@ const tI18nPhrase Phrases[] = { "Vpid", "PID Video", "Vpid", + "PID Vídeo", }, { "Apid1", "Apid1", @@ -1001,6 +1059,7 @@ const tI18nPhrase Phrases[] = { "Apid1", "PID Audio (1)", "Apid1", + "PID Àudio (1)", }, { "Apid2", "Apid2", @@ -1017,6 +1076,7 @@ const tI18nPhrase Phrases[] = { "Apid2", "PID Audio (2)", "Apid2", + "PID Àudio (2)", }, { "Dpid1", "Dpid1", @@ -1033,6 +1093,7 @@ const tI18nPhrase Phrases[] = { "Dpid1", "PID AC3 (1)", "Dpid1", + "PID AC3 (1)", }, { "Dpid2", "Dpid2", @@ -1049,6 +1110,7 @@ const tI18nPhrase Phrases[] = { "Dpid2", "PID AC3 (2)", "Dpid2", + "PID AC3 (2)", }, { "Tpid", "Tpid", @@ -1065,6 +1127,7 @@ const tI18nPhrase Phrases[] = { "Tpid", "PID Teletext", "Tpid", + "PID Teletext", }, { "CA", "CA", @@ -1081,6 +1144,7 @@ const tI18nPhrase Phrases[] = { "CA", "Criptare", "CA", + "Accés Condicional", }, { "Sid", "Sid", @@ -1097,6 +1161,7 @@ const tI18nPhrase Phrases[] = { "Sid", "Sid", "Sid", + "Sid", }, { "Inversion", "Inversion", @@ -1113,6 +1178,7 @@ const tI18nPhrase Phrases[] = { "Inversion", "Inversion", "Inversion", + "Inversió", }, { "Bandwidth", "Bandwidth", @@ -1129,6 +1195,7 @@ const tI18nPhrase Phrases[] = { "Bandbredd", "Bandwidth", "Bandwidth", + "Ampla de banda", }, { "CoderateH", "CoderateH", @@ -1145,6 +1212,7 @@ const tI18nPhrase Phrases[] = { "CoderateH", "CoderateH", "CoderateH", + "CoderateH", }, { "CoderateL", "CoderateL", @@ -1161,6 +1229,7 @@ const tI18nPhrase Phrases[] = { "CoderateL", "CoderateL", "CoderateL", + "CoderateL", }, { "Modulation", "Modulation", @@ -1177,6 +1246,7 @@ const tI18nPhrase Phrases[] = { "Modulation", "Modulation", "Modulation", + "Modulació", }, { "Transmission", "Transmission", @@ -1193,6 +1263,7 @@ const tI18nPhrase Phrases[] = { "Transmission", "Transmission", "Transmission", + "Transmissió", }, { "Guard", "Guard", @@ -1209,6 +1280,7 @@ const tI18nPhrase Phrases[] = { "Guard", "Guard", "Guard", + "Protegir", }, { "Hierarchy", "Hierarchy", @@ -1225,6 +1297,7 @@ const tI18nPhrase Phrases[] = { "Hierarchy", "Hierarchy", "Hierarchy", + "Jerarquia", }, // Timer parameters: { "Active", @@ -1242,6 +1315,7 @@ const tI18nPhrase Phrases[] = { "Aktiv", "Activ", "Aktiv", + "Actiu", }, { "Channel", "Kanal", @@ -1258,6 +1332,7 @@ const tI18nPhrase Phrases[] = { "Kanal", "Canal", "Csatorna", + "Canal", }, { "Day", "Tag", @@ -1274,6 +1349,7 @@ const tI18nPhrase Phrases[] = { "Dag", "Ziua", "Nap", + "Dia", }, { "Start", "Anfang", @@ -1290,6 +1366,7 @@ const tI18nPhrase Phrases[] = { "Börjar", "Start", "Kezdet", + "Inici", }, { "Stop", "Ende", @@ -1306,6 +1383,7 @@ const tI18nPhrase Phrases[] = { "Slutar", "Stop", "Vége", + "Final", }, { "Priority", "Priorität", @@ -1322,6 +1400,7 @@ const tI18nPhrase Phrases[] = { "Prioritet", "Prioritate", "Prioritás", + "Prioritat", }, { "Lifetime", "Lebensdauer", @@ -1338,6 +1417,7 @@ const tI18nPhrase Phrases[] = { "Speltid", "Durata", "Élettartam", + "Duració", }, { "File", "Datei", @@ -1354,6 +1434,7 @@ const tI18nPhrase Phrases[] = { "Filnamn", "Fisier", "File", + "Arxiu", }, { "First day", "Erster Tag", @@ -1370,6 +1451,7 @@ const tI18nPhrase Phrases[] = { "Första dag", "Prima zi", "Elsö nap", + "Primer dia", }, // Error messages: { "Channel is being used by a timer!", @@ -1387,6 +1469,7 @@ const tI18nPhrase Phrases[] = { "Kanalen används av en timer!", "Canalul este utilizat de un timer!", "Csatornát más használja!", + "Canal en ús per un temporitzador!", }, { "Can't switch channel!", "Kanal kann nicht umgeschaltet werden!", @@ -1403,6 +1486,7 @@ const tI18nPhrase Phrases[] = { "Omöjligt att byta kanal!", "Nu pot comuta canalul!", "Csatornát nem lehet átkapcsolni!", + "No puc canviar de canal!", }, { "Timer is recording!", "Timer zeichnet gerade auf!", @@ -1419,6 +1503,7 @@ const tI18nPhrase Phrases[] = { "Timerstyrd inspelning pågår!", "Timer-ul este in inregistrare!", "Felvétel folyamatban van!", + "El temporitzador està gravant!", }, { "Error while accessing recording!", "Fehler beim Ansprechen der Aufzeichnung!", @@ -1430,11 +1515,12 @@ const tI18nPhrase Phrases[] = { "Feil under lesing av opptak!", "Nauhoituksen toistaminen epäonnistui!", "Blad - brak dostepu do nagrania!", - "¡Error al accesar la grabación!", + "¡Error al acceder a la grabación!", "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", + "Error a l'accedir a la gravació!", }, { "Error while deleting recording!", "Fehler beim Löschen der Aufzeichnung!", @@ -1451,6 +1537,7 @@ const tI18nPhrase Phrases[] = { "Det går inte att ta bort inspelningen", "Eroare in timpul stergerii inregistrarii!", "Hiba a felvétel törlésénél!", + "Error a l'esborrar la gravació!", }, { "*** Invalid Channel ***", "*** Ungültiger Kanal ***", @@ -1467,6 +1554,7 @@ const tI18nPhrase Phrases[] = { "*** Felaktig kanal ***", "*** Canal invalid ***", "*** Érvénytelen csatorna ***", + "*** Canal incorrecte ***", }, { "No free DVB device to record!", "Keine freie DVB-Karte zum Aufnehmen!", @@ -1483,6 +1571,7 @@ const tI18nPhrase Phrases[] = { "Det finns ingen ledig DVB enhet för inspelning!", "Nu mai sunt dispozitive DVB pentru inregistrare!", "Nincs szabad DVB kártya a felvételhez!", + "No hi ha cap dispositiu DVB lliure per gravar!", }, { "Channel not available!", "Kanal nicht verfügbar!", @@ -1494,11 +1583,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "Kanavaa ei voi katsoa nyt!", "",//TODO - "",//TODO + "!Canal no disponible!", "To kanali den ine diathesimo", "Kanalen ej tillgänglig!", "",//TODO "",//TODO + "Canal no disponible!", }, { "Channel settings are not unique!", "Kanaleinstellungen sind nicht eindeutig!", @@ -1510,11 +1600,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO - "",//TODO + "!Propiedades de canal duplicadas!", "Ta kanalia stin lista den ine monadika!", "Kanalinställningarna är ej unika!", "",//TODO "",//TODO + "Propietats del canal duplicades!", }, { "Channel locked (recording)!", "Kanal blockiert (zeichnet auf)!", @@ -1531,6 +1622,7 @@ const tI18nPhrase Phrases[] = { "Kanalen är låst (inspelning pågår)!", "Canal blocat (inregistrare)!", "Csatorna hozzáférhetetlen (felvétel)!", + "Canal bloquejat (gravant)!", }, { "Can't start Transfer Mode!", "Transfer-Mode kann nicht gestartet werden!", @@ -1547,6 +1639,24 @@ const tI18nPhrase Phrases[] = { "Kan inte starta Transfer Mode!", "Nu pot porni Modul de Transfer!", "Transfer-Mode nem indítható!", + "No puc iniciar el mode de transferència!", + }, + { "No editing marks defined!", + "Keine Schnittmarken gesetzt!", + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO + "",//TODO }, { "Can't start editing process!", "Schnitt kann nicht gestartet werden!", @@ -1563,6 +1673,7 @@ const tI18nPhrase Phrases[] = { "Kan inte starta editering!", "Nu pot porni procesul de editare!", "A vágás nem indítható!", + "No puc iniciar el procés d'edició!", }, { "Editing process already active!", "Schnitt bereits aktiv!", @@ -1579,6 +1690,7 @@ const tI18nPhrase Phrases[] = { "Editering är redan aktiv!", "Procesul de editare este activ!", "A vágás már aktivált!", + "Procés d'edició iniciat anteriorment!", }, { "Can't shutdown - option '-s' not given!", "Shutdown unmöglich - Option '-s' fehlt!", @@ -1590,11 +1702,12 @@ const tI18nPhrase Phrases[] = { "Kan ikke slå av - startet uten parameteret '-s'!", "Ei voida sammuttaa '-s' parametria ei annettu!", "Wylaczenie niemozliwe - brak opcji '-s'!", - "¡No puedo cortar - opción '-s' absente!", + "¡No puedo apagar - opción '-s' ausente!", "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!", + "No puc apagar, falta la opció -s !" }, { "Low disk space!", "Platte beinahe voll!", @@ -1611,6 +1724,7 @@ const tI18nPhrase Phrases[] = { "Lågt diskutrymme!", "Spatiu scazut pe disc!", "A merev lemez majdnem tele!", + "Disc gairebé plè!", }, { "Can't open CAM menu!", "CAM-Menü kann nicht geöffnet werden!", @@ -1622,11 +1736,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO - "",//TODO + "¡No pudeo acceder al menú de la CAM!", "Den mpori na aniksi to CAM menou!", "",//TODO "",//TODO "",//TODO + "No puc obrir el menú de la CAM!", }, { "Can't reset CAM!", "CAM-Reset fehlgeschlagen!", @@ -1638,11 +1753,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO - "",//TODO + "¡No puedo reiniciar la CAM!", "Adinato na gini epanafora sto CAM", "",//TODO "",//TODO "",//TODO + "No puc reiniciar la CAM!", }, { "CAM has been reset", "CAM wurde zurückgesetzt!", @@ -1654,11 +1770,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "",//TODO "",//TODO - "",//TODO + "CAM reiniciada", "Sto CAM egine apanafora", "",//TODO "",//TODO "",//TODO + "CAM reiniciada", }, // Setup pages: { "OSD", @@ -1671,11 +1788,12 @@ const tI18nPhrase Phrases[] = { "OSD", "Tekstinäyttö", "OSD", + "Menús en pantalla", "OSD", "OSD", "OSD", "OSD", - "OSD", + "Informació en pantalla", }, { "EPG", "EPG", @@ -1687,11 +1805,12 @@ const tI18nPhrase Phrases[] = { "Programoversikt", "Ohjelmaopas", "EPG", - "EPG", + "Guía de Programación", "EPG", "Elektronisk programguide", "EPG", "EPG", + "Guia de Programes", }, { "DVB", "DVB", @@ -1708,6 +1827,7 @@ const tI18nPhrase Phrases[] = { "DVB", "Placa DVB", "DVB", + "Tarja DVB", }, { "LNB", "LNB", @@ -1724,6 +1844,7 @@ const tI18nPhrase Phrases[] = { "LNB", "LNB", "LNB", + "Configuració de l'LNB", }, { "CICAM", "CICAM", @@ -1740,6 +1861,7 @@ const tI18nPhrase Phrases[] = { "CICAM", "Acces conditionat", "CICAM", + "CI Accés condicional", }, { "Recording", "Aufnahme", @@ -1751,11 +1873,12 @@ const tI18nPhrase Phrases[] = { "Opptak", "Nauhoita", "Nagranie", - "Grabación", + "Opciones de Grabación", "Egrafi", "Inspelning", "Inregistrare", "Felvétel", + "Opcions de Gravació", }, { "Replay", "Wiedergabe", @@ -1767,11 +1890,12 @@ const tI18nPhrase Phrases[] = { "Spill av", "Toista", "Odtwarzanie", - "Poner", + "Opciones de Reproducción", "Anametadosi", "Repris", "Redare", "Lejátszás", + "Opcions de Reproducció", }, { "Miscellaneous", "Sonstiges", @@ -1788,6 +1912,7 @@ const tI18nPhrase Phrases[] = { "Diverse", "Diverse", "Egyéb", + "Miscel·lània", }, { "Plugins", "Plugins", @@ -1804,6 +1929,7 @@ const tI18nPhrase Phrases[] = { "Plugins", "Plugins", "Plugins", + "Plugins", }, { "Plugin", "Plugin", @@ -1820,6 +1946,7 @@ const tI18nPhrase Phrases[] = { "Plugin", "Plugin", "Plugin", + "Plugin", }, { "Restart", "Neustart", @@ -1836,6 +1963,7 @@ const tI18nPhrase Phrases[] = { "Omstart", "Restart", "Ùjraindítás", + "Reiniciar", }, // Setup parameters: { "Setup.OSD$Language", @@ -1848,11 +1976,12 @@ const tI18nPhrase Phrases[] = { "Språk", "Kieli", "Jezyk", - "Lengua", + "Idioma", "Glosa", "Språk", "Limba OSD", "Nyelv", + "Idioma", }, { "Setup.OSD$Width", "Breite", @@ -1869,6 +1998,7 @@ const tI18nPhrase Phrases[] = { "Bredd", "Latime OSD", "Szélesség", + "Amplada", }, { "Setup.OSD$Height", "Höhe", @@ -1885,6 +2015,7 @@ const tI18nPhrase Phrases[] = { "Höjd", "Inaltime OSD", "Magasság", + "Alçada", }, { "Setup.OSD$Message time (s)", "Anzeigedauer für Nachrichten (s)", @@ -1901,6 +2032,7 @@ const tI18nPhrase Phrases[] = { "Tid för meddelanden (sek)", "Timp afisare mesaj (sec)", "Információ feltüntetésének idötartama", + "Duració dels missatges (s)", }, { "Setup.OSD$Channel info position", "Kanal-Info Position", @@ -1917,6 +2049,7 @@ const tI18nPhrase Phrases[] = { "Placering av kanalinformation", "Pozitie info canal", "Csatorna-Infó poziciója", + "Posició de la informació del canal", }, { "Setup.OSD$Info on channel switch", "Info beim Kanalwechsel", @@ -1933,6 +2066,7 @@ const tI18nPhrase Phrases[] = { "Information vid kanalbyte", "Info despre comutare canal", "Infó a csatorna váltásánál", + "Informació del canvi de canal", }, { "Setup.OSD$Scroll pages", "Seitenweise scrollen", @@ -1949,6 +2083,7 @@ const tI18nPhrase Phrases[] = { "Bläddra sidor", "Deruleaza pagini", "Oldalanként léptetmi", + "Desplaçar pàgina sencera", }, { "Setup.OSD$Sort timers", "Timer sortieren", @@ -1960,11 +2095,12 @@ const tI18nPhrase Phrases[] = { "Sorter timere", "Järjestä ajastimet", "Sortowanie timerow", - "Ordenar timer", + "Ordenar timers", "Organosi programmatismenon", "Sortera timers", "Sortare timere", "A beprogramozott felvételek elrendezése", + "Ordenar gravacions programades", }, { "Setup.OSD$Recording directories", "Aufnahmeverzeichnisse", @@ -1976,11 +2112,12 @@ const tI18nPhrase Phrases[] = { "Kataloger til opptak", "Nauhoitushakemistot", "Wykaz nagran", - "Directorios para grabación", + "Gracaciones en directorios", "Fakeloi egrafon", "Kataloger för inspelningar", "Directoare inregistrari", "Felvételek listája", + "Gravacions en sub-carpetes", }, { "Setup.EPG$EPG scan timeout (h)", "Zeit bis EPG Scan (h)", @@ -1997,6 +2134,7 @@ const tI18nPhrase Phrases[] = { "EPG sökning timeout", "Timeout EPG", "Fennmaradt idö az EPG-g (h)", + "Màxim d'Hores a cercar per la Guia", }, { "Setup.EPG$EPG bugfix level", "EPG Fehlerbereinigung", @@ -2013,6 +2151,7 @@ const tI18nPhrase Phrases[] = { "Nivå för EPG bugfix", "Nivel corectie EPG", "EPG hibaelhárítás", + "Nivell de correcció de la Guia", }, { "Setup.EPG$Set system time", "Systemzeit stellen", @@ -2029,6 +2168,7 @@ const tI18nPhrase Phrases[] = { "Ställ in systemtid", "Seteaza ceasul sistem", "Az idö beállítása", + "Ajustar l'hora del sistema", }, { "Setup.EPG$Use time from transponder", "Transponder für Systemzeit", @@ -2045,6 +2185,7 @@ const tI18nPhrase Phrases[] = { "Använd klockan från transponder", "Preia ceasul din transponder", "Idöhöz tartozó Transponder", + "Usar el temps del múltiplex", }, { "Setup.DVB$Primary DVB interface", "Primäres DVB Interface", @@ -2061,6 +2202,7 @@ const tI18nPhrase Phrases[] = { "Primär DVB enhet", "Placa DVB primara", "Elsö DVB interface", + "Tarja DVB primària", }, { "Setup.DVB$Video format", "Video Format", @@ -2077,6 +2219,7 @@ const tI18nPhrase Phrases[] = { "Video format", "Format Video", "Video formátum", + "Format del vídeo", }, { "Setup.LNB$SLOF (MHz)", "SLOF (MHz)", @@ -2093,6 +2236,7 @@ const tI18nPhrase Phrases[] = { "SLOF (MHz)", "SLOF (MHz)", "SLOF (MHz)", + "SLOF (MHz)", }, { "Setup.LNB$Low LNB frequency (MHz)", "Untere LNB-Frequenz (MHz)", @@ -2109,6 +2253,7 @@ const tI18nPhrase Phrases[] = { "Undre LNB frekvens (MHz)", "Frecvnta LO LNB (Mhz)", "Alsó LNB-frekvencia (MHZ)", + "Freqüència LNB baixa (MHz)", }, { "Setup.LNB$High LNB frequency (MHz)", "Obere LNB-Frequenz (MHz)", @@ -2125,6 +2270,7 @@ const tI18nPhrase Phrases[] = { "Övre LNB frekvens (MHz)", "Feecventa HI LNB (MHz)", "Felsö LNB-frekvencia (MHZ)", + "Freqüència LNB alta (MHz)", }, { "Setup.LNB$Use DiSEqC", "DiSEqC benutzen", @@ -2141,6 +2287,7 @@ const tI18nPhrase Phrases[] = { "Använd DiSEqC", "Utilizez DiSEqC", "DiSEqC használata", + "Utilitzar DiSEqC", }, { "Setup.CICAM$CICAM DVB", "CICAM DVB", @@ -2157,6 +2304,7 @@ const tI18nPhrase Phrases[] = { "CICAM DVB", "Setare acces conditional", "CICAM DVB", + "Accés condicional CICAM", }, { "Setup.Recording$Margin at start (min)", "Zeitpuffer bei Anfang (min)", @@ -2173,6 +2321,7 @@ const tI18nPhrase Phrases[] = { "Marginal för start (min)", "Margine la pornire (min)", "Idöeltolódás a kezdésnél (min)", + "Iniciar la gravació avans de (min)", }, { "Setup.Recording$Margin at stop (min)", "Zeitpuffer bei Ende (min)", @@ -2189,6 +2338,7 @@ const tI18nPhrase Phrases[] = { "Marginal för stopp (min)", "Margine la oprire (min)", "Idöeltolódás a befejezésnél", + "Acavar la gravació després de (min)", }, { "Setup.Recording$Primary limit", "Primär-Limit", @@ -2200,11 +2350,12 @@ const tI18nPhrase Phrases[] = { "Prioritetsgrense HovedDVB", "PrimaryLimit", "Pierwotny limit", - "L'mite primario", + "Límite primario", "Protevon orio", "Primär gräns", "Limita Primara", "Primér-határ", + "Límit primari", }, { "Setup.Recording$Default priority", "Default Priorität", @@ -2221,6 +2372,7 @@ const tI18nPhrase Phrases[] = { "Normal prioritet", "Prioritate implicita", "Default priority", + "Prioritat per defecte", }, { "Setup.Recording$Pause lifetime (d)", "Pause Lebensdauer (d)", @@ -2237,6 +2389,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO + "Duració de la pausa (d)", }, { "Setup.Recording$Pause priority", "Pause Priorität", @@ -2253,6 +2406,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO + "Prioritat de la pausa", }, { "Setup.Recording$Default lifetime (d)", "Default Lebensdauer (d)", @@ -2269,6 +2423,7 @@ const tI18nPhrase Phrases[] = { "Normal livstid", "Durata predefinita", "Default élettartam", + "Duració predefinida", }, { "Setup.Recording$Use episode name", "Episodenname verwenden", @@ -2285,6 +2440,7 @@ const tI18nPhrase Phrases[] = { "Använd episodnamn", "Utilizeaza numele episodului", "Epizódnév felhasználása", + "Utilitzar el nom de l'episodi", }, { "Setup.Recording$Mark instant recording", "Direktaufzeichnung markieren", @@ -2301,6 +2457,7 @@ const tI18nPhrase Phrases[] = { "Märk direktinspelning", "Inregistrare imediata", "Direktfelvétel megjelölése", + "Marcar gravació instantània", }, { "Setup.Recording$Name instant recording", "Direktaufzeichnung benennen", @@ -2317,6 +2474,7 @@ const tI18nPhrase Phrases[] = { "Namnge direktinspelning", "Nume inregistrare imediata", "Direktfelvétel megnevezése", + "Anomenar gravacions instantànies", }, { "Setup.Recording$Instant rec. time (min)", "Dauer der Direktaufzeichnung (min)", @@ -2328,11 +2486,12 @@ const tI18nPhrase Phrases[] = { "",//TODO "Pikanauhoituksen pituus (min)", "",//TODO - "",//TODO + "Tiempo de grabación instantánea (min)", "Stigmiees egrafes xronos (lepta)", "Direktinspelning längd (min)", "Timpul de inregistarea imediata (min)", "Felvétel idötartama", + "Temps de gravació instantània (min)", }, { "Setup.Recording$Record Dolby Digital", "Dolby Digital Ton aufzeichnen", @@ -2349,6 +2508,7 @@ const tI18nPhrase Phrases[] = { "Spela in ljud med Dolby Digital", "Inregistreaza Dolby Digital", "Dolby Digitál felvétel", + "Gravar el sò en Dolby Digital", }, { "Setup.Recording$Max. video file size (MB)", "Max. Video Dateigröße (MB)", @@ -2360,11 +2520,12 @@ const tI18nPhrase Phrases[] = { "Maksimal størrelse på videofiler (MB)", "Maksimi tiedoston koko (MB)", "Maks. wielkosc pliku (MB)", - "Tamaño máx. ficheros (MB)", + "Tamaño máx. de fichero (MB)", "Megisto megethos arxeiou (MB)", "Maximal filstorlek för inspelning (MB)", "Dimensiune maxima a fisierului video (MB)", "Max. video File-terjedelem (MB)", + "Tamany màxim de l'arxiu (MB)", }, { "Setup.Recording$Split edited files", "Editierte Dateien aufteilen", @@ -2381,6 +2542,7 @@ const tI18nPhrase Phrases[] = { "Dela upp editerade filer", "Separare fisiere editate", "Feldolgozott File-k felosztása", + "Separar arxius", }, { "Setup.Replay$Multi speed mode", "MultiSpeed Modus", @@ -2397,6 +2559,7 @@ const tI18nPhrase Phrases[] = { "Multispeed mode", "Mod multi-rata", "MultiSpeed funkció", + "Mode de multi-velocitat", }, { "Setup.Replay$Show replay mode", "Wiedergabestatus anzeigen", @@ -2413,6 +2576,7 @@ const tI18nPhrase Phrases[] = { "Visa uppspelnings mode", "Afiseaza modul de redare", "Lejátszás feltüntetése", + "Mostrar mode de reproducció", }, { "Setup.Replay$Resume ID", "Wiedergabe ID", @@ -2424,11 +2588,12 @@ const tI18nPhrase Phrases[] = { "Resume ID",// TODO "Resume ID",// TODO "Resume ID",// TODO + "Continuar ID", "Resume ID",// TODO "Resume ID",// TODO "Resume ID",// TODO "Resume ID",// TODO - "Resume ID",// TODO + "Continuar ID", }, { "Setup.Miscellaneous$Min. event timeout (min)", "Mindest Event Pause (min)", @@ -2445,6 +2610,7 @@ const tI18nPhrase Phrases[] = { "Minsta händelse-pause (min)", "MinEventTimeout (min)", "Min. esemény szünet (min)", + "Temps mínim en pausa (min)", }, { "Setup.Miscellaneous$Min. user inactivity (min)", "Mindest Benutzer-Inaktivität (min)", @@ -2461,6 +2627,7 @@ const tI18nPhrase Phrases[] = { "Minsta anändar-inaktivitet (min)", "Durata minima de inactivitate (min)", "Min. kezelési aktivitás (min)", + "Temps mínim d'inactivitat (min)", }, { "Setup.Miscellaneous$SVDRP timeout (s)", "SVDRP Timeout (s)", @@ -2472,11 +2639,12 @@ const tI18nPhrase Phrases[] = { "Ubrukt SVDRP-levetid (s)", "SVDRP odotusaika (s)", "Min. brak aktywnosci SVDRP (s)", - "SVDRP interrupción (s)", + "SVDRP Timeout (s)", "SVDRP Timeout (d)", "SVDRP Timeout (d)", "Timeout SVDRP (sec)", "SVDRP Timeout (s)", + "SVDRP Timeout (s)", }, // The days of the week: { "MTWTFSS", @@ -2494,6 +2662,7 @@ const tI18nPhrase Phrases[] = { "MTOTFLS", "LMMJVSD", "HKSCPSV", + "LMXJVSU", }, { "MonTueWedThuFriSatSun", // must all be 3 letters! "MonDieMitDonFreSamSon", @@ -2510,6 +2679,7 @@ const tI18nPhrase Phrases[] = { "MånTisOnsTorFreLörSön", "LunMarMieJoiVinSimDum", "HétKedSzeCsüPénSzoVas", + "DllDimDmcDijDivDisDiu", }, // The allowed characters in strings: { " abcdefghijklmnopqrstuvwxyz0123456789-.#~", @@ -2527,6 +2697,7 @@ const tI18nPhrase Phrases[] = { " abcdefghijklmnopqrstuvxyzåäö0123456789-.#~", " abcdefghijklmnopqrstuvwxyz0123456789-.#~", " aábcdeéfghijklmnoóöpqrstuúüvwxyz0123456789-.,#~", + " aàbcçdeéèfghiíjklmnoòpqrstuúvwxyz0123456789-.,#~_·", }, // Learning keys: { "Learning Remote Control Keys (%s)", @@ -2544,6 +2715,7 @@ const tI18nPhrase Phrases[] = { "Inlärning av fjärrkontrollsknappar (%s)", "Invatare taste telecomanda (%s)", "Távirányító betanítása (%s)", + "Aprenent les tecles del comandament a distància (%s)", }, { "Phase 1: Detecting RC code type", "Phase 1: FB Code feststellen", @@ -2560,6 +2732,7 @@ const tI18nPhrase Phrases[] = { "Steg1: identifiering av RC kod", "Faza 1: Detectie tip telecomanda", "Elsö lépés: távirányító kódjának meghatározása", + "Fase 1: Detectant el tipus de receptor", }, { "Press any key on the RC unit", "Eine Taste auf der FB drücken", @@ -2576,6 +2749,7 @@ const tI18nPhrase Phrases[] = { "Tryck valfri tangent på fjärrkontrollen", "Apasati o tasta pe telecomanda", "Nyomjon meg egy gombot a távirányítón", + "Premi qualsevol tecla del comandament", }, { "RC code detected!", "FB Code erkannt!", @@ -2592,6 +2766,7 @@ const tI18nPhrase Phrases[] = { "RC koden detekterad!", "S-a detectat tipul telecomenzii!", "Távirányító kódja felismerve!", + "Codi detectat!", }, { "Do not press any key...", "Keine Taste drücken...", @@ -2603,11 +2778,12 @@ const tI18nPhrase Phrases[] = { "Ikke trykk på noen av tastene...", "Älä paina mitään näppäintä...", "Nie naciskac klawiszy...", - "No pulse tecla...", + "No pulse ninguna tecla...", "Min piezeis pliktra...", "Tryck inte på någon knapp...", "Nu apasati nicio tasta...", "Ne nyomjon meg gombot...", + "No premi cap tecla...", }, { "Phase 2: Learning specific key codes", "Phase 2: Einzelne Tastencodes lernen", @@ -2624,6 +2800,7 @@ const tI18nPhrase Phrases[] = { "Fas 2: Inlärning av specifika knapp koder", "Faza 2: Invatarea codurilor specifice tastelor", "Második lépés: az egyes gombok betanítása", + "Fase 2: Aprenentantge de les funcions", }, { "Press key for '%s'", "Taste für '%s' drücken", @@ -2640,6 +2817,7 @@ const tI18nPhrase Phrases[] = { "Tryck på knappen för '%s'", "Apasati tasta pentru '%s'", "'%s' gomb megnyomása", + "Premi una tecla per '%s'", }, { "Press 'Up' to confirm", "'Auf' drücken zum Bestätigen", @@ -2656,6 +2834,7 @@ const tI18nPhrase Phrases[] = { "Tryck 'Upp' för att bekräfta", "Apsati 'Sus' pentru confirmare", "'Fel' megnyomása az elfogadáshoz", + "Premi 'Amunt' per confirmar", }, { "Press 'Down' to continue", "'Ab' drücken zum Weitermachen", @@ -2672,6 +2851,7 @@ const tI18nPhrase Phrases[] = { "Tryck 'Ner' för att bekräfta", "Apasati jos pentru continuare", "'Le' megnyomása a folytatáshoz", + "Premi 'Avall' per continuar", }, { "(press 'Up' to go back)", "('Auf' drücken um zurückzugehen)", @@ -2688,6 +2868,7 @@ const tI18nPhrase Phrases[] = { "(Tryck 'Upp' för att backa)", "(Apsati 'Sus' pentru revenire)", "(´Fel' megnyomása a visszatéréshez)", + "(Premi 'Amunt' per retornar)", }, { "(press 'Down' to end key definition)", "('Ab' drücken zum Beenden)", @@ -2704,6 +2885,7 @@ const tI18nPhrase Phrases[] = { "(Tryck 'Ner' för att avsluta knapp definition)", "(Apasati 'Jos' pentru terminare)", "('Le' megnyomása a befejezéshez)", + "(Premi 'Avall' per finalitzar l'aprenentatge)", }, { "(press 'Menu' to skip this key)", "('Menü' drücken zum Überspringen)", @@ -2715,11 +2897,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "(Paina 'Valikko' jos näppäintä ei ole)", "",// TODO - "",// TODO + "Pulse 'Menu' para saltarse esta tecla", "Pata 'Menou' gia prosperasi aftou tou pliktrou", "",// TODO "",// TODO "",// TODO + "Premi 'Menu' per obviar aquesta tecla", }, { "Phase 3: Saving key codes", "Phase 3: Codes abspeichern", @@ -2736,6 +2919,7 @@ const tI18nPhrase Phrases[] = { "Fas 3: Spara knappkoder", "Faza 3: Salvarea codurilor de taste", "Harmadik lépés: kód mentése", + "Fase 3: Guardant els codis de les tecles", }, { "Press 'Up' to save, 'Down' to cancel", "'Auf' speichert, 'Ab' bricht ab", @@ -2747,11 +2931,12 @@ const tI18nPhrase Phrases[] = { "Trykk 'Opp' for å lagre, 'Ned' for å avbryte", "Paina 'Ylös' tallettaaksesi ja 'Alas' peruuttaaksesi", "'Gora' zapamietuje, 'Dol' przerywa", - "Pulse 'Arriba' para guarder, 'Abajo' para anular", + "Pulse 'Arriba' para guardar, 'Abajo' para anular", "'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", + "Premi 'Amunt' per guardar, 'Avall' per anul.lar", }, // Key names: { "Up", @@ -2769,6 +2954,7 @@ const tI18nPhrase Phrases[] = { "Upp", "Sus", "Fel", + "Amunt", }, { "Down", "Ab", @@ -2785,6 +2971,7 @@ const tI18nPhrase Phrases[] = { "Ner", "Jos", "Le", + "Avall", }, { "Menu", "Menü", @@ -2801,6 +2988,7 @@ const tI18nPhrase Phrases[] = { "Meny", "Meniu", "Menü", + "Menú", }, { "Ok", "Ok", @@ -2817,6 +3005,7 @@ const tI18nPhrase Phrases[] = { "Ok", "Ok", "Ok", + "Ok", }, { "Back", "Zurück", @@ -2833,6 +3022,7 @@ const tI18nPhrase Phrases[] = { "Tillbaka", "Inapoi", "Vissza", + "Retornar", }, { "Left", "Links", @@ -2849,6 +3039,7 @@ const tI18nPhrase Phrases[] = { "Vänster", "Stinga", "Balra", + "Esquerra", }, { "Right", "Rechts", @@ -2865,6 +3056,7 @@ const tI18nPhrase Phrases[] = { "Höger", "Dreapta", "Jobbra", + "Dreta" }, { "Red", "Rot", @@ -2881,6 +3073,7 @@ const tI18nPhrase Phrases[] = { "Röd", "Rosu", "Piros", + "Vermell" }, { "Green", "Grün", @@ -2897,6 +3090,7 @@ const tI18nPhrase Phrases[] = { "Grön", "Verde", "Zöld", + "Verd", }, { "Yellow", "Gelb", @@ -2913,6 +3107,7 @@ const tI18nPhrase Phrases[] = { "Gul", "Galben", "Sárga", + "Groc", }, { "Blue", "Blau", @@ -2929,6 +3124,7 @@ const tI18nPhrase Phrases[] = { "Blå", "Albastru", "Kék", + "Blau", }, { "Play", "Wiedergabe", @@ -2940,11 +3136,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Reproducir", "Anametadosi", "Spela upp", "",// TODO "",// TODO + "Reproduir", }, { "Pause", "Pause", @@ -2956,11 +3153,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Pausa", "Dialima", "Pausa", "",// TODO "",// TODO + "Pausa", }, { "Stop", "Stop", @@ -2972,11 +3170,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Parar", "Terma", "Stoppa", "",// TODO "",// TODO + "Parar", }, { "Record", "Aufnehmen", @@ -2988,11 +3187,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Grabar", "Egrafi", "Spela in", "",// TODO "",// TODO + "Gravar", }, { "FastFwd", "Vorlauf", @@ -3004,11 +3204,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Adelante rápido", "Girisma mprosta", "Spola framåt", "",// TODO "",// TODO + "Endavant ràpidament", }, { "FastRew", "Rücklauf", @@ -3020,11 +3221,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Atrás rápido", "Girisma piso", "Spola bakåt", "",// TODO "",// TODO + "Enrera ràpidament", }, { "Power", "Ausschalten", @@ -3041,6 +3243,7 @@ const tI18nPhrase Phrases[] = { "På/Av", "Pornit", "Kikapcsolni", + "Parar", }, { "Channel+", "Kanal+", @@ -3052,11 +3255,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Canal +", "Kanali+", "Kanal+", "",// TODO "",// TODO + "Canal +", }, { "Channel-", "Kanal-", @@ -3068,11 +3272,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "Canal -", "Kanali-", "Kanal-", "",// TODO "",// TODO + "Canal -", }, { "Volume+", "Lautstärke+", @@ -3089,6 +3294,7 @@ const tI18nPhrase Phrases[] = { "Volym+", "Volum+", "Hangerö+", + "Volum +", }, { "Volume-", "Lautstärke-", @@ -3105,6 +3311,7 @@ const tI18nPhrase Phrases[] = { "Volym-", "Volum-", "Hangerö-", + "Volum -", }, { "Mute", "Stumm", @@ -3121,6 +3328,7 @@ const tI18nPhrase Phrases[] = { "Ljud Av", "Mut(e)", "Csend", + "En silenci", }, // Miscellaneous: { "yes", @@ -3138,6 +3346,7 @@ const tI18nPhrase Phrases[] = { "ja", "da", "igen", + "sí", }, { "no", "nein", @@ -3154,6 +3363,7 @@ const tI18nPhrase Phrases[] = { "nej", "nu", "nem", + "no", }, { "off", "aus", @@ -3165,11 +3375,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "off", "klisto", "av", "",// TODO "",// TODO + "off", }, { "none", "keine", @@ -3181,11 +3392,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "ninguno" "kanena", "",// TODO "",// TODO "",// TODO + "cap", }, { "auto", "auto", @@ -3197,11 +3409,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO - "",// TODO + "auto", "aftomato", "",// TODO "",// TODO "",// TODO + "auto", }, { "top", "oben", @@ -3213,11 +3426,12 @@ const tI18nPhrase Phrases[] = { "øvre", "ylä", "gora", - "parte sup.", + "parte superior", "pano", "övre", "sus", "Fent", + "a dalt", }, { "bottom", "unten", @@ -3229,11 +3443,12 @@ const tI18nPhrase Phrases[] = { "nedre", "ala", "dol", - "fondo", + "parte inferior", "kato", "nedre", "jos", "lent", + "a baix", }, { "Disk", "Disk", @@ -3250,6 +3465,7 @@ const tI18nPhrase Phrases[] = { "Disk", "Disc", "Lemez", + "Disc" }, { "free", "frei", @@ -3266,6 +3482,7 @@ const tI18nPhrase Phrases[] = { "ledigt", "liber", "szabad", + "lliure" }, { "Jump: ", // note the trailing blank "Springen: ", @@ -3277,11 +3494,12 @@ const tI18nPhrase Phrases[] = { "Hopp: ", "Hyppää: ", "Skok: ", - "Saltar: ", + "Salta a: ", "Pidima: ", "Hopp: ", "Salt: ", "Ugrás: ", + "Salta a:" }, { "Volume ", // note the trailing blank "Lautstärke ", @@ -3298,6 +3516,7 @@ const tI18nPhrase Phrases[] = { "Volym ", "Volum ", "Hangerö ", + "Volum ", }, { " Stop replaying", // note the leading blank! " Wiedergabe beenden", @@ -3314,6 +3533,7 @@ const tI18nPhrase Phrases[] = { " Avsluta uppspelning", " Opreste redare", " Lejátszást befejzni", + " Parar la reproducció", }, { " Stop recording ", // note the leading and trailing blanks! " Aufzeichnung beenden ", @@ -3330,6 +3550,7 @@ const tI18nPhrase Phrases[] = { " Avsluta inspelning ", " Opreste inregistrarea ", " Felvételt befejezni ", + " Parar la gravació ", }, { " Cancel editing", // note the leading blank! " Schneiden abbrechen", @@ -3341,11 +3562,12 @@ const tI18nPhrase Phrases[] = { " Avbryt redigering", " Peruuta muokkaus", " Przerwac montaz", - " Anular modificación", + " Anular modificación ", " Akirosi epexsergasias", " Avbryt editering", " Opreste editare", " Vágást megszakítani", + " Cancel·lar l'edició ", }, { "Switching primary DVB...", "Primäres Interface wird umgeschaltet...", @@ -3357,11 +3579,12 @@ const tI18nPhrase Phrases[] = { "Bytter første DVB-enhet...", "Vaihdetaan ensisijainen vastaanotin...", "Pierwszy interfejs DVB przelacza...", - "Cambio interface primario...", + "Cambio al interface DVB primario...", "I protevon DVB Karta alazi...", "Byter primär DVB enhet...", "Comuta interfata primara DVB...", "Primér Interface átkapcsolva...", + "Canviant a la interfície DVB primària...", }, { "Up/Dn for new location - OK to move", "Auf/Ab für neue Position - dann OK", @@ -3373,11 +3596,12 @@ const tI18nPhrase Phrases[] = { "Opp/Ned for ny plass - OK for å flytte", "Ylös/Alas = liiku, OK = siirrä", "Gora/Dol na nowa pozycje - Ok zmienia", - "Arriba/Abajo para nuevo lugar - OK para mover", + "Arriba/Abajo para el nuevo lugar - OK para mover", "Pano/Kato gia nea thesi. meta OK", "Upp/Ner för ny plats - OK för att flytta", "Sus/Jos pentru noua locatie - OK pentru a muta", "Fel/Le egy uj opcióért - aztán OK", + "Amunt/Avall per una nova localització - OK per moure", }, { "Editing process started", "Schnitt gestartet", @@ -3394,6 +3618,7 @@ const tI18nPhrase Phrases[] = { "Editering startad", "Procesul de editare a inceput", "Vágás elindítva", + "Procés d'edició iniciat", }, { "Editing process finished", "Schnitt beendet", @@ -3405,11 +3630,12 @@ const tI18nPhrase Phrases[] = { "Redigeringsprosess avsluttet", "Muokkaus lopetettu", "Proces montazu zakonczony", - "Proceso modificacion terminado", + "Proceso de modificación terminado", "I epexsergasia teliose", "Editering avslutad", "Procesul de editare s-a terminat", "Vágás befejezve", + "Procés d'edició finalitzat", }, { "Editing process failed!", "Schnitt gescheitert!", @@ -3426,6 +3652,7 @@ const tI18nPhrase Phrases[] = { "Editeringsprocessen misslyckades", "Proces de editare nereusit", "Vágás sikertelen!", + "Procés d'edició fallit!", }, { "scanning recordings...", "Aufzeichnungen werden durchsucht...", @@ -3442,6 +3669,7 @@ const tI18nPhrase Phrases[] = { "Söker igenom inspelningarna...", "Caut inregistrari...", "Felvett adások böngészése...", + "cercant gravacions...", }, { "Pausing live video...", "Live-Signal wird angehalten...", @@ -3453,11 +3681,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "",// TODO "",// TODO + "Emisión en directo parada...", "",// TODO "",// TODO "",// TODO "",// TODO - "",// TODO + "Pausa d'emissió en directe..." }, { "This plugin has no setup parameters!", "Dieses Plugin hat keine Setup-Parameter!", @@ -3469,11 +3698,12 @@ const tI18nPhrase Phrases[] = { "",// TODO "Tällä laajennoksella ei ole asetuksia!", "",// TODO - "",// TODO + "Este plugin no admite configuración", "Afto to plugin den exi parametrous", "",// TODO "",// TODO "",// TODO + "Aquest plugin no admet configuració!", }, { NULL } }; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.h 1.5 2002/06/22 09:12:21 kls Exp $ + * $Id: i18n.h 1.6 2003/05/16 12:48:52 kls Exp $ */ #ifndef __I18N_H @@ -12,7 +12,7 @@ #include <stdio.h> -const int I18nNumLanguages = 15; +const int I18nNumLanguages = 16; typedef const char *tI18nPhrase[I18nNumLanguages]; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.243 2003/05/11 13:58:13 kls Exp $ + * $Id: menu.c 1.245 2003/05/16 12:40:12 kls Exp $ */ #include "menu.h" @@ -2909,7 +2909,7 @@ eOSState cDisplayVolume::ProcessKey(eKeys Key) // --- cRecordControl -------------------------------------------------------- -cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause = false) +cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause) { eventInfo = NULL; instantId = NULL; @@ -3494,7 +3494,9 @@ void cReplayControl::EditCut(void) if (fileName) { Hide(); if (!cCutter::Active()) { - if (!cCutter::Start(fileName)) + if (!marks.Count()) + Interface->Error(tr("No editing marks defined!")); + else if (!cCutter::Start(fileName)) Interface->Error(tr("Can't start editing process!")); else Interface->Info(tr("Editing process started")); @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recorder.c 1.5 2003/01/25 16:23:36 kls Exp $ + * $Id: recorder.c 1.6 2003/05/16 13:33:04 kls Exp $ */ #include <stdarg.h> @@ -16,6 +16,10 @@ // (must be larger than MINVIDEODATA - see remux.h) #define VIDEOBUFSIZE MEGABYTE(5) +// The maximum time we wait before assuming that a recorded video data stream +// is broken: +#define MAXBROKENTIMEOUT 30 // seconds + #define MINFREEDISKSPACE (512) // MB #define DISKCHECKINTERVAL 100 // seconds @@ -110,6 +114,7 @@ void cRecorder::Action(void) { dsyslog("recording thread started (pid=%d)", getpid()); + time_t t = time(NULL); active = true; while (active) { int r; @@ -134,6 +139,12 @@ void cRecorder::Action(void) else break; } + t = time(NULL); + } + else if (time(NULL) - t > MAXBROKENTIMEOUT) { + esyslog("ERROR: video data stream broken"); + cThread::EmergencyExit(true); + t = time(NULL); } else usleep(1); // this keeps the CPU load low diff --git a/recording.c b/recording.c index 3610382..9105157 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.77 2003/05/11 13:09:08 kls Exp $ + * $Id: recording.c 1.78 2003/05/18 15:17:45 kls Exp $ */ #include "recording.h" @@ -764,9 +764,6 @@ void cRecordingUserCommand::InvokeCommand(const char *State, const char *Recordi #define INDEXFILESUFFIX "/index.vdr" -// The maximum time to wait before giving up while catching up on an index file: -#define MAXINDEXCATCHUP 2 // seconds - // The minimum age of an index file for considering it no longer to be written: #define MININDEXAGE 3600 // seconds @@ -850,50 +847,47 @@ 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; - if (fstat(f, &buf) == 0) { - if (time(NULL) - buf.st_mtime > MININDEXAGE) { - // apparently the index file is not being written any more - close(f); - f = -1; - break; - } - int newLast = buf.st_size / sizeof(tIndex) - 1; - if (newLast > last) { - if (size <= newLast) { - size *= 2; - if (size <= newLast) - size = newLast + 1; - } - index = (tIndex *)realloc(index, size * sizeof(tIndex)); - if (index) { - int offset = (last + 1) * sizeof(tIndex); - int delta = (newLast - last) * sizeof(tIndex); - if (lseek(f, offset, SEEK_SET) == offset) { - if (safe_read(f, &index[last + 1], delta) != delta) { - esyslog("ERROR: can't read from index"); - free(index); - index = NULL; - close(f); - f = -1; - break; - } - last = newLast; - } - else - LOG_ERROR_STR(fileName); - } - else - esyslog("ERROR: can't realloc() index"); - } - } - else - LOG_ERROR_STR(fileName); - if (Index < last) - break; - sleep(1); - } + if (Index < 0 || Index >= last) { + struct stat buf; + if (fstat(f, &buf) == 0) { + if (time(NULL) - buf.st_mtime > MININDEXAGE) { + // apparently the index file is not being written any more + close(f); + f = -1; + return true; + } + int newLast = buf.st_size / sizeof(tIndex) - 1; + if (newLast > last) { + if (size <= newLast) { + size *= 2; + if (size <= newLast) + size = newLast + 1; + } + index = (tIndex *)realloc(index, size * sizeof(tIndex)); + if (index) { + int offset = (last + 1) * sizeof(tIndex); + int delta = (newLast - last) * sizeof(tIndex); + if (lseek(f, offset, SEEK_SET) == offset) { + if (safe_read(f, &index[last + 1], delta) != delta) { + esyslog("ERROR: can't read from index"); + free(index); + index = NULL; + close(f); + f = -1; + return true; + } + last = newLast; + } + else + LOG_ERROR_STR(fileName); + } + else + esyslog("ERROR: can't realloc() index"); + } + } + else + LOG_ERROR_STR(fileName); + } } return index != NULL; } diff --git a/ringbuffer.c b/ringbuffer.c index 770b7c3..2cf9d75 100644 --- a/ringbuffer.c +++ b/ringbuffer.c @@ -7,7 +7,7 @@ * Parts of this file were inspired by the 'ringbuffy.c' from the * LinuxDVB driver (see linuxtv.org). * - * $Id: ringbuffer.c 1.16 2003/05/11 09:47:56 kls Exp $ + * $Id: ringbuffer.c 1.17 2003/05/12 17:38:11 kls Exp $ */ #include "ringbuffer.h" @@ -23,6 +23,7 @@ cRingBuffer::cRingBuffer(int Size, bool Statistics) statistics = Statistics; maxFill = 0; lastPercent = 0; + putTimeout = getTimeout = 0; } cRingBuffer::~cRingBuffer() @@ -31,6 +32,42 @@ cRingBuffer::~cRingBuffer() dsyslog("buffer stats: %d (%d%%) used", maxFill, maxFill * 100 / (size - 1)); } +void cRingBuffer::WaitForPut(void) +{ + if (putTimeout) { + putMutex.Lock(); + readyForPut.TimedWait(putMutex, putTimeout); + putMutex.Unlock(); + } +} + +void cRingBuffer::WaitForGet(void) +{ + if (getTimeout) { + getMutex.Lock(); + readyForGet.TimedWait(getMutex, getTimeout); + getMutex.Unlock(); + } +} + +void cRingBuffer::EnablePut(void) +{ + if (putTimeout) + readyForPut.Broadcast(); +} + +void cRingBuffer::EnableGet(void) +{ + if (getTimeout) + readyForGet.Broadcast(); +} + +void cRingBuffer::SetTimeouts(int PutTimeout, int GetTimeout) +{ + putTimeout = PutTimeout; + getTimeout = GetTimeout; +} + // --- cRingBufferLinear ----------------------------------------------------- cRingBufferLinear::cRingBufferLinear(int Size, int Margin, bool Statistics) @@ -68,6 +105,8 @@ void cRingBufferLinear::Clear(void) head = tail = margin; lastGet = -1; Unlock(); + EnablePut(); + EnableGet(); } int cRingBufferLinear::Put(const uchar *Data, int Count) @@ -109,6 +148,9 @@ int cRingBufferLinear::Put(const uchar *Data, int Count) else Count = 0; Unlock(); + EnableGet(); + if (Count == 0) + WaitForPut(); } return Count; } @@ -134,6 +176,8 @@ uchar *cRingBufferLinear::Get(int &Count) Count = lastGet = cont; } Unlock(); + if (!p) + WaitForGet(); return p; } @@ -146,6 +190,7 @@ void cRingBufferLinear::Del(int Count) if (tail >= Size()) tail = margin; Unlock(); + EnablePut(); } else esyslog("ERROR: invalid Count in cRingBufferLinear::Del: %d", Count); @@ -196,6 +241,8 @@ void cRingBufferFrame::Clear(void) while ((p = Get()) != NULL) Drop(p); Unlock(); + EnablePut(); + EnableGet(); } bool cRingBufferFrame::Put(cFrame *Frame) @@ -212,6 +259,7 @@ bool cRingBufferFrame::Put(cFrame *Frame) } currentFill += Frame->Count(); Unlock(); + EnableGet(); return true; } return false; @@ -249,6 +297,7 @@ void cRingBufferFrame::Drop(cFrame *Frame) esyslog("ERROR: attempt to drop wrong frame from ring buffer!"); } Unlock(); + EnablePut(); } int cRingBufferFrame::Available(void) diff --git a/ringbuffer.h b/ringbuffer.h index 6b25662..1506345 100644 --- a/ringbuffer.h +++ b/ringbuffer.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ringbuffer.h 1.11 2003/05/11 09:48:23 kls Exp $ + * $Id: ringbuffer.h 1.12 2003/05/12 17:35:10 kls Exp $ */ #ifndef __RINGBUFFER_H @@ -16,11 +16,19 @@ class cRingBuffer { private: cMutex mutex; + cCondVar readyForPut, readyForGet; + cMutex putMutex, getMutex; + int putTimeout; + int getTimeout; int size; protected: int maxFill;//XXX int lastPercent; bool statistics;//XXX + void WaitForPut(void); + void WaitForGet(void); + void EnablePut(void); + void EnableGet(void); virtual void Clear(void) = 0; virtual int Available(void) = 0; int Free(void) { return size - Available() - 1; } @@ -30,6 +38,7 @@ protected: public: cRingBuffer(int Size, bool Statistics = false); virtual ~cRingBuffer(); + void SetTimeouts(int PutTimeout, int GetTimeout); }; class cRingBufferLinear : public cRingBuffer { @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.c 1.24 2003/05/03 14:03:32 kls Exp $ + * $Id: thread.c 1.25 2003/05/18 12:45:13 kls Exp $ */ #include "thread.h" @@ -61,6 +61,7 @@ bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs) if (pthread_cond_timedwait(&cond, &Mutex.mutex, &abstime) == ETIMEDOUT) r = false; Mutex.locked = locked; + Mutex.lockingPid = getpid(); } } return r; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: transfer.c 1.12 2003/05/11 08:48:05 kls Exp $ + * $Id: transfer.c 1.13 2003/05/18 15:22:09 kls Exp $ */ #include "transfer.h" @@ -70,7 +70,7 @@ void cTransfer::Action(void) active = true; while (active) { - //XXX+ Maybe we need this to avoid "buffer empty" log messages from the driver. + //XXX+ Maybe we need this to avoid buffer underruns in driver. //XXX+ But then again, it appears to play just fine without this... /* if (!gotBufferReserve) { @@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/people/kls/vdr * - * $Id: vdr.c 1.154 2003/05/11 08:39:09 kls Exp $ + * $Id: vdr.c 1.155 2003/05/16 12:11:45 kls Exp $ */ #include <getopt.h> @@ -399,6 +399,11 @@ int main(int argc, char *argv[]) Interface = new cInterface(SVDRPport); + // Start plugins: + + if (!PluginManager.StartPlugins()) + return 2; + // Remote Controls: #if defined(REMOTE_RCU) new cRcuRemote("/dev/ttyS1"); @@ -444,11 +449,6 @@ int main(int argc, char *argv[]) alarm(WatchdogTimeout); // Initial watchdog timer start } - // Start plugins: - - if (!PluginManager.StartPlugins()) - return 2; - // Main program loop: cOsdObject *Menu = NULL; |