lire dans un buffer audio - Programmation
Marsh Posté le 24-04-2002 à 14:00:42
J'ai comme l'impression que tu ne comprends pas vraiment ce que tu fais...
> hMem(i) = GlobalAlloc(&H40, BUFFER_SIZE);
tu alloues une zone de mémoire, qui va recevoir les données
> inHdr(i).lpData = GlobalLock(hMem(i))
dans la structure de type WAVEHDR, tu remplis le champs lpData avec l'adresse du buffer que tu viens d'allouer.
Au passage, l'utilisation des fonctions archi windowsiennes du type 'GlobalLock' me font ... sourire. Je trouve ça nul, mais là c'est un autre débat.
La doc (MSDN) te dis: "The GlobalLock function locks a global memory object and returns a pointer to the first byte of the object's memory block."
Donc heureusement que la variable hMem(i) et la variable inHdr(i).lpData ont la même valeure!
quand windows te rends le buffer, soit par callback soit par message (selon la méthode que tu utilises), alors le buffer pointé par inHdr(i).lpData contient les données.
Si tu veux travailler sur les données, il faut donc travailler sur le buffer en question, qui doit avoir une longeur valide de inHdr(i).dwBytesRecorded octets.
en C (désolé, je ne connais pas le VB), on ferait donc:
fwrite( (void *)inHdr(i).lpData, inHdr(i).dwBytesRecorded, 1, fp );
J'espère avoir été clair.
Marsh Posté le 24-04-2002 à 12:47:25
Salut
J'ai capturé un flux audio dans un double-buffer avec les api waveInOpen, et wavInAddBuffer.
J'ai maintenant besoin de lire dans ce buffer pour en récupérer les infos sur l'amplitude de la sinusoïde du son et faire des tests dessus. Mais je ne sais pas comment faire!
Le buffer a une structure WAVHDR comme suit:
(c'est en VB)
Type WAVEHDR 'Structure du buffer qui va contenir le flux audio
lpData As Long
dwBufferLength As Long
dwBytesRecorded As Long
dwUser As Long
dwFlags As Long
dwLoops As Long
lpNext As Long
Reserved As Long
End Type
Je sais pas ce que contient le champ lpData : l'adresse des données et du buffer ou alors les données proprement dites? J'ai vaguement l'impression qu'il s'agit d'un pointeur vers le segment mémoire alloué au buffer à cause des lignes de code suivantes:
hMem(i) = GlobalAlloc(&H40, BUFFER_SIZE)
inHdr(i).lpData = GlobalLock(hMem(i))
Toujours est il qu'en affichant à l'écran la variable hMem(i) et la variable inHdr(i).lpData j'obtiens la même chose... Je pense donc que le champ lpData n'est pas une zone contenant les données.
Du coup je sais pas comment récupérer ce qu'il ya dans le buffer...
Vous avez des idées?
---------------
Un fer à souder dans le cul ça fait mal.