AMIGA-Magazin · Ausgabe 12/04 OS4-Programmierung: Datatypes in AmigaOS 4

Aktuelles Heft 12/04

Datenfilter

Die Datatypes wurden mit »AmigaOS 4« nicht wesentlich verändert. Dennoch gibt es einige Besonderheiten beim Datatype zu beachten.

von Michael Christoph

 

Die Datatypes von AmigaOS sind ein geniales Konzept, wie es auf anderen Plattformen so nicht zu finden ist. Mit Hilfe von Formatbeschreibungen lassen sich Dateien lesen bzw. schreiben. Intern werden sie konvertiert. Alle Programme, die Datatypes unterstützen, kommen dadurch auch mit neuen Formaten zurecht. Benötigt wird nur ein passender Datatype. Es gibt verschiedene Datatype-Gruppen ­ eine Übersicht finden Sie im Kasten "Datatype-Gruppen".

Bei Datatypes gilt: Die Anwendung sollte unbedingt den korrekten Typ der Datei prüfen. Denn ein Malprogramm kann keine Musik "anzeigen".

Der Interface-Name lautet struct DataTypesIFase *IData Types. Vor dem ersten Zugriff auf die Funktionen muss die datatypes.library geöffnet werden. Sie steht in der V50 zur Verfügung. Dann wird das Interface (s. Listing 1) ermittelt.

Die einfachste Funktion, die die datatypes.library bereitstellt, ist das Ermitteln des Dateitypes bzw. des Datatypes für Dateien. Die Funktion ObtainDataType() erwartet eine Tagliste, die im einfachsten Fall, aber nur den Namen der Datei enthalten muss. Das Beispielprogramm »ErmittleTyp.c« zeigt die praktische Anwendung. Sie finden alle Beispiele auf unserer Webseite bzw. auf der Heft-CD.

Um nun aber auch die Objekt-Daten zu erhalten, muss NewDTObject() verwendet werden. Auch hier kann wieder eine Tagliste mitgegeben werden. Dadurch kann z.B. der Typ der Datei vorgegeben werden. Wenn die Funktionen einen Wert ungleich NULL zurückliefern, stehen die Daten zur Verfügung (s. Listing 3).

Wenn die Daten lediglich angezeigt werden sollen, kann dies auch vom Datatype übernommen werden. AddDTObject(), RefreshDTObjects() und RemoveDTObject() übernehmen diese Aufgabe. Zum Abspielen ist hingegen die Play-Methode auszuführen:

IIntuition->IDoMethod(dt,DTM_TRIGGER,NULL,STM_PLAY,NULL);

Meistens sollen die Daten aber intern weiterverarbeitet werden. Über GetD TAttrs() lassen sich die internen Werte des Datatypes abfragen, z.B. die Bilddaten. Wenn die Daten nicht mehr benötigt werden, kann man per ReleaseDTObject() die Datatype-internen Daten freigeben.

Auch hierzu finden Sie ein komplettes Beispielprogramm. Das Anzeigen eines Bildes ist in »ZeigeBild.c« zu finden; das Abspielen eines Samples in »PlaySample.c«.

Bilddaten skalieren

Datatype-Gruppen
Define Kennung Beschreibung
GID_SYSTEM syst System-Dateien
GID_TEXT text ASCII-Text
GID_DOCUMENT docu Texte und Grafiken
GID_SOUND soun Sound/Sample
GID_INSTRUMENT inst Musikinstrument
GID_MUSIC musi Musik
GID_PICTURE pict einzelnes Bild
GID_ANIMATION anim mehrere Bilder/Animation
GID_MOVIE movi Animation mit Bild und Ton

Recht unscheinbar und versteckt besteht seit »AmigaOS 3.9« (V45) die Möglichkeit, Bitmaps vom Datatype skalieren zu lassen. Und im Gegensatz zur Scale BitMap-Funktion aus der graphics.library kann hier direkt die gewünschte Breite und Höhe angegeben werden. Ein großer Nachteil ist aber, dass das Skalieren nur ein einziges Mal möglich ist, nämlich vor dem Layouten (ausführen der Methode DTM_PROC LAYOUT). Über den Tag PDTA_ScaleQuality lässt sich die Qualität der Skalierung beeinflussen. 0 bedeutet schnell, aber geringe Qualität. 1 hingegen steht für langsam, aber dafür hohe Qualität (s. Listing 3).

Im Beispielprogramm »BildSkalieren.c« passt sich das angezeigte Bild immer der aktuellen Fenstergröße an. Anhand der Argumente beim Aufruf wird die Bilddatei festgelegt.

AHI für den Sound

Der sound.datatype kümmert sich bereits darum, dass die Samples über AHI (AudioHardwareInterface) abgespielt werden und der Paula-Chip nicht mehr zum Einsatz kommt. Es spricht zwar nichts dagegen, die Samples auch direkt vom Datatype abspielen zu lassen. Flexibler ist man allerdings, wenn man direkt das ahi.device dazu verwendet. Dass das gar nicht so kompliziert ist, soll ein Beispiel zeigen. Wie üblich wird ein MessagePort und ein Verwaltungs-Requester (hier AHIRequest) benötigt, um das ahi.device öffnen zu können. AHIRequest kann theoretisch auch mehrfach kopiert werden, wenn mehrere Samples (gleichzeitig) abgespielt/koordiniert werden sollen.

Nach der Übergabe von Sample-Daten an AHIRequest bewirkt ein SendIO() das asynchrone Abspielen. Die Funktion kehrt also sofort zurück, während der Request im Hintergrund abgearbeitet wird. Wenn dieser komplett abgearbeitet wurde (was dem kompletten Abspielen entspricht), erhalten Sie den Requester im MessagePort. Bei Programmende müssen Sie das Device schließen ­ danach geben Sie den Messageport und den Requester frei. Das Programmgerüst sehen Sie in Listing 4.

Wirklich elegant wird das Ganze, wenn die Sound-Daten mit Datatypes geladen werden und das ahi.device zum koordinierten Abspielen verwendet wird. Prinzipiell gilt das bereits Besprochene: ahi.device und datatypes.library öffnen und über NewDataType() die Sample-Daten ermitteln. Anhand dieser Daten ist jetzt der AHIRequest mit Daten zu versorgen. Dazu müssen vom Datatype noch ein paar Werte ermittelt werden. Vor allem die Adresse der Daten und die Abspielfrequenz. Achtung: Diese Tags stehen teilweise erst seit der datatypes.library V44 (OS 3.5) zur Verfügung. Das hat für das OS-4-Programm keine Bedeutung. Listing 5 zeigt das passende Beispiel. Mit SendIO() wird das Ganze dann wiedergegeben und per Wait() wird auf das Ende des Sounds gewartet (s. Listing 5). Alles zusammen zeigt das Beispiel »PlayAHI.c«.

lb

 

Schau an
Das Lesen und Auswerten von Grafikdateien übernimmt das AmigaOS mit Datatypes
Speed oder Qualität
Links wurde langsam, aber hochwertig, rechts schnell skaliert.
Abgespielt
Datatypes in Kombination mit AHI spielen Sounds

 

Listingübersicht
Listing 1: Die notwendigen Interfaces öffnen.
Listing 2: Funktion "ObtainDataType()" in der Praxis.
Listing 3: Skalieren mit Hilfe von Datatypes.
Listing 4: Ein Programm-gerüst für das AHI-Handling.
Listing 5: Vorbereitung für die Soundausgabe mit Datatypes und AHI.

 

 


Download:ethält auch:
Download ZeigeBild.c : Bild im Fenster anzeigen
BildSkalieren.c : Bild auf Fenstergröße skalieren
PlaySample.c : Sample über Datatype abspielen
PlayAHI.c : Sample über AHI abspielen
os4prog-5-datatypes-src.lha,
212.963 bytes


Hauptseite © 2004 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 10. Dezember 2004, Michael Christoph.