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:
parent
a964269fe9
commit
a49ce434f6
6
HISTORY
6
HISTORY
@ -6743,7 +6743,7 @@ Video Disk Recorder Revision History
|
||||
extends over TS packet boundaries is now done by locally skipping TS packets
|
||||
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
|
||||
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
|
||||
status updated is now done by marking the devices as "occupied" for a certain
|
||||
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
11
INSTALL
@ -392,6 +392,17 @@ according to EN50494 (aka "Unicable(TM)", "OLT(TM)", "SatCR", "Single Cable
|
||||
Distribution", "Channel Stacking System" or "Single Cable Interface") uses
|
||||
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):
|
||||
------------------------------------------------------
|
||||
|
||||
|
8
MANUAL
8
MANUAL
@ -732,12 +732,18 @@ Version 1.6
|
||||
|
||||
LNB:
|
||||
|
||||
Use DiSEqC = no Generally turns DiSEqC support on or off.
|
||||
|
||||
SLOF = 11700 The switching frequency (in MHz) between low and
|
||||
high LOF
|
||||
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)
|
||||
|
||||
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:
|
||||
|
||||
|
69
config.c
69
config.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -63,6 +63,69 @@ bool cSVDRPhost::Accepts(in_addr_t Address)
|
||||
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(const char *Text, bool WithSubItems)
|
||||
@ -396,6 +459,7 @@ cSetup::cSetup(void)
|
||||
CurrentVolume = MAXVOLUME;
|
||||
CurrentDolby = 0;
|
||||
InitialChannel = "";
|
||||
DeviceBondings = "";
|
||||
InitialVolume = -1;
|
||||
ChannelsWrap = 0;
|
||||
EmergencyExit = 1;
|
||||
@ -405,6 +469,7 @@ cSetup& cSetup::operator= (const cSetup &s)
|
||||
{
|
||||
memcpy(&__BeginData__, &s.__BeginData__, (char *)&s.__EndData__ - (char *)&s.__BeginData__);
|
||||
InitialChannel = s.InitialChannel;
|
||||
DeviceBondings = s.DeviceBondings;
|
||||
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, "InitialChannel")) InitialChannel = 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, "EmergencyExit")) EmergencyExit = atoi(Value);
|
||||
else
|
||||
@ -685,6 +751,7 @@ bool cSetup::Save(void)
|
||||
Store("CurrentDolby", CurrentDolby);
|
||||
Store("InitialChannel", InitialChannel);
|
||||
Store("InitialVolume", InitialVolume);
|
||||
Store("DeviceBondings", DeviceBondings);
|
||||
Store("ChannelsWrap", ChannelsWrap);
|
||||
Store("EmergencyExit", EmergencyExit);
|
||||
|
||||
|
22
config.h
22
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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
|
||||
@ -61,6 +61,25 @@ public:
|
||||
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> {
|
||||
private:
|
||||
char *fileName;
|
||||
@ -292,6 +311,7 @@ public:
|
||||
int EmergencyExit;
|
||||
int __EndData__;
|
||||
cString InitialChannel;
|
||||
cString DeviceBondings;
|
||||
cSetup(void);
|
||||
cSetup& operator= (const cSetup &s);
|
||||
bool Load(const char *FileName);
|
||||
|
8
device.c
8
device.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -640,12 +640,12 @@ const cChannel *cDevice::GetCurrentlyTunedTransponder(void) const
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool cDevice::IsTunedToTransponder(const cChannel *Channel)
|
||||
bool cDevice::IsTunedToTransponder(const cChannel *Channel) const
|
||||
{
|
||||
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);
|
||||
}
|
||||
@ -1488,6 +1488,7 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
|
||||
int cDevice::Priority(void) const
|
||||
{
|
||||
int priority = IsPrimaryDevice() ? Setup.PrimaryLimit - 1 : DEFAULTPRIORITY;
|
||||
cMutexLock MutexLock(&mutexReceiver);
|
||||
for (int i = 0; i < MAXRECEIVERS; i++) {
|
||||
if (receiver[i])
|
||||
priority = max(receiver[i]->priority, priority);
|
||||
@ -1502,6 +1503,7 @@ bool cDevice::Ready(void)
|
||||
|
||||
bool cDevice::Receiving(bool CheckAny) const
|
||||
{
|
||||
cMutexLock MutexLock(&mutexReceiver);
|
||||
for (int i = 0; i < MAXRECEIVERS; i++) {
|
||||
if (receiver[i] && (CheckAny || receiver[i]->priority >= 0)) // cReceiver with priority < 0 doesn't count
|
||||
return true;
|
||||
|
16
device.h
16
device.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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
|
||||
@ -275,12 +275,14 @@ public:
|
||||
///< 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
|
||||
///< 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
|
||||
///< transponder.
|
||||
virtual bool MaySwitchTransponder(void);
|
||||
///< Returns true if it is ok to switch the transponder on this device,
|
||||
///< without disturbing any other activities.
|
||||
virtual bool MaySwitchTransponder(const cChannel *Channel) const;
|
||||
///< Returns true if it is ok to switch to the Channel's transponder on this
|
||||
///< 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);
|
||||
///< Switches the device to the given Channel, initiating transfer mode
|
||||
///< if necessary.
|
||||
@ -710,7 +712,7 @@ public:
|
||||
// Receiver facilities
|
||||
|
||||
private:
|
||||
cMutex mutexReceiver;
|
||||
mutable cMutex mutexReceiver;
|
||||
cReceiver *receiver[MAXRECEIVERS];
|
||||
public:
|
||||
int Priority(void) const;
|
||||
@ -739,7 +741,7 @@ public:
|
||||
///< Detaches the given receiver from this device.
|
||||
void DetachAll(int Pid);
|
||||
///< Detaches all receivers from this device for this pid.
|
||||
void DetachAllReceivers(void);
|
||||
virtual void DetachAllReceivers(void);
|
||||
///< Detaches all receivers from this device.
|
||||
};
|
||||
|
||||
|
364
dvbdevice.c
364
dvbdevice.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -259,8 +259,9 @@ bool cDvbTransponderParameters::Parse(const char *s)
|
||||
|
||||
class cDvbTuner : public cThread {
|
||||
private:
|
||||
static cMutex bondMutex;
|
||||
enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked };
|
||||
int device;
|
||||
const cDvbDevice *device;
|
||||
int fd_frontend;
|
||||
int adapter, frontend;
|
||||
uint32_t subsystemId;
|
||||
@ -275,24 +276,35 @@ private:
|
||||
cMutex mutex;
|
||||
cCondVar locked;
|
||||
cCondVar newSet;
|
||||
cDvbTuner *bondedTuner;
|
||||
bool bondedMaster;
|
||||
bool bondedMasterFailed;
|
||||
cString GetBondingParams(const cChannel *Channel = NULL) const;
|
||||
void ClearEventQueue(void) 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);
|
||||
virtual void Action(void);
|
||||
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();
|
||||
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; }
|
||||
uint32_t SubsystemId(void) const { return subsystemId; }
|
||||
bool IsTunedTo(const cChannel *Channel) const;
|
||||
void Set(const cChannel *Channel);
|
||||
void SetChannel(const cChannel *Channel);
|
||||
bool Locked(int TimeoutMs = 0);
|
||||
int GetSignalStrength(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;
|
||||
fd_frontend = Fd_Frontend;
|
||||
@ -306,8 +318,11 @@ cDvbTuner::cDvbTuner(int Device, int Fd_Frontend, int Adapter, int Frontend, fe_
|
||||
lastDiseqc = NULL;
|
||||
scr = NULL;
|
||||
tunerStatus = tsIdle;
|
||||
bondedTuner = NULL;
|
||||
bondedMaster = false;
|
||||
bondedMasterFailed = false;
|
||||
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);
|
||||
Start();
|
||||
}
|
||||
@ -318,6 +333,7 @@ cDvbTuner::~cDvbTuner()
|
||||
newSet.Broadcast();
|
||||
locked.Broadcast();
|
||||
Cancel(3);
|
||||
UnBond();
|
||||
/* looks like this irritates the SCR switch, so let's leave it out for now
|
||||
if (lastDiseqc && lastDiseqc->IsScr()) {
|
||||
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
|
||||
{
|
||||
if (tunerStatus == tsIdle)
|
||||
@ -336,14 +455,34 @@ bool cDvbTuner::IsTunedTo(const cChannel *Channel) const
|
||||
return strcmp(channel.Parameters(), Channel->Parameters()) == 0;
|
||||
}
|
||||
|
||||
void cDvbTuner::Set(const cChannel *Channel)
|
||||
void cDvbTuner::SetChannel(const cChannel *Channel)
|
||||
{
|
||||
cMutexLock MutexLock(&mutex);
|
||||
if (!IsTunedTo(Channel))
|
||||
tunerStatus = tsSet;
|
||||
channel = *Channel;
|
||||
lastTimeoutReport = 0;
|
||||
newSet.Broadcast();
|
||||
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);
|
||||
if (!IsTunedTo(Channel))
|
||||
tunerStatus = tsSet;
|
||||
channel = *Channel;
|
||||
lastTimeoutReport = 0;
|
||||
newSet.Broadcast();
|
||||
}
|
||||
else {
|
||||
cMutexLock MutexLock(&mutex);
|
||||
tunerStatus = tsIdle;
|
||||
ResetToneAndVoltage();
|
||||
}
|
||||
}
|
||||
|
||||
bool cDvbTuner::Locked(int TimeoutMs)
|
||||
@ -493,7 +632,7 @@ static unsigned int FrequencyToHz(unsigned int 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;
|
||||
const char *CurrentAction = NULL;
|
||||
@ -514,7 +653,13 @@ void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency) co
|
||||
}
|
||||
}
|
||||
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)
|
||||
@ -544,12 +689,16 @@ bool cDvbTuner::SetFrontend(void)
|
||||
if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) {
|
||||
unsigned int frequency = channel.Frequency();
|
||||
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();
|
||||
if (diseqc != lastDiseqc || diseqc->IsScr()) {
|
||||
ExecuteDiseqc(diseqc, &frequency);
|
||||
if (frequency == 0)
|
||||
return false;
|
||||
if (GetBondedMaster() == this) {
|
||||
ExecuteDiseqc(diseqc, &frequency);
|
||||
if (frequency == 0)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
ResetToneAndVoltage();
|
||||
lastDiseqc = diseqc;
|
||||
}
|
||||
}
|
||||
@ -568,7 +717,11 @@ bool cDvbTuner::SetFrontend(void)
|
||||
frequency -= Setup.LnbFrequHi;
|
||||
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_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());
|
||||
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;
|
||||
}
|
||||
case tsLocked:
|
||||
@ -770,6 +926,7 @@ cOsdItem *cDvbSourceParam::GetOsdItem(void)
|
||||
// --- cDvbDevice ------------------------------------------------------------
|
||||
|
||||
int cDvbDevice::setTransferModeForDolbyDigital = 1;
|
||||
cMutex cDvbDevice::bondMutex;
|
||||
|
||||
const char *DeliverySystems[] = {
|
||||
"UNDEFINED",
|
||||
@ -799,6 +956,8 @@ cDvbDevice::cDvbDevice(int Adapter, int Frontend)
|
||||
dvbTuner = NULL;
|
||||
frontendType = SYS_UNDEFINED;
|
||||
numProvidedSystems = 0;
|
||||
bondedDevice = NULL;
|
||||
needsDetachBondedReceivers = false;
|
||||
|
||||
// Devices that are present on all card types:
|
||||
|
||||
@ -848,7 +1007,7 @@ cDvbDevice::cDvbDevice(int Adapter, int Frontend)
|
||||
else
|
||||
p = (char *)"unknown modulations";
|
||||
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
|
||||
@ -862,6 +1021,7 @@ cDvbDevice::~cDvbDevice()
|
||||
StopSectionHandler();
|
||||
delete dvbTuner;
|
||||
delete ciAdapter;
|
||||
UnBond();
|
||||
// We're not explicitly closing any device files here, since this sometimes
|
||||
// caused segfaults. Besides, the program is about to terminate anyway...
|
||||
}
|
||||
@ -953,6 +1113,104 @@ bool cDvbDevice::Ready(void)
|
||||
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)
|
||||
{
|
||||
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
|
||||
return false; // requires modulation system which frontend doesn't provide
|
||||
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 false;
|
||||
}
|
||||
@ -1065,28 +1323,44 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
|
||||
bool result = false;
|
||||
bool hasPriority = Priority < 0 || Priority > this->Priority();
|
||||
bool needsDetachReceivers = false;
|
||||
needsDetachBondedReceivers = false;
|
||||
|
||||
if (dvbTuner && ProvidesTransponder(Channel)) {
|
||||
result = hasPriority;
|
||||
if (Priority >= 0 && Receiving(true)) {
|
||||
if (dvbTuner->IsTunedTo(Channel)) {
|
||||
if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) {
|
||||
if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) {
|
||||
if (CamSlot()->CanDecrypt(Channel))
|
||||
if (Priority >= 0) {
|
||||
if (Receiving(true)) {
|
||||
if (dvbTuner->IsTunedTo(Channel)) {
|
||||
if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) {
|
||||
if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) {
|
||||
if (CamSlot()->CanDecrypt(Channel))
|
||||
result = true;
|
||||
else
|
||||
needsDetachReceivers = true;
|
||||
}
|
||||
else if (!IsPrimaryDevice())
|
||||
result = true;
|
||||
else
|
||||
needsDetachReceivers = true;
|
||||
result = Priority >= Setup.PrimaryLimit;
|
||||
}
|
||||
else if (!IsPrimaryDevice())
|
||||
result = true;
|
||||
else
|
||||
result = Priority >= Setup.PrimaryLimit;
|
||||
result = !IsPrimaryDevice() || Priority >= Setup.PrimaryLimit;
|
||||
}
|
||||
else
|
||||
result = !IsPrimaryDevice() || Priority >= Setup.PrimaryLimit;
|
||||
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;
|
||||
}
|
||||
}
|
||||
else
|
||||
needsDetachReceivers = true;
|
||||
}
|
||||
}
|
||||
if (NeedsDetachReceivers)
|
||||
@ -1119,15 +1393,20 @@ const cChannel *cDvbDevice::GetCurrentlyTunedTransponder(void) const
|
||||
return dvbTuner ? dvbTuner->GetTransponder() : NULL;
|
||||
}
|
||||
|
||||
bool cDvbDevice::IsTunedToTransponder(const cChannel *Channel)
|
||||
bool cDvbDevice::IsTunedToTransponder(const cChannel *Channel) const
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (dvbTuner)
|
||||
dvbTuner->Set(Channel);
|
||||
dvbTuner->SetChannel(Channel);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1169,6 +1448,17 @@ bool cDvbDevice::GetTSPacket(uchar *&Data)
|
||||
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 -------------------------------------------------------
|
||||
|
||||
cList<cDvbDeviceProbe> DvbDeviceProbes;
|
||||
|
36
dvbdevice.h
36
dvbdevice.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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
|
||||
@ -122,10 +122,40 @@ private:
|
||||
int numProvidedSystems;
|
||||
fe_delivery_system frontendType;
|
||||
int fd_dvr, fd_ca;
|
||||
static cMutex bondMutex;
|
||||
cDvbDevice *bondedDevice;
|
||||
mutable bool needsDetachBondedReceivers;
|
||||
public:
|
||||
cDvbDevice(int Adapter, int Frontend);
|
||||
virtual ~cDvbDevice();
|
||||
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:
|
||||
|
||||
@ -145,7 +175,8 @@ public:
|
||||
virtual int SignalStrength(void) const;
|
||||
virtual int SignalQuality(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:
|
||||
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
||||
public:
|
||||
@ -187,6 +218,7 @@ protected:
|
||||
virtual bool OpenDvr(void);
|
||||
virtual void CloseDvr(void);
|
||||
virtual bool GetTSPacket(uchar *&Data);
|
||||
virtual void DetachAllReceivers(void);
|
||||
};
|
||||
|
||||
// A plugin that implements a DVB device derived from cDvbDevice needs to create
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -150,7 +150,7 @@ void cEITScanner::Process(void)
|
||||
if (!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= CA_ENCRYPTED_MIN) {
|
||||
if (Device->ProvidesTransponder(Channel)) {
|
||||
if (!Device->Receiving()) {
|
||||
bool MaySwitchTransponder = Device->MaySwitchTransponder();
|
||||
bool MaySwitchTransponder = Device->MaySwitchTransponder(Channel);
|
||||
if (MaySwitchTransponder || Device->ProvidesTransponderExclusively(Channel) && now - lastActivity > Setup.EPGScanTimeout * 3600) {
|
||||
if (!MaySwitchTransponder) {
|
||||
if (Device == cDevice::ActualDevice() && !currentChannel) {
|
||||
|
25
menu.c
25
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -2885,6 +2885,7 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key)
|
||||
|
||||
class cMenuSetupLNB : public cMenuSetupBase {
|
||||
private:
|
||||
cSatCableNumbers satCableNumbers;
|
||||
void Setup(void);
|
||||
public:
|
||||
cMenuSetupLNB(void);
|
||||
@ -2892,7 +2893,9 @@ public:
|
||||
};
|
||||
|
||||
cMenuSetupLNB::cMenuSetupLNB(void)
|
||||
:satCableNumbers(MAXDEVICES)
|
||||
{
|
||||
satCableNumbers.FromString(data.DeviceBondings);
|
||||
SetSection(tr("LNB"));
|
||||
Setup();
|
||||
}
|
||||
@ -2910,6 +2913,18 @@ void cMenuSetupLNB::Setup(void)
|
||||
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));
|
||||
Display();
|
||||
}
|
||||
@ -2917,10 +2932,18 @@ void cMenuSetupLNB::Setup(void)
|
||||
eOSState cMenuSetupLNB::ProcessKey(eKeys Key)
|
||||
{
|
||||
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);
|
||||
|
||||
if (Key != kNone && data.DiSEqC != oldDiSEqC)
|
||||
Setup();
|
||||
else if (DeviceBondingsChanged)
|
||||
cDvbDevice::BondDevices(data.DeviceBondings);
|
||||
return state;
|
||||
}
|
||||
|
||||
|
9
po/ar.po
9
po/ar.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.7.0\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"
|
||||
"Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n"
|
||||
"Language-Team: Arabic <ar@li.org>\n"
|
||||
@ -983,6 +983,13 @@ msgstr "التردد المنخفض للاقط م هرتز"
|
||||
msgid "Setup.LNB$High LNB frequency (MHz)"
|
||||
msgstr "التردد المرتفع للاقط م هرتز"
|
||||
|
||||
#, c-format
|
||||
msgid "Setup.LNB$Device %d connected to sat cable"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "اعادة تشغيل الكامة"
|
||||
|
||||
|
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
|
||||
"Language-Team: Catalan <vdr@linuxtv.org>\n"
|
||||
@ -965,6 +965,13 @@ msgstr "Freq
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "Reiniciar CAM"
|
||||
|
||||
|
@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.7.14\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"
|
||||
"Last-Translator: Radek Šťastný <dedkus@gmail.com>\n"
|
||||
"Language-Team: Czech <vdr@linuxtv.org>\n"
|
||||
@ -964,6 +964,13 @@ msgstr "Dolní frekvence LNB (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "Reset CAMu"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
|
||||
"Language-Team: Danish <vdr@linuxtv.org>\n"
|
||||
@ -962,6 +962,13 @@ msgstr "Nedre LNB frekvens (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM nulstil"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
@ -962,6 +962,13 @@ msgstr "Untere LNB-Frequenz (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM zurückgesetzt"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
|
||||
"Language-Team: Greek <vdr@linuxtv.org>\n"
|
||||
@ -962,6 +962,13 @@ msgstr "
|
||||
msgid "Setup.LNB$High LNB frequency (MHz)"
|
||||
msgstr "¢íù LNB-Óõ÷íüôçôá (MHz)"
|
||||
|
||||
#, c-format
|
||||
msgid "Setup.LNB$Device %d connected to sat cable"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr ""
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Luca Olivetti <luca@ventoso.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)"
|
||||
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"
|
||||
msgstr "Reset CAM"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
@ -962,6 +962,13 @@ msgstr "LO LNB sagedus (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM taaskäivitamine"
|
||||
|
||||
|
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
@ -965,6 +965,13 @@ msgstr "LNB-alataajuus (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM nollaus"
|
||||
|
||||
|
@ -13,7 +13,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n"
|
||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||
@ -968,6 +968,13 @@ msgstr "Fr
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM remis à zéro"
|
||||
|
||||
|
@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Adrian Caval <anrxc@sysphere.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)"
|
||||
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"
|
||||
msgstr "Ponovno pokreni CAM"
|
||||
|
||||
|
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
|
||||
"Language-Team: Hungarian <vdr@linuxtv.org>\n"
|
||||
@ -965,6 +965,13 @@ msgstr "Als
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM újraindítás"
|
||||
|
||||
|
@ -11,7 +11,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
@ -969,6 +969,13 @@ msgstr "Freq LO LNB (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "Reimposta la CAM"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.7.16\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"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\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)"
|
||||
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"
|
||||
msgstr "Dekodavimo modulis (CAM) perkrautas"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR-1.7.14\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"
|
||||
"Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n"
|
||||
"Language-Team: Macedonian <en@li.org>\n"
|
||||
@ -963,6 +963,13 @@ msgstr "Долна LNB фрекфенција (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (MHz)"
|
||||
msgstr "Форна LNB фрекфенција (MHz)"
|
||||
|
||||
#, c-format
|
||||
msgid "Setup.LNB$Device %d connected to sat cable"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Рестартирај CAM"
|
||||
|
||||
|
@ -11,7 +11,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n"
|
||||
"Language-Team: Dutch <vdr@linuxtv.org>\n"
|
||||
@ -966,6 +966,13 @@ msgstr "Laagste LNB frequentie (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM herstarten"
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Truls Slevigen <truls@slevigen.no>\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)"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
@ -963,6 +963,13 @@ msgstr "Dolna cz
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM zresetowany"
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.7.15\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"
|
||||
"Last-Translator: Cris Silva <hudokkow@gmail.com>\n"
|
||||
"Language-Team: Portuguese <vdr@linuxtv.org>\n"
|
||||
@ -963,6 +963,13 @@ msgstr "Frequ
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "Reiniciar CAM"
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.7.12\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"
|
||||
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
|
||||
"Language-Team: Romanian <vdr@linuxtv.org>\n"
|
||||
@ -965,6 +965,13 @@ msgstr "Frecvn
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "Resetare CAM"
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
@ -963,6 +963,13 @@ msgstr "
|
||||
msgid "Setup.LNB$High LNB frequency (MHz)"
|
||||
msgstr "²ÕàåÝïï çÐáâÞâÐ ÚÞÝÒÕàâÕàÐ (¼³æ)"
|
||||
|
||||
#, c-format
|
||||
msgid "Setup.LNB$Device %d connected to sat cable"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM ßÕàÕÓàãÖÕÝ"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.7.16\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"
|
||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||
@ -962,6 +962,13 @@ msgstr "Doln
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "Resetnutie CAMu"
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
|
||||
"Language-Team: Slovenian <vdr@linuxtv.org>\n"
|
||||
@ -963,6 +963,13 @@ msgstr "Spodnja LNB-frek. (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "Reset CAM-a"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.7.1\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"
|
||||
"Last-Translator: Milan Cvijanoviæ <elcom_cvijo@hotmail.com>\n"
|
||||
"Language-Team: Serbian <vdr@linuxtv.org>\n"
|
||||
@ -981,6 +981,13 @@ msgstr "Donja LNB frekv. (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "Ponovno pokreni CAM"
|
||||
|
||||
|
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n"
|
||||
"Language-Team: Swedish <vdr@linuxtv.org>\n"
|
||||
@ -965,6 +965,13 @@ msgstr "Undre LNB frekvens (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM omstart"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
|
||||
"Language-Team: Turkish <vdr@linuxtv.org>\n"
|
||||
@ -962,6 +962,13 @@ msgstr "Alt LNB frekans
|
||||
msgid "Setup.LNB$High LNB frequency (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"
|
||||
msgstr "CAM sýfýrlandý"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.7.7\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"
|
||||
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
|
||||
"Language-Team: Ukrainian <vdr@linuxtv.org>\n"
|
||||
@ -962,6 +962,13 @@ msgstr "Нижня частота конвертера (МГц)"
|
||||
msgid "Setup.LNB$High LNB frequency (MHz)"
|
||||
msgstr "Верхня частота конвертера (МГц)"
|
||||
|
||||
#, c-format
|
||||
msgid "Setup.LNB$Device %d connected to sat cable"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "Перезавантаження CAM"
|
||||
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.6.0\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"
|
||||
"Last-Translator: Nan Feng <nfgx@21cn.com>\n"
|
||||
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
|
||||
@ -965,6 +965,13 @@ msgstr "低本振频率 (MHz)"
|
||||
msgid "Setup.LNB$High LNB frequency (MHz)"
|
||||
msgstr "高本振频率 (MHz)"
|
||||
|
||||
#, c-format
|
||||
msgid "Setup.LNB$Device %d connected to sat cable"
|
||||
msgstr ""
|
||||
|
||||
msgid "Setup.LNB$own"
|
||||
msgstr ""
|
||||
|
||||
msgid "CAM reset"
|
||||
msgstr "CAM重置"
|
||||
|
||||
|
5
vdr.c
5
vdr.c
@ -22,7 +22,7 @@
|
||||
*
|
||||
* 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>
|
||||
@ -639,6 +639,7 @@ int main(int argc, char *argv[])
|
||||
// DVB interfaces:
|
||||
|
||||
cDvbDevice::Initialize();
|
||||
cDvbDevice::BondDevices(Setup.DeviceBondings);
|
||||
|
||||
// Initialize plugins:
|
||||
|
||||
@ -899,7 +900,7 @@ int main(int argc, char *argv[])
|
||||
Device = d;
|
||||
break;
|
||||
}
|
||||
if (d->MaySwitchTransponder()) {
|
||||
if (d->MaySwitchTransponder(Timer->Channel())) {
|
||||
DeviceAvailable = true; // avoids using the actual device below
|
||||
Device = d;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user