Probléme avec waveIn
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Probléme avec waveIn



  1. #1
    invite849f6457

    Unhappy Probléme avec waveIn


    ------

    Bonjour a tous,
    je programme avec c++ builder 6 et j'ai un souci avec les fonctions waveIn.
    Pas besoin de grand discours passons au code et je vous exposerez ce qui me géne aprés.
    Code:
    // ********************************************************
    // Déclaration des variables Globales
    // ********************************************************
    // Handle de la carte son
    static HWAVEIN hwi = NULL;
    // Structure pour les functions waveIn
    static WAVEFORMATEX wfx;
    static WAVEHDR wh[NB_BUFFER];
    // Buffers de capture
    static short Buffer[NB_BUFFER][TAILLE_BUFFER / 2], BufferTmp[TAILLE_BUFFER / 2] = {0};
    int Enregistrement=0;
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int i;
    Enregistrement = 1;
    
    // On regarde s'il y a au moins une carte son
    if ( waveInGetNumDevs() <= 0)
      {
      Memo3->Lines->Add("ERREUR\r\nIl n'y a pas de carte son");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nCarte son détectée");
      }
    
    // Preparation des formats pour la carte son
    wfx.wFormatTag = WAVE_FORMAT_PCM;
    wfx.nChannels = 1;                  // Mono
    wfx.nSamplesPerSec = 44100;         // Frequence d'echantillonnage
    wfx.wBitsPerSample = 16;            // Dynamique
    wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample) / 8; // C'est MSDN qui l'a dit
    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; // Ca aussi
    
    // Ouverture de la carte son
    if ( waveInOpen(&hwi, 0, &wfx, 0, 0,   WAVE_MAPPED) != MMSYSERR_NOERROR )
      {
      Memo3->Lines->Add("ERREUR\r\nProblème a l'ouverture de la carte son");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nCarte son ouverte");
      }
    
    // Pour chaque buffer
    for(i=0; i<NB_BUFFER; i++)
      {
      // Preparation de la structure
      wh[i].lpData = (char*)Buffer[i];
      wh[i].dwBufferLength = TAILLE_BUFFER;
      wh[i].dwBytesRecorded = 0;
      wh[i].dwUser = 0;
      wh[i].dwFlags = 0;
      wh[i].dwLoops = 0;
      wh[i].lpNext = 0;
      wh[i].reserved = 0;
      // Preparation des entetes
      if ( waveInPrepareHeader(hwi, &wh[i], sizeof(wh[i])) == MMSYSERR_NOERROR)
        {
        Memo3->Lines->Add("OK\r\nPréparation des buffers ok");
        }
      else
        {
        Memo3->Lines->Add("ERREUR\r\nImpossible de préparer les buffers");
        }
      // Ajout
      if ( waveInAddBuffer(hwi, &wh[i], sizeof(wh[i])) == MMSYSERR_NOERROR)
        {
        Memo3->Lines->Add("OK\r\nAjout des buffers");
        }
      else
        {
        Memo3->Lines->Add("ERREUR\r\nImpossible d'ajouter les buffers");
        }
      }
    //commencer l'acquisition
    if ( waveInStart(hwi) != MMSYSERR_NOERROR )
      {
    Memo3->Lines->Add("ERREUR\r\nProblème d'acquisition");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nEn cours d'acquisition");
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Enregistrement=0;
    //arréter l'acquisition
    
    if ( waveInReset(hwi) != MMSYSERR_NOERROR )
      {
    Memo3->Lines->Add("ERREUR\r\nImpossible de reset la carte son");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nReset de la carte son");
      }
    if ( waveInStop(hwi) != MMSYSERR_NOERROR )
      {
    Memo3->Lines->Add("ERREUR\r\nImpossible d'arréter l'acquisition");
      }
    else
      {
      Memo3->Lines->Add("OK\r\nAcquisition arréter");
      }
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    int i = 0;
    if ( Enregistrement == 1 )
      {
      for (i=0; i<NB_BUFFER; i++)
        {
        if ( wh[i].dwFlags == 3 ) //normalement if ( wh[i].dwFlags == WHDR_DONE )
          {
          Memo4->Lines->Add(wh[i].lpData);
          wh[i].lpData="";
          wh[i].dwFlags = 0;
          waveInAddBuffer(hwi, &wh[i], sizeof(wh[i]));
          }
        }
      }
    }
    //---------------------------------------------------------------------------
    Il doit y avoir plusieur erreurs dans mon code mais je n'arrive pas a les régler tout seul...
    Lors de la préparation de la structure j'ai réglé le flag des buffers a 0 " wh[i].dwFlags = 0;" comme indiqué par msdn pour le réaliser waveInPrepareHeader. Msdn dit aussi que lorsque le tampon est plein le flag passe a WHDR_DONE, Pour ma part ils ne passe jamais par cette valeur (1er probléme).
    En mode pas a pas j'ai remarque que lorsqu'il y avais des donnée dans le buffer le flag passe a 3 c'est pour cela que pour les tests lors de l'événement timer j'ai mis cette valeur .
    J'affiche les données des buffers sur le memo 1 fois uniquement et ensuite plus rien. Je pensais qu'aprés la lecture du buffer avec la commande "waveInAddBuffer" le buffer se remettrer a l'écoute mais ce n'es pas le cas (2em probléme).
    Je pense que cela est du a la commande "waveInOpen", je n'ai pas définis de Callback , car je n'ai pas bien compris les explications de msdn et je ne vois pas comment faire .
    Je me pose aussi une autre question, comment sont rempli les buffers. On rempli le premier que l'on a posé sur le flux, une fois qu'il est plein on rempli le deuxiéme, le temp du remplissage du 2em on a eu le temp de traiter les données du 1er et on l'a remis sur le flux.
    Pour le code ici j'utilise 3 buffers car j'ai lu que pour le son en mono il en fallais au moin 2.
    Bon bah voila... cela fait beaucoup de question mais je me suis pris la téte la dessus toute la soirée et un petit coup de pouce serai le bienvenu.

    Merci d'avance pour votre aide.
    Cordialement charléne

    -----

  2. #2
    invite849f6457

    Re : Probléme avec waveIn

    Personne pour étre ma muse, l'inspiration me fait defaut...

  3. #3
    DomiM

    Re : Probléme avec waveIn

    Bonjour,

    Code:
    MMRESULT waveInOpen(
      LPHWAVEIN       phwi,      
      UINT_PTR       uDeviceID,  
      LPWAVEFORMATEX pwfx,       
      DWORD_PTR      dwCallback, 
      DWORD_PTR      dwCallbackInstance, 
      DWORD          fdwOpen     
    );
    Effectivement ça ne marche pas avec un timer mais avec une function Callback

    C'est simple,

    Function waveInProc()
    {
    }


    waveInOpen(&hwi, WAVE_MAPPER, &wfx,(DWORD_PTR)waveInProc, (DWORD_PTR)this, CALLBACK_FUNCTION);

    http://msdn.microsoft.com/en-us/library/aa908147.aspx
    Dernière modification par yoda1234 ; 08/01/2011 à 08h22.
    Mesurer la masse de la situation permettrait de connaitre sa gravité :)

  4. #4
    DomiM

    Re : Probléme avec waveIn

    Il y a une exemple dans code source mais il fonctionn avec sa fenetre au lieu d'une fonction car c'est paramétrable
    http://www.cppfrance.com/codes/ENREG...OPE_20170.aspx

    fdwOpen :
    CALLBACK_FUNCTION
    The dwCallback parameter is a callback procedure address.
    CALLBACK_WINDOW
    The dwCallback parameter is a window handle.

    donc tu choisis comment tu veux traiter tes messages...
    Mesurer la masse de la situation permettrait de connaitre sa gravité :)

  5. A voir en vidéo sur Futura
  6. #5
    invite849f6457

    Re : Probléme avec waveIn

    Bonjour DomiM,
    merci d'avoir prit quelques minute pour moi, car éffectivement l'utilisation du timer n'est pas la bonne méthode, mais je ne savais pas comment faire autrement.
    Lors de ma traduction de msdn j'avais du mal comprendre car lorsque le buffer est plein le flag est bien a 3 et pas WHDR_DONE qui vaut 1.
    Mon premier probléme été une erreur de traduction
    Ensuite les buffers se remplisse dans l'ordre dans lequel on les a mis (normal, mais j'avais un doute a cause d'une erreur dans mon code).
    Maintenant pour la fonction callback, j'ai trouver sur le net un programme que j'ai modifié pour mon appli.
    cela dit il y a des parties que je n'ai pas compris (je suis novice) et si vous aviez des explications pour que je puisse bien comprendre le fonctionnement.
    Code:
    waveInOpen(&WaveHandle, WAVE_MAPPER, &WaveFormat, MAKELONG(Handle, 0), 0, CALLBACK_WINDOW)
    Pour le callback j'ai mis CALLBACK_WINDOW, donc il se fait sur un handle de fenétre window, donc "MAKELONG (Handle,0)" veut dire que je fait le callback sur l'handle de la fenétre de mon programme.
    Mais c'est un peut flou pour moi, MAKELONG???

    dans le .h
    Code:
    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(MM_WIM_DATA, TMessage, OnWaveMessage)
      END_MESSAGE_MAP(TForm)
    Dans le .cpp j'ai un événement OnWaveMessage, ou je lis et remet le buffer sans probléme .
    Mais j'aimerais bien comprendre comment fonctionne le code du .h

    Cordialement
    charléne

  7. #6
    DomiM

    Re : Probléme avec waveIn

    Bonjour

    Dans le .h c'est une macro évènementielle qui permet de dispacher les évènement sur les fonction qui les gèrent
    Les plus utiliser étant ONKeyDown OnMousMove ou OnLButtonDown
    C'est la base de la programmation évènementielle qui évite une boucle dans le main du programme
    mais on peut aussi surcharger la fonction
    LRESULT CALLBACK WndProc (HWND hWnd, UINT message, wParam wParam, lParam LPARAM)
    ou en MFC
    virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );
    Dans ce cas message contient WM_KEYDOWN ou WM_MOUSEMOVE ...
    ou MM_WIM_DATA
    Mesurer la masse de la situation permettrait de connaitre sa gravité :)

  8. #7
    invite849f6457

    Re : Probléme avec waveIn

    Bonjour DomiM;
    et merci pour ces précieuse explications.

    cordialement
    charléne

Discussions similaires

  1. Réponses: 10
    Dernier message: 22/03/2009, 11h34
  2. [Blanc] Probleme avec tele Philips avec chassis L01.E
    Par LEDOCTEUR dans le forum Dépannage
    Réponses: 2
    Dernier message: 20/03/2009, 19h27
  3. Probleme avec la connection USB avec PC sous linux !! !
    Par invite36d52cc8 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 12/12/2008, 22h45
  4. [Biologie Moléculaire] Problème avec gel d'acrylamide avec urée
    Par fxmulder dans le forum Biologie
    Réponses: 3
    Dernier message: 14/02/2008, 11h53
  5. probleme avec vista -> lecture du son avec fichier .mpg
    Par invite7f1547ae dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 23/01/2008, 23h28