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

C Discussion :

Recherche code d'un fifo,ou explication


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Recherche code d'un fifo,ou explication
    Mon probleme est le suivant, je fais de l'acquisition audio, pour l'instant j'utilise les fonctions de windows, pour la gestion du remplissage du buffer ......

    Etant donné q le résultat est des plus déroutants!! je voudrais réaliser un fifo ou tout autre méthode de manière à bufferisé le son en entrée.

    je veux stocker par exemple 10ko puis les envoyé sur un fichier.

    Le méthode d'acquisition est simple, on rempli un tempon de 4ko à chaque fois puis je l'écris sur le fichier.

    Maintenant je voudrais faire par exple stocker le tampon dans un fifo ou un biffeur circulaire de manière à pouvoir écrire et stocker en même tps, est ce possible???

    Si oui comment fait on un buffer circulaire et un fifo?

    J'ai bien cherché sur le forum mais rien .....

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Les seules fois ou j'ai entendu parler de FIFO ou de ciculaire c'etait dans la gestion des processus.

    FIFO, c'est First in first out
    Pour les processus, ca veut dire qu'on doit attendre la fin de l'execution du premier processus, pour ensuite passer au processus suivant, c'est un peu barbare comme technique.
    Je pense que dans ton cas ca voudrait dire que quand ton buffer est plein, tu vas virer ton premier octet pour decaler le reste du buffer vers le debut, comme ca l'octet de fin sera liberer pour une nouvelle copie (j'ai dis un octet mais tu peux aussi faire ca pour (2, 3 ou plus Octet);

    Circulaire, c'est en fait assez simple :
    Quand t as cinq processus actif en meme temps, tu vas leur donner 20% du CPU chacun(par exemple 200millisecondes / secondes chacun), ils ont donc tous le meme temps d'execution, quand y en a un qui se termine, on passe a 4 processus, donc ca sera 25% du proc chacun etc...
    La par contre je vois pas trop le rapport avec le son

    Voila, j espere que ca t auras un peu aider, a plus

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Pour être plus général :
    une FIFO est une structure de données qui se conduit comme une file
    d'attente : le premier à y rentrer sera le premier à en sortir.

    Plusieurs manières de procéder :
    1) tu mets tes données dans un tableau et dès que tu veux en sortir le premier élément, tu fais

    /* prend le premier élément de la FIFO */
    resultat=tableau[0];

    /* décale tous les autres éléments */
    for (i=0;i<taille_tableau-1;i++){tableau[i]=tableau[i+1];}

    /*le nbr d'élément total de la file à diminué*/
    taille_tableau--;

    Pb : le décalage de tous les éléments coûte cher...

    2) tu utilise une liste chaînée.

    typedef struct t_liste{
    int * data;
    liste * next;
    }

    tliste * liste;
    Pour extraire la première donnée tu fais :

    resultat=liste->data;
    liste=liste->next;

    Et pour insérer à la fin tu gardes un pointeur sur le dernier élément :
    tliste * fin_liste;

    insere(int * data){fin_liste->next=data;}

    Pb : il faut manier plein de pointeurs et utilise plus de memoire qu'un tableau

    3) le buffer circulaire te permet de"simuler" une FIFO avec un tableau.
    tu as ton tableau et 2 variables qui memorisent le premier et le dernier élément remplis dans le tableau (first et last).

    Pour inserer un element, il te suffit de l'ajouter en position
    (last+1) % taille_du_tableau
    et d'incrémenter last (last=(last+1)%taille du tableau)

    Pour prendre le premier élément, tu recuperes celui en position first
    et tu incrémentes first (first=(first+1)%taille_du_tableau).

    attention, il faut tester avant insertion si le tableau est plein:
    (first==(last+1)%taille_tableau)
    et avant de prendre un élément, tester s'il est vide :
    (first==(last-1)%taille_tableau)

    Pour bien apprendre le langage C lis les cours et tutoriels programmation C : http://c.developpez.com/cours/
    Un pour tous, tous BOURRINS !!!

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    merci, je vais essayer de voir quelles solutions correspond le mieux à mon besoin.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Question idiote
    [oh oui fouetez moi ]
    tu pe pas ecrire directe dans ton fichier ?
    _*----|OtAkU|----*_

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    la méthode du buffeur circulaire me sert également à la lecture. Tu ne peux pas lire et jouer un morceaux de 30 Mo en seule fois!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Au fait, etant en train de developper un jeu video, si t as de la doc sur des formats audio(wave ou mp3), et les specificites de leurs headers ainsi que les facon de les lires grace a la sound blaster, ca m'interesse grave.
    Merci !

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Link pour le format wav:

    super bien expliqué!

    http://ccrma-www.stanford.edu/CCRMA/Courses/422/projects/WaveFormat/

    des explications sur les API wavein et waveout:

    http://www.linuxtel.com/EPHONE/report/8_3.html
    http://www.borg.com/~jglatt/tech/lowaud.htm
    http://home.elka.pw.edu.pl/~mroj/homepage/works/mroj/html/audio/waveform.htm
    http://perso.wanadoo.fr/philippe.baucour/pratiquer/carteson/driver.html

    http://www.portaudio.com/
    http://home.elka.pw.edu.pl/~mroj/homepage/works/mroj/html/audio/waveform-audio.htm#CAPT-LOOP-CODE

    Sur tout ces liens on utilise les API windows, pour les jeux je pense qu'il est plus judicieux d'utilisé les fonctions directX

    Je t'ai mis tout les liens interressant que j'ai.


    Une petite question si tu pouvais y répondre, j'ai besoin de fabriquer une pile, peut tu m'envoyer un morceaux de code??


    @+

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    j'oubliais, en réponse à la question "tu peux pas lire directement dans ton fichier"
    et bien non il faut que je stock successivement le buffeur de manière à en avoir pour etre utilisé par une autre fonction qui va les lire et envoyes des morceaux vers un prog de compression et l'envoyer sur reseaux.

    Mon problème: je ne peux réaliser la capture audio qu'avec un buffeur de 1600octets. Au global je dois avoir une pile qui contient 5 buffeur = 8ko.

    je prendre dans ce buffeur par morceaux de 160 octet.

    Donc a chaque fois que j'irais chercher un buffer je dois le lire successivement 10 fois et aller ensuite lire les 5 autres!

    Donc il me faut faire une pile! ou une liste chainé avec destruction des éléments succéssivement ce qui est quasi une pile.


    Il me faut faire une pile, y aurait'il quelqu'un qui pourrait mettre un bout de code d'une pile.

    Thks

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

Discussions similaires

  1. [recherche] code::blocks tutorial
    Par kei-kun41 dans le forum Code::Blocks
    Réponses: 4
    Dernier message: 03/04/2006, 21h50
  2. [Tableaux] Recherche code php
    Par VFone dans le forum Langage
    Réponses: 7
    Dernier message: 28/03/2006, 16h11
  3. Réponses: 4
    Dernier message: 25/03/2006, 23h05
  4. [Irrlicht] recherche code (lire/afficher) fichier OBJ
    Par Husqvarna dans le forum Irrlicht
    Réponses: 3
    Dernier message: 14/03/2006, 11h19
  5. Recherche code source Photosticher
    Par mathieu_t dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/07/2004, 08h18

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