begin process at 2012 05 30 13:44:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

thread de capture audio


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

thread de capture audio

vendredi 22 octobre 2004 à 21:40:37 | thread de capture audio

Mastersam

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.



samedi 23 octobre 2004 à 08:13:08 | Re : thread de capture audio

jmhC

Membre Club
Bonjour,

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

jmh
samedi 23 octobre 2004 à 10:11:03 | Re : thread de capture audio

Mastersam

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.



samedi 23 octobre 2004 à 12:49:24 | Re : thread de capture audio

vecchio56

Administrateur CodeS-SourceS
Va voir le chapitre 22 du livre de Petzold


Cette discussion est classée dans : message, carte, thread, max, wfx


Répondre à ce message

Sujets en rapport avec ce message

terminer un thread? [ par leprov ] salut a tous.bon voila le pb, jai une dialogbox avec un thread d'initialisation de cette dialogbox, et je voudrais dans certains cas interrompre bruta Reception multiple dans PeeKMessage [ par sephiro ] BonjourVoici mon probleme:J'envoie un message à un Thread que je viens de créé (pas de probleme) Ptr_Thread=CreateThread(NULL,NULL,Thread_DownLoad,(LP Envoi d'un message Broadcast quand la carte reseau n'a pas d'IP [ par dunecann ] Bonjour,J'essaie de broadcaster un message DHCP alors que la carte reseau n'a pas d'adresse IP (apres un ipconfig /release) sur windows XP SP2.J'utili PostThreadMessage [ par anonyme_man_in_this_world ] salut !! j'ai cree un thread(a part WinMain) et je voudrais que le thread envoie un message à WinMain ,j'ai fait des recherches , j'ai tro LAN Socket et multi thread [ par RV2931 ] Bonjour, Je suis en train d'essayer de faire un chat en réseau, chaque machine est client/serveur sur un port. Mais on m'a conseillé de faire un threa Linux Variable passé a un Thread [ par mikoo74 ] Bonjour.Voila je doit envoyé une chaine a un Thread.  je fait:********************************char * message;message = new char [1000];if (pthread_cre Envoi de message à windowProcedure [ par mohdaef ] Bonsoir Je souhaite envoyer un message personalisé depuis un thread à windowProcedure(...), pour qu'il soit traité comme n'importe quel autre message Threads, fonction et mutex ? [ par Adict ] bonjour à tout le monde [^^happy13] dans mon projet de créer un tchat il faut que j'applique sur le client un thread qui exécute une autre fonction q Linux C++ Thread [ par mikoo74 ] Salut All !voila j'aimerais me renseigner un peu sur les Thread...Je dois developper un prog qui recupere des message sur un port et qui les traite.se


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,200 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales