/*
**	Q&D Protracker DataType
**
**	Written by Martin Blom, based on the AIFF DataType by
**	Olaf `Olsen' Barthel <olsen@sourcery.han.de>
**	Public domain
**
** :ts=8
*/

/******************************************************************************/

#include <intuition/intuitionbase.h>
#include <intuition/gadgetclass.h>
#include <intuition/classes.h>
#include <intuition/cghooks.h>

#include <dos/dosextens.h>

#include <exec/execbase.h>
#include <exec/memory.h>

#include <datatypes/soundclass.h>

#include <devices/ahi.h>

#include <clib/intuition_protos.h>
#include <clib/datatypes_protos.h>
#include <clib/utility_protos.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>

#include <clib/ahi_protos.h>

#include <clib/macros.h>

#include <pragmas/intuition_pragmas.h>
#include <pragmas/datatypes_pragmas.h>
#include <pragmas/utility_pragmas.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/dos_pragmas.h>

#include <pragmas/ahi_pragmas.h>

#include <string.h>

#define MKID ((ULONG) ('M')<<24 | (ULONG) ('.')<<16 | (ULONG) ('K')<<8 | (ULONG) ('.'))

#include "/PT-AHIPlay/PT-AHIPlay.h"

/******************************************************************************/

	// Our custom library structure

struct ClassBase
{
	struct Library		 LibNode;		// Exec link
	UWORD			 Pad;			// Longword alignment
	Class			*SoundClass;		// The class this library implemnts

	struct ExecBase		*SysBase;		// Exec library
	struct DosLibrary	*DOSBase;		// Dos library
	struct Library		*IntuitionBase,		// Intuition library
				*UtilityBase,		// Utility library
				*DataTypesBase,		// DataTypes library
				*SuperClassBase;	// Sound datatype
	struct SignalSemaphore	 LockSemaphore;		// Shared access semaphore
	BPTR			 Segment;		// Library segment pointer
};

	// Redirect references to global data into the library base

#define SysBase		ClassBase->SysBase
#define DOSBase		ClassBase->DOSBase
#define IntuitionBase	ClassBase->IntuitionBase
#define UtilityBase	ClassBase->UtilityBase
#define DataTypesBase	ClassBase->DataTypesBase
#define SuperClassBase	ClassBase->SuperClassBase
#define LockSemaphore	ClassBase->LockSemaphore
#define SoundClass	ClassBase->SoundClass
#define Segment		ClassBase->Segment

struct ObjectData
{
	struct MsgPort		*AHImp;
	struct AHIRequest	*AHIio;
	BYTE			 AHIDevice;
	BYTE			 ModInitialized;
	struct Hook		 PlayerHook;
	struct PTData		 ptdata;
};

#define AHIBase		ObjectData->ptdata.ptd_AHIBase

/******************************************************************************/

	// Preprocessor tricks

#define LIBENT			__asm
#define REG(x)			register __ ## x
