Commit a3942b4d authored by Klaus Schmidinger's avatar Klaus Schmidinger

Version 1.1.22

- Added 'Hrvatska radiotelevizija' and 'RTV Slovenija' to ca.conf (thanks to
  Paul Gohn).
- Implemented actual user input for CAM enquiry menus.
- Since disk file systems apparently don't honor the O_NONBLOCK flag to read from
  a file in non-blocking mode the cDvbPlayer now uses a non blocking file reader
  class to make sure replay remains smooth even under heavy system load.
- Increased the maximum possible packet size in remux.c to avoid corrupted streams
  with broadcasters that send extremely large PES packets (thanks to Teemu Rantanen).
- Added TS error checking to remux.c (thanks to Teemu Rantanen).
- Modified cRingBufferLinear to avoid excessive memmove() calls in 'Transfer Mode'
  and during recordings, which dramatically reduces CPU load. Thanks to Teemu
  Rantanen for pinpointing the problem with the excessive memmove() calls.
- Updated 'channels.conf' (thanks to Achim Lange).
- Added/improved Swedish language texts (thanks to Jan Ekholm).
- Fixed the description of the "Scroll pages" OSD setup parameter ('yes' and 'no'
  were mixed up).
- Fixed handling the LOG_LOCALn parameters in the -l option (thanks to Dimitrios
  Dimitrakos).
- Changed EIT processing to always read a full section.
- Fixed handling user defined CFLAGS in libdtv/libvdr/Makefile (thanks to Clemens
  Kirchgatterer and Robert Schiele).
- Fixed skipping unavailable channels in the EPG scanner.
parent 3e1d34f3
......@@ -305,7 +305,7 @@ Mirko G
Achim Lange <Achim_Lange@t-online.de>
for replacing 'killproc' with 'killall' in 'runvdr' to make it work on Debian
for reporting a bug in switching back the replay mode display in time shift mode
for his help in keeping 'channels.conf.cable' up to date
for his help in keeping 'channels.conf.cable' and 'channels.conf' up to date
Klaus Wolf <klaus@wolfsoft.de>
for reporting a bug in restoring the CICAM values for a fourth DVB card
......@@ -364,6 +364,7 @@ Simon Dean <linux-dvb@sickhack.com>
Dimitrios Dimitrakos <mail@dimitrios.de>
for translating OSD texts to the Greek language
for fixing handling the LOG_LOCALn parameters in the -l option
Marcus Kuba <marcus@kuba4u.de>
for reporting a bug in the unit of the "SVDRP timeout" setup parameter
......@@ -457,6 +458,7 @@ Robert Schiele <rschiele@uni-mannheim.de>
for reporting some faulty default parameter initializations
for suggesting to only set the Makefile variables CXX and CXXFLAGS if they are not
yet defined
for fixing a problem with user defined CFLAGS in libdtv/libvdr/Makefile
Gerhard Steiner <steiner@mail.austria.com>
for suggesting that the SVDRP command PUTE shall trigger an immediate write of
......@@ -502,6 +504,7 @@ Georg Hitsch <georg@hitsch.at>
Clemens Kirchgatterer <clemens@thf.ath.cx>
for suggesting to change source directory name for plugins from 'SRC' to 'src'
for reporting a problem with user defined CFLAGS in libdtv/libvdr/Makefile
Emil Naepflein <Emil.Naepflein@philosys.de>
for suggesting to take an active SVDRP connection into account when doing shutdown or
......@@ -522,3 +525,15 @@ Jan Rieger <jan@ricomp.de>
Walter Stroebel <walter.stroebel@lifeline.nl>
for introducing "Doxygen" to document the VDR source code
Paul Gohn <pgohn@nexgo.de>
for adding 'Hrvatska radiotelevizija' and 'RTV Slovenija' to ca.conf
Teemu Rantanen <tvr@iki.fi>
for increased the maximum possible packet size in remux.c to avoid corrupted streams
with broadcasters that send extremely large PES packets
for adding TS error checking to remux.c
for pinpointing a problem with excessive memmove() calls in 'Transfer Mode'
Jan Ekholm <chakie@infa.abo.fi>
for adding/improving some Swedish language OSD texts
......@@ -1916,3 +1916,28 @@ Video Disk Recorder Revision History
- Since several channels put very long strings into the Subtitle part of their
EPG data, that string is now limited in length when used in a recording's
file name.
2003-01-26: Version 1.1.22
- Added 'Hrvatska radiotelevizija' and 'RTV Slovenija' to ca.conf (thanks to
Paul Gohn).
- Implemented actual user input for CAM enquiry menus.
- Since disk file systems apparently don't honor the O_NONBLOCK flag to read from
a file in non-blocking mode the cDvbPlayer now uses a non blocking file reader
class to make sure replay remains smooth even under heavy system load.
- Increased the maximum possible packet size in remux.c to avoid corrupted streams
with broadcasters that send extremely large PES packets (thanks to Teemu Rantanen).
- Added TS error checking to remux.c (thanks to Teemu Rantanen).
- Modified cRingBufferLinear to avoid excessive memmove() calls in 'Transfer Mode'
and during recordings, which dramatically reduces CPU load. Thanks to Teemu
Rantanen for pinpointing the problem with the excessive memmove() calls.
- Updated 'channels.conf' (thanks to Achim Lange).
- Added/improved Swedish language texts (thanks to Jan Ekholm).
- Fixed the description of the "Scroll pages" OSD setup parameter ('yes' and 'no'
were mixed up).
- Fixed handling the LOG_LOCALn parameters in the -l option (thanks to Dimitrios
Dimitrakos).
- Changed EIT processing to always read a full section.
- Fixed handling user defined CFLAGS in libdtv/libvdr/Makefile (thanks to Clemens
Kirchgatterer and Robert Schiele).
- Fixed skipping unavailable channels in the EPG scanner.
......@@ -23,6 +23,10 @@ Video Disk Recorder User's Manual
Blue - Stop/Resume Mark On/Off(1) - Summary Stop
0..9 Ch select - - - Numeric inp. Exec cmd(2) Editing
In a numerical input field (like the response to a CAM enquiry) the keys 0..9
are used to enter the data, and the Left key can be used to delete the last
entered digit.
If your remote control provides additional keys, they can be used for the
following functions:
......@@ -411,11 +415,11 @@ Video Disk Recorder User's Manual
always displayed when pressing the "Ok" button in
normal viewing mode.
Scroll pages = yes yes = when pressing the "Down" ("Up") key while the cursor
Scroll pages = yes no = when pressing the "Down" ("Up") key while the cursor
is on the last (first) line of a list page, the
list is advanced by a full page and the cursor will
be at the top (bottom) of that page
no = dto., but the cursor remains at the bottom (top) of
yes = dto., but the cursor remains at the bottom (top) of
the page (this mode allows for faster scrolling
through long lists).
......
......@@ -29,6 +29,8 @@
402 NTV Plus
403 Viasat
404 Parabole Reunion
405 Hrvatska radiotelevizija
406 RTV Slovenija
# Viaccess 2
......
......@@ -54,7 +54,7 @@ Premiere 5:11797:h:S19.2E:27500:1279:1280:0:101:29:0:0:0
Premiere 6:11797:h:S19.2E:27500:1535:1536:0:101:41:0:0:0
Premiere 7:11797:h:S19.2E:27500:1023:1024:0:101:20:0:0:0
13th Street:11758:h:S19.2E:27500:2303:2304:0:101:42:0:0:0
Studio Universal:11758:h:S19.2E:27500:2047:2048:0:101:36:0:0:0
Studio Universal:12071:h:S19.2E:27500:2047:2048:0:101:36:0:0:0
Premiere Serie:12031:h:S19.2E:27500:1023:1024:0:101:16:0:0:0
Disney Channel:11758:h:S19.2E:27500:2559:2560:0:101:34:0:0:0
Premiere Nostalgie:12031:h:S19.2E:27500:2559:2560:0:101:516:0:0:0
......@@ -77,7 +77,7 @@ Premiere Direkt 3B:11719:h:S19.2E:27500:1279:1280;1283:0:101:183:0:0:0
Premiere Direkt 4A:12031:h:S19.2E:27500:2815:2816:0:101:18:0:0:0
:#Premiere Direkt 4B:12070:h:S19.2E:27500:1535:1536:0:101:216:0:0:0
:PW Erotic
Beate-Uhse.TV:11758:h:S19.2E:27500:1023:1024:0:101:21:0:0:0
Beate-Uhse.TV:12071:h:S19.2E:27500:1023:1024:0:101:21:0:0:0
Premiere Erotik 1:12031:h:S19.2E:27500:1279:1280:0:101:513:0:0:0
Premiere Erotik 2:11719:h:S19.2E:27500:1535:1536:0:101:778:0:0:0
Premiere Erotik 3:11719:h:S19.2E:27500:1791:1792:0:101:779:0:0:0
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: ci.c 1.1 2003/01/06 13:56:17 kls Exp $
* $Id: ci.c 1.2 2003/01/11 11:15:19 kls Exp $
*/
/* XXX TODO
......@@ -331,6 +331,7 @@ int cCiTransportConnection::RecvTPDU(void)
struct pollfd pfd[1];
pfd[0].fd = fd;
pfd[0].events = POLLIN;
lastResponse = ERROR;
if (poll(pfd, 1, 3500/*XXX*/) && (pfd[0].revents & POLLIN))//XXX
if (tpdu->Read(fd) == OK && tpdu->Tcid() == tcid) {
switch (state) {
......@@ -338,7 +339,7 @@ int cCiTransportConnection::RecvTPDU(void)
case stCREATION: if (tpdu->Tag() == T_CTC_REPLY) {
dataAvailable = tpdu->Status() & DATA_INDICATOR;
state = stACTIVE;
return tpdu->Tag();
lastResponse = tpdu->Tag();
}
break;
case stACTIVE: switch (tpdu->Tag()) {
......@@ -353,17 +354,17 @@ int cCiTransportConnection::RecvTPDU(void)
default: return ERROR;
}
dataAvailable = tpdu->Status() & DATA_INDICATOR;
return tpdu->Tag();
lastResponse = tpdu->Tag();
break;
case stDELETION: if (tpdu->Tag() == T_DTC_REPLY) {
Init(fd, slot, tcid);
//XXX Status()???
return tpdu->Tag();
lastResponse = tpdu->Tag();
}
break;
}
}
return ERROR;
return lastResponse;
}
int cCiTransportConnection::SendData(int Length, const uint8_t *Data)
......@@ -413,7 +414,7 @@ int cCiTransportConnection::Poll(void)
{
if (state == stACTIVE) {
if (SendTPDU(T_DATA_LAST) == OK) {
return lastResponse = RecvTPDU();
return RecvTPDU();
}
}
return ERROR;
......@@ -644,7 +645,7 @@ int cCiSession::SendData(int Tag, int Length, const uint8_t *Data)
*p++ = (Tag >> 8) & 0xFF;
*p++ = Tag & 0xFF;
p = SetLength(p, Length);
if (p - buffer + Length < sizeof(buffer)) {
if (p - buffer + Length < int(sizeof(buffer))) {
memcpy(p, Data, Length);
p += Length;
return tc->SendData(p - buffer, buffer);
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: config.h 1.145 2002/12/22 15:29:45 kls Exp $
* $Id: config.h 1.146 2003/01/12 09:44:28 kls Exp $
*/
#ifndef __CONFIG_H
......@@ -19,7 +19,7 @@
#include "device.h"
#include "tools.h"
#define VDRVERSION "1.1.21"
#define VDRVERSION "1.1.22"
#define MAXPRIORITY 99
#define MAXLIFETIME 99
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: dvbplayer.c 1.16 2002/11/03 11:23:47 kls Exp $
* $Id: dvbplayer.c 1.17 2003/01/19 15:43:58 kls Exp $
*/
#include "dvbplayer.h"
......@@ -69,6 +69,103 @@ int cBackTrace::Get(bool Forward)
return i;
}
// --- cNonBlockingFileReader ------------------------------------------------
class cNonBlockingFileReader : public cThread {
private:
int f;
uchar *buffer;
int wanted;
int length;
bool hasData;
bool active;
cMutex mutex;
cCondVar newSet;
protected:
void Action(void);
public:
cNonBlockingFileReader(void);
~cNonBlockingFileReader();
void Clear(void);
int Read(int FileHandle, uchar *Buffer, int Length);
bool Reading(void) { return buffer; }
};
cNonBlockingFileReader::cNonBlockingFileReader(void)
{
f = -1;
buffer = NULL;
wanted = length = 0;
hasData = false;
active = false;
Start();
}
cNonBlockingFileReader::~cNonBlockingFileReader()
{
active = false;
newSet.Broadcast();
Cancel(3);
free(buffer);
}
void cNonBlockingFileReader::Clear(void)
{
cMutexLock MutexLock(&mutex);
f = -1;
buffer = NULL;
wanted = length = 0;
hasData = false;
newSet.Broadcast();
}
int cNonBlockingFileReader::Read(int FileHandle, uchar *Buffer, int Length)
{
if (hasData && buffer) {
if (buffer != Buffer) {
esyslog("ERROR: cNonBlockingFileReader::Read() called with different buffer!");
errno = EINVAL;
return -1;
}
buffer = NULL;
return length;
}
if (!buffer) {
f = FileHandle;
buffer = Buffer;
wanted = Length;
length = 0;
hasData = false;
newSet.Broadcast();
}
errno = EAGAIN;
return -1;
}
void cNonBlockingFileReader::Action(void)
{
dsyslog("non blocking file reader thread started (pid=%d)", getpid());
active = true;
while (active) {
cMutexLock MutexLock(&mutex);
if (!hasData && f >= 0 && buffer) {
int r = safe_read(f, buffer + length, wanted - length);
if (r >= 0) {
length += r;
if (!r || length == wanted) // r == 0 means EOF
hasData = true;
}
else if (r < 0 && FATALERRNO) {
LOG_ERROR;
length = r; // this will forward the error status to the caller
hasData = true;
}
}
newSet.TimedWait(mutex, 1000);
}
dsyslog("non blocking file reader thread ended (pid=%d)", getpid());
}
// --- cDvbPlayer ------------------------------------------------------------
//XXX+ also used in recorder.c - find a better place???
......@@ -84,6 +181,7 @@ private:
enum ePlayModes { pmPlay, pmPause, pmSlow, pmFast, pmStill };
enum ePlayDirs { pdForward, pdBackward };
static int Speeds[];
cNonBlockingFileReader *nonBlockingFileReader;
cRingBufferFrame *ringBuffer;
cBackTrace *backTrace;
cFileName *fileName;
......@@ -135,6 +233,7 @@ int cDvbPlayer::Speeds[] = { 0, -2, -4, -8, 1, 2, 4, 12, 0 };
cDvbPlayer::cDvbPlayer(const char *FileName)
{
nonBlockingFileReader = NULL;
ringBuffer = NULL;
backTrace = NULL;
index = NULL;
......@@ -198,7 +297,9 @@ void cDvbPlayer::TrickSpeed(int Increment)
void cDvbPlayer::Empty(void)
{
Lock();
LOCK_THREAD;
if (nonBlockingFileReader)
nonBlockingFileReader->Clear();
if ((readIndex = backTrace->Get(playDir == pdForward)) < 0)
readIndex = writeIndex;
readFrame = NULL;
......@@ -206,7 +307,6 @@ void cDvbPlayer::Empty(void)
ringBuffer->Clear();
backTrace->Clear();
DeviceClear();
Unlock();
}
void cDvbPlayer::StripAudioPackets(uchar *b, int Length, uchar Except)
......@@ -305,7 +405,7 @@ void cDvbPlayer::Action(void)
{
dsyslog("dvbplayer thread started (pid=%d)", getpid());
uchar b[MAXFRAMESIZE];
uchar *b = NULL;
const uchar *p = NULL;
int pc = 0;
......@@ -313,6 +413,10 @@ void cDvbPlayer::Action(void)
if (readIndex >= 0)
isyslog("resuming replay at index %d (%s)", readIndex, IndexToHMSF(readIndex, true));
nonBlockingFileReader = new cNonBlockingFileReader;
int Length = 0;
int AudioTrack = 0; // -1 = any, 0 = none, >0 = audioTrack
running = true;
while (running && (NextFile() || readIndex >= 0 || ringBuffer->Available())) {
cPoller Poller;
......@@ -326,46 +430,59 @@ void cDvbPlayer::Action(void)
if (!readFrame && (replayFile >= 0 || readIndex >= 0)) {
if (playMode != pmStill) {
int r = 0;
if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) {
uchar FileNumber;
int FileOffset, Length;
int Index = index->GetNextIFrame(readIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, true);
if (Index >= 0) {
if (!NextFile(FileNumber, FileOffset))
if (!nonBlockingFileReader->Reading()) {
if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) {
uchar FileNumber;
int FileOffset;
int Index = index->GetNextIFrame(readIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, true);
if (Index >= 0) {
if (!NextFile(FileNumber, FileOffset))
continue;
}
else {
// can't call Play() here, because those functions may only be
// called from the foreground thread - and we also don't need
// to empty the buffer here
DevicePlay();
playMode = pmPlay;
playDir = pdForward;
continue;
}
readIndex = Index;
AudioTrack = 0;
// must clear all audio packets because the buffer is not emptied
// when falling back from "fast forward" to "play" (see above)
}
else {
// can't call Play() here, because those functions may only be
// called from the foreground thread - and we also don't need
// to empty the buffer here
DevicePlay();
playMode = pmPlay;
playDir = pdForward;
continue;
else if (index) {
uchar FileNumber;
int FileOffset;
readIndex++;
if (!(index->Get(readIndex, &FileNumber, &FileOffset, NULL, &Length) && NextFile(FileNumber, FileOffset))) {
readIndex = -1;
eof = true;
continue;
}
AudioTrack = audioTrack;
}
readIndex = Index;
r = ReadFrame(replayFile, b, Length, sizeof(b));
// must call StripAudioPackets() here because the buffer is not emptied
// when falling back from "fast forward" to "play" (see above)
StripAudioPackets(b, r);
}
else if (index) {
uchar FileNumber;
int FileOffset, Length;
readIndex++;
if (!(index->Get(readIndex, &FileNumber, &FileOffset, NULL, &Length) && NextFile(FileNumber, FileOffset))) {
readIndex = -1;
eof = true;
continue;
else { // allows replay even if the index file is missing
Length = MAXFRAMESIZE;
AudioTrack = -1;
}
if (Length == -1)
Length = MAXFRAMESIZE; // this means we read up to EOF (see cIndex)
else if (Length > MAXFRAMESIZE) {
esyslog("ERROR: frame larger than buffer (%d > %d)", Length, MAXFRAMESIZE);
Length = MAXFRAMESIZE;
}
r = ReadFrame(replayFile, b, Length, sizeof(b));
StripAudioPackets(b, r, audioTrack);
b = MALLOC(uchar, Length);
}
int r = nonBlockingFileReader->Read(replayFile, b, Length);
if (r > 0) {
if (AudioTrack >= 0)
StripAudioPackets(b, r, AudioTrack);
readFrame = new cFrame(b, -r, ftUnknown, readIndex); // hands over b to the ringBuffer
b = NULL;
}
else // allows replay even if the index file is missing
r = read(replayFile, b, sizeof(b));
if (r > 0)
readFrame = new cFrame(b, r, ftUnknown, readIndex);
else if (r == 0)
eof = true;
else if (r < 0 && FATALERRNO) {
......@@ -422,6 +539,10 @@ void cDvbPlayer::Action(void)
}
active = running = false;
cNonBlockingFileReader *nbfr = nonBlockingFileReader;
nonBlockingFileReader = NULL;
delete nbfr;
dsyslog("dvbplayer thread ended (pid=%d)", getpid());
}
......
......@@ -16,7 +16,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* $Id: eit.c 1.63 2003/01/06 15:05:46 kls Exp $
* $Id: eit.c 1.64 2003/01/26 12:21:15 kls Exp $
***************************************************************************/
#include "eit.h"
......@@ -1240,17 +1240,16 @@ void cSIProcessor::Action()
{
if (pfd[a].revents & POLLIN)
{
/* read section */
unsigned char buf[4096+1]; // max. allowed size for any EIT section (+1 for safety ;-)
if (safe_read(filters[a].handle, buf, 3) == 3)
// read section
unsigned char buf[4096]; // max. allowed size for any EIT section
int r = safe_read(filters[a].handle, buf, sizeof(buf));
if (r > 3) // minimum number of bytes necessary to get section length
{
int seclen = ((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF);
int seclen = ((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF) + 3;
int pid = filters[a].pid;
int n = safe_read(filters[a].handle, buf + 3, seclen);
if (n == seclen)
if (seclen == r)
{
seclen += 3;
//dsyslog("Received pid 0x%02x with table ID 0x%02x and length of %04d\n", pid, buf[0], seclen);
//dsyslog("Received pid 0x%04X with table ID 0x%02X and length of %4d\n", pid, buf[0], seclen);
switch (pid)
{
case 0x00:
......@@ -1335,10 +1334,10 @@ void cSIProcessor::Action()
break;
}
}
/*XXX this just fills up the log file - shouldn't we rather try to re-sync?
/*
else
dsyslog("read incomplete section - seclen = %d, n = %d", seclen, n);
XXX*/
dsyslog("read incomplete section - seclen = %d, r = %d", seclen, r);
*/
}
}
}
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: eitscan.c 1.10 2002/11/01 11:04:49 kls Exp $
* $Id: eitscan.c 1.11 2003/01/26 16:19:24 kls Exp $
*/
#include "eitscan.h"
......@@ -51,38 +51,42 @@ void cEITScanner::Process(void)
if (Setup.EPGScanTimeout && Channels.MaxNumber() > 1) {
time_t now = time(NULL);
if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) {
for (int i = 0; i < cDevice::NumDevices(); i++) {
cDevice *Device = cDevice::GetDevice(i);
if (Device && Device->CardIndex() < MAXDVBDEVICES) {
if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) {
if (!(Device->Receiving(true) || Device->Replaying())) {
int oldCh = lastChannel;
int ch = oldCh + 1;
while (ch != oldCh) {
if (ch > Channels.MaxNumber()) {
ch = 1;
numTransponders = 0;
}
cChannel *Channel = Channels.GetByNumber(ch, 1);
if (Channel) {
if (!Device->ProvidesChannel(Channel))
break;
if (Channel->Sid() && !TransponderScanned(Channel)) {
if (Device == cDevice::PrimaryDevice() && !currentChannel)
currentChannel = Device->CurrentChannel();
Device->SwitchChannel(Channel, false);
lastChannel = ch;
break;
do {
int oldLastChannel = lastChannel;
for (int i = 0; i < cDevice::NumDevices(); i++) {
cDevice *Device = cDevice::GetDevice(i);
if (Device && Device->CardIndex() < MAXDVBDEVICES) {
if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) {
if (!(Device->Receiving(true) || Device->Replaying())) {
int oldCh = lastChannel;
int ch = oldCh + 1;
while (ch != oldCh) {
if (ch > Channels.MaxNumber()) {
ch = 1;
numTransponders = 0;
}
cChannel *Channel = Channels.GetByNumber(ch, 1);
if (Channel) {
if (!Device->ProvidesChannel(Channel))
break;
if (Channel->Sid() && !TransponderScanned(Channel)) {
if (Device == cDevice::PrimaryDevice() && !currentChannel)
currentChannel = Device->CurrentChannel();
Device->SwitchChannel(Channel, false);
lastChannel = ch;
break;
}
}
ch = Channel->Number() + 1;
}
ch = Channel->Number() + 1;
}
}
}
}
}
else
lastChannel++; // avoid hangup in case the last channel in the list is not provided by a DVB card
}
if (lastChannel != oldLastChannel)
break;
lastChannel++;
} while (time(NULL) - now < 2);
lastScan = time(NULL);
}
}
......
......@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: i18n.c 1.101 2003/01/06 12:16:28 kls Exp $
* $Id: i18n.c 1.103 2003/01/26 11:46:46 kls Exp $
*
* Translations provided by:
*
......@@ -18,7 +18,7 @@
* Polish Michael Rakowski <mrak@gmx.de>
* Spanish Ruben Nunez Francisco <ruben.nunez@tang-it.com>
* Greek Dimitrios Dimitrakos <mail@dimitrios.de>
* Swedish Tomas Prybil <tomas@prybil.se>
* Swedish Tomas Prybil <tomas@prybil.se> and Jan Ekholm <chakie@infa.abo.fi>
* Romanian Paul Lacatus <paul@campina.iiruc.ro>
* Hungarian Istvan Koenigsberger <istvnko@hotmail.com> and Guido Josten <guido.josten@t-online.de>
*
......@@ -211,7 +211,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Inspelningskommandon",
"",// TODO
"",// TODO
},
......@@ -950,7 +950,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
"",//TODO
"Klla",
"",//TODO
"",//TODO
},
......@@ -1126,7 +1126,7 @@ const tI18nPhrase Phrases[] = {
"Bandwidth",
"Bandwidth",
"Bandwidth",
"Bandwidth",
"Bandbredd",
"Bandwidth",
"Bandwidth",
},
......@@ -1496,7 +1496,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
"",//TODO
"Kanalen ej tillgnglig!",
"",//TODO
"",//TODO
},
......@@ -1512,7 +1512,7 @@ const tI18nPhrase Phrases[] = {
"",//TODO
"",//TODO
"",//TODO
"",//TODO
"Kanalinstllningarna r ej unika!",
"",//TODO
"",//TODO
},
......@@ -2042,7 +2042,7 @@ const tI18nPhrase Phrases[] = {
"Transponder do ustawiania czasu",
"Transponder para reloj de sistema",
"Transponder gia sintonismo tis oras",
"Anvnd klockan frn fransponder",
"Anvnd klockan frn transponder",
"Preia ceasul din transponder",
"Idhz tartoz Transponder",
},
......@@ -2700,7 +2700,7 @@ const tI18nPhrase Phrases[] = {
"Paina 'Yls' tallettaaksesi ja 'Alas' peruuttaaksesi",
"'Gora' zapamietuje, 'Dol' przerywa",
"Pulse 'Arriba' para guarder, 'Abajo' para anular",
"'kato' apothikevsi, 'Pano' akirosi",
"'Kato' apothikevsi, 'Pano' akirosi",
"Tryck 'Upp' fr att spara, 'Ner' fr att avsluta",
"Apsati 'Sus' pentru salvare, 'Jos' pentru anulare",
"'Fel' ments, 'Le mgse",
......@@ -2894,7 +2894,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Spela upp",
"",// TODO
"",// TODO
},
......@@ -2910,7 +2910,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Pausa",
"",// TODO
"",// TODO
},
......@@ -2926,7 +2926,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Stoppa",
"",// TODO
"",// TODO
},
......@@ -2942,7 +2942,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Spela in",
"",// TODO
"",// TODO
},
......@@ -2958,7 +2958,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Spola framt",
"",// TODO
"",// TODO
},
......@@ -2974,7 +2974,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Spola bakt",
"",// TODO
"",// TODO
},
......@@ -3006,7 +3006,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Kanal+",
"",// TODO
"",// TODO
},
......@@ -3022,7 +3022,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Kanal-",
"",// TODO
"",// TODO
},
......@@ -3119,7 +3119,7 @@ const tI18nPhrase Phrases[] = {
"",// TODO
"",// TODO
"",// TODO
</