/***********************************************\
*						*
*	   CDx Audio Access Sample Code		*
*						*
*  Prints the disc's table of contents		*
*						*
*  This version uses the cdx.device		*
\***********************************************/

#include <exec/types.h>
#include <exec/io.h>
#include <CDx.h>

int   GetNumTracks(void);
int   GetLeadout(void);
int   TrackLoc(ULONG,struct CDTOC *);
int   String2Int(char *);
UBYTE BCD2Byte(UBYTE);

extern   struct   IOStdReq       *Req;

main(argc,argv)
int   argc;
char **argv;
{
   int   i,result,numtracks;
   struct   CDTOC toc;

   if (OpenCDx())
      Cleanup("Couldn't open cdx.device");

   result = GetNumTracks();
   if (result)
      goto Trouble;

   numtracks = Req->io_Actual;
   printf("Number of tracks: %ld\n\n",numtracks);

   printf("Track   Start Min/Sec/Frm  Type         Pre-Emphasis  Digital Copying\n");
   printf("---------------------------------------------------------------------\n");

   for (i=1;i<=numtracks;i++) {
      result = TrackLoc(i,&toc);
      if (result)
         goto Trouble;

      printf(" %3ld           %2ld  %2ld  %2ld  ",i,
         MSF_MIN(toc.Position),
         MSF_SEC(toc.Position),
         MSF_FRM(toc.Position));
      if (toc.AddrCtrl & DATATRK)
         printf("Data        ");
      else
         printf((toc.AddrCtrl & FOURCHAN)?"Quadraphonic":"Stereo      ");

      printf("      %ls         %ls\n",
         (toc.AddrCtrl & PREEMPH)?"On ":"Off",
         (toc.AddrCtrl & COPYOK)?"Permitted":"Prohibited");
   }

   result = GetLeadout();
   if (result)
      goto Trouble;

   printf("Leadout        %2ld  %2ld  %2ld\n",
      MSF_MIN(Req->io_Actual),
      MSF_SEC(Req->io_Actual),
      MSF_FRM(Req->io_Actual));

   Cleanup(0);

Trouble:
   printf("Returned error %ld\n",result);
   Cleanup(0);
}


int GetNumTracks(void)
{
   Req->io_Command = CD_NUMTRACKS;
   DoIO((struct IORequest *)Req);

   return((int)Req->io_Error);
}


int GetLeadout(void)
{
   Req->io_Command = CD_LEADOUT;
   DoIO((struct IORequest *)Req);

   return((int)Req->io_Error);
}


int TrackLoc(track,toc)
ULONG track;
struct CDTOC *toc;
{
   Req->io_Command = CD_TRACKLOCMSF;
   Req->io_Offset = track;
   Req->io_Length = 1;
   Req->io_Data = (APTR)toc;
   DoIO((struct IORequest *)Req);

   return((int)Req->io_Error);
}
