IV. Le moteur audio▲
Le moteur audio est le plus simple de tous les modules. Je me suis appuyé sur IrrKlang, il ne reste donc plus qu'à implémenter une gestion basique des sons. IrrKlang est encore en plein développement, certaines des fonctionnalités finales ne sont donc pas encore disponibles, notamment la détection des fins des sons, je n'ai donc implémenté aucune fonctionnalité touchant à cet aspect.
Le moteur audio est le seul à posséder les chemins physiques vers les ressources audio (wav, ogg�?�). Tous les modules qui souhaitent lancer la lecture d'un son vont fournir le nom logique du son à jouer. Le moteur audio possèdera une table de correspondance entre les noms logiques et les noms physiques.
class
sound_engine : public
engine{
public
:
sound_engine(game*
, bool
);
~
sound_engine();
void
frame(){}
inline
void
play_ambiance(std::
string&
s){
s_engine->
play2D(sound_names[s].c_str());}
inline
void
play_spatial(std::
string&
s, irr::core::
vector3df v){
s_engine->
play3D(sound_names[s].c_str(), v);}
std::
map<
std::
string, std::
string>
sound_names;
void
process_event(engine_event&
);
protected
:
void
get_config_data();
irr::audio::
ISoundEngine *
s_engine;
std::
vector&
std::
string>
playlist;
}
;
Le constructeur du moteur audio est similaire à celui du moteur graphique : les options de création de l'objet principal vont dépendre du mode passif ou actif.
sound_engine::
sound_engine(game*
g, bool
passif):engine(g){
passive_mode =
passif;
if
(passive_mode)
s_engine =
irr::audio::
createIrrKlangDevice(irr::audio::
ESOD_NULL);
else
s_engine =
irr::audio::
createIrrKlangDevice();
// configuration du moteur audio
get_config_data();
}
Le moteur audio devra être capable d'associer un nom physique aux noms logiques, au démarrage il doit donc créer sa table de correspondance sound_names. Il peut la créer à partir d'un fichier XML, d'un fichier INI�?�
De la même manière, le moteur audio doit repérer toutes les musiques qu'il a à sa disposition pour l'élaboration d'une playlist. Et à chaque fois qu'une musique est terminée, il enchaînera sur la musique suivante. La création de la playlist peut par exemple se faire en analysant tous les fichiers présents dans un répertoire donné :
boost::filesystem::
path dir("./data/sound/playlist"
);
boost::filesystem::
directory_iterator i(dir), end;
for
(; i!=
end; i++
){
if
(boost::filesystem::
is_directory("./data/sound/playlist/"
+
i->
leaf()))
continue
;
playlist.push_back("./data/sound/playlist/"
+
i->
leaf());
}
Les sons 3D pourront également être mis directement dans le graphe de scène, de manière à regrouper en un seul endroit tous les sons en cours de lecture. Cette solution nous permet de largement simplifier la gestion des sons. Cela permet également de ne plus avoir à se préoccuper de la perception d'un son par divers joueurs du réseau. Tout sera géré en tant qu'objets du graphe de scène. Un bon réglage des distances maximales de perception permettra de limiter le nombre de sons à jouer simultanément, économisant ainsi des ressources CPU.