/* Programm: PlayCD_MM.dopus5 [18-April-1996]
** $VER: PlayCD_MM.dopus5 1.0 (04-18-96)
** 
** Copyright © 1996 Eckhard Ludwig (EMail: Eckhard@top.east.de)
** PlayCD_MM.dopus5 is freeware.
**
** Multimedia for Directory Opus 5
** Play Audio & Video-CD from DOPUS5, Test Play Audio & Video-CD, Save
** Audio-Tracks to MPEG Layer2, RAW, IFF 8SVX, AIFF, WAVE, VOC, AU & ADPCM2/3.
**
** Needed: Directory Opus 5.11 (© by Jonathan Potter & GPSoftware)
**         CeeD (Freeware, © 1994-1995 by Peter Urbanec),
**	   Video-CD requires Peggy-Plus MPEG-Card, ScalaMMPlayer &
**	   MPEG EX-Modul.
**         for save CDDA: AsimCDFS V3.5 (© by Asimware Innovations Inc.)
**         only for save MPEG Layer 2:
**         musicin & MPEGTables (FPU required !)
**         only for save 8SVX & AIFF (Toshiba & Sony CDROM):
**         CDDA 1.12 (Author: mlelstvspecklec.mpifr-bonn.mpg.de)
**         only for save ADPCM2/3:
**	   X2ADPCM (Author: flowerpeikon.e-technik.tu-muenchen.de)
**         & AIFF-Datatype 
**	   save WAV, AIFF, VOC, AU needed Amisox 3.3
**
**
** Create new button (CD Multimedia), Call as:
** ----------------------------------------------------------------------
** ARexx	DOpus5:ARexx/PlayCD_MM.dopus5 {Qp} [GUI]
** ----------------------------------------------------------------------
** Set Attribut: "Output to window" (Ausgabe in Fenster).
** Option GUI for open CeeD-GUI (Edit the CD-cataloge)
*/

/*--------S E T T I N G S : --------------------------------------------*/
/* If the file ENV:PlayCD_MM.prefs exists, that one will override the   */
/* settings here ...                                                    */

/* Path to CEED */
CDPlay = "DOpus5:CEED/CEED"
KATALOG="DOpus5:CeeD/Disks"
Device="2nd.scsi.device"
Unit=2
BLOCKDIFF=150  /* Differenz Blocks, CeeD-Fehler? */

/* Path to ScalaMMPlayer (Install MPEG EX-Modul !) */
MPEGPlayer="Work:Scala/ScalaMMPlayer"
VMON ="NO"  /* YES= 2.Videomonitor (Grafikkarte), NO= 1 Monitor */
VTIME=10      /* Zeit in sec bis zum Anlaufen des Video ( zu kurz = GURU !) */

/* Path to MPEG Audio-Encoding */
MPEGENC= "DOpus5:MpegAudio/musicin.030FPU -b 192 -d c -m j"
MPEGTAB= "DOpus5:MpegAudio/Tables"

/* Path to CDDA 1.12 */
CDSave = "C:CDDA" /* only for Toshiba/Sony CDROM */

/* Path to ADPCM-Encoding  */
ADPCM = "C:X2ADPCM"

CDROMPL="TOSHIBA"
Amisox = "C:SOX020"
ASIMCD = "CD0:"
RESTTIME=2    /* Auslaufzeit in sec Video/Audio-CD (Pause zwischen 2 Tracks) */

/*--Hauptprogramm--------------------------------------------------------*/

if ~show('l','rexxsupport.library') then call addlib('rexxsupport.library',0,-30,0)
if ~openport('ceed-handler') then exit

signal on syntax
signal on halt
options results
options failat 21
lf='0a'x

if open(1,'env:PlayCD_MM.prefs','R') then do /* Environment-Variable auswerten */
   do i=1 to 15
	prefs.i = readln(1)
        end
   if prefs.2 ~="" then CDPlay=prefs.2
   if prefs.3 ~="" then CDSave=prefs.3
   if prefs.4 ~="" then RESTTIME=prefs.4
   if prefs.5 ~="" then Device=prefs.5
   if prefs.6 ~="" then Unit=prefs.6
   if prefs.7 ~="" then KATALOG=prefs.7
   if prefs.8 ~="" then Amisox=prefs.8
   if prefs.9 ~="" then MPEGENC=prefs.9
   if prefs.10 ~="" then MPEGTAB=prefs.10
   if prefs.11 ~="" then ADPCM=prefs.11
   if prefs.12 ~="" then ASIMCD=prefs.12
   if prefs.13 ~="" then CDROMPL=prefs.13
   if prefs.14 ~="" then MPEGPlayer=prefs.14
   if prefs.15 ~="" then VMON=prefs.15

   drop prefs.
   call close(1)
   end

/* init locale standard=deutsch */
if ~show(l,'locale.library') then call addlib('locale.library',0,-30)
if show(l,'locale.library') then catalog=opencatalog('PlayCD_MM.catalog','deutsch',0)

parse arg portname GUI
if portname='' then portname='DOPUS.1'
address value portname

if ~show('P','CEED') then do  /* CeeD wird gestartet */
   if ~exists(CDPlay) then do
      dopus front
      dopus request '"'getcatstr(0,'Fehler:'lf'CeeD nicht gefunden (Pfad: %s ).'lf'Setze Pfad oder starte CeeD zuerst !',CDPlay)'"' getcatstr(1,'Beenden')
      call closeport('ceed-handler')
      Exit
      end
   if ~exists(KATALOG) then do
      dopus front
      dopus request '"'getcatstr(2,'Fehler:'lf'Verzeichnis für CD-Kataloge nicht gefunden (Pfad: %s ).'lf'Setze Pfad oder starte CeeD zuerst !',KATALOG)'"' getcatstr(1,'Beenden')
      call closeport('ceed-handler')
      Exit
      end
   call pragma("STACK",20000)
   address command
   if GUI="GUI" then "Run >NIL: "CDPlay" DEVICE="DEVICE" UNIT="UNIT" CATALOG="KATALOG
      else "Run >NIL: "CDPlay" DEVICE="DEVICE" UNIT="UNIT" CATALOG="KATALOG" NOGUI"
   'waitforport CEED'
   CEEDST=1
end
    
address value portname
lister new  /* Opus-Lister wird geöffnet */
handle=result

do forever   /* Schleife bei CD-Wechsel */
   CDDA=0
   VIDEO=0
   VFLAG=0
   CDROM=0
   address 'CEED'
   'GET_NUM_TRACKS' /* CD eingelegt ? */
   if result=0 then call Meldung1 /* Keine CD eingelegt */
   'GET_NUM_TRACKS' /* letzten Track ermitteln */
   MAXTRACK=result
   'STOP'
   'GET_DISC_NAME'
   cdlabel=result
   'GET_ARTIST_NAME'
   CDARTIST=result
   'GET_TRACK_TIME' 1  /* Einlauftrack */
   TIME=result
   if pos("Video",CDLABEL)>0 then VIDEO=1
   if cdlabel='result' then call Ende /* CeeD wurde beendet */
   if cdlabel="<Unknown CD>" then do
	cdname=getcatstr(3,'Kein Katalogeintrag !')
   	address value portname
  	dopus request '"'getcatstr(20,'Für die CD existiert'lf'kein Eintrag im Medienkatalog.'lf'Bitte wählen Sie den Typ aus.')'"' getcatstr(27,'Audio-CD|Video-CD|CDROM')
  	if RC=1 then CDDA=1
  	if RC=2 then VIDEO=1
  	if RC=0 then CDROM=1
     	if CDDA=1 then cdname=getcatstr(31,'Audio CD (CDDA)')
     	if VIDEO=1 then cdname='Video CD'
     	if CDROM=1 then cdname='CDROM'
	end
      else CDNAME=CDARTIST"-"cdlabel
   address value portname
   lister set handle title CDNAME
   lister set handle sort name /* Lister nach Namen (da Nummern vorangestellt werden) sortieren */
   lister set handle busy on
   lister set handle progress MAXTRACK getcatstr(4,'Erstelle Titelliste ...')
   lister refresh handle full  
   do i=1 to MAXTRACK
      lister query handle abort              /* Abbruch ? */
      if result then leave
      lister set handle progress count i
      lister set handle progress name getcatstr(5,'Titel')'  'i
      address 'CEED'
      'GET_NUM_TRACKS'
      if result=0 then leave              /* falls während einlesen CD von Hand ausgeworfen wird */
      'GET_TRACK_NAME' i
      SONGNAME=result
      BLOCKSIZE=2048
      if left(SONGNAME,5)="Daten" | left(SONGNAME,4)="Data" | SONGNAME="CD-ROM" | right(SONGNAME,4)="Data" | CDROM=1 then SONGNAME=getcatstr(6,'Daten Track')
      if VIDEO=1 & SONGNAME~=getcatstr(6,'Daten Track') then BLOCKSIZE=2328
      if VIDEO~=1 & SONGNAME~=getcatstr(6,'Daten Track') then do
		CDDA=1    /* wenigsten ein Audio-Track sollte drauf sein */
	 	BLOCKSIZE=2352
		end
      'GET_TRACK_TIME' i+1
      TIME2=result
      BLOCKS1=left(TIME,2)*4500+substr(TIME,4,2)*75+right(TIME,2)-BLOCKDIFF
      BLOCKS2=left(TIME2,2)*4500+substr(TIME2,4,2)*75+right(TIME2,2)-BLOCKDIFF
      TIME=TIME2
      BLOCKS=BLOCKS2-BLOCKS1
      SONGTIME=right(BLOCKS%4500,2,0)
      SONGTIME=SONGTIME":"right((BLOCKS-(SONGTIME*4500))%75,2,0)
      j=right(i,2)
    address value portname   
      lister add handle '"'j" "SONGNAME'" 'BLOCKS*BLOCKSIZE' -1 'i' r 'SONGTIME"   ("BLOCKS1"-"BLOCKS2-1")"
      lister set handle display name size comment
      lister refresh handle full
   end
   address 'CEED'
   'GET_NUM_TRACKS'
   if result=0 then do        /* wurde CD ausgeworfen ? */
	address value portname
	lister set handle busy off
	lister clear handle
	lister refresh handle full
	iterate     /* dann an Schleifen-Anfang, wo dies gemeldet wird */
	end
   'GET_TRACK_TIME' MAXTRACK+1
   CDTIME=result    /* CD-Länge merken für Vergleiche */
   address value portname
   lister set handle busy off

   if CDDA~=1 & VIDEO~=1 then do  /* CD nur Datentracks ?*/
	lister set handle busy on
	dopus request '"'getcatstr(21,'Fehler:'lf'CD enthält nur Datentracks !')'"' getcatstr(26,'Beenden|Ok')
	if RC=1 then do
	       lister set handle busy off
	       call Ende
	       end
	lister set handle busy off
	lister clear handle
	lister refresh handle full
	iterate
	end
   if VIDEO=1 & ~show('P','rexx_ScalaMM') then do
 	if show('P','Peggy') then do
          dopus front
          dopus request '"'getcatstr(30,'Fehler:'lf'Bitte zuerst den Peggyplus/MPEGPlayer beenden !')'"' getcatstr(1,'Ende')
	  call Ende
	  end
      if exists(MPEGPlayer) then do
	call pragma('STACK',30000)
        address command 'RUN >NIL: <NIL: 'MPEGPlayer' -arexx'
        address command 'waitforport rexx_ScalaMM'
        end
      else do
          dopus front
          dopus request '"'getcatstr(28,'Leider ist ein Fehler aufgetreten:'lf'Das Spielen von Video-CD erfordert eine Peggy MPEG-Karte und den ScalaMMPlayer !'lf'Der aktuelle Player-Pfad ist: '"'%s'"'',MPEGPlayer)'"' getcatstr(1,'Beenden')
	  call Ende
          end
   end

   lister set handle handler 'ceed-handler' 'quotes'

   /* install traps */
   address value portname
   dopus addtrap copy 'ceed-handler'
   dopus addtrap move 'ceed-handler'
   dopus addtrap copyas 'ceed-handler'
   dopus addtrap moveas 'ceed-handler'
   dopus addtrap read 'ceed-handler'
   dopus addtrap hexread 'ceed-handler'
   dopus addtrap delete 'ceed-handler'
   dopus addtrap rename 'ceed-handler'
   dopus addtrap devicelist 'ceed-handler'
   dopus addtrap parent 'ceed-handler'
   dopus addtrap root 'ceed-handler'
   dopus addtrap show 'ceed-handler'
   dopus addtrap play 'ceed-handler'
   dopus addtrap protect 'ceed-handler'
   dopus addtrap datestamp 'ceed-handler'
   dopus addtrap comment 'ceed-handler'
   dopus addtrap makedir 'ceed-handler'
   dopus addtrap addicon 'ceed-handler'
   dopus addtrap cachelist 'ceed-handler'

/*---Beginn des ceed-handler--------------------------------------*/
   do forever
     if waitpkt('ceed-handler') then do
       packet=getpkt('ceed-handler')
       if packet='00000000'x then iterate
       event=getarg(packet,0)
       handle=getarg(packet,1)
       titel=getarg(packet,2)
       user=getarg(packet,3)
       pathstr=getarg(packet,4)
       if event="Root" then leave
       if event="Parent" then leave
       if event="parent" then leave
       if event="inactive" then call Ende
       address 'CEED'
       'GET_NUM_TRACKS'
       if result=0 then leave       /* CD wurde vor Play entnommen ! */
       'GET_TRACK_TIME' MAXTRACK+1
       if result~=CDTIME then leave  /* CD wurde vertauscht ! */
       T_FLAG=0
        select
          when event="doubleclick" then call Player
          when event="Play" then call SelPlay
          when event="path" then iterate
          when event="Show" then call CDTest
          when event="Copy" then call SaveCD
          when event="Move" then call SaveCD
          when event="CopyAs" then call SaveCDAs
          when event="MoveAs" then call SaveCDAs
          when event="MakeDir" then call CDEject
     	  when event="AddIcon" then call CDEject
          when event="CacheList" then call CDEject
          when event="dropfrom" then call SaveCD
          when event="drop" then iterate
          otherwise call Productinfo
        end
       address value portname
       reply(packet,10)
     end
     address 'CEED'
     'GET_NUM_TRACKS'
     if result=0 then leave       /* CD wurde während Play entnommen ! */
   end
   address value portname
   lister clear handle
   lister refresh handle full
end      /* Ende Schleife bei CD-Wechsel */

/*---Unterprogramm CD auswerfen------------------------------------------------------------------*/
CDEject:
address 'CEED'
'EJECT'
return

/*---Unterprogramm Tracks anspielen---------------------------------------------------------------*/
CDTest:
address value portname
dopus request '"'getcatstr(8,'Audio/Video-CD anspielen:'lf''lf'Den Track anspielen für wie lang ?')'"' getcatstr(9,'30s|45s|60s|Abbruch')
if RC=0 then return
if RC=1 then sptime=30
if RC=2 then sptime=45
if RC=3 then sptime=60
T_FLAG=1

/*---Unterprogramm selektierte Tracks spielen-----------------------------------------------------*/
SelPlay:
if VIDEO=1 then VFLAG=1
address value portname
lister set handle busy on
lister query handle selfiles stem files.

address 'CEED'
'STOP'
do i=0 to files.count-1
   titel=files.i
   call Player
   address 'CEED'
   'GET_TRACK_TIME' left(titel,2)
   TIME=result
   'GET_TRACK_TIME' left(titel,2)+1
   TIME2=result
   BLOCKS=(left(TIME2,2)*4500+substr(TIME2,4,2)*75+right(TIME2,2))-(left(TIME,2)*4500+substr(TIME,4,2)*75+right(TIME,2))
   SEC=(BLOCKS%75)-RESTTIME
   If T_FLAG=1 then SEC=sptime
   TIME=(left(TIME,2)*60)+substr(TIME,4,2)
   address value portname
   if T_FLAG=0 then do
      	if VIDEO=1 then lister set handle progress SEC getcatstr(29,'Spiele Video-CD ...  Track')' 'i+1'/'files.count
      	   else lister set handle progress SEC getcatstr(7,'Spiele Audio-CD ...  Titel')' 'i+1'/'files.count
	end
     else lister set handle progress SEC getcatstr(10,'Spiele Track %s sec an ...  Track',sptime)' 'i+1'/'files.count
   lister refresh handle full  
   do k.eins= 1 to SEC  		/* Zeitschleife Tracklaufzeit */
      address 'CEED'
      'GET_NUM_TRACKS'
      if result=0 then leave 		/* CD wurde entnommen */
      TIME=TIME+1
      if getcatstr(6,'Daten Track')~=substr(titel,4) & VIDEO=1 then do
      	   'GET_CUR_TIME'
	   TIME2=(left(result,2)*60)+substr(result,4,2)
      	   if TIME2<TIME then do   	/* Pause 1sec Video-CD über Scala (sonst kein MT ?) */
		address 'rexx_ScalaMM'
		'PAUSE 1'
		'SHOW'
		end
	end
      do k.zwei=1 to 12  	  	/* Sekunden Feintuning mittels selbstdichtender Schaftbolzen */
           address 'CEED'
      	   'GET_CUR_TIME'
	   TIME2=(left(result,2)*60)+substr(result,4,2)
      	   if TIME2>=TIME then leave k.zwei
      	   'GET_CUR_TRACK'
      	   if result~=left(titel,2) then leave k.eins /* Trackvergleich (2.Sicherheit) */
      	   delay(10)
      	   end
      TIME2=(SEC-k.eins)%60
      TIME2=right(TIME2,2,0)":"right((SEC-k.eins)-(TIME2*60),2,0)   
      address value portname
      lister set handle progress count k.eins
      lister set handle progress name TIME2' 'substr(files.i,4,21)
      lister query handle abort
      if result then do
	    lister set handle busy off
	    lister clear handle progress
	    lister refresh handle full
	    if getcatstr(6,'Daten Track')~=substr(titel,4) & VIDEO=1 then do
		address 'rexx_ScalaMM'
		EX MPEG PLAY STOP
		'SHOW'
		'CONTINUE'
		return
		end
	    address 'CEED'
	    'STOP'
	    return
	    end
   end
   address value portname
   lister select handle '"'files.i'"' off
   lister clear handle progress
   lister refresh handle full
end
lister set handle busy off
if getcatstr(6,'Daten Track')~=substr(titel,4) & VIDEO=1 then do
	address 'rexx_ScalaMM'
	EX MPEG PLAY STOP
	'SHOW'
	'CONTINUE'
	end
address 'CEED'
'STOP'
return

/*---Unterprogramm Play -------------------------------------------------------------------------*/
Player:
if getcatstr(6,'Daten Track') = substr(titel,4) then return  /* Datentrack return */
if CDDA=1 then do
	address 'CEED'
	'PLAY' left(titel,2)
	return
	end
if VIDEO~=1 then return

/*---Unterprogramm Play Video -------------------------------------------------------------------*/

address 'rexx_ScalaMM'
'MOUSE on'
'FKEYS off'
'NUMKEYS off'
'JOYSTICK off'
'POINTER off'
'INTERACTIVE off'

EX MPEG PLAY CD left(titel,2)" "left(titel,2)

if VMON="NO" | VFLAG=0 then do  /* Titel nur bei 1Monitor oder Doppelklick */
	'BLANK 736 566 4 lace hires 0'
	'PALETTE 000 fff ccc aaa 888 666 262626 000 c00 d60 fb0 080 58b 53c a2b f3b'
	'WIPE cut speed 1'
	'MARGINS on 58 677'
	'FONT helvetica.font 39'
	'COLOR 1 3 7 7 7 0 1 7 0 1 2 4 7 5 1'
	'ATTRIBUTES shadow edge remap left'
	'STYLE 0 3 3 3 6 2 1 33 5 1 13 5 2 0 1 0 4 4 7'
	'TEXTWIPE wipe east speed 10'
	'TEXT 58 74 'translate(CDARTIST," "," ")  /* Space durch Altspace (ASCII 160) ersetzen */
	'COLOR 2 4 7 7 7 0 2 7 0 2 1 1 5 3 2'
	'TEXTWIPE wipe west speed 10'
	'TEXT 58 129 'translate(CDLABEL," "," ")  /* Space durch Altspace (ASCII 160) ersetzen */
	'COLOR 10 0 9 7 7 0 10 0 0 10 10 10 7 6 10'
	'ATTRIBUTES edge jam antialias remap center'
	'STYLE 0 3 2 3 6 2 1 33 5 1 13 5 6 2 1 1 4 4 7'
	'TEXTWIPE bob east easeout speed 10'
	'TEXT 250 460 'translate(center(substr(titel,4),30)," "," ")' pause 5'
	'TEXTWIPE dissolve speed 6'
	'TEXTOUT 1 pause 2'
	'TEXTOUT 2'
	'TEXTOUT 3 pause 10'
	'SHOW'
	if VFLAG=1 then return
	'PAUSE -1'
	'SHOW'
	'CONTINUE'
	return
	end
'SHOW'

address value portname
if i=0 then dopus front

address 'rexx_ScalaMM'
'PAUSE 'VTIME
'SHOW'
return

/*---Unterprogramm Audio-Tracks speichern---------------------------------------------------------------*/
SaveCDAs:
T_FLAG=1
SaveCD:
if VIDEO=1 then return
address value portname
select
    when (CDROMPL="TOSHIBA" | CDROMPL="SONY") & showlist("D","asimcdfs.device")=1 then dopus request '"'getcatstr(11,'Speichern von Audiodaten:'lf'Bitte das Speicherformat wählen.')'"' 'MP2|MP32|AIFF|8SVX|MONO|RAW|WAVE|VOC|AU|ADPCM2|ADPCM3|'getcatstr(12,'Abbruch')
    when showlist("D","asimcdfs.device")=1 then dopus request '"'getcatstr(11,'Speichern von Audiodaten:'lf'Bitte das Speicherformat wählen.')'"' 'MP2|MP32|AIFF|RAW|WAVE|VOC|AU|ADPCM2|ADPCM3|'getcatstr(12,'Abbruch')
    when CDROMPL="TOSHIBA" | CDROMPL="SONY" then dopus request '"'getcatstr(11,'Speichern von Audiodaten:'lf'Bitte das Speicherformat wählen.')'"' 'MP2|AIFF|8SVX|MONO|ADPCM2|ADPCM3|'getcatstr(12,'Abbruch')
    otherwise do
	dopus request '"'getcatstr(17,'Fehler:'lf'CDDA V1.12 unterstützt nur SONY & TOSHIBA CDROM-Laufwerke.'lf'Für Save über andere CDDA-fähige Laufwerke bitte AsimCDFS (ab V3.5) installieren.')'"' getcatstr(16,'Zurück')
	return
	end
end
SP_FLAG=RC
if SP_FLAG=0 then return

If (CDROMPL="TOSHIBA" | CDROMPL="SONY") & showlist("D","asimcdfs.device")=1 then FT=word(".mp2 .mp32 .aiff .8svx .mono .cdr .wave .voc .au .adpcm2 .adpcm3",SP_FLAG)
else do
  If showlist("D","asimcdfs.device")=1 then FT=word(".mp2 .mp32 .aiff .cdr .wave .voc .au .adpcm2 .adpcm3",SP_FLAG)
    else FT=word(".mp2 .aiff .8svx .mono .adpcm2 .adpcm3",SP_FLAG)
  end
if FT=".adpcm2" | FT=".adpcm3" then do
	if ~exists(ADPCM) then do
	   dopus request '"'getcatstr(14,'Leider ist ein Fehler aufgetreten:'lf'Das externe Programm X2ADPCM (aktueller Pfad %s ) wurde nicht gefunden.',ADPCM)'"' getcatstr(16,'Zurück')
	   return
           end
	if ~exists("DEVS:Datatypes/AIFF") | ~exists("SYS:Classes/Datatypes/aiff.datatype") then do
	   dopus request '"'getcatstr(14,'Leider ist ein Fehler aufgetreten:'lf'Der AIFF Datatype (aktueller Pfad %s ) ist nicht installiert.',"SYS:Classes/Datatypes/aiff.datatype")'"' getcatstr(16,'Zurück')
	   return
           end
        end
if (FT=".mono" | FT=".8svx") | ((FT=".aiff" | FT=".mp2" | FT=".adpcm2" | FT=".adpcm3") & showlist("D","asimcdfs.device")~=1 & (CDROMPL="TOSHIBA" | CDROMPL="SONY")) then do
	if ~exists(CDSave) then do
	   dopus request '"'getcatstr(14,'Leider ist ein Fehler aufgetreten:'lf'Das externe Programm CDDA V1.12 (aktueller Pfad %s ) wurde nicht gefunden.',CDSave)'"' getcatstr(16,'Zurück')
	   return
           end
	call open('file','ENV:CDDA_DEVICE',W)
	call writech('file',DEVICE)
	call close ('file')
	call open('file','ENV:CDDA_UNIT',W)
	call writech('file',UNIT)
	call close ('file')
       end
   else do
   if showlist("D","asimcdfs.device")=1 then do
   	if ~exists(ASIMCD"AIFF_Stereo") then do
	   dopus request '"'getcatstr(14,'Leider ist ein Fehler aufgetreten:'lf'Der Devicename des CDROM (aktuell %s ) ist nicht korrekt installiert,'lf'bzw. wählen Sie über AsimCDFS/DiscChanger CD-Audio aus.',ASIMCD)'"' getcatstr(16,'Zurück')
	   return
           end
  end
end
if ~exists(Amisox) then do
	   if FT=".mp32" | FT=".wave" | FT=".voc" | FT=".au" | ((FT=".adpcm2" | FT=".adpcm3" | FT=".mp2") & CDROMPL~="TOSHIBA" & CDROMPL~="SONY" & showlist("D","asimcdfs.device")~=1) then do
	   dopus request '"'getcatstr(15,'Leider ist ein Fehler aufgetreten:'lf'Das externe Programm AmiSOX (aktueller Pfad %s ) wurde nicht gefunden.'lf'Wählen Sie Speichern als RAW, AIFF, MP2 oder ADPCM.',Amisox)'"' getcatstr(16,'Zurück')
	   return
           end
	end

address 'CEED'
'STOP'
address value portname
lister set handle busy on
lister set user busy on
if event='dropfrom' then do
   files.count=1
   LNG=POS('22'x,titel,2)-1
   titel=left(titel,LNG)
   files.0=right(titel,LNG-1)
   end
   else lister query handle selfiles stem files.
lister set handle progress files.count getcatstr(18,'Speichere Audiodaten ...')
lister refresh handle full  
lister query user path
Zielpfad=result

do i=0 to files.count-1
   titel=strip(left(substr(files.i,4),21))
   tracknr=strip(left(files.i,2),"B"," ")
   tracknr2=right(tracknr,2,0)
   address 'CEED'
   'GET_TRACK_NAME' tracknr
   SONGNAME=result
   'GET_TRACK_TIME' tracknr
   TIME=result
   'GET_TRACK_TIME' tracknr+1
   TIME2=result
   BLOCKS1=left(TIME,2)*4500+substr(TIME,4,2)*75+right(TIME,2)-BLOCKDIFF
   BLOCKS2=left(TIME2,2)*4500+substr(TIME2,4,2)*75+right(TIME2,2)-BLOCKDIFF
   BLOCKS=BLOCKS2-BLOCKS1
   SONGTIME=right(BLOCKS%4500,2,0)
   SONGTIME=SONGTIME":"right((BLOCKS-(SONGTIME*4500))%75,2,0)
   address value portname
   lister set handle progress count i+1
   lister set handle progress name titel||FT
   lister query handle abort
   if result then leave
   if getcatstr(6,'Daten Track') ~= substr(files.i,4) then do  /* Datentrack überspringen */
     if T_FLAG=1 then do
	   command beep
	   dopus getstring '"'getcatstr(13,'Bitte neuen Namen eingeben')'"' 21 '"'titel'"' 'OK|'getcatstr(12,'Abbruch') 
	   if DOPUSRC=0 then leave
	   ttitel=result
	   if ttitel~="RESULT" then titel=ttitel
   	   lister set handle progress name titel||FT
	   end 
      	if FT=".8svx" then address command CDSave||" TRACK="||tracknr||" FILE="'"'||Zielpfad||tracknr2" "titel||FT'"'||" MUTE 8SVX"
      	if FT=".mono" then address command CDSave||" TRACK="||tracknr||" FILE="'"'||Zielpfad||tracknr2" "titel||FT'"'||" MUTE 8SVX MONO"
	If showlist("D","asimcdfs.device")=1 then do
	   if FT=".aiff" then address command "copy "ASIMCD"AIFF_Stereo/Track."tracknr" to "'"'||Zielpfad||tracknr2" "titel||FT'"'||" QUIET"
	   if FT=".cdr"  then address command "copy "ASIMCD"CDDA_LeastSignificant/Track."tracknr" to "'"'||Zielpfad||tracknr2" "titel||FT'"'||" QUIET"
           if FT=".wave" then address command Amisox||" -traw -r44100 -c2 -x -sw "ASIMCD"CDDA_LeastSignificant/Track."tracknr" -twav "'"'||Zielpfad||tracknr2" "titel||FT'"'
           if FT=".mp32" then address command Amisox||" -traw -r44100 -c2 -x -sw "ASIMCD"CDDA_LeastSignificant/Track."tracknr" -taiff -r32000 "'"'||Zielpfad||titel'"'
           if FT=".voc"  then address command Amisox||" -traw -r44100 -c2 -x -sw "ASIMCD"CDDA_LeastSignificant/Track."tracknr" -tvoc "'"'||Zielpfad||tracknr2" "titel||FT'"'
           if FT=".au"   then address command Amisox||" -traw -r44100 -c2 -x -sw "ASIMCD"CDDA_LeastSignificant/Track."tracknr" -U -r8000 "'"'||Zielpfad||tracknr2" "titel||FT'"'
           if FT=".adpcm2" then address command ADPCM" "'"'||ASIMCD"AIFF_Stereo/Track."||tracknr'"'" to "'"'||Zielpfad||tracknr2" "titel||FT'"'" Bits=2"
           if FT=".adpcm3" then address command ADPCM" "'"'||ASIMCD"AIFF_Stereo/Track."||tracknr'"'" to "'"'||Zielpfad||tracknr2" "titel||FT'"'" Bits=3"
	   if FT=".mp2"|FT=".mp32" then do
		OldStack=pragma("STACK",80000)
		OldPrior=pragma("PRIORITY",-2)
		address command
		"setenv MPEGTABLES "||MPEGTAB
		if FT=".mp2" then MPEGENC" "ASIMCD"AIFF_Stereo/Track."tracknr" "'"'||Zielpfad||tracknr2" "titel||FT'"'		
		      else MPEGENC" -s 32 "'"'||Zielpfad||titel'"'" "'"'||Zielpfad||tracknr2" "titel||FT'"'	
		call pragma("STACK",OldStack)
		call pragma("PRIORITY",OldPrior)
		end
	   if FT=".mp32" then address command "Delete >NIL: "'"'||Zielpfad||titel'"'
	   end
	else do
	if FT=".aiff" then address command CDSave||" TRACK="||tracknr||" FILE="'"'||Zielpfad||tracknr2" "titel||FT'"'||" MUTE"
        if FT=".adpcm3" | FT=".adpcm2" | FT=".mp2" then do
	   address command CDSave||" TRACK="||tracknr||" FILE="'"'||Zielpfad||titel'"'||" MUTE"
           if FT=".adpcm2" then address command ADPCM" "'"'||Zielpfad||titel'"'" to "'"'||Zielpfad||tracknr2" "titel||FT'"'" Bits=2"
           if FT=".adpcm3" then address command ADPCM" "'"'||Zielpfad||titel'"'" to "'"'||Zielpfad||tracknr2" "titel||FT'"'" Bits=3"
	   if FT=".mp2" then do
		OldStack=pragma("STACK",80000)
		OldPrior=pragma("PRIORITY",-2)
		address command
		"setenv MPEGTABLES "||MPEGTAB
		MPEGENC" "'"'||Zielpfad||titel'"'" "'"'||Zielpfad||tracknr2" "titel||FT'"'	
		call pragma("STACK",OldStack)
		call pragma("PRIORITY",OldPrior)
	        end	
	   address command "Delete >NIL: "'"'||Zielpfad||titel'"'
	   end
	end
      address command "FILENOTE "'"'Zielpfad||tracknr2" "titel||FT'"'" "'"'SONGTIME" "left(cdname,32,'20'x)" "SONGNAME'"'
      end
   address value portname
   lister select handle '"'files.i'"' off
   lister refresh handle full
end

lister set handle busy off
lister set user busy off
lister read user Zielpfad force
lister refresh user full
return

/*---Unterprogramm Copyright---------------------------------------------------------------------*/
Productinfo:
address 'CEED'
'VERSION FULL'
pversion=result
address value portname
do forever
  dopus request '"'getcatstr(19,'Über')' PlayCD_MM.dopus5 V1.0:'lf'Copyright ©1996 Eckhard Ludwig'lf'Freely distributable release'lf''lf'CDDA-Player='CDPlay''lf''PVersion||lf||lf||'CD Artist='CDARTIST||lf||getcatstr(24,'CD Katalogtitel=%s'lf'CD Gesamtdauer=%s (min:sec:frames)',cdlabel,CDTIME)'"' getcatstr(23,'Beenden|Über CDROM|Über MP2|Hilfe|Ok')
  if RC=0 then return
  if RC=1 then call Ende
  if RC=2 then dopus request '"'"Configuration (PlayCD_MM.prefs):"||lf||lf||"CDROM="CDROMPL||lf||"Device="Device"  Unit="Unit||lf"Catalog="KATALOG||lf"Videoplayer="MPEGPlayer'"' getcatstr(16,'Zurück')
  if RC=4 then dopus request '"'getcatstr(22,'PlayCDDA_CeeD.dopus5 Kurzhilfe:'lf'Mutterverzeichnis: CD neu einlesen'lf'Doppelklick: Spielen ab geklickten Titel'lf'Abspielen: Spiele alle selektierten Titel'lf'Anzeigen: Spiele alle selektierten Titel kurz an'lf'Kopieren: Selektierte Titel speichern'lf'Schublade: CD auswerfen')'"' getcatstr(16,'Zurück')
  if RC=3 then do
	POS1=pos("-m",MPEGENC)
	if POS1>0 then CM=substr(MPEGENC,POS1+3,1)
	POS1=pos("-d",MPEGENC)
	if POS1>0 then DE=substr(MPEGENC,POS1+3,1)
	POS1=pos("-b",MPEGENC)
	if POS1>0 then BitR=substr(MPEGENC,POS1+3,3)
	else BitR="382"
   select
	when CM="d" then CMode="Dual channel"
	when CM="j" then CMode="Joint stereo"
	when CM="m" then CMode="Single channel"
	otherwise CMode="Stereo"
   	end
   select
	when DE="5" then DEE="50/15 microsec"
	when DE="c" then DEE="CCITT j.17"
	otherwise DEE="None"
   	end
   dopus request '"'"MPEG Encoder Configuration:"lf"Layer = 2"lf"Channel Mode = "CMode||lf"Total bitrate = "BitR" kbps"lf"De-emphasis = "DEE'"' getcatstr(16,'Zurück')
   end
end
/*---Unterprogramm Lokalisierung (Dank an Edmund Vermeulen)--------------------------------------*/
getcatstr:
   parse arg msgno,msgstring,insert.1,insert.2
   if catalog~=0 then msgstring=getcatalogstr(catalog,msgno,msgstring)
   j=0
   do while pos('%s',msgstring)>0
      parse var msgstring fore '%s' aft
      j=j+1
      msgstring=fore||insert.j||aft
      end
   return msgstring
/*---Unterprogramm Audio-CD einlegen-------------------------------------------------------------*/
Meldung1:
  address value portname
  dopus request '"'getcatstr(25,'Fehler:'lf'Bitte eine Video oder Audio-CD einlegen...'lf'(Ok wartet 90 Sekunden)')'"' getcatstr(26,'Beenden|Ok')
  if RC=1 then call Ende
  do i= 1 to 90  /* wait max 90sec */
     address value portname
     lister query handle busy /* wurde inzwischen Lister geschlossen ?*/
     if RC>0 then leave
     address 'CEED'     
     'GET_NUM_TRACKS'
     if result>0 then return
     delay(50)
  end
/*---Unterprogramm Programm beenden--------------------------------------------------------------*/
Ende:
address value portname
lister close handle
dopus remtrap '*' 'ceed-handler'
call closeport('ceed-handler')
if show('P','CEED') then do
	address 'CEED'
	if CDDA=1|VIDEO=1 then 'EJECT'
	if CEEDST=1 then 'QUIT'
	end
if show('P','rexx_ScalaMM') then do
	address 'rexx_ScalaMM'
	'QUIT'
	end
exit
/*---Unterprogramm Syntaxfehler------------------------------------------------------------------*/
syntax:
if rc=13 then call Ende /* CeeD wurde über GUI beendet */
say 'Syntax Error' rc',' errortext(rc) 'in line' sigl'.'
return
halt:
address 'rexx_ScalaMM'
'CONTINUE'
address value portname
lister set handle busy off
lister clear handle progress
lister refresh handle full
call Ende
