Callback XAudio2
XAudio2 può chiamare le funzioni fornite dal client per notificare in modo asincrono determinati eventi che si svolgono nel thread di elaborazione audio. Questi callback possono essere globali o specifici di una determinata voce di origine. Per ricevere i callback globali del motore, il client deve fornire un'istanza di una classe che implementa l'interfacciaIXAudio2EngineCallbackdurante 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 con attenzione i callback per evitare di causare interruzioni nell'audio. Ogni volta che un callback è in esecuzione, 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
- Eseguire la sincronizzazione 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 di 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é un 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é un 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.
Argomenti correlati