Thread de capture audio

Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008 - 22 oct. 2004 à 21:40
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 23 oct. 2004 à 12:49
bonjour, suite à un gros problème sur le tracé de l'enveloppe du signal provenant de la carte son où l'arrivée d'un buffer déclenchait le redraw du graphe, je veux expérimenter une nouvelle méthode : la création d'un thread.

j'ai créé mon lancement de thread, et sa procédure mais j'ai un
problème je ne sais pas comment récuperer les messages envoyés par la carte son et windows.

voilà la procédure :

DWORD WINAPI threadcaptaudio(LPVOID lParam) {
MSG message;size_t i 0, k 0, j=0;short speed;

// Preparation des formats pour la carte son
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 1; // Stereo
wfx.nSamplesPerSec = 11025; // 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, (DWORD)threadcaptaudio, 0, CALLBACK_FUNCTION|WAVE_FORMAT_DIRECT)!= MMSYSERR_NOERROR)
{
MessageBox(NULL, "Problème a l'ouverture de la carte son", "Erreur", MB_OK);

}

while (GetMessage (&message, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&message);
/* Send message to WindowProcedure */
DispatchMessage(&message);

switch (message)
{
case MM_WIM_OPEN:
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 = WHDR_DONE;
wh[i].dwLoops = 0;
wh[i].lpNext = 0;
wh[i].reserved = 0;
// Preparation des entetes
waveInPrepareHeader(hwi, &wh[i], sizeof(wh[i]));
// Ajout
waveInAddBuffer(hwi, &wh[i], sizeof(wh[i]));
}
// Demarrage de la carte son
waveInStart(hwi);
return 0;

case MM_WIM_DATA:
// On copie dans un buffer temporaire pour la representation graphique
CopyMemory(BufferTmp, ((PWAVEHDR)lParam)->lpData, ((PWAVEHDR)lParam)->dwBytesRecorded);
waveInAddBuffer(hwi, ((PWAVEHDR)lParam), sizeof(WAVEHDR));
//on calcule une vitesse de défilement
speed=TAILLE_BUFFER/9;
//On fait baisser le max automatiquement (sert pour l'echelle du graphique)
max=(2*max+20000)/3;
min=(2*min+8000)/3;
//On reli la mémoire des 310 dernières moyennes d'échantillons
// et de valeur du beat on les décale pour laisser la place aux nouvelles valeurs
for(i=0; i<(310-(TAILLE_BUFFER / (2*speed))); i++)
{
sound[i]=sound[i+(TAILLE_BUFFER / (2*speed))];
beat[i]=beat[i+(TAILLE_BUFFER / (2*speed))];
if(sound[i]>max){max=(2*max+sound[i])/3;}
if(sound[i]<min){min=(2*min+sound[i])/3;}
}


moyenne=7*(4*max+min)/50;
//là on lit le buffer on fait la moyenne de groupes d'échantillons
for(i=0; i<(TAILLE_BUFFER / (2*speed)); i++)
{
sum=0;
for(k=speed*i; k<speed*(i+1); k++)
{
sum+=abs(BufferTmp[k]);
}
sum=sum/(speed);
sound[310-(TAILLE_BUFFER / (2*speed))+i]=(2*sound[310-(TAILLE_BUFFER / (2*speed))+i-1]+sum)/3;
//puis on procède à la détection du beat
sum=0;
for(j=0; j<10; j++)
{
sum+=sound[310-(TAILLE_BUFFER / (2*speed))+i-j];
}
sum=sum/10;
if(sum>=moyenne+limithi)
{
beat[310-(TAILLE_BUFFER / (2*speed))+i]=1;
}
if(sum<=moyenne+limitlow)
{
beat[310-(TAILLE_BUFFER / (2*speed))+i]=0;
}
}

return 0;


}}

}

elle sert à capturer des échantillons à en faire une moyenne et a les enregistrer dans un tableau, puis le but final va être de déterminer le tempo de la musique passant sur la carte son.

Le problème pour l'instant est juste de savoir comment récupérer mes messages. switch (message) me donne une erreur de compilation car il faut que message soit un entier mais je sais pas comment l'obtenir.

merci d'avance à tous.

http://www.rc-bot.com

3 réponses

cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
23 oct. 2004 à 08:13
Bonjour,

A ma connaissance, ta boucle d'attente des messages doit être indépendante du traitement des messages !

jmh
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
23 oct. 2004 à 10:11
Ben je sais pas trop, c'est la première fois que je fais un thread, j'ai cherché hier et je n'ai trouvé que des exemple ou le thread faisait quelquechose de son coté mais sans analyser de message or moi je suis obligé de savoir quand le buffer de la carte son est plein .

Je dois la mettre comment ma boucle de message ? Le thread doit être invisible, pas de nouvelle fenêtre, il doit vraiment tourner en tache de fond.

http://www.rc-bot.com
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 oct. 2004 à 12:49
Va voir le chapitre 22 du livre de Petzold
0
Rejoignez-nous