home *** CD-ROM | disk | FTP | other *** search
RISC OS BBC BASIC V Source | 1997-03-20 | 6.4 KB | 285 lines |
- Control the CD from within Magrathea
- Justin Fletcher
- 26 Jan 1997 : JF: Started v1.00
- 0,"This is an IRClient script and cannot be run."
- oktouse,drive,discdata
- Initialise this module
- InitialiseModule
- StartupStatus("Initialising CD...")
- Are we able to do anything ?
- buffer
- buffer=
- Claim(256)
- "XOS_SWINumberToString",&41240,buffer,256
- oktouse=(a<>&41240)
- The drive we should control
- drive=0
- Data about the current disc (0=unknown/drawer out)
- discdata=0
- The drive control block (0=unknown)
- control=0
- Pass on to other modules
- Give ourselves a sensible name
- Overload_ScriptInfo(num)
- ret$
- num=0
- ret$="CD v1.00 (Gerph)"
- ret$=
- @(num-1)
- $ =ret$
- What commands we'll overload
- Overload_UnknownCommand(com$,str$)
- com$
- "CD"
- DoCD(str$)
- @(com$,str$)
- DoCD(str$)
- com$
- control=0
- 3" control=
- CD_GetControl(drive)
- control=0
- DisplayWarning("I cannot read the drive - is it valid ?","")
- discdata=0
- CD_DiscChanged(control)
- discdata<>0
- :*
- PROCCD_DestroyTrackData(discdata)
- ;0
- "ERROR - DESTROY TRACK DATA NOT WRITTEN"
- >( discdata=
- CD_GetTrackData(control)
- discdata=0
- DisplayWarning("I cannot read any track data - is the draw open ?","")
- C' com$=
- Capitalise(
- oneparam(str$))
- str$=
- moveon(str$)
- com$
- "PLAY"
- (str$)<>0
- I. ok=
- CD_Play(discdata,control,
- (str$))
- J
- K( ok=
- CD_Play(discdata,control,1)
- L
- N;
- DisplayWarning("Could not play track - sorry","")
- O
- "NEXT","SKIP"
- RJ ok=
- CD_Play(discdata,control,
- CD_CurrentTrack(discdata,control)+1)
- T;
- DisplayWarning("Could not play track - sorry","")
- U
- W5
- DisplayWarning("Syntax: CD Play [<number>]")
- CD_GetControl(drive)
- control
- control=
- Claim(20)
- "CDFS_ConvertDriveToDevice",drive
- drive
- a"!(control)=(drive
- &00000007)
- b)!(control+4)=((drive>>3)
- &00000003)
- c)!(control+8)=((drive>>5)
- &00000007)
- d*!(control+12)=((drive>>8)
- &000000FF)
- e+!(control+16)=((drive>>16)
- &0000FFFF)
- =control
- CD_GetTrackData(control)
- b,start,end,data,total,last,num,trk
- control<16
- control>0
- k$ control=
- CD_GetControl(control)
- Claim(16)
- "CD_EnquireTrack",0,b,0,0,0,0,0,control
- start=?b
- end=?(b+1)
- "CD_DiscUsed",0,b,0,0,0,0,0,control
- total=!b
- data=
- Claim(16)
- !data=start
- !(data+4)=end
- !(data+8)=total
- !(data+12)=0
- No artist or album title
- !(data+16)=0
- !(data+20)=0
- The linked list bits
- last=(data+12)
- num=start
- "CD_EnquireTrack",num,b,0,0,0,0,0,control
- trk=
- Claim(24)
- Pointer to next
- !trk=0
- Track number
- !(trk+4)=num
- Start, length
- !(trk+8)=!b
- !(trk+12)=0
- !(trk+16)=!(b+4)
- No name data yet
- !(trk+20)=0
- Link us into last entry
- !last=trk
- num<>start
- !(last+12)=(!b)-!(last+8)
- last=trk
- num+=1
- num>end
- !(last+12)=total-!(last+8)
- Release(b)
- =data
- CD_ConvertTime(x)
- ret$
- x=(x+37)
- x<60
- ret$=
- (x)+" secs"
- x>119
- . ret$=
- 60)+" mins, "+
- 60)+" secs"
- % ret$="1 min, "+
- 60)+" secs"
- =ret$
- CD_IntroScan(data,control,time,start)
- p,status
- p=data+12
- (!p)<>0
- p=!p
- ((!(p+16))
- 1)=0
- "CD_PlayAudio",0,!(p+8)+75*start,(!(p+8))+75*(start+time),0,0,0,0,control
- "Track ";!(p+4);" :"
- " Starts : ";~!(p+8)
- " Length : ";~!(p+12);" (";
- CD_ConvertTime(!(p+12));")"
- " Flags : ";~!(p+16)
- "CD_AudioStatus",0,0,0,0,0,0,0,control
- status
- status
- status=3
- status=4
- status=5
- CD_Play(data,control,track)
- p,ok
- p=data+12
- (!p)<>0
- p=!p
- (!(p+4))=track
- "CD_PlayTrack",track,255,0,0,0,0,0,control
- ok=
- CD_CurrentTrack(data,control)
- track,p,address
- track=0
- "CD_EnquireAddress",0,0,0,0,0,0,0,control
- address
- p=data+12
- (!p)<>0
- p=!p
- (!(p+8))<address
- (!(p+12))>(address-(!(p+8)))
- track=!(p+4)
- =track
- CD_CurrentTime(data,control)
- time,p,address
- time=0
- "CD_EnquireAddress",0,0,0,0,0,0,0,control
- address
- p=data+12
- (!p)<>0
- p=!p
- (!(p+8))<address
- (!(p+12))>(address-(!(p+8)))
- time=address-!(p+8)
- =time
- CD_SkipForward(data,control,s)
- end,p
- end=!(data+8)
- "CD_EnquireAddress",0,0,0,0,0,0,0,control
- address
- address+=75*s
- address<end
- "CD_PlayAudio",0,address,end,0,0,0,0,control
- CD_SkipBackward(data,control,s)
- end,p
- end=!(data+8)
- "CD_EnquireAddress",0,0,0,0,0,0,0,control
- address
- address-=75*s
- address>0
- "CD_PlayAudio",0,address,end,0,0,0,0,control
- CD_DiscChanged(control)
- changed
- "CD_DiscChanged",0,0,0,0,0,0,0,control
- changed
- =changed
- Read the ID of the CD
- Currently this just reads the CD length in 75ths of a second
- - not the best way, but it'll do...
- CD_GetCDID(data)
- =!(data+12)
- CD_CheckDataBase(data)
- file,id$,p
- CD_GetCDID(data))
- file=
- DB_Open("CDs")
- DB_GetUserData(id$,"Tracks")<>""
- 6 !(data+16)=
- Strdup(
- DB_GetUserData(id$,"Artist"))
- 5 !(data+20)=
- Strdup(
- DB_GetUserData(id$,"Album"))
- p=data+12
- (!p)<>0
- p=!p
- 4 !(p+20)=
- Strdup(
- DB_GetUserData(id$,
- (!(p+4)))
- DB_Close(file)
- CD_SetTrackName(data,num,name$)
- p=data+12
- (!p)<>0
- p=!p
- (!(p+4))=num
- !(p+20)=
- Strdup(name$)
- Setting the album and artist name
- CD_SetArtistName(data,name$)
- !(data+16)=
- Strdup(name$)
- CD_SetAlbumName(data,name$)
- !(data+20)=
- Strdup(name$)
- Update the database
- CD_StoreData(data)
- file,id$,p
- CD_GetCDID(data))
- file=
- DB_Open("CDs")
- DB_PutUserData(id$,"Tracks",
- ((!(p+4))-(!p)+1)
- DB_PutUserData(id$,"Artist",$(!(data+16))
- DB_PutUserData(id$,"Album",$(!(data+20))
- p=data+12
- (!p)<>0
- + p=!p
- DB_PutUserData(id$,
- (!(p+4),$(!(p+20))
- DB_Close(file)
-