diff -Naur vdr-2.0.0/dvbdevice.c vdr-2.0.0-s2apiwrapper-light/dvbdevice.c --- vdr-2.0.0/dvbdevice.c 2013-03-16 16:23:35.000000000 +0100 +++ vdr-2.0.0-s2apiwrapper-light/dvbdevice.c 2013-03-31 19:36:39.000000000 +0200 @@ -21,11 +21,6 @@ #include "menuitems.h" #include "sourceparams.h" -#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0508 -#define DTV_STREAM_ID DTV_DVBT2_PLP_ID -#define FE_CAN_MULTISTREAM 0x4000000 -#endif - #define DVBS_TUNE_TIMEOUT 9000 //ms #define DVBS_LOCK_TIMEOUT 2000 //ms #define DVBC_TUNE_TIMEOUT 9000 //ms @@ -801,7 +796,9 @@ // DVB-S2 SETCMD(DTV_PILOT, PILOT_AUTO); SETCMD(DTV_ROLLOFF, dtp.RollOff()); - SETCMD(DTV_STREAM_ID, dtp.StreamId()); + if (device->DvbApiVersion() >= 0x0508) { + SETCMD(DTV_STREAM_ID, dtp.StreamId()); + } } else { // DVB-S @@ -835,7 +832,12 @@ SETCMD(DTV_HIERARCHY, dtp.Hierarchy()); if (frontendType == SYS_DVBT2) { // DVB-T2 - SETCMD(DTV_STREAM_ID, dtp.StreamId()); + if (device->DvbApiVersion() >= 0x0508) { + SETCMD(DTV_STREAM_ID, dtp.StreamId()); + } + else if (device->DvbApiVersion() >= 0x0503) { + SETCMD(DTV_DVBT2_PLP_ID_LEGACY, dtp.StreamId()); + } } tuneTimeout = DVBT_TUNE_TIMEOUT; @@ -1178,28 +1180,39 @@ LOG_ERROR; return false; } -#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) >= 0x0505 dtv_property Frontend[1]; memset(&Frontend, 0, sizeof(Frontend)); dtv_properties CmdSeq; memset(&CmdSeq, 0, sizeof(CmdSeq)); CmdSeq.props = Frontend; - SETCMD(DTV_ENUM_DELSYS, 0); - int Result = ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq); - if (Result == 0) { - for (uint i = 0; i < Frontend[0].u.buffer.len; i++) { - if (numDeliverySystems >= MAXDELIVERYSYSTEMS) { - esyslog("ERROR: too many delivery systems on frontend %d/%d", adapter, frontend); - break; + SETCMD(DTV_API_VERSION, 0); + if (ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq) != 0) { + LOG_ERROR; + return false; + } + dvbApiVersion = Frontend[0].u.data; + bool LegacyMode = true; + if (dvbApiVersion >= 0x0505) { + memset(&Frontend, 0, sizeof(Frontend)); + memset(&CmdSeq, 0, sizeof(CmdSeq)); + CmdSeq.props = Frontend; + SETCMD(DTV_ENUM_DELSYS, 0); + int Result = ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq); + if (Result == 0) { + for (uint i = 0; i < Frontend[0].u.buffer.len; i++) { + if (numDeliverySystems >= MAXDELIVERYSYSTEMS) { + esyslog("ERROR: too many delivery systems on frontend %d/%d", adapter, frontend); + break; + } + deliverySystems[numDeliverySystems++] = Frontend[0].u.buffer.data[i]; } - deliverySystems[numDeliverySystems++] = Frontend[0].u.buffer.data[i]; - } + LegacyMode = false; + } + else { + esyslog("ERROR: can't query delivery systems on frontend %d/%d - falling back to legacy mode", adapter, frontend); + } } - else { - esyslog("ERROR: can't query delivery systems on frontend %d/%d - falling back to legacy mode", adapter, frontend); -#else - { -#endif + if (LegacyMode) { // Legacy mode (DVB-API < 5.5): switch (frontendInfo.type) { case FE_QPSK: deliverySystems[numDeliverySystems++] = SYS_DVBS; diff -Naur vdr-2.0.0/dvbdevice.h vdr-2.0.0-s2apiwrapper-light/dvbdevice.h --- vdr-2.0.0/dvbdevice.h 2013-03-07 10:42:29.000000000 +0100 +++ vdr-2.0.0-s2apiwrapper-light/dvbdevice.h 2013-03-31 17:43:07.000000000 +0200 @@ -13,9 +13,10 @@ #include #include #include "device.h" - -#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0503 -#error VDR requires Linux DVB driver API version 5.3 or higher! +#include "s2apiwrapper.h" + +#if DVB_API_VERSION < 5 +#error VDR requires Linux DVB driver API version 5! #endif #define MAXDVBDEVICES 8 @@ -124,6 +125,7 @@ int adapter, frontend; private: dvb_frontend_info frontendInfo; + int dvbApiVersion; int deliverySystems[MAXDELIVERYSYSTEMS]; int numDeliverySystems; int numModulations; @@ -137,6 +139,7 @@ virtual ~cDvbDevice(); int Adapter(void) const { return adapter; } int Frontend(void) const { return frontend; } + int DvbApiVersion(void) const { return dvbApiVersion; } virtual bool Ready(void); virtual cString DeviceType(void) const; virtual cString DeviceName(void) const; diff -Naur vdr-2.0.0/s2apiwrapper.h vdr-2.0.0-s2apiwrapper-light/s2apiwrapper.h --- vdr-2.0.0/s2apiwrapper.h 1970-01-01 01:00:00.000000000 +0100 +++ vdr-2.0.0-s2apiwrapper-light/s2apiwrapper.h 2013-03-31 19:17:31.000000000 +0200 @@ -0,0 +1,255 @@ +/* + * s2apiwrapper.h: + * Wrapper to translate DVB S2API to DVB 3.0 API calls + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: $ + */ + +#ifndef __S2API_WRAPPER_H +#define __S2API_WRAPPER_H + +#include +#include +#include + +#if DVB_API_VERSION < 5 +#error VDR requires Linux DVB driver API version 5! +#endif + +#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0501 + +enum fe_s2caps_5_1 { + FE_CAN_2G_MODULATION = 0x10000000, /* frontend supports "2nd generation modulation" (DVB-S2) */ +}; + +enum fe_transmit_mode_5_1 { + TRANSMISSION_MODE_4K = TRANSMISSION_MODE_AUTO+1 +}; + + +#define DTV_ISDBT_PARTIAL_RECEPTION 18 +#define DTV_ISDBT_SOUND_BROADCASTING 19 + +#define DTV_ISDBT_SB_SUBCHANNEL_ID 20 +#define DTV_ISDBT_SB_SEGMENT_IDX 21 +#define DTV_ISDBT_SB_SEGMENT_COUNT 22 + +#define DTV_ISDBT_LAYERA_FEC 23 +#define DTV_ISDBT_LAYERA_MODULATION 24 +#define DTV_ISDBT_LAYERA_SEGMENT_COUNT 25 +#define DTV_ISDBT_LAYERA_TIME_INTERLEAVING 26 + +#define DTV_ISDBT_LAYERB_FEC 27 +#define DTV_ISDBT_LAYERB_MODULATION 28 +#define DTV_ISDBT_LAYERB_SEGMENT_COUNT 29 +#define DTV_ISDBT_LAYERB_TIME_INTERLEAVING 30 + +#define DTV_ISDBT_LAYERC_FEC 31 +#define DTV_ISDBT_LAYERC_MODULATION 32 +#define DTV_ISDBT_LAYERC_SEGMENT_COUNT 33 +#define DTV_ISDBT_LAYERC_TIME_INTERLEAVING 34 + +#define DTV_ISDBT_LAYER_ENABLED 41 + +#define DTV_ISDBS_TS_ID 42 + +#undef DTV_MAX_COMMAND +#define DTV_MAX_COMMAND DTV_ISDBS_TS_ID + +#endif // (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0501 + + + +#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0502 + +enum fe_s2caps_5_2 { + FE_CAN_TURBO_FEC = 0x8000000, // frontend supports "turbo fec modulation" +}; + +#endif // (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0502 + + + +#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0503 + +enum fe_transmit_mode_5_3 { + TRANSMISSION_MODE_1K = TRANSMISSION_MODE_4K + 1, + TRANSMISSION_MODE_16K, + TRANSMISSION_MODE_32K, +}; + +enum fe_bandwidth_5_3 { + BANDWIDTH_5_MHZ = BANDWIDTH_AUTO + 1, + BANDWIDTH_10_MHZ, + BANDWIDTH_1_712_MHZ, +}; + +enum fe_guard_interval_5_3 { + GUARD_INTERVAL_1_128 = GUARD_INTERVAL_AUTO + 1, + GUARD_INTERVAL_19_128, + GUARD_INTERVAL_19_256, +}; + +enum fe_delivery_system_5_3 { + SYS_DVBT2 = SYS_DAB + 1, +}; + +#define DTV_DVBT2_PLP_ID 43 + +#undef DTV_MAX_COMMAND +#define DTV_MAX_COMMAND DTV_DVBT2_PLP_ID + +#endif // (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0503 + + + +#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0504 + +enum fe_delivery_system_5_4 { + SYS_TURBO = SYS_DVBT2 + 1, +}; + +#endif // (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0504 + + +#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0505 + +#define DTV_ENUM_DELSYS 44 + +#undef DTV_MAX_COMMAND +#define DTV_MAX_COMMAND DTV_ENUM_DELSYS + +enum fe_rolloff_5_5 { + ROLLOFF_15 = ROLLOFF_AUTO + 1, /* DVB-C Annex A */ + ROLLOFF_13, /* DVB-C Annex C */ +}; + +#endif // (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0505 + + +#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0506 + +/* ATSC-MH */ +#define DTV_ATSCMH_FIC_VER 45 +#define DTV_ATSCMH_PARADE_ID 46 +#define DTV_ATSCMH_NOG 47 +#define DTV_ATSCMH_TNOG 48 +#define DTV_ATSCMH_SGN 49 +#define DTV_ATSCMH_PRC 50 +#define DTV_ATSCMH_RS_FRAME_MODE 51 +#define DTV_ATSCMH_RS_FRAME_ENSEMBLE 52 +#define DTV_ATSCMH_RS_CODE_MODE_PRI 53 +#define DTV_ATSCMH_RS_CODE_MODE_SEC 54 +#define DTV_ATSCMH_SCCC_BLOCK_MODE 55 +#define DTV_ATSCMH_SCCC_CODE_MODE_A 56 +#define DTV_ATSCMH_SCCC_CODE_MODE_B 57 +#define DTV_ATSCMH_SCCC_CODE_MODE_C 58 +#define DTV_ATSCMH_SCCC_CODE_MODE_D 59 + +#undef DTV_MAX_COMMAND +#define DTV_MAX_COMMAND DTV_ATSCMH_SCCC_CODE_MODE_D + + +enum fe_delivery_system_5_6 { + SYS_DVBC_ANNEX_A = SYS_DVBC_ANNEX_AC, + SYS_DVBC_ANNEX_C = SYS_TURBO + 1 +}; + +/* ATSC-MH */ + +enum atscmh_sccc_block_mode { + ATSCMH_SCCC_BLK_SEP = 0, + ATSCMH_SCCC_BLK_COMB = 1, + ATSCMH_SCCC_BLK_RES = 2, +}; + +enum atscmh_sccc_code_mode { + ATSCMH_SCCC_CODE_HLF = 0, + ATSCMH_SCCC_CODE_QTR = 1, + ATSCMH_SCCC_CODE_RES = 2, +}; + +enum atscmh_rs_frame_ensemble { + ATSCMH_RSFRAME_ENS_PRI = 0, + ATSCMH_RSFRAME_ENS_SEC = 1, +}; + +enum atscmh_rs_frame_mode { + ATSCMH_RSFRAME_PRI_ONLY = 0, + ATSCMH_RSFRAME_PRI_SEC = 1, + ATSCMH_RSFRAME_RES = 2, +}; + +enum atscmh_rs_code_mode { + ATSCMH_RSCODE_211_187 = 0, + ATSCMH_RSCODE_223_187 = 1, + ATSCMH_RSCODE_235_187 = 2, + ATSCMH_RSCODE_RES = 3, +}; + + +#endif // (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0506 + + +#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0507 + +enum fe_code_rate_5_7 { + FEC_2_5 = FEC_9_10 + 1, +}; + +enum fe_modulation_5_7 { + QAM_4_NR = DQPSK + 1, +}; + +enum fe_transmit_mode_5_7 { + TRANSMISSION_MODE_C1 = TRANSMISSION_MODE_32K + 1, + TRANSMISSION_MODE_C3780, +}; + +enum fe_guard_interval_5_7 { + GUARD_INTERVAL_PN420 = GUARD_INTERVAL_19_256 + 1, + GUARD_INTERVAL_PN595, + GUARD_INTERVAL_PN945, +}; + +enum fe_interleaving { + INTERLEAVING_NONE, + INTERLEAVING_AUTO, + INTERLEAVING_240, + INTERLEAVING_720, +}; + +#define DTV_INTERLEAVING 60 + +#undef DTV_MAX_COMMAND +#define DTV_MAX_COMMAND DTV_INTERLEAVING + +enum fe_delivery_system_5_7 { + SYS_DTMB = SYS_DMBTH +}; + +#endif // (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0507 + + +#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0508 + +enum fe_caps_5_8 { + FE_CAN_MULTISTREAM = 0x4000000, /* frontend supports multistream filtering */ +}; + + +#undef DTV_ISDBS_TS_ID +#undef DTV_DVBT2_PLP_ID + +#define DTV_STREAM_ID 42 +#define DTV_ISDBS_TS_ID_LEGACY DTV_STREAM_ID +#define DTV_DVBT2_PLP_ID_LEGACY 43 + +#define NO_STREAM_ID_FILTER (~0U) + +#endif // (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0508 + +#endif // ifndef __S2API_WRAPPER_H