1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Implemented "Device Bonding"

This commit is contained in:
Klaus Schmidinger 2011-12-04 12:45:26 +01:00
parent a964269fe9
commit a49ce434f6
40 changed files with 740 additions and 86 deletions

View File

@ -6743,7 +6743,7 @@ Video Disk Recorder Revision History
extends over TS packet boundaries is now done by locally skipping TS packets extends over TS packet boundaries is now done by locally skipping TS packets
in cFrameDetector. in cFrameDetector.
2011-10-16: Version 1.7.22 2011-12-04: Version 1.7.22
- Fixed scaling subtitles in case the primary device's GetVideoSize() function doesn't - Fixed scaling subtitles in case the primary device's GetVideoSize() function doesn't
return actual values (thanks to Luca Olivetti). return actual values (thanks to Luca Olivetti).
@ -6765,3 +6765,7 @@ Video Disk Recorder Revision History
- Temporarily switching free devices to transponders in order to have their running - Temporarily switching free devices to transponders in order to have their running
status updated is now done by marking the devices as "occupied" for a certain status updated is now done by marking the devices as "occupied" for a certain
amount of time. amount of time.
- The new setup options "LNB/Device n connected to sat cable" can be used to define
which DVB-S devices are connected to the same sat cable and are therefore "bonded".
This obsoletes the LNBSHARE patch. Users of the LNBSHARE patch will need to newly
set up their sat devices with the above options.

11
INSTALL
View File

@ -392,6 +392,17 @@ according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
Distribution", "Channel Stacking System" or "Single Cable Interface") uses Distribution", "Channel Stacking System" or "Single Cable Interface") uses
the file "scr.conf" to specify which SCR channels use which user band frequency. the file "scr.conf" to specify which SCR channels use which user band frequency.
If DVB-S devices need to be connected to the same satellite cable, but no
"Satellite Channel Routing" is available, they can be set to be "bonded" in
the Setup/LNB menu. Bonded devices can only be tuned to the same polarization
and frequency band, which reduces the number of potentially receivable channels.
Note that it doesn't make sense to use "Satellite Channel Routing" and
"Device Bonding" at the same time with the same devices. If you use either
of these methods, it is necessary that your devices are always created in the
same sequence when the drivers are loaded. You may need to configure some
proper "udev" rules to make sure this happens.
Running VDR with DVB-C (cable) or DVB-T (terrestrial): Running VDR with DVB-C (cable) or DVB-T (terrestrial):
------------------------------------------------------ ------------------------------------------------------

8
MANUAL
View File

@ -732,12 +732,18 @@ Version 1.6
LNB: LNB:
Use DiSEqC = no Generally turns DiSEqC support on or off.
SLOF = 11700 The switching frequency (in MHz) between low and SLOF = 11700 The switching frequency (in MHz) between low and
high LOF high LOF
Low LNB frequency = 9750 The LNB's low and high local oscillator frequencies Low LNB frequency = 9750 The LNB's low and high local oscillator frequencies
High LNB frequency = 10600 (in MHz, these have no meaning for DVB-C receivers) High LNB frequency = 10600 (in MHz, these have no meaning for DVB-C receivers)
Use DiSEqC = no Generally turns DiSEqC support on or off. Device n connected to sat cable = own
Defines whether DVB-S device n has its own satellite cable,
or is "bonded" with another device. All DVB-S devices that
are connected to the same sat cable must be set to the same
number here.
CAM: CAM:

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.c 2.15 2011/08/20 09:12:05 kls Exp $ * $Id: config.c 2.16 2011/12/03 15:21:30 kls Exp $
*/ */
#include "config.h" #include "config.h"
@ -63,6 +63,69 @@ bool cSVDRPhost::Accepts(in_addr_t Address)
return (Address & mask) == (addr.s_addr & mask); return (Address & mask) == (addr.s_addr & mask);
} }
// --- cSatCableNumbers ------------------------------------------------------
cSatCableNumbers::cSatCableNumbers(int Size, const char *s)
{
size = Size;
array = MALLOC(int, size);
memset(array, size * sizeof(int), 0);
FromString(s);
}
cSatCableNumbers::~cSatCableNumbers()
{
free(array);
}
bool cSatCableNumbers::FromString(const char *s)
{
char *t;
int i = 0;
const char *p = s;
while (p && *p) {
int n = strtol(p, &t, 10);
if (t != p) {
if (i < size)
array[i++] = n;
else {
esyslog("ERROR: too many sat cable numbers in '%s'", s);
return false;
}
}
else {
esyslog("ERROR: invalid sat cable number in '%s'", s);
return false;
}
p = skipspace(t);
}
for ( ; i < size; i++)
array[i] = 0;
return true;
}
cString cSatCableNumbers::ToString(void)
{
cString s("");
for (int i = 0; i < size; i++) {
s = cString::sprintf("%s%d ", *s, array[i]);
}
return s;
}
int cSatCableNumbers::FirstDeviceIndex(int DeviceIndex) const
{
if (0 <= DeviceIndex && DeviceIndex < size) {
if (int CableNr = array[DeviceIndex]) {
for (int i = 0; i < size; i++) {
if (i < DeviceIndex && array[i] == CableNr)
return i;
}
}
}
return -1;
}
// --- cNestedItem ----------------------------------------------------------- // --- cNestedItem -----------------------------------------------------------
cNestedItem::cNestedItem(const char *Text, bool WithSubItems) cNestedItem::cNestedItem(const char *Text, bool WithSubItems)
@ -396,6 +459,7 @@ cSetup::cSetup(void)
CurrentVolume = MAXVOLUME; CurrentVolume = MAXVOLUME;
CurrentDolby = 0; CurrentDolby = 0;
InitialChannel = ""; InitialChannel = "";
DeviceBondings = "";
InitialVolume = -1; InitialVolume = -1;
ChannelsWrap = 0; ChannelsWrap = 0;
EmergencyExit = 1; EmergencyExit = 1;
@ -405,6 +469,7 @@ cSetup& cSetup::operator= (const cSetup &s)
{ {
memcpy(&__BeginData__, &s.__BeginData__, (char *)&s.__EndData__ - (char *)&s.__BeginData__); memcpy(&__BeginData__, &s.__BeginData__, (char *)&s.__EndData__ - (char *)&s.__BeginData__);
InitialChannel = s.InitialChannel; InitialChannel = s.InitialChannel;
DeviceBondings = s.DeviceBondings;
return *this; return *this;
} }
@ -589,6 +654,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value); else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value);
else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = Value; else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = Value;
else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = atoi(Value); else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = atoi(Value);
else if (!strcasecmp(Name, "DeviceBondings")) DeviceBondings = Value;
else if (!strcasecmp(Name, "ChannelsWrap")) ChannelsWrap = atoi(Value); else if (!strcasecmp(Name, "ChannelsWrap")) ChannelsWrap = atoi(Value);
else if (!strcasecmp(Name, "EmergencyExit")) EmergencyExit = atoi(Value); else if (!strcasecmp(Name, "EmergencyExit")) EmergencyExit = atoi(Value);
else else
@ -685,6 +751,7 @@ bool cSetup::Save(void)
Store("CurrentDolby", CurrentDolby); Store("CurrentDolby", CurrentDolby);
Store("InitialChannel", InitialChannel); Store("InitialChannel", InitialChannel);
Store("InitialVolume", InitialVolume); Store("InitialVolume", InitialVolume);
Store("DeviceBondings", DeviceBondings);
Store("ChannelsWrap", ChannelsWrap); Store("ChannelsWrap", ChannelsWrap);
Store("EmergencyExit", EmergencyExit); Store("EmergencyExit", EmergencyExit);

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 2.35 2011/09/10 09:45:55 kls Exp $ * $Id: config.h 2.36 2011/12/03 14:19:52 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -61,6 +61,25 @@ public:
bool Accepts(in_addr_t Address); bool Accepts(in_addr_t Address);
}; };
class cSatCableNumbers {
private:
int size;
int *array;
public:
cSatCableNumbers(int Size, const char *s = NULL);
~cSatCableNumbers();
int Size(void) const { return size; }
int *Array(void) { return array; }
bool FromString(const char *s);
cString ToString(void);
int FirstDeviceIndex(int DeviceIndex) const;
///< Returns the first device index (starting at 0) that uses the same
///< sat cable number as the device with the given DeviceIndex.
///< If the given device does not use the same sat cable as any other device,
///< or if the resulting value would be the same as DeviceIndex,
///< or if DeviceIndex is out of range, -1 is returned.
};
template<class T> class cConfig : public cList<T> { template<class T> class cConfig : public cList<T> {
private: private:
char *fileName; char *fileName;
@ -292,6 +311,7 @@ public:
int EmergencyExit; int EmergencyExit;
int __EndData__; int __EndData__;
cString InitialChannel; cString InitialChannel;
cString DeviceBondings;
cSetup(void); cSetup(void);
cSetup& operator= (const cSetup &s); cSetup& operator= (const cSetup &s);
bool Load(const char *FileName); bool Load(const char *FileName);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.c 2.43 2011/10/16 14:01:30 kls Exp $ * $Id: device.c 2.44 2011/10/16 14:36:43 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -640,12 +640,12 @@ const cChannel *cDevice::GetCurrentlyTunedTransponder(void) const
return NULL; return NULL;
} }
bool cDevice::IsTunedToTransponder(const cChannel *Channel) bool cDevice::IsTunedToTransponder(const cChannel *Channel) const
{ {
return false; return false;
} }
bool cDevice::MaySwitchTransponder(void) bool cDevice::MaySwitchTransponder(const cChannel *Channel) const
{ {
return time(NULL) > occupiedTimeout && !Receiving(true) && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid); return time(NULL) > occupiedTimeout && !Receiving(true) && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid);
} }
@ -1488,6 +1488,7 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
int cDevice::Priority(void) const int cDevice::Priority(void) const
{ {
int priority = IsPrimaryDevice() ? Setup.PrimaryLimit - 1 : DEFAULTPRIORITY; int priority = IsPrimaryDevice() ? Setup.PrimaryLimit - 1 : DEFAULTPRIORITY;
cMutexLock MutexLock(&mutexReceiver);
for (int i = 0; i < MAXRECEIVERS; i++) { for (int i = 0; i < MAXRECEIVERS; i++) {
if (receiver[i]) if (receiver[i])
priority = max(receiver[i]->priority, priority); priority = max(receiver[i]->priority, priority);
@ -1502,6 +1503,7 @@ bool cDevice::Ready(void)
bool cDevice::Receiving(bool CheckAny) const bool cDevice::Receiving(bool CheckAny) const
{ {
cMutexLock MutexLock(&mutexReceiver);
for (int i = 0; i < MAXRECEIVERS; i++) { for (int i = 0; i < MAXRECEIVERS; i++) {
if (receiver[i] && (CheckAny || receiver[i]->priority >= 0)) // cReceiver with priority < 0 doesn't count if (receiver[i] && (CheckAny || receiver[i]->priority >= 0)) // cReceiver with priority < 0 doesn't count
return true; return true;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.h 2.28 2011/10/16 13:27:23 kls Exp $ * $Id: device.h 2.29 2011/10/16 14:10:33 kls Exp $
*/ */
#ifndef __DEVICE_H #ifndef __DEVICE_H
@ -275,12 +275,14 @@ public:
///< This is not one of the channels in the global cChannels list, but rather ///< This is not one of the channels in the global cChannels list, but rather
///< a local copy. The result may be NULL if the device is not tuned to any ///< a local copy. The result may be NULL if the device is not tuned to any
///< transponder. ///< transponder.
virtual bool IsTunedToTransponder(const cChannel *Channel); virtual bool IsTunedToTransponder(const cChannel *Channel) const;
///< Returns true if this device is currently tuned to the given Channel's ///< Returns true if this device is currently tuned to the given Channel's
///< transponder. ///< transponder.
virtual bool MaySwitchTransponder(void); virtual bool MaySwitchTransponder(const cChannel *Channel) const;
///< Returns true if it is ok to switch the transponder on this device, ///< Returns true if it is ok to switch to the Channel's transponder on this
///< without disturbing any other activities. ///< device, without disturbing any other activities. If an occupied timeout
///< has been set for this device, and that timeout has not yet expired,
///< this function returns false,
bool SwitchChannel(const cChannel *Channel, bool LiveView); bool SwitchChannel(const cChannel *Channel, bool LiveView);
///< Switches the device to the given Channel, initiating transfer mode ///< Switches the device to the given Channel, initiating transfer mode
///< if necessary. ///< if necessary.
@ -710,7 +712,7 @@ public:
// Receiver facilities // Receiver facilities
private: private:
cMutex mutexReceiver; mutable cMutex mutexReceiver;
cReceiver *receiver[MAXRECEIVERS]; cReceiver *receiver[MAXRECEIVERS];
public: public:
int Priority(void) const; int Priority(void) const;
@ -739,7 +741,7 @@ public:
///< Detaches the given receiver from this device. ///< Detaches the given receiver from this device.
void DetachAll(int Pid); void DetachAll(int Pid);
///< Detaches all receivers from this device for this pid. ///< Detaches all receivers from this device for this pid.
void DetachAllReceivers(void); virtual void DetachAllReceivers(void);
///< Detaches all receivers from this device. ///< Detaches all receivers from this device.
}; };

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: dvbdevice.c 2.47 2011/09/17 12:53:46 kls Exp $ * $Id: dvbdevice.c 2.48 2011/12/03 15:24:27 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
@ -259,8 +259,9 @@ bool cDvbTransponderParameters::Parse(const char *s)
class cDvbTuner : public cThread { class cDvbTuner : public cThread {
private: private:
static cMutex bondMutex;
enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked }; enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked };
int device; const cDvbDevice *device;
int fd_frontend; int fd_frontend;
int adapter, frontend; int adapter, frontend;
uint32_t subsystemId; uint32_t subsystemId;
@ -275,24 +276,35 @@ private:
cMutex mutex; cMutex mutex;
cCondVar locked; cCondVar locked;
cCondVar newSet; cCondVar newSet;
cDvbTuner *bondedTuner;
bool bondedMaster;
bool bondedMasterFailed;
cString GetBondingParams(const cChannel *Channel = NULL) const;
void ClearEventQueue(void) const; void ClearEventQueue(void) const;
bool GetFrontendStatus(fe_status_t &Status) const; bool GetFrontendStatus(fe_status_t &Status) const;
void ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency) const; void ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency);
void ResetToneAndVoltage(void);
bool SetFrontend(void); bool SetFrontend(void);
virtual void Action(void); virtual void Action(void);
public: public:
cDvbTuner(int Device, int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType); cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType);
virtual ~cDvbTuner(); virtual ~cDvbTuner();
bool Bond(cDvbTuner *Tuner);
void UnBond(void);
bool BondingOk(const cChannel *Channel, bool ConsiderOccupied = false) const;
cDvbTuner *GetBondedMaster(void);
const cChannel *GetTransponder(void) const { return &channel; } const cChannel *GetTransponder(void) const { return &channel; }
uint32_t SubsystemId(void) const { return subsystemId; } uint32_t SubsystemId(void) const { return subsystemId; }
bool IsTunedTo(const cChannel *Channel) const; bool IsTunedTo(const cChannel *Channel) const;
void Set(const cChannel *Channel); void SetChannel(const cChannel *Channel);
bool Locked(int TimeoutMs = 0); bool Locked(int TimeoutMs = 0);
int GetSignalStrength(void) const; int GetSignalStrength(void) const;
int GetSignalQuality(void) const; int GetSignalQuality(void) const;
}; };
cDvbTuner::cDvbTuner(int Device, int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType) cMutex cDvbTuner::bondMutex;
cDvbTuner::cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType)
{ {
device = Device; device = Device;
fd_frontend = Fd_Frontend; fd_frontend = Fd_Frontend;
@ -306,8 +318,11 @@ cDvbTuner::cDvbTuner(int Device, int Fd_Frontend, int Adapter, int Frontend, fe_
lastDiseqc = NULL; lastDiseqc = NULL;
scr = NULL; scr = NULL;
tunerStatus = tsIdle; tunerStatus = tsIdle;
bondedTuner = NULL;
bondedMaster = false;
bondedMasterFailed = false;
if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2)
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); // must explicitly turn on LNB power ResetToneAndVoltage(); // must explicitly turn on LNB power
SetDescription("tuner on frontend %d/%d", adapter, frontend); SetDescription("tuner on frontend %d/%d", adapter, frontend);
Start(); Start();
} }
@ -318,6 +333,7 @@ cDvbTuner::~cDvbTuner()
newSet.Broadcast(); newSet.Broadcast();
locked.Broadcast(); locked.Broadcast();
Cancel(3); Cancel(3);
UnBond();
/* looks like this irritates the SCR switch, so let's leave it out for now /* looks like this irritates the SCR switch, so let's leave it out for now
if (lastDiseqc && lastDiseqc->IsScr()) { if (lastDiseqc && lastDiseqc->IsScr()) {
unsigned int Frequency = 0; unsigned int Frequency = 0;
@ -326,6 +342,109 @@ cDvbTuner::~cDvbTuner()
*/ */
} }
bool cDvbTuner::Bond(cDvbTuner *Tuner)
{
cMutexLock MutexLock(&bondMutex);
if (!bondedTuner) {
if ((frontendType == SYS_DVBS || frontendType == SYS_DVBS2) && (Tuner->frontendType == SYS_DVBS || Tuner->frontendType == SYS_DVBS2)) {
ResetToneAndVoltage();
bondedMaster = false; // makes sure we don't disturb an existing master
bondedTuner = Tuner->bondedTuner ? Tuner->bondedTuner : Tuner;
Tuner->bondedTuner = this;
dsyslog("tuner %d/%d bonded with tuner %d/%d", adapter, frontend, bondedTuner->adapter, bondedTuner->frontend);
return true;
}
else
esyslog("ERROR: can't bond tuner %d/%d with tuner %d/%d (only DVB-S(2) tuners can be bonded)", adapter, frontend, Tuner->adapter, Tuner->frontend);
}
else
esyslog("ERROR: tuner %d/%d already bonded with tuner %d/%d, can't bond with tuner %d/%d", adapter, frontend, bondedTuner->adapter, bondedTuner->frontend, Tuner->adapter, Tuner->frontend);
return false;
}
void cDvbTuner::UnBond(void)
{
cMutexLock MutexLock(&bondMutex);
if (cDvbTuner *t = bondedTuner) {
dsyslog("tuner %d/%d unbonded from tuner %d/%d", adapter, frontend, bondedTuner->adapter, bondedTuner->frontend);
while (t->bondedTuner != this)
t = t->bondedTuner;
if (t == bondedTuner)
t->bondedTuner = NULL;
else
t->bondedTuner = bondedTuner;
bondedMaster = false; // another one will automatically become master whenever necessary
bondedTuner = NULL;
}
}
cString cDvbTuner::GetBondingParams(const cChannel *Channel) const
{
if (!Channel)
Channel = &channel;
cDvbTransponderParameters dtp(Channel->Parameters());
if (Setup.DiSEqC) {
if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, Channel->Source(), Channel->Frequency(), dtp.Polarization(), NULL))
return diseqc->Commands();
}
else {
bool ToneOff = Channel->Frequency() < (unsigned int)Setup.LnbSLOF;
bool VoltOff = dtp.Polarization() == 'V' || dtp.Polarization() == 'R';
return cString::sprintf("%c %c", ToneOff ? 't' : 'T', VoltOff ? 'v' : 'V');
}
return "";
}
bool cDvbTuner::BondingOk(const cChannel *Channel, bool ConsiderOccupied) const
{
cMutexLock MutexLock(&bondMutex);
if (cDvbTuner *t = bondedTuner) {
cString BondingParams = GetBondingParams(Channel);
do {
if (t->device->Receiving() || t->tunerStatus != tsIdle && (t->device == cDevice::ActualDevice() || ConsiderOccupied && t->device->Occupied())) {
if (strcmp(BondingParams, t->GetBondingParams()) != 0)
return false;
}
t = t->bondedTuner;
} while (t != bondedTuner);
}
return true;
}
cDvbTuner *cDvbTuner::GetBondedMaster(void)
{
if (!bondedTuner)
return this; // an unbonded tuner is always "master"
cMutexLock MutexLock(&bondMutex);
if (bondedMaster) {
if (!bondedMasterFailed)
return this;
else
bondedMaster = false;
}
// This tuner is bonded, but it's not the master, so let's see if there is a master at all:
if (cDvbTuner *t = bondedTuner) {
while (t != this) {
if (t->bondedMaster)
return t;
t = t->bondedTuner;
}
}
// None of the other bonded tuners is master, so make this one the master:
cDvbTuner *t = this;
if (bondedMasterFailed) {
// This one has failed, so switch to the next one:
t = bondedTuner;
t->bondedMasterFailed = false;
cMutexLock MutexLock(&t->mutex);
t->channel = channel;
t->tunerStatus = tsSet;
}
t->bondedMaster = true;
dsyslog("tuner %d/%d is now bonded master", t->adapter, t->frontend);
return t;
}
bool cDvbTuner::IsTunedTo(const cChannel *Channel) const bool cDvbTuner::IsTunedTo(const cChannel *Channel) const
{ {
if (tunerStatus == tsIdle) if (tunerStatus == tsIdle)
@ -336,8 +455,22 @@ bool cDvbTuner::IsTunedTo(const cChannel *Channel) const
return strcmp(channel.Parameters(), Channel->Parameters()) == 0; return strcmp(channel.Parameters(), Channel->Parameters()) == 0;
} }
void cDvbTuner::Set(const cChannel *Channel) void cDvbTuner::SetChannel(const cChannel *Channel)
{ {
if (Channel) {
if (bondedTuner) {
cMutexLock MutexLock(&bondMutex);
cDvbTuner *BondedMaster = GetBondedMaster();
if (BondedMaster == this) {
if (strcmp(GetBondingParams(Channel), GetBondingParams()) != 0) {
// switching to a completely different band, so set all others to idle:
for (cDvbTuner *t = bondedTuner; t && t != this; t = t->bondedTuner)
t->SetChannel(NULL);
}
}
else if (!BondedMaster->device->Receiving())
BondedMaster->SetChannel(Channel);
}
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(&mutex);
if (!IsTunedTo(Channel)) if (!IsTunedTo(Channel))
tunerStatus = tsSet; tunerStatus = tsSet;
@ -345,6 +478,12 @@ void cDvbTuner::Set(const cChannel *Channel)
lastTimeoutReport = 0; lastTimeoutReport = 0;
newSet.Broadcast(); newSet.Broadcast();
} }
else {
cMutexLock MutexLock(&mutex);
tunerStatus = tsIdle;
ResetToneAndVoltage();
}
}
bool cDvbTuner::Locked(int TimeoutMs) bool cDvbTuner::Locked(int TimeoutMs)
{ {
@ -493,7 +632,7 @@ static unsigned int FrequencyToHz(unsigned int f)
return f; return f;
} }
void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency) const void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency)
{ {
struct dvb_diseqc_master_cmd cmd; struct dvb_diseqc_master_cmd cmd;
const char *CurrentAction = NULL; const char *CurrentAction = NULL;
@ -514,7 +653,13 @@ void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency) co
} }
} }
if (scr) if (scr)
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); // makes sure we don't block the bus! ResetToneAndVoltage(); // makes sure we don't block the bus!
}
void cDvbTuner::ResetToneAndVoltage(void)
{
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13));
CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF));
} }
bool cDvbTuner::SetFrontend(void) bool cDvbTuner::SetFrontend(void)
@ -544,12 +689,16 @@ bool cDvbTuner::SetFrontend(void)
if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) { if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) {
unsigned int frequency = channel.Frequency(); unsigned int frequency = channel.Frequency();
if (Setup.DiSEqC) { if (Setup.DiSEqC) {
if (const cDiseqc *diseqc = Diseqcs.Get(device, channel.Source(), frequency, dtp.Polarization(), &scr)) { if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, channel.Source(), frequency, dtp.Polarization(), &scr)) {
frequency -= diseqc->Lof(); frequency -= diseqc->Lof();
if (diseqc != lastDiseqc || diseqc->IsScr()) { if (diseqc != lastDiseqc || diseqc->IsScr()) {
if (GetBondedMaster() == this) {
ExecuteDiseqc(diseqc, &frequency); ExecuteDiseqc(diseqc, &frequency);
if (frequency == 0) if (frequency == 0)
return false; return false;
}
else
ResetToneAndVoltage();
lastDiseqc = diseqc; lastDiseqc = diseqc;
} }
} }
@ -568,7 +717,11 @@ bool cDvbTuner::SetFrontend(void)
frequency -= Setup.LnbFrequHi; frequency -= Setup.LnbFrequHi;
tone = SEC_TONE_ON; tone = SEC_TONE_ON;
} }
int volt = (dtp.Polarization() == 'v' || dtp.Polarization() == 'V' || dtp.Polarization() == 'r' || dtp.Polarization() == 'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18; int volt = (dtp.Polarization() == 'V' || dtp.Polarization() == 'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
if (GetBondedMaster() != this) {
tone = SEC_TONE_OFF;
volt = SEC_VOLTAGE_13;
}
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, volt)); CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, volt));
CHECK(ioctl(fd_frontend, FE_SET_TONE, tone)); CHECK(ioctl(fd_frontend, FE_SET_TONE, tone));
} }
@ -675,6 +828,9 @@ void cDvbTuner::Action(void)
isyslog("frontend %d/%d timed out while tuning to channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder()); isyslog("frontend %d/%d timed out while tuning to channel %d, tp %d", adapter, frontend, channel.Number(), channel.Transponder());
lastTimeoutReport = time(NULL); lastTimeoutReport = time(NULL);
} }
cMutexLock MutexLock(&bondMutex);
if (bondedTuner && bondedMaster)
bondedMasterFailed = true; // give an other tuner a chance in case the sat cable was disconnected
continue; continue;
} }
case tsLocked: case tsLocked:
@ -770,6 +926,7 @@ cOsdItem *cDvbSourceParam::GetOsdItem(void)
// --- cDvbDevice ------------------------------------------------------------ // --- cDvbDevice ------------------------------------------------------------
int cDvbDevice::setTransferModeForDolbyDigital = 1; int cDvbDevice::setTransferModeForDolbyDigital = 1;
cMutex cDvbDevice::bondMutex;
const char *DeliverySystems[] = { const char *DeliverySystems[] = {
"UNDEFINED", "UNDEFINED",
@ -799,6 +956,8 @@ cDvbDevice::cDvbDevice(int Adapter, int Frontend)
dvbTuner = NULL; dvbTuner = NULL;
frontendType = SYS_UNDEFINED; frontendType = SYS_UNDEFINED;
numProvidedSystems = 0; numProvidedSystems = 0;
bondedDevice = NULL;
needsDetachBondedReceivers = false;
// Devices that are present on all card types: // Devices that are present on all card types:
@ -848,7 +1007,7 @@ cDvbDevice::cDvbDevice(int Adapter, int Frontend)
else else
p = (char *)"unknown modulations"; p = (char *)"unknown modulations";
isyslog("frontend %d/%d provides %s with %s (\"%s\")", adapter, frontend, DeliverySystems[frontendType], p, frontendInfo.name); isyslog("frontend %d/%d provides %s with %s (\"%s\")", adapter, frontend, DeliverySystems[frontendType], p, frontendInfo.name);
dvbTuner = new cDvbTuner(CardIndex() + 1, fd_frontend, adapter, frontend, frontendType); dvbTuner = new cDvbTuner(this, fd_frontend, adapter, frontend, frontendType);
} }
} }
else else
@ -862,6 +1021,7 @@ cDvbDevice::~cDvbDevice()
StopSectionHandler(); StopSectionHandler();
delete dvbTuner; delete dvbTuner;
delete ciAdapter; delete ciAdapter;
UnBond();
// We're not explicitly closing any device files here, since this sometimes // We're not explicitly closing any device files here, since this sometimes
// caused segfaults. Besides, the program is about to terminate anyway... // caused segfaults. Besides, the program is about to terminate anyway...
} }
@ -953,6 +1113,104 @@ bool cDvbDevice::Ready(void)
return true; return true;
} }
bool cDvbDevice::BondDevices(const char *Bondings)
{
UnBondDevices();
if (Bondings) {
cSatCableNumbers SatCableNumbers(MAXDEVICES, Bondings);
for (int i = 0; i < cDevice::NumDevices(); i++) {
int d = SatCableNumbers.FirstDeviceIndex(i);
if (d >= 0) {
int ErrorDevice = 0;
if (cDevice *Device1 = cDevice::GetDevice(i)) {
if (cDevice *Device2 = cDevice::GetDevice(d)) {
if (cDvbDevice *DvbDevice1 = dynamic_cast<cDvbDevice *>(Device1)) {
if (cDvbDevice *DvbDevice2 = dynamic_cast<cDvbDevice *>(Device2)) {
if (!DvbDevice2->Bond(DvbDevice1))
return false; // Bond() has already logged the error
}
else
ErrorDevice = d + 1;
}
else
ErrorDevice = i + 1;
if (ErrorDevice) {
esyslog("ERROR: device '%d' in device bondings '%s' is not a cDvbDevice", ErrorDevice, Bondings);
return false;
}
}
else
ErrorDevice = d + 1;
}
else
ErrorDevice = i + 1;
if (ErrorDevice) {
esyslog("ERROR: unknown device '%d' in device bondings '%s'", ErrorDevice, Bondings);
return false;
}
}
}
}
return true;
}
void cDvbDevice::UnBondDevices(void)
{
for (int i = 0; i < cDevice::NumDevices(); i++) {
if (cDvbDevice *d = dynamic_cast<cDvbDevice *>(cDevice::GetDevice(i)))
d->UnBond();
}
}
bool cDvbDevice::Bond(cDvbDevice *Device)
{
cMutexLock MutexLock(&bondMutex);
if (!bondedDevice) {
if (Device != this) {
if ((frontendType == SYS_DVBS || frontendType == SYS_DVBS2) && (Device->frontendType == SYS_DVBS || Device->frontendType == SYS_DVBS2)) {
if (dvbTuner && Device->dvbTuner && dvbTuner->Bond(Device->dvbTuner)) {
bondedDevice = Device->bondedDevice ? Device->bondedDevice : Device;
Device->bondedDevice = this;
dsyslog("device %d bonded with device %d", CardIndex() + 1, bondedDevice->CardIndex() + 1);
return true;
}
}
else
esyslog("ERROR: can't bond device %d with device %d (only DVB-S(2) devices can be bonded)", CardIndex() + 1, Device->CardIndex() + 1);
}
else
esyslog("ERROR: can't bond device %d with itself", CardIndex() + 1);
}
else
esyslog("ERROR: device %d already bonded with device %d, can't bond with device %d", CardIndex() + 1, bondedDevice->CardIndex() + 1, Device->CardIndex() + 1);
return false;
}
void cDvbDevice::UnBond(void)
{
cMutexLock MutexLock(&bondMutex);
if (cDvbDevice *d = bondedDevice) {
if (dvbTuner)
dvbTuner->UnBond();
dsyslog("device %d unbonded from device %d", CardIndex() + 1, bondedDevice->CardIndex() + 1);
while (d->bondedDevice != this)
d = d->bondedDevice;
if (d == bondedDevice)
d->bondedDevice = NULL;
else
d->bondedDevice = bondedDevice;
bondedDevice = NULL;
}
}
bool cDvbDevice::BondingOk(const cChannel *Channel, bool ConsiderOccupied) const
{
cMutexLock MutexLock(&bondMutex);
if (bondedDevice)
return dvbTuner && dvbTuner->BondingOk(Channel, ConsiderOccupied);
return true;
}
bool cDvbDevice::HasCi(void) bool cDvbDevice::HasCi(void)
{ {
return ciAdapter; return ciAdapter;
@ -1055,7 +1313,7 @@ bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const
dtp.Modulation() == PSK_8 && !(frontendInfo.caps & FE_CAN_TURBO_FEC) && dtp.System() == SYS_DVBS) // "turbo fec" is a non standard FEC used by North American broadcasters - this is a best guess to determine this condition dtp.Modulation() == PSK_8 && !(frontendInfo.caps & FE_CAN_TURBO_FEC) && dtp.System() == SYS_DVBS) // "turbo fec" is a non standard FEC used by North American broadcasters - this is a best guess to determine this condition
return false; // requires modulation system which frontend doesn't provide return false; // requires modulation system which frontend doesn't provide
if (!cSource::IsSat(Channel->Source()) || if (!cSource::IsSat(Channel->Source()) ||
!Setup.DiSEqC || Diseqcs.Get(CardIndex() + 1, Channel->Source(), Channel->Frequency(), dtp.Polarization(), NULL)) (!Setup.DiSEqC || Diseqcs.Get(CardIndex() + 1, Channel->Source(), Channel->Frequency(), dtp.Polarization(), NULL)))
return DeviceHooksProvidesTransponder(Channel); return DeviceHooksProvidesTransponder(Channel);
return false; return false;
} }
@ -1065,10 +1323,12 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
bool result = false; bool result = false;
bool hasPriority = Priority < 0 || Priority > this->Priority(); bool hasPriority = Priority < 0 || Priority > this->Priority();
bool needsDetachReceivers = false; bool needsDetachReceivers = false;
needsDetachBondedReceivers = false;
if (dvbTuner && ProvidesTransponder(Channel)) { if (dvbTuner && ProvidesTransponder(Channel)) {
result = hasPriority; result = hasPriority;
if (Priority >= 0 && Receiving(true)) { if (Priority >= 0) {
if (Receiving(true)) {
if (dvbTuner->IsTunedTo(Channel)) { if (dvbTuner->IsTunedTo(Channel)) {
if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) { if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) {
if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) { if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) {
@ -1088,6 +1348,20 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
else else
needsDetachReceivers = true; needsDetachReceivers = true;
} }
if (result) {
if (!BondingOk(Channel)) {
// This device is bonded, so we need to check the priorities of the others:
for (cDvbDevice *d = bondedDevice; d && d != this; d = d->bondedDevice) {
if (d->Priority() >= Priority) {
result = false;
break;
}
}
needsDetachBondedReceivers = true;
needsDetachReceivers = true;
}
}
}
} }
if (NeedsDetachReceivers) if (NeedsDetachReceivers)
*NeedsDetachReceivers = needsDetachReceivers; *NeedsDetachReceivers = needsDetachReceivers;
@ -1119,15 +1393,20 @@ const cChannel *cDvbDevice::GetCurrentlyTunedTransponder(void) const
return dvbTuner ? dvbTuner->GetTransponder() : NULL; return dvbTuner ? dvbTuner->GetTransponder() : NULL;
} }
bool cDvbDevice::IsTunedToTransponder(const cChannel *Channel) bool cDvbDevice::IsTunedToTransponder(const cChannel *Channel) const
{ {
return dvbTuner ? dvbTuner->IsTunedTo(Channel) : false; return dvbTuner ? dvbTuner->IsTunedTo(Channel) : false;
} }
bool cDvbDevice::MaySwitchTransponder(const cChannel *Channel) const
{
return BondingOk(Channel, true) && cDevice::MaySwitchTransponder(Channel);
}
bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{ {
if (dvbTuner) if (dvbTuner)
dvbTuner->Set(Channel); dvbTuner->SetChannel(Channel);
return true; return true;
} }
@ -1169,6 +1448,17 @@ bool cDvbDevice::GetTSPacket(uchar *&Data)
return false; return false;
} }
void cDvbDevice::DetachAllReceivers(void)
{
cMutexLock MutexLock(&bondMutex);
cDvbDevice *d = this;
do {
d->cDevice::DetachAllReceivers();
d = d->bondedDevice;
} while (d && d != this && needsDetachBondedReceivers);
needsDetachBondedReceivers = false;
}
// --- cDvbDeviceProbe ------------------------------------------------------- // --- cDvbDeviceProbe -------------------------------------------------------
cList<cDvbDeviceProbe> DvbDeviceProbes; cList<cDvbDeviceProbe> DvbDeviceProbes;

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: dvbdevice.h 2.16 2011/08/26 12:55:45 kls Exp $ * $Id: dvbdevice.h 2.17 2011/11/27 11:56:57 kls Exp $
*/ */
#ifndef __DVBDEVICE_H #ifndef __DVBDEVICE_H
@ -122,10 +122,40 @@ private:
int numProvidedSystems; int numProvidedSystems;
fe_delivery_system frontendType; fe_delivery_system frontendType;
int fd_dvr, fd_ca; int fd_dvr, fd_ca;
static cMutex bondMutex;
cDvbDevice *bondedDevice;
mutable bool needsDetachBondedReceivers;
public: public:
cDvbDevice(int Adapter, int Frontend); cDvbDevice(int Adapter, int Frontend);
virtual ~cDvbDevice(); virtual ~cDvbDevice();
virtual bool Ready(void); virtual bool Ready(void);
static bool BondDevices(const char *Bondings);
///< Bonds the devices as defined in the given Bondings string.
///< A bonding is a sequence of device numbers (starting at 1),
///< separated by '+' characters. Several bondings are separated by
///< commas, as in "1+2,3+4+5".
///< Returns false if an error occurred.
static void UnBondDevices(void);
///< Unbonds all devices.
bool Bond(cDvbDevice *Device);
///< Bonds this device with the given Device, making both of them use
///< the same satellite cable and LNB. Only DVB-S(2) devices can be
///< bonded. When this function is called, the calling device must
///< not be bonded to any other device. The given Device, however,
///< may already be bonded to an other device. That way several devices
///< can be bonded together.
///< Returns true if the bonding was successful.
void UnBond(void);
///< Removes this device from any bonding it might have with other
///< devices. If this device is not bonded with any other device,
///< nothing happens.
bool BondingOk(const cChannel *Channel, bool ConsiderOccupied = false) const;
///< Returns true if this device is either not bonded to any other
///< device, or the given Channel is on the same satellite, polarization
///< and band as those the bonded devices are tuned to (if any).
///< If ConsiderOccupied is true, any bonded devices that are currently
///< occupied but not otherwise receiving will cause this function to
///< return false.
// Common Interface facilities: // Common Interface facilities:
@ -145,7 +175,8 @@ public:
virtual int SignalStrength(void) const; virtual int SignalStrength(void) const;
virtual int SignalQuality(void) const; virtual int SignalQuality(void) const;
virtual const cChannel *GetCurrentlyTunedTransponder(void) const; virtual const cChannel *GetCurrentlyTunedTransponder(void) const;
virtual bool IsTunedToTransponder(const cChannel *Channel); virtual bool IsTunedToTransponder(const cChannel *Channel) const;
virtual bool MaySwitchTransponder(const cChannel *Channel) const;
protected: protected:
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
public: public:
@ -187,6 +218,7 @@ protected:
virtual bool OpenDvr(void); virtual bool OpenDvr(void);
virtual void CloseDvr(void); virtual void CloseDvr(void);
virtual bool GetTSPacket(uchar *&Data); virtual bool GetTSPacket(uchar *&Data);
virtual void DetachAllReceivers(void);
}; };
// A plugin that implements a DVB device derived from cDvbDevice needs to create // A plugin that implements a DVB device derived from cDvbDevice needs to create

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: eitscan.c 2.4 2011/08/26 13:10:00 kls Exp $ * $Id: eitscan.c 2.5 2011/10/16 14:10:00 kls Exp $
*/ */
#include "eitscan.h" #include "eitscan.h"
@ -150,7 +150,7 @@ void cEITScanner::Process(void)
if (!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= CA_ENCRYPTED_MIN) { if (!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= CA_ENCRYPTED_MIN) {
if (Device->ProvidesTransponder(Channel)) { if (Device->ProvidesTransponder(Channel)) {
if (!Device->Receiving()) { if (!Device->Receiving()) {
bool MaySwitchTransponder = Device->MaySwitchTransponder(); bool MaySwitchTransponder = Device->MaySwitchTransponder(Channel);
if (MaySwitchTransponder || Device->ProvidesTransponderExclusively(Channel) && now - lastActivity > Setup.EPGScanTimeout * 3600) { if (MaySwitchTransponder || Device->ProvidesTransponderExclusively(Channel) && now - lastActivity > Setup.EPGScanTimeout * 3600) {
if (!MaySwitchTransponder) { if (!MaySwitchTransponder) {
if (Device == cDevice::ActualDevice() && !currentChannel) { if (Device == cDevice::ActualDevice() && !currentChannel) {

25
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 2.32 2011/08/27 11:05:33 kls Exp $ * $Id: menu.c 2.33 2011/12/03 15:11:42 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -2885,6 +2885,7 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key)
class cMenuSetupLNB : public cMenuSetupBase { class cMenuSetupLNB : public cMenuSetupBase {
private: private:
cSatCableNumbers satCableNumbers;
void Setup(void); void Setup(void);
public: public:
cMenuSetupLNB(void); cMenuSetupLNB(void);
@ -2892,7 +2893,9 @@ public:
}; };
cMenuSetupLNB::cMenuSetupLNB(void) cMenuSetupLNB::cMenuSetupLNB(void)
:satCableNumbers(MAXDEVICES)
{ {
satCableNumbers.FromString(data.DeviceBondings);
SetSection(tr("LNB")); SetSection(tr("LNB"));
Setup(); Setup();
} }
@ -2910,6 +2913,18 @@ void cMenuSetupLNB::Setup(void)
Add(new cMenuEditIntItem( tr("Setup.LNB$High LNB frequency (MHz)"), &data.LnbFrequHi)); Add(new cMenuEditIntItem( tr("Setup.LNB$High LNB frequency (MHz)"), &data.LnbFrequHi));
} }
int NumSatDevices = 0;
for (int i = 0; i < cDevice::NumDevices(); i++) {
if (cDevice::GetDevice(i)->ProvidesSource(cSource::stSat))
NumSatDevices++;
}
if (NumSatDevices > 1) {
for (int i = 0; i < cDevice::NumDevices(); i++) {
if (cDevice::GetDevice(i)->ProvidesSource(cSource::stSat))
Add(new cMenuEditIntItem(cString::sprintf(tr("Setup.LNB$Device %d connected to sat cable"), i + 1), &satCableNumbers.Array()[i], 0, NumSatDevices, tr("Setup.LNB$own")));
}
}
SetCurrent(Get(current)); SetCurrent(Get(current));
Display(); Display();
} }
@ -2917,10 +2932,18 @@ void cMenuSetupLNB::Setup(void)
eOSState cMenuSetupLNB::ProcessKey(eKeys Key) eOSState cMenuSetupLNB::ProcessKey(eKeys Key)
{ {
int oldDiSEqC = data.DiSEqC; int oldDiSEqC = data.DiSEqC;
bool DeviceBondingsChanged = false;
if (Key == kOk) {
cString NewDeviceBondings = satCableNumbers.ToString();
DeviceBondingsChanged = strcmp(data.DeviceBondings, NewDeviceBondings) != 0;
data.DeviceBondings = NewDeviceBondings;
}
eOSState state = cMenuSetupBase::ProcessKey(Key); eOSState state = cMenuSetupBase::ProcessKey(Key);
if (Key != kNone && data.DiSEqC != oldDiSEqC) if (Key != kNone && data.DiSEqC != oldDiSEqC)
Setup(); Setup();
else if (DeviceBondingsChanged)
cDvbDevice::BondDevices(data.DeviceBondings);
return state; return state;
} }

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.0\n" "Project-Id-Version: VDR 1.7.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-10-16 11:16-0400\n" "PO-Revision-Date: 2008-10-16 11:16-0400\n"
"Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n" "Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n"
"Language-Team: Arabic <ar@li.org>\n" "Language-Team: Arabic <ar@li.org>\n"
@ -983,6 +983,13 @@ msgstr "التردد المنخفض للاقط م هرتز"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "التردد المرتفع للاقط م هرتز" msgstr "التردد المرتفع للاقط م هرتز"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "اعادة تشغيل الكامة" msgstr "اعادة تشغيل الكامة"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n" "PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n" "Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Catalan <vdr@linuxtv.org>\n" "Language-Team: Catalan <vdr@linuxtv.org>\n"
@ -965,6 +965,13 @@ msgstr "Freq
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Freqüència LNB alta (MHz)" msgstr "Freqüència LNB alta (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Reiniciar CAM" msgstr "Reiniciar CAM"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.14\n" "Project-Id-Version: VDR 1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2010-05-06 11:00+0200\n" "PO-Revision-Date: 2010-05-06 11:00+0200\n"
"Last-Translator: Radek Šťastný <dedkus@gmail.com>\n" "Last-Translator: Radek Šťastný <dedkus@gmail.com>\n"
"Language-Team: Czech <vdr@linuxtv.org>\n" "Language-Team: Czech <vdr@linuxtv.org>\n"
@ -964,6 +964,13 @@ msgstr "Dolní frekvence LNB (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Horní frekvence LNB (MHz)" msgstr "Horní frekvence LNB (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Reset CAMu" msgstr "Reset CAMu"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n" "Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
"Language-Team: Danish <vdr@linuxtv.org>\n" "Language-Team: Danish <vdr@linuxtv.org>\n"
@ -962,6 +962,13 @@ msgstr "Nedre LNB frekvens (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Øvre LNB frekvens (MHz)" msgstr "Øvre LNB frekvens (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM nulstil" msgstr "CAM nulstil"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2010-01-16 16:46+0100\n" "PO-Revision-Date: 2010-01-16 16:46+0100\n"
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n" "Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n" "Language-Team: German <vdr@linuxtv.org>\n"
@ -962,6 +962,13 @@ msgstr "Untere LNB-Frequenz (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Obere LNB-Frequenz (MHz)" msgstr "Obere LNB-Frequenz (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr "Device %d angeschlossen an Sat-Kabel"
msgid "Setup.LNB$own"
msgstr "eigenes"
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM zurückgesetzt" msgstr "CAM zurückgesetzt"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n" "Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
"Language-Team: Greek <vdr@linuxtv.org>\n" "Language-Team: Greek <vdr@linuxtv.org>\n"
@ -962,6 +962,13 @@ msgstr "
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "¢íù LNB-Óõ÷íüôçôá (MHz)" msgstr "¢íù LNB-Óõ÷íüôçôá (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-03-02 19:02+0100\n" "PO-Revision-Date: 2008-03-02 19:02+0100\n"
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n" "Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n" "Language-Team: Spanish <vdr@linuxtv.org>\n"
@ -963,6 +963,13 @@ msgstr "Frecuencia inferior del LNB (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Frecuencia superior del LNB (MHz)" msgstr "Frecuencia superior del LNB (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Reset CAM" msgstr "Reset CAM"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n" "Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n" "Language-Team: Estonian <vdr@linuxtv.org>\n"
@ -962,6 +962,13 @@ msgstr "LO LNB sagedus (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "HI LNB sagedus (MHz)" msgstr "HI LNB sagedus (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM taaskäivitamine" msgstr "CAM taaskäivitamine"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2007-08-15 15:52+0200\n" "PO-Revision-Date: 2007-08-15 15:52+0200\n"
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n" "Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n" "Language-Team: Finnish <vdr@linuxtv.org>\n"
@ -965,6 +965,13 @@ msgstr "LNB-alataajuus (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "LNB-ylätaajuus (MHz)" msgstr "LNB-ylätaajuus (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM nollaus" msgstr "CAM nollaus"

View File

@ -13,7 +13,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-02-27 18:14+0100\n" "PO-Revision-Date: 2008-02-27 18:14+0100\n"
"Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n" "Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n"
"Language-Team: French <vdr@linuxtv.org>\n" "Language-Team: French <vdr@linuxtv.org>\n"
@ -968,6 +968,13 @@ msgstr "Fr
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Fréquence haute LNB (MHz)" msgstr "Fréquence haute LNB (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM remis à zéro" msgstr "CAM remis à zéro"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-03-17 19:00+0100\n" "PO-Revision-Date: 2008-03-17 19:00+0100\n"
"Last-Translator: Adrian Caval <anrxc@sysphere.org>\n" "Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
"Language-Team: Croatian <vdr@linuxtv.org>\n" "Language-Team: Croatian <vdr@linuxtv.org>\n"
@ -964,6 +964,13 @@ msgstr "Donja LNB frekv. (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Gornja LNB frekv. (MHz)" msgstr "Gornja LNB frekv. (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Ponovno pokreni CAM" msgstr "Ponovno pokreni CAM"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2007-12-01 21:42+0200\n" "PO-Revision-Date: 2007-12-01 21:42+0200\n"
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n" "Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
"Language-Team: Hungarian <vdr@linuxtv.org>\n" "Language-Team: Hungarian <vdr@linuxtv.org>\n"
@ -965,6 +965,13 @@ msgstr "Als
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Felsõ LNB-frekvencia (MHZ)" msgstr "Felsõ LNB-frekvencia (MHZ)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM újraindítás" msgstr "CAM újraindítás"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2010-06-13 00:30+0100\n" "PO-Revision-Date: 2010-06-13 00:30+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n" "Language-Team: Italian <vdr@linuxtv.org>\n"
@ -969,6 +969,13 @@ msgstr "Freq LO LNB (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Freq HI LNB (MHz)" msgstr "Freq HI LNB (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Reimposta la CAM" msgstr "Reimposta la CAM"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.16\n" "Project-Id-Version: VDR 1.7.16\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2010-10-30 11:55+0200\n" "PO-Revision-Date: 2010-10-30 11:55+0200\n"
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n" "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: Lithuanian <vdr@linuxtv.org>\n" "Language-Team: Lithuanian <vdr@linuxtv.org>\n"
@ -962,6 +962,13 @@ msgstr "Žemasis LNB dažnis (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Aukštasis LNB dažnis (MHz)" msgstr "Aukštasis LNB dažnis (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Dekodavimo modulis (CAM) perkrautas" msgstr "Dekodavimo modulis (CAM) perkrautas"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR-1.7.14\n" "Project-Id-Version: VDR-1.7.14\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2010-03-11 00:54+0100\n" "PO-Revision-Date: 2010-03-11 00:54+0100\n"
"Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n" "Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n"
"Language-Team: Macedonian <en@li.org>\n" "Language-Team: Macedonian <en@li.org>\n"
@ -963,6 +963,13 @@ msgstr "Долна LNB фрекфенција (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Форна LNB фрекфенција (MHz)" msgstr "Форна LNB фрекфенција (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Рестартирај CAM" msgstr "Рестартирај CAM"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-02-26 17:20+0100\n" "PO-Revision-Date: 2008-02-26 17:20+0100\n"
"Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n" "Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n"
"Language-Team: Dutch <vdr@linuxtv.org>\n" "Language-Team: Dutch <vdr@linuxtv.org>\n"
@ -966,6 +966,13 @@ msgstr "Laagste LNB frequentie (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Hoogste LNB frequentie (MHz)" msgstr "Hoogste LNB frequentie (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM herstarten" msgstr "CAM herstarten"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2007-08-12 14:17+0200\n" "PO-Revision-Date: 2007-08-12 14:17+0200\n"
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n" "Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
"Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n" "Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
@ -963,6 +963,13 @@ msgstr "LO-frekvens i lavb
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "LO-frekvens i høybåndet (MHz)" msgstr "LO-frekvens i høybåndet (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-03-09 12:59+0100\n" "PO-Revision-Date: 2008-03-09 12:59+0100\n"
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n" "Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
"Language-Team: Polish <vdr@linuxtv.org>\n" "Language-Team: Polish <vdr@linuxtv.org>\n"
@ -963,6 +963,13 @@ msgstr "Dolna cz
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Górna czêstotliwo¶æ LNB (MHz)" msgstr "Górna czêstotliwo¶æ LNB (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM zresetowany" msgstr "CAM zresetowany"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.15\n" "Project-Id-Version: VDR 1.7.15\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2010-03-28 22:49+0100\n" "PO-Revision-Date: 2010-03-28 22:49+0100\n"
"Last-Translator: Cris Silva <hudokkow@gmail.com>\n" "Last-Translator: Cris Silva <hudokkow@gmail.com>\n"
"Language-Team: Portuguese <vdr@linuxtv.org>\n" "Language-Team: Portuguese <vdr@linuxtv.org>\n"
@ -963,6 +963,13 @@ msgstr "Frequ
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Frequência alta do LNB (MHz)" msgstr "Frequência alta do LNB (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Reiniciar CAM" msgstr "Reiniciar CAM"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.12\n" "Project-Id-Version: VDR 1.7.12\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2011-03-10 23:52+0100\n" "PO-Revision-Date: 2011-03-10 23:52+0100\n"
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n" "Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
"Language-Team: Romanian <vdr@linuxtv.org>\n" "Language-Team: Romanian <vdr@linuxtv.org>\n"
@ -965,6 +965,13 @@ msgstr "Frecvn
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Frecvnþã LNB superioarã (MHz)" msgstr "Frecvnþã LNB superioarã (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Resetare CAM" msgstr "Resetare CAM"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-12-15 14:37+0100\n" "PO-Revision-Date: 2008-12-15 14:37+0100\n"
"Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n" "Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
"Language-Team: Russian <vdr@linuxtv.org>\n" "Language-Team: Russian <vdr@linuxtv.org>\n"
@ -963,6 +963,13 @@ msgstr "
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "²ÕàåÝïï çÐáâÞâÐ ÚÞÝÒÕàâÕàÐ (¼³æ)" msgstr "²ÕàåÝïï çÐáâÞâÐ ÚÞÝÒÕàâÕàÐ (¼³æ)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM ßÕàÕÓàãÖÕÝ" msgstr "CAM ßÕàÕÓàãÖÕÝ"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.16\n" "Project-Id-Version: VDR 1.7.16\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2011-02-15 16:29+0100\n" "PO-Revision-Date: 2011-02-15 16:29+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <vdr@linuxtv.org>\n" "Language-Team: Slovak <vdr@linuxtv.org>\n"
@ -962,6 +962,13 @@ msgstr "Doln
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Horná frekvencia LNB (MHz)" msgstr "Horná frekvencia LNB (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Resetnutie CAMu" msgstr "Resetnutie CAMu"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-02-28 19:44+0100\n" "PO-Revision-Date: 2008-02-28 19:44+0100\n"
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n" "Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
"Language-Team: Slovenian <vdr@linuxtv.org>\n" "Language-Team: Slovenian <vdr@linuxtv.org>\n"
@ -963,6 +963,13 @@ msgstr "Spodnja LNB-frek. (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Zgornja LNB-frek. (MHz)" msgstr "Zgornja LNB-frek. (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Reset CAM-a" msgstr "Reset CAM-a"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.1\n" "Project-Id-Version: VDR 1.7.1\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2011-01-09 15:57+0100\n" "PO-Revision-Date: 2011-01-09 15:57+0100\n"
"Last-Translator: Milan Cvijanoviæ <elcom_cvijo@hotmail.com>\n" "Last-Translator: Milan Cvijanoviæ <elcom_cvijo@hotmail.com>\n"
"Language-Team: Serbian <vdr@linuxtv.org>\n" "Language-Team: Serbian <vdr@linuxtv.org>\n"
@ -981,6 +981,13 @@ msgstr "Donja LNB frekv. (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Gornja LNB frekv. (MHz)" msgstr "Gornja LNB frekv. (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Ponovno pokreni CAM" msgstr "Ponovno pokreni CAM"

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-03-12 18:25+0100\n" "PO-Revision-Date: 2008-03-12 18:25+0100\n"
"Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n" "Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n"
"Language-Team: Swedish <vdr@linuxtv.org>\n" "Language-Team: Swedish <vdr@linuxtv.org>\n"
@ -965,6 +965,13 @@ msgstr "Undre LNB frekvens (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Övre LNB frekvens (MHz)" msgstr "Övre LNB frekvens (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM omstart" msgstr "CAM omstart"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2008-02-28 00:33+0100\n" "PO-Revision-Date: 2008-02-28 00:33+0100\n"
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n" "Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
"Language-Team: Turkish <vdr@linuxtv.org>\n" "Language-Team: Turkish <vdr@linuxtv.org>\n"
@ -962,6 +962,13 @@ msgstr "Alt LNB frekans
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Üst LNB frekansý (MHz)" msgstr "Üst LNB frekansý (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM sýfýrlandý" msgstr "CAM sýfýrlandý"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.7.7\n" "Project-Id-Version: VDR 1.7.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2010-04-25 16:35+0200\n" "PO-Revision-Date: 2010-04-25 16:35+0200\n"
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n" "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
"Language-Team: Ukrainian <vdr@linuxtv.org>\n" "Language-Team: Ukrainian <vdr@linuxtv.org>\n"
@ -962,6 +962,13 @@ msgstr "Нижня частота конвертера (МГц)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "Верхня частота конвертера (МГц)" msgstr "Верхня частота конвертера (МГц)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "Перезавантаження CAM" msgstr "Перезавантаження CAM"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR 1.6.0\n" "Project-Id-Version: VDR 1.6.0\n"
"Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n" "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
"POT-Creation-Date: 2011-08-27 11:54+0200\n" "POT-Creation-Date: 2011-12-03 16:25+0100\n"
"PO-Revision-Date: 2009-09-23 23:50+0800\n" "PO-Revision-Date: 2009-09-23 23:50+0800\n"
"Last-Translator: Nan Feng <nfgx@21cn.com>\n" "Last-Translator: Nan Feng <nfgx@21cn.com>\n"
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n" "Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
@ -965,6 +965,13 @@ msgstr "低本振频率 (MHz)"
msgid "Setup.LNB$High LNB frequency (MHz)" msgid "Setup.LNB$High LNB frequency (MHz)"
msgstr "高本振频率 (MHz)" msgstr "高本振频率 (MHz)"
#, c-format
msgid "Setup.LNB$Device %d connected to sat cable"
msgstr ""
msgid "Setup.LNB$own"
msgstr ""
msgid "CAM reset" msgid "CAM reset"
msgstr "CAM重置" msgstr "CAM重置"

5
vdr.c
View File

@ -22,7 +22,7 @@
* *
* The project's page is at http://www.tvdr.de * The project's page is at http://www.tvdr.de
* *
* $Id: vdr.c 2.26 2011/10/16 14:02:34 kls Exp $ * $Id: vdr.c 2.27 2011/12/03 15:35:09 kls Exp $
*/ */
#include <getopt.h> #include <getopt.h>
@ -639,6 +639,7 @@ int main(int argc, char *argv[])
// DVB interfaces: // DVB interfaces:
cDvbDevice::Initialize(); cDvbDevice::Initialize();
cDvbDevice::BondDevices(Setup.DeviceBondings);
// Initialize plugins: // Initialize plugins:
@ -899,7 +900,7 @@ int main(int argc, char *argv[])
Device = d; Device = d;
break; break;
} }
if (d->MaySwitchTransponder()) { if (d->MaySwitchTransponder(Timer->Channel())) {
DeviceAvailable = true; // avoids using the actual device below DeviceAvailable = true; // avoids using the actual device below
Device = d; Device = d;
} }