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

	Space Impakto DS
	relminator
	http://rel.betterwebber.com


	Csound class


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

#include <nds.h>
#include <maxmod9.h>


#ifndef Csound__H
#define Csound__H

// UNREM the #define below for a no sound game

// #define NO_SOUND      

// Need to edit this everytime
// I add a BGM or SFX

enum E_BGM
{
    E_BGM_LEVEL_01,
	E_BGM_LEVEL_02,
	E_BGM_LEVEL_03,
	E_BGM_LEVEL_04,
	E_BGM_LEVEL_05,
	E_BGM_S1945,
	E_BGM_CONTRA,
    E_BGM_BOSS_01,
	
	
	E_BGM_MAX
};

enum E_SFX
{
    
	E_SFX_TURRET_SHOOT,
	
	E_SFX_MAX
};


enum E_BGM_MODE
{
	E_BGM_NORMAL = 0,
	E_BGM_FADE_OUT,
	E_BGM_FADE_IN
};
 
class Csound
{
	public:

	Csound();
	
	inline void init( mm_addr soundbank );
	inline void set_mode( mm_mode_enum mode );
	inline void set_master_volume( mm_word _volume ); 

	void set_BGM_mode( E_BGM_MODE mode );

	void load_BGM( mm_word module_ID );
	void load_SFX( mm_word sample_ID );
	
	void unload_BGM( mm_word module_ID );
	
	inline void play_BGM( int index, mm_pmode mode );
	inline void play_SFX( int index );
	
	
	inline void stop_BGM();
	
	inline void fade_BGM();
	
	
	mm_word 		BGM_ID[E_BGM_MAX];
	mm_word 		SFX_ID[E_SFX_MAX];
	
	mm_sound_effect sfx[E_SFX_MAX];
	
	int 			num_bgm;
	int 			num_sfx;
	E_BGM_MODE 		playmode;
	
	s32 			volume;
	int 			fade_steps;		// max 1024
	s32				step_inc;
	
};


#ifndef NO_SOUND

inline void Csound::init( mm_addr soundbank )
{
	mmInitDefaultMem( (mm_addr)soundbank );
}

inline void Csound::set_mode( mm_mode_enum mode )
{
	mmSelectMode( mode );
}

inline void Csound::set_master_volume( mm_word _volume )
{
	volume = _volume << 12;
	mmSetModuleVolume( _volume );
}


inline void Csound::play_BGM( int index, mm_pmode mode )
{
	mmStart( BGM_ID[index], mode );
}

inline void Csound::play_SFX( int index )
{
	mmEffectEx(&sfx[index]);
}

inline void Csound::stop_BGM()
{
	mmStop();
}

inline void Csound::fade_BGM()
{
	volume += step_inc;
	if (volume < 0)
		volume = 0;
	else if (volume > (1024 << 12))
		volume = 1024 << 12;
		
	set_master_volume( volume >> 12 );
}

#else

inline void Csound::init()
{
}

inline void Csound::set_mode( mm_mode_enum mode )
{
}

inline void Csound::set_master_volume( mm_word _volume )
{
}

inline void Csound::play_BGM( int index, mm_pmode mode )
{
}

inline void Csound::play_SFX( int index )
{
}

inline void Csound::stop_BGM()
{
}
inline void Csound::fade_BGM()
{
}

#endif


#endif