Présentation de la bibliothèque IrrKlang

Pierre Schwartz

Cet article va présenter les fonctionnalités de la bibliothèque de gestion audio irrKlang, j'y présenterais ses atouts et ses points faibles. ♪

- Titre : Présentation de la bibliothèque IrrKlang

- Auteur : Pierre Schwartz

- Parution : 11 mars 2007

- Licence : Copyright ® 2007 Pierre Schwartz. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Installation

- II. Utilisation d'IrrKlang

- II-A. Interactions avec Irrlicht

- III. Fonctionnalités absentes

- IV. Conclusion

I - Installation

À l'heure où j'écris cet article, irrKlang en est encore à la version 0.5, tout n'est pas finalisé, mais la structure générale de la bibliothèque est déjà bien visible.

IrrKlang est une bibliothèque C++ de gestion audio, elle permet de jouer des sons aux formats mp3, ogg et wav dans un espace 3D. IrrKlang est multiplateforme, elle utilise DirectSound sous Windows et Alsa sous Linux.

Pour installer IrrKlang, rendez-vous sur le site officiel puis téléchargez le pack. Le même pack servira sous Windows ou sous Linux. Le pack contient la bibliothèque compilée en statique, la bibliothèque dynamique, les headers nécessaires à la compilation ainsi que des exemples de code.

Pour compiler, il suffira d'ajouter :

#include <irrklang.h>

Ainsi, le répertoire include du pack irrklang doit être accessible depuis votre compilateur. Et de la même manière, le répertoire lib\[votre compilateur] doit aussi être accessible depuis votre compilateur. L'édition de liens se fera simplement en liant le fichier libirrKlang.a / irrKlang.lib. On remarquera que les bibliothèques statiques sont très légères, elles ne contiennent que les prototypes des fonctions qui, elles, sont dans la bibliothèque dynamique irrKlang.so / irrKlang.dll. Les so/dll devront être accessibles depuis votre exécutable, placez-les donc soit dans le même répertoire que votre exécutable, soit dans un répertoire du PATH de votre système.

II - Utilisation d'IrrKlang

Les plus attentifs d'entre vous l'auront remarqué, le nom IrrKlang est proche de Irrlicht, ce n'est pas anodin, la même personne a programmé ces deux outils et ils sont faits dans la même logique. C'est pourquoi IrrKlang est logiquement la bibliothèque à utiliser pour ajouter une gestion sonore dans un environnement Irrlicht. Les mêmes conventions sont utilisées, les mêmes espaces de noms sont utilisés, la gestion des fichiers est commune, bref, IrrKlang est pensé pour être utilisé conjointement avec Irrlicht. Vous pouvez néanmoins l'utiliser sans utiliser Irrlicht.

Tous les objets et toutes les méthodes propres à IrrKlang sont situés dans l'espace de noms irr::audio. C'est notamment le cas des deux objets de base : le moteur de sons et l'objet son. Il s'agit des classes ISoundEngine et ISound. Ces deux classes sont suffisantes pour réaliser la majeure partie de ce qu'on peut attendre d'une bibliothèque de gestions de sons.

Le moteur de sons va jouer les sons dans un espace 2D ou 3D, il va gérer le rendu de tous les sons, alors que les sons eux-mêmes vont se gérer indépendamment des autres sons.

IrrKlang est extrêmement simple à utiliser, une poignée de fonctions permettent d'accéder à toutes les fonctionnalités. Les fonctions utiles sont les suivantes :

- créer un moteur de sons ;

- jouer un son en 2D ;

- jouer un son en 3D ;

- sélectionner l'emplacement de l'utilisateur dans l'univers 3D ;

- éventuellement, spécifier quelques options pour les sons.

Voilà, ces quelques fonctionnalités résument presque entièrement IrrKlang. La création d'un moteur de sons se fait de la manière suivante :

ISoundEngine* engine = createIrrKlangDevice();

Vous pouvez aussi vous pencher sur les différents paramètres facultatifs de createIrrKlangDevice : vous pouvez spécifier le type de driver à utiliser ou bien des options sur le rendu des sons. Comme à son habitude dans Irrlicht, il conviendra de vérifier que le moteur a bien été créé en testant engine. Pour jouer un son, rien de plus simple :

ISound* music = engine->play2D("test.ogg");

De même, vous pouvez spécifier quelques options sur le rendu du son via les paramètres facultatifs de play2D. La lecture de sons en 3D n'est guère plus complexe, il suffit de rajouter la position 3D de la source sonore :

ISound* music = engine->play3D("test.ogg", core::vector3df(1,2,3));

Pour pouvoir jouer un son dans un espace 3D, il faut aussi indiquer la position et l'orientation de l'utilisateur :

engine->setListenerPosition(core::vector3df(1,0,2), core::vector3df(1,0,0));

On remarquera l'utilisation de la classe irr::core::vector3df de Irrlicht pour toutes les localisations spatiales.

Les fonctions play2D et play3D renvoient un ISound*. Il n'est nécessaire de récupérer ce pointeur que si vous souhaitez par la suite manipuler directement le son pour, par exemple, en changer manuellement le volume ou la balance. Il ne sera donc pas absurde de ne pas récupérer ce pointeur pour laisser le moteur gérer lui-même tout le rendu des sons.

Le rendu 2D est très simple, un son sera tout le temps entendu avec le même volume. Dans un univers 3D le moteur de sons va déterminer le volume (sur chaque canal) en fonction de la distante séparant la source de l'utilisateur et en fonction du type d'interpolation à effectuer. Chaque son est joué à son volume maximal à proximité de la source et est audible jusqu'à une distance maximale. Entre ces distances minimales et maximales, le son sera interpolé.

D'autres fonctionnalités sont présentes pour pouvoir spécifier des emplacements mémoires comme flux à lire ou encore pour utiliser votre propre chargeur de flux. Ces fonctionnalités restent cependant très anecdotiques.

On remarquera aussi la présence d'une bibliothèque dynamique ikpMP3.dll / so. Il s'agit du décodeur MP3 d'IrrKlang. Ce fichier doit être accessible depuis votre exécutable si vous souhaitez lire des mp3, dans le cas contraire, vous pourrez tout à fait vous en passer.

La lecture de fichiers mp3 s'avère légèrement plus gourmande que la lecture des fichiers ogg. Est-ce dû à l'implémentation du décodeur mp3 ? Au format mp3 en lui-même ? Sûrement un peu des deux.

II-A - Interactions avec Irrlicht

Les interactions avec Irrlicht sont très (trop?) faibles. Dans le couplage d'un moteur audio avec un moteur 3D, on pourrait espérer voir apparaître des fonctions pour calculer le rendu d'un son dans un univers 3D connu par Irrlicht, pour par exemple tenir compte des murs ou des matériaux. Mais ceci est également fortement remis en cause par l'absence d'analyse fréquentielle.

La seule interaction intéressante avec Irrlicht est la création des nœuds de scène « source sonore » et « écouteur », écrits par la communauté IrrKlang. Il suffit alors d'ajouter ces nœuds au graphe de scène Irrlicht pour avoir un rendu sonore. Et la cerise sur le gâteau est qu'on peut directement spécifier la caméra comme écouteur. Il s'agit de deux nouvelles classes : CSoundEmitterSceneNode et CSoundListenerSceneNode, qui héritent toutes deux de ISceneNode.

Le code source de ces deux classes est disponible sur le forum de la communauté IrrKlang. Ça vaut le détour.

III - Fonctionnalités absentes

On remarque tout de suite l'absence d'analyse fréquentielle des sons, ce qui empêche la création d'effets sympathiques ou les modifications de l'equalizer. De même on ne peut pas paramétrer la qualité du son en sortie, le son joué sera exactement celui du fichier spécifié.

On remarque aussi le faible nombre de formats supportés, mais est-ce vraiment un handicap ? Le wav, le mp3 et le ogg sont présents, les autres sont-ils vraiment nécessaires ?

Ce qui manque et qui se fait bien remarquer, c'est l'absence de callbacks sur évènements à la manière de ceux présents dans FmodEx. Il n'est ainsi pas possible de déterminer quand un son se termine, on est obligé de scruter régulièrement l'état du son par la méthode isFinished(). Ce serait une fonctionnalité très intéressante qui pourrait être rajoutée dans les prochaines versions d'IrrKlang.

IV - Conclusion

On est tout de suite séduit par IrrKlang et par son étonnante simplicité. Ce moteur aura tout naturellement une bonne place pour épauler Irrlicht. Actuellement, IrrKlang n'est pas encore open source, mais ça ne saurait tarder et il y a aussi de fortes chances qu'on le retrouve diffusé sous licence zlib. Ce serait un avantage incontestable face à son rival FmodEx, dont l'utilisation peut être onéreuse dans certains cas.

Cette bibliothèque pourra très vite devenir une valeur sûre pour tous ceux qui veulent gérer simplement des sons sans pour autant chercher les réglages fins ni entièrement réalistes.

Attendons donc la version 1.0 et la diffusion open source pour avoir une vraie bibliothèque utilisable, compétitive et qui n'aura pas à rougir devant sa principale rivale FmodEx.

Merci à millie pour la relecture de ce mini article.