in Open Al doc. is writen this:
The AL has three fundamental primitives or objects Buffers, Sources, and
Listener. Each object can be changed independently, the setting of one
object does not affect the setting of others. The application can also
set modes that affect processing. Modes are set, objects specified, and
other AL operations performed by sending commands in the form of
function or procedure calls. Sources store locations, directions, and
other attributes of an object in 3D space and have a buffer associated
with them for playback. There are normally far more sources defined than
buffers. When the program wants to play a sound, it controls execution
through a source object. Sources are processed independently from each
well, i can have 32 sources max., but i have more than 100 sound sources
in my level, but they are not played at once.
Question is: what is good way to manage sources ?
i want to create 100 sources and select 32 of them to play at once, but
i dont know how to do it. :(
Please log in or register to post a reply.
How I normally manage this is as follows
I create all the sound buffers that i will be playing in the level/room
I already have a list of sources (up to the max available)
I request a sound to be played from a given buffer
I look through the array of sources, checking their state as i go
(playing, paused stopped etc.)
I find a source that is not playing, i play the requested sound on that
And so on and so on.
If I have no sources availabe the sound doesnt get played (you could
have a priority system running in that case, where certain sounds have a
higher priority that others)
I then return the source that the sample has been played on to allow the
system to control the source
100’s of samples (buffers) is a lot. How many of these would you exxpect
to be played at the same time? Repeating sounds can all be played from
the same buffer, so dont load in mutiple instances of te same buffer
(just in case you are)
Hope that helps a little
What i’m doing in my soundengine:
i have an array of all the sources each source containing info off it’s
id and position.
then i have an array of all currently playing sounds it’s length is
at last i have an integer variable which contains the number of playing
(i’m trying to implement a function that sorts the sources by distance
from listener but that’ll come later..)
when i want to play a source i set playingarray[playingsources] =
sources[the one i want to play];
and increment playingsources;
test to see if playingsources is higher than 32; if it is then set it
guess it can be made a little smarter but that works until now
I like idea to have priority on sounds. it looks promising. i have
sounds from crowd (a lot of), sounds from players, music, ambient (wind
sometimes there is more than 32 sounds at once.
priority on sounds can work good. only not important sounds are not
played, there is a little problem with setting distancies on sounds,
because it can be set wrong and not playing some sounds can sounds
i’m going to implement this, and i will write here results.
You could make it easy and make a min heap based on the priority and
then also on the time it has been playing so that you tend to pick
sounds that have at least had a chance to get heard rather than ones
that only started a few milliseconds ago.
It is functional, but i think there is some place to improvements.
Who is interested to share knovledge to develop sound engine in 3d
game, and is interested in source code let me know.