Bagikan melalui


Debugging Gangguan Audio di XAudio2

Gangguan dapat terjadi di XAudio2, topik ini mencakup bagaimana mereka dilaporkan dan beberapa pendekatan untuk memperbaikinya.

Gambaran umum ini mencakup topik berikut:

Penyebab masalah atau gangguan output audio

Gangguan dapat terjadi dalam output XAudio2 karena beberapa alasan.

  • Suara sumber XAudio2 kelaparan. Klien tidak mengirimkan audio baru ke dalamnya dengan cukup cepat. Anda mendapatkan keheningan karena tidak memiliki data untuk dimainkan.
  • XAudio2 secara keseluruhan terbebani. Dibutuhkan waktu lebih lama dari X ms untuk menghasilkan X ms audio. Anda mendapatkan dropout karena XAudio2 tidak dapat menghasilkan data secepat perangkat audio membutuhkannya. Anda mungkin menjalankan terlalu banyak suara atau efek pada satu waktu, melakukan terlalu banyak pekerjaan di panggilan balik XAudio2, atau membuat panggilan API XAudio2 terlalu sering.
  • Utas pemrosesan audio terhenti karena implementasi klien dari beberapa panggilan balik XAudio2 melakukan hal-hal yang dapat memblokir utas. Misalnya, mungkin mengakses disk, menyinkronkan dengan utas lain, atau memanggil fungsi lain yang mungkin memblokir. Gunakan utas latar belakang berprioritas lebih rendah yang dapat disinyalkan oleh panggilan balik untuk melakukan tugas tersebut.
  • Sistem secara keseluruhan kelebihan beban. Utas lain yang berjalan pada prioritas yang sama atau lebih tinggi daripada XAudio2 melakukan terlalu banyak pekerjaan. Mereka bersaing dengan utas audio untuk waktu CPU.

Bagaimana XAudio2 melaporkan masalah

XAudio2 dapat mengomunikasikan gangguan dalam build debug dalam beberapa cara.

  • Jika suara sedang kelaparan, XAudio2 menunjukkan pesan dalam formulir ini.

    XAudio2: WARNING: Voice at 0xNNNNNNNN starved: no more source buffers are available, but no end-of-stream marker was received
    
  • Jika utas audio berjalan terlalu lama, XAudio2 menampilkan pesan dalam formulir ini.

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

    Biasanya, pesan ini terjadi dengan pesan berikutnya.

  • Jika driver audio tidak dapat diberi makan data audio baru tepat waktu, XAudio2 akan menampilkan pesan dalam formulir ini.

    XAudio2: WARNING: Glitch at output sample X
    
  • Memanggil IXAudio2::GetPerformanceData menyediakan data performa XAudio2, termasuk jumlah total gangguan sejak mesin XAudio2 dimulai.

Pendekatan untuk memperbaiki masalah

Kemungkinan cara untuk mengurangi gangguan audio termasuk yang berikut ini.

  • Dalam kasus kelaparan suara: Tingkatkan jumlah data audio yang diantrekan di depan suara. Anda dapat menggunakan IXAudio2SourceVoice::GetState untuk menemukan jumlah buffer yang diantrekan kapan saja. Jika Anda masih melihat kesalahan kelaparan suara, tetapi tidak dapat mendengar kesalahan apa pun, pastikan Anda mengatur XAUDIO2_BUFFER. Bendera untuk XAUDIO2_END_OF_STREAM pada buffer akhir suara. Ini memberi tahu XAudio2 untuk tidak mengharapkan buffer lagi harus tersedia segera setelah yang ini selesai.

    Dalam kasus lain:

    • Kurangi jumlah suara aktif dan efek dalam grafik, terutama efek mahal seperti reverb.
    • Nonaktifkan suara dan efek yang tidak Anda gunakan.
    • Gunakan bendera XAUDIO2_VOICE_NOSRC dan XAUDIO2_VOICE_NOPITCH di IXAudio2::CreateSourceVoice, jika memungkinkan. Konversi laju sampel mahal.
    • Kurangi laju sampel suara individual. Misalnya, suara submix yang menghosting efek gaung dapat memiliki laju sampel yang lebih rendah daripada yang dikirimkan suara sumber ke dalamnya. Suara seperti ledakan dan tembakan yang tidak membutuhkan keakuratan tinggi juga dapat direkam pada tingkat sampel yang lebih rendah.
    • Pastikan bahwa implementasi panggilan balik berfungsi sesedikempat mungkin dan jangan pernah memblokir.
    • Lakukan lebih sedikit panggilan ke XAudio2. Parameter audio biasanya tidak perlu diperbarui untuk setiap bingkai video. Setiap 30 ms atau lebih sudah cukup. Anda harus menghilangkan panggilan redundan, seperti mengatur volume beberapa kali berturut-turut cepat.
    • Kurangi penggunaan CPU game secara keseluruhan.

Fasilitas Debugging

Referensi Pemrograman XAudio2