//
//  $Filename: misc/DeliPlayer.h $
//  $Release: 2.0 $
//  $Revision: 2.07$
//  $Date: 16/07/94$
//
//	Definitions and Macros for creating DeliTracker Playermodules
//
//	(C) Copyright 1991, 1992, 1993, 1994 Delirium Softdesign
//	    All Rights Reserved
//
// Converted to C by Necro\Banana Dezign.
//   Sorry about the C++ style comments, but I was lazy at the time. @;^D
//   Change 'em yourself if your compiler can't cope, or just go out and by SAS/C.
//

#ifndef	DELITRACKER_PLAYER_H
#define DELITRACKER_PLAYER_H

#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif

#ifndef EXEC_PORTS_H
#include <exec/ports.h>
#endif

#ifndef UTILITY_TAGITEM_H
#include <utility/tagitem.h>
#endif

#ifndef INTUITION_SCREENS_H
#include <intuition/screens.h>
#endif

// ---------------------------------------------------------------------------

#define DELIVERSION 17			// Current Version of DeliTracker
#define DELIREVISION 4			// Current Revision of DeliTracker

// ---------- Defines for interfacing with the delistartup.o header ----------

extern APTR DeliBase;
extern struct MsgPort *DeliPort;
extern void initCode(void);

// the DeliHeader macro must be an entry in your DeliTags taglist !!

#define DeliHeader(name,stack,pri,deli)	DTP_DeliBase, (ULONG)&DeliBase,\
	DTP_Process, (ULONG)initCode,\
	DTP_MsgPort, (ULONG)&DeliPort,\
	DTP_PlayerName, (ULONG)name,\
	DTP_StackSize, (ULONG)stack,\
	DTP_Priority, (ULONG)pri,\
	DTP_RequestDTVersion, (ULONG)deli

// -------------- The declarations for the interface functions ---------------

extern __asm APTR dt_GetListDataPos(register __d0 ULONG num);
extern __asm ULONG dt_GetListDataSize(register __d0 ULONG num);
extern __asm BOOL dt_LoadFile(void);
extern __asm void dt_CopyDir(void);
extern __asm void dt_CopyFile(void);
extern __asm void dt_CopyString(register __a0 STRPTR string);
extern __asm BOOL dt_AudioAlloc(void);
extern __asm void dt_AudioFree(void);
extern __asm void dt_StartInt(void);
extern __asm void dt_StopInt(void);
extern __asm void dt_SongEnd(void);
extern __asm void dt_CutSuffix(void);
extern __asm void dt_SetTimer(void);
extern __asm void dt_WaitAudioDMA(void);
extern __asm struct Screen *dt_LockScreen(void);
extern __asm void dt_UnlockScreen(void);
extern __asm void dt_NotePlayer(void);
extern __asm APTR dt_AllocListData(register __d0 ULONG size, register __d1 ULONG memflags);
extern __asm void dt_FreeListData(register __a1 APTR memblock);

// ------------------------ Player Function Offsets --------------------------

struct DeliTrackerPlayer {
	ULONG RTS_code;
	UBYTE ID[8];
	struct TagItem *TagArray;
};

// The TagItem ID's (ti_Tag values) for the player interface follow.

#define DTP_Dummy	(TAG_USER + 0x4454)

#define DTP_InternalPlayer	(DTP_Dummy)			// obsolete
#define DTP_CustomPlayer	(DTP_Dummy + 1)		// player is a customplayer

#define DTP_RequestDTVersion	(DTP_Dummy + 2)	// minimum DeliTracker version needed
#define DTP_RequestKickVersion	(DTP_Dummy + 3)	// minimum KickStart version needed

#define DTP_PlayerVersion	(DTP_Dummy + 4)		// actual player version & revision
#define DTP_PlayerName		(DTP_Dummy + 5)		// name of this player
#define DTP_Creator			(DTP_Dummy + 6)		// misc string

#define DTP_Check1			(DTP_Dummy + 7)		// Check Format before loading
#define DTP_Check2			(DTP_Dummy + 8)		// Check Format after file is loaded
#define DTP_ExtLoad			(DTP_Dummy + 9)		// Load additional files
#define DTP_Interrupt		(DTP_Dummy + 10)	// Interrupt routine
#define DTP_Stop			(DTP_Dummy + 11)	// Clear Patterncounter
#define DTP_Config			(DTP_Dummy + 12)	// Config Player
#define DTP_UserConfig		(DTP_Dummy + 13)	// User-Configroutine
#define DTP_SubSongRange	(DTP_Dummy + 14)	// Get min&max subsong number

#define DTP_InitPlayer		(DTP_Dummy + 15)	// Initialisize the Player
#define DTP_EndPlayer		(DTP_Dummy + 16)	// Player clean up
#define DTP_InitSound		(DTP_Dummy + 17)	// Soundinitialisation routine
#define DTP_EndSound		(DTP_Dummy + 18)	// End sound
#define DTP_StartInt		(DTP_Dummy + 19)	// Start interrupt
#define DTP_StopInt			(DTP_Dummy + 20)	// Stop interrupt

#define DTP_Volume			(DTP_Dummy + 21)	// Set Volume
#define DTP_Balance			(DTP_Dummy + 22)	// Set Balance
#define DTP_Faster			(DTP_Dummy + 23)	// Incease playspeed
#define DTP_Slower			(DTP_Dummy + 24)	// Decrease playspeed
#define DTP_NextPatt		(DTP_Dummy + 25)	// Jump to next pattern
#define DTP_PrevPatt		(DTP_Dummy + 26)	// Jump to previous pattern
#define DTP_NextSong		(DTP_Dummy + 27)	// Play next subsong
#define DTP_PrevSong		(DTP_Dummy + 28)	// Play previous subsong

	//--- functions in revision 14 or higher (distributed as Release 1.35) ---

#define DTP_SubSongTest		(DTP_Dummy + 29)	// Test, if given subsong is vaild

	//--- functions in revision 16 or higher (distributed as Release 2.01) ---

#define DTP_NewSubSongRange	(DTP_Dummy + 30)	// enhanced replacement for DTP_SubSongRange

#define DTP_DeliBase		(DTP_Dummy + 31)	// the address of a pointer where DT
												// stores a pointer to the DeliGlobals

#define DTP_Flags			(DTP_Dummy + 32)	// misc Flags (see below)

#define DTP_CheckLen		(DTP_Dummy + 33)	// Length of the Check Code

#define DTP_Description		(DTP_Dummy + 34)	// misc string

#define DTP_Decrunch		(DTP_Dummy + 35)	// pointer to Decrunch Code
#define DTP_Convert			(DTP_Dummy + 36)	// pointer to Converter Code

#define DTP_NotePlayer		(DTP_Dummy + 37)	// pointer to a NotePlayer Structure
#define DTP_NoteStruct		(DTP_Dummy + 38)	// the address of a pointer to the
												// NoteStruct Structure
#define DTP_NoteInfo		(DTP_Dummy + 39)	// a pointer where DT stores a pointer
												// to the current NoteStruct Structure
#define DTP_NoteSignal		(DTP_Dummy + 40)	// pointer to NoteSignal code

#define DTP_Process			(DTP_Dummy + 41)	// pointer to process entry code
#define DTP_Priority		(DTP_Dummy + 42)	// priority of the process
#define DTP_StackSize		(DTP_Dummy + 43)	// stack size of the process
#define DTP_MsgPort			(DTP_Dummy + 44)	// a pointer where DT stores a pointer
												// to a port to send its messages

#define DTP_Appear			(DTP_Dummy + 45)	// open your window, if you can
#define DTP_Disappear		(DTP_Dummy + 46)	// go dormant

#define DTP_ModuleName		(DTP_Dummy + 47)	// get the name of the current module
#define DTP_FormatName		(DTP_Dummy + 48)	// get the name of the module format
#define DTP_AuthorName		(DTP_Dummy + 49)	// not implemented yet

	//--- functions in revision 17 or higher (distributed as Release 2.07) ---

#define DTP_InitNote		(DTP_Dummy + 50)	// NoteStruct initialization

#define DTP_PlayTime		(DTP_Dummy + 51)	// not implemented yet

// end of player interface enumeration


// --- various flags ---------------------------------------------------------

#define PLYB_CUSTOM 0		// player is a customplayer
#define PLYF_CUSTOM 1<<0
#define PLYB_SONGEND 1		// player supports songend
#define PLYF_SONGEND 1<<1

	//--- flags defined in revision 17 or higher (distributed as Release 2.07) ---

#define PLYB_ANYMEM 2		// modules of this player don't require chipmem
#define PLYF_ANYMEM 1<<2

// --- DeliTracker message ---------------------------------------------------

struct DeliMessage {
	struct Message Message;
	ULONG Function;
	ULONG Result;
};

// ---------------------------- Global Variables ------------------------------

struct DeliTrackerGlobals {

	// ------ if you use dtg_AslBase, make sure that
	// ------ DTP_RequestDTVersion is at least 13 !

	struct Library *AslBase;				// library base, don't CloseLibrary()!!

	struct Library *DOSBase;				// library base -"-
	struct IntuitionBase *IntuitionBase;	// library base -"-
	struct GfxBase *GfxBase;				// library base -"-
	struct Library *GadToolsBase;			// librarybase -"- (NULL for Kick 1.3 and below)
	APTR ReservedLibraryBase;				// reserved for future use

	STRPTR	DirArrayPtr;	// Ptr to the directory of the current module
	STRPTR	FileArrayPtr;	// Ptr to the filename of the current module
	STRPTR	PathArrayPtr;	// Ptr to PathArray (e.g used in LoadFile())

	APTR	ChkData;		// pointer to the module to be checked
	ULONG	ChkSize;		// size of the module

	UWORD	SndNum;		// current sound number
	UWORD	SndVol;		// volume (ranging from 0 to 64)
	UWORD	SndLBal;	// left volume (ranging from 0 to 64)
	UWORD	SndRBal;	// right volume (ranging from 0 to 64)
	UWORD	LED;		// filter (0 if the LED is off)
	UWORD	Timer;		// timer-value for the CIA-Timers

	APTR	dtg_GetListData;
	APTR	dtg_LoadFile;
	APTR	dtg_CopyDir;
	APTR	dtg_CopyFile;
	APTR	dtg_CopyString;
	APTR	dtg_AudioAlloc;
	APTR	dtg_AudioFree;
	APTR	dtg_StartInt;
	APTR	dtg_StopInt;
	APTR	dtg_SongEnd;		// safe to call from interrupt code !
	APTR	dtg_CutSuffix;

	// ------ extension in revision 14

	APTR	dtg_SetTimer;		// safe to call from interrupt code !

	// ------ extension in revision 15

	APTR	dtg_WaitAudioDMA;	// safe to call from interrupt code !

	// ------ extension in revision 16

	APTR	dtg_LockScreen;
	APTR	dtg_UnlockScreen;
	APTR	dtg_NotePlayer;		// safe to call from interrupt code !
	APTR	dtg_AllocListData;
	APTR	dtg_FreeListData;

	APTR	dtg_Reserved1;		// do not use !!!
	APTR	dtg_Reserved2;		// do not use !!!
	APTR	dtg_Reserved3;		// do not use !!!
};

#endif
