#ifndef __SNDDLLentryPoint__H__
#define __SNDDLLentryPoint__H__ 

#include <windef.h>
#include <mmsystem.h>


#ifdef __cplusplus
extern "C" {
#endif


extern HMODULE SND_hWavModule;
extern HMODULE SND_hCdModule;
extern HMODULE SND_hMpegModule;
extern HMODULE SND_hDbgModule;
extern HMODULE SND_hAdpcmModule;
extern HMODULE SND_hRecordModule;


//-- Macros DeclarePointern(name,out,in1,in2...)
//	Déclare la macro qui permet de remplacer l'appel à la fonction name par 
//		l'exploitation du pointeur de fonction homonyme. Cett macro
//		déclare un type de pointeur sur la fonction ainsi qu'une variable de ce type.
//	Type retourné par la fonction:out
//	Nombre de paramètres: N (types in1,in2....)
FARPROC _GetProcAddress(HMODULE module,char* name);

#define SND_DLL_GetProcAddress(function,module)			\
	if (module!=NULL)									\
	{													\
		SNDDLLpfn##function=(SNDDLLtdpfn##function)_GetProcAddress(module,cz##function);	\
		if (!SNDDLLpfn##function)						\
			SNDDLLpfn##function=Fake##function;			\
	}													\
	else												\
		SNDDLLpfn##function=Fake##function;


#ifdef INCLUDE_FROM_SNDDLL_C
#define SND_DeclarePointer0(FunctionName,ret)	    \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(void);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(void)=NULL;	\
	ret WINAPI FunctionName(void)							\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)();		\
	}												\
	ret WINAPI Fake##FunctionName(void)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@0";		


#define SND_DeclarePointer0_def(FunctionName,ret,def_ret)	    \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(void);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(void)=NULL;	\
	ret WINAPI FunctionName(void)							\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)();		\
	}												\
	ret WINAPI Fake##FunctionName(void)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@0";		


#define SND_DeclarePointer1(FunctionName,ret,typ1)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1)=NULL;			\
	ret WINAPI FunctionName(typ1 par1)						\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1);			\
	}												\
	ret WINAPI Fake##FunctionName(typ1 par1)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@4";
 

#define SND_DeclarePointer1_def(FunctionName,ret,typ1,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1)=NULL;			\
	ret WINAPI FunctionName(typ1 par1)						\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1);			\
	}												\
	ret WINAPI Fake##FunctionName(typ1 par1)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@4";
 

#define SND_DeclarePointer2(FunctionName,ret,typ1,typ2) \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2);      \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2)=NULL;				\
	ret WINAPI FunctionName(typ1 par1,typ2 par2)				\
	{													\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return((*SNDDLLpfn##FunctionName)(par1,par2));			\
	}													\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@8";

#define SND_DeclarePointer2_def(FunctionName,ret,typ1,typ2,def_ret) \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2);      \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2)=NULL;				\
	ret WINAPI FunctionName(typ1 par1,typ2 par2)				\
	{													\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return((*SNDDLLpfn##FunctionName)(par1,par2));			\
	}													\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2)					\
	{												\
		ret fake=(ret)def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@8";

#define SND_DeclarePointer3(FunctionName,ret,typ1,typ2,typ3)		\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);				\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3);				\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@12";

#define SND_DeclarePointer3_def(FunctionName,ret,typ1,typ2,typ3,def_ret)		\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);				\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3);				\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@12";

#define SND_DeclarePointer4(FunctionName,ret,typ1,typ2,typ3,typ4)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)		\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4);			\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@16";

#define SND_DeclarePointer4_def(FunctionName,ret,typ1,typ2,typ3,typ4,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)		\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4);			\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@16";

#define SND_DeclarePointer5(FunctionName,ret,typ1,typ2,typ3,typ4,typ5)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5)=NULL;								\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)\
	{																	\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5);			\
	}																	\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@20";

#define SND_DeclarePointer5_def(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5)=NULL;								\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)\
	{																	\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5);			\
	}																	\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@20";

#define SND_DeclarePointer7(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,typ6,typ7)			\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);					\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7)=NULL;													\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)	\
	{																						\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5,par6,par7);					\
	}																						\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@28";


#define SND_DeclarePointer7_def(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,typ6,typ7,ret_def)			\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);					\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7)=NULL;													\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)	\
	{																						\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5,par6,par7);					\
	}																						\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)					\
	{												\
		return ret_def;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@28";


#define SND_DeclarePointer_void0(FunctionName,ret)	    \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(void);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(void)=NULL;	\
	ret WINAPI FunctionName(void)							\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)();		\
	}												\
	ret WINAPI Fake##FunctionName(void)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@0";

#define SND_DeclarePointer_void1(FunctionName,ret,typ1)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1)=NULL;			\
	ret WINAPI FunctionName(typ1 par1)						\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1);			\
	}												\
	ret WINAPI Fake##FunctionName(typ1 par1)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@4";
 

#define SND_DeclarePointer_void2(FunctionName,ret,typ1,typ2) \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2);      \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2)=NULL;				\
	ret WINAPI FunctionName(typ1 par1,typ2 par2)				\
	{													\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2);			\
	}													\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@8";

#define SND_DeclarePointer_void3(FunctionName,ret,typ1,typ2,typ3)		\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);				\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3)=NULL;							\
    ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2,par3);				\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@12";

#define SND_DeclarePointer_void4(FunctionName,ret,typ1,typ2,typ3,typ4)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)		\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2,par3,par4);			\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@16";

#define SND_DeclarePointer_void5(FunctionName,ret,typ1,typ2,typ3,typ4,typ5)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5)=NULL;								\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)\
	{																	\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5);			\
	}																	\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@20";

#define SND_DeclarePointer_void7(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,typ6,typ7)			\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);					\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7)=NULL;													\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)	\
	{																						\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5,par6,par7);					\
	}																						\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@28";


#else //INCLUDE_FROM_SNDDLL_C
#define SND_DeclarePointer0(FunctionName,ret)					\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(void);					\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(void);						\
    extern ret WINAPI Fake##FunctionName(void);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(void);									

#define SND_DeclarePointer0_def(FunctionName,ret,def_ret)					\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(void);					\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(void);						\
    extern ret WINAPI Fake##FunctionName(void);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(void);									

#define SND_DeclarePointer1(FunctionName,ret,typ1)				\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);					\
	extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1);						\
    extern ret WINAPI Fake##FunctionName(typ1);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1);

#define SND_DeclarePointer1_def(FunctionName,ret,typ1,def_ret)				\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);					\
	extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1);						\
    extern ret WINAPI Fake##FunctionName(typ1);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1);

#define SND_DeclarePointer2(FunctionName,ret,typ1,typ2)			\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2);				\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2);						\
    extern ret WINAPI Fake##FunctionName(typ1,typ2);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2);

#define SND_DeclarePointer2_def(FunctionName,ret,typ1,typ2,def_ret)			\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2);				\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2);						\
    extern ret WINAPI Fake##FunctionName(typ1,typ2);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2);

#define SND_DeclarePointer3(FunctionName,ret,typ1,typ2,typ3)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);			\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3);						\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3);

#define SND_DeclarePointer3_def(FunctionName,ret,typ1,typ2,typ3,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);			\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3);						\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3);

#define SND_DeclarePointer4(FunctionName,ret,typ1,typ2,typ3,typ4)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4);							\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4);

#define SND_DeclarePointer4_def(FunctionName,ret,typ1,typ2,typ3,typ4,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4);							\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4);

#define SND_DeclarePointer5(FunctionName,ret,typ1,typ2,typ3,typ4,typ5)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);								\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4,typ5);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4,typ5);

#define SND_DeclarePointer5_def(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);								\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4,typ5);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4,typ5);

#define SND_DeclarePointer7(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,typ6,typ7)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);			\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);											\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4,typ5,typ6,typ7);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4,typ5,typ6,typ7);

#define SND_DeclarePointer7_def(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,typ6,typ7,ret_def)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);			\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);											\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4,typ5,typ6,typ7);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4,typ5,typ6,typ7);

#define SND_DeclarePointer_void0(FunctionName,ret)					\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(void);					\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(void);						\
    extern ret WINAPI Fake##FunctionName(void);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(void);									

#define SND_DeclarePointer_void1(FunctionName,ret,typ1)				\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);					\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1);						\
    extern ret WINAPI Fake##FunctionName(typ1);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1);

#define SND_DeclarePointer_void2(FunctionName,ret,typ1,typ2)			\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2);				\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2);						\
    extern ret WINAPI Fake##FunctionName(typ1,typ2);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2);

#define SND_DeclarePointer_void3(FunctionName,ret,typ1,typ2,typ3)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);			\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3);						\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3);

#define SND_DeclarePointer_void4(FunctionName,ret,typ1,typ2,typ3,typ4)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4);							\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4);

#define SND_DeclarePointer_void5(FunctionName,ret,typ1,typ2,typ3,typ4,typ5)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);								\
    extern ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4,typ5);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4,typ5);

#define SND_DeclarePointer_void7(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,typ6,typ7)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);			\
    extern ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);											\
    ret WINAPI Fake##FunctionName(typ1,typ2,typ3,typ4,typ5,typ6,typ7);						\
	extern char cz##FunctionName##[];	\
	ret WINAPI FunctionName(typ1,typ2,typ3,typ4,typ5,typ6,typ7);

#endif //INCLUDE_FROM_SNDDLL_C


#if defined(USE_STATIC_MODULE)
/*************************************************************************
**************************************************************************
		Module static (exporté de la librairie statique)
**************************************************************************
*************************************************************************/

/* HMODULEs */
SND_DeclarePointer0(SND_fn_vGetHModuleMpeg,HMODULE);
SND_DeclarePointer0(SND_fn_vGetHModuleWav,HMODULE);
SND_DeclarePointer0(SND_fn_vGetHModuleCd,HMODULE);
SND_DeclarePointer0(SND_fn_vGetHModuleDbg,HMODULE);
SND_DeclarePointer0(SND_fn_vGetHModuleAdpcm,HMODULE);
SND_DeclarePointer0(SND_fn_vGetHModuleRecord,HMODULE);

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

Module Snderr.h

DLL_IMPEXP void SND_fn_vDisplayError(unsigned short uwErrNum,char * message);
DLL_IMPEXP int SND_fn_iErreurInit(int idErr);
DLL_IMPEXP void _snd_assert(char* test,char* file,int line);
DLL_IMPEXP int snd_erreur_init(int num_err);

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

#ifdef DEBUG_SON
	#define snd_assert(fct) if (!(fct)) _snd_assert(#fct, __FILE__, __LINE__)
#else
	#define snd_assert(fct)
#endif  

SND_DeclarePointer_void2(SND_fn_vDisplayError,void,unsigned short,char*);
SND_DeclarePointer_void3(SND_fn_vDisplayErrorEx,void,unsigned short,char*,int);
SND_DeclarePointer1(SND_fn_iErreurInit,int,int);
SND_DeclarePointer_void3(_snd_assert,void,char*,char*,int);
SND_DeclarePointer1(snd_erreur_init,int,int);



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

Module Sndmem.h


DLL_IMPEXP CPA_EXPORT void  SND_fn_vInitMallocSnd();
DLL_IMPEXP CPA_EXPORT void  SND_fn_vDesInitMallocSnd();
DLL_IMPEXP CPA_EXPORT void* SND_fn_pvMallocSnd(unsigned long nb_octets);
DLL_IMPEXP CPA_EXPORT void* SND_fn_pvReAllocSnd(void* ptr,unsigned long nb_octets);
DLL_IMPEXP CPA_EXPORT void  SND_fn_vFreeSnd(void* ptr);

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

SND_DeclarePointer_void0(SND_fn_vInitMallocSnd,void);
SND_DeclarePointer_void0(SND_fn_vDesInitMallocSnd,void);
SND_DeclarePointer1(SND_fn_pvMallocSnd,void*,unsigned long);
SND_DeclarePointer2(SND_fn_pvReAllocSnd,void*,void*,unsigned long);
SND_DeclarePointer_void1(SND_fn_vFreeSnd,void,void*);
SND_DeclarePointer2(SND_fn_pvMallocSndEx,void*,unsigned char,unsigned long);
SND_DeclarePointer3(SND_fn_pvReAllocSndEx,void*,unsigned char,void*,unsigned long);
SND_DeclarePointer_void2(SND_fn_vFreeSndEx,void,unsigned char,void*);
SND_DeclarePointer_void2(SND_fn_vResizeMemoryBlockSnd,void,unsigned char,unsigned long);



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

Module Sndfile.h


DLL_IMPEXP CPA_EXPORT SndBool	SND_fn_bLoadDataInMem(void* adr,unsigned long ulNbBytes,char* czFileName,unsigned long ulOffset);
DLL_IMPEXP CPA_EXPORT SndBool	SND_fn_bSetCurrentDirectory(char* czDir); 
DLL_IMPEXP CPA_EXPORT DWORD	    SND_fn_dwFileSndLength(tdhSndFile	hSndFile);
DLL_IMPEXP CPA_EXPORT DWORD	    SND_fn_dwWriteFileSnd(tdhSndFile hSndFile,DWORD dwNbBytes,void * ptr);

DLL_IMPEXP CPA_EXPORT void      SND_fn_vAddDataDirectory(char* czDir);
DLL_IMPEXP CPA_EXPORT SndBool   SND_fn_bGetOneDataDirectory(int id,char* czDir,int iMaxChar);
DLL_IMPEXP CPA_EXPORT int       SND_fn_iGetNumberOfDataDirectory();
DLL_IMPEXP CPA_EXPORT int       SND_fn_iGetIdDataDirectory(char* szDir);
DLL_IMPEXP CPA_EXPORT SndBool   SND_fn_bIsDataDirectory(char* szDir);
DLL_IMPEXP CPA_EXPORT void      SND_fn_vResolveFileName(char* RelativeName,char* AbsoluteName);

DLL_IMPEXP CPA_EXPORT DWORD	    SND_fn_dwReadFileSnd(tdhSndFile hSndFile,DWORD dwNbBytes,void * ptr);
DLL_IMPEXP CPA_EXPORT DWORD	    SND_fn_dwSeekFileSnd(tdhSndFile hSndFile,DWORD dwOffset,DWORD dwOrigin);
DLL_IMPEXP CPA_EXPORT tdhSndFile	SND_fn_hOpenFileReadSnd(char * czFileName);
DLL_IMPEXP CPA_EXPORT void		SND_fn_vCloseFileSnd(tdhSndFile hSndFile); 

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

SND_DeclarePointer4(SND_fn_bLoadDataInMem,SndBool,void*,unsigned long,char*,unsigned long);
SND_DeclarePointer5(SND_fn_bLoadDataInMemAndSwap,SndBool,void*,unsigned long,char*,unsigned long,SndBool);
SND_DeclarePointer1(SND_fn_bSetCurrentDirectory,SndBool,char*); 
SND_DeclarePointer1(SND_fn_dwFileSndLength,unsigned long,tdhSndFile);
SND_DeclarePointer3(SND_fn_dwWriteFileSnd,unsigned long,tdhSndFile,unsigned long,void*);

SND_DeclarePointer_void1(SND_fn_vAddDataDirectory,void,const char*);
SND_DeclarePointer_void1(SND_fn_vRemoveDataDirectory,void,const char*);
SND_DeclarePointer_void0(SND_fn_vPurgeDataDirectory,void);
SND_DeclarePointer3(SND_fn_bGetOneDataDirectory,SndBool,int,char*,int );
SND_DeclarePointer0(SND_fn_iGetNumberOfDataDirectory,int);
SND_DeclarePointer1(SND_fn_iGetIdDataDirectory,int,const char*);
SND_DeclarePointer1(SND_fn_bIsDataDirectory,SndBool,const char*);
SND_DeclarePointer_void2(SND_fn_vResolveFileName,void,char*,char*);
SND_DeclarePointer_void1(SND_fn_vSetSoftDirectory,void,char*);
SND_DeclarePointer0_def(SND_fn_szGetSoftDirectory,char*,NULL);
SND_DeclarePointer3(SND_fn_dwReadFileSnd,unsigned long,tdhSndFile,unsigned long,void*);
SND_DeclarePointer3(SND_fn_dwSeekFileSnd,unsigned long,tdhSndFile,unsigned long,long);
SND_DeclarePointer1(SND_fn_hOpenFileReadSnd,tdhSndFile,char*);
SND_DeclarePointer_void1(SND_fn_vCloseFileSnd,void,tdhSndFile);

//sndini
SND_DeclarePointer0_def(SND_fn_bCanSetOptions,SndBool,FALSE);
SND_DeclarePointer4_def(SND_fn_bGetOptions,SndBool,char* ,char* ,char* ,int ,FALSE);
SND_DeclarePointer_void3(SND_fn_vSetOptions,void,char* ,char* ,char* );


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

Module sndldbin.h

* * * * * * * * * * * * * * * * * * * * * * * * * * * * */
SND_DeclarePointer0(SND_fn_iGetNumberOfBanks,int);
SND_DeclarePointer1(SND_fn_iGetNumberOfEventInBank,int,int);
SND_DeclarePointer0(SND_fn_bStartLoadBanks,SndBool);
SND_DeclarePointer1(SND_fn_bStartLoadBanks2,SndBool,int);
SND_DeclarePointer1(SND_fn_bInitBank,SndBool,int);
SND_DeclarePointer2(SND_fn_bInitBank2,SndBool,int,int);
SND_DeclarePointer0(SND_fn_bEndLoadBanks,SndBool);
SND_DeclarePointer1(SND_fn_pGetBinEvent,SND_tdstBlockEvent*,unsigned long);
SND_DeclarePointer1(SND_fn_pGetBinRes,tdstBlockResourceMem*,unsigned long);
SND_DeclarePointer1(SND_fn_bLoadBinaryBank,SndBool,int);
SND_DeclarePointer1(SND_fn_bUnLoadBinaryBank,SndBool,int);
SND_DeclarePointer_void1(SND_fn_vInitBankSnd,void,char*);
SND_DeclarePointer_void0(SND_fn_vDesInitBankSnd,void);

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

Module Sndspace.h

DLL_IMPEXP unsigned char SND_fn_ucDistanceToVolume(SndReal dist);
DLL_IMPEXP SndReal SND_fn_rDopplerPitch(SndVector *src_pos,SndVector *src_vit,SndVector *mic_pos,SndVector *mic_vit);
DLL_IMPEXP unsigned char SND_fn_ucPositionToPan(SndVector *src,SndVector *mic,SndVector *mic_nor,SndVector *mic_tan);
DLL_IMPEXP unsigned char SND_fn_ucPositionToDolby(SndVector *src,SndVector *mic,SndVector *mic_nor);

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

SND_DeclarePointer1(SND_fn_ucDistanceToVolume,unsigned char,SndReal);
SND_DeclarePointer2(SND_fn_ucDistanceToVolumeEx,unsigned char,SndReal,RollOffParam*);
SND_DeclarePointer4(SND_fn_rDopplerPitch,SndReal,SndVector*,SndVector*,SndVector*,SndVector *);
SND_DeclarePointer_void1(SND_fn_vSetDopplerFactor,void,SndReal );
SND_DeclarePointer0(SND_fn_rGetDopplerFactor,SndReal);
SND_DeclarePointer4(SND_fn_ucPositionToPan,unsigned char,SndVector*,SndVector*,SndVector*,SndVector*);
SND_DeclarePointer3(SND_fn_ucPositionToDolby,unsigned char,SndVector*,SndVector*,SndVector*);
SND_DeclarePointer_void1(SND_fn_vSetDefaultRollOff,void,RollOffParam* );
SND_DeclarePointer_void1(SND_fn_vGetDefaultRollOff,void,RollOffParam* );



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

Module Sndreal.h

DLL_IMPEXP SndReal SND_fn_rMulRealRealSnd(SndReal r1,SndReal r2);
DLL_IMPEXP SndReal SND_fn_rMulRealRealQuickSnd(SndReal r1,SndReal r2);
DLL_IMPEXP SndReal SND_fn_rDivRealRealSnd(SndReal r1,SndReal r2);
DLL_IMPEXP SndReal SND_fn_rSqrtRealSnd(SndReal r);

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

SND_DeclarePointer2(SND_fn_rMulRealRealSnd,SndReal,SndReal,SndReal);
SND_DeclarePointer2(SND_fn_rMulRealRealQuickSnd,SndReal,SndReal,SndReal);
SND_DeclarePointer2(SND_fn_rDivRealRealSnd,SndReal,SndReal,SndReal);
//SND_DeclarePointer1(SND_fn_rSqrtRealSnd,SndReal,SndReal);
SND_DeclarePointer1(SND_fn_rAbsRealSnd,SndReal,SndReal);



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

Module Sndvect.h

DLL_IMPEXP SndReal SND_fn_rNormeVectorSnd(SndVector *v);
DLL_IMPEXP SndReal SND_fn_rPseudoNormeVectorSnd(SndVector *v);
DLL_IMPEXP SndReal SND_fn_rScalaireVectorSnd(SndVector *v1,SndVector *v2);
DLL_IMPEXP SndReal SND_fn_rPseudoScalaireNormeVectorSnd(SndVector *v1,SndVector *v2);
DLL_IMPEXP void SND_fn_vProduitVectorSnd(SndVector *v1,SndVector *v2,SndVector *v);   

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

SND_DeclarePointer1(SND_fn_rNormeVectorSnd,SndReal,SndVector*);
SND_DeclarePointer1(SND_fn_rPseudoNormeVectorSnd,SndReal,SndVector*);
SND_DeclarePointer2(SND_fn_rScalaireVectorSnd,SndReal,SndVector*,SndVector*);
SND_DeclarePointer2(SND_fn_rPseudoScalaireNormeVectorSnd,SndReal,SndVector*,SndVector*);
SND_DeclarePointer_void3(SND_fn_vProduitVectorSnd,void,SndReal*,SndVector*,SndVector*);


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

Module Sndthrd.h

DLL_IMPEXP void SND_fn_vInitThreadSnd();
DLL_IMPEXP void SND_fn_vDesInitThreadSnd();
DLL_IMPEXP void SND_fn_vEnterCriticalSectionThreadSnd_();
DLL_IMPEXP void SND_fn_vQuitCriticalSectionThreadSnd();
DLL_IMPEXP void SND_fn_vMouchardThreadsnd(char* file,int line);
DLL_IMPEXP void SND_fn_vWaitForValueThreadSnd(long* ptr,long val);

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

SND_DeclarePointer_void0(SND_fn_vInitThreadSnd,void);
SND_DeclarePointer_void0(SND_fn_vDesInitThreadSnd,void);
SND_DeclarePointer_void0(SND_fn_vEnterCriticalSectionThreadSnd_,void);
SND_DeclarePointer_void0(SND_fn_vQuitCriticalSectionThreadSnd,void);
SND_DeclarePointer_void2(SND_fn_vMouchardThreadsnd,void,char*,int);
SND_DeclarePointer_void2(SND_fn_vWaitForValueThreadSnd,void,long*,long);
//SND_DeclarePointer_void2(SND_fn_vStartCallbackThreadsnd,void,SND_td_pfn_vSoundCallback ,long );



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

Module Sndtest.h

BOOL SND_fn_bTestSnd_Pentium(void);
BOOL SND_fn_bTestSnd_MMX(void);
BOOL SND_fn_bTestSnd_WinMM(WAVEFORMATEX *format);
BOOL SND_fn_bTestSnd_DX2D(void);
BOOL SND_fn_bTestSnd_DX3D(void);

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

SND_DeclarePointer0(SND_fn_bTestSnd_Pentium,BOOL);
SND_DeclarePointer0(SND_fn_bTestSnd_MMX,BOOL);
SND_DeclarePointer1(SND_fn_bTestSnd_WinMM,BOOL,WAVEFORMATEX*);
SND_DeclarePointer0(SND_fn_bTestSnd_Win32,BOOL);
SND_DeclarePointer0(SND_fn_bTestSnd_WinNT,BOOL);

/*************************************************************************
**************************************************************************
		Module static pour DBG (exporté de la librairie statique uniquement pour SNDDBG.DLL)
**************************************************************************
*************************************************************************/
//For SNDDBG
SND_DeclarePointer2(dbgSND_fn_bGetAskedTheme,SndBool,tduRefRes*,SndBool*);
SND_DeclarePointer3(dbgSND_fn_bGetThemePosition,SndBool,tduRefRes*,long* ,long* );
SND_DeclarePointer_void4(dbgSND_fn_vGetInfoForObjectSound,void,long ,long ,char* ,long );
SND_DeclarePointer1(dbgSND_fn_lGetSizeOfSoundParam,long,SoundParam* );
SND_DeclarePointer_void1(SND_fn_vSetResNameCallback,void,tdpfnResNameCallback);
SND_DeclarePointer1(SND_fn_czGetResNameFromEdId,const char*,unsigned long);
SND_DeclarePointer2_def(dbgSND_fn_bSetResourceStaticVolume,SndBool,unsigned long,unsigned char,FALSE);
SND_DeclarePointer0_def(dbgSND_fn_rGetDopplerFactor, SndReal,C_SNDREAL_1);
SND_DeclarePointer_void1(dbgSND_fn_vSendRequestSound, void,SND_tduRefEvt);


#endif //USE_STATIC_MODULE

#if defined(USE_MPEG_MODULE)
//#include "sndmpeg.h"
/*************************************************************************
**************************************************************************
		Module SNDMPEG (exporté de la DLL MPGmnuxy.DLL
**************************************************************************
*************************************************************************/

#ifndef NO_ACP_LDBIN
SND_DeclarePointer0(SND_fn_bCanFreeDataMPEG,SndBool);
#endif

#ifndef SNDDLL_MODULE //fonctions inutiles pour la LIB statiques
SND_DeclarePointer5_def(SND_fn_lPlayMPEG,long ,tduRefRes ,SampleParam*,long ,SND_td_pfn_vSoundCallback ,long ,C_PLAY_FAILED);
SND_DeclarePointer_void1(SND_fn_vRemoveCallbackMPEG,void ,long );
SND_DeclarePointer2(SND_fn_bSetParamMPEG,SndBool ,long ,SampleParam*);
SND_DeclarePointer1(SND_fn_bTestIsPlayingMPEG,SndBool ,long );
SND_DeclarePointer_void1(SND_fn_vStopMPEG,void ,long);
SND_DeclarePointer_void1(SND_fn_vPauseMPEG,void ,long);
SND_DeclarePointer_void1(SND_fn_vResumeMPEG,void ,long);

SND_DeclarePointer1(SND_fn_iInitMPEG,int ,SND_tdstInitStruct*);
SND_DeclarePointer0(SND_fn_bTestInitMPEG,SndBool);
SND_DeclarePointer_void0(SND_fn_vDesInitMPEG,void);
SND_DeclarePointer_void0(SND_fn_vSynchroMPEG,void);

SND_DeclarePointer1_def(SND_fn_tdGetResForVoiceMPEG,tduRefRes,long,SND_RES_FANTOME);
//SND_DeclarePointer_void3(SND_fn_vConvertResDiskToMemMPEG,void,tdstBlockResourceDisk*,tdstBlockResourceMem*,void*);
SND_DeclarePointer2(SND_fn_bLoadResScriptMPEG,SndBool ,tdstBlockResourceDisk*,tdstBlockResourceMem*);
SND_DeclarePointer3(SND_fn_bLoadResBinaryMPEG,SndBool ,tdstBlockResourceDisk*,tdstBlockResourceMem*,char *);
//SND_DeclarePointer_void2(SND_fn_vLoadResFromDiskMPEG,void ,tdstBlockResourceDisk*,tdstBlockResourceMem*);
SND_DeclarePointer_void1(SND_fn_vUnLoadResMPEG,void ,tdstBlockResourceMem*);
SND_DeclarePointer1(SND_fn_bIsResLoadedMPEG,SndBool ,tdstBlockResourceMem*);
//SND_DeclarePointer_void1(SND_fn_vSetResUnloadedMPEG,void ,tdstBlockResourceMem*);
SND_DeclarePointer1(SND_fn_rGetPosMPEG,SndReal,long);
SND_DeclarePointer1(SND_fn_rGetLengthMPEG,SndReal,long);

//---themes
SND_DeclarePointer5_def(SND_fn_lPlayTransitionMPEG,long ,tduRefRes ,tduRefRes ,SND_td_pfn_vSoundCallback,long,SampleParam*,C_PLAY_FAILED);
SND_DeclarePointer2(SND_fn_bSetParamTransitionMPEG,SndBool,long,SampleParam*);
SND_DeclarePointer2(SND_fn_bSetNextTransitionMPEG,SndBool ,long ,tduRefRes );
SND_DeclarePointer2(SND_fn_bDoTransitionWithFadeMPEG,SndBool ,long ,tduRefRes );
SND_DeclarePointer3( SND_fn_bDoTransitionWithFadeMPEG2, SndBool ,long ,tduRefRes, SndReal );
SND_DeclarePointer_void1(SND_fn_vStopTransitionMPEG,void ,long );
SND_DeclarePointer_void1(SND_fn_vPauseTransitionMPEG,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeTransitionMPEG,void,long );

SND_DeclarePointer_void0(SND_fn_vReleaseDriverMPEG,void);
SND_DeclarePointer_void0(SND_fn_vRestoreDriverMPEG,void);

SND_DeclarePointer4_def(SND_fn_lCreateNewBufferExMPEG,long,SND_tdstFormat*,SND_tdstCallback* ,SoundParam* ,long ,C_PLAY_FAILED);
SND_DeclarePointer1(SND_fn_lGetPosBufferExMPEG,long,long );
SND_DeclarePointer2(SND_fn_lPushBufferExMPEG,long,long,SND_tdstStackBuffer* );

SND_DeclarePointer_void1(SND_fn_vSetDefaultRollOffMPEG,void,RollOffParam* );
SND_DeclarePointer1_def(SND_fn_bCheckVersionResourceMPEG,SndBool,tdstBlockResourceDisk*,TRUE);

SND_DeclarePointer2_def(SND_fn_bSetResourceStaticVolumeMPEG,SndBool,tdstBlockResourceMem*,unsigned char,FALSE);

#endif //SNDDLL_MODULE 
#endif //ifdef USE_MPEG_MODULE


#if defined(USE_WAV_MODULE)
//#include "sndxd.h"
/*************************************************************************
**************************************************************************
		Module SNDXD (exporté de la DLL WAVmnuxy.DLL
**************************************************************************
*************************************************************************/

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

Module Sndxd.h

DLL_IMPEXP CPA_EXPORT long SND_fn_lPlaySxd(tduRefRes res,SoundParam *par,long prio,SND_td_pfn_vSoundCallback fn_callback,long par_callback);
DLL_IMPEXP CPA_EXPORT void SND_fn_vRemoveCallbackSxd(long voice);
DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bSetParamSxd(long voice,SoundParam *par);
DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bTestIsPlayingSxd(long voice);
DLL_IMPEXP CPA_EXPORT void SND_fn_vStopSxd(long voice);
DLL_IMPEXP CPA_EXPORT void SND_fn_vPauseSxd(long voice);
DLL_IMPEXP CPA_EXPORT void SND_fn_vResumeSxd(long voice);

DLL_IMPEXP CPA_EXPORT void SND_fn_vSetSoundVolumeSxd(unsigned char vol);
DLL_IMPEXP CPA_EXPORT unsigned char SND_fn_ucGetSoundVolumeSxd();

DLL_IMPEXP CPA_EXPORT void SND_fn_vSetStereoSxd(SndBool active);
DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bGetStereoSxd(void);

DLL_IMPEXP CPA_EXPORT int SND_fn_iInitSxd(SND_tdstInitStruct *pInitStruct);
DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bTestInitSxd(void);
DLL_IMPEXP CPA_EXPORT void SND_fn_vDesInitSxd(void);

DLL_IMPEXP CPA_EXPORT int SND_fn_iInitBnkSxd(long num);
DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bTestInitBnkSxd(long num);
DLL_IMPEXP CPA_EXPORT void SND_fn_vDesInitBnkSxd(long num);
DLL_IMPEXP CPA_EXPORT void SND_fn_vDesInitAllBnkSxd(void);

DLL_IMPEXP CPA_EXPORT void SND_fn_vSetEffectSxd(long num);

DLL_IMPEXP CPA_EXPORT long SND_fn_lCreateMicroSxd(MicroParam* par);
DLL_IMPEXP CPA_EXPORT void SND_fn_vSetMicroParamSxd(long sxdId,MicroParam* par);
DLL_IMPEXP CPA_EXPORT void SND_fn_vDestroyMicroSxd(long sxdId);

//DLL_IMPEXP CPA_EXPORT tduRefRes SND_fn_tdGetResForVoiceSxd(long voice);

//gestion de buffers
DLL_IMPEXP CPA_EXPORT long SND_fn_lCreateNewBufferSxd(unsigned long nb_samples,unsigned short uwResolution,unsigned short uwNbChannels,unsigned long ulFreq,SoundParam* par,td_pfn_vRefreshBufferClient callback,long user_id);
DLL_IMPEXP CPA_EXPORT void SND_fn_vSetParamBufferSxd(long id_buffer,SoundParam *par);
DLL_IMPEXP CPA_EXPORT void SND_fn_vDeleteBufferSxd(long id_buffer);
DLL_IMPEXP CPA_EXPORT void SND_fn_vPauseBufferSxd(long id_buffer);
DLL_IMPEXP CPA_EXPORT void SND_fn_vResumeBufferSxd(long id_buffer);
DLL_IMPEXP CPA_EXPORT void* SND_fn_pvGetPtrBufferSxd(long id_buffer);

DLL_IMPEXP CPA_EXPORT void SND_fn_vConvertResDiskToMemSxd(tdstBlockResourceDisk *disk
						 ,tdstBlockResourceMem *mem
						 ,void* ptrBegin);

DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bLoadResScriptSxd(tdstBlockResourceDisk *disk,tdstBlockResourceMem *mem);
DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bLoadResBinarySxd(tdstBlockResourceDisk *disk,tdstBlockResourceMem *mem,char *pDataBloc);

DLL_IMPEXP CPA_EXPORT void SND_fn_vLoadResFromDiskSxd(tdstBlockResourceDisk* disk,tdstBlockResourceMem* mem);
DLL_IMPEXP CPA_EXPORT void SND_fn_vUnLoadResSxd(tdstBlockResourceMem* mem);
DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bIsResLoadedSxd(tdstBlockResourceMem *mem);
DLL_IMPEXP CPA_EXPORT void SND_fn_vSetResUnloadedSxd(tdstBlockResourceMem *pResMem);
DLL_IMPEXP CPA_EXPORT SndBool   SND_fn_bSetResourceStaticVolumeSxd(tdstBlockResourceMem* pstRes,unsigned char ucVolume);

//---themes
DLL_IMPEXP CPA_EXPORT long SND_fn_lPlayTransitionSxd(tduRefRes FirstRes,tduRefRes NextRes,SND_td_pfn_vSoundCallback transition_callback);
DLL_IMPEXP CPA_EXPORT SndBool SND_fn_bSetNextTransitionSxd(long voice,tduRefRes new_res);
DLL_IMPEXP CPA_EXPORT void SND_fn_vStopTransitionSxd(long voice);

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
SND_DeclarePointer5_def(SND_fn_lPlaySxd,long,tduRefRes ,SoundParam*,long,SND_td_pfn_vSoundCallback,long ,C_PLAY_FAILED);
SND_DeclarePointer_void1(SND_fn_vRemoveCallbackSxd,void,long );
SND_DeclarePointer2(SND_fn_bSetParamSxd,SndBool,long,SoundParam*);
SND_DeclarePointer1(SND_fn_bTestIsPlayingSxd,SndBool,long );
SND_DeclarePointer_void1(SND_fn_vStopSxd,void,long );
SND_DeclarePointer_void1(SND_fn_vPauseSxd,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeSxd,void,long );
SND_DeclarePointer_void1(SND_fn_vSetSoundVolumeSxd,void,unsigned char );
SND_DeclarePointer0(SND_fn_ucGetSoundVolumeSxd,unsigned char );
SND_DeclarePointer_void1(SND_fn_vSetStereoSxd,void,SndBool );
SND_DeclarePointer0(SND_fn_bGetStereoSxd,SndBool);
SND_DeclarePointer_void1(SND_fn_vSetReverseStereoSxd,void,SndBool );
SND_DeclarePointer0(SND_fn_bGetReverseStereoSxd,SndBool);
SND_DeclarePointer1(SND_fn_iInitSxd,int,SND_tdstInitStruct*);
SND_DeclarePointer0(SND_fn_bTestInitSxd,SndBool);
SND_DeclarePointer_void0(SND_fn_vDesInitSxd,void);
SND_DeclarePointer_void1(SND_fn_vSetEffectSxd,void,long );
SND_DeclarePointer_void1(SND_fn_vSetDopplerFactorSxd,void,SndReal);
SND_DeclarePointer1(SND_fn_lCreateMicroSxd,long,MicroParam* );
SND_DeclarePointer_void2(SND_fn_vSetMicroParamSxd,void,long,MicroParam* );
SND_DeclarePointer_void1(SND_fn_vDestroyMicroSxd,void,long );
SND_DeclarePointer_void0(SND_fn_vSynchroSxd,void);

SND_DeclarePointer7_def(SND_fn_lCreateNewBufferSxd,long,unsigned long,unsigned short,unsigned short,unsigned long,SoundParam*,td_pfn_vRefreshBufferClient,long,C_PLAY_FAILED);
SND_DeclarePointer_void2(SND_fn_vSetParamBufferSxd,void,long,SoundParam*);
SND_DeclarePointer_void1(SND_fn_vDeleteBufferSxd,void,long );
SND_DeclarePointer_void1(SND_fn_vPauseBufferSxd,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeBufferSxd,void,long );
SND_DeclarePointer1(SND_fn_pvGetPtrBufferSxd,void*,long );
SND_DeclarePointer1(SND_fn_rGetPosBufferSxd,SndReal,long);

SND_DeclarePointer4_def(SND_fn_lCreateNewBufferExSxd,long,SND_tdstFormat* ,SND_tdstCallback* ,SoundParam* ,long ,C_PLAY_FAILED);
SND_DeclarePointer1(SND_fn_lGetPosBufferExSxd,long,long );
SND_DeclarePointer2(SND_fn_lPushBufferExSxd,long,long,SND_tdstStackBuffer*  );

SND_DeclarePointer_void3(SND_fn_vConvertResDiskToMemSxd,void,tdstBlockResourceDisk*,tdstBlockResourceMem*,void*);
SND_DeclarePointer2(SND_fn_bLoadResScriptSxd,SndBool,tdstBlockResourceDisk*,tdstBlockResourceMem*);
SND_DeclarePointer3(SND_fn_bLoadResBinarySxd,SndBool,tdstBlockResourceDisk*,tdstBlockResourceMem*,char *);
SND_DeclarePointer_void1(SND_fn_vUnLoadResSxd,void,tdstBlockResourceMem* );
SND_DeclarePointer1(SND_fn_bIsResLoadedSxd,SndBool,tdstBlockResourceMem*);
SND_DeclarePointer1(SND_fn_bIsResourceLoopingSxd,SndBool,tduRefRes);
SND_DeclarePointer1(SND_fn_rGetPosSxd,SndReal,long);
SND_DeclarePointer1(SND_fn_rGetLengthSxd,SndReal,long);
//---themes
SND_DeclarePointer5_def(SND_fn_lPlayTransitionExSxd,long,tduRefRes,tduRefRes,SND_td_pfn_vSoundCallback,long,SoundParam*,C_PLAY_FAILED);
SND_DeclarePointer2(SND_fn_bSetParamTransitionSxd,SndBool,long,SoundParam*);
SND_DeclarePointer2(SND_fn_bSetNextTransitionSxd,SndBool,long,tduRefRes );
SND_DeclarePointer2(SND_fn_bDoTransitionWithFadeSxd,SndBool,long,tduRefRes );
SND_DeclarePointer3( SND_fn_bDoTransitionWithFadeSxd2, SndBool, long, tduRefRes, SndReal );
SND_DeclarePointer_void1(SND_fn_vStopTransitionSxd,void,long );
SND_DeclarePointer_void1(SND_fn_vPauseTransitionSxd,void,long);
SND_DeclarePointer_void1(SND_fn_vResumeTransitionSxd,void,long);

SND_DeclarePointer_void0(SND_fn_vReleaseDriverSxd,void);
SND_DeclarePointer_void0(SND_fn_vRestoreDriverSxd,void);
SND_DeclarePointer_void0(SND_fn_vForceReleaseDriverSxd,void);
SND_DeclarePointer_void0(SND_fn_vForceRestoreDriverSxd,void);

//----target name
SND_DeclarePointer_void2(SND_fn_vGetTargetLabelSxd,void,char*,int);
SND_DeclarePointer_void0(SND_fn_vSetupTargetSxd,void);
SND_DeclarePointer0(SND_fn_bCanSetupTargetSxd,SndBool);

SND_DeclarePointer_void2(SND_fn_vParam3Dto2D,void,SoundParam*,SampleParam*);

#ifndef NO_ACP_LDBIN
SND_DeclarePointer0(SND_fn_bCanFreeDataSample,SndBool);
#endif

SND_DeclarePointer_void1(SND_fn_vSetDefaultRollOffSxd,void,RollOffParam*);

//fonctions obsoletes: à garder pour compatibilité DLL
SND_DeclarePointer1(SND_fn_iInitBnkSxd,int,long );
SND_DeclarePointer1(SND_fn_bTestInitBnkSxd,SndBool,long );
SND_DeclarePointer_void1(SND_fn_vDesInitBnkSxd,void,long );
SND_DeclarePointer_void0(SND_fn_vDesInitAllBnkSxd,void);
SND_DeclarePointer4_def(SND_fn_lPlayTransitionSxd,long,tduRefRes,tduRefRes,SND_td_pfn_vSoundCallback,SoundParam*,C_PLAY_FAILED);
SND_DeclarePointer1_def(SND_fn_bCheckVersionResourceSxd,SndBool,tdstBlockResourceDisk*,TRUE);

SND_DeclarePointer_void2(SND_fn_vSetNbVoiceWishedSxd,void,tdeTypeZip,long);
SND_DeclarePointer0(SND_fn_lGetNbVoiceWishedSxd,long);
SND_DeclarePointer0(SND_fn_lGetNbVoiceOptimumSxd,long);
SND_DeclarePointer0(SND_fn_eGetMainFormatSxd,tdeTypeZip);

SND_DeclarePointer2_def(SND_fn_bSetResourceStaticVolumeSxd,SndBool,tdstBlockResourceMem* ,unsigned char ,FALSE);

//SNDREC
#endif //ifdef USE_WAV_MODULE

#if defined(USE_RECORD_MODULE)
//#include "sndrec.h"
/*************************************************************************
**************************************************************************
		Module SNDREC (exporté de la DLL RECmnuxy.DLL
**************************************************************************
*************************************************************************/

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

Module Sndrec.h

	DLL_IMPEXP CPA_EXPORT SndBool SND_CALL SND_fn_bTestFormatRecord(SND_tdstFormat* pformat,int flags);
	DLL_IMPEXP CPA_EXPORT long SND_CALL SND_fn_lCreateBufferRecord(SND_tdstFormat* pformat,SND_tdstCallback* pCallback);
	DLL_IMPEXP CPA_EXPORT SndBool SND_CALL SND_fn_bIsBufferFullDuplexRecord(long id_buffer);
	DLL_IMPEXP CPA_EXPORT SndBool SND_CALL SND_fn_bStartRecord(long id_buffer);
	DLL_IMPEXP CPA_EXPORT void SND_CALL SND_fn_vStopRecord(long id_buffer);
	DLL_IMPEXP CPA_EXPORT SndBool SND_CALL SND_fn_bIsWorkingRecord(long id_buffer);
	DLL_IMPEXP CPA_EXPORT long	SND_CALL SND_fn_lPushBufferToRecord(long id_buffer,void* ptr,int size_ptr);
	DLL_IMPEXP CPA_EXPORT SndBool SND_CALL SND_fn_bManageMsgForRecord(long p_msg);
	DLL_IMPEXP CPA_EXPORT int SND_CALL SND_fn_iInitRecord(SND_tdstInitStruct *pInitStruct);
	DLL_IMPEXP CPA_EXPORT void SND_CALL SND_fn_vDesInitRecord(void);
	DLL_IMPEXP CPA_EXPORT unsigned char SND_CALL SND_fn_ucGetInstantVuMeterRecord(void);

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

SND_DeclarePointer2(SND_fn_bTestFormatRecord,SndBool,SND_tdstFormat* ,int );
SND_DeclarePointer2(SND_fn_lCreateBufferRecord,long,SND_tdstFormat* ,SND_tdstCallback* );
SND_DeclarePointer1(SND_fn_bIsBufferFullDuplexRecord,SndBool,long );
SND_DeclarePointer1(SND_fn_bStartRecord,SndBool,long );
SND_DeclarePointer_void1(SND_fn_vStopRecord,void,long );
SND_DeclarePointer1(SND_fn_bIsWorkingRecord,SndBool,long );
SND_DeclarePointer3(SND_fn_lPushBufferToRecord,long,long ,void* ,int );
SND_DeclarePointer1(SND_fn_bManageMsgForRecord,SndBool,long );
SND_DeclarePointer1(SND_fn_iInitRecord,int,SND_tdstInitStruct*);
SND_DeclarePointer_void0(SND_fn_vDesInitRecord,void);
SND_DeclarePointer0(SND_fn_ucGetInstantVuMeterRecord,unsigned char);

#endif //ifdef USE_WAV_MODULE


#if defined(USE_CD_MODULE)
//#include "sndcd.h"
//#include "sndmidi.h"
/*************************************************************************
**************************************************************************
		Module SNDMIDI (exporté de la DLL CD_mnuxy.DLL
**************************************************************************
*************************************************************************/

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

Module Sndmidi.h

DLL_IMPEXP SndBool  SND_fn_bLoadResScriptMidi(tdstBlockResourceDisk *disk,tdstBlockResourceMem *mem);
DLL_IMPEXP SndBool  SND_fn_bLoadResBinaryMidi(tdstBlockResourceDisk *disk,tdstBlockResourceMem *mem,char *pDataBloc);
DLL_IMPEXP SndBool  SND_fn_bIsResLoadedMidi(tdstBlockResourceMem* _pBRMem);
DLL_IMPEXP SndBool  SND_fn_bSetParamMidi(long voice,SoundParam *par);
DLL_IMPEXP SndBool  SND_fn_bTestInitMidi(void);
DLL_IMPEXP SndBool  SND_fn_bTestIsPlayingMidi(long voice);
//DLL_IMPEXP SndBool  SND_fn_bUnloadMidiRes(tduRefRes RR);
DLL_IMPEXP int      SND_fn_iInitMidi(SND_tdstInitStruct *pInitStruct);
DLL_IMPEXP long	    SND_fn_lPlayMidi(tduRefRes res,SoundParam *par,long prio,SND_td_pfn_vSoundCallback fn_callback,long par_callback);
DLL_IMPEXP long     SND_fn_lPlayMidiWithFade(tduRefRes res,SoundParam *par,long prio,SND_td_pfn_vSoundCallback fn_callback,long par_callback,unsigned long ulFadeIn,unsigned long ulFadeOut);
DLL_IMPEXP void	    SND_fn_vConvertResDiskToMemMidi(tdstBlockResourceDisk *disk,tdstBlockResourceMem *mem,void* ptrBegin);
DLL_IMPEXP void     SND_fn_vDesInitMidi(void);
DLL_IMPEXP void	    SND_fn_vLoadResFromDiskMidi(tdstBlockResourceDisk* disk,tdstBlockResourceMem* mem);
DLL_IMPEXP void     SND_fn_vPauseMidi(long voice);
DLL_IMPEXP void     SND_fn_vResumeMidi(long voice);
DLL_IMPEXP void     SND_fn_vRemoveCallbackMidi(long voice);
DLL_IMPEXP void     SND_fn_vSetResUnloadedMidi(tdstBlockResourceMem *pResMem);
DLL_IMPEXP void     SND_fn_vStopMidi(long voice);
DLL_IMPEXP void	    SND_fn_vUnLoadResMidi(tdstBlockResourceMem* mem);

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
SND_DeclarePointer2(SND_fn_bLoadResScriptMidi,SndBool,tdstBlockResourceDisk*,tdstBlockResourceMem*);
SND_DeclarePointer3(SND_fn_bLoadResBinaryMidi,SndBool,tdstBlockResourceDisk*,tdstBlockResourceMem*,char *);
SND_DeclarePointer1(SND_fn_bIsResLoadedMidi,SndBool,tdstBlockResourceMem*);
SND_DeclarePointer2(SND_fn_bSetParamMidi,SndBool,long ,SoundParam*);
SND_DeclarePointer0(SND_fn_bTestInitMidi,SndBool );
SND_DeclarePointer1(SND_fn_bTestIsPlayingMidi,SndBool ,long );
//SND_DeclarePointer1(SND_fn_bUnloadMidiRes,SndBool  ,tduRefRes );
SND_DeclarePointer1(SND_fn_iInitMidi,int,SND_tdstInitStruct*);
SND_DeclarePointer5_def(SND_fn_lPlayMidi,long,tduRefRes ,SoundParam*,long ,SND_td_pfn_vSoundCallback ,long ,C_PLAY_FAILED);
SND_DeclarePointer7(SND_fn_lPlayMidiWithFade,long,tduRefRes ,SoundParam*,long ,SND_td_pfn_vSoundCallback ,long ,unsigned long ,unsigned long );
//SND_DeclarePointer_void3(SND_fn_vConvertResDiskToMemMidi,void,tdstBlockResourceDisk*,tdstBlockResourceMem*,void* );
SND_DeclarePointer_void0(SND_fn_vDesInitMidi,void);
//SND_DeclarePointer_void2(SND_fn_vLoadResFromDiskMidi,void,tdstBlockResourceDisk* ,tdstBlockResourceMem*);
SND_DeclarePointer_void1(SND_fn_vPauseMidi,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeMidi,void ,long );
SND_DeclarePointer_void1(SND_fn_vRemoveCallbackMidi,void,long );
//SND_DeclarePointer_void1(SND_fn_vSetResUnloadedMidi,void,tdstBlockResourceMem*);
SND_DeclarePointer_void1(SND_fn_vStopMidi,void,long );
SND_DeclarePointer_void1(SND_fn_vUnLoadResMidi,void,tdstBlockResourceMem* );
SND_DeclarePointer_void0(SND_fn_vReleaseDriverMidi,void);
SND_DeclarePointer_void0(SND_fn_vRestoreDriverMidi,void);
SND_DeclarePointer1(SND_fn_rGetPosMidi,SndReal,long);
SND_DeclarePointer1(SND_fn_rGetLengthMidi,SndReal,long);
SND_DeclarePointer_void0(SND_fn_vSynchroMidi,void);
SND_DeclarePointer5_def(SND_fn_lPlayTransitionMidi,long,tduRefRes ,tduRefRes ,SND_td_pfn_vSoundCallback ,long,SoundParam* ,C_PLAY_FAILED);
SND_DeclarePointer2(SND_fn_bSetParamTransitionMidi,SndBool,long ,SoundParam* );
SND_DeclarePointer2(SND_fn_bSetNextTransitionMidi,SndBool,long ,tduRefRes );
SND_DeclarePointer_void1(SND_fn_vStopTransitionMidi,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeTransitionMidi,void,long );
SND_DeclarePointer_void1(SND_fn_vPauseTransitionMidi,void,long );
SND_DeclarePointer2(SND_fn_bDoTransitionWithFadeMidi,SndBool,long ,tduRefRes );
SND_DeclarePointer3( SND_fn_bDoTransitionWithFadeMidi2, SndBool, long, tduRefRes, SndReal );
SND_DeclarePointer1_def(SND_fn_bCheckVersionResourceMidi,SndBool,tdstBlockResourceDisk*,TRUE);
#ifndef NO_ACP_LDBIN
SND_DeclarePointer0( SND_fn_bCanFreeDataMidi,SndBool);
#endif
SND_DeclarePointer2_def(SND_fn_bSetResourceStaticVolumeMidi,SndBool,tdstBlockResourceMem* ,unsigned char ,FALSE);

/*************************************************************************
**************************************************************************
		Module SNDCD (exporté de la DLL CD_mnuxy.DLL
**************************************************************************
*************************************************************************/

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

Module Sndcd.h

DLL_IMPEXP SndBool  SND_fn_bLoadResScriptCd(tdstBlockResourceDisk *disk,tdstBlockResourceMem *mem);
DLL_IMPEXP SndBool  SND_fn_bLoadResBinaryCd(tdstBlockResourceDisk *disk,tdstBlockResourceMem *mem,char *pDataBloc);
DLL_IMPEXP SndBool  SND_fn_bSetParamCD(long voice,SoundParam *par);
DLL_IMPEXP SndBool  SND_fn_bTestInitCD(void);
DLL_IMPEXP SndBool  SND_fn_bTestIsPlayingCD(long voice);
DLL_IMPEXP int      SND_fn_iInitCD(SND_tdstInitStruct *pInitStruct);
DLL_IMPEXP long     SND_fn_lNextCDTrack();
DLL_IMPEXP long	    SND_fn_lPlayCD(tduRefRes res,SoundParam *par,long prio,SND_td_pfn_vSoundCallback fn_callback,long par_callback);
DLL_IMPEXP long     SND_fn_lPlayCDWithFade(tduRefRes res,SoundParam *par,long prio,SND_td_pfn_vSoundCallback fn_callback,long par_callback,unsigned long ulFadeIn,unsigned long ulFadeOut);
DLL_IMPEXP void     SND_fn_vConvertResDiskToMemCD(tdstBlockResourceDisk *disk,tdstBlockResourceMem *mem,void* ptrBegin);
DLL_IMPEXP void     SND_fn_vDesInitCD(void);
DLL_IMPEXP void     SND_fn_vPauseCD(long voice);
DLL_IMPEXP void     SND_fn_vRemoveCallbackCD(long voice);
DLL_IMPEXP void	    SND_fn_vResumeCD(long voice);
DLL_IMPEXP void	    SND_fn_vStopCD(long voice);
DLL_IMPEXP void	    SND_fn_vStopCDWithFade(long voice,unsigned long ulFadeOutDuration);
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

SND_DeclarePointer2(SND_fn_bLoadResScriptCd,SndBool  ,tdstBlockResourceDisk*,tdstBlockResourceMem*);
SND_DeclarePointer3(SND_fn_bLoadResBinaryCd,SndBool  ,tdstBlockResourceDisk*,tdstBlockResourceMem*,char *);
SND_DeclarePointer2(SND_fn_bSetParamCD,SndBool  ,long ,SoundParam*);
SND_DeclarePointer0(SND_fn_bTestInitCD,SndBool);
SND_DeclarePointer1(SND_fn_bTestIsPlayingCD,SndBool ,long );
SND_DeclarePointer1(SND_fn_iInitCD,int,SND_tdstInitStruct*);
SND_DeclarePointer0(SND_fn_lNextCDTrack,long );
SND_DeclarePointer5_def(SND_fn_lPlayCD,long,tduRefRes ,SoundParam*,long ,SND_td_pfn_vSoundCallback ,long ,C_PLAY_FAILED);
SND_DeclarePointer7(SND_fn_lPlayCDWithFade,long     ,tduRefRes ,SoundParam*,long ,SND_td_pfn_vSoundCallback ,long ,unsigned long ,unsigned long );
//SND_DeclarePointer_void3(SND_fn_vConvertResDiskToMemCD,void     ,tdstBlockResourceDisk*,tdstBlockResourceMem*,void* );
SND_DeclarePointer_void0(SND_fn_vDesInitCD,void);
SND_DeclarePointer_void1(SND_fn_vPauseCD,void,long );
SND_DeclarePointer_void1(SND_fn_vRemoveCallbackCD,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeCD,void	    ,long);
SND_DeclarePointer_void1(SND_fn_vStopCD,void	    ,long );
SND_DeclarePointer_void2(SND_fn_vStopCDWithFade,void,long ,unsigned long );
SND_DeclarePointer_void0(SND_fn_vReleaseDriverCD,void);
SND_DeclarePointer_void0(SND_fn_vRestoreDriverCD,void);
SND_DeclarePointer1(SND_fn_rGetPosCD,SndReal,long);
SND_DeclarePointer1(SND_fn_rGetLengthCD,SndReal,long);
SND_DeclarePointer_void0(SND_fn_vSynchroCD,void);
SND_DeclarePointer1_def(SND_fn_bCheckVersionResourceCD,SndBool,tdstBlockResourceDisk*,TRUE);
SND_DeclarePointer2_def(SND_fn_bSetResourceStaticVolumeCD,SndBool,tdstBlockResourceMem* ,unsigned char,FALSE );
#endif
  
#if defined(USE_DBG_MODULE)
/*************************************************************************
**************************************************************************
		Module SNDDBG (exporté de la DLL snddbg.DLL)
**************************************************************************
*************************************************************************/
SND_DeclarePointer_void1(SND_fn_vLaunchSupervisater,void,SND_tdstInitStruct*);
SND_DeclarePointer_void0(SND_fn_vKillSupervisater,void);
SND_DeclarePointer_void0(SND_fn_vSetSupervisaterActive,void);
SND_DeclarePointer0_def(SND_fn_bIsSupervisaterActive,SndBool,FALSE);
SND_DeclarePointer_void1(dbgSND_fn_vSetProjectTitleForSuperVisater,void,char*);


//suivi des objets
SND_DeclarePointer_void4(dbgSND_fn_vAddEventToObject,void,long ,long ,long ,SND_tduRefEvt );
SND_DeclarePointer_void2(dbgSND_fn_vKillEventToObject,void,long ,long );
SND_DeclarePointer_void2(dbgSND_fn_vSetPosObject,void,long ,SoundParam* );
//suivi des micros
SND_DeclarePointer_void1(dbgSND_fn_vAddMicro,void,long );
SND_DeclarePointer_void1(dbgSND_fn_vKillMicro,void,long );
SND_DeclarePointer_void2(dbgSND_fn_vSetPosMicro,void,long ,MicroParam* );
//historique des events
SND_DeclarePointer_void5(dbgSND_fn_vAddHistoric,void,SND_tduRefEvt ,long ,long ,long ,tdstBlockResourceMem* );
//ligne de volume
SND_DeclarePointer_void1(dbgSND_fn_vKillVolumeLine,void,long );
SND_DeclarePointer_void1(dbgSND_fn_vAddVolumeLine,void,long );
SND_DeclarePointer_void2(dbgSND_fn_vSetVolumeLine,void,long ,long );
//bank
SND_DeclarePointer_void1(dbgSND_fn_vLoadBank,void,int );
SND_DeclarePointer_void1(dbgSND_fn_vUnLoadBank,void,int );

SND_DeclarePointer_void3(dbgSND_fn_vAddVoiceSample,void,long ,tduRefRes ,SampleParam*);
SND_DeclarePointer_void2(dbgSND_fn_vSetParVoiceSample,void,long ,SampleParam*);
SND_DeclarePointer_void1(dbgSND_fn_vDelVoiceSample,void,long );
SND_DeclarePointer_void1(dbgSND_fn_vPauseVoiceSample,void,long );
SND_DeclarePointer_void1(dbgSND_fn_vResumeVoiceSample,void,long );
SND_DeclarePointer_void1(dbgSND_fn_vSetProcessTimeSample,void,float );
SND_DeclarePointer0_def(dbgSND_fn_pstGetSelectedResource,tdstBlockResourceMem*,NULL);
SND_DeclarePointer0_def(dbgSND_fn_bDoesSupervisaterSelectResource,SndBool,FALSE);
//SND_DeclarePointer_void3(dbgSND_fn_vRajListesSxdVirtual,void,virtual_voice_list*,audible_voice_list*,dead_voice_list* );
SND_DeclarePointer_void1(dbgSND_fn_vRajListesSxdVirtual2,void,SND_tdhVirtualModule);
SND_DeclarePointer_void2(dbgSND_fn_vInitListesSxdVirtual,void,long,char*);

SND_DeclarePointer_void0(dbgSND_fn_vRefreshSupervisater,void);
#endif




#if defined(USE_ADPCM_MODULE) && !defined(DISABLE_ADPCM)
/*************************************************************************
**************************************************************************
		Module SNDxdAPM (exporté de la DLL APMxyuw.DLL)
**************************************************************************
*************************************************************************/
#ifndef NO_ACP_LDBIN
SND_DeclarePointer0(SND_fn_bCanFreeDataADPCM,SndBool);
#endif

#ifndef SNDDLL_MODULE //fonctions inutiles pour la LIB statiques
SND_DeclarePointer5_def(SND_fn_lPlaySxdADPCM,long,tduRefRes ,SoundParam*,long ,SND_td_pfn_vSoundCallback ,long ,C_PLAY_FAILED);
SND_DeclarePointer_void1(SND_fn_vRemoveCallbackSxdADPCM,void,long );
SND_DeclarePointer2(SND_fn_bSetParamSxdADPCM,SndBool,long ,SoundParam*);
SND_DeclarePointer1(SND_fn_bTestIsPlayingSxdADPCM,SndBool,long );
SND_DeclarePointer_void1(SND_fn_vStopSxdADPCM,void,long );
SND_DeclarePointer_void1(SND_fn_vPauseSxdADPCM,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeSxdADPCM,void,long );

SND_DeclarePointer1(SND_fn_bIsResourceLoopingSxdADPCM,SndBool,tduRefRes);
SND_DeclarePointer1(SND_fn_rGetPosSxdADPCM,SndReal,long );
SND_DeclarePointer1(SND_fn_rGetLengthSxdADPCM,SndReal,long );
SND_DeclarePointer_void1(SND_fn_vSetSoundVolumeSxdADPCM,void,unsigned char );

SND_DeclarePointer0(SND_fn_ucGetSoundVolumeSxdADPCM,unsigned char);
SND_DeclarePointer_void1(SND_fn_vSetStereoSxdADPCM,void,SndBool );
SND_DeclarePointer0(SND_fn_bGetStereoSxdADPCM,SndBool);
SND_DeclarePointer_void1(SND_fn_vSetReverseStereoSxdADPCM,void,SndBool );
SND_DeclarePointer0(SND_fn_bGetReverseStereoSxdADPCM,SndBool);

SND_DeclarePointer1(SND_fn_iInitSxdADPCM,int,SND_tdstInitStruct*);
SND_DeclarePointer0(SND_fn_bTestInitSxdADPCM,SndBool);
SND_DeclarePointer_void0(SND_fn_vDesInitSxdADPCM,void);

SND_DeclarePointer_void1(SND_fn_vSetEffectSxdADPCM,void,long );

SND_DeclarePointer_void2(SND_fn_vCreateMicroSxdADPCM,void,MicroParam* ,long );
SND_DeclarePointer_void2(SND_fn_vSetMicroParamSxdADPCM,void,long ,MicroParam* );
SND_DeclarePointer_void1(SND_fn_vDestroyMicroSxdADPCM,void,long );

//gestion de buffers
SND_DeclarePointer7_def(SND_fn_lCreateNewBufferSxdADPCM,long,unsigned long ,unsigned short ,unsigned short ,unsigned long ,SoundParam* ,td_pfn_vRefreshBufferClient ,long ,C_PLAY_FAILED);
SND_DeclarePointer_void2(SND_fn_vSetParamBufferSxdADPCM,void,long ,SoundParam*);
SND_DeclarePointer_void1(SND_fn_vDeleteBufferSxdADPCM,void,long );
SND_DeclarePointer_void1(SND_fn_vPauseBufferSxdADPCM,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeBufferSxdADPCM,void,long );
SND_DeclarePointer1(SND_fn_pvGetPtrBufferSxdADPCM,void*,long );
SND_DeclarePointer1(SND_fn_rGetPosBufferSxdADPCM,SndReal,long );

SND_DeclarePointer2( SND_fn_bLoadResScriptSxdADPCM,SndBool,tdstBlockResourceDisk*,tdstBlockResourceMem*);
SND_DeclarePointer3( SND_fn_bLoadResBinarySxdADPCM,SndBool,tdstBlockResourceDisk*,tdstBlockResourceMem*,char*);
SND_DeclarePointer2( SND_fn_bLoadResScriptAndConvertToWAVSxdADPCM,SndBool,tdstBlockResourceDisk*,tdstBlockResourceMem*);
SND_DeclarePointer3( SND_fn_bLoadResBinaryAndConvertToWAVSxdADPCM,SndBool,tdstBlockResourceDisk*,tdstBlockResourceMem*,char*);

SND_DeclarePointer_void1( SND_fn_vUnLoadResSxdADPCM,void,tdstBlockResourceMem* );
SND_DeclarePointer1( SND_fn_bIsResLoadedSxdADPCM,SndBool,tdstBlockResourceMem*);

//---themes
SND_DeclarePointer5_def( SND_fn_lPlayTransitionSxdADPCM,long,tduRefRes ,tduRefRes ,SND_td_pfn_vSoundCallback ,long ,SoundParam* ,C_PLAY_FAILED);
SND_DeclarePointer2( SND_fn_bSetParamTransitionSxdADPCM,SndBool,long ,SoundParam*);
SND_DeclarePointer2(SND_fn_bSetNextTransitionSxdADPCM,SndBool,long ,tduRefRes );
SND_DeclarePointer2(SND_fn_bDoTransitionWithFadeSxdADPCM,SndBool,long ,tduRefRes );
SND_DeclarePointer3( SND_fn_bDoTransitionWithFadeSxdADPCM2, SndBool, long, tduRefRes, SndReal );
SND_DeclarePointer_void1(SND_fn_vStopTransitionSxdADPCM,void,long );
SND_DeclarePointer_void1(SND_fn_vPauseTransitionSxdADPCM,void,long );
SND_DeclarePointer_void1(SND_fn_vResumeTransitionSxdADPCM,void,long );

 //--relache-reprise a chaud des drives
SND_DeclarePointer_void0(SND_fn_vReleaseDriverSxdADPCM,void);
SND_DeclarePointer_void0(SND_fn_vRestoreDriverSxdADPCM,void);

SND_DeclarePointer_void2(SND_fn_vGetTargetLabelSxdADPCM,void,char* ,int );
SND_DeclarePointer_void0(SND_fn_vSetupTargetSxdADPCM,void);
SND_DeclarePointer0(SND_fn_bCanSetupTargetSxdADPCM,SndBool);

SND_DeclarePointer_void0(SND_fn_vSynchroSxdADPCM,void);

SND_DeclarePointer4_def(SND_fn_lCreateNewBufferExSxdADPCM,long,SND_tdstFormat* ,SND_tdstCallback* ,SoundParam* ,long ,C_PLAY_FAILED);
SND_DeclarePointer1(SND_fn_lGetPosBufferExSxdADPCM,long,long );
SND_DeclarePointer2(SND_fn_lPushBufferExSxdADPCM,long,long ,SND_tdstStackBuffer* );
SND_DeclarePointer_void1(SND_fn_vSetDefaultRollOffSxdADPCM,void,RollOffParam* );
SND_DeclarePointer1_def(SND_fn_bCheckVersionResourceSxdADPCM,SndBool,tdstBlockResourceDisk*,TRUE);

SND_DeclarePointer0(SND_fn_lGetNbVoiceWishedSxdADPCM,long);

SND_DeclarePointer0_def(SND_fn_bIsLibActiveSxdADPCM,SndBool,FALSE);

SND_DeclarePointer2_def(SND_fn_bSetResourceStaticVolumeSxdADPCM,SndBool,tdstBlockResourceMem* ,unsigned char ,FALSE);

#endif//SNDDLL_MODULE 
#endif //USE_ADPCM



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

Variables privées

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

void SND_DllInitEntryPoints_StaticFunctions(HMODULE hDLLModule);
void SND_DllInitEntryPoints_MpegFunctions(HMODULE hDLLModule);
void SND_DllInitEntryPoints_CdFunctions(HMODULE hDLLModule);
void SND_DllInitEntryPoints_WavFunctions(HMODULE hDLLModule);
void SND_DllInitEntryPoints_DbgFunctions(HMODULE hDLLModule);
void SND_DllInitEntryPoints_AdpcmFunctions(HMODULE hDLLModule);
void SND_DllInitEntryPoints_RecordFunctions(HMODULE hDLLModule);

/*
HWND hwndMainSnd;
HINSTANCE SND_g_hResourceHandle;
HINSTANCE SND_hGlobalInst;
*/


//cado bonux
#define SND_DefinePointer0(FunctionName,ret)	    \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(void);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(void)=NULL;	\
	ret WINAPI FunctionName(void)							\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)();		\
	}												\
	ret WINAPI Fake##FunctionName(void)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@0";		


#define SND_DefinePointer1(FunctionName,ret,typ1)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1)=NULL;			\
	ret WINAPI FunctionName(typ1 par1)						\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1);			\
	}												\
	ret WINAPI Fake##FunctionName(typ1 par1)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@4";
 

#define SND_DefinePointer1_def(FunctionName,ret,typ1,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1)=NULL;			\
	ret WINAPI FunctionName(typ1 par1)						\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1);			\
	}												\
	ret WINAPI Fake##FunctionName(typ1 par1)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@4";
 

#define SND_DefinePointer2(FunctionName,ret,typ1,typ2) \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2);      \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2)=NULL;				\
	ret WINAPI FunctionName(typ1 par1,typ2 par2)				\
	{													\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return((*SNDDLLpfn##FunctionName)(par1,par2));			\
	}													\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@8";

#define SND_DefinePointer3(FunctionName,ret,typ1,typ2,typ3)		\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);				\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3);				\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@12";

#define SND_DefinePointer3_def(FunctionName,ret,typ1,typ2,typ3,def_ret)		\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);				\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3);				\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@12";

#define SND_DefinePointer4(FunctionName,ret,typ1,typ2,typ3,typ4)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)		\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4);			\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@16";

#define SND_DefinePointer4_def(FunctionName,ret,typ1,typ2,typ3,typ4,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)		\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4);			\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@16";

#define SND_DefinePointer5(FunctionName,ret,typ1,typ2,typ3,typ4,typ5)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5)=NULL;								\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)\
	{																	\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5);			\
	}																	\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@20";

#define SND_DefinePointer5_def(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,def_ret)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5)=NULL;								\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)\
	{																	\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5);			\
	}																	\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)					\
	{												\
		ret fake=def_ret;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@20";

#define SND_DefinePointer7(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,typ6,typ7)			\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);					\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7)=NULL;													\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)	\
	{																						\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		return (*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5,par6,par7);					\
	}																						\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)					\
	{												\
		ret fake=(ret)0;									\
		return fake;								\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@28";


#define SND_DefinePointer_void0(FunctionName,ret)	    \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(void);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(void)=NULL;	\
	ret WINAPI FunctionName(void)							\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)();		\
	}												\
	ret WINAPI Fake##FunctionName(void)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@0";

#define SND_DefinePointer_void1(FunctionName,ret,typ1)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1);       \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1)=NULL;			\
	ret WINAPI FunctionName(typ1 par1)						\
	{												\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1);			\
	}												\
	ret WINAPI Fake##FunctionName(typ1 par1)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@4";
 

#define SND_DefinePointer_void2(FunctionName,ret,typ1,typ2) \
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2);      \
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2)=NULL;				\
	ret WINAPI FunctionName(typ1 par1,typ2 par2)				\
	{													\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2);			\
	}													\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@8";

#define SND_DefinePointer_void3(FunctionName,ret,typ1,typ2,typ3)		\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3);				\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3)=NULL;							\
    ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3)					\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2,par3);				\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@12";

#define SND_DefinePointer_void4(FunctionName,ret,typ1,typ2,typ3,typ4)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4)=NULL;							\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)		\
	{																\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2,par3,par4);			\
	}																\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@16";

#define SND_DefinePointer_void5(FunctionName,ret,typ1,typ2,typ3,typ4,typ5)	\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5);		\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5)=NULL;								\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)\
	{																	\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5);			\
	}																	\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5  par5)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@20";

#define SND_DefinePointer_void7(FunctionName,ret,typ1,typ2,typ3,typ4,typ5,typ6,typ7)			\
    typedef ret (WINAPI *SNDDLLtdpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7);					\
    ret (WINAPI *SNDDLLpfn##FunctionName)(typ1,typ2,typ3,typ4,typ5,typ6,typ7)=NULL;													\
	ret WINAPI FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)	\
	{																						\
		if (!SNDDLLpfn##FunctionName) DebugBreak();	\
		(*SNDDLLpfn##FunctionName)(par1,par2,par3,par4,par5,par6,par7);					\
	}																						\
	ret WINAPI Fake##FunctionName(typ1 par1,typ2 par2,typ3 par3,typ4 par4,typ5 par5,typ6 par6,typ7 par7)				\
	{												\
	}												\
	char cz##FunctionName##[] = "_" #FunctionName "@28";


#ifdef __cplusplus
}
#endif


#endif //__SNDDLLentryPoint__H__