Mastersam
Messages postés116Date d'inscriptiondimanche 26 septembre 2004StatutMembreDernière intervention13 février 2008
-
22 oct. 2004 à 21:40
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 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.
Mastersam
Messages postés116Date d'inscriptiondimanche 26 septembre 2004StatutMembreDernière intervention13 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.