Version 1.3.35

- Updated 'sources.conf' (thanks to Philip Prindeville).
- Now using daemon() instead of fork() to run VDR in daemon mode (thanks to
  Enrico Scholz).
- Fixed a possible endless loop in a menu with no selectable items if
  Setup.MenuScrollWrap is true (thanks to Enrico Scholz).
- Making sure no item is displayed as "current" if Up, Down, Left or Right is
  pressed in a menu with no selectable items.
- Added '__attribute__' to functions that use printf() like parameters (thanks
  to Darren Salt).
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed a leftover 'summary.vdr' in vdr.1 (reported by Christoph Hermanns).
- Added more error messages and line numbers when reading EPG data and info.vdr
  (thanks to Peter Bieringer).
- Updated the Danish OSD texts (thanks to Mogens Elneff).
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
- Added missing mutex locks to cCiMenu::Abort() and cCiEnquiry::Abort() (reported
  by Marco Schlüßler).
- Fixed lock handling in CAM communication to avoid problems with multiple CAMs
  per device or CAMs with more than one smart card.
- Updated the Greek OSD texts (thanks to Dimitrios Dimitrakos).
- Updated the French OSD texts (thanks to Nicolas Huillard).
- Fixed the cFilter example in PLUGINS.html (reported by Patrick Fischer).
- The new class cUnbufferedFile is used for the recording files to avoid
  trashing the file system cache (based on a patch by Ralf Müller).
This commit is contained in:
Klaus Schmidinger 2005-10-31 18:00:00 +01:00
parent 88d8d63408
commit 99e3c093f4
25 changed files with 463 additions and 243 deletions

View File

@ -920,6 +920,7 @@ Peter Bieringer <pb@bieringer.de>
for reporting a problem with duplicate recordings with the same file name for reporting a problem with duplicate recordings with the same file name
for suggesting to implement the command line option '--vfat' for suggesting to implement the command line option '--vfat'
for reporting a leftover 'summary.vdr' in vdr.5 for reporting a leftover 'summary.vdr' in vdr.5
for adding more error messages and line numbers when reading EPG data and info.vdr
Alexander Damhuis <ad@phonedation.de> Alexander Damhuis <ad@phonedation.de>
for reporting problems when deleting a timer that is currently recording for reporting problems when deleting a timer that is currently recording
@ -1024,6 +1025,7 @@ Rene Bartsch <ml@bartschnet.de>
Christoph Hermanns <christoph.hermanns@gmx.de> Christoph Hermanns <christoph.hermanns@gmx.de>
for reporting a bug in handling the "Red" button in the "Schedules" menu in case for reporting a bug in handling the "Red" button in the "Schedules" menu in case
there are no events listed for a particular channel there are no events listed for a particular channel
for reporting a leftover 'summary.vdr' in vdr.1
Oskar Signell <oskar@signell.net> Oskar Signell <oskar@signell.net>
for pointing out a problem with setting an editing mark while in "Pause" mode, for pointing out a problem with setting an editing mark while in "Pause" mode,
@ -1234,6 +1236,7 @@ Marco Schl
for fixing handling EPG data for time shifted events for fixing handling EPG data for time shifted events
for fixing detecting short channel names for "Kabel Deutschland" for fixing detecting short channel names for "Kabel Deutschland"
for reporting that the FATALERRNO macro needs to check for a non-zero errno value for reporting that the FATALERRNO macro needs to check for a non-zero errno value
for reporting missing mutex locks in cCiMenu::Abort() and cCiEnquiry::Abort()
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
@ -1343,6 +1346,7 @@ Darren Salt <linux@youmustbejoking.demon.co.uk>
pages pages
for a patch that was used to add the command line options '--lirc', '--rcu' and for a patch that was used to add the command line options '--lirc', '--rcu' and
'--no-kbd' '--no-kbd'
for adding '__attribute__' to functions that use printf() like parameters
Sean Carlos <seanc@libero.it> Sean Carlos <seanc@libero.it>
for translating OSD texts to the Italian language for translating OSD texts to the Italian language
@ -1502,3 +1506,20 @@ Alexander Rieger <Alexander.Rieger@inka.de>
for fixing handling color buttons in cMenuEditStrItem for fixing handling color buttons in cMenuEditStrItem
for making the '.update' file in the video directory be touched when a recording is for making the '.update' file in the video directory be touched when a recording is
added or deleted, so that other VDR instances can update their lists added or deleted, so that other VDR instances can update their lists
Philip Prindeville <philipp_subx@redfish-solutions.com>
for updates to 'sources.conf'
Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
for making VDR use use daemon() instead of fork() to run in daemon mode
for fixing a possible endless loop in a menu with no selectable items if
Setup.MenuScrollWrap is true (thanks to Enrico Scholz).
Nicolas Huillard <nhuillard@e-dition.fr>
for translating OSD texts to the French language
Patrick Fischer <patrick_fischer@gmx.de>
for reporting an error in the cFilter example in PLUGINS.html
Ralf Müller <ralf@bj-ig.de>
for a patch that was used to implement cUnbufferedFile

27
HISTORY
View File

@ -3885,3 +3885,30 @@ Video Disk Recorder Revision History
- The character 0x8A in CAM menu strings is now mapped to a real newline. - The character 0x8A in CAM menu strings is now mapped to a real newline.
- The 'sub-title' and 'bottom text' in the CAM menu can now consist of several lines. - The 'sub-title' and 'bottom text' in the CAM menu can now consist of several lines.
- Improved the CAM enquiry menu. - Improved the CAM enquiry menu.
2005-10-31: Version 1.3.35
- Updated 'sources.conf' (thanks to Philip Prindeville).
- Now using daemon() instead of fork() to run VDR in daemon mode (thanks to
Enrico Scholz).
- Fixed a possible endless loop in a menu with no selectable items if
Setup.MenuScrollWrap is true (thanks to Enrico Scholz).
- Making sure no item is displayed as "current" if Up, Down, Left or Right is
pressed in a menu with no selectable items.
- Added '__attribute__' to functions that use printf() like parameters (thanks
to Darren Salt).
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed a leftover 'summary.vdr' in vdr.1 (reported by Christoph Hermanns).
- Added more error messages and line numbers when reading EPG data and info.vdr
(thanks to Peter Bieringer).
- Updated the Danish OSD texts (thanks to Mogens Elneff).
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
- Added missing mutex locks to cCiMenu::Abort() and cCiEnquiry::Abort() (reported
by Marco Schlüßler).
- Fixed lock handling in CAM communication to avoid problems with multiple CAMs
per device or CAMs with more than one smart card.
- Updated the Greek OSD texts (thanks to Dimitrios Dimitrakos).
- Updated the French OSD texts (thanks to Nicolas Huillard).
- Fixed the cFilter example in PLUGINS.html (reported by Patrick Fischer).
- The new class cUnbufferedFile is used for the recording files to avoid
trashing the file system cache (based on a patch by Ralf Müller).

View File

@ -1447,7 +1447,7 @@ An instance of such a filter needs to be attached to the device from
which it shall receive data, as in which it shall receive data, as in
<p><table><tr><td bgcolor=#F0F0F0><pre> <p><table><tr><td bgcolor=#F0F0F0><pre>
cMyFilter Filter; cMyFilter *Filter = new cMyFilter();
cDevice::ActualDevice()-&gt;AttachFilter(Filter); cDevice::ActualDevice()-&gt;AttachFilter(Filter);
</pre></td></tr></table><p> </pre></td></tr></table><p>

View File

@ -8,12 +8,12 @@ hr-fernsehen;ARD:11836:hC34:S19.2E:27500:301:302=deu:304:0:28108:1:1101:0
NDR FS MV;ARD:12109:hC34:S19.2E:27500:2401:2402=deu:2404:0:28224:1:1073:0 NDR FS MV;ARD:12109:hC34:S19.2E:27500:2401:2402=deu:2404:0:28224:1:1073:0
SR SÜDWEST Fernsehen;ARD:12265:hC34:S19.2E:27500:1301:1302=deu:1304:0:28486:1:1093:0 SR SÜDWEST Fernsehen;ARD:12265:hC34:S19.2E:27500:1301:1302=deu:1304:0:28486:1:1093:0
WDR Köln;ARD:11836:hC34:S19.2E:27500:601:602=deu:604:0:28111:1:1101:0 WDR Köln;ARD:11836:hC34:S19.2E:27500:601:602=deu:604:0:28111:1:1101:0
BR-alpha;ARD:11836:hC34:S19.2E:27500:701:702=deu;703:704:0:28112:1:1101:0 BR-alpha;ARD:11836:hC34:S19.2E:27500:701:702=deu:704:0:28112:1:1101:0
SÜDWEST Ferns. BW;ARD:11836:hC34:S19.2E:27500:801:802=deu:804:0:28113:1:1101:0 SÜDWEST Ferns. BW;ARD:11836:hC34:S19.2E:27500:801:802=deu:804:0:28113:1:1101:0
Phoenix;ARD:11836:hC34:S19.2E:27500:901:902=deu:904:0:28114:1:1101:0 Phoenix;ARD:11836:hC34:S19.2E:27500:901:902=deu:904:0:28114:1:1101:0
ZDF;ZDFvision:11953:hC34:S19.2E:27500:110:120=deu,121=2ch;125=dd:130:0:28006:1:1079:0 ZDF;ZDFvision:11953:hC34:S19.2E:27500:110:120=deu,121=2ch;125=dd:130:0:28006:1:1079:0
3sat;ZDFvision:11953:hC34:S19.2E:27500:210:220=deu,221=2ch;225=dd:230:0:28007:1:1079:0 3sat;ZDFvision:11953:hC34:S19.2E:27500:210:220=deu,221=2ch;225=dd:230:0:28007:1:1079:0
KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320:330:0:28008:1:1079:0 KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320=deu:330:0:28008:1:1079:0
arte;ARD:11836:hC34:S19.2E:27500:401:402=deu,403=fra:404:0:28109:1:1101:0 arte;ARD:11836:hC34:S19.2E:27500:401:402=deu,403=fra:404:0:28109:1:1101:0
ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:1762,D05,1702,1801:13001:1:1117:0 ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:1762,D05,1702,1801:13001:1:1117:0
ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu;503=deu:505:1762,D05,1702,1801:13002:1:1117:0 ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu;503=deu:505:1762,D05,1702,1801:13002:1:1117:0
@ -27,8 +27,8 @@ NEUN LIVE Television,NEUN LIVE;BetaDigital:12480:vC34:S19.2E:27500:767:768=deu:3
DSF;BetaDigital:12480:vC34:S19.2E:27500:1023:1024=deu:39:0:900:133:33:0 DSF;BetaDigital:12480:vC34:S19.2E:27500:1023:1024=deu:39:0:900:133:33:0
HSE24,HSE24;BetaDigital:12480:vC34:S19.2E:27500:1279:1280=deu:37:0:40:133:33:0 HSE24,HSE24;BetaDigital:12480:vC34:S19.2E:27500:1279:1280=deu:37:0:40:133:33:0
Bloomberg TV Germany;Bloomberg:12551:vC56:S19.2E:22000:162:99=deu:0:0:12160:1:1108:0 Bloomberg TV Germany;Bloomberg:12551:vC56:S19.2E:22000:162:99=deu:0:0:12160:1:1108:0
EURONEWS;CSAT:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,98=por,99=deu,91=rus: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:501:502=deu:504:0:28205:1:1073:0 rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28205:1:1073:0
Sky News:11597:vC56:S19.2E:22000:305+131:306=eng:0:0:28707:1:1026:0 Sky News:11597:vC56:S19.2E:22000:305+131:306=eng:0:0:28707:1:1026:0
Veronica/JETIX;CANALDIGITAAL:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,100:5020:53:1109:0 Veronica/JETIX;CANALDIGITAAL:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,100:5020:53:1109:0
BVN;CANALDIGITAAL:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0 BVN;CANALDIGITAAL:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0
@ -45,13 +45,13 @@ MDR FERNSEHEN;ARD:12109:hC34:S19.2E:27500:401:402=deu:404:0:28204:1:1073:0
rbb Berlin;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0 rbb Berlin;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0
:Premiere World :Premiere World
PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1:8:133:2:0 PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1:8:133:2:0
PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu;515=deu:32:1:10:133:2:0 PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu,513=deu;515=deu:32:1:10:133:2:0
PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu;1795=deu:32:1:11:133:2:0 PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu,1793=deu;1795=deu:32:1:11:133:2:0
PREMIERE 3,PREM 3;PREMIERE:11797:hC34:S19.2E:27500:2303:2304=deu,2305=deu:32:1:43:133:2:0 PREMIERE 3,PREM 3;PREMIERE:11797:hC34:S19.2E:27500:2303:2304=deu,2305=deu:32:1:43:133:2:0
PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1801,1722,1702:9:133:2:0 PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1801,1722,1702:9:133:2:0
PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu,1281=deu:32:1722,1702,1801:29:133:2:0 PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu,1281=deu:32:1722,1702,1801:29:133:2:0
PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1:41:133:2:0 PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1:41:133:2:0
PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1801,1722,1702:20:133:2:0 PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1801,1702,1722:20:133:2:0
DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32: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
@ -89,7 +89,7 @@ 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:515+8190:643=eng:579:960,961:4705:2:2027:0 Sky One;BSkyB:12226:hC23:S28.2E:27500:515+8190:643=eng:579:960,961:4705:2:2027:0
Sky Mix;BSkyB:12226:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:5104:2:2027:0 Sky Two;BSkyB:12226:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:5104:2:2027:0
ITV2;BSkyB:10758:vC56:S28.2E:22000:2314:2315=eng,2363=NAR:2317:960,961:10070:2:2044:0 ITV2;BSkyB:10758:vC56:S28.2E:22000:2314:2315=eng,2363=NAR:2317:960,961:10070:2:2044:0
Sci-Fi;BSkyB:12148:hC23:S28.2E:27500:512+8190:640=eng:576: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:2326=eng,2327=NAR:2315:960,961:5904:2:2025:0 Paramount;BSkyB:12187:hC23:S28.2E:27500:2313+2304:2326=eng,2327=NAR:2315:960,961:5904:2:2025:0

45
ci.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: ci.c 1.36 2005/10/03 12:58:22 kls Exp $ * $Id: ci.c 1.38 2005/10/30 13:04:10 kls Exp $
*/ */
#include "ci.h" #include "ci.h"
@ -156,7 +156,7 @@ public:
uint8_t Status(void); uint8_t Status(void);
int Write(int fd); int Write(int fd);
int Read(int fd); int Read(int fd);
void Dump(bool Outgoing); void Dump(int fd, bool Outgoing);
}; };
cTPDU::cTPDU(uint8_t Slot, uint8_t Tcid, uint8_t Tag, int Length, const uint8_t *Data) cTPDU::cTPDU(uint8_t Slot, uint8_t Tcid, uint8_t Tag, int Length, const uint8_t *Data)
@ -207,9 +207,9 @@ cTPDU::cTPDU(uint8_t Slot, uint8_t Tcid, uint8_t Tag, int Length, const uint8_t
int cTPDU::Write(int fd) int cTPDU::Write(int fd)
{ {
Dump(true); Dump(fd, true);
if (size) if (size)
return write(fd, data, size) == size ? OK : ERROR; return safe_write(fd, data, size) == size ? OK : ERROR;
esyslog("ERROR: attemp to write TPDU with zero size"); esyslog("ERROR: attemp to write TPDU with zero size");
return ERROR; return ERROR;
} }
@ -222,15 +222,15 @@ int cTPDU::Read(int fd)
size = 0; size = 0;
return ERROR; return ERROR;
} }
Dump(false); Dump(fd, false);
return OK; return OK;
} }
void cTPDU::Dump(bool Outgoing) void cTPDU::Dump(int fd, bool Outgoing)
{ {
if (DumpTPDUDataTransfer) { if (DumpTPDUDataTransfer) {
#define MAX_DUMP 256 #define MAX_DUMP 256
fprintf(stderr, "%s ", Outgoing ? "-->" : "<--"); fprintf(stderr, "%2d %s ", fd, Outgoing ? "-->" : "<--");
for (int i = 0; i < size && i < MAX_DUMP; i++) for (int i = 0; i < size && i < MAX_DUMP; i++)
fprintf(stderr, "%02X ", data[i]); fprintf(stderr, "%02X ", data[i]);
fprintf(stderr, "%s\n", size >= MAX_DUMP ? "..." : ""); fprintf(stderr, "%s\n", size >= MAX_DUMP ? "..." : "");
@ -1048,12 +1048,12 @@ cCiMMI::cCiMMI(int SessionId, cCiTransportConnection *Tc)
cCiMMI::~cCiMMI() cCiMMI::~cCiMMI()
{ {
if (fetchedMenu) { if (fetchedMenu) {
cMutexLock MutexLock(&fetchedMenu->mutex); cMutexLock MutexLock(fetchedMenu->mutex);
fetchedMenu->mmi = NULL; fetchedMenu->mmi = NULL;
} }
delete menu; delete menu;
if (fetchedEnquiry) { if (fetchedEnquiry) {
cMutexLock MutexLock(&fetchedEnquiry->mutex); cMutexLock MutexLock(fetchedEnquiry->mutex);
fetchedEnquiry->mmi = NULL; fetchedEnquiry->mmi = NULL;
} }
delete enquiry; delete enquiry;
@ -1227,7 +1227,7 @@ cCiMenu::cCiMenu(cCiMMI *MMI, bool Selectable)
cCiMenu::~cCiMenu() cCiMenu::~cCiMenu()
{ {
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(mutex);
if (mmi) if (mmi)
mmi->Menu(true); mmi->Menu(true);
free(titleText); free(titleText);
@ -1254,7 +1254,8 @@ bool cCiMenu::HasUpdate(void)
bool cCiMenu::Select(int Index) bool cCiMenu::Select(int Index)
{ {
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(mutex);
dbgprotocol("%d: ==> Select %d\n", mmi ? mmi->SessionId() : -1, Index);
if (mmi && -1 <= Index && Index < numEntries) if (mmi && -1 <= Index && Index < numEntries)
return mmi->SendMenuAnswer(Index + 1); return mmi->SendMenuAnswer(Index + 1);
return false; return false;
@ -1267,6 +1268,7 @@ bool cCiMenu::Cancel(void)
bool cCiMenu::Abort(void) bool cCiMenu::Abort(void)
{ {
cMutexLock MutexLock(mutex);
return mmi && mmi->SendCloseMMI(); return mmi && mmi->SendCloseMMI();
} }
@ -1282,7 +1284,7 @@ cCiEnquiry::cCiEnquiry(cCiMMI *MMI)
cCiEnquiry::~cCiEnquiry() cCiEnquiry::~cCiEnquiry()
{ {
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(mutex);
if (mmi) if (mmi)
mmi->Enquiry(true); mmi->Enquiry(true);
free(text); free(text);
@ -1290,7 +1292,7 @@ cCiEnquiry::~cCiEnquiry()
bool cCiEnquiry::Reply(const char *s) bool cCiEnquiry::Reply(const char *s)
{ {
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(mutex);
return mmi ? mmi->SendAnswer(s) : false; return mmi ? mmi->SendAnswer(s) : false;
} }
@ -1301,6 +1303,7 @@ bool cCiEnquiry::Cancel(void)
bool cCiEnquiry::Abort(void) bool cCiEnquiry::Abort(void)
{ {
cMutexLock MutexLock(mutex);
return mmi && mmi->SendCloseMMI(); return mmi && mmi->SendCloseMMI();
} }
@ -1617,8 +1620,12 @@ cCiMenu *cCiHandler::GetMenu(void)
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(&mutex);
for (int Slot = 0; Slot < numSlots; Slot++) { for (int Slot = 0; Slot < numSlots; Slot++) {
cCiMMI *mmi = (cCiMMI *)GetSessionByResourceId(RI_MMI, Slot); cCiMMI *mmi = (cCiMMI *)GetSessionByResourceId(RI_MMI, Slot);
if (mmi) if (mmi) {
return mmi->Menu(); cCiMenu *Menu = mmi->Menu();
if (Menu)
Menu->mutex = &mutex;
return Menu;
}
} }
return NULL; return NULL;
} }
@ -1628,8 +1635,12 @@ cCiEnquiry *cCiHandler::GetEnquiry(void)
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(&mutex);
for (int Slot = 0; Slot < numSlots; Slot++) { for (int Slot = 0; Slot < numSlots; Slot++) {
cCiMMI *mmi = (cCiMMI *)GetSessionByResourceId(RI_MMI, Slot); cCiMMI *mmi = (cCiMMI *)GetSessionByResourceId(RI_MMI, Slot);
if (mmi) if (mmi) {
return mmi->Enquiry(); cCiEnquiry *Enquiry = mmi->Enquiry();
if (Enquiry)
Enquiry->mutex = &mutex;
return Enquiry;
}
} }
return NULL; return NULL;
} }

8
ci.h
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: ci.h 1.17 2005/10/03 12:49:52 kls Exp $ * $Id: ci.h 1.18 2005/10/30 12:31:14 kls Exp $
*/ */
#ifndef __CI_H #ifndef __CI_H
@ -17,11 +17,12 @@
class cCiMMI; class cCiMMI;
class cCiMenu { class cCiMenu {
friend class cCiHandler;
friend class cCiMMI; friend class cCiMMI;
private: private:
enum { MAX_CIMENU_ENTRIES = 64 }; ///< XXX is there a specified maximum? enum { MAX_CIMENU_ENTRIES = 64 }; ///< XXX is there a specified maximum?
cCiMMI *mmi; cCiMMI *mmi;
cMutex mutex; cMutex *mutex;
bool selectable; bool selectable;
char *titleText; char *titleText;
char *subTitleText; char *subTitleText;
@ -45,10 +46,11 @@ public:
}; };
class cCiEnquiry { class cCiEnquiry {
friend class cCiHandler;
friend class cCiMMI; friend class cCiMMI;
private: private:
cCiMMI *mmi; cCiMMI *mmi;
cMutex mutex; cMutex *mutex;
char *text; char *text;
bool blind; bool blind;
int expectedLength; int expectedLength;

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.230 2005/10/01 10:41:33 kls Exp $ * $Id: config.h 1.231 2005/10/08 08:48:38 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -19,8 +19,8 @@
#include "i18n.h" #include "i18n.h"
#include "tools.h" #include "tools.h"
#define VDRVERSION "1.3.34" #define VDRVERSION "1.3.35"
#define VDRVERSNUM 10334 // Version * 10000 + Major * 100 + Minor #define VDRVERSNUM 10335 // 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: cutter.c 1.10 2005/08/14 10:51:54 kls Exp $ * $Id: cutter.c 1.11 2005/10/31 12:26:44 kls Exp $
*/ */
#include "cutter.h" #include "cutter.h"
@ -18,7 +18,7 @@
class cCuttingThread : public cThread { class cCuttingThread : public cThread {
private: private:
const char *error; const char *error;
int fromFile, toFile; cUnbufferedFile *fromFile, *toFile;
cFileName *fromFileName, *toFileName; cFileName *fromFileName, *toFileName;
cIndexFile *fromIndex, *toIndex; cIndexFile *fromIndex, *toIndex;
cMarks fromMarks, toMarks; cMarks fromMarks, toMarks;
@ -34,7 +34,7 @@ cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName)
:cThread("video cutting") :cThread("video cutting")
{ {
error = NULL; error = NULL;
fromFile = toFile = -1; fromFile = toFile = NULL;
fromFileName = toFileName = NULL; fromFileName = toFileName = NULL;
fromIndex = toIndex = NULL; fromIndex = toIndex = NULL;
if (fromMarks.Load(FromFileName) && fromMarks.Count()) { if (fromMarks.Load(FromFileName) && fromMarks.Count()) {
@ -64,7 +64,7 @@ void cCuttingThread::Action(void)
if (Mark) { if (Mark) {
fromFile = fromFileName->Open(); fromFile = fromFileName->Open();
toFile = toFileName->Open(); toFile = toFileName->Open();
if (fromFile < 0 || toFile < 0) if (!fromFile || !toFile)
return; return;
int Index = Mark->position; int Index = Mark->position;
Mark = fromMarks.Next(Mark); Mark = fromMarks.Next(Mark);
@ -92,7 +92,7 @@ void cCuttingThread::Action(void)
fromFile = fromFileName->SetOffset(FileNumber, FileOffset); fromFile = fromFileName->SetOffset(FileNumber, FileOffset);
CurrentFileNumber = FileNumber; CurrentFileNumber = FileNumber;
} }
if (fromFile >= 0) { if (fromFile) {
int len = ReadFrame(fromFile, buffer, Length, sizeof(buffer)); int len = ReadFrame(fromFile, buffer, Length, sizeof(buffer));
if (len < 0) { if (len < 0) {
error = "ReadFrame"; error = "ReadFrame";
@ -131,7 +131,7 @@ void cCuttingThread::Action(void)
cutIn = false; cutIn = false;
} }
} }
if (safe_write(toFile, buffer, Length) < 0) { if (toFile->Write(buffer, Length) < 0) {
error = "safe_write"; error = "safe_write";
break; break;
} }

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.40 2005/08/29 15:43:30 kls Exp $ * $Id: dvbplayer.c 1.41 2005/10/31 12:33:48 kls Exp $
*/ */
#include "dvbplayer.h" #include "dvbplayer.h"
@ -74,7 +74,7 @@ int cBackTrace::Get(bool Forward)
class cNonBlockingFileReader : public cThread { class cNonBlockingFileReader : public cThread {
private: private:
int f; cUnbufferedFile *f;
uchar *buffer; uchar *buffer;
int wanted; int wanted;
int length; int length;
@ -86,14 +86,14 @@ public:
cNonBlockingFileReader(void); cNonBlockingFileReader(void);
~cNonBlockingFileReader(); ~cNonBlockingFileReader();
void Clear(void); void Clear(void);
int Read(int FileHandle, uchar *Buffer, int Length); int Read(cUnbufferedFile *File, uchar *Buffer, int Length);
bool Reading(void) { return buffer; } bool Reading(void) { return buffer; }
}; };
cNonBlockingFileReader::cNonBlockingFileReader(void) cNonBlockingFileReader::cNonBlockingFileReader(void)
:cThread("non blocking file reader") :cThread("non blocking file reader")
{ {
f = -1; f = NULL;
buffer = NULL; buffer = NULL;
wanted = length = 0; wanted = length = 0;
hasData = false; hasData = false;
@ -110,7 +110,7 @@ cNonBlockingFileReader::~cNonBlockingFileReader()
void cNonBlockingFileReader::Clear(void) void cNonBlockingFileReader::Clear(void)
{ {
Lock(); Lock();
f = -1; f = NULL;
free(buffer); free(buffer);
buffer = NULL; buffer = NULL;
wanted = length = 0; wanted = length = 0;
@ -119,7 +119,7 @@ void cNonBlockingFileReader::Clear(void)
newSet.Signal(); newSet.Signal();
} }
int cNonBlockingFileReader::Read(int FileHandle, uchar *Buffer, int Length) int cNonBlockingFileReader::Read(cUnbufferedFile *File, uchar *Buffer, int Length)
{ {
if (hasData && buffer) { if (hasData && buffer) {
if (buffer != Buffer) { if (buffer != Buffer) {
@ -131,7 +131,7 @@ int cNonBlockingFileReader::Read(int FileHandle, uchar *Buffer, int Length)
return length; return length;
} }
if (!buffer) { if (!buffer) {
f = FileHandle; f = File;
buffer = Buffer; buffer = Buffer;
wanted = Length; wanted = Length;
length = 0; length = 0;
@ -146,8 +146,8 @@ void cNonBlockingFileReader::Action(void)
{ {
while (Running()) { while (Running()) {
Lock(); Lock();
if (!hasData && f >= 0 && buffer) { if (!hasData && f && buffer) {
int r = safe_read(f, buffer + length, wanted - length); int r = f->Read(buffer + length, wanted - length);
if (r >= 0) { if (r >= 0) {
length += r; length += r;
if (!r || length == wanted) // r == 0 means EOF if (!r || length == wanted) // r == 0 means EOF
@ -181,7 +181,7 @@ private:
cBackTrace *backTrace; cBackTrace *backTrace;
cFileName *fileName; cFileName *fileName;
cIndexFile *index; cIndexFile *index;
int replayFile; cUnbufferedFile *replayFile;
bool eof; bool eof;
bool firstPacket; bool firstPacket;
ePlayModes playMode; ePlayModes playMode;
@ -237,7 +237,7 @@ cDvbPlayer::cDvbPlayer(const char *FileName)
isyslog("replay %s", FileName); isyslog("replay %s", FileName);
fileName = new cFileName(FileName, false); fileName = new cFileName(FileName, false);
replayFile = fileName->Open(); replayFile = fileName->Open();
if (replayFile < 0) if (!replayFile)
return; return;
ringBuffer = new cRingBufferFrame(PLAYERBUFSIZE); ringBuffer = new cRingBufferFrame(PLAYERBUFSIZE);
// Create the index file: // Create the index file:
@ -302,10 +302,10 @@ bool cDvbPlayer::NextFile(uchar FileNumber, int FileOffset)
{ {
if (FileNumber > 0) if (FileNumber > 0)
replayFile = fileName->SetOffset(FileNumber, FileOffset); replayFile = fileName->SetOffset(FileNumber, FileOffset);
else if (replayFile >= 0 && eof) else if (replayFile && eof)
replayFile = fileName->NextFile(); replayFile = fileName->NextFile();
eof = false; eof = false;
return replayFile >= 0; return replayFile != NULL;
} }
int cDvbPlayer::Resume(void) int cDvbPlayer::Resume(void)
@ -342,7 +342,7 @@ bool cDvbPlayer::Save(void)
void cDvbPlayer::Activate(bool On) void cDvbPlayer::Activate(bool On)
{ {
if (On) { if (On) {
if (replayFile >= 0) if (replayFile)
Start(); Start();
} }
else else
@ -376,7 +376,7 @@ void cDvbPlayer::Action(void)
// Read the next frame from the file: // Read the next frame from the file:
if (playMode != pmStill && playMode != pmPause) { if (playMode != pmStill && playMode != pmPause) {
if (!readFrame && (replayFile >= 0 || readIndex >= 0)) { if (!readFrame && (replayFile || 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;

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.37 2005/09/09 15:14:11 kls Exp $ * $Id: epg.c 1.38 2005/10/09 12:57:55 kls Exp $
*/ */
#include "epg.h" #include "epg.h"
@ -285,8 +285,10 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
if (Schedule) { if (Schedule) {
cEvent *Event = NULL; cEvent *Event = NULL;
char *s; char *s;
int line = 0;
cReadLine ReadLine; cReadLine ReadLine;
while ((s = ReadLine.Read(f)) != NULL) { while ((s = ReadLine.Read(f)) != NULL) {
line++;
char *t = skipspace(s + 1); char *t = skipspace(s + 1);
switch (*s) { switch (*s) {
case 'E': if (!Event) { case 'E': if (!Event) {
@ -316,10 +318,12 @@ bool cEvent::Read(FILE *f, cSchedule *Schedule)
break; break;
case 'c': // to keep things simple we react on 'c' here case 'c': // to keep things simple we react on 'c' here
return true; return true;
default: if (Event && !Event->Parse(s)) default: if (Event && !Event->Parse(s)) {
esyslog("ERROR: EPG data problem in line %d", line);
return false; return false;
} }
} }
}
esyslog("ERROR: unexpected end of file while reading EPG data"); esyslog("ERROR: unexpected end of file while reading EPG data");
} }
return false; return false;

222
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.213 2005/10/03 12:27:15 kls Exp $ * $Id: i18n.c 1.218 2005/10/30 13:37:57 kls Exp $
* *
* Translations provided by: * Translations provided by:
* *
@ -12,7 +12,7 @@
* Italian Alberto Carraro <bertocar@tin.it>, Antonio Ospite <ospite@studenti.unina.it>, Sean Carlos <seanc@libero.it> * Italian Alberto Carraro <bertocar@tin.it>, Antonio Ospite <ospite@studenti.unina.it>, Sean Carlos <seanc@libero.it>
* Dutch Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, Hans Dingemans <hans.dingemans@tacticalops.nl> * Dutch Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, Hans Dingemans <hans.dingemans@tacticalops.nl>
* Portuguese Paulo Lopes <pmml@netvita.pt> * Portuguese Paulo Lopes <pmml@netvita.pt>
* French Jean-Claude Repetto <jc@repetto.org>, Olivier Jacques <jacquesolivier@hotmail.com>, Gregoire Favre <greg@magma.unil.ch> * French Jean-Claude Repetto <jc@repetto.org>, Olivier Jacques <jacquesolivier@hotmail.com>, Gregoire Favre <greg@magma.unil.ch>, Nicolas Huillard <nhuillard@e-dition.fr>
* Norwegian Jørgen Tvedt <pjtvedt@online.no>, Truls Slevigen <truls@slevigen.no> * Norwegian Jørgen Tvedt <pjtvedt@online.no>, Truls Slevigen <truls@slevigen.no>
* Finnish Hannu Savolainen <hannu@opensound.com>, Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, Niko Tarnanen <niko.tarnanen@hut.fi>, Rolf Ahrenberg <rahrenbe@cc.hut.fi> * Finnish Hannu Savolainen <hannu@opensound.com>, Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, Niko Tarnanen <niko.tarnanen@hut.fi>, Rolf Ahrenberg <rahrenbe@cc.hut.fi>
* Polish Michael Rakowski <mrak@gmx.de> * Polish Michael Rakowski <mrak@gmx.de>
@ -218,7 +218,7 @@ const tI18nPhrase Phrases[] = {
"Timers", "Timers",
"Programmation", "Programmation",
"Timere", "Timere",
"Ajastin", "Ajastimet",
"Timery", "Timery",
"Timer", "Timer",
"×ñïíïäéáêüðôçò", "×ñïíïäéáêüðôçò",
@ -258,19 +258,19 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Infos sur l'enregistrement",
"",// TODO "",// TODO
"Tallenteen tiedot", "Tallenteen tiedot",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÅããñáöÞ",
"Inspelning", "Inspelning",
"Detaliile înregistrãrii", "Detaliile înregistrãrii",
"",// TODO "",// TODO
"",// TODO "",// TODO
"¸ÝäÞ Þ ×ÐßØáØ", "¸ÝäÞ Þ ×ÐßØáØ",
"",// TODO "",// TODO
"",// TODO "Salvestuse info",
"Optagelses info", "Optagelses info",
}, },
{ "Setup", { "Setup",
@ -323,7 +323,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"Commandes d'enregistrement", "Commandes d'enregistrement",
"",// TODO "",// TODO
"Tallennuskomennot", "Tallennekomennot",
"Rozkazy Nagran", "Rozkazy Nagran",
"Órdenes de grabación", "Órdenes de grabación",
"ÅíôïëÝò ãéÜ åããñáöÝò", "ÅíôïëÝò ãéÜ åããñáöÝò",
@ -426,12 +426,12 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "Info",
"",//TODO "",//TODO
"Tiedot", "Tiedot",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "Ðëçñïöïñßåò",
"Info", "Info",
"Info", "Info",
"",//TODO "",//TODO
@ -537,7 +537,7 @@ const tI18nPhrase Phrases[] = {
"Uusi", "Uusi",
"Nowy", "Nowy",
"Nuevo", "Nuevo",
"ÍÝï", "NÝï",
"Ny", "Ny",
"Nou", "Nou",
"Új", "Új",
@ -910,7 +910,7 @@ const tI18nPhrase Phrases[] = {
"Inserisci", "Inserisci",
"Invoegen", "Invoegen",
"",// TODO "",// TODO
"Insért", "Insérer",
"",// TODO "",// TODO
"Lisää", "Lisää",
"Wstawiac", "Wstawiac",
@ -975,7 +975,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"Réinitialisation", "Réinitialisation",
"",//TODO "",//TODO
"Alusta", "Nollaa",
"Reset", "Reset",
"Reiniciar", "Reiniciar",
"ÅðáíáöïñÜ", "ÅðáíáöïñÜ",
@ -999,7 +999,7 @@ const tI18nPhrase Phrases[] = {
"Päivitä", "Päivitä",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "ÓÜñùóç",
"Skanna", "Skanna",
"Cãutare canale", "Cãutare canale",
"",//TODO "",//TODO
@ -1081,7 +1081,7 @@ const tI18nPhrase Phrases[] = {
"Timer activo - têm a certeza que quer apagar?", "Timer activo - têm a certeza que quer apagar?",
"Enregistrement en cours - confirmez la suppression", "Enregistrement en cours - confirmez la suppression",
"Timer gjør opptak - vil du slette likevel?", "Timer gjør opptak - vil du slette likevel?",
"Ajastettu tallennus käynnissä - keskeytetäänkö?", "Ajastettu tallennus käynnissä - poistetaanko silti?",
"Nagrywanie w trakcie - napewno usunac?", "Nagrywanie w trakcie - napewno usunac?",
"¿Timer activo - de verdad eliminarlo?", "¿Timer activo - de verdad eliminarlo?",
"×ñïíïäéáêüðôçò óÝ åîÝëéîç - ÄéáãñáöÞ óßãïõñá?", "×ñïíïäéáêüðôçò óÝ åîÝëéîç - ÄéáãñáöÞ óßãïõñá?",
@ -1123,7 +1123,7 @@ const tI18nPhrase Phrases[] = {
"no interface primário", "no interface primário",
"sur la carte primaire", "sur la carte primaire",
"på første enhet", "på første enhet",
"päävastaanottimella", "ensisijaisella sovittimella",
"na pierwszym interfejsie", "na pierwszym interfejsie",
"en interface primario", "en interface primario",
"óôÞí êýñéá êÜñôá", "óôÞí êýñéá êÜñôá",
@ -1231,7 +1231,7 @@ const tI18nPhrase Phrases[] = {
"Tallennus alkaa %d min kuluttua - sammutetaanko?", "Tallennus alkaa %d min kuluttua - sammutetaanko?",
"Nagrywanie za %d minut - mimo to wylaczyc?", "Nagrywanie za %d minut - mimo to wylaczyc?",
"Grabando en %d minutos, ¿de verdad apagar?", "Grabando en %d minutos, ¿de verdad apagar?",
"ÁíáìÝíåôáé åããñáöÞ óÝ %d ëåðôÜ - ÔåëéêÜ íá ôåñìáôéóôåé?", "ÁíáìÝíåôáé åããñáöÞ óÝ %d ëåðôÜ - ÔåëéêÜ íá ôåñìáôéóôåß?",
"Inspelning startar om %d minuter, vill du avsluta?", "Inspelning startar om %d minuter, vill du avsluta?",
"Înregistrez peste %d minute - închid, totuºi?", "Înregistrez peste %d minute - închid, totuºi?",
"Felvétel %d perc mulva kezdödik - mégis kikapcsolni?", "Felvétel %d perc mulva kezdödik - mégis kikapcsolni?",
@ -1397,7 +1397,7 @@ const tI18nPhrase Phrases[] = {
"Ppid", "Ppid",
"Ppid", "Ppid",
"Ppid", "Ppid",
"Aikatieto-PID", "PCR-PID",
"Ppid", "Ppid",
"Ppid", "Ppid",
"Ppid", "Ppid",
@ -1523,7 +1523,7 @@ const tI18nPhrase Phrases[] = {
"Encriptação", "Encriptação",
"Cryptage", "Cryptage",
"Kortleser", "Kortleser",
"Salaus", "Salaus (CA)",
"CA", "CA",
"CA", "CA",
"CA", "CA",
@ -1607,7 +1607,7 @@ const tI18nPhrase Phrases[] = {
"CoderateH", "CoderateH",
"CoderateH", "CoderateH",
"CoderateH", "CoderateH",
"Yläsuojaustaso", "Suojaustaso (HP)",
"CoderateH", "CoderateH",
"CoderateH", "CoderateH",
"CoderateH", "CoderateH",
@ -1628,7 +1628,7 @@ const tI18nPhrase Phrases[] = {
"CoderateL", "CoderateL",
"CoderateL", "CoderateL",
"CoderateL", "CoderateL",
"Alasuojaustaso", "Suojaustaso (LP)",
"CoderateL", "CoderateL",
"CoderateL", "CoderateL",
"CoderateL", "CoderateL",
@ -1670,7 +1670,7 @@ const tI18nPhrase Phrases[] = {
"Transmission", "Transmission",
"Transmission", "Transmission",
"Transmission", "Transmission",
"Lähetystila", "Transmissio",
"Transmisja", "Transmisja",
"Transmission", "Transmission",
"Transmission", "Transmission",
@ -1715,7 +1715,7 @@ const tI18nPhrase Phrases[] = {
"Hierarkia", "Hierarkia",
"Hierachia", "Hierachia",
"Hierarchy", "Hierarchy",
"Hierarchy", "Éåñáñ÷åßá",
"Hierarchy", "Hierarchy",
"Ierarhie", "Ierarhie",
"Hierarchy", "Hierarchy",
@ -1842,7 +1842,7 @@ const tI18nPhrase Phrases[] = {
"VPS", "VPS",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "VPS",
"VPS", "VPS",
"VPS", "VPS",
"",// TODO "",// TODO
@ -2071,7 +2071,7 @@ const tI18nPhrase Phrases[] = {
"Nenhuma placa DVB disponivel para gravar!", "Nenhuma placa DVB disponivel para gravar!",
"Pas de carte DVB disponible pour l'enregistrement!", "Pas de carte DVB disponible pour l'enregistrement!",
"Ingen ledige DVB enheter for opptak!", "Ingen ledige DVB enheter for opptak!",
"Ei vapaata vastaanotinta tallennukselle!", "Ei vapaata DVB-viritintä tallennukselle!",
"Brak wolnej karty DVB do nagrywania!", "Brak wolnej karty DVB do nagrywania!",
"¡No hay dispositivo DVB disponible para grabar!", "¡No hay dispositivo DVB disponible para grabar!",
"ÁíåðÜñêåéá DVB ÊÜñôáò ãéÜ åããñáöÞ!", "ÁíåðÜñêåéá DVB ÊÜñôáò ãéÜ åããñáöÞ!",
@ -2281,18 +2281,18 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"Avataan CA-moduulin valikkoa...",
"",//TODO
"",//TODO
"",//TODO
"Åßóïäïò CAM Ìåíïý",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "CAM-menüü avamine...",
"",//TODO "Åbner CAM menu...",
"",//TODO
"",//TODO
"",//TODO
"",//TODO
"",//TODO
}, },
{ "Can't open CAM menu!", { "Can't open CAM menu!",
"CAM-Menü kann nicht geöffnet werden!", "CAM-Menü kann nicht geöffnet werden!",
@ -2302,7 +2302,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"Impossible d'ouvrir le menu CAM!", "Impossible d'ouvrir le menu CAM!",
"",//TODO "",//TODO
"Salausmoduulin valikko ei saatavilla", "CA-moduulin valikko ei saatavilla",
"CAM-Menu niedostepne!", "CAM-Menu niedostepne!",
"¡No pudeo acceder al menú de la CAM!", "¡No pudeo acceder al menú de la CAM!",
"Áäýíáôç ç ðñüóâáóç óôü CAM ìåíïý!", "Áäýíáôç ç ðñüóâáóç óôü CAM ìåíïý!",
@ -2323,18 +2323,18 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"CA-moduuli palautetaan alkutilaan...",
"",//TODO
"",//TODO
"",//TODO
"ÅðáíáöïñÜ CAM",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "CAM mooduli taaskäivitus...",
"",//TODO "Nulstiller CAM...",
"",//TODO
"",//TODO
"",//TODO
"",//TODO
"",//TODO
}, },
{ "Can't reset CAM!", { "Can't reset CAM!",
"CAM-Reset fehlgeschlagen!", "CAM-Reset fehlgeschlagen!",
@ -2344,7 +2344,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"Impossible de réinitialiser la CAM!", "Impossible de réinitialiser la CAM!",
"",//TODO "",//TODO
"Salausmoduulin alustus epäonnistui!", "CA-moduulin palautus alkutilaan epäonnistui!",
"Nieudany CAM-Reset!", "Nieudany CAM-Reset!",
"¡No puedo reiniciar la CAM!", "¡No puedo reiniciar la CAM!",
"Áäýíáôï íá ãßíåé åðáíáöïñÜ óôü CAM", "Áäýíáôï íá ãßíåé åðáíáöïñÜ óôü CAM",
@ -2365,7 +2365,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"La CAM a été réinitialisée", "La CAM a été réinitialisée",
"",//TODO "",//TODO
"Salausmoduuli alustettu", "CA-moduuli palautettu alkutilaan",
"CAM-Reset wykonany", "CAM-Reset wykonany",
"CAM reiniciada", "CAM reiniciada",
"Óôï CAM Ýãéíå åðáíáöïñÜ", "Óôï CAM Ýãéíå åðáíáöïñÜ",
@ -2386,18 +2386,18 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"Syötä %d numeroa!",
"",//TODO
"",//TODO
"",//TODO
"Ðáñáêáëü ðëçêôñïëïãÞóåôå %d íïýìåñá",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "Palun sisesta %d numbrit!",
"",//TODO "Indtast venligst %d cifre!",
"",//TODO
"",//TODO
"",//TODO
"",//TODO
"",//TODO
}, },
{ "No audio available!", { "No audio available!",
"Kein Audio verfügbar!", "Kein Audio verfügbar!",
@ -2410,7 +2410,7 @@ const tI18nPhrase Phrases[] = {
"Äänen kieli ei ole valittavissa!", "Äänen kieli ei ole valittavissa!",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "ÁíåðÜñêåéá Þ÷ïõ",
"Ljud saknas!" "Ljud saknas!"
"Lipseºte sunetul!", "Lipseºte sunetul!",
"",//TODO "",//TODO
@ -2513,7 +2513,7 @@ const tI18nPhrase Phrases[] = {
"CICAM", "CICAM",
"Accès conditionnel", "Accès conditionnel",
"CICAM", "CICAM",
"CI-moduuli", "CICAM",
"CICAM", "CICAM",
"CICAM", "CICAM",
"CICAM", "CICAM",
@ -2685,7 +2685,7 @@ const tI18nPhrase Phrases[] = {
"Ulkoasu", "Ulkoasu",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÅðéöÜíåéá",
"Skin", "Skin",
"Skin", "Skin",
"",// TODO "",// TODO
@ -2706,7 +2706,7 @@ const tI18nPhrase Phrases[] = {
"Teema", "Teema",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÈÝìá",
"Tema", "Tema",
"Temã", "Temã",
"",// TODO "",// TODO
@ -2727,7 +2727,7 @@ const tI18nPhrase Phrases[] = {
"Vaakakeskitys", "Vaakakeskitys",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÁñéóôåñÜ",
"Vänster", "Vänster",
"Stânga", "Stânga",
"",// TODO "",// TODO
@ -2748,7 +2748,7 @@ const tI18nPhrase Phrases[] = {
"Pystykeskitys", "Pystykeskitys",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÅðÜíù",
"Övre", "Övre",
"Sus", "Sus",
"",// TODO "",// TODO
@ -2832,7 +2832,7 @@ const tI18nPhrase Phrases[] = {
"Käytä pieniä kirjasimia", "Käytä pieniä kirjasimia",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "×ñéóçìïðïßçóç ìéêñüí ãñáììáôïóåéñþí",
"Använd liten font", "Använd liten font",
"Utilizare fonturi mici", "Utilizare fonturi mici",
"",// TODO "",// TODO
@ -2853,7 +2853,7 @@ const tI18nPhrase Phrases[] = {
"ei koskaan", "ei koskaan",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÐïôÝ"
"aldrig", "aldrig",
"niciodatã", "niciodatã",
"",// TODO "",// TODO
@ -2869,12 +2869,12 @@ const tI18nPhrase Phrases[] = {
"in base alla superficie", "in base alla superficie",
"skin afhankelijk", "skin afhankelijk",
"",// TODO "",// TODO
"Dépend du skin", "dépend du skin",
"",// TODO "",// TODO
"ulkoasun mukaan", "ulkoasun mukaan",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÅîáñôÜôå áðü ôÞí åðéöÜíåéá",
"skin beroende", "skin beroende",
"dep. de skin", "dep. de skin",
"",// TODO "",// TODO
@ -2895,7 +2895,7 @@ const tI18nPhrase Phrases[] = {
"aina", "aina",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ðÜíôá",
"alltid", "alltid",
"întotdeauna", "întotdeauna",
"",// TODO "",// TODO
@ -2937,7 +2937,7 @@ const tI18nPhrase Phrases[] = {
"Kanavatiedon esitysaika (s)", "Kanavatiedon esitysaika (s)",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "÷ñüíïò Ýíäåéêóçò ðëçñïöïñßùí êáíáëéïý óå (ä)",
"Kanal information (s)", "Kanal information (s)",
"Durata afiºãrii info-canal (s)", "Durata afiºãrii info-canal (s)",
"",// TODO "",// TODO
@ -2974,7 +2974,7 @@ const tI18nPhrase Phrases[] = {
"Scorri pagina nel menu", "Scorri pagina nel menu",
"Scrollen per pagina", "Scrollen per pagina",
"Scroll da página no menu", "Scroll da página no menu",
"Scrolling par pages", "Défilement par pages",
"Rask rulling i menyer", "Rask rulling i menyer",
"Valikoiden vieritys sivuttain", "Valikoiden vieritys sivuttain",
"Przesuwac stronami", "Przesuwac stronami",
@ -2995,12 +2995,12 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Défilement rotatif",
"",// TODO "",// TODO
"Valikoiden vieritys ympäri", "Valikoiden vieritys ympäri",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Êßëéóç ãýñù-ãýñù",
"Rulla texten", "Rulla texten",
"Derulare circularã", "Derulare circularã",
"",// TODO "",// TODO
@ -3039,7 +3039,7 @@ const tI18nPhrase Phrases[] = {
"Directorias de gravação", "Directorias de gravação",
"Dossiers d'enregistrements", "Dossiers d'enregistrements",
"Kataloger til opptak", "Kataloger til opptak",
"Tallennehakemistot", "Näytä tallennehakemistot",
"Wykaz nagran", "Wykaz nagran",
"Gracaciones en directorios", "Gracaciones en directorios",
"ÖÜêåëïé åããñáöþí", "ÖÜêåëïé åããñáöþí",
@ -3100,12 +3100,12 @@ const tI18nPhrase Phrases[] = {
"Visualizzazione dati vecchi (min)", "Visualizzazione dati vecchi (min)",
"Oude EPG data tonen (min)", "Oude EPG data tonen (min)",
"",// TODO "",// TODO
"Montrer l'EPG plus vieux de m min", "Montrer l'EPG périmé (min)",
"",// TODO "",// TODO
"Vanha tieto näkyy (min)", "Vanha tieto näkyy (min)",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "¸íäåéêóç îåðåñáóìÝíïí ðëçñïöïñéþí (ëåðôÜ)",
"Visa gammal information (min)", "Visa gammal information (min)",
"Date EPG expirate cel mult (min)", "Date EPG expirate cel mult (min)",
"",// TODO "",// TODO
@ -3123,7 +3123,7 @@ const tI18nPhrase Phrases[] = {
"Ajustar relógio do sistema", "Ajustar relógio do sistema",
"Ajuster l'heure du système", "Ajuster l'heure du système",
"Juster system-klokken", "Juster system-klokken",
"Aseta kellonaika", "Tahdista kellonaika",
"Ustawianie czasu", "Ustawianie czasu",
"Ajustar reloj de sistema", "Ajustar reloj de sistema",
"Óõíôïíéóìüò þñáò õðïëïãéóôÞ", "Óõíôïíéóìüò þñáò õðïëïãéóôÞ",
@ -3168,7 +3168,7 @@ const tI18nPhrase Phrases[] = {
"Suosikkikielet", "Suosikkikielet",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Ðñïôéíüìåíåò ãëþóåò",
"Önskade språk", "Önskade språk",
"Limbi preferate", "Limbi preferate",
"",// TODO "",// TODO
@ -3189,7 +3189,7 @@ const tI18nPhrase Phrases[] = {
"Suosikkikieli", "Suosikkikieli",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Ðñïôéíüìåíç ãëþóá",
"Önskat språk", "Önskat språk",
"Limba preferatã", "Limba preferatã",
"",// TODO "",// TODO
@ -3207,7 +3207,7 @@ const tI18nPhrase Phrases[] = {
"Interface DVB primário", "Interface DVB primário",
"Carte DVB primaire", "Carte DVB primaire",
"Hoved DVB-enhet", "Hoved DVB-enhet",
"Päävastaanotin", "Ensisijainen DVB-sovitin",
"Pierwotny interfejs DVB", "Pierwotny interfejs DVB",
"Primer interface DVB", "Primer interface DVB",
"Êýñéá DVB êÜñôá", "Êýñéá DVB êÜñôá",
@ -3226,12 +3226,12 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"Video display format", "Video display format",
"",//TODO "",//TODO
"",//TODO "Format d'affichage",
"",//TODO "",//TODO
"Näyttömuoto", "Näyttömuoto",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "ÌïñöÞ Ýíäåéêóçò Âßíôåï",
"Format för video display", "Format för video display",
"Formatul redãrii video", "Formatul redãrii video",
"",//TODO "",//TODO
@ -3315,7 +3315,7 @@ const tI18nPhrase Phrases[] = {
"Kuvasuhde", "Kuvasuhde",
"Format telewizyjny", "Format telewizyjny",
"Formato Vídeo", "Formato Vídeo",
"Ó÷Þìá ïèüíçò", "ÌïñöÞ ïèüíçò",
"Video format", "Video format",
"Format video", "Format video",
"Video formátum", "Video formátum",
@ -3336,7 +3336,7 @@ const tI18nPhrase Phrases[] = {
"Käytä Dolby Digital -ääntä", "Käytä Dolby Digital -ääntä",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "×ñçóéìïðïßçóç Þ÷ïõ Dolby Digital",
"Använd Dolby Digital", "Använd Dolby Digital",
"Sunet Dolby Digital", "Sunet Dolby Digital",
"",//TODO "",//TODO
@ -3357,7 +3357,7 @@ const tI18nPhrase Phrases[] = {
"Päivitä kanavat", "Päivitä kanavat",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "áíáíÝïóç êáíáëéþí",
"Uppdatera kanaler", "Uppdatera kanaler",
"Actualizare canale", "Actualizare canale",
"",// TODO "",// TODO
@ -3373,12 +3373,12 @@ const tI18nPhrase Phrases[] = {
"solo nomi", "solo nomi",
"alleen namen", "alleen namen",
"",// TODO "",// TODO
"Seulement les noms", "noms uniquement",
"",// TODO "",// TODO
"vain nimet", "vain nimet",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ìüíï üíïìá",
"bara namn", "bara namn",
"doar numele", "doar numele",
"",// TODO "",// TODO
@ -3394,12 +3394,12 @@ const tI18nPhrase Phrases[] = {
"nomi e PIDs", "nomi e PIDs",
"namen en PIDs", "namen en PIDs",
"",// TODO "",// TODO
"Noms et PIDs", "noms et PIDs",
"",// TODO "",// TODO
"nimet ja PID:it", "nimet ja PID:it",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "üíïìá êáß PID",
"namn och PID", "namn och PID",
"nume si PID-uri", "nume si PID-uri",
"",// TODO "",// TODO
@ -3415,12 +3415,12 @@ const tI18nPhrase Phrases[] = {
"aggiungere canali nuovi", "aggiungere canali nuovi",
"nieuwe kanalen toevoegen", "nieuwe kanalen toevoegen",
"",// TODO "",// TODO
"Ajouter les nouvelles chaînes", "ajouter chaînes",
"",// TODO
"lisää uudet kanavat",
"",// TODO "",// TODO
"uudet kanavat",
"",// TODO "",// TODO
"",// TODO "",// TODO
"ðñïóèÞêç íÝïí êáíáëéþí",
"lägg till nya kanaler", "lägg till nya kanaler",
"adãugare canale noi", "adãugare canale noi",
"",// TODO "",// TODO
@ -3436,12 +3436,12 @@ const tI18nPhrase Phrases[] = {
"aggiungere transponder nuovi", "aggiungere transponder nuovi",
"nieuwe transponders toevoegen", "nieuwe transponders toevoegen",
"",// TODO "",// TODO
"Ajouter les nouveaux transpondeurs", "ajouter transpondeurs",
"",// TODO
"lisää uudet transponderit",
"",// TODO "",// TODO
"uudet transponderit",
"",// TODO "",// TODO
"",// TODO "",// TODO
"ðñïóèÞêç íÝïí transponder",
"lägg till nya transponders", "lägg till nya transponders",
"adãugare transpondere noi", "adãugare transpondere noi",
"",// TODO "",// TODO
@ -3457,12 +3457,12 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"Audio talen", "Audio talen",
"",//TODO "",//TODO
"",//TODO "Langues audio",
"",//TODO "",//TODO
"Äänen kielet", "Äänen kielet",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "Ãëþóåò Þ÷ïõ",
"Antal ljudspråk", "Antal ljudspråk",
"Limbi sunet", "Limbi sunet",
"",//TODO "",//TODO
@ -3478,12 +3478,12 @@ const tI18nPhrase Phrases[] = {
"",//TODO "",//TODO
"Audio taal", "Audio taal",
"",//TODO "",//TODO
"",//TODO "Langue audio",
"",//TODO "",//TODO
"Äänen kieli", "Äänen kieli",
"",//TODO "",//TODO
"",//TODO "",//TODO
"",//TODO "Ãëþóá Þ÷ïõ",
"Ljudspråk", "Ljudspråk",
"Limba sunetului", "Limba sunetului",
"",//TODO "",//TODO
@ -3501,7 +3501,7 @@ const tI18nPhrase Phrases[] = {
"Limite de bandas LNB (MHz)", "Limite de bandas LNB (MHz)",
"Limite de bandes LNB (MHz)", "Limite de bandes LNB (MHz)",
"LO-grensefrekvens (MHz)", "LO-grensefrekvens (MHz)",
"LNB rajataajuus (MHz)", "LNB-rajataajuus (MHz)",
"SLOF (MHz)", "SLOF (MHz)",
"SLOF (MHz)", "SLOF (MHz)",
"SLOF (MHz)", "SLOF (MHz)",
@ -3522,7 +3522,7 @@ const tI18nPhrase Phrases[] = {
"Frequência base LNB (MHz)", "Frequência base LNB (MHz)",
"Fréquence basse LNB (MHz)", "Fréquence basse LNB (MHz)",
"LO-frekvens i lavbåndet (MHz)", "LO-frekvens i lavbåndet (MHz)",
"LNB alempi taajuus (MHz)", "LNB-alataajuus (MHz)",
"Dolna czestotliwosc LNB (MHz)", "Dolna czestotliwosc LNB (MHz)",
"Frecuencia baja LNB (MHz)", "Frecuencia baja LNB (MHz)",
"ÊÜôù LNB-Óõ÷íüôçôá (MHz)", "ÊÜôù LNB-Óõ÷íüôçôá (MHz)",
@ -3543,7 +3543,7 @@ const tI18nPhrase Phrases[] = {
"Frequência alta LNB (MHz)", "Frequência alta LNB (MHz)",
"Fréquence haute LNB (MHz)", "Fréquence haute LNB (MHz)",
"LO-frekvens i høybåndet (MHz)", "LO-frekvens i høybåndet (MHz)",
"LNB ylempi taajuus (MHz)", "LNB-ylätaajuus (MHz)",
"Gorna czestotliwosc LNB (MHz)", "Gorna czestotliwosc LNB (MHz)",
"Frecuencia alta LNB (MHz)", "Frecuencia alta LNB (MHz)",
"¢íù LNB-Óõ÷íüôçôá (MHz)", "¢íù LNB-Óõ÷íüôçôá (MHz)",
@ -3564,7 +3564,7 @@ const tI18nPhrase Phrases[] = {
"Utilizar DiSEqC", "Utilizar DiSEqC",
"Utiliser le DiSEqC", "Utiliser le DiSEqC",
"Bruk DiSEqC", "Bruk DiSEqC",
"DiSEqC käytössä", "Käytä DiSEqC-kytkintä",
"Uzywac DiSEqC", "Uzywac DiSEqC",
"Utilizar DiSEqC", "Utilizar DiSEqC",
"Åíåñãïðïßçóç DiSEqC", "Åíåñãïðïßçóç DiSEqC",
@ -3585,7 +3585,7 @@ const tI18nPhrase Phrases[] = {
"CICAM DVB", "CICAM DVB",
"Accès conditionnel", "Accès conditionnel",
"CICAM DVB", "CICAM DVB",
"CI-moduuli DVB", "CICAM DVB",
"CICAM DVB", "CICAM DVB",
"CICAM DVB", "CICAM DVB",
"CICAM DVB", "CICAM DVB",
@ -3648,7 +3648,7 @@ const tI18nPhrase Phrases[] = {
"Limite Primário", "Limite Primário",
"Limite primaire", "Limite primaire",
"Prioritetsgrense HovedDVB", "Prioritetsgrense HovedDVB",
"Päävastaanottimen prioriteetti", "Ensisijaisen sovittimen prioriteettiraja",
"Pierwotny limit", "Pierwotny limit",
"Límite primario", "Límite primario",
"Ðñïôåýïí üñéï", "Ðñïôåýïí üñéï",
@ -3777,7 +3777,7 @@ const tI18nPhrase Phrases[] = {
"Käytä VPS-toimintoa", "Käytä VPS-toimintoa",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "×ñÞóç VPS",
"Använd VPS", "Använd VPS",
"Utilizeazã VPS", "Utilizeazã VPS",
"",// TODO "",// TODO
@ -3798,7 +3798,7 @@ const tI18nPhrase Phrases[] = {
"VPS-toiminnon aloitusmarginaali (s)", "VPS-toiminnon aloitusmarginaali (s)",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Ðåñéèüñéï VPS (ä)",
"VPS marginal (s)", "VPS marginal (s)",
"Marjã de timp la utilizare VPS (s)", "Marjã de timp la utilizare VPS (s)",
"",// TODO "",// TODO
@ -3921,7 +3921,7 @@ const tI18nPhrase Phrases[] = {
"Modo de multi-speed", "Modo de multi-speed",
"Mode multi-vitesses", "Mode multi-vitesses",
"Multispeed modus", "Multispeed modus",
"Moninopeustila", "Käytä toiston moninopeustilaa",
"Tryb wielopredkosciowy", "Tryb wielopredkosciowy",
"Modo multi-velocidad", "Modo multi-velocidad",
"Ìåèïäïò ðïëëáðëÞò ôá÷ýôçôáò", "Ìåèïäïò ðïëëáðëÞò ôá÷ýôçôáò",
@ -4026,7 +4026,7 @@ const tI18nPhrase Phrases[] = {
"Timeout SVDRP (s)", "Timeout SVDRP (s)",
"Temps maxi SVDRP (s)", "Temps maxi SVDRP (s)",
"Ubrukt SVDRP-levetid (s)", "Ubrukt SVDRP-levetid (s)",
"SVDRP odotusaika (s)", "SVDRP-komennon odotusaika (s)",
"Min. brak aktywnosci SVDRP (s)", "Min. brak aktywnosci SVDRP (s)",
"SVDRP Timeout (s)", "SVDRP Timeout (s)",
"SVDRP äéáêïðÞ (ä)", "SVDRP äéáêïðÞ (ä)",
@ -4045,7 +4045,7 @@ const tI18nPhrase Phrases[] = {
"Timeout Zapping", "Timeout Zapping",
"Zap timeout (s)", "Zap timeout (s)",
"",// TODO "",// TODO
"Prise en compte dernière chaîne (s)", "Prise en compte chaîne (s)",
"",// TODO "",// TODO
"Kanavavalinnan odotusaika (s)", "Kanavavalinnan odotusaika (s)",
"",// TODO "",// TODO
@ -4915,7 +4915,7 @@ const tI18nPhrase Phrases[] = {
"Ääni", "Ääni",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "¹÷ïò",
"Ljud", "Ljud",
"Sunet", "Sunet",
"",// TODO "",// TODO
@ -5228,7 +5228,7 @@ const tI18nPhrase Phrases[] = {
"A mudar interface DVB primário...", "A mudar interface DVB primário...",
"Changement de carte DVB primaire...", "Changement de carte DVB primaire...",
"Bytter første DVB-enhet...", "Bytter første DVB-enhet...",
"Vaihdetaan päävastaanottimelle...", "Vaihdetaan ensisijaista DVB-sovitinta...",
"Pierwszy interfejs DVB przelacza...", "Pierwszy interfejs DVB przelacza...",
"Cambio al interface DVB primario...", "Cambio al interface DVB primario...",
"Ç êýñéá DVB êÜñôá áëëÜæåé...", "Ç êýñéá DVB êÜñôá áëëÜæåé...",
@ -5373,12 +5373,12 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Mise à jour du guide des programmes",
"",// TODO "",// TODO
"Ohjelmaoppaan päivitys aloitettu", "Ohjelmaoppaan päivitys aloitettu",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Áñ÷Þ óÜñùóç EPG",
"Påbörjar EPG skanning", "Påbörjar EPG skanning",
"Pornesc achiziþia EPG", "Pornesc achiziþia EPG",
"",// TODO "",// TODO
@ -5415,12 +5415,12 @@ const tI18nPhrase Phrases[] = {
"VDR Classico", "VDR Classico",
"VDR Klassiek", "VDR Klassiek",
"",// TODO "",// TODO
"",// TODO "VDR Classique",// TODO
"",// TODO "",// TODO
"Klassinen VDR", "Klassinen VDR",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Êëáóéêü VDR",
"Klassisk VDR", "Klassisk VDR",
"VDR clasic", "VDR clasic",
"",// TODO "",// TODO
@ -5436,12 +5436,12 @@ const tI18nPhrase Phrases[] = {
"Consolles ST:TNG", "Consolles ST:TNG",
"ST:TNG Consoles", "ST:TNG Consoles",
"",// TODO "",// TODO
"",// TODO "Consoles ST:TNG",
"",// TODO "",// TODO
"ST:TNG konsoli", "ST:TNG konsoli",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "ÌïñöÝò ST:TNG",
"ST:TNG konsoll", "ST:TNG konsoll",
"Cons. ST:TNG", "Cons. ST:TNG",
"",// TODO "",// TODO
@ -5457,19 +5457,19 @@ const tI18nPhrase Phrases[] = {
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Sans titre",
"",// TODO "",// TODO
"Ei esitystä", "Ei esitystä",
"",// TODO "",// TODO
"",// TODO "",// TODO
"",// TODO "Ï÷é ôßôëï",
"ingen titel", "ingen titel",
"Fãrã titlu", "Fãrã titlu",
"",// TODO "",// TODO
"",// TODO "",// TODO
"±Õ× ÝÐ×ÒÐÝØï", "±Õ× ÝÐ×ÒÐÝØï",
"Bez titla", "Bez titla",
"",// TODO "Pealkiri puudub",
"Ingen titel", "Ingen titel",
}, },
{ NULL } { NULL }

4
menu.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: menu.c 1.374 2005/10/03 12:53:51 kls Exp $ * $Id: menu.c 1.375 2005/10/09 11:22:03 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -230,7 +230,7 @@ public:
}; };
cMenuEditChannel::cMenuEditChannel(cChannel *Channel, bool New) cMenuEditChannel::cMenuEditChannel(cChannel *Channel, bool New)
:cOsdMenu(tr("Edit channel"), 14) :cOsdMenu(tr("Edit channel"), 16)
{ {
channel = Channel; channel = Channel;
if (channel) { if (channel) {

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: osdbase.c 1.22 2005/10/02 15:00:40 kls Exp $ * $Id: osdbase.c 1.24 2005/10/09 10:56:26 kls Exp $
*/ */
#include "osdbase.h" #include "osdbase.h"
@ -242,8 +242,8 @@ void cOsdMenu::DisplayCurrent(bool Current)
{ {
cOsdItem *item = Get(current); cOsdItem *item = Get(current);
if (item) { if (item) {
displayMenu->SetItem(item->Text(), current - first, Current, item->Selectable()); displayMenu->SetItem(item->Text(), current - first, Current && item->Selectable(), item->Selectable());
if (Current) if (Current && item->Selectable())
cStatus::MsgOsdCurrentItem(item->Text()); cStatus::MsgOsdCurrentItem(item->Text());
if (!Current) if (!Current)
item->SetFresh(true); // leaving the current item resets 'fresh' item->SetFresh(true); // leaving the current item resets 'fresh'
@ -268,14 +268,16 @@ void cOsdMenu::CursorUp(void)
int tmpCurrent = current; int tmpCurrent = current;
int lastOnScreen = first + displayMenuItems - 1; int lastOnScreen = first + displayMenuItems - 1;
int last = Count() - 1; int last = Count() - 1;
if (last < 0)
return;
while (--tmpCurrent != current) { while (--tmpCurrent != current) {
if (tmpCurrent < 0) { if (tmpCurrent < 0) {
if (Setup.MenuScrollWrap) if (Setup.MenuScrollWrap)
tmpCurrent = last; tmpCurrent = last + 1;
else else
return; return;
} }
if (SelectableItem(tmpCurrent)) else if (SelectableItem(tmpCurrent))
break; break;
} }
if (first <= tmpCurrent && tmpCurrent <= lastOnScreen) if (first <= tmpCurrent && tmpCurrent <= lastOnScreen)
@ -298,14 +300,16 @@ void cOsdMenu::CursorDown(void)
int tmpCurrent = current; int tmpCurrent = current;
int lastOnScreen = first + displayMenuItems - 1; int lastOnScreen = first + displayMenuItems - 1;
int last = Count() - 1; int last = Count() - 1;
if (last < 0)
return;
while (++tmpCurrent != current) { while (++tmpCurrent != current) {
if (tmpCurrent > last) { if (tmpCurrent > last) {
if (Setup.MenuScrollWrap) if (Setup.MenuScrollWrap)
tmpCurrent = 0; tmpCurrent = -1;
else else
return; return;
} }
if (SelectableItem(tmpCurrent)) else if (SelectableItem(tmpCurrent))
break; break;
} }
if (first <= tmpCurrent && tmpCurrent <= lastOnScreen) if (first <= tmpCurrent && tmpCurrent <= lastOnScreen)

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: recorder.c 1.15 2005/08/14 10:53:28 kls Exp $ * $Id: recorder.c 1.16 2005/10/31 12:35:29 kls Exp $
*/ */
#include <stdarg.h> #include <stdarg.h>
@ -28,7 +28,7 @@ private:
cIndexFile *index; cIndexFile *index;
uchar pictureType; uchar pictureType;
int fileSize; int fileSize;
int recordFile; cUnbufferedFile *recordFile;
time_t lastDiskSpaceCheck; time_t lastDiskSpaceCheck;
bool RunningLowOnDiskSpace(void); bool RunningLowOnDiskSpace(void);
bool NextFile(void); bool NextFile(void);
@ -50,7 +50,7 @@ cFileWriter::cFileWriter(const char *FileName, cRemux *Remux)
lastDiskSpaceCheck = time(NULL); lastDiskSpaceCheck = time(NULL);
fileName = new cFileName(FileName, true); fileName = new cFileName(FileName, true);
recordFile = fileName->Open(); recordFile = fileName->Open();
if (recordFile < 0) if (!recordFile)
return; return;
// Create the index file: // Create the index file:
index = new cIndexFile(FileName, true); index = new cIndexFile(FileName, true);
@ -81,13 +81,13 @@ bool cFileWriter::RunningLowOnDiskSpace(void)
bool cFileWriter::NextFile(void) bool cFileWriter::NextFile(void)
{ {
if (recordFile >= 0 && pictureType == I_FRAME) { // every file shall start with an I_FRAME if (recordFile && pictureType == I_FRAME) { // every file shall start with an I_FRAME
if (fileSize > MEGABYTE(Setup.MaxVideoFileSize) || RunningLowOnDiskSpace()) { if (fileSize > MEGABYTE(Setup.MaxVideoFileSize) || RunningLowOnDiskSpace()) {
recordFile = fileName->NextFile(); recordFile = fileName->NextFile();
fileSize = 0; fileSize = 0;
} }
} }
return recordFile >= 0; return recordFile != NULL;
} }
void cFileWriter::Action(void) void cFileWriter::Action(void)
@ -102,7 +102,7 @@ void cFileWriter::Action(void)
if (NextFile()) { if (NextFile()) {
if (index && pictureType != NO_PICTURE) if (index && pictureType != NO_PICTURE)
index->Write(pictureType, fileName->Number(), fileSize); index->Write(pictureType, fileName->Number(), fileSize);
if (safe_write(recordFile, p, Count) < 0) { if (recordFile->Write(p, Count) < 0) {
LOG_ERROR_STR(fileName->Name()); LOG_ERROR_STR(fileName->Name());
break; break;
} }

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.120 2005/10/01 10:29:02 kls Exp $ * $Id: recording.c 1.122 2005/10/31 12:27:58 kls Exp $
*/ */
#include "recording.h" #include "recording.h"
@ -264,7 +264,9 @@ bool cRecordingInfo::Read(FILE *f)
if (ownEvent) { if (ownEvent) {
cReadLine ReadLine; cReadLine ReadLine;
char *s; char *s;
int line = 0;
while ((s = ReadLine.Read(f)) != NULL) { while ((s = ReadLine.Read(f)) != NULL) {
++line;
char *t = skipspace(s + 1); char *t = skipspace(s + 1);
switch (*s) { switch (*s) {
case 'C': { case 'C': {
@ -275,8 +277,10 @@ bool cRecordingInfo::Read(FILE *f)
channelID = tChannelID::FromString(t); channelID = tChannelID::FromString(t);
} }
break; break;
default: if (!ownEvent->Parse(s)) default: if (!ownEvent->Parse(s)) {
esyslog("ERROR: EPG data problem in line %d", line);
return false; return false;
}
break; break;
} }
} }
@ -478,7 +482,8 @@ cRecording::cRecording(const char *FileName)
asprintf(&InfoFileName, "%s%s", fileName, INFOFILESUFFIX); asprintf(&InfoFileName, "%s%s", fileName, INFOFILESUFFIX);
FILE *f = fopen(InfoFileName, "r"); FILE *f = fopen(InfoFileName, "r");
if (f) { if (f) {
info->Read(f); if (!info->Read(f))
esyslog("ERROR: EPG data problem in file %s", InfoFileName);
fclose(f); fclose(f);
} }
else if (errno != ENOENT) else if (errno != ENOENT)
@ -1253,7 +1258,7 @@ int cIndexFile::Get(uchar FileNumber, int FileOffset)
cFileName::cFileName(const char *FileName, bool Record, bool Blocking) cFileName::cFileName(const char *FileName, bool Record, bool Blocking)
{ {
file = -1; file = NULL;
fileNumber = 0; fileNumber = 0;
record = Record; record = Record;
blocking = Blocking; blocking = Blocking;
@ -1274,21 +1279,21 @@ cFileName::~cFileName()
free(fileName); free(fileName);
} }
int cFileName::Open(void) cUnbufferedFile *cFileName::Open(void)
{ {
if (file < 0) { if (!file) {
int BlockingFlag = blocking ? 0 : O_NONBLOCK; int BlockingFlag = blocking ? 0 : O_NONBLOCK;
if (record) { if (record) {
dsyslog("recording to '%s'", fileName); dsyslog("recording to '%s'", fileName);
file = OpenVideoFile(fileName, O_RDWR | O_CREAT | BlockingFlag); file = OpenVideoFile(fileName, O_RDWR | O_CREAT | BlockingFlag);
if (file < 0) if (!file)
LOG_ERROR_STR(fileName); LOG_ERROR_STR(fileName);
} }
else { else {
if (access(fileName, R_OK) == 0) { if (access(fileName, R_OK) == 0) {
dsyslog("playing '%s'", fileName); dsyslog("playing '%s'", fileName);
file = open(fileName, O_RDONLY | BlockingFlag); file = cUnbufferedFile::Create(fileName, O_RDONLY | BlockingFlag);
if (file < 0) if (!file)
LOG_ERROR_STR(fileName); LOG_ERROR_STR(fileName);
} }
else if (errno != ENOENT) else if (errno != ENOENT)
@ -1300,14 +1305,14 @@ int cFileName::Open(void)
void cFileName::Close(void) void cFileName::Close(void)
{ {
if (file >= 0) { if (file) {
if ((record && CloseVideoFile(file) < 0) || (!record && close(file) < 0)) if ((record && CloseVideoFile(file) < 0) || (!record && file->Close() < 0))
LOG_ERROR_STR(fileName); LOG_ERROR_STR(fileName);
file = -1; file = NULL;
} }
} }
int cFileName::SetOffset(int Number, int Offset) cUnbufferedFile *cFileName::SetOffset(int Number, int Offset)
{ {
if (fileNumber != Number) if (fileNumber != Number)
Close(); Close();
@ -1332,23 +1337,23 @@ int cFileName::SetOffset(int Number, int Offset)
} }
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 NULL;
} }
// found a non existing file suffix // found a non existing file suffix
} }
if (Open() >= 0) { if (Open() >= 0) {
if (!record && Offset >= 0 && lseek(file, Offset, SEEK_SET) != Offset) { if (!record && Offset >= 0 && file->Seek(Offset, SEEK_SET) != Offset) {
LOG_ERROR_STR(fileName); LOG_ERROR_STR(fileName);
return -1; return NULL;
} }
} }
return file; return file;
} }
esyslog("ERROR: max number of files (%d) exceeded", MAXFILESPERRECORDING); esyslog("ERROR: max number of files (%d) exceeded", MAXFILESPERRECORDING);
return -1; return NULL;
} }
int cFileName::NextFile(void) cUnbufferedFile *cFileName::NextFile(void)
{ {
return SetOffset(fileNumber + 1); return SetOffset(fileNumber + 1);
} }
@ -1382,7 +1387,7 @@ int SecondsToFrames(int Seconds)
// --- ReadFrame ------------------------------------------------------------- // --- ReadFrame -------------------------------------------------------------
int ReadFrame(int f, uchar *b, int Length, int Max) int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max)
{ {
if (Length == -1) if (Length == -1)
Length = Max; // this means we read up to EOF (see cIndex) Length = Max; // this means we read up to EOF (see cIndex)
@ -1390,10 +1395,8 @@ int ReadFrame(int f, uchar *b, int Length, int Max)
esyslog("ERROR: frame larger than buffer (%d > %d)", Length, Max); esyslog("ERROR: frame larger than buffer (%d > %d)", Length, Max);
Length = Max; Length = Max;
} }
int r = safe_read(f, b, Length); int r = f->Read(b, Length);
if (r < 0) if (r < 0)
LOG_ERROR; LOG_ERROR;
return r; return r;
} }

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.h 1.45 2005/10/01 10:24:41 kls Exp $ * $Id: recording.h 1.46 2005/10/31 12:27:12 kls Exp $
*/ */
#ifndef __RECORDING_H #ifndef __RECORDING_H
@ -203,7 +203,7 @@ public:
class cFileName { class cFileName {
private: private:
int file; cUnbufferedFile *file;
int fileNumber; int fileNumber;
char *fileName, *pFileNumber; char *fileName, *pFileNumber;
bool record; bool record;
@ -213,10 +213,10 @@ public:
~cFileName(); ~cFileName();
const char *Name(void) { return fileName; } const char *Name(void) { return fileName; }
int Number(void) { return fileNumber; } int Number(void) { return fileNumber; }
int Open(void); cUnbufferedFile *Open(void);
void Close(void); void Close(void);
int SetOffset(int Number, int Offset = 0); cUnbufferedFile *SetOffset(int Number, int Offset = 0);
int NextFile(void); cUnbufferedFile *NextFile(void);
}; };
cString IndexToHMSF(int Index, bool WithFrame = false); cString IndexToHMSF(int Index, bool WithFrame = false);
@ -226,7 +226,7 @@ int HMSFToIndex(const char *HMSF);
int SecondsToFrames(int Seconds); //XXX+ ->player??? int SecondsToFrames(int Seconds); //XXX+ ->player???
// Returns the number of frames corresponding to the given number of seconds. // Returns the number of frames corresponding to the given number of seconds.
int ReadFrame(int f, uchar *b, int Length, int Max); int ReadFrame(cUnbufferedFile *f, uchar *b, int Length, int Max);
char *ExchangeChars(char *s, bool ToFileSystem); char *ExchangeChars(char *s, bool ToFileSystem);
// Exchanges the characters in the given string to or from a file system // Exchanges the characters in the given string to or from a file system

View File

@ -91,13 +91,22 @@ S58W PAS 9
S61.5W Echostar 3 S61.5W Echostar 3
S79W AMC5 S79W AMC5
S82W Nimiq 2 S82W Nimiq 2
S85W AMC2
S87W AMC3 S87W AMC3
S91W Nimiq 1 S89W Intelsat 808
S91W Galaxy 11 & Nimiq 1/3
S93W Intelsat 806
S95W Galaxy 3C
S97W Telestar 5 S97W Telestar 5
S105W AMC2 S99W Galaxy 4R
S101W AMC4
S103W AMC1
S105W AMC15
S110W Echostar 6/8 S110W Echostar 6/8
S119W Echostar 7 S119W Echostar 7
S121W Echostar 9 S121W Echostar 9 & Intelsat 813
S123W Galaxy 10R
S129W Intelsat 807
S148W Echostar 1/2 S148W Echostar 1/2
S157W Echostar 4 S157W Echostar 4

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: svdrp.h 1.23 2005/08/28 14:10:32 kls Exp $ * $Id: svdrp.h 1.24 2005/10/09 11:11:59 kls Exp $
*/ */
#ifndef __SVDRP_H #ifndef __SVDRP_H
@ -51,7 +51,7 @@ private:
time_t lastActivity; time_t lastActivity;
void Close(bool Timeout = false); void Close(bool Timeout = false);
bool Send(const char *s, int length = -1); bool Send(const char *s, int length = -1);
void Reply(int Code, const char *fmt, ...); void Reply(int Code, const char *fmt, ...) __attribute__ ((format (printf, 3, 4)));
void PrintHelpTopics(const char **hp); void PrintHelpTopics(const char **hp);
void CmdCHAN(const char *Option); void CmdCHAN(const char *Option);
void CmdCLRE(const char *Option); void CmdCLRE(const char *Option);

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.h 1.30 2005/08/14 11:21:48 kls Exp $ * $Id: thread.h 1.31 2005/10/09 11:12:32 kls Exp $
*/ */
#ifndef __THREAD_H #ifndef __THREAD_H
@ -106,7 +106,7 @@ public:
///< the thread starts and stops. The Start() function must be called ///< the thread starts and stops. The Start() function must be called
///< to actually start the thread. ///< to actually start the thread.
virtual ~cThread(); virtual ~cThread();
void SetDescription(const char *Description, ...); void SetDescription(const char *Description, ...) __attribute__ ((format (printf, 2, 3)));
bool Start(void); bool Start(void);
///< Actually starts the thread. ///< Actually starts the thread.
bool Active(void); bool Active(void);

125
tools.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: tools.c 1.99 2005/09/25 12:56:06 kls Exp $ * $Id: tools.c 1.100 2005/10/31 12:56:15 kls Exp $
*/ */
#include "tools.h" #include "tools.h"
@ -836,6 +836,129 @@ bool cSafeFile::Close(void)
return result; return result;
} }
// --- cUnbufferedFile -------------------------------------------------------
#define READ_AHEAD MEGABYTE(2)
#define WRITE_BUFFER MEGABYTE(10)
cUnbufferedFile::cUnbufferedFile(void)
{
fd = -1;
}
cUnbufferedFile::~cUnbufferedFile()
{
Close();
}
int cUnbufferedFile::Open(const char *FileName, int Flags, mode_t Mode)
{
Close();
fd = open(FileName, Flags, Mode);
begin = end = ahead = -1;
written = 0;
return fd;
}
int cUnbufferedFile::Close(void)
{
if (fd >= 0) {
if (ahead > end)
end = ahead;
if (begin >= 0 && end > begin) {
//dsyslog("close buffer: %d (flush: %d bytes, %ld-%ld)", fd, written, begin, end);
if (written)
fdatasync(fd);
posix_fadvise(fd, begin, end - begin, POSIX_FADV_DONTNEED);
}
begin = end = ahead = -1;
written = 0;
}
int OldFd = fd;
fd = -1;
return close(OldFd);
}
off_t cUnbufferedFile::Seek(off_t Offset, int Whence)
{
if (fd >= 0)
return lseek(fd, Offset, Whence);
return -1;
}
ssize_t cUnbufferedFile::Read(void *Data, size_t Size)
{
if (fd >= 0) {
off_t pos = lseek(fd, 0, SEEK_CUR);
// jump forward - adjust end position
if (pos > end)
end = pos;
// after adjusting end - don't clear more than previously requested
if (end > ahead)
end = ahead;
// jump backward - drop read ahead of previous run
if (pos < begin)
end = ahead;
if (begin >= 0 && end > begin)
posix_fadvise(fd, begin - KILOBYTE(200), end - begin + KILOBYTE(200), POSIX_FADV_DONTNEED);//XXX macros/parameters???
begin = pos;
ssize_t bytesRead = safe_read(fd, Data, Size);
if (bytesRead > 0) {
pos += bytesRead;
end = pos;
// this seems to trigger a non blocking read - this
// may or may not have been finished when we will be called next time.
// If it is not finished we can't release the not yet filled buffers.
// So this is commented out till we find a better solution.
//posix_fadvise(fd, pos, READ_AHEAD, POSIX_FADV_WILLNEED);
ahead = pos + READ_AHEAD;
}
else
end = pos;
return bytesRead;
}
return -1;
}
ssize_t cUnbufferedFile::Write(const void *Data, size_t Size)
{
if (fd >=0) {
off_t pos = lseek(fd, 0, SEEK_CUR);
ssize_t bytesWritten = safe_write(fd, Data, Size);
if (bytesWritten >= 0) {
written += bytesWritten;
if (begin >= 0) {
if (pos < begin)
begin = pos;
}
else
begin = pos;
if (pos + bytesWritten > end)
end = pos + bytesWritten;
if (written > WRITE_BUFFER) {
//dsyslog("flush buffer: %d (%d bytes, %ld-%ld)", fd, written, begin, end);
fdatasync(fd);
if (begin >= 0 && end > begin)
posix_fadvise(fd, begin, end - begin, POSIX_FADV_DONTNEED);
begin = end = -1;
written = 0;
}
}
return bytesWritten;
}
return -1;
}
cUnbufferedFile *cUnbufferedFile::Create(const char *FileName, int Flags, mode_t Mode)
{
cUnbufferedFile *File = new cUnbufferedFile;
if (File->Open(FileName, Flags, Mode) < 0) {
delete File;
File = NULL;
}
return File;
}
// --- cLockFile ------------------------------------------------------------- // --- cLockFile -------------------------------------------------------------
#define LOCKFILENAME ".lock-vdr" #define LOCKFILENAME ".lock-vdr"

25
tools.h
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: tools.h 1.79 2005/10/01 12:43:31 kls Exp $ * $Id: tools.h 1.81 2005/10/31 12:54:36 kls Exp $
*/ */
#ifndef __TOOLS_H #ifndef __TOOLS_H
@ -81,7 +81,7 @@ public:
operator const char * () const { return s; } // for use in (const char *) context operator const char * () const { return s; } // for use in (const char *) context
const char * operator*() const { return s; } // for use in (const void *) context (printf() etc.) const char * operator*() const { return s; } // for use in (const void *) context (printf() etc.)
cString &operator=(const cString &String); cString &operator=(const cString &String);
static cString sprintf(const char *fmt, ...); static cString sprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
}; };
ssize_t safe_read(int filedes, void *buffer, size_t size); ssize_t safe_read(int filedes, void *buffer, size_t size);
@ -198,6 +198,27 @@ public:
bool Close(void); bool Close(void);
}; };
/// cUnbufferedFile is used for large files that are mainly written or read
/// in a streaming manner, and thus should not be cached.
class cUnbufferedFile {
private:
int fd;
off_t begin;
off_t end;
off_t ahead;
ssize_t written;
public:
cUnbufferedFile(void);
~cUnbufferedFile();
int Open(const char *FileName, int Flags, mode_t Mode = DEFFILEMODE);
int Close(void);
off_t Seek(off_t Offset, int Whence);
ssize_t Read(void *Data, size_t Size);
ssize_t Write(const void *Data, size_t Size);
static cUnbufferedFile *Create(const char *FileName, int Flags, mode_t Mode = DEFFILEMODE);
};
class cLockFile { class cLockFile {
private: private:
char *fileName; char *fileName;

4
vdr.1
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.1 1.14 2005/07/31 10:49:35 kls Exp $ .\" $Id: vdr.1 1.15 2005/10/09 12:31:03 kls Exp $
.\" .\"
.TH vdr 1 "19 Dec 2004" "1.3.18" "Video Disk Recorder" .TH vdr 1 "19 Dec 2004" "1.3.18" "Video Disk Recorder"
.SH NAME .SH NAME
@ -166,7 +166,7 @@ access to the SVDRP port.
.I marks.vdr .I marks.vdr
Contains the editing marks defined for a recording. Contains the editing marks defined for a recording.
.TP .TP
.I summary.vdr .I info.vdr
Contains a description of the recording. Contains a description of the recording.
.TP .TP
.I resume.vdr .I resume.vdr

10
vdr.c
View File

@ -22,7 +22,7 @@
* *
* The project's page is at http://www.cadsoft.de/vdr * The project's page is at http://www.cadsoft.de/vdr
* *
* $Id: vdr.c 1.217 2005/09/24 13:27:26 kls Exp $ * $Id: vdr.c 1.218 2005/10/09 10:01:45 kls Exp $
*/ */
#include <getopt.h> #include <getopt.h>
@ -370,17 +370,11 @@ int main(int argc, char *argv[])
// Daemon mode: // Daemon mode:
if (DaemonMode) { if (DaemonMode) {
pid_t pid = fork(); if (daemon(1, 0) == -1) {
if (pid < 0) {
fprintf(stderr, "%m\n"); fprintf(stderr, "%m\n");
esyslog("ERROR: %m"); esyslog("ERROR: %m");
return 2; return 2;
} }
if (pid != 0)
return 0; // initial program immediately returns
fclose(stdin);
fclose(stdout);
fclose(stderr);
} }
else if (Terminal) { else if (Terminal) {
// Claim new controlling terminal // Claim new controlling terminal

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: videodir.c 1.12 2005/08/06 09:53:21 kls Exp $ * $Id: videodir.c 1.13 2005/10/31 12:07:41 kls Exp $
*/ */
#include "videodir.h" #include "videodir.h"
@ -102,7 +102,7 @@ const char *cVideoDirectory::Adjust(const char *FileName)
return NULL; return NULL;
} }
int OpenVideoFile(const char *FileName, int Flags) cUnbufferedFile *OpenVideoFile(const char *FileName, int Flags)
{ {
const char *ActualFileName = FileName; const char *ActualFileName = FileName;
@ -110,7 +110,7 @@ int OpenVideoFile(const char *FileName, int Flags)
if (strstr(FileName, VideoDirectory) != FileName) { if (strstr(FileName, VideoDirectory) != FileName) {
esyslog("ERROR: %s not in %s", FileName, VideoDirectory); esyslog("ERROR: %s not in %s", FileName, VideoDirectory);
errno = ENOENT; // must set 'errno' - any ideas for a better value? errno = ENOENT; // must set 'errno' - any ideas for a better value?
return -1; return NULL;
} }
// Are we going to create a new file? // Are we going to create a new file?
if ((Flags & O_CREAT) != 0) { if ((Flags & O_CREAT) != 0) {
@ -128,25 +128,26 @@ int OpenVideoFile(const char *FileName, int Flags)
if (Dir.Stored()) { if (Dir.Stored()) {
ActualFileName = Dir.Adjust(FileName); ActualFileName = Dir.Adjust(FileName);
if (!MakeDirs(ActualFileName, false)) if (!MakeDirs(ActualFileName, false))
return -1; // errno has been set by MakeDirs() return NULL; // errno has been set by MakeDirs()
if (symlink(ActualFileName, FileName) < 0) { if (symlink(ActualFileName, FileName) < 0) {
LOG_ERROR_STR(FileName); LOG_ERROR_STR(FileName);
return -1; return NULL;
} }
ActualFileName = strdup(ActualFileName); // must survive Dir! ActualFileName = strdup(ActualFileName); // must survive Dir!
} }
} }
} }
int Result = open(ActualFileName, Flags, DEFFILEMODE); cUnbufferedFile *File = cUnbufferedFile::Create(ActualFileName, Flags, DEFFILEMODE);
if (ActualFileName != FileName) if (ActualFileName != FileName)
free((char *)ActualFileName); free((char *)ActualFileName);
return Result; return File;
} }
int CloseVideoFile(int FileHandle) int CloseVideoFile(cUnbufferedFile *File)
{ {
// just in case we ever decide to do something special when closing the file! int Result = File->Close();
return close(FileHandle); delete File;
return Result;
} }
bool RenameVideoFile(const char *OldName, const char *NewName) bool RenameVideoFile(const char *OldName, const char *NewName)

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: videodir.h 1.5 2004/12/26 11:52:56 kls Exp $ * $Id: videodir.h 1.6 2005/10/31 11:50:23 kls Exp $
*/ */
#ifndef __VIDEODIR_H #ifndef __VIDEODIR_H
@ -15,8 +15,8 @@
extern const char *VideoDirectory; extern const char *VideoDirectory;
int OpenVideoFile(const char *FileName, int Flags); cUnbufferedFile *OpenVideoFile(const char *FileName, int Flags);
int CloseVideoFile(int FileHandle); int CloseVideoFile(cUnbufferedFile *File);
bool RenameVideoFile(const char *OldName, const char *NewName); bool RenameVideoFile(const char *OldName, const char *NewName);
bool RemoveVideoFile(const char *FileName); bool RemoveVideoFile(const char *FileName);
bool VideoFileSpaceAvailable(int SizeMB); bool VideoFileSpaceAvailable(int SizeMB);