The BPushGameSound
class lets you push buffers of audio data, instead of
waiting to be asked for them.
The BPushGameSound
class uses a single sound buffer, consisting of
multiple pages, which play continuously in a loop. Each page is used to
construct an audio
BBuffer
that eventually gets played, and is then recycled and reused again later.
For example, if the sound buffer is 256 kilobytes, and each page is 4
kilobytes, there are 64 pages of audio. When you start the
BPushGameSound
object, playback begins with the first page. A
BBuffer
is constructed
using that page, then played, and then the buffer is recycled, and the
next page is used to create another
BBuffer
, and so forth. This continues
to the 64th page. Once that page is played, playback loops back to the
first page again.
Your code pushes audio data into these audio pages. There are two ways you can do this.
The first way is to ask the
BPushGameSound
class to give you a page to
fill with audio data. This is done by calling
LockNextPage()
. This gives
you exclusive access to the next audio page that needs to be filled; you
can fill it with whatever sound you want to push, then call
UnlockPage()
to release it. It won't be played while it's locked, so you need to stuff
your sound into it and release it as quickly as possible.
The second way takes better planning, but can give you lower overhead.
Call
LockForCyclic()
to request access to the entire sound buffer area.
This doesn't give you exclusive access, so playback never stops—it
keeps looping the entire time, while you write into it. The
CurrentPosition()
function tells you where in the buffer area playback is
currently occurring.
Your mission (should you choose to accept it) is to stuff audio into the buffer, keeping ahead of this position far enough that playback never catches up to you. As a general rule, you should try to stay at least a page ahead of the current playback position. Keep in mind that when you reach the end of the buffer area, you need to wrap back to the beginning.
This takes more careful effort on your part, but once you have your code properly tuned, you can get very low overhead audio playback this way.