//==============================================================================================
//							FICHIER D'EN-TETE DU MODULE DE TRAITEMENT DE L'"ADPCM"
//
//		Créer	  :	23 / 01 / 98
//		Auteur	  :	Nicolas Meyer
//		Fichier	  :	ApmVoice.h
//
//		Descriptif:	Définitions de la structure d'une voie ADPCM
//
//==============================================================================================

#ifndef _APMVOICE_H_
#define _APMVOICE_H_

/*********************************************************************************************************
// DEFINITION DE STRUCTURES

*/
// Structure décrivant les callbacks ADPCM
typedef struct _SND_tdstADPCMCallback {
	SND_td_pfn_vSoundCallback	pfnCallBack;		// Pointeur callback
	long						lCallbackParam;
} SND_tdstADPCMCallback;
typedef SND_tdstADPCMCallback* lpSND_tdstADPCMCallback;

// Pointeur de fonction
typedef void (  * SND_td_pfn_vADPCMCallback )( lpSND_tdstADPCMCallback pstCall );


// Structure décrivant une voie ADPCM (188 octets)
typedef struct _SND_tdstADPCMVoice	SND_tdstADPCMVoice;
typedef SND_tdstADPCMVoice*			lpSND_tdstADPCMVoice;
typedef lpSND_tdstADPCMVoice*		hSND_tdstADPCMVoice;	//Handle
typedef struct  _SND_tdstADPCMVoice {
	unsigned short				unChannels;
	unsigned short				unSamplesPerSec;	// Fréquence d'enregistrement des samples
	// Gestion des CallBack
	SND_tdstADPCMCallback		stCall;
	// Flags statiques
	ApmBool						bVolable;			// Flag volume
	ApmBool						bPanable;			// Flag panoramique
	ApmBool						bPitchable;			// Flag pitch
	unsigned long				ulStaticVolume;		// Volume statique de la ressource
	// Flags dynamique
	ApmBool						bPause;				// Flag en pause
	ApmBool						bStream;			// Flag stream
	ApmBool						bLoop;				// Flag bouclage
	// Gestion de la voie et du Fade
	ApmBool						bIsPlaying;			// Flag voie en cours
	ApmBool						bFade;				// Flag transition avec Fade
	ApmBool						bFadeIn;			// Flag de fade ascendant ou descendant
	ApmBool						bCallbackDone;		// Appel à la callback effectué
	// Paramètres généraux
	long						lVolume;			// Volume		0 < valeur < 127
	long						lPan;				// Panoramique	0 < valeur < 127
	unsigned long				ulPitch;			// Pitch		réél 23_9
	long						lCoeffLeft;			// Coefficient gauche
	long						lCoeffRight;		// Coefficient droit
	//( Mettre impérativement Right aprés Left pour les optimisations MMX )
	unsigned long				ulNbSample;			// Nombre d'échantillons total
	unsigned long				ulBufferStart;		// Contient le nombre de samples buffer à la création de la voie
	unsigned long				ulSampleStart;		// Indice du sample vers lequel on doit reboucler
	unsigned long				ulSampleLength;		// Taille de la boucle en sample
	unsigned long				ulSamplePos;		// Position courante(décompression) du sample en tenant compte du pitch
	// Gestion des données compressées en mémoire
	char*						pchBeginDatas;		// Pointeur sur le début des données ADPCM
	char*						pchCurrentDatas;	// Pointeur sur la donnée courante ADPCM
	char*						pchEndDatas;		// Pointeur sur la dernière donnée ADPCM
	tdhSndFile*					phFile;				// Pointeur sur une structure décrivant un stream
	tduState					uInitEnv;			// Conditions initiales de décompression
	tduState					uEnv;				// Etat de décompression de la voie
	tduState					uLoop;				// Etat de décompression au point de bouclage
	// Gestion des thèmes
	lpSND_tdstADPCMVoice		pstTheme;			// Pointeur sur le prochain bloc thème
	unsigned long				ulNbSampleFade;		// Indice de progression au cours du fade
	unsigned long               ulFadeStep;         // Scale fade factor
	tduRefRes					uRefRes;			// ressource associée
	hSND_tdstADPCMVoice			hstVoice;			// Handle de la voie
	ApmBool						bTheme;				// La voie courante est un théme
	// Assynchronous buffer manage
	ApmBool						bIsFinishing;       // Permit to the assynchronous buffer to end
	unsigned long               ulBufferEnd;
} SND_tdstADPCMVoice;

#endif	//	_APMVOICE_H_