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

FMOD Discussion :

Extraction des données


Sujet :

FMOD

  1. #1
    Membre à l'essai
    Homme Profil pro
    C++
    Inscrit en
    Octobre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : C++
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut Extraction des données
    Bonjour à tous,

    Je vien de commencer un nouveau projet perso qui utilise les signaux audio. Pour la recuperation du microphone j'utilise donc FMod, mais par la suite je cherche a recupere les données contenues dans le FMOD::Sound.

    Le probleme est que j'est essayé deja 2 méthode qui semble rependu sur le net (lock et readdata).
    - Pour ce qui est de readdata j'ais le retour FMOD_ERR_UNSUPPORTED (pour un sond wav).
    - et pour la methode utilisant la fonction lock, les données que j'obtien sont differente de celles que je peut obtenir avec le meme fichier sond sur matlab.

    Je poste cette derniere methode en esperant qu'une ame charitable pourra me venir en aide.

    Cordialement

    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
     
        FMOD_RESULT result;
        unsigned int lenbytes, len1, len2; 
        void *ptr1, *ptr2; 
     
        //recupretation de la taille
        Snd->getLength(&lenbytes, FMOD_TIMEUNIT_PCMBYTES);
     
        //lock
        result = Snd->lock(0, lenbytes, &ptr1, &ptr2, &len1, &len2);
     
        std::vector<double> buffer(len1);
        char* c = (char*)ptr1;
        for(int ii=0; ii<len1; ii++){
    	buffer[ii]=(double)*c ;
    	c++;
        } 
        //unlock
        Snd->unlock(ptr1, ptr2, len1, len2);

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    As-tu commencé par regarder le nombre de bits sous lequel étaient stockées les données ?
    Avec FMod : Sound::getFormat(), 4ème paramètre.
    Sous MATLAB : 3ème sortie de wavread.

    Attention sous MATLAB que le type retourné par défaut est le type double dans l'intervalle [-1 1]. Tu as le paramètre 'native' pour éviter cela.
    Dernière modification par Invité ; 28/05/2013 à 02h46.

  3. #3
    Membre à l'essai
    Homme Profil pro
    C++
    Inscrit en
    Octobre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : C++
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Merci de cette reponse, elle ma permie de m'interoger sur matlab et de regarder une peut plus profondement le fonctionnement des fonctions telque wavread().

    Le probleme venait principalement du cast en "char" et non en "unsigned char". Cette opperation ajouter au fait que selon le format wav il faut lire le ficher avec le principe "LSB MSB LSB MSB LSB ..."

    On optien alors une valeur binaire sur 4octets, que l'on passe sur 8octets pour avoir un double signé ^^

    ce qui nous donne :

    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
     
       Snd->getLength(&lenbytes, FMOD_TIMEUNIT_PCMBYTES);
        FMOD_SOUND_FORMAT format;
        FMOD_SOUND_TYPE type;
        int channel, bits;
        Snd->getFormat(&type, &format, &channel, &bits);
        FMOD_RESULT result;
        result = Snd->lock(0, lenbytes, &ptr1, &ptr2, &len1, &len2);
        //lecture du fichier hexa
        //le msb est en seconde position
        //si plusieur channels, les lsb sont ensemble, suivi des msb.
        std::vector<double> buffer;
        if(channel==1 && format == FMOD_SOUND_FORMAT_PCM16){ //si un seul channel et donnée sur 16bits
    	buffer.resize(lenbytes/2);//nombre données sur 16bits est 2 fois plus petit que le nombre de données sur 8bits
    	unsigned char* p = (unsigned char*)ptr1;
    	for(int ii=0; ii<lenbytes/2; ii++){
    	    //recuperation de la valeur binaire, et passage en double signée
    	    buffer[ii]=(double)(((unsigned char)(*(p+1))<<8 | (unsigned char)(*p) )<<16)/pow(2,16);
    	    //normalisation entre -1 et 1;
    	    buffer[ii]/=32768;
    	    p+=2;
    	} 
        }
        Snd->unlock(ptr1, ptr2, len1, len2);
    a+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RSS] extraction des données d'un flux
    Par toddy_101 dans le forum APIs
    Réponses: 4
    Dernier message: 23/02/2007, 17h28
  2. vc++(6)+extraction des données dans une image(.tif)
    Par spootnic22 dans le forum Visual C++
    Réponses: 1
    Dernier message: 22/11/2006, 16h14
  3. [MySQL] Problème de Charset à l'extraction des données
    Par naoufal01 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/11/2006, 13h14
  4. extraction des données dans une table Access
    Par moabomotal dans le forum Access
    Réponses: 2
    Dernier message: 26/05/2006, 11h17

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