summaryrefslogtreecommitdiff
path: root/channels.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2008-01-27 14:35:54 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2008-01-27 14:35:54 +0100
commitd0af2f90e75ba5b87542ff3ad0a6fb7b960d1e97 (patch)
tree7059b1853dca128451bedad070125478568ddb6e /channels.c
parentf8274a9a9f45d69114803cf47c339f54ba5d7b9e (diff)
downloadvdr-d0af2f90e75ba5b87542ff3ad0a6fb7b960d1e97.tar.gz
vdr-d0af2f90e75ba5b87542ff3ad0a6fb7b960d1e97.tar.bz2
Implemented handling of DVB-S2
Diffstat (limited to 'channels.c')
-rw-r--r--channels.c218
1 files changed, 146 insertions, 72 deletions
diff --git a/channels.c b/channels.c
index b01bb931..dd1967f1 100644
--- a/channels.c
+++ b/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.55 2007/10/12 14:40:53 kls Exp $
+ * $Id: channels.c 1.56 2008/01/27 13:59:53 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;