Det verkar fungera att patcha en lite äldre SVN rev. Har dock inget DVB-S2 kort att testa med än. Håller bara på och testar lite inför köpet. Japp det blir väldigt go bild med HD. Enda anledningen jag överväger att byta till satellit från marknätet.
Jag läste någonstans att scanningen var väldigt instabil och i bästa fall fungerade 1 av 3 gånger. Så det är möjligt att det funkar bättre att importera channels.conf
Hittade även denna patch. Tror inte det skiljer så mycket. Men kan ju finnas något som gör skillnad.
Index: libs/libmythtv/dvbtypes.h
===================================================================
--- libs/libmythtv/dvbtypes.h (revision 15223)
+++ libs/libmythtv/dvbtypes.h (working copy)
@@ -39,9 +39,21 @@
# define VSB_16 (fe_modulation)(QAM_AUTO+2)
#endif
+// Use Multiproto API for hybrid DVB-S / DVB-S2 cards
+// [url="http://jusst.de/hg/multiproto"]http://jusst.de/hg/multiproto[/url]
+#if (DVB_API_VERSION >= 3 && DVB_API_VERSION_MINOR >= 3)
+# define DVB_API_MULTIPROTO
+#endif
+
#ifdef FE_GET_EXTENDED_INFO
#define dvb_fe_params dvb_frontend_parameters_new
-#else
+#endif
+
+#ifdef DVB_API_MULTIPROTO
+ #define dvb_fe_params dvbfe_params
+#endif
+
+#ifndef dvb_fe_params
#define dvb_fe_params dvb_frontend_parameters
#endif
Index: libs/libmythtv/dvbchannel.cpp
===================================================================
--- libs/libmythtv/dvbchannel.cpp (revision 15223)
+++ libs/libmythtv/dvbchannel.cpp (working copy)
@@ -126,6 +126,27 @@
return false;
}
+#ifdef DVB_API_MULTIPROTO
+ dvbfe_info info;
+ bzero(&info, sizeof(info));
+
+ // TODO This silently assumes DVB-S
+ info.delivery = DVBFE_DELSYS_DVBS;
+
+ if (ioctl(fd_frontend, DVBFE_GET_INFO, &info) < 0)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR +
+ "Failed to get frontend information for DVB-S frontend." + ENO);
+
+ close(fd_frontend);
+ fd_frontend = -1;
+ return false;
+ }
+
+ VERBOSE(VB_GENERAL, LOC_ERR +
+ "Frontend information for DVB-S frontend successfully retrieved.");
+
+#else // DVB_API_MULTIPROTO
dvb_frontend_info info;
bzero(&info, sizeof(info));
if (ioctl(fd_frontend, FE_GET_INFO, &info) < 0)
@@ -180,10 +201,49 @@
ext_modulations = extinfo.modulations;
}
#endif
-
+#endif //DVB_API_MULTIPROTO
+
frontend_name = info.name;
+#ifdef DVB_API_MULTIPROTO
+ // TODO This sets the frontend to DVB-S
+ card_type = FE_QPSK;
+ capabilities = 0;
+
+ // Translate the new capabilities bitfields to the old one
+ dvbfe_modulation m;
+ m = info.delsys.dvbs.modulation;
+
+ if (m & DVBFE_MOD_QPSK) { capabilities |= FE_CAN_QPSK; }
+ if (m & DVBFE_MOD_QAM16) { capabilities |= FE_CAN_QAM_16; }
+ if (m & DVBFE_MOD_QAM32) { capabilities |= FE_CAN_QAM_32; }
+ if (m & DVBFE_MOD_QAM64) { capabilities |= FE_CAN_QAM_64; }
+ if (m & DVBFE_MOD_QAM128) { capabilities |= FE_CAN_QAM_128; }
+ if (m & DVBFE_MOD_QAM256) { capabilities |= FE_CAN_QAM_256; }
+ if (m & DVBFE_MOD_QAMAUTO) { capabilities |= FE_CAN_QAM_AUTO; }
+ // Note: not all modulations from the new bitfield can be represented in the old one
+
+ dvbfe_fec f;
+ f = info.delsys.dvbs.fec;
+
+ if (f & DVBFE_FEC_1_2) { capabilities |= FE_CAN_FEC_1_2; }
+ if (f & DVBFE_FEC_2_3) { capabilities |= FE_CAN_FEC_2_3; }
+ if (f & DVBFE_FEC_3_4) { capabilities |= FE_CAN_FEC_3_4; }
+ if (f & DVBFE_FEC_4_5) { capabilities |= FE_CAN_FEC_4_5; }
+ if (f & DVBFE_FEC_5_6) { capabilities |= FE_CAN_FEC_5_6; }
+ if (f & DVBFE_FEC_6_7) { capabilities |= FE_CAN_FEC_6_7; }
+ if (f & DVBFE_FEC_7_8) { capabilities |= FE_CAN_FEC_7_8; }
+ if (f & DVBFE_FEC_8_9) { capabilities |= FE_CAN_FEC_8_9; }
+ if (f & DVBFE_FEC_AUTO) { capabilities |= FE_CAN_FEC_AUTO; }
+ // Note: not all fec's from the new bitfield can be represented in the old one
+
+ fe_spectral_inversion_t i;
+ i = info.inversion;
+ if (i & INVERSION_AUTO) { capabilities |= FE_CAN_INVERSION_AUTO; }
+
+#else
card_type = info.type;
capabilities = info.caps;
+#endif
frequency_minimum = info.frequency_min;
frequency_maximum = info.frequency_max;
symbol_rate_minimum = info.symbol_rate_min;
@@ -629,7 +689,13 @@
// if card can auto-FEC, use it -- sometimes NITs are inaccurate
if (capabilities & FE_CAN_FEC_AUTO)
+#ifdef DVB_API_MULTIPROTO
+ // TODO This silently assumes DVB-S
+ params.delsys.dvbs.fec = DVBFE_FEC_AUTO;
+ VERBOSE(VB_CHANNEL, LOC + "Using DVBFE_FEC_AUTO");
+#else
params.u.qpsk.fec_inner = FEC_AUTO;
+#endif
}
VERBOSE(VB_CHANNEL, LOC + "Old Params: " +
@@ -649,7 +715,11 @@
#ifdef FE_GET_EXTENDED_INFO
if (card_type == DTVTunerType::kTunerTypeDVB_S2)
{
+#ifdef DVB_API_MULTIPROTO
+ if (ioctl(fd_frontend, DVBFE_SET_PARAMS, ¶ms) < 0)
+#else
if (ioctl(fd_frontend, FE_SET_FRONTEND2, ¶ms) < 0)
+#endif
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
"Setting Frontend(2) tuning parameters failed." + ENO);
@@ -659,7 +729,11 @@
else
#endif // FE_GET_EXTENDED_INFO
{
+#ifdef DVB_API_MULTIPROTO
+ if (ioctl(fd_frontend, DVBFE_SET_PARAMS, ¶ms) < 0)
+#else
if (ioctl(fd_frontend, FE_SET_FRONTEND, ¶ms) < 0)
+#endif
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
"Setting Frontend tuning parameters failed." + ENO);
@@ -882,20 +956,56 @@
bzero(¶ms, sizeof(params));
params.frequency = tuning.frequency;
+
+ // TODO This could be cleaner and nicer
+#ifdef DVB_API_MULTIPROTO
+ params.inversion = (dvbfe_inversion) (int) tuning.inversion;
+#else
params.inversion = (fe_spectral_inversion_t) (int) tuning.inversion;
-
+#endif
+
if (DTVTunerType::kTunerTypeQPSK == tuner_type)
{
+#ifdef DVB_API_MULTIPROTO
+ //params.delivery = DVBFE_DELSYS_DVBS;
+ params.delsys.dvbs.symbol_rate = tuning.symbolrate;
+
+ // Convert old fec to new fec
+ int oldfec;
+ dvbfe_fec newfec = DVBFE_FEC_AUTO;
+ oldfec = (int) tuning.fec;
+
+ if (oldfec == FEC_1_2) { newfec = DVBFE_FEC_1_2; }
+ if (oldfec == FEC_2_3) { newfec = DVBFE_FEC_2_3; }
+ if (oldfec == FEC_3_4) { newfec = DVBFE_FEC_3_4; }
+ if (oldfec == FEC_4_5) { newfec = DVBFE_FEC_4_5; }
+ if (oldfec == FEC_5_6) { newfec = DVBFE_FEC_5_6; }
+ if (oldfec == FEC_6_7) { newfec = DVBFE_FEC_6_7; }
+ if (oldfec == FEC_7_8) { newfec = DVBFE_FEC_7_8; }
+ if (oldfec == FEC_8_9) { newfec = DVBFE_FEC_8_9; }
+ if (oldfec == FEC_AUTO) { newfec = DVBFE_FEC_AUTO; }
+ if (oldfec == FEC_NONE) { newfec = DVBFE_FEC_NONE; }
+
+ params.delsys.dvbs.fec = newfec;
+#else
params.u.qpsk.symbol_rate = tuning.symbolrate;
params.u.qpsk.fec_inner = (fe_code_rate_t) (int) tuning.fec;
+#endif
}
if (DTVTunerType::kTunerTypeDVB_S2 == tuner_type)
{
#ifdef FE_GET_EXTENDED_INFO
+#ifdef DVB_API_MULTIPROTO
+ //params.delivery = DVBFE_DELSYS_DVBS2;
+ params.delsys.dvbs2.symbol_rate = tuning.symbolrate;
+ params.delsys.dvbs2.fec = (dvbfe_fec) (int) tuning.fec;
+ params.delsys.dvbs2.modulation = (dvbfe_modulation) (int) tuning.modulation;
+#else
params.u.qpsk2.symbol_rate = tuning.symbolrate;
params.u.qpsk2.fec_inner = (fe_code_rate_t) (int) tuning.fec;
params.u.qpsk2.modulation = (fe_modulation_t) (int) tuning.modulation;
+#endif // DVB_API_MULTIPROTO
#else // if !FE_GET_EXTENDED_INFO
VERBOSE(VB_IMPORTANT, "DVBChan Error, MythTV was compiled without "
"DVB-S2 headers being present so DVB-S2 tuning will fail.");
@@ -904,13 +1014,18 @@
if (DTVTunerType::kTunerTypeQAM == tuner_type)
{
+#ifndef DVB_API_MULTIPROTO
+ // TODO Fix this
params.u.qam.symbol_rate = tuning.symbolrate;
params.u.qam.fec_inner = (fe_code_rate_t) (int) tuning.fec;
params.u.qam.modulation = (fe_modulation_t) (int) tuning.modulation;
+#endif
}
if (DTVTunerType::kTunerTypeOFDM == tuner_type)
{
+#ifndef DVB_API_MULTIPROTO
+ // TODO Fix this
params.u.ofdm.bandwidth =
(fe_bandwidth_t) (int) tuning.bandwidth;
params.u.ofdm.code_rate_HP =
@@ -925,13 +1040,17 @@
(fe_guard_interval_t) (int) tuning.guard_interval;
params.u.ofdm.hierarchy_information =
(fe_hierarchy_t) (int) tuning.hierarchy;
+#endif
}
-
+
if (DTVTunerType::kTunerTypeATSC == tuner_type)
{
#ifdef USE_ATSC
+#ifndef DVB_API_MULTIPROTO
+ // TODO Fix this
params.u.vsb.modulation =
(fe_modulation_t) (int) tuning.modulation;
+#endif
#endif // USE_ATSC
}
@@ -946,22 +1065,42 @@
tuning.frequency = params.frequency;
tuning.inversion = params.inversion;
- if ((DTVTunerType::kTunerTypeQPSK == tuner_type) ||
- (DTVTunerType::kTunerTypeDVB_S2 == tuner_type))
+ if (DTVTunerType::kTunerTypeQPSK == tuner_type)
{
- tuning.symbolrate = params.u.qpsk.symbol_rate;
+#ifdef DVB_API_MULTIPROTO
+ tuning.symbolrate = params.delsys.dvbs.symbol_rate;
+ tuning.fec = params.delsys.dvbs.fec;
+#else
+ tuning.symbolrate = params.u.qpsk.symbol_rate;
tuning.fec = params.u.qpsk.fec_inner;
+#endif
}
+
+ if (DTVTunerType::kTunerTypeDVB_S2 == tuner_type)
+ {
+#ifdef DVB_API_MULTIPROTO
+ tuning.symbolrate = params.delsys.dvbs2.symbol_rate;
+ tuning.fec = params.delsys.dvbs2.fec;
+#else
+ tuning.symbolrate = params.u.qpsk.symbol_rate;
+ tuning.fec = params.u.qpsk.fec_inner;
+#endif
+ }
if (DTVTunerType::kTunerTypeQAM == tuner_type)
{
+#ifndef DVB_API_MULTIPROTO
+ // TODO Fix this
tuning.symbolrate = params.u.qam.symbol_rate;
tuning.fec = params.u.qam.fec_inner;
tuning.modulation = params.u.qam.modulation;
+#endif
}
if (DTVTunerType::kTunerTypeOFDM == tuner_type)
{
+#ifndef DVB_API_MULTIPROTO
+ // TODO Fix this
tuning.bandwidth = params.u.ofdm.bandwidth;
tuning.hp_code_rate = params.u.ofdm.code_rate_HP;
tuning.lp_code_rate = params.u.ofdm.code_rate_LP;
@@ -969,12 +1108,16 @@
tuning.trans_mode = params.u.ofdm.transmission_mode;
tuning.guard_interval = params.u.ofdm.guard_interval;
tuning.hierarchy = params.u.ofdm.hierarchy_information;
+#endif
}
if (DTVTunerType::kTunerTypeATSC == tuner_type)
{
#ifdef USE_ATSC
+#ifndef DVB_API_MULTIPROTO
+ // TODO Fix this
tuning.modulation = params.u.vsb.modulation;
+#endif
#endif // USE_ATSC
}
Redigerat av Unregistered1dea9639, 02 februari 2008 - 23:22.