Procedura: Usare callback di voci di origine
Quando si crea una voce di origine, è possibile passare una struttura a essa che definisce i callback per determinati eventi audio. È possibile usare questi callback per eseguire azioni o per segnalare altro codice.
Creare una classe che eredita dall'interfaccia IXAudio2VoiceCallback . Tutte le funzioni membro di IXAudio2VoiceCallback sono puramente virtuali e devono essere definite. L'unica funzione di interesse in questo esempio è OnStreamEnd. Di conseguenza, le altre funzioni sono stub. La funzione OnStreamEnd attiva un evento che indica che il suono viene eseguito.
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) { } };
Creare una voce di origine con IXAudio2::CreateSourceVoice usando un'istanza della classe di callback creata in precedenza come parametro pCallback.
VoiceCallback voiceCallback; if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
Dopo aver avviato la voce, usare il metodo WaitForSingleObjectEx per attendere l'attivazione dell'evento.
WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
Argomenti correlati