mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Switched to the new S2API driver API; cDvbTuner::IsTunedTo()now also checks the symbol rate in case of DVB-S and DVB-C
This commit is contained in:
parent
3abe4f2b91
commit
3c7d1a16ac
@ -2375,3 +2375,12 @@ Michael Nork <mnork0@gmx.net>
|
|||||||
|
|
||||||
Winfried Köhler <w_koehl@gmx.de>
|
Winfried Köhler <w_koehl@gmx.de>
|
||||||
for fixing wrong value for TableIdBAT in libsi/si.h
|
for fixing wrong value for TableIdBAT in libsi/si.h
|
||||||
|
|
||||||
|
Igor M. Liplianin <liplianin@tut.by>
|
||||||
|
for a patch that was used to convert VDR to the S2API driver API
|
||||||
|
|
||||||
|
Niels Wagenaar <n.wagenaar@xs4all.nl>
|
||||||
|
for a patch that was used to convert VDR to the S2API driver API
|
||||||
|
|
||||||
|
Edgar Hucek <gimli@dark-green.com>
|
||||||
|
for a patch that was used to convert VDR to the S2API driver API
|
||||||
|
7
HISTORY
7
HISTORY
@ -5832,6 +5832,11 @@ Video Disk Recorder Revision History
|
|||||||
- Removed unneeded include files <linux/dvb/dmx.h> und <time.h> from remux.h
|
- Removed unneeded include files <linux/dvb/dmx.h> und <time.h> from remux.h
|
||||||
(reported by Tobias Grimm).
|
(reported by Tobias Grimm).
|
||||||
|
|
||||||
2008-09-14: Version 1.7.2
|
2008-12-13: Version 1.7.2
|
||||||
|
|
||||||
- Added a note about 'Id' being obsolete to the description of cDevice::PlayAudio().
|
- Added a note about 'Id' being obsolete to the description of cDevice::PlayAudio().
|
||||||
|
- Switched to the new S2API driver API, which was decided to become the official
|
||||||
|
DVB API in the kernel (based on patches from Igor M. Liplianin, Niels Wagenaar
|
||||||
|
and Edgar Hucek).
|
||||||
|
- The cDvbTuner::IsTunedTo() function now also checks the symbol rate in case of
|
||||||
|
DVB-S and DVB-C.
|
||||||
|
171
channels.c
171
channels.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: channels.c 2.3 2008/07/06 12:59:41 kls Exp $
|
* $Id: channels.c 2.4 2008/12/13 11:42:15 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "channels.h"
|
#include "channels.h"
|
||||||
@ -21,114 +21,86 @@
|
|||||||
// --- Channel Parameter Maps ------------------------------------------------
|
// --- Channel Parameter Maps ------------------------------------------------
|
||||||
|
|
||||||
const tChannelParameterMap InversionValues[] = {
|
const tChannelParameterMap InversionValues[] = {
|
||||||
{ 0, DVBFE_INVERSION_OFF, trNOOP("off") },
|
{ 0, INVERSION_OFF, trNOOP("off") },
|
||||||
{ 1, DVBFE_INVERSION_ON, trNOOP("on") },
|
{ 1, INVERSION_ON, trNOOP("on") },
|
||||||
{ 999, DVBFE_INVERSION_AUTO },
|
{ 999, INVERSION_AUTO, trNOOP("auto") },
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const tChannelParameterMap BandwidthValues[] = {
|
const tChannelParameterMap BandwidthValues[] = {
|
||||||
{ 5, DVBFE_BANDWIDTH_5_MHZ, "5 MHz" },
|
{ 6, 6000000, "6 MHz" },
|
||||||
{ 6, DVBFE_BANDWIDTH_6_MHZ, "6 MHz" },
|
{ 7, 7000000, "7 MHz" },
|
||||||
{ 7, DVBFE_BANDWIDTH_7_MHZ, "7 MHz" },
|
{ 8, 8000000, "8 MHz" },
|
||||||
{ 8, DVBFE_BANDWIDTH_8_MHZ, "8 MHz" },
|
|
||||||
{ 999, DVBFE_BANDWIDTH_AUTO },
|
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const tChannelParameterMap CoderateValues[] = {
|
const tChannelParameterMap CoderateValues[] = {
|
||||||
{ 0, DVBFE_FEC_NONE, trNOOP("none") },
|
{ 0, FEC_NONE, trNOOP("none") },
|
||||||
{ 12, DVBFE_FEC_1_2, "1/2" },
|
{ 12, FEC_1_2, "1/2" },
|
||||||
{ 13, DVBFE_FEC_1_3, "1/3" },
|
{ 23, FEC_2_3, "2/3" },
|
||||||
{ 14, DVBFE_FEC_1_4, "1/4" },
|
{ 34, FEC_3_4, "3/4" },
|
||||||
{ 23, DVBFE_FEC_2_3, "2/3" },
|
{ 35, FEC_3_5, "3/5" },
|
||||||
{ 25, DVBFE_FEC_2_5, "2/5" },
|
{ 45, FEC_4_5, "4/5" },
|
||||||
{ 34, DVBFE_FEC_3_4, "3/4" },
|
{ 56, FEC_5_6, "5/6" },
|
||||||
{ 35, DVBFE_FEC_3_5, "3/5" },
|
{ 67, FEC_6_7, "6/7" },
|
||||||
{ 45, DVBFE_FEC_4_5, "4/5" },
|
{ 78, FEC_7_8, "7/8" },
|
||||||
{ 56, DVBFE_FEC_5_6, "5/6" },
|
{ 89, FEC_8_9, "8/9" },
|
||||||
{ 67, DVBFE_FEC_6_7, "6/7" },
|
{ 910, FEC_9_10, "9/10" },
|
||||||
{ 78, DVBFE_FEC_7_8, "7/8" },
|
{ 999, FEC_AUTO, trNOOP("auto") },
|
||||||
{ 89, DVBFE_FEC_8_9, "8/9" },
|
|
||||||
{ 910, DVBFE_FEC_9_10, "9/10" },
|
|
||||||
{ 999, DVBFE_FEC_AUTO },
|
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const tChannelParameterMap ModulationValues[] = {
|
const tChannelParameterMap ModulationValues[] = {
|
||||||
{ 0, DVBFE_MOD_NONE, trNOOP("none") },
|
{ 16, QAM_16, "QAM16" },
|
||||||
{ 4, DVBFE_MOD_QAM4, "QAM4" },
|
{ 32, QAM_32, "QAM32" },
|
||||||
{ 16, DVBFE_MOD_QAM16, "QAM16" },
|
{ 64, QAM_64, "QAM64" },
|
||||||
{ 32, DVBFE_MOD_QAM32, "QAM32" },
|
{ 128, QAM_128, "QAM128" },
|
||||||
{ 64, DVBFE_MOD_QAM64, "QAM64" },
|
{ 256, QAM_256, "QAM256" },
|
||||||
{ 128, DVBFE_MOD_QAM128, "QAM128" },
|
{ 2, QPSK, "QPSK" },
|
||||||
{ 256, DVBFE_MOD_QAM256, "QAM256" },
|
{ 5, PSK_8, "8PSK" },
|
||||||
{ 512, DVBFE_MOD_QAM512, "QAM512" },
|
{ 6, APSK_16, "16APSK" },
|
||||||
{1024, DVBFE_MOD_QAM1024, "QAM1024" },
|
{ 10, VSB_8, "VSB8" },
|
||||||
{ 1, DVBFE_MOD_BPSK, "BPSK" },
|
{ 11, VSB_16, "VSB16" },
|
||||||
{ 2, DVBFE_MOD_QPSK, "QPSK" },
|
{ 998, QAM_AUTO, "QAMAUTO" },
|
||||||
{ 3, DVBFE_MOD_OQPSK, "OQPSK" },
|
|
||||||
{ 5, DVBFE_MOD_8PSK, "8PSK" },
|
|
||||||
{ 6, DVBFE_MOD_16APSK, "16APSK" },
|
|
||||||
{ 7, DVBFE_MOD_32APSK, "32APSK" },
|
|
||||||
{ 8, DVBFE_MOD_OFDM, "OFDM" },
|
|
||||||
{ 9, DVBFE_MOD_COFDM, "COFDM" },
|
|
||||||
{ 10, DVBFE_MOD_VSB8, "VSB8" },
|
|
||||||
{ 11, DVBFE_MOD_VSB16, "VSB16" },
|
|
||||||
{ 998, DVBFE_MOD_QAMAUTO, "QAMAUTO" },
|
|
||||||
{ 999, DVBFE_MOD_AUTO },
|
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const tChannelParameterMap SystemValues[] = {
|
const tChannelParameterMap SystemValues[] = {
|
||||||
{ 0, DVBFE_DELSYS_DVBS, "DVB-S" },
|
{ 0, SYS_DVBS, "DVB-S" },
|
||||||
{ 1, DVBFE_DELSYS_DVBS2, "DVB-S2" },
|
{ 1, SYS_DVBS2, "DVB-S2" },
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const tChannelParameterMap TransmissionValues[] = {
|
const tChannelParameterMap TransmissionValues[] = {
|
||||||
{ 2, DVBFE_TRANSMISSION_MODE_2K, "2K" },
|
{ 2, TRANSMISSION_MODE_2K, "2K" },
|
||||||
{ 4, DVBFE_TRANSMISSION_MODE_4K, "4K" },
|
{ 8, TRANSMISSION_MODE_8K, "8K" },
|
||||||
{ 8, DVBFE_TRANSMISSION_MODE_8K, "8K" },
|
{ 999, TRANSMISSION_MODE_AUTO, trNOOP("auto") },
|
||||||
{ 999, DVBFE_TRANSMISSION_MODE_AUTO },
|
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const tChannelParameterMap GuardValues[] = {
|
const tChannelParameterMap GuardValues[] = {
|
||||||
{ 4, DVBFE_GUARD_INTERVAL_1_4, "1/4" },
|
{ 4, GUARD_INTERVAL_1_4, "1/4" },
|
||||||
{ 8, DVBFE_GUARD_INTERVAL_1_8, "1/8" },
|
{ 8, GUARD_INTERVAL_1_8, "1/8" },
|
||||||
{ 16, DVBFE_GUARD_INTERVAL_1_16, "1/16" },
|
{ 16, GUARD_INTERVAL_1_16, "1/16" },
|
||||||
{ 32, DVBFE_GUARD_INTERVAL_1_32, "1/32" },
|
{ 32, GUARD_INTERVAL_1_32, "1/32" },
|
||||||
{ 999, DVBFE_GUARD_INTERVAL_AUTO },
|
{ 999, GUARD_INTERVAL_AUTO, trNOOP("auto") },
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const tChannelParameterMap HierarchyValues[] = {
|
const tChannelParameterMap HierarchyValues[] = {
|
||||||
{ 0, DVBFE_HIERARCHY_OFF, trNOOP("off") },
|
{ 0, HIERARCHY_NONE, trNOOP("none") },
|
||||||
{ 1, DVBFE_HIERARCHY_ON, trNOOP("on") },
|
{ 1, HIERARCHY_1, "1" },
|
||||||
{ 999, DVBFE_HIERARCHY_AUTO },
|
{ 2, HIERARCHY_2, "2" },
|
||||||
{ -1 }
|
{ 4, HIERARCHY_4, "4" },
|
||||||
};
|
{ 999, HIERARCHY_AUTO, trNOOP("auto") },
|
||||||
|
|
||||||
const tChannelParameterMap AlphaValues[] = {
|
|
||||||
{ 0, 0 },
|
|
||||||
{ 1, DVBFE_ALPHA_1 },
|
|
||||||
{ 2, DVBFE_ALPHA_2 },
|
|
||||||
{ 4, DVBFE_ALPHA_4 },
|
|
||||||
{ -1 }
|
|
||||||
};
|
|
||||||
|
|
||||||
const tChannelParameterMap PriorityValues[] = {
|
|
||||||
{ 0, DVBFE_STREAM_PRIORITY_HP, trNOOP("high") },
|
|
||||||
{ 1, DVBFE_STREAM_PRIORITY_LP, trNOOP("low") },
|
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const tChannelParameterMap RollOffValues[] = {
|
const tChannelParameterMap RollOffValues[] = {
|
||||||
{ 0, DVBFE_ROLLOFF_UNKNOWN },
|
{ 0, ROLLOFF_AUTO, trNOOP("auto") },
|
||||||
{ 20, DVBFE_ROLLOFF_20, "0.20" },
|
{ 20, ROLLOFF_20, "0.20" },
|
||||||
{ 25, DVBFE_ROLLOFF_25, "0.25" },
|
{ 25, ROLLOFF_25, "0.25" },
|
||||||
{ 35, DVBFE_ROLLOFF_35, "0.35" },
|
{ 35, ROLLOFF_35, "0.35" },
|
||||||
{ -1 }
|
{ -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -217,18 +189,16 @@ cChannel::cChannel(void)
|
|||||||
provider = strdup("");
|
provider = strdup("");
|
||||||
portalName = strdup("");
|
portalName = strdup("");
|
||||||
memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__);
|
memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__);
|
||||||
inversion = DVBFE_INVERSION_AUTO;
|
inversion = INVERSION_AUTO;
|
||||||
bandwidth = DVBFE_BANDWIDTH_AUTO;
|
bandwidth = 8000000;
|
||||||
coderateH = DVBFE_FEC_AUTO;
|
coderateH = FEC_AUTO;
|
||||||
coderateL = DVBFE_FEC_AUTO;
|
coderateL = FEC_AUTO;
|
||||||
modulation = DVBFE_MOD_AUTO;
|
modulation = QPSK;
|
||||||
system = DVBFE_DELSYS_DVBS;
|
system = SYS_DVBS;
|
||||||
transmission = DVBFE_TRANSMISSION_MODE_AUTO;
|
transmission = TRANSMISSION_MODE_AUTO;
|
||||||
guard = DVBFE_GUARD_INTERVAL_AUTO;
|
guard = GUARD_INTERVAL_AUTO;
|
||||||
hierarchy = DVBFE_HIERARCHY_AUTO;
|
hierarchy = HIERARCHY_AUTO;
|
||||||
alpha = 0;
|
rollOff = ROLLOFF_AUTO;
|
||||||
priority = DVBFE_STREAM_PRIORITY_HP;
|
|
||||||
rollOff = DVBFE_ROLLOFF_UNKNOWN;
|
|
||||||
modification = CHANNELMOD_NONE;
|
modification = CHANNELMOD_NONE;
|
||||||
schedule = NULL;
|
schedule = NULL;
|
||||||
linkChannels = NULL;
|
linkChannels = NULL;
|
||||||
@ -335,8 +305,6 @@ void cChannel::CopyTransponderData(const cChannel *Channel)
|
|||||||
transmission = Channel->transmission;
|
transmission = Channel->transmission;
|
||||||
guard = Channel->guard;
|
guard = Channel->guard;
|
||||||
hierarchy = Channel->hierarchy;
|
hierarchy = Channel->hierarchy;
|
||||||
alpha = Channel->alpha;
|
|
||||||
priority = Channel->priority;
|
|
||||||
rollOff = Channel->rollOff;
|
rollOff = Channel->rollOff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -394,9 +362,9 @@ bool cChannel::SetCableTransponderData(int Source, int Frequency, int Modulation
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CoderateH, int CoderateL, int Guard, int Transmission, int Alpha, int Priority)
|
bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CoderateH, int CoderateL, int Guard, int Transmission)
|
||||||
{
|
{
|
||||||
if (source != Source || frequency != Frequency || bandwidth != Bandwidth || modulation != Modulation || hierarchy != Hierarchy || coderateH != CoderateH || coderateL != CoderateL || guard != Guard || transmission != Transmission || alpha != Alpha || priority != Priority) {
|
if (source != Source || frequency != Frequency || bandwidth != Bandwidth || modulation != Modulation || hierarchy != Hierarchy || coderateH != CoderateH || coderateL != CoderateL || guard != Guard || transmission != Transmission) {
|
||||||
cString OldTransponderData = TransponderDataToString();
|
cString OldTransponderData = TransponderDataToString();
|
||||||
source = Source;
|
source = Source;
|
||||||
frequency = Frequency;
|
frequency = Frequency;
|
||||||
@ -407,8 +375,6 @@ bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth,
|
|||||||
coderateL = CoderateL;
|
coderateL = CoderateL;
|
||||||
guard = Guard;
|
guard = Guard;
|
||||||
transmission = Transmission;
|
transmission = Transmission;
|
||||||
alpha = Alpha;
|
|
||||||
priority = Priority;
|
|
||||||
schedule = NULL;
|
schedule = NULL;
|
||||||
if (Number()) {
|
if (Number()) {
|
||||||
dsyslog("changing transponder data of channel %d from %s to %s", Number(), *OldTransponderData, *TransponderDataToString());
|
dsyslog("changing transponder data of channel %d from %s to %s", Number(), *OldTransponderData, *TransponderDataToString());
|
||||||
@ -670,7 +636,6 @@ cString cChannel::ParametersToString(void) const
|
|||||||
char *q = buffer;
|
char *q = buffer;
|
||||||
*q = 0;
|
*q = 0;
|
||||||
ST(" S ") q += sprintf(q, "%c", polarization);
|
ST(" S ") q += sprintf(q, "%c", polarization);
|
||||||
ST(" T") q += PrintParameter(q, 'A', MapToUser(alpha, AlphaValues));
|
|
||||||
ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
|
ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
|
||||||
ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
|
ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
|
||||||
ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
|
ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
|
||||||
@ -678,7 +643,6 @@ cString cChannel::ParametersToString(void) const
|
|||||||
ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
|
ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
|
||||||
ST("CST") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
|
ST("CST") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
|
||||||
ST(" S ") q += PrintParameter(q, 'O', MapToUser(rollOff, RollOffValues));
|
ST(" S ") q += PrintParameter(q, 'O', MapToUser(rollOff, RollOffValues));
|
||||||
ST(" T") q += PrintParameter(q, 'P', MapToUser(priority, PriorityValues));
|
|
||||||
ST(" S ") q += PrintParameter(q, 'S', MapToUser(system, SystemValues));
|
ST(" S ") q += PrintParameter(q, 'S', MapToUser(system, SystemValues));
|
||||||
ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
|
ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
|
||||||
ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
|
ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
|
||||||
@ -701,11 +665,18 @@ static const char *ParseParameter(const char *s, int &Value, const tChannelParam
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *SkipDigits(const char *s)
|
||||||
|
{
|
||||||
|
while (*++s && isdigit(*s))
|
||||||
|
;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
bool cChannel::StringToParameters(const char *s)
|
bool cChannel::StringToParameters(const char *s)
|
||||||
{
|
{
|
||||||
while (s && *s) {
|
while (s && *s) {
|
||||||
switch (toupper(*s)) {
|
switch (toupper(*s)) {
|
||||||
case 'A': s = ParseParameter(s, alpha, AlphaValues); break;
|
case 'A': s = SkipDigits(s); break; // for compatibility with the "multiproto" approach - may be removed in future versions
|
||||||
case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break;
|
case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break;
|
||||||
case 'C': s = ParseParameter(s, coderateH, CoderateValues); break;
|
case 'C': s = ParseParameter(s, coderateH, CoderateValues); break;
|
||||||
case 'D': s = ParseParameter(s, coderateL, CoderateValues); break;
|
case 'D': s = ParseParameter(s, coderateL, CoderateValues); break;
|
||||||
@ -714,14 +685,14 @@ bool cChannel::StringToParameters(const char *s)
|
|||||||
case 'I': s = ParseParameter(s, inversion, InversionValues); break;
|
case 'I': s = ParseParameter(s, inversion, InversionValues); break;
|
||||||
case 'L': polarization = *s++; break;
|
case 'L': polarization = *s++; break;
|
||||||
case 'M': s = ParseParameter(s, modulation, ModulationValues); break;
|
case 'M': s = ParseParameter(s, modulation, ModulationValues); break;
|
||||||
case 'Z':// for compatibility with the original DVB-S2 patch - may be removed in future versions
|
|
||||||
case 'O': s = ParseParameter(s, rollOff, RollOffValues); break;
|
case 'O': s = ParseParameter(s, rollOff, RollOffValues); break;
|
||||||
case 'P': s = ParseParameter(s, priority, PriorityValues); break;
|
case 'P': s = SkipDigits(s); break; // for compatibility with the "multiproto" approach - may be removed in future versions
|
||||||
case 'R': polarization = *s++; break;
|
case 'R': polarization = *s++; break;
|
||||||
case 'S': s = ParseParameter(s, system, SystemValues); break;
|
case 'S': s = ParseParameter(s, system, SystemValues); break;
|
||||||
case 'T': s = ParseParameter(s, transmission, TransmissionValues); break;
|
case 'T': s = ParseParameter(s, transmission, TransmissionValues); break;
|
||||||
case 'V': polarization = *s++; break;
|
case 'V': polarization = *s++; break;
|
||||||
case 'Y': s = ParseParameter(s, hierarchy, HierarchyValues); break;
|
case 'Y': s = ParseParameter(s, hierarchy, HierarchyValues); break;
|
||||||
|
case 'Z': s = SkipDigits(s); break; // for compatibility with the original DVB-S2 patch - may be removed in future versions
|
||||||
default: esyslog("ERROR: unknown parameter key '%c'", *s);
|
default: esyslog("ERROR: unknown parameter key '%c'", *s);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
10
channels.h
10
channels.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: channels.h 2.3 2008/07/06 11:49:37 kls Exp $
|
* $Id: channels.h 2.4 2008/11/22 13:35:52 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CHANNELS_H
|
#ifndef __CHANNELS_H
|
||||||
@ -66,8 +66,6 @@ extern const tChannelParameterMap SystemValues[];
|
|||||||
extern const tChannelParameterMap TransmissionValues[];
|
extern const tChannelParameterMap TransmissionValues[];
|
||||||
extern const tChannelParameterMap GuardValues[];
|
extern const tChannelParameterMap GuardValues[];
|
||||||
extern const tChannelParameterMap HierarchyValues[];
|
extern const tChannelParameterMap HierarchyValues[];
|
||||||
extern const tChannelParameterMap AlphaValues[];
|
|
||||||
extern const tChannelParameterMap PriorityValues[];
|
|
||||||
extern const tChannelParameterMap RollOffValues[];
|
extern const tChannelParameterMap RollOffValues[];
|
||||||
|
|
||||||
struct tChannelID {
|
struct tChannelID {
|
||||||
@ -149,8 +147,6 @@ private:
|
|||||||
int transmission;
|
int transmission;
|
||||||
int guard;
|
int guard;
|
||||||
int hierarchy;
|
int hierarchy;
|
||||||
int alpha;
|
|
||||||
int priority;
|
|
||||||
int rollOff;
|
int rollOff;
|
||||||
int __EndData__;
|
int __EndData__;
|
||||||
int modification;
|
int modification;
|
||||||
@ -209,8 +205,6 @@ public:
|
|||||||
int Transmission(void) const { return transmission; }
|
int Transmission(void) const { return transmission; }
|
||||||
int Guard(void) const { return guard; }
|
int Guard(void) const { return guard; }
|
||||||
int Hierarchy(void) const { return hierarchy; }
|
int Hierarchy(void) const { return hierarchy; }
|
||||||
int Alpha(void) const { return alpha; }
|
|
||||||
int Priority(void) const { return priority; }
|
|
||||||
int RollOff(void) const { return rollOff; }
|
int RollOff(void) const { return rollOff; }
|
||||||
const cLinkChannels* LinkChannels(void) const { return linkChannels; }
|
const cLinkChannels* LinkChannels(void) const { return linkChannels; }
|
||||||
const cChannel *RefChannel(void) const { return refChannel; }
|
const cChannel *RefChannel(void) const { return refChannel; }
|
||||||
@ -223,7 +217,7 @@ public:
|
|||||||
void CopyTransponderData(const cChannel *Channel);
|
void CopyTransponderData(const cChannel *Channel);
|
||||||
bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH, int Modulation, int System, int RollOff);
|
bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH, int Modulation, int System, int RollOff);
|
||||||
bool SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH);
|
bool SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH);
|
||||||
bool SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CodeRateH, int CodeRateL, int Guard, int Transmission, int Alpha, int Priority);
|
bool SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CodeRateH, int CodeRateL, int Guard, int Transmission);
|
||||||
void SetId(int Nid, int Tid, int Sid, int Rid = 0);
|
void SetId(int Nid, int Tid, int Sid, int Rid = 0);
|
||||||
void SetName(const char *Name, const char *ShortName, const char *Provider);
|
void SetName(const char *Name, const char *ShortName, const char *Provider);
|
||||||
void SetPortalName(const char *PortalName);
|
void SetPortalName(const char *PortalName);
|
||||||
|
174
dvbdevice.c
174
dvbdevice.c
@ -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.4 2008/07/06 13:58:56 kls Exp $
|
* $Id: dvbdevice.c 2.5 2008/12/13 12:22:36 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dvbdevice.h"
|
#include "dvbdevice.h"
|
||||||
@ -27,6 +27,13 @@
|
|||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "transfer.h"
|
#include "transfer.h"
|
||||||
|
|
||||||
|
// FIXME: temporary workaround until the S2API driver supports detecting
|
||||||
|
// S2 capability in a clean way. This macro allows compiling VDR with an
|
||||||
|
// unpatched driver. However, with an unpatched driver it will not support
|
||||||
|
// DVB-S2 hardware. If you have DVB-S2 hardware you need to either patch
|
||||||
|
// the driver or modify the line that uses this macro in cDvbDevice::cDvbDevice().
|
||||||
|
#define FE_CAN_2ND_GEN_MODULATION 0x10000000
|
||||||
|
|
||||||
#define DO_REC_AND_PLAY_ON_PRIMARY_DEVICE 1
|
#define DO_REC_AND_PLAY_ON_PRIMARY_DEVICE 1
|
||||||
#define DO_MULTIPLE_RECORDINGS 1
|
#define DO_MULTIPLE_RECORDINGS 1
|
||||||
|
|
||||||
@ -76,7 +83,7 @@ private:
|
|||||||
int tuneTimeout;
|
int tuneTimeout;
|
||||||
int lockTimeout;
|
int lockTimeout;
|
||||||
time_t lastTimeoutReport;
|
time_t lastTimeoutReport;
|
||||||
dvbfe_delsys frontendType;
|
fe_delivery_system frontendType;
|
||||||
cChannel channel;
|
cChannel channel;
|
||||||
const char *diseqcCommands;
|
const char *diseqcCommands;
|
||||||
eTunerStatus tunerStatus;
|
eTunerStatus tunerStatus;
|
||||||
@ -87,14 +94,14 @@ private:
|
|||||||
bool SetFrontend(void);
|
bool SetFrontend(void);
|
||||||
virtual void Action(void);
|
virtual void Action(void);
|
||||||
public:
|
public:
|
||||||
cDvbTuner(int Fd_Frontend, int CardIndex, dvbfe_delsys FrontendType);
|
cDvbTuner(int Fd_Frontend, int CardIndex, fe_delivery_system FrontendType);
|
||||||
virtual ~cDvbTuner();
|
virtual ~cDvbTuner();
|
||||||
bool IsTunedTo(const cChannel *Channel) const;
|
bool IsTunedTo(const cChannel *Channel) const;
|
||||||
void Set(const cChannel *Channel, bool Tune);
|
void Set(const cChannel *Channel, bool Tune);
|
||||||
bool Locked(int TimeoutMs = 0);
|
bool Locked(int TimeoutMs = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, dvbfe_delsys FrontendType)
|
cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_delivery_system FrontendType)
|
||||||
{
|
{
|
||||||
fd_frontend = Fd_Frontend;
|
fd_frontend = Fd_Frontend;
|
||||||
cardIndex = CardIndex;
|
cardIndex = CardIndex;
|
||||||
@ -104,7 +111,7 @@ cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, dvbfe_delsys FrontendType)
|
|||||||
lastTimeoutReport = 0;
|
lastTimeoutReport = 0;
|
||||||
diseqcCommands = NULL;
|
diseqcCommands = NULL;
|
||||||
tunerStatus = tsIdle;
|
tunerStatus = tsIdle;
|
||||||
if (frontendType & (DVBFE_DELSYS_DVBS | DVBFE_DELSYS_DVBS2))
|
if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2)
|
||||||
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); // must explicitly turn on LNB power
|
CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); // must explicitly turn on LNB power
|
||||||
SetDescription("tuner on device %d", cardIndex + 1);
|
SetDescription("tuner on device %d", cardIndex + 1);
|
||||||
Start();
|
Start();
|
||||||
@ -127,7 +134,6 @@ bool cDvbTuner::IsTunedTo(const cChannel *Channel) const
|
|||||||
char Type = **cSource::ToString(Channel->Source());
|
char Type = **cSource::ToString(Channel->Source());
|
||||||
#define ST(s, p) if (strchr(s, Type)) if (channel.p() != Channel->p()) return false;
|
#define ST(s, p) if (strchr(s, Type)) if (channel.p() != Channel->p()) return false;
|
||||||
// Polarization is already checked as part of the Transponder.
|
// Polarization is already checked as part of the Transponder.
|
||||||
ST(" T", Alpha);
|
|
||||||
ST(" T", Bandwidth);
|
ST(" T", Bandwidth);
|
||||||
ST("CST", CoderateH);
|
ST("CST", CoderateH);
|
||||||
ST(" T", CoderateL);
|
ST(" T", CoderateL);
|
||||||
@ -135,8 +141,8 @@ bool cDvbTuner::IsTunedTo(const cChannel *Channel) const
|
|||||||
ST("CST", Inversion);
|
ST("CST", Inversion);
|
||||||
ST("CST", Modulation);
|
ST("CST", Modulation);
|
||||||
ST(" S ", RollOff);
|
ST(" S ", RollOff);
|
||||||
ST(" T", Priority);
|
|
||||||
ST(" S ", System);
|
ST(" S ", System);
|
||||||
|
ST("CS ", Srate);
|
||||||
ST(" T", Transmission);
|
ST(" T", Transmission);
|
||||||
ST(" T", Hierarchy);
|
ST(" T", Hierarchy);
|
||||||
return true;
|
return true;
|
||||||
@ -192,10 +198,27 @@ static unsigned int FrequencyToHz(unsigned int f)
|
|||||||
|
|
||||||
bool cDvbTuner::SetFrontend(void)
|
bool cDvbTuner::SetFrontend(void)
|
||||||
{
|
{
|
||||||
dvbfe_params Frontend;
|
#define MAXFRONTENDCMDS 16
|
||||||
|
#define SETCMD(c, d) { Frontend[CmdSeq.num].cmd = (c);\
|
||||||
|
Frontend[CmdSeq.num].u.data = (d);\
|
||||||
|
if (CmdSeq.num++ > MAXFRONTENDCMDS) {\
|
||||||
|
esyslog("ERROR: too many tuning commands on frontend %d", cardIndex);\
|
||||||
|
return false;\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
dtv_property Frontend[MAXFRONTENDCMDS];
|
||||||
memset(&Frontend, 0, sizeof(Frontend));
|
memset(&Frontend, 0, sizeof(Frontend));
|
||||||
|
dtv_properties CmdSeq;
|
||||||
|
memset(&CmdSeq, 0, sizeof(CmdSeq));
|
||||||
|
CmdSeq.props = Frontend;
|
||||||
|
SETCMD(DTV_CLEAR, 0);
|
||||||
|
if (ioctl(fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) {
|
||||||
|
esyslog("ERROR: frontend %d: %m", cardIndex);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
CmdSeq.num = 0;
|
||||||
|
|
||||||
if (frontendType & (DVBFE_DELSYS_DVBS | DVBFE_DELSYS_DVBS2)) {
|
if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) {
|
||||||
unsigned int frequency = channel.Frequency();
|
unsigned int frequency = channel.Frequency();
|
||||||
if (Setup.DiSEqC) {
|
if (Setup.DiSEqC) {
|
||||||
cDiseqc *diseqc = Diseqcs.Get(channel.Source(), channel.Frequency(), channel.Polarization());
|
cDiseqc *diseqc = Diseqcs.Get(channel.Source(), channel.Frequency(), channel.Polarization());
|
||||||
@ -249,48 +272,56 @@ bool cDvbTuner::SetFrontend(void)
|
|||||||
}
|
}
|
||||||
frequency = abs(frequency); // Allow for C-band, where the frequency is less than the LOF
|
frequency = abs(frequency); // Allow for C-band, where the frequency is less than the LOF
|
||||||
|
|
||||||
Frontend.delivery = dvbfe_delsys(channel.System());
|
// DVB-S/DVB-S2 (common parts)
|
||||||
Frontend.frequency = frequency * 1000UL;
|
SETCMD(DTV_DELIVERY_SYSTEM, channel.System());
|
||||||
Frontend.inversion = fe_spectral_inversion_t(channel.Inversion());
|
SETCMD(DTV_FREQUENCY, frequency * 1000UL);
|
||||||
if (Frontend.delivery == DVBFE_DELSYS_DVBS) {
|
SETCMD(DTV_MODULATION, channel.Modulation());
|
||||||
Frontend.delsys.dvbs.modulation = dvbfe_modulation(channel.Modulation());
|
SETCMD(DTV_SYMBOL_RATE, channel.Srate() * 1000UL);
|
||||||
Frontend.delsys.dvbs.symbol_rate = channel.Srate() * 1000UL;
|
SETCMD(DTV_INNER_FEC, channel.CoderateH());
|
||||||
Frontend.delsys.dvbs.fec = dvbfe_fec(channel.CoderateH());
|
SETCMD(DTV_INVERSION, channel.Inversion());
|
||||||
|
if (channel.System() == SYS_DVBS2) {
|
||||||
|
if (frontendType == SYS_DVBS2) {
|
||||||
|
// DVB-S2
|
||||||
|
SETCMD(DTV_PILOT, PILOT_AUTO);
|
||||||
|
SETCMD(DTV_ROLLOFF, channel.RollOff());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Frontend.delsys.dvbs2.modulation = dvbfe_modulation(channel.Modulation());
|
esyslog("ERROR: frontend %d doesn't provide DVB-S2", cardIndex);
|
||||||
Frontend.delsys.dvbs2.symbol_rate = channel.Srate() * 1000UL;
|
return false;
|
||||||
Frontend.delsys.dvbs2.fec = dvbfe_fec(channel.CoderateH());
|
}
|
||||||
Frontend.delsys.dvbs2.rolloff = dvbfe_rolloff(channel.RollOff());
|
}
|
||||||
|
else {
|
||||||
|
// DVB-S
|
||||||
|
SETCMD(DTV_ROLLOFF, ROLLOFF_35); // DVB-S always has a ROLLOFF of 0.35
|
||||||
}
|
}
|
||||||
|
|
||||||
tuneTimeout = DVBS_TUNE_TIMEOUT;
|
tuneTimeout = DVBS_TUNE_TIMEOUT;
|
||||||
lockTimeout = DVBS_LOCK_TIMEOUT;
|
lockTimeout = DVBS_LOCK_TIMEOUT;
|
||||||
}
|
}
|
||||||
else if (frontendType & DVBFE_DELSYS_DVBC) {
|
else if (frontendType == SYS_DVBC_ANNEX_AC || frontendType == SYS_DVBC_ANNEX_B) {
|
||||||
Frontend.delivery = DVBFE_DELSYS_DVBC;
|
// DVB-C
|
||||||
Frontend.frequency = FrequencyToHz(channel.Frequency());
|
SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
|
||||||
Frontend.inversion = fe_spectral_inversion_t(channel.Inversion());
|
SETCMD(DTV_FREQUENCY, FrequencyToHz(channel.Frequency()));
|
||||||
Frontend.delsys.dvbc.symbol_rate = channel.Srate() * 1000UL;
|
SETCMD(DTV_INVERSION, channel.Inversion());
|
||||||
Frontend.delsys.dvbc.fec = dvbfe_fec(channel.CoderateH());
|
SETCMD(DTV_SYMBOL_RATE, channel.Srate() * 1000UL);
|
||||||
Frontend.delsys.dvbc.modulation = dvbfe_modulation(channel.Modulation());
|
SETCMD(DTV_INNER_FEC, channel.CoderateH());
|
||||||
|
SETCMD(DTV_MODULATION, channel.Modulation());
|
||||||
|
|
||||||
tuneTimeout = DVBC_TUNE_TIMEOUT;
|
tuneTimeout = DVBC_TUNE_TIMEOUT;
|
||||||
lockTimeout = DVBC_LOCK_TIMEOUT;
|
lockTimeout = DVBC_LOCK_TIMEOUT;
|
||||||
}
|
}
|
||||||
else if (frontendType & DVBFE_DELSYS_DVBT) {
|
else if (frontendType == SYS_DVBT) {
|
||||||
Frontend.delivery = DVBFE_DELSYS_DVBT;
|
// DVB-T
|
||||||
Frontend.frequency = FrequencyToHz(channel.Frequency());
|
SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
|
||||||
Frontend.inversion = fe_spectral_inversion_t(channel.Inversion());
|
SETCMD(DTV_FREQUENCY, FrequencyToHz(channel.Frequency()));
|
||||||
Frontend.delsys.dvbt.bandwidth = dvbfe_bandwidth(channel.Bandwidth());
|
SETCMD(DTV_INVERSION, channel.Inversion());
|
||||||
Frontend.delsys.dvbt.code_rate_HP = dvbfe_fec(channel.CoderateH());
|
SETCMD(DTV_BANDWIDTH_HZ, channel.Bandwidth());
|
||||||
Frontend.delsys.dvbt.code_rate_LP = dvbfe_fec(channel.CoderateL());
|
SETCMD(DTV_CODE_RATE_HP, channel.CoderateH());
|
||||||
Frontend.delsys.dvbt.constellation = dvbfe_modulation(channel.Modulation());
|
SETCMD(DTV_CODE_RATE_LP, channel.CoderateL());
|
||||||
Frontend.delsys.dvbt.transmission_mode = dvbfe_transmission_mode(channel.Transmission());
|
SETCMD(DTV_MODULATION, channel.Modulation());
|
||||||
Frontend.delsys.dvbt.guard_interval = dvbfe_guard_interval(channel.Guard());
|
SETCMD(DTV_TRANSMISSION_MODE, channel.Transmission());
|
||||||
Frontend.delsys.dvbt.hierarchy = dvbfe_hierarchy(channel.Hierarchy());
|
SETCMD(DTV_GUARD_INTERVAL, channel.Guard());
|
||||||
Frontend.delsys.dvbt.alpha = dvbfe_alpha(channel.Alpha());
|
SETCMD(DTV_HIERARCHY, channel.Hierarchy());
|
||||||
Frontend.delsys.dvbt.priority = dvbfe_stream_priority(channel.Priority());
|
|
||||||
|
|
||||||
tuneTimeout = DVBT_TUNE_TIMEOUT;
|
tuneTimeout = DVBT_TUNE_TIMEOUT;
|
||||||
lockTimeout = DVBT_LOCK_TIMEOUT;
|
lockTimeout = DVBT_LOCK_TIMEOUT;
|
||||||
@ -299,8 +330,8 @@ bool cDvbTuner::SetFrontend(void)
|
|||||||
esyslog("ERROR: attempt to set channel with unknown DVB frontend type");
|
esyslog("ERROR: attempt to set channel with unknown DVB frontend type");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
CHECK(ioctl(fd_frontend, DVBFE_SET_DELSYS, &Frontend.delivery));
|
SETCMD(DTV_TUNE, 0);
|
||||||
if (ioctl(fd_frontend, DVBFE_SET_PARAMS, &Frontend) < 0) {
|
if (ioctl(fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) {
|
||||||
esyslog("ERROR: frontend %d: %m", cardIndex);
|
esyslog("ERROR: frontend %d: %m", cardIndex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -372,13 +403,22 @@ int cDvbDevice::devVideoOffset = -1;
|
|||||||
int cDvbDevice::setTransferModeForDolbyDigital = 1;
|
int cDvbDevice::setTransferModeForDolbyDigital = 1;
|
||||||
|
|
||||||
const char *DeliverySystems[] = {
|
const char *DeliverySystems[] = {
|
||||||
"DVBS",
|
"UNDEFINED",
|
||||||
|
"DVB-C",
|
||||||
|
"DVB-C",
|
||||||
|
"DVB-T",
|
||||||
"DSS",
|
"DSS",
|
||||||
"DVBS2",
|
"DVB-S",
|
||||||
"DVBC",
|
"DVB-S2",
|
||||||
"DVBT",
|
"DVB-H",
|
||||||
"DVBH",
|
"ISDBT",
|
||||||
|
"ISDBS",
|
||||||
|
"ISDBC",
|
||||||
"ATSC",
|
"ATSC",
|
||||||
|
"ATSCMH",
|
||||||
|
"DMBTH",
|
||||||
|
"CMMB",
|
||||||
|
"DAB",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -386,7 +426,7 @@ cDvbDevice::cDvbDevice(int n)
|
|||||||
{
|
{
|
||||||
ciAdapter = NULL;
|
ciAdapter = NULL;
|
||||||
dvbTuner = NULL;
|
dvbTuner = NULL;
|
||||||
frontendType = DVBFE_DELSYS_DUMMY;
|
frontendType = SYS_UNDEFINED;
|
||||||
numProvidedSystems = 0;
|
numProvidedSystems = 0;
|
||||||
spuDecoder = NULL;
|
spuDecoder = NULL;
|
||||||
digitalAudio = false;
|
digitalAudio = false;
|
||||||
@ -449,26 +489,24 @@ cDvbDevice::cDvbDevice(int n)
|
|||||||
// We only check the devices that must be present - the others will be checked before accessing them://XXX
|
// We only check the devices that must be present - the others will be checked before accessing them://XXX
|
||||||
|
|
||||||
if (fd_frontend >= 0) {
|
if (fd_frontend >= 0) {
|
||||||
if (ioctl(fd_frontend, DVBFE_GET_DELSYS, &frontendType) >= 0) {
|
if (ioctl(fd_frontend, FE_GET_INFO, &frontendInfo) >= 0) {
|
||||||
const char **DeliverySystem = DeliverySystems;
|
switch (frontendInfo.type) {
|
||||||
cString ds;
|
case FE_QPSK: frontendType = (frontendInfo.caps & FE_CAN_2ND_GEN_MODULATION) ? SYS_DVBS2 : SYS_DVBS; break;
|
||||||
for (int i = 0; i < 32; i++) {
|
case FE_OFDM: frontendType = SYS_DVBT; break;
|
||||||
if (frontendType & (1u << i)) {
|
case FE_QAM: frontendType = SYS_DVBC_ANNEX_AC; break;
|
||||||
numProvidedSystems++;
|
case FE_ATSC: frontendType = SYS_ATSC; break;
|
||||||
if (*DeliverySystem)
|
default: esyslog("ERROR: unknown frontend type %d on device %d", frontendInfo.type, CardIndex() + 1);
|
||||||
ds = cString::sprintf("%s %s", *ds ? *ds : "", *DeliverySystem);
|
|
||||||
else
|
|
||||||
esyslog("ERROR: unknown delivery system %d", i);
|
|
||||||
}
|
}
|
||||||
if (*DeliverySystem)
|
|
||||||
DeliverySystem++;
|
|
||||||
}
|
|
||||||
if (*ds)
|
|
||||||
isyslog("device %d provides:%s", CardIndex() + 1, *ds);
|
|
||||||
dvbTuner = new cDvbTuner(fd_frontend, CardIndex(), frontendType);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LOG_ERROR;
|
LOG_ERROR;
|
||||||
|
if (frontendType != SYS_UNDEFINED) {
|
||||||
|
numProvidedSystems++;
|
||||||
|
if (frontendType == SYS_DVBS2)
|
||||||
|
numProvidedSystems++;
|
||||||
|
isyslog("device %d provides %s (\"%s\")", CardIndex() + 1, DeliverySystems[frontendType], frontendInfo.name);
|
||||||
|
dvbTuner = new cDvbTuner(fd_frontend, CardIndex(), frontendType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
esyslog("ERROR: can't open DVB device %d", n);
|
esyslog("ERROR: can't open DVB device %d", n);
|
||||||
@ -789,9 +827,9 @@ bool cDvbDevice::ProvidesSource(int Source) const
|
|||||||
{
|
{
|
||||||
int type = Source & cSource::st_Mask;
|
int type = Source & cSource::st_Mask;
|
||||||
return type == cSource::stNone
|
return type == cSource::stNone
|
||||||
|| type == cSource::stCable && (frontendType & DVBFE_DELSYS_DVBC)
|
|| type == cSource::stCable && (frontendType == SYS_DVBC_ANNEX_AC || frontendType == SYS_DVBC_ANNEX_B)
|
||||||
|| type == cSource::stSat && (frontendType & (DVBFE_DELSYS_DVBS | DVBFE_DELSYS_DVBS2))
|
|| type == cSource::stSat && (frontendType == SYS_DVBS || frontendType == SYS_DVBS2)
|
||||||
|| type == cSource::stTerr && (frontendType & DVBFE_DELSYS_DVBT);
|
|| type == cSource::stTerr && (frontendType == SYS_DVBT);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const
|
bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const
|
||||||
@ -800,7 +838,7 @@ bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const
|
|||||||
return false; // doesn't provide source
|
return false; // doesn't provide source
|
||||||
if (!cSource::IsSat(Channel->Source()))
|
if (!cSource::IsSat(Channel->Source()))
|
||||||
return true; // source is sufficient for non sat
|
return true; // source is sufficient for non sat
|
||||||
if (!(frontendType & Channel->System()))
|
if (frontendType == SYS_DVBS && Channel->System() == SYS_DVBS2)
|
||||||
return false; // requires modulation system which frontend doesn't provide
|
return false; // requires modulation system which frontend doesn't provide
|
||||||
return !Setup.DiSEqC || Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization());
|
return !Setup.DiSEqC || Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization());
|
||||||
}
|
}
|
||||||
|
@ -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.2 2008/06/01 09:48:04 kls Exp $
|
* $Id: dvbdevice.h 2.3 2008/12/06 13:31:12 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DVBDEVICE_H
|
#ifndef __DVBDEVICE_H
|
||||||
@ -15,8 +15,8 @@
|
|||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "dvbspu.h"
|
#include "dvbspu.h"
|
||||||
|
|
||||||
#if DVB_API_VERSION != 3 || DVB_API_VERSION_MINOR != 3
|
#if DVB_API_VERSION != 5 || DVB_API_VERSION_MINOR != 0
|
||||||
#error VDR requires Linux DVB driver API version 3.3!
|
#error VDR requires Linux DVB driver API version 5.0!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAXDVBDEVICES 8
|
#define MAXDVBDEVICES 8
|
||||||
@ -35,8 +35,9 @@ public:
|
|||||||
///< Must be called before accessing any DVB functions.
|
///< Must be called before accessing any DVB functions.
|
||||||
///< \return True if any devices are available.
|
///< \return True if any devices are available.
|
||||||
private:
|
private:
|
||||||
dvbfe_delsys frontendType;
|
dvb_frontend_info frontendInfo;
|
||||||
int numProvidedSystems;
|
int numProvidedSystems;
|
||||||
|
fe_delivery_system frontendType;
|
||||||
int fd_osd, fd_audio, fd_video, fd_dvr, fd_stc, fd_ca;
|
int fd_osd, fd_audio, fd_video, fd_dvr, fd_stc, fd_ca;
|
||||||
protected:
|
protected:
|
||||||
virtual void MakePrimaryDevice(bool On);
|
virtual void MakePrimaryDevice(bool On);
|
||||||
|
4
menu.c
4
menu.c
@ -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.2 2008/05/01 14:37:24 kls Exp $
|
* $Id: menu.c 2.3 2008/11/22 15:18:00 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -252,8 +252,6 @@ void cMenuEditChannel::Setup(void)
|
|||||||
ST(" T") Add(new cMenuEditMapItem( tr("Transmission"), &data.transmission, TransmissionValues));
|
ST(" T") Add(new cMenuEditMapItem( tr("Transmission"), &data.transmission, TransmissionValues));
|
||||||
ST(" T") Add(new cMenuEditMapItem( tr("Guard"), &data.guard, GuardValues));
|
ST(" T") Add(new cMenuEditMapItem( tr("Guard"), &data.guard, GuardValues));
|
||||||
ST(" T") Add(new cMenuEditMapItem( tr("Hierarchy"), &data.hierarchy, HierarchyValues));
|
ST(" T") Add(new cMenuEditMapItem( tr("Hierarchy"), &data.hierarchy, HierarchyValues));
|
||||||
ST(" T") Add(new cMenuEditMapItem( tr("Alpha"), &data.alpha, AlphaValues));
|
|
||||||
ST(" T") Add(new cMenuEditMapItem( tr("Priority"), &data.priority, PriorityValues));
|
|
||||||
ST(" S ") Add(new cMenuEditMapItem( tr("Rolloff"), &data.rollOff, RollOffValues));
|
ST(" S ") Add(new cMenuEditMapItem( tr("Rolloff"), &data.rollOff, RollOffValues));
|
||||||
|
|
||||||
SetCurrent(Get(current));
|
SetCurrent(Get(current));
|
||||||
|
@ -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: menuitems.c 2.1 2008/04/12 12:05:25 kls Exp $
|
* $Id: menuitems.c 2.2 2008/12/13 11:35:31 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menuitems.h"
|
#include "menuitems.h"
|
||||||
@ -951,9 +951,7 @@ void cMenuEditMapItem::Set(void)
|
|||||||
{
|
{
|
||||||
const char *s = NULL;
|
const char *s = NULL;
|
||||||
int n = MapToUser(*value, map, &s);
|
int n = MapToUser(*value, map, &s);
|
||||||
if (n == 999)
|
if (n == 0 && zeroString)
|
||||||
SetValue(tr("auto"));
|
|
||||||
else if (n == 0 && zeroString)
|
|
||||||
SetValue(zeroString);
|
SetValue(zeroString);
|
||||||
else if (n >= 0) {
|
else if (n >= 0) {
|
||||||
if (s)
|
if (s)
|
||||||
|
37
nit.c
37
nit.c
@ -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: nit.c 2.1 2008/04/12 12:06:40 kls Exp $
|
* $Id: nit.c 2.2 2008/12/06 15:46:50 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nit.h"
|
#include "nit.h"
|
||||||
@ -127,13 +127,13 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 100;
|
int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 100;
|
||||||
static char Polarizations[] = { 'h', 'v', 'l', 'r' };
|
static char Polarizations[] = { 'h', 'v', 'l', 'r' };
|
||||||
char Polarization = Polarizations[sd->getPolarization()];
|
char Polarization = Polarizations[sd->getPolarization()];
|
||||||
static int CodeRates[] = { DVBFE_FEC_NONE, DVBFE_FEC_1_2, DVBFE_FEC_2_3, DVBFE_FEC_3_4, DVBFE_FEC_5_6, DVBFE_FEC_7_8, DVBFE_FEC_8_9, DVBFE_FEC_3_5, DVBFE_FEC_4_5, DVBFE_FEC_9_10, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_NONE };
|
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
|
||||||
int CodeRate = CodeRates[sd->getFecInner()];
|
int CodeRate = CodeRates[sd->getFecInner()];
|
||||||
static int Modulations[] = { DVBFE_MOD_AUTO, DVBFE_MOD_QPSK, DVBFE_MOD_8PSK, DVBFE_MOD_QAM16 };
|
static int Modulations[] = { QPSK, PSK_8, QAM_16 };
|
||||||
int Modulation = Modulations[sd->getModulationType()];
|
int Modulation = Modulations[sd->getModulationType()];
|
||||||
int System = sd->getModulationSystem() ? DVBFE_DELSYS_DVBS2 : DVBFE_DELSYS_DVBS;
|
int System = sd->getModulationSystem() ? SYS_DVBS2 : SYS_DVBS;
|
||||||
static int RollOffs[] = { DVBFE_ROLLOFF_35, DVBFE_ROLLOFF_25, DVBFE_ROLLOFF_20, DVBFE_ROLLOFF_UNKNOWN };
|
static int RollOffs[] = { ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_AUTO };
|
||||||
int RollOff = sd->getModulationSystem() ? RollOffs[sd->getRollOff()] : DVBFE_ROLLOFF_UNKNOWN;
|
int RollOff = sd->getModulationSystem() ? RollOffs[sd->getRollOff()] : ROLLOFF_AUTO;
|
||||||
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
|
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
|
||||||
if (ThisNIT >= 0) {
|
if (ThisNIT >= 0) {
|
||||||
for (int n = 0; n < NumFrequencies; n++) {
|
for (int n = 0; n < NumFrequencies; n++) {
|
||||||
@ -181,9 +181,9 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
int Source = cSource::FromData(cSource::stCable);
|
int Source = cSource::FromData(cSource::stCable);
|
||||||
int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 10;
|
int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 10;
|
||||||
//XXX FEC_outer???
|
//XXX FEC_outer???
|
||||||
static int CodeRates[] = { DVBFE_FEC_NONE, DVBFE_FEC_1_2, DVBFE_FEC_2_3, DVBFE_FEC_3_4, DVBFE_FEC_5_6, DVBFE_FEC_7_8, DVBFE_FEC_8_9, DVBFE_FEC_3_5, DVBFE_FEC_4_5, DVBFE_FEC_9_10, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_NONE };
|
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
|
||||||
int CodeRate = CodeRates[sd->getFecInner()];
|
int CodeRate = CodeRates[sd->getFecInner()];
|
||||||
static int Modulations[] = { DVBFE_MOD_NONE, DVBFE_MOD_QAM16, DVBFE_MOD_QAM32, DVBFE_MOD_QAM64, DVBFE_MOD_QAM128, DVBFE_MOD_QAM256, QAM_AUTO };
|
static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO };
|
||||||
int Modulation = Modulations[min(sd->getModulation(), 6)];
|
int Modulation = Modulations[min(sd->getModulation(), 6)];
|
||||||
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
|
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
|
||||||
if (ThisNIT >= 0) {
|
if (ThisNIT >= 0) {
|
||||||
@ -231,22 +231,19 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
SI::TerrestrialDeliverySystemDescriptor *sd = (SI::TerrestrialDeliverySystemDescriptor *)d;
|
SI::TerrestrialDeliverySystemDescriptor *sd = (SI::TerrestrialDeliverySystemDescriptor *)d;
|
||||||
int Source = cSource::FromData(cSource::stTerr);
|
int Source = cSource::FromData(cSource::stTerr);
|
||||||
int Frequency = Frequencies[0] = sd->getFrequency() * 10;
|
int Frequency = Frequencies[0] = sd->getFrequency() * 10;
|
||||||
static int Bandwidths[] = { DVBFE_BANDWIDTH_8_MHZ, DVBFE_BANDWIDTH_7_MHZ, DVBFE_BANDWIDTH_6_MHZ, DVBFE_BANDWIDTH_5_MHZ, DVBFE_BANDWIDTH_AUTO, DVBFE_BANDWIDTH_AUTO, DVBFE_BANDWIDTH_AUTO, DVBFE_BANDWIDTH_AUTO };
|
static int Bandwidths[] = { 8000000, 7000000, 6000000, 0, 0, 0, 0, 0 };
|
||||||
int Bandwidth = Bandwidths[sd->getBandwidth()];
|
int Bandwidth = Bandwidths[sd->getBandwidth()];
|
||||||
static int Constellations[] = { DVBFE_MOD_QPSK, DVBFE_MOD_QAM16, DVBFE_MOD_QAM64, DVBFE_MOD_AUTO };
|
static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
|
||||||
int Constellation = Constellations[sd->getConstellation()];
|
int Constellation = Constellations[sd->getConstellation()];
|
||||||
static int CodeRates[] = { DVBFE_FEC_1_2, DVBFE_FEC_2_3, DVBFE_FEC_3_4, DVBFE_FEC_5_6, DVBFE_FEC_7_8, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO, DVBFE_FEC_AUTO };
|
static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO };
|
||||||
|
int Hierarchy = Hierarchies[sd->getHierarchy()];
|
||||||
|
static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO };
|
||||||
int CodeRateHP = CodeRates[sd->getCodeRateHP()];
|
int CodeRateHP = CodeRates[sd->getCodeRateHP()];
|
||||||
int CodeRateLP = CodeRates[sd->getCodeRateLP()];
|
int CodeRateLP = CodeRates[sd->getCodeRateLP()];
|
||||||
static int GuardIntervals[] = { DVBFE_GUARD_INTERVAL_1_32, DVBFE_GUARD_INTERVAL_1_16, DVBFE_GUARD_INTERVAL_1_8, DVBFE_GUARD_INTERVAL_1_4 };
|
static int GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4 };
|
||||||
int GuardInterval = GuardIntervals[sd->getGuardInterval()];
|
int GuardInterval = GuardIntervals[sd->getGuardInterval()];
|
||||||
static int TransmissionModes[] = { DVBFE_TRANSMISSION_MODE_2K, DVBFE_TRANSMISSION_MODE_8K, DVBFE_TRANSMISSION_MODE_4K, DVBFE_TRANSMISSION_MODE_AUTO };
|
static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
|
||||||
int TransmissionMode = TransmissionModes[sd->getTransmissionMode()];
|
int TransmissionMode = TransmissionModes[sd->getTransmissionMode()];
|
||||||
static int Priorities[] = { DVBFE_STREAM_PRIORITY_LP, DVBFE_STREAM_PRIORITY_HP };
|
|
||||||
int Priority = Priorities[sd->getPriority()];
|
|
||||||
static int Alphas[] = { 0, DVBFE_ALPHA_1, DVBFE_ALPHA_2, DVBFE_ALPHA_4 };
|
|
||||||
int Alpha = Alphas[sd->getHierarchy() & 3];
|
|
||||||
int Hierarchy = Alpha ? DVBFE_HIERARCHY_ON : DVBFE_HIERARCHY_OFF;
|
|
||||||
if (ThisNIT >= 0) {
|
if (ThisNIT >= 0) {
|
||||||
for (int n = 0; n < NumFrequencies; n++) {
|
for (int n = 0; n < NumFrequencies; n++) {
|
||||||
if (ISTRANSPONDER(Frequencies[n] / 1000000, Transponder())) {
|
if (ISTRANSPONDER(Frequencies[n] / 1000000, Transponder())) {
|
||||||
@ -272,14 +269,14 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ISTRANSPONDER(Frequency / 1000000, Transponder())) // only modify channels if we're actually receiving this transponder
|
if (ISTRANSPONDER(Frequency / 1000000, Transponder())) // only modify channels if we're actually receiving this transponder
|
||||||
Channel->SetTerrTransponderData(Source, Frequency, Bandwidth, Constellation, Hierarchy, CodeRateHP, CodeRateLP, GuardInterval, TransmissionMode, Alpha, Priority);
|
Channel->SetTerrTransponderData(Source, Frequency, Bandwidth, Constellation, Hierarchy, CodeRateHP, CodeRateLP, GuardInterval, TransmissionMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
for (int n = 0; n < NumFrequencies; n++) {
|
for (int n = 0; n < NumFrequencies; n++) {
|
||||||
cChannel *Channel = new cChannel;
|
cChannel *Channel = new cChannel;
|
||||||
Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0);
|
Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0);
|
||||||
if (Channel->SetTerrTransponderData(Source, Frequencies[n], Bandwidth, Constellation, Hierarchy, CodeRateHP, CodeRateLP, GuardInterval, TransmissionMode, Alpha, Priority))
|
if (Channel->SetTerrTransponderData(Source, Frequencies[n], Bandwidth, Constellation, Hierarchy, CodeRateHP, CodeRateLP, GuardInterval, TransmissionMode))
|
||||||
EITScanner.AddTransponder(Channel);
|
EITScanner.AddTransponder(Channel);
|
||||||
else
|
else
|
||||||
delete Channel;
|
delete Channel;
|
||||||
|
16
vdr.5
16
vdr.5
@ -8,7 +8,7 @@
|
|||||||
.\" License as specified in the file COPYING that comes with the
|
.\" License as specified in the file COPYING that comes with the
|
||||||
.\" vdr distribution.
|
.\" vdr distribution.
|
||||||
.\"
|
.\"
|
||||||
.\" $Id: vdr.5 2.4 2008/07/06 13:00:19 kls Exp $
|
.\" $Id: vdr.5 2.5 2008/11/22 15:23:10 kls Exp $
|
||||||
.\"
|
.\"
|
||||||
.TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
|
.TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
@ -83,22 +83,20 @@ meaning (and allowed values) are
|
|||||||
.TS
|
.TS
|
||||||
tab (@);
|
tab (@);
|
||||||
l l.
|
l l.
|
||||||
\fBA\fR@Alpha (0, 1, 2, 4)
|
\fBB\fR@Bandwidth (6, 7, 8)
|
||||||
\fBB\fR@Bandwidth (5, 6, 7, 8)
|
\fBC\fR@Code rate high priority (0, 12, 23, 34, 35, 45, 56, 67, 78, 89, 910)
|
||||||
\fBC\fR@Code rate high priority (0, 12, 13, 14, 23, 25, 34, 35, 45, 56, 67, 78, 89, 910)
|
\fBD\fR@coDe rate low priority (0, 12, 23, 34, 35, 45, 56, 67, 78, 89, 910)
|
||||||
\fBD\fR@coDe rate low priority (0, 12, 13, 14, 23, 25, 34, 35, 45, 56, 67, 78, 89, 910)
|
|
||||||
\fBG\fR@Guard interval (4, 8, 16, 32)
|
\fBG\fR@Guard interval (4, 8, 16, 32)
|
||||||
\fBH\fR@Horizontal polarization
|
\fBH\fR@Horizontal polarization
|
||||||
\fBI\fR@Inversion (0, 1)
|
\fBI\fR@Inversion (0, 1)
|
||||||
\fBL\fR@Left circular polarization
|
\fBL\fR@Left circular polarization
|
||||||
\fBM\fR@Modulation (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 16, 32, 64, 128, 256, 512, 998, 1024)
|
\fBM\fR@Modulation (2, 5, 6, 10, 11, 16, 32, 64, 128, 256, 998)
|
||||||
\fBO\fR@rollOff (0, 20, 25, 35)
|
\fBO\fR@rollOff (0, 20, 25, 35)
|
||||||
\fBP\fR@Priority (0, 1)
|
|
||||||
\fBR\fR@Right circular polarization
|
\fBR\fR@Right circular polarization
|
||||||
\fBS\fR@delivery System (0, 1)
|
\fBS\fR@delivery System (0, 1)
|
||||||
\fBT\fR@Transmission mode (2, 4, 8)
|
\fBT\fR@Transmission mode (2, 8)
|
||||||
\fBV\fR@Vertical polarization
|
\fBV\fR@Vertical polarization
|
||||||
\fBY\fR@hierarchY (0, 1)
|
\fBY\fR@hierarchY (0, 1, 2, 4)
|
||||||
.TE
|
.TE
|
||||||
|
|
||||||
The polarization parameters have no integer numbers following them. This is for
|
The polarization parameters have no integer numbers following them. This is for
|
||||||
|
Loading…
Reference in New Issue
Block a user