if (line[1]=='s')
{
eDVBFrontendParametersSatellite sat;
- int frequency, symbol_rate, polarisation, fec, orbital_position, inversion;
- sscanf(line+2, "%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion);
+ int frequency, symbol_rate, polarisation, fec, orbital_position, inversion,
+ system=eDVBFrontendParametersSatellite::System::DVB_S,
+ modulation=eDVBFrontendParametersSatellite::Modulation::QPSK,
+ rolloff=eDVBFrontendParametersSatellite::RollOff::alpha_auto;
+ sscanf(line+2, "%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &system, &modulation, &rolloff);
sat.frequency = frequency;
sat.symbol_rate = symbol_rate;
sat.polarisation = polarisation;
sat.orbital_position =
orbital_position < 0 ? orbital_position + 3600 : orbital_position;
sat.inversion = inversion;
+ sat.system = system;
+ sat.modulation = modulation;
+ sat.roll_off = rolloff;
feparm->setDVBS(sat);
} else if (line[1]=='t')
{
eDVBFrontendParametersCable cab;
if (!ch.m_frontendParameters->getDVBS(sat))
{
- fprintf(f, "\ts %d:%d:%d:%d:%d:%d\n",
- sat.frequency, sat.symbol_rate,
- sat.polarisation, sat.fec,
- sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
- sat.inversion);
+ if (sat.system == eDVBFrontendParametersSatellite::System::DVB_S2)
+ {
+ fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d:%d:%d\n",
+ sat.frequency, sat.symbol_rate,
+ sat.polarisation, sat.fec,
+ sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
+ sat.inversion,
+ sat.system,
+ sat.modulation,
+ sat.roll_off);
+ }
+ else
+ {
+ fprintf(f, "\ts %d:%d:%d:%d:%d:%d\n",
+ sat.frequency, sat.symbol_rate,
+ sat.polarisation, sat.fec,
+ sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
+ sat.inversion);
+ }
}
if (!ch.m_frontendParameters->getDVBT(ter))
{
#define parm_u_ofdm_transmission_mode parm.u.ofdm.transmission_mode
#define parm_u_ofdm_guard_interval parm.u.ofdm.guard_interval
#define parm_u_ofdm_hierarchy_information parm.u.ofdm.hierarchy_information
+#ifdef FEC_9_10
+ #warning "FEC_9_10 already exist in dvb api ... it seems it is now ready for DVB-S2"
+#else
+ #define FEC_9_10 FEC_AUTO+1
+#endif
#endif
#include <dvbsi++/satellite_delivery_system_descriptor.h>
symbol_rate = descriptor.getSymbolRate() * 100;
polarisation = descriptor.getPolarization();
fec = descriptor.getFecInner();
- if ( fec == 0xF )
- fec = FEC::fNone;
+ if ( fec != FEC::fNone && fec > FEC::f9_10 )
+ fec = FEC::fAuto;
inversion = Inversion::Unknown;
orbital_position = ((descriptor.getOrbitalPosition() >> 12) & 0xF) * 1000;
orbital_position += ((descriptor.getOrbitalPosition() >> 8) & 0xF) * 100;
orbital_position += ((descriptor.getOrbitalPosition()) & 0xF);
if (orbital_position && (!descriptor.getWestEastFlag()))
orbital_position = 3600 - orbital_position;
- eDebug("SAT freq %d, %s, pos %d, sr %d, fec %d",
- frequency,
- polarisation ? "hor" : "vert",
- orbital_position,
- symbol_rate, fec);
+ system = descriptor.getModulationSystem();
+ modulation = descriptor.getModulation();
+ if (system == System::DVB_S && modulation == Modulation::M8PSK)
+ {
+ eDebug("satellite_delivery_descriptor non valid modulation type.. force QPSK");
+ modulation=QPSK;
+ }
+ roll_off = descriptor.getRollOff();
+ if (system == System::DVB_S2)
+ {
+ eDebug("SAT DVB-S2 freq %d, %s, pos %d, sr %d, fec %d, modulation %d, roll_off %d",
+ frequency,
+ polarisation ? "hor" : "vert",
+ orbital_position,
+ symbol_rate, fec,
+ modulation,
+ roll_off);
+ }
+ else
+ {
+ eDebug("SAT DVB-S freq %d, %s, pos %d, sr %d, fec %d",
+ frequency,
+ polarisation ? "hor" : "vert",
+ orbital_position,
+ symbol_rate, fec);
+ }
}
void eDVBFrontendParametersCable::set(const CableDeliverySystemDescriptor &descriptor)
switch (feparm.fec)
{
default:
- case eDVBFrontendParametersSatellite::FEC::fNone:
- eDebug("no fec set.. assume auto");
+ eDebug("no valid fec set.. assume auto");
case eDVBFrontendParametersSatellite::FEC::fAuto:
parm_u_qpsk_fec_inner = FEC_AUTO;
break;
+ case eDVBFrontendParametersSatellite::FEC::fNone:
+ parm_u_qpsk_fec_inner = FEC_NONE;
case eDVBFrontendParametersSatellite::FEC::f1_2:
parm_u_qpsk_fec_inner = FEC_1_2;
break;
case eDVBFrontendParametersSatellite::FEC::f7_8:
parm_u_qpsk_fec_inner = FEC_7_8;
break;
+#if HAVE_DVB_API_VERSION >= 3
+ case eDVBFrontendParametersSatellite::FEC::f9_10:
+ parm_u_qpsk_fec_inner = FEC_9_10;
+ break;
+#endif
}
// FIXME !!! get frequency range from tuner
if ( parm_frequency < 900000 || parm_frequency > 2200000 )
struct FEC
{
enum {
- fAuto, f1_2, f2_3, f3_4, f5_6, f7_8, f8_9, fNone=15
+ fAuto, f1_2, f2_3, f3_4, f5_6, f7_8, f8_9, f3_5, f4_5, f9_10, fNone=15
+ };
+ };
+ struct System
+ {
+ enum {
+ DVB_S, DVB_S2
+ };
+ };
+ struct Modulation
+ {
+ enum {
+ Auto, QPSK, M8PSK, QAM_16
+ };
+ };
+ struct RollOff // dvb-s2
+ {
+ enum {
+ alpha_0_35, alpha_0_25, alpha_0_20, alpha_auto
};
};
bool no_rotor_command_on_tune;
unsigned int frequency, symbol_rate;
- int polarisation, fec, inversion, orbital_position;
+ int polarisation, fec, inversion, orbital_position, system, modulation, roll_off;
};
struct eDVBFrontendParametersCable