1
0
forked from 0ad/0ad
0ad/source/sound/SoundGroup.h
janwas 8a52113e60 huge cleanup and conversion of most string handling (especially paths) to unicode
please note: format strings must be %hs for char* arguments and %ls for
wchar_t*

This was SVN commit r7161.
2009-11-03 21:46:35 +00:00

137 lines
4.1 KiB
C++

/* 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 <http://www.gnu.org/licenses/>.
*/
/**
* =========================================================================
* 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
<?xml version="1.0" encoding="utf-8"?>
<SoundGroup>
<Gain>1.0</Gain>
<Looping>0</Looping>
<Pitch>1.0</Pitch>
<Priority>100</Priority>
<RandOrder>0</RandOrder>
<RandGain>0</RandGain>
<RandPitch>0</RandPitch>
<ConeGain>1.0</ConeGain>
<ConeInner>360</ConeInner>
<ConeOuter>360</ConeOuter>
<Sound>audio/voice/hellenes/soldier/Attack_Attackx.ogg</Sound>
<Sound>audio/voice/hellenes/soldier/Attack_Chargex.ogg</Sound>
<Sound>audio/voice/hellenes/soldier/Attack_Engagex.ogg</Sound>
<Sound>audio/voice/hellenes/soldier/Attack_ForMyFamily.ogg</Sound>
</SoundGroup>
*/
#ifndef INCLUDED_SOUNDGROUP
#define INCLUDED_SOUNDGROUP
#include "lib/res/handle.h"
#include "lib/file/vfs/vfs_path.h"
#include "ps/CStr.h"
#include "maths/Vector3D.h"
#include "lib/res/sound/snd_mgr.h"
#include <vector>
enum eSndGrpFlags
{
eRandOrder = 0x01,
eRandGain = 0x02,
eRandPitch = 0x04,
eLoop = 0x08,
eOmnipresent = 0x10
};
class CSoundGroup
{
public:
CSoundGroup(const VfsPath& pathnameXML);
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 VfsPath& pathnameXML);
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<Handle> snd_group; // we store the handles so we can load now and play later
std::vector<std::wstring> filenames; // we need the filenames so we can reload when necessary.
std::vector<float> playtimes; // it would be better to store this in with the Handles perhaps?
VfsPath m_filepath; // the file path for the list of sound file resources
std::wstring 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