//==============================================================================================
//							FICHIER D'EN-TETE DU MODULE DE TRAITEMENT DE L'"ADPCM"
//
//		Créer	  :	03 / 11 / 97
//		Auteur	  :	Nicolas Meyer
//		Fichier	  :	Adpcm.hxx
//
//		Descriptif:	En tête de fichier du module ADPCM, portable sur le maximum de target
//
//==============================================================================================

#ifndef _ADPCM_HXX_
#define _ADPCM_HXX_

//#define DEBUG_OUTPUT_ADPCM /*Compilation en CRT Debug*/
// Inclusion du fichier des routines spécifiques à chaques Targets
#include "SNDinc.h"

#if defined(_DLL_COMPILATION_MODE)
#include "snddll.h"
#endif

#include "sndres.h"

#ifdef DEBUG_OUTPUT_ADPCM
#include <crtdbg.h>			// Fonction de débuggage "CRT"
#endif
#include "ApmType.h"		// Unique cas où "AdpcmType.h" doit être inclus avant "Adpcm.h"
#include "ApmVoice.h"		// Définition d'une voie


/*********************************************************************************************************
// DEFINITION DE MACROS

*/
// Nombre de voie ADPCM maximale
#define		NB_MAX_ADPCM_VOICE			30			// Nombre de voies codée en dur
#define		NB_MAX_ADPCM_THEME			1			// Nombre de theme

#define		UNDER_NB_BUFFER_PITCH		96000		// Nombre de sample avec pitch (multiple de 32)
#define		UNDER_NB_BUFFER				3000		// Nombre de sample sans pitch
#define		SND_BAD_VERSION				0xffff0000L	// Code qui indique de tout décompresser
#define		SND_COMPRESSID				0x0
#define		SND_PITCH_MAX_9				0x00004000L	// Valeur maximale du pitch en 23_9 (16384)
#define		SND_PITCH_MEDIUM_9			0x00002000L	// Valeur maximale du pitch en 23_9 stéréo(16384)
#define		SND_PITCH_DEFAULT_9			0x00000200L	// Valeur par défaut en 23_9 (512)
//#define		SND_PITCH_MIN_9				0x00000010L	// Valeur minimale du pitch en 23_9 (16)
#define		SND_PITCH_MIN_9				0x00000080L	// Valeur minimale du pitch en 23_9 (16)

//#define		SND_NBSAMPLE_FADE			22050		// Nombre de samples 
#define		SND_NBSAMPLE_FADE			44100		// Nombre de samples 

/*********************************************************************************************************
// DEFINITION DE FONCTIONS

*/
// Initialisation/Desinitialisation
unsigned long	fn_ulInitModuleADPCM( );
// Gestion des voie ADPCM et theme
unsigned long	fn_ulAddVoiceADPCM( tdstBlockResourceMem* pstBlockIn, SampleParam* pstPosParam, SND_td_pfn_vSoundCallback pfnCallback, long lCallbackParam, tdstBlockResourceMem* pstBlockTheme, long* plVoiceId, unsigned long ulTimeStart );
unsigned long	fn_ulSetParams( long lVoiceId, SampleParam* pstPosParam );
unsigned long	fn_ulRemoveVoiceADPCM( long lVoiceId );
void			fn_vStopThemeADPCM( long lVoiceId );
unsigned long	fn_ulRemoveVoiceCallbackADPCM( long lVoiceId );
unsigned long	fn_ulPauseVoiceADPCM( long lVoiceId );
unsigned long	fn_ulResumeVoiceADPCM( long lVoiceId );
unsigned long	fn_ulSetNextThemeADPCM( long lVoiceId, tdstBlockResourceMem* pstBlockTheme );
SndBool			fn_bFadeThemeADPCM( long lVoiceId, tdstBlockResourceMem* pstBlockTheme, SndReal rDuration );
unsigned long	fn_ulGetPosVoiceADPCM( long lVoiceId, double* pdPos, unsigned long ulBytePos );
unsigned long	fn_ulGetLengthVoiceADPCM( long lVoiceId, unsigned long* pulLength );

// Gestion du mixage
unsigned long	fn_ulMixerStereoADPCM( ApmBool bStream, unsigned long ulNbSample, short* pnDataOut, unsigned long ulTime );
SndBool			fn_bVoiceIsPlayingADPCM( long lVoiceId );
unsigned long	fn_ulResolveVersion( unsigned long ulVersionCode );
// Conversion ressource ADPCM -> PCM
unsigned long	fn_ulFillSizeAndLoopADPCM( tdstBlockResourceDisk* pstDisk, void* pvPtr );
unsigned long	fn_ulConvertDataADPCM( void* pDataIn, void* pDataOut );

#endif	// _ADPCM_HXX_
