/*
*/

#include <stdio.h>

#include <proto/exec.h>
#include <proto/dos.h>

#include <proto/cddb.h>
//#include <libraries/cddb.h>
//#include <clib/cddb_protos.h>
//#include <pragmas/cddb_pragmas.h>

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

static struct Library *CDDBBase;
static struct Library *CDPlayBase;


void strcpy (char *nach, char *von) /* aus C für Einsteiger S.131 */
//char *nach, *von;
{
	while(*nach++ = *von++);
}

void fail(char *str)
{
    if (CDDBBase) CloseLibrary(CDDBBase);
    if (str) {
        Printf(str);
	exit(20);
    }
    exit(0);
}

void init(void)
{
	if (!(CDDBBase = OpenLibrary("cddb.library", 44)))
		fail("Failed to open cddb.library.\n");
	if (!(CDPlayBase = OpenLibrary (CDPLAYNAME, CDPLAYVERSION)))
		fail("Failed to open cdplay.library.\n");
}

void main(void)
{
	typedef char * TTitleStrPtr; //[CDDB_maxLenTTitle];

	static struct CDDB_KnownCD kcd;
	short tr=0;
	static long known=0, i=0;
	struct CDDB_Track *track=NULL;
	static long discID = 0x00129C13;
	struct CDRequest *cdr=NULL;

   static struct CDDB_CDInfo cdi;
	static char categ[100];//[CDDB_maxLenCateg];
	static char artist[100]; //[CDDB_maxLenArtist];
	static char dTitle[100]; //[CDDB_maxLenDTitle];
   long dummy;
	char * tTitles[100]; //[CDDB_maxTracks];
	static long err=0;
	long t=0;

   long min,sec,frame, min2,sec2,frame2, secs;

	init();

	for (err=0; err < CDDBERR_COUNT; Printf("errStr = %02ld'%s'\n", err, CDDB_ErrorStr(err)), err++){};

   Printf("\n");

   known = CDDB_LoadKnownCD(discID, &kcd);
	if (known)
	{
		Printf("kcd: length %02ld:%02ld, categ '%s', %ld tracks, artist '%s', title '%s'\n",
		   kcd.kcd_Length/60,kcd.kcd_Length%60,kcd.kcd_Categ,kcd.kcd_NumTracks,kcd.kcd_Artist,kcd.kcd_Title);
	   for (tr=0; tr<kcd.kcd_NumTracks /* tr<19*/; tr++)
	   {
	     track = kcd.kcd_Track[tr];
	     Printf("  %02ld: %02ld:%02ld '%s'\n", tr+1, track->tr_Length/60, track->tr_Length%60,track->tr_Title)
	   };
	}else
	  Printf("Keine CD zur discID %08lx gefunden!\n", discID);

   Printf("\nI will now try to read the cddb-datas for the current disc in cybscsi.device,1.\n");
	if (cdr = CDOpenDrive ("cybscsi.device", 1))
	{
		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);

	}

	/* now read the toc of the current cd */

   CDUpdate(cdr);
   for (t=cdr->cdr_TOC->cdptoc_FirstTrack-1; t <= cdr->cdr_TOC->cdptoc_LastTrack; t++)
   {
   	cdi.cdi_MSF[t].msf_Min = (UBYTE)base2min(cdr->cdr_TOC->cdptoc_Track[t+1].tr_Position);
      cdi.cdi_MSF[t].msf_Sec = (UBYTE)base2sec(cdr->cdr_TOC->cdptoc_Track[t+1].tr_Position)+2;
      Printf ("%02ld: min/sec = %02ld/%02ld\n", t, cdi.cdi_MSF[t].msf_Min, cdi.cdi_MSF[t].msf_Sec);
            /*di.msf[t].frame wird nicht benötigt! */
	};

	cdi.cdi_Tracks = (ULONG)cdr->cdr_TOC->cdptoc_LastTrack; cdi.cdi_Time = cdr->cdr_Time->cdt_AllCompleteBase / 75;
   CDDB_CalcDiscID (&cdi);
   Printf ("tracks = %ld, time = %ld secs, discID %08lx\n", cdi.cdi_Tracks, cdi.cdi_Time, cdi.cdi_DiscID);

   for (t = 0; t < cdi.cdi_Tracks;t++)
   {
    if (!(tTitles[t] = AllocVec (CDDB_MAXLENTTITLE+1, MEMF_ANY+MEMF_CLEAR))) Printf ("AllocVec failed\n");
   };

	strcpy(artist,"TestArtist"); strcpy(dTitle, "DiskTitle"); strcpy (categ, "TestCateg");
	Printf ("Current disc is %s/%s. Category is '%s'\n", artist, dTitle, categ);

   err = CDDB_GetTags(&cdi, TAG_DONE);

   strcpy(categ,"TestCateg"); Printf ("categ = '%s'\n", categ);
   strcpy(artist,"TestSArtist"); Printf ("artist = '%s'\n", artist);
   strcpy(dTitle,"testdt"); Printf ("dtitle = '%s'\n", dTitle);
   strcpy(tTitles[0],"Testdatg"); Printf ("ttitle[0] = '%s'\n",tTitles[0]);

   err = CDDB_GetTags(&cdi,
           CDDB_aDiscID, &discID,
           CDDB_aCateg,  &categ,
           CDDB_aArtist, &artist,
           CDDB_aDTitle, &dTitle,
           CDDB_aTTitles,&tTitles,
           TAG_DONE);
	Printf ("Current disc is %s/%s. Category is '%s'\n", artist, dTitle, categ);
	Printf ("err = %ld, errNoError = %ld\n", err, CDDBERR_NOERROR);
   if (err == CDDBERR_NOERROR)
   {
		Printf ("Current disc is %s/%s. Category is '%s'\n", artist, dTitle, categ);
		for (t=0; t < cdi.cdi_Tracks; t++)
		{
			min = cdi.cdi_MSF[t+1].msf_Min; sec = cdi.cdi_MSF[t+1].msf_Sec; frame = cdi.cdi_MSF[t+1].msf_Frame;
			min2= cdi.cdi_MSF[t  ].msf_Min; sec2= cdi.cdi_MSF[t  ].msf_Sec; frame2= cdi.cdi_MSF[t  ].msf_Frame;
			secs= ((min*60*75 + sec*75 + frame) - (min2*60*75 + sec2*75 + frame2)) / 75;
			Printf ("%02ld: %02ld:%02ld %s\n", t+1, secs / 60, secs % 60, tTitles[t]);
		};
	}else
		Printf("errStr = %02ld'%s'\n", err, CDDB_ErrorStr(err));

	/* close everything */
   for (t = 0; t < cdi.cdi_Tracks; FreeVec(tTitles[t]), t++){};

	if (cdr != NULL) CDCloseDrive (cdr);
	if (CDPlayBase != NULL) CloseLibrary (CDPlayBase);
	if (CDDBBase != NULL) CloseLibrary (CDDBBase);

}
