mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-12-27 07:11:05 +01:00
Re-implemented handling of DVB-S2
This commit is contained in:
218
channels.c
218
channels.c
@@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: channels.c 1.60 2008/03/05 16:42:50 kls Exp $
|
||||
* $Id: channels.c 2.1 2008/04/12 11:02:40 kls Exp $
|
||||
*/
|
||||
|
||||
#include "channels.h"
|
||||
@@ -21,67 +21,114 @@
|
||||
// --- Channel Parameter Maps ------------------------------------------------
|
||||
|
||||
const tChannelParameterMap InversionValues[] = {
|
||||
{ 0, INVERSION_OFF },
|
||||
{ 1, INVERSION_ON },
|
||||
{ 999, INVERSION_AUTO },
|
||||
{ 0, DVBFE_INVERSION_OFF, trNOOP("off") },
|
||||
{ 1, DVBFE_INVERSION_ON, trNOOP("on") },
|
||||
{ 999, DVBFE_INVERSION_AUTO },
|
||||
{ -1 }
|
||||
};
|
||||
|
||||
const tChannelParameterMap BandwidthValues[] = {
|
||||
{ 6, BANDWIDTH_6_MHZ },
|
||||
{ 7, BANDWIDTH_7_MHZ },
|
||||
{ 8, BANDWIDTH_8_MHZ },
|
||||
{ 999, BANDWIDTH_AUTO },
|
||||
{ 5, DVBFE_BANDWIDTH_5_MHZ, "5 MHz" },
|
||||
{ 6, DVBFE_BANDWIDTH_6_MHZ, "6 MHz" },
|
||||
{ 7, DVBFE_BANDWIDTH_7_MHZ, "7 MHz" },
|
||||
{ 8, DVBFE_BANDWIDTH_8_MHZ, "8 MHz" },
|
||||
{ 999, DVBFE_BANDWIDTH_AUTO },
|
||||
{ -1 }
|
||||
};
|
||||
|
||||
const tChannelParameterMap CoderateValues[] = {
|
||||
{ 0, FEC_NONE },
|
||||
{ 12, FEC_1_2 },
|
||||
{ 23, FEC_2_3 },
|
||||
{ 34, FEC_3_4 },
|
||||
{ 45, FEC_4_5 },
|
||||
{ 56, FEC_5_6 },
|
||||
{ 67, FEC_6_7 },
|
||||
{ 78, FEC_7_8 },
|
||||
{ 89, FEC_8_9 },
|
||||
{ 999, FEC_AUTO },
|
||||
{ 0, DVBFE_FEC_NONE, trNOOP("none") },
|
||||
{ 12, DVBFE_FEC_1_2, "1/2" },
|
||||
{ 13, DVBFE_FEC_1_3, "1/3" },
|
||||
{ 14, DVBFE_FEC_1_4, "1/4" },
|
||||
{ 23, DVBFE_FEC_2_3, "2/3" },
|
||||
{ 25, DVBFE_FEC_2_5, "2/5" },
|
||||
{ 34, DVBFE_FEC_3_4, "3/4" },
|
||||
{ 35, DVBFE_FEC_3_5, "3/5" },
|
||||
{ 45, DVBFE_FEC_4_5, "4/5" },
|
||||
{ 56, DVBFE_FEC_5_6, "5/6" },
|
||||
{ 67, DVBFE_FEC_6_7, "6/7" },
|
||||
{ 78, DVBFE_FEC_7_8, "7/8" },
|
||||
{ 89, DVBFE_FEC_8_9, "8/9" },
|
||||
{ 910, DVBFE_FEC_9_10, "9/10" },
|
||||
{ 999, DVBFE_FEC_AUTO },
|
||||
{ -1 }
|
||||
};
|
||||
|
||||
const tChannelParameterMap ModulationValues[] = {
|
||||
{ 0, QPSK },
|
||||
{ 16, QAM_16 },
|
||||
{ 32, QAM_32 },
|
||||
{ 64, QAM_64 },
|
||||
{ 128, QAM_128 },
|
||||
{ 256, QAM_256 },
|
||||
{ 999, QAM_AUTO },
|
||||
{ 0, DVBFE_MOD_NONE, trNOOP("none") },
|
||||
{ 4, DVBFE_MOD_QAM4, "QAM4" },
|
||||
{ 16, DVBFE_MOD_QAM16, "QAM16" },
|
||||
{ 32, DVBFE_MOD_QAM32, "QAM32" },
|
||||
{ 64, DVBFE_MOD_QAM64, "QAM64" },
|
||||
{ 128, DVBFE_MOD_QAM128, "QAM128" },
|
||||
{ 256, DVBFE_MOD_QAM256, "QAM256" },
|
||||
{ 512, DVBFE_MOD_QAM512, "QAM512" },
|
||||
{1024, DVBFE_MOD_QAM1024, "QAM1024" },
|
||||
{ 1, DVBFE_MOD_BPSK, "BPSK" },
|
||||
{ 2, DVBFE_MOD_QPSK, "QPSK" },
|
||||
{ 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 }
|
||||
};
|
||||
|
||||
const tChannelParameterMap SystemValues[] = {
|
||||
{ 0, DVBFE_DELSYS_DVBS, "DVB-S" },
|
||||
{ 1, DVBFE_DELSYS_DVBS2, "DVB-S2" },
|
||||
{ -1 }
|
||||
};
|
||||
|
||||
const tChannelParameterMap TransmissionValues[] = {
|
||||
{ 2, TRANSMISSION_MODE_2K },
|
||||
{ 8, TRANSMISSION_MODE_8K },
|
||||
{ 999, TRANSMISSION_MODE_AUTO },
|
||||
{ 2, DVBFE_TRANSMISSION_MODE_2K, "2K" },
|
||||
{ 4, DVBFE_TRANSMISSION_MODE_4K, "4K" },
|
||||
{ 8, DVBFE_TRANSMISSION_MODE_8K, "8K" },
|
||||
{ 999, DVBFE_TRANSMISSION_MODE_AUTO },
|
||||
{ -1 }
|
||||
};
|
||||
|
||||
const tChannelParameterMap GuardValues[] = {
|
||||
{ 4, GUARD_INTERVAL_1_4 },
|
||||
{ 8, GUARD_INTERVAL_1_8 },
|
||||
{ 16, GUARD_INTERVAL_1_16 },
|
||||
{ 32, GUARD_INTERVAL_1_32 },
|
||||
{ 999, GUARD_INTERVAL_AUTO },
|
||||
{ 4, DVBFE_GUARD_INTERVAL_1_4, "1/4" },
|
||||
{ 8, DVBFE_GUARD_INTERVAL_1_8, "1/8" },
|
||||
{ 16, DVBFE_GUARD_INTERVAL_1_16, "1/16" },
|
||||
{ 32, DVBFE_GUARD_INTERVAL_1_32, "1/32" },
|
||||
{ 999, DVBFE_GUARD_INTERVAL_AUTO },
|
||||
{ -1 }
|
||||
};
|
||||
|
||||
const tChannelParameterMap HierarchyValues[] = {
|
||||
{ 0, HIERARCHY_NONE },
|
||||
{ 1, HIERARCHY_1 },
|
||||
{ 2, HIERARCHY_2 },
|
||||
{ 4, HIERARCHY_4 },
|
||||
{ 999, HIERARCHY_AUTO },
|
||||
{ 0, DVBFE_HIERARCHY_OFF, trNOOP("off") },
|
||||
{ 1, DVBFE_HIERARCHY_ON, trNOOP("on") },
|
||||
{ 999, DVBFE_HIERARCHY_AUTO },
|
||||
{ -1 }
|
||||
};
|
||||
|
||||
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 }
|
||||
};
|
||||
|
||||
const tChannelParameterMap RollOffValues[] = {
|
||||
{ 0, DVBFE_ROLLOFF_UNKNOWN },
|
||||
{ 20, DVBFE_ROLLOFF_20, "0.20" },
|
||||
{ 25, DVBFE_ROLLOFF_25, "0.25" },
|
||||
{ 35, DVBFE_ROLLOFF_35, "0.35" },
|
||||
{ -1 }
|
||||
};
|
||||
|
||||
@@ -107,11 +154,14 @@ int DriverIndex(int Value, const tChannelParameterMap *Map)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int MapToUser(int Value, const tChannelParameterMap *Map)
|
||||
int MapToUser(int Value, const tChannelParameterMap *Map, const char **String)
|
||||
{
|
||||
int n = DriverIndex(Value, Map);
|
||||
if (n >= 0)
|
||||
if (n >= 0) {
|
||||
if (String)
|
||||
*String = tr(Map[n].userString);
|
||||
return Map[n].userValue;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -167,14 +217,18 @@ cChannel::cChannel(void)
|
||||
provider = strdup("");
|
||||
portalName = strdup("");
|
||||
memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__);
|
||||
inversion = INVERSION_AUTO;
|
||||
bandwidth = BANDWIDTH_AUTO;
|
||||
coderateH = FEC_AUTO;
|
||||
coderateL = FEC_AUTO;
|
||||
modulation = QAM_AUTO;
|
||||
transmission = TRANSMISSION_MODE_AUTO;
|
||||
guard = GUARD_INTERVAL_AUTO;
|
||||
hierarchy = HIERARCHY_AUTO;
|
||||
inversion = DVBFE_INVERSION_AUTO;
|
||||
bandwidth = DVBFE_BANDWIDTH_AUTO;
|
||||
coderateH = DVBFE_FEC_AUTO;
|
||||
coderateL = DVBFE_FEC_AUTO;
|
||||
modulation = DVBFE_MOD_AUTO;
|
||||
system = DVBFE_DELSYS_DVBS;
|
||||
transmission = DVBFE_TRANSMISSION_MODE_AUTO;
|
||||
guard = DVBFE_GUARD_INTERVAL_AUTO;
|
||||
hierarchy = DVBFE_HIERARCHY_AUTO;
|
||||
alpha = 0;
|
||||
priority = DVBFE_STREAM_PRIORITY_HP;
|
||||
rollOff = DVBFE_ROLLOFF_UNKNOWN;
|
||||
modification = CHANNELMOD_NONE;
|
||||
schedule = NULL;
|
||||
linkChannels = NULL;
|
||||
@@ -277,13 +331,17 @@ void cChannel::CopyTransponderData(const cChannel *Channel)
|
||||
coderateH = Channel->coderateH;
|
||||
coderateL = Channel->coderateL;
|
||||
modulation = Channel->modulation;
|
||||
system = Channel->system;
|
||||
transmission = Channel->transmission;
|
||||
guard = Channel->guard;
|
||||
hierarchy = Channel->hierarchy;
|
||||
alpha = Channel->alpha;
|
||||
priority = Channel->priority;
|
||||
rollOff = Channel->rollOff;
|
||||
}
|
||||
}
|
||||
|
||||
bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH)
|
||||
bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH, int Modulation, int System, int RollOff)
|
||||
{
|
||||
// Workarounds for broadcaster stupidity:
|
||||
// Some providers broadcast the transponder frequency of their channels with two different
|
||||
@@ -297,19 +355,22 @@ bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarizatio
|
||||
if (abs(srate - Srate) <= 1)
|
||||
Srate = srate;
|
||||
|
||||
if (source != Source || frequency != Frequency || polarization != Polarization || srate != Srate || coderateH != CoderateH) {
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%c:%d:%d to %s:%d:%c:%d:%d", Number(), *cSource::ToString(source), frequency, polarization, srate, coderateH, *cSource::ToString(Source), Frequency, Polarization, Srate, CoderateH);
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
if (source != Source || frequency != Frequency || polarization != Polarization || srate != Srate || coderateH != CoderateH || modulation != Modulation || system != System || rollOff != RollOff) {
|
||||
cString OldParameters = ParametersToString();
|
||||
source = Source;
|
||||
frequency = Frequency;
|
||||
polarization = Polarization;
|
||||
srate = Srate;
|
||||
coderateH = CoderateH;
|
||||
modulation = QPSK;
|
||||
modulation = Modulation;
|
||||
system = System;
|
||||
rollOff = RollOff;
|
||||
schedule = NULL;
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %d:%s:%s:%d to %d:%s:%s:%d", Number(), frequency, *OldParameters, *cSource::ToString(source), srate, Frequency, *ParametersToString(), *cSource::ToString(Source), Srate);
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -317,29 +378,26 @@ bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarizatio
|
||||
bool cChannel::SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH)
|
||||
{
|
||||
if (source != Source || frequency != Frequency || modulation != Modulation || srate != Srate || coderateH != CoderateH) {
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%d:%d:%d to %s:%d:%d:%d:%d", Number(), *cSource::ToString(source), frequency, modulation, srate, coderateH, *cSource::ToString(Source), Frequency, Modulation, Srate, CoderateH);
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
cString OldParameters = ParametersToString();
|
||||
source = Source;
|
||||
frequency = Frequency;
|
||||
modulation = Modulation;
|
||||
srate = Srate;
|
||||
coderateH = CoderateH;
|
||||
schedule = NULL;
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %d:%s:%s:%d to %d:%s:%s:%d", Number(), frequency, *OldParameters, *cSource::ToString(source), srate, Frequency, *ParametersToString(), *cSource::ToString(Source), Srate);
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CoderateH, int CoderateL, int Guard, int Transmission)
|
||||
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)
|
||||
{
|
||||
if (source != Source || frequency != Frequency || bandwidth != Bandwidth || modulation != Modulation || hierarchy != Hierarchy || coderateH != CoderateH || coderateL != CoderateL || guard != Guard || transmission != Transmission) {
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %s:%d:%d:%d:%d:%d:%d:%d:%d to %s:%d:%d:%d:%d:%d:%d:%d:%d", Number(), *cSource::ToString(source), frequency, bandwidth, modulation, hierarchy, coderateH, coderateL, guard, transmission, *cSource::ToString(Source), Frequency, Bandwidth, Modulation, Hierarchy, CoderateH, CoderateL, Guard, Transmission);
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
if (source != Source || frequency != Frequency || bandwidth != Bandwidth || modulation != Modulation || hierarchy != Hierarchy || coderateH != CoderateH || coderateL != CoderateL || guard != Guard || transmission != Transmission || alpha != Alpha || priority != Priority) {
|
||||
cString OldParameters = ParametersToString();
|
||||
source = Source;
|
||||
frequency = Frequency;
|
||||
bandwidth = Bandwidth;
|
||||
@@ -349,7 +407,14 @@ bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth,
|
||||
coderateL = CoderateL;
|
||||
guard = Guard;
|
||||
transmission = Transmission;
|
||||
alpha = Alpha;
|
||||
priority = Priority;
|
||||
schedule = NULL;
|
||||
if (Number()) {
|
||||
dsyslog("changing transponder data of channel %d from %d:%s:%s to %d:%s:%s", Number(), frequency, *OldParameters, *cSource::ToString(source), Frequency, *ParametersToString(), *cSource::ToString(Source));
|
||||
modification |= CHANNELMOD_TRANSP;
|
||||
Channels.SetModified();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -597,13 +662,17 @@ cString cChannel::ParametersToString(void) const
|
||||
char *q = buffer;
|
||||
*q = 0;
|
||||
ST(" S ") q += sprintf(q, "%c", polarization);
|
||||
ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
|
||||
ST(" T") q += PrintParameter(q, 'A', MapToUser(alpha, AlphaValues));
|
||||
ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
|
||||
ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
|
||||
ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
|
||||
ST("C T") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
|
||||
ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
|
||||
ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
|
||||
ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues));
|
||||
ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
|
||||
ST("CST") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
|
||||
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(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
|
||||
ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
|
||||
return buffer;
|
||||
}
|
||||
@@ -628,6 +697,7 @@ bool cChannel::StringToParameters(const char *s)
|
||||
{
|
||||
while (s && *s) {
|
||||
switch (toupper(*s)) {
|
||||
case 'A': s = ParseParameter(s, alpha, AlphaValues); break;
|
||||
case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break;
|
||||
case 'C': s = ParseParameter(s, coderateH, CoderateValues); break;
|
||||
case 'D': s = ParseParameter(s, coderateL, CoderateValues); break;
|
||||
@@ -636,7 +706,11 @@ bool cChannel::StringToParameters(const char *s)
|
||||
case 'I': s = ParseParameter(s, inversion, InversionValues); break;
|
||||
case 'L': polarization = *s++; 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 'P': s = ParseParameter(s, priority, PriorityValues); break;
|
||||
case 'R': polarization = *s++; break;
|
||||
case 'S': s = ParseParameter(s, system, SystemValues); break;
|
||||
case 'T': s = ParseParameter(s, transmission, TransmissionValues); break;
|
||||
case 'V': polarization = *s++; break;
|
||||
case 'Y': s = ParseParameter(s, hierarchy, HierarchyValues); break;
|
||||
|
||||
Reference in New Issue
Block a user