Procédure : utiliser des rappels de voix source
Lorsque vous créez une voix source, vous pouvez lui passer une structure qui définit les rappels pour certains événements audio. Vous pouvez utiliser ces rappels pour effectuer des actions ou signaler d’autres codes.
Créez une classe qui hérite de l’interface IXAudio2VoiceCallback . Toutes les fonctions membres d’IXAudio2VoiceCallback sont purement virtuelles et doivent être définies. La seule fonction intéressante dans cet exemple est OnStreamEnd. Par conséquent, le reste des fonctions sont des stubs. La fonction OnStreamEnd déclenche un événement qui indique que la lecture du son est terminée.
class VoiceCallback : public IXAudio2VoiceCallback { public: HANDLE hBufferEndEvent; VoiceCallback(): hBufferEndEvent( CreateEvent( NULL, FALSE, FALSE, NULL ) ){} ~VoiceCallback(){ CloseHandle( hBufferEndEvent ); } //Called when the voice has just finished playing a contiguous audio stream. void OnStreamEnd() { SetEvent( hBufferEndEvent ); } //Unused methods are stubs void OnVoiceProcessingPassEnd() { } void OnVoiceProcessingPassStart(UINT32 SamplesRequired) { } void OnBufferEnd(void * pBufferContext) { } void OnBufferStart(void * pBufferContext) { } void OnLoopEnd(void * pBufferContext) { } void OnVoiceError(void * pBufferContext, HRESULT Error) { } };
Créez une voix source avec IXAudio2::CreateSourceVoice à l’aide d’un instance de la classe de rappel créée précédemment en tant que paramètre pCallback.
VoiceCallback voiceCallback; if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
Après avoir démarré la voix, utilisez la méthode WaitForSingleObjectEx pour attendre que l’événement soit déclenché.
WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
Rubriques connexes