Stereo speakers but driver is described as 7.1 format

Our FMOD Studio project is authored in 7.1 surround sound for PC. For players with stereo speakers or headphones, we rely on FMOD to downmix the output to stereo before passing the signal to the driver. This generally works well.

We have certain unit sounds configured to spatialize but not to attenuate with distance (the attenuation curve is set to OFF in FMOD Studio). This works fine, although some testers have reported that these sounds still attenuate a little, especially when the unit is far behind the camera. I figured this is related to the way FMOD downmixes from 7.1 to stereo, where rear speakers are given less weight than front speakers. Thus units far to the rear will mix down to a softer overall volume than units to the front. The difference in volume is fairly mild, and we are not too worried about it. One could even argue that it’s a nice way to indicate that a unit is obscured behind you.

But one of our testers has reported this volume attenuation effect being much more severe than for other testers. I got them to send me their logs and this is what System::getDriverInfo() reports:

[BSoundManagerFMOD] Drivers: numdrivers=5, current=0
[BSoundManagerFMOD] Driver 0: name="Stereo Speakers (Realtek(R) Audio)", systemrate=48000, speakermode=7, speakermodechannels=8
[BSoundManagerFMOD] Driver 1: name="Speakers (Steam Streaming Speakers)", systemrate=48000, speakermode=3, speakermodechannels=2
[BSoundManagerFMOD] Driver 2: name="C27-30 (NVIDIA High Definition Audio)", systemrate=48000, speakermode=3, speakermodechannels=2
[BSoundManagerFMOD] Driver 3: name="C27-30 (NVIDIA High Definition Audio)", systemrate=48000, speakermode=3, speakermodechannels=2
[BSoundManagerFMOD] Driver 4: name="Speakers (Steam Streaming Microphone)", systemrate=48000, speakermode=3, speakermodechannels=2
[BSoundManagerFMOD] Software Format: samplerate=48000, speakermode=7, numrawspeakers=8

The default sound driver describes itself as “Stereo Speakers”, and yet the format is 7.1 surround. This implies that the device will perform its own 7.1 to stereo downmix, and apparently it’s not doing a great job of that.

Ideally we want FMOD to do the downmix before passing the stereo signal to the output. But this driver is “lying”, so what can we do? The only things I can think of so far are:

  • Add a game option for the user to manually force stereo output.
  • Look for the word “stereo” in the device name and force stereo output in that case.

I’m interested to know how others have dealt with such sound drivers that lie about their output format and apparently do their own (poor) downmixing. Is there some method to get the real output format?

As far as I am aware, there are no hooks in WASAPI that allow us to know that the device is actually stereo (and it’s doing the 7.1 → stereo downmix in-driver). We use the format that the Windows mixer is running in (as required), it’s the end user who controls that format in their settings. You could get them to change their settings or possibly disable enhancements, but that’s not super user friendly.

For an in-game solution having a stereo option is probably the most accessible for users. I’d worry about assuming “stereo” in the name means a stereo device, there could be false positives, and I bet there are lots of “gamer headsets” that do this without using the word stereo too.

For this kind of thing, I always recommend having a stereo mix option decided by the user, it lets them opt-in or out of their own special headphone downmix thing and it gives FMOD the most information about how to prepare the mix. Spatializing to 7.1 then downmixing to stereo will never sound as good as spatializing to stereo from the start when using traditional panning.

I had a feeling that might be the case. Thanks for the advice. Sounds like providing a stereo output option to the user is the way to go.

Spatializing to 7.1 then downmixing to stereo will never sound as good as spatializing to stereo from the start when using traditional panning.

Just to clarify this comment, are you recommending that we setup another “platform” in Studio with stereo speaker mode? That would mean we have to ship two sets of banks, one for 7.1 mixing and one for stereo mixing.

Is there some other way to avoid spatializing in 7.1 then downmixing to stereo?

Yes, by setting up a separate “platform” you can configure the spatializer in preferences to produce stereo instead of 7.1. This change will cause many tracks to switch from 7.1 to stereo. I would recommend coupling this with the “Build metadata and assets to separate banks” option so you only need to ship one copy of the sample data but can switch between the multichannel and stereo “platform” for metadata.

1 Like

Okay, I’ll look into that. As long as I can share the same asset banks between the two sets of metadata banks.

Before I do that, what’s the easiest way to force a stereo downmix as a quick fix? Is it just a matter of doing System::setSoftwareFormat(0, FMOD_SPEAKERMODE_STEREO, 0)? Will that force a downmix from 7.1 to stereo before the signal is passed to the driver (even when the driver format is 7.1)?

Failing that, I could call DSP::setChannelFormat() on the head of the master channel group? Or maybe add a Panner DSP there to handle the downmix?

Using setSoftwareFormat might have side effects, since DSPs query that for “automatic speaker mode”. Using setChannelFormat on the Core API master ChannelGroup might be your best bet, just make sure you do it after loading your Studio master bank since the Studio API does the same thing.

1 Like