OpenAl

De Wiki de la communauté Mandriva.


Cette page est une ébauche. Elle mérite des améliorations.
Si vous voulez contribuer, cliquez simplement sur l'onglet modifier. Consultez également les autres pages dont le contenu est à réviser.
OpenAl est une API de bas niveaux pour gérer du son (3d ou pas). On pourrait le comparer à OpenGl mais pour le son !


Sommaire

Installer l'API

Tout d'abord il faut installer : libopenal0-devel

Ensuite installer freealut : libfreealut0-devel (optionnel)

Puis libsndile : libsndfile-devel (optionnel)

Alut n'est vraiment pas obligatoire ; elle ouvre que des fichier .wav

libsndfile ouvre plus de fichier...

Rendez-vous sur son site pour plus de détails : http://www.mega-nerd.com/libsndfile/

La faire Fonctionner

J'ai mis longtemps (1 jour) à la faire fonctionner...
À l'initialisation j'avais : open /dev/[sound/]dsp: Device or resource busy
En faite pour que OpenAl s'init correctement il faut editer le fichier suivant /etc/openalrc
Et mettre ses 3 lignes dedant... Supprimer la 1er ligne de se fichier (s'il elle y ai)

lien: https://mail.gna.org/public/soya-user/2007-11/msg00006.html

(define devices '(alsa))
(define alsa-out-device "default")
(define speaker-num 2)

j'ai trouvÉ ça sur le net... je l'ai fait, redémarré mon ordinateur et ça marcher bien...


Tutoriel (lien)

L'un des plus connus est celui la :(lecture d'un son)
http://loulou.developpez.com/tutoriels/openal/premiers-pas/

enregistrer un son
http://loulou.developpez.com/tutoriels/openal/capture/
(non tester pour le moment)

Les acces au .h sont alc.h et al.h ca on sait mais ne pas oublier le AL/ devant

  1. include <AL/al.h>
  2. include <AL/alc.h>

Mais voila c'est moi ca marcher pas tip top...


Pourquoi:

Enfin oui ca marche....
mais voila je vous mets en garde...
GetDevices(vector device) ne fonctionne pas sous mandriva (du moins chez moi) elle ne fonctionne pas!
une fois tout le code copier/coller (ou recopier)
pour pouvoir ENTENDRE le son dans ses H.P. hauts parleurs :/ la commende: alSourcePlay(Source);
ne suffit pas n'oubliez pas de rajouter
la boucle do while avec
alGetSourcei(Source, AL_SOURCE_STATE, &Status);
}
while (Status == AL_PLAYING);

Voila !!

Mon code

Enfin je dis mon code mais c'est celui de Laurent Gomila (lien plus haut)
que j'ai un peu (vraiment pas beacoup)trafiquer mais qui fonctionne!! pour les feignants

//Code par Mr Laurent Gomila modifier par Micky //pas mechant comme modif mais au moin ca marche direct... //////////////////////////////////////////////////////////// // En-t�tes ////////////////////////////////////////////////////////////

  1. include <AL/al.h>
  2. include <AL/alc.h>
  3. include <sndfile.h>
  4. include <iomanip>
  5. include <iostream>
  6. include <string>
  7. include <vector>

//////////////////////////////////////////////////////////// // Initialise OpenAL (ouvre un device et cr�e un contexte audio) // // \param DeviceName : Nom du device � ouvrir (NULL pour le device par d�faut) // // \return True si tout s'est bien pass�, false en cas d'erreur // ////////////////////////////////////////////////////////////
bool InitOpenAL() {

   // Ouverture du device
   ALCdevice* Device = alcOpenDevice(NULL);
   if (!Device)

{

       std::cerr << "Impossible d'ouvrir le device par d�faut" << std::endl;
       return false;

}

   // Cr�ation du contexte
   ALCcontext* Context = alcCreateContext(Device, NULL);
   if (!Context)

{

       std::cerr << "Impossible de cr�er un contexte audio" << std::endl;
       return false;

}

   // Activation du contexte
   if (!alcMakeContextCurrent(Context))

{

       std::cerr << "Impossible d'activer le contexte audio" << std::endl;
       return false;

}

   return true;

}


//////////////////////////////////////////////////////////// // Cr�e un tampon OpenAL � partir d'un fichier audio // // \param Filename : Nom du fichier audio � charger // // \return Identificateur du tampon OpenAL (0 si �chec) // ////////////////////////////////////////////////////////////
ALuint LoadSound(const std::string& Filename) {

   // Ouverture du fichier audio avec libsndfile
   SF_INFO FileInfos;
   SNDFILE* File = sf_open(Filename.c_str(), SFM_READ, &FileInfos);
   if (!File)

{

       std::cerr << "Impossible d'ouvrir le fichier audio" << std::endl;
       return 0;

}

   // Lecture du nombre d'�chantillons et du taux d'�chantillonnage (nombre d'�chantillons � lire par seconde)
   ALsizei NbSamples  = static_cast<ALsizei>(FileInfos.channels * FileInfos.frames);
   ALsizei SampleRate = static_cast<ALsizei>(FileInfos.samplerate);
   // Lecture des �chantillons audio au format entier 16 bits sign� (le plus commun)
   std::vector<ALshort> Samples(NbSamples);
   if (sf_read_short(File, &Samples[0], NbSamples) < NbSamples)

{

       std::cerr << "Impossible de lire les �chantillons stock�s dans le fichier audio" << std::endl;
       return 0;

}

   // Fermeture du fichier
   sf_close(File);
   // D�termination du format en fonction du nombre de canaux
   ALenum Format;
   switch (FileInfos.channels)

{

       case 1 : Format = AL_FORMAT_MONO16;   break;
       case 2 : Format = AL_FORMAT_STEREO16; break;

default :

           std::cerr << "Format audio non support� (plus de 2 canaux)" << std::endl;
           return 0;

}

   // Cr�ation du tampon OpenAL
   ALuint Buffer;
   alGenBuffers(1, &Buffer);
   // Remplissage avec les �chantillons lus
   alBufferData(Buffer, Format, &Samples[0], NbSamples * sizeof(ALushort), SampleRate);
   // V�rification des erreurs
   if (alGetError() != AL_NO_ERROR)

{

       std::cerr << "Impossible de remplir le tampon OpenAL avec les �chantillons du fichier audio" << std::endl;
       return 0;

}

   return Buffer;

}


//////////////////////////////////////////////////////////// // Ferme proprement OpenAL // ////////////////////////////////////////////////////////////
void ShutdownOpenAL() {

   // R�cup�ration du contexte et du device
   ALCcontext* Context = alcGetCurrentContext();
   ALCdevice*  Device  = alcGetContextsDevice(Context);
   // D�sactivation du contexte
   alcMakeContextCurrent(NULL);
   // Destruction du contexte
   alcDestroyContext(Context);
   // Fermeture du device
   alcCloseDevice(Device);

}


//////////////////////////////////////////////////////////// // Point d'entr�e du programme // // \return Code d'erreur de l'application // ////////////////////////////////////////////////////////////
int main() {

   // Initialisation d'OpenAL
    InitOpenAL();
   // Chargement du fichier audio
   ALuint Buffer = LoadSound("fichierSon.wav");
   if (Buffer == 0)
       return EXIT_FAILURE;
   // Cr�ation d'une source
   ALuint Source;
   alGenSources(1, &Source);
   alSourcei(Source, AL_BUFFER, Buffer);
   // On joue le son
   alSourcePlay(Source);
   // On attend qu'il soit termin�
   ALint Status;
   
   do�

{ // Recuperation de l'etat du son et le faire jouer par la Carte son pour l'entendre
alGetSourcei(Source, AL_SOURCE_STATE, &Status); }

   while (Status == AL_PLAYING);
   // Destruction du tampon
   alDeleteBuffers(1, &Buffer);
   // Destruction de la source
   alSourcei(Source, AL_BUFFER, 0);
   alDeleteSources(1, &Source);
   // Fermeture d'OpenAL
   ShutdownOpenAL();


   return EXIT_SUCCESS;

}


Compilation

Comment compiler en ligne de comande
tres simplment:
les librairies a utiliser sont:
-lopenal obligatoire
-lalut optionel que si vous utiliser alut
-lsndfile optionel que si vous utiliser libsndfile

au final ca donne:
g++ "-lopenal" "-lalut" "-lsndfile" OpenAL.cpp -o openal


Résumé

rajouter les lignes dans /etc/openalrc
lire le tuto premier pas tres bien expliquer je trouve
les en-tete commance par <AL/....h>


Liens externes

OpenAl http://www.openal.org/

Libsndfile http://www.mega-nerd.com/libsndfile/

openalrc
https://mail.gna.org/public/soya-user/2007-11/msg00006.html

Super tuto
http://loulou.developpez.com/tutoriels/openal/premiers-pas/
http://loulou.developpez.com/tutoriels/openal/capture/

Récupérée de « http://wiki.mandriva.com/fr/OpenAl »