#ifndef _duck_dxa_h
#define _duck_dxa_h


#include "duck_wav.h"


#if defined(__cplusplus)
extern "C" {
#endif


typedef struct tXAudioSource*	DXL_XAUDIOSRC_HANDLE;  /* forward looking ! */


#define MAX_AUDIO_REGISTRATIONS 20

/* Structure used to register DXA plugins with dxa by formatTag.           */
/*-------------------------------------------------------------------------*/
typedef struct tXAudioRegistration {
	unsigned short formatTag;
	int 	(*audio_dxer_init)(DXL_XAUDIOSRC_HANDLE src);
	int 	(*audio_dxer_dx)(DXL_XAUDIOSRC_HANDLE src, void *left, void *right, int nSamples);
	int 	(*audio_dxer_exit)(DXL_XAUDIOSRC_HANDLE src);	
	int 	(*audio_dxer_clear)(DXL_XAUDIOSRC_HANDLE src);	     
} DXL_AUDIO_REGISTRATION;



/* If it's not documented here, if it's only defined here ... then it's probably not needed by most codec plugins */
/* It may only be used internally to dxa .                                                                        */
/*----------------------------------------------------------------------------------------------------------------*/
typedef struct tXAudioSource
{ 	
	unsigned char 		*addr;				/* address from which to read compressed audio bytes 	*/
	int 			totalPos;
	int 			length;				/* length of compressed audio bytes to read from buffer	*/	
	int 			interleave;
	short 			aiSamp[2],aiStepIndex[2];
	int 			blockFinished;			/* flags audio system that new data in buffer */
	int			samplesRead;			
	UINT64 			profileStartTime;
	UINT64 			profileEndTime;
	UINT64 			dxClocks;
        UINT64  	  	samplesDXed;
	short 			iFirstNibble;
	short 			iNextInput;
	short 			sum,diff,nudiff;
	DKWAVEFORM 		wv; 				/* details of the compressed audio data */
	DXL_AUDIO_REGISTRATION  registration;
	void* 			more;     			/* user data  ... plugin data  */

} DXL_XAUDIOSRC;



typedef struct tAudioBuff *DXL_AUDIODST_HANDLE;




/* audio function prototypes */

/*@
@Name  			DXL_InitAudio
@Description  		Initialize audio decompression services. This function allocates memory for requested object pools.
@Return value 		DXL_OK on success, or negative error code.
@*/
int DXL_InitAudio(
	int srcs,	/* max number of audio sources to be created. */
	int dsts	/* max number of audio destinations to be created. */
);



/*@
@Name DXL_ExitAudio
@Description		Shutdown audio decompression services, freeing allocated objects.
@Return value		none.
@*/
void DXL_ExitAudio(void);


typedef struct tDKWAVEFORM *DKWAVEFORMPTR; /* place holder pointer */



/*@
@Name 		DXL_CreateXAudioSrc
@Description 	Create a compressed audio source (decompressor) 			
@Return value  	returns an DXL_XAUDIOSRC_HANDLE or null unable to create audio source object.
@*/
DXL_XAUDIOSRC_HANDLE DXL_CreateXAudioSrc(
    
	DKWAVEFORMPTR wv, 			/* pointer to compressed waveform struct describing the audio input. */	
	unsigned char *addr,			/* address of compressed data */
	int length				/* length of compressed data in bytes. */	
);



/*@
@Name  		DXL_AlterXAudioData
@Description 	Link an audio decompressor to the next unit of compressed data. 
This function cannot change the type of xSource on the fly. That must remain consistent. 
Setting the address of the audio data to null causes the xSource to generate an infinate number of "zero" value samples.					
@Return value 	void
@*/
void DXL_AlterXAudioData(
	DXL_XAUDIOSRC_HANDLE xSource,		/* handle to compressed audio source */
	unsigned char *addr,			/* pointer to new compressed audio data */
	int length				/* length of compressed data in bytes. */
);




/*@
@Name 		DXL_DestroyXAudioSrc
@Description 	clears an audio decompressor and returns it to the pool.
@Return value 	void
@*/
void DXL_DestroyXAudioSrc(
	DXL_XAUDIOSRC_HANDLE xSource	/* compressed audio source */
);
        


/*@
@Name 			DXL_CreateAudioDst
@Description 		Create a audio destination description. When numChannel equals 2 but addrR is null, it 
is assumed that multi-channel samples should be interleaved within the dest buffer pointed to by addrL.
@Return value		returns an object of type DXL_AUDIODST_HANDLE, and audio destination.
@*/
DXL_AUDIODST_HANDLE DXL_CreateAudioDst(
    void *addrL,		/* pointer to left audio destination channel */
    void *addrR,		/* pointer to right audio destination channel */
    int length,			/* audio buffer size in bytes. */
    int bitDepth,		/* bits per sample */
    int numChannels,		/* number of audio channels */
    int sampleRate		/* samples per second */
);



/*@
@Name 			DXL_AlterAudioDst
@Description 		Change characteristics of audio destination. 
Specify 0 or null values for no change.
@Return value 		void
@*/
void DXL_AlterAudioDst(
    DXL_AUDIODST_HANDLE dst,	/* handle to audio destionation */
    void *addrL,		/* pointer to left audio destination channel */
    void *addrR,		/* pointer to right audio destination channel */
    int length,			/* audio buffer size in bytes. */
    int bitDepth,		/* bits per sample (8 or 16) */
    int numChannels,		/* number of audio channels (1 or 2) */
    int sampleRate		/* samples per second */
);



/*@
@Name 			DXL_DestroyAudioDst
@Description 		clears and audio destination object and returns it to the pool.	
@Return value 		none.
@*/
void DXL_DestroyAudioDst(
	DXL_AUDIODST_HANDLE dst		/* handle to audio destination */
);



/*@
@Name		DXL_dxAudio
@Description 	decompress up to maxSamplesToDecompress. The number of samples transferred is controlled by two factors. 
One factor is the limit parameter. The other factor is the  number of remaining samples in the src (internal buffer).
If the function returns less that the desired number of samples, get another audio record (via HFB_GetStreamingData()) for source data and try again.
@Return value	returns the actual number of samples decompressed 
@*/
int DXL_dxAudio(
	DXL_XAUDIOSRC_HANDLE src,	/* handle to compressed audio source.  */
	DXL_AUDIODST_HANDLE dst,	/* handle to uncompressed audio destination */
	int maxSamplesToDecompress	/* Try to decompress up to this many samples to the destination */
);


/*@
@Name		DXL_ClearAudio
@Description	Clears any internal audio buffers compressed and/or decompressed data so that playback may start from a new point. 
@Return value
@*/
int DXL_ClearAudio(DXL_XAUDIOSRC_HANDLE xSourcePublic);



int DXL_RegisteredAudioDXerGet(DXL_AUDIO_REGISTRATION *oneRegistration);

int DXL_RegisteredAudioDXerSet(
	unsigned short formatTag,
	int (*audio_dxer_init)		(DXL_XAUDIOSRC_HANDLE src),
	int (*audio_dxer_dx)		(DXL_XAUDIOSRC_HANDLE src, void *left, void *right, int nSamples),
	int (*audio_dxer_exit)		(DXL_XAUDIOSRC_HANDLE src),
	int (*audio_dxer_clear)		(DXL_XAUDIOSRC_HANDLE src)
	);
	
	
	
void DXL_AudioAccurateTime(UINT64* temp);


/* Register one of the On2 dxa plugins */
/*-------------------------------------*/
int DXL_RegisterAVC(void);
int DXL_RegisterAC3(void);
int DXL_RegisterQDesign(void);
int DXL_RegisterACM(unsigned short formatTag);
int DXL_RegisterDK4(void);
int DXL_RegisterMP3(void);





#if defined(__cplusplus)
}
#endif

#endif /* include guards */