OpenAl
De Wiki de la communauté Mandriva.
Si vous voulez contribuer, cliquez simplement sur l'onglet modifier. Consultez également les autres pages dont le contenu est à réviser.
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
- include <AL/al.h>
- 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 ////////////////////////////////////////////////////////////
- include <AL/al.h>
- include <AL/alc.h>
- include <sndfile.h>
- include <iomanip>
- include <iostream>
- include <string>
- 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/

