Update der DVB-T2 Transponderdaten in der channels.conf

  • 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:

    Falls jemand dazu eine Idee oder bessere Lösung hat wäre ich dankbar!


    Helmut

  • Der Name 'GetFrontend' äußerst verwirrend, bei dieser Bezeichnung würde man erwarten ein Handle zu einem Frontend o.ä. zu bekommen. Solltest du ändern, vielleicht GetFrontendProperties oder so..

    Das Prinzip selbst wird u.U. funktionieren, aber nicht mit jeder DVB Karte.



    Ansonsten überschreibst du eine lokale Kopie des aktuellen Senders dieses Devices in cDvbDevice anstelle des Kanals der Kanalliste.

    Damit liefern dann das dvb device und die Kanalliste unterschiedliche Informationen.



    Diese folgende Änderung erscheint mir totaler Unsinn zu sein. Ohne Lock wird GetFrontend() falsche Informationen liefern.

    Hättest du wirklich die Kanalliste überschrieben, wäre der Kanal danach ungültig.


  • Hallo wirbel,

    danke fürs drüberschauen.


    Einen verständlicheren Funktionsnamen kann man sicher wählen.

    Das mit der lokale Kopie habe ich auch vermutet, nur - wie bekommt man das dann in die aktuelle (interne?) Kanalliste?

    Ich habe es gestern Abend nicht mehr durchschaut, wahrscheinlich war es schon zu spät.


    Die Stelle des Aufrufs sollte schon passen - es gibt hier ja den FE_HAS_LOCK. Was ich hier vor dem Aufruf prüfe ist, ob ich vom tunerStatus 'tsTuned' durchgefallen bin oder ob er vorher schon 'tsLocked' war. Nur beim Übergang von Tuned zu Locked werden die Frontend-Parameter abgefragt. Also genau einmal entweder nach einem Kanalwechsel oder wenn ein verlorengengener Lock wieder hergestellt wurde.

  • Besser wäre es, die Parameter von SETCMD() mit den aktuellen Werten aus der lokalen Kopie des Kanals in cDvbDevice zu initialisieren, nicht mit Null.



    Nur wenn sich einer dieser Werte nach dem ioctl geändert hat (vorher/nachher): LOCK_CHANNELS_READ nutzen, pointer auf channels holen und in loop alle Kanäle dieses Transponders suchen && updaten. Danach auch noch lokale Kopien in allen devices updaten.

  • Hier nun der aktualisierten Patch nach.

    Funktioniert bei mir nun auch mit Update der channels.conf (wird nach 10 Minuten geschrieben).


    wirbel - bei SETCMD() und dem ioctl FE_GET_PROPERTY genügt 0 als Parameter. Der Treiber überschreibt diesen wert immer mit dem Wert aus seinem dtv_property_cache.

    Auf die Kanalliste greife ich mit GetChannelsWrite() zu - so wie es z.B. auch in nit.c geschieht.


    Auch wird nur die Kopie im aktuellen Device aktualisiert da das erste Device, das den Lock auf einen Tranponder bekommt sofort die Parameter aktualisiert. Eigentlcih kann dann kein ein weiteres Device alte Werte haben (Ok - theoretisch schon, nämllich wenn das als erstes auf den Tranponder zugreifende Device den Lock erst nach einem zweiten bekommt - eher unwahrscheinlich aber auch kein wirkliches Problem).


    Ein zweiter Patch ist für den Kerneltreiber des si2168 damit die Paramerter dort auch wirklich aktualisiert werden.

    Den brauche ich für meinen August T230 Stick.