/* Copyright (C) 2009 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 0 A.D. is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 0 A.D. If not, see . */ /** * ========================================================================= * File : SoundGroup.h * Project : 0 A.D. * Description : Loads up a group of sound files with shared properties, * and provides a simple interface for playing them. * ========================================================================= */ /* Example usage: (SEE SOUNDGROUPMGR.H) Example SoundGroup.xml 1.0 0 1.0 100 0 0 0 1.0 360 360 audio/voice/hellenes/soldier/Attack_Attackx.ogg audio/voice/hellenes/soldier/Attack_Chargex.ogg audio/voice/hellenes/soldier/Attack_Engagex.ogg audio/voice/hellenes/soldier/Attack_ForMyFamily.ogg */ #ifndef INCLUDED_SOUNDGROUP #define INCLUDED_SOUNDGROUP #include "lib/res/handle.h" #include "ps/CStr.h" #include "maths/Vector3D.h" #include "lib/res/sound/snd_mgr.h" #include enum eSndGrpFlags { eRandOrder = 0x01, eRandGain = 0x02, eRandPitch = 0x04, eLoop = 0x08, eOmnipresent = 0x10 }; class CSoundGroup { public: CSoundGroup(const char *XMLfile); CSoundGroup(void); ~CSoundGroup(void); // Play next sound in group // @param position world position of the entity generating the sound // (ignored if the eOmnipresent flag is set) void PlayNext(const CVector3D& position); // Load a group bool LoadSoundGroup(const char *XMLfile); void Reload(); // Release all remaining loaded handles void ReleaseGroup(); // Update SoundGroup, remove dead sounds from intensity count void Update(float TimeSinceLastFrame); // Set a flag using a value from eSndGrpFlags inline void SetFlag(int flag){ m_Flags |= flag; } // Test flag, returns true if flag is set. inline bool TestFlag(int flag) { return (m_Flags & flag) != 0;} private: void SetGain(float gain); void UploadPropertiesAndPlay(Handle hSound, const CVector3D& position); void SetDefaultValues(); size_t m_index; // index of the next sound to play Handle m_hReplacement; std::vector snd_group; // we store the handles so we can load now and play later std::vector filenames; // we need the filenames so we can reload when necessary. std::vector playtimes; // it would be better to store this in with the Handles perhaps? CStr m_filepath; // the file path for the list of sound file resources CStr m_intensity_file; // the replacement aggregate 'intense' sound float m_CurTime; // Time elapsed since soundgroup was created float m_TimeWindow; // The Intensity Threshold Window size_t m_IntensityThreshold; // the allowable intensity before a sound switch size_t m_Intensity; // our current intensity(number of sounds played since m_CurTime - m_TimeWindow) float m_Decay; // unsigned char m_Flags; // up to eight individual parameters, use with eSndGrpFlags. float m_Gain; float m_Pitch; float m_Priority; float m_ConeOuterGain; float m_PitchUpper; float m_PitchLower; float m_GainUpper; float m_GainLower; float m_ConeInnerAngle; float m_ConeOuterAngle; }; #endif //#ifndef INCLUDED_SOUNDGROUP