<para>&arts; entwickelt sich zu schnell, als das an dieser Stelle eine aktuelle Liste möglich wäre. Informationen zu Plänen finden Sie in der Datei TODO und in den <link linkend="mailing-lists">Mailinglisten</link>. Sie sind eingeladen, sich bei der weiteren Planung und Implementation zu beteiligen. </para>
<para>Dieses in der Entwicklung befindliche Dokument versucht einen Überblick darüber zu geben, wie neue Technologien in &arts; integriert werden. Es behandelt folgende Themen: </para>
<para>Dieses befindet sich in Arbeit. Es ist die Grundlage dafür, wie neue Technologien in &arts; integriert werden können. Man kann einen ungefähren Eindruck davon bekommen, wie solche Probleme gelöst werden. Sie können alles, was Sie hier sehen, korrigieren. </para>
<para>&MCOP;-Schnittstellen sind die Grundlage des Konzeptes von &arts;. Sie sind das netzwerktransparente Äquivalent zu C++-Klassen. Sie sollten Ihre Programmentwicklung mit Schnittstellen durchführen. Die Schnittstellen bestehen aus vier Teilen: </para>
<para>Diese können beliebig kombiniert werden. Neue Technologien sollten als Schnittstellen definiert werden. Lesen Sie die Abschnitte über asynchrone Ströme und synchrone Ströme, sowie den über die KMedia2-Schnittstelle. Es sind gute Beispiele für ihre Funktionsweise </para>
<para>Schnittstellen werden als <literal role="extension">.idl</literal>-Code spezifiziert und mit dem <command>mcopidl</command>-Compiler übersetzt. Sie leiten die <classname><replaceable>Interfacename</replaceable>_impl</classname>-Klasse ab, um es zu implementieren und verwenden <function>REGISTER_IMPLEMENTATION(Interfacename_impl)</function>, um Ihre Objekt-Implementation in das &MCOP;-Objektsystem einzufügen. </para>
<para>Die kmedia2-Schnittstellen erlauben Ihnen zu ignorieren, dass wav-Dateien, mp3-Dateien und viele andere Formate aus Datenströmen bestehen. Stattdessen können Sie Methoden implementieren, um sie abzuspielen. </para>
<para>Sie können eine Routine zum Laden von wav-Dateien schreiben, um wav-Dateien abzuspielen ( als PlayObject), aber niemand sonst kann Ihren Code verwenden. </para>
<para>Asynchrone Ströme sind eine Alternative. Sie definieren eine Schnittstelle, die die Übergabe von Datenblöcken ermöglichen. So sieht das in &MCOP; aus: </para>
<para>Dieser <interfacename>ByteAudioCodec</interfacename> kann zum Beispiel mit einem <interfacename>ByteStreamToAudio</interfacename>-Objekt verbunden werden, um einen Audio-Strom zu formen. </para>
<para>Meistens sollte ein Codec-Konzept verwendet werden anstatt einem <quote>Sie wissen, wie man es abspielt und ich nicht</quote>-Konzept, wie zum Beispiel <interfacename>WavPlayObject</interfacename> es praktiziert. Natürlich muss sich jemand hinsetzen und einige Versuche durchführen, bevor ein <acronym>API</acronym> festgeschrieben werden kann. </para>
<para>Mein Vorschlag ist, Video als asynchronen Strom eines &MCOP;-Datentypen, der Bilder enthält, zu implementieren. Dieser Datentyp muss noch kreiert werden. Auf diese Weise könnten Plugins, die Video-Bilder verarbeiten in der gleichen Art wie Audio-Plugins verbunden werden. </para>
<para>Es sollte möglich sein, die <classname>VideoFrame</classname>-Klasse so zu reimplementieren, das Daten im gemeinsam genutzten Speicher gespeichert werden können. Damit würde auch Video-Streaming zwischen verschiedenen Prozessen ohne große Probleme möglich. </para>
<para>Ich habe einen Prototyp für ein Videostreaming-Programm implementiert, man kann ihn von <ulink url="http://space.twc.de/~stefan/kde/download/video-quickdraw.tar.gz">hier </ulink> herunterladen. Er muss nach einigen Experimenten in &MCOP; integriert werden. </para>
<para>Eine Render-Komponente, die XMITSHM (mit <acronym>RGB</acronym> und <acronym>YUV</acronym>) unterstützt, sollte programmiert werden. Martin Vogt arbeitet derzeit an so etwas. </para>
<para>Bisher ist &MCOP; Singel-Threaded. Für Video werden wir allerdings wohl nicht um Threading herum kommen. Dabei ist auf einige Dinge zu achten. </para>
<para>Ich könnte mir allerdings vorstellen, einzelne Modules sowohl für synchrones als auch asynchrone Streaming threadsicher zu machen. Auf diese Weise - mit einem threadtauglichen Flusssystem - könnte der Signalfluss auf zwei oder mehr Prozessoren verteilt werden. Damit wäre dem Audiosystem in Bezug auf Mehrprozessorsysteme erheblich geholfen. </para>
<para>Module können diese Dinge in eigenen Threads berechnen. Für Audio ist es sinnvoll, Threads wiederholt zu benutzen (z.B. rendern in vier Threads auf vier Prozessoren, unabhängig davon, ob 100 Module ausgeführt werden). Für Video und Byte-Dekomprimierung könnte es sinnvoll sein, eine blockierende Implementierung in einem eigenen Thread zu haben, der mit dem Rest das &MCOP;-Systems durch das Flusssystem synchronisiert wird. </para>
<para>Video und &MIDI; (und Audio) müssen möglicherweise synchronisiert werden. Das funktioniert über Zeitmarken. Zeitmarken könnten zu asynchronen Strömen hinzugefügt werden, indem jedes Paket mit einer Zeitmarke versehen wird. Zwei Video-Frames müssen also als zwei Pakete gesendet werden (sie sind sowieso recht groß), damit sie unterschiedliche Zeitmarken haben können. </para>
<para>Es sollte folgendes möglich sein: Ein FX-Effekt ist zusammengesetzt aus mehreren einfachen Modulen. Ein FX-Effekt sollte aussehen wie ein normales &MCOP;-Modul (siehe auch Maskierung (masquerading)), obwohl er aus anderen Modulen besteht. </para>
<para>Alle &GUI;-Komponenten werden &MCOP;-Module sein. Sie sollten Attribute wie Größe (size), Name (label), Farbe (color), ... haben. Ein <acronym>RAD</acronym>-Builder (&arts-builder;) sollte in der Lage sein, sie visuell zusammenzusetzen. </para>
<para>&MIDI; sollte als asynchroner Strom implementiert werden. Es sollte zwei Möglichkeiten geben, zum Einen die Verwendung von normalen &MCOP;-Strukturen für die Typen und zum Anderen die Einführung von weiteren angepassten Typen. </para>