XAudio2-Rückrufe

XAudio2 kann vom Client bereitgestellte Funktionen aufrufen, um ihn asynchron über bestimmte Ereignisse zu benachrichtigen, die im Audioverarbeitungsthread stattfinden. Diese Rückrufe können global oder spezifisch für eine bestimmte Quellstimme sein. Zum Empfangen globaler Engine-Rückrufe muss der Client beim Initialisieren von XAudio2 eine instance einer Klasse bereitstellen, die die IXAudio2EngineCallback-Schnittstelle implementiert. Zum Empfangen von Quell-VoIP-Rückrufen muss der Client eine instance einer Klasse bereitstellen, die beim Erstellen von Quellstimme die IXAudio2VoiceCallback-Schnittstelle implementiert. Weitere Informationen finden Sie unter IXAudio2EngineCallback und IXAudio2VoiceCallback.

Sie müssen Rückrufe sorgfältig implementieren, um Audiounterbrechungen zu vermeiden. Wenn ein Rückruf ausgeführt wird, kann XAudio2 kein Audio generieren. Verzögerungen von mehr als wenigen Millisekunden können ein Audioproblem verursachen. Bei Verzögerungen dieser Art wird auch die Debuggerausgabe generiert. Dies deutet auf potenzielle Leistungsprobleme hin. Rückruffunktionen dürfen mindestens nicht wie folgt funktionieren:

  • Zugreifen auf die Festplatte oder auf einen anderen dauerhaften Speicher
  • Ausführen teurer oder blockierende API-Aufrufe
  • Synchronisieren mit anderen Teilen des Clientcodes
  • Erfordern eine erhebliche CPU-Auslastung

Wenn der Cliententwurf einen Rückruf erfordert, um Aktionen wie die zuvor aufgeführten auszulösen, sollte der Rückruf einen anderen Clientthread signalisieren, um die Arbeit zu erledigen. Sie können dies mit einem einfachen SetEvent-Mechanismus oder komplexeren Mechanismen wie einer nicht blockierenden Befehlswarteschlange tun, die von einem anderen Thread verwendet wird.

IXAudio2EngineCallback

Die IXAudio2EngineCallback-Klasse enthält Methoden, die den Client benachrichtigen, wenn bestimmte Ereignisse in der XAudio2-Engine auftreten. Diese Methoden sollten vom XAudio2-Client implementiert werden. XAudio2 ruft diese Methoden mithilfe eines Vom Client bereitgestellten Schnittstellenzeigers mit der IXAudio2::RegisterForCallbacks-Methode auf. Alle diese Methoden geben void anstelle eines HRESULT zurück.

IXAudio2VoiceCallback

Die IXAudio2VoiceCallback-Klasse enthält Methoden, die den Client benachrichtigen, wenn bestimmte Ereignisse in einer bestimmten XAudio2-Quellstimme auftreten. XAudio2 ruft diese Methoden mithilfe eines Vom Client bereitgestellten Schnittstellenzeigers in IXAudio2::CreateSourceVoice auf. Wie bei IXAudio2EngineCallback sollten diese Methoden vom XAudio2-Client implementiert werden und anstelle eines HRESULTvoid zurückgeben.

Wie bereits erwähnt, ist es von entscheidender Bedeutung, dass die vom Client bereitgestellten Implementierungen dieser Rückrufe so schnell wie möglich zurückkehren, vorzugsweise innerhalb einer Millisekunde. Die Rückrufe werden im Audioverarbeitungsthread ausgeführt, und die gesamte Verarbeitung wird unterbrochen, bis der Rückruf zurückgibt. Eine Verzögerung bei einem Rückruf kann leicht zu einem Audioproblem führen.

Rückrufe

XAudio2-Programmieranleitung

So wird's gemacht: Verwenden der Rückrufe für Quellstimmen

So wird's gemacht: Verwenden der Modulrückrufe

So wird's gemacht: Streamen von Sound von einem Datenträger