@database scsi2cd.guide @author "Olaf Barthel" @(c) "Copyright © 1994-1995 Corporate Media OHG" @$VER: scsi2cd.guide 1.0 (6.12.94) @node Main "scsi2cd.library" @{b}scsi2cd.library@{ub} Copyright © 1994-1995 by Corporate Media OHG Geschrieben von Olaf Barthel I. @{" Anwendung " link Anwendung} II. @{" Geräteanforderungen " link Geräteanforderungen} III. @{" Beispielskripte " link Beispielskripte} IV. @{" Funktionsübersicht " link Funktionsübersicht} V. @{" Fehlermeldungen " link Fehlermeldungen} @endnode @node Anwendung Die scsi2cd.library und die beigefügten Beispielskripte erlauben es, jedes CD-ROM Laufwerk, das zum SCSI-2 Befehlssatz kompatibel ist, zum Abspielen von Audio-CDs zu benutzen. Die Steuerung erfolgt hierbei über die Programmiersprache ARexx, die auch Scala unterstützt. Man hat es hier aber nicht mit einem EX-Modul zu tun, das über eine grafische Benutzeroberfläche bedient werden kann. Da die Steuerung des CD-ROM Laufwerks über ARexx funktioniert, müssen Sie entweder ein ARexx-Skript schreiben, oder über Scala vorbereitete ARexx-Skripte aufrufen. Letztendlich werden Sie also die Tastatur zur Hilfe nehmen müssen, um die Namen und Aufrufparameter der Skripte einzugeben. Die Funktionen der scsi2cd.library sind dem "CDTV" EX-Modul nachempfunden. Neben dem Fehlen einer grafischen Benutzeroberfläche existieren einige Einschränkungen gegenüber dem "CDTV" Modul: · Ein CD-Wechsel wird nicht automatisch erkannt · Beim Abspielen von Titeln der CD wird für die Dauer des Abspielvorgangs kurzfristig Speicher angefordert, der im Laufe des Scala-Skriptes wieder freigegeben werden muß. Auch dies geschieht über eine Funktion der scsi2cd.library. · Es wird nicht automatisch angezeigt, wieviele Titel sich auf einer CD befinden. Sie können dies zwar über eine Funktion der scsi2cd.library feststellen, aber sollten Sie einen Befehl zum Abspielen eines Titels geben, der nicht vorhanden ist, erhalten Sie eine Fehlermeldung. · Treten Fehler beim Aufruf der Funktionen der scsi2cd.library auf, werden diese nicht direkt an Scala gemeldet. Sie müssen hierauf bei Bedarf im ARexx-Skript selbst achten und Fehler selbst abfangen. Der scsi2cd.library liegen eine Reihe von ARexx-Skripten bei, die die am häufigsten gebrauchten Befehle zur Verfügung stellen. Das Scala-Skript "CD-Player" zeigt, wie man diese ARexx-Skripte nutzen kann. @endnode @node Geräteanforderungen Die scsi2cd.library unterstützt alle CD-ROM Laufwerke, deren Amiga-Treiber den SCSI-2 Befehlssatz unterstützen. Hierunter fallen sowohl die handelsüblichen SCSI-2 CD-ROM Laufwerke der Firmen Toshiba, Sony, Texel, Philips, NEC, Matsushita, Panasonic und Teac als auch die TandemCD Lösung von bsc. Die scsi2cd.library arbeitet unter Umständen nicht mit Laufwerken zusammen, die den SCSI-2 Befehlssatz nur teilweise implementieren oder deren Betriebssoftware fehlerhaft ist. Hier ist es schwer, Hersteller oder Gerätetypen zu nennen. Es hilft nur, die Funktionsfähigkeit vor Ort zu überprüfen. Die Tonausgabe erfolgt üblicherweise über die externen Audioanschlüsse des verwendeten CD-ROM Laufwerks. Die Anschlüsse sollten vor der Inbetriebnahme des Laufwerks mit Lautsprechern oder einem Kopfhörer verbunden worden sein. @endnode @node Beispielskripte Der scsi2cd.library liegen eine Reihe von Beispielskripten bei, die bei der Installation in die Schublade "REXX:" kopiert werden. Es kann unter Umständen sinnvoll sein, sie in die Schublade "ARexx" Ihrer Scala-Installation zu kopieren. Generell ist es jedoch praktischer, sie in "REXX:" unterzubringen, da man es so vermeiden kann, den kompletten Pfad- und Dateinamen der Skripte einzutippen, denn bei der Suche nach einem Skript schaut ARexx letztlich immer in die Schublade "REXX:". Die folgenden Skript erfüllen jeweils immer nur eine Funktion, die auch in der scsi2cd.library vorhanden ist. In Form eines ARexx-Skriptes ist es jedoch meist wesentlich einfacher, diese Funktion über die grafische Benutzeroberfläche von Scala aufzurufen und in Skala-Skripts einzubinden. Als Beispiel kann das Skala-Skript "CD-Player" dienen, das Sie sich anschauen sollten. Die folgenden ARexx-Skripte werden mitgeliefert; im Kopf eines jeden Programmes finden Sie eine Beschreibung seiner Funktion und Anwendungsbeispiele: @{" EjectCD.rexx " link EjectCD.rexx} @{" PlayMSF.rexx " link PlayMSF.rexx} @{" PlayTrack.rexx " link PlayTrack.rexx} @{" StopCD.rexx " link StopCD.rexx} @{" SyncCD.rexx " link SyncCD.rexx} @{" WaitCD.rexx " link WaitCD.rexx} @endnode @node EjectCD.rexx /* ** $VER: EjectCD.rexx 1.0 (5.12.94) ** ** Dieses Programm bewirkt, dass die CD ausgeworfen wird. ** ** Das Programm wird wie folgt aufgerufen: ** ** ejectcd.rexx */ /* 1. Schritt: Öffnen der Funktionsbibliothek. */ if ~show(libraries,"scsi2cd.library") then do call addlib("scsi2cd.library",0,-30) if ~show(libraries,"scsi2cd.library") then do exit end end /* 2. Schritt: Nachprüfen, ob die Schnittstelle bereits geöffnet ist. */ handle = getclip('cdhandle') if ~cdvalid(handle) then do /* 3. Schritt: Gerätetreiber und Gerätenummer werden festgestellt. */ devicename = cdgetvar("scsi2.device") deviceunit = cdgetvar("scsi2.unit") /* 4. Schritt: Öffnen der Schnittstelle. */ handle = cdopen(devicename,deviceunit) end /* 5. Schritt: Überprüfen der Gültigkeit der Schnittstelle. */ if handle ~= 0 then do /* 6. Schritt: Die CD wird ausgeworfen. */ error = cdeject(handle) /* 7. Schritt: Die Schnittstelle wird geschlossen, Speicher * wird freigegeben. */ error = cdclose(handle); /* 8. Schritt: Die Schnittstelle wird als ungültig markiert. */ error = setclip('cdhandle','0') end @endnode @node PlayMSF.rexx /* ** $VER: PlayMSF.rexx 1.0 (5.12.94) ** ** Dieses Programm beginnt damit, einen oder mehrere Titel abzuspielen. ** Der Ton wird auf Wunsch am Anfang aufgeblendet und am Schluß ** ausgeblendet. Die Angabe, welcher Teil der Titel gespielt werden soll, ** läßt sich hierbei durch Angabe der MSF-Kennung sehr präzise angeben. ** ** Das Programm wird wie folgt aufgerufen: ** ** playmsf.rexx ** ** ** ** ** Als Beispiel: ** ** 1. Abspielen der ersten 50 Sekunden des ersten Titels, auf das Ende ** des Abspielvorgangs wird nicht gewartet. ** ** playmsf.rexx 1 1 0 0 0 0 50 0 0 0 0 ** ** 2. Abspielen der ersten 50 Sekunden des ersten Titels, auf das Ende des ** Abspielvorgangs wird diesmal gewartet. ** ** playmsf.rexx 1 1 0 0 0 0 50 0 0 0 1 ** ** 3. Abspielen der ersten 50 Sekunden des zweiten Titls, auf das Ende des ** Abspielvorgangs wird nicht gewartet. Der Ton wird in den ** ersten vier Sekunden eingeblendet. ** ** playmsf.rexx 2 2 0 0 0 0 50 0 4 0 0 ** ** Wurde der Abspielvorgang gestartet, aber nicht bis zu dessen ** Ende gewartet, kann später mit WaitCD.rexx auf das Ende des ** Vorgangs gewartet werden. ** ** Bevor Sie das Scala-Skript beenden, muß *unbedingt* StopCD.rexx ** aufgerufen werden, da sonst Speicherplatz verlorengehen kann. */ /* 1. Schritt: Auslesen der Programmparameter. */ arg start stop startm starts startf stopm stops stopf fadein fadeout wait . /* 2. Schritt: Öffnen der Funktionsbibliothek. */ if ~show(libraries,"scsi2cd.library") then do call addlib("scsi2cd.library",0,-30) if ~show(libraries,"scsi2cd.library") then do exit end end /* 3. Schritt: Nachprüfen, ob die Schnittstelle bereits geöffnet ist. */ handle = getclip('cdhandle') if ~cdvalid(handle) then do /* 4. Schritt: Gerätetreiber und Gerätenummer werden festgestellt. */ devicename = cdgetvar("scsi2.device") deviceunit = cdgetvar("scsi2.unit") /* 5. Schritt: Öffnen der Schnittstelle. */ handle = cdopen(devicename,deviceunit) end /* 6. Schritt: Überprüfen der Gültigkeit der Schnittstelle. */ if handle ~= 0 then do /* 7. Schritt: Abspielen der Daten. */ error = cdplaymsf(handle,start,stop,startm,starts,startf,stopm,stops,stopf,fadein,fadeout,wait); say error /* 8. Schritt: Speichern der Schnittstellendaten. */ error = setclip('cdhandle',handle) end @endnode @node PlayTrack.rexx /* ** $VER: PlayTrack.rexx 1.0 (5.12.94) ** ** Dieses Programm beginnt damit, einen oder mehrere Titel abzuspielen. ** Der Ton wird auf Wunsch am Anfang aufgeblendet und am Schluß ** ausgeblendet. ** ** Das Programm wird wie folgt aufgerufen: ** ** playtrack.rexx ** ** ** Als Beispiel: ** ** 1. Abspielen von Titel Nummer 4, auf das Ende des Abspielvorgangs ** wird nicht gewartet. ** ** playtrack.rexx 4 4 0 0 0 ** ** 2. Abspielen der Titel 4 und 5, auf das Ende des Abspielvorgangs ** wird diesmal gewartet. ** ** playtrack.rexx 4 5 0 0 1 ** ** 3. Abspielen der Titel 1-6, auf das Ende des Abspielvorgangs ** wird gewartet, der Ton wird am Anfang für die Dauer von ** vier Sekunden aufgeblendet. ** ** playtrack.rexx 1 6 4 0 1 ** ** 4. Abspielen der Titel 1-6, auf das Ende des Abspielvorgangs ** wird gewartet, der Ton wird am Anfang für die Dauer von ** vier Sekunden aufgeblendet. ** ** playtrack.rexx 1 6 4 0 1 ** ** Wurde der Abspielvorgang gestartet, aber nicht bis zu dessen ** Ende gewartet, kann später mit WaitCD.rexx auf das Ende des ** Vorgangs gewartet werden. ** ** Bevor Sie das Scala-Skript beenden, muß *unbedingt* StopCD.rexx ** aufgerufen werden, da sonst Speicherplatz verlorengehen kann. */ /* 1. Schritt: Auslesen der Programmparameter. */ arg start stop fadein fadeout wait . /* 2. Schritt: Öffnen der Funktionsbibliothek. */ if ~show(libraries,"scsi2cd.library") then do call addlib("scsi2cd.library",0,-30) if ~show(libraries,"scsi2cd.library") then do exit end end /* 3. Schritt: Nachprüfen, ob die Schnittstelle bereits geöffnet ist. */ handle = getclip('cdhandle') if ~cdvalid(handle) then do /* 4. Schritt: Gerätetreiber und Gerätenummer werden festgestellt. */ devicename = cdgetvar("scsi2.device") deviceunit = cdgetvar("scsi2.unit") /* 5. Schritt: Öffnen der Schnittstelle. */ handle = cdopen(devicename,deviceunit) end /* 6. Schritt: Überprüfen der Gültigkeit der Schnittstelle. */ if handle ~= 0 then do /* 7. Schritt: Abspielen des Titels. */ error = cdplaytrack(handle,start,stop,fadein,fadeout,wait); /* 8. Schritt: Speichern der Schnittstellendaten. */ error = setclip('cdhandle',handle) end @endnode @node StopCD.rexx /* ** $VER: StopCD.rexx 1.0 (5.12.94) ** ** Mit diesem Programm wird das Abspielen der CD abgebrochen und der ** von vorher abgeschickten Befehlen belegte Speicher wird freigegeben. ** Auf Wunsch kann der Ton bis zum Ende des Abspielvorgangs ** ausgeblendet werden. ** ** Das Programm wird wie folgt aufgerufen: ** ** stopcd.rexx ** ** Als Beispiel: ** ** 1. Der Abspielvorgang wird sofort abgebrochen. ** ** stopcd.rexx 0 ** ** 2. Der Ton wird vier Sekunden lang ausgeblendet, dann wird ** der Abspielvorgang abgebrochen. ** ** stopcd.rexx 4 */ /* 1. Schritt: Auslesen der Programmparameter. */ arg fadeout . /* 2. Schritt: Öffnen der Funktionsbibliothek. */ if ~show(libraries,"scsi2cd.library") then do call addlib("scsi2cd.library",0,-30) if ~show(libraries,"scsi2cd.library") then do exit end end /* 3. Schritt: Nachprüfen, ob die Schnittstelle bereits geöffnet ist. */ handle = getclip('cdhandle') if cdvalid(handle) then do /* 4. Schritt: Der Abspielvorgang wird abgebrochen. */ error = cdstop(handle,fadeout) /* 5. Schritt: Die Schnittstelle wird geschlossen, Speicher * wird freigegeben. */ error = cdclose(handle); /* 6. Schritt: Die Schnittstelle wird als ungültig markiert. */ error = setclip('cdhandle','0') end @endnode @node SyncCD.rexx /* ** $VER: SyncCD.rexx 1.0 (5.12.94) ** ** Mit diesem Programm kann so lange gewartet werden, bis der Abspiel- ** vorgang eine bestimmte Stelle eines Titels erreicht hat. ** ** Das Programm wird wie folgt aufgerufen: ** ** synccd.rexx ** ** Als Beispiel: ** ** 1. Es wird darauf gewartet, daß bei Titel 3 die ersten 40 Sekunden ** abgespielt wurden. ** ** synccd.rexx 3 0 40 0 ** ** 2. Es wird darauf gewartet, daß bei Titel 9 die ersten drei Minuten ** abgespielt wurden. ** ** synccd.rexx 9 3 0 0 */ /* 1. Schritt: Auslesen der Parameter. */ arg track minutes seconds frames . /* 2. Schritt: Öffnen der Funktionsbibliothek. */ if ~show(libraries,"scsi2cd.library") then do call addlib("scsi2cd.library",0,-30) if ~show(libraries,"scsi2cd.library") then do exit end end /* 3. Schritt: Nachprüfen, ob die Schnittstelle bereits geöffnet ist. */ handle = getclip('cdhandle') if cdvalid(handle) then do /* 4. Schritt: Synchronisation. */ error = cdsync(handle,track,minutes,seconds,frames) end @endnode @node WaitCD.rexx /* ** $VER: WaitCD.rexx 1.0 (5.12.94) ** ** Mit diesem Programm kann so lange gewartet werden, bis der Abspiel- ** vorgang beendet ist. ** ** Das Programm wird wie folgt aufgerufen: ** ** waitcd.rexx */ /* 1. Schritt: Öffnen der Funktionsbibliothek. */ if ~show(libraries,"scsi2cd.library") then do call addlib("scsi2cd.library",0,-30) if ~show(libraries,"scsi2cd.library") then do exit end end /* 2. Schritt: Nachprüfen, ob die Schnittstelle bereits geöffnet ist. */ handle = getclip('cdhandle') if cdvalid(handle) then do /* 3. Schritt: Es wird auf das Ende des Abspielvorgangs gewartet. */ error = cdwait(handle) end @endnode @node Funktionsübersicht Die scsi2cd.library stellt vierzehn Funktionen zur Verfügung, die hier beschrieben werden sollen. Die Beschreibung folgt immer diesem Muster: Format: Hier wird die Syntax der Funktion aufgeführt, welche Parameter sie erwartet und was für eine Art von Ergebnis sie liefert. Zweck: Eine kurze Beschreibung von Sinn und Zweck der jeweiligen Funktion. Beschreibung: Hier wird die Funktion detailierter beschrieben und auch auf Stolperstellen eingegangen. Beispiel: An dieser Stelle folgt ein Beispiel zur Anwendung der Funktion. Siehe auch: Ein Hinweis auf verwandte oder im Zusammenhang nützliche Funktionen. @{b}WICHTIG:@{ub} Alle Funktionen liefern ein Ergebnis zurück. Ignorieren Sie dieses Ergebnis aus keinen Fall, d.h. speichern sie es @{b}immer@{ub} in einer Variable. Versäumen sie dies, liefert ARexx eine Fehlermeldung! Die unterstützten Funktionen sind: @{" cdclose " link cdclose} @{" cdeject " link cdeject} @{" cdfirsttrack " link cdfirsttrack} @{" cdgetvar " link cdgetvar} @{" cdlasttrack " link cdlasttrack} @{" cdopen " link cdopen} @{" cdplay " link cdplay} @{" cdplaymsf " link cdplaymsf} @{" cdplaytrack " link cdplaytrack} @{" cdstop " link cdstop} @{" cdsync " link cdsync} @{" cdtracksize " link cdtracksize} @{" cdvalid " link cdvalid} @{" cdwait " link cdwait} @endnode @node cdclose Format: Fehlernummer = cdclose() Zweck: Die Schnittstelle zum CD-ROM Laufwerk wird geschlossen. Beschreibung: Mit cdclose wird die über cdopen geöffnete Schnittstelle zum CD-ROM Laufwerk wieder geschlossen und der für diese Schnittstelle angeforderte Speicher wird wieder freigegeben. Dies sollte in jedem Skript zum Schluß erledigt werden, um nicht dringend benötigten Speicherplatz zu verlieren. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdopen " link cdopen} @endnode @node cdeject Format: Fehlernummer = cdeject() Zweck: Die im CD-ROM Laufwerk befindliche CD wird ausgeworfen. Beschreibung: Mit cdeject läßt sich eine CD aus dem Laufwerk auswerfen. Vorsicht: nicht alle CD-ROM Laufwerke sind hierzu in der Lage. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die CD wird ausgeworfen. */ err = cdeject(ref) /* Die Schnittstelle wird geschlossen. */ err1 = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: - @endnode @node cdfirsttrack Format: Ergebnis = cdfirsttrack() Zweck: Liefert die Nummer des ersten abspielbaren Titels einer CD. Beschreibung: Mit cdfirsttrack können Sie die laufende Nummer des ersten abspielbaren Titels einer CD erfragen. Dies ist nicht immer notwendigerweise Titel Nr. 1, bei vielen Hybrid-CDs enthält die erste `Spur' der CD Daten, die auf einem CD-Spieler nicht abgespielt können oder abgespielt werden sollten -- im Extremfall können Sie damit sogar Ihre Lautsprecher beschädigen. cdfirsttrack liefert deshalb immer die laufende Nummer des ersten Audio-Titels. Statt der Nummer eines Titels kann auch ein Fehler als Ergebnis zurückgeliefert werden. Zwischen Fehler und Titelnummer kann leicht unterschieden werden: die Nummer eines Titels bewegt sich immer zwischen 1-99, ein Fehler ist immer größer oder gleich 1000. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die Nummer des ersten Titels wird erfragt. */ num = cdfirsttrack(ref) /* Jetzt wird das Ergebnis ausgegeben. */ if num >= 1000 then do say "Der Fehler" num "ist aufgetreten" end; else do say "Der erste Titel der CD ist" num end /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdlasttrack " link cdlasttrack} @{" cdtracksize " link cdtracksize} @endnode @node cdgetvar Format: Variable = cdgetvar() Zweck: Auslesen einer Umgebungsvariable Beschreibung: Mit cdgetvar kann der Wert einer globalen Umgebungsvariable ausgelesen werden. Die Funktion ähnelt dem Shell-Befehl "GetEnv". Findet sich keine Umgebungsvariable unter dem angegebenen Namen, wird eine leere Zeichenkette zurückgeliefert. Beispiel: /* Der Wert der Variable "Workbench" wird ausgelesen. */ ver = cdgetvar("Workbench") /* Das Ergebnis wird ausgegeben. */ say "Workbench =" ver Siehe auch: - @endnode @node cdlasttrack Format: Ergebnis = cdlasttrack() Zweck: Liefert die Nummer des letzten abspielbaren Titels einer CD. Beschreibung: Mit cdlasttrack können Sie die laufende Nummer des letzten abspielbaren Titels einer CD erfragen. Statt der Nummer eines Titels kann auch ein Fehler als Ergebnis zurückgeliefert werden. Zwischen Fehler und Titelnummer kann leicht unterschieden werden: die Nummer eines Titels bewegt sich immer zwischen 1-99, ein Fehler ist immer größer oder gleich 1000. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die Nummer des letzten Titels wird erfragt. */ num = cdlasttrack(ref) /* Jetzt wird das Ergebnis ausgegeben. */ if num >= 1000 then do say "Der Fehler" num "ist aufgetreten" end; else do say "Der erste Titel der CD ist" num end /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdfirsttrack " link cdfirsttrack} @{" cdtracksize " link cdtracksize} @endnode @node cdopen Format: Referenz = cdopen(,) Zweck: Öffnen der Schnittstelle zum CD-ROM Laufwerk. Beschreibung: Fast alle Befehle der scsi2cd.library benötigen einen Parameter, der in der Dokumentation als "Referenz" aufgeführt ist. Diese "Referenz" ist ein Platzhalter für einen von der scsi2cd.library angeforderten Speicherbereich, in dem die zur Ansteuerung des CD-ROM Laufwerks nötigen Daten und Informationen untergebracht wird. Für jeden erfolgreichen Aufruf von cdopen wird Speicher verbraucht, den Sie, sobald die Schnittstelle nicht mehr benötigt wird, unbedingt freigeben sollten. Dies geschieht mit dem Befehl @{"cdclose" link cdclose}, der im Laufe jedes Skriptes aufgerufen werden sollte. Der Funktion cdopen müssen zwei Parameter übergeben werden. Dies ist zum einen der Name des Gerätetreibers, der zur Ansteuerung des CD-ROM Laufwerks verwendet werden soll und zum andern die Gerätenummer, unter der sich das Laufwerk meldet. Der Name des Treibers hängt vom verwendeten SCSI-Controller ab, zum Beispiel "scsi.device" oder "gvpscsi.device". Die Gerätenummer läßt sich meist auf der Rückseite des Laufwerks mit einem Schalter einstellen. Kann eine Schnittstelle zum CD-ROM Laufwerk geöffnet werden, erhält man einen Referenzwert, der später noch häufig genug gebraucht wird. Schlägt das Öffnen der Schnittstelle fehl, erhält man stattdessen eine Fehlernummer. Um beides unterscheiden zu können, muß man die Funktion @{"cdvalid" link cdvalid} aufrufen, die einem mitteilt, ob es sich bei dem Ergebnis um eine gültige Referenz oder um eine Fehlernummer handelt. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdvalid " link cdvalid} @endnode @node cdplay Format: Fehlernummer = cdplay(,) Zweck: Abspielen eines einzelnen Titels Beschreibung: Mit cdplay wird ein einzelner Titel abgespielt. Der Abspielvorgang beginnt sofort, der Titel wird nicht ein- oder ausgeblendet. Es wird nicht bis zum Ende des Abspielvorgangs gewartet. Soll bis der Titel komplett abgespielt ist gewartet werden, muß anschließend die Funktion @{"cdwait" link cdwait} oder @{"cdsync" link cdsync} aufgerufen werden. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Der dritte Titel wird abgespielt. */ err = cdplay(ref,3) /* Das Ergebnis ausgeben. */ say "Ergebnis =" err /* Bis zum Ende des Titels warten. */ if err == 0 then do err = cdwait(ref) end; /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdplaymsf " link cdplaymsf} @{" cdplaytrack " link cdplaytrack} @{" cdstop " link cdstop} @{" cdsync " link cdsync} @{" cdwait " link cdwait} @endnode @node cdplaymsf Format: Fehlernummer = cdplaymsf(,, ,, ,, ,, ,, ,) Zweck: Abspielen von Titeln und Ausschnitten unter Angabe der Position in MSF-Notation. Beschreibung: Mit dem cdplaymsf Befehl kann man sehr genau angeben, welche Stelle eines Titels der CD abgespielt werden soll, indem man dessen Position in MSF-Notation angibt. MSF steht für "Minute, Second, Frame", also Minute, Sekunde und Frame. 75 "Frames" entsprechen einer Sekunde, 60 Sekunden einer Minute. Es muß jeweils der Anfangs- und der Endpunkt der zu spielenden Titel angegeben werden. Dazu kommt eine Angabe, wieviele Sekunden lang der Ton zu Anfang eingeblendet und zum Schluß ausgeblendet werden soll. Zuletzt ist noch anzugeben, ob bis zum Ende des Abspielvorgangs gewartet werden soll. Soll nicht sofort bis zum Ende des Abspielvorgangs gewartet werden, kann dies durch das spätere Aufrufen der Befehle @{"cdwait" link cdwait} und @{"cdsync" link cdsync} nachgeholt werden. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die ersten 20 Sekunden des dritten Titels * werden abgespielt. Der Ton wird vier * Sekunden lang eingeblendet und fünf * Sekunden lang ausgeblendet. Bis die 20 * Sekunden abgespielt sind, wird gewartet. */ err = cdplaymsf(ref,3,3, 0,0,0, 0,20,0, 4,5, 1) /* Das Ergebnis ausgeben. */ say "Ergebnis =" err /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdplay " link cdplay} @{" cdplaytrack " link cdplaytrack} @{" cdstop " link cdstop} @{" cdsync " link cdsync} @{" cdwait " link cdwait} @endnode @node cdplaytrack Format: Fehlernummer = cdplaytrack(,, ,, ,) Zweck: Eine angegebene Zahl von Titeln wird abgespielt. Beschreibung: Mit cdplaytrack läßt sich ein Titel oder mehrere Titel in Folge abspielen. Die Nummern des ersten und letzten Titels müssen angegeben werden. Dazu wird verlangt, daß die Anzahl Sekunden für das Ein- und Ausblenden des Titels angegeben wird. Zuletzt wird durch einen Parameter gesteuert, ob bis zum Ende des Abspielvorgangs gewartet werden soll. Soll nicht sofort bis zum Ende des Abspielvorgangs gewartet werden, kann dies durch das spätere Aufrufen der Befehle @{"cdwait" link cdwait} und @{"cdsync" link cdsync} nachgeholt werden. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die Titel 3 und vier werden abgespielt. Der * Ton wird sofort ausgegeben, d.h. er wird * nicht eingeblendet, und zum Schluß fünf * Sekunden lang ausgeblendet. Bis zum Ende * des Abspielvorgangs wird nicht gewartet. */ err = cdplaytrack(ref,3,4, 0,5, 0) /* Das Ergebnis ausgeben. */ say "Ergebnis =" err /* Bis zum Ende des Titels warten. */ if err == 0 then do err = cdwait(ref) end; /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdplaymsf " link cdplaymsf} @{" cdplaytrack " link cdplaytrack} @{" cdstop " link cdstop} @{" cdsync " link cdsync} @{" cdwait " link cdwait} @endnode @node cdstop Format: Fehlernummer = cdstop(,) Zweck: Der Abspielvorgang wird abgebrochen. Beschreibung: Mit cdstop ein durch @{"cdplay" link cdplay}, @{"cdplaymsf" link cdplaymsf} oder @{"cdplaytrack" link cdplaytrack} gestarteter Abspielvorgang abgebrochen. Dabei muß angegeben werden, wieviele Sekunden lang der Ton ausgeblendet werden soll. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Der Titel 3 wird abgespielt, es wird nicht * ein- oder ausgeblendet oder bis zum Ende * des Titels gewartet. */ err = cdplaytrack(ref,3,3, 0,0, 0) /* Das Ergebnis ausgeben. */ say "Ergebnis =" err /* Der Titel wird vier Sekunden lang ausgeblendet * und der Abspielvorgang abgebrochen. */ if err == 0 then do err = cdstop(ref,4) end; /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdplay " link cdplay} @{" cdplaymsf " link cdplaymsf} @{" cdplaytrack " link cdplaytrack} @{" cdsync " link cdsync} @{" cdwait " link cdwait} @endnode @node cdsync Format: Fehlernummer = cdsync(,,, ,) Zweck: Es wird gewartet, bis der Abspielvorgang einen bestimmten Zeitpunkt erreicht hat. Beschreibung: Mit cdsync läßt sich der Ablauf eines Programmes mit dem Abspielvorgang einer CD synchronisieren. Man kann bis zu einem bestimmten Zeitpunkt warten und dann mit der Programmausführung weiterverfahren. Der Zeitpunkt wird an Hand des Titels und einer in MSF-Notation angegebenen Position bestimmt. MSF steht für "Minute, Second, Frame", also Minute, Sekunde und Frame. 75 "Frames" entsprechen einer Sekunde, 60 Sekunden einer Minute. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Der Titel 3 wird abgespielt, es wird nicht * ein- oder ausgeblendet oder bis zum Ende * des Titels gewartet. */ err = cdplaytrack(ref,3,3, 0,0, 0) /* Das Ergebnis ausgeben. */ say "Ergebnis =" err if err == 0 then do /* Es werden genau zehn Sekunden des Titels * abgespielt. */ err = cdsync(ref,3, 0,10,0) /* Der Titel wird vier Sekunden lang ausgeblendet * und der Abspielvorgang abgebrochen. */ err = cdstop(ref,4) end; /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdplay " link cdplay} @{" cdplaymsf " link cdplaymsf} @{" cdplaytrack " link cdplaytrack} @{" cdstop " link cdstop} @{" cdwait " link cdwait} @endnode @node cdtracksize Format: Länge = cdtracksize(,) Zweck: Die Länge eines Titels wird ermittelt. Beschreibung: Mit cdtracksize läßt sich die Länge, also die Dauer eines Titels bestimmen. Die Dauer wird in Frames berechnet und zurückgeliefert. 75 "Frames" entsprechen einer Sekunde, 60 Sekunden einer Minute. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die Dauer von Titel 3 wird ermittelt. */ frames = cdtracksize(ref,3) /* Das Ergebnis wird ausgegeben. */ say "Titel 3 ist" frames "Frames lang" say "In Sekunden =" frames / 75 say "In Minuten =" frames / (60 * 75) /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdfirsttrack " link cdfirsttrack} @{" cdlasttrack " link cdlasttrack} @endnode @node cdvalid Format: Ergebnis = cdvalid() Zweck: Überprüft, ob ein Referenzwert gültig ist. Beschreibung: Mit cdvalid läßt sich testen, ob ein Referenzwert gültig und mit den Funktionen der scsi2cd.library verwendbar ist. Als Ergebnis wird entweder 0 zurückgeliefert, was bedeutet, daß der Wert nicht gültig ist, oder ein Wert ungleich 0. Dies bedeutet, daß der Referenzwert gültig ist. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdopen " link cdopen} @endnode @node cdwait Format: Fehlernummer = cdwait() Zweck: Wartet, bis ein Abspielvorgang abgeschlossen ist. Beschreibung: Mit cdwait kann auf das Ende eines durch @{"cdplay" link cdplay}, @{"cdplaymsf" link cdplaymsf} oder @{"cdplaytrack" link cdplaytrack} gestarteten Abspielvorgangs gewartet werden. Beispiel: /* Die Schnittstelle wird geöffnet. */ ref = cdopen("scsi.device",2) /* Hat alles geklappt? */ if cdvalid(ref) then do /* Der Titel 3 wird abgespielt, es wird nicht * ein- oder ausgeblendet oder bis zum Ende * des Titels gewartet. */ err = cdplaytrack(ref,3,3, 0,0, 0) /* Das Ergebnis ausgeben. */ say "Ergebnis =" err /* Es wird bis zum Ende des Abspielvorgangs * gewartet. */ if err == 0 then do err = cdwait(ref) end; /* Die Schnittstelle wird geschlossen. */ err = cdclose(ref) end; else do err = ref end /* Jetzt wird die Fehlernummer ausgegeben. */ say "Fehlernummer =" err Siehe auch: @{" cdplay " link cdplay} @{" cdplaymsf " link cdplaymsf} @{" cdplaytrack " link cdplaytrack} @{" cdsync " link cdsync} @{" cdwait " link cdwait} @endnode @node Fehlermeldungen Tritt beim Aufruf einer der Funktionen der scsi2cd.library ein Fehler auf, so liefert die betreffende Funktion eine Fehlernummer zurück. Dies entspricht einer Fehlermeldung, es erscheint kein Hinweisfenster oder ähnliches. Bei der Fehlerbehandlung werden Sie unter Umständen auf die Schwierigkeit stoßen, daß Scala die Programmabarbeitung nicht selbsttätig unterbricht. Sie müssen dies in Ihrem ARexx-Skript also selbst erledigen. Neben den ARexx-internen Fehlern können die folgenden Fehler von der scsi2cd.library erzeugt werden: 1000 Schnittstelle ist nicht zu öffnen (Speichermangel) 1001 Ungültiger Referenzwert 1002 Schnittstelle wurde bereits geschlossen 1003 SCSI-Gerät gehorcht nicht dem SCSI-2 Befehlssatz 1004 SCSI-Gerät ist kein CD-ROM Laufwerk 1005 Speicher für MsgPort konnte nicht angefordert werden (interner Fehler) 1006 Speicher für IORequest konnte nicht angefordert werden (interner Fehler) 1007 Gerätetreiber ist nicht zu öffnen 1008 Zeitgeber ist nicht zu öffnen (interner Fehler) 1009 Überwachungstask konnte nicht aktiviert werden 1010 Es liegt keine CD im Laufwerk 1011 Die Spurnummer ist zu niedrig 1012 Die Spurnummer ist zu hoch 1013 Dies ist keine Audio-Spur 1014 Inhaltsverzeichnis konnte nicht gelesen werden 1015 Lautstärke konnte nicht festgelegt werden 1016 Titel konnte nicht abgespielt werden 1017 Die Reihenfolge der Titel ist nicht zulässig 1018 Die Ein-/Ausblenddauer ist zu lang 1019 Der Zeitpunkt liegt außerhalb des zulässigen Bereiches 1020 Die CD wurde gewechselt 1021 Die Variable ist nicht definiert @endnode