#ifndef _SNDRES_H_
#define _SNDRES_H_
 
#ifdef SND_SCRIPT_VERSION /*Mode Script pur*/
#if defined(SNDLST2_StaticIsOptimised) || defined(LST2_StaticIsOptimised)
#error Macros not coherent
#endif
#endif
 
#ifdef SND_HYBRID_VERSION /*Mode Hybride*/
#define LST2_StaticIsOptimised
#define SNDLST2_StaticIsOptimised
#endif
 
#ifdef SND_BINARY_VERSION /*Mode Binaire pur*/
#define LST2_StaticIsOptimised
#define SNDLST2_StaticIsOptimised
#endif
 
#if ((!defined(SND_SCRIPT_VERSION))&&((!defined(SND_HYBRID_VERSION))&&(!defined(SND_BINARY_VERSION))))
#error neither SCRIPT,HYBRID, or BINARY defined
#endif
 
#include "sndlst2.h"
 
 
/*-------------------------------------------------------------------------*/
/*definitions specifiques à la target*/
#include "sndhard.h"
 
/****************************************************************/
/*		Structures portables pour les Ressources				*/
/****************************************************************/
 
 
#define SND_C_RES_FANTOME_PTR NULL
#define SND_C_RES_FANTOME_ID -1
 
extern tduRefRes SND_RES_FANTOME;
 
typedef enum _tdeTypeResource{
        TYPE_INVALID,
        TYPE_SAMPLE,
        TYPE_MIDI,
        TYPE_CDAUDIO,
        TYPE_SEQUENCE,
        TYPE_SWITCH_OLD,
        TYPE_SPLIT,
        TYPE_THEME_OLD,
        TYPE_SWITCH,
        TYPE_THEME_OLD2,
		TYPE_RANDOM,
        TYPE_THEME,
        TYPE_FOR_ALIGNEMENT=SND_ENUM_ALIGNEMENT
} tdeTypeResource;
#define NB_TYPES_RESOURCES 12
 
/* AJOUT FRED DECREAU : A VALIDER!!*/
typedef enum{
        TYPE_EXTERNAL,	/*les data sont chargees/dechargees ressources par ressources*/
        TYPE_MEGAFILE,	/*les data sont chargees/dechargees par bloc de ressources*/
        TYPE_BIGFILE,
        STORAGE_FOR_ALIGNEMENT=SND_ENUM_ALIGNEMENT
} tdeTypeStorage;
 
 
/*--------------------------------------------------- RANDOM RESSOURCES*/
/*parametres d'un element d'une liste ACP de references de ressources:*/
struct _tdstRandomElement {
        tduRefRes                   uRes;           /*reference sur la ressource associee à l’element*/
		SndReal						rProb;			/*probabilite d'etre choisi*/
		SndBool						bCanBeChosenTwice;	/*if FALSE, element cannot be choosen twice consecutively*/
        SNDLST2_M_StaticChildDeclaration(tdstRandomElement*,tdstTypeRandomMem*)
} ;
 
/*Definition d’une ressource random en memoire :*/
struct _tdstTypeRandomMem
{
        unsigned long               ulNbElements;  /*nb d’elements dans la liste d’aiguillage*/
		SndReal						rProbNothing;	/*probabilite qu'aucun son ne soit choisi*/
		SndBool						bNothingCanBeChosenTwice;	/*if FALSE, "nothing" element cannot be choosen twice consecutively*/
		long						lLastElementChoosen;	/*used only in memory: last eleent choosen SILENCE or any RandomElement*/
		long						lLastResChoosen;	/*used only in memory: last eleent choosen SILENCE or any RandomElement*/
		SNDLST2_M_StaticParentDeclaration(tdstRandomElement*)
};
 
 
/*Definition d’une ressource random sur disque :*/
struct _tdstTypeRandomDisk
{
        unsigned long               ulNbElements;  /*nb d’elements dans la liste d’aiguillage*/
		SndReal						rProbNothing;	/*probabilite qu'aucun son ne soit choisi*/
		SndBool						bNothingCanBeChosenTwice;	/*if FALSE, "nothing" element cannot be choosen twice consecutively*/
		long						lLastResChoosenObsolet;	/*NOT USED; only kept to avoid disalignment*/
		SNDLST2_M_StaticParentDeclaration(tdstRandomElement*)	/*not needed, but BNM alignement cannot be changed*/
};
 
 
/*----previous THEME (only for compatibility)*/
typedef struct _tdstThemeBridgeOld tdstThemeBridgeOld;
typedef struct _tdstThemePartOld tdstThemePartOld;
typedef struct _tdstTypeThemeOld tdstTypeThemeOld;
 
typedef tdstThemePartOld* hThemePartOld;
typedef tdstThemeBridgeOld* hThemeBridgeOld;
SNDLST2_M_StaticUseListOf(hThemeBridgeOld);
 
struct _tdstThemeBridgeOld {
    tduRefRes   uResTarget;
    tduRefRes   uRes;
    SNDLST2_M_StaticElementDeclaration(hThemeBridgeOld)
};
 
struct _tdstThemePartOld {
    tduRefRes   uRes;
    SNDLST2_M_StaticChildDeclaration(tdstThemePartOld*,tdstTypeThemeOld*)
    /*SNDLST2_M_StaticParentDeclaration(tdstThemeBridge*)*/
	SNDLST2_M_StaticAnchorDeclaration(hThemeBridgeOld) hLstThemeBridge;
};
 
struct _tdstTypeThemeOld {
    unsigned long   ulStartLoop;      /*indice du point de rebouclage*/
    unsigned long   ulEndLoop;        /*indice du dernier point de la boucle la boucle*/
    tduRefRes       uBridgeIn;
    SNDLST2_M_StaticParentDeclaration(tdstThemePartOld*)
};
 
/*--------------------------------------------------- THEME old2*/
typedef struct _tdstThemeBridgeOld2 tdstThemeBridgeOld2;
typedef struct _tdstThemePartOld2 tdstThemePartOld2;
typedef struct _tdstTypeThemeDiskOld2 tdstTypeThemeDiskOld2;
typedef struct _tdstTypeThemeMemOld2 tdstTypeThemeMemOld2;
 
typedef tdstThemePartOld2* hThemePartOld2;
typedef tdstThemeBridgeOld2* hThemeBridgeOld2;
SNDLST2_M_StaticUseListOf(hThemeBridgeOld2);
 
typedef enum _tdeTypeTransitionOld2{
		TRANSITION_CROSSFADE_Old2,
		TRANSITION_ATENDOFPART_Old2,
        TRANSITION_FOR_ALIGNEMENT_Old2=SND_ENUM_ALIGNEMENT
} tdeTypeTransitionOld2;
 
struct _tdstThemePartOld2 {
    tduRefRes   uRes;
	SndBool_field_decl(bLoopStart);	/*TRUE if this part is the begining of a loop*/
	SndBool_field_decl(bLoopEnd);	/*TRUE if this part is the last part of a loop*/
	long		lNbLoops;	/*if bLoopStart, indicates the number of re-loops (0=played only once,1=2 times...)*/
	tdeTypeTransitionOld2	eTransition;			/*transition in case of new theme starting*/
    SNDLST2_M_StaticChildDeclaration(tdstThemePartOld2*,tdstTypeThemeMemOld2*)
};
 
struct _tdstTypeThemeDiskOld2 {
    unsigned long   ulStartLoop;      /*indice du point de rebouclage*/
    unsigned long   ulNbParts;        /*nombre total de parts dans la liste*/
    SNDLST2_M_StaticParentDeclaration(tdstThemePartOld2*)	/*not needed, but BNM alignement cannot be changed*/
};
 
struct _tdstTypeThemeMemOld2 {
    unsigned long   ulStartLoop;      /*indice du point de rebouclage*/
    unsigned long   ulNbParts;        /*nombre total de parts dans la liste*/
    SNDLST2_M_StaticParentDeclaration(tdstThemePartOld2*)
};
 
 
/*--------------------------------------------------- THEME*/
typedef enum _tdeTypeTransition{
		TRANSITION_CROSSFADE,		/*instantaneous transition with cross fade*/
		TRANSITION_ATENDOFPART,		/*transition at the end of current part*/
		TRANSITION_OUTRO,			/*transition at the end of current part followed by outro (if any)*/
        TRANSITION_FOR_ALIGNEMENT=SND_ENUM_ALIGNEMENT
} tdeTypeTransition;
 
typedef  tdstThemePart* hThemePart;

#define DEFAULT_FADEDURATION M_IntToRealSnd(0)
 
struct _tdstThemePart {
    tduRefRes   uRes;
	SndBool_field_decl(bLoopStart);	/*TRUE if this part is the begining of a loop*/
	SndBool_field_decl(bLoopEnd);	/*TRUE if this part is the last part of a loop*/
	long		lNbLoops;	/*if bLoopStart, indicates the number of re-loops (0=played only once,1=2 times...)*/
	tdeTypeTransition	eTransition;			/*transition in case of new theme starting*/
	SndReal		rFadeDuration;		/*if DEFAULT, use Theme's fade duration; else, duration in sec*/
    SNDLST2_M_StaticChildDeclaration(tdstThemePart*,tdstTypeThemeMem*)
};
 
struct _tdstThemePartOutro {
    tduRefRes   uRes;
	tdeTypeTransition	eTransition;			/*transition in case of new theme starting*/
	SndReal		rFadeDuration;		/*if DEFAULT, use Theme's fade duration; else, duration in sec*/
};
 
#define C_THEME_NO_LOOP -1
#define C_THEME_PART_PLAY_ONCE 0
#define C_THEME_MAINLOOP_INFINITE 0
#define C_THEME_NO_PARTOUTRO -1
 
struct _tdstTypeThemeDisk {
    unsigned long   ulStartLoop;	/*main loop start (first part of the loop*/
    unsigned long   ulEndLoopObsolet;/*UNUSED; just keep to avoid disalignment and incompatiblity*/
	unsigned long	ulNbLoops;		/*total number of loop;C_THEME_LOOP_INIFINITE=0 if infinite loop;1=play once;2=play twice...*/
    unsigned long   ulNbParts;      /*total number of part in the list (excluding outro)*/
    long			lOffsetPartOutro;	/*offset of Partoutro in this resource extra data; in bytes; 0 is the location of 1° part;C_THEME_NO_PARTOUTRO=no partoutro*/
	SndReal			rFadeDuration;		/*if DEFAULT, use default duration (1sec); else, duration in sec*/
    SNDLST2_M_StaticParentDeclaration(tdstThemePart*)	/*not needed, but BNM alignement cannot be changed*/
};
 
struct _tdstTypeThemeMem {
    unsigned long   ulStartLoop;      /*main loop start (0=first part, 1=2° part...)*/
    unsigned long   ulEndLoopObsolet ;/*UNUSED; just keep to avoid disalignment and incompatiblity*/
    unsigned long   ulNbParts;        /*total number of part in the list (excluding OUTRO)*/
    tdstThemePartOutro*	pstPartOutro;
	SndReal			rFadeDuration;		/*if DEFAULT, use default fade duration (1sec); else, duration in sec*/
	unsigned long	ulNbLoops;		/*total number of loop;C_THEME_LOOP_INIFINITE=0 if infinite loop;1=play once;2=play twice...*/
    SNDLST2_M_StaticParentDeclaration(tdstThemePart*)
};
 
 
 
/*------ previous switch ressources (only for compatbilty)*/
typedef struct _tdstTypeSwitchOld       tdstTypeSwitchOld;
 
struct _tdstTypeSwitchOld
{
		SNDLST2_M_StaticParentDeclaration(tdstSwitchElement*)
        unsigned long               ulNbElements;  /*nb d’elements dans la liste d’aiguillage*/
        long                        lTypeSwitch;    /*type moteur de switch*/
        SND_tdxHandleToSoundInfo    hDefault;       /*indice de l'element par defaut*/
		SndBool						bDynamic;		/*switch remis à jour dynamiquement*/
};
 
/*--------------------------------------------------- SWITCH RESSOURCES*/
/*parametres d'un element d'une liste ACP de references de ressources:*/
struct _tdstSwitchElement {
        tduRefRes                   uRes;           /*reference sur la ressource associee à l’element*/
        SND_tdxHandleToSoundInfo    hIndice;        /*indice associe à l'element*/
        SNDLST2_M_StaticChildDeclaration(tdstSwitchElement*,tdstTypeSwitchMem*)
} ;
/*
// Liste de references sur des ressources:
struct _tdstSwitchList 
{
        SNDLST2_M_StaticParentDeclaration(tdstSwitchElement*)
};
*/
 
#define C_SWITCH_NODEFAULT ((SND_tdxHandleToSoundInfo)-1)
 
/*Definition d’une ressource switch en memoire :*/
struct _tdstTypeSwitchMem
{
		SNDLST2_M_StaticParentDeclaration(tdstSwitchElement*)
        unsigned long               ulNbElements;  /*nb d’elements dans la liste d’aiguillage*/
        long                        lTypeSwitch;    /*type moteur de switch*/
        SND_tdxHandleToSoundInfo    hDefault;       /*indice de l'element par defaut*/
		SndBool_field_decl(bDynamic);		/*switch remis à jour dynamiquement*/
		SndBool_field_decl(bMaintainIfSwitched);	/*if TRUE, never stop a launched element, event if switch value change (there'll be only Plays)*/
};
 
/*Definition d’une ressource switch sur disque :*/
struct _tdstTypeSwitchDisk
{
		SNDLST2_M_StaticParentDeclaration(tdstSwitchElement*)		/*not needed, but BNM alignement cannot be changed*/
        unsigned long               ulNbElements;  /*nb d’elements dans la liste d’aiguillage*/
        long                        lTypeSwitch;    /*type moteur de switch*/
        SND_tdxHandleToSoundInfo    hDefault;       /*indice de l'element par defaut*/
		SndBool_field_decl(bDynamic);		/*switch remis à jour dynamiquement*/
		SndBool_field_decl(bMaintainIfSwitched);	/*if TRUE, never stop a launched element, event if switch value change (there'll be only Plays)*/
};
 
 
/*--------------------------------------------------- RESSOURCES SPLITS*/
/*Definition d’une ressource split sur disque: */
struct _tdstTypeSplitDisk
{
        unsigned long   ulNbRanges ;  /*nb d’elements dans la liste d’aiguillage*/
        SndBool			bStayActive; /*rester actif si aucune plage active*/
        /*char            czFileName[13]; // nom du fichier de sequence Id des ressoures*/
}  ;
 
/*Description d'une plage (range) du split*/
struct _tdstRangeSplitDisk {
	tduRefRes   uRes ;	/*ressource associee à la plage*/
	SndReal	    rPitchA ;	/*pitch de la ressource split correspondant au point A*/
	SndReal	    rPitchB ; 	/*pitch de la ressource split correspondant au point B*/
	SndReal	    rPitchC ; 	/*pitch de la ressource split correspondant au point C*/
	SndReal	    rPitchD ; 	/*pitch de la ressource split correspondant au point D*/
	SndReal	    rCoefPitch ;	/*rapport entre pitch effectif de la plage et pitch de la ressource Split*/
	unsigned char ucVolume ;	/*volume auquel doit etre jouee la ressource entre B et C*/
	SNDLST2_M_StaticChildDeclaration(tdstRangeSplitDisk*,tdstRangeSplitListDisk*)
}  ;
 
/*Liste ACP de plages:*/
struct _tdstRangeSplitListDisk{
	SNDLST2_M_StaticParentDeclaration(tdstRangeSplitDisk *)
}  ;
 
/*Description d'une plage (range) du split*/
struct _tdstRangeSplitMem {
	tduRefRes   uRes ;	/*ressource associee à la plage*/
	SndReal	    rPitchA ;	/*pitch de la ressource split correspondant au point A*/
	SndReal	    rPitchB ; 	/*pitch de la ressource split correspondant au point B*/
	SndReal	    rPitchC ; 	/*pitch de la ressource split correspondant au point C*/
	SndReal	    rPitchD ; 	/*pitch de la ressource split correspondant au point D*/
	SndReal	    rCoefPitch ;	/*rapport entre pitch effectif de la plage et pitch de la ressource Split*/
	unsigned char ucVolume ;	/*volume auquel doit etre jouee la ressource entre B et C*/
	SNDLST2_M_StaticChildDeclaration(tdstRangeSplitMem*,tdstRangeSplitListMem*)
    SndReal     rCoefMagAB; /*coef precalcule*/
    SndReal     rCoefMagCD;
}  ;
 
/*Liste ACP de plages:*/
struct _tdstRangeSplitListMem{
	SNDLST2_M_StaticParentDeclaration( tdstRangeSplitMem *)
}  ;
 
/*Definition d’une ressource switch en memoire :*/
struct _tdstTypeSplitMem
{
	unsigned long           ulNbRanges;  /*nb de plages*/
    SndBool					bStayActive; /*rester actif si aucune plage active*/
	tdstRangeSplitListMem   stRangeList; /*liste des plages*/
} ;
 
/*--------------------------------------------------- SEQUENCES*/
/*parametres d'un element d'une sequence (donnees sur disk)*/
struct _tdstInfoTrackDisk {
        unsigned long ulFadeIn; /*fade in sur cet element*/
        unsigned long ulFadeOut;        /*fade out à la fin de l’element*/
/*      unsigned char ucNbLoops;        //nombre de repetition de cet element*/
        unsigned long ulCrossFade;/*cross-fade avec l ‘element suivant*/
        tduRefRes       uRes;           /*reference sur la ressource associee à l’element*/
} ;
 
/*parametres d'un element d'une sequence (donnees en mem), element de liste ACP:*/
struct _tdstInfoTrackMem {
        SNDLST2_M_StaticChildDeclaration(tdstInfoTrackMem*,tdstInfoTrackList*)
        unsigned long ulFadeIn; /*fade in sur cet element*/
        unsigned long ulFadeOut;        /*fade out à la fin de l’element*/
/*      unsigned char ucNbLoops;        //nombre de repetition de cet element*/
        unsigned long ulCrossFade;      /*cross-fade avec l ‘element suivant*/
        tduRefRes       uRes;           /*reference sur la ressource associee à l’element*/
} ;
                   
/* Declaration d'une liste de ressources pour les sequences*/
struct _tdstInfoTrackList 
{
/*        M_LstParentDeclaration(tdstInfoTrackMem);*/
        SNDLST2_M_StaticParentDeclaration(tdstInfoTrackMem*)
};
 
 
 
/*parametres d'une ressource de type sequence (donnee sur disk)*/
struct _tdstTypeSequenceDisk {
        SndBool			bLoop;  /*la sequence boucle-t-elle*/
        unsigned long ulStartLoop;      /*indice du point de rebouclage*/
        unsigned long   ulEndLoop;      /*nd d’elements dans la boucle*/
        unsigned long ulNbLoops;        /*nombre de boucle dans la sequence*/
        unsigned long ulNbElements;     /*nombre d’elements constituant la sequence*/
        /*char    czFileName[13]; // nom du fichier de sequence Id des ressoures*/
} ;
 
/*parametres d'une ressource de type sequence (donnee en mem)*/
struct _tdstTypeSequenceMem {
        SndBool			bLoop;  /*la sequence boucle-t-elle*/
        unsigned long ulStartLoop;      /*indice du point de rebouclage*/
        unsigned long ulEndLoop;        /*nd d’elements dans la boucle*/
        unsigned long ulNbLoops;        /*nombre de boucle dans la sequence*/
        unsigned long ulNbElements;     /*nombre d’elements constituant la sequence*/
        tdstInfoTrackList stResList;    /*liste des ressources contenues dans la sequence*/
} ;
 
/*--------------------------------------------------- BLOCSRESOURCES*/
/*union des descripteurs de ressources sur disk*/
union _tduResDisk {
        tdstTypeSampleDisk      stSample ;
        tdstTypeMidiDisk        stMidi ;
        tdstTypeCD              stCD;
        tdstTypeSequenceDisk    stSequence ;
        tdstTypeSwitchDisk      stSwitch ;
        tdstTypeSwitchOld       stSwitchOld ;/*obsolete*/
        tdstTypeSplitDisk       stSplit;
        tdstTypeThemeDisk       stTheme;
        tdstTypeRandomDisk		stRandom;
        tdstTypeThemeOld		stThemeOld;/*obsolete*/
        tdstTypeThemeDiskOld2   stThemeOld2;/*obsolete*/
} ;
 
/*description d'une ressource (donnees sur disk)*/
struct _tdstBlockResourceDisk {
        tdxId   Id;                                                                             /*id de la ressource*/
        tdeTypeResource eType;                  /*type*/
        tdeTypeStorage  eStorage;               /*storage ???*/
        unsigned long   ulDataSize;             /*taille des donnees utilse (i.e. taille des samples (<taille du WAV)*/
        unsigned long   ulDataOffset;   /*offset des donnees dans le fichier*/
        unsigned char   ucVolume;                       /*volume par defaut*/
        tduResDisk      uRes;                                           /*description de la ressource*/
};
        
/*union des descripteurs de ressources en memoire*/
union _tduResMem {
                tdstTypeSampleMem   stSample ;
                tdstTypeMidiMem     stMidi ;
                tdstTypeCD          stCD;
                tdstTypeSequenceMem stSequence ;
                tdstTypeSwitchMem   stSwitch ;
                tdstTypeSplitMem    stSplit;
                tdstTypeThemeMem    stTheme;
                tdstTypeRandomMem	stRandom;
} ;
 
/*description d'une ressource (donnees en memoire)*/
struct _tdstBlockResourceMem {
        tdxId           Id;                     /*id de la ressource*/
        tdeTypeResource eType;          /*type*/
        tdeTypeStorage  eStorage;               /*storage ???*/
        unsigned char   ucVolume;       /*volume par dfaut*/
        SndBool			bIsLoaded;     /*TRUE si en meoire*/
        tduResMem       uRes ;          /*description propre à la ressource*/
/*        M_LstChildDeclaration(tdstBlockResourceMem,tdstSndPolyResource);        //insertion dans la liste ACP*/
        SNDLST2_M_StaticChildDeclaration(tdstBlockResourceMem*,tdstSndPolyResource*)        /*insertion dans la liste ACP*/
};
 
/* Description d'une ressource de banque:*/
union _tduBlockResource {
    tdstBlockResourceMem stMem;    
    tdstBlockResourceDisk stDisk;    
};
 
 
 
/*liste ACP des ressources      */
struct _tdstSndPolyResource {
/*        M_LstParentDeclaration(tdstBlockResourceMem);*/
        SNDLST2_M_StaticParentDeclaration(tdstBlockResourceMem*)
};
 
/*parametres d'un element d'une liste ACP de references de ressources:*/
struct _tdstRefRes {
        tduRefRes       uRes;           /*reference sur la ressource associee à l’element*/
        SNDLST2_M_StaticChildDeclaration(tdstRefRes*,tdstRefResList*)
} ;
 
/* Liste de references sur des ressources:*/
struct _tdstRefResList 
{
        SNDLST2_M_StaticParentDeclaration(tdstRefRes*)
};
 
#endif /*_SNDRES_H_*/
 
