INHALTSVERZEICHNIS cd.device/CD_ADDCHANGEINT cd.device/CD_ADDFRAMEINT cd.device/CD_ATTENUATE cd.device/CD_CHANGENUM cd.device/CD_CHANGESTATE cd.device/CD_CONFIG cd.device/CD_EJECT cd.device/CD_GETGEOMETRY cd.device/CD_INFO cd.device/CD_MOTOR cd.device/CD_PAUSE cd.device/CD_PLAYLSN cd.device/CD_PLAYMSF cd.device/CD_PLAYTRACK cd.device/CD_PROTSTATUS cd.device/CD_QCODELSN cd.device/CD_QCODEMSF cd.device/CD_READ cd.device/CD_READXL cd.device/CD_REMCHANGEINT cd.device/CD_REMFRAMEINT cd.device/CD_SEARCH cd.device/CD_SEEK cd.device/CD_TOCLSN cd.device/CD_TOCMSF cd.device/CloseDevice cd.device/OpenDevice cd.device/CD_ADDCHANGEINT cd.device/CD_ADDCHANGEINT NAME CD_ADDCHANGEINT -- Richtet einen Software-Interrupt-Handler für Disk-Wechsel ein. FUNKTION Mit diesem Befehl kann ein Software-Interrupt-Handler zum Disk- Device hinzu gefügt werden, der aufgerufen wird, wenn immer eine Disk eingelegt oder entnommen wird. Er muss in einer sorgfältig initialisierten Exec-Interruptstruktur übergeben werden und er muss darauf vorbereitet sein, unmittelbar auf Einlegen/Entnehmen einer Disk zu reagieren. Der Interrupt wird von der Exec-Funktion Cause erzeugt, deshalb muss A6 frei gehalten sein. Um den Handler aufzurufen, muss eine Interrupt-Struktur initialisiert werden. Diese Struktur wird als io_Data dem Befehl CD_ADDCHANGEINT übergeben. Danach wird der Handler in die Handler-Kette eingebunden und aufgerufen, wenn ein Disk-Wechsel vorkommt. Vor Verlassen des Programms muss der Handler entfernt werden. Dieser Befehl antwortet nur, wenn der Handler entfernt wird. Das heißt, das Device hält die IO-Anforderung aufrecht, bis der Befehl CD_REMCHANGEINT mit der gleichen IO-Anforderung ausgeführt wird. Deshalb muss SendIO() mit diesem Befehl verwendet werden. IO REQUEST EINGABE io_Device wird voreingestellt durch den Aufruf von OpenDevice() io_Unit wird voreingestellt durch den Aufruf von OpenDevice() io_Command CD_ADDCHANGEINT io_Length Größe von (struct Interrupt) io_Data Zeiger auf Interrupt-Struktur IO REQUEST RÜCKGABE io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt inSIEHE AUCH CD_REMCHANGEINT, , , exec.library/Cause() cd.device/CD_ADDFRAMEINT cd.device/CD_ADDFRAMEINT NAME CD_ADDFRAMEINT -- Richtet einen CD-Frame Software-Interrupt-Handler ein. IO REQUEST io_Device wird voreingestellt durch den Aufruf von OpenDevice() io_Unit wird voreingestellt durch den Aufruf von OpenDevice() io_Command CD_ADDFRAMEINT io_Length Größe von (struct Interrupt) io_Data Zeiger auf Interrupt-Struktur RÜCKGABE io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in FUNKTION Mit diesem Befehl kann eine Software-Interrupt-Handler zum Disk- Device hinzu gefügt werden, der aufgerufen wird, wenn immer ein neuer Frame erkannt wird, während CD-Audio abgespielt wird. Er muss in einer sorgfältig initialisierten Exec-Interruptstruktur übergeben werden und er muss darauf vorbereitet sein, unmittelbar einen Frame-Interrupt zu reagieren. Der Interrupt wird von der Exec-Funktion Cause erzeugt, deshalb muss A6 frei gehalten sein. Um den Handler aufzurufen, muss eine Interrupt-Struktur initialisiert werden. Diese Struktur wird als io_Data dem Befehl CD_ADDFRAMEINT übergeben. Danach wird der Handler in die Handler-Kette eingebunden und aufgerufen, wenn ein Frame-Ereignis vorkommt. Vor Verlassen des Programms muss der Handler entfernt werden. Dieser Befehl antwortet nur, wenn der Handler entfernt wird. Das heißt, das Device hält die IO-Anforderung aufrecht, bis der Befehl CD_REMFRAMEINT mit der gleichen IO-Anforderung ausgeführt wird. Deshalb muss SendIO() mit diesem Befehl verwendet werden. ANMERKUNG Der Interrupt-Handler kann vor oder nach dem Senden eines Abspiel- Befehls hinzu gefügt werden. Interrupts werden nur erzeugt, während CD-Audio abgespielt wird. Interrupts werden nicht erzeugt, wenn Audio pausiert. SIEHE AUCH CD_REMFRAMEINT, , , exec.library/Cause() cd.device/CD_ATTENUATE cd.device/CD_ATTENUATE NAME CD_ATTENUATE -- Umblenden der CD-Audio-Lautstärke (sofort oder allmählich) IO REQUEST io_Device wird voreingestellt durch den Aufruf von OpenDevice() io_Unit wird voreingestellt durch den Aufruf von OpenDevice() io_Command CD_ATTENUATE io_Data NULL io_Length Dauer der Lautstärke-Umblendung in Frames io_Offset Gewünschter Lautstärke-Pegel (0 - 0x7FFF) (-1 = nur Status) RÜCKGABE io_Error Gibt einen Fehler (error) zurück, wenn das Laufwerk die Umblendung nicht unterstützt io_Actual Gegenwärtiger Lautstärke-Pegel (Umblendung kann überwacht werden) FUNKTION Dieser Befehl schiebt die CD-Audio-Lautstärke von ihrem aktuellen Wert nach oben oder nach unten zu dem Wert, der in io_Offset enthalten ist. Der mögliche Bereich ist 0 (Stille) bis 0x7FFF (höchste Lautstärke). Wenn als Ziel-Lautstärke -1 angegeben wurde, wird die Lautstärkeeinstellung nicht verändert; die aktuelle Einstellung wird in io_Actual zurückgegeben. io_Length enhält die Länge der Umblendung. Der Wert in Sekunden ergibt sich, wenn io_Length durch die laufende Frame-Geschwindigkeit (gewöhnlich 75) geteilt wird. Es ist zu beachten, dass dieser Befehl endet, ehe die Umblendung beendet ist. Deshalb kann ein Umblend-Vorgang nicht abgebrochen werden. Es kann jedoch ein neuer Befehl CD_ATTENUATE gesandt werden, der jegliche zu Zeit ablaufende Umblend-Anweisung aufhebt. Ein Wert von Null für io_Length bedeutet sofortige Lautstärke-Umschaltung. Wenn ein Befehl zur allmählichen Umblendung vor dem Abspiel-Befehl gesendet wurde, beginnt der Blendvorgang, sobald der Abspiel-Befehl aktiv ist. BEISPIEL ANMERKUNGEN Dieser Befehl hat keine Auswirkung auf die Lautstärke des Amiga, nur auf CD-Audio. Wenn das Laufwerk nicht Lautstärkeänderung, sondern Dämpfung (mute) unterstützt, sollte ein Wert kleiner als $0800 als Dämpfung angesehen werden, gleich oder größer sollte volle Lautstärke sein. Wenn stufenweise (chunky) Veränderung unterstützt wird, sollte das Laufwerk so gut wie möglich arbeiten. Wenn das Laufwerk überhaupt keine Veränderung der Lautstärke unterstützt, sollte ein Fehler zurück gegeben werden. Selbst wenn nur "mute" unterstützt wird, sollte bei Anforderung einer allmählichen Änderung das Gerät einen Befehl zur Umblendung emulieren und die Änderung mit Rücksicht auf die $0800- Grenze ausführen. BUGS SIEHE AUCH CD_INFO cd.device/CD_CHANGENUM cd.device/CD_CHANGENUM NAME CD_CHANGENUM -- gibt den derzeitigen Wert des Disk-Wechsel-Zählers zurück. FUNKTION Dieser Befehl gibt den derzeitigen Wert des Disk-Wechsel-Zählers zurück. Der Disk-Wechsel-Zähler erhöht seinen Wert jedesmal um 1, wenn eine Disk in das CD-Laufwerk eingelegt oder aus ihm entnommen wird. IO REQUEST EINGABE io_Device wird voreingestellt durch den Aufruf von OpenDevice() io_Unit wird voreingestellt durch den Aufruf von OpenDevice() io_Command CD_CHANGENUM IO REQUEST RÜCKGABE io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual - wenn io_Error 0 ist, enthält dieses den derzeitigen Wert des Disk-Wechsel-Zählers. cd.device/CD_CHANGESTATE cd.device/CD_CHANGESTATE NAME CD_CHANGESTATE -- prüfen, ob zur Zeit eine "gültige (valid)" Disk im Laufwerk ist. FUNKTION Dieser Befehl prüft, ob eine "gültige (valid)" Disk in einem Laufwerk ist. IO REQUEST EINGABE io_Device wird voreingestellt durch den Aufruf von OpenDevice() io_Unit wird voreingestellt durch den Aufruf von OpenDevice() io_Command CD_CHANGESTATE IO REQUEST RÜCKGABE io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual - 0 bedeutet, es ist eine Disk vorhanden, während alles andere anzeigt, das keine Disk vorhanden ist. ANMERKUNGEN Eine "gültige (valid)" Disk ist eine mit einem lesbaren Inhaltsverzeichnis. cd.device/CD_CONFIG cd.device/CD_CONFIG NAME CD_CONFIG -- Laufwerks-Voreinstellungen IO REQUEST io_Device wird voreingestellt durch den Aufruf von OpenDevice() io_Unit wird voreingestellt durch den Aufruf von OpenDevice() io_Command CD_CONFIG io_Data Zeiger (pointer) auf den ersten Eintrag in der TagList io_Length 0 RÜCKGABE io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in FUNKTION Dieser Befehl stellt einen oder mehrere Konfigurationspunkte ein. Die Konfigurationspunkte sind: TAGCD_PLAYSPEED Vorgabewert: 75 TAGCD_READSPEED Vorgabewert: 75 (ist nicht ganz sicher) TAGCD_READXLSPEED Vorgabewert: 75 TAGCD_SECTORSIZE Vorgabewert: 2048 TAGCD_XLECC Vorgabewert: 1 (an) TAGCD_EJECTRESET Vorgabewert: 0 (aus) oder 1 (an) möglich Die Geschwindigkeitseinstellungen (...SPEED) werden in der Zahl der Frames (Sektoren) je Sekunde angegeben. Alle CD-ROM-Laufwerke schaffen die Geschwindigkeit von 75 Frames/Sekunde. Manche Laufwerke können 150 Frames/Sekunde, einige sogar noch mehr. Zur Ermittlung der höchsten Framezahl/Sekunde ist der Befehl CD_INFO zu verwenden. Gültige Werte für Commodore CD-ROM-Laufwerke ohne Caddy sind 75 und 150 (normale und doppelte Geschwindigkeit). Alle anderen Werte sind ungültig. Es sollte immer sicher gestellt werden, dass das Laufwerk die geforderte Konfiguration beherrscht, entweder durch die Verwendung des Befehls CD_INFO und/oder durch Prüfung auf eine Fehlerbedingung nach der Übergabe der Anforderung. Es gibt drei verschiedene Typen von CD-ROM-Sektoren. Mode 1 Sektoren (2048 Bytes), Mode 2 Form 1 Sektoren (2048 Bytes) und Mode 2 Form 2 Sektoren (2328 Bytes). Normalerweise sind Disks im Format Mode 1 codiert. Mode 2 Form 1 ist grundsätzlich das Gleiche wie Mode 1; jedoch enthält das Sektor-Format Mode 2 Form 2 keine Angaben für CD-ROM-Fehlerkorrektur. Um Informationen zu lesen, die in diesem Format codiert sind, muss die Sektorgröße des Laufwerks auf 2328 Bytes konfiguriert sein. Mit diesem Befehl kann die Fehlerkorrektur (Error correction (ECC)) des Befehls READXL an- oder ausgeschaltet werden. Fehlerkorrektur kann sowohl in der Hardware als auch in der Software realisiert sein (abhängig vom CD-ROM-Laufwerk). Wenn ECC in der Software vorgenommen wird, kann die CPU-Belastung recht hoch werden. Auf CDs kommen Fehler recht selten vor, wenn sie nicht zahlreiche Kratzer aufweisen, und wenn das der Fall ist, geht das auf Kosten der CPU-Bandbreite. Wenn ECC in der Hardware eingerichtet ist, geht keine CPU-Zeit verloren -- in diesem Fall ist ECC immer an, ganz egal wie das Laufwerk konfiguriert ist, weil sie nichts kostet. Der Befehl READXL wird hauptsächlich zur Darstellung Film-ähnlicher Daten verwendet. Dabei ist Geschwindigkeit wichtig, die Datensicherheit ist es nicht; wenn jedoch die CPU während einer XL-animation nicht eingesetzt wird, besteht keine Notwendigkeit ECC auszuschalten (da CPU-Zeit hierbei ja verwendet werden kann). Der einzige Fall, in dem ECC abgeschaltet sein sollte, ist, wenn im Hintergrund des Befehls READXL intensive Berechnungen durchgeführt werden UND das Programm zeitkritisch ist. Wenn das erledigt ist, darf nicht vergessen werden, diesen Befehl wieder zurück zu setzen. Um den Computer in den Ausgangszustand zurück zu setzen (reset), wenn eine CD ausgeworfen wird (für eine Anwendung, die nicht von selbst endet), ist die Marke (tag) TAGCD_EJECTRESET zu verwenden. Nach Möglichkeit sollten Programme sauber zur Workbench zurückkehren können. Fehlerbedingungen sollten bei Disk-Ein/Ausgabe überwacht werden. BEISPIEL /* Konfiguration ReadXL für double-speed lesen und abschalten von */ /* ECC, wenn der Befehl ReadXL verwendet wird. */ struct TagItem ConfigList[] = { { TAGCD_READXLSPEED, 150 }, { TAGCD_XLECC, 0 }, { TAG_END, 0 } }; ior->io_Command = CD_CONFIG; ior->io_Data = (APTR)&ConfigList; ior->io_Length = 0; DoIO(ior); if (ior->io_Error) printf("Could not be configured\n"); ANMERKUNGEN Die Einstellung der Konfiguration verändert nicht das Verhalten eines Befehl zum Lesen oder zum Abspielen, wenn er schon läuft. Dieser Befehl kann sehr gefährlich sein. Wenn z.B. TAGCD_SECTORSIZE auf 2328 gesetzt ist, können keine Daten, die in Sektoren mit 2048 Bytes codiert sind, mehr gelesen weden (z.B. kann das Dateisystem die Disk nicht mehr lesen). Wenn also Daten, die mit diesem Sektor- Format abgelegt sind, gelesen wurden, sollte sofort zum originalen vorgegebenen (default) Wert zurückgekehrt werden (selbst bei einem Lesefehler -- die Disk hätte ja mitten im Lesevorgang entfernt worden sein können). Dieser Befehl sollte von KEINEM ANDEREN als dem ausschließlichen Eigentümer der Disk verwendet werden. BUGS TAG_IGNORE, TAG_MORE und TAG_SKIP arbeiten nicht. Bitte nicht verwenden. Wenn die Geschwindigkeit von einfach (single speed) auf doppelt (double speed) oder von doppelt auf einfach umgeschaltet wird, wenn das Laufwerk in einfacher Geschwindigkeit Daten beschafft, die in doppelter Geschwindigkeit verwendet werden sollen, schaltet das Laufwerk nicht auf doppelte Geschwindigkeit um (und auch andersherum nicht). Um dieses Problem zu umgehen, ist auf die gewünschte Geschwindigkeit zu schalten, es ist zu beginnen mindestens 4k an Daten einzulesen (einfach zwei Bytes lesen), dann ist mit dem Lesen wieder am Anfang zu beginnen. Dadurch wird der Lesespeicher gelöscht und ein neuer Lesebefehl mit der gewünschten Geschwindigkeit ausgegeben. (Berichtigt in 40.24). SIEHE AUCH CD_INFO, cd.device/CD_EJECT cd.device/CD_EJECT NAME CD_EJECT -- Öffnen oder Schließen des CD-Laufwerks IO REQUEST io_Command CD_EJECT io_Data NULL io_Length geforderter Zustand des Laufwerks (0 == geschlossen, 1 == offen) io_Offset 0 RESULTS io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual vorheriger Zustand des Laufwerks FUNKTION Dieser Befehl öffnet das Laufwerk oder schließt es (Aus- oder Einfahren der Schublade). Der gewünschte Zustand wird in io_Length abgelegt. Der vorherige Zustand des Laufwerks wird in io_Actual zurückgegeben. BEISPIEL ANMERKUNGEN BUGS SIEHE AUCH cd.device/CD_GETGEOMETRY cd.device/CD_GETGEOMETRY NAME CD_GETGEOMETRY -- gibt die Laufwerksgeometrie zurück. FUNKTION Dieser Befehl gibt einen vollständigen Satz an Informationen über den Aufbau des Laufwerks zurück. Die Information wird in der Struktur DriveGeometry zurückgegeben, die mit dem Zeiger io_Data bestimmt ist. IO REQUEST EINGABE io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_GETGEOMETRY io_Data Zeiger auf eine Struktur DriveGeometry io_Length Größe von (struct DriveGeometry) IO REQUEST RESULT io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual - Länge der übertragenen Daten. SIEHE AUCH CD_GETNUMTRACKS, cd.device/CD_INFO cd.device/CD_INFO NAME CD_INFO -- Gibt Informationen/Status des Gerätes zurück IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_INFO io_Data Zeiger auf Struktur CDInfo io_Length Größe von (struct CDInfo) RESULTS io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual Länge der übertragenen Daten FUNKTION Dieser Befehl gibt die aktuelle Konfiguration und den Status des Geräte-Treibers zurück. BEISPIEL struct CDInfo Info; ior->io_Command = CD_INFO; /* Besorge Laufwerk-Info. */ ior->io_Data = (APTR)Info; /* Hierhin wollen wir sie */ ior->io_Length = sizeof(struct CDInfo); /* Gibt Struktur-Größe aus */ DoIO(ior); if (!ior->io_Error) { /* Command succeeded */ if (Info.Status & CDSTSF_PLAYING) printf("Audio is playing\n"); else printf("Audio not playing\n"); } ANMERKUNGEN BUGS SIEHE AUCH cd.device/CD_MOTOR cd.device/CD_MOTOR NAME CD_MOTOR -- Steuerung des an/aus-Zustands eines Laufwerkmotors. FUNKTION Mit diesem Befehl wird der Drehteller-Motor gesteuert. Der Motor kann an- oder ausgeschaltet sein. Wenn der Motor gerade angeschaltet wurde, wartet der Gerätetreiber (device) ausreichend lange, um das Laufwerk auf Lesegeschwindigkeit kommen zu lassen. Es ist nicht nötig, den Motor von Hand an oder ab zu schalten, der Treiber tut dies automatisch, wenn er eine Anforderung bei stehendem Motor erhält. IO REQUEST EINGABE io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_MOTOR io_Length der gewünschte Zustand des Motors, 0 um den Motor ab zu schalten und 1, um ihn ein zu schalten. IO REQUEST RESULT io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual - wenn io_Error 0 ist, enthält dieses den vorherigen Zustand des Laufwerk-Motors. cd.device/CD_PAUSE cd.device/CD_PAUSE NAME CD_PAUSE -- Pausieren oder Weitermachen für den Abspiel-(play)-Befehl. IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_PAUSE io_Data NULL io_Length Pausenmodus : 1 = Pause beim Abspielen; 0 = keine Pause beim Abspielen; io_Offset 0 RÜCKGABEN io_Actual - wenn io_Error 0 ist, ist hier der vorhergegangene Pausen- Zustand enthalten. FUNKTION Dieser Befehl setzt die CD in den Pausenmodus oder nimmt sie wieder heraus. Der gewünschte Pausenzustand wird in io_Length übergeben. Dieser Befehl beeinflusst nur die Abspiel-Befehle. Wenn Audio abgespielt wird und der Pausenmodus eingeschaltet wird, unterbricht dieser Befehl sofort die Ausgabe, bis der Pausen-Zustand wieder aufgehoben wird. Wenn Audio nicht abgespielt wird und der Pausenmodus wird eingeschaltet, hat der Befehl keine unmittelbare Auswirkung. Wir dann ein Abspiel-Befehl übermittelt, sucht der Laser die richtige Position auf und pausiert dort. Der Abspielbefehl wartet, bis der Pausen-Zustand beendet ist (oder bis das Abspielen abgebrochen wird). BEISPIEL ANMERKUNGEN BUGS SIEHE AUCH cd.device/CD_PLAYLSN cd.device/CD_PLAYLSN NAME CD_PLAYLSN -- Spielt einen ausgewählten Abschnitt des CD-Audio (LSN-Form). IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_PLAYLSN io_Data NULL io_Length Länge des Abspielbereichs io_Offset Anfangsposition RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in FUNKTION Mit diesem Befehl beginnt das Laufwerk CD-Audio ab der vorgegebenen Position abzuspielen, bis die eingestellte Länge erreicht ist. io_Offset gibt die Anfangsposition an. io_Length enthält den Zeitraum des Abspielen. Alle Daten sind angegeben im LSN-Format. Eine Rückgabe von DoIO() erfolgt nicht, ehe die angeforderte Zahl an Sektoren abgespielt ist. Eine Rückgabe von SendIO() findet statt, sobald das Abspielen (PLAY) begonnen hat. Zu diesem Zeitpunkt können weitere Befehle (wie CD_PAUSE) gesendet werden. Um das Abspielen vor dem vorgegebenen Ende abzubrechen, ist AbortIO() zu verwenden. BEISPIEL /* Spiele zwei Minuten und zehn Sekunden Audio mit Beginn bei */ /* 20 Minuten, 58 Sekunden und 10 Frames. */ ior->io_Command = CD_PLAYLSN; /* Spiele CD-Audio */ ior->io_Offset = 94360; /* 20*(60*75) + 58*75 + 10 */ ior->io_Length = 9750; /* 02*(60*75) + 10*75 + 00 */ DoIO (ior); ANMERKUNGEN BUGS SIEHE AUCH CD_PLAYTRACK, CD_PAUSE, CD_SEARCH, CD_ATTENUATE cd.device/CD_PLAYMSF cd.device/CD_PLAYMSF NAME CD_PLAYMSF -- Spielt einen ausgewählten Abschnitt des CD-Audio (MSF-Format). IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_PLAYMSF io_Data NULL io_Length Länge des Abspielbereichs io_Offset Anfangsposition RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in FUNKTION Mit diesem Befehl beginnt das Laufwerk CD-Audio ab der vorgegebenen Position abzuspielen, bis die eingestellte Länge erreicht ist. io_Offset gibt die Anfangsposition an. io_Length enthält den Zeitraum des Abspielen. Alle Daten sind angegeben im MSF-Format. Eine Rückgabe von DoIO() erfolgt nicht, ehe die angeforderte Zahl an Sektoren abgespielt ist. Eine Rückgabe von SendIO() findet statt, sobald das Abspielen (PLAY) begonnen hat. Zu diesem Zeitpunkt können weitere Befehle (wie CD_PAUSE) gesendet werden. Um das Abspielen vor dem vorgegebenen Ende abzubrechen, ist AbortIO() zu verwenden. BEISPIEL /* Spiele zwei Minuten und zehn Sekunden Audio mit Beginn bei */ /* 20 Minuten, 58 Sekunden und 10 Frames. */ ior->io_Command = CD_PLAYMSF; /* Spiele CD-Audio */ ior->io_Offset = 0x00143A0A; /* $14=20, $3A=58, $0A=10 */ ior->io_Length = 0x00020A00; /* $02=02, $0A=10, $00=00 */ DoIO (ior); ANMERKUNGEN BUGS SIEHE AUCH CD_PLAYTRACK, CD_PAUSE, CD_SEARCH, CD_ATTENUATE cd.device/CD_PLAYTRACK cd.device/CD_PLAYTRACK NAME CD_PLAYTRACK -- Spielt eine oder mehrere Spuren (tracks) CD-Audio. IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_PLAYTRACK io_Data NULL io_Length Zahl der abzuspielenden Spuren (tracks) io_Offset Spielbeginn am Anfang dieser Spur RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in FUNKTION Durch diesen Befehl spielt das Laufwerk die angegebene Zahl an Audiospuren ab. Die Befehlsrückgabe erfolgt nach Abschluss der Audio-Ausgabe. io_Offset gibt die Spur-Nummer an (beginnend bei 1). io_Length gibt die Zahl der abzuspielenden Spuren an (0 ist eine ungültige Eingabe). BEISPIEL ior->io_Command = CD_PLAYTRACK; /* Audiospuren abspielen */ ior->io_Offset = STARTTRACK; /* Bginn bei dieser Spur */ ior->io_Length = 3; /* Spiele drei Spuren */ DoIO(ior); ANMERKUNGEN PLAY-Befehle sind assynchron zu vielen anderen CD-Befehlen. Mit einer getrennten I/O-Anforderung (I/O request) können andere Befehle zum Gerätetreiber (device) gesandt werdeen, die das Verhalten der PLAY-Befehle verändern. BUGS SIEHE AUCH CD_PLAYMSF, CD_PLAYLSN, CD_PAUSE, CD_SEARCH, CD_ATTENUATE cd.device/CD_PROTSTATUS cd.device/CD_PROTSTATUS NAME CD_PROTSTATUS -- Rückgabe, ob die aktuelle Disk schreibgeschützt ist. FUNKTION Mit diesem Befehl kann man feststellen, ob die aktuelle Disk schreibgeschützt ist. Zur Zeit meldet diese Funktion immer den Zustand "Schreibgeschützt". Wenn irgend einmal beschreibbare CDs zur Verfügung stehen, kann das geändert werden. IO REQUEST EINGABE io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_PROTSTATUS IO REQUEST RESULT io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual - 0 bedeutet, die Disk ist NICHT schreibgeschützt, während jeder andere Wert den Schreibschutz anzeigt. cd.device/CD_QCODELSN cd.device/CD_QCODELSN NAME CD_QCODELSN -- Melde aktuelle Diskposition. IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_QCODELSN io_Data Zeiger auf QCode Strukture io_Length 0 - MUSS Null sein (wegen zukünftiger Kompatabilität) RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in FUNKTION Dieser Befehl meldet die derzeit gültige Zeit-Information im Unterbereich des Q-Kanals (subcode Q channel time information). Dieser Befehl gibt nur Daten zurück, wenn CD-Audio spielt (oder pausiert). Zu jeder anderen Zeit wird ein Fehler zurückgegeben. Das Q-Code-Paket besteht aus: struct QCode { UBYTE CtlAdr; /* Datentype / QCode-Type */ UBYTE Track; /* Spurnummer */ UBYTE Index; /* Spur-Subindex-Nummer */ UBYTE Zero; /* Das "Zero"-Byte des Q-Code-Packets */ union LSNMSF TrackPosition; /* Position vom Anfang der Spur */ union LSNMSF DiskPosition; /* Position vom Anfang der Disk */ }; BEISPIEL struct QCode qcode; ior->io_Command = CD_QCODELSN; /* TOC-Informationen besorgen */ ior->io_Length = 0; /* MUSS Null sein */ ior->io_Data = (APTR)qcode; /* Hier wollen wir es haben */ DoIO (ior); if (!ior->io_Error) { /* Befehl erfolgreich */ printf("Current position is: %ld\n", qcode.DiskPosition.LSN); } ANMERKUNGEN Dieser Befehl muss nicht unbedingt sofort eine Rückgabe machen. Es kann einige Frames dauern, bis ein gültiges Q-Code-Paket zurück gegeben werden kann. SendIO() und CheckIO() sind zu verwenden, wenn die Antwortzeit kritisch ist, jedoch nicht die Information. BUGS SIEHE AUCH CD_PLAYMSF, CD_PLAYLSN, CD_PLAYTRACK, cd.device/CD_QCODEMSF cd.device/CD_QCODEMSF NAME CD_QCODEMSF -- Melde aktuelle Diskposition. IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_QCODEMSF io_Data Zeiger auf QCode Strukture io_Length 0 - MUSS Null sein (wegen zukünftiger Kompatabilität) RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in FUNKTION Dieser Befehl meldet die derzeit gültige Zeit-Information im Unterbereich des Q-Kanals (subcode Q channel time information). Dieser Befehl gibt nur Daten zurück, wenn CD-Audio spielt (oder pausiert). Zu jeder anderen Zeit wird ein Fehler zurückgegeben. Das Q-Code-Paket besteht aus: struct QCode { UBYTE CtlAdr; /* Datentype / QCode-Type */ UBYTE Track; /* Spurnummer */ UBYTE Index; /* Spur-Subindex-Nummer */ UBYTE Zero; /* Das "Zero"-Byte des Q-Code-Packets */ union LSNMSF TrackPosition; /* Position vom Anfang der Spur */ union LSNMSF DiskPosition; /* Position vom Anfang der Disk */ }; BEISPIEL struct QCode qcode; ior->io_Command = CD_QCODEMSF; /* TOC-Informationen besorgen */ ior->io_Length = 0; /* MUSS Null sein */ ior->io_Data = (APTR)qcode; /* Hier wollen wir es haben */ DoIO (ior); if (!ior->io_Error) { /* Befehl erfolgreich */ printf("Current position is: %02d:%02d:%02d\n", qcode.DiskPosition.MSF.Minute, qcode.DiskPosition.MSF.Second, qcode.DiskPosition.MSF.Frame); } ANMERKUNGEN Dieser Befehl muss nicht unbedingt sofort eine Rückgabe machen. Es kann einige Frames dauern, bis ein gültiges Q-Code-Paket zurück gegeben werden kann. SendIO() und CheckIO() sind zu verwenden, wenn die Antwortzeit kritisch ist, jedoch nicht die Information. BUGS SIEHE AUCH CD_PLAYMSF, CD_PLAYLSN, CD_PLAYTRACK, cd.device/CD_READ cd.device/CD_READ NAME CD_READ -- Daten von der Disk lesen. FUNKTION Liest Daten von der Disk in den Speicher. Auf Daten kann an WORD- Grenzen zugegriffen werden (es besteht keine Beschränkung auf Sektor- Grenzen wie bei normalen Disk-Gerätetreibern (devices)). Die Länge der Daten kann auch in WORD-Größe angegeben werden. IO REQUEST EINGABE io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_READ io_Data Zeiger auf den Puffer, wo die Daten hin kommen sollen. io_Length Zahl der zu lesenden Bytes, es muss ein Vielfaches von WORD sein. io_Offset Abstand vom Anfang der Disk in Bytes zur Angabe, ab wo die Daten zu lesen sind, es muss ein Vielfaches von WORD sein. IO REQUEST RESULT io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual - wenn io_Error 0 ist, Zahl der tatsächlich übertragenen Bytes ANMERKUNGEN Wenn während dem Versuch eines CD_READ ein Fehler auftritt, versucht die Software den Zugriff bis zu 10 Mal erneut, bis sie die Anforderung abbricht. Wenn es sich um ein Double-Speed-Laufwerk handelt, bei dem der Fehler auftritt, wird ein weiterer Versuch in doppelter Geschwindigkeit ausgeführt und wenn der misslingt, laufen die nächsten neun Versuche in einfacher Geschwindigkeit. SIEHE AUCH CD_READXL cd.device/CD_READXL cd.device/CD_READXL NAME CD_READXL -- Von der CD-ROM in den Speicher via Transferliste lesen. IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_READXL io_Data Zeiger auf die Transferliste (d.h. struct List *). io_Length maximale Übertragungslänge (Vielfaches von WORD) oder 0. io_Offset Byte-Abstand vom Beginn der Disk als Angabe, wo mit dem Lesen der Daten begonnen werden soll, muss ein Vielfaches von WORD sein. RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual falls io_Error 0 ist, Zahl der tatsächlich übertragenen der Bytes FUNKTION Dieser Befehl beginnt an einem angegebenen Ort auf der Disk mit dem Lesen der Daten und legt sie im Speicher an den Bezugspunkten (nodes) ab, die in einer Transferliste angegeben sind. Der Zeiger auf die Liste mit den Bezugspunkten ist in io_Data abgelegt. Wenn eine nicht-zirkulare Transferlist vorhanden ist, muss io_Length einfach auf 0 gesetzt werden (0 ist ein spezieller Wert und bedeutet, dass io_Length zu ignorieren ist) -- die Übertragung endet, wenn die Transferliste abgearbeitet ist. Wenn eine zirkulare Transferlist vorhanden ist, hört diese Liste nie auf. In diesem Falle endet die Übertragung, wenn io_Length Bytes übertragen sind. Die Felder in der CDXL node structure sind: struct CDXL { struct MinNode Node; /* doppelte Verbindung */ char *Buffer; /* Bestimmungsort der Daten */ LONG Length; /* muss geradzahlige Anzahl von */ /* Bytes sein */ LONG Actual; /* übertragene Bytes */ APTR IntData; /* Datenseg. für Interrupt Server */ VOID (*IntCode)(); /* Code-Eintrag f. Interrupt Server */ }; Die Philosophie hier ist, dass man einen Puffer einrichtet, der gefüllt werden soll, CDXL-Bezugspunkte (nodes) erzeugt, die den Ort und die Größe dieses Puffers beschreiben, alle diese Bezugspunkte in der gewünschten Reihenfolge verbindet (oder sogar eine zirkulare Liste für Animationen erstellt) und den Befehl ausführt. Die Daten fließem in den vorgesehenen Puffer bis die Liste abgearbeitet ist, bis ein Eintrag mit der Länge Null erkannt wird, bis io_Length Bytes übertragen wurden (wenn io_Length ungleich Null ist) oder bis der Befehl mit AbortIO() abgebrochen wurde. Wenn in das Feld (*IntCode)() ein Zeiger auf eine Interrupt-Routine gesetzt wird, wird diese Routine aufgerufen, wenn die Übertragung für diesen Bezugspunkt erledigt ist. Der Code wird aufgerufen, ehe der Treiber zum nächsten Punkt weitergeht. Der Interrupt sollte nach den gleichen Regeln wie Standard-Interrupts aufgebaut sein (siehe AddIntServer der Exec Autodocs). Im Register A2 steht ein Zeiger auf den Bezugspunkt, der gerade erledigt wurde. Die Liste kann mit dem Interrupt manipuliert werden. Der Code muss kurz sein (es handelt sich um einen Interrupt). Bei der Rückkehr aus diesem Interrupt ist D0 frei zu geben und eine RTS-Anweisung sollte für den Rücksprung verwendet werden. Server werden mit folgenden Register-Konventionen aufgerufen: D0 - scratch D1 - scratch A0 - scratch A1 - server is_Data pointer (scratch) A2 - pointer to CDXL node just completed A5 - jump vector register (scratch) Alle anderen Register müssen erhalten bleiben BEISPIEL ANMERKUNGEN Es ist sicher zu stellen, dass kleine Puffer nicht über Gebühr benutzt werden. Jedesmal wenn ein Bezugspunkt (node) erledigt ist, wird ein Interrupt erzeugt. Wenn der Computer anfängt träge zu arbeiten oder wenn der Befehl CD_READXL abbricht, werden sicher zuviele Interrupts erzeugt. Es nicht sehr wirkungsvoll, wenn in einer vertikalen Austastlücke mehr als nur ein paar dieser Interrupts erzeugt werden. Anders als beim Befehl READ wiederholt der Befehl READXL nicht den Leseversuch des Sektors, wenn ein Fehler auftritt. Da der Befehl READXL hauptsächlich für Animationen gedacht ist, wird der Fluss der Daten als wichtiger angesehen als die Daten selbst. Eine Fehlermeldung wird in io_Error zurückgegeben, wenn ein Datenfehler auftritt. Auf keinen Fall wird der Befehl auf eine geringere Geschwindigkeit zurück fallen, wenn ein Fehler auftritt. BUGS SIEHE AUCH CMD_READ, CD_SEEK, Autodocs - AddIntServer cd.device/CD_REMCHANGEINT cd.device/CD_REMCHANGEINT NAME CD_REMCHANGEINT -- Entfernen eines Software-Interrupt-Handlers bei Diskwechsel. FUNKTION Dieser Befehl entfernt einen Software-Interrupt für Disk-Wechsel, der durch eine vorherige Verwendung von CD_ADDCHANGEINT hinzu gefügt wurde. IO REQUEST EINGABE Die gleiche IO-Anforderung, die für CD_ADDCHANGEINT benutzt worden war. io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_REMCHANGEINT io_Length Größe von (struct Interrupt) io_Data Zeiger auf Interrupt-Strukture IO REQUEST RESULT io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt in SIEHE AUCH CD_ADDCHANGEINT, cd.device/CD_REMFRAMEINT cd.device/CD_REMFRAMEINT NAME CD_REMFRAMEINT -- Entfernen eines CD-Frame-Interrupt-Handlers. FUNKTION Dieser Befehl entfernt einen CD-Frame-Software-Interrupt, der durch eine vorherige Verwendung von CD_ADDFRAMEINT hinzu gefügt wurde. IO REQUEST Die gleiche IO-Anforderung, die für CD_ADDFRAMEINT benutzt worden war. io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_REMFRAMEINT io_Length Größe von (struct Interrupt) io_Data Zeiger auf Interrupt-Strukture RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in BUGS SIEHE AUCH CD_ADDFRAMEINT, cd.device/CD_SEARCH cd.device/CD_SEARCH NAME CD_SEARCH -- Konfigurieren des Modus, in welchem der Befehl PLAY läuft. IO REQUEST io_Command CD_SEARCH io_Data NULL io_Length Suchmodus io_Offset 0 RÜCKGABEN io_Actual - wenn io_Error 0 ist, ist hier der vorhergehende Suchmodus enthalten. FUNKTION Dieser Befehl lässt den Abspielbefehl schnell vorwärts, schnell rückwärts oder normal laufen. Diese Moden sind definiert als: CDMODE_NORMAL 0 Normales Spiele (aktuelle Einstellung der Geschwindigkeit) CDMODE_FFWD 1 Spielen im Modus schnell forwärts CDMODE_FREV 2 Spielen im Modus schnell rückwärts Der Suchmodus kann eingestellt werden, ehe der Abspielbefehl gesendet wurde oder während des Abspiels. Wenn CD_SEARCH vor einem Abspielbefehl gesendet wurde, wird der Modus eingestellt und der Befehl kommt sofort zurück. Wenn der Modus auf REV eingestellt ist, wenn der Spielbefehl gesendet wird, beginnt das Abspielen am eingestellten Endpunkt und arbeit rückwärts bis zum Anfangspunkt. Wird CD_SEARCH während dem Abspielen gesendet, wird das Abspiel automatisch auf den gewünschten Modus geschaltet und fortgesetzt, bis der originale Abspielbefehl erledigt ist. Wenn der REV-Modus eingestellt ist und der Beginn des Abspielens vor dem Umschalten auf Vorwärts-Spiel erreicht wird, endet der Spielbefehl ohne Fehler. BEISPIEL /* Suchen im schnellen Forwärts-Modus. */ ior->io_Command = CD_SEARCH; ior->io_Data = NULL; ior->io_Offset = 0; ior->io_Length = CDMODE_FFWD; DoIO(ior); ANMERKUNGEN BUGS SIEHE AUCH cd.device/CD_SEEK cd.device/CD_SEEK NAME CD_SEEK -- Laserpostion auf bestimmte Stelle einrichten. FUNKTION CD_SEEK bewegt den Laser ungefähr auf die Stelle, die angegeben wurde. Im Feld io_Offset sollte die Position stehen, zu welchem der Laser zu setzen ist. IO REQUEST EINGABE io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_SEEK io_Offset Position, zu der der Kopf bewegt werden soll (immer LSN-Format) IO REQUEST RESULT io_Error - 0 bei Erfolg oder ein Fehlercode wie festgelegt in cd.device/CD_TOCLSN cd.device/CD_TOCLSN NAME CD_TOCLSN -- Gibt Informationen über das Inhaltsverzeichnis (TOC) der CD zurück (LSN-Format). IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_TOCLSN io_Data Zeiger auf Array, wo das Verzeichnis gespeichert werden soll io_Length Zahl der CDTOC-Einträge, die geholt werden sollen io_Offset Eintrag, bei dem begonnen werden soll (Eintrag 0 bedeutet zusammengefasste Information) RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual Tatsächliche Zahl der kopierten Einträge FUNKTION Dieser Befehl gibt das Inhaltsverzeichnis der Disk zurück, die sich im Laufwerk befindet. Das Inhaltsverzeichnis besteht aus bis zu 100 Einträgen. Eintrag Null ist eine zusammengefasste Information, welche die Zahl der Spuren und Gesamtzahl der Minuten auf der Disk enthält. Einträge 1 bis N enthalten Informationen über jede einzelne Spur. Alle Informationen über Positionen sind im LSN-Format. Das Feld io_Data zeigt auf ein Array von CDTOC-Strukturen zur Aufnahme der TOC-Daten. Das Feld io_Length enthält die Zahl der Einträge, die abgeholt werden sollen. Das Array, auf das durch io_Data verwiesen wird, muss mindestens diese Zahl an Elementen aufnehmen können. Das Feld io_Offset gibt die Eintragsnummer an, bei der mit dem Kopieren der TOC-Daten nach *io_Data begonnen werden soll. Eintrag Null (der summarische Eintrag) enthält folgendes: struct TOCSummary { UBYTE FirstTrack; /* Erste Spur auf Disk (immer 1) */ UBYTE LastTrack; /* Letzte Spur auf Disk */ union LSNMSF LeadOut; /* Beginn des Ausleitungsspur */ }; Spureinträge (Einträge 1 bis Zahl der Spuren) enthalten: struct TOCEntry { UBYTE CtlAdr; /* Q-Code-Info */ UBYTE Track; /* Spurnummer */ union LSNMSF Position; /* Startposition dieser Spur */ }; CDTOC wird beschrieben als Verbindung dieser beiden Strukturen: union CDTOC { struct TOCSummary Summary; /* Erster Eintrag ist summarische info */ struct TOCEntry Entry; /* Einträge 1-N sind Spureinträge */ }; BEISPIEL union CDTOC tocarray[100]; ior->io_Command = CD_TOCLSN; /* Besorge TOC-Information */ ior->io_Offset = 0; /* Beginn mit summarischer Info */ ior->io_Length = 100; /* Max. 99 Spuren + summarisch */ ior->io_Data = (APTR)tocarray; /* Hier soll es hin */ DoIO (ior); if (!ior->io_Error) { /* Befehl erfolgreich */ firsttrack = tocarray[0].Summary.FirstTrack; lasttrack = tocarray[0].Summary.LastTrack; totalsectors = tocarray[0].Summary.LeadOut.LSN - tocarray[1].Entry.Position.LSN; } ANMERKUNGEN In oben gezeigten Beispiel ist die Menge der Daten auf der Disk berechnet als gleich dem Ort der Ausleitungs-Spur minus dem Beginn der ersten Spur (was niemals Null ergibt). [Anmerkung für die Redaktion: Im englischen Text ist nicht eindeutig, worauf sich "Null" bezieht: Die berechnete Differenz oder den Beginn der ersten Spur. Ggf. bitte ändern] BUGS SIEHE AUCH cd.device/CD_TOCMSF cd.device/CD_TOCMSF NAME CD_TOCMSF -- Gibt Informationen über das Inhaltsverzeichnis (TOC) der CD zurück (MSF-Format). IO REQUEST io_Device voreingestellt durch den Aufruf OpenDevice() io_Unit voreingestellt durch den Aufruf OpenDevice() io_Command CD_TOCMSF io_Data Zeiger auf Array, wo das TOC abgelegt werden soll io_Length Zahl der CDTOC-Einträge, die geholt werden sollen io_Offset Eintrag, bei dem begonnen werden soll (Eintrag 0 ist zusammengefasste Information) RÜCKGABEN io_Error 0 bei Erfolg oder ein Fehlercode wie festgelegt in io_Actual Tatsächliche Zahl der kopierten Einträge FUNKTION Dieser Befehl gibt das Inhaltsverzeichnis der Disk zurück, die sich im Laufwerk befindet. Das Inhaltsverzeichnis besteht aus bis zu 100 Einträgen. Eintrag Null ist eine zusammengefasste Information, welche die Zahl der Spuren und Gesamtzahl der Minuten auf der Disk enthält. Einträge 1 bis N enthalten Informationen über jede einzelne Spur. Alle Informationen über Positionen sind im MSF-Format. Das Feld io_Data zeigt auf ein Array von CDTOC-Strukturen zur Aufnahme der TOC-Daten. Das Feld io_Length enthält die Zahl der Einträge, die abgeholt werden sollen. Das Array, auf das durch io_Data verwiesen wird, muss mindestens diese Zahl an Elementen aufnehmen können. Das Feld io_Offset gibt die Eintragsnummer an, bei der mit dem Kopieren der TOC-Daten nach *io_Data begonnen werden soll. Eintrag Null (der summarische Eintrag) enthält folgendes: struct TOCSummary { UBYTE FirstTrack; /* Erste Spur auf Disk (immer 1) */ UBYTE LastTrack; /* Letzte Spur auf Disk */ union LSNMSF LeadOut; /* Beginn der Ausleitungsspur */ }; Spureinträge (Einträge 1 bis Zahl der Spuren) enthalten: struct TOCEntry { UBYTE CtlAdr; /* Q-Code-Info */ UBYTE Track; /* Spurnummer */ union LSNMSF Position; /* Startposition dieser Spur */ }; CDTOC wird beschrieben als Verbindung dieser beiden Strukturen: union CDTOC { struct TOCSummary Summary; /* Erster Eintrag summarische Info */ struct TOCEntry Entry; /* Einträge 1-N sind Spur-Einträge */ }; BEISPIEL ANMERKUNGEN BUGS SIEHE AUCH cd.device/CloseDevice cd.device/CloseDevice NAME CloseDevice - Zugriff auf CD beenden SYNOPSIS CloseDevice(IORequest); A1 FUNKTION Diese Funktion beendet den Zugriff auf die Einheit, die mit OpenDevice() geöffnet wurde. EINGABEN iORequest - Zeiger auf struct(IOStdReq) RÜCKGABEN ANMERKUNGEN SIEHE AUCH OpenDevice() cd.device/OpenDevice cd.device/OpenDevice NAME OpenDevice - Öffnet eine CD-Einheit für Zugriff SYNOPSIS error = OpenDevice("cd.device", UnitNumber, IORequest, flags); D0 A0 D0 A1 D1 FUNKTION Öffnet das cd.device und erzeugt einen IORequest, um auf die CD zugreifen zu können. EINGABEN UnitNumber - Gewöhnlich Null; Jedoch wird das beschrieben als: Einer-Stelle = Unit (SCSI unit Nummer) Zehner-Stelle = LUN (Disk im Disk-Wechsler) Hunderter-Stelle = Karten-Nummer (SCSI Karte) Tausender-Stelle = Reserviert (muss Null sein) IORequest - Pointer to a struct(IOStdReq) flags - Sollte Null sein. RÜCKGABEN error 0 = Erfolg, andernfalls ist das ein Fehler. ANMERKUNGEN SIEHE AUCH CloseDevice()
Nähste Seite
Vorige Seite