diff options
-rw-r--r-- | CONTRIBUTORS | 12 | ||||
-rw-r--r-- | HISTORY | 20 | ||||
-rw-r--r-- | config.h | 4 | ||||
-rw-r--r-- | eit.c | 8 | ||||
-rw-r--r-- | epg.c | 5 | ||||
-rw-r--r-- | epg.h | 3 | ||||
-rw-r--r-- | i18n.c | 33 | ||||
-rw-r--r-- | recording.c | 6 | ||||
-rw-r--r-- | thread.c | 4 | ||||
-rw-r--r-- | thread.h | 4 |
10 files changed, 81 insertions, 18 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 6d85336..6e79bc3 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1468,6 +1468,8 @@ Udo Richter <udo_richter@gmx.de> for reporting a problem with cPlugin::ConfigDirectory() in case a plugin calls it from a separate thread for reporting that an assignment in svdrp.c didn't use the cTimer::operator=()) + for suggesting that the function cThread::Cancel() should only set 'running' to + false and not actually kill the thread if the special value -1 is given Sven Kreiensen <svenk@kammer.uni-hannover.de> for his help in keeping 'channels.conf.terr' up to date @@ -1821,6 +1823,8 @@ Petri Hintukainen <Petri.Hintukainen@hut.fi> the Makefile to avoid a crash in case a new version is installed on a running system for fixing handling video directory updates in case the timestamp of the .update file is in the future + for fixing handling video directory updates in case an other process has touched the + .update file after the last NeedsUpdate() check Marcel Schaeben <mts280@gmx.de> for his "Easy Input" patch @@ -2003,3 +2007,11 @@ Matthias Schwarzott <zzam@gentoo.org> Martin Ostermann <martin@familie-ostermann.de> for fixing processing the PDCDescriptor in 'libsi' on big endian systems + +Boguslaw Juza <bogdan@uci.agh.edu.pl> + for reporting that there are stations that use blanks in the language codes + for reporting that events without an ExtendedEventDescriptor may get duplicate + information in their ShortText through the EPG bugfixes in case they are received + again + for reporting a problem with language codes of recorded audio tracks on channels with + multiple tracks @@ -4930,3 +4930,23 @@ Video Disk Recorder Revision History 2006-09-23: Version 1.4.3 - Official release. + +2006-10-08: Version 1.4.3-1 + +- The function cThread::Cancel() now only sets 'running' to false and does not + actually kill the thread if the special value -1 is given (suggested by Udo Richter). +- Changed the I18nNormalizeLanguageCode() check to also allow blanks (and all other + printable characters) in the language codes (thanks to Boguslaw Juza for reporting + that there are stations that use blanks in these codes). Blanks are replaced with + underlines, so that all parts of VDR that rely on language codes to be one word + (without blanks) work as expected. +- Now clearing an event's Title, ShortText and Description if there is no + ShortEventDescriptor or ExtendedEventDescriptor, respectively (thanks to Boguslaw + Juza for reporting that events without an ExtendedEventDescriptor may get + duplicate information in their ShortText through the EPG bugfixes in case they + are received again). +- Fixed handling video directory updates in case an other process has touched the + .update file after the last NeedsUpdate() check (thanks to Petri Hintukainen). +- Fixed handling language codes and descriptions of recorded audio tracks on channels + with multiple tracks where not all of them appear in the event data (reported by + Boguslaw Juza). @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.271 2006/09/23 13:56:08 kls Exp $ + * $Id: config.h 1.272 2006/09/24 10:09:25 kls Exp $ */ #ifndef __CONFIG_H @@ -21,7 +21,7 @@ // VDR's own version number: -#define VDRVERSION "1.4.3" +#define VDRVERSION "1.4.3-1" #define VDRVERSNUM 10403 // Version * 10000 + Major * 100 + Minor // The plugin API's version number: @@ -8,7 +8,7 @@ * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>. * - * $Id: eit.c 1.120 2006/08/05 10:01:21 kls Exp $ + * $Id: eit.c 1.121 2006/10/07 12:32:24 kls Exp $ */ #include "eit.h" @@ -234,10 +234,16 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo pEvent->SetTitle(ShortEventDescriptor->name.getText(buffer, sizeof(buffer))); pEvent->SetShortText(ShortEventDescriptor->text.getText(buffer, sizeof(buffer))); } + else { + pEvent->SetTitle(NULL); + pEvent->SetShortText(NULL); + } if (ExtendedEventDescriptors) { char buffer[ExtendedEventDescriptors->getMaximumTextLength(": ") + 1]; pEvent->SetDescription(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": ")); } + else + pEvent->SetDescription(NULL); } delete ExtendedEventDescriptors; delete ShortEventDescriptor; @@ -7,7 +7,7 @@ * Original version (as used in VDR before 1.3.0) written by * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * - * $Id: epg.c 1.79 2006/08/05 10:04:17 kls Exp $ + * $Id: epg.c 1.80 2006/10/07 13:47:28 kls Exp $ */ #include "epg.h" @@ -87,7 +87,8 @@ void cComponents::SetComponent(int Index, uchar Stream, uchar Type, const char * tComponent *cComponents::GetComponent(int Index, uchar Stream, uchar Type) { for (int i = 0; i < numComponents; i++) { - if (components[i].stream == Stream && components[i].type == Type) { + // In case of an audio stream the 'type' check actually just distinguishes between "normal" and "Dolby Digital": + if (components[i].stream == Stream && (Stream != 2 || (components[i].type < 5) == (Type < 5))) { if (!Index--) return &components[i]; } @@ -7,7 +7,7 @@ * Original version (as used in VDR before 1.3.0) written by * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * - * $Id: epg.h 1.34 2006/03/25 12:39:39 kls Exp $ + * $Id: epg.h 1.35 2006/10/07 13:47:19 kls Exp $ */ #ifndef __EPG_H @@ -43,6 +43,7 @@ public: void SetComponent(int Index, uchar Stream, uchar Type, const char *Language, const char *Description); tComponent *Component(int Index) const { return (Index < numComponents) ? &components[Index] : NULL; } tComponent *GetComponent(int Index, uchar Stream, uchar Type); // Gets the Index'th component of Stream and Type, skipping other components + // In case of an audio stream the 'type' check actually just distinguishes between "normal" and "Dolby Digital" }; class cSchedule; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.c 1.282 2006/09/16 09:08:30 kls Exp $ + * $Id: i18n.c 1.284 2006/10/08 08:50:30 kls Exp $ * * Translations provided by: * @@ -6243,12 +6243,31 @@ int I18nLanguageIndex(const char *Code) const char *I18nNormalizeLanguageCode(const char *Code) { - if (Code[0] && !isalnum(Code[0]) || Code[1] && !isalnum(Code[1]) || Code[2] && !isalnum(Code[2])) { - // ISO 639 language codes are defined as alphabetical characters, but digits are apparently - // also used, for instance for "2ch" - //dsyslog("invalid language code: '%s'", Code); - return "???"; - } + for (int i = 0; i < 3; i++) { + if (Code[i]) { + // ETSI EN 300 468 defines language codes as consisting of three letters + // according to ISO 639-2. This means that they are supposed to always consist + // of exactly three letters in the range a-z - no digits, UTF-8 or other + // funny characters. However, some broadcasters apparently don't have a + // copy of the DVB standard (or they do, but are perhaps unable to read it), + // so they put all sorts of non-standard stuff into the language codes, + // like nonsense as "2ch" or "A 1" (yes, they even go as far as using + // blanks!). Such things should go into the description of the EPG event's + // ComponentDescriptor. + // So, as a workaround for this broadcaster stupidity, let's ignore + // language codes with unprintable characters... + if (!isprint(Code[i])) { + //dsyslog("invalid language code: '%s'", Code); + return "???"; + } + // ...and replace blanks with underlines (ok, this breaks the 'const' + // of the Code parameter - but hey, it's them who started this): + if (Code[i] == ' ') + *((char *)&Code[i]) = '_'; + } + else + break; + } int n = I18nLanguageIndex(Code); return n >= 0 ? I18nLanguageCode(n) : Code; } diff --git a/recording.c b/recording.c index e60c478..5298de3 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.150 2006/09/16 12:12:34 kls Exp $ + * $Id: recording.c 1.151 2006/10/07 12:46:22 kls Exp $ */ #include "recording.h" @@ -941,8 +941,10 @@ bool cRecordings::StateChanged(int &State) void cRecordings::TouchUpdate(void) { + bool needsUpdate = NeedsUpdate(); TouchFile(UpdateFileName()); - lastUpdate = time(NULL); // make sure we don't tigger ourselves + if (!needsUpdate) + lastUpdate = time(NULL); // make sure we don't tigger ourselves } bool cRecordings::NeedsUpdate(void) @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.c 1.57 2006/08/20 10:20:44 kls Exp $ + * $Id: thread.c 1.58 2006/09/24 12:54:47 kls Exp $ */ #include "thread.h" @@ -293,7 +293,7 @@ bool cThread::Active(void) void cThread::Cancel(int WaitSeconds) { running = false; - if (active) { + if (active && WaitSeconds > -1) { if (WaitSeconds > 0) { for (time_t t0 = time(NULL) + WaitSeconds; time(NULL) < t0; ) { if (!Active()) @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.h 1.36 2006/01/08 11:40:23 kls Exp $ + * $Id: thread.h 1.37 2006/09/24 10:10:37 kls Exp $ */ #ifndef __THREAD_H @@ -103,6 +103,8 @@ protected: ///< the Action() loop can finish in an orderly fashion and then waiting ///< up to WaitSeconds seconds for the thread to actually end. If the ///< thread doesn't end by itself, it is killed. + ///< If WaitSeconds is -1, only 'running' is set to false and Cancel() + ///< returns immediately, without killing the thread. public: cThread(const char *Description = NULL); ///< Creates a new thread. |