XAudio2 콜백

XAudio2는 클라이언트에서 제공하는 함수를 호출하여 오디오 처리 스레드에서 발생하는 특정 이벤트를 비동기적으로 알릴 수 있습니다. 이러한 콜백은 전역 또는 지정된 원본 음성에 한정될 수 있습니다. 전역 엔진 콜백을 받으려면 클라이언트는 XAudio2를 초기화할 때 IXAudio2EngineCallback 인터페이스를 구현하는 클래스의 instance 제공해야 합니다. 원본 음성 콜백을 받으려면 클라이언트는 원본 음성을 만들 때 IXAudio2VoiceCallback 인터페이스를 구현하는 클래스의 instance 제공해야 합니다. 자세한 내용은 IXAudio2EngineCallbackIXAudio2VoiceCallback을 참조하세요.

오디오가 중단되는 것을 방지하기 위해 콜백을 신중하게 구현해야 합니다. 콜백이 실행될 때마다 XAudio2는 오디오를 생성할 수 없습니다. 몇 밀리초 이상 지연되면 오디오 문제가 발생할 수 있습니다. 이러한 특성의 지연은 디버거 출력도 생성합니다. 이는 잠재적인 성능 문제를 나타냅니다. 최소한 콜백 함수는 다음을 수행해서는 안 됩니다.

  • 하드 디스크 또는 기타 영구 스토리지에 액세스
  • 비용이 많이 들거나 API 호출을 차단합니다.
  • 클라이언트 코드의 다른 부분과 동기화
  • 상당한 CPU 사용량 필요

클라이언트 디자인에서 이전에 나열된 작업과 같은 작업을 트리거하기 위해 콜백이 필요한 경우 콜백은 작업을 수행하도록 다른 클라이언트 스레드에 신호를 보내야 합니다. 이 작업은 간단한 SetEvent 메커니즘 또는 다른 스레드에서 사용하는 비블로킹 명령 큐와 같은 보다 정교한 메커니즘을 사용하여 수행할 수 있습니다.

IXAudio2EngineCallback

IXAudio2EngineCallback 클래스에는 XAudio2 엔진에서 특정 이벤트가 발생할 때 클라이언트에 알리는 메서드가 포함되어 있습니다. 이러한 메서드는 XAudio2 클라이언트에서 구현해야 합니다. XAudio2는 IXAudio2::RegisterForCallbacks 메서드를 사용하여 클라이언트에서 제공하는 인터페이스 포인터를 통해 이러한 메서드를 호출합니다. 이러한 모든 메서드는 HRESULT가 아닌 void를 반환합니다.

IXAudio2VoiceCallback

IXAudio2VoiceCallback 클래스에는 특정 XAudio2 원본 음성에서 특정 이벤트가 발생할 때 클라이언트에 알리는 메서드가 포함되어 있습니다. XAudio2는 IXAudio2::CreateSourceVoice에서 클라이언트에서 제공하는 인터페이스 포인터를 통해 이러한 메서드를 호출합니다. IXAudio2EngineCallback과 마찬가지로 이러한 메서드는 XAudio2 클라이언트에서 구현되고 HRESULT가 아닌 void를 반환해야 합니다.

앞에서 설명한 것처럼 이러한 콜백의 클라이언트 제공 구현은 가능한 한 빨리(가급적) 밀리초 내에 반환하는 것이 중요합니다. 콜백은 오디오 처리 스레드에서 실행되며 콜백이 반환될 때까지 모든 처리가 중단됩니다. 콜백이 지연되면 오디오 문제가 쉽게 발생할 수 있습니다.

콜백

XAudio2 프로그래밍 지침

방법: 원본 음성 콜백 사용

방법: 엔진 콜백 사용

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