Callback di XAudio2

XAudio2 può chiamare le funzioni fornite dal client per notificarlo in modo asincrono di determinati eventi che si verificano nel thread di elaborazione audio. Questi callback possono essere globali o specifici di una determinata voce di origine. Per ricevere callback globali del motore, il client deve fornire un'istanza di una classe che implementa l'interfaccia IXAudio2EngineCallback durante l'inizializzazione di XAudio2. Per ricevere i callback vocali di origine, il client deve fornire un'istanza di una classe che implementa l'interfaccia IXAudio2VoiceCallback durante la creazione di voci di origine. Per altre informazioni, vedere IXAudio2EngineCallback e IXAudio2VoiceCallback.

È necessario implementare attentamente i callback per evitare interruzioni nell'audio. Ogni volta che viene eseguito un callback, XAudio2 non può generare alcun audio. I ritardi di più di pochi millisecondi possono causare un problema audio. I ritardi di questa natura generano anche l'output del debugger. Ciò indica potenziali problemi di prestazioni. Come minimo, le funzioni di callback non devono eseguire le operazioni seguenti:

  • Accedere al disco rigido o ad altre risorse di archiviazione permanenti
  • Effettuare chiamate API costose o bloccate
  • Sincronizzare con altre parti del codice client
  • Richiedere un utilizzo significativo della CPU

Se la progettazione del client richiede un callback per attivare azioni come quelle elencate in precedenza, il callback deve segnalare un thread client diverso per eseguire il lavoro. È possibile eseguire questa operazione con un semplice meccanismo SetEvent o meccanismi più sofisticati, ad esempio una coda di comandi non bloccante utilizzata da un altro thread.

IXAudio2EngineCallback

La classe IXAudio2EngineCallback contiene metodi che notificano al client quando si verificano determinati eventi nel motore XAudio2. Questi metodi devono essere implementati dal client XAudio2. XAudio2 chiama questi metodi tramite un puntatore di interfaccia fornito dal client usando il metodo IXAudio2::RegisterForCallbacks . Tutti questi metodi restituiscono void, anziché HRESULT.

IXAudio2VoiceCallback

La classe IXAudio2VoiceCallback contiene metodi che notificano al client quando si verificano determinati eventi in una voce di origine XAudio2 specifica. XAudio2 chiama questi metodi tramite un puntatore di interfaccia fornito dal client in IXAudio2::CreateSourceVoice. Come per IXAudio2EngineCallback, questi metodi devono essere implementati dal client XAudio2 e restituiscono void anziché HRESULT.

Come accennato in precedenza, è fondamentale che le implementazioni fornite dal client di questi callback vengano restituite il più rapidamente possibile, preferibilmente entro un millisecondo. I callback vengono eseguiti nel thread di elaborazione audio e tutte le elaborazioni vengono interrotte fino a quando il callback non viene restituito. Un ritardo in un callback può causare facilmente un problema audio.

Callback

Guida alla programmazione di XAudio2

Procedura: Usare callback di voci di origine

Procedura: Usare callback del motore

Procedura: Trasmissione di un suono in un flusso da disco