To all,
We can already use VDR on our multiproto cards (thanks to Reinhard and
others).
But, for everyone who likes to use MythTV I have good news!
With the following patch you can watch TV using the multiproto API. I am
currently zapping around with my TT3200 and it works great. :)
I must admin that this patch is not what I call a real patch, it is more
a quick hack and it currently only supports DVB-S. I intend to support
DVB-S2 soon with a clean (configurable) approach within MythTV. Further,
the Channel Scanner (in mythtv-setup) once in the 3 times crashes on me
so you have to be persistent if you want to automatically scan the
channels. I am unsure if this is driver or a Myth problem.
For everybody who cannot wait, please use the supplied patch on one of
the latest SVN builds (revision 15220). I am very interested to have
your feedback/results.
Best regards,
Mario Smit
Index: libs/libmythtv/dvbtypes.h
===================================================================
--- libs/libmythtv/dvbtypes.h (revision 15220)
+++ libs/libmythtv/dvbtypes.h (working copy)
@@ -39,11 +39,12 @@
# define VSB_16 (fe_modulation)(QAM_AUTO+2)
#endif
-#ifdef FE_GET_EXTENDED_INFO
- #define dvb_fe_params dvb_frontend_parameters_new
-#else
- #define dvb_fe_params dvb_frontend_parameters
-#endif
+// TODO: remove clash with dvb_frontend_parameters_new (older implementation effort multiproto)
+//#ifdef FE_GET_EXTENDED_INFO
+// #define dvb_fe_params dvb_frontend_parameters_new
+//#else
+// #define dvb_fe_params dvb_frontend_parameters
+//#endif
class QString;
QString toString(fe_status);
Index: libs/libmythtv/dvbchannel.cpp
===================================================================
--- libs/libmythtv/dvbchannel.cpp (revision 15220)
+++ libs/libmythtv/dvbchannel.cpp (working copy)
@@ -50,10 +50,10 @@
static void drain_dvb_events(int fd);
static bool wait_for_backend(int fd, int timeout_ms);
-static struct dvb_fe_params dtvmultiplex_to_dvbparams(
+static struct dvb_frontend_parameters dtvmultiplex_to_dvbparams(
DTVTunerType, const DTVMultiplex&);
static DTVMultiplex dvbparams_to_dtvmultiplex(
- DTVTunerType, const dvb_fe_params&);
+ DTVTunerType, const dvb_frontend_parameters&);
#define LOC QString("DVBChan(%1): ").arg(cardnum)
#define LOC_WARN QString("DVBChan(%1) Warning: ").arg(cardnum)
@@ -137,7 +137,19 @@
fd_frontend = -1;
return false;
}
+ VERBOSE(VB_IMPORTANT, LOC + "Getting additional DVBFE_GET_INFO information." + ENO);
+ dvbfe_info fe_info;
+ bzero(&fe_info, sizeof(fe_info));
+ fe_info.delivery = DVBFE_DELSYS_DVBS;
+ if (ioctl(fd_frontend, DVBFE_GET_INFO, &fe_info) < 0)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR +
+ "Failed to get additional DVBFE_GET_INFO information." + ENO);
+ close(fd_frontend);
+ fd_frontend = -1;
+ return false;
+ }
#ifdef FE_GET_EXTENDED_INFO
if (info.caps & FE_HAS_EXTENDED_INFO)
{
@@ -560,7 +572,7 @@
QMutexLocker lock(&tune_lock);
bool reset = (force_reset || first_tune);
- struct dvb_fe_params params = dtvmultiplex_to_dvbparams(card_type, tuning);
+ struct dvb_frontend_parameters params = dtvmultiplex_to_dvbparams(card_type, tuning);
bool is_dvbs = (DTVTunerType::kTunerTypeQPSK == card_type ||
DTVTunerType::kTunerTypeDVB_S2 == card_type);
@@ -646,27 +658,71 @@
VERBOSE(VB_CHANNEL, LOC + QString("Tune(): Tuning to %1%2")
.arg(params.frequency).arg(suffix));
-#ifdef FE_GET_EXTENDED_INFO
- if (card_type == DTVTunerType::kTunerTypeDVB_S2)
- {
- if (ioctl(fd_frontend, FE_SET_FRONTEND2, ¶ms) < 0)
- {
- VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
- "Setting Frontend(2) tuning parameters failed." + ENO);
- return false;
- }
- }
- else
-#endif // FE_GET_EXTENDED_INFO
- {
- if (ioctl(fd_frontend, FE_SET_FRONTEND, ¶ms) < 0)
- {
- VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
- "Setting Frontend tuning parameters failed." + ENO);
- return false;
- }
- }
+ // check for multiproto API
+ if ((DVB_API_VERSION == 3) && (DVB_API_VERSION_MINOR == 3)) {
+ struct dvbfe_params fe_params;
+ unsigned int delsys = DVBFE_DELSYS_DVBS; //TODO: should come from configuration/database
+ VERBOSE(VB_CHANNEL, LOC + "Tune(): " +
+ QString("API minor version=%1, delivery system = %2").arg(DVB_API_VERSION_MINOR).arg(delsys));
+
+ fe_params.frequency = params.frequency;
+ fe_params.inversion = INVERSION_AUTO;
+
+ switch (delsys)
+ {
+ case DVBFE_DELSYS_DVBS:
+ fe_params.delsys.dvbs.symbol_rate = params.u.qpsk.symbol_rate;
+ fe_params.delsys.dvbs.fec = DVBFE_FEC_AUTO;
+ fe_params.delsys.dvbs.modulation = DVBFE_MOD_AUTO;
+ fe_params.delivery= DVBFE_DELSYS_DVBS;
+ VERBOSE(VB_CHANNEL, LOC + "Tune(): " +
+ QString("Frequency = %2, Srate = %3 (DVB-S)").arg(fe_params.frequency).arg(fe_params.delsys.dvbs.symbol_rate));
+ break;
+ case DVBFE_DELSYS_DVBS2:
+ fe_params.delsys.dvbs2.symbol_rate = params.u.qpsk.symbol_rate; //TODO: should use the new symbol_rate type
+ fe_params.delsys.dvbs2.fec = DVBFE_FEC_AUTO; //TODO: should use the new FEC options
+ fe_params.delsys.dvbs.modulation = DVBFE_MOD_AUTO;
+ fe_params.delivery= DVBFE_DELSYS_DVBS2;
+ VERBOSE(VB_CHANNEL, LOC + "Tune(): " +
+ QString("Frequency = %2, Srate = %3 (DVB-S2)").arg(fe_params.frequency).arg(fe_params.delsys.dvbs2.symbol_rate));
+ break;
+ default:
+ return false;
+ }
+ VERBOSE(VB_CHANNEL, LOC + "Tune(): " +
+ QString("Frequency = %1, Srate = %2 (SET_PARAMS)").arg(fe_params.frequency).arg(fe_params.delsys.dvbs.symbol_rate));
+
+ if (ioctl(fd_frontend, DVBFE_SET_PARAMS, &fe_params) == -1) {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
+ "DVBFE_SET_PARAMS failed");
+ return false;
+ }
+
+ }
+ else // old code.... TODO: need to find a more elegant way to distinguish between API/protocol versions
+ {
+ #ifdef FE_GET_EXTENDED_INFO
+ if (card_type == DTVTunerType::kTunerTypeDVB_S2)
+ {
+ if (ioctl(fd_frontend, FE_SET_FRONTEND2, ¶ms) < 0)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
+ "Setting Frontend(2) tuning parameters failed." + ENO);
+ return false;
+ }
+ }
+ else
+ #endif // FE_GET_EXTENDED_INFO
+ {
+ if (ioctl(fd_frontend, FE_SET_FRONTEND, ¶ms) < 0)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
+ "Setting Frontend tuning parameters failed." + ENO);
+ return false;
+ }
+ }
+ }
// Extra delay to add for broken DVB drivers
if (tuning_delay)
usleep(tuning_delay * 1000);
@@ -714,7 +770,7 @@
return false;
}
- dvb_fe_params params;
+ dvb_frontend_parameters params;
return ioctl(fd_frontend, FE_GET_FRONTEND, ¶ms) >= 0;
}
@@ -742,7 +798,7 @@
return false;
}
- dvb_fe_params params;
+ dvb_frontend_parameters params;
if (ioctl(fd_frontend, FE_GET_FRONTEND, ¶ms) < 0)
{
VERBOSE(VB_IMPORTANT, LOC_ERR +
@@ -875,10 +931,10 @@
return true;
}
-static struct dvb_fe_params dtvmultiplex_to_dvbparams(
+static struct dvb_frontend_parameters dtvmultiplex_to_dvbparams(
DTVTunerType tuner_type, const DTVMultiplex &tuning)
{
- dvb_fe_params params;
+ dvb_frontend_parameters params;
bzero(¶ms, sizeof(params));
params.frequency = tuning.frequency;
@@ -939,7 +995,7 @@
}
static DTVMultiplex dvbparams_to_dtvmultiplex(
- DTVTunerType tuner_type, const dvb_fe_params ¶ms)
+ DTVTunerType tuner_type, const dvb_frontend_parameters ¶ms)
{
DTVMultiplex tuning;
_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb