windowsdirectxxaudio2

Multiple XAudio2 instances needed for AUDIO_STREAM_CATEGORY?


In the newer XAudio2 API's for Windows 8 and 10, an AUDIO_STREAM_CATEGORY is passed to IXAudio2::CreateMasteringVoice.

The documentation goes on to say how these should be used for different types of audio. However an IXAudio2 is only allowed one master voice. To do this is completely separate IXAudio2 instances along with all associated interfaces required, or can categories be specified elsewhere in the audio graph by some means?

Games should categorize their music streams as AudioCategory_GameMedia so that game music mutes automatically if another application plays music in the background. Music or video applications should categorize their streams as AudioCategory_Media or AudioCategory_Movie so they will take priority over AudioCategory_GameMedia streams. Game audio for in-game cinematics or cutscenes, when the audio is premixed or for creative reasons should take priority over background audio, should also be categorized as Media or Movie.


Solution

  • You can create more than one IXAudio2 instance in a process so each will have it's own master voice. If you want to output more than one category of audio from a process, you need to create more than one IXAudio2 instance.

    Generally you can get away with just one and always use AudioCategory_GameMedia.

    I know this design is a bit of a kludge but the category is set on the WASAPI output voice, which is where XAudio2 sends it's mastering voice stuff to. Any other design would have required annotating category data within the internal XAudio audio graph which would have been quite complicated to implement for not a lot of value. We choose instead to just let applications have more than one audio-graph active at once each with it's own mastering voice and therefore it's own category.

    How you choose to you support the audio category feature of WASAPI is up to you, and of course the best user experience depends on what exactly your application actually does.