방법: 원본 음성 콜백 사용

원본 음성을 만들 때 특정 오디오 이벤트에 대한 콜백을 정의하는 구조를 전달할 수 있습니다. 이러한 콜백을 사용하여 작업을 수행하거나 다른 코드에 신호를 표시할 수 있습니다.

  1. IXAudio2VoiceCallback 인터페이스에서 상속되는 클래스를 만듭니다. IXAudio2VoiceCallback의 모든 멤버 함수는 순전히 가상이며 정의되어야 합니다. 이 예제에서 유일하게 관심 있는 함수는 OnStreamEnd입니다. 따라서 나머지 함수는 스텁입니다. OnStreamEnd 함수는 소리가 재생되었음을 나타내는 이벤트를 트리거합니다.

    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) { }
    };
    
  2. 이전에 pCallback 매개 변수로 만든 콜백 클래스의 instance 사용하여 IXAudio2::CreateSourceVoice를 사용하여 원본 음성을 만듭니다.

    VoiceCallback voiceCallback;
    if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx,
                                 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
    
  3. 음성을 시작한 후 WaitForSingleObjectEx 메서드를 사용하여 이벤트가 트리거될 때까지 기다립니다.

    WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
    

콜백

XAudio2 콜백

XAudio2 프로그래밍 지침

방법: 기본 오디오 처리 그래프 빌드

방법: 디스크에서 소리 스트리밍