In meiner channels.conf sind bei den DVB-T2 Sendern die Transponderdaten z.B. für Modulation, Inversion und Coderate(FEC) immer noch so eingetragen wie sie von w_scan beim Sendersuchlauf als default verwendet wurden, also QPSK, INVERSION_AUTO oder FEC_AUTO.
Wenn ich es richtig sehe, werden diese Werte von vdr nicht aktualisiert, weil sie in der NIT für DVB-T2 einfach nicht vorhanden sind.
Meine Idee ist nun, sich diese fehlenden Angaben nach einem erfolgreichen LOCK direkt vom Frontend zu holen.
Dazu habe ich in dvbdevice.c eine Funktion GetFrontend erstellt in der diese Daten mit FE_GET_PROPERTIES abgefragt werden und dann mit channel.SetTransponderData übernommen werden sollten.
Dem ist aber leider nicht so. im Log sehe ich zwar die Aktualisierungsmeldung mit Alt-Neu, aber im Kanal-Editor oder vdr-femon sind die Werte unverändert, in der channels.conf sowieso.
Meine C++ Kenntnisse sind eher bescheiden, und vielleicht bin ja auch ganz auf dem Holzweg.
Hier der Code als Patch:
diff -Nurp vdr-2.3.8.orig/dvbdevice.c vdr-2.3.8/dvbdevice.c
--- vdr-2.3.8.orig/dvbdevice.c 2017-05-09 13:50:38.000000000 +0200
+++ vdr-2.3.8/dvbdevice.c 2017-11-30 22:56:45.341472616 +0100
@@ -334,6 +334,7 @@ private:
cPositioner *GetPositioner(void);
void ExecuteDiseqc(const cDiseqc *Diseqc, int *Frequency);
void ResetToneAndVoltage(void);
+ bool GetFrontend(void);
bool SetFrontend(void);
virtual void Action(void);
public:
@@ -1007,6 +1186,48 @@ static int GetRequiredDeliverySystem(con
return ds;
}
+bool cDvbTuner::GetFrontend(void)
+{
+ dtv_property Props[MAXFRONTENDCMDS];
+ dtv_properties CmdSeq;
+ memset(&Props, 0, sizeof(Props));
+ memset(&CmdSeq, 0, sizeof(CmdSeq));
+ CmdSeq.props = Props;
+
+ bool ChannelsModified = false;
+
+ cDvbTransponderParameters dtp(channel.Parameters());
+ // Determine the required frontend type:
+ frontendType = GetRequiredDeliverySystem(&channel, &dtp);
+
+ if (frontendType == SYS_DVBT2) {
+ // get DVB-T2 properties which are not covered by NIT
+ SETCMD(DTV_MODULATION, 0);
+ SETCMD(DTV_HIERARCHY, 0);
+ SETCMD(DTV_INVERSION, 0);
+ SETCMD(DTV_INNER_FEC, 0);
+ //SETCMD(DTV_CODE_RATE_HP, 0);
+ //SETCMD(DTV_CODE_RATE_LP, 0);
+
+ if (ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq) != 0) {
+ esyslog("ERROR: frontend %d/%d: %m", adapter, frontend);
+ return false;
+ }
+
+ dtp.SetModulation(Props[0].u.data);
+ dtp.SetHierarchy(Props[1].u.data);
+ dtp.SetInversion(Props[2].u.data);
+ dtp.SetCoderateH(Props[3].u.data); // INNER_FEC
+
+ isyslog("get_frontend: i:%d c:%d m:%d h:%d",
+ dtp.Inversion(),dtp.CoderateH(),dtp.Modulation(),dtp.Hierarchy());
+
+ ChannelsModified |= channel.SetTransponderData(channel.Source(), channel.Frequency(), channel.Srate(), dtp.ToString('T'));
+ return true;
+ }
+ return false;
+}
+
bool cDvbTuner::SetFrontend(void)
{
dtv_property Props[MAXFRONTENDCMDS];
@@ -1206,6 +1427,8 @@ void cDvbTuner::Action(void)
isyslog("frontend %d/%d regained lock on channel %d (%s), tp %d", adapter, frontend, channel.Number(), channel.Name(), channel.Transponder());
LostLock = false;
}
+ if (tunerStatus != tsLocked)
+ GetFrontend();
tunerStatus = tsLocked;
locked.Broadcast();
lastTimeoutReport = 0;
Alles anzeigen
Falls jemand dazu eine Idee oder bessere Lösung hat wäre ich dankbar!
Helmut