Welches Device vom wem genutzt und auf welchem Kanal?

  • Hi,
    für ein neues Feature in meinem Skin habe ich eine kleine Sache von Louis übernommen, dabei geht es darum herauszufinden welches DVB-Device von wem verwendet wird und auf welchem Kanal dieser geschaltet ist. Dies ist aber anscheinend schwieriger als gedacht.


    Das ganze sieht dann ungefähr so aus:


    Ist nicht komplett aber man sollte erkennen was getan wird.
    Das erste Problem ist wie man herausfindet welches Device von wem verwendet wird. Hier sieht man das man das nicht einfach abfragen kann, sondern derzeit auf 2 Sachen geprüft wird, LiveTV und Recording. Was ist aber mit EPG-Scan, Streamdev, etc. ?


    Das 2. Problem besteht beim herausfinden des Kanals mittels:

    Code
    const cChannel *channel = device->GetCurrentlyTunedTransponder();


    Laut diesem Forumspost funktioniert dies nicht richtig. Auch ich kann bestätigen das ich mit diesem Aufruf und Streamdev-Client kein Kanal zurück bekomme (warum nicht?). Ich hatte dies dann wie vom Poster beschrieben geändert in

    Code
    const cChannel *channel = Channels.GetByNumber(device->CurrentChannel());


    Damit erhalte ich auch mit streamdev-client den richtigen Kanal allerdings soll laut MegaV0lt hier immer der gleiche Kanal bei mehreren DVB-Devices erscheinen.


    Leider habe ich derzeit auf meinem Entwicklungsrechner nicht die Möglichkeit alle Konstellationen durchzutesten da ich dort derzeit nur 1 streamdev-client habe.


    Kann mir hier jemand evtl. helfen? Bekomme ich das überhaupt sauber gelöst? Beim ersten Problem sehe ich schwarz das 2. Problem mit dem Kanal sollte sich doch aber lösen lassen!?!


    Grüße
    Martin

  • streamdev sollte dann wohl am besten GetCurrentlyTunedTransponder implementieren, sonst kommt da immer NULL zurück.
    Das ist keine zwingend notwendige Funktion, jedenfalls benutzt der vdr das nirgendwo.


    Lars.

  • Das hatte ich mir auch schon gedacht das man das 2.Problem zumindest bei streamdev damit lösen kann, indem streamdev die Funktion implementiert, allerdings übersehe ich das nicht ob es damit wirklich getan ist und ob streamdev das überhaupt kann, vielleicht mache ich dazu mal ein Ticket bei redmine in streamdev auf, Danke!

  • http://projects.vdr-developer.…/tree/client/device.c#n80


    Vermutlich sowas ähnliches, bloß statt vergleichen dann einfach m_Channel zurückgeben. Aber ich rate auch nur. :)

    Code
    const cChannel *cStreamdevDevice::GetCurrentlyTunedTransponder(void) const
    {
      if (m_ClientSocket->DataSocket(siLive) != NULL)
         return m_Channel;
      return NULL;
    }


    Und den Header natürlich anpassen, kannst ja mal ausprobieren.


    Lars.

  • Danke Lars das funktioniert, hier der diff wenn es jemand interessiert:


    Poste das aber noch in redmine.


    Grüße
    Martin

  • Die ifdef Geschichte brauchst du nicht zwingend. Sollte das jemand mit einem älteren vdr übersetzen, gibt es keinen Fehler. Die Funktion kann dann eben nur nicht über cDevice genutzt werden, aber schon über cStreamdevDevice.


    ifdefs braucht man nur an den Stellen, wo man sowas aufruft, was erst später hinzugekommen ist.


    Schön, dass es funktioniert!


    Lars

  • Das ist richtig. Aber ob sie ihren Ursprung in cDevice oder in cStreamdevDevice hat, spielt für den Compiler keinen Unterschied.
    Alte vdr-Version (aber auch neue) rufen diese Funktion sowieso nicht auf, die ist nur für Plugins da. Wenn ein Plugin gegen einen älteren vdr kompiliert ist, weiß er nichts von dieser Funktion, versucht also auch nicht, sie aufzurufen.


    In anderen Sprachen muss man virtuelle Funktionen explizit mit override überladen, in C++ ist das nicht so. Ob nun cDevice die erste Klasse in der Hierarchie ist, die diese Funktion als virtual definiert oder eine abgeleitete, ist egal. Probier's einfach, dann wirst du es sehen. ifdefs sind schon häßlich zu lesen, wenn man sie weglassen kann, ist es nur vorteilhaft.


    Lars.

  • Hab leider gerade nicht viel Zeit, sonst würde ich das ausführlicher erklären. Kann ich nachher evtl. mal versuchen...


    Lars.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!