Grundfragen zur Skinentwicklung

  • Hallo


    Da ich mich momentan mit dem Thema beschäftige sind ein zwei Fragen bei mir aufgetaucht, wo ich hoffe das mir die jemand beantworten kann.


    Als erstes hab ich eine Frage zu der Funktion Action


    So wie ich das verstanden habe kann diese Funktion für Effekte benutzt werden.
    Mus ich da noch was bestimmten 'includen' ?
    Ist das Running() definiert sobald ich dies Funktion benutzte?


    Zweitens Automatisch gescrollter Text


    Wie geht das?
    Wird das mit Hilfe von ViewPort und DrawPort realisiert?
    Kann mir das jemand erklären?


    Und drittens Recording Infos


    Gibt es eine Möglichkeit die Infos wie Aspect, Auflösung, Tonformat abzufragen?


    Danke im Voraus für die Antworten.

  • Moin!


    Action ist eine virtuelle Methode von cThread, ist also dafür gedacht, multi-threading zu nutzen. Aber "einfach so" ist das nie, wenn man mehrere Threads benutzt. Da gibt es gehörig viele Stolpersteine, die man beachten muss. Ohne entsprechende Grundlagen schießt du dir da schnell ins Knie. Insbesondere, wenn du Resourcen gleichzeitig aus mehreren Threads anfasst.
    Du kannst damit natürlich auch Einblend- und sonstige Effekte damit machen. Aber mach dich auf Arbeit gefasst. :)


    Lars.

  • Gibt es eine Möglichkeit die Infos wie Aspect, Auflösung, Tonformat abzufragen?


    Programmieren kann ich nicht, aber im SkinElchi wird das verwendet. Schau Dir mal die Quellkodes an.

  • Hi,


    ganz schön viele Fragen auf einmal...und jede einzelne ist nicht ganz einfach ;)



    Als erstes hab ich eine Frage zu der Funktion Action


    So wie ich das verstanden habe kann diese Funktion für Effekte benutzt werden.
    Mus ich da noch was bestimmten 'includen' ?
    Ist das Running() definiert sobald ich dies Funktion benutzte?


    Die Klasse, in der du Effekte wie fading, scrolling oder sonst was benutzen willst, muss von der Klasse cThread erben. Dadurch erbt deine Klasse zwei Funktionen: public void cThread:: Start() und protected virtual void cThread::Action(), die du in deiner Klasse überschreiben musst. Die Start() Funktion musst du "von aussen" aufrufen, damit der Thread "losrennt", intern wird dann implizit die Funktion Action() aufgerufen.


    Wie Lars schon geschrieben hat, ist multithreading relativ tricky. Ich habe das in den Anfangszeiten von nOpacity auch leidvoll erfahren müssen :) Bei irgendwelchen Effekten manipulierst du in der Regel Pixmaps innerhalb der Action() Funktion. Was dann oft passiert ist, dass diese Pixmaps von aussen zerstört werden, der Thread aber trotzdem noch läuft und munter versucht auf diese Pixmaps zuzugreifen. Das endet dann immer in einem unschönen Segfault. Deshalb musst du immer auch den Thread vorher mit entsprechenden Maßnahmen (du erbst von cThread auch die Funktion Cancel(int timeout) ) stoppen. Aber auch das hat seine Tücken...


    Spiele einfach mal ein bisschen damit rum, wie es rudimentär funktioniert, siehst du im true color OSD Demo Plugin von Klaus, wobei da nicht wirklich auf konkurrierende Zugriffe geachtet wird. Schau dir am besten auch mal z.B. die displaychannel.h / displaychannel.c in nOpacity an, dann solltest du das Prinzip verstehen.



    Zweitens Automatisch gescrollter Text


    Wie geht das?
    Wird das mit Hilfe von ViewPort und DrawPort realisiert?
    Kann mir das jemand erklären?


    Lese dazu am besten die Dokumentation von Klaus in osd.h, dort wo der cPixmap header definiert ist. Klaus hatte da anscheinend mal (ausnahmsweise :mua ) Lust zu dokumentieren.
    Zum Viewport und Drawport einer Pixmap: Stelle dir das am besten so vor, dass der Drawport ein Blatt Papier ist, auf dem du zeichnest. Der Viewport ist ein "Guckloch", durch das du den Drawport von aussen betrachtest. Prinzipiell brauchst du für jeden scrollenden Text eine eigene Pixmap. Der Viewport definiert den sichtbaren Bereich im OSD. Der Drawport muss nun so groß sein, dass dein kompletter Text darauf passt. Über einen Thread verschiebst du dann den Drawport und simulierst so das scrollen des Textes.
    Ein Beispiel in nOpacity findest du z.B. in der menuitem.h / menuitem.c für die verschiedenen Menütexte.



    Und drittens Recording Infos


    Gibt es eine Möglichkeit die Infos wie Aspect, Auflösung, Tonformat abzufragen?


    Ja :D Schau dir mal die Funktion void cNopacityMenuDetailRecordingView::LoadRecordingInformation(void) in der menudetailview.c an.


    Die Antworten beantworten deine Fragen jeweils recht oberflächlich, du musst dich einfach in die Thematik reinfinden, dann kommt das mit der Zeit alles von selbst. Nur nicht entmutigen lassen, der Anfang ist sicherlich recht steinig. An manchen Problemen bin ich auch fast verzweifelt, oftmals hilft es auch, den Mist mal nen Tag liegen zu lassen und mit frischem Kopf erneut ans Werk zu gehen ;)


    Ciao Louis

  • Über einen Thread verschiebst du dann den Drawport und simulierst so das scrollen des Textes.


    Viewport? Oder wird der DrawPort unterhalb des ViewPorts verschoben?


    Lars.

  • Deine Fragen wurden ja schon soweit beantwortet. Ich wollte nur noch meinen Senf dazugeben das der Einstieg wirklich nicht einfach ist und ich dir nur empfehlen kann die osd.h osd.c und andere Skins zu studieren. Deine Fragen werden wie von louis schon erwähnt alle im skin nopacity umgesetzt, so dass du sie dir dort anschauen kannst.


    Grüße
    Martin


  • Viewport? Oder wird der DrawPort unterhalb des ViewPorts verschoben?


    Lars.


    Es stimmt schon so wie ich es geschrieben habe...wenn du den Viewport verschieben würdest, würde ja das Pixmap im OSD wandern ;)


    Ciao Louis

  • Ah, ok, ich hab noch nichts mit Skins gemacht. :)
    Der ViewPort ist also der Bereich im OSD, wo das Pixmap angezeigt wird und der DrawPort entscheidet, welcher Teil des Pixmaps zu sehen ist.


    Lars.

  • Ah, ok, ich hab noch nichts mit Skins gemacht. :)
    Der ViewPort ist also der Bereich im OSD, wo das Pixmap angezeigt wird und der DrawPort entscheidet, welcher Teil des Pixmaps zu sehen ist.


    So kann man es auch umschreiben :) Eine Pixmap holt man sich ja normalerweise mit cOSD::CreatePixmap(int Layer, cRect viewPort). Dann ist der Drawport genau so groß wie der Viewport. Es gibt aber auch cOSD::CreatePixmap(int Layer, cRect viewPort, cRect drawPort), damit kann man dann den Drawport größer als den Viewport machen und den dann bei Bedarf mit SetDrawPortPoint(cPoint point) rumschieben. point ist dann quasi "oben links" des Drawport Rechecks, die Koordinate ist relativ zum Viewport zu sehen. Das gilt übrigens auch für die Definiton des Rechtecks für den Drawport, x und y ist hierbei relativ zum Viewport zu sehen.


    Ciao Louis

  • PS: kleine Anekdote am Rande: was mir schon ein paar mal passiert ist und ziemlich übel zu debuggen ist, wenn man nicht genau weiß, wo das Problem ist: ist ein Wert, z.B. die Breite des Viewports, aufgrund eines Programmierfehlers undefiniert, so hat das ziemlich fiese Effekte...manchmal gehts, manchmal bleibt der ganze PC stehen und ist unbedienbar, manchmal kackt nur der VDR ab...der Speicher, den sich der VDR für den Viewport holt, kann da manchmal recht gewaltig werden ;)


    Ciao Louis

Jetzt mitmachen!

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