
/*
**  cdplay_demo.c
**
**  © 1995, 96 by Patrick Hess, all rights reserved.
**  $VER: cdplay_demo.c 1.0 (20.09.1996)
**
**  simple usage demo of the cdplay.library
**
*/


/*  I`m always using my all.gst file with precompiled includes. 
    You have to insert necessary includes yourself, sorry!       */


#include <libraries/cdplay.h>
#include <proto/cdplay_protos.h>
#include <pragmas/cdplay_pragmas.h>

struct Library *CDPlayBase;

void main (int argc, char **argv)
{
	struct CDRequest *cdr;
	
	int i = 0;

	if (argc != 2)
	{
		Printf ("Usage: %s <Arg>\n", argv[0]);
		exit (NULL);
	}


	if (CDPlayBase = OpenLibrary (CDPLAYNAME, CDPLAYVERSION))
	{
		if (cdr = CDOpenDrive ("2060scsi.device", 2))
		{
			Printf ("Device is open.\n");

			switch (argv[1][0])
			{
				case	'd':
					Printf ("%s\n", cdr->cdr_ID);
					break;

				case	'j':
					CDJump (((argv[1][1] == '-') ? -150 : 150), cdr);
					break;

				case	'l':
					CDLockDrive ((argv[1][1] == '1' ? TRUE : FALSE), cdr);
					break;

				case	'o':
					CDOpen (cdr);
					break;

				case	'c':
					CDClose (cdr);
					break;

				case	's':
					CDStop (cdr);
					break;

				case	'n':
					CDNext (cdr);
					break;

				case	'b':
					CDPrev (cdr);
					break;

				case	'g':
					CDPlay ((argv[1][1] - '0'), cdr);
					break;

				case	'p':
					CDPause ((argv[1][1] == '1' ? TRUE : FALSE), cdr);
					break;

				case	't':
					Printf ("Title: %02ld:%02ld of %02ld:%02ld, %02ld:%02ld remaining.\n",
						base2min (cdr->cdr_Time->cdt_TrackCurBase), base2sec (cdr->cdr_Time->cdt_TrackCurBase),
						base2min (cdr->cdr_Time->cdt_TrackCompleteBase), base2sec (cdr->cdr_Time->cdt_TrackCompleteBase),
						base2min (cdr->cdr_Time->cdt_TrackRemainBase), base2sec (cdr->cdr_Time->cdt_TrackRemainBase));

					Printf ("CD:    %02ld:%02ld of %02ld:%02ld, %02ld:%02ld remaining.\n",
						base2min (cdr->cdr_Time->cdt_AllCurBase), base2sec (cdr->cdr_Time->cdt_AllCurBase),
						base2min (cdr->cdr_Time->cdt_AllCompleteBase), base2sec (cdr->cdr_Time->cdt_AllCompleteBase),
						base2min (cdr->cdr_Time->cdt_AllRemainBase), base2sec (cdr->cdr_Time->cdt_AllRemainBase));
					break;

				case	'i':
					Printf ("DeviceType %ld, ANSIVersion %ld, ResponseFormat %ld, ISOVersion %ld, ECMAVersion %ld.\n", cdr->cdr_Inquiry->cdi_DeviceType, cdr->cdr_Inquiry->cdi_ANSIVersion, cdr->cdr_Inquiry->cdi_ResponseFormat, cdr->cdr_Inquiry->cdi_ISOVersion, cdr->cdr_Inquiry->cdi_ECMAVersion);
					Printf ("%s (Vendor), %s (ProductID), %s (RevLevel), %s (VendorSpecific)\n", cdr->cdr_Inquiry->cdi_VendorID, cdr->cdr_Inquiry->cdi_ProductID, cdr->cdr_Inquiry->cdi_RevisionLevel, cdr->cdr_Inquiry->cdi_VendorSpecific);

					if (cdr->cdr_Active != SCSI_STAT_NO_DISK)
					{
						Printf ("%ld max sector, sector size %ld, %ld bytes capacity.\n", cdr->cdr_Capacity->cdc_MaxSector, cdr->cdr_Capacity->cdc_SectorSize, cdr->cdr_Capacity->cdc_Capacity);

						Printf ("%s, %s, %s, %s, %s\n%s, %s, %s, %s, %s.\n", (btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_REMOVABLE) ? "REMOVABLE" : "NOT REMOVABLE"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_AENC) ? "AENC" : "NO AENC"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_REL_ADDRESS) ? "REL_ADDRESS" : "NO REL_ADDRESS"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_16WIDE_DATA) ? "16WIDE_DATA" : "NO 16WIDE_DATA"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_32WIDE_DATA) ? "32WIDE_DATA" : "NO 32WIDE_DATA"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_SYNC) ? "SYNC" : "NO SYNC"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_LINKED) ? "LINKED" : "NOT LINKED"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_CMDQUE) ? "CMDQUE" : "NO CMDQUE"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_SOFTRESET) ? "SOFTRESET" : "HARDRESET"),
							(btst (cdr->cdr_Inquiry->cdi_Flags, IFLAG_TRMIOP) ? "TRMIOP" : "NO TRMIOP"));

						Printf ("TOCSize %ld bytes, first track: %ld, last track: %ld\n", cdr->cdr_TOC->cdptoc_TOCSize, cdr->cdr_TOC->cdptoc_FirstTrack, cdr->cdr_TOC->cdptoc_LastTrack);

						for (i = cdr->cdr_TOC->cdptoc_FirstTrack; i <= cdr->cdr_TOC->cdptoc_LastTrack; i++)
						{
							struct CDTrack *tr;

							tr = &cdr->cdr_TOC->cdptoc_Track[i];
							Printf ("track %ld: position %ld, subchan %ld, %s pre_emph, %s copy proh., %s, %s\n", i, tr->tr_Position, tr->tr_SubChan, (btst (tr->tr_Flags, IFLAG_PRE_EMPHASIS) ? "" : "no"), (btst (tr->tr_Flags, IFLAG_COPY_PROHIBITED) ? "" : "no"), (btst (tr->tr_Flags, IFLAG_AUDIO_TRACK) ? "audio" : "data"), (btst (tr->tr_Flags, IFLAG_2_CHAN) ? "2 chan" : "4 chan"));
						}

						Printf ("cur track %ld, cur address %ld, active %ld\n", cdr->cdr_CurrentTrack, cdr->cdr_CurrentAddress, cdr->cdr_Active);
					}
					else
						PutStr ("no disk in drive\n");
					break;

				default:
					Printf ("unknown command.\n");
					break;
			}

			CDCloseDrive (cdr);
		}
		else
			PutStr ("Can`t open device.\n");

		CloseLibrary (CDPlayBase);
	}
	else
		Printf ("Can`t open \"%s\" Version %ld.\n", CDPLAYNAME, CDPLAYVERSION);
}

