Archive 17/01/2023.

Multiple sound listeners

Miegamicis

Does the engine support multiple sound listeners at once? I think I already know the answer but maybe there is a reason why there isn’t such support for it at the moment. The problem is with the splitscreen local multiplayer, since there could be only 1 sound listener, sounds will be generated only for one player and the rest of them will be playing in the “quiet” mode.

Leith

Currently the Audio class only supports one SoundListener.

void Audio::SetListener(SoundListener* listener) { listener_ = listener; }

You should only require one sound listener, as there is no association between players and the audio system - simply put, the soundlistener is not owned by any player, it is owned by the application, and so can play any sound sources, regardless of ‘who made the sound happen’.

Dave82

Well i don’t think the problem could be solved by more than one sound listeners. Just imagine a scenario of an explosion sound and two players. How would you handle the 3d sound if you have two listeners but your hardware has only ONE output (speakers) ? Some games achieve this by using the adventages of the stereo output and simply split the audio into L and R. But to be honest i don’t think there is any simple solution for this.
I would simply avoid using 3d sounds altogether in a split screen game…

Miegamicis

Thanks for the explanation. That makes a lot of sense. Will try to avoid using 3D sounds altogether in my splitscreen project.

Leith

one 3d listener, the computer, can hear sounds from both players

Leith

please do not avoid 3d sound, its super easy and works in your bubble

Dave82

It can’t… A listener is attached to a player (or camera) and the gain is calculated from a distance between a listener (player) and a sound source. It is impossble to hear the same sound from two different positions if you have only one speaker.
How would you play an explosion sound if one player stands closer and the other is far away ?

Leith

there are always ways to cheat the system, in this example, we could feed two sound streams into a mixer under sdl2 audio

Leith

most things worth doing are not easy, but thats what makes them interesting

Leith

nothing i know of, is impossible, except theoretical shit that doesnt fly yet

Dave82

Yes there are some workarounds. The same issue is mentioned here :
https://answers.unity.com/questions/1030856/in-a-split-screen-game-how-to-deliver-different-3d.html

But wouldn’t that mean playing the same sound twice ? I don’t see a point of doing this.

Leith

no, it means the same audio inputs are mixed, into a final output hardware buffer player to the speaker(s)

Leith

we’re able to mix sounds before we play it

Leith

think like a DJ, with a mixing bench

Miegamicis

What about using multiple sound listeners but only use the nearest listener to the sound source to calculate the volume of the actual sound + disabling the stereo effect?

Leith

When you’re working with 3D sound sources, you don’t need stereo sounds - all your 3D sounds should be mono! As for switching between Listeners, what’s the difference between that, and just moving the one Listener on demand?

I3DB

Progression of legacy 3D into spatial sound

Leith

Pretty sure I have 3D sound worked out, been doing this stuff for a while.
A 3D sound source comes from a place, so we don’t need two channels of audio information, we just need a mono sound, coming from some 3D place.

2D sounds on the other hand, like background music, can and should be stereo.

The implication is that 3D sounds exist in a virtual 3D space, while the more boring 2D sounds exist in the application space. It is fairly easy to make decisions about which space sounds should live in.