Udostępnij przez


Debugowanie błędów dźwiękowych w programie XAudio2

Błędy mogą wystąpić w programie XAudio2, w tym temacie opisano sposób ich zgłaszania i niektóre podejścia do ich naprawiania.

W tym omówieniu omówiono następujące tematy:

Przyczyny problemów z wyjściem audio lub usterki

Usterki mogą wystąpić w danych wyjściowych XAudio2 z kilku powodów.

  • Głos źródłowy XAudio2 jest głodny. Klient nie przesyła świeżego dźwięku do niego wystarczająco szybko. Masz ciszę, ponieważ nie ma żadnych danych do odtwarzania.
  • XAudio2 jako całość jest przeciążona. Produkcja dźwięku o długości X ms trwa dłużej niż X ms. Dostajesz przerwy w dźwięku, ponieważ XAudio2 nie może generować danych tak szybko, jak potrzebuje tego urządzenie audio. Możesz uruchamiać zbyt wiele głosów lub efektów jednocześnie, wykonywać zbyt intensywną pracę podczas wywołań zwrotnych XAudio2, lub zbyt często używać wywołań w interfejsie API XAudio2.
  • Wątek przetwarzania dźwięku zatrzymuje się, ponieważ implementacja niektórych wywołań zwrotnych XAudio2 przez klienta wykonuje czynności, które mogą zablokować wątek. Może to być na przykład uzyskiwanie dostępu do dysku, synchronizowanie z innymi wątkami lub wywoływanie innych funkcji, które mogą blokować. Użyj wątku w tle o niższym priorytecie, który może być sygnalizowany przez wywołanie zwrotne do wykonywania takich zadań.
  • System jako całość jest przeciążony. Inne wątki działające w tym samym lub wyższym priorycie niż XAudio2 wykonują zbyt wiele pracy. Konkurują one z wątkiem audio o czas procesora.

Jak program XAudio2 zgłasza problemy

XAudio2 może sygnalizować błędy w wersji debugowej na kilka sposobów.

  • Jeśli kanał głosowy jest zablokowany, XAudio2 wyświetla komunikat w tej formie.

    XAudio2: WARNING: Voice at 0xNNNNNNNN starved: no more source buffers are available, but no end-of-stream marker was received
    
  • Jeśli wątek audio trwa zbyt długo, XAudio2 wyświetla komunikat w takim formacie.

    XAudio2: WARNING: Spent Xms in audio thread; XAudio2 possibly overloaded
    

    Zazwyczaj ten komunikat występuje z następnym komunikatem.

  • Jeśli sterownik audio nie może otrzymać nowych danych dźwiękowych na czas, XAudio2 wyświetla komunikat w takiej formie.

    XAudio2: WARNING: Glitch at output sample X
    
  • Wywoływanie IXAudio2::GetPerformanceData dostarcza dane dotyczące wydajności XAudio2, w tym łączną liczbę usterek od czasu zainicjowania silnika XAudio2.

Podejścia do rozwiązywania problemów

Możliwe sposoby zmniejszenia usterki audio obejmują następujące.

  • W przypadku głodu głosowego: zwiększ ilość danych audio, które są kolejkowane do przodu na głos. Możesz użyć IXAudio2SourceVoice::GetState, aby sprawdzić liczbę buforów w kolejce w dowolnym momencie. Jeśli nadal widzisz błędy głodu głosowego, ale nie słyszysz żadnych usterek, upewnij się, że ustawiono XAUDIO2_BUFFER.flagi, aby XAUDIO2_END_OF_STREAM na ostatnim buforze dźwięku. Informuje to XAudio2, że nie powinno się spodziewać dostępności kolejnych buforów automatycznie po zakończeniu obecnego.

    W innych przypadkach:

    • Zmniejsz liczbę aktywnych głosów i efektów na wykresie, szczególnie kosztowne efekty, takie jak reverb.
    • Wyłącz głosy i efekty, których nie używasz.
    • Użyj flag XAUDIO2_VOICE_NOSRC i XAUDIO2_VOICE_NOPITCH w IXAudio2::CreateSourceVoice, jeśli to możliwe. Konwersja częstotliwości próbkowania jest kosztowna.
    • Zmniejsz częstotliwość próbkowania poszczególnych głosów. Na przykład, głos w submiksie zawierający efekt pogłosu może mieć niższą częstotliwość próbkowania niż głos źródłowy, który do niego wysyła. Dźwięki takie jak eksplozje i strzały, które nie wymagają wysokiej wierności, można również rejestrować przy niższych współczynnikach próbek.
    • Upewnij się, że implementacje callbacków wykonują minimalną pracę i nigdy się nie blokują.
    • Wykonaj mniej wywołań do XAudio2. Parametry audio zwykle nie muszą być aktualizowane dla każdej ramki wideo. Co 30 ms lub tak jest wystarczające. Należy wyeliminować nadmiarowe wywołania, takie jak ustawianie głośności kilka razy szybko po sobie.
    • Zmniejsz ogólne użycie procesora CPU w grze.

Narzędzia debugowania

Referencja programowania XAudio2