IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multithreading Discussion :

[OpenAl] lecture d'un son dans un thread


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Par défaut [OpenAl] lecture d'un son dans un thread
    Bonjour à tous,
    Voila que depuis que je reussi a enregistrer du son à partir d'un micro je reprend un ancien projet.
    Il y a environ un an grace à l'aide précieuse de Mongaulois j'avais réussi à envoyer un son sur le réseau. Alors comme maintenant je sais enregistrer un son du micro je vous le donne en mille je voudrai faire un logiciel de .... voip .

    Ceci dit je vois qu'une seule façon de réussir a enregistrer ce que je dis tout en recevant ce que l'autre dis.
    C'est pourquoi je pensais enregistrer dans un thread et recevoir dans le thread principal.

    Le probleme est quand faisant un truc que j'arrive a faire dans le thread principal, dans le deuxieme thread la lecture du son ne s'effectue pas.

    Voila des brides de codes sensibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include "QThreadCapture.h"
     
     
    QThreadCapture::QThreadCapture(QTcpSocket* _socket)
    {
      socket=new QTcpSocket(_socket);
    }
     
    QThreadCapture::~QThreadCapture()
    {
      delete socket;
    }
     
    void QThreadCapture::run()
    {
      QOpenAl capture(LOAD);
      QOpenAl play(PLAY);
     
      son=capture.loadSound("ocean.wav");
      std::cout<<"Fin capture"<<std::endl;
      play.playSound(son);
     
    }
    les fonctions loadSound et playSound :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    void QOpenAl::playSound(vector<ALshort> musique)
    {
      ALuint buffer;
     
      //Remplissage avec les echantillons lus
     
      alGenBuffers(1,&buffer);
      alBufferData(buffer,AL_FORMAT_MONO16, &musique[0],musique.size() * sizeof(ALshort),SampleRate);
     
     
      //Mise en attente du buffer
     
      BufferEnAttente.push_back(buffer);
     
      if (alGetError() != AL_NO_ERROR)
        {
          cerr<<"OpenAl erreur : lors de la lecture"<<endl;
          return;
        }
     
       alSourcePlay(*Source);
    } 
    vector<ALshort> QOpenAl::loadSound(const string& Filename)
    {
     
    	//librairy sndfile
    	//ouverture du fichier audio avec libsndfile
    	SF_INFO FileInfos;
    	SNDFILE* File = sf_open(Filename.c_str(), SFM_READ, &FileInfos);
    	if (!File)
    		cerr<<"impossible d'ouvrir le fichier"<<endl;
     
    	//Lecture du nombre d'echantillon et taux echantillon
    	ALsizei NbSamples = static_cast<ALsizei>(FileInfos.channels * FileInfos.frames);
    	SampleRate = static_cast<ALsizei>(FileInfos.samplerate);
     
    	//Lecture des echantillon audio au format 16 bits signe
    	vector<ALshort> Samples(NbSamples);
    	if (sf_read_short(File, &Samples[0], NbSamples)<NbSamples)
    		cerr<<"Impossible"<<endl;
     
    	//fermeture du fichier 
    	sf_close(File);
    	//playSound(Samples);
     
    	return Samples;
    }

    Voila merci d'avance.
    Bon lundi de pantecote

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    As tu essayé dans un même thread pour commencer?
    Tu créé bien un context openal différent pour chaque thread?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Par défaut
    Alors oui dans le thread principal aucun probleme.
    Pour ce qui est de créer un nouveau context dans el thread
    Dans le thread j'ai :
    QOpenAl play(PLAY);
    Cette ligne appelle (dans el constructeur) cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    bool QOpenAl::initOpenAl()
    {
     
    	//Ouverture du device
    	ALCdevice* Device = alcOpenDevice(NULL);
    	if(!Device)
    	{
    		cerr<<"impossible d'ouvrir le device"<<endl;
    	        return false;
    	 }
    	//Création contexte
    	ALCcontext *Context = alcCreateContext(Device, NULL);
    	if (!Context)
    	{
    		cerr<<"impossible d'initialiser un contexte"<<endl;
    		return false;
    	}
    	//Activationn du contexte
    	if (!alcMakeContextCurrent(Context))
    		return false;
     
    	return true;
    }
    Du coup oui je pense que c'est un contexte différent sauf si je deois mettre autre chose la :
    ALCcontext *Context = alcCreateContext(Device, NULL);
    à la place de NULL ?

    Merci

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    ALors si je me trompe pas il faut appeler
    //Ouverture du device
    ALCdevice* Device = alcOpenDevice(NULL);
    une seule fois pour toute dans tout le programme.
    Pour le reste je ne sais plus...
    Tu as regarder les tuto OpenAl qu'il y as sur le site?

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    en regardant
    http://loulou.developpez.com/tutorie.../premiers-pas/
    il me semble que j'appelai qu'une seule fois

    bool InitOpenAL()
    {
    // Ouverture du device
    ALCdevice* Device = alcOpenDevice(NULL);
    if (!Device)
    return false;

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

    // Activation du contexte
    if (!alcMakeContextCurrent(Context))
    return false;

    return true;
    }
    au tous début du programme.
    Si c'est bien un problème openAl va plutôt sur ce forum
    http://www.developpez.net/forums/f13...is-multimedia/

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Par défaut
    Le probleme est qu'actuellement ALCdevice* Device = alcOpenDevice(NULL); n'est effectué qu'une fois dans le programme.
    Et que la version du programme qui envoyait un son sur le reseau le faisai plusieurs fois si je ne m'abuse et marchait correctement.

Discussions similaires

  1. Lecture d'un fichier HF C/S dans un thread
    Par lazariel dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 04/09/2012, 09h21
  2. [OpenAL] Enregistrement et lecture d'un son
    Par downfall dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 21/01/2009, 19h18
  3. erreur d'un timer declaré dans un thread
    Par hak5 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/04/2004, 09h20
  4. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo