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.
Il doit y avoir plusieur erreurs dans mon code mais je n'arrive pas a les régler tout seul...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])); } } } } //---------------------------------------------------------------------------
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
-----