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. Um globale Engine-Rückrufe zu empfangen, muss der Client eine Instanz einer Klasse bereitstellen, die die IXAudio2EngineCallback-Schnittstelle implementiert, wenn XAudio2 initialisiert wird. Um Quellstimmenrückrufe zu empfangen, muss der Client eine Instanz einer Klasse bereitstellen, die beim Erstellen von Quellstimmen die IXAudio2VoiceCallback-Schnittstelle implementiert. Weitere Informationen finden Sie unter IXAudio2EngineCallback und IXAudio2VoiceCallback.

Sie müssen Rückrufe sorgfältig implementieren, um unterbrechungsverursachende Audiodaten zu vermeiden. Wenn ein Rückruf ausgeführt wird, kann XAudio2 keine Audiodaten generieren. Verzögerungen von mehr als einigen Millisekunden können zu einem Audioproblem führen. Verzögerungen dieser Art generieren auch eine Debuggerausgabe. Dies weist auf potenzielle Leistungsprobleme hin. Rückruffunktionen dürfen mindestens folgende Aufgaben nicht ausführen:

  • Zugreifen auf die Festplatte oder anderen permanenten Speicher
  • Durchführen von teuren oder blockierenden API-Aufrufen
  • Synchronisieren mit anderen Teilen des Clientcodes
  • Erhebliche CPU-Auslastung erforderlich

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 durchzuführen. Dazu können Sie einen einfachen SetEvent-Mechanismus oder komplexere Mechanismen wie eine Befehlswarteschlange ohne Blockierung verwenden, die von einem anderen Thread genutzt 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 Schnittstellenzeigers auf, der vom Client mit der IXAudio2::RegisterForCallbacks-Methode bereitgestellt wird. 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 Schnittstellenzeigers auf, der vom Client in IXAudio2::CreateSourceVoicebereitgestellt wird. Wie bei IXAudio2EngineCallbacksollten diese Methoden vom XAudio2-Client implementiert werden und void anstelle eines HRESULT zurückgeben.

Wie bereits erwähnt, ist es entscheidend, dass die vom Client bereitgestellten Implementierungen dieser Rückrufe so schnell wie möglich zurückgegeben werden, vorzugsweise innerhalb einer Millisekunde. Die Rückrufe werden im Audioverarbeitungsthread ausgeführt, und die gesamte Verarbeitung wird unterbrochen, bis der Rückruf zurückgegeben wird. 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