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.
