Cara: Menggunakan Panggilan Balik Suara Sumber
Saat membuat suara sumber, Anda dapat meneruskan struktur ke dalamnya yang menentukan panggilan balik untuk peristiwa audio tertentu. Anda dapat menggunakan panggilan balik ini untuk melakukan tindakan atau memberi sinyal kode lain.
Buat kelas yang mewarisi dari antarmuka IXAudio2VoiceCallback . Semua fungsi anggota IXAudio2VoiceCallback murni virtual, dan harus ditentukan. Satu-satunya fungsi yang menarik dalam contoh ini adalah OnStreamEnd. Oleh karena itu, fungsi lainnya adalah ganja. Fungsi OnStreamEnd memicu peristiwa yang menunjukkan suara selesai diputar.
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) { } };
Buat suara sumber dengan IXAudio2::CreateSourceVoice menggunakan instans kelas panggilan balik yang dibuat sebelumnya sebagai parameter pCallback.
VoiceCallback voiceCallback; if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
Setelah memulai suara, gunakan metode WaitForSingleObjectEx untuk menunggu peristiwa dipicu.
WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
Topik terkait