/***********************************************\
*                                               *
*          CDx Audio Access Sample Code         *
*                                               *
*  Prints out status of drive & head location   *
*                                               *
*  This version uses the cdx.device (v1.7+)     *
\***********************************************/

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

int   GetStatus(void);
int   GetSubQ(struct SubQ *);

extern   struct   IOStdReq       *Req;

struct   SubQ     subq;

char  *Statii[] = { "No disc","Stopped","Playing","Paused","Ended","Bad disc"};

main(argc,argv)
int   argc;
char **argv;
{
   int   error,status,drive;

   ParseParams("CDstatus [DRIVE n]",argc,argv,&drive,0);

   if (OpenCDx(drive))
      Cleanup("Drive not found",0);

   error = GetStatus();
   if (error)
      Cleanup(0,error);

   status = Req->io_Actual;
   if ((status<0)||(status>4))
      status = 5;

   printf("Status: %ls\n",Statii[status]);

   if (status == STS_PLAYING) {      /* Only continue if playing */
      error = GetSubQ(&subq);
      if (error)
         Cleanup(0,error);

      printf("Track: %ld    Index: %ld\n",subq.Track,subq.Index);

      printf("Absolute time -- Min: %02ld   Sec: %02ld   Frame: %ld\n",
         MSF_MIN(subq.DiscPosition),
         MSF_SEC(subq.DiscPosition),
         MSF_FRM(subq.DiscPosition));
      printf("Relative time -- Min: %02ld   Sec: %02ld   Frame: %ld\n",
         MSF_MIN(subq.TrackPosition),
         MSF_SEC(subq.TrackPosition),
         MSF_FRM(subq.TrackPosition));
   }

   Cleanup(0,0);
}


int GetStatus(void)
{
   Req->io_Command = CD_STATUS;
   DoIO((struct IORequest *)Req);

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


int GetSubQ(subq)
struct   SubQ  *subq;
{
   Req->io_Command = CD_CURRENTLOCMSF;
   Req->io_Data = (APTR)subq;
   DoIO((struct IORequest *)Req);

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