fysxasteroids/engine/SoundBase.h

80 lines
2.0 KiB
C++

#ifndef _SOUNDBASE_H
#define _SOUNDBASE_H
#include "Engine.h"
#include <SDL/SDL_mixer.h>
namespace Engine {
class Module;
class SoundSample {
public:
SoundSample() :
mMixChunk (NULL),
mChannel (-1) {
}
~SoundSample();
bool Load(const std::string &filename);
void Play();
void Loop(int count);
void Stop();
int GetChannel () { return mChannel; };
private:
int mChannel;
Mix_Chunk *mMixChunk;
};
typedef boost::shared_ptr<SoundSample> SoundSamplePtr;
/** \brief Manages loading, saving and playing of sounds and music
*
*/
class SoundBase : public Module {
public:
void PlaySound (const std::string &sound_name);
/** \brief Plays a sound chunk in a loop
*
* \note Loops are hard-coded played in channel 4, therefore playing
* two loops simultaneously is currently not supported.
*/
void PlaySoundLoop (const std::string &sound_name, int count);
void HaltSoundLoop (const std::string &sound_name);
void LoadSound (const std::string &sound_name);
void PlayMusic (const std::string &music_name);
void HaltMusic ();
/** \brief Sets the volume of the music channel to the given value
*
* \param music_value is a value from 0. (no music) to 1. (maximum volume)
*/
void SetMusicVolume (const float &music_volume);
/** \brief Returns the value of the music (0. - 1.) */
float GetMusicVolume ();
/** \brief Sets the volume of the music channel to the given value
*
* \param music_value is a value from 0. (no music) to 1. (maximum volume)
*/
void SetEffectsVolume (const float &effects_volume);
/** \brief Returns the value of the effects (0. - 1.) */
float GetEffectsVolume ();
protected:
/** \brief Initializes the system */
virtual int OnInit (int argc, char* argv[]);
/** \brief Destroys the system (must be called!) */
virtual void OnDestroy ();
std::string mCurrentMusicName;
Mix_Music *mCurrentMusic;
std::map<std::string, SoundSamplePtr> mSamples;
typedef std::map<std::string, SoundSamplePtr>::iterator SampleIter;
};
}
#endif // _SOUNDBASE_H