home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / comms_networking / irclient / !IRClient / Scripts / Modules / CD (.txt) < prev    next >
Encoding:
RISC OS BBC BASIC V Source  |  1997-03-20  |  6.4 KB  |  285 lines

  1.  Control the CD from within Magrathea
  2.  Justin Fletcher
  3.  26 Jan 1997 : JF: Started                           v1.00
  4.  0,"This is an IRClient script and cannot be run."
  5.  oktouse,drive,discdata
  6.  Initialise this module
  7. InitialiseModule
  8. StartupStatus("Initialising CD...")
  9.  Are we able to do anything ?
  10.  buffer
  11. buffer=
  12. Claim(256)
  13.  "XOS_SWINumberToString",&41240,buffer,256 
  14. oktouse=(a<>&41240)
  15.  The drive we should control
  16. drive=0
  17.  Data about the current disc (0=unknown/drawer out)
  18. discdata=0
  19.  The drive control block (0=unknown)
  20. control=0
  21.  Pass on to other modules
  22.  Give ourselves a sensible name
  23. Overload_ScriptInfo(num)
  24.  ret$
  25.  num=0 
  26.  ret$="CD v1.00 (Gerph)"
  27.  ret$=
  28. @(num-1)
  29. $    =ret$
  30.  What commands we'll overload
  31. Overload_UnknownCommand(com$,str$)
  32.  com$ 
  33.  "CD"
  34. DoCD(str$)
  35. @(com$,str$)
  36. DoCD(str$)
  37.  com$
  38.  control=0 
  39. 3" control=
  40. CD_GetControl(drive)
  41.  control=0 
  42. DisplayWarning("I cannot read the drive - is it valid ?","")
  43.  discdata=0 
  44. CD_DiscChanged(control) 
  45.  discdata<>0 
  46. :*   
  47.  PROCCD_DestroyTrackData(discdata)
  48. ;0   
  49. "ERROR - DESTROY TRACK DATA NOT WRITTEN"
  50. >(  discdata=
  51. CD_GetTrackData(control)
  52.  discdata=0 
  53. DisplayWarning("I cannot read any track data - is the draw open ?","")
  54. C'  com$=
  55. Capitalise(
  56. oneparam(str$))
  57.   str$=
  58. moveon(str$)
  59.  com$ 
  60.  "PLAY"
  61. (str$)<>0 
  62. I.     ok=
  63. CD_Play(discdata,control,
  64. (str$))
  65. J        
  66. K(     ok=
  67. CD_Play(discdata,control,1)
  68. L        
  69. N;     
  70. DisplayWarning("Could not play track - sorry","")
  71. O        
  72.  "NEXT","SKIP"
  73. RJ    ok=
  74. CD_Play(discdata,control,
  75. CD_CurrentTrack(discdata,control)+1)
  76. T;     
  77. DisplayWarning("Could not play track - sorry","")
  78. U        
  79. W5    
  80. DisplayWarning("Syntax: CD Play [<number>]")
  81. CD_GetControl(drive)
  82.  control
  83. control=
  84. Claim(20)
  85.  "CDFS_ConvertDriveToDevice",drive 
  86.  drive
  87. a"!(control)=(drive 
  88.  &00000007)
  89. b)!(control+4)=((drive>>3) 
  90.  &00000003)
  91. c)!(control+8)=((drive>>5) 
  92.  &00000007)
  93. d*!(control+12)=((drive>>8) 
  94.  &000000FF)
  95. e+!(control+16)=((drive>>16) 
  96.  &0000FFFF)
  97. =control
  98. CD_GetTrackData(control)
  99.  b,start,end,data,total,last,num,trk
  100.  control<16 
  101.  control>0 
  102. k$ control=
  103. CD_GetControl(control)
  104. Claim(16)
  105.  "CD_EnquireTrack",0,b,0,0,0,0,0,control
  106. start=?b
  107. end=?(b+1)
  108.  "CD_DiscUsed",0,b,0,0,0,0,0,control
  109. total=!b
  110. data=
  111. Claim(16)
  112. !data=start
  113. !(data+4)=end
  114. !(data+8)=total
  115. !(data+12)=0
  116.  No artist or album title
  117. !(data+16)=0
  118. !(data+20)=0
  119.  The linked list bits
  120. last=(data+12)
  121. num=start
  122.  "CD_EnquireTrack",num,b,0,0,0,0,0,control
  123.  trk=
  124. Claim(24)
  125.  Pointer to next
  126.  !trk=0
  127.  Track number
  128.  !(trk+4)=num
  129.  Start, length
  130.  !(trk+8)=!b
  131.  !(trk+12)=0
  132.  !(trk+16)=!(b+4)
  133.  No name data yet
  134.  !(trk+20)=0
  135.  Link us into last entry
  136.  !last=trk
  137.  num<>start 
  138.   !(last+12)=(!b)-!(last+8)
  139.  last=trk
  140.  num+=1
  141.  num>end
  142. !(last+12)=total-!(last+8)
  143. Release(b)
  144.     =data
  145. CD_ConvertTime(x)
  146.  ret$
  147. x=(x+37) 
  148.  x<60 
  149.  ret$=
  150. (x)+" secs"
  151.  x>119 
  152. .  ret$=
  153. 60)+" mins, "+
  154. 60)+" secs"
  155. %  ret$="1 min, "+
  156. 60)+" secs"
  157.     =ret$
  158. CD_IntroScan(data,control,time,start)
  159.  p,status
  160. p=data+12
  161.  (!p)<>0
  162.      p=!p
  163.  ((!(p+16)) 
  164.  1)=0 
  165.  "CD_PlayAudio",0,!(p+8)+75*start,(!(p+8))+75*(start+time),0,0,0,0,control
  166. "Track ";!(p+4);" :"
  167. "  Starts : ";~!(p+8)
  168. "  Length : ";~!(p+12);" (";
  169. CD_ConvertTime(!(p+12));")"
  170. "  Flags  : ";~!(p+16)
  171.  "CD_AudioStatus",0,0,0,0,0,0,0,control 
  172.  status
  173.  status
  174.  status=3 
  175.  status=4 
  176.  status=5
  177. CD_Play(data,control,track)
  178.  p,ok
  179. p=data+12
  180.  (!p)<>0
  181.      p=!p
  182.  (!(p+4))=track 
  183.  "CD_PlayTrack",track,255,0,0,0,0,0,control
  184.   ok=
  185. CD_CurrentTrack(data,control)
  186.  track,p,address
  187. track=0
  188.  "CD_EnquireAddress",0,0,0,0,0,0,0,control 
  189.  address
  190. p=data+12
  191.  (!p)<>0
  192.      p=!p
  193.  (!(p+8))<address 
  194.  (!(p+12))>(address-(!(p+8))) 
  195.   track=!(p+4)
  196. =track
  197. CD_CurrentTime(data,control)
  198.  time,p,address
  199. time=0
  200.  "CD_EnquireAddress",0,0,0,0,0,0,0,control 
  201.  address
  202. p=data+12
  203.  (!p)<>0
  204.      p=!p
  205.  (!(p+8))<address 
  206.  (!(p+12))>(address-(!(p+8))) 
  207.   time=address-!(p+8)
  208.     =time
  209. CD_SkipForward(data,control,s)
  210.  end,p
  211. end=!(data+8)
  212.  "CD_EnquireAddress",0,0,0,0,0,0,0,control 
  213.  address
  214. address+=75*s
  215.  address<end 
  216.  "CD_PlayAudio",0,address,end,0,0,0,0,control
  217. CD_SkipBackward(data,control,s)
  218.  end,p
  219. end=!(data+8)
  220.  "CD_EnquireAddress",0,0,0,0,0,0,0,control 
  221.  address
  222. address-=75*s
  223.  address>0 
  224.  "CD_PlayAudio",0,address,end,0,0,0,0,control
  225. CD_DiscChanged(control)
  226.  changed
  227.  "CD_DiscChanged",0,0,0,0,0,0,0,control 
  228.  changed
  229. =changed
  230.  Read the ID of the CD
  231.  Currently this just reads the CD length in 75ths of a second
  232.  - not the best way, but it'll do...
  233. CD_GetCDID(data)
  234. =!(data+12)
  235. CD_CheckDataBase(data)
  236.  file,id$,p
  237. CD_GetCDID(data))
  238. file=
  239. DB_Open("CDs")
  240. DB_GetUserData(id$,"Tracks")<>"" 
  241. 6 !(data+16)=
  242. Strdup(
  243. DB_GetUserData(id$,"Artist"))
  244. 5 !(data+20)=
  245. Strdup(
  246. DB_GetUserData(id$,"Album"))
  247.  p=data+12
  248.  (!p)<>0
  249.   p=!p
  250. 4  !(p+20)=
  251. Strdup(
  252. DB_GetUserData(id$,
  253. (!(p+4)))
  254. DB_Close(file)
  255. CD_SetTrackName(data,num,name$)
  256. p=data+12
  257.  (!p)<>0
  258.      p=!p
  259.  (!(p+4))=num 
  260.   !(p+20)=
  261. Strdup(name$)
  262.  Setting the album and artist name
  263. CD_SetArtistName(data,name$)
  264. !(data+16)=
  265. Strdup(name$)
  266. CD_SetAlbumName(data,name$)
  267. !(data+20)=
  268. Strdup(name$)
  269.  Update the database
  270. CD_StoreData(data)
  271.  file,id$,p
  272. CD_GetCDID(data))
  273. file=
  274. DB_Open("CDs")
  275. DB_PutUserData(id$,"Tracks",
  276. ((!(p+4))-(!p)+1)
  277. DB_PutUserData(id$,"Artist",$(!(data+16))
  278. DB_PutUserData(id$,"Album",$(!(data+20))
  279. p=data+12
  280.  (!p)<>0
  281. +     p=!p
  282. DB_PutUserData(id$,
  283. (!(p+4),$(!(p+20))
  284. DB_Close(file)
  285.