home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / CD32 / CD32_Support / examples / SA_Examples / cd / CDTest / Audio.cd < prev    next >
Encoding:
Text File  |  1993-08-31  |  16.5 KB  |  564 lines

  1. /* CD.DEVICE TEST (AUDIO) */
  2.  
  3. /**************************************************************************
  4.  *                                                                        *
  5.  * This script has been written to test the cd.device on the Amiga CD-32  *
  6.  *                                                                        *
  7.  * Its purpose is to test the cd.device as it relates to playing audio.   *
  8.  *  Please use Data.cd to test data related commands.                     *
  9.  *                                                                        *
  10.  * Author:  Michael McLaughlin (mikemc@hydrogen)  [Drexel Co-op student]  *
  11.  *                                                                        *
  12.  **************************************************************************/
  13.  
  14. Address CD.1       /* Reference to cd.device test program */
  15. OPTIONS RESULTS    /* Allow results */
  16.  
  17. INFO initial                    /* Makes sure this doesn't run w/o a disc */
  18. if (initial.Spin = 0) | (initial.CDROM ~= 0) then do;
  19.   say
  20.   say 'Please insert AUDIO disk (CD-DA) before beginning the CD.DEVICE test.'
  21.   say
  22.   exit
  23. end;
  24.  
  25. /* Constants */
  26. framesPerSec = 75   /* Frames per second */
  27.  
  28. /**************************************************************************/
  29.  
  30. /* LSN TOC */
  31. say
  32. say "LSN [Logical Sector Number] TOC test"
  33. say
  34.  
  35. TOCLSN lTOC 100 0                                /* Read TOC with summary */
  36.  
  37. lsnEOD = lTOC.Summary.LeadOut
  38. finalTrack = lTOC.Summary.LastTrack
  39.  
  40. say                                                        /* Display TOC */
  41. say 'Summary:  FirstTrack= ' lTOC.Summary.FirstTrack
  42. say '          LastTrack=  ' lTOC.Summary.LastTrack
  43. say '          LeadOut=    ' lsnEOD
  44. say
  45.  
  46. say 'Track No.  Track Pos.  Control Byte'
  47. say '---------  ----------  ------------'
  48.  
  49. do trck = 1 to lTOC.Summary.LastTrack
  50.   say center(lTOC.trck.Track,9) right(lTOC.trck.Position,9) right(lTOC.trck.CtlAdr,9)
  51.   master.trck.Track = lTOC.trck.Track
  52.   master.trck.Position = lTOC.trck.Position
  53.   mAster.trck.CtlAdr = lTOC.trck.CtlAdr
  54. end
  55.  
  56. /* MSF TOC */
  57. say
  58. say 
  59. say "MSF [Minute/Second/Frame] TOC test"
  60. say
  61.  
  62. TOCMSF mTOC 100 0                                /* Read TOC with summary */
  63.  
  64. msfEOD = toMSFform(mTOC.Summary.LeadOut.Minute, mTOC.Summary.LeadOut.Second, mTOC.Summary.LeadOut.Frame)
  65.  
  66. say                                                        /* Display TOC */
  67. say 'Summary:  FirstTrack= ' mTOC.Summary.FirstTrack
  68. say '          LastTrack=  ' mTOC.Summary.LastTrack
  69. say '          LeadOut=    ' msfEOD
  70. say
  71.  
  72. say 'Track No.  Track Pos.  Control Byte'
  73. say '---------  ----------  ------------'
  74.  
  75. do trck = 1 to mTOC.Summary.LastTrack
  76.   potion = toMSFform(mTOC.trck.Position.Minute, mTOC.trck.Position.Second, mTOC.trck.Position.Frame)
  77.   mCopy.trck.Track = mTOC.trck.Track
  78.   mCopy.trck.Position = potion
  79.   mCopy.trck.CtlAdr = mTOC.trck.CtlAdr
  80.   say center(mTOC.trck.Track,9) center(potion,12) center(mTOC.trck.CtlAdr,12)
  81. end
  82.  
  83.  
  84. /**************************************************************************/
  85.  
  86. /* LSN and MSF Comparisons */
  87. say
  88. say
  89. say 'Differences between the LSN and the MSF specifications (LSN format)'
  90. say
  91.  
  92. say 'Track No.  LSN Track Pos.  MSF Track Pos.  LSN Ctrl Byte  MSF Ctrl Byte'
  93. say '---------  --------------  --------------  -------------  -------------'
  94. do trck = 1 to mTOC.Summary.LastTrack
  95.   mPos = msf2sec(mCopy.trck.Position) * 75
  96.   mPos = trunc(mPos - (msf2sec(mCopy.1.Position) * 75))
  97.   lPos = master.trck.Position
  98.   say center(trck,9) right(lPos,11) right(mPos,15) right(master.trck.CtlAdr,12) right(mCopy.trck.CtlAdr,14)
  99. end
  100.  
  101.  
  102. /* Comparison btw Master TOC and individual TOC */
  103. say
  104. say
  105. say 'Summary Verification'
  106. say
  107. do trck = 1 to 99 while substr(Master.trck.Track,1,1) ~= 'M'
  108. end
  109. tracks = trck - 1
  110. say 'There are' tracks 'tracks on this disk.'
  111. if tracks = finalTrack then say 'This agrees with the summary data.'
  112.   else say 'The summary and the actual track information are in conflict!'
  113. say
  114. say
  115.  
  116. /**************************************************************************/
  117.  
  118. say 'Enter the Audio Play test? [LSN] (y n a q ?)'
  119. pull goOn
  120. if goOn = ? then do;
  121.   say
  122.   say ' y = Yes'
  123.   say ' n = No'
  124.   say ' a = All tests'
  125.   say ' q = Quit this script'
  126.   say
  127.   pull goOn
  128. end;
  129. if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
  130.  
  131. /* Audio Play (LSN Format) */
  132. say 
  133. say 'LSN Audio Play test' 
  134. say
  135.  
  136. segTime = 30 * framesPerSec                         /* Sets play duration */
  137.  
  138. say 'Playing 30-second segment at beginning of disk.'
  139. PLAYLSN 0 segTime
  140.  
  141. say 'Playing 30-second segment at end of disk.'
  142. start = lsnEOD - segTime - 1
  143. PLAYLSN start segTime
  144.  
  145. say 'Playing 30-second segment span between tracks 1 and 2.'
  146. start = lTOC.2.Position - segTime % 2
  147. PLAYLSN start segTime                    /* Span 30 secs btw tracks 1 & 2 */
  148.  
  149. /* NOTE:  cd.device does not allow play after end of disc marker. */
  150.  
  151. say 'Playing 150-frame segment'
  152. PLAYLSN 1125 150                                /* Play 150 frame segment */
  153.  
  154. say 'Playing six 150-frame segments randomly distributed through disk.'
  155. do seg = 1 to 6
  156.   say '  Segment' seg
  157.   newEOD = lsnEOD % 400
  158.   start = RANDOM(2, newEOD, right(time('S'),2)) * 400
  159.   PLAYLSN start 150                   /* Play 6 random 150 frame segments */
  160. end
  161.  
  162. end;
  163.  
  164. /**************************************************************************/
  165.  
  166. if (goOn ~= Q) & (goOn ~= A) then do
  167.   say 'Enter the Audio Play test? [MSF] (y n q)'
  168.   pull goOn
  169. end
  170. if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
  171.  
  172. /* Audio Play (MSF Format) */
  173. say
  174. say 'MSF Audio Play test'
  175. say
  176.  
  177. segTime = "00:30:00"                                /* Sets play duration */
  178.  
  179. say 'Playing 30-second segment at beginning of disk.'
  180. start = sec2msf(mTOC.1.Position.Second + (mTOC.1.Position.Frame + 1) / 75)
  181. PLAYMSF start segTime            /* start is starting point of audio play */
  182.  
  183. say 'Playing 30-second segment at end of disk.'
  184. start = sec2msf(msf2sec(msfEOD) - msf2sec(segTime) - (1/75))
  185. PLAYMSF start segTime
  186.  
  187. say 'Playing 30-second segment span between tracks 1 and 2.'
  188. potion = toMSFform(mTOC.2.Position.Minute, mTOC.2.Position.Second, mTOC.2.Position.Frame)
  189. start = sec2msf(msf2sec(potion) - (msf2sec(segTime) / 2))
  190. PLAYMSF start segTime                    /* Span 30 secs btw tracks 1 & 2 */
  191.  
  192. /* NOTE:  cd.device does not allow play after end of disk marker. */
  193.  
  194. say 'Playing 2-second segment'
  195. PLAYMSF "00:15:00" "00:02:00"                           /* Play 2 seconds */
  196.  
  197. say 'Playing six 2-second segments randomly distributed through disk.'
  198. do seg = 1 to 6
  199.   say '  Segment' seg
  200.   newEOD = msf2sec(msfEOD) % 4.9       /* Scale range to use RANDOM fnctn */
  201.   start = sec2msf(RANDOM(2, newEOD, right(time('S'),2)) * 4.9) /* De-scale*/
  202.   PLAYMSF start "00:02:00"             /* Play 6 random 2 second segments */
  203. end
  204.  
  205. end;
  206.  
  207. /**************************************************************************/
  208.  
  209. if (goOn ~= Q) & (goOn ~= A) then do
  210.   say 'Enter the Audio Play Track test? (y n q)'
  211.   pull goOn
  212. end
  213. if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
  214.  
  215. /* Audio Play (Track) */
  216. say
  217. say 'Audio Play Track test'
  218. say
  219.  
  220. say 'Playing first track'
  221. PLAYTRACK 1 1                                /* Play only the first track */
  222.  
  223. say 'Playing last track'
  224. PLAYTRACK finalTrack 1                        /* Play only the last track */
  225.  
  226. say 'Playing all tracks of the disk'
  227. PLAYTRACK 1 finalTrack                             /* Play all the tracks */
  228.  
  229. say 'Attempting to play track beyond end of disk'
  230. futile = finalTrack + 1
  231. PLAYTRACK futile 1       /* Attempt to play one track past the last track */
  232.  
  233. /* Note:  cd.device does not allow play after the end of disk marker. */
  234.  
  235. end;
  236.  
  237. /**************************************************************************/
  238.  
  239. if (goOn ~= Q) & (goOn ~= A) then do
  240.   say 'Enter the Audio Play Search test? (y n q)'
  241.   pull goOn
  242. end
  243. if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
  244.  
  245. /* Audio Play (Search) */
  246. say
  247. say 'Audio Play Search test'
  248. say
  249.  
  250. SEARCH NORMAL                        /* Set search-mode to normal setting */
  251. call tellSearch                   /* Reports on search-speed via INFO cmd */
  252.  
  253. segTime = 120 * framesPerSec                        /* Sets play duration */
  254.  
  255. say 'Playing 2-minute segment at middle of disk.'
  256. start = lsnEOD % 2 - segTime % 2
  257. PLAYLSN start segTime
  258.  
  259. SEARCH FFWD                    /* Set search-mode to fast-forward setting */
  260. call tellSearch
  261.  
  262. say 'Playing 2-minute segment at middle of disk.'
  263. start = lsnEOD % 2 - segTime % 2
  264. PLAYLSN start segTime
  265.  
  266. say 'Playing 2-minute segment at end of disk.'
  267. start = lsnEOD - segTime - 1
  268. PLAYLSN start segTime
  269.  
  270. SEARCH FREV                    /* Set search-mode to fast-reverse setting */
  271. call tellSearch
  272.  
  273. say 'Playing 2-minute segment at middle of disk.'
  274. start = lsnEOD % 2 - segTime % 2
  275. PLAYLSN start segTime
  276.  
  277. say 'Playing 2-minute segment at end of disk.'
  278. start = lsnEOD - segTime - 1
  279. PLAYLSN start segTime
  280.  
  281. SEARCH NORMAL                   /* Set search-mode back to normal setting */
  282. call tellSearch;
  283.  
  284. end;
  285.  
  286. /**************************************************************************/
  287.  
  288. if (goOn ~= Q) & (goOn ~= A) then do
  289.   say 'Enter the Audio Play Pause test? (y n q)'
  290.   pull goOn
  291. end
  292. if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
  293.  
  294. /* Audio Play (Pause) */
  295. say
  296. say 'Audio Play Pause test'
  297. say
  298.  
  299. Address command
  300. 'run rx AudioPause.rexx'               /* Call other script to pause play */
  301. Address CD.1
  302.  
  303. segTime = 30 * framesPerSec                         /* Sets play duration */
  304.  
  305. say 'Playing 30-second segment at middle of disk.'
  306. start = lsnEOD % 2 - segTime % 2
  307. PLAYLSN start segTime
  308.  
  309. SEARCH FFWD
  310. call tellSearch
  311.  
  312. segTime = 150 * framesPerSec                        /* Sets play duration */
  313.  
  314. say 'Playing 2-minute segment at middle of disk.'
  315. start = lsnEOD % 2 - segTime % 2
  316. PLAYLSN start segTime
  317.  
  318. SEARCH FREV
  319. call tellSearch
  320.  
  321. say 'Playing 2-minute segment at middle of disk.'
  322. start = lsnEOD % 2 - segTime % 2
  323. PLAYLSN start segTime
  324.  
  325. SEARCH NORMAL
  326. call tellSearch
  327.  
  328. end;
  329.  
  330. /**************************************************************************/
  331.  
  332. if (goOn ~= Q) & (goOn ~= A) then do
  333.   say 'Enter the Audio Play Attenuate test? (y n q)'
  334.   pull goOn
  335. end
  336. if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
  337.  
  338. /* Attentuate */
  339. say
  340. say 'Audio Play Attentuate test'
  341. say
  342.  
  343. Address command 'run rx AudioPlay.rexx' (4 * framesPerSec) lsnEOD
  344. Address CD.1
  345.  
  346. segTime = 16 * framesPerSec                           /* Duration of fade */
  347.  
  348. call delay(4)                                 /* Delay until music begins */
  349.  
  350. say 'Attempting to fade into mute'
  351. ATTENUATE segTime 0
  352.  
  353. say 'Attempting to fade into full volume'
  354. ATTENUATE segTime 32767
  355.  
  356. /* Note:  The CD-32 ignores the fade because it's on/off, no in-betweens */
  357.  
  358. if (goOn = A) then call delay(2)            /* Waits for audio to finish */
  359. say
  360.  
  361. end;
  362.  
  363. /**************************************************************************/
  364.  
  365. if (goOn ~= Q) & (goOn ~= A) then do
  366.   say 'Enter the Q-Code test? (y n q)'
  367.   pull goOn
  368. end
  369. if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
  370.  
  371. /* Q-Code */
  372.  
  373.  /* LSN Format */
  374.  
  375. say 'Q-Code test in LSN format'
  376.  
  377. if ~open('temp','RAM:Temp.txt','w') then do    /* Open temporary txt file */
  378.     say "Can't open file:" "RAM:Temp.txt"
  379.     exit 20
  380. end
  381.  
  382. Address command 'run rx AudioPlay.rexx' (32 * framesPerSec) lsnEOD
  383. Address CD.1
  384.  
  385. call delay(2)                                 /* Delay until music begins */
  386.  
  387. call writeln('temp', 'Q-Code listing in LSN format:')
  388. call writeln('temp', ' ')
  389. call writeln('temp', 'Track #   Index #   Track Pos.   Disk Pos.')
  390. call writeln('temp', '-------   -------   ----------   ---------')
  391.  
  392. call time 'R'
  393. do cnt = 1 until time('E') > 30
  394.   QCODELSN thisDisk
  395.   track.cnt = thisDisk.Track
  396.   index.cnt = thisDisk.Index
  397.   trackPos.cnt = thisDisk.TrackPosition
  398.   diskPos.cnt = thisDisk.DiskPosition
  399. end
  400.  
  401. maxQCode = cnt - 1
  402.  
  403. say 'Please be patient, storing Q-Code values into text file for viewing.'
  404.  
  405. do cnt = 1 to maxQCode
  406.   call writech('temp', '   '||track.cnt||'         ')
  407.   call writech('temp', index.cnt||'        ')
  408.   call writech('temp', trackPos.cnt||'        ')
  409.   call writeln('temp', diskPos.cnt)
  410. end
  411.  
  412. call close('temp')
  413.  
  414. Address command 'more RAM:Temp.txt'
  415. Address CD.1
  416.  
  417.  /* MSF Format */
  418.  
  419. say 'Q-Code test in MSF format'
  420.  
  421. if ~open('temp','RAM:Temp.txt','w') then do
  422.     say "Can't open file:" "RAM:Temp.txt"
  423.     exit 20
  424. end
  425.  
  426. Address command 'run rx AudioPlay.rexx' (32 * framesPerSec) lsnEOD
  427. Address CD.1
  428.  
  429. call delay(2)                                 /* Delay until music begins */
  430.  
  431. call writeln('temp', 'Q-Code listing in MSF format:')
  432. call writeln('temp', ' ')
  433. call writeln('temp', 'Track #   Index #   Track Pos.   Disk Pos.')
  434. call writeln('temp', '-------   -------   ----------   ---------')
  435.  
  436. call time 'R'
  437. do cnt = 1 until time('E') > 30
  438.   QCODEMSF thisDisk
  439.   track.cnt = thisDisk.Track
  440.   index.cnt = thisDisk.Index
  441.   trackPosM.cnt = thisDisk.TrackPosition.Minute
  442.   trackPosS.cnt = thisDisk.TrackPosition.Second
  443.   trackPosF.cnt = thisDisk.TrackPosition.Frame
  444.   diskPosM.cnt = thisDisk.DiskPosition.Minute
  445.   diskPosS.cnt = thisDisk.DiskPosition.Second
  446.   diskPosF.cnt = thisDisk.DiskPosition.Frame
  447. end
  448.  
  449. maxQCode = cnt - 1
  450.  
  451. say 'Please be patient, storing Q-Code values into text file for viewing.'
  452.  
  453. do cnt = 1 to maxQCode
  454.   call writech('temp', '   '||track.cnt||'         ')
  455.   call writech('temp', index.cnt||'       ')
  456.   trackPos = toMSFform(trackPosM.cnt, trackPosS.cnt, trackPosF.cnt)
  457.   call writech('temp', trackPos||'     ')
  458.   diskPos = toMSFform(diskPosM.cnt, diskPosS.cnt, diskPosF.cnt)
  459.   call writeln('temp', diskPos)
  460. end
  461.  
  462. call close('temp')
  463.  
  464. Address command 'more RAM:Temp.txt'
  465. Address command 'delete >nil: RAM:Temp.txt'
  466. Address CD.1
  467. say
  468.  
  469. end;
  470.  
  471. /**************************************************************************/
  472.  
  473. if (goOn ~= Q) & (goOn ~= A) then do
  474.   say 'Enter the Frame Interrupt test? (y n q)'
  475.   pull goOn
  476. end
  477. if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
  478.  
  479. /* Frame Interrupt */
  480. say
  481. say 'Frame Interrupt test'
  482. say
  483.  
  484. say 'Adding frame interrupt.'
  485. ADDFRAMEINT                                        /* Add frame interrupt */
  486.  
  487. segTime = 30 * framesPerSec                         /* Sets play duration */
  488.  
  489. say 'Playing 30-second segment at middle of disk.'
  490. start = lsnEOD % 2 - segTime % 2
  491. PLAYLSN start segTime
  492.  
  493. say 'Removing frame interrupt.'
  494. REMFRAMEINT                                     /* Remove frame interrupt */
  495.  
  496. say 'Getting frame interrupt data.'
  497. GETFRAMEINT frameData                         /* Get frame interrupt data */
  498.  
  499. say 'Actual calls to frame interrupt handler is' frameData.Call
  500. say 'Expected calls to frame interrupt handler is' segTime
  501.  
  502. pError = ((frameData.Call - segTime) / segTime) * 100      /* Calculation */
  503. if pError >= 0 then playError = trunc(pError * 100 + 0.5) / 100 /*Rounding*/
  504.                else playError = trunc(pError * 100 - 0.5) / 100
  505. if playError > 0 then playError = '+'||playError              /* Add sign */
  506. say 'Margin of error is' playError'%'
  507.  
  508. say 'Number of calls to frame interrupt handler with bad interrupt data is' frameData.BadData
  509.  
  510. end;
  511.  
  512. say
  513. QUIT                                                 /* Quits from CDtest */
  514. exit                                              /* Exit from the script */
  515.  
  516. /***** FUNCTIONS **********************************************************/
  517.  
  518. tellSearch: procedure                            /* Outputs search status */
  519. INFO thisDisk
  520. if thisDisk.Search = 0 then say 'Search is set at Normal play'
  521.   else if thisDisk.Direction = 0 then say 'Search is set at Fast-Forward play'
  522.     else say 'Search is set at Fast-Reverse play'
  523. return
  524.  
  525. delay: procedure                 /* Pauses for a specified no. of seconds */
  526. arg timeindex
  527.   call time 'R'
  528.   do until time('E') >= timeindex
  529.   end
  530. return
  531.  
  532. formt:                                         /* Formats 2-digit numbers */
  533. arg oldnum
  534. if oldnum <= 9 then newnum = '0'||oldnum
  535.   else newnum = oldnum
  536. return newnum
  537.  
  538. toMSFform:                       /* Converts mm, ss, and ff into mm:ss:ff */
  539. arg min, sec, frm
  540.   combo = formt(min) || ':' || formt(sec) || ':' || formt(frm)
  541. return combo
  542.  
  543. msf2sec:                                /* Converts MSF format to seconds */
  544. arg msfForm
  545.   min = substr(msfForm,1,2)       /* First 2 characters of string msfForm */
  546.   sec = substr(msfForm,4,2)      /* Middle 2 characters of string msfForm */
  547.   frm = substr(msfForm,7,2)        /* Last 2 characters of string msfForm */
  548.   totsec = (min * 60) + sec + (frm / 75)            /* Convert to seconds */
  549. return totsec
  550.  
  551. sec2msf:                                /* Converts seconds to MSF format */
  552. arg totsec
  553.   min = trunc(totsec / 60)
  554.   sec = trunc(totsec - min * 60)
  555.   frm = trunc((totsec - min * 60 - sec) * 75)
  556.   msfForm = toMSFform(min, sec, frm)
  557. return msfForm
  558.  
  559. trunc:            /* Deletes decimal point and numbers to the right of it */
  560. arg oldnum
  561.   key = index(oldnum||'.', '.')            /* Finds position of dec point */
  562.   newnum = delstr(oldnum, key)     /* Only keeps what's left of dec point */
  563. return newnum
  564.