Version 1.3.24

- Now including the optional user defined Make.config from the 'libsi' Makefile
  (thanks to Ville Skyttä).
- Updated the Danish OSD texts (thanks to Mogens Elneff).
- Fixed a memory leak in tComponent (thanks to Stefan Huelswitt and Daniel Thompson).
- Fixed a memory leak in cDvbPlayer (thanks to Stefan Huelswitt).
- Added missing text internationalization for "Starting EPG scan" (thanks to
  Matthias Lötzke).
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed handling transparent areas in cDvbSpuBitmap (thanks to Marco Schlüßler).
- Now also considering the "EPG linger time" when saving the EPG data to file or
  listing it via LSTE (thanks to Roman Krenický).
- Fixed handling fragments of less than 4 byte in cPesAssembler (thanks to
  Reinhard Nissl).
- Fixed a bug in libsi's SubtitlingDescriptor::getLength() (thanks to Marco
  Schlüßler).
- When reading the channels.conf file, duplicate channels (i.e. ones that have
  the same channel ID) are now automatically deleted and only the first one is
  actually stored.
- Fixed handling lifetime when deciding whether to delete a recording (thanks to
  Udo Richter).
- Fixed timeout handling in cRwLock::Lock() (thanks to Sascha Volkenandt for reporting
  this one).
- Since there are several places in thread.c where a timeout value is calculated,
  this has been put into a separate function.
- The timer status now has a new bit that is set when that timer is currently
  recording (suggested by Matthias Schniedermeyer). See man vdr(5) for details.
- Removed scaling coordinates in letterbox mode from cDvbSpu - the DVD plugin, which
  was the only one needing this, doesn't need it any more (thanks to Marco Schlüßler).
- No longer retuning or restarting a recording if only the language code of an
  audio or Dolby PID changes.
- Now preferring budget cards when selecting a DVB device for recording.
- Recordings now avoid zero sized video data files (thanks to Wolfgang Fitz).
- Some rearrangements in cDvbPlayer::Action() to avoid lockups on NPTL systems
  (thanks to Reinhard Nissl).
- Fixed a wrong inheritance in libsi's SubtitlingDescriptor::Subtitling (thanks to
  Marco Schlüßler).
This commit is contained in:
Klaus Schmidinger 2005-05-08 18:00:00 +02:00
parent 782b517c51
commit c23522ade2
21 changed files with 257 additions and 138 deletions

View File

@ -64,6 +64,8 @@ Matthias Schniedermeyer <ms@citd.de>
for suggesting the SVDRP command CLRE for suggesting the SVDRP command CLRE
for reporting a bug in handling one-shot timers that were already recording for reporting a bug in handling one-shot timers that were already recording
and had their start time changed into the future and had their start time changed into the future
for suggesting to give the timer status a bit that is set when that timer
is currently recording
Miha Setina <mihasetina@softhome.net> Miha Setina <mihasetina@softhome.net>
for translating OSD texts to the Slovenian language for translating OSD texts to the Slovenian language
@ -193,6 +195,8 @@ Stefan Huelswitt <huels@iname.com>
for reporting several memory leaks that were introduced through the use of cString for reporting several memory leaks that were introduced through the use of cString
for adding MPEG1 replay capability to cPesAssembler for adding MPEG1 replay capability to cPesAssembler
for fixing handling symbolic links in cRecordings::ScanVideoDir() for fixing handling symbolic links in cRecordings::ScanVideoDir()
for reporting a memory leak in tComponent
for fixing a memory leak in cDvbPlayer
Ulrich Röder <roeder@efr-net.de> Ulrich Röder <roeder@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than 27500 for pointing out that there are channels that have a symbol rate higher than 27500
@ -763,6 +767,7 @@ Sascha Volkenandt <sascha@akv-soft.de>
for reporting a problem when starting replay of a recording that has no Dolby for reporting a problem when starting replay of a recording that has no Dolby
Digital audio after switching to a channel that has DD and selecting the DD audio Digital audio after switching to a channel that has DD and selecting the DD audio
track track
for reporting a bug in timeout handling in cRwLock::Lock()
Malcolm Caldwell <malcolm.caldwell@ntu.edu.au> Malcolm Caldwell <malcolm.caldwell@ntu.edu.au>
for modifying LOF handling to allow for C-band reception for modifying LOF handling to allow for C-band reception
@ -936,6 +941,8 @@ Reinhard Nissl <rnissl@gmx.de>
for fixing a possible freeze in pause mode in case a device's PlayPesPacket() for fixing a possible freeze in pause mode in case a device's PlayPesPacket()
function permanently returns 0 function permanently returns 0
for fixing a typo in detecting UTF-8 for fixing a typo in detecting UTF-8
for fixing handling fragments of less than 3 byte in cPesAssembler
for some rearrangements in cDvbPlayer::Action() to avoid lockups on NPTL systems
Richard Robson <richard_robson@beeb.net> Richard Robson <richard_robson@beeb.net>
for reporting freezing replay if a timer starts while in Transfer Mode from the for reporting freezing replay if a timer starts while in Transfer Mode from the
@ -1158,6 +1165,10 @@ Marco Schl
for increasing POLLTIMEOUTS_BEFORE_DEVICECLEAR in transfer.c to 6 to avoid problems for increasing POLLTIMEOUTS_BEFORE_DEVICECLEAR in transfer.c to 6 to avoid problems
with the larger buffer reserve with the larger buffer reserve
for adding support for setting the video display mode for adding support for setting the video display mode
for fixing handling transparent areas in cDvbSpuBitmap
for fixing a bug in libsi's SubtitlingDescriptor::getLength()
for removing scaling coordinates in letterbox mode from cDvbSpu
for fixing a wrong inheritance in libsi's SubtitlingDescriptor::Subtitling
Jürgen Schmitz <j.schmitz@web.de> Jürgen Schmitz <j.schmitz@web.de>
for reporting a bug in displaying the current channel when switching via the SVDRP for reporting a bug in displaying the current channel when switching via the SVDRP
@ -1202,6 +1213,7 @@ Milos Kapoun <m.kapoun@cra.cz>
Udo Richter <udo_richter@gmx.de> Udo Richter <udo_richter@gmx.de>
for refining the formula for making volume control more linear for refining the formula for making volume control more linear
for fixing handling lifetime when deciding whether to delete a recording
Sven Kreiensen <svenk@kammer.uni-hannover.de> Sven Kreiensen <svenk@kammer.uni-hannover.de>
for his help in keeping 'channels.conf.terr' up to date for his help in keeping 'channels.conf.terr' up to date
@ -1300,10 +1312,22 @@ Mikko Salo <mikko.salo@ppe.inet.fi>
Roman Krenický <free-rtk@gmx.de> Roman Krenický <free-rtk@gmx.de>
for a patch that was used a a basis for changing a timer's day handling to full date for a patch that was used a a basis for changing a timer's day handling to full date
for considering the "EPG linger time" when saving the EPG data to file or listing
it via LSTE
Ville Skyttä <ville.skytta@iki.fi> Ville Skyttä <ville.skytta@iki.fi>
for reporting several compiler warnings in gcc 4.0 for reporting several compiler warnings in gcc 4.0
for including the optional user defined Make.config from the 'libsi' Makefile
Steffen Beyer <cpunk@reactor.de> Steffen Beyer <cpunk@reactor.de>
for fixing setting the colored button help after deleting a recording in case the next for fixing setting the colored button help after deleting a recording in case the next
menu entry is a directory menu entry is a directory
Daniel Thompson <daniel.thompson@st.com>
for fixing a memory leak in tComponent
Matthias Lötzke <Matthias@Loetzke.de>
for adding missing text internationalization for "Starting EPG scan"
Wolfgang Fritz <wolfgang.fritz@gmx.net>
for making recordings avoid zero sized video data files

39
HISTORY
View File

@ -3473,3 +3473,42 @@ Video Disk Recorder Revision History
than 30 seconds. than 30 seconds.
- Added a missing cMutexLock to cRemote::HasKeys() (thanks to Wolfgang Rohdewald). - Added a missing cMutexLock to cRemote::HasKeys() (thanks to Wolfgang Rohdewald).
- All log entries regarding timers now contain a short description of the timer. - All log entries regarding timers now contain a short description of the timer.
2005-05-08: Version 1.3.24
- Now including the optional user defined Make.config from the 'libsi' Makefile
(thanks to Ville Skyttä).
- Updated the Danish OSD texts (thanks to Mogens Elneff).
- Fixed a memory leak in tComponent (thanks to Stefan Huelswitt and Daniel Thompson).
- Fixed a memory leak in cDvbPlayer (thanks to Stefan Huelswitt).
- Added missing text internationalization for "Starting EPG scan" (thanks to
Matthias Lötzke).
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed handling transparent areas in cDvbSpuBitmap (thanks to Marco Schlüßler).
- Now also considering the "EPG linger time" when saving the EPG data to file or
listing it via LSTE (thanks to Roman Krenický).
- Fixed handling fragments of less than 3 byte in cPesAssembler (thanks to
Reinhard Nissl).
- Fixed a bug in libsi's SubtitlingDescriptor::getLength() (thanks to Marco
Schlüßler).
- When reading the channels.conf file, duplicate channels (i.e. ones that have
the same channel ID) are now automatically deleted and only the first one is
actually stored.
- Fixed handling lifetime when deciding whether to delete a recording (thanks to
Udo Richter).
- Fixed timeout handling in cRwLock::Lock() (thanks to Sascha Volkenandt for reporting
this one).
- Since there are several places in thread.c where a timeout value is calculated,
this has been put into a separate function.
- The timer status now has a new bit that is set when that timer is currently
recording (suggested by Matthias Schniedermeyer). See man vdr(5) for details.
- Removed scaling coordinates in letterbox mode from cDvbSpu - the DVD plugin, which
was the only one needing this, doesn't need it any more (thanks to Marco Schlüßler).
- No longer retuning or restarting a recording if only the language code of an
audio or dolby PID changes.
- Now preferring budget cards when selecting a DVB device for recording.
- Recordings now avoid zero sized video data files (thanks to Wolfgang Fitz).
- Some rearrangements in cDvbPlayer::Action() to avoid lockups on NPTL systems
(thanks to Reinhard Nissl).
- Fixed a wrong inheritance in libsi's SubtitlingDescriptor::Subtitling (thanks to
Marco Schlüßler).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: channels.c 1.36 2005/03/19 15:56:38 kls Exp $ * $Id: channels.c 1.38 2005/05/07 13:14:32 kls Exp $
*/ */
#include "channels.h" #include "channels.h"
@ -389,15 +389,21 @@ void cChannel::SetPortalName(const char *PortalName)
} }
} }
static bool IntArraysDiffer(const int *a, const int *b, const char na[][4] = NULL, const char nb[][4] = NULL) #define STRDIFF 0x01
#define VALDIFF 0x02
static int IntArraysDiffer(const int *a, const int *b, const char na[][4] = NULL, const char nb[][4] = NULL)
{ {
int i = 0; int result = 0;
while (a[i] && b[i]) { for (int i = 0; a[i] || b[i]; i++) {
if (a[i] != b[i] || na && nb && strcmp(na[i], nb[i]) != 0) if (a[i] && na && nb && strcmp(na[i], nb[i]) != 0)
return true; result |= STRDIFF;
i++; if (a[i] != b[i])
} result |= VALDIFF;
return a[i] != b[i] || a[i] && na && nb && strcmp(na[i], nb[i]) != 0; if (!a[i] || !b[i])
break;
}
return result;
} }
static int IntArrayToString(char *s, const int *a, int Base = 10, const char n[][4] = NULL) static int IntArrayToString(char *s, const int *a, int Base = 10, const char n[][4] = NULL)
@ -418,10 +424,15 @@ static int IntArrayToString(char *s, const int *a, int Base = 10, const char n[]
void cChannel::SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][4], int *Dpids, char DLangs[][4], int Tpid) void cChannel::SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][4], int *Dpids, char DLangs[][4], int Tpid)
{ {
bool modified = vpid != Vpid || ppid != Ppid || tpid != Tpid; int mod = CHANNELMOD_NONE;
if (!modified) if (vpid != Vpid || ppid != Ppid || tpid != Tpid)
modified = IntArraysDiffer(apids, Apids, alangs, ALangs) || IntArraysDiffer(dpids, Dpids, dlangs, DLangs); mod |= CHANNELMOD_PIDS;
if (modified) { int m = IntArraysDiffer(apids, Apids, alangs, ALangs) | IntArraysDiffer(dpids, Dpids, dlangs, DLangs);
if (m & STRDIFF)
mod |= CHANNELMOD_LANGS;
if (m & VALDIFF)
mod |= CHANNELMOD_PIDS;
if (mod) {
char OldApidsBuf[(MAXAPIDS + MAXDPIDS) * 10 + 10]; // 10: 5 digits plus delimiting ',' or ';' plus optional '=cod', +10: paranoia char OldApidsBuf[(MAXAPIDS + MAXDPIDS) * 10 + 10]; // 10: 5 digits plus delimiting ',' or ';' plus optional '=cod', +10: paranoia
char NewApidsBuf[(MAXAPIDS + MAXDPIDS) * 10 + 10]; char NewApidsBuf[(MAXAPIDS + MAXDPIDS) * 10 + 10];
char *q = OldApidsBuf; char *q = OldApidsBuf;
@ -450,7 +461,7 @@ void cChannel::SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][4], int *Dp
strn0cpy(dlangs[i], DLangs[i], 4); strn0cpy(dlangs[i], DLangs[i], 4);
} }
tpid = Tpid; tpid = Tpid;
modification |= CHANNELMOD_PIDS; modification |= mod;
Channels.SetModified(); Channels.SetModified();
} }
} }
@ -648,7 +659,7 @@ cString cChannel::ToText(void) const
return ToText(this); return ToText(this);
} }
bool cChannel::Parse(const char *s, bool AllowNonUniqueID) bool cChannel::Parse(const char *s)
{ {
bool ok = true; bool ok = true;
if (*s == ':') { if (*s == ':') {
@ -791,10 +802,6 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
esyslog("ERROR: channel data results in invalid ID!"); esyslog("ERROR: channel data results in invalid ID!");
return false; return false;
} }
if (!AllowNonUniqueID && Channels.GetByChannelID(GetChannelID())) {
esyslog("ERROR: channel data not unique!");
return false;
}
} }
else else
return false; return false;
@ -817,9 +824,30 @@ cChannels::cChannels(void)
modified = CHANNELSMOD_NONE; modified = CHANNELSMOD_NONE;
} }
void cChannels::DeleteDuplicateChannels(void)
{
for (cChannel *channel = First(); channel; channel = Next(channel)) {
if (!channel->GroupSep()) {
tChannelID ChannelID = channel->GetChannelID();
cChannel *other = Next(channel);
while (other) {
cChannel *d = NULL;
if (!other->GroupSep() && other->GetChannelID() == ChannelID)
d = other;
other = Next(other);
if (d) {
dsyslog("deleting duplicate channel %s", *d->ToText());
Del(d);
}
}
}
}
}
bool cChannels::Load(const char *FileName, bool AllowComments, bool MustExist) bool cChannels::Load(const char *FileName, bool AllowComments, bool MustExist)
{ {
if (cConfig<cChannel>::Load(FileName, AllowComments, MustExist)) { if (cConfig<cChannel>::Load(FileName, AllowComments, MustExist)) {
DeleteDuplicateChannels();
ReNumber(); ReNumber();
return true; return true;
} }

View File

@ -29,7 +29,7 @@ Bloomberg TV Germany;Bloomberg:12551:vC56:S19.2E:22000:162:99=deu:0:0:12160:1:11
EURONEWS;CSAT:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,91=rus,98=por,99=deu:0:0:8004:1:1070:0 EURONEWS;CSAT:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,91=rus,98=por,99=deu:0:0:8004:1:1070:0
rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28205:1:1073:0 rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28205:1:1073:0
Sky News;BSkyB:11597:vC56:S19.2E:22000:305+131:306=eng:0:0:28707:1:1026:0 Sky News;BSkyB:11597:vC56:S19.2E:22000:305+131:306=eng:0:0:28707:1:1026:0
Veronica/JETIX;CANAL+:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,602,100:5020:53:1109:0 Veronica/JETIX;CANAL+:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,100:5020:53:1109:0
BVN;CANAL+:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0 BVN;CANAL+:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0
n-tv;RTL World:12187:hC34:S19.2E:27500:169:73=deu:80:0:12090:1:1089:0 n-tv;RTL World:12187:hC34:S19.2E:27500:169:73=deu:80:0:12090:1:1089:0
Al Jazeera;CANALSATELLITE:11567:vC56:S19.2E:22000:55:56=ara:0:0:9021:1:1024:0 Al Jazeera;CANALSATELLITE:11567:vC56:S19.2E:22000:55:56=ara:0:0:9021:1:1024:0
@ -37,7 +37,7 @@ TW1 - 28Feb05;ORF:12692:hC56:S19.2E:22000:166:167=deu:168:0:13013:1:1117:0
Eurosport;ZDFvision:11953:hC34:S19.2E:27500:410:420=deu:430:0:28009:1:1079:0 Eurosport;ZDFvision:11953:hC34:S19.2E:27500:410:420=deu:430:0:28009:1:1079:0
EinsExtra;ARD:12109:hC34:S19.2E:27500:101:102=deu:0:0:28201:1:1073:0 EinsExtra;ARD:12109:hC34:S19.2E:27500:101:102=deu:0:0:28201:1:1073:0
EinsFestival;ARD:12109:hC34:S19.2E:27500:201:202=deu:0:0:28202:1:1073:0 EinsFestival;ARD:12109:hC34:S19.2E:27500:201:202=deu:0:0:28202:1:1073:0
EinsMuXx;ARD:12109:hC34:S19.2E:27500:301:302=deu:0:0:28203:1:1073:0 EinsPlus;ARD:12109:hC34:S19.2E:27500:301:302=deu:0:0:28203:1:1073:0
ZDFtheaterkanal;ZDFvision:11953:hC34:S19.2E:27500:1110:1120=deu:130:0:28016:1:1079:0 ZDFtheaterkanal;ZDFvision:11953:hC34:S19.2E:27500:1110:1120=deu:130:0:28016:1:1079:0
ZDFdokukanal;ZDFvision:11953:hC34:S19.2E:27500:660:670=deu:130:0:28014:1:1079:0 ZDFdokukanal;ZDFvision:11953:hC34:S19.2E:27500:660:670=deu:130:0:28014:1:1079:0
MDR FERNSEHEN;ARD:12109:hC34:S19.2E:27500:401:402=deu:404:0:28204:1:1073:0 MDR FERNSEHEN;ARD:12109:hC34:S19.2E:27500:401:402=deu:404:0:28204:1:1073:0
@ -51,7 +51,7 @@ PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1801,1
PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu,1281=deu:32:1801,1722,1702:29:133:2:0 PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu,1281=deu:32:1801,1722,1702:29:133:2:0
PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1702,1722,1801:41:133:2:0 PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1702,1722,1801:41:133:2:0
PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1722,1702,1801:20:133:2:0 PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1722,1702,1801:20:133:2:0
DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:0:1722,1801,1702:34:133:17:0 DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1722,1801,1702:34:133:17:0
:Premiere Direkt :Premiere Direkt
PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0 PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0
:PW Erotic :PW Erotic
@ -69,7 +69,7 @@ Kabel 1 Schweiz;ProSiebenSat.1:12051:vC34:S19.2E:27500:162:163=deu:165:0:20003:1
Kabel 1 Austria;ProSiebenSat.1:12051:vC34:S19.2E:27500:166:167=deu:169:0:20004:1:1082:0 Kabel 1 Austria;ProSiebenSat.1:12051:vC34:S19.2E:27500:166:167=deu:169:0:20004:1:1082:0
ProSieben Schweiz;ProSiebenSat.1:12051:vC34:S19.2E:27500:289:290=deu:33:0:20001:1:1082:0 ProSieben Schweiz;ProSiebenSat.1:12051:vC34:S19.2E:27500:289:290=deu:33:0:20001:1:1082:0
FRANCE 5;CSAT:12207:vC34:S19.2E:27500:160:80=fra:32:500,100:8501:1:1090:0 FRANCE 5;CSAT:12207:vC34:S19.2E:27500:160:80=fra:32:500,100:8501:1:1090:0
LCP;CSAT:12207:vC34:S19.2E:27500:165:100=fra:0:0:8506:1:1090:0 LCP;CSAT:12207:vC34:S19.2E:27500:2047+8191:0:0:0:8506:1:1090:0
ESCALES;ABSAT:12285:vC34:S19.2E:27500:165:100:41:500,100:17025:1:1094:0 ESCALES;ABSAT:12285:vC34:S19.2E:27500:165:100:41:500,100:17025:1:1094:0
Best of Shopping;CSAT:12324:vC34:S19.2E:27500:160:80=fra:0:0:8612:1:1096:0 Best of Shopping;CSAT:12324:vC34:S19.2E:27500:160:80=fra:0:0:8612:1:1096:0
ASTRA-Mosaic;ASTRA:12551:vC56:S19.2E:22000:175:176=fra:0:0:3988:1:1108:0 ASTRA-Mosaic;ASTRA:12551:vC56:S19.2E:22000:175:176=fra:0:0:3988:1:1108:0
@ -89,9 +89,9 @@ QVC Deutschland;QVC:12551:vC56:S19.2E:22000:165:166:167:0:12100:1:1108:0
TELE 5;BetaDigital:12480:vC34:S19.2E:27500:1535:1536=deu:38:0:51:133:33:0 TELE 5;BetaDigital:12480:vC34:S19.2E:27500:1535:1536=deu:38:0:51:133:33:0
:@201 Sky :@201 Sky
Sky One;BSkyB:12226:hC23:S28.2E:27500:2305+2304:2306=eng:2307:960,961:4705:2:2027:0 Sky One;BSkyB:12226:hC23:S28.2E:27500:2305+2304:2306=eng:2307:960,961:4705:2:2027:0
Sky Mix;BSkyB:12226:hC23:S28.2E:27500:2314+2304:2315=eng,2316=NAR:2317:960,961:5104:2:2027:0 Sky Mix;BSkyB:12226:hC23:S28.2E:27500:2311+2304:2312=eng,2313=NAR:2314:960,961:5104:2:2027:0
ITV2;BSkyB:10906:vC56:S28.2E:22000:2350:2351=eng:2353:960,961:10240:2:2054:0 ITV2;BSkyB:10906:vC56:S28.2E:22000:2350:2351=eng:2353:960,961:10240:2:2054:0
Sci-Fi;BSkyB:12148:hC23:S28.2E:27500:2320+2304:2321=eng:2322:960,961:4905:2:2023:0 Sci-Fi;BSkyB:12148:hC23:S28.2E:27500:512+8190:640=eng:576:960,961:4905:2:2023:0
Paramount;BSkyB:12187:hC23:S28.2E:27500:2313+2304:2317=eng,2318=NAR:2315:960,961:5904:2:2025:0 Paramount;BSkyB:12187:hC23:S28.2E:27500:2313+2304:2317=eng,2318=NAR:2315:960,961:5904:2:2025:0
Discovery;BSkyB:11875:hC23:S28.2E:27500:2304:2306=eng,2307=NAR:2305:960,961:6201:2:2009:0 Discovery;BSkyB:11875:hC23:S28.2E:27500:2304:2306=eng,2307=NAR:2305:960,961:6201:2:2009:0
Sky Movies 1;BSkyB:11836:hC23:S28.2E:27500:518+8190:646=eng,653=NAR;686=eng:582:960,961:4303:2:2007:0 Sky Movies 1;BSkyB:11836:hC23:S28.2E:27500:518+8190:646=eng,653=NAR;686=eng:582:960,961:4303:2:2007:0
@ -113,7 +113,7 @@ Animal Plnt+;BSkyB:12070:hC23:S28.2E:27500:2314+2307:2315=eng:0:960,961:50002:2:
S1T;BSkyB:12285:vC23:S28.2E:27500:513+8190:641=eng,661=NAR:577:960,961:4409:2:2030:0 S1T;BSkyB:12285:vC23:S28.2E:27500:513+8190:641=eng,661=NAR:577:960,961:4409:2:2030:0
CNN;BSkyB:12051:vC23:S28.2E:27500:2313:2315=eng:2314:0:7140:2:2018:0 CNN;BSkyB:12051:vC23:S28.2E:27500:2313:2315=eng:2314:0:7140:2:2018:0
BBC PARL'MNT:12129:vC23:S28.2E:27500:2304:2306=eng,2307=eng:2305:0:7300:2:2022:0 BBC PARL'MNT:12129:vC23:S28.2E:27500:2304:2306=eng,2307=eng:2305:0:7300:2:2022:0
JOLLY FILM;T-Systems/MTI:11200:vC56:S13.0E:27500:413:414=ita:0:0:4733:318:13400:0 BTL TV;T-Systems/MTI:11200:vC56:S13.0E:27500:413:414=ita:0:0:4733:318:13400:0
Euro1080;EURO1080:12168:vC34:S19.2E:27500:308:256:0:FF:21100:1:1088:0 Euro1080;EURO1080:12168:vC34:S19.2E:27500:308:256:0:FF:21100:1:1088:0
Astra HD:12441:vC34:S19.2E:27500:133+80:134=eng:0:FF:29700:0:0:0 Astra HD:12441:vC34:S19.2E:27500:133+80:134=eng:0:FF:29700:0:0:0
eng-WRN-multi;WRN:12597:vC34:S13.0E:27500:0:2132:0:0:8230:318:9400:0 eng-WRN-multi;WRN:12597:vC34:S13.0E:27500:0:2132:0:0:8230:318:9400:0

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: channels.h 1.26 2005/02/20 14:05:24 kls Exp $ * $Id: channels.h 1.28 2005/05/07 13:07:09 kls Exp $
*/ */
#ifndef __CHANNELS_H #ifndef __CHANNELS_H
@ -24,6 +24,7 @@
#define CHANNELMOD_ID 0x04 #define CHANNELMOD_ID 0x04
#define CHANNELMOD_CA 0x10 #define CHANNELMOD_CA 0x10
#define CHANNELMOD_TRANSP 0x20 #define CHANNELMOD_TRANSP 0x20
#define CHANNELMOD_LANGS 0x40
#define CHANNELMOD_RETUNE (CHANNELMOD_PIDS | CHANNELMOD_CA | CHANNELMOD_TRANSP) #define CHANNELMOD_RETUNE (CHANNELMOD_PIDS | CHANNELMOD_CA | CHANNELMOD_TRANSP)
#define CHANNELSMOD_NONE 0 #define CHANNELSMOD_NONE 0
@ -135,7 +136,7 @@ public:
~cChannel(); ~cChannel();
cChannel& operator= (const cChannel &Channel); cChannel& operator= (const cChannel &Channel);
cString ToText(void) const; cString ToText(void) const;
bool Parse(const char *s, bool AllowNonUniqueID = false); bool Parse(const char *s);
bool Save(FILE *f); bool Save(FILE *f);
const char *Name(void) const { return name; } const char *Name(void) const { return name; }
const char *ShortName(bool OrName = false) const { return (OrName && isempty(shortName)) ? name : shortName; } const char *ShortName(bool OrName = false) const { return (OrName && isempty(shortName)) ? name : shortName; }
@ -198,6 +199,7 @@ private:
int maxNumber; int maxNumber;
int modified; int modified;
int beingEdited; int beingEdited;
void DeleteDuplicateChannels(void);
public: public:
cChannels(void); cChannels(void);
bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false); bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.h 1.216 2005/03/05 15:44:35 kls Exp $ * $Id: config.h 1.217 2005/05/05 11:04:18 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -20,8 +20,8 @@
#include "i18n.h" #include "i18n.h"
#include "tools.h" #include "tools.h"
#define VDRVERSION "1.3.23" #define VDRVERSION "1.3.24"
#define VDRVERSNUM 10323 // Version * 10000 + Major * 100 + Minor #define VDRVERSNUM 10324 // Version * 10000 + Major * 100 + Minor
#define MAXPRIORITY 99 #define MAXPRIORITY 99
#define MAXLIFETIME 99 #define MAXLIFETIME 99

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.c 1.99 2005/02/27 13:55:15 kls Exp $ * $Id: device.c 1.101 2005/05/07 15:04:17 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -34,7 +34,7 @@ public:
int ExpectedLength(void) { return PacketSize(data); } int ExpectedLength(void) { return PacketSize(data); }
static int PacketSize(const uchar *data); static int PacketSize(const uchar *data);
int Length(void) { return length; } int Length(void) { return length; }
const uchar *Data(void) { return data; } const uchar *Data(void) { return data; } // only valid if Length() >= 4
void Reset(void); void Reset(void);
void Put(uchar c); void Put(uchar c);
void Put(const uchar *Data, int Length); void Put(const uchar *Data, int Length);
@ -76,7 +76,7 @@ bool cPesAssembler::Realloc(int Size)
void cPesAssembler::Put(uchar c) void cPesAssembler::Put(uchar c)
{ {
if (!length) { if (length < 4) {
tag = (tag << 8) | c; tag = (tag << 8) | c;
if ((tag & 0xFFFFFF00) == 0x00000100) { if ((tag & 0xFFFFFF00) == 0x00000100) {
if (Realloc(4)) { if (Realloc(4)) {
@ -84,6 +84,8 @@ void cPesAssembler::Put(uchar c)
length = 4; length = 4;
} }
} }
else if (length < 3)
length++;
} }
else if (Realloc(length + 1)) else if (Realloc(length + 1))
data[length++] = c; data[length++] = c;
@ -91,7 +93,7 @@ void cPesAssembler::Put(uchar c)
void cPesAssembler::Put(const uchar *Data, int Length) void cPesAssembler::Put(const uchar *Data, int Length)
{ {
while (!length && Length > 0) { while (length < 4 && Length > 0) {
Put(*Data++); Put(*Data++);
Length--; Length--;
} }
@ -268,7 +270,7 @@ cDevice *cDevice::GetDevice(int Index)
cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers)
{ {
cDevice *d = NULL; cDevice *d = NULL;
int select = 7, pri; int select = 8, pri;
for (int i = 0; i < numDevices; i++) { for (int i = 0; i < numDevices; i++) {
bool ndr; bool ndr;
@ -277,16 +279,18 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDe
pri = 0; // receiving and allows additional receivers pri = 0; // receiving and allows additional receivers
else if (d && !device[i]->Receiving() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel)) else if (d && !device[i]->Receiving() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel))
pri = 1; // free and fewer Ca's pri = 1; // free and fewer Ca's
else if (!device[i]->Receiving() && !device[i]->HasDecoder())
pri = 2; // free and not a full featured card
else if (!device[i]->Receiving() && !device[i]->IsPrimaryDevice()) else if (!device[i]->Receiving() && !device[i]->IsPrimaryDevice())
pri = 2; // free and not the primary device pri = 3; // free and not the primary device
else if (!device[i]->Receiving()) else if (!device[i]->Receiving())
pri = 3; // free pri = 4; // free
else if (d && device[i]->Priority() < d->Priority()) else if (d && device[i]->Priority() < d->Priority())
pri = 4; // receiving but priority is lower pri = 5; // receiving but priority is lower
else if (d && device[i]->Priority() == d->Priority() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel)) else if (d && device[i]->Priority() == d->Priority() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel))
pri = 5; // receiving with same priority but fewer Ca's pri = 6; // receiving with same priority but fewer Ca's
else else
pri = 6; // all others pri = 7; // all others
if (pri < select) { if (pri < select) {
select = pri; select = pri;
d = device[i]; d = device[i];

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbplayer.c 1.30 2005/01/14 14:00:56 kls Exp $ * $Id: dvbplayer.c 1.33 2005/05/08 14:52:49 kls Exp $
*/ */
#include "dvbplayer.h" #include "dvbplayer.h"
@ -263,6 +263,7 @@ cDvbPlayer::~cDvbPlayer()
{ {
Detach(); Detach();
Save(); Save();
delete readFrame; // might not have been stored in the buffer in Action()
delete index; delete index;
delete fileName; delete fileName;
delete backTrace; delete backTrace;
@ -296,6 +297,7 @@ void cDvbPlayer::Empty(void)
nonBlockingFileReader->Clear(); nonBlockingFileReader->Clear();
if ((readIndex = backTrace->Get(playDir == pdForward)) < 0) if ((readIndex = backTrace->Get(playDir == pdForward)) < 0)
readIndex = writeIndex; readIndex = writeIndex;
delete readFrame; // might not have been stored in the buffer in Action()
readFrame = NULL; readFrame = NULL;
playFrame = NULL; playFrame = NULL;
ringBuffer->Clear(); ringBuffer->Clear();
@ -370,9 +372,14 @@ void cDvbPlayer::Action(void)
nonBlockingFileReader = new cNonBlockingFileReader; nonBlockingFileReader = new cNonBlockingFileReader;
int Length = 0; int Length = 0;
bool Sleep = false;
running = true; running = true;
while (running && (NextFile() || readIndex >= 0 || ringBuffer->Available() || !DeviceFlush(100))) { while (running && (NextFile() || readIndex >= 0 || ringBuffer->Available() || !DeviceFlush(100))) {
if (Sleep) {
cCondWait::SleepMs(3); // this keeps the CPU load low
Sleep = false;
}
cPoller Poller; cPoller Poller;
if (DevicePoll(Poller, 100)) { if (DevicePoll(Poller, 100)) {
@ -380,8 +387,8 @@ void cDvbPlayer::Action(void)
// Read the next frame from the file: // Read the next frame from the file:
if (!readFrame && (replayFile >= 0 || readIndex >= 0)) { if (playMode != pmStill && playMode != pmPause) {
if (playMode != pmStill) { if (!readFrame && (replayFile >= 0 || readIndex >= 0)) {
if (!nonBlockingFileReader->Reading()) { if (!nonBlockingFileReader->Reading()) {
if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) { if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) {
uchar FileNumber; uchar FileNumber;
@ -438,16 +445,16 @@ void cDvbPlayer::Action(void)
break; break;
} }
} }
else
cCondWait::SleepMs(3); // this keeps the CPU load low
}
// Store the frame in the buffer: // Store the frame in the buffer:
if (readFrame) { if (readFrame) {
if (ringBuffer->Put(readFrame)) if (ringBuffer->Put(readFrame))
readFrame = NULL; readFrame = NULL;
}
} }
else
Sleep = true;
// Get the next frame from the buffer: // Get the next frame from the buffer:

View File

@ -8,7 +8,7 @@
* *
* parts of this file are derived from the OMS program. * parts of this file are derived from the OMS program.
* *
* $Id: dvbspu.c 1.12 2005/02/06 09:54:51 kls Exp $ * $Id: dvbspu.c 1.14 2005/05/07 11:13:48 kls Exp $
*/ */
#include <assert.h> #include <assert.h>
@ -143,6 +143,8 @@ bool cDvbSpuBitmap::getMinSize(const aDvbSpuPalDescr paldescr,
if (ret) if (ret)
DEBUG("MinSize: (%d, %d) x (%d, %d)\n", DEBUG("MinSize: (%d, %d) x (%d, %d)\n",
size.x1, size.y1, size.x2, size.y2); size.x1, size.y1, size.x2, size.y2);
if (size.x1 > size.x2 || size.y1 > size.y2)
return false;
return ret; return ret;
} }
@ -304,24 +306,6 @@ void cDvbSpuDecoder::clearHighlight(void)
hlpsize.y2 = -1; hlpsize.y2 = -1;
} }
int cDvbSpuDecoder::ScaleYcoord(int value)
{
if (scaleMode == eSpuLetterBox) {
int offset = cDevice::PrimaryDevice()->GetVideoSystem() == vsPAL ? 72 : 60;
return lround((value * 3.0) / 4.0) + offset;
}
else
return value;
}
int cDvbSpuDecoder::ScaleYres(int value)
{
if (scaleMode == eSpuLetterBox)
return lround((value * 3.0) / 4.0);
else
return value;
}
sDvbSpuRect cDvbSpuDecoder::CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp) sDvbSpuRect cDvbSpuDecoder::CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp)
{ {
sDvbSpuRect size; sDvbSpuRect size;
@ -365,22 +349,15 @@ void cDvbSpuDecoder::Draw(void)
sDvbSpuRect hlsize; sDvbSpuRect hlsize;
hlsize.x1 = hlpsize.x1; hlsize.x1 = hlpsize.x1;
hlsize.y1 = ScaleYcoord(hlpsize.y1); hlsize.y1 = hlpsize.y1;
hlsize.x2 = hlpsize.x2; hlsize.x2 = hlpsize.x2;
hlsize.y2 = ScaleYcoord(hlpsize.y2); hlsize.y2 = hlpsize.y2;
if (highlight) if (highlight)
fg = spubmp->getBitmap(hlpDescr, palette, hlsize); fg = spubmp->getBitmap(hlpDescr, palette, hlsize);
if (spubmp->getMinSize(palDescr, bgsize)) { if (spubmp->getMinSize(palDescr, bgsize))
bg = spubmp->getBitmap(palDescr, palette, bgsize); bg = spubmp->getBitmap(palDescr, palette, bgsize);
if (scaleMode == eSpuLetterBox) {
// the coordinates have to be modified for letterbox
int y1 = ScaleYres(bgsize.y1) + bgsize.height();
bgsize.y2 = y1 + bgsize.height();
bgsize.y1 = y1;
}
}
sDvbSpuRect areaSize = CalcAreaSize(hlsize, fg, bgsize, bg); sDvbSpuRect areaSize = CalcAreaSize(hlsize, fg, bgsize, bg);

View File

@ -8,7 +8,7 @@
* *
* parts of this file are derived from the OMS program. * parts of this file are derived from the OMS program.
* *
* $Id: dvbspu.h 1.8 2005/02/20 11:20:43 kls Exp $ * $Id: dvbspu.h 1.9 2005/05/07 11:14:03 kls Exp $
*/ */
#ifndef __DVBSPU_H #ifndef __DVBSPU_H
@ -129,8 +129,6 @@ class cDvbSpuDecoder:public cSpuDecoder {
return ((spu[0] << 8) | spu[1]); return ((spu[0] << 8) | spu[1]);
}; };
int ScaleYcoord(int value);
int ScaleYres(int value);
sDvbSpuRect CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp); sDvbSpuRect CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp);
public: public:

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: eitscan.c 1.23 2004/10/31 16:19:49 kls Exp $ * $Id: eitscan.c 1.24 2005/05/05 13:05:00 kls Exp $
*/ */
#include "eitscan.h" #include "eitscan.h"
@ -152,7 +152,7 @@ void cEITScanner::Process(void)
if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) { if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) {
if (Device == cDevice::PrimaryDevice() && !currentChannel) { if (Device == cDevice::PrimaryDevice() && !currentChannel) {
currentChannel = Device->CurrentChannel(); currentChannel = Device->CurrentChannel();
Skins.Message(mtInfo, "Starting EPG scan"); Skins.Message(mtInfo, tr("Starting EPG scan"));
} }
currentDevice = Device;//XXX see also dvbdevice.c!!! currentDevice = Device;//XXX see also dvbdevice.c!!!
Device->SwitchChannel(Channel, false); Device->SwitchChannel(Channel, false);

8
epg.c
View File

@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by * Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* *
* $Id: epg.c 1.27 2005/03/20 12:34:19 kls Exp $ * $Id: epg.c 1.29 2005/05/05 13:53:19 kls Exp $
*/ */
#include "epg.h" #include "epg.h"
@ -29,9 +29,7 @@ bool tComponent::FromString(const char *s)
{ {
unsigned int Stream, Type; unsigned int Stream, Type;
int n = sscanf(s, "%X %02X %3c %a[^\n]", &Stream, &Type, language, &description); int n = sscanf(s, "%X %02X %3c %a[^\n]", &Stream, &Type, language, &description);
if (n != 4) if (n != 4 || isempty(description)) {
description = NULL;
else if (isempty(description)) {
free(description); free(description);
description = NULL; description = NULL;
} }
@ -225,7 +223,7 @@ cString cEvent::GetVpsString(void) const
void cEvent::Dump(FILE *f, const char *Prefix) const void cEvent::Dump(FILE *f, const char *Prefix) const
{ {
if (startTime + duration >= time(NULL)) { if (startTime + duration + Setup.EPGLinger * 60 >= time(NULL)) {
fprintf(f, "%sE %u %ld %d %X\n", Prefix, eventID, startTime, duration, tableID); fprintf(f, "%sE %u %ld %d %X\n", Prefix, eventID, startTime, duration, tableID);
if (!isempty(title)) if (!isempty(title))
fprintf(f, "%sT %s\n", Prefix, title); fprintf(f, "%sT %s\n", Prefix, title);

43
i18n.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: i18n.c 1.185 2005/03/12 10:43:16 kls Exp $ * $Id: i18n.c 1.188 2005/05/05 13:12:54 kls Exp $
* *
* Translations provided by: * Translations provided by:
* *
@ -89,7 +89,7 @@ const tI18nPhrase Phrases[] = {
"Português", "Português",
"Français", "Français",
"Norsk", "Norsk",
"suomi", // this is not a typo - it's really lowercase! "suomi", // Finnish (this is not a typo - it's really lowercase!)
"Polski", "Polski",
"Español", "Español",
"ÅëëçíéêÜ", // Greek "ÅëëçíéêÜ", // Greek
@ -1334,7 +1334,7 @@ const tI18nPhrase Phrases[] = {
"PID de Vídeo", "PID de Vídeo",
"PID Vidéo", "PID Vidéo",
"Vpid", "Vpid",
"Kuva PID", "Kuva-PID",
"Vpid", "Vpid",
"Vpid", "Vpid",
"Bßíôåï PID", "Bßíôåï PID",
@ -1355,7 +1355,7 @@ const tI18nPhrase Phrases[] = {
"Ppid", "Ppid",
"Ppid", "Ppid",
"Ppid", "Ppid",
"Aikatieto PID", "Aikatieto-PID",
"Ppid", "Ppid",
"Ppid", "Ppid",
"Ppid", "Ppid",
@ -1376,7 +1376,7 @@ const tI18nPhrase Phrases[] = {
"PID Áudio (1)", "PID Áudio (1)",
"PID Audio (1)", "PID Audio (1)",
"Apid1", "Apid1",
"Ääni PID1", "Ääni-PID (1)",
"Apid1", "Apid1",
"Apid1", "Apid1",
"Apid1", "Apid1",
@ -1397,7 +1397,7 @@ const tI18nPhrase Phrases[] = {
"Apid2", "Apid2",
"PID Audio (2)", "PID Audio (2)",
"Apid2", "Apid2",
"Ääni PID2", "Ääni-PID (2)",
"Apid2", "Apid2",
"Apid2", "Apid2",
"Apid2", "Apid2",
@ -1418,7 +1418,7 @@ const tI18nPhrase Phrases[] = {
"PID AC3 (1)", "PID AC3 (1)",
"PID AC3 (1)", "PID AC3 (1)",
"AC3pid1", "AC3pid1",
"Dolby PID1", "Dolby-PID (1)",
"Dpid1", "Dpid1",
"Dpid1", "Dpid1",
"Dpid1", "Dpid1",
@ -1439,7 +1439,7 @@ const tI18nPhrase Phrases[] = {
"PID AC3 (2)", "PID AC3 (2)",
"PID AC3 (2)", "PID AC3 (2)",
"AC3pid2", "AC3pid2",
"Dolby PID2", "Dolby-PID (2)",
"Dpid2", "Dpid2",
"Dpid2", "Dpid2",
"Dpid2", "Dpid2",
@ -1460,7 +1460,7 @@ const tI18nPhrase Phrases[] = {
"PID Teletexto", "PID Teletexto",
"PID Télétexte", "PID Télétexte",
"Tekst-TV pid", "Tekst-TV pid",
"Teksti-TV PID", "Teksti-TV-PID",
"Tpid", "Tpid",
"Tpid", "Tpid",
"Tpid", "Tpid",
@ -1502,7 +1502,7 @@ const tI18nPhrase Phrases[] = {
"Sid", "Sid",
"Sid", "Sid",
"Sid", "Sid",
"Palvelu ID", "Palvelu-ID",
"Sid", "Sid",
"Sid", "Sid",
"Sid", "Sid",
@ -3113,7 +3113,7 @@ const tI18nPhrase Phrases[] = {
"ÈØàÞÚÞíÚàÐÝÝÞÕ Ø×ÞÑàÐÖÕÝØÕ", "ÈØàÞÚÞíÚàÐÝÝÞÕ Ø×ÞÑàÐÖÕÝØÕ",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "Video display format",
}, },
{ "pan&scan", { "pan&scan",
"pan&scan", "pan&scan",
@ -5241,6 +5241,27 @@ const tI18nPhrase Phrases[] = {
"Saate edastamise peatamine...", "Saate edastamise peatamine...",
"Pausere live udsendelse...", "Pausere live udsendelse...",
}, },
{ "Starting EPG scan",
"Beginne mit EPG-Scan",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Ohjelmaoppaan päivitys aloitettu",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
},
{ "This plugin has no setup parameters!", { "This plugin has no setup parameters!",
"Dieses Plugin hat keine Setup-Parameter!", "Dieses Plugin hat keine Setup-Parameter!",
"Ta plugin nima nastavitvenih parametrov!", "Ta plugin nima nastavitvenih parametrov!",

View File

@ -1,7 +1,7 @@
# #
# Makefile for a libsi # Makefile for a libsi
# #
# $Id: Makefile 1.3 2004/10/16 13:31:50 kls Exp $ # $Id: Makefile 1.4 2005/05/05 11:01:46 kls Exp $
### The C++ compiler and options: ### The C++ compiler and options:
@ -11,6 +11,8 @@ AR = ar
ARFLAGS = ru ARFLAGS = ru
RANLIB = ranlib RANLIB = ranlib
-include ../Make.config
### The directory environment: ### The directory environment:
INCLUDES += INCLUDES +=

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* $Id: descriptor.h 1.10 2004/06/06 13:51:29 kls Exp $ * $Id: descriptor.h 1.12 2005/05/08 14:08:19 kls Exp $
* * * *
***************************************************************************/ ***************************************************************************/
@ -283,13 +283,13 @@ private:
class SubtitlingDescriptor : public Descriptor { class SubtitlingDescriptor : public Descriptor {
public: public:
class Subtitling : public Descriptor { class Subtitling : public LoopElement {
public: public:
char languageCode[4]; char languageCode[4];
int getSubtitlingType() const; int getSubtitlingType() const;
int getCompositionPageId() const; int getCompositionPageId() const;
int getAncillaryPageId() const; int getAncillaryPageId() const;
virtual int getLength() { return sizeof(item_nvod_reference); } virtual int getLength() { return sizeof(item_subtitling); }
protected: protected:
virtual void Parse(); virtual void Parse();
private: private:

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recording.c 1.96 2005/02/12 10:17:47 kls Exp $ * $Id: recording.c 1.98 2005/05/07 15:25:15 kls Exp $
*/ */
#include "recording.h" #include "recording.h"
@ -126,7 +126,7 @@ void AssertFreeDiskSpace(int Priority)
while (r) { while (r) {
if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority
(time(NULL) - r->start) / SECSINDAY > r->lifetime) { // the recording's guaranteed lifetime has expired (r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired
if (r0) { if (r0) {
if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start)) if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start))
r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities) r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
@ -1124,8 +1124,21 @@ int cFileName::SetOffset(int Number, int Offset)
fileNumber = Number; fileNumber = Number;
sprintf(pFileNumber, RECORDFILESUFFIX, fileNumber); sprintf(pFileNumber, RECORDFILESUFFIX, fileNumber);
if (record) { if (record) {
if (access(fileName, F_OK) == 0) // file exists, let's try next suffix if (access(fileName, F_OK) == 0) {
return SetOffset(Number + 1); // files exists, check if it has non-zero size
struct stat buf;
if (stat(fileName, &buf) == 0) {
if (buf.st_size != 0)
return SetOffset(Number + 1); // file exists and has non zero size, let's try next suffix
else {
// zero size file, remove it
dsyslog ("cFileName::SetOffset: removing zero-sized file %s\n", fileName);
unlink (fileName);
}
}
else
return SetOffset(Number + 1); // error with fstat - should not happen, just to be on the safe side
}
else if (errno != ENOENT) { // something serious has happened else if (errno != ENOENT) { // something serious has happened
LOG_ERROR_STR(fileName); LOG_ERROR_STR(fileName);
return -1; return -1;

View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured * and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection. * graphical interface that sits on top of an SVDRP connection.
* *
* $Id: svdrp.c 1.69 2005/03/20 15:04:00 kls Exp $ * $Id: svdrp.c 1.70 2005/05/06 13:47:39 kls Exp $
*/ */
#include "svdrp.h" #include "svdrp.h"
@ -875,7 +875,7 @@ void cSVDRP::CmdMODC(const char *Option)
cChannel *channel = Channels.GetByNumber(n); cChannel *channel = Channels.GetByNumber(n);
if (channel) { if (channel) {
cChannel ch; cChannel ch;
if (ch.Parse(tail, true)) { if (ch.Parse(tail)) {
if (Channels.HasUniqueChannelID(&ch, channel)) { if (Channels.HasUniqueChannelID(&ch, channel)) {
*channel = ch; *channel = ch;
Channels.ReNumber(); Channels.ReNumber();
@ -948,7 +948,7 @@ void cSVDRP::CmdNEWC(const char *Option)
{ {
if (*Option) { if (*Option) {
cChannel ch; cChannel ch;
if (ch.Parse(Option, true)) { if (ch.Parse(Option)) {
if (Channels.HasUniqueChannelID(&ch)) { if (Channels.HasUniqueChannelID(&ch)) {
cChannel *channel = new cChannel; cChannel *channel = new cChannel;
*channel = ch; *channel = ch;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: thread.c 1.41 2005/01/14 13:59:48 kls Exp $ * $Id: thread.c 1.42 2005/05/06 14:39:15 kls Exp $
*/ */
#include "thread.h" #include "thread.h"
@ -17,6 +17,22 @@
#include <unistd.h> #include <unistd.h>
#include "tools.h" #include "tools.h"
static bool GetAbsTime(struct timespec *Abstime, int MillisecondsFromNow)
{
struct timeval now;
if (gettimeofday(&now, NULL) == 0) { // get current time
now.tv_usec += MillisecondsFromNow * 1000; // add the timeout
while (now.tv_usec >= 1000000) { // take care of an overflow
now.tv_sec++;
now.tv_usec -= 1000000;
}
Abstime->tv_sec = now.tv_sec; // seconds
Abstime->tv_nsec = now.tv_usec * 1000; // nano seconds
return true;
}
return false;
}
// --- cCondWait ------------------------------------------------------------- // --- cCondWait -------------------------------------------------------------
cCondWait::cCondWait(void) cCondWait::cCondWait(void)
@ -44,15 +60,8 @@ bool cCondWait::Wait(int TimeoutMs)
pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex);
if (!signaled) { if (!signaled) {
if (TimeoutMs) { if (TimeoutMs) {
struct timeval now; struct timespec abstime;
if (gettimeofday(&now, NULL) == 0) { // get current time if (GetAbsTime(&abstime, TimeoutMs)) {
now.tv_usec += TimeoutMs * 1000; // add the timeout
int sec = now.tv_usec / 1000000;
now.tv_sec += sec;
now.tv_usec -= sec * 1000000;
struct timespec abstime; // build timespec for timedwait
abstime.tv_sec = now.tv_sec; // seconds
abstime.tv_nsec = now.tv_usec * 1000; // nano seconds
while (!signaled) { while (!signaled) {
if (pthread_cond_timedwait(&cond, &mutex, &abstime) == ETIMEDOUT) if (pthread_cond_timedwait(&cond, &mutex, &abstime) == ETIMEDOUT)
break; break;
@ -105,17 +114,8 @@ bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs)
bool r = true; // true = condition signaled false = timeout bool r = true; // true = condition signaled false = timeout
if (Mutex.locked) { if (Mutex.locked) {
struct timeval now; // unfortunately timedwait needs the absolute time, not the delta :-( struct timespec abstime;
if (gettimeofday(&now, NULL) == 0) { // get current time if (GetAbsTime(&abstime, TimeoutMs)) {
now.tv_usec += TimeoutMs * 1000; // add the timeout
while (now.tv_usec >= 1000000) { // take care of an overflow
now.tv_sec++;
now.tv_usec -= 1000000;
}
struct timespec abstime; // build timespec for timedwait
abstime.tv_sec = now.tv_sec; // seconds
abstime.tv_nsec = now.tv_usec * 1000; // nano seconds
int locked = Mutex.locked; int locked = Mutex.locked;
Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_timedwait Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_timedwait
// does an implizit unlock of the mutex. // does an implizit unlock of the mutex.
@ -150,8 +150,8 @@ bool cRwLock::Lock(bool Write, int TimeoutMs)
int Result = 0; int Result = 0;
struct timespec abstime; struct timespec abstime;
if (TimeoutMs) { if (TimeoutMs) {
abstime.tv_sec = TimeoutMs / 1000; if (!GetAbsTime(&abstime, TimeoutMs))
abstime.tv_nsec = (TimeoutMs % 1000) * 1000000; TimeoutMs = 0;
} }
if (Write) if (Write)
Result = TimeoutMs ? pthread_rwlock_timedwrlock(&rwlock, &abstime) : pthread_rwlock_wrlock(&rwlock); Result = TimeoutMs ? pthread_rwlock_timedwrlock(&rwlock, &abstime) : pthread_rwlock_wrlock(&rwlock);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: timers.c 1.30 2005/03/20 14:50:37 kls Exp $ * $Id: timers.c 1.31 2005/05/07 11:10:56 kls Exp $
*/ */
#include "timers.h" #include "timers.h"
@ -441,6 +441,10 @@ void cTimer::SetEvent(const cSchedule *Schedule, const cEvent *Event)
void cTimer::SetRecording(bool Recording) void cTimer::SetRecording(bool Recording)
{ {
recording = Recording; recording = Recording;
if (recording)
SetFlags(tfRecording);
else
ClrFlags(tfRecording);
isyslog("timer %s %s", *ToDescr(), recording ? "start" : "stop"); isyslog("timer %s %s", *ToDescr(), recording ? "start" : "stop");
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: timers.h 1.18 2005/03/20 14:47:45 kls Exp $ * $Id: timers.h 1.19 2005/05/07 10:36:35 kls Exp $
*/ */
#ifndef __TIMERS_H #ifndef __TIMERS_H
@ -19,6 +19,7 @@ enum eTimerFlags { tfNone = 0x0000,
tfActive = 0x0001, tfActive = 0x0001,
tfInstant = 0x0002, tfInstant = 0x0002,
tfVps = 0x0004, tfVps = 0x0004,
tfRecording = 0x0008,
tfAll = 0xFFFF, tfAll = 0xFFFF,
}; };
enum eTimerMatch { tmNone, tmPartial, tmFull }; enum eTimerMatch { tmNone, tmPartial, tmFull };

3
vdr.5
View File

@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the .\" License as specified in the file COPYING that comes with the
.\" vdr distribution. .\" vdr distribution.
.\" .\"
.\" $Id: vdr.5 1.35 2005/03/19 15:20:47 kls Exp $ .\" $Id: vdr.5 1.36 2005/05/07 10:40:23 kls Exp $
.\" .\"
.TH vdr 5 "19 Mar 2005" "1.3.23" "Video Disk Recorder Files" .TH vdr 5 "19 Mar 2005" "1.3.23" "Video Disk Recorder Files"
.SH NAME .SH NAME
@ -210,6 +210,7 @@ l l.
\fB1\fR@the timer is active (and will record if it hits) \fB1\fR@the timer is active (and will record if it hits)
\fB2\fR@this is an instant recording timer \fB2\fR@this is an instant recording timer
\fB4\fR@this timer uses VPS \fB4\fR@this timer uses VPS
\fB8\fR@this timer is currently recording (may only be up-to-date with SVDRP)
.TE .TE
Bits other than these can be used by external programs to mark active timers Bits other than these can be used by external programs to mark active timers
and recognize if the user has modified them. When a user modifies an active and recognize if the user has modified them. When a user modifies an active