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

Windows Discussion :

multithread pour capturer du son (OpenAL) en parallele sur plusieurs devices


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut multithread pour capturer du son (OpenAL) en parallele sur plusieurs devices
    Bonsoir a toutes et a tous,

    J'ai besoin d'enregistrer (capture Audio) des sons depuis plusieurs devices de ma carte audio (Fireface 400: cette carte possède 3 devices stéreos Analogiques, ce qui implique donc la possibilité de brancher 6 micros) en même temps. La synchronisation de l'enregistrement est d'importance capitale dans mon projet. Dans l'idéal les différents devices devraient se faire initialiser, puis attendre qu'on "presse sur le bouton" pour tous les faire partir en même temps...

    J'ai déjà regardé et modifié les turorials présents sur le site (http://loulou.developpez.com/tutorie.../premiers-pas/ et http://loulou.developpez.com/tutoriels/openal/capture/) pour piger comment marche OpenAL, j'ai aussi lu la documentation qui s'installe avec le SDk.
    Mon vrai problème est de réussir a synchroniser la capture. J'ai commencé à faire des essais avec du multithread mais soit ça plante complètement, soit le son enregistré est entre-coupé sur les différents fichiers Wav que je Output (1 fichier par canal Audio).

    A L'AIDE!!! Est-ce que quelqu'un a une idée de comment obtenir un bon résultat? Il pourrait être aussi intéressant d'utiliser de multiples processus peut-être? mais comment faire pour les synchroniser?

    UN GRAND MERCI D'AVANCE

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Points : 228
    Points
    228
    Par défaut
    J'imagine qu'il faudrait procéder ainsi (je ne connais pas openAL mais bon ^^):
    créer tout les contextes (pas forcément dans des threads séparés),

    lors de l'appui du bouton créer les threads, - >utiliser le bon contexte dans chacun d'eux avec alcMakeContextCurrent, enregistrer le son dans chaque thread,

    puis écrire les fichiers depuis le thread principal, une fois les threads terminés.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    En fait c'est plus ou moins ce que je fais, mais il doit y avoir une sorte de conflit dans la gestion des ressources j'imagine. Le fait est, que si j'ouvre 2 instances du programme du tutorial, par exemple, et que aux deux je fais enregistrer sur 2 devices différents +/- en même temps (il faut presser enter des 2 cotés rapidment) il n'y a aucun problème, les deux fichiers .wav de output sont bons. Mais je suppose qu'il y a moyen de faire ça de manière parfaitment synchro, et propre.
    S'il y a quelqu'un qui a une idée de comment synchroniser des processus qui utilisent des dévices, et visiblement les mêmes .dll, Je vous suis reconnaissant d'avance. Peut-être sur la toile y a t'il quelqu'un qui a déjà codé un truc similaire?
    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 408
    Points : 20 542
    Points
    20 542
    Par défaut
    Bonjour,
    Je ne comprends pas sous Open AL il y a le code source donc tu peux tracer dedans en déboguant pas-à-pas
    http://connect.creativelabs.com/open...ce%20Code.aspx
    Maintenant sous Windows et en programmation Windows si c'est pour un usage pro je n'utiliserais pas si possible ce genre de bibliothèque tierce partie..
    je préferrais prendre Direct Show par exemple ou d'autres API du SDK de Windows
    Citation Envoyé par Petit_Bobo Voir le message
    Mon vrai problème est de réussir a synchroniser la capture. J'ai commencé à faire des essais avec du multithread mais soit ça plante complètement
    Mais tu ne dis pas comment tu fais justement pour synchroniser le tout !
    Est-ce que tu appelles WaitForSingleObjetct par exemple ?
    Il faut peut-être utiliser des Events au lieu de thread.
    Si tu as un problème de synchro c'est parce que la carte son ne dit pas : j'ai fini d'enregistrer et de capturer le fichier son.
    La programmation multithread c'est une chose l'acquisition de sons c'est autre chose.
    Le multithread c'est le CPU , l'enregistrement de son c'est des capteurs analogiques le DSP de la carte son

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    En fait j'utilise OpenAL parce que c'est une librairie qui me semble assez facile d'utilisation, surtout pour ce qui est de la reconnaissance automatique des devices Audio. Et en effet, je en suis pas vraiment en train de développer un logiciel commercial, c'est plutot de la bidouille mon machin...

    J'ai pensé utiliser les threads parce qu'un pote informaticien m'a dit que lui sous linux il utiliserais fork(). Donc en cherchant sur internet j'ai lu que ce qui ressemble le plus a fork() pour windos c'est CreateThread(). En effet j'ai vraiement de la peine a gérer la synchro: pour l'instant ça se limite a initialiser des variables globales (une par thread) qui indiquent que les autres threads ne sont pas encore pret, quand tous sont prets, pouf ça démarre et après les trheads sont livrés a eux-mêmes (et effet ça se voit...).

    Sinon: qu'entends-tu par "events"? c'est genre de placer des sémaphores ou créer des parties de code dont l'accès n'est permis qu'a un thread à la fois?

    Le problème de waitForSingleObject() est que je ne sait pas quoi lui dire d'attendre en gros...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Points : 228
    Points
    228
    Par défaut
    "pour l'instant ça se limite a initialiser des variables globales (une par thread) qui indiquent que les autres threads ne sont pas encore pret, quand tous sont prets, pouf ça démarre et après les trheads sont livrés a eux-mêmes (et effet ça se voit...)"
    Ça me fait peur ça...

    Si ton problème est de synchroniser le démarrage à la perfection (peut-être que la création des threads créerait un décalage trop important à tes yeux) alors fait plutôt attendre les threads avec une semaphore, et tu poste le signal depuis le thread principal lorsque tous les threads sont crées.

    Si c'est de synchroniser la capture en elle-même qui cause les décalages, n'utilise pas ce genre de code:
    très peu précis, mais plutôt ce code là: http://c.developpez.com/faq/?page=di...S_chronometrer

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    En fait Merci Mat.M, effectivement en utilisant direct sound, je peux utiliser directement la carte son sur plusieurs canaux, car elle est prévue pour être utilisée avec cette API. Donc je pense avoir résolu le problème sans avoir a m'occuper de threads ou autres. Merci A tous ceux qui m'ont répondu.

    Merci

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/03/2013, 16h29
  2. Réponses: 0
    Dernier message: 22/09/2010, 23h12
  3. Réponses: 1
    Dernier message: 02/07/2008, 20h46
  4. Réponses: 3
    Dernier message: 27/04/2007, 16h05
  5. Réponses: 4
    Dernier message: 28/07/2003, 15h50

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