Callback avec CALLBACK_WINDOW, waveOutOpen [Résolu]

Messages postés
18
Date d'inscription
mardi 29 avril 2008
Dernière intervention
17 janvier 2009
- - Dernière réponse : csauvane
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Dernière intervention
17 janvier 2009
- 12 janv. 2009 à 16:30
Bonjour,

Je suis en pleine réalisation d'un petit projet pour manipuler les fichiers wave. J'ai réussi à faire les fonctions nécessaires pour ouvrir le fichier et le lire avec les fonction waveOut... de l'API windows. J'ai maintenant un nouveau problème : j'ai mis en place une fonction de callback, mais elle ne s'exécute pas (le code me semble bon en comparant aux diverses sources que j'ai et la doc ne contredit pas ce code).

in the class (into .h file) :
Code :

public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(MM_WOM_DONE, TMessage, onWaveDone)
END_MESSAGE_MAP(TForm)

in the .cpp file :
Code :

void TForm1::onWaveDone(TMessage& msg) // as a waveClose() function
{
// We only care about the WOM_DONE message.
// When we get this message we know that the
// sound has finished playing. We can then
// unprepare the header and close the device.

if (msg.Msg == WOM_DONE) {
int Res = waveOutUnprepareHeader(projectWaveHandle, &projectWaveHeader, sizeof(WAVEHDR));
Memo1->Lines->Add("Playback finished : header unprepared");
CheckWaveError(Res);
Res = waveOutClose(projectWaveHandle);
Memo1->Lines->Add("Wave closed");
CheckWaveError(Res);
}
}

Quand je lance waveOutOpen :
Code :

bool TForm1::openWave()
{

// Query the device and see if it can play
// this wave format. If so, open the device.
int Res = waveOutOpen(&projectWaveHandle, WAVE_MAPPER, &projectFormat, 0, 0, WAVE_FORMAT_QUERY);
Memo1->Lines->Add("Device checked");
CheckWaveError(Res);

// we have to use a callback function when we play, to detect the end
// CALLBACK_WINDOW tells Windows that we want any wave-out messages sent to our form's window procedure
// so the form will treat this callback with onWaveDone()

if(waveOutOpen(&projectWaveHandle, WAVE_MAPPER, &projectFormat, 0, 0, CALLBACK_WINDOW)!= MMSYSERR_NOERROR)
{
return false;
}
return true;
}

enfin, la fonction waveOutWrite est exécutée juste après l'appel de la fonction openWave(). Je ne vois pas d'où ne viens pas l'exécution ??

Des idées ??

Merci
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
29
Date d'inscription
samedi 1 décembre 2007
Dernière intervention
11 avril 2010
3
Merci
salut, vue ton code tu dois surement utiliser Cbuilder, a mon avis il fodrai que tu passes le Handle de ta fenêtre à la fonction pour recevoir ton callback
dc utilise ceci : waveOutOpen(&projectWaveHandle, WAVE_MAPPER, Handle, 0, 0, CALLBACK_WINDOW)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_goodboy21
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Dernière intervention
17 janvier 2009
3
Merci
Salut !

Oui ! la réponse est effectivement

waveOutOpen(&projectWaveHandle, WAVE_MAPPER, &projectFormat, MAKELONG(GetActiveWindow(), 0), 0, CALLBACK_WINDOW)

a la place de

waveOutOpen(&projectWaveHandle, WAVE_MAPPER, &projectFormat, 0, 0, CALLBACK_WINDOW)

donc, là ou tu met "Handle" : MAKELONG(GetActiveWindow(), 0)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de csauvane

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.